仿 大航海时代 公正存档
========================================================================================
●仿 大航海时代 公正存档●
============================================
============================================
说明:
1、公正存档的作用是控制使用者无法使用S\L大
法,即保存为公正存档后必须退出游戏,退出游
戏前必须保存公正存档。如果游戏结束则自动取
消公正存档记号。
2、该脚本修改了exit方法,所以右上角的红色退
出按钮作用被修改。在以下场景且为公正进
度的存档点击该按钮会提示是否保存。
Map Menu
3、在游戏中如果像判定是否是公正存档请使用以
下脚本:$game_system.fair == -1
具体请参考范例中的艾斯迪儿事件
4、范例中1号存档是公正存档,2号存档是非公正
存档。
============================================
作用:
可以限制游戏者不得通过回档来作弊,对于公正
存档的玩家,可以有隐藏结局等奖励,具体请参
考大航海时代4+
============================================
范例下载:右击 目标另存为下载
紧急差错:349行出错,请修改为 if $scene.is_a?(Scene_Map) || $scene.is_a?(Scene_Menu)
脚本内容#==============================================================================# ■ Scene_SaveE#------------------------------------------------------------------------------# 处理存档画面的类。#==============================================================================class Scene_SaveE < Scene_File#--------------------------------------------------------------------------# ● 初始化对像#--------------------------------------------------------------------------def initialize(mode = 0) super("要保存到这个文件吗?") @mode = modeend#--------------------------------------------------------------------------# ● 确定时的处理#--------------------------------------------------------------------------def on_decision(filename) # 演奏存档 SE $game_system.se_play($data_system.save_se) if @choose_window.active || $game_system.fair == 0 @choose_window.active = false @choose_window.visible = false if @choose_window.index == 0 && $game_system.fair == -1 $game_system.fair = 1 else $game_system.fair = 0 end # 写入存档数据 file = File.open(filename, "wb") write_save_data(file) file.close $scene = nil if @mode == 0 $scene = Scene_Title.new if @mode == 1 else @help_window.set_text("是否存储为公正存档?") @choose_window.active = true @choose_window.visible = true endend#--------------------------------------------------------------------------# ● 取消时的处理#--------------------------------------------------------------------------def on_cancel # 演奏取消 SE unless @choose_window.active $game_system.se_play($data_system.cancel_se) $scene = Scene_Exit.new else @choose_window.active = false @choose_window.visible = false @help_window.set_text("要保存到这个文件吗?") endend#--------------------------------------------------------------------------# ● 写入存档数据# file : 写入用文件对像 (已经打开)#--------------------------------------------------------------------------def write_save_data(file) # 生成描绘存档文件用的角色图形 characters = [] for i in 0...$game_party.actors.size actor = $game_party.actors characters.push() 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)endendclass Game_System#attr:save_id,trueattr:fair,truealias ini initializedef initialize #@save_id = 0 @fair = -1 iniendendclass Window_SaveFile < Window_Basedef refresh self.contents.clear # 描绘文件编号 self.contents.font.color = normal_color name = "文件 #{@file_index + 1}" self.contents.draw_text(4, 0, 600, 32, name) @name_width = contents.text_size(name).width # 存档文件存在的情况下 if @file_exist # 描绘角色 for i in ] bitmap = RPG::Cache.character(@characters, @characters) cw = bitmap.rect.width / 4 ch = bitmap.rect.height / 4 src_rect = Rect.new(0, 0, cw, ch) x = 300 - @characters.size * 32 + i * 64 - cw / 2 self.contents.blt(x, 68 - ch, bitmap, src_rect) end # 描绘游戏时间 hour = @total_sec / 60 / 60 min = @total_sec / 60 % 60 sec = @total_sec % 60 time_string = sprintf("%02d:%02d:%02d", hour, min, sec) self.contents.font.color = normal_color self.contents.draw_text(4, 8, 600, 32, time_string, 2) # 描绘时间标记 self.contents.font.color = normal_color time_string = @time_stamp.strftime("%Y/%m/%d %H:%M") self.contents.draw_text(4, 40, 600, 32, time_string, 2) if @game_system.fair == 1 self.contents.font.color = system_color self.contents.draw_text(4, 8, 600-24*4, 32, "公正进度",2) end endendendclass Scene_Load < Scene_Filealias od on_decisiondef on_decision(filename) od(filename)# $game_system.save_id = filename $game_system.fair = 0 if $game_system.fair == -1 $game_system.fair = -1 if $game_system.fair == 1 file = File.open(filename, "wb") if FileTest.exist?(filename) write_save_data(file) if FileTest.exist?(filename) file.close if FileTest.exist?(filename)endendclass Scene_Save < Scene_File def on_decision(filename) # 演奏存档 SE $game_system.se_play($data_system.save_se) if @choose_window.active || $game_system.fair == 0 @choose_window.active = false @choose_window.visible = false if @choose_window.index == 0 && $game_system.fair != 0 $game_system.fair = 1 else $game_system.fair = 0 end # 写入存档数据 file = File.open(filename, "wb") write_save_data(file) file.close # 如果被事件调用 # 切换到菜单画面 if $game_system.fair == 0 if $game_temp.save_calling # 清除存档调用标志 $game_temp.save_calling = false # 切换到地图画面 $scene = Scene_Map.new return end $scene = Scene_Menu.new(4) else $scene = nil end else @help_window.set_text("是否存储为公正存档?") @choose_window.active = true @choose_window.visible = true endend#--------------------------------------------------------------------------# ● 取消时的处理#--------------------------------------------------------------------------def on_cancel # 演奏取消 SE unless @choose_window.active $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_Menu.new(4) else @choose_window.active = false @choose_window.visible = false @help_window.set_text("要保存到这个文件吗?") endendendclass Scene_Filealias m maindef main @choose_window = Window_Command.new(64,["是","否"]) @choose_window.x=640-64 @choose_window.y = 32 @choose_window.z = 9999 @choose_window.active = false @choose_window.visible = false m @choose_window.disposeend def update # 刷新窗口 @choose_window.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) && !@choose_window.active # 方向键下的按下状态不是重复的情况下、 # 并且光标的位置在 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) && !@choose_window.active # 方向键上的按下状态不是重复的情况下、 # 并且光标的位置在 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 endendenddef write_save_data(file) # 生成描绘存档文件用的角色图形 characters = [] for i in 0...$game_party.actors.size actor = $game_party.actors characters.push() 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)endclass Scene_Exitdef initialize(mode = 0) @mode = modeenddef main @help_window = Window_Base.new(0,240-32,640,64) @help_window.contents = Bitmap.new(640 - 32, 32) @help_window.contents.draw_text(0,0,640-32,32,"如果现在保存此进度将成为公正进度,是否保存?",1) @choose_window = Window_Command.new(64,["是","否"]) @choose_window.x = 320-32 @choose_window.y = 320 @choose_window.active = true # 执行过渡 Graphics.transition # 主循环 loop do # 刷新游戏画面 Graphics.update # 刷新输入信息 Input.update # 刷新画面 update # 如果画面切换的话就中断循环 if $scene != self break end end # 准备过渡 Graphics.freeze # 释放窗口 @help_window.dispose @choose_window.disposeenddef update @choose_window.update if Input.trigger?(Input::C) $game_system.se_play($data_system.decision_se) if @choose_window.index == 0 $scene = Scene_SaveE.new(@mode) else $scene = nil if @mode == 0 $scene = Scene_Title.new if @mode == 1 end endendenddef exit(value)if $scene.is_a?(Scene_Map) || $scene.is_a?(Scene_Menu) $scene = Scene_Exit.newelse $scene = nilendendclass Scene_Endalias tt command_to_titledef command_to_title if $game_system.fair == -1 $scene = Scene_Exit.new(1) else tt endendalias s command_shutdowndef command_shutdown if $game_system.fair == -1 $scene = Scene_Exit.new else s endendend复制代码
http://tinyurl.com/2dywoqz
http://tinyurl.com/27gpv3w
http://tinyurl.com/2b3ryqe
本帖来自P1论坛作者上帝的眼睛,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=139244若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]