じ☆ve冰风 发表于 2026-7-8 08:07:30

[XP/VX/Ace] LILY'S MEGA DATA! (Go beyond the 999 database limit)

LILY'S MEGA DATA!
Version: 1.0​


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 additionalRPGMaker databaseswhich 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 fileswill be createdin your project's #                  root folder, and always begin with "MEGA" in its name. The #                  file(s)are only generatedfor those databasesthat 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 holdthe 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 enterthe filename #itself without either the Data pathway or the file's extension. It is made #this way to let the system work more easilywith 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 youto increase the sizeof 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 codeto the 'load_data' methodwithin 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   # 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   # 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 ifarraylist.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   return if actor.nil?   $game_actors.hp += value   if allow_death == false and $game_actors.hp == 0       $game_actors.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   return if actor.nil?   $game_actors.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   return if enemy.nil?   $game_troop.enemies.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   return if enemy.nil?   $game_troop.enemies.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   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   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 codeto the 'load_data' methodwithin 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.


本贴来自国际rpgmaker官方论坛作者:DerVVulfman处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/xp-vx-ace-lilys-mega-data-go-beyond-the-999-database-limit.83392/
页: [1]
查看完整版本: [XP/VX/Ace] LILY&#039;S MEGA DATA! (Go beyond the 999 database limit)