幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: 沉影不器

[RM2K&2K3] [求助]存档扩展

[复制链接]

91

主题

3188

帖子

83986万

积分

荣誉群

传说中的Bunny大神~!

积分
839861514
QQ
发表于 2006-6-21 22:46:54 | 显示全部楼层
http://www.phylomortis.com/resource/script/scr039.html
无限存档的脚本。。。
其他所有的Bunny神都素我的部下XD~ 小教程范例收集 Orz感谢邪恶萝卜联盟!!!(原因自己去猜)
回复 支持 反对

使用道具 举报

30

主题

477

帖子

5219

积分

⑦老手

积分
5219
 楼主| 发表于 2006-6-22 09:17:07 | 显示全部楼层
这样啊~~~
如果可以在一个菜单项实现当然方便了。
不过你的方法其实是变相在同一个菜单项实现的,实质上读档并不是在“档案管理”那个菜单里实现的,而是重新跳转到Scene_Load嘛。
回复 支持 反对

使用道具 举报

30

主题

477

帖子

5219

积分

⑦老手

积分
5219
 楼主| 发表于 2006-6-22 09:19:23 | 显示全部楼层
引用第10楼盗帅冬瓜2006-06-21 22:46发表的“”:
http://www.phylomortis.com/resource/script/scr039.html
无限存档的脚本。。。
这个 [s:3]  [s:5]
好像跟我的问题无关啊…………但是挺好用的,默认的4个少了点
回复 支持 反对

使用道具 举报

30

主题

477

帖子

5219

积分

⑦老手

积分
5219
 楼主| 发表于 2006-6-22 22:16:35 | 显示全部楼层
怎么变成[待回应]了?
我自己再试试吧,本帖问题先放一放,这几天要赶工了 [s:5]
回复 支持 反对

使用道具 举报

91

主题

3188

帖子

83986万

积分

荣誉群

传说中的Bunny大神~!

积分
839861514
QQ
发表于 2006-6-22 22:30:51 | 显示全部楼层
你问得不就是存档扩展么- -
其他所有的Bunny神都素我的部下XD~ 小教程范例收集 Orz感谢邪恶萝卜联盟!!!(原因自己去猜)
回复 支持 反对

使用道具 举报

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2006-6-23 04:39:35 | 显示全部楼层
我把我那个改改。
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复 支持 反对

使用道具 举报

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2006-6-23 05:25:55 | 显示全部楼层
这是我当初的第一个脚本,现在看来至少有七成的部分可以删除,但我懒的改了。
#==============================================================================
# ■ 存取档合并脚本
#------------------------------------------------------------------------------
# BY:美兽
#插入main之前,地图呼出方式$scene = Scene_Loadsave.new,主菜单里默认的也是该界面
#不与默认的存取档功能冲突,方便个别地方只需存或者取的功能,虽然很简单,实际做起
#来,考虑的地方还是比较多。 
#==============================================================================
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
#  处理读档画面的类。
#==============================================================================

class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  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
    $menu_call = false
    # 演奏读档 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
#==============================================================================
# ■ Window_LoadHelp
#------------------------------------------------------------------------------
#  存取档画面帮助信息的显示窗口。
#==============================================================================

class Window_LoadHelp < Window_Base
#--------------------------------------------------------------------------
#  初始化对象
#--------------------------------------------------------------------------
def initialize
  super(0, 0, 240, 64)
  self.contents = Bitmap.new(width - 32, height - 32)
  self.contents.font.name = "黑体"
  self.contents.font.size = 18
end
#--------------------------------------------------------------------------
#  刷新文本
#--------------------------------------------------------------------------
def set_text(text, align = 1)
  if text != @text or align != @align
    self.contents.clear
    self.contents.font.color = normal_color
    self.contents.draw_text(4, 0, self.width - 40, 32, text, align)
    @text = text
    @align = align
    @actor = nil
  end
  self.visible = true
end
end
#==============================================================================
#  Window_LoadCommand
#------------------------------------------------------------------------------
#  存取档画面选择按钮窗口
#==============================================================================

class Window_LoadCommand < Window_Selectable
#--------------------------------------------------------------------------
#  初始化对象
#--------------------------------------------------------------------------
def initialize
  super(240, 0, 400, 64)
  self.contents = Bitmap.new(width - 32, height - 32)
  self.contents.font.name = "黑体"
  self.contents.font.size = 18
  @item_max = 3
  @column_max = 3
  @commands = ["读取", "存储","删除"]
  refresh
  self.index = 0
end
#--------------------------------------------------------------------------
#  刷新
#--------------------------------------------------------------------------
def refresh
  self.contents.clear
  for i in 0...@item_max
    draw_item(i)
  end
end
#--------------------------------------------------------------------------
#  描画按钮文字
#--------------------------------------------------------------------------
def draw_item(index)
  x = 4 + index * 135
  self.contents.draw_text(x, 0, 144, 32, @commands[index])
end
#--------------------------------------------------------------------------
# ● 项目无效化
#     index : 项目编号
#--------------------------------------------------------------------------
  def disable_item(index)
    draw_item(index, disabled_color)
  end

end

#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  处理菜单画面的类。
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     menu_index : 命令光标的初期位置
  #--------------------------------------------------------------------------
  def initialize(menu_index = 0)
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成命令窗口
    s1 = $data_system.words.item
    s2 = $data_system.words.skill
    s3 = $data_system.words.equip
    s4 = "状态"
    s5 = "记录"
    s6 = "结束游戏"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])
    @command_window.index = @menu_index
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      # 物品、特技、装备、状态无效化
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
    end
    # 生成游戏时间窗口
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 0
    @playtime_window.y = 224
    # 生成步数窗口
    @steps_window = Window_Steps.new
    @steps_window.x = 0
    @steps_window.y = 320
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = 416
    # 生成状态窗口
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 0
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果切换画面就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @command_window.dispose
    @playtime_window.dispose
    @steps_window.dispose
    @gold_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @command_window.update
    @playtime_window.update
    @steps_window.update
    @gold_window.update
    @status_window.update
    # 命令窗口被激活的情况下: 调用 update_command
    if @command_window.active
      update_command
      return
    end
    # 状态窗口被激活的情况下: 调用 update_status
    if @status_window.active
      update_status
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (命令窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴人数为 0、存档、游戏结束以外的场合
      if $game_party.actors.size == 0 and @command_window.index < 4
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令窗口的光标位置分支
      case @command_window.index
      when 0  # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $scene = Scene_Item.new
      when 1  # 特技
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 2  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 3  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4  # 存档
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到存取档画面
        $menu_call = true
        $scene = Scene_Loadsave.new
      when 5  # 游戏结束
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到游戏结束画面
        $scene = Scene_End.new
      end
      return
    end
  end
  end
#==============================================================================
#  Scene_Loadsave
#------------------------------------------------------------------------------
# 处理存取档画面的类。
#==============================================================================

class Scene_Loadsave
#--------------------------------------------------------------------------
# ● 初始化对像
#     $last_savefile_index : 记录光标位置
#--------------------------------------------------------------------------
def initialize
  $last_savefile_index = 0 if $last_savefile_index == nil
end
#--------------------------------------------------------------------------
#  主处理
#--------------------------------------------------------------------------
def main
  @savestate = 0
  # 生成窗口
  @help_window = Window_LoadHelp.new
  @help_window.set_text("请选择.")
  @option_window = Window_LoadCommand.new
  @savefile_windows = []
  for i in 0..3
    @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
  end
  @option_window.index = $last_savefile_index
  @file_index = 0
  # 执行过渡
  Graphics.transition
  # 主循环
  loop do
    # 刷新游戏画面
    Graphics.update
    # 刷新输入信息
    Input.update
    # 刷新画面
    update
    # 如果画面被切换的话就中断循环
    if $scene != self
      break
    end
  end
  # 准备过渡
  Graphics.freeze
  # 释放窗口
  @help_window.dispose
  @option_window.dispose
  for i in @savefile_windows
    i.dispose
  end
end

#--------------------------------------------------------------------------
#  ● 刷新画面
#--------------------------------------------------------------------------
def update
  # 刷新窗口
  @help_window.update
  @option_window.update
  for i in @savefile_windows
    i.update
  end
  
  case @savestate
  when 0
      if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      # 返回地图
      if $menu_call == false
      # 切换到地图画面
      $scene = Scene_Map.new
        return
      end
      # 切换到菜单画面
      $menu_call = false
      $scene = Scene_Menu.new(4)
   end
    if Input.trigger?(Input::C)
      case @option_window.index
      when 0
        @savefile_windows[@file_index].selected = true
        @option_window.active = false
        @help_window.set_text("请选择一个文件进行读取.")
        @savestate  = 1
        return
      when 1
        @savefile_windows[@file_index].selected = true
        @option_window.active = false
        @help_window.set_text("请选择一个文件进行存储.")
        @savestate = 2
        return
      when 2
        @savefile_windows[@file_index].selected = true
        @option_window.active = false
        @help_window.set_text("请选择一个文件进行删除.")
        @savestate = 3
      return        
        return
      end
    end
  when 1,2,3
    if Input.trigger?(Input::C)
      case @savestate
        when 1
          $menu_call = false
          load_file(make_filename(@file_index))
          return
        when  2
          # 禁止存档的情况下
          if $game_system.save_disabled
            @help_window.set_text("抱歉,这里禁止存储.")
            # 演奏冻结 SE
            $game_system.se_play($data_system.buzzer_se)
            return
          end
         $game_system.se_play($data_system.decision_se)
         $last_savefile_index = @option_window.index
         save_file(make_filename(@file_index))
        return
       when 3
         unless FileTest.exist?("Save#{@file_index+1}.rxdata")
            $game_system.se_play($data_system.buzzer_se)
            @help_window.set_text("这里没有记录,令你遗憾了.")
            return
        end
            $game_system.se_play($data_system.decision_se)
            File.delete("Save#{@file_index+1}.rxdata")
            @savefile_windows[@file_index].contents.clear
            name = "文件 #{@file_index + 1}"
            @savefile_windows[@file_index].contents.draw_text(4, 0, 600, 32, name)
            return         
      end
    end
    # 取消
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @savefile_windows[@file_index].selected = false
      @help_window.set_text("请选择.")
      @savestate = 0
      @option_window.active = true
      return
    end
    # 向下选择
    if Input.repeat?(Input:OWN)
      $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
    # 向上选择
    if Input.repeat?(Input::UP)
      $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
   
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @savestate = 2
      @savefile_windows[@file_index].selected = true
      return
    end
  end
end
#--------------------------------------------------------------------------
# 建立记录文件索引
#--------------------------------------------------------------------------
def make_filename(file_index)
  return "Save#{file_index + 1}.rxdata"
end
#--------------------------------------------------------------------------
#  读取记录文件
#     filename  : 被读取文件
#--------------------------------------------------------------------------
def load_file(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
  # 切换到地图画面
  $menu_call == false
  $scene = Scene_Map.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
  #--------------------------------------------------------------------------
  # ● 写入存档文件
  #--------------------------------------------------------------------------
  def save_file(filename)
    # 演奏存档 SE
    $game_system.se_play($data_system.save_se)
    # 写入存档数据
    file = File.open(filename, "wb")
    write_save_data(file)
    file.close
    # 切换到菜单画面
    $scene = Scene_Loadsave.new
  end
  #--------------------------------------------------------------------------
  # ● 写入存档数据
  #     file : 写入用文件对像 (已经打开)
  #--------------------------------------------------------------------------
  def write_save_data(file)
    # 生成描绘存档文件用的角色图形
    characters = []
    for i in 0...$game_party.actors.size
      actor = $game_party.actors
      characters.push([actor.character_name, actor.character_hue])
    end
    # 写入描绘存档文件用的角色数据
    Marshal.dump(characters, file)
    # 写入测量游戏时间用画面计数
    Marshal.dump(Graphics.frame_count, file)
    # 增加 1 次存档次数
    $game_system.save_count += 1
    # 保存魔法编号
    # (将编辑器保存的值以随机值替换)
    $game_system.magic_number = $data_system.magic_number
    # 写入各种游戏对像
    Marshal.dump($game_system, file)
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_self_switches, file)
    Marshal.dump($game_screen, file)
    Marshal.dump($game_actors, file)
    Marshal.dump($game_party, file)
    Marshal.dump($game_troop, file)
    Marshal.dump($game_map, file)
    Marshal.dump($game_player, file)
  end
end
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复 支持 反对

使用道具 举报

30

主题

477

帖子

5219

积分

⑦老手

积分
5219
 楼主| 发表于 2006-6-23 08:29:43 | 显示全部楼层
美兽的脚本好像真的很长很长…………我试着用看。谢啦
回复 支持 反对

使用道具 举报

91

主题

3188

帖子

83986万

积分

荣誉群

传说中的Bunny大神~!

积分
839861514
QQ
发表于 2006-6-23 13:50:00 | 显示全部楼层
引用第17楼沉影不器2006-06-23 08:29发表的“”:
美兽的脚本好像真的很长很长…………我试着用看。谢啦

很不错哦,整合了删除的功能。

对了,美兽顺便也把这个脚本发过来吧,我都米有看到这里有的说- -。
其他所有的Bunny神都素我的部下XD~ 小教程范例收集 Orz感谢邪恶萝卜联盟!!!(原因自己去猜)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2025-6-28 05:29 , Processed in 0.013490 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表