Introduction
Are you bummed by the 999 database limit for skills, items, actors and the like? If so, then you may want to make a mega-data database.
This script alters the load_data kernel to recognize key databases used by the RPGMaker engines which use Ruby Scripting, and allows additional database records to be added upon game load.
This script may also generate a txt file (or set of text files) which will list all the items within your mega databases.
Demo
Nope.
Script
Spoiler: MegaData
Code:
#============================================================================== # ** LILY'S MEGA DATA! #------------------------------------------------------------------------------ # by DerVVulfman # version 1.0 # 08-22-2017 (mm/dd/yyyy) # RUBY - RGSS / RGSS2 / RGSS3 (RMXP, RMVX & RMVXAce) #============================================================================== # # Introduction: # ============= # # Are you bummed by the 999 database limit for skills, items, actors and the # like? If so, then you may want to make a mega-data database. # # This script alters the load_data kernel to recognize key databases used by # the RPGMaker engines which use Ruby Scripting, and allows additional data- # base records to be added upon game load. # # This script may also generate a txt file (or set of text files) which will # list all the items within your mega databases. # # == * == * == # # The MegaData Module: # ==================== # # This module is your configuration section, controlling how the script runs # and holds the lists of any additional RPGMaker databases which are being # imported into the project. # # The first set of values are the two within the BASIC SETTINGS category and # are as follows: # # * RGSS_SYSTEM: This setting lets you use this system for whichever version # of RPGMaker you choose, as long as it uses Ruby Scripting. # # A value of 0 (by default) informs the script that it is in # an RPGMaker XP project. Meanwhile, a value of 1 will set # the system to read and recognize RPGMaker VX data files,and # a value of 2 informs the script that it is being used in an # RPGMaker VXAce project. # # * LIST_SYSTEM: This is a simple true/false setting that determines if the # project will generate any database output text files. # # Generated output files will be created in your project's # root folder, and always begin with "MEGA" in its name. The # file(s) are only generated for those databases that are # being appended by outside database files. # # Remember to turn the feature off for your completed games. # # The second set of values are arrays, each meant to hold the filenames of # additional database being loaded. These extra databases attach themselves # to your existing ones, never overwriting them. # # The List of arrays are as follows: # # * ACTOR_LIST - To let you go beyond 999 actors. # * SKILL_LIST - To let you learn more than 999 skills. # * ITEM_LIST - To let you have more than 999 items. # * WEAP_LIST - To let you have more than 999 weapons in your armory. # * ARMOR_LIST - To let you go beyond 999 pieces of armor. # * ENEMY_LIST - To let you increase your bestiary beyond 999 foes. # * ANIM_LIST - To let you go beyond 999 battle animations. # * TILES_LIST - To let you have more than 999 tilesets (RMXP Only). # # When adding a database filename to the list, you only enter the filename # itself without either the Data pathway or the file's extension. It is made # this way to let the system work more easily with the multiple RUBY script # platforms. An example appears in the script by default. # # EX: SKILL_LIST = ["Skills2"] # # So not only will the project load the default 'Data\Skills.rxdata' file, but # also an accompanying Skills2.rxdata file within the Data folder. This, assu- # ming that a Skills2.rxdata file exists, otherwise an error will occur. # # # == * == * == # # USAGE: # ====== # # This master script is designed to allow you to increase the size of your # available data. However, the default RPGMaker editors only work with data # up to record 999. Ergo, you will need to use script commands and/or addi- # tional code to mimic typical map event commands like 'Change Actor' or the # like. # # == * == * == # # COMPATIBILITY: # ============== # # This script should be usable for all Ruby-Scripting versions of RPGMaker, # and it merely attaches code to the 'load_data' method within the Kernel # module itself. # # == * == * == # # CREDITS AND THANKS: # =================== # # Thanks goes to a dear friend who inquired just this past week if one could # get past the 999 item or skill limit. # #============================================================================== # # TERMS AND CONDITIONS: # ===================== # # Free for use, even in commercial games. Due credit is all that's required. # #============================================================================== module MegaData # BASIC SETTINGS # ============== # Basic control switches determining the Ruby based engine in use, or if the # system outputs a file containing the whole list of 'records' of a combined # mega database. # RGSS_SYSTEM = 0 # 0 = RGSS/RMXP, 1 = RGSS2/RMVX, 2 = RGSS3/RMVXAce LIST_SYSTEM = true # If true, outputs a txt file for the combined data # ADDITIONAL FILES # ================ # Each is an array containing the filenames of additional database files with # its records being added into the database for the current project. Only the # name of the extra file is needed as the script recognizes that each file is # within the Data folder, and attaches the suitable file extension ( .rxdata, # .rvdata, rvdata2). The arrays may be set to nil or [] (empty). # ACTOR_LIST = nil SKILL_LIST = ["Skills2"] # <--- example for having 'Data\Skills2.rxdata' ITEM_LIST = nil WEAP_LIST = nil ARMOR_LIST = nil ENEMY_LIST = nil ANIM_LIST = nil TILES_LIST = nil end #============================================================================== # ** Kernel #------------------------------------------------------------------------------ # The Kernel module is a child of the Object class, allowing all methods and # values within to be globally accessible unless overridden. #============================================================================== module Kernel #-------------------------------------------------------------------------- # * Alias / Renamed Method Listings with F12 anti-stack support #-------------------------------------------------------------------------- if @kernel_mega_load_data_stack.nil? @kernel_mega_load_data_stack = true alias kernel_mega_load_data load_data end #-------------------------------------------------------------------------- # * load data # filename : name of data file - able to read encrypted game data. #-------------------------------------------------------------------------- def load_data(filename) # Acquire position of filename's period parse_cnt = filename.index(".") # Crop away file extension for non-biased system test testname = filename[0,parse_cnt] # Branch on filename, retrieving data (expanded or otherwise) case testname when "Data/Actors" effective = load_mega("Data/Actors", MegaData::ACTOR_LIST) when "Data/Skills" effective = load_mega("Data/Skills", MegaData::SKILL_LIST) when "Data/Items" effective = load_mega("Data/Items", MegaData::ITEM_LIST) when "Data/Weapons" effective = load_mega("Data/Weapons", MegaData::WEAP_LIST) when "Data/Armors" effective = load_mega("Data/Armors", MegaData::ARMOR_LIST) when "Data/Enemies" effective = load_mega("Data/Enemies", MegaData::ENEMY_LIST) when "Data/Animations" effective = load_mega("Data/Animations", MegaData::ANIM_LIST) when "Data/Tilesets" effective = load_mega("Data/Tilesets", MegaData::TILES_LIST) else effective = kernel_mega_load_data(filename) end # Return database data return effective end #-------------------------------------------------------------------------- # * load mega data # filename : name of data file - able to read encrypted game data. # arraylist : list of additional data files added #-------------------------------------------------------------------------- def load_mega(filename, arraylist) # Keep old filename for output (minus data folder) oldfilename = filename[5,filename.length] # Attach filename extension based on RGSS used filename = load_mega_extension(filename) # Acquire records from default datafile effective = kernel_mega_load_data(filename) # Set our counter counter = 0 # Sort through datafile records for record in effective # Skip null record next if record.nil? # Increase counter for each viable record counter += 1 end # Exit with normal data if array list is nil return effective if arraylist.nil? or arraylist == [] # Generate a list, if enabled if MegaData::LIST_SYSTEM == true # Create the new text file for the given data f = File.new("MEGA " + oldfilename+".txt", "w+") f.puts "Initial Project Data:" # Sort through the new data records for record in effective # Skip null record next if record.nil? # Create a formatted string of the ID and record data name formatted = "ID: " + (record.id).to_s + " - " + record.name # Output to the file f.puts formatted end # Add 1 line spacing f.puts " " end # Sort through each filename for datafile in arraylist # Apply Data folder prefix to datafile name renamed_datafile = "Data/" + datafile # Attach filename extension based on RGSS used renamed_datafile = load_mega_extension(renamed_datafile) # Acquire records from acquired filename tempeffective = kernel_mega_load_data(renamed_datafile) # Generate file heading for report if enabled if MegaData::LIST_SYSTEM == true f.puts "Data from: " + datafile end # Sort through datafile records for record in tempeffective # Skip null record next if record.nil? # Increase counter for viable record counter += 1 # Redefine current record's ID by counter record.id = counter # Add record data to default datafile effective.push record # Output record for report if enabled if MegaData::LIST_SYSTEM == true # Create a formatted string of the ID and record data name formatted = "ID: " + (record.id).to_s + " - " + record.name # Output to the file f.puts formatted end end # Add 1 line spacing if MegaData::LIST_SYSTEM == true f.puts " " end end # Close Report generator if enabled if MegaData::LIST_SYSTEM == true f.close end # Exit with expanded datafile return effective end #-------------------------------------------------------------------------- # * load mega datafile extension # filename : name of data file to have the extension attached #-------------------------------------------------------------------------- def load_mega_extension(filename) # Attach filename extension based on RGSS used case MegaData::RGSS_SYSTEM when 1 effective = filename + ".rvdata" when 2 effective = filename + ".rxdata2" else effective = filename + ".rxdata" end return effective end end
Instructions
The script itself is only the basis. You need to create extra database files using your RPGMaker and copy the extra database files (be it rxdata, rvdata2...) into your real project's data folder and then add them to the list of arrays in the script.
It does not adapt the 'event commands' in the editor to go beyond the 999 limit. So one needs to have a matching set of script calls to go beyond that limit.
Example Utility Code
The below code is meant for RPGMaker XP users, but shows how one can make routines within the Interpreter class (or Game_Interpreter) so one can use script calls that may go beyond the 999 editor cap.
Spoiler: Example RMXP addon
Code:
#============================================================================== # ** Interpreter #------------------------------------------------------------------------------ # This interpreter runs event commands. This class is used within the # Game_System class and the Game_Event class. #============================================================================== class Interpreter #-------------------------------------------------------------------------- # * Test Party for an Actor # actor_id : actor ID #-------------------------------------------------------------------------- def mega_actor_test(actor_id) return true if $game_party.actors.include?(actor) return false end #-------------------------------------------------------------------------- # * Change Actor # actor_id : actor ID # remove : (optional: If true, removes actor from party) #-------------------------------------------------------------------------- def mega_actor_change(actor_id=1, remove=false) unless remove $game_party.add_actor(actor_id) else $game_party.remove_actor(actor_id) end end #-------------------------------------------------------------------------- # * Change Actor HP Increase # actor_id : actor ID # value : Value of HP gain (or loss if negative) # allow_death : if knockout allows death #-------------------------------------------------------------------------- def mega_actor_HP(actor_id=1, value=0, allow_death=false) actor = $game_actors[actor_id] return if actor.nil? $game_actors[actor_id].hp += value if allow_death == false and $game_actors[actor_id].hp == 0 $game_actors[actor_id].hp = 1 end # Determine game over $game_temp.gameover = $game_party.all_dead? end #-------------------------------------------------------------------------- # * Change Actor SP Increase # actor_id : actor ID # value : Value of SP gain (or loss if negative) #-------------------------------------------------------------------------- def mega_actor_HP(actor_id=1, value=0) actor = $game_actors[actor_id] return if actor.nil? $game_actors[actor_id].sp += value end #-------------------------------------------------------------------------- # * Change Enemy HP Increase # enemy_id : enemy ID # value : Value of HP gain (or loss if negative) #-------------------------------------------------------------------------- def mega_actor_HP(enemy_id=1, value=0) enemy = $game_troop.enemies[enemy_id] return if enemy.nil? $game_troop.enemies[enemy_id].hp += value end #-------------------------------------------------------------------------- # * ChangeEnemy SP Increase # enemy_id : enemy ID # value : Value of SP gain (or loss if negative) #-------------------------------------------------------------------------- def mega_actor_HP(enemy_id=1, value=0) enemy = $game_troop.enemies[enemy_id] return if enemy.nil? $game_troop.enemies[enemy_id].sp += value end #-------------------------------------------------------------------------- # * Test Actor for a Skill # actor_id : actor ID # skill_id : skill ID #-------------------------------------------------------------------------- def mega_skill_test(actor_id=1, skill_id=1) actor = $game_actors[actor_id] return false if actor.nil? return true if actor.skills.include?(skill_id) return false end #-------------------------------------------------------------------------- # * Change Skill # actor_id : actor ID # skill_id : skill ID # remove : (optional: If true, removes skill from actor) #-------------------------------------------------------------------------- def mega_skill_change(actor_id=1, skill_id=1, remove=false) actor = $game_actors[actor_id] return if actor.nil? unless remove actor.learn_skill(skill_id) else actor.forget_skill(skill_id) end end #-------------------------------------------------------------------------- # * Test Party for an Item # item_id : item ID #-------------------------------------------------------------------------- def mega_item_test(item_id=1) return true if $game_party.items.include?(item_id) return false end #-------------------------------------------------------------------------- # * Change Item # item_id : item ID # remove : (optional: If true, removes item from party) #-------------------------------------------------------------------------- def mega_item_change(item_id=1, qty=1, remove=false) unless remove $game_party.gain_item(item_id, qty) else $game_party.lose_item(item_id, qty) end end #-------------------------------------------------------------------------- # * Test Party for a Weapon # weapon_id : item ID #-------------------------------------------------------------------------- def mega_weapon_test(weapon_id=1) return true if $game_party.weapons.include?(weapon_id) return false end #-------------------------------------------------------------------------- # * Change Weapon # weapon_id : weapon ID # remove : (optional: If true, removes weapon from party) #-------------------------------------------------------------------------- def mega_weapon_change(weapon_id=1, qty=1, remove=false) unless remove $game_party.gain_weapon(weapon_id, qty) else $game_party.lose_weapon(weapon_id, qty) end end #-------------------------------------------------------------------------- # * Test Party for a Armor # armor_id : armor ID #-------------------------------------------------------------------------- def mega_armor_test(armor_id=1) return true if $game_party.armors.include?(armor_id) return false end #-------------------------------------------------------------------------- # * Change Armor # armor_id : armor ID # remove : (optional: If true, removes armor from party) #-------------------------------------------------------------------------- def mega_armor_change(armor_id=1, qty=1, remove=false) unless remove $game_party.gain_armor(armor_id, qty) else $game_party.lose_armor(armor_id, qty) end end #-------------------------------------------------------------------------- # * Show Animation # anim_id : animation ID # event_id : event ID (-1 = player, 0 = this event, 1+ identified on map) #-------------------------------------------------------------------------- def mega_animation_event(anim_id, event_id=0) # Get character character = get_character(event_id) # If no character exists if character == nil # Continue return true end # Set animation ID character.animation_id = anim_id # Continue return true end end
Compatibility
This script should be usable for all Ruby-Scripting versions of RPGMaker, and it merely attaches code to the 'load_data' method within the Kernel module itself.
Credits and Thanks
Thanks goes to a dear friend who inquired just this past week if one could get past the 999 item or skill limit.
Terms and Conditions
Free for use, even in commercial games. Due credit is all that's required.