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]