设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3809|回复: 6
打印 上一主题 下一主题

[RMVX发布] GAL用存读档界面[更新2.1版]

[复制链接]

Lv2.观梦者

(?????)

梦石
0
星屑
729
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

跳转到指定楼层
1
发表于 2011-8-16 04:23:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 各种压力的猫君 于 2011-8-17 02:34 编辑

根据脚本 R剧用的存读档界面 By.冰舞蝶恋 修改而来
原脚本帖 ->猛击我<-

先上截图:



注:左侧的“存档1、存档2……”中的“存档”文字是通过修改Vocab脚本中相应部分实现的。
  未修改时显示为“文件1、文件2……”(可能因RMVX翻译版本不同而不同)

在提问区求修改原脚本被无视了……被无视了……无视了……视了……了……(碎碎念碎碎念……)

于是自己动手丰衣足食

求各位大神帮修改成带翻页更多存档的!对于GAL来说4个档位不觉得太少了么 =-=

下面是脚本,插入到MAIN上面就行了 =ω=
  1. #==============================================================================
  2. # 〇 GAL用存读档界面 1.1
  3. #        By.各种压力的猫君
  4. #
  5. #  1.1 集成了一箭烂的删除存档1.1
  6. #  1.0 初版
  7. #
  8. # 参考脚本 R剧用的存读档界面 By.冰舞蝶恋
  9. #          删除存档v1.1.0    by 一箭烂
  10. #
  11. #------------------------------------------------------------------------------
  12. # 脚本说明:
  13. #
  14. # ①默认使用队伍中的第2个角色名字为场景名,第3个角色名字为章节名。
  15. #
  16. # ②默认已扩充到四档位,需要再加的话 =-= 无能为力了……
  17. #  虽然咱的游戏用已经够了,但是用作GAL的话显然不够吧……
  18. #  求大神帮扩展成带翻页的 >.<
  19. #
  20. # ③本人脚本盲,只会改不会写,所以需要改进的话
  21. #  请联系各位脚本大神而不是我 =-= |||
  22. #------------------------------------------------------------------------------

  23. #==============================================================================
  24. # ■ Window_SaveFile
  25. #------------------------------------------------------------------------------
  26. #  显示存档以及读档画面、保存文件的窗口。
  27. #==============================================================================

  28. class Window_SaveFile
  29.   #--------------------------------------------------------------------------
  30.   # ● 定义实例变量
  31.   #--------------------------------------------------------------------------
  32.   attr_reader   :filename                 # 文件名称
  33.   attr_reader   :file_exist               # 文件存在标志
  34.   attr_reader   :time_stamp               # 时间标记
  35.   attr_reader   :selected                 # 选择状态
  36.   #--------------------------------------------------------------------------
  37.   # ● 初始化对像
  38.   #     file_index : 存档文件的索引(0-3)
  39.   #     filename   : 文件名称
  40.   #--------------------------------------------------------------------------
  41.   def initialize(file_index, filename)
  42.     super((Graphics.width-340)/2, (Graphics.height-80*4)/2 + 28 + file_index % 4 * 80, 340, 80)
  43.     @file_index = file_index
  44.     @filename = filename
  45.     load_gamedata
  46.     refresh
  47.     @selected = false
  48.   end
  49.   #--------------------------------------------------------------------------  
  50.   # ● 刷新
  51.   #--------------------------------------------------------------------------
  52.   def refresh
  53.     self.contents.clear
  54.     self.contents.font.color = normal_color
  55.     self.contents.font.size = 16
  56.     name = Vocab::File + " #{@file_index + 1}"
  57.     self.contents.draw_text(4, 0+8, 200, WLH, name)
  58.     @name_width = contents.text_size(name).width
  59.     if @file_exist
  60.       draw_GAL_Chapters(152, 58)
  61.       draw_GAL_Scene(152, 74)
  62.       draw_playtime(50, 34, contents.width - 4, 2)
  63.     end
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 载入部分游戏资料
  67.   #--------------------------------------------------------------------------
  68.   def load_gamedata
  69.     @time_stamp = Time.at(0)
  70.     @file_exist = FileTest.exist?(@filename)
  71.     if @file_exist
  72.       file = File.open(@filename, "r")
  73.       @time_stamp = file.mtime
  74.       begin
  75.         @characters     = Marshal.load(file)
  76.         @frame_count    = Marshal.load(file)
  77.         @last_bgm       = Marshal.load(file)
  78.         @last_bgs       = Marshal.load(file)
  79.         @game_system    = Marshal.load(file)
  80.         @game_message   = Marshal.load(file)
  81.         @game_switches  = Marshal.load(file)
  82.         @game_variables = Marshal.load(file)
  83.         @game_actors    = Marshal.load(file)
  84.         @game_party     = Marshal.load(file)
  85.         @game_player    = Marshal.load(file)
  86.         @total_sec = @frame_count / Graphics.frame_rate
  87.       rescue
  88.         @file_exist = false
  89.       ensure
  90.         file.close
  91.       end
  92.     end
  93.   end
  94.   #--------------------------------------------------------------------------
  95.   # ● 描绘游戏时间
  96.   #     x : 绘制点 X 座标
  97.   #     y : 绘制点 Y 座标
  98.   #     width : 描绘区域宽度
  99.   #     align : 对齐方式
  100.   #--------------------------------------------------------------------------
  101.   def draw_playtime(x, y, width, align)
  102.     hour = @total_sec / 60 / 60
  103.     min = @total_sec / 60 % 60
  104.     sec = @total_sec % 60
  105.     time_string = sprintf("%04d时%02d分%02d秒", hour, min, sec)
  106.     self.contents.font.size = 16
  107.     self.contents.font.color = system_color
  108.     self.contents.draw_text(x-202, y-38, width, WLH, "游戏时间:",2)
  109.     self.contents.font.color = normal_color
  110.     self.contents.draw_text(x-90, y-38, width, WLH, time_string, 2)
  111.     self.contents.font.color = system_color
  112.     self.contents.draw_text(x-202, y-22, width, WLH, "当前章节:", 2)
  113.     self.contents.draw_text(x-202, y-6, width, WLH, "当前场景:", 2)
  114.   end
  115.   #--------------------------------------------------------------------------
  116.   # ● 章节名
  117.   #--------------------------------------------------------------------------
  118.   def draw_GAL_Chapters(x, y)
  119.     for i in [email protected]
  120.       #请修改下一行第一个数字
  121.       name = @characters[2][2]
  122.       self.contents.font.size = 16
  123.       self.contents.font.color = normal_color
  124.       self.contents.draw_text(x + i * 544, y-44-2, 200, 24, name, 0)
  125.     end
  126.   end
  127.   #--------------------------------------------------------------------------
  128.   # ● 场景名
  129.   #--------------------------------------------------------------------------
  130.   def draw_GAL_Scene(x, y)
  131.     for i in [email protected]
  132.       #请修改下一行第一个数字
  133.       name = @characters[1][2]
  134.       self.contents.font.size = 16
  135.       self.contents.font.color = normal_color
  136.       self.contents.draw_text(x + i * 544, y-44-2, 200, 24, name, 0)
  137.     end
  138.   end
  139.   #--------------------------------------------------------------------------
  140.   # ● 刷新光标
  141.   #--------------------------------------------------------------------------
  142.   def update_cursor
  143.     if @selected
  144.       self.cursor_rect.set(0, 0+7, @name_width + 8, WLH)
  145.     else
  146.       self.cursor_rect.empty
  147.     end
  148.   end
  149. end

  150. #==============================================================================
  151. # ■ Scene_File
  152. #------------------------------------------------------------------------------
  153. #  存档画面及读档画面的类。
  154. #==============================================================================

  155. class Scene_File
  156.   #--------------------------------------------------------------------------
  157.   # ● 开始处理
  158.   #--------------------------------------------------------------------------
  159.   def start
  160.     super
  161.     create_menu_background
  162.     create_savefile_windows
  163.     @z_window = Window_Z.new(0, 0)
  164.     if @saving
  165.       @index = $game_temp.last_file_index
  166.     else
  167.       @index = self.latest_file_index
  168.     end
  169.     @savefile_windows[@index].selected = true
  170.   end
  171.   #--------------------------------------------------------------------------
  172.   # ● 结束处理
  173.   #--------------------------------------------------------------------------
  174.   def terminate
  175.     super
  176.     dispose_menu_background
  177.     @z_window.dispose
  178.     dispose_item_windows
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # ● 更新画面
  182.   #--------------------------------------------------------------------------
  183.   def update
  184.     super
  185.     update_menu_background
  186.     @z_window.update
  187.     update_savefile_windows
  188.     update_savefile_selection
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 生成存档窗口
  192.   #--------------------------------------------------------------------------
  193.   def create_savefile_windows
  194.     @savefile_windows = []
  195.     for i in 0..3
  196.       @savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
  197.     end
  198.     @item_max = 4
  199.   end
  200.   #--------------------------------------------------------------------------
  201.   # ● 写入存档数据
  202.   #     file : 写入存档对象(已开启)
  203.   #--------------------------------------------------------------------------
  204.   def write_save_data(file)
  205.     characters = []
  206.     for actor in $game_party.members
  207.       characters.push([actor.character_name, actor.character_index, actor.name])
  208.     end
  209.     $game_system.save_count += 1
  210.     $game_system.version_id = $data_system.version_id
  211.     @last_bgm = RPG::BGM::last
  212.     @last_bgs = RPG::BGS::last
  213.     Marshal.dump(characters,           file)
  214.     Marshal.dump(Graphics.frame_count, file)
  215.     Marshal.dump(@last_bgm,            file)
  216.     Marshal.dump(@last_bgs,            file)
  217.     Marshal.dump($game_system,         file)
  218.     Marshal.dump($game_message,        file)
  219.     Marshal.dump($game_switches,       file)
  220.     Marshal.dump($game_variables,      file)
  221.     Marshal.dump($game_self_switches,  file)
  222.     Marshal.dump($game_actors,         file)
  223.     Marshal.dump($game_party,          file)
  224.     Marshal.dump($game_troop,          file)
  225.     Marshal.dump($game_map,            file)
  226.     Marshal.dump($game_player,         file)
  227.   end
  228. end

  229. #==============================================================================
  230. # ■ Window_Z
  231. #------------------------------------------------------------------------------
  232. #  显示读档或是存档的文字。
  233. #==============================================================================

  234. class Window_Z < Window_Base
  235.   #--------------------------------------------------------------------------
  236.   # ● 初始化对像
  237.   #     file_index : 存档文件的索引(0-3)
  238.   #     filename   : 文件名称
  239.   #--------------------------------------------------------------------------
  240.   def initialize(x,y)
  241.     super((Graphics.width-340)/2, 18, 140, 56)
  242.     refresh
  243.   end
  244.   #--------------------------------------------------------------------------
  245.   # ● 刷新
  246.   #--------------------------------------------------------------------------
  247.   def refresh
  248.     self.contents.clear
  249.     self.contents.font.color = normal_color
  250.     self.contents.font.bold = true
  251.     self.contents.draw_text(0, 0, 220, WLH, "§旧的回忆")
  252.   end
  253. end

  254. #==============================================================================
  255. # ■ 删除存档v1.1.1
  256. #------------------------------------------------------------------------------
  257. #  按下delete就会弹出选择窗, 然后选择删除。
  258. #
  259. #    - *1.1.1* (2011-04-01) By 各种压力的猫君
  260. #      *弹出窗口和删除存档时播放音效
  261. #      *调整窗口位置、文字颜色、字体大小、选择框大小
  262. #
  263. #    - *1.1.0* (2011-04-01) By 一箭烂(YiJL)
  264. #      *会弹出选择窗选择是否删除
  265. #
  266. #    - *1.0.0* (2011-04-27) By 一箭烂(YiJL)
  267. #      *初版
  268. #==============================================================================
  269. class Scene_File < Scene_Base
  270.   Key = Win32API.new("user32","GetAsyncKeyState","i","i")
  271.   #--------------------------------------------------------------------------
  272.   # ● 开始
  273.   #--------------------------------------------------------------------------
  274.   alias del_start start
  275.   def start
  276.     del_start
  277.     @del_window = Window_DelFile.new
  278.   end
  279.   #--------------------------------------------------------------------------
  280.   # ● 更新幀
  281.   #--------------------------------------------------------------------------
  282.   alias del_update update
  283.   def update
  284.     del_update
  285.     @del_window.update
  286.   end
  287.   #--------------------------------------------------------------------------
  288.   # ● 更新选择
  289.   #--------------------------------------------------------------------------
  290.   def update_savefile_selection
  291.     if Input.trigger?(Input::C)
  292.       if @del_window.visible
  293.         case @del_window.index
  294.         when 0
  295.           do_delete
  296.         when 1
  297.           @del_window.visible = false
  298.         end
  299.       else
  300.         determine_savefile
  301.       end
  302.     elsif Input.trigger?(Input::B)
  303.       if @del_window.visible
  304.         @del_window.visible = false
  305.       else
  306.         Sound.play_cancel
  307.         return_scene
  308.       end
  309.     elsif Key.call(0x2E) & 1 != 0
  310.       Sound.play_cursor
  311.       @del_window.visible = true
  312.     elsif @del_window.visible == false
  313.       last_index = @index
  314.       if Input.repeat?(Input::DOWN)
  315.         cursor_down(Input.trigger?(Input::DOWN))
  316.       end
  317.       if Input.repeat?(Input::UP)
  318.         cursor_up(Input.trigger?(Input::UP))
  319.       end
  320.       if @index != last_index
  321.         Sound.play_cursor
  322.         @savefile_windows[last_index].selected = false
  323.         @savefile_windows[@index].selected = true
  324.       end
  325.     end
  326.     @savefile_windows[@index].active = !@del_window.visible
  327.   end
  328.   #--------------------------------------------------------------------------
  329.   # ● 删除存档
  330.   #--------------------------------------------------------------------------
  331.   def do_delete
  332.     if @savefile_windows[@index].file_exist
  333.       File.delete(@savefile_windows[@index].filename)
  334.       $scene = Scene_File.new(@saving, @from_title, @from_event)
  335.       Sound.play_buzzer
  336.     else
  337.       Sound.play_cancel
  338.     end
  339.   end
  340.   #--------------------------------------------------------------------------
  341.   # ● 退出场景
  342.   #--------------------------------------------------------------------------
  343.   alias del_terminate terminate
  344.   def terminate
  345.     del_terminate
  346.     @del_window.dispose
  347.   end
  348. end

  349. #==============================================================================
  350. # ■ Window_DelFile
  351. #==============================================================================
  352. class Window_DelFile < Window_Selectable
  353.   #--------------------------------------------------------------------------
  354.   # ● 对象初始化
  355.   #--------------------------------------------------------------------------
  356.   def initialize
  357.     super((Graphics.width-230)/2, (Graphics.height-80)/2, 230, 80)
  358.     self.contents.font.size = 18
  359.     self.contents.font.color = system_color
  360.     self.contents.draw_text(0, 0, 200, 24, "要删除这个存档么?", 1)
  361.     self.contents.font.size = 16
  362.     self.contents.font.color = normal_color
  363.     self.contents.draw_text(14, 24, 70, 24, "删除", 1)
  364.     self.contents.draw_text(114, 24, 70, 24, "不要", 1)
  365.     @item_max = 2
  366.     @column_max = 2
  367.     @index = 1
  368.     self.visible = false
  369.   end
  370.   #--------------------------------------------------------------------------
  371.   # ● 帧更新
  372.   #--------------------------------------------------------------------------
  373.   def update
  374.     super
  375.     if self.visible
  376.       if cursor_movable?
  377.         last_index = @index
  378.         if Input.repeat?(Input::DOWN)
  379.           cursor_down(Input.trigger?(Input::DOWN))
  380.         end
  381.         if Input.repeat?(Input::UP)
  382.           cursor_up(Input.trigger?(Input::UP))
  383.         end
  384.         if @index != last_index
  385.           Sound.play_cursor
  386.         end
  387.       end
  388.       update_cursor
  389.       call_update_help
  390.     end
  391.   end
  392.   #--------------------------------------------------------------------------
  393.   # ● 选择矩形
  394.   #--------------------------------------------------------------------------
  395.   def item_rect(index)
  396.     rect = Rect.new(0, 0, 0, 0)
  397.     rect.width = (contents.width + 5) / @column_max - 5
  398.     rect.height = WLH
  399.     rect.x = index % @column_max * (rect.width + 5)
  400.     rect.y = index / @column_max * WLH + 24
  401.     return rect
  402.   end
  403. end
复制代码
好人君orzfly提供的 2.1版 =w=
本贴6层

评分

参与人数 1星屑 +8 收起 理由
RPGmaster + 8 不做AVG……纯支持=v=

查看全部评分

Lv1.梦旅人

梦石
0
星屑
48
在线时间
678 小时
注册时间
2010-8-11
帖子
1533
2
发表于 2011-8-16 08:09:22 | 只看该作者
本帖最后由 RPGmaster 于 2011-8-16 01:09 编辑

那个啥……制作AVG,用“旧的回忆”合适么=A=

点评

表示想要高清大图……  发表于 2011-8-17 01:42
大丈夫 - - 咱这个是N周目的  发表于 2011-8-16 20:31
Sei
这是Len...  发表于 2011-8-16 13:48
这rin抱着皮卡丘的头像哪来的= =||  发表于 2011-8-16 12:21
小艾工作室开张= =
回复 支持 反对

使用道具 举报

Lv2.观梦者

虚構歪曲

梦石
0
星屑
364
在线时间
1198 小时
注册时间
2010-12-18
帖子
3928

贵宾

3
发表于 2011-8-16 12:21:51 | 只看该作者
翻页请参考 Window_Selectable 。

点评

所以我说Selectable啊……  发表于 2011-8-16 14:16
这是多窗口的……其实我觉得如果要打开很多窗口很不好。 或许用一个类似Window_MenuStatus的不错。  发表于 2011-8-16 14:13
回复 支持 反对

使用道具 举报

Lv2.观梦者

(?????)

梦石
0
星屑
729
在线时间
1327 小时
注册时间
2011-7-18
帖子
3184

贵宾

4
 楼主| 发表于 2011-8-16 17:53:08 | 只看该作者
忧雪の伤 发表于 2011-8-16 12:21
翻页请参考 Window_Selectable 。

脚本盲……窗口大小、字体这类的小东西我改倒是没问题……

求大神帮忙改个简单的范例行么……

点评

写了好多东西呢。  发表于 2011-8-17 00:17
0.0 好~~厉害! 坐等成果了 →v→  发表于 2011-8-16 23:47
嘿嘿,已经差不多了的说~我整合下删除提示再做一个覆盖提示~  发表于 2011-8-16 23:24
泪奔…… 终于碰到好人了……  发表于 2011-8-16 20:31
我帮你改改看。出去寄张明信片回来就开始弄~  发表于 2011-8-16 19:02
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
175
在线时间
0 小时
注册时间
2011-8-15
帖子
3
5
发表于 2011-8-17 00:20:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv6.析梦学徒

Fuzzy Ginkgo
Taciturn Knight

梦石
0
星屑
60819
在线时间
1934 小时
注册时间
2010-6-26
帖子
1605

烫烫烫开拓者

6
发表于 2011-8-17 02:28:07 | 只看该作者
囧。我又有2.1了。
  1. #==============================================================================
  2. # 〇 GAL用存读档界面 2.1
  3. #
  4. #  2.1 by orzFly.com
  5. #      回滚为老版本 YesNoBox~好看!
  6. #      标题调用时有单独背景图
  7. #      可以隐藏掉那个坑爹的“旧的回忆”标题
  8. #      可以透明化窗口用自己的背景
  9. #      修正 bug:删不掉存档……
  10. #
  11. #  2.0 by orzFly.com
  12. #      整理脚本结构
  13. #      扩展为无限,增加详细信息、小列表
  14. #
  15. #  1.1 by 各种压力的猫君
  16. #      集成了一箭烂的删除存档1.1
  17. #  
  18. #  1.0 by 各种压力的猫君
  19. #      初版
  20. #
  21. # 参考脚本 R剧用的存读档界面   by 冰舞蝶恋
  22. #          删除存档v1.1.0      by 一箭烂(YiJL)
  23. #          Neo Save System III by Woratana [[email protected]]
  24. #------------------------------------------------------------------------------
  25. # 脚本说明:
  26. #
  27. #  本人脚本盲,只会改不会写,所以需要改进的话
  28. #  请联系各位脚本大神而不是我[各种压力的猫君] =-= |||
  29. #------------------------------------------------------------------------------
  30. module GALSave
  31. #==============================================================================
  32. # ▼ 脚本修改 *建议* 从此开始。
  33. #==============================================================================
  34.   # 存档个数   : 请按情况填写。填写过多也不会导致加载过慢。
  35.   MaxSaveSlot  = 100
  36.   
  37.   # 存档位置   : 请填写储存存档文件的位置。
  38.   #              RMVX 的默认位置为 "",
  39.   #                由于存档个数的提升,默认位置已不再优雅。
  40.   #              附注:您无需预先建立与分发此文件夹,脚本会自动建立。
  41.   SavePath     = "Saves/"
  42.   
  43.   # 存档文件名 : 请填写存档文件的文件名模板。
  44.   #              存档号请用 {id} 代替。
  45.   #              衬 0 的存档号请用 {ID} 代替。
  46.   SaveName     = "Save{ID}.rvdata"
  47.   
  48.   # 场景名队伍 ID
  49.   SceneNameID  = 2
  50.   # 章节名队伍 ID
  51.   ChapterNameID= 3
  52.   
  53.   # 界面标题   :留空就可以让他坑爹掉~
  54.   #              但是请注意要留住引号,否则脚本会报错。
  55.   ScreenTitle  = "§ 旧的回忆"
  56.   
  57.   # 窗口透明度 : 设置成 0 就让窗口背景消失了
  58.   Opacity      = 255
  59.   
  60.   # 视图       : 请填写使用的视图 ID。
  61.   #
  62.   #              可用的视图 ID:
  63.   #              0 - 小列表
  64.   #              1 - 大列表
  65.   View         = 1
  66.   
  67.   # 边距大小(左右上下)
  68.   MarginLeft   = 32
  69.   MarginRight  = 32
  70.   MarginTop    = 20
  71.   MarginBottom = 20
  72.   
  73.   # 存档名称   : 模板规则同 SaveName 存档文件名
  74.   SlotName     = '存档 {id}'

  75.   # 存档图标
  76.   SavedSlotIcon= 133 # 满
  77.   EmptySlotIcon= 141 # 空
  78.   
  79.   # 空存档文字
  80.   EmptySlotText= '- 无数据 -'
  81.   
  82.   # 大图标字段名
  83.   PlayTimeText = '时长: '
  84.   SaveTimeText = '时间: '
  85.   SceneText    = '场景: '
  86.   ChapterText  = '章节: '
  87.   
  88.   # 允许删除
  89.   AllowDelete  = true
  90.   
  91.   # 删除提示   : 模板规则同 SaveName 存档文件名
  92.   DeletePrompt = "确认删除存档 {id}?"
  93.   DeleteButton = ["删除", "取消"]
  94.   
  95.   # 覆盖提示
  96.   Overwrite    = true
  97.   
  98.   # 覆盖提示   : 模板规则同 SaveName 存档文件名
  99.   OverwritePrompt = "确认覆盖存档 {id}?"
  100.   OverwriteButton = ["覆盖", "取消"]
  101.   
  102.   # 读档背景   : 从标题读档时可以有背景图。
  103.   #              写 Cache.picture('文件名') 就为 Pictures 目录下的图片
  104.   #              也可以写 nil 用默认的透明化标题菜单~
  105.   LoadBackground = nil
  106.   
  107.   # 菜单背景   : 用一张透明的全屏 PNG 来实现深度自定义档位外观吧!
  108.   #              请配合 Opacity 使用!
  109.   #              写 Cache.picture('文件名') 就为 Pictures 目录下的图片
  110.   #              也可以写 nil 不使用。
  111.   MenuBackground = nil
  112. #==============================================================================
  113. # ▲ 脚本修改 *建议* 到此为 *止*。
  114. #==============================================================================
  115.   #--------------------------------------------------------------------------
  116.   # ● 字符串模板
  117.   #--------------------------------------------------------------------------
  118.   def self.string_template(str, id)
  119.     name = str.clone
  120.     name.gsub!(/\{id\}/) { id.to_s }
  121.     name.gsub!(/\{ID\}/) { id.is_a?(String) ? id : sprintf("%0#{GALSave::MaxSaveSlot.to_s.size}d", id) }
  122.     return name
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● 创建存档文件名
  126.   #--------------------------------------------------------------------------
  127.   def self.make_filename(id)
  128.     return string_template(GALSave::SavePath + GALSave::SaveName, id)
  129.     return name
  130.   end
  131.   #--------------------------------------------------------------------------
  132.   # ● 创建存档名
  133.   #--------------------------------------------------------------------------
  134.   def self.make_slotname(id)
  135.     return string_template(GALSave::SlotName, id)
  136.   end
  137. end

  138. #==============================================================================
  139. # ■ Game_GALSave
  140. #------------------------------------------------------------------------------
  141. #  为加快存档界面反应速度特加入此类。
  142. #  应用在 Scene_File 内部
  143. #==============================================================================

  144. class Game_GALSave
  145.   #--------------------------------------------------------------------------
  146.   # ● 初始化
  147.   #--------------------------------------------------------------------------
  148.   def initialize()
  149.     # 为存档创建文件夹
  150.     Dir.mkdir(GALSave::SavePath) if GALSave::SavePath != '' and !FileTest.directory?(GALSave::SavePath)
  151.     # 初始化存档缓存
  152.     @saves = []
  153.   end
  154.   #--------------------------------------------------------------------------
  155.   # ● 检查存档是否存在
  156.   #--------------------------------------------------------------------------
  157.   def exist?(id)
  158.     return Dir.glob(GALSave.make_filename(id)).size > 0 if id.is_a?(String)
  159.     return FileTest.exist?(GALSave.make_filename(id))
  160.   end
  161.   #--------------------------------------------------------------------------
  162.   # ● 加载存档信息
  163.   #--------------------------------------------------------------------------
  164.   def load_info(id)
  165.     return if id.is_a?(String)
  166.     return unless exist?(id)
  167.     file = File.open(GALSave.make_filename(id), "r")
  168.     begin
  169.       info = []
  170.       info[0] = file.mtime
  171.       info[1] = Marshal.load(file)
  172.       info[2] = Marshal.load(file) / Graphics.frame_rate
  173.     ensure
  174.       file.close
  175.     end
  176.     @saves[id] = info
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 获取存档信息
  180.   #--------------------------------------------------------------------------
  181.   def [](id)
  182.     return nil if id.is_a?(String)
  183.     if exist?(id)
  184.       load_info(id) if @saves[id].nil? or (File.mtime(GALSave.make_filename(id)) > @saves[id][0])
  185.     else
  186.       @saves[id] = nil
  187.     end
  188.     return @saves[id]
  189.   end
  190.   #--------------------------------------------------------------------------
  191.   # ● 获取最新存档
  192.   #--------------------------------------------------------------------------
  193.   def latest_file
  194.     id = 1
  195.     time = nil
  196.     GALSave::MaxSaveSlot.times {|i|
  197.       if exist?(i + 1)
  198.         t = File.mtime(GALSave.make_filename(i + 1))
  199.         time = t if time.nil?
  200.         if t > time
  201.           id = i + 1
  202.           time = t
  203.         end
  204.       end
  205.     }
  206.     return id
  207.   end
  208. end

  209. #==============================================================================
  210. # ■ Window_GALSave
  211. #------------------------------------------------------------------------------
  212. #  显示神奇的 GAL 特有的存档窗口~
  213. #==============================================================================

  214. class Window_GALSave < Window_Selectable
  215.   #--------------------------------------------------------------------------
  216.   # ● 初始化目标
  217.   #     x : 窗口的X坐标
  218.   #     y : 窗口的Y坐标
  219.   #--------------------------------------------------------------------------
  220.   def initialize
  221.     @item_height = GALSave::View == 0 ? WLH : WLH * 3
  222.     super(
  223.       GALSave::MarginLeft,
  224.       GALSave::MarginTop + (GALSave::ScreenTitle != "" ? WLH + 32 : 0),
  225.       Graphics.width - GALSave::MarginLeft - GALSave::MarginRight,
  226.       Graphics.height - GALSave::MarginTop - GALSave::MarginBottom - (GALSave::ScreenTitle != "" ? WLH + 32 : 0)
  227.     )
  228.     self.opacity = GALSave::Opacity
  229.     @loaded = []
  230.     refresh
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   # ● 刷新
  234.   #--------------------------------------------------------------------------
  235.   def refresh
  236.     self.contents.clear
  237.     @item_max = GALSave::MaxSaveSlot
  238.     create_contents
  239.     self.top_row = 0
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ● 刷新画面
  243.   #--------------------------------------------------------------------------
  244.   def update
  245.     if cursor_movable?
  246.       last_index = @index
  247.       if Input.repeat?(Input::RIGHT)
  248.         cursor_pagedown
  249.       end
  250.       if Input.repeat?(Input::LEFT)
  251.         cursor_pageup
  252.       end
  253.       if @index != last_index
  254.         Sound.play_cursor
  255.       end
  256.     end
  257.     super
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● 绘制行
  261.   #--------------------------------------------------------------------------
  262.   def draw_item(i)
  263.     rect = item_rect(i)
  264.     self.contents.clear_rect(rect)
  265.     rect.x += 4
  266.     exist = $game_galsave.exist?(i + 1)   
  267.     icon = exist ? GALSave::SavedSlotIcon : GALSave::EmptySlotIcon
  268.     unless icon.nil?; rect.x -= 4; draw_icon(icon, rect.x, rect.y); rect.x += 26; rect.width -= 20; end
  269.     width = contents.text_size(GALSave.make_slotname(GALSave::MaxSaveSlot)).width
  270.     self.contents.draw_text(rect.x, rect.y, width, WLH, GALSave.make_slotname(i + 1)); rect.x += width + 4; rect.width -= width + 4
  271.     if exist
  272.       time = $game_galsave[i + 1][0].strftime("%m.%d(%H:%M)")
  273.       scene = $game_galsave[i + 1][1][GALSave::SceneNameID - 1][2]
  274.       chapter = $game_galsave[i + 1][1][GALSave::ChapterNameID - 1][2]
  275.       hour = $game_galsave[i + 1][2] / 60 / 60
  276.       min = $game_galsave[i + 1][2] / 60 % 60
  277.       sec = $game_galsave[i + 1][2] % 60
  278.       long = sprintf("%04d:%02d:%02d", hour, min, sec)
  279.     end
  280.     if GALSave::View == 0
  281.       if !exist
  282.         self.contents.draw_text(rect, GALSave::EmptySlotText, 1)
  283.       else
  284.         self.contents.font.size /= 2
  285.         width = [contents.text_size(long).width, contents.text_size(time).width].max
  286.         self.contents.draw_text(rect.x, rect.y, width, WLH / 2, time, 1)
  287.         self.contents.draw_text(rect.x, rect.y + WLH / 2, width, WLH / 2, long, 1)
  288.         rect.x += width + 4; rect.width -= width + 4
  289.         self.contents.font.size = Font.default_size
  290.         self.contents.draw_text(rect.x, rect.y, rect.width / 2, rect.height, chapter, 1)
  291.         self.contents.draw_text(rect.x + rect.width / 2, rect.y, rect.width / 2, rect.height, scene, 1)
  292.       end
  293.     else GALSave::View == 1
  294.       if !exist
  295.         self.contents.draw_text(rect, GALSave::EmptySlotText, 1)
  296.       else
  297.         width = rect.width / 2
  298.         w = contents.text_size(GALSave::PlayTimeText).width
  299.         self.contents.font.color = system_color
  300.         self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::PlayTimeText)
  301.         self.contents.font.color = normal_color
  302.         self.contents.draw_text(rect.x + w, rect.y, width - w, WLH, long)
  303.         w = contents.text_size(GALSave::SaveTimeText).width
  304.         self.contents.font.color = system_color
  305.         self.contents.draw_text(rect.x + width, rect.y, w, WLH, GALSave::SaveTimeText)
  306.         self.contents.font.color = normal_color
  307.         self.contents.draw_text(rect.x + width + w, rect.y, width - w, WLH, time)
  308.         
  309.         width = rect.width
  310.         rect.y += WLH
  311.         w = contents.text_size(GALSave::ChapterText).width
  312.         self.contents.font.color = system_color
  313.         self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::ChapterText)
  314.         self.contents.font.color = normal_color
  315.         self.contents.draw_text(rect.x+ w, rect.y, width - w, WLH, chapter)
  316.         
  317.         rect.y += WLH
  318.         w = contents.text_size(GALSave::SceneText).width
  319.         self.contents.font.color = system_color
  320.         self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::SceneText)
  321.         self.contents.font.color = normal_color
  322.         self.contents.draw_text(rect.x+w, rect.y, width - w, WLH, scene)
  323.       end
  324.     end
  325.   end
  326.   #--------------------------------------------------------------------------
  327.   # ● 窗口内容生成
  328.   #--------------------------------------------------------------------------
  329.   def create_contents
  330.     self.contents.dispose
  331.     self.contents = Bitmap.new(width - 32, [height - 32, row_max * @item_height].max)
  332.   end
  333.   #--------------------------------------------------------------------------
  334.   # ● 获取开头行
  335.   #--------------------------------------------------------------------------
  336.   def top_row(oy = nil)
  337.     return (oy.nil? ? self.oy : oy) / @item_height
  338.   end
  339.   #--------------------------------------------------------------------------
  340.   # ● 设置开头行
  341.   #     row : 显示开头的行
  342.   #--------------------------------------------------------------------------
  343.   # 为保证高速,只在显示到某行的时候才加载、绘制行。
  344.   #--------------------------------------------------------------------------
  345.   def top_row=(row)
  346.     row = 0 if row < 0
  347.     row = row_max - 1 if row > row_max - 1
  348.    
  349.     min = self.top_row(row * @item_height)
  350.     max = [min + self.page_item_max + 1, @item_max].min
  351.     for i in min...max
  352.       if @loaded[i].nil?
  353.         @loaded[i] = true
  354.         draw_item(i)
  355.       end
  356.     end
  357.    
  358.     self.oy = row * @item_height
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # ● 获取 1 页可以显示的行数
  362.   #--------------------------------------------------------------------------
  363.   def page_row_max
  364.     return (self.height - 32) / @item_height
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # ● 获取项目描画矩形
  368.   #     index : 项目编号
  369.   #--------------------------------------------------------------------------
  370.   def item_rect(index)
  371.     rect = Rect.new(0, 0, 0, 0)
  372.     rect.width = (contents.width + @spacing) / @column_max - @spacing
  373.     rect.height = @item_height
  374.     rect.x = index % @column_max * (rect.width + @spacing)
  375.     rect.y = index / @column_max * @item_height
  376.     return rect
  377.   end
  378. end

  379. #==============================================================================
  380. # ■ Window_GALSave_Title
  381. #------------------------------------------------------------------------------
  382. #  显示读档或是存档的标题。
  383. #==============================================================================
  384. class Window_GALSave_Title < Window_Base
  385.   #--------------------------------------------------------------------------
  386.   # ● 初始化对像
  387.   #--------------------------------------------------------------------------
  388.   def initialize
  389.     super(
  390.       GALSave::MarginLeft,
  391.       GALSave::MarginTop,
  392.       (Graphics.width - GALSave::MarginLeft - GALSave::MarginRight) / 2,
  393.       WLH + 32
  394.     )
  395.     self.opacity = GALSave::Opacity
  396.     refresh
  397.   end
  398.   #--------------------------------------------------------------------------
  399.   # ● 刷新
  400.   #--------------------------------------------------------------------------
  401.   def refresh
  402.     self.contents.clear
  403.     self.contents.font.color = normal_color
  404.     self.contents.font.bold = true
  405.     self.contents.draw_text(0, 0, 220, WLH, GALSave::ScreenTitle)
  406.   end
  407. end

  408. #==============================================================================
  409. # ■ Scene_File
  410. #------------------------------------------------------------------------------
  411. #  存档画面及读档画面的类。
  412. #==============================================================================
  413. class Scene_File
  414.   #--------------------------------------------------------------------------
  415.   # ● 开始处理
  416.   #--------------------------------------------------------------------------
  417.   def start
  418.     super
  419.     create_menu_background
  420.     unless GALSave::MenuBackground.nil?
  421.       @background = Sprite.new
  422.       @background.x, @background.y = 0, 0
  423.       @background.bitmap = GALSave::MenuBackground
  424.     end
  425.     $game_galsave = Game_GALSave.new if $game_galsave.nil?
  426.     @save_window = Window_GALSave.new
  427.     @title_window = Window_GALSave_Title.new unless GALSave::ScreenTitle == ""
  428.     if @saving
  429.       @save_window.index = $game_temp.last_file_index
  430.     else
  431.       @save_window.index = $game_galsave.latest_file - 1
  432.     end
  433.   end
  434.   #--------------------------------------------------------------------------
  435.   # ● 刷新菜单画面背景
  436.   #--------------------------------------------------------------------------
  437.   def update_menu_background
  438.     super
  439.     return unless @from_title
  440.     @menuback_sprite.bitmap = GALSave::LoadBackground unless GALSave::LoadBackground.nil?
  441.   end
  442.   #--------------------------------------------------------------------------
  443.   # ● 结束处理
  444.   #--------------------------------------------------------------------------
  445.   def terminate
  446.     super
  447.     dispose_menu_background
  448.     @save_window.dispose
  449.     @title_window.dispose unless GALSave::ScreenTitle == ""
  450.     @background.dispose unless GALSave::MenuBackground.nil?
  451.   end
  452.   #--------------------------------------------------------------------------
  453.   # ● 更新画面
  454.   #--------------------------------------------------------------------------
  455.   def update
  456.     super
  457.     update_menu_background
  458.     update_savefile_selection
  459.     @title_window.update unless GALSave::ScreenTitle == ""
  460.     @save_window.update
  461.     @background.update unless GALSave::MenuBackground.nil?
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 刷新存档文件选项
  465.   #--------------------------------------------------------------------------
  466.   def update_savefile_selection
  467.     if Input.trigger?(Input::C)
  468.       determine_savefile
  469.     elsif Input.trigger?(Input::X) and GALSave::AllowDelete
  470.       determine_deletefile
  471.     elsif Input.trigger?(Input::B)
  472.       Sound.play_cancel
  473.       return_scene
  474.     end
  475.   end
  476.   #--------------------------------------------------------------------------
  477.   # ● 决定存档文件
  478.   #--------------------------------------------------------------------------
  479.   def determine_savefile
  480.     if @saving
  481.       if $game_galsave.exist?(@save_window.index + 1) and GALSave::Overwrite
  482.         Sound.play_decision
  483.         return if !yesnobox(GALSave.string_template(GALSave::OverwritePrompt, @save_window.index + 1), *GALSave::OverwriteButton)
  484.       end
  485.       Sound.play_save
  486.       do_save
  487.     else
  488.       if $game_galsave.exist?(@save_window.index + 1)
  489.         Sound.play_load
  490.         do_load
  491.       else
  492.         Sound.play_buzzer
  493.         return
  494.       end
  495.     end
  496.     $game_temp.last_file_index = @save_window.index
  497.   end
  498.   #--------------------------------------------------------------------------
  499.   # ● 决定删除文件
  500.   #--------------------------------------------------------------------------
  501.   def determine_deletefile
  502.     if $game_galsave.exist?(@save_window.index + 1)
  503.       Sound.play_decision
  504.       do_delete if yesnobox(GALSave.string_template(GALSave::DeletePrompt, @save_window.index + 1), *GALSave::DeleteButton)
  505.       return
  506.     else
  507.       Sound.play_buzzer
  508.       return
  509.     end
  510.   end
  511.   #--------------------------------------------------------------------------
  512.   # ● 执行删除
  513.   #--------------------------------------------------------------------------
  514.   def do_delete
  515.     File.delete(GALSave.make_filename(@save_window.index + 1))
  516.     @save_window.draw_item(@save_window.index)
  517.   end
  518.   #--------------------------------------------------------------------------
  519.   # ● 执行保存
  520.   #--------------------------------------------------------------------------
  521.   def do_save
  522.     file = File.open(GALSave.make_filename(@save_window.index + 1), "wb")
  523.     write_save_data(file)
  524.     file.close
  525.     return_scene
  526.   end
  527.   #--------------------------------------------------------------------------
  528.   # ● 执行读取
  529.   #--------------------------------------------------------------------------
  530.   def do_load
  531.     file = File.open(GALSave.make_filename(@save_window.index + 1), "rb")
  532.     read_save_data(file)
  533.     file.close
  534.     $scene = Scene_Map.new
  535.     RPG::BGM.fade(1500)
  536.     Graphics.fadeout(60)
  537.     Graphics.wait(40)
  538.     @last_bgm.play
  539.     @last_bgs.play
  540.   end
  541.   #--------------------------------------------------------------------------
  542.   # ● 存档数据的写入
  543.   #     file : 写入用文件对象 (已打开)
  544.   #--------------------------------------------------------------------------
  545.   def write_save_data(file)
  546.     characters = []
  547.     for actor in $game_party.members
  548.       characters.push([actor.character_name, actor.character_index, actor.name])
  549.     end
  550.     $game_system.save_count += 1
  551.     $game_system.version_id = $data_system.version_id
  552.     @last_bgm = RPG::BGM::last
  553.     @last_bgs = RPG::BGS::last
  554.     Marshal.dump(characters,           file)
  555.     Marshal.dump(Graphics.frame_count, file)
  556.     Marshal.dump(@last_bgm,            file)
  557.     Marshal.dump(@last_bgs,            file)
  558.     Marshal.dump($game_system,         file)
  559.     Marshal.dump($game_message,        file)
  560.     Marshal.dump($game_switches,       file)
  561.     Marshal.dump($game_variables,      file)
  562.     Marshal.dump($game_self_switches,  file)
  563.     Marshal.dump($game_actors,         file)
  564.     Marshal.dump($game_party,          file)
  565.     Marshal.dump($game_troop,          file)
  566.     Marshal.dump($game_map,            file)
  567.     Marshal.dump($game_player,         file)
  568.   end
  569.   #--------------------------------------------------------------------------
  570.   # ● 确认对话框
  571.   #--------------------------------------------------------------------------
  572.   def yesnobox(text,yes,no)
  573.     returnval = false
  574.     command_window = Window_YesNoBox.new(text, yes, no)
  575.     command_window.z = 9999
  576.     command_window.openness = 0
  577.     command_window.open
  578.     for i in 0...9
  579.       command_window.update
  580.       Graphics.update
  581.     end
  582.     loop do
  583.       command_window.update
  584.       Graphics.update
  585.       Input.update
  586.       if Input.trigger?(Input::C)
  587.         Sound.play_decision
  588.         returnval = command_window.index == 0 ? true : false
  589.         break
  590.       end
  591.       if Input.trigger?(Input::B)
  592.         Sound.play_cancel
  593.         returnval = false
  594.         break
  595.       end
  596.     end
  597.     command_window.close
  598.     for i in 0...9
  599.       command_window.update
  600.       Graphics.update
  601.     end
  602.     command_window.dispose
  603.     Graphics.update
  604.     Input.update
  605.     return returnval
  606.   end
  607. end
  608. #==============================================================================
  609. # ■ Window_YesNoBox
  610. #==============================================================================
  611. class Window_YesNoBox < Window_Selectable
  612.   #--------------------------------------------------------------------------
  613.   # ● 对象初始化
  614.   #--------------------------------------------------------------------------
  615.   def initialize(words, yes, no)
  616.     super((Graphics.width - 230)/2, (Graphics.height - 80)/2, 230, 80)
  617.     self.contents.font.size = 20
  618.     self.contents.font.color = system_color
  619.     self.contents.draw_text(0, 0, 200, 24, words, 1)
  620.     self.contents.font.size = 18
  621.     self.contents.font.color = normal_color
  622.     self.contents.draw_text(14, 24, 70, 24, yes, 1)
  623.     self.contents.draw_text(114, 24, 70, 24, no, 1)
  624.     @item_max = 2
  625.     @column_max = 2
  626.     @index = 0
  627.   end
  628.   #--------------------------------------------------------------------------
  629.   # ● 帧更新
  630.   #--------------------------------------------------------------------------
  631.   def update
  632.     super
  633.     if self.visible
  634.       if cursor_movable?
  635.         last_index = @index
  636.         if Input.repeat?(Input::DOWN)
  637.           cursor_down(Input.trigger?(Input::DOWN))
  638.         end
  639.         if Input.repeat?(Input::UP)
  640.           cursor_up(Input.trigger?(Input::UP))
  641.         end
  642.         if @index != last_index
  643.           Sound.play_cursor
  644.         end
  645.       end
  646.       update_cursor
  647.       call_update_help
  648.     end
  649.   end
  650.   #--------------------------------------------------------------------------
  651.   # ● 选择矩形
  652.   #--------------------------------------------------------------------------
  653.   def item_rect(index)
  654.     rect = Rect.new(0, 0, 0, 0)
  655.     rect.width = (contents.width + 5) / @column_max - 5
  656.     rect.height = WLH
  657.     rect.x = index % @column_max * (rect.width + 5)
  658.     rect.y = index / @column_max * WLH + 24
  659.     return rect
  660.   end
  661. end
  662. #==============================================================================
  663. # ■ 标题画面检查存档
  664. #==============================================================================
  665. class Scene_Title < Scene_Base
  666.   def check_continue
  667.     $game_galsave = Game_GALSave.new if $game_galsave.nil?
  668.     @continue_enabled = $game_galsave.exist?("*")
  669.   end
  670. end
复制代码

点评

汗……这是什么情况……  发表于 2011-8-26 19:29
我的言论只代表我个人的观点,不代表雇主及/或任何第三方的立场。
Opinions expressed are solely my own and do not express the views or opinions of my employer and/or any third parties.
捐赠 | GitHub
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
58 小时
注册时间
2012-7-6
帖子
39
7
发表于 2012-7-9 20:55:32 | 只看该作者
不会吧!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 07:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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