¡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 3995 miembros registrados.
El último usuario registrado es Vash-W17.

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

[RMXP] Lightning Burst v0.2.3.3; dañar a otros enemigos que estén cerca del principal al usar skills

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] Lightning Burst v0.2.3.3; dañar a otros enemigos que estén cerca del principal al usar skills

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

Basado en la idea de Wecocio del post de aportar ideas.

Lightning Burst permite que algunas habilidades hagan daño a los enemigos que estén cerca del objetivo principal. Ese daño depende de la distancia entre ellos, y existe un límite a la cantidad de enemigos a los que puede llegar el Burst. Si hay más enemigos que bounces disponibles, Lightning Burst sólo se aplicará a los enemigos más cercanos.

Código:
# Lightning Burst v0.2.3.3
# silvanash

# This script allows skills to deal damage to adjacent entities
# Damage is based on distance from the main target to other targets
# The burst can bounce a limited amount of times before fading

module SLV_Config
  
  # IDs of the skills that can use the Lightning Burst effect and config
  LIGHTNING_BURST_SETUP = {
    1 => {:decay => 0.2, :bounce => 8, :hit_main => true},
  }
  
  # :decay measures the % of damage lost per 100 pixels between targets
  # actor sprites are at ~160 pixels from each other
  
end

class Spriteset_Battle
  
  def slv_get_distances(main_target)
    # Returns an array with the battlers and the distance (in pixels) from all
    # the living entities in the targeted party
    distances = []
    if main_target.is_a?(Game_Actor)
      party = @actor_sprites
    else
      party = @enemy_sprites
    end
    for sprite in party
      if sprite.battler == main_target
        # Gets the main target to read its position on-screen
        main = sprite
        break
      end
    end
    for sprite in party
      # Skip if battler doesn't exist
      next if sprite.battler.nil?
      # The burst can't bounce to the main target
      next if sprite.battler == main_target
      # The burst can't bounce to dead/hidden targets
      next if sprite.battler.dead? or sprite.battler.hidden
      # Gets the distance bewteen the main and the the side sprites
      width = (sprite.bitmap.width / 2 + sprite.x) -
      (main.bitmap.width / 2 + main.x)
      height = (sprite.bitmap.height / 2 + sprite.y) -
      (main.bitmap.width / 2 + main.y)
      d = width.abs + height.abs
      # Pushes the battler and the distance into the distance array
      distances.push([sprite.battler, d])
    end
    # Sorts the array by distance to the main target
    distances.sort! { |a, b| a[1] <=> b[1] }
    # Returns the array so it can be operated with
    return distances
  end
  
end

class Scene_Battle
  
  alias slv_lightning_burst make_skill_action_result unless $@
  
  # Procs the Lighning Burst
  
  def make_skill_action_result
    slv_lightning_burst
    proc_lightning_burst
  end
  
  def proc_lightning_burst(skill = nil)
    # The Lightning Burst was called with a skill
    burst_skill = @skill.dup if !@skill.nil?
    burst_skill = skill if !skill.nil?
    # Procs Lightning Burst here
    # Lightning Burst won't proc if there are multiple targets
    if SLV_Config::LIGHTNING_BURST_SETUP.has_key?(@skill.id) and
      @target_battlers.size == 1 && @target_battlers[0].damage.to_i > 0
      d = @spriteset.slv_get_distances(@target_battlers[0])
      # Gets the Lightning Burst config for this skill
      data = SLV_Config::LIGHTNING_BURST_SETUP[@skill.id]
      # The Burst can target the main target
      hit_main = data[:hit_main]
      if hit_main == true
        d = [[@target_battlers[0], 0]].concat(d)
      end
      # Procs the burst as many times as allowed
      for i in 0...data[:bounce]
        # Break if no more targets are available
        break if i >= d.size
        # Breaks if the next target is out of range
        if hit_main == true and i > 0
          break if !data[:range].nil? and data[:range] < d[i - 1][1]
        else
          break if !data[:range].nil? and data[:range] < d[i][1]
        end
        # Reduces the skill damage using the distance between battlers
        f = (d[i][1] * data[:decay]).truncate
        # Breaks if the next target is so far that it wouldn't take damage
        break if f >= 100
        # Duplicates the skill to modify its parameters
        burst_skill.power -= burst_skill.power * f / 100
        burst_skill.atk_f -= burst_skill.atk_f * f / 100
        burst_skill.str_f -= burst_skill.str_f * f / 100
        burst_skill.dex_f -= burst_skill.dex_f * f / 100
        burst_skill.agi_f -= burst_skill.agi_f * f / 100
        burst_skill.int_f -= burst_skill.int_f * f / 100
        # Pushes the closest next target into the targeted battlers array
        if hit_main
          if i > 0
            @target_battlers.push(d[i][0])
            t = @target_battlers[-1].damage
            @target_battlers[-1].skill_effect(@active_battler, burst_skill)
            @target_battlers[-1].damage += t if !t.nil?
          else
            t = @target_battlers[0].damage
            @target_battlers[0].skill_effect(@active_battler, burst_skill)
            @target_battlers[0].damage += t if !t.nil?
          end
        else
          @target_battlers.push(d[i][0])
          t = @target_battlers[-1].damage
          @target_battlers[-1].skill_effect(@active_battler, burst_skill)
          @target_battlers[-1].damage += t if !t.nil?
        end
      end
    end
  end
  
end

Edito: por alguna extraña razón, medio post ha desaparecido. No importaría tanto si no fuese porque en ese medio post es donde se explica cómo se usa el script.

Instrucciones:
Copypastear encima de Main y configurar el module que viene al principio, tal que
Código:
skill_ID = > {:decay => v1, :bounce => v2, :range => v3, :hit_main => v4},

[skill_ID] es la ID de la skill que puede activar Lightning Burst. Se pueden usar todas las skills que uno quiera, cada una en una entrada aparte.
[:decay] indica cuánto daño se pierde por cada 100 pixels de distancia entre el enemigo y el objetivo principal. Para que sea más fácil de entender, 0.2 de decay hacen que el Lightning Burst pierda un 20% del daño por cada 100 pixels de diferencia entre los enemigos. 1 de decay hará que el Lightning Burst pierde el 100% del daño si el enemigo está a 100 o más pixels del blanco principal.
[:bounces] indica la cantidad de enemigos a los que puede afectar Lightning Burst. Si hay más enemigos que bounces, Lightning Burst sólo afectará a los más cercanos al blanco principal.
[:range] es un parámetro optional. Detiene la ejecución de Lightning Burst si los enemigos están demasiado lejos del blanco principal.
[:hit_main] es un parámetro opcional. Si vale true, Lightning Burst se aplicará también al blanco principal (es decir, el daño adicional).

Ejemplos:
Lightning Burst que afecta a 2 enemigos y pierde el 50% del daño, no afecta al blanco principal, asociado a la skill 1.
Código:
1 => {:bounce => 2, :decay => 0.5,},

Lightning Burst que afecta a 4 enemigos y pierde el 20% del daño, afecta al blanco principal, rango limitado a 150 pixels (básicamente, que estén todos juntos), asociado a la skill 15.
Código:
15 => {:bounce => 4, :range => 150, :hit_main => true, :range => 150},

Importante: la llamada es "skilll_ID => {:decay => v1, :bounces => v2},". Hay que usar =>, hay que poner los corches, y hay que poner la coma al final de los corchetes para que el Maker sepa que ahí acaba el value de esa key.

Lightning Burst no se ejecutará si la skill usada afecta a más de un enemigo (para eso tienes skills grupales), si la skill hace daño <= 0 (la skill cura, o ha hecho 0 de daño), o si los enemigos están demasiado lejos. Usando la fórmula del decay que he escrito, con un 0.5, un enemigo a 200 pixels del blanco principal no sufrirá Lightning Burst.

Nota: ya que los battlers de la party aliada están en una posición fija (a menos que hayas editado el sistema de batalla), si los enemigos también pueden usar Lightning Burst, lo recomendable es hacerles skills por separado con valores de decay y bounces diferentes a las skills usadas por la party aliada. Por motivos de balance y eso.

Nota2: Lightning Burst ejecuta la misma skill que se aplicó al blanco principal. Lo único que hace es modificar su daño. Los blancos secundarios ganarán/perderán los mismos estados que el principal, y se ejecutará la misma animación sobre ellos.

No pido créditos.

Edito:
Actualizado a la versión 0.2.1. Esta versión permite que Lightning Burst afecte también al blanco principal, en lugar de sólo a los blancos secundarios. La modificación se hizo esencialmente para poder usar Stormblade sobre el objetivo principal.

Actualizado a versión 0.2.2 para que Wecocio pueda hacer su Luden's.

Actualizado a versión 0.2.3 para usar una hash en una de un array para configurar las skills. Añadido rango máximo para ejecutar el Lightning Burst.

Actualizado a versión 0.2.3.1 para corregir un bug.

Actualizado a versión 0.2.3.2 para corregir un ejército de bugs que no detecté ayer. Esto es lo que pasa cuando haces scripts con falta de sueño a las 2 de la mañana.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1561

Gracias : 217

Volver arriba Ir abajo

RPG Maker XP Re: [RMXP] Lightning Burst v0.2.3.3; dañar a otros enemigos que estén cerca del principal al usar skills

Mensaje por silvanash el 2017-04-17, 10:28

Actualizado para corregir algunos errores de la versión anterior.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1561

Gracias : 217

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.