RPG Maker VX Ace
Savedata Extender

Sometimes you want to save that extra bit of data, either to show in the header (when on the save loading screen), or because you're exclusively using scripts to store your variables. Which is okay, really. This script will allow you to easily do all that.

Download (10.74 kB, 1701 times downloaded)

Demo (1.33 MB, 411 times downloaded)

In your own script, create methods for stuff you want to save and / or load.

To save data, make a method that has no arguments and returns a Hash containing data, using symbols as keys.

Example:

def data_saver
  data = {}
  data[:example] = $some_data
  return data
end

To load data, make a method that takes a Hash as an argument. It contains the data in the same way you save data.

Example:

def data_loader(data)
  $some_data = data[:example]
end

Note that there are some symbols reserved by RPG Maker VX Ace.

To add a method to the save or load list, use the following methods:

CXJ::SAVEDATA_EXTENDER::add_save_handler(m, on_header, on_content)
CXJ::SAVEDATA_EXTENDER::add_load_handler(m)

m is either a symbol referencing the method, or a method object itself.
on_header defines whether or not data will be saved on the header.
on_content defines whether or not data will be saved as regular content.

Reserved symbols:

Header:

:characters
:playtime_s

Content (also reserved on the header using Yanfly's Ace Save Engine):

:system
:timer
:message
:variables
:self_switches
:actors
:party
:troop
:map
:player

This script overrides several methods. If you are sure no method that is used by other scripts get overridden, you can place it anywhere, otherwise, make sure this script is loaded first. Do know that there is a possibility that this script will stop working due to that.

  • module DataManager
    • self.make_save_header
    • self.make_save_contents

This script adds aliases for several methods. If you are sure no method that is used by other scripts get overridden, you can place it anywhere, otherwise, make sure this script is loaded after any other script overriding these methods, otherwise this script stops working.

  • module DataManager
    • self.extract_save_contents(contents)

Download Savedata Extender v1.00 (11.96 kB, 1768 times downloaded)

Download Savedata Extender Demo v1.00 (1.32 MB, 403 times downloaded)

#==============================================================================
# 
# GaryCXJk - Savedata Extender v1.01
# * Last Updated: 2013.01.19
# * Level: Medium
# * Requires: N/A
# 
#==============================================================================

$imported = {} if $imported.nil?
$imported["CXJ-SavedataExtender"] = true

#==============================================================================
#
# Changelog:
#
#------------------------------------------------------------------------------
# 2013.01.19 - v1.01
#
# * Added: Made it compatible with anything editing the save format
#
#------------------------------------------------------------------------------
# 2012.12.28 - v1.00
#
# * Initial release
#
#==============================================================================
#
# Sometimes you want to save that extra bit of data, either to show in the
# header (when on the save loading screen), or because you're exclusively
# using scripts to store your variables. Which is okay, really.
#
# This script will allow you to easily do all that. To be honest, I only
# created this for another script I wanted to make, which allows you to add
# a thumbnail to the saves.
#
#==============================================================================
#
# Installation:
#
# Make sure to put this below Materials, but above Main Process. Also, this
# overrides several functions. If you are sure no function that is used by
# other scripts get overridden, you can place it anywhere, otherwise, make
# sure this script is loaded first. Do know that there is a possibility that
# this script will stop working due to that.
#
#==============================================================================
#
# Overridden functions:
#
# * module DataManager
#   - self.make_save_header
#   - self.make_save_contents
#
#==============================================================================
#
# Usage:
#
# In your own script, create methods for stuff you want to save and / or load.
#
# To save data, make a method that has no arguments and returns a Hash
# containing data, using symbols as keys.
#
# Example:
#
# def data_saver
#   data = {}
#   data[:example] = $some_data
#   return data
# end
#
# To load data, make a method that takes a Hash as an argument. It contains the
# data in the same way you save data.
#
# Example:
#
# def data_loader(data)
#   $some_data = data[:example]
# end
#
# Note that there are some symbols reserved by RPG Maker VX Ace.
#
# To add a method to the save or load list, use the following functions:
#
# CXJ::SAVEDATA_EXTENDER::add_save_handler(m, on_header, on_content)
# CXJ::SAVEDATA_EXTENDER::add_load_handler(m)
#
# m is either a symbol referencing the method, or a method object itself.
# on_header defines whether or not data will be saved on the header.
# on_content defines whether or not data will be saved as regular content.
#
#------------------------------------------------------------------------------
# Reserved symbols:
#
# * Header:
#     :characters
#     :playtime_s
#
# * Content (also reserved on the header using Yanfly's Ace Save Engine):
#     :system
#     :timer
#     :message
#     :variables
#     :self_switches
#     :actors
#     :party
#     :troop
#     :map
#     :player
#
#==============================================================================
#
# License:
#
# Creative Commons Attribution 3.0 Unported
#
# The complete license can be read here:
# http://creativecommons.org/licenses/by/3.0/legalcode
#
# The license as it is described below can be read here:
# http://creativecommons.org/licenses/by/3.0/deed
#
# You are free:
#
# to Share — to copy, distribute and transmit the work
# to Remix — to adapt the work
# to make commercial use of the work
#
# Under the following conditions:
#
# Attribution — You must attribute the work in the manner specified by the
# author or licensor (but not in any way that suggests that they endorse you or
# your use of the work).
#
# With the understanding that:
#
# Waiver — Any of the above conditions can be waived if you get permission from
# the copyright holder.
#
# Public Domain — Where the work or any of its elements is in the public domain
# under applicable law, that status is in no way affected by the license.
#
# Other Rights — In no way are any of the following rights affected by the
# license:
#
# * Your fair dealing or fair use rights, or other applicable copyright
#   exceptions and limitations;
# * The author's moral rights;
# * Rights other persons may have either in the work itself or in how the work
#   is used, such as publicity or privacy rights.
#
# Notice — For any reuse or distribution, you must make clear to others the
# license terms of this work. The best way to do this is with a link to this
# web page.
#
#------------------------------------------------------------------------------
# Extra notes:
#
# Despite what the license tells you, I will not hunt down anybody who doesn't
# follow the license in regards to giving credits. However, as it is common
# courtesy to actually do give credits, it is recommended that you do.
#
# As I picked this license, you are free to share this script through any
# means, which includes hosting it on your own website, selling it on eBay and
# hang it in the bathroom as toilet paper. Well, not selling it on eBay, that's
# a dick move, but you are still free to redistribute the work.
#
# Yes, this license means that you can use it for both non-commercial as well
# as commercial software.
#
# You are free to pick the following names when you give credit:
#
# * GaryCXJk
# * Gary A.M. Kertopermono
# * G.A.M. Kertopermono
# * GARYCXJK
#
# Personally, when used in commercial games, I prefer you would use the second
# option. Not only will it actually give me more name recognition in real
# life, which also works well for my portfolio, it will also look more
# professional. Also, do note that I actually care about capitalization if you
# decide to use my username, meaning, capital C, capital X, capital J, lower
# case k. Yes, it might seem stupid, but it's one thing I absolutely care
# about.
#
# Finally, if you want my endorsement for your product, if it's good enough
# and I have the game in my posession, I might endorse it. Do note that if you
# give me the game for free, it will not affect my opinion of the game. It
# would be nice, but if I really did care for the game I'd actually purchase
# it. Remember, the best way to get any satisfaction is if you get people to
# purchase the game, so in a way, I prefer it if you don't actually give me
# a free copy.
#
# This script was originally hosted on:
# http://area91.multiverseworks.com
#
#==============================================================================
#
# The code below defines the settings of this script, and are there to be
# modified.
#
#==============================================================================

module CXJ
  module SAVEDATA_EXTENDER
    # Enables or disables debug messages whenever an error occurs during save.
    SAVE_DEBUG = false
  end
end
#==============================================================================
#
# The code below should not be altered unless you know what you're doing.
#
#==============================================================================

module CXJ
  module SAVEDATA_EXTENDER
    HEADER_EXTENSION = []
    CONTENT_EXTENSION = []
    LOAD_EXTENSION = []
    
    #------------------------------------------------------------------------
    # * New: Add Save Handler
    #     This allows you to add methods that add data to the save file.
    #   This method doesn't have any arguments and should return a Hash,
    #   using symbols for keys.
    #------------------------------------------------------------------------
    def self.add_save_handler(m, on_header, on_content)
      if m.instance_of?(Symbol)
        HEADER_EXTENSION.push(self.method(m)) if on_header
        CONTENT_EXTENSION.push(self.method(m)) if on_content
      elsif m.instance_of?(Method)
        HEADER_EXTENSION.push(m) if on_header
        CONTENT_EXTENSION.push(m) if on_content
      end
    end
    #------------------------------------------------------------------------
    # * New: Add Load Handler
    #     This allows you to add methods that load data from the save file.
    #   This method takes one argument containing a Hash with the data.
    #------------------------------------------------------------------------
    def self.add_load_handler(m)
      if m.instance_of?(Symbol)
        LOAD_EXTENSION.push(self.method(m))
      elsif m.instance_of?(Method)
        LOAD_EXTENSION.push(m)
      end
    end
  end
end

module DataManager
  #--------------------------------------------------------------------------
  # * Alias: Create Save Header
  #--------------------------------------------------------------------------
  class << self
    datamanager_make_save_header_cxj_se = instance_method(:make_save_header)
    define_method :make_save_header do
      header = datamanager_make_save_header_cxj_se.bind(self).call
      CXJ::SAVEDATA_EXTENDER::HEADER_EXTENSION.each do |m|
        begin
          data = m.call
          data.each {|key, value|
            header[key]= value
          }
        rescue
          puts($!.message) if CXJ::SAVEDATA_EXTENDER::SAVE_DEBUG
        end
      end
      header
    end
  end
  #--------------------------------------------------------------------------
  # * Alias: Create Save Contents
  #--------------------------------------------------------------------------
  class << self
    data_manager_make_save_contents_cxj_se = instance_method(:make_save_contents)
    define_method :make_save_contents do
      contents = data_manager_make_save_contents_cxj_se.bind(self).call
      CXJ::SAVEDATA_EXTENDER::CONTENT_EXTENSION.each do |m|
        begin
          data = m.call
          data.each {|key, value|
            contents[key]= value
          }
        rescue
          puts($!.message) if CXJ::SAVEDATA_EXTENDER::SAVE_DEBUG
        end
      end
      contents
    end
  end
  #--------------------------------------------------------------------------
  # * Alias: Extract Save Contents
  #--------------------------------------------------------------------------
  class << self
    datamanager_extract_save_contents_cxj_se = instance_method(:extract_save_contents)
    define_method :extract_save_contents do |contents|
      datamanager_extract_save_contents_cxj_se.bind(self).call(contents)
      CXJ::SAVEDATA_EXTENDER::LOAD_EXTENSION.each do |m|
        m.call(contents)
      end
    end
  end
end                                
Savedata Extender

Creator: GaryCXJk

Release date: 2013-01-19

Last updated: 2012-12-28

Downloads: 1701

License: Creative Commons Attribution 4.0 International Public License