设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 78|回复: 0

[转载发布] Data File Save - Change database parameters mid-game

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    前天 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    4470

    主题

    864

    回帖

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    22947
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    28311

    灌水之王

    发表于 3 天前 | 显示全部楼层 |阅读模式
    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
    1. $data_items[1].name
    复制代码
    returns "Potion".

    By default, you can change parameters mid-game, with something like
    1. $data_items[1].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:        
    1. #==============================================================================
    2. # ** [XP] Data File Save v1.0
    3. #------------------------------------------------------------------------------
    4. #  Author: Wecoc (no credits required)
    5. #==============================================================================
    6. #==============================================================================
    7. # ** Kernel
    8. #==============================================================================
    9. module Kernel
    10.   def attr_reader(var)
    11.     var = var.to_s
    12.     eval "def #{var}() @#{var} end"
    13.   end
    14.   def attr_writer(var)
    15.     var = var.to_s
    16.     eval "def #{var}=(#{var}) @#{var}=#{var} end"
    17.   end
    18.   def attr_accessor(var)
    19.     attr_reader(var) ; attr_writer(var)
    20.   end
    21. end
    22. #==============================================================================
    23. # ** RPG
    24. #==============================================================================
    25. module RPG
    26.   DATA_FOLDERS = {}
    27.   DATA_FOLDERS["Actors"]       = RPG::Actor
    28.   DATA_FOLDERS["Classes"]      = RPG::Class
    29.   DATA_FOLDERS["Skills"]       = RPG::Skill
    30.   DATA_FOLDERS["Items"]        = RPG::Item
    31.   DATA_FOLDERS["Weapons"]      = RPG::Weapon
    32.   DATA_FOLDERS["Armors"]       = RPG::Armor
    33.   DATA_FOLDERS["Enemies"]      = RPG::Enemy
    34.   DATA_FOLDERS["Troops"]       = RPG::Troop
    35.   DATA_FOLDERS["States"]       = RPG::State
    36.   DATA_FOLDERS["Animations"]   = RPG::Animation
    37.   DATA_FOLDERS["Tilesets"]     = RPG::Tileset
    38.   DATA_FOLDERS["CommonEvents"] = RPG::CommonEvent
    39. end
    40. #==============================================================================
    41. # ** Hash
    42. #==============================================================================
    43. class Hash
    44.   def get_key(value)
    45.     each_pair { |k, v| return k if value == v }
    46.   end
    47. end
    48. #==============================================================================
    49. # ** Klass
    50. #==============================================================================
    51. for Klass in RPG::DATA_FOLDERS.values
    52.   class Klass
    53.     def self.===(klass)
    54.       folder = RPG::DATA_FOLDERS.get_key(self)
    55.       return true if klass.is_a?(DataFile) && klass.data_name == folder
    56.       super
    57.     end
    58.     def self.define_method(method, &block)
    59.       super(method, &block)
    60.       if block_given?
    61.         name = "@#{method.to_s}"
    62.         attr_writer(method)
    63.         instance_variable_set(name, block.call)
    64.       end
    65.     end
    66.   end
    67. end
    68. #==============================================================================
    69. # ** DataFile
    70. #==============================================================================
    71. class DataFile
    72.   attr_reader :id
    73.   attr_reader :data_name
    74.   attr_reader :default
    75.   def initialize(name, id, default)
    76.     @data_name = name
    77.     @id = id
    78.     @default = default[id]
    79.     setup
    80.   end
    81.   def setup
    82.     for i in @default.instance_variables
    83.       var = i[1...i.size]
    84.       next if var == "id"
    85.       instance_variable_set(i, @default.instance_eval(var))
    86.       attr_accessor(var)
    87.     end
    88.   end
    89.   def reset
    90.     for i in @default.instance_variables
    91.       var = i[1...i.size]
    92.       next if var == "id"
    93.       eval "self.#{var} = @default.#{var}"
    94.     end
    95.   end
    96.   def is_default?
    97.     for i in @default.instance_variables
    98.       var = i[1...i.size]
    99.       result = eval "self.#{var} == @default.#{var}"
    100.       return false if result == false
    101.     end
    102.     return true
    103.   end
    104.   def is_a?(klass)
    105.     for files in RPG::DATA_FOLDERS
    106.       f, k = *files
    107.       return true if klass == k && @data_name == f
    108.     end
    109.     super
    110.   end
    111. end
    112. #==============================================================================
    113. # ** DataList
    114. #==============================================================================
    115. class DataList < Array
    116.   def initialize(name)
    117.     super([nil])
    118.     data = load_data("Data/#{name}.rxdata")
    119.     for i in RPG::DATA_FOLDERS[name].instance_variables
    120.       var = i[1...i.size]
    121.       data.each do |d|
    122.         next if d == nil
    123.         d.attr_accessor(var)
    124.         result = d.instance_eval(var)
    125.         d.send("#{var}=", result)
    126.       end
    127.     end
    128.     for i in 1...data.size
    129.       self[i] = DataFile.new(name, i, data)
    130.     end
    131.   end
    132. end
    133. #==============================================================================
    134. # ** Scene_Title
    135. #==============================================================================
    136. class Scene_Title
    137.   def main
    138.     if $BTEST
    139.       battle_test
    140.       return
    141.     end
    142.     $data_actors        = DataList.new("Actors")
    143.     $data_classes       = DataList.new("Classes")
    144.     $data_skills        = DataList.new("Skills")
    145.     $data_items         = DataList.new("Items")
    146.     $data_weapons       = DataList.new("Weapons")
    147.     $data_armors        = DataList.new("Armors")
    148.     $data_enemies       = DataList.new("Enemies")
    149.     $data_troops        = DataList.new("Troops")
    150.     $data_states        = DataList.new("States")
    151.     $data_animations    = DataList.new("Animations")
    152.     $data_tilesets      = DataList.new("Tilesets")
    153.     $data_common_events = DataList.new("CommonEvents")
    154.     $data_system        = load_data("Data/System.rxdata")
    155.     $game_system = Game_System.new
    156.     @sprite = Sprite.new
    157.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    158.     s1 = "New game"
    159.     s2 = "Continue"
    160.     s3 = "Shutdown"
    161.     @command_window = Window_Command.new(192, [s1, s2, s3])
    162.     @command_window.back_opacity = 160
    163.     @command_window.x = 320 - @command_window.width / 2
    164.     @command_window.y = 288
    165.     @continue_enabled = false
    166.     for i in 0..3
    167.       if FileTest.exist?("Save#{i+1}.rxdata")
    168.         @continue_enabled = true
    169.       end
    170.     end
    171.     if @continue_enabled
    172.       @command_window.index = 1
    173.     else
    174.       @command_window.disable_item(1)
    175.     end
    176.     $game_system.bgm_play($data_system.title_bgm)
    177.     Audio.me_stop
    178.     Audio.bgs_stop
    179.     Graphics.transition
    180.     loop do
    181.       Graphics.update
    182.       Input.update
    183.       update
    184.       if $scene != self
    185.         break
    186.       end
    187.     end
    188.     Graphics.freeze
    189.     @command_window.dispose
    190.     @sprite.bitmap.dispose
    191.     @sprite.dispose
    192.   end
    193. end
    194. #==============================================================================
    195. # ** Scene_Save
    196. #==============================================================================
    197. class Scene_Save < Scene_File
    198.   alias data_file_wsd write_save_data unless $@
    199.   def write_save_data(file)
    200.     data_file_wsd(file)
    201.     hash_actors        = {}
    202.     hash_classes       = {}
    203.     hash_skills        = {}
    204.     hash_items         = {}
    205.     hash_weapons       = {}
    206.     hash_armors        = {}
    207.     hash_enemies       = {}
    208.     hash_troops        = {}
    209.     hash_states        = {}
    210.     hash_animations    = {}
    211.     hash_tilesets      = {}
    212.     hash_common_events = {}
    213.     for i in 1...$data_actors.size
    214.       if !$data_actors[i].is_default?
    215.         hash_actors[i] = $data_actors[i]
    216.       end
    217.     end
    218.     for i in 1...$data_classes.size
    219.       if !$data_classes[i].is_default?
    220.         hash_classes[i] = $data_classes[i]
    221.       end
    222.     end
    223.     for i in 1...$data_skills.size
    224.       if !$data_skills[i].is_default?
    225.         hash_skills[i] = $data_skills[i]
    226.       end
    227.     end
    228.     for i in 1...$data_items.size
    229.       if !$data_items[i].is_default?
    230.         hash_items[i] = $data_items[i]
    231.       end
    232.     end
    233.     for i in 1...$data_weapons.size
    234.       if !$data_weapons[i].is_default?
    235.         hash_weapons[i] = $data_weapons[i]
    236.       end
    237.     end
    238.     for i in 1...$data_armors.size
    239.       if !$data_armors[i].is_default?
    240.         hash_armors[i] = $data_armors[i]
    241.       end
    242.     end
    243.     for i in 1...$data_enemies.size
    244.       if !$data_enemies[i].is_default?
    245.         hash_enemies[i] = $data_enemies[i]
    246.       end
    247.     end
    248.     for i in 1...$data_troops.size
    249.       if !$data_troops[i].is_default?
    250.         hash_troops[i] = $data_troops[i]
    251.       end
    252.     end
    253.     for i in 1...$data_states.size
    254.       if !$data_states[i].is_default?
    255.         hash_states[i] = $data_states[i]
    256.       end
    257.     end
    258.     for i in 1...$data_animations.size
    259.       if !$data_animations[i].is_default?
    260.         hash_animations[i] = $data_animations[i]
    261.       end
    262.     end
    263.     for i in 1...$data_tilesets.size
    264.       if !$data_tilesets[i].is_default?
    265.         hash_tilesets[i] = $data_tilesets[i]
    266.       end
    267.     end
    268.     for i in 1...$data_common_events.size
    269.       if !$data_common_events[i].is_default?
    270.         hash_common_events[i] = $data_common_events[i]
    271.       end
    272.     end
    273.     Marshal.dump(hash_actors, file)
    274.     Marshal.dump(hash_classes, file)
    275.     Marshal.dump(hash_skills, file)
    276.     Marshal.dump(hash_items, file)
    277.     Marshal.dump(hash_weapons, file)
    278.     Marshal.dump(hash_armors, file)
    279.     Marshal.dump(hash_enemies, file)
    280.     Marshal.dump(hash_troops, file)
    281.     Marshal.dump(hash_states, file)
    282.     Marshal.dump(hash_animations, file)
    283.     Marshal.dump(hash_tilesets, file)
    284.     Marshal.dump(hash_common_events, file)
    285.   end
    286. end
    287. #==============================================================================
    288. # ** Scene_Load
    289. #==============================================================================
    290. class Scene_Load < Scene_File
    291.   alias data_file_rsd read_save_data unless $@
    292.   def read_save_data(file)
    293.     data_file_rsd(file)
    294.     hash_actors        = Marshal.load(file)
    295.     hash_classes       = Marshal.load(file)
    296.     hash_skills        = Marshal.load(file)
    297.     hash_items         = Marshal.load(file)
    298.     hash_weapons       = Marshal.load(file)
    299.     hash_armors        = Marshal.load(file)
    300.     hash_enemies       = Marshal.load(file)
    301.     hash_troops        = Marshal.load(file)
    302.     hash_states        = Marshal.load(file)
    303.     hash_animations    = Marshal.load(file)
    304.     hash_tilesets      = Marshal.load(file)
    305.     hash_common_events = Marshal.load(file)
    306.     for i in hash_actors.keys
    307.       if i < $data_actors.size
    308.         $data_actors[i] = hash_actors[i].clone
    309.       end
    310.     end
    311.     for i in hash_classes.keys
    312.       if i < $data_classes.size
    313.         $data_classes[i] = hash_classes[i].clone
    314.       end
    315.     end
    316.     for i in hash_skills.keys
    317.       if i < $data_skills.size
    318.         $data_skills[i] = hash_skills[i].clone
    319.       end
    320.     end
    321.     for i in hash_items.keys
    322.       if i < $data_items.size
    323.         $data_items[i] = hash_items[i].clone
    324.       end
    325.     end
    326.     for i in hash_weapons.keys
    327.       if i < $data_weapons.size
    328.         $data_weapons[i] = hash_weapons[i].clone
    329.       end
    330.     end
    331.     for i in hash_armors.keys
    332.       if i < $data_armors.size
    333.         $data_armors[i] = hash_armors[i].clone
    334.       end
    335.     end
    336.     for i in hash_enemies.keys
    337.       if i < $data_enemies.size
    338.         $data_enemies[i] = hash_enemies[i].clone
    339.       end
    340.     end
    341.     for i in hash_troops.keys
    342.       if i < $data_troops.size
    343.         $data_troops[i] = hash_troops[i].clone
    344.       end
    345.     end
    346.     for i in hash_states.keys
    347.       if i < $data_states.size
    348.         $data_states[i] = hash_states[i].clone
    349.       end
    350.     end
    351.     for i in hash_animations.keys
    352.       if i < $data_animations.size
    353.         $data_animations[i] = hash_animations[i].clone
    354.       end
    355.     end
    356.     for i in hash_tilesets.keys
    357.       if i < $data_tilesets.size
    358.         $data_tilesets[i] = hash_tilesets[i].clone
    359.       end
    360.     end
    361.     for i in hash_common_events.keys
    362.       if i < $data_common_events.size
    363.         $data_common_events[i] = hash_common_events[i].clone
    364.       end
    365.     end
    366.   end
    367. 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[1] (Potion) as an example so it's easier to understand.

    Spoiler: Script calls
    Get a parameter
    $data_items[1].name # Returns "Potion". Works as default.

    Set a parameter
    $data_items[1].name = "HP Potion"

    Get the default value for that parameter
    $data_items[1].default.name

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

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

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

                    Ruby:        
    1. #==============================================================================
    2. # ** [XP] New parameters
    3. #==============================================================================
    4. module RPG
    5.   class Item
    6.     define_method(:agi_plus) { 20 }
    7.   end
    8. 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.
    1. define_method(:description_b) { @description }
    复制代码

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

                    Ruby:        
    1. class Scene_Title
    2.   alias new_parameters_game command_new_game unless $@
    3.   def command_new_game
    4.     # Define here the custom values of your new parameter
    5.     $data_items[1].description_b = "Test"
    6.     # ---------------------------------------------------
    7.     new_parameters_game
    8.   end
    9. 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 calls
    For example, you can define some tags to a certain enemy like this:
    $data_enemies[1].set_tags("Fire", "Dragon", "Fly")

    And then check if it's a Dragon with:
    $data_enemies[1].has_tag?("Dragon")
    Spoiler: Tags System
                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # Tags System. Group each DataFile item using multiple tags
    5. #------------------------------------------------------------------------------
    6. # Requires: Data File Save
    7. #==============================================================================
    8. class DataFile
    9.   alias tag_ini initialize unless $@
    10.   def initialize(name, id, default)
    11.     tag_ini(name, id, default)
    12.     @tags = []
    13.   end
    14.   def set_tags(*args)
    15.     for i in 0...args.size
    16.       @tags.push(args[i])
    17.     end
    18.     @tags.uniq!
    19.     @tags.sort!
    20.     return @tags
    21.   end
    22.   def has_tag?(name)
    23.     return @tags.include?(name)
    24.   end
    25. 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 Examples
    Spoiler: 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:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 1. Molten Giant
    5. #------------------------------------------------------------------------------
    6. # Description: Skill with SP cost depending on current actor's parameters
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Window_Skill < Window_Selectable
    10.   alias molten_giant_refresh refresh unless $@
    11.   def refresh
    12.     #--------------------------------------------------------------------------
    13.     # Define here the custom formulas of SP cost
    14.     #--------------------------------------------------------------------------
    15.     hp = @actor.hp
    16.     maxhp = @actor.maxhp
    17.     $data_skills[1].sp_cost = [(hp * 100) / maxhp, 10].max
    18.     #--------------------------------------------------------------------------
    19.     molten_giant_refresh
    20.   end
    21. end
    复制代码


    Spoiler: Chicken knife[quote]Weapon which attack increases each time you escape from battle (it must be equipped).

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 2. Chicken Knife
    5. #------------------------------------------------------------------------------
    6. # Description: Weapon which attack increases each time you escape from battle
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_System
    10.   attr_accessor :chicken_escape_count
    11.   alias chicken_escape_count_ini initialize unless $@
    12.   def initialize
    13.     chicken_escape_count_ini
    14.     @chicken_escape_count = 0
    15.   end
    16. end
    17. class Scene_Battle
    18.   alias chicken_knife_escape battle_end unless $@
    19.   def battle_end(result)
    20.     if result == 1 # Escape
    21.       for i in 0...$game_party.actors.size
    22.         actor = $game_party.actors[i]
    23.         next if actor.dead?
    24.         #----------------------------------------------------------------------
    25.         # Define here the atk custom formula
    26.         #----------------------------------------------------------------------
    27.         if actor.weapon_id == 1 # Weapon ID
    28.           $game_system.chicken_escape_count += 1
    29.           atk = $data_weapons[actor.weapon_id].default.atk
    30.           new_atk = [atk + 10 * $game_system.chicken_escape_count, 250].min
    31.           $data_weapons[actor.weapon_id].atk = new_atk
    32.         end
    33.         #----------------------------------------------------------------------
    34.       end
    35.     end
    36.     chicken_knife_escape(result)
    37.   end
    38. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 3. Hestia Knife
    5. #------------------------------------------------------------------------------
    6. # Description: Weapon which strength increases based on the wearer's strength
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Actor < Game_Battler
    10.   alias hestia_knife_equip equip unless $@
    11.   def equip(equip_type, id)
    12.     case equip_type
    13.     when 0 # Weapon
    14.       #------------------------------------------------------------------------
    15.       # Define here the new parameters of the item when equipped
    16.       #------------------------------------------------------------------------
    17.       if id == 1
    18.         equip_str = $data_weapons[1].default.str_plus
    19.         actor_str = self.str
    20.         $data_weapons[1].str_plus = equip_str * actor_str / 100
    21.       end
    22.       #------------------------------------------------------------------------
    23.     end
    24.     hestia_knife_equip(equip_type, id)
    25.   end
    26. 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 Soulstealer
    Each 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:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 4. Mejai's Soulstealer
    5. #------------------------------------------------------------------------------
    6. # Description: Each actor has a glory score that increases when winning and
    7. # decreases when losing battle. A weapon's strength depends on that.
    8. # Requires: Data File Save
    9. #==============================================================================
    10. #==============================================================================
    11. # ** Glory Score
    12. #==============================================================================
    13. class Game_Actor < Game_Battler
    14.   attr_accessor :already_dead
    15.   alias glory_score_setup setup unless $@
    16.   def setup(actor_id)
    17.     glory_score_setup(actor_id)
    18.     @glory_score = 0
    19.     @already_dead = false
    20.   end
    21.   def glory_score
    22.     return @glory_score
    23.   end
    24.   def glory_score=(score)
    25.     @glory_score = score
    26.   end
    27. end
    28. class Scene_Battle
    29.   unless $@
    30.     alias glory_score_main main
    31.     alias glory_score_end battle_end
    32.   end
    33.   def main
    34.     for actor in $game_party.actors
    35.       if actor.dead?
    36.         actor.already_dead = true
    37.       end
    38.     end
    39.     glory_score_main
    40.   end
    41.   def battle_end(result)
    42.     if result < 2
    43.       #------------------------------------------------------------------------
    44.       # Define here the points distribution when battle ends (except escape)
    45.       #------------------------------------------------------------------------
    46.       for actor in $game_party.actors
    47.         if actor.dead?
    48.           if actor.already_dead == false
    49.             actor.glory_score -= 1
    50.           end
    51.         else
    52.           actor.glory_score += 1
    53.         end
    54.         actor.already_dead = false
    55.       end
    56.       #------------------------------------------------------------------------
    57.     end
    58.     glory_score_end(result)
    59.   end
    60. end
    61. #==============================================================================
    62. # ** Mejai's Soulstealer
    63. #==============================================================================
    64. class Game_Actor < Game_Battler
    65.   alias mejai_soul_equip equip unless $@
    66.   def glory_score=(score)
    67.     @glory_score = score
    68.     #--------------------------------------------------------------------------
    69.     # Define here how the glory score affects the weaponry
    70.     #--------------------------------------------------------------------------
    71.     if @weapon_id == 1
    72.       str = $data_weapons[1].default.str_plus
    73.       new_str = str + 4 * @glory_score
    74.       $data_weapons[1].str_plus = [[new_str, 999].min, 1].max
    75.     end
    76.     #--------------------------------------------------------------------------
    77.   end
    78.   def equip(*args)
    79.     mejai_soul_equip(*args)
    80.     self.glory_score = @glory_score
    81.   end
    82. end
    复制代码


    Spoiler: Roaming Mend
    This 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:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 5. Roaming Mend
    5. #------------------------------------------------------------------------------
    6. # Descripción: This state increases the resistance to physical damage, but when
    7. # attacked it deactivates and reactivates into a random ally multiple times.
    8. # Requires: Data File Save
    9. #==============================================================================
    10. #==============================================================================
    11. # ** State Travel Count
    12. #==============================================================================
    13. class RPG::State
    14.   define_method(:travel_count) { @travel_count ||= 0 }
    15. end
    16. class Game_Battler
    17.   #----------------------------------------------------------------------------
    18.   # Define here the states that "travel" between allies
    19.   #----------------------------------------------------------------------------
    20.   TRAVEL_STATES = [17]
    21.   #----------------------------------------------------------------------------
    22.   unless $@
    23.     alias travel_count_add_state add_state
    24.     alias travel_count_remove_state remove_state
    25.     alias travel_count_attack attack_effect
    26.   end
    27.   def add_state(state_id, force=false, reset_travel=true)
    28.     travel_count_add_state(state_id, force)
    29.     $data_states[state_id].travel_count = 0 if reset_travel
    30.     if TRAVEL_STATES.include?(state_id) and reset_travel == false
    31.       $data_states[state_id].travel_count = 1 + rand(3)
    32.     end
    33.   end
    34.   def remove_state(state_id, force=false, reset_travel=true)
    35.     travel_count_remove_state(state_id, force)
    36.     $data_states[state_id].travel_count = 0 if reset_travel
    37.   end
    38.   def attack_effect(attacker)
    39.     effective = travel_count_attack(attacker)
    40.     if self.damage.to_i > 0
    41.       for i in TRAVEL_STATES
    42.         if self.state?(i)
    43.           $data_states[i].travel_count -= 1
    44.           if self.is_a?(Game_Actor)
    45.             array = $game_party.actors.clone
    46.           else
    47.             array = $game_party.enemies.clone
    48.           end
    49.           array.delete(self)
    50.           array.delete_if {|battler| battler.dead?}
    51.           if array.size == 0 or $data_states[i].travel_count == 0
    52.             remove_state(i)
    53.             next
    54.           end
    55.           new_member = array[rand(array.size)]
    56.           remove_state(i, false, false)
    57.           new_member.add_state(i, false, false)
    58.         end
    59.       end
    60.     end
    61.     return effective
    62.   end
    63. end
    64. #==============================================================================
    65. # ** Damage edit
    66. #==============================================================================
    67. class Game_Battler
    68.   alias roaming_mend_attack attack_effect unless $@
    69.   def attack_effect(attacker)
    70.     effective = roaming_mend_attack(attacker)
    71.     if self.damage.to_i > 0
    72.       #------------------------------------------------------------------------
    73.       # Change here the damage formula with the special state(s)
    74.       #------------------------------------------------------------------------
    75.       if self.state?(17) # State ID
    76.         self.damage = (self.damage * 0.85).floor
    77.       end
    78.       #------------------------------------------------------------------------
    79.     end
    80.     return effective
    81.   end
    82. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 6. Judgement
    5. #------------------------------------------------------------------------------
    6. # Description: Skill that changes its element based on the accessory equipped
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Battler
    10.   alias judgement_skill skill_effect unless $@
    11.   def skill_effect(user, skill)
    12.     if user.is_a?(Game_Actor)
    13.       #------------------------------------------------------------------------
    14.       # Define here the element based on the current equip
    15.       #------------------------------------------------------------------------
    16.       if skill.id == 1
    17.         case user.armor4_id
    18.         when 1 # Fire Ring
    19.           $data_skills[1].element_set = [1]
    20.         when 2 # Ice Ring
    21.           $data_skills[1].element_set = [2]
    22.         when 3 # Thunder Ring
    23.           $data_skills[1].element_set = [3]
    24.         when 4 # Water Ring
    25.           $data_skills[1].element_set = [4]
    26.         else
    27.           $data_skills[1].element_set = []
    28.         end
    29.       end
    30.       #------------------------------------------------------------------------
    31.     end
    32.     return judgement_skill(user, skill)
    33.   end
    34. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 7. Heighten Magic
    5. #------------------------------------------------------------------------------
    6. # Description: State increases the SP cost of certain skills, but it also
    7. # increases their power.
    8. # Requires: Data File Save
    9. #==============================================================================
    10. class Window_Skill < Window_Selectable
    11.   alias heighten_magic_refresh refresh unless $@
    12.   def refresh
    13.     #--------------------------------------------------------------------------
    14.     # Define here the SP cost formula for each skill
    15.     #--------------------------------------------------------------------------
    16.     if @actor.state?(17)
    17.       $data_skills[1].sp_cost = ($data_skills[1].default.sp_cost * 1.25).floor
    18.       $data_skills[2].sp_cost = ($data_skills[2].default.sp_cost * 1.25).floor
    19.       $data_skills[3].sp_cost = ($data_skills[3].default.sp_cost * 1.25).floor
    20.       $data_skills[4].sp_cost = ($data_skills[4].default.sp_cost * 1.25).floor
    21.     end
    22.     #--------------------------------------------------------------------------
    23.     heighten_magic_refresh
    24.   end
    25. end
    26. class Game_Battler
    27.   alias heighten_magic_skill skill_effect unless $@
    28.   def skill_effect(user, skill)
    29.     effective = false
    30.     #--------------------------------------------------------------------------
    31.     # Define here the power formula for each skill
    32.     #--------------------------------------------------------------------------
    33.     if user.state?(17)
    34.       $data_skills[1].power = ($data_skills[1].default.power * 1.25).floor
    35.       $data_skills[2].power = ($data_skills[2].default.power * 1.25).floor
    36.       $data_skills[3].power = ($data_skills[3].default.power * 1.25).floor
    37.       $data_skills[4].power = ($data_skills[4].default.power * 1.25).floor
    38.       effective = true
    39.     end
    40.     #--------------------------------------------------------------------------
    41.     effective |= heighten_magic_skill(user, skill)
    42.     #--------------------------------------------------------------------------
    43.     # Reset skill SP cost and power after using
    44.     #--------------------------------------------------------------------------
    45.     if user.state?(17)
    46.       $data_skills[1].sp_cost = $data_skills[1].default.sp_cost
    47.       $data_skills[2].sp_cost = $data_skills[2].default.sp_cost
    48.       $data_skills[3].sp_cost = $data_skills[3].default.sp_cost
    49.       $data_skills[4].sp_cost = $data_skills[4].default.sp_cost
    50.       $data_skills[1].power = $data_skills[1].default.power
    51.       $data_skills[2].power = $data_skills[2].default.power
    52.       $data_skills[3].power = $data_skills[3].default.power
    53.       $data_skills[4].power = $data_skills[4].default.power
    54.     end
    55.     #--------------------------------------------------------------------------
    56.     return effective
    57.   end
    58. end
    复制代码


    Spoiler: Adapting Armor
    Armor 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:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 8. Adapting Armor
    5. #------------------------------------------------------------------------------
    6. # Description: Armor that when attacked with an element becomes of that element
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Battler
    10.   unless $@
    11.     alias adapting_armor_attack attack_effect
    12.     alias adapting_armor_skill skill_effect
    13.   end
    14.   def attack_effect(attacker)
    15.     effective = adapting_armor_attack(attacker)
    16.     if effective && self.is_a?(Game_Actor)
    17.       #------------------------------------------------------------------------
    18.       # Define the armors by ID that adapt with elements (attack effect)
    19.       #------------------------------------------------------------------------
    20.       if self.armor3_id == 1
    21.         $data_armors[1].guard_element_set = attacker.element_set
    22.       end
    23.       #------------------------------------------------------------------------
    24.     end
    25.     return effective
    26.   end
    27.   def skill_effect(user, skill)
    28.     effective = adapting_armor_skill(user, skill)
    29.     if effective && self.is_a?(Game_Actor)
    30.       #------------------------------------------------------------------------
    31.       # Define the armors by ID that adapt with elements (skill effect)
    32.       #------------------------------------------------------------------------
    33.       if self.armor3_id == 1
    34.         $data_armors[1].guard_element_set = skill.element_set
    35.       end
    36.       #------------------------------------------------------------------------
    37.     end
    38.     return effective
    39.   end
    40. end
    41. class Scene_Battle
    42.   alias adapting_armor_battle_end battle_end unless $@
    43.   def battle_end(result)
    44.     adapting_armor_battle_end(result)
    45.     #--------------------------------------------------------------------------
    46.     # Change armors back to normal when battle ends
    47.     #--------------------------------------------------------------------------
    48.     $data_armors[1].guard_element_set = []
    49.     #--------------------------------------------------------------------------
    50.   end
    51. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 9. Map States
    5. #------------------------------------------------------------------------------
    6. # Certain actors or enemies can have a permanent state based on the current map
    7. # Requires: Data File Save
    8. #==============================================================================
    9. #==============================================================================
    10. # * RPG::Actor / RPG::Enemy
    11. #==============================================================================
    12. class DataFile
    13.   #--------------------------------------------------------------------------
    14.   # * Get the maps with altered states
    15.   #--------------------------------------------------------------------------
    16.   def get_map_auto_states(map)
    17.     @map_states = {} if @map_states.nil?
    18.     return @map_states[map]
    19.   end
    20.   #--------------------------------------------------------------------------
    21.   # * Set the maps with altered states
    22.   #--------------------------------------------------------------------------
    23.   def set_map_auto_states(map, states)
    24.     @map_states = {} if @map_states.nil?
    25.     @map_states[map] = states.to_a
    26.   end
    27. end
    28. #==============================================================================
    29. # * Game_Actor / Game_Enemy
    30. #==============================================================================
    31. class Game_Actor < Game_Battler
    32.   def map_auto_states
    33.     result = $data_actors[@actor_id].get_map_auto_states($game_map.map_id)
    34.     return !result.nil? ? result : []
    35.   end
    36. end
    37. class Game_Enemy < Game_Battler
    38.   def map_auto_states
    39.     result = $data_enemies[@enemy_id].get_map_auto_states($game_map.map_id)
    40.     return !result.nil? ? result : []
    41.   end
    42. end
    43. #==============================================================================
    44. # * Game_Party
    45. #==============================================================================
    46. class Game_Party
    47.   alias map_states_setup_start setup_starting_members
    48.   def setup_starting_members
    49.     map_states_setup_start
    50.     #--------------------------------------------------------------------------
    51.     # Define here permanently the auto-states on each actor/enemy by ID
    52.     #--------------------------------------------------------------------------
    53.     $data_actors[1].set_map_auto_states(1, [2])  # (Map ID, [States])
    54.     $data_enemies[1].set_map_auto_states(1, [2]) # (Map ID, [States])
    55.     #--------------------------------------------------------------------------
    56.   end
    57. end
    58. #==============================================================================
    59. # * Game_Map
    60. #==============================================================================
    61. class Game_Map
    62.   alias map_states_setup setup unless $@
    63.   def setup(map_id)
    64.     map_states_setup(map_id)
    65.     for actor in $game_party.actors
    66.       states = actor.map_auto_states
    67.       if !states.nil? and states.size > 0
    68.         #----------------------------------------------------------------------
    69.         # Add map states to actors when entering the map
    70.         #----------------------------------------------------------------------
    71.         for state in states
    72.           actor.add_state(state, true)
    73.         end
    74.       end
    75.     end
    76.   end
    77. end
    78. #==============================================================================
    79. # * Game_Troop
    80. #==============================================================================
    81. class Game_Troop
    82.   alias map_states_setup setup unless $@
    83.   def setup(troop_id)
    84.     map_states_setup(troop_id)
    85.     for enemy in @enemies
    86.       states = enemy.map_auto_states
    87.       if !states.nil? and states.size > 0
    88.         #----------------------------------------------------------------------
    89.         # Add map states to enemies when starting battle
    90.         #----------------------------------------------------------------------
    91.         for state in states
    92.           enemy.add_state(state, true)
    93.         end
    94.       end
    95.     end
    96.   end
    97. end
    98. #==============================================================================
    99. # * Scene_Map
    100. #==============================================================================
    101. class Scene_Map
    102.   alias map_states_transfer transfer_player unless $@
    103.   def transfer_player
    104.     if $game_map.map_id != $game_temp.player_new_map_id
    105.       for actor in $game_party.actors
    106.         states = actor.map_auto_states
    107.         if !states.nil? and states.size > 0
    108.           #--------------------------------------------------------------------
    109.           # Remove map states when exiting the current map
    110.           #--------------------------------------------------------------------
    111.           for state in states
    112.             actor.remove_state(state, true)
    113.           end
    114.         end
    115.       end
    116.       map_states_transfer
    117.     end
    118.   end
    119. end
    复制代码


    Spoiler: Walk Armor
    Armor 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:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 11. Walk Armor
    5. #------------------------------------------------------------------------------
    6. # Armor which pdef depends on your total step count, increasing every X steps
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Party
    10.   alias walk_armor_increase increase_steps unless $@
    11.   def increase_steps
    12.     walk_armor_increase
    13.     if @steps % 100 == 0       # Every few steps it increases
    14.       armor = $data_armors[16] # Armor ID
    15.       armor.pdef += 1          # How much it increases
    16.     end
    17.   end
    18. end
    复制代码


    The second one increasing only when equipped.

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 11(*). Walk Armor
    5. #------------------------------------------------------------------------------
    6. # Armor which pdef increases when walking and you have it equipped
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Party
    10.   alias walk_armor_increase increase_steps unless $@
    11.   def increase_steps
    12.     walk_armor_increase
    13.     if @steps % 100 == 0       # Every few steps it increases
    14.       armor = $data_armors[16] # Armor ID
    15.       if equipped?(3, 16) # (Equip type, Equip ID)
    16.         armor.pdef += 1        # How much it increases
    17.       end
    18.     end
    19.   end
    20.   def equipped?(slot, id)
    21.     for i in 0...@actors.size
    22.       actor = $game_party.actors[i]
    23.       case slot
    24.       when 0 # Weapon
    25.         return true if actor.weapon_id == id
    26.       when 1 # Shield
    27.         return true if actor.armor1_id == id
    28.       when 2 # Head
    29.         return true if actor.armor2_id == id
    30.       when 3 # Body
    31.         return true if actor.armor3_id == id
    32.       when 4 # Accessory
    33.         return true if actor.armor4_id == id
    34.       end
    35.     end
    36.     return false
    37.   end
    38. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 12. Upgrading Shield
    5. #------------------------------------------------------------------------------
    6. # Shield which defense increases when you're attack and it's equipped
    7. # Required: Data File Save
    8. #==============================================================================
    9. class Game_Battler
    10.   #----------------------------------------------------------------------------
    11.   UPGRADING_SHIELD = 4 # Shield ID
    12.   #----------------------------------------------------------------------------
    13.   alias upgrading_shield_effect attack_effect unless $@
    14.   def attack_effect(attacker)
    15.     effective = upgrading_shield_effect(attacker)
    16.     if effective && self.damage.to_i > 0
    17.       if self.is_a?(Game_Actor)
    18.         # You can optionally make it increase only when guarding
    19.         if self.armor1_id == UPGRADING_SHIELD # and self.guarding?
    20.           armor = $data_armors[UPGRADING_SHIELD]
    21.           # Set here the effect when being attacked and wearing it
    22.           armor.pdef += 2
    23.         end
    24.       end
    25.     end
    26.     return effective
    27.   end
    28. end
    复制代码


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

                    Ruby:        
    1. #==============================================================================
    2. # ** Data File Save Tips & Tricks
    3. #------------------------------------------------------------------------------
    4. # 13. Learning Heal
    5. #------------------------------------------------------------------------------
    6. # Skill that decreases its SP cost each time you use it
    7. # Requires: Data File Save
    8. #==============================================================================
    9. class Game_Battler
    10.   alias learning_heal_effect skill_effect unless $@
    11.   def skill_effect(user, skill)
    12.     effective = learning_heal_effect(user, skill)
    13.     if effective && self.damage.to_i.abs > 0
    14.       if user.is_a?(Game_Actor) && skill.id == 17 # Skill ID
    15.         #----------------------------------------------------------------------
    16.         sp_cost_min   = 50 # Minimum SP Cost
    17.         sp_cost_learn = 5  # SP cost reduction
    18.         skill.sp_cost = [skill.sp_cost - sp_cost_learn, sp_cost_min].max
    19.         #----------------------------------------------------------------------
    20.       end
    21.     end
    22.     return effective
    23.   end
    24. end
    复制代码
    [/quote]




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

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-14 17:56 , Processed in 0.153289 second(s), 52 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表