じ☆ve冰风 发表于 2026-7-11 21:25:22

Data File Save - Change database parameters mid-game

I shall warn this will be a long presentation, this system has a lot going on, and in fact I'll divide it into multiple posts. That's because it's a bit of a "scripters tool" so it can be used in many cases.

Introduction
To explain what this script does, first I have to talk very briefly about how the Database parameters are stored by default.

RMXP saves the data on files in the Data folder of the project, for example items data is stored in Data/Items.rxdata.
Then, it loads that when the Scene Title starts, with the method load_data through an internal module that stores the parameters (RPG::Item) and into a global ($data_items), where you can get those by ID.
For example $data_items.name returns "Potion".

By default, you can change parameters mid-game, with something like $data_items.name = "Potion HP", and from then on that item will have that name, but with two important issues:

1. You can't get the "default" parameter back, nor check if it has been changed. The only way would be loading the whole file again with load_data, and that's a slow process.

2. Changes aren't saved when you save your game.

This script solves both issues. It may seem like a big rewrite, but it's fairly simple after all.

Terms
- Giving credits (Wecoc) is optional.
- You can use this script both in commercial and non-commercial RMXP games.
- You can share this and make addons too. If you do, you can post them here as well if you want.
- Those terms also apply to the addons I include in this topic if I don't say otherwise.

Spoiler: Code                 Ruby:        
#==============================================================================
# ** Data File Save v1.0
#------------------------------------------------------------------------------
#Author: Wecoc (no credits required)
#==============================================================================

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

def setup
    for i in @default.instance_variables
      var = i
      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
      next if var == "id"
      eval "self.#{var} = @default.#{var}"
    end
end

def is_default?
    for i in @default.instance_variables
      var = i
      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()
    data = load_data("Data/#{name}.rxdata")
    for i in RPG::DATA_FOLDERS.instance_variables
      var = i
      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 = 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 = "New game"
    s2 = "Continue"
    s3 = "Shutdown"
    @command_window = Window_Command.new(192, )
    @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.is_default?
      hash_actors = $data_actors
      end
    end
    for i in 1...$data_classes.size
      if !$data_classes.is_default?
      hash_classes = $data_classes
      end
    end
    for i in 1...$data_skills.size
      if !$data_skills.is_default?
      hash_skills = $data_skills
      end
    end
    for i in 1...$data_items.size
      if !$data_items.is_default?
      hash_items = $data_items
      end
    end
    for i in 1...$data_weapons.size
      if !$data_weapons.is_default?
      hash_weapons = $data_weapons
      end
    end
    for i in 1...$data_armors.size
      if !$data_armors.is_default?
      hash_armors = $data_armors
      end
    end
    for i in 1...$data_enemies.size
      if !$data_enemies.is_default?
      hash_enemies = $data_enemies
      end
    end
    for i in 1...$data_troops.size
      if !$data_troops.is_default?
      hash_troops = $data_troops
      end
    end
    for i in 1...$data_states.size
      if !$data_states.is_default?
      hash_states = $data_states
      end
    end
    for i in 1...$data_animations.size
      if !$data_animations.is_default?
      hash_animations = $data_animations
      end
    end
    for i in 1...$data_tilesets.size
      if !$data_tilesets.is_default?
      hash_tilesets = $data_tilesets
      end
    end
    for i in 1...$data_common_events.size
      if !$data_common_events.is_default?
      hash_common_events = $data_common_events
      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 = hash_actors.clone
      end
    end
    for i in hash_classes.keys
      if i < $data_classes.size
      $data_classes = hash_classes.clone
      end
    end
    for i in hash_skills.keys
      if i < $data_skills.size
      $data_skills = hash_skills.clone
      end
    end
    for i in hash_items.keys
      if i < $data_items.size
      $data_items = hash_items.clone
      end
    end
    for i in hash_weapons.keys
      if i < $data_weapons.size
      $data_weapons = hash_weapons.clone
      end
    end
    for i in hash_armors.keys
      if i < $data_armors.size
      $data_armors = hash_armors.clone
      end
    end
    for i in hash_enemies.keys
      if i < $data_enemies.size
      $data_enemies = hash_enemies.clone
      end
    end
    for i in hash_troops.keys
      if i < $data_troops.size
      $data_troops = hash_troops.clone
      end
    end
    for i in hash_states.keys
      if i < $data_states.size
      $data_states = hash_states.clone
      end
    end
    for i in hash_animations.keys
      if i < $data_animations.size
      $data_animations = hash_animations.clone
      end
    end
    for i in hash_tilesets.keys
      if i < $data_tilesets.size
      $data_tilesets = hash_tilesets.clone
      end
    end
    for i in hash_common_events.keys
      if i < $data_common_events.size
      $data_common_events = hash_common_events.clone
      end
    end
end
end


Instructions
The script works with all the data globals except $data_system and Game_Map:map, which wouldn't make much sense. I'll keep using $data_items (Potion) as an example so it's easier to understand.

Spoiler: Script callsGet a parameter
$data_items.name # Returns "Potion". Works as default.

Set a parameter
$data_items.name = "HP Potion"

Get the default value for that parameter
$data_items.default.name

Check if the current parameter has the default value
$data_items.name == $data_items.default.name

Check if all the parameters of the item are default
$data_items.is_default?

Make all the parameters of the item back to default
$data_items.reset
Spoiler: How to define new parametersTo create a new dynamic parameter, create a new script below Data Save File, and apply this structure:

                Ruby:        
#==============================================================================
# ** New parameters
#==============================================================================

module RPG
class Item
    define_method(:agi_plus) { 20 }
end
end


The class name can be Actor, Class, Skill, Item, Weapon, Armor, Enemy, Troop, State.
The name of the parameter, in this case agi_plus, can be whatever you want. You'll have to check the guide to know which ones are currently used. Finally, the default value can be an integer like in this case or something else. In the following example, a new parameter description_b is defined, which by default is exactly the same as the description of the item.

define_method(:description_b) { @description }

You can define custom values for each item on those new parameters when starting a new game.

                Ruby:        
class Scene_Title
alias new_parameters_game command_new_game unless $@
def command_new_game
    # Define here the custom values of your new parameter
    $data_items.description_b = "Test"
    # ---------------------------------------------------
    new_parameters_game
end
end


Compatibility
This script overwrites:

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

The ones using alias won't cause any trouble if you put this script below others that change them, and the title one should be easy to solve, it only changes the lines with "load_data".

Game savefiles made before implementing this script may stop working after this. You can update them with this.

Tags System (AddOn)

This AddOn allows to group anything by tags, so then it's more easily accessible by script call. Since it uses Data File Save it's dynamic, you can change it wherever you want through the game.

Spoiler: Script callsFor example, you can define some tags to a certain enemy like this:
$data_enemies.set_tags("Fire", "Dragon", "Fly")

And then check if it's a Dragon with:
$data_enemies.has_tag?("Dragon")
Spoiler: Tags System                 Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# Tags System. Group each DataFile item using multiple tags
#------------------------------------------------------------------------------
# Requires: 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)
    end
    @tags.uniq!
    @tags.sort!
    return @tags
end
def has_tag?(name)
    return @tags.include?(name)
end
end


Usage examples
You may still be wondering what's all this for. I made some very short scripts that use this system, you have to place them below the Data File Save script. They're meant to be adapted, so I recomment to play with the IDs, the formulas used, the effects, etc.

Spoiler: Usage ExamplesSpoiler: Molten Giant
Skill with variable SP cost depending on current actor's parameters, in the example it depends on the HP / Max HP ratio.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 1. Molten Giant
#------------------------------------------------------------------------------
# Description: Skill with SP cost depending on current actor's parameters
# Requires: Data File Save
#==============================================================================

class Window_Skill < Window_Selectable
alias molten_giant_refresh refresh unless $@
def refresh
    #--------------------------------------------------------------------------
    # Define here the custom formulas of SP cost
    #--------------------------------------------------------------------------
    hp = @actor.hp
    maxhp = @actor.maxhp
    $data_skills.sp_cost = [(hp * 100) / maxhp, 10].max
    #--------------------------------------------------------------------------
    molten_giant_refresh
end
end


Spoiler: Chicken knifeWeapon which attack increases each time you escape from battle (it must be equipped).

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 2. Chicken Knife
#------------------------------------------------------------------------------
# Description: Weapon which attack increases each time you escape from battle
# Requires: 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
      next if actor.dead?
      #----------------------------------------------------------------------
      # Define here the atk custom formula
      #----------------------------------------------------------------------
      if actor.weapon_id == 1 # Weapon ID
          $game_system.chicken_escape_count += 1
          atk = $data_weapons.default.atk
          new_atk = .min
          $data_weapons.atk = new_atk
      end
      #----------------------------------------------------------------------
      end
    end
    chicken_knife_escape(result)
end
end


Spoiler: Hestia knifeWeapon which strength increases proportionally to the strength of its wearer.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 3. Hestia Knife
#------------------------------------------------------------------------------
# Description: Weapon which strength increases based on the wearer's strength
# Requires: Data File Save
#==============================================================================

class Game_Actor < Game_Battler
alias hestia_knife_equip equip unless $@
def equip(equip_type, id)
    case equip_type
    when 0 # Weapon
      #------------------------------------------------------------------------
      # Define here the new parameters of the item when equipped
      #------------------------------------------------------------------------
      if id == 1
      equip_str = $data_weapons.default.str_plus
      actor_str = self.str
      $data_weapons.str_plus = equip_str * actor_str / 100
      end
      #------------------------------------------------------------------------
    end
    hestia_knife_equip(equip_type, id)
end
end


It only updates when equipped, so you may want to change it when the actors strength changes (on level up) as well.
Spoiler: Mejai's SoulstealerEach actor has a glory score that increases when they win a battle, but decreases when they lose (or are dead when battle ends). That's the first part, the second is a weapon which strength uses that variable.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 4. Mejai's Soulstealer
#------------------------------------------------------------------------------
# Description: Each actor has a glory score that increases when winning and
# decreases when losing battle. A weapon's strength depends on that.
# Requires: 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
      #------------------------------------------------------------------------
      # Define here the points distribution when battle ends (except escape)
      #------------------------------------------------------------------------
      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 here how the glory score affects the weaponry
    #--------------------------------------------------------------------------
    if @weapon_id == 1
      str = $data_weapons.default.str_plus
      new_str = str + 4 * @glory_score
      $data_weapons.str_plus = [.min, 1].max
    end
    #--------------------------------------------------------------------------
end

def equip(*args)
    mejai_soul_equip(*args)
    self.glory_score = @glory_score
end
end


Spoiler: Roaming MendThis state increases the resistance to physical damage, but when attacked it deactivates, and reactivates into a random ally. It can do this up to three times if there are more alive allies available.

I recommend deactivating it after battle as well. The script has two parts, first one to make the state "jump" through the party, and the second one to apply the damage reduction.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 5. Roaming Mend
#------------------------------------------------------------------------------
# Descripción: This state increases the resistance to physical damage, but when
# attacked it deactivates and reactivates into a random ally multiple times.
# Requires: Data File Save
#==============================================================================

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

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

class Game_Battler
#----------------------------------------------------------------------------
# Define here the states that "travel" between allies
#----------------------------------------------------------------------------
TRAVEL_STATES =
#----------------------------------------------------------------------------
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.travel_count = 0 if reset_travel
    if TRAVEL_STATES.include?(state_id) and reset_travel == false
      $data_states.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.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.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.travel_count == 0
            remove_state(i)
            next
          end
          new_member = array
          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
      #------------------------------------------------------------------------
      # Change here the damage formula with the special state(s)
      #------------------------------------------------------------------------
      if self.state?(17) # State ID
      self.damage = (self.damage * 0.85).floor
      end
      #------------------------------------------------------------------------
    end
    return effective
end
end


Spoiler: JudgementSkill that changes its element based on the current accessory equipped.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 6. Judgement
#------------------------------------------------------------------------------
# Description: Skill that changes its element based on the accessory equipped
# Requires: Data File Save
#==============================================================================

class Game_Battler
alias judgement_skill skill_effect unless $@
def skill_effect(user, skill)
    if user.is_a?(Game_Actor)
      #------------------------------------------------------------------------
      # Define here the element based on the current equip
      #------------------------------------------------------------------------
      if skill.id == 1
      case user.armor4_id
      when 1 # Fire Ring
          $data_skills.element_set =
      when 2 # Ice Ring
          $data_skills.element_set =
      when 3 # Thunder Ring
          $data_skills.element_set =
      when 4 # Water Ring
          $data_skills.element_set =
      else
          $data_skills.element_set = []
      end
      end
      #------------------------------------------------------------------------
    end
    return judgement_skill(user, skill)
end
end


Spoiler: Heighten MagicState increases the SP cost of certain skills, but it also increases their power.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 7. Heighten Magic
#------------------------------------------------------------------------------
# Description: State increases the SP cost of certain skills, but it also
# increases their power.
# Requires: Data File Save
#==============================================================================

class Window_Skill < Window_Selectable
alias heighten_magic_refresh refresh unless $@
def refresh
    #--------------------------------------------------------------------------
    # Define here the SP cost formula for each skill
    #--------------------------------------------------------------------------
    if @actor.state?(17)
      $data_skills.sp_cost = ($data_skills.default.sp_cost * 1.25).floor
      $data_skills.sp_cost = ($data_skills.default.sp_cost * 1.25).floor
      $data_skills.sp_cost = ($data_skills.default.sp_cost * 1.25).floor
      $data_skills.sp_cost = ($data_skills.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
    #--------------------------------------------------------------------------
    # Define here the power formula for each skill
    #--------------------------------------------------------------------------
    if user.state?(17)
      $data_skills.power = ($data_skills.default.power * 1.25).floor
      $data_skills.power = ($data_skills.default.power * 1.25).floor
      $data_skills.power = ($data_skills.default.power * 1.25).floor
      $data_skills.power = ($data_skills.default.power * 1.25).floor
      effective = true
    end
    #--------------------------------------------------------------------------
    effective |= heighten_magic_skill(user, skill)
    #--------------------------------------------------------------------------
    # Reset skill SP cost and power after using
    #--------------------------------------------------------------------------
    if user.state?(17)
      $data_skills.sp_cost = $data_skills.default.sp_cost
      $data_skills.sp_cost = $data_skills.default.sp_cost
      $data_skills.sp_cost = $data_skills.default.sp_cost
      $data_skills.sp_cost = $data_skills.default.sp_cost
      $data_skills.power = $data_skills.default.power
      $data_skills.power = $data_skills.default.power
      $data_skills.power = $data_skills.default.power
      $data_skills.power = $data_skills.default.power
    end
    #--------------------------------------------------------------------------
    return effective
end
end


Spoiler: Adapting ArmorArmor that when attacked with an element becomes of that element, which means it temporarily becomes more resistant to that element. It resets when battle ends.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 8. Adapting Armor
#------------------------------------------------------------------------------
# Description: Armor that when attacked with an element becomes of that element
# Requires: 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)
      #------------------------------------------------------------------------
      # Define the armors by ID that adapt with elements (attack effect)
      #------------------------------------------------------------------------
      if self.armor3_id == 1
      $data_armors.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)
      #------------------------------------------------------------------------
      # Define the armors by ID that adapt with elements (skill effect)
      #------------------------------------------------------------------------
      if self.armor3_id == 1
      $data_armors.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)
    #--------------------------------------------------------------------------
    # Change armors back to normal when battle ends
    #--------------------------------------------------------------------------
    $data_armors.guard_element_set = []
    #--------------------------------------------------------------------------
end
end


Spoiler: Map StatesCertain actors or enemies can have a permanent state based on the current map.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 9. Map States
#------------------------------------------------------------------------------
# Certain actors or enemies can have a permanent state based on the current map
# Requires: Data File Save
#==============================================================================

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

class DataFile
#--------------------------------------------------------------------------
# * Get the maps with altered states
#--------------------------------------------------------------------------
def get_map_auto_states(map)
    @map_states = {} if @map_states.nil?
    return @map_states
end
#--------------------------------------------------------------------------
# * Set the maps with altered states
#--------------------------------------------------------------------------
def set_map_auto_states(map, states)
    @map_states = {} if @map_states.nil?
    @map_states = 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
    #--------------------------------------------------------------------------
    # Define here permanently the auto-states on each actor/enemy by ID
    #--------------------------------------------------------------------------
    $data_actors.set_map_auto_states(1, )# (Map ID, )
    $data_enemies.set_map_auto_states(1, ) # (Map ID, )
    #--------------------------------------------------------------------------
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
      #----------------------------------------------------------------------
      # Add map states to actors when entering the map
      #----------------------------------------------------------------------
      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
      #----------------------------------------------------------------------
      # Add map states to enemies when starting battle
      #----------------------------------------------------------------------
      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
          #--------------------------------------------------------------------
          # Remove map states when exiting the current map
          #--------------------------------------------------------------------
          for state in states
            actor.remove_state(state, true)
          end
      end
      end
      map_states_transfer
    end
end
end


Spoiler: Walk ArmorArmor which physical defense increases when increasing your step count.
There are multiple ways to approach this, I'll try to cover the main two.

The first one would be making its pdef depend on the total step count.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 11. Walk Armor
#------------------------------------------------------------------------------
# Armor which pdef depends on your total step count, increasing every X steps
# Requires: Data File Save
#==============================================================================

class Game_Party
alias walk_armor_increase increase_steps unless $@
def increase_steps
    walk_armor_increase
    if @steps % 100 == 0       # Every few steps it increases
      armor = $data_armors # Armor ID
      armor.pdef += 1          # How much it increases
    end
end
end


The second one increasing only when equipped.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 11(*). Walk Armor
#------------------------------------------------------------------------------
# Armor which pdef increases when walking and you have it equipped
# Requires: Data File Save
#==============================================================================

class Game_Party
alias walk_armor_increase increase_steps unless $@
def increase_steps
    walk_armor_increase
    if @steps % 100 == 0       # Every few steps it increases
      armor = $data_armors # Armor ID
      if equipped?(3, 16) # (Equip type, Equip ID)
      armor.pdef += 1      # How much it increases
      end
    end
end

def equipped?(slot, id)
    for i in 0...@actors.size
      actor = $game_party.actors
      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


Spoiler: Upgrading ShieldShield which defense increases when you're attacked and it's equipped. You can optionally make it increase only when guarding.

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 12. Upgrading Shield
#------------------------------------------------------------------------------
# Shield which defense increases when you're attack and it's equipped
# Required: Data File Save
#==============================================================================

class Game_Battler
#----------------------------------------------------------------------------
UPGRADING_SHIELD = 4 # Shield ID
#----------------------------------------------------------------------------
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)
      # You can optionally make it increase only when guarding
      if self.armor1_id == UPGRADING_SHIELD # and self.guarding?
          armor = $data_armors
          # Set here the effect when being attacked and wearing it
          armor.pdef += 2
      end
      end
    end
    return effective
end
end


Spoiler: Learning HealSkill that each time you use it, its SP cost decreases slightly (with a minumum cost).

                Ruby:        
#==============================================================================
# ** Data File Save Tips & Tricks
#------------------------------------------------------------------------------
# 13. Learning Heal
#------------------------------------------------------------------------------
# Skill that decreases its SP cost each time you use it
# Requires: 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 # Skill ID
      #----------------------------------------------------------------------
      sp_cost_min   = 50 # Minimum SP Cost
      sp_cost_learn = 5# SP cost reduction
      skill.sp_cost = .max
      #----------------------------------------------------------------------
      end
    end
    return effective
end
end




本贴来自国际rpgmaker官方论坛作者:Wecoc处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/data-file-save-change-database-parameters-mid-game.139740/
页: [1]
查看完整版本: Data File Save - Change database parameters mid-game