|  | 
          1楼
          巨大八爪鱼
          2013-7-7 16:42
          
          
            本文章详细讲解如何对RMXP工程加上多文件存档功能,并将转换现有的存档。如果你是用的魔塔样板做的,就不要看这篇文章了。这篇文章的内容只能在纯RMXP新建的工程下使用,在魔塔样板下使用会出错的(主要是开关4的问题),况且现在所有的魔塔样板都已经有这个功能了。
 首先要明确的一点是,存档文件的保存位置。默认rmxp新建的工程(简称R工程)存档文件只能有4个,而且还存在工程根目录下的。由于我们要设置多文件的存档,所以防在根目录下很麻烦。因此,我们把存档文件都放在单独的一个文件夹中——Save文件夹。
 为了防止玩家从其他魔塔中存档,并把该存档复制到本游戏来作弊,所以我们增加了密钥的功能。注意每个游戏的密钥最好不要相同。
 在脚本编辑器中新加一个脚本■protect savefile,内容:
   | 
    
      |  | 
          2楼
          巨大八爪鱼
          2013-7-7 16:44
          
          
            #==============================================================================# ☆★☆ Custom Save☆★☆
 #------------------------------------------------------------------------------
 # - FantasyDR
 #------------------------------------------------------------------------------
 # MSN: [email]FantasyDR_SJL@hotmail.com[/email]
 #------------------------------------------------------------------------------
 # - 2006.7.18
 #------------------------------------------------------------------------------
 # 自定义存档数据排列顺序并校验存档
 #==============================================================================
 #==============================================================================
 # ■ Scene_File
 #------------------------------------------------------------------------------
 #  存档画面及读档画面的超级类。
 #==============================================================================
 class Scene_File
 #--------------------------------------------------------------------------
 # ● 存档密钥,请定义成自己的密钥
 #   密钥不同的存档将无法被读取
 #--------------------------------------------------------------------------
 SAVE_KEY = 3975
 #发布自己的魔塔游戏时,请一定要把上面的数字换掉
 #--------------------------------------------------------------------------
 # ● 常量 (存档页数)
 #--------------------------------------------------------------------------
 MaxPages = 8
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #     help_text : 帮助窗口显示的字符串
 #--------------------------------------------------------------------------
 def initialize(help_text)
 @help_text = help_text
 @slots = MaxPages * 4
 end
 #--------------------------------------------------------------------------
 # ● 主处理
 #--------------------------------------------------------------------------
 def main
 # 生成帮助窗口
 @help_window = Window_Help.new
 @help_window.set_text(@help_text)
 @file_index = $game_temp.last_file_index
 # 生成存档文件窗口
 @savefile_windows = []
 # 选择最后操作的文件
 for i in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 load_window(i)
 @savefile_windows[i].visible = true
 end
 @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
 for i in 0...@slots
 @savefile_windows[i].dispose if @savefile_windows[i] != nil
 end
 end
 #--------------------------------------------------------------------------
 # ● 刷新画面
 #--------------------------------------------------------------------------
 def update
 # 刷新窗口
 @help_window.update
 for i in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 @savefile_windows[i].update if @savefile_windows[i].visible
 end
 # 按下 C 键的情况下
 if Input.trigger?(Input::C)
 # 调用过程 on_decision (定义继承目标)
 on_decision(make_filename(@file_index))
 $game_temp.last_file_index = @file_index
 return
 end
 # 按下 B 键的情况下
 if Input.trigger?(Input::B)
 # 调用过程 on_cancel (定义继承目标)
 on_cancel
 return
 end
 # 按下方向键下的情况下
 if Input.repeat?(Input::DOWN)
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 光标向下移动
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + 1) % @slots
 # 翻到下一页的情况下
 if @file_index % 4 == 0
 for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 @savefile_windows[(index + @slots - 4) % @slots].visible = false
 load_window(index)
 @savefile_windows[index].visible = true
 end
 end
 @savefile_windows[@file_index].selected = true
 return
 end
 # 按下方向键上的情况下
 if Input.repeat?(Input::UP)
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 光标向上移动
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + @slots - 1) % @slots
 # 翻到上一页的情况下
 if @file_index % 4 == 3
 for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 @savefile_windows[(index + 4) % @slots].visible = false
 load_window(index)
 @savefile_windows[index].visible = true
 end
 end
 @savefile_windows[@file_index].selected = true
 return
 end
 # 按下方向键左或者 L 的情况下
 if Input.repeat?(Input::LEFT) or Input.trigger?(Input::L)
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 前翻一页
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + @slots - 4) % @slots
 for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 @savefile_windows[(index + 4) % @slots].visible = false
 load_window(index)
 @savefile_windows[index].visible = true
 end
 @savefile_windows[@file_index].selected = true
 return
 end
 # 按下方向键右或者 R 的情况下
 if Input.repeat?(Input::RIGHT) or Input.trigger?(Input::R)
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 前翻一页
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + 4) % @slots
 for index in @file_index / 4 * 4..@file_index / 4 * 4 + 3
 @savefile_windows[(index + @slots - 4) % @slots].visible = false
 load_window(index)
 @savefile_windows[index].visible = true
 end
 @savefile_windows[@file_index].selected = true
 return
 end
 end
 #--------------------------------------------------------------------------
 # ● 生成文件名
 #     file_index : 文件名的索引 (0~n)
 #--------------------------------------------------------------------------
 def make_filename(file_index)
 return "Save/motaSave#{file_index + 1}.rxdata"
 end
 #--------------------------------------------------------------------------
 # ● 载入当前页存档
 #     避免因存档位过多造成的卡壳现象
 #--------------------------------------------------------------------------
 def load_window(i)
 if @savefile_windows[i] != nil
 return
 else
 @savefile_windows[i] = Window_SaveFile.new(i, make_filename(i))
 end
 end
 end
 #==============================================================================
 # ■ Scene_Load
 #------------------------------------------------------------------------------
 #  处理读档画面的类。
 #==============================================================================
 class Scene_Load < Scene_File
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #--------------------------------------------------------------------------
 def initialize()#save_max = SAVE_MAX)
 # 再生成临时对像
 $game_temp = Game_Temp.new
 # 选择存档时间最新的文件
 $game_temp.last_file_index = 0
 latest_time = Time.at(0)
 for i in 0..7
 filename = make_filename(i)
 if FileTest.exist?(filename)
 begin
 file = Zlib::GzipReader.open(filename)
 rescue
 next
 end
 if file.mtime > latest_time
 latest_time = file.mtime
 $game_temp.last_file_index = i
 end
 file.close
 end
 end
 super("要载入哪个文件?")#,"读取",save_max)
 end
 #--------------------------------------------------------------------------
 # ● 确定时的处理
 #--------------------------------------------------------------------------
 def on_decision(filename)
 # 文件不存在的情况下
 unless FileTest.exist?(filename)
 # 演奏冻结 SE
 $game_system.se_play($data_system.buzzer_se)
 return
 end
 # 演奏读档 SE
 $game_system.se_play($data_system.load_se)
 # 写入存档数据
 begin
 file = Zlib::GzipReader.open(filename)
 read_save_data(file)
 rescue
 # 演奏冻结 SE
 $game_system.se_play($data_system.buzzer_se)
 return
 end
 file.close
 # 还原 BGM、BGS
 $game_system.bgm_play($game_system.playing_bgm)
 $game_system.bgs_play($game_system.playing_bgs)
 # 刷新地图 (执行并行事件)
 $game_map.update
 # 切换到地图画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 取消时的处理
 #--------------------------------------------------------------------------
 def on_cancel
 # 演奏取消 SE
 $game_system.se_play($data_system.cancel_se)
 # 切换到标题画面
 $scene = Scene_Title.new
 end
 #--------------------------------------------------------------------------
 # ● 读取存档数据
 #   file : 读取用文件对像 (已经打开)
 #--------------------------------------------------------------------------
 def read_save_data(file)
 
 $desc=Marshal.load(file)
 # 读取描绘存档文件用的角色数据
 characters = Marshal.load(file)
 # 读取测量游戏时间用画面计数
 Graphics.frame_count = Marshal.load(file)
 # 读取校验
 crcs = Marshal.load(file)
 # 读取文档字串
 strings = Marshal.load(file)
 # 校验检测
 key = SAVE_KEY
 strings.each_index do |i|
 key = Zlib.crc32(strings[i],key)
 unless crcs[i] == key
 file.close
 raise "file check error"
 return
 end
 end
 # 读取各种游戏对像
 $game_system = Marshal.load(Zlib::Inflate.inflate(strings[0]))
 $game_variables = Marshal.load(Zlib::Inflate.inflate(strings[1]))
 $game_self_switches = Marshal.load(Zlib::Inflate.inflate(strings[2]))
 $game_switches = Marshal.load(Zlib::Inflate.inflate(strings[3]))
 $game_troop = Marshal.load(Zlib::Inflate.inflate(strings[4]))
 $game_map = Marshal.load(Zlib::Inflate.inflate(strings[5]))
 $game_player = Marshal.load(Zlib::Inflate.inflate(strings[6]))
 $game_screen = Marshal.load(Zlib::Inflate.inflate(strings[7]))
 $game_actors = Marshal.load(Zlib::Inflate.inflate(strings[8]))
 $game_party = Marshal.load(Zlib::Inflate.inflate(strings[9]))
 $floorenemies = Marshal.load(Zlib::Inflate.inflate(strings[10]))
 $fledam = Marshal.load(Zlib::Inflate.inflate(strings[11]))
 #  $data_enemies = Marshal.load(Zlib::Inflate.inflate(strings[12]))
 
 # 魔法编号与保存时有差异的情况下
 # (加入编辑器的编辑过的数据)
 if $game_system.magic_number != $data_system.magic_number
 # 重新装载地图
 $game_map.setup($game_map.map_id)
 $game_player.center($game_player.x, $game_player.y)
 end
 # 刷新同伴成员
 $game_party.refresh
 end
 end
 
 #==============================================================================
 # ■ Scene_Load2
 #------------------------------------------------------------------------------
 #  处理读档画面的类。
 #==============================================================================
 class Scene_Load2 < Scene_File
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #--------------------------------------------------------------------------
 def initialize()#save_max = SAVE_MAX)
 # 再生成临时对像
 $game_temp = Game_Temp.new
 # 选择存档时间最新的文件
 $game_temp.last_file_index = 0
 latest_time = Time.at(0)
 for i in 0..7
 filename = make_filename(i)
 if FileTest.exist?(filename)
 begin
 file = Zlib::GzipReader.open(filename)
 rescue
 next
 end
 if file.mtime > latest_time
 latest_time = file.mtime
 $game_temp.last_file_index = i
 end
 file.close
 end
 end
 super("要载入哪个文件?")#,"读取",save_max)
 end
 #--------------------------------------------------------------------------
 # ● 确定时的处理
 #--------------------------------------------------------------------------
 def on_decision(filename)
 # 文件不存在的情况下
 unless FileTest.exist?(filename)
 # 演奏冻结 SE
 $game_system.se_play($data_system.buzzer_se)
 return
 end
 # 演奏读档 SE
 $game_system.se_play($data_system.load_se)
 # 写入存档数据
 begin
 file = Zlib::GzipReader.open(filename)
 read_save_data(file)
 rescue
 # 演奏冻结 SE
 $game_system.se_play($data_system.buzzer_se)
 return
 end
 file.close
 # 还原 BGM、BGS
 $game_system.bgm_play($game_system.playing_bgm)
 $game_system.bgs_play($game_system.playing_bgs)
 # 刷新地图 (执行并行事件)
 $game_map.update
 # 切换到地图画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 取消时的处理
 #--------------------------------------------------------------------------
 def on_cancel
 # 演奏取消 SE
 $game_system.se_play($data_system.cancel_se)
 # 切换到标题画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 读取存档数据
 #   file : 读取用文件对像 (已经打开)
 #--------------------------------------------------------------------------
 def read_save_data(file)
 
 $desc=Marshal.load(file)
 # 读取描绘存档文件用的角色数据
 characters = Marshal.load(file)
 # 读取测量游戏时间用画面计数
 Graphics.frame_count = Marshal.load(file)
 # 读取校验
 crcs = Marshal.load(file)
 # 读取文档字串
 strings = Marshal.load(file)
 # 校验检测
 key = SAVE_KEY
 strings.each_index do |i|
 key = Zlib.crc32(strings[i],key)
 unless crcs[i] == key
 file.close
 raise "file check error"
 return
 end
 end
 # 读取各种游戏对像
 $game_system = Marshal.load(Zlib::Inflate.inflate(strings[0]))
 $game_variables = Marshal.load(Zlib::Inflate.inflate(strings[1]))
 $game_self_switches = Marshal.load(Zlib::Inflate.inflate(strings[2]))
 $game_switches = Marshal.load(Zlib::Inflate.inflate(strings[3]))
 $game_troop = Marshal.load(Zlib::Inflate.inflate(strings[4]))
 $game_map = Marshal.load(Zlib::Inflate.inflate(strings[5]))
 $game_player = Marshal.load(Zlib::Inflate.inflate(strings[6]))
 $game_screen = Marshal.load(Zlib::Inflate.inflate(strings[7]))
 $game_actors = Marshal.load(Zlib::Inflate.inflate(strings[8]))
 $game_party = Marshal.load(Zlib::Inflate.inflate(strings[9]))
 $floorenemies = Marshal.load(Zlib::Inflate.inflate(strings[10]))
 $fledam = Marshal.load(Zlib::Inflate.inflate(strings[11]))
 #  $data_enemies = Marshal.load(Zlib::Inflate.inflate(strings[12]))
 
 # 魔法编号与保存时有差异的情况下
 # (加入编辑器的编辑过的数据)
 if $game_system.magic_number != $data_system.magic_number
 # 重新装载地图
 $game_map.setup($game_map.map_id)
 $game_player.center($game_player.x, $game_player.y)
 end
 # 刷新同伴成员
 $game_party.refresh
 end
 end
 
 #==============================================================================
 # 自定义存档菜单
 #==============================================================================
 #==============================================================================
 # ■ Scene_Save
 #------------------------------------------------------------------------------
 #  处理存档画面的类。
 #==============================================================================
 class Scene_Save < Scene_File
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #--------------------------------------------------------------------------
 def initialize()#save_max = SAVE_MAX)
 super("要保存到这个文件吗?")#,"存入",save_max)
 end
 #--------------------------------------------------------------------------
 # ● 确定时的处理
 #--------------------------------------------------------------------------
 def on_decision(filename)
 # 演奏存档 SE
 $game_system.se_play($data_system.save_se)
 # 写入存档数据
 file = Zlib::GzipWriter.open(filename,9)
 write_save_data(file)
 file.close
 # 如果被事件调用
 if $game_temp.save_calling
 # 清除存档调用标志
 $game_temp.save_calling = false
 # 切换到地图画面
 $scene = Scene_Map.new
 return
 end
 # 切换到地图画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 取消时的处理
 #--------------------------------------------------------------------------
 def on_cancel
 # 演奏取消 SE
 $game_system.se_play($data_system.cancel_se)
 # 如果被事件调用
 if $game_temp.save_calling
 # 清除存档调用标志
 $game_temp.save_calling = false
 # 切换到地图画面
 $scene = Scene_Map.new
 return
 end
 # 切换到地图画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 写入存档数据
 #   file : 写入用文件对像 (已经打开)
 #--------------------------------------------------------------------------
 def write_save_data(file)
 # 生成描绘存档文件用的角色图形
 characters = []
 for i in 0...$game_party.actors.size
 actor = $game_party.actors[i]
 characters.push([actor.character_name, actor.character_hue,actor.id])
 end
 
 if $game_variables[6]==1
 if $game_switches[36]
 $desc="普通    第 "+$game_variables[2].to_s+" 层"
 else
 $desc="普通    "+$game_variables[2].to_s
 end
 else
 if $game_switches[36]
 $desc="困难    第 "+$game_variables[2].to_s+" 层"
 else
 $desc="困难    "+$game_variables[2].to_s
 end
 end
 
 strings = []
 
 Marshal.dump($desc,file)#自己加的用来显示难度和楼层的
 
 # 写入描绘存档文件用的角色数据
 Marshal.dump(characters,file)
 # 写入测量游戏时间用画面计数
 Marshal.dump(Graphics.frame_count,file)
 # 增加 1 次存档次数
 $game_system.save_count += 1
 # 保存魔法编号
 # (将编辑器保存的值以随机值替换)
 $game_system.magic_number = $data_system.magic_number
 
 # 写入各种游戏对像
 #$game_switches[4]=true#楼层第一次刷新的开关打开以便读档后刷新
 #R工程的开关4通常都不是“当前楼层第一次刷新”#不能一存档就把开关4打开了,
 #不然游戏会出错的
 
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_system)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_variables)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_self_switches)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_switches)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_troop)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_map)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_player)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_screen)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_actors)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($game_party)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($floorenemies)))
 strings.push(Zlib::Deflate.deflate(Marshal.dump($fledam)))
 #  strings.push(Zlib::Deflate.deflate(Marshal.dump($data_enemies)))
 
 
 # 计算校验值
 crcs = []
 key = SAVE_KEY
 strings.each do |i|
 key = Zlib.crc32(i,key)
 crcs.push(key)
 end
 Marshal.dump(crcs,file)
 Marshal.dump(strings,file)
 end
 end
 #==============================================================================
 # ■ Window_SaveFile
 #------------------------------------------------------------------------------
 #  显示存档以及读档画面、保存文件的窗口。
 #==============================================================================
 class Window_SaveFile < Window_Base
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #   file_index : 存档文件的索引 (0~n)
 #   filename   : 文件名
 #--------------------------------------------------------------------------
 def initialize(file_index, filename,viewport=nil)
 super(0, 64 + file_index % 4 * 104, 640, 104)
 self.contents = Bitmap.new(width - 32, height - 32)
 @file_index = file_index
 @filename = "Save/motaSave#{file_index + 1}.rxdata"
 @time_stamp = Time.at(0)
 @file_exist = FileTest.exist?(@filename)
 if @file_exist
 begin
 file = Zlib::GzipReader.open(filename)
 @time_stamp = file.mtime
 
 @desc=Marshal.load(file)
 @characters = Marshal.load(file)
 @frame_count = Marshal.load(file)
 @total_sec = @frame_count / Graphics.frame_rate
 
 file.close
 rescue
 @file_exist = false
 end
 end
 
 self.refresh
 @selected = false
 end
 end
 
 
   | 
    
      |  | 
          3楼
          巨大八爪鱼
          2013-7-7 16:44
          
          
            然后,自己把脚本里面的密钥改了。当然你实在不想改也行。现在以前的存档因为密钥和文件结构等问题,已经不能读取了,下面详细讲解如何恢复以前的4个存档。先不要移动和改名这4个存档。(这个时候Scene_Title的读档部分也不要动,等存档恢复了再改)   | 
    
      |  | 
          4楼
          巨大八爪鱼
          2013-7-7 16:45
          
          
            把整个工程都复制一份,注意必须要复制一份。然后打开复制的那个工程。打开Scene_Title,把#--------------------------------------------------------------------------# ● 命令 : 继续
 #--------------------------------------------------------------------------下面的$scene = Scene_Load.new(大概在157行上下)改成$scene = RINIMA.new。然后再新建一个脚本,内容:
 #==============================================================================
 # ■ Scene_File
 #------------------------------------------------------------------------------
 #  存档画面及读档画面的超级类。
 #==============================================================================
 class DASINI
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #     help_text : 帮助窗口显示的字符串
 #--------------------------------------------------------------------------
 def initialize(help_text)
 @help_text = help_text
 end
 #--------------------------------------------------------------------------
 # ● 主处理
 #--------------------------------------------------------------------------
 def main
 # 生成帮助窗口
 @help_window = Window_Help.new
 @help_window.set_text(@help_text)
 # 生成存档文件窗口
 @savefile_windows = []
 for i in 0..3
 @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
 end
 # 选择最后操作的文件
 @file_index = $game_temp.last_file_index
 @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
 for i in @savefile_windows
 i.dispose
 end
 end
 #--------------------------------------------------------------------------
 # ● 刷新画面
 #--------------------------------------------------------------------------
 def update
 # 刷新窗口
 @help_window.update
 for i in @savefile_windows
 i.update
 end
 # 按下 C 键的情况下
 if Input.trigger?(Input::C)
 # 调用过程 on_decision (定义继承目标)
 on_decision(make_filename(@file_index))
 $game_temp.last_file_index = @file_index
 return
 end
 # 按下 B 键的情况下
 if Input.trigger?(Input::B)
 # 调用过程 on_cancel (定义继承目标)
 on_cancel
 return
 end
 # 按下方向键下的情况下
 if Input.repeat?(Input::DOWN)
 # 方向键下的按下状态不是重复的情况下、
 # 并且光标的位置在 3 以前的情况下
 if Input.trigger?(Input::DOWN) or @file_index < 3
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 光标向下移动
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + 1) % 4
 @savefile_windows[@file_index].selected = true
 return
 end
 end
 # 按下方向键上的情况下
 if Input.repeat?(Input::UP)
 # 方向键上的按下状态不是重复的情况下、
 # 并且光标的位置在 0 以后的情况下
 if Input.trigger?(Input::UP) or @file_index > 0
 # 演奏光标 SE
 $game_system.se_play($data_system.cursor_se)
 # 光标向上移动
 @savefile_windows[@file_index].selected = false
 @file_index = (@file_index + 3) % 4
 @savefile_windows[@file_index].selected = true
 return
 end
 end
 end
 #--------------------------------------------------------------------------
 # ● 生成文件名
 #     file_index : 文件名的索引 (0~3)
 #--------------------------------------------------------------------------
 def make_filename(file_index)
 return "Save#{file_index + 1}.rxdata"
 end
 end
 #==============================================================================
 # ■ Scene_Load
 #------------------------------------------------------------------------------
 #  处理读档画面的类。
 #==============================================================================
 class RINIMA < DASINI
 #--------------------------------------------------------------------------
 # ● 初始化对像
 #--------------------------------------------------------------------------
 def initialize
 # 再生成临时对像
 $game_temp = Game_Temp.new
 # 选择存档时间最新的文件
 $game_temp.last_file_index = 0
 latest_time = Time.at(0)
 for i in 0..3
 filename = make_filename(i)
 if FileTest.exist?(filename)
 file = File.open(filename, "r")
 if file.mtime > latest_time
 latest_time = file.mtime
 $game_temp.last_file_index = i
 end
 file.close
 end
 end
 super("你妈逼")
 end
 #--------------------------------------------------------------------------
 # ● 确定时的处理
 #--------------------------------------------------------------------------
 def on_decision(filename)
 # 文件不存在的情况下
 unless FileTest.exist?(filename)
 # 演奏冻结 SE
 $game_system.se_play($data_system.buzzer_se)
 return
 end
 # 演奏读档 SE
 $game_system.se_play($data_system.load_se)
 # 写入存档数据
 file = File.open(filename, "rb")
 read_save_data(file)
 file.close
 # 还原 BGM、BGS
 $game_system.bgm_play($game_system.playing_bgm)
 $game_system.bgs_play($game_system.playing_bgs)
 # 刷新地图 (执行并行事件)
 $game_map.update
 # 切换到地图画面
 $scene = Scene_Map.new
 end
 #--------------------------------------------------------------------------
 # ● 取消时的处理
 #--------------------------------------------------------------------------
 def on_cancel
 # 演奏取消 SE
 $game_system.se_play($data_system.cancel_se)
 # 切换到标题画面
 $scene = Scene_Title.new
 end
 #--------------------------------------------------------------------------
 # ● 读取存档数据
 #     file : 读取用文件对像 (已经打开)
 #--------------------------------------------------------------------------
 def read_save_data(file)
 # 读取描绘存档文件用的角色数据
 characters = Marshal.load(file)
 # 读取测量游戏时间用画面计数
 Graphics.frame_count = Marshal.load(file)
 # 读取各种游戏对像
 $game_system        = Marshal.load(file)
 $game_switches      = Marshal.load(file)
 $game_variables     = Marshal.load(file)
 $game_self_switches = Marshal.load(file)
 $game_screen        = Marshal.load(file)
 $game_actors        = Marshal.load(file)
 $game_party         = Marshal.load(file)
 $game_troop         = Marshal.load(file)
 $game_map           = Marshal.load(file)
 $game_player        = Marshal.load(file)
 # 魔法编号与保存时有差异的情况下
 # (加入编辑器的编辑过的数据)
 if $game_system.magic_number != $data_system.magic_number
 # 重新装载地图
 $game_map.setup($game_map.map_id)
 $game_player.center($game_player.x, $game_player.y)
 end
 # 刷新同伴成员
 $game_party.refresh
 end
 end
 
 
   | 
    
      |  | 
          5楼
          巨大八爪鱼
          2013-7-7 16:45
          
          
            在复制的工程中建立save文件夹。运行游戏,把4个存档中的每个存档都读档(读档画面写的是“你妈逼”,把1-4都读一遍,虽然看不到有文件显示),然后再存档。
 这样save文件夹就有了4个新的存档。
 把这4个存档拿出来,删掉复制的工程。再把这4个存档复制到原工程的save文件夹中。打开原工程,
 标题画面的读档部分还要改。找到Scene_Title的47-52行,把
 @continue_enabled = false
 for i in 0..3
 if FileTest.exist?("Save#{i+1}.rxdata")
 @continue_enabled = true
 end
 end
 改成
 @continue_enabled = false
 for i in 0..999
 if FileTest.exist?("Save/motaSave#{i+1}.rxdata")
 @continue_enabled = true
 break
 end
 end
 
 然后运行游戏就行了。
 
 
   | 
    
      |  | 
          6楼
          巨大八爪鱼
          2013-7-7 16:46
          
          
            ————————本教程完毕   |