¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 3393 miembros registrados.
El último usuario registrado es nino34.

Nuestros miembros han publicado un total de 79784 mensajes en 11253 argumentos.
Navega con Google Chrome
[DESCARGA]

[Pedido]Un script para que las habilidades también puedan ser críticas

 :: RPG Maker :: Ayuda RPG

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Noctámbulo el 2015-01-20, 11:43

Pues eso, he notado que en el juego que estoy desarrollando, a medida que se avanza, los personajes se convierten en más "skilldependientes" hasta el punto de que la destreza se convierte en una estadística inútil, ya que solo afecta la precisión y la probabilidad de crítico de los ataques directos. Me gustaría saber si existe un script para que las skills también se vean beneficiadas de la destreza para hacer golpes críticos.
Gracias de antemano.

Noctámbulo
Principiante
Principiante

1/3

Créditos 300

Gracias : 27

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por silvanash el 2015-01-20, 11:54

Esto debería servirte:

Código:
class Game_Battler
 
    #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #    user  : the one using skills (battler)
  #    skill : skill
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    # Clear critical flag
    self.critical = false
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,
    # or skill scope is for ally with 0, and your own HP = 1 or more
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
      ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # End Method
      return false
    end
    # Clear effective flag
    effective = false
    # Set effective flag if common ID is effective
    effective |= skill.common_event_id > 0
    # First hit detection
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # Set effective flag if skill is uncertain
    effective |= hit < 100
    # If hit occurs
    if hit_result == true
      # Calculate power
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # Calculate rate
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # Calculate basic damage
      self.damage = power * rate / 20
      # Element correction
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        if rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # Set effective flag if skill is uncertain
      effective |= hit < 100
    end
    # If hit occurs
    if hit_result == true
      # If physical attack has power other than 0
      if skill.power != 0 and skill.atk_f > 0
        # State Removed by Shock
        remove_states_shock
        # Set to effective flag
        effective = true
      end
      # Substract damage from HP
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # State change
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # If power is 0
      if skill.power == 0
        # Set damage to an empty string
        self.damage = ""
        # If state is unchanged
        unless @state_changed
          # Set damage to "Miss"
          self.damage = "Miss"
        end
      end
    # If miss occurs
    else
      # Set damage to "Miss"
      self.damage = "Miss"
    end
    # If not in battle
    unless $game_temp.in_battle
      # Set damage to nil
      self.damage = nil
    end
    # End Method
    return effective
  end
 
end


Usa la misma fórmula para el crítico que el ataque normal default. Pegar por encima de Main. Te dará errores con cualquier otro script que modifique la forma de funcionar de las skills.

Edito:

A todo esto, ¿a nadie le parece estúpido que un mago dependa de su Destreza para acertar un hechizo? ¿O que la probabilidad de hacer un crítico dependa de su Destreza? Hace una temporada edité los scripts de batalla para corregir eso, pero fueron modificaciones para una mecánica en particular, y no servirían para un uso más general. En caso necesario, Wecocio se encargará de re-escribir los scripts para que usen otros parámetros.

silvanash
Aventurero
Aventurero

0/3

Créditos 1417

Gracias : 176

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Noctámbulo el 2015-01-20, 14:57

silvanash escribió:Esto debería servirte:

Código:
class Game_Battler
 
    #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #    user  : the one using skills (battler)
  #    skill : skill
  #--------------------------------------------------------------------------
  def skill_effect(user, skill)
    # Clear critical flag
    self.critical = false
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,
    # or skill scope is for ally with 0, and your own HP = 1 or more
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
      ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # End Method
      return false
    end
    # Clear effective flag
    effective = false
    # Set effective flag if common ID is effective
    effective |= skill.common_event_id > 0
    # First hit detection
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # Set effective flag if skill is uncertain
    effective |= hit < 100
    # If hit occurs
    if hit_result == true
      # Calculate power
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # Calculate rate
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # Calculate basic damage
      self.damage = power * rate / 20
      # Element correction
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        if rand(100) < 4 * attacker.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # Set effective flag if skill is uncertain
      effective |= hit < 100
    end
    # If hit occurs
    if hit_result == true
      # If physical attack has power other than 0
      if skill.power != 0 and skill.atk_f > 0
        # State Removed by Shock
        remove_states_shock
        # Set to effective flag
        effective = true
      end
      # Substract damage from HP
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # State change
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # If power is 0
      if skill.power == 0
        # Set damage to an empty string
        self.damage = ""
        # If state is unchanged
        unless @state_changed
          # Set damage to "Miss"
          self.damage = "Miss"
        end
      end
    # If miss occurs
    else
      # Set damage to "Miss"
      self.damage = "Miss"
    end
    # If not in battle
    unless $game_temp.in_battle
      # Set damage to nil
      self.damage = nil
    end
    # End Method
    return effective
  end
 
end






Usa la misma fórmula para el crítico que el ataque normal default. Pegar por encima de Main. Te dará errores con cualquier otro script que modifique la forma de funcionar de las skills.

Edito:

A todo esto, ¿a nadie le parece estúpido que un mago dependa de su Destreza para acertar un hechizo? ¿O que la probabilidad de hacer un crítico dependa de su Destreza? Hace una temporada edité los scripts de batalla para corregir eso, pero fueron modificaciones para una mecánica en particular, y no servirían para un uso más general. En caso necesario, Wecocio se encargará de re-escribir los scripts para que usen otros parámetros.





Muchas gracias Silvanash, en cuanto pueda lo probaré.
En cuanto a la Destreza, yo por lo menos siempre lo he asociado a la "puntería" o precisión para atacar en los puntos débiles, de ahí su relación con los golpes críticos (un golpe crítico sería el equivalente a un "tiro en la cabeza" de cualquier shooter, donde la puntería y precisión son determinantes). Dime de que anime es tu avatar.

Noctámbulo
Principiante
Principiante

1/3

Créditos 300

Gracias : 27

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por silvanash el 2015-01-20, 15:13

El caso es que las fórmulas por default del Maker hacen cosas horribles con los stats de los personajes. El único atributo que influye en el daño es la fuerza, lo que hace que sea estúpido diseñar armas basadas en Destreza, porque sólo deja dos posibilidades: hacen muy poco daño y no sirven, o compensan ese daño con más probabilidad de crítico, lo que las hace demasiado poderosas. Digamos que la probabilidad de crítico (usando el mismo tier de armas) sea de 1% con un arma basada en Fuerza y de un 5% basado en Destreza. El arma basada en Destreza tendrá un daño base menor para compensar el critico adicional, pero ese 5% de crítico no hace que el arma valga la pena. Sobre todo porque un personaje que use un arma basada en Destreza tendrá una Fuerza baja y una Destreza altas (a menos que te dediques a amartillar ballestas en pleno combate; en ese caso admitiré que el personaje está más orientado a Fuerza que a Destreza). Con una Fuerza baja, el daño base inferior de ese arma se traduce en un daño efectivo incluso menor, y te lo juegas todo a cambio de ese crítico cada 20 ataques (la estadística es una perra). Si le aumentas la probabilidad de crítico (digamos que a 15%), ya estás desequilibrando el juego.

Por otra parte, los magos (o arquetipos de magos) suelen tener una Destreza más bien baja, puede que tirando a media, pero están en clara desventaja frente a enemigos con una Agilidad decente, porque tendrán más dificultades para acertarles un hechizo. ¿Por qué debería depender un mago de su Destreza para poder acertar una bola de fuego? ¿Por qué no usar la media de su Destreza y su Inteligencia para comprobar si acierta la bola de fuego? ¿Por qué no usar esa media para determinar si hace crítico o no?

silvanash
Aventurero
Aventurero

0/3

Créditos 1417

Gracias : 176

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Noctámbulo el 2015-01-20, 17:30

Parece que me da un error en la línea 52.

Noctámbulo
Principiante
Principiante

1/3

Créditos 300

Gracias : 27

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por silvanash el 2015-01-20, 17:41

Mea culpa. No me fijé en que attacker estaba definido con scope limitado a otro método, y copié el cálculo del crítico tal cual estaba. Te tira error porque el script intenta leer la agilidad del atacante, y ese atacante no existe (virtualmente).

He hecho un edit para que se llame al script con el atacante:

Código:
class Game_Battler
 
  #--------------------------------------------------------------------------
  # * Apply Skill Effects
  #    user  : the one using skills (battler)
  #    skill : skill
  #--------------------------------------------------------------------------
  def skill_effect(user, skill, target)
    # Clear critical flag
    self.critical = false
    # If skill scope is for ally with 1 or more HP, and your own HP = 0,
    # or skill scope is for ally with 0, and your own HP = 1 or more
    if ((skill.scope == 3 or skill.scope == 4) and self.hp == 0) or
      ((skill.scope == 5 or skill.scope == 6) and self.hp >= 1)
      # End Method
      return false
    end
    # Clear effective flag
    effective = false
    # Set effective flag if common ID is effective
    effective |= skill.common_event_id > 0
    # First hit detection
    hit = skill.hit
    if skill.atk_f > 0
      hit *= user.hit / 100
    end
    hit_result = (rand(100) < hit)
    # Set effective flag if skill is uncertain
    effective |= hit < 100
    # If hit occurs
    if hit_result == true
      # Calculate power
      power = skill.power + user.atk * skill.atk_f / 100
      if power > 0
        power -= self.pdef * skill.pdef_f / 200
        power -= self.mdef * skill.mdef_f / 200
        power = [power, 0].max
      end
      # Calculate rate
      rate = 20
      rate += (user.str * skill.str_f / 100)
      rate += (user.dex * skill.dex_f / 100)
      rate += (user.agi * skill.agi_f / 100)
      rate += (user.int * skill.int_f / 100)
      # Calculate basic damage
      self.damage = power * rate / 20
      # Element correction
      self.damage *= elements_correct(skill.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        if rand(100) < 4 * target.dex / self.agi
          self.damage *= 2
          self.critical = true
        end
        # Guard correction
        if self.guarding?
          self.damage /= 2
        end
      end
      # Dispersion
      if skill.variance > 0 and self.damage.abs > 0
        amp = [self.damage.abs * skill.variance / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / user.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva * skill.eva_f / 100
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
      # Set effective flag if skill is uncertain
      effective |= hit < 100
    end
    # If hit occurs
    if hit_result == true
      # If physical attack has power other than 0
      if skill.power != 0 and skill.atk_f > 0
        # State Removed by Shock
        remove_states_shock
        # Set to effective flag
        effective = true
      end
      # Substract damage from HP
      last_hp = self.hp
      self.hp -= self.damage
      effective |= self.hp != last_hp
      # State change
      @state_changed = false
      effective |= states_plus(skill.plus_state_set)
      effective |= states_minus(skill.minus_state_set)
      # If power is 0
      if skill.power == 0
        # Set damage to an empty string
        self.damage = ""
        # If state is unchanged
        unless @state_changed
          # Set damage to "Miss"
          self.damage = "Miss"
        end
      end
    # If miss occurs
    else
      # Set damage to "Miss"
      self.damage = "Miss"
    end
    # If not in battle
    unless $game_temp.in_battle
      # Set damage to nil
      self.damage = nil
    end
    # End Method
    return effective
  end
 
end

class Scene_Battle
  #--------------------------------------------------------------------------
  # * Make Skill Action Results
  #--------------------------------------------------------------------------
  def make_skill_action_result
    # Get skill
    @skill = $data_skills[@active_battler.current_action.skill_id]
    # If not a forcing action
    unless @active_battler.current_action.forcing
      # If unable to use due to SP running out
      unless @active_battler.skill_can_use?(@skill.id)
        # Clear battler being forced into action
        $game_temp.forcing_battler = nil
        # Shift to step 1
        @phase4_step = 1
        return
      end
    end
    # Use up SP
    @active_battler.sp -= @skill.sp_cost
    # Refresh status window
    @status_window.refresh
    # Show skill name on help window
    @help_window.set_text(@skill.name, 1)
    # Set animation ID
    @animation1_id = @skill.animation1_id
    @animation2_id = @skill.animation2_id
    # Set command event ID
    @common_event_id = @skill.common_event_id
    # Set target battlers
    set_target_battlers(@skill.scope)
    # Apply skill effect
    for target in @target_battlers
      target.skill_effect(@active_battler, @skill, target)
    end
  end
end


Pegar encima de Main y eso. He hecho pruebas con los fantasmas y parece funcionar.

silvanash
Aventurero
Aventurero

0/3

Créditos 1417

Gracias : 176

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Lance Amano el 2015-01-21, 00:22

silvanash escribió:El caso es que las fórmulas por default del Maker hacen cosas horribles con los stats de los personajes. El único atributo que influye en el daño es la fuerza, lo que hace que sea estúpido diseñar armas basadas en Destreza, porque sólo deja dos posibilidades: hacen muy poco daño y no sirven, o compensan ese daño con más probabilidad de crítico, lo que las hace demasiado poderosas. Digamos que la probabilidad de crítico (usando el mismo tier de armas) sea de 1% con un arma basada en Fuerza y de un 5% basado en Destreza. El arma basada en Destreza tendrá un daño base menor para compensar el critico adicional, pero ese 5% de crítico no hace que el arma valga la pena. Sobre todo porque un personaje que use un arma basada en Destreza tendrá una Fuerza baja y una Destreza altas (a menos que te dediques a amartillar ballestas en pleno combate; en ese caso admitiré que el personaje está más orientado a Fuerza que a Destreza). Con una Fuerza baja, el daño base inferior de ese arma se traduce en un daño efectivo incluso menor, y te lo juegas todo a cambio de ese crítico cada 20 ataques (la estadística es una perra). Si le aumentas la probabilidad de crítico (digamos que a 15%), ya estás desequilibrando el juego.

Por otra parte, los magos (o arquetipos de magos) suelen tener una Destreza más bien baja, puede que tirando a media, pero están en clara desventaja frente a enemigos con una Agilidad decente, porque tendrán más dificultades para acertarles un hechizo. ¿Por qué debería depender un mago de su Destreza para poder acertar una bola de fuego? ¿Por qué no usar la media de su Destreza y su Inteligencia para comprobar si acierta la bola de fuego? ¿Por qué no usar esa media para determinar si hace crítico o no?


Supongo que pasa lo mismo si creamos armas/abilidades basadas en otros stats como Agilidad, ¿cierto?

Lance Amano
Soñador
Soñador

0/3

Créditos 163

Gracias : 13

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por silvanash el 2015-01-21, 01:10

Las armas del Maker funcionan así:

Ataque: daño base
Fuerza: factor principal (en realidad, el único factor) que influye en el daño efectivo.
Destreza: influye en la probabilidad de acertar un ataque y de que el daño sea crítico.
Agilidad: influye en la probabilidad de esquivar ataques/daño crítico, y en la probabilidad de escapar.
Inteligencia: no hace nada. NADA. No influye en los parámetros de armas (cosa lógica; nadie usa su fuerza mental para dar espadazos).

Ahora bien, las skills permiten usar los otros stats. Es la única forma de usar la Destreza/Agilidad/Inteligencia en combate, pero todo ello influido por las probabilidades de acierto de Destreza Vs. Agilidad. La Inteligencia sólo influye en el daño, y sólo si la propia skill tiene indicado un Mag_f > 0.

A este paso, me voy a encargar yo mismo de escribir unos nuevos scripts de batalla.

silvanash
Aventurero
Aventurero

0/3

Créditos 1417

Gracias : 176

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Lance Amano el 2015-01-21, 11:45

Ya veo. Entonces aún puedo crear una abilidad que, por exemplo, use la agilidad para calcular el daño causado en vez de la fuerza e inteligencia, ¿cierto?

Lance Amano
Soñador
Soñador

0/3

Créditos 163

Gracias : 13

Volver arriba Ir abajo

RPG Maker XP Re: [Pedido]Un script para que las habilidades también puedan ser críticas

Mensaje por Contenido patrocinado Hoy a las 14:02


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Ayuda RPG

Permisos de este foro:
No puedes responder a temas en este foro.