赞 | 23 |
VIP | 22 |
好人卡 | 18 |
积分 | 608 |
经验 | 44466 |
最后登录 | 2024-11-9 |
在线时间 | 1934 小时 |
Lv6.析梦学徒 Fuzzy Ginkgo Taciturn Knight
- 梦石
- 0
- 星屑
- 60814
- 在线时间
- 1934 小时
- 注册时间
- 2010-6-26
- 帖子
- 1605
|
囧。我又有2.1了。- #==============================================================================
- # 〇 GAL用存读档界面 2.1
- #
- # 2.1 by orzFly.com
- # 回滚为老版本 YesNoBox~好看!
- # 标题调用时有单独背景图
- # 可以隐藏掉那个坑爹的“旧的回忆”标题
- # 可以透明化窗口用自己的背景
- # 修正 bug:删不掉存档……
- #
- # 2.0 by orzFly.com
- # 整理脚本结构
- # 扩展为无限,增加详细信息、小列表
- #
- # 1.1 by 各种压力的猫君
- # 集成了一箭烂的删除存档1.1
- #
- # 1.0 by 各种压力的猫君
- # 初版
- #
- # 参考脚本 R剧用的存读档界面 by 冰舞蝶恋
- # 删除存档v1.1.0 by 一箭烂(YiJL)
- # Neo Save System III by Woratana [[email protected]]
- #------------------------------------------------------------------------------
- # 脚本说明:
- #
- # 本人脚本盲,只会改不会写,所以需要改进的话
- # 请联系各位脚本大神而不是我[各种压力的猫君] =-= |||
- #------------------------------------------------------------------------------
- module GALSave
- #==============================================================================
- # ▼ 脚本修改 *建议* 从此开始。
- #==============================================================================
- # 存档个数 : 请按情况填写。填写过多也不会导致加载过慢。
- MaxSaveSlot = 100
-
- # 存档位置 : 请填写储存存档文件的位置。
- # RMVX 的默认位置为 "",
- # 由于存档个数的提升,默认位置已不再优雅。
- # 附注:您无需预先建立与分发此文件夹,脚本会自动建立。
- SavePath = "Saves/"
-
- # 存档文件名 : 请填写存档文件的文件名模板。
- # 存档号请用 {id} 代替。
- # 衬 0 的存档号请用 {ID} 代替。
- SaveName = "Save{ID}.rvdata"
-
- # 场景名队伍 ID
- SceneNameID = 2
- # 章节名队伍 ID
- ChapterNameID= 3
-
- # 界面标题 :留空就可以让他坑爹掉~
- # 但是请注意要留住引号,否则脚本会报错。
- ScreenTitle = "§ 旧的回忆"
-
- # 窗口透明度 : 设置成 0 就让窗口背景消失了
- Opacity = 255
-
- # 视图 : 请填写使用的视图 ID。
- #
- # 可用的视图 ID:
- # 0 - 小列表
- # 1 - 大列表
- View = 1
-
- # 边距大小(左右上下)
- MarginLeft = 32
- MarginRight = 32
- MarginTop = 20
- MarginBottom = 20
-
- # 存档名称 : 模板规则同 SaveName 存档文件名
- SlotName = '存档 {id}'
- # 存档图标
- SavedSlotIcon= 133 # 满
- EmptySlotIcon= 141 # 空
-
- # 空存档文字
- EmptySlotText= '- 无数据 -'
-
- # 大图标字段名
- PlayTimeText = '时长: '
- SaveTimeText = '时间: '
- SceneText = '场景: '
- ChapterText = '章节: '
-
- # 允许删除
- AllowDelete = true
-
- # 删除提示 : 模板规则同 SaveName 存档文件名
- DeletePrompt = "确认删除存档 {id}?"
- DeleteButton = ["删除", "取消"]
-
- # 覆盖提示
- Overwrite = true
-
- # 覆盖提示 : 模板规则同 SaveName 存档文件名
- OverwritePrompt = "确认覆盖存档 {id}?"
- OverwriteButton = ["覆盖", "取消"]
-
- # 读档背景 : 从标题读档时可以有背景图。
- # 写 Cache.picture('文件名') 就为 Pictures 目录下的图片
- # 也可以写 nil 用默认的透明化标题菜单~
- LoadBackground = nil
-
- # 菜单背景 : 用一张透明的全屏 PNG 来实现深度自定义档位外观吧!
- # 请配合 Opacity 使用!
- # 写 Cache.picture('文件名') 就为 Pictures 目录下的图片
- # 也可以写 nil 不使用。
- MenuBackground = nil
- #==============================================================================
- # ▲ 脚本修改 *建议* 到此为 *止*。
- #==============================================================================
- #--------------------------------------------------------------------------
- # ● 字符串模板
- #--------------------------------------------------------------------------
- def self.string_template(str, id)
- name = str.clone
- name.gsub!(/\{id\}/) { id.to_s }
- name.gsub!(/\{ID\}/) { id.is_a?(String) ? id : sprintf("%0#{GALSave::MaxSaveSlot.to_s.size}d", id) }
- return name
- end
- #--------------------------------------------------------------------------
- # ● 创建存档文件名
- #--------------------------------------------------------------------------
- def self.make_filename(id)
- return string_template(GALSave::SavePath + GALSave::SaveName, id)
- return name
- end
- #--------------------------------------------------------------------------
- # ● 创建存档名
- #--------------------------------------------------------------------------
- def self.make_slotname(id)
- return string_template(GALSave::SlotName, id)
- end
- end
- #==============================================================================
- # ■ Game_GALSave
- #------------------------------------------------------------------------------
- # 为加快存档界面反应速度特加入此类。
- # 应用在 Scene_File 内部
- #==============================================================================
- class Game_GALSave
- #--------------------------------------------------------------------------
- # ● 初始化
- #--------------------------------------------------------------------------
- def initialize()
- # 为存档创建文件夹
- Dir.mkdir(GALSave::SavePath) if GALSave::SavePath != '' and !FileTest.directory?(GALSave::SavePath)
- # 初始化存档缓存
- @saves = []
- end
- #--------------------------------------------------------------------------
- # ● 检查存档是否存在
- #--------------------------------------------------------------------------
- def exist?(id)
- return Dir.glob(GALSave.make_filename(id)).size > 0 if id.is_a?(String)
- return FileTest.exist?(GALSave.make_filename(id))
- end
- #--------------------------------------------------------------------------
- # ● 加载存档信息
- #--------------------------------------------------------------------------
- def load_info(id)
- return if id.is_a?(String)
- return unless exist?(id)
- file = File.open(GALSave.make_filename(id), "r")
- begin
- info = []
- info[0] = file.mtime
- info[1] = Marshal.load(file)
- info[2] = Marshal.load(file) / Graphics.frame_rate
- ensure
- file.close
- end
- @saves[id] = info
- end
- #--------------------------------------------------------------------------
- # ● 获取存档信息
- #--------------------------------------------------------------------------
- def [](id)
- return nil if id.is_a?(String)
- if exist?(id)
- load_info(id) if @saves[id].nil? or (File.mtime(GALSave.make_filename(id)) > @saves[id][0])
- else
- @saves[id] = nil
- end
- return @saves[id]
- end
- #--------------------------------------------------------------------------
- # ● 获取最新存档
- #--------------------------------------------------------------------------
- def latest_file
- id = 1
- time = nil
- GALSave::MaxSaveSlot.times {|i|
- if exist?(i + 1)
- t = File.mtime(GALSave.make_filename(i + 1))
- time = t if time.nil?
- if t > time
- id = i + 1
- time = t
- end
- end
- }
- return id
- end
- end
- #==============================================================================
- # ■ Window_GALSave
- #------------------------------------------------------------------------------
- # 显示神奇的 GAL 特有的存档窗口~
- #==============================================================================
- class Window_GALSave < Window_Selectable
- #--------------------------------------------------------------------------
- # ● 初始化目标
- # x : 窗口的X坐标
- # y : 窗口的Y坐标
- #--------------------------------------------------------------------------
- def initialize
- @item_height = GALSave::View == 0 ? WLH : WLH * 3
- super(
- GALSave::MarginLeft,
- GALSave::MarginTop + (GALSave::ScreenTitle != "" ? WLH + 32 : 0),
- Graphics.width - GALSave::MarginLeft - GALSave::MarginRight,
- Graphics.height - GALSave::MarginTop - GALSave::MarginBottom - (GALSave::ScreenTitle != "" ? WLH + 32 : 0)
- )
- self.opacity = GALSave::Opacity
- @loaded = []
- refresh
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- @item_max = GALSave::MaxSaveSlot
- create_contents
- self.top_row = 0
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- def update
- if cursor_movable?
- last_index = @index
- if Input.repeat?(Input::RIGHT)
- cursor_pagedown
- end
- if Input.repeat?(Input::LEFT)
- cursor_pageup
- end
- if @index != last_index
- Sound.play_cursor
- end
- end
- super
- end
- #--------------------------------------------------------------------------
- # ● 绘制行
- #--------------------------------------------------------------------------
- def draw_item(i)
- rect = item_rect(i)
- self.contents.clear_rect(rect)
- rect.x += 4
- exist = $game_galsave.exist?(i + 1)
- icon = exist ? GALSave::SavedSlotIcon : GALSave::EmptySlotIcon
- unless icon.nil?; rect.x -= 4; draw_icon(icon, rect.x, rect.y); rect.x += 26; rect.width -= 20; end
- width = contents.text_size(GALSave.make_slotname(GALSave::MaxSaveSlot)).width
- self.contents.draw_text(rect.x, rect.y, width, WLH, GALSave.make_slotname(i + 1)); rect.x += width + 4; rect.width -= width + 4
- if exist
- time = $game_galsave[i + 1][0].strftime("%m.%d(%H:%M)")
- scene = $game_galsave[i + 1][1][GALSave::SceneNameID - 1][2]
- chapter = $game_galsave[i + 1][1][GALSave::ChapterNameID - 1][2]
- hour = $game_galsave[i + 1][2] / 60 / 60
- min = $game_galsave[i + 1][2] / 60 % 60
- sec = $game_galsave[i + 1][2] % 60
- long = sprintf("%04d:%02d:%02d", hour, min, sec)
- end
- if GALSave::View == 0
- if !exist
- self.contents.draw_text(rect, GALSave::EmptySlotText, 1)
- else
- self.contents.font.size /= 2
- width = [contents.text_size(long).width, contents.text_size(time).width].max
- self.contents.draw_text(rect.x, rect.y, width, WLH / 2, time, 1)
- self.contents.draw_text(rect.x, rect.y + WLH / 2, width, WLH / 2, long, 1)
- rect.x += width + 4; rect.width -= width + 4
- self.contents.font.size = Font.default_size
- self.contents.draw_text(rect.x, rect.y, rect.width / 2, rect.height, chapter, 1)
- self.contents.draw_text(rect.x + rect.width / 2, rect.y, rect.width / 2, rect.height, scene, 1)
- end
- else GALSave::View == 1
- if !exist
- self.contents.draw_text(rect, GALSave::EmptySlotText, 1)
- else
- width = rect.width / 2
- w = contents.text_size(GALSave::PlayTimeText).width
- self.contents.font.color = system_color
- self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::PlayTimeText)
- self.contents.font.color = normal_color
- self.contents.draw_text(rect.x + w, rect.y, width - w, WLH, long)
- w = contents.text_size(GALSave::SaveTimeText).width
- self.contents.font.color = system_color
- self.contents.draw_text(rect.x + width, rect.y, w, WLH, GALSave::SaveTimeText)
- self.contents.font.color = normal_color
- self.contents.draw_text(rect.x + width + w, rect.y, width - w, WLH, time)
-
- width = rect.width
- rect.y += WLH
- w = contents.text_size(GALSave::ChapterText).width
- self.contents.font.color = system_color
- self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::ChapterText)
- self.contents.font.color = normal_color
- self.contents.draw_text(rect.x+ w, rect.y, width - w, WLH, chapter)
-
- rect.y += WLH
- w = contents.text_size(GALSave::SceneText).width
- self.contents.font.color = system_color
- self.contents.draw_text(rect.x, rect.y, w, WLH, GALSave::SceneText)
- self.contents.font.color = normal_color
- self.contents.draw_text(rect.x+w, rect.y, width - w, WLH, scene)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 窗口内容生成
- #--------------------------------------------------------------------------
- def create_contents
- self.contents.dispose
- self.contents = Bitmap.new(width - 32, [height - 32, row_max * @item_height].max)
- end
- #--------------------------------------------------------------------------
- # ● 获取开头行
- #--------------------------------------------------------------------------
- def top_row(oy = nil)
- return (oy.nil? ? self.oy : oy) / @item_height
- end
- #--------------------------------------------------------------------------
- # ● 设置开头行
- # row : 显示开头的行
- #--------------------------------------------------------------------------
- # 为保证高速,只在显示到某行的时候才加载、绘制行。
- #--------------------------------------------------------------------------
- def top_row=(row)
- row = 0 if row < 0
- row = row_max - 1 if row > row_max - 1
-
- min = self.top_row(row * @item_height)
- max = [min + self.page_item_max + 1, @item_max].min
- for i in min...max
- if @loaded[i].nil?
- @loaded[i] = true
- draw_item(i)
- end
- end
-
- self.oy = row * @item_height
- end
- #--------------------------------------------------------------------------
- # ● 获取 1 页可以显示的行数
- #--------------------------------------------------------------------------
- def page_row_max
- return (self.height - 32) / @item_height
- end
- #--------------------------------------------------------------------------
- # ● 获取项目描画矩形
- # index : 项目编号
- #--------------------------------------------------------------------------
- def item_rect(index)
- rect = Rect.new(0, 0, 0, 0)
- rect.width = (contents.width + @spacing) / @column_max - @spacing
- rect.height = @item_height
- rect.x = index % @column_max * (rect.width + @spacing)
- rect.y = index / @column_max * @item_height
- return rect
- end
- end
- #==============================================================================
- # ■ Window_GALSave_Title
- #------------------------------------------------------------------------------
- # 显示读档或是存档的标题。
- #==============================================================================
- class Window_GALSave_Title < Window_Base
- #--------------------------------------------------------------------------
- # ● 初始化对像
- #--------------------------------------------------------------------------
- def initialize
- super(
- GALSave::MarginLeft,
- GALSave::MarginTop,
- (Graphics.width - GALSave::MarginLeft - GALSave::MarginRight) / 2,
- WLH + 32
- )
- self.opacity = GALSave::Opacity
- refresh
- end
- #--------------------------------------------------------------------------
- # ● 刷新
- #--------------------------------------------------------------------------
- def refresh
- self.contents.clear
- self.contents.font.color = normal_color
- self.contents.font.bold = true
- self.contents.draw_text(0, 0, 220, WLH, GALSave::ScreenTitle)
- end
- end
- #==============================================================================
- # ■ Scene_File
- #------------------------------------------------------------------------------
- # 存档画面及读档画面的类。
- #==============================================================================
- class Scene_File
- #--------------------------------------------------------------------------
- # ● 开始处理
- #--------------------------------------------------------------------------
- def start
- super
- create_menu_background
- unless GALSave::MenuBackground.nil?
- @background = Sprite.new
- @background.x, @background.y = 0, 0
- @background.bitmap = GALSave::MenuBackground
- end
- $game_galsave = Game_GALSave.new if $game_galsave.nil?
- @save_window = Window_GALSave.new
- @title_window = Window_GALSave_Title.new unless GALSave::ScreenTitle == ""
- if @saving
- @save_window.index = $game_temp.last_file_index
- else
- @save_window.index = $game_galsave.latest_file - 1
- end
- end
- #--------------------------------------------------------------------------
- # ● 刷新菜单画面背景
- #--------------------------------------------------------------------------
- def update_menu_background
- super
- return unless @from_title
- @menuback_sprite.bitmap = GALSave::LoadBackground unless GALSave::LoadBackground.nil?
- end
- #--------------------------------------------------------------------------
- # ● 结束处理
- #--------------------------------------------------------------------------
- def terminate
- super
- dispose_menu_background
- @save_window.dispose
- @title_window.dispose unless GALSave::ScreenTitle == ""
- @background.dispose unless GALSave::MenuBackground.nil?
- end
- #--------------------------------------------------------------------------
- # ● 更新画面
- #--------------------------------------------------------------------------
- def update
- super
- update_menu_background
- update_savefile_selection
- @title_window.update unless GALSave::ScreenTitle == ""
- @save_window.update
- @background.update unless GALSave::MenuBackground.nil?
- end
- #--------------------------------------------------------------------------
- # ● 刷新存档文件选项
- #--------------------------------------------------------------------------
- def update_savefile_selection
- if Input.trigger?(Input::C)
- determine_savefile
- elsif Input.trigger?(Input::X) and GALSave::AllowDelete
- determine_deletefile
- elsif Input.trigger?(Input::B)
- Sound.play_cancel
- return_scene
- end
- end
- #--------------------------------------------------------------------------
- # ● 决定存档文件
- #--------------------------------------------------------------------------
- def determine_savefile
- if @saving
- if $game_galsave.exist?(@save_window.index + 1) and GALSave::Overwrite
- Sound.play_decision
- return if !yesnobox(GALSave.string_template(GALSave::OverwritePrompt, @save_window.index + 1), *GALSave::OverwriteButton)
- end
- Sound.play_save
- do_save
- else
- if $game_galsave.exist?(@save_window.index + 1)
- Sound.play_load
- do_load
- else
- Sound.play_buzzer
- return
- end
- end
- $game_temp.last_file_index = @save_window.index
- end
- #--------------------------------------------------------------------------
- # ● 决定删除文件
- #--------------------------------------------------------------------------
- def determine_deletefile
- if $game_galsave.exist?(@save_window.index + 1)
- Sound.play_decision
- do_delete if yesnobox(GALSave.string_template(GALSave::DeletePrompt, @save_window.index + 1), *GALSave::DeleteButton)
- return
- else
- Sound.play_buzzer
- return
- end
- end
- #--------------------------------------------------------------------------
- # ● 执行删除
- #--------------------------------------------------------------------------
- def do_delete
- File.delete(GALSave.make_filename(@save_window.index + 1))
- @save_window.draw_item(@save_window.index)
- end
- #--------------------------------------------------------------------------
- # ● 执行保存
- #--------------------------------------------------------------------------
- def do_save
- file = File.open(GALSave.make_filename(@save_window.index + 1), "wb")
- write_save_data(file)
- file.close
- return_scene
- end
- #--------------------------------------------------------------------------
- # ● 执行读取
- #--------------------------------------------------------------------------
- def do_load
- file = File.open(GALSave.make_filename(@save_window.index + 1), "rb")
- read_save_data(file)
- file.close
- $scene = Scene_Map.new
- RPG::BGM.fade(1500)
- Graphics.fadeout(60)
- Graphics.wait(40)
- @last_bgm.play
- @last_bgs.play
- end
- #--------------------------------------------------------------------------
- # ● 存档数据的写入
- # file : 写入用文件对象 (已打开)
- #--------------------------------------------------------------------------
- def write_save_data(file)
- characters = []
- for actor in $game_party.members
- characters.push([actor.character_name, actor.character_index, actor.name])
- end
- $game_system.save_count += 1
- $game_system.version_id = $data_system.version_id
- @last_bgm = RPG::BGM::last
- @last_bgs = RPG::BGS::last
- Marshal.dump(characters, file)
- Marshal.dump(Graphics.frame_count, file)
- Marshal.dump(@last_bgm, file)
- Marshal.dump(@last_bgs, file)
- Marshal.dump($game_system, file)
- Marshal.dump($game_message, file)
- Marshal.dump($game_switches, file)
- Marshal.dump($game_variables, file)
- Marshal.dump($game_self_switches, 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
- #--------------------------------------------------------------------------
- # ● 确认对话框
- #--------------------------------------------------------------------------
- def yesnobox(text,yes,no)
- returnval = false
- command_window = Window_YesNoBox.new(text, yes, no)
- command_window.z = 9999
- command_window.openness = 0
- command_window.open
- for i in 0...9
- command_window.update
- Graphics.update
- end
- loop do
- command_window.update
- Graphics.update
- Input.update
- if Input.trigger?(Input::C)
- Sound.play_decision
- returnval = command_window.index == 0 ? true : false
- break
- end
- if Input.trigger?(Input::B)
- Sound.play_cancel
- returnval = false
- break
- end
- end
- command_window.close
- for i in 0...9
- command_window.update
- Graphics.update
- end
- command_window.dispose
- Graphics.update
- Input.update
- return returnval
- end
- end
- #==============================================================================
- # ■ Window_YesNoBox
- #==============================================================================
- class Window_YesNoBox < Window_Selectable
- #--------------------------------------------------------------------------
- # ● 对象初始化
- #--------------------------------------------------------------------------
- def initialize(words, yes, no)
- super((Graphics.width - 230)/2, (Graphics.height - 80)/2, 230, 80)
- self.contents.font.size = 20
- self.contents.font.color = system_color
- self.contents.draw_text(0, 0, 200, 24, words, 1)
- self.contents.font.size = 18
- self.contents.font.color = normal_color
- self.contents.draw_text(14, 24, 70, 24, yes, 1)
- self.contents.draw_text(114, 24, 70, 24, no, 1)
- @item_max = 2
- @column_max = 2
- @index = 0
- end
- #--------------------------------------------------------------------------
- # ● 帧更新
- #--------------------------------------------------------------------------
- def update
- super
- if self.visible
- if cursor_movable?
- last_index = @index
- if Input.repeat?(Input::DOWN)
- cursor_down(Input.trigger?(Input::DOWN))
- end
- if Input.repeat?(Input::UP)
- cursor_up(Input.trigger?(Input::UP))
- end
- if @index != last_index
- Sound.play_cursor
- end
- end
- update_cursor
- call_update_help
- end
- end
- #--------------------------------------------------------------------------
- # ● 选择矩形
- #--------------------------------------------------------------------------
- def item_rect(index)
- rect = Rect.new(0, 0, 0, 0)
- rect.width = (contents.width + 5) / @column_max - 5
- rect.height = WLH
- rect.x = index % @column_max * (rect.width + 5)
- rect.y = index / @column_max * WLH + 24
- return rect
- end
- end
- #==============================================================================
- # ■ 标题画面检查存档
- #==============================================================================
- class Scene_Title < Scene_Base
- def check_continue
- $game_galsave = Game_GALSave.new if $game_galsave.nil?
- @continue_enabled = $game_galsave.exist?("*")
- end
- end
复制代码 |
|