扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 119|回复: 0

[转载发布] 仿 大航海时代 公正存档

[复制链接]
累计送礼:
0 个
累计收礼:
0 个
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 114 天

    连续签到: 4 天

    [LV.6]常住居民II

    2338

    主题

    403

    回帖

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    6
    卡币
    10607
    OK点
    16
    推广点
    0
    同能卷
    0
    积分
    13376

    灌水之王

    发表于 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)
    脚本内容
    1. #==============================================================================# ■ Scene_SaveE#------------------------------------------------------------------------------#  处理存档画面的类。#==============================================================================class Scene_SaveE < Scene_File  #--------------------------------------------------------------------------  # ● 初始化对像  #--------------------------------------------------------------------------  def initialize(mode = 0)    super("要保存到这个文件吗?")    @mode = mode  end  #--------------------------------------------------------------------------  # ● 确定时的处理  #--------------------------------------------------------------------------  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    end  end  #--------------------------------------------------------------------------  # ● 取消时的处理  #--------------------------------------------------------------------------  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("要保存到这个文件吗?")    end  end  #--------------------------------------------------------------------------  # ● 写入存档数据  #     file : 写入用文件对像 (已经打开)  #--------------------------------------------------------------------------  def write_save_data(file)    # 生成描绘存档文件用的角色图形    characters = []    for i in 0...$game_party.actors.size      actor = $game_party.actors[i]      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)  endendclass Game_System  #attr  :save_id,true  attr  :fair,true  alias ini initialize  def initialize    #@save_id = 0    @fair = -1    ini  endendclass Window_SaveFile < Window_Base  def 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 [url=mailto:[email protected]][email protected][/url]        bitmap = RPG::Cache.character(@characters[i][0], @characters[i][1])        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    end  endendclass Scene_Load < Scene_File  alias od on_decision  def 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    end  end  #--------------------------------------------------------------------------  # ● 取消时的处理  #--------------------------------------------------------------------------  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("要保存到这个文件吗?")    end  endendclass Scene_File  alias m main  def 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.dispose  end    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    end  endend  def write_save_data(file)    # 生成描绘存档文件用的角色图形    characters = []    for i in 0...$game_party.actors.size      actor = $game_party.actors[i]      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)  endclass Scene_Exit  def initialize(mode = 0)    @mode = mode  end  def 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.dispose  end  def 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    end  endenddef exit(value)  if $scene.is_a?(Scene_Map) || $scene.is_a?(Scene_Menu)    $scene = Scene_Exit.new  else    $scene = nil  endendclass Scene_End  alias tt command_to_title  def command_to_title    if $game_system.fair == -1      $scene = Scene_Exit.new(1)    else      tt    end  end  alias s command_shutdown  def command_shutdown    if $game_system.fair == -1      $scene = Scene_Exit.new    else      s    end  endend复制代码
    复制代码




                 本帖来自P1论坛作者上帝的眼睛,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=139244  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2025-3-14 23:12 , Processed in 0.068281 second(s), 55 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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