Many Many Save Files!!
#1
Many Many Save Files!!
by stupidstormy36
Apr 10, 2008

This is a locked, single-post thread from Creation Asylum. Archived here to prevent its loss.
No support is given. If you are the owner of the thread, please contact administration.


I do not know if someone already did a script for this or not, but I have put together this neat little script that took me nearly 2 hours to complete.

Remember in the default scripts you can only have 4 game saves, and yet in the previous RPG Makers you can have up to 99? Well not anymore! alright.gif

Yep, it's true!! You can now have as many save file as you want! yahoo.gif Sounds exciting, I know, huh. (That sounded corny!) eusa_whistle.gif

UPDATE!!!

You can now choose to either use a cursor image or use the default cursor box found in the window skin. Here are the options you can customize!

The last file index feature is now supported!

You can customize the name of the cursor image file, if you are using one.

Options:

At line 39:

Code:
GAME_SAVES = 50


Change this value to any number you want for an unlimited amount of game saves. Just remember, the more you have, the more time it takes to load the scene and the more likely the game is to lag. Also, keep it an Integer (whole number) as changing it to a Float (decimal) might cause the game to crash. But who would do that anyways?

At line 40:

Code:
USE_CURSOR_IMAGE = true

Change this to "true" if you want to use the cursor image, or "false" if you want to use the default box cursor. Any other values will cause the script to not operate correctly and might cause the game to crash.

Compatibility:

- SDK not required, but should be compatible. (Not tested)
- Overwrites the Scene_File super class, the Window_SaveFile sub class, and the Scene_Title "main" method.
- Not compatible with any of the class or method listings in previous line.

Requirements:

- Standard RTP recommended.
- SDK not required.
- A 'cursor' image placed in the "Pictures" folder (sample provided below) is optional.

Features:

- Allows as many save files as you imagination allows!
- Scrolling windows to allow more to be visible
- Direct scrolling from first file to last file and vise-versa.
- Last Save Index to Load when you enter the scene. (Fixed!)
- Scene_Title now scans for any and all necessary files to enable continue.

Instructions:

Simply place in an empty script above "main"! Their are instructions in the script itself.

Script:
Code:
#===============================================================================

# Custom Save System (CSS)
#---------------------------------------------
# Created By: StupidStormy36
# Version ID: 1.01
# Started on: 04/10/08 @ 8:36 pm EST
# Finished on: 04/10/08 @ 11:24 pm EST (Beleive it or not, YAY!!)
#===============================================================================


# This script allows you to have as many save files as necessary for your game.
# Simply find GAME_SAVES and change the value to your liking.
#
# This overwrites the Scene_File class and the Window_SaveFile class.
# This will overwrite any other custom save menus.
#
# The cursor image is now optional. If you are using a cursor image, the image
# must be name "cursor.png".
#
# If there are any suggestions to make this script cleaner and more efficient,
# please let me know.
#
# If there are any errors, let me know that too, OK!
#
# Please credit me for this.
#
#---------------------------
# Small update!
#
# You can now choose to show the cursor image or not. You do not need the
# cursor image any more! If you are using a cursor image, the image
# must be name "cursor.png".
#
# The last file index feature is now supported.
#
# Included a new main method for Scene Title to allow the Title Screen to scan
# for all files necessary. This overwrites any previous main methods for Scene Title.
#
#===============================================================================


# Initializes save game number.
# You only have to edit this and the rest handles itself.

GAME_SAVES = 50 # Sets the number of save files.
USE_CURSOR_IMAGE = false # Sets whether or not to display the cursor image.
DEFAULT_FONT_FACE = "Tahoma" # Change this to display the text in a certain font face.
DEFAULT_FONT_SIZE = 22 # Change this to change the font size.
CURSOR_IMAGE_NAME = "cursor" # Change this to change the name of the cursor file. Directories supported.

# End of customization.

# !!! DO NOT EDIT AFTER THIS POINT !!!

# End of custom initialization.
#==============================================================================
# ** Window_SaveFile
#------------------------------------------------------------------------------
# This window displays save files on the save and load screens.
#==============================================================================

class Window_SaveFile < Window_Base
#--------------------------------------------------------------------------
# * Public Instance Variables
#--------------------------------------------------------------------------
attr_reader :filename # file name
attr_reader :selected # selected
#--------------------------------------------------------------------------
# * Object Initialization
# file_index : save file index (0..Game Saves max)
# filename : file name
#--------------------------------------------------------------------------
def initialize(file_index, filename)
super(0, 64 + file_index % GAME_SAVES * 104, 640, 104) #<<== *EDIT*
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = DEFAULT_FONT_FACE
self.contents.font.size = DEFAULT_FONT_SIZE
@file_index = file_index
@filename = "Save#{@file_index + 1}.rxdata"
@time_stamp = Time.at(0)
@file_exist = FileTest.exist?(@filename)
if @file_exist
file = File.open(@filename, "r")
@time_stamp = file.mtime
@characters = Marshal.load(file)
@frame_count = Marshal.load(file)
@game_system = Marshal.load(file)
@game_switches = Marshal.load(file)
@game_variables = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
end
refresh
@selected = false
end
#--------------------------------------------------------------------------
# * Refresh
#--------------------------------------------------------------------------
def refresh
self.contents.clear
# Draw file number
self.contents.font.color = normal_color
name = "File#{@file_index + 1}"
self.contents.draw_text(4, 0, 600, 32, name)
@name_width = contents.text_size(name).width
# If save file exists
if @file_exist
# Draw character
for i in 0...@characters.size
bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])
cw = bitmap.rect.width / 4
ch = bitmap.rect.height / 4
src_rect = Rect.new(0, 0, cw, ch)
x = 300 - @characters.size * 32 + i * 64 - cw / 2
self.contents.blt(x, 68 - ch, bitmap, src_rect)
end
# Draw play time
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_text(4, 8, 600, 32, time_string, 2)
# Draw timestamp
self.contents.font.color = normal_color
time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
self.contents.draw_text(4, 40, 600, 32, time_string, 2)
else
self.contents.draw_text(4, 40, 600, 32, "No Data")
end
end
#--------------------------------------------------------------------------
# * Set Selected
# selected : new selected (true = selected, false = unselected)
#--------------------------------------------------------------------------
def selected=(selected)
@selected = selected
update_cursor_rect
end
#--------------------------------------------------------------------------
# * Cursor Rectangle Update
#--------------------------------------------------------------------------
def update_cursor_rect
if @selected
unless USE_CURSOR_IMAGE
self.cursor_rect.set(0, 0, @name_width + 8, 32)
else
self.cursor_rect.empty
end
else
self.cursor_rect.empty
end
end
#--------------------------------------------------------------------------
# * End of Class Definition
#--------------------------------------------------------------------------
end

#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
# This is a superclass for the save screen and load screen.
#==============================================================================

class Scene_File
#--------------------------------------------------------------------------
# * Object Initialization
# help_text : text string shown in the help window
#--------------------------------------------------------------------------
def initialize(help_text)
@help_text = help_text
end
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# Creates cursor bitmap.
@cursor = Sprite.new #<<============================= *NEW*
if USE_CURSOR_IMAGE
@cursor.bitmap = RPG::Cache.picture(CURSOR_IMAGE_NAME)
else
@cursor.bitmap = Bitmap.new(1, 1)
@cursor.bitmap.fill_rect(0, 0, 3, 3, Color.new(0, 0, 0, 0))
end
@cursor.x = 0
@cursor.z = 1100
@cursor.visible = USE_CURSOR_IMAGE
# Make help window
@help_window = Window_Help.new
@help_window.set_text(@help_text)
@help_window.z = 999
# Make save file window
@savefile_windows = []
for i in 0...GAME_SAVES #<<============================= *EDIT*
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
end
# Select last file to be operated
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true
if @file_index.between?(GAME_SAVES - 4, GAME_SAVES - 1)
for i in @savefile_windows
i.y -= (GAME_SAVES - 4) * 104
end
elsif @file_index > 3
for i in @savefile_windows
i.y -= @file_index * 104
end
end
# Execute transition
update_cursor
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose items
@cursor.dispose
@help_window.dispose
for i in @savefile_windows
i.dispose
end
end
#--------------------------------------------------------------------------
# * Frame Update
#--------------------------------------------------------------------------
def update
update_cursor
# Update items
@cursor.update
@help_window.update
for i in @savefile_windows
i.update
end
# If C button was pressed
if Input.trigger?(Input::C)
# Call method: on_decision (defined by the subclasses)
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
# If B button was pressed
if Input.trigger?(Input::B)
# Call method: on_cancel (defined by the subclasses)
on_cancel
return
end
# If the down directional button was pressed
if Input.repeat?(Input::DOWN)
# If the down directional button pressed down is not a repeat,
# or cursor position is more in front than the maximum game saves - 1
if Input.trigger?(Input::DOWN) or @file_index < (GAME_SAVES - 1) #<<== *EDIT*
# Play cursor SE
update_window_position_down
$game_system.se_play($data_system.cursor_se)
# Move cursor down
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 1) % GAME_SAVES #<<============ *EDIT*
@savefile_windows[@file_index].selected = true
return
end
end
# If the up directional button was pressed
if Input.repeat?(Input::UP)
# If the up directional button pressed down is not a repeat
# or cursor position is more in back than 0
if Input.trigger?(Input::UP) or @file_index > 0
# Play cursor SE
update_window_position_up
$game_system.se_play($data_system.cursor_se)
# Move cursor up
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + GAME_SAVES - 1) % GAME_SAVES #<<=== *EDIT*
@savefile_windows[@file_index].selected = true
return
end
end
# if F9 is pressed and in debug mode, prints out neccessary info only.<<==== *NEW*
if Input.trigger?(Input::F9) and $DEBUG
p @file_index
p @cursor.y
p @savefile_windows[0].y
end
end
#--------------------------------------------------------------------------
# * Make File Name
# file_index : save file index (0..Game Save max - 1)
#--------------------------------------------------------------------------
def make_filename(file_index)
return "Save#{file_index + 1}.sav"
end
# <<============================================== # *NEW*
#--------------------------------------------------------------------------
# * Updates Cursor Image Position
#--------------------------------------------------------------------------
def update_cursor
if @savefile_windows[0].y != 64
@cursor.y = @file_index * 104 + 0 + @savefile_windows[0].y
else
@cursor.y = @file_index * 104 + 128 - @savefile_windows[0].y
end
end
#--------------------------------------------------------------------------
# * Updates Save Window Positions when UP is pressed.
#--------------------------------------------------------------------------
def update_window_position_up
# If Cursor image y value equals 64 and file index is greater than top most...
if @cursor.y == 64 and @file_index > 0
# Move all windows down
for i in @savefile_windows
i.y += 104
end
# If file index is top most...
elsif @file_index == 0
# Reinitializes window positions.
for i in @savefile_windows
i.y -= 104 * (GAME_SAVES - 1) - (376 - 64)
@cursor.y = 376
end
end
end
#--------------------------------------------------------------------------
# * Updates Save Window Positions when DOWN is pressed.
#--------------------------------------------------------------------------
def update_window_position_down
# If Cursor image y value equals 376 and file index is less than bottom most...
if @cursor.y == 376 and @file_index < (GAME_SAVES - 1)
# Move all windows up
for i in @savefile_windows
i.y -= 104
end
# If file index is bottom most...
elsif @file_index == (GAME_SAVES - 1)
# Reinitializes window positions.
for i in @savefile_windows
i.y += 104 * (GAME_SAVES - 1) - (376 - 64)
@cursor.y = 64
end
end
end
#--------------------------------------------------------------------------
# * End of Class Definition
#--------------------------------------------------------------------------
end

#==============================================================================
# ** Scene_Title
#------------------------------------------------------------------------------
# This class performs title screen processing.
#==============================================================================

class Scene_Title
#--------------------------------------------------------------------------
# * Main Processing
#--------------------------------------------------------------------------
def main
# If battle test
if $BTEST
battle_test
return
end
# Load database
$data_actors = load_data("Data/Actors.rxdata")
$data_classes = load_data("Data/Classes.rxdata")
$data_skills = load_data("Data/Skills.rxdata")
$data_items = load_data("Data/Items.rxdata")
$data_weapons = load_data("Data/Weapons.rxdata")
$data_armors = load_data("Data/Armors.rxdata")
$data_enemies = load_data("Data/Enemies.rxdata")
$data_troops = load_data("Data/Troops.rxdata")
$data_states = load_data("Data/States.rxdata")
$data_animations = load_data("Data/Animations.rxdata")
$data_tilesets = load_data("Data/Tilesets.rxdata")
$data_common_events = load_data("Data/CommonEvents.rxdata")
$data_system = load_data("Data/System.rxdata")
# Make system object
$game_system = Game_System.new
# Make title graphic
@sprite = Sprite.new
@sprite.bitmap = RPG::Cache.title($data_system.title_name)
# Make command window
s1 = "New Game"
s2 = "Continue"
s3 = "Exit"
@command_window = Window_Command.new(192, [s1, s2, s3])
@command_window.back_opacity = 160
@command_window.x = 320 - @command_window.width / 2
@command_window.y = 288
# Continue enabled determinant
# Check if at least one save file exists
# If enabled, make @continue_enabled true; if disabled, make it false
@continue_enabled = false
for i in 0...GAME_SAVES
if FileTest.exist?("Save#{i+1}.sav")
@continue_enabled = true
end
end
# If continue is enabled, move cursor to "Continue"
# If disabled, display "Continue" text in gray
if @continue_enabled
@command_window.index = 1
else
@command_window.disable_item(1)
end
# Play title BGM
$game_system.bgm_play($data_system.title_bgm)
# Stop playing ME and BGS
Audio.me_stop
Audio.bgs_stop
# Execute transition
Graphics.transition
# Main loop
loop do
# Update game screen
Graphics.update
# Update input information
Input.update
# Frame update
update
# Abort loop if screen is changed
if $scene != self
break
end
end
# Prepare for transition
Graphics.freeze
# Dispose of command window
@command_window.dispose
# Dispose of title graphic
@sprite.bitmap.dispose
@sprite.dispose
end
end


Note: I had to remove the ruby tags due to an error when too much code is added and messes up the Spoiler tags.

Remember, this script does overwrite the Scene_File super class, the Window_SaveFile sub class, and the Scene_Title "main" method, so keep these in mind.

The only thing you'll need is your own cursor image and place it in your "Pictures" folder in your project directory, example provided below.

Everything should be there. Please give feedback!

Please credit me if you use this. If by any chance this script violates anything on this web site, it was not intentional. Thank you.

EDIT: This is the cursor I used, but like I said, it doesn't matter what you use. It came with the FFX2 CMS demo I found. You do not need it anymore!
[Image: cursor.png]

Thank you for your time.
~Stormy
}


Possibly Related Threads…
Thread Author Replies Views Last Post
  Automatic save-slot selection Jimmie 0 2,594 05-01-2009, 01:00 PM
Last Post: Jimmie
  Zelda Style Save winter-chaos 0 2,685 03-21-2009, 01:00 PM
Last Post: winter-chaos
  Personal Save Files XP polraudio 0 2,644 11-05-2008, 01:00 PM
Last Post: polraudio
  Personal Save Files polraudio 0 2,502 07-08-2008, 01:00 PM
Last Post: polraudio
  Dialogues in text files trebor777 0 2,352 11-24-2005, 01:00 PM
Last Post: trebor777
  More Save Slots HonorBlade 0 2,677 07-29-2005, 01:00 PM
Last Post: HonorBlade



Users browsing this thread: 1 Guest(s)