查看: 4283|回复: 2

[已经解决] 全局查找开关 全局查找命令

[复制链接]
梦石
0
星屑
12824
在线时间
1010 小时
注册时间
2019-11-5
回帖
2329

极短27参与极短25参与极短24参与

发表于 2021-6-5 22:54:03 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 哇哇哇啊叭叭 于 2021-6-6 16:56 编辑

  @管理员,可以结帖了。感谢alexncf125!rmva【地图】全局搜索(公共事件不在搜索范畴内)任意指令:
正确答案[pre lang="ruby"]#==============================================================================
# ■ Find_Command
#------------------------------------------------------------------------------
#  查找事件指令 by SailCat
#   该程序能够全局查找工程中的指定指令,方便剧情、事件debug
#   使用说明:
#     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
#     finder = Find_Command.new
#     finder.search(112)  # 查找“条件分歧”指令
#     finder.search(121, 5, 5, 1) # 查找“关闭5号开关”指令
#     finder.search(201, nil, nil, nil, nil, 2) # 查找“场所移动后角色朝下”指令
#     找到的指令FindLog.txt文件里
#     注释掉第191行及以下的语句可以屏蔽这个功能,正常测试游戏
#==============================================================================
class Find_Command
  #--------------------------------------------------------------------------
  # ● 常量
  #--------------------------------------------------------------------------
  COMMAND_CODES = {
    101 => "显示文章",
    102 => "显示选择项",
    103 => "数值输入的处理",
    104 => "更改文章选项",
    105 => "按钮输入的处理",
    106 => "等待",
    108 => "注释",
    111 => "条件分歧",
    112 => "循环",
    113 => "中断循环",
    115 => "中断事件处理",
    116 => "暂时消除事件",
    117 => "公共事件",
    118 => "标签",
    119 => "标签跳转",
    121 => "开关操作",
    122 => "变量操作",
    123 => "独立开关操作",
    124 => "计时器操作",
    125 => "增减金钱",
    126 => "增减物品",
    127 => "增减武器",
    128 => "增减防具",
    129 => "替换队员",
    131 => "更改窗口外观",
    132 => "更改战斗 BGM",
    133 => "更改战斗结束 ME",
    134 => "更改禁止存档",
    135 => "更改禁止菜单",
    136 => "更改禁止遇敌",
    201 => "场所移动",
    202 => "设置事件位置",
    203 => "画面卷动",
    204 => "更改地图设置",
    205 => "更改雾的色调",
    206 => "更改雾的不透明度",
    207 => "显示动画",
    208 => "更改透明状态",
    209 => "设置移动路线",
    210 => "等待移动结束",
    221 => "准备渐变",
    222 => "执行渐变",
    223 => "更改画面色调",
    224 => "画面闪烁",
    225 => "画面震动",
    231 => "显示图片",
    232 => "移动图片",
    233 => "旋转图片",
    234 => "更改图片色调",
    235 => "图片消失",
    236 => "天气设置",
    241 => "演奏 BGM",
    242 => "淡出 BGM",
    245 => "演奏 BGS",
    246 => "淡出 BGS",
    247 => "记忆 BGM / BGS",
    248 => "还原 BGM / BGS",
    249 => "演奏 ME",
    250 => "演奏 SE",
    251 => "停止 SE",
    301 => "战斗处理",
    302 => "商店处理",
    303 => "名称输入处理",
    311 => "增减 HP",
    312 => "增减 SP",
    313 => "更改状态",
    314 => "完全回复",
    315 => "增减 EXP",
    316 => "增减等级",
    317 => "增减能力值",
    318 => "增减特技",
    319 => "变更装备",
    320 => "更改角色姓名",
    321 => "更改角色职业",
    322 => "更改角色图形",
    331 => "增减敌人 HP",
    332 => "增减敌人 SP",
    333 => "更改敌人状态",
    334 => "敌人出现",
    335 => "敌人变身",
    336 => "敌人完全回复",
    337 => "显示动画",
    338 => "伤害处理",
    339 => "强制行动",
    340 => "战斗中断",
    351 => "呼叫菜单画面",
    352 => "呼叫存档画面",
    353 => "游戏结束",
    354 => "返回标题画面",
    355 => "脚本"
  }
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  def initialize
    # 删除前次导出的文件
    if FileTest.exist?("FindLog.txt")
      File.delete("FindLog.txt")
    end
    @map_infos = load_data("Data/MapInfos.rvdata2")
  end
  #--------------------------------------------------------------------------
  # ● 执行查找指令
  #     command_code: 指令的名称
  #     parameters: 指令的参数
  #--------------------------------------------------------------------------
  def search(command_code, *parameters)
    File.open("FindLog.txt", "a") do |f|
      for map_id in 1..999
        map_name = sprintf("Data/Map%03d.rvdata2", map_id)
        if FileTest.exist?(map_name)
          # 载入当前地图
          f.write("-----------------------------------------------------\n")
          f.write(sprintf(" ■ Map: %d (%s)\n", map_id,
            @map_infos[map_id].name.split(/\|/)[0]))
          f.write("-----------------------------------------------------\n")
          map = load_data(map_name)
          # 循环地图中所有事件
          for i in 1..999
            event = map.events
            if event != nil
              t = false
              # 循环事件的每一页
              event.pages.each do |page|
                # 如果指令不为空
                if page.list.length > 0
                  # 循环页的所有指令
                  page.list.each do |command|
                    # 如果指令名称匹配
                    if command_code == command.code
                      matched = true
                      # 逐个检查参数
                      para_size = [parameters.size, command.parameters.size].min
                      for j in 0...para_size
                        if parameters[j] != nil and parameters[j] != command.parameters[j]
                          matched = false
                          break
                        end
                      end
                      # 匹配的情况下
                      if matched
                        # 输出事件提示字样
                        if !t
                          f.write(sprintf(" ⚪ Event %d: %s (%03d, %03d)\n",
                          event.id, event.name, event.x, event.y))
                          f.write("-----------------------------------------------------\n")
                          t = true
                        end
                        # 输出指令内容
                        f.write(COMMAND_CODES[command_code] + ": ")
                        for k in 0...command.parameters.size
                          f.write(command.parameters[k])
                          f.write(", ") if k < command.parameters.size - 1
                        end
                        f.write("\n")
                      end
                    end
                  end
                end
              end
              # 结束输出指令内容
              if t
                f.write("-----------------------------------------------------\n")
              end
            end
          end
        end
      end
    end
  end
end
finder = Find_Command.new
finder.search(121, 3, 3, 1)
exit[/pre]



原帖:
  地图巨多,事件复杂。如何在工程里,找到某开关在哪个事件的哪个标签页里被操作过呢?


附:
  https://rpg.blue/thread-402327-1-1.html
  这个需要把所有地图都跑一遍,显然很不现实

  https://rpg.blue/forum.php?mod=viewthread&tid=234460
  这个帖子是xp的,但就算改成VA的,且没报错,也无法正确显示开关在哪。排错也无从找起(也可能是没改对?)
错误代码
[pre lang="ruby"]#==============================================================================
# ■ Find_Command
#------------------------------------------------------------------------------
#  查找事件指令 by SailCat
#   该程序能够全局查找工程中的指定指令,方便剧情、事件debug
#   使用说明:
#     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
#     finder = Find_Command.new
#     finder.search(112)  # 查找“条件分歧”指令
#     finder.search(121, 5, 5, 1) # 查找“关闭5号开关”指令
#     finder.search(201, nil, nil, nil, nil, 2) # 查找“场所移动后角色朝下”指令
#     找到的指令FindLog.txt文件里
#     注释掉第191行及以下的语句可以屏蔽这个功能,正常测试游戏
#==============================================================================
class Find_Command
  #--------------------------------------------------------------------------
  # ● 常量
  #--------------------------------------------------------------------------
  COMMAND_CODES = {
    101 => "显示文章",
    102 => "显示选择项",
    103 => "数值输入的处理",
    104 => "更改文章选项",
    105 => "按钮输入的处理",
    106 => "等待",
    108 => "注释",
    111 => "条件分歧",
    112 => "循环",
    113 => "中断循环",
    115 => "中断事件处理",
    116 => "暂时消除事件",
    117 => "公共事件",
    118 => "标签",
    119 => "标签跳转",
    121 => "开关操作",
    122 => "变量操作",
    123 => "独立开关操作",
    124 => "计时器操作",
    125 => "增减金钱",
    126 => "增减物品",
    127 => "增减武器",
    128 => "增减防具",
    129 => "替换队员",
    131 => "更改窗口外观",
    132 => "更改战斗 BGM",
    133 => "更改战斗结束 ME",
    134 => "更改禁止存档",
    135 => "更改禁止菜单",
    136 => "更改禁止遇敌",
    201 => "场所移动",
    202 => "设置事件位置",
    203 => "画面卷动",
    204 => "更改地图设置",
    205 => "更改雾的色调",
    206 => "更改雾的不透明度",
    207 => "显示动画",
    208 => "更改透明状态",
    209 => "设置移动路线",
    210 => "等待移动结束",
    221 => "准备渐变",
    222 => "执行渐变",
    223 => "更改画面色调",
    224 => "画面闪烁",
    225 => "画面震动",
    231 => "显示图片",
    232 => "移动图片",
    233 => "旋转图片",
    234 => "更改图片色调",
    235 => "图片消失",
    236 => "天气设置",
    241 => "演奏 BGM",
    242 => "淡出 BGM",
    245 => "演奏 BGS",
    246 => "淡出 BGS",
    247 => "记忆 BGM / BGS",
    248 => "还原 BGM / BGS",
    249 => "演奏 ME",
    250 => "演奏 SE",
    251 => "停止 SE",
    301 => "战斗处理",
    302 => "商店处理",
    303 => "名称输入处理",
    311 => "增减 HP",
    312 => "增减 SP",
    313 => "更改状态",
    314 => "完全回复",
    315 => "增减 EXP",
    316 => "增减等级",
    317 => "增减能力值",
    318 => "增减特技",
    319 => "变更装备",
    320 => "更改角色姓名",
    321 => "更改角色职业",
    322 => "更改角色图形",
    331 => "增减敌人 HP",
    332 => "增减敌人 SP",
    333 => "更改敌人状态",
    334 => "敌人出现",
    335 => "敌人变身",
    336 => "敌人完全回复",
    337 => "显示动画",
    338 => "伤害处理",
    339 => "强制行动",
    340 => "战斗中断",
    351 => "呼叫菜单画面",
    352 => "呼叫存档画面",
    353 => "游戏结束",
    354 => "返回标题画面",
    355 => "脚本"
  }
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  def initialize
    # 删除前次导出的文件
    if FileTest.exist?("FindLog.txt")
      File.delete("FindLog.txt")
    end
    @map_infos = load_data("Data/MapInfos.rvdata2")
  end
  #--------------------------------------------------------------------------
  # ● 执行查找指令
  #     command_code: 指令的名称
  #     parameters: 指令的参数
  #--------------------------------------------------------------------------
  def search(command_code, *parameters)
    File.open("FindLog.txt", "a") do |f|
      for map_id in 1..999
        map_name = sprintf("Data/Map%03d.rxdata", map_id)
        if FileTest.exist?(map_name)
          # 载入当前地图
          f.write("-----------------------------------------------------\n")
          f.write(sprintf(" ■ Map: %d (%s)\n", map_id,
            @map_infos[map_id].name.split(/\|/)[0]))
          f.write("-----------------------------------------------------\n")
          map = load_data(map_name)
          # 循环地图中所有事件
          for i in 1..999
            event = map.events
            if event != nil
              t = false
              # 循环事件的每一页
              event.pages.each do |page|
                # 如果指令不为空
                if page.list.length > 0
                  # 循环页的所有指令
                  page.list.each do |command|
                    # 如果指令名称匹配
                    if command_code == command.code
                      matched = true
                      # 逐个检查参数
                      para_size = [parameters.size, command.parameters.size].min
                      for j in 0...para_size
                        if parameters[j] != nil and parameters[j] != command.parameters[j]
                          matched = false
                          break
                        end
                      end
                      # 匹配的情况下
                      if matched
                        # 输出事件提示字样
                        if !t
                          f.write(sprintf(" ⚪ Event %d: %s (%03d, %03d)\n",
                          event.id, event.name, event.x, event.y))
                          f.write("-----------------------------------------------------\n")
                          t = true
                        end
                        # 输出指令内容
                        f.write(COMMAND_CODES[command_code] + ": ")
                        for k in 0...command.parameters.size
                          f.write(command.parameters[k])
                          f.write(", ") if k < command.parameters.size - 1
                        end
                        f.write("\n")
                      end
                    end
                  end
                end
              end
              # 结束输出指令内容
              if t
                f.write("-----------------------------------------------------\n")
              end
            end
          end
        end
      end
    end
  end
end
finder = Find_Command.new
finder.search(112)
exit[/pre]
风继续吹,不忍远离。年少轻狂,眼神明亮,最好的年纪,最好的时光。希望岁月是一场春梦
梦石
0
星屑
29901
在线时间
5734 小时
注册时间
2016-3-8
回帖
1653
发表于 2021-6-5 23:37:17 | 显示全部楼层
如果你认为你发的这段脚本是改好的的版本的话
那很遗憾地知会你, 就是没改对

129行rxdata得改成rvdata2

192行finder.search(112)得改成
finder.search(121, 开关ID, 开关ID, 0)
finder.search(121, 开关ID, 开关ID, 1)

点评

跪谢!之前改过rxdata,幸因为报错。后来没报错,基础差加上粗心...  发表于 2021-6-6 21:37

评分

参与人数 1赞 +1 收起 理由
哇哇哇啊叭叭 + 1 问题解决

查看全部评分

回复 1 0

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部