Mundo Maker
¡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 3763 miembros registrados.
El último usuario registrado es Carlos Rodriguez.

Nuestros miembros han publicado un total de 85771 mensajes en 12214 argumentos.

[RMXP] SLV Field Effects

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [RMXP] SLV Field Effects

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

Field Effects (FE para abreviar) es un script para la batalla del Maker que añade... Bueno, efectos de batalla. Lo que hace es permitir añadir efectos por zona/clima, afectando a todos los actores que estén en batalla. Es algo parecido al efecto de tormenta de arena de los juegos de Pokémon.

Features:
- Efectos de campo. ¡Wiiii!
- Exageramente customizable. Los FE pueden provenir del mapa, o pueden ser invocados durante la batalla en sí. Los efectos del mapa son una fuente "permanente", mientras que los invocados tienen una duración máxima y acaban desapareciendo.
- Dos formas de invocar efectos de campo. La forma pasiva ocurre porque un actor determinado existe. Por ejemplo, un enemigo levanta tormentas de arena en batalla como habilidad especial. La forma activa ocurre al usar una skill que invoque el efecto. Una vez más, pensad en los juegos de Pokémon. Hay bichos que tienen como habilidad cambiar el clima, y hay ataques que sirven para cambiar el clima también. La diferencia está en que en Pokémon sólo puede haber un efecto al mismo tiempo, mientras que FE permite que se solapen. Los efectos invocados de forma pasiva resetean su duración cada turno.
- Ciertos actores pueden ignorar los efectos de campo. Se puede configurar el script para que un actor, una clase, un enemigo, un estado o una pieza de equipamiento en concreto permitan ignorar un FE.

Combinando todos esos features, se puede hacer un enemigo que sea inmune a un FE y que lo invoque de forma pasiva. Ese FE puede ser una lluvia tóxica que mate a todo el equipo aliado en 10 turnos, a menos que el jugador les ponga un paraguas que los proteja de la lluvia.

Instrucciones:
- Requiere Number Flood v0.4.1.
- Pegar debajo de Number Flood. Si también usas Ligthning Burst, pegar debajo de Lightning Burst/Stormblade.

Configuración:

Código:
$game_map.slv_add_fe(effect)
$game_map.remove_fe(effect)
$game_map.slv_clear_fe

Esas tres líneas son para los efectos "permanentes" en mapa. La primera llamada añade un efecto, la segunda lo elimina, y la tercera elimina todos los efectos permanentes.

"effect" es... Técnicamente, la key de una hash, pero para que sea más fácil entenderlo, dejo la configuración del sistema.

Código:
  FIELD_EFFECTS = {
 
    :template => {
      :name => "template",    # CRITICAL flag for the passive effect
      :max_hp => 0,          # Stats affected by the field effect
      :hp => 0,
      :max_sp => 0,
      :sp => 0,
      :duration => 0,        # Duration (in turns) of the field effect
      :skill => [],          # Skills that summon the field effect
      :actor_id => [],        # Actors that summon the FE (being in battle)
      :actor_class_id => [],  # Actor classes that summon the FE
      :enemy_id => [],        # Enemies that summon the FE
      :actor_ignored => [],  # Actors that ignore the FE
      :class_ignored => [],  # Actor classes that ignore the FE
      :weapon_ignored => [],  # Weapons that ignore the FE (being equipped)
      :armor_ignored => [],  # Armors that ignore the FE
      :enemy_ignored => [],  # Enemies that ignore the FE
      :state_ignored => [],  # States that ignore the FE
      :actor_targeted => [],  # Actors targeted by the FE
      :class_targeted => [],
      :weapon_targeted => [],
      :armor_targeted => [],
      :enemy_targeted => [],
      :state_targeted => [],
    },
  } # Hash end

"effect" es el identificador del FE (:template en este caso). En el script hay configurados 3 FEs que se añaden/quitan con :hail, :sandstorm y :mana_source_1.

Todos los parámetros son opcionales.

:name es un texto que se muestra encima del efecto para informar al jugador.
:max_hp, :hp, :max_sp, :sp es el efecto en sí, expresado sobre 1. :max_hp => 0.065 cura el 6,5% de los HPs máximos cada turno.
:duration es la duración en turnos del FE. Por defecto vale 1.
:skill es una array con las IDs de todas las skills que invocan el FE. El FE será invocado incluso si la skill falla.
:actor_id, :actor_class_id y :enemy_id son arrays con las IDs de actores, clases y enemigos que invocan el FE sólo por existir en la batalla.
Los :cosa_ignored son las IDs de actores, clases, armas, protectores, enemigos y estados que no son afectados por el FE.
Los :cosa_targeted son las IDs para apuntar a un actor en concreto; los FEs que tengan :cosa_targeted definidos no afectarán a nadie que no esté en al menos uno de los targeted. Por ejemplo:

:actor_targeted => [1],
:weapon_targeted => [3],

Afectará sólo al actor que tenga la ID 1 o que tenga equipada el arma ID 3.

Es importante seguir una sintaxis correcta a la hora de configurar FEs. Hay que poner los =>, {}, :, comas finales y todo eso. El único corchete que no tiene una coma detrás es el que va firmado como # Hash end, al final del todo. Todos los parámetros tienen que llevar una coma al final.

Y aquí el script:

Código:
# SLV Field Effects

# Simulates field effects for the battle
# Think of the hail/sandstorm effects from the PKM games

# Requires Number Flood >= v0.4.1

module SLV_Config
 
  FIELD_EFFECTS = {
 
    :template => {
      :name => "template",    # CRITICAL flag for the passive effect
      :max_hp => 0,          # Stats affected by the field effect
      :hp => 0,
      :max_sp => 0,
      :sp => 0,
      :duration => 0,        # Duration (in turns) of the field effect
      :skill => [],          # Skills that summon the field effect
      :actor_id => [],        # Actors that summon the FE (being in battle)
      :actor_class_id => [],  # Actor classes that summon the FE
      :enemy_id => [],        # Enemies that summon the FE
      :actor_ignored => [],  # Actors that ignore the FE
      :class_ignored => [],  # Actor classes that ignore the FE
      :weapon_ignored => [],  # Weapons that ignore the FE (being equipped)
      :armor_ignored => [],  # Armors that ignore the FE
      :enemy_ignored => [],  # Enemies that ignore the FE
      :state_ignored => [],  # States that ignore the FE
      :actor_targeted => [],  # Actors targeted by the FE
      :class_targeted => [],
      :weapon_targeted => [],
      :armor_targeted => [],
      :enemy_targeted => [],
      :state_targeted => [],
    },
 
    # Deals 6.5% of MAX_HP as damage each turn
    :hail => { :name => "Falling ice", :max_hp => -0.065, },
   
    # Deals 8% of CURRENT_HP as damage each turn
    :sandstorm => { :name => "Sand slap", :hp => -0.08, },
   
    # Regens 5% of MAX_SP each turn
    :mana_source_1 => { :name => "Earth blessing", :max_sp => 0.05, :actor_id => [1], },
   
  } # Hash end
 
end

class Game_Map
 
  attr_reader :slv_field_effects
 
  alias slv_field_effect_init initialize unless $@
 
  def initialize
    @slv_field_effects = []
    slv_field_effect_init
  end
 
  def slv_add_fe(effect)
    # Field effect isn't defined in database; return
    return if !SLV_Config::FIELD_EFFECTS.has_key?(effect)
    @slv_field_effects.push(effect) if !@slv_field_effects.include?(effect)
  end
 
  def slv_remove_fe(effect)
    @slv_field_effects.delete(effect)
  end
 
  def slv_clear_fe
    @slv_field_effects.clear
  end
 
end

class Scene_Battle
 
  alias slv_field_effect_init initialize unless $@
 
  def initialize
    @slv_battle_field_effects = []
    @slv_battle_field_duration = []
    slv_summon_field_effects
    slv_field_effect_init
  end

  alias update_slv_fe_phase6 update_phase6 unless $@
 
  def update_phase6
    for target in $game_party.actors + $game_troop.enemies
      # Skips non-existing actors
      next if !target.exist?
      # Runs each field effect of each actor
      for key in $game_map.slv_field_effects + @slv_battle_field_effects
        # Checks if the actor ignores the field effect
        v = SLV_Config::FIELD_EFFECTS[key]
        if target.is_a?(Game_Actor)
          # Checks reversed targetting
          if !v[:actor_targeted].nil?
            reverse = true if v[:actor_targeted].include?(target.id)
          end
          if !v[:class_targeted].nil? and !reverse.nil?
            reverse = true if v[:class_targeted].include?(target.id)
          end
          if !v[:weapon_targeted].nil? and !reverse.nil?
            reverse = true if v[:weapon_targeted].include?(weapon.id)
          end
          if !v[:armor_targeted].nil? and !reverse.nil?
            reverse = true if v[:armor_targeted].include?(target.armor1_id)
            reverse = true if v[:armor_targeted].include?(target.armor2_id)
            reverse = true if v[:armor_targeted].include?(target.armor3_id)
            reverse = true if v[:armor_targeted].include?(target.armor4_id)
          end
        else
          if !v[:enemy_targeted].nil?
            reverse = true if v[:enemy_targeted].include?(target.id)
          end
        end
        # Skip this actor if none of the targeted conditions was met
        next if reverse == true
        # Checks reversed states for the non-skipped actors
        if !v[:state_targeted].nil?
          f = false
          # Matches each state against the FE ignored states
          for state in target.states
            if v[:state_targeted].include?(state)
              f = true
              break
            end
          end
          next if f == false
        end
        if target.is_a?(Game_Actor)
          # Game_Actors have a crapton of chances to ignore FEs
          if !v[:actor_ignored].nil?
            next if v[:actor_ignored].include?(target.id)
          end
          if !v[:class_ignored].nil?
            next if v[:class_ignored].include?(target.class_id)
          end
          if !v[:weapon_ignored].nil?
            next if v[:weapon_ignored].include?(target.weapon_id)
          end
          if !v[:armor_ignored].nil?
            next if v[:armor_ignored].include?(target.armor1_id)
            next if v[:armor_ignored].include?(target.armor2_id)
            next if v[:armor_ignored].include?(target.armor3_id)
            next if v[:armor_ignored].include?(target.armor4_id)
          end
        else
          # Enemies can ignore FEs by ID
          if !v[:enemy_ignored].nil?
            next if v[:enemy_ignored].include?(target.id)
          end
        end
        if !v[:state_ignored].nil?
          f = false
          # Matches each state against the FE ignored states
          for state in target.states
            if v[:state_ignored].include?(state)
              f = true
              break
            end
          end
          next if f == true
        end
        # Actor wasn't skipped; run the FEs
        if !v[:max_hp].nil?
          d = (target.hp * v[:max_hp]).truncate
          target.hp += d
          target.damages.push([-d, v[:name]])
        end
        if !v[:hp].nil?
          d = (target.hp * v[:hp]).truncate
          target.hp += d
          target.damages.push([-d, v[:name]])
        end
        if !v[:max_sp].nil?
          d = (target.hp * v[:max_sp]).truncate
          target.sp += d
          target.damages.push([-d, v[:name]])
        end
        if !v[:sp].nil?
          d = (target.hp * v[:sp]).truncate
          target.sp += d
          target.damages.push([-d, v[:name]])
        end
      end
      target.damage_pop = target.damaged?
    end
    # Decreases the duration of the summoned FEs
    f = false
    for i in 0...@slv_battle_field_effects.size
      @slv_battle_field_duration[i] -= 1
      if @slv_battle_field_duration[i] <= 0
        f = true
        @slv_battle_field_effects[i] = nil
        @slv_battle_field_duration[i]= nil
      end
    end
    if f == true
      @slv_battle_field_effects.compact!
      @slv_battle_field_duration.compact!
    end
    # Resummons FEs from living sources (actors and their weapons/armor, enemies)
    slv_summon_field_effects
    # Updates status window and returns to default battle flow
    @status_window.refresh
    update_slv_fe_phase6
  end
 
  def slv_summon_field_effects
    # Summons all the FEs that appear passively due to actors existing
    enemies = []
    actors = []
    actor_classes = []
    for actor in $game_party.actors
      next if !actor.exist?
      actors.push(actor.id)
      actor_classes.push(actor.class_id) if !actor_classes.include?(actor.class_id)
    end
    for actor in $game_troop.enemies
      next if !actor.exist?
      enemies.push(actor.id)
    end
    # Game_Actors that can summon the FE
    for id in actors
      for key in SLV_Config::FIELD_EFFECTS.keys
        v = SLV_Config::FIELD_EFFECTS[key]
        next if v[:actor_id].nil?
        if v[:actor_id].include?(id)
          slv_add_field_effect(key)
        end
      end
    end
    # Actor classes that can summon the FE
    for id in actor_classes
      for key in SLV_Config::FIELD_EFFECTS.keys
        v = SLV_Config::FIELD_EFFECTS[key]
        next if v[:actor_class_id].nil?
        if v[:actor_class_id].include?(id)
          slv_add_field_effect(key)
        end
      end
    end
    # Enemies that can summon the FE
    for id in enemies
      for key in SLV_Config::FIELD_EFFECTS.keys
        v = SLV_Config::FIELD_EFFECTS[key]
        next if v[:enemy_id].nil?
        if v[:enemy_id].include?(id)
          slv_add_field_effect(key)
        end
      end
    end
  end
 
  def slv_add_field_effect(key)
    # Summons a certain FE
    # The map provides this FE as a permanent effect; return
    return if $game_map.slv_field_effects.include?(key)
    data = SLV_Config::FIELD_EFFECTS[key]
    # Checks if the FE exists
    if @slv_battle_field_effects.include?(key)
      # If so, resets its duration
      i = @slv_battle_field_effects.index(key)
      a = if data[:duration].nil? then 1 else data[:duration] end
      @slv_battle_field_duration[i] = [a, @slv_battle_field_duration[i]].max
    else
      # Adds the field effect and resets its duration
      @slv_battle_field_effects.push(key)
      a = if data[:duration].nil? then 1 else data[:duration] end
      @slv_battle_field_duration.push(a)
    end
  end
 
  alias slv_fe_skill_action_result make_skill_action_result unless $@
 
  def make_skill_action_result
    # Adds FEs after executing skills
    slv_fe_skill_action_result
    # Matches the skill id against the FE hash
    for key in SLV_Config::FIELD_EFFECTS.keys
      # This FE is running in the map; skip
      next if $game_map.slv_field_effects.include?(key)
      # This FE can't be summoned via skill; skip
      next if SLV_Config::FIELD_EFFECTS[key][:skill].nil?
      # Adds the FE
      if SLV_Config::FIELD_EFFECTS[key][:skill].include?(@skill.id)
        slv_add_field_effect(key)
      end
    end
  end
 
end

Cómo hacer un bardo meteorólogo: habilidades que afecten a todo el equipo aliado y que les den el estado que los hace inmunes a un FE, o que hagan inmunes a los enemigos a un FE de curación.

Nota: SLV Field Effects no añade los efectos visuales del clima (partículas de granizo, arena, metal, etc). Lo único que hace es manejar la lógica interna y mostrar los efectos. El clima hay que añadirlo con llamadas de "Cambiar clima" y otros scripts.

Y con esto acabo mi spam. Temporalmente.

Aragonez, dame un logro de scripter.
avatar
silvanash
Aventurero
Aventurero

0/3

Créditos 1627

Gracias : 229

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


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