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 3821 miembros registrados.
El último usuario registrado es MikeWasauski.

Nuestros miembros han publicado un total de 86298 mensajes en 12302 argumentos.

[XP] Data File Save

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.
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

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 == 1 # Escape
      for i in 0...$game_party.actors.size
        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 personaje 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
  alias mejai_soul_equip equip unless $@ 
  def glory_score=(score)
    @glory_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 + 4 * @glory_score
      $data_weapons[1].str_plus = [[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.


Última edición por Wecoc el 2017-08-15, 14:59, editado 2 veces
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

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
#==============================================================================

class DataFile
  #--------------------------------------------------------------------------
  # * 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

#==============================================================================
# * 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


Última edición por Wecoc el 2017-08-15, 15:05, editado 1 vez
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

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
avatar
Producciones The Golden
Veterano
Veterano

0/3

Créditos 644

Gracias : 64

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
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por AsFzKakarotto el 2017-04-06, 16:56

JAJAJA.... Estoy Feliz, Wecoc gracias a tu "Data File Save" y "Molten Giant" le he cambiado la formula y finalmente a quedado el script que esperaba...

Costo de Habilidad como Porcentaje:

Aquí el Script:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 1. Molten Giant
#------------------------------------------------------------------------------
# Descripción: El Costo de la Habilidad se descontará en porcentaje dependiente
# a la capacidad máxima de SP actual que tenga cada actor.
# Como en el viejo sistema de Rpg maker 2003.
#==============================================================================

class Window_Skill < Window_Selectable
 alias molten_giant_refresh refresh unless $@
 def refresh
   #--------------------------------------------------------------------------
   # Definir aquí las fórmulas de sp_cost de las skills
   #--------------------------------------------------------------------------
   sp = @actor.sp
   maxsp = @actor.maxsp
   $data_skills[81].sp_cost = [50 * maxsp / 100].max
   $data_skills[82].sp_cost = [100 * maxsp / 100].max
   #--------------------------------------------------------------------------
   molten_giant_refresh
 end
end

Muchas Gracias Wecoc....
Ahora con este script ya no tendré que estar haciendo decenas de skills para detectar a cada actor  su porcentaje máximo de SP de forma independiente.
avatar
AsFzKakarotto
Novato
Novato

0/3

Créditos 102

Gracias : 19

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Wecoc el 2017-08-15, 15:06

No hace falta definir máximo si solo hay un valor en la array, puedes usar simplemente:
$data_skills[81].sp_cost = @actor.maxsp * 50 / 100

Pero bueno tampoco importa mucho.

Vengo a anunciar que he cambiado algunos de los scripts de ejemplo ya que tres tenían algún error, ahora ya debería estar todo al día.

Chicken Knife: No funcionaba y ahora sí. Sin querer había puesto que funcionara cuando perdías, no cuando escapabas, y como igualmente si el personaje está muerto no hace nada, pues... no hacía nada xD

Mejai's Soulstealer: Gracioso, tampoco hacía nada xD En éste caso porque usé str en vez de str_plus en el arma.

Map States: Había un bug extraño pero ya está.
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Wecoc el 2017-11-07, 15:38

Leí una duda interesante para MV en un foro inglés y he querido recrearla en XP usando este script.
La idea es hacer una Walk Armor, es decir una armadura cuya defensa depende de los pasos que ha andado la party. Hice en los Tips & Tricks la Healing Armor de Castlevania que cura al andar pero esta va algo distinta porque el parámetro que se sube es el de la propia armadura.

11. Walk Armor
Armadura cuya defensa física incrementa al incrementar los pasos

Spoiler:
Hay varias formas de hacer eso e intentaré cubrir las principales.
Una es hacer que la defensa de la armadura dependa directamente de los pasos totales andados, por ejemplo que por cada 100 pasos andados totales suba +1 la pdef.

Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 11. Walk Armor
#------------------------------------------------------------------------------
# Armadura que cuanto más alto es el número de pasos hecho en el juego más
# alta es su defensa
# Requiere: Data File Save
#==============================================================================

class Game_Party
  alias walk_armor_increase increase_steps unless $@
  def increase_steps
    walk_armor_increase
    if @steps % 100 == 0       # Cada cuantos pasos sube
      armor = $data_armors[16] # ID del armadura
      armor.pdef += 1          # Cuanto sube la defensa física
    end
  end
end

La segunda, es que esta propiedad solo ocurra si alguien la lleva equipada.

Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 11(*). Walk Armor
#------------------------------------------------------------------------------
# Armadura que cuanto más alto es el número de pasos hecho en el juego más
# alta es su defensa
# Requiere: Data File Save
#==============================================================================

class Game_Party
  alias walk_armor_increase increase_steps unless $@
  def increase_steps
    walk_armor_increase
    if @steps % 100 == 0       # Cada cuantos pasos sube
      armor = $data_armors[16] # ID del armadura
      if equipped?(3, 16) # (Tipo de equipo, ID del equipo)
        armor.pdef += 1        # Cuanto sube la defensa física
      end
    end
  end
  
  def equipped?(slot, id)
    for i in 0...@actors.size
      actor = $game_party.actors[i]
      case slot
      when 0 # Weapon
        return true if actor.weapon_id == id
      when 1 # Shield
        return true if actor.armor1_id == id
      when 2 # Head
        return true if actor.armor2_id == id
      when 3 # Body
        return true if actor.armor3_id == id
      when 4 # Accessory
        return true if actor.armor4_id == id
      end
    end
    return false
  end
end

12. Upgrading Shield
Escudo cuya defensa incrementa cada vez que te atacan y lo llevas puesto.

Spoiler:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 12. Upgrading Shield
#------------------------------------------------------------------------------
# Escudo cuya defensa incrementa cada vez que te atacan
# Requiere: Data File Save
#==============================================================================

class Game_Battler
  #----------------------------------------------------------------------------
  UPGRADING_SHIELD = 4 # ID del escudo
  #----------------------------------------------------------------------------
  alias upgrading_shield_effect attack_effect unless $@
  def attack_effect(attacker)
    effective = upgrading_shield_effect(attacker)
    if effective && self.damage.to_i > 0
      if self.is_a?(Game_Actor)
        # Activar solo si el escudo coincide con la ID.
        # Opcionalmente podéis poner que solo funcione si se está defendiendo
        if self.armor1_id == UPGRADING_SHIELD # and self.guarding?
          armor = $data_armors[UPGRADING_SHIELD]
          # Añadir aquí el efecto al ser atacado y llevar ese escudo
          armor.pdef += 2
        end
      end
    end
    return effective
  end
end

13. Learning Heal
Skill que cada vez que la usas su coste de SP baja un poco (hasta un mínimo)

Spoiler:
Código:
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 13. Learning Heal
#------------------------------------------------------------------------------
# Skill que cada vez que la usas su coste de SP baja un poco (hasta un mínimo)
# Requiere: Data File Save
#==============================================================================

class Game_Battler
  alias learning_heal_effect skill_effect unless $@
  def skill_effect(user, skill)
    effective = learning_heal_effect(user, skill)
    if effective && self.damage.to_i.abs > 0
      if user.is_a?(Game_Actor) && skill.id == 17 # ID de la skill
        #----------------------------------------------------------------------
        sp_cost_min  = 50 # Coste SP mínimo
        sp_cost_learn = 5  # Disminución de SP cada vez (lineal)
        skill.sp_cost = [skill.sp_cost - sp_cost_learn, sp_cost_min].max
        #----------------------------------------------------------------------
      end
    end
    return effective
  end
end

Eso es todo Cool
avatar
Wecoc
Administrador
Administrador



Créditos 12104

Gracias : 522

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Data File Save

Mensaje por Contenido patrocinado


Contenido patrocinado


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.