¡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 3488 miembros registrados.
El último usuario registrado es FurryKoda.

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

[RMXP] Pain Damage; aumentar el daño causado a medida que se pierde HP

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Pain Damage; aumentar el daño causado a medida que se pierde HP

Mensaje por silvanash Hoy a las 15:57

Basado en la idea de Wecocio del post de aportar ideas. Las malditas ideas de Wecocio requieren reescribir métodos originales, así que podéis asumir que esto será incompatible con todo.

Pain Damage aumenta el daño causado a medida que el atacante pierde HPs. Afecta al ataque normal y a las skills que hagan daño. No afecta a las skills curativas, aunque se puede modificar para eso; sólo hay que poner el trozo de código que calcula el daño extra fuera del if self.damage > 0. Como me da pereza, dejaré que se encargue Wecocio otro de hacerlo.

Código:
# Pain Damage
# silvanash

# Increases damage as HP is lost

module SLV_Config
  
  # IDs of the ACTORS that can benefit from pain damage
  PAIN_ACTORS = {,
    1 => {:factor => 1,},
  }
  # IDs of the CLASSES that can benefit from pain damage
  PAIN_CLASSES = {
    1 => {:factor => 1,},
  }
  # IDs of the CLASSES that can benefit drom pain damage
  PAIN_ENEMIES = {
    1 => {:factor => 1,},
  }
  
end

class Game_Battler
  
  def attack_effect(attacker)
    # Clear critical flag
    self.critical = false
    # First hit detection
    hit_result = (rand(100) < attacker.hit)
    # If hit occurs
    if hit_result == true
      # Calculate basic damage
      atk = [attacker.atk - self.pdef / 2, 0].max
      self.damage = atk * (20 + attacker.str) / 20
      # Element correction
      self.damage *= elements_correct(attacker.element_set)
      self.damage /= 100
      # If damage value is strictly positive
      if self.damage > 0
        # Add Berserker effect here
        # Damage factor
        f = 0
        if attacker.is_a?(Game_Actor)
          if SLV_Config::PAIN_ACTORS.has_key?(attacker.id)
            f = [SLV_Config::PAIN_ACTORS[attacker.id][:factor], f].max
          end
          if SLV_Config::PAIN_CLASSES.has_key?(attacker.class_id)
            f = [SLV_Config::PAIN_CLASSES[attacker.class_id][:factor], f].max
          end
        elsif SLV_Config::PAIN_ENEMIES.has_key?(attacker.id)
          f = [SLV_Config::PAIN_ENEMIES[attacker.id][:factor], f].max
        end
        # Add berserker damage
        bonus = (1 - (attacker.hp * 1.0 / attacker.maxhp)) * f
        self.damage += (bonus * self.damage).truncate
        # Critical correction
        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 self.damage.abs > 0
        amp = [self.damage.abs * 15 / 100, 1].max
        self.damage += rand(amp+1) + rand(amp+1) - amp
      end
      # Second hit detection
      eva = 8 * self.agi / attacker.dex + self.eva
      hit = self.damage < 0 ? 100 : 100 - eva
      hit = self.cant_evade? ? 100 : hit
      hit_result = (rand(100) < hit)
    end
    # If hit occurs
    if hit_result == true
      # State Removed by Shock
      remove_states_shock
      # Substract damage from HP
      self.hp -= self.damage
      # State change
      @state_changed = false
      states_plus(attacker.plus_state_set)
      states_minus(attacker.minus_state_set)
    # When missing
    else
      # Set damage to "Miss"
      self.damage = "Miss"
      # Clear critical flag
      self.critical = false
    end
    # End Method
    return true
  end
  
  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
        # Add Berserker effect here
        # Damage factor
        f = 0
        if user.is_a?(Game_Actor)
          if SLV_Config::PAIN_ACTORS.has_key?(user.id)
            f = [SLV_Config::PAIN_ACTORS[user.id][:factor], f].max
          end
          if SLV_Config::PAIN_CLASSES.has_key?(user.class_id)
            f = [SLV_Config::PAIN_CLASSES[user.class_id][:factor], f].max
          end
        elsif SLV_Config::PAIN_ENEMIES.has_key?(user.id)
          f = [SLV_Config::PAIN_ENEMIES[user.id][:factor], f].max
        end
        # Add berserker damage
        bonus = (1 - (user.hp * 1.0 / user.maxhp)) * f
        self.damage += (bonus * self.damage).truncate
        # 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

Instrucciones:

Copypastear encima de Main. El script viene con el típico module para configurar al principio.

Dentro de PAIN_ACTORS van las IDs de los ACTORES que pueden aplicar más daño.
Dentro de PAIN_CLASSES van las IDs de las CLASES que pueden aplicar más daño.
Un personaje puede ejecutar Pain Damage tanto por su ID de actor como por su ID de clase.
Dentro de PAIN_ENEMIES van las IDs de los ENEMIGOS que pueden aplicar más daño.

Dentro de cada hash (los PAIN_etc) se usa la sintaxis de:
Código:
ID => {:factor => v1,},
[ID] es la ID del actor/clase/enemigo.
[:factor] es cuánto daño adicional aplica por % de HP perdido. Para Ledai, que tiene problemas con las matemáticas, :factor => 0.2 añadirá un 0.2% de daño por cada 1% de HP perdido; un personaje que haya perdido todos sus HPs añadirá un 20% de daño (asumiendo que ese personaje pueda atacar).

Un ACTOR que pueda añadir Pain Damage tanto por ID de ACTOR como por ID de CLASE usará el factor más alto de los dos.

Compatible con Lightning Burst y toda su suite. Si vas a usarlos juntos, por Pain Damage debajo de Bloodprice y encima de Ligthning Burst.

Incompatible con prácticamente cualquier otra cosa. Supongo que por eso Wecocio ha delegado el script en otro.

Edito:
Sería mejor construir un sistema de batalla desde cero, diseñado específicamente para permitir estas cosas, que intentar añadir add-ons y hacerlos compatibles. Si quiero añadir algo al sistema de MonsterSimulator, lo hago y punto, no me tengo que preocupar de que sean compatibles con otras cosas porque tengo acceso a todo el sistema. Estos scripts, en cambio, tienen una utilidad mucho más limitada, porque aportan poco a la batalla pero requieren reescribir demasiados métodos, métodos que también podrían ser reescritos por otros scripts. Para alguien que sepa de scripts, editarlos no es difícil, pero para el público general, que no sabe editar scripts y por eso no se hace sus propios add-ons, eso es una molestia en sumo grado.


Última edición por silvanash el 2017-01-18, 16:20, editado 2 veces

silvanash
Aventurero
Aventurero

0/3

Créditos 1467

Gracias : 187

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Pain Damage; aumentar el daño causado a medida que se pierde HP

Mensaje por PKTrainer Hoy a las 16:14

oye,es interesante,sobre todo para una skill,pero ¿sabrias como hacerlo?
osea hacer una skill pero que haga esto,me explico fatal.

PKTrainer
Iniciado
Iniciado

0/3

Créditos 17

Gracias : 4

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts

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