设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 12243|回复: 9
打印 上一主题 下一主题

[已发主站] [猫儿工具箱系列第五弹]在工程中任意查找事件指令

[复制链接]

Lv2.观梦者

梦石
0
星屑
260
在线时间
26 小时
注册时间
2019-6-11
帖子
7
1
发表于 2019-7-14 22:25:13 | 显示全部楼层
本帖最后由 ufo1cn 于 2019-7-15 21:25 编辑
SailCat 发表于 2012-6-3 01:42
应大家要求,主帧添加了查找调用的具体方式
前4弹都发在本版,需要的童鞋请自行脑补下载地址 ...


这个脚本很方便,我再加上在公共事件中查找的功能吧, 明天有空再改进下,输出搜索结果根据MapInfos.rxdata和所在地图ID输出所在地图树.
希望可以有人改成独立的小工具,能从列表选参数就方便了。

已经加上输出事件所在地图树,方便地图太多时定位地图

RUBY 代码复制
  1. #==============================================================================
  2. # ■ Find_Command
  3. #------------------------------------------------------------------------------
  4. #  查找事件指令 by SailCat
  5. #   该程序能够全局查找工程中的指定指令,方便剧情、事件debug
  6. #   使用说明:
  7. #     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
  8. #     finder = Find_Command.new
  9. #     finder.search(112)  # 查找“条件分歧”指令
  10. #     finder.search(121, 5, 5, 1) # 查找“关闭5号开关”指令
  11. #     finder.search(201, nil, nil, nil, nil, 2) # 查找“场所移动后角色朝下”指令
  12. #     找到的指令输出到FindLog.txt文件里
  13. #     具体参数见脚本尾部。
  14. #==============================================================================
  15.  
  16. class Find_Command
  17.   #--------------------------------------------------------------------------
  18.   # ● 常量
  19.   #--------------------------------------------------------------------------
  20.   COMMAND_CODES = {
  21.     101 => "显示文章",
  22.     102 => "显示选择项",
  23.     103 => "数值输入的处理",
  24.     104 => "更改文章选项",
  25.     105 => "按钮输入的处理",
  26.     106 => "等待",
  27.     108 => "注释",
  28.     111 => "条件分歧",
  29.     112 => "循环",
  30.     113 => "中断循环",
  31.     115 => "中断事件处理",
  32.     116 => "暂时消除事件",
  33.     117 => "公共事件",
  34.     118 => "标签",
  35.     119 => "标签跳转",
  36.     121 => "开关操作",
  37.     122 => "变量操作",
  38.     123 => "独立开关操作",
  39.     124 => "计时器操作",
  40.     125 => "增减金钱",
  41.     126 => "增减物品",
  42.     127 => "增减武器",
  43.     128 => "增减防具",
  44.     129 => "替换队员",
  45.     131 => "更改窗口外观",
  46.     132 => "更改战斗 BGM",
  47.     133 => "更改战斗结束 ME",
  48.     134 => "更改禁止存档",
  49.     135 => "更改禁止菜单",
  50.     136 => "更改禁止遇敌",
  51.     201 => "场所移动",
  52.     202 => "设置事件位置",
  53.     203 => "画面卷动",
  54.     204 => "更改地图设置",
  55.     205 => "更改雾的色调",
  56.     206 => "更改雾的不透明度",
  57.     207 => "显示动画",
  58.     208 => "更改透明状态",
  59.     209 => "设置移动路线",
  60.     210 => "等待移动结束",
  61.     221 => "准备渐变",
  62.     222 => "执行渐变",
  63.     223 => "更改画面色调",
  64.     224 => "画面闪烁",
  65.     225 => "画面震动",
  66.     231 => "显示图片",
  67.     232 => "移动图片",
  68.     233 => "旋转图片",
  69.     234 => "更改图片色调",
  70.     235 => "图片消失",
  71.     236 => "天气设置",
  72.     241 => "演奏 BGM",
  73.     242 => "淡出 BGM",
  74.     245 => "演奏 BGS",
  75.     246 => "淡出 BGS",
  76.     247 => "记忆 BGM / BGS",
  77.     248 => "还原 BGM / BGS",
  78.     249 => "演奏 ME",
  79.     250 => "演奏 SE",
  80.     251 => "停止 SE",
  81.     301 => "战斗处理",
  82.     302 => "商店处理",
  83.     303 => "名称输入处理",
  84.     311 => "增减 HP",
  85.     312 => "增减 SP",
  86.     313 => "更改状态",
  87.     314 => "完全回复",
  88.     315 => "增减 EXP",
  89.     316 => "增减等级",
  90.     317 => "增减能力值",
  91.     318 => "增减特技",
  92.     319 => "变更装备",
  93.     320 => "更改角色姓名",
  94.     321 => "更改角色职业",
  95.     322 => "更改角色图形",
  96.     331 => "增减敌人 HP",
  97.     332 => "增减敌人 SP",
  98.     333 => "更改敌人状态",
  99.     334 => "敌人出现",
  100.     335 => "敌人变身",
  101.     336 => "敌人完全回复",
  102.     337 => "显示动画",
  103.     338 => "伤害处理",
  104.     339 => "强制行动",
  105.     340 => "战斗中断",
  106.     351 => "呼叫菜单画面",
  107.     352 => "呼叫存档画面",
  108.     353 => "游戏结束",
  109.     354 => "返回标题画面",
  110.     355 => "脚本"
  111.   }
  112.  
  113.  
  114.  
  115.  
  116.  
  117.  
  118.   #--------------------------------------------------------------------------
  119.   # ● 初期化
  120.   #--------------------------------------------------------------------------
  121.   def initialize
  122.     # 删除前次导出的文件
  123.     if FileTest.exist?("FindLog.txt")
  124.       File.delete("FindLog.txt")
  125.     end
  126.     @map_infos = load_data("Data/MapInfos.rxdata")
  127.   end
  128.  
  129.  
  130.   def printMapTree(f,map_id)
  131.  
  132.         #f.write(sprintf(" ■ Map: %d (%s)", map_id,
  133.     #@map_infos[map_id].name.split(/\|/)[0]))
  134.         #map_id = @map_infos[map_id].parent_id
  135.         #if map_id == 0
  136.         #return
  137.         #else
  138.     #f.write("-->")
  139.     #printMapTree(f,map_id)
  140.         #end
  141.  
  142.  
  143.     while map_id!=0
  144.  
  145.     f.write(sprintf(" ■ Map: %d (%s)", map_id,
  146.     @map_infos[map_id].name.split(/\|/)[0]))
  147.           map_id = @map_infos[map_id].parent_id
  148.           if map_id!=0
  149.       f.write("-->")
  150.       end
  151.  
  152.     end
  153.     f.write("\n")
  154.  
  155. end
  156.  
  157.   #--------------------------------------------------------------------------
  158.   # ● 执行查找指令
  159.   #     command_code: 指令的名称
  160.   #     parameters: 指令的参数
  161.   #--------------------------------------------------------------------------
  162.   def search(command_code, *parameters)
  163.     File.open("FindLog.txt", "a") do |f|
  164.  
  165.  
  166.         #----------------------------start common event------------------------------
  167.       common_events_name = "Data/CommonEvents.rxdata"
  168.      if FileTest.exist?(common_events_name)                                                                       
  169.       # 载入当前地图
  170.       f.write("-----------------------------------------------------\n")
  171.       f.write(" CommonEvents\n")
  172.       f.write("-----------------------------------------------------\n")
  173.       common_events = load_data(common_events_name)
  174.           #for i in 1..999                                                                                                         
  175.           #common_event = common_events[i]
  176.          # i = 1
  177.          common_events.each do |common_event|
  178.           if  common_event != nil     #1-1-1(3)
  179.  
  180.                    #    f.write(sprintf("CommonEvent ID: %d: %s[触发:%d,条件开关ID:%d]\n",
  181.        #     common_event.id, common_event.name,common_event.trigger,common_event.switch_id))  
  182.  
  183.             t = false
  184.                  event_list = common_event.list   
  185.                  #如果指令列表不为空
  186.                   if  event_list.length > 0                                                                                 
  187.                        line = 0
  188.                    # 循环事件的所有指令
  189.                    event_list.each do |command|                                                                  
  190.                     # 如果指令名称匹配
  191.                        if command_code == command.code                                                      
  192.                        matched = true
  193.                        # 逐个检查参数
  194.                        para_size = [parameters.size, command.parameters.size].min
  195.                        for j in 0...para_size                                                                                   
  196.                         if parameters[j] != nil and parameters[j] != command.parameters[j]           
  197.                           matched = false
  198.                           break
  199.                         end                                                                                                        
  200.                       end   
  201.  
  202.  
  203.  
  204.                         # 匹配的情况下
  205.                         if matched                                                                                                           
  206.                           # 输出事件提示字样
  207.                           if !t                                                                                                     
  208.                         #  f.write(sprintf(" CommonEvent %d: %s (line:%03d/%03d)\n",
  209.                         #  common_event.id, common_event.name, line,event_list.length))
  210.                           f.write(sprintf("CommonEvent ID: %d: %s[触发:%d,条件开关ID:%d]\n",
  211.                           common_event.id, common_event.name,common_event.trigger,common_event.switch_id))  
  212.  
  213.                           f.write("-----------------------------------------------------\n")
  214.                           t = true
  215.                           end                                                                                                                                                               
  216.                          # 输出指令内容
  217.                           f.write(sprintf("line:(%04d)/length:%04d) ",line,event_list.length))
  218.                           f.write(COMMAND_CODES[command_code] + ": ")
  219.                           for k in 0...command.parameters.size                                                        
  220.                           f.write(command.parameters[k])
  221.                           f.write(", ") if k < command.parameters.size - 1
  222.                           end                                                                                                         
  223.                           f.write("\n")
  224.                         end #0-0-0-0-0-0-0-0(7)                                                                                                                 
  225.                         end                                                                                                            
  226.                         line += 1                                                  
  227.                   end                                                                                                            
  228.                 end                                                                                                                  
  229.               end                                                                                                                          
  230.        # 结束输出指令内容
  231.               if t                                                                                                                        
  232.                 f.write("-----------------------------------------------------\n")
  233.               end
  234.             end
  235.           end
  236.         f.write(" CommonEvents End\n")
  237.             f.write("-----------------------------------------------------\n")
  238.  
  239.         #----------------------------end common event------------------------------   
  240.        f.write(" Map Event\n")   
  241.        f.write("-----------------------------------------------------\n")
  242.            for map_id in 1..999
  243.         map_name = sprintf("Data/Map%03d.rxdata", map_id)
  244.         if FileTest.exist?(map_name)
  245.           # 载入当前地图
  246.           #f.write("-----------------------------------------------------\n")
  247.           #f.write(sprintf(" ■ Map: %d (%s)\n", map_id,
  248.           #  @map_infos[map_id].name.split(/\|/)[0]))
  249.           #f.write("-----------------------------------------------------\n")
  250.           map = load_data(map_name)
  251.                   mt  = false
  252.           # 循环地图中所有事件
  253.           for i in 1..999
  254.             event = map.events[i]
  255.             if event != nil
  256.               t = false
  257.               # 循环事件的每一页
  258.               event.pages.each do |page|
  259.                 # 如果指令不为空
  260.                 if page.list.length > 0
  261.                   # 循环页的所有指令
  262.                   page.list.each do |command|
  263.                     # 如果指令名称匹配
  264.                     if command_code == command.code
  265.                       matched = true
  266.                       # 逐个检查参数
  267.                       para_size = [parameters.size, command.parameters.size].min
  268.                       for j in 0...para_size
  269.                         if parameters[j] != nil and parameters[j] != command.parameters[j]
  270.                           matched = false
  271.                           break
  272.                         end
  273.                       end
  274.                       # 匹配的情况下
  275.                       if matched
  276.                         # 输出事件提示字样
  277.                         if !t
  278.                                if !mt
  279.                                #f.write("----MapTree------------------------------------------------\n")
  280.                                            printMapTree(f,map_id)
  281.                                #f.write("\n----MapTree End------------------------------------------------\n")
  282.                                            mt = true;
  283.                                        end
  284.                                                 f.write(sprintf(" □ Event %d: %s (%03d, %03d)\n",
  285.                           event.id, event.name, event.x, event.y))
  286.                           f.write("-----------------------------------------------------\n")
  287.                           t = true
  288.                         end
  289.                         # 输出指令内容
  290.                         f.write(COMMAND_CODES[command_code] + ": ")
  291.                         for k in 0...command.parameters.size
  292.                           f.write(command.parameters[k])
  293.                           f.write(", ") if k < command.parameters.size - 1
  294.                         end
  295.                         f.write("\n")
  296.                       end
  297.                     end
  298.                   end
  299.                 end
  300.               end
  301.               # 结束输出指令内容
  302.               if t
  303.                 f.write("-----------------------------------------------------\n")
  304.               end
  305.             end
  306.           end
  307.         end
  308.       end
  309.  
  310.         f.write(" Map Event End\n")   
  311.     f.write("-----------------------------------------------------\n")
  312.  
  313.  
  314.  
  315.     end
  316.  
  317.  
  318.  
  319.   end
  320. end
  321.  
  322.  
  323. #所有参数的指定,以下给出完整(可带参数查询)的参数表,没给出的说明不能带参数查询
  324. #1)在最后一个指定参数之后的参数,如果不限制,可以省略
  325. #2)在最后一个指定参数之前的参数,如果不限制,写成nil
  326. # 显示文章: finder.search(101, 文章文本字符串) (注:暂只支持第1行文本)
  327. # 显示选择项: finder.search(102, [选择项1, 选择项2, 选择项3, 选择项4], 取消的返回值)
  328. # 数值输入的处理: finder.search(103, 变量id, 位数)
  329. # 更改文章选项: finder.search(104, 位置上0/中1/下2,显示外框0/不显示外框1)
  330. # 按钮输入的处理: finder.search(105, 变量id)
  331. # 等待: finder.search(106, 帧数)
  332. # 注释: finder.search(108, 注释文本字符串) (注:暂只支持第1行文本)
  333. # 条件分歧: finder.search(111, 条件类别0-12, 条件参数1,条件参数2,...)
  334. # 开关: finder.search(111, 0, 开关id, 开0/关1)
  335. # 变量: finder.search(111, 1, 变量id, 常量比较0/变量比较1, 对像值(或对像变量id), 相等0/以上1/以下2/大于3/小于4/不等5)
  336. # 独立开关: finder.search(111, 2, 独立开关编号A-D, 开0/关1)
  337. # 计时: finder.search(111, 3, 时间, 以上0/以下1)
  338. # 角色: finder.search(111, 4, 角色id, 同伴0/名称1/特技2/武器3/防具4/状态5, 比较的名称/特技id/武器id/防具id/状态id)
  339. # 敌人: finder.search(111, 5, 敌人id, 出现0/状态1, 比较的状态id)
  340. # 事件: finder.search(111, 6, 事件id/角色-1/本事件0, 朝向上8/左4/右6/下2)
  341. # 钱: finder.search(111, 7, 钱数, 以上0/以下1)
  342. # 物品: finder.search(111, 8, 物品id)
  343. # 武器: finder.search(111, 9, 武器id)
  344. # 防具: finder.search(111, 10, 防具id)
  345. # 按钮: finder.search(111, 11, 按钮id(Input::A/B/C/X/Y/Z/L/R))
  346. # 脚本: finder.search(111, 12, 脚本内容字符串)
  347. # 公共事件: finder.search(117, 公共事件id)
  348. # 标签: finder.search(118, 标签名字符串)
  349. # 标签跳转: finder.search(119, 标签名字符串)
  350. # 开关操作: finder.search(121, 起始开关id, 结束开关id, 开0/关1)(如单个操作则起始开关id=结束开关id)
  351. # 变量操作: finder.search(122, 起始变量id, 结束变量id, 代入0/加法1/减法2/乘法3/除法4/剩余5, 操作值类别0-7, 操作值1, 操作值2)(如单个操作则起始变量id=结束变量id)
  352. # 常量: 类别0,操作值1为常量值,无操作值2
  353. # 变量: 类别1,操作值1为变量id,无操作值2
  354. # 随机: 类别2,操作值1为起始值,操作值2为终止值
  355. # 物品: 类别3,操作值1为物品id,无操作值2
  356. # 角色: 类别4,操作值1为角色id,操作值2为取值类别,0-13分别对应lv/exp/hp/sp/mhp/msp/str/dex/agi/int/pdf/mdf/eva
  357. # 敌人: 类别5,操作值1为敌人id,操作值2为取值类别,0-11分别对应hp/sp/mhp/msp/str/dex/agi/int/pdf/mdf/eva
  358. # 事件: 类别6,操作值1为事件id,操作值2为取值类别,0-5分别对应x/y/朝向/屏x/屏y/地标
  359. # 其它: 类别7,操作值1为取值类别,0-6分别对应地图/人数/钱/步数/游戏时间/计时/存档次数
  360. # 独立开关操作: finder.search(123, 独立开关编号A-D,开0/关1)
  361. # 计时器操作: finder.search(124, 开0/关1, 时间秒数)
  362. # 增减金钱: finder.search(125, 增0/减1, 常量0/变量1, 常量值或变量id)
  363. # 增减物品: finder.search(126, 物品id, 增0/减1, 常量0/变量1, 常量值或变量id)
  364. # 增减武器: finder.search(127, 武器id, 增0/减1, 常量0/变量1, 常量值或变量id)
  365. # 增减防具: finder.search(128, 防具id, 增0/减1, 常量0/变量1, 常量值或变量id)
  366. # 替换队员: finder.search(129, 角色id, 入0/出1, 原状0/初期化1)
  367. # 更改窗口外观: finder.search(131, 外观文件名)
  368. # 更改战斗 BGM: finder.search(132, BGM文件名)
  369. # 更改战斗结束 ME: finder.search(133, ME文件名)
  370. # 更改禁止存档: finder.search(134, 禁止0/允许1)
  371. # 更改禁止菜单: finder.search(135, 禁止0/允许1)
  372. # 更改禁止遇敌: finder.search(136, 禁止0/允许1)
  373. # 场所移动: finder.search(201, 直接0/变量1, 地图id或其变量id, x坐标或其变量, y坐标或其变量, 朝向上8/左4/右6/下2)
  374. # 设置事件位置: finder.search(202, 事件id, 直接0/变量1/交换2, x坐标或其变量/被交换事件id, y坐标或其变量, 朝向上8/左4/右6/下2)
  375. # 画面卷动: finder.search(203, 卷动方向8/4/6/2, 卷动长度, 卷动速度1-6)
  376. # 更改地图设置: finder.search(204, 远景0/雾1/背景2)
  377. # 更改雾的色调: finder.search(205, nil, 帧数)
  378. # 更改雾的不透明度: finder.search(206, 不透明度, 帧数)
  379. # 显示动画: finder.search(207, 事件id, 动画id)
  380. # 更改透明状态: finder.search(208, 透明0/普通1)
  381. # 设置移动路线: finder.search(209, 事件id)
  382. # 执行渐变: finder.search(222, 渐变文件名)
  383. # 更改画面色调: finder.search(223, nil, 帧数)
  384. # 画面闪烁: finder.search(224, nil, 帧数)
  385. # 画面震动: finder.search(225, 强度, 频度, 帧数)
  386. # 显示图片: finder.search(231, 图片id, 图片文件名)
  387. # 移动图片: finder.search(232, 图片id)
  388. # 旋转图片: finder.search(233, 图片id, 速度)
  389. # 更改图片色调: finder.search(234, 图片id)
  390. # 图片消失: finder.search(235, 图片id)
  391. # 天气设置: finder.search(236, 无0/风1/雨2/雪3, 强度1-9, 持续)
  392. # 演奏 BGM: finder.search(241, BGM文件名)
  393. # 淡出 BGM: finder.search(242, 秒数)
  394. # 演奏 BGS: finder.search(245, BGS文件名)
  395. # 淡出 BGS: finder.search(246, 秒数)
  396. # 演奏 ME: finder.search(249, ME文件名)
  397. # 演奏 SE: finder.search(250, SE文件名)
  398. # 战斗处理: finder.search(301, 队伍id, 不可逃0/可逃1, 不可败0/可败1)
  399. # 名称输入处理: finder.search(303, 角色id, 字符数)
  400. # 增减 HP: finder.search(311, 角色id, 增0/减1, 常量0/变量1, 常量值或变量id)
  401. # 增减 SP: finder.search(312, 角色id, 增0/减1, 常量0/变量1, 常量值或变量id)
  402. # 更改状态: finder.search(313, 角色id, 附加0/解除1, 状态id)
  403. # 完全回复: finder.search(314, 角色id)
  404. # 增减 EXP: finder.search(315, 角色id, 增0/减1, 常量0/变量1, 常量值或变量id)
  405. # 增减等级: finder.search(316, 角色id, 增0/减1, 常量0/变量1, 常量值或变量id)
  406. # 增减能力值: finder.search(317, 角色id, 0-5对应mhp/msp/str/dex/agi/int, 增0/减1, 常量0/变量1, 常量值或变量id)
  407. # 增减特技: finder.search(318, 角色id, 学0/忘1, 特技id)
  408. # 变更装备: finder.search(319, 角色id, 武器0/盾1/头2/甲3/饰4, 武器或防具id)
  409. # 更改角色姓名: finder.search(320, 角色id, 名字)
  410. # 更改角色职业: finder.search(321, 角色id, 职业id)
  411. # 更改角色图形: finder.search(322, 角色id, 角色图文件名, 角色图色相, 战斗图文件名, 战斗图色相)
  412.  
  413.  
  414. #finder = Find_Command.new
  415. #finder.search(201,nil,nil,nil,nil,2)
  416. #exit




回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-8 16:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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