RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
[RMXP] Backup Save Files

0 Members and 1 Guest are viewing this topic.

**
Rep:
Level 88
Script name: Backup Saved Game Files
Written by: Synthesize and RPG Advocate
version: 1.0.0
Release Date: Feb. 16, 2008

What is this script?
Are you sick and tired of 'accidentally' deleting or overwriting that important Saved Game? Are you tired of finding ways to stop this from happening? Well, look no further! This script automatically creates back-up files of Saved Games when they are overwritten or deleted (Fine print: Only creates a back-up if the saved game is deleted in-game). But wait! Use it now and get a free cookie! That's right, use this script could be yours today (and a free cookie!)

Ignore the lame infomercial introduction. I was pretty bored. Honestly, this is not the nicest script I made. I may create a better -more cleaner- version in the future that will allow you to import backed up saved game files in game. But for now, it can wait.

Features:
- Define your very own Saved Game extensions. Don't like the default '.rxdata'? Use your own.
- Define where Saved Games are saved. Do you want your games saved in a the 'Saves' folder? Or perhaps the 'Saves/Saves/Save/Saves/Saves' folder? You decide.
- Unlimited amount of Saved game slots. Sick of RMXPs default Saved Slot limit of 4? Now you can use up to infinity.
- Automatically creates a back-up of Overwritten Saved Games and places them in the Back-up folder.
- Automatically creates a back-up when a file is deleted and places it into the back-up folder.
- Saves backed up Saved Games by the amount of time you played them.
- Confirmation screen. Asks to confirm overwriting, so no more -accidental- rewrites happen. Even if they did, a back-up would be made. So you are safe :)
- Delete Saved Game files in-game.
- Save Games ANYWHERE on the hard drive. Running a game from a CD? Save the Saved Game to the C drive.

Screenshots:
 Make a folder on your desktop. Look at it for a long period of time and then finally realize that is your screen shot.

NOTES:
  NOTE:
  Saved games are saved via the following format:
  "Folder_Name/Save[Save Number slot]_PH_PM_PS
   Where PH is Play time in hours
   PM is Playtime in minutes
   PS is the playtime in seconds
 
 NOTE:
   The Deleted and Overwritten folders are designed to be within the backup
   folder. So for example, if you have all of your Saves in the "Saves" folder,
   Then all of the deleted saved games will go to "Saves/Deleted" and
   overwritten files will go to "Saves/Overwritten" Of course, you can specify
   your own folder names.
 
 NOTE:
   In order to restore a previous saved game, copy and paste it from the
   backed up folder into your saved game folder and then rename the file
   to Save[number].[extension]
   Where:
   Number is the Save Slot and Extension is your file extension.

Instructions
Place the code in a new script above main. Go to your project folder and create the folders that you would like to use. If you do not create the folders that you specify you will get errors.

Compatibility
Unfortunately, this is not my cleanest script to date. Because of such, it may be incompatible with custom save systems, a few cms, and action battle systems. In order to get maximum compatibility (Until I get off my lazy ass and make a better version) make sure this script is above all custom scripts.

The Script:
Spoiler for The Script:
Code: [Select]
#===============================================================================
# Backup Savefile
#===============================================================================
# Written by Synthesize
# Unlimited Number of Saves by RPG Advocate
# version 1.0.0
# February 16, 2008
#===============================================================================
# * This script is not compatible with RPG Maker VX *
#-------------------------------------------------------------------------------
module SynSaveBU
  Folder_name = "C:/Saves/"   # The folder where all saved files go
  Backup_folder = "Saves/Backup/"   # The folder where all backed up files go
  Save_extension = ".rxdata"   # The extension to the save filenames
  Deleted_folder = "Deleted/"   # The folder where deleted saved games go
  Overwritten_folder = "Overwritten/"   # The folder where overwritten saved games go
  Number_of_saves = 99   # The maximum number of save slots
  Confirm_text = "Confirm" # The confirm text
  Delete_text = "Delete File"   # The delete text
  Cancel_text = "Cancel"   # The cance; text
  Command_width = 200   # The command window width
  # NOTE:
  # Saved games are saved via the following format:
  # "Folder_Name/Save[Save Number slot]_PH_PM_PS
  # Where PH is Play time in hours
  # PM is Playtime in minutes
  # PS is the playtime in seconds
  # NOTE:
  # The Deleted and Overwritten folders are designed to be within the backup
  # folder. So for example, if you have all of your Saves in the "Saves" folder,
  # Then all of the deleted saved games will go to "Saves/Deleted" and
  # overwritten files will go to "Saves/Overwritten" Of course, you can specify
  # your own folder names.
  # NOTE:
  # In order to restore a previous saved game, copy and paste it from the
  # backed up folder into your saved game folder and then rename the file
  # to Save[number].[extension]
  # Where:
  # Number is the Save Slot and Extension is your file extension.
end
#-------------------------------------------------------------------------------
# Window_SaveFile:: Rewrite the initialize method of Window_SaveFile
#-------------------------------------------------------------------------------
class Window_SaveFile < Window_Base
  def initialize(file_index, filename, position)
y = 64 + position * 104
super(0, y, 640, 104)
self.contents = Bitmap.new(width - 32, height - 32)
@file_index = file_index
@filename = "#{SynSaveBU::Folder_name}Save#{@file_index + 1}#{SynSaveBU::Save_extension}"
@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
end
#-------------------------------------------------------------------------------
# Scene_Title:: Rewrites (:() the main method of Scene_Title
#-------------------------------------------------------------------------------
class Scene_Title
  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 = "Shutdown"
@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..SynSaveBU::Number_of_saves
  if FileTest.exist?("#{SynSaveBU::Folder_name}Save#{i+1}#{SynSaveBU::Save_extension}")
@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
#==============================================================================
# ** Scene_File
#------------------------------------------------------------------------------
#  This is a superclass for the save screen and load screen.
#==============================================================================
class Scene_File
  def main
@help_window = Window_Help.new
@help_window.set_text(@help_text)
@savefile_windows = []
@selection = false
@cursor_displace = 0
@index = 0
call_command
@command_window.visible = false
@command_window.active = false
@command_window.z = 9999
for i in 0..3
  @savefile_windows.push(Window_SaveFile.new(i, make_filename(i), i))
end
@file_index = 0
@savefile_windows[@file_index].selected = true
Graphics.transition
loop do
  Graphics.update
  Input.update
  update
  if $scene != self
break
  end
end
Graphics.freeze
@help_window.dispose
@command_window.dispose
for i in @savefile_windows
  i.dispose
end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
@help_window.update
for i in @savefile_windows
  i.update
end
# Check Confirm Input
if Input.trigger?(Input::C)
  if @command_window.active == false
@index = @file_index
@selection = true
@command_window.active = true
@command_window.visible = true
end
  return
end
# Check Cancel Input
if Input.trigger?(Input::B)
  @selection = false
  if @command_window.active == false
on_cancel
  else
@command_window.active = false
@command_window.visible = false
  end
  return
end
# Check Down Input
if Input.repeat?(Input::DOWN)
  if Input.trigger?(Input::DOWN) or @file_index < SynSaveBU::Number_of_saves - 1
if @file_index == SynSaveBU::Number_of_saves - 1
  $game_system.se_play($data_system.buzzer_se)
  return
end
@cursor_displace += 1
if @cursor_displace == 4
  @cursor_displace = 3
  for i in @savefile_windows
i.dispose
  end
  @savefile_windows = []
  for i in 0..3
f = i - 2 + @file_index
name = make_filename(f)
@savefile_windows.push(Window_SaveFile.new(f, name, i))
@savefile_windows[i].selected = false
  end
end
$game_system.se_play($data_system.cursor_se)
@file_index = (@file_index + 1)
if @file_index == SynSaveBU::Number_of_saves
  @file_index = SynSaveBU::Number_of_saves - 1
end
for i in 0..3
  @savefile_windows[i].selected = false
end
@savefile_windows[@cursor_displace].selected = true
return
  end
end
# Check UP Input
if Input.repeat?(Input::UP)
  if Input.trigger?(Input::UP) or @file_index > 0
if @file_index == 0
  $game_system.se_play($data_system.buzzer_se)
  return
end
@cursor_displace -= 1
if @cursor_displace == -1
  @cursor_displace = 0
  for i in @savefile_windows
i.dispose
  end
  @savefile_windows = []
  for i in 0..3
f = i - 1 + @file_index
name = make_filename(f)
@savefile_windows.push(Window_SaveFile.new(f, name, i))
@savefile_windows[i].selected = false
  end
end
$game_system.se_play($data_system.cursor_se)
@file_index = (@file_index - 1)
if @file_index == -1
  @file_index = 0
end
for i in 0..3
  @savefile_windows[i].selected = false
end
@savefile_windows[@cursor_displace].selected = true
return
  end
end
  end
  #-----------------------------------------------------------------------------
  # Call_Command:: Call the command window
  #-----------------------------------------------------------------------------
  def call_command
s1 = SynSaveBU::Confirm_text
s2 = SynSaveBU::Delete_text
s3 = SynSaveBU::Cancel_text
@command_window = Window_Command.new(SynSaveBU::Command_width,[s1,s2,s3])
@command_window.x = 240
@command_window.y = 200
  end
  #-----------------------------------------------------------------------------
  # * Make File Name
  #-----------------------------------------------------------------------------
  def make_filename(file_index)
return "#{SynSaveBU::Folder_name}Save#{file_index + 1}#{SynSaveBU::Save_extension}"
  end
  #-----------------------------------------------------------------------------
  # Update_Commad:: Update the confirm window
  #-----------------------------------------------------------------------------
  def update_command
if @command_window.active && Input.trigger?(Input::C)
  case @command_window.index
  when 0 # Confirm
filename = "#{SynSaveBU::Folder_name}Save#{@file_index + 1}#{SynSaveBU::Save_extension}"
total_sec = Graphics.frame_count / Graphics.frame_rate
hour = total_sec / 60 / 60
min = total_sec / 60 % 60
sec = total_sec % 60
text = sprintf("%02d_%02d_%02d", hour, min, sec)
next_directory = "#{SynSaveBU::Backup_folder}#{SynSaveBU::Overwritten_folder}Save#{@file_index + 1}_#{text}#{SynSaveBU::Save_extension}"
file_exist = FileTest.exist?(filename)
if file_exist && $scene.is_a?(Scene_Save)
  File.rename(filename, next_directory)
end
on_decision(make_filename(@index))
$game_temp.last_file_index = @file_index
  when 1 # Delete
filename = "#{SynSaveBU::Folder_name}Save#{@file_index + 1}#{SynSaveBU::Save_extension}"
total_sec = Graphics.frame_count / Graphics.frame_rate
hour = total_sec / 60 / 60
min = total_sec / 60 % 60
sec = total_sec % 60
text = sprintf("%02d_%02d_%02d", hour, min, sec)
next_directory = "#{SynSaveBU::Backup_folder}#{SynSaveBU::Deleted_folder}Save#{@file_index + 1}_#{text}#{SynSaveBU::Save_extension}"
file_exist = FileTest.exist?(filename)
if file_exist
  File.rename(filename, next_directory)
  if $scene.is_a?(Scene_Save)
$scene = Scene_Save.new
  else
$scene = Scene_Load.new
  end
end
  when 2 # Cancel
@command_window.active = false
@command_window.visible = false
@selection = false
  end
end
  end
end
#-------------------------------------------------------------------------------
# Scene_Save:: Create the Update method
#-------------------------------------------------------------------------------
class Scene_Save < Scene_File
  #-----------------------------------------------------------------------------
  # Update the Confirm Window
  #-----------------------------------------------------------------------------
  def update
if @selection == false
  super
else
  @command_window.update
  update_command
end
  end
end
#-------------------------------------------------------------------------------
# Scene_Load:: Create the Update method
#-------------------------------------------------------------------------------
class Scene_Load < Scene_File
  #-----------------------------------------------------------------------------
  # Update the Confirm Window
  #-----------------------------------------------------------------------------
  def update
if @selection == false
  super
else
  @command_window.update
  update_command
end
  end
end
#===============================================================================
#   * This script is not compatible with RMVX *
#===============================================================================
# Written by Synthesize
# Unlimited Saves by RPG Advocate
# Version 1.0.0
#===============================================================================
# Backup Save Files
#===============================================================================

DEMO
http://www.4shared.com/file/38066224/706e1378/Back-up_Save.html

Questions? Concerns? Post them.

*
Rep:
Level 97
2014 Most Unsung Member2014 Best RPG Maker User - Engine2013 Best RPG Maker User (Scripting)2012 Most Mature Member2012 Favorite Staff Member2012 Best RPG Maker User (Scripting)2012 Best MemberSecret Santa 2012 ParticipantProject of the Month winner for July 20092011 Best Use of Avatar and Signature Space2011 Best RPG Maker User (Scripting)2011 Most Mature Member2011 Favourite Staff Member2011 Best Veteran2010 Most Mature Member2010 Favourite Staff Member
Great idea for a script. Good job Synthesize!