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

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

[XP] Data File Save

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Data File Save

Mensaje por Wecoc el 2017-01-05, 17:11

INTRODUCCIÓN

Éste es posiblemente el script más raro que he hecho hasta la fecha.

Veréis, para explicar lo que hace antes tengo que explicar un poco el mecanismo interno del RPG maker, pero tranquilos que lo resumiré mucho.

El RPG maker guarda los datos de la base de datos dentro de archivos en la carpeta Data del proyecto, por ejemplo para los objetos lo guarda en Data/Items.rxdata
Luego lo que hace es cargarlo en el juego al iniciar la escena de título, con load_data, mediante un script interno que almacena los parámetros, en éste ejemplo, RPG::Item
Lo carga en una global, $data_items, que en el fondo es una Array con todos los RPG::Item ordenados por ID, y se usará a lo largo de los scripts.
Por ejemplo, para obtener el nombre del primer objeto se usa: $data_items[1].name --> Eso devolverá "Poción"

Se pueden cambiar los parámetros a medio juego, por ejemplo puedes hacer $data_items[1].name = "Potion HP" y a partir de ese momento ese item pasará a tener ese nombre, pero no es nada recomendable hacerlo, por dos motivos:

1. No hay modo rápido de volver a obtener el nombre default tras cambiarlo, ni comprobar si ha sido cambiado. El único modo sería volviendo a cargar el archivo con load_data, y eso es un proceso lento.

2. Los cambios no se guardan al guardar partida y volver a cargarla.

Pues bien, mi script lo que hace es solucionar ámbos contratiempos.

CÓDIGO

Ponedlo encima de main:

Código:
#==============================================================================
# ** [XP] Data File Save v1.0
#------------------------------------------------------------------------------
#  Autor: Wecoc (créditos opcionales)
#==============================================================================

#==============================================================================
# ** Kernel
#==============================================================================

module Kernel
  def attr_reader(var)
    var = var.to_s
    eval "def #{var}() @#{var} end"
  end
  def attr_writer(var)
    var = var.to_s
    eval "def #{var}=(#{var}) @#{var}=#{var} end"
  end
  def attr_accessor(var)
    attr_reader(var) ; attr_writer(var)
  end
end

#==============================================================================
# ** RPG
#==============================================================================

module RPG
  
  DATA_FOLDERS = {}
  DATA_FOLDERS["Actors"]       = RPG::Actor
  DATA_FOLDERS["Classes"]      = RPG::Class
  DATA_FOLDERS["Skills"]       = RPG::Skill
  DATA_FOLDERS["Items"]        = RPG::Item
  DATA_FOLDERS["Weapons"]      = RPG::Weapon
  DATA_FOLDERS["Armors"]       = RPG::Armor
  DATA_FOLDERS["Enemies"]      = RPG::Enemy
  DATA_FOLDERS["Troops"]       = RPG::Troop
  DATA_FOLDERS["States"]       = RPG::State
  DATA_FOLDERS["Animations"]   = RPG::Animation
  DATA_FOLDERS["Tilesets"]     = RPG::Tileset
  DATA_FOLDERS["CommonEvents"] = RPG::CommonEvent
  
end

#==============================================================================
# ** Hash
#==============================================================================

class Hash
  def get_key(value)
    each_pair { |k, v| return k if value == v }
  end
end

#==============================================================================
# ** Klass
#==============================================================================

for Klass in RPG::DATA_FOLDERS.values
  class Klass
    def self.===(klass)
      folder = RPG::DATA_FOLDERS.get_key(self)
      return true if klass.is_a?(DataFile) && klass.data_name == folder
      super
    end
    def self.define_method(method, &block)
      super(method, &block)
      if block_given?
        name = "@#{method.to_s}"
        attr_writer(method)
        instance_variable_set(name, block.call)
      end
    end
  end
end

#==============================================================================
# ** DataFile
#==============================================================================

class DataFile
  
  attr_reader :id
  attr_reader :data_name
  attr_reader :default
  
  def initialize(name, id, default)
    @data_name = name
    @id = id
    @default = default[id]
    setup
  end
  
  def setup
    for i in @default.instance_variables
      var = i[1...i.size]
      next if var == "id"
      instance_variable_set(i, @default.instance_eval(var))
      attr_accessor(var)
    end
  end
  
  def reset
    for i in @default.instance_variables
      var = i[1...i.size]
      next if var == "id"
      eval "self.#{var} = @default.#{var}"
    end
  end
  
  def is_default?
    for i in @default.instance_variables
      var = i[1...i.size]
      result = eval "self.#{var} == @default.#{var}"
      return false if result == false
    end
    return true
  end
  
  def is_a?(klass)
    for files in RPG::DATA_FOLDERS
      f, k = *files
      return true if klass == k && @data_name == f
    end
    super
  end
end

#==============================================================================
# ** DataList
#==============================================================================

class DataList < Array
  def initialize(name)
    super([nil])
    data = load_data("Data/#{name}.rxdata")
    for i in RPG::DATA_FOLDERS[name].instance_variables
      var = i[1...i.size]
      data.each do |d|
        next if d == nil
        d.attr_accessor(var)
        result = d.instance_eval(var)
        d.send("#{var}=", result)
      end
    end
    for i in 1...data.size
      self[i] = DataFile.new(name, i, data)
    end
  end
end

#==============================================================================
# ** Scene_Title
#==============================================================================

class Scene_Title
  def main
    if $BTEST
      battle_test
      return
    end
    $data_actors        = DataList.new("Actors")
    $data_classes       = DataList.new("Classes")
    $data_skills        = DataList.new("Skills")
    $data_items         = DataList.new("Items")
    $data_weapons       = DataList.new("Weapons")
    $data_armors        = DataList.new("Armors")
    $data_enemies       = DataList.new("Enemies")
    $data_troops        = DataList.new("Troops")
    $data_states        = DataList.new("States")
    $data_animations    = DataList.new("Animations")
    $data_tilesets      = DataList.new("Tilesets")
    $data_common_events = DataList.new("CommonEvents")
    $data_system        = load_data("Data/System.rxdata")
    $game_system = Game_System.new
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    s1 = "Nuevo"
    s2 = "Cargar"
    s3 = "Salir"
    @command_window = Window_Command.new(192, [s1, s2, s3])
    @command_window.back_opacity = 160
    @command_window.x = 320 - @command_window.width / 2
    @command_window.y = 288
    @continue_enabled = false
    for i in 0..3
      if FileTest.exist?("Save#{i+1}.rxdata")
        @continue_enabled = true
      end
    end
    if @continue_enabled
      @command_window.index = 1
    else
      @command_window.disable_item(1)
    end
    $game_system.bgm_play($data_system.title_bgm)
    Audio.me_stop
    Audio.bgs_stop
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @command_window.dispose
    @sprite.bitmap.dispose
    @sprite.dispose
  end
end

#==============================================================================
# ** Scene_Save
#==============================================================================

class Scene_Save < Scene_File
  alias data_file_wsd write_save_data unless $@
  def write_save_data(file)
    data_file_wsd(file)
    hash_actors        = {}
    hash_classes       = {}
    hash_skills        = {}
    hash_items         = {}
    hash_weapons       = {}
    hash_armors        = {}
    hash_enemies       = {}
    hash_troops        = {}
    hash_states        = {}
    hash_animations    = {}
    hash_tilesets      = {}
    hash_common_events = {}
    for i in 1...$data_actors.size
      if !$data_actors[i].is_default?
        hash_actors[i] = $data_actors[i]
      end
    end
    for i in 1...$data_classes.size
      if !$data_classes[i].is_default?
        hash_classes[i] = $data_classes[i]
      end
    end
    for i in 1...$data_skills.size
      if !$data_skills[i].is_default?
        hash_skills[i] = $data_skills[i]
      end
    end
    for i in 1...$data_items.size
      if !$data_items[i].is_default?
        hash_items[i] = $data_items[i]
      end
    end
    for i in 1...$data_weapons.size
      if !$data_weapons[i].is_default?
        hash_weapons[i] = $data_weapons[i]
      end
    end
    for i in 1...$data_armors.size
      if !$data_armors[i].is_default?
        hash_armors[i] = $data_armors[i]
      end
    end
    for i in 1...$data_enemies.size
      if !$data_enemies[i].is_default?
        hash_enemies[i] = $data_enemies[i]
      end
    end
    for i in 1...$data_troops.size
      if !$data_troops[i].is_default?
        hash_troops[i] = $data_troops[i]
      end
    end
    for i in 1...$data_states.size
      if !$data_states[i].is_default?
        hash_states[i] = $data_states[i]
      end
    end
    for i in 1...$data_animations.size
      if !$data_animations[i].is_default?
        hash_animations[i] = $data_animations[i]
      end
    end
    for i in 1...$data_tilesets.size
      if !$data_tilesets[i].is_default?
        hash_tilesets[i] = $data_tilesets[i]
      end
    end
    for i in 1...$data_common_events.size
      if !$data_common_events[i].is_default?
        hash_common_events[i] = $data_common_events[i]
      end
    end
    Marshal.dump(hash_actors, file)
    Marshal.dump(hash_classes, file)
    Marshal.dump(hash_skills, file)
    Marshal.dump(hash_items, file)
    Marshal.dump(hash_weapons, file)
    Marshal.dump(hash_armors, file)
    Marshal.dump(hash_enemies, file)
    Marshal.dump(hash_troops, file)
    Marshal.dump(hash_states, file)
    Marshal.dump(hash_animations, file)
    Marshal.dump(hash_tilesets, file)
    Marshal.dump(hash_common_events, file)
  end
end

#==============================================================================
# ** Scene_Load
#==============================================================================

class Scene_Load < Scene_File
  alias data_file_rsd read_save_data unless $@
  def read_save_data(file)
    data_file_rsd(file)
    hash_actors        = Marshal.load(file)
    hash_classes       = Marshal.load(file)
    hash_skills        = Marshal.load(file)
    hash_items         = Marshal.load(file)
    hash_weapons       = Marshal.load(file)
    hash_armors        = Marshal.load(file)
    hash_enemies       = Marshal.load(file)
    hash_troops        = Marshal.load(file)
    hash_states        = Marshal.load(file)
    hash_animations    = Marshal.load(file)
    hash_tilesets      = Marshal.load(file)
    hash_common_events = Marshal.load(file)
    for i in hash_actors.keys
      if i < $data_actors.size
        $data_actors[i] = hash_actors[i].clone
      end
    end
    for i in hash_classes.keys
      if i < $data_classes.size
        $data_classes[i] = hash_classes[i].clone
      end
    end
    for i in hash_skills.keys
      if i < $data_skills.size
        $data_skills[i] = hash_skills[i].clone
      end
    end
    for i in hash_items.keys
      if i < $data_items.size
        $data_items[i] = hash_items[i].clone
      end
    end
    for i in hash_weapons.keys
      if i < $data_weapons.size
        $data_weapons[i] = hash_weapons[i].clone
      end
    end
    for i in hash_armors.keys
      if i < $data_armors.size
        $data_armors[i] = hash_armors[i].clone
      end
    end
    for i in hash_enemies.keys
      if i < $data_enemies.size
        $data_enemies[i] = hash_enemies[i].clone
      end
    end
    for i in hash_troops.keys
      if i < $data_troops.size
        $data_troops[i] = hash_troops[i].clone
      end
    end
    for i in hash_states.keys
      if i < $data_states.size
        $data_states[i] = hash_states[i].clone
      end
    end
    for i in hash_animations.keys
      if i < $data_animations.size
        $data_animations[i] = hash_animations[i].clone
      end
    end
    for i in hash_tilesets.keys
      if i < $data_tilesets.size
        $data_tilesets[i] = hash_tilesets[i].clone
      end
    end
    for i in hash_common_events.keys
      if i < $data_common_events.size
        $data_common_events[i] = hash_common_events[i].clone
      end
    end
  end
end

INSTRUCCIONES

Funciona en todas las globales de data excepto $data_system y Game_Map:map. Con $data_system no funciona porque es el único que no es una Array, y Game_Map:map solo se usa en Game_Map por lo que no tiene mucho sentido.

Pongo los métodos con ejemplos para que sean fáciles de entender

Devolver un parámetro:
$data_items[1].name # Devuelve "Poción". Funciona como siempre, lo pongo de recordatorio.

Cambiar el parámetro:
$data_items[1].name = "HP Potion"

Obtener el valor default de un parámetro:
$data_items[1].default.name

Comprobar si el valor actual es el que hay por defecto:
$data_items[1].name == $data_items[1].default.name

Comprobar si todos los parámetros del item son los que hay por defecto:
$data_items[1].is_default?

Hacer que todos los parámetros del item vuelvan a ser los que hay por defecto:
$data_items[1].reset

COMPATIBILIDAD

Reescribe los siguientes métodos:

Scene_Title :main
Scene_Save :write_save_file (alias)
Scene_Load :read_save_data (alias)

Los que usan alias no causarán problema si el script queda debajo de otros scripts de guardado. Sobre el main de Scene_Title solo cambia los load_data así que es fácil arreglar incompatibilidades, cualquiera con una mínima base de scripts puede hacerlo.

Reescribe el modo de guardado así que las partidas guardadas antes de usar el script dejarán de ser válidas.

Wecoc
Administrador
Administrador



Créditos 8611

Gracias : 389

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Wecoc el 2017-01-06, 04:38

Pero Wecoc, ¿pa' qué puñetas sirve éste script?
Seguro que muchos de los que hoy habéis leído este tema os preguntasteis lo mismo.
Y es que como muchos de mis scripts, por sí solo no tiene utilidad pero permite hacer muchas cosas que antes no.
Es por eso que hice una serie de trucos que usan éste script.

Data File Save - Tips & Tricks

Los siguientes códigos son muy cortos, sencillos y compatibles con todo, pero requieren el script que puse arriba para funcionar (van encima de main y abajo del Data File Save).
Están pensados para que los editéis, para jugar con las fórmulas y especialmente las ID. No requiere muchos conocimientos de script editarlos (mirad los métodos que puse en el post anteior para guiaros) y he puesto comentarios para que veáis dónde cambiar cada cosa exactamente; si queréis algún cambio un poco más editado y no os sale podéis pedirme ayuda.

Podéis usarlos en vuestros proyectos sin necesidad de darme créditos, y también podéis usarlos de ejemplo para hacer otras cosas totalmente distintas porque al fin y al cabo son eso, ejemplos.

1. Molten Giant
Habilidad con coste de SP variable dependiendo de parámetros del actor, en el ejemplo depende de la ratio HP / Max HP

Molten Giant:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 1. Molten Giant
#------------------------------------------------------------------------------
# Descripción: Habilidad de sp_cost variable según parámetros del actor
# Requiere: Data File Save
#==============================================================================

class Window_Skill < Window_Selectable
  alias molten_giant_refresh refresh unless $@
  def refresh
    #--------------------------------------------------------------------------
    # Definir aquí las fórmulas de sp_cost de las skills
    #--------------------------------------------------------------------------
    hp = @actor.hp
    maxhp = @actor.maxhp
    $data_skills[1].sp_cost = [(hp * 100) / maxhp, 10].max
    #--------------------------------------------------------------------------
    molten_giant_refresh
  end
end

2. Chicken Knife
Arma cuyo ataque incrementa cada vez que se huye de batalla (tiene que estar equipada para que ese efecto ocurra)

Chicken Knife:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 2. Chicken Knife
#------------------------------------------------------------------------------
# Descripción: Arma cuyo ataque incrementa cada vez que se huye de batalla
# Requiere: Data File Save
#==============================================================================

class Game_System
  attr_accessor :chicken_escape_count
  alias chicken_escape_count_ini initialize unless $@
  def initialize
    chicken_escape_count_ini
    @chicken_escape_count = 0
  end
end

class Scene_Battle
  alias chicken_knife_escape battle_end unless $@
  def battle_end(result)
    if result == 2 # Escape
      for i in 0...$game_party.actors
        actor = $game_party.actors[i]
        next if actor.dead?
        #----------------------------------------------------------------------
        # Definir aquí las fórmulas de atk de las armas
        #----------------------------------------------------------------------
        if actor.weapon_id == 1
          $game_system.chicken_escape_count += 1
          atk = $data_weapons[1].default.atk
          new_atk = [atk + 10 * $game_system.chicken_escape_count, 250].min
          $data_weapons[1].atk = new_atk
        end
        #----------------------------------------------------------------------
      end
    end
    chicken_knife_escape(result)
  end
end

3. Hestia Knife
La fuerza del arma incrementa proporcionalmente a la fuerza del personaje que la lleva

Hestia Knife:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 3. Hestia Knife
#------------------------------------------------------------------------------
# Descripción: La fuerza del arma incrementa proporcionalmente a la fuerza del
# personaje que la lleva
# Requiere: Data File Save
#==============================================================================

class Game_Actor < Game_Battler
  alias hestia_knife_equip equip unless $@
  def equip(equip_type, id)
    case equip_type
    when 0 # Arma
      #------------------------------------------------------------------------
      # Definir aquí los nuevos parámetros del equipo al ser equipado
      #------------------------------------------------------------------------
      if id == 1
        equip_str = $data_weapons[1].default.str_plus
        actor_str = self.str
        $data_weapons[1].str_plus = equip_str * actor_str / 100
      end
      #------------------------------------------------------------------------
    end
    hestia_knife_equip(equip_type, id)
  end
end

4. Mejai's Soulstealer
Cada actor tiene un contador de Gloria (glory_score) que incrementa cuando gana una batalla mientras que disminuye cuando pierde (o bien gana pero él está muerto).
Hay muchos modos válidos de controlar los valores de ésta variable según lo que se busque lograr, yo hice la ya explicada pero sed creativos.
Eso forma la primera parte del script. La segunda es un arma cuya fuerza depende directamente de esa variable.

Mejai's Soulstealer:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 4. Mejai's Soulstealer
#------------------------------------------------------------------------------
# Descripción: Cada jugador tiene un contador glory_score que depende de las
# batallas que ha ganado (+1) y perdido (-1)
# La fuerza de un arma puede depender de ese nuevo parámetro.
# Requiere: Data File Save
#==============================================================================

#==============================================================================
# ** Glory Score
#==============================================================================

class Game_Actor < Game_Battler
  attr_accessor :already_dead
  
  alias glory_score_setup setup unless $@
  def setup(actor_id)
    glory_score_setup(actor_id)
    @glory_score = 0
    @already_dead = false
  end
  
  def glory_score
    return @glory_score
  end
  
  def glory_score=(score)
    @glory_score = score
  end
end

class Scene_Battle
  unless $@
    alias glory_score_main main
    alias glory_score_end battle_end
  end
  
  def main
    for actor in $game_party.actors
      if actor.dead?
        actor.already_dead = true
      end
    end
    glory_score_main
  end
  
  def battle_end(result)
    if result < 2
      #------------------------------------------------------------------------
      # Aquí se define la distribución de puntos de glory_score al terminar
      # la batalla (excepto al escapar)
      #------------------------------------------------------------------------
      for actor in $game_party.actors
        if actor.dead?
          if actor.already_dead == false
            actor.glory_score -= 1
          end
        else
          actor.glory_score += 1
        end
        actor.already_dead = false
      end
      #------------------------------------------------------------------------
    end
    glory_score_end(result)
  end
end

#==============================================================================
# ** Mejai's Soulstealer
#==============================================================================

class Game_Actor < Game_Battler
  unless $@
    alias mejai_soul_score= glory_score=
    alias mejai_soul_equip equip
  end
  
  def glory_score=(score)
    mejai_soul_score = score
    #--------------------------------------------------------------------------
    # Define aquí cómo afecta el glory_score a los parámetros del equipo
    #--------------------------------------------------------------------------
    if @weapon_id == 1
      str = $data_weapons[1].default.str_plus
      new_str = str + 10 * @glory_score
      $data_weapons[1].str = [[new_str, 999].min, 1].max
    end
    #--------------------------------------------------------------------------
  end
  
  def equip(*args)
    mejai_soul_equip(*args)
    self.glory_score = @glory_score
  end
end

5. Roaming Mend
Estado que hace que cuando te hacen un ataque físico éste te haga menos daño. Éste luego se desactiva y se activa a otro aliado al azar.
Puede hacer eso hasta 3 veces, siempre que haya más aliados vivos disponibles.
Recomiendo ponerle al estado la opción de desactivarse tras terminar la batalla.
El script tiene dos partes, la primera para lo de hacer rotar el estado entre la party, el segundo para aplicar el efecto de disminución de daño físico.

Roaming Mend:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 5. Roaming Mend
#------------------------------------------------------------------------------
# Descripción: Estado que hace que cuando te hacen un ataque físico éste te
# haga menos daño. Éste luego se desactiva y se activa a otro aliado al azar.
# Puede hacer eso hasta 3 veces. Atención: Desactivarlo tras finalizar batalla.
# Requiere: Data File Save
#==============================================================================

#==============================================================================
# ** State Travel Count
#==============================================================================

class RPG::State
  define_method(:travel_count) { @travel_count ||= 0 }
end

class Game_Battler
  #----------------------------------------------------------------------------
  # Definir aquí los estados que "viajan" de un aliado a otro
  #----------------------------------------------------------------------------
  TRAVEL_STATES = [17]
  #----------------------------------------------------------------------------
  unless $@
    alias travel_count_add_state add_state
    alias travel_count_remove_state remove_state
    alias travel_count_attack attack_effect
  end
  
  def add_state(state_id, force=false, reset_travel=true)
    travel_count_add_state(state_id, force)
    $data_states[state_id].travel_count = 0 if reset_travel
    if TRAVEL_STATES.include?(state_id) and reset_travel == false
      $data_states[state_id].travel_count = 1 + rand(3)
    end
  end
  
  def remove_state(state_id, force=false, reset_travel=true)
    travel_count_remove_state(state_id, force)
    $data_states[state_id].travel_count = 0 if reset_travel
  end
  
  def attack_effect(attacker)
    effective = travel_count_attack(attacker)
    if self.damage.to_i > 0
      for i in TRAVEL_STATES
        if self.state?(i)
          $data_states[i].travel_count -= 1
          if self.is_a?(Game_Actor)
            array = $game_party.actors.clone
          else
            array = $game_party.enemies.clone
          end
          array.delete(self)
          array.delete_if {|battler| battler.dead?}
          if array.size == 0 or $data_states[i].travel_count == 0
            remove_state(i)
            next
          end
          new_member = array[rand(array.size)]
          remove_state(i, false, false)
          new_member.add_state(i, false, false)
        end
      end
    end
    return effective
  end
end

#==============================================================================
# ** Damage edit
#==============================================================================

class Game_Battler
  alias roaming_mend_attack attack_effect unless $@
  def attack_effect(attacker)
    effective = roaming_mend_attack(attacker)
    if self.damage.to_i > 0
      #------------------------------------------------------------------------
      # Cambiar el cálculo de daño infringido por un estado aquí
      #------------------------------------------------------------------------
      if self.state?(17)
        self.damage = (self.damage * 0.85).floor
      end
      #------------------------------------------------------------------------
    end
    return effective
  end
end

6. Judgement
Habilidad que cambia de elemento según el accesorio equipado.
Es decir, la habilidad en sí no tiene ningún elemento asociado, pero si por ejemplo llevas un Anillo Fuego luego la habilidad tiene de elemento el Fuego. Lo mismo con otros (adaptar parámetros como se quiera)

Judgement:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 6. Judgement
#------------------------------------------------------------------------------
# Descripción: Habilidad que cambia de elemento según el accesorio equipado.
# Requiere: Data File Save
#==============================================================================

class Game_Battler
  alias judgement_skill skill_effect unless $@
  def skill_effect(user, skill)
    if user.is_a?(Game_Actor)
      #------------------------------------------------------------------------
      # Definir aquí los cambios de elemento de la habilidad
      #------------------------------------------------------------------------
      if skill.id == 1
        case user.armor4_id
        when 1 # Anillo Fuego
          $data_skills[1].element_set = [1]
        when 2 # Anillo Hielo
          $data_skills[1].element_set = [2]
        when 3 # Anillo Truego
          $data_skills[1].element_set = [3]
        when 4 # Anillo Agua
          $data_skills[1].element_set = [4]
        else
          $data_skills[1].element_set = []
        end
      end
      #------------------------------------------------------------------------
    end
    return judgement_skill(user, skill)
  end
end

7. Heighten Magic
Estado que incrementa el coste de SP de ciertas habilidades, pero a la vez aumenta el poder de éstas.

Heighten Magic:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 7. Heighten Magic
#------------------------------------------------------------------------------
# Descripción: Estado que incrementa el sp_cost de todas las habilidades, pero
# al mismo tiempo aumenta el daño que ésta causa.
# Requiere: Data File Save
#==============================================================================

class Window_Skill < Window_Selectable
  alias heighten_magic_refresh refresh unless $@
  def refresh
    #--------------------------------------------------------------------------
    # Definir aquí las fórmulas de sp_cost de las skills
    #--------------------------------------------------------------------------
    if @actor.state?(17)
      $data_skills[1].sp_cost = ($data_skills[1].default.sp_cost * 1.25).floor
      $data_skills[2].sp_cost = ($data_skills[2].default.sp_cost * 1.25).floor
      $data_skills[3].sp_cost = ($data_skills[3].default.sp_cost * 1.25).floor
      $data_skills[4].sp_cost = ($data_skills[4].default.sp_cost * 1.25).floor
    end
    #--------------------------------------------------------------------------
    heighten_magic_refresh
  end
end

class Game_Battler
  alias heighten_magic_skill skill_effect unless $@
  def skill_effect(user, skill)
    effective = false
    #--------------------------------------------------------------------------
    # Definir aquí las fórmulas de daño de las skills
    #--------------------------------------------------------------------------
    if user.state?(17)
      $data_skills[1].power = ($data_skills[1].default.power * 1.25).floor
      $data_skills[2].power = ($data_skills[2].default.power * 1.25).floor
      $data_skills[3].power = ($data_skills[3].default.power * 1.25).floor
      $data_skills[4].power = ($data_skills[4].default.power * 1.25).floor
      effective = true
    end
    #--------------------------------------------------------------------------
    effective |= heighten_magic_skill(user, skill)
    #--------------------------------------------------------------------------
    # Resetear las skills para que los cambios solo afecten a ese battler
    #--------------------------------------------------------------------------
    if user.state?(17)
      $data_skills[1].sp_cost = $data_skills[1].default.sp_cost
      $data_skills[2].sp_cost = $data_skills[2].default.sp_cost
      $data_skills[3].sp_cost = $data_skills[3].default.sp_cost
      $data_skills[4].sp_cost = $data_skills[4].default.sp_cost
      $data_skills[1].power = $data_skills[1].default.power
      $data_skills[2].power = $data_skills[2].default.power
      $data_skills[3].power = $data_skills[3].default.power
      $data_skills[4].power = $data_skills[4].default.power
    end
    #--------------------------------------------------------------------------
    return effective
  end
end

8. Adapting Armor
Armadura que cuando se es atacado con un elemento pasa a ser de ese elemento, lo que significa que se vuelve más resitente a ese.
Al terminar la batalla pasa automáticamente a su estado default.

Adapting Armor:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 8. Adapting Armor
#------------------------------------------------------------------------------
# Descripción: Armadura que cuando se es atacado con un elemento pasa a ser
# de ese elemento, lo que significa que se vuelve resitente a ese.
# Al terminar la batalla pasa a su estado default.
# Requiere: Data File Save
#==============================================================================

class Game_Battler
  unless $@
    alias adapting_armor_attack attack_effect
    alias adapting_armor_skill skill_effect
  end
  
  def attack_effect(attacker)
    effective = adapting_armor_attack(attacker)
    if effective && self.is_a?(Game_Actor)
      #------------------------------------------------------------------------
      # Definir las ID de armadura que se adaptan a los elementos (ataque)
      #------------------------------------------------------------------------
      if self.armor3_id == 1
        $data_armors[1].guard_element_set = attacker.element_set
      end
      #------------------------------------------------------------------------
    end
    return effective
  end
  
  def skill_effect(user, skill)
    effective = adapting_armor_skill(user, skill)
    if effective && self.is_a?(Game_Actor)
      #------------------------------------------------------------------------
      # Definir las ID de armadura que se adaptan a los elementos (habilidad)
      #------------------------------------------------------------------------
      if self.armor3_id == 1
        $data_armors[1].guard_element_set = skill.element_set
      end
      #------------------------------------------------------------------------
    end
    return effective
  end
end

class Scene_Battle
  alias adapting_armor_battle_end battle_end unless $@
  def battle_end(result)
    adapting_armor_battle_end(result)
    #--------------------------------------------------------------------------
    # Al terminar la batalla volver las armaduras adaptadas a la normalidad
    #--------------------------------------------------------------------------
    $data_armors[1].guard_element_set = []
    #--------------------------------------------------------------------------
  end
end

Eso es todo, ojalá éstos os sirvan para vuestro proyecto.

Wecoc
Administrador
Administrador



Créditos 8611

Gracias : 389

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Wecoc el 2017-01-11, 08:24

Añado otro que creo que es bastante interesante.

9. Map States
Dependiendo del mapa en el que te encuentras, cierto actor o enemigo puede tener un estado alterado permanente.

Map States:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 9. Map States
#------------------------------------------------------------------------------
# Dependiendo del mapa, cierto actor o enemigo puede tener un estado permanente
# Requiere: Data File Save
#==============================================================================

#==============================================================================
# * RPG::Actor / RPG::Enemy
#==============================================================================

for Klass in [RPG::Actor, RPG::Enemy]
  class Klass
    #--------------------------------------------------------------------------
    # * Obtener los mapas con estados alterados
    #--------------------------------------------------------------------------
    def get_map_auto_states(map)
      @map_states = {} if @map_states.nil?
      return @map_states[map]
    end
    #--------------------------------------------------------------------------
    # * Definir los mapas con estados alterados
    #--------------------------------------------------------------------------
    def set_map_auto_states(map, states)
      @map_states = {} if @map_states.nil?
      @map_states[map] = states.to_a
    end
  end
end

#==============================================================================
# * Game_Actor / Game_Enemy
#==============================================================================

class Game_Actor < Game_Battler
  def map_auto_states
    result = $data_actors[@actor_id].get_map_auto_states($game_map.map_id)
    return !result.nil? ? result : []
  end
end

class Game_Enemy < Game_Battler
  def map_auto_states
    result = $data_enemies[@enemy_id].get_map_auto_states($game_map.map_id)
    return !result.nil? ? result : []
  end
end

#==============================================================================
# * Game_Party
#==============================================================================

class Game_Party
  alias map_states_setup_start setup_starting_members
  def setup_starting_members
    map_states_setup_start
    #--------------------------------------------------------------------------
    # Aquí puedes definir de forma permanente los auto-estados de cada actor
    # o enemigo según su ID.
    #--------------------------------------------------------------------------
    $data_actors[1].set_map_auto_states(1, [2])  # (ID Mapa, [Estados])
    $data_enemies[1].set_map_auto_states(1, [2]) # (ID Mapa, [Estados])
    #--------------------------------------------------------------------------
  end
end

#==============================================================================
# * Game_Map
#==============================================================================

class Game_Map
  alias map_states_setup setup unless $@
  def setup(map_id)
    map_states_setup(map_id)
    for actor in $game_party.actors
      states = actor.map_auto_states
      if !states.nil? and states.size > 0
        #----------------------------------------------------------------------
        # Añadir estados de mapa a los actores al entrar a un mapa nuevo
        #----------------------------------------------------------------------
        for state in states
          actor.add_state(state, true)
        end
      end
    end
  end
end

#==============================================================================
# * Game_Troop
#==============================================================================

class Game_Troop
  alias map_states_setup setup unless $@
  def setup(troop_id)
    map_states_setup(troop_id)
    for enemy in @enemies
      states = enemy.map_auto_states
      if !states.nil? and states.size > 0
        #----------------------------------------------------------------------
        # Añadir estados de mapa a los enemigos al empezar batalla
        #----------------------------------------------------------------------
        for state in states
          enemy.add_state(state, true)
        end
      end
    end
  end
end

#==============================================================================
# * Scene_Map
#==============================================================================

class Scene_Map
  alias map_states_transfer transfer_player unless $@
  def transfer_player
    if $game_map.map_id != $game_temp.player_new_map_id
      for actor in $game_party.actors
        states = actor.map_auto_states
        if !states.nil? and states.size > 0
          #--------------------------------------------------------------------
          # Quitar estados de mapa al salir del mapa actual
          #--------------------------------------------------------------------
          for state in states
            actor.remove_state(state, true)
          end
        end
      end
      map_states_transfer
    end
  end
end

Wecoc
Administrador
Administrador



Créditos 8611

Gracias : 389

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Producciones The Golden el 2017-01-11, 14:40

Ese último es perfecto para mi proyecto "Who´s the hunter?" para por ejemplo... al estar en un mapa con un enemigo que le de un estado de miedo que deshabilite acciones, un estado de frío que cause dicho elemento, etc... de momento no sé bien como usarlo pero fijo que lo usaré algún día! que grandes aportes X3

Producciones The Golden
Principiante
Principiante

0/3

Créditos 259

Gracias : 18

http://gamerprotown.jimdo.com/

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Wecoc el 2017-01-16, 11:47

Añado otro, la simplificación en sí misma; menos de 30 líneas.

Permite agrupar cualquier cosa con tags, de modo que luego sea más fácil acceder a su tipo via script. Como usa el Data File Save es dinámico, se puede cambiar esa propiedad en cualquier punto del juego.

Para que nos entendamos, ésto permite definir un enemigo diciendo por ejemplo que forma parte de éstos tags: Fire, Dragon, Fly
$data_enemies[ID].set_tags("Fire", "Dragon", "Fly")

Luego por script puedes comprobar si forma parte del grupo Dragon, usando:
$data_enemies[ID].has_tag?("Dragon")

Sin ésto tendrías que comprobarlo por ID o bien crear un parámetro "Dragon" lo cual sería mucho más tedioso.

Ésto permite clasificar cualquier cosa y luego usar ésta clasificación a lo largo de los scripts y engines.

10. Tags System
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 10. Tags System
#------------------------------------------------------------------------------
# Permite agrupar cualquier DataFile con tags
# Requiere: Data File Save
#==============================================================================

class DataFile
  alias tag_ini initialize unless $@
  def initialize(name, id, default)
    tag_ini(name, id, default)
    @tags = []
  end
  def set_tags(*args)
    for i in 0...args.size
      @tags.push(args[i])
    end
    @tags.uniq!
    @tags.sort!
    return @tags
  end
  def has_tag?(name)
    return @tags.include?(name)
  end
end

Wecoc
Administrador
Administrador



Créditos 8611

Gracias : 389

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Contenido patrocinado Hoy a las 19:15


Contenido patrocinado


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.