じ☆ve冰风 发表于 2024-4-19 17:26:59

仿 大航海时代 公正存档

============================================
============================================
●仿 大航海时代 公正存档●
============================================
============================================
说明:
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]
查看完整版本: 仿 大航海时代 公正存档