Project1

标题: 变量名交换工具 [打印本页]

作者: SailCat    时间: 2012-3-6 03:12
标题: 变量名交换工具
本帖最后由 SailCat 于 2012-3-6 03:12 编辑

猫儿的RGSS Assistant脚本第四弹——变量名交换工具
不多说,上代码,功能见注释
主要用于变量名搞乱了(相似功能的没放在一起)之后的整理重排

  1. #==============================================================================
  2. # ■ Variable_Swap
  3. #------------------------------------------------------------------------------
  4. #  变量互换工具 by SailCat
  5. #   该程序能够互换两个变量的一切引用
  6. #   使用说明:
  7. #     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
  8. #     vswap = Variable_Swap.new
  9. #     vswap.swap(1, 2)  # 互换对变量1和变量2的所有引用
  10. #     互换日志写在工程目录下的VSwap.txt文件里
  11. #     Debug模式下运行的话,运行完后要关闭工程重新打开
  12. #     注释掉第316,359,406行的语句可以仅输出日志而不修改游戏工程
  13. #     注释掉第425行及以下的语句可以屏蔽这个功能,正常测试游戏
  14. #==============================================================================
  15. class Variable_Swap
  16.   #--------------------------------------------------------------------------
  17.   # ● 初期化
  18.   #--------------------------------------------------------------------------
  19.   def initialize
  20.     # 删除前次导出的文件
  21.     if FileTest.exist?("VSwap.txt")
  22.       File.delete("VSwap.txt")
  23.     end
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 按事件内容交换变量
  27.   #     command: 事件指令
  28.   #     var_id1: 变量1 编号
  29.   #     var_id2: 变量2 编号
  30.   #--------------------------------------------------------------------------
  31.   def swap_in_command(command, var_id1, var_id2)
  32.     log = ""
  33.     # 检查相关变量的指令
  34.     case command.code
  35.     when 101, 401 # 显示文章
  36.       regex1 = /\\v\[#{var_id1}\]/
  37.       regex2 = /\\v\[#{var_id2}\]/
  38.       if command.parameters[0][regex1] != nil
  39.         command.parameters[0].gsub!(regex1) { "\001" }
  40.         log = sprintf(" 引用变量 %d -> %d", var_id1, var_id2)
  41.       end
  42.       if command.parameters[0][regex2] != nil
  43.         command.parameters[0].gsub!(regex2) { "\\v[#{var_id1}]" }
  44.         log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)
  45.       end
  46.       if command.parameters[0][/\001/] != nil
  47.         command.parameters[0].gsub!(/\001/) { "\\v[#{var_id2}]" }
  48.       end
  49.       if log != ""
  50.         log = sprintf("显示文章:%s\n", log)
  51.       end
  52.     when 102 # 显示选择项
  53.       regex1 = /\\v\[#{var_id1}\]/
  54.       regex2 = /\\v\[#{var_id2}\]/
  55.       for i in 0...command.parameters[0].size
  56.         if command.parameters[0][i][regex1] != nil
  57.           command.parameters[0][i].gsub!(regex1) { "\001" }
  58.           log += sprintf(" 引用变量 %d -> %d", var_id1, var_id2)
  59.         end
  60.         if command.parameters[0][i][regex2] != nil
  61.           command.parameters[0][i].gsub!(regex2) { "\\v[#{var_id1}]" }
  62.           log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)
  63.         end
  64.         if command.parameters[0][i][/\001/] != nil
  65.           command.parameters[0][i].gsub!(/\001/) { "\\v[#{var_id2}]" }
  66.         end
  67.       end
  68.       if log != ""
  69.         log = sprintf("显示选择项:%s\n", log)
  70.       end
  71.     when 103, 105 # 输入数值,接受按键
  72.       if command.parameters[0] == var_id1
  73.         command.parameters[0] = var_id2
  74.         log = sprintf("输入变量: %d -> %d\n", var_id1, var_id2)
  75.       elsif command.parameters[0] == var_id2
  76.         command.parameters[0] = var_id1
  77.         log = sprintf("输入变量: %d -> %d\n", var_id2, var_id1)
  78.       end
  79.     when 111 # 分歧
  80.       # 变量
  81.       if command.parameters[0] == 1
  82.         if command.parameters[1] == var_id1
  83.           command.parameters[1] = var_id2
  84.           log = sprintf(" 变量 %d -> %d", var_id1, var_id2)
  85.         elsif command.parameters[1] == var_id2
  86.           command.parameters[1] = var_id1
  87.           log = sprintf(" 变量 %d -> %d", var_id2, var_id1)
  88.         end
  89.         if command.parameters[2] == 1
  90.           if command.parameters[3] == var_id1
  91.             command.parameters[3] = var_id2
  92.             log += sprintf(" 参比变量 %d -> %d", var_id1, var_id2)
  93.           elsif command.parameters[3] == var_id2
  94.             command.parameters[3] = var_id1
  95.             log += sprintf(" 参比变量 %d -> %d", var_id2, var_id1)
  96.           end
  97.         end
  98.       # 脚本
  99.       elsif command.parameters[0] == 12
  100.         regex1 = /\$game_variables\[#{var_id1}\]/
  101.         regex2 = /\$game_variables\[#{var_id2}\]/
  102.         if command.parameters[1][regex1] != nil
  103.           command.parameters[1].gsub!(regex1) { "\001" }
  104.           log = sprintf(" 脚本变量 %d -> %d\n", var_id1, var_id2)
  105.         end
  106.         if command.parameters[1][regex2] != nil
  107.           command.parameters[1].gsub!(regex2) { "$game_variables[#{var_id1}]" }
  108.           log += sprintf(" 脚本变量 %d -> %d\n", var_id2, var_id1)
  109.         end
  110.         if command.parameters[1][/\001/] != nil
  111.           command.parameters[1].gsub!(/\001/) { "$game_variables[#{var_id2}]" }
  112.         end
  113.       end
  114.       if log != ""
  115.         log = sprintf("条件分歧:%s\n", log)
  116.       end
  117.     when 122 # 变量操作
  118.       # 只对单独操作的变量有效
  119.       if command.parameters[0] == command.parameters[1]
  120.         if command.parameters[0] == var_id1
  121.           command.parameters[0] = var_id2
  122.           command.parameters[1] = var_id2
  123.           log = sprintf(" 元变量 %d -> %d", var_id1, var_id2)
  124.         elsif command.parameters[0] == var_id2
  125.           command.parameters[0] = var_id1
  126.           command.parameters[1] = var_id1
  127.           log = sprintf(" 元变量 %d -> %d", var_id2, var_id1)
  128.         end
  129.       end
  130.       # 变量的引用
  131.       if command.parameters[3] == 1
  132.         if command.parameters[4] == var_id1
  133.           command.parameters[4] = var_id2
  134.           log += sprintf(" 引用变量 %d -> %d", var_id1, var_id2)
  135.         elsif command.parameters[4] == var_id2
  136.           command.parameters[4] = var_id1
  137.           log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)
  138.         end
  139.       end
  140.       if log != ""
  141.         log = sprintf("变量操作:%s\n", log)
  142.       end
  143.     when 125 # 增减金钱
  144.       # 使用变量指定的情况下
  145.       if command.parameters[1] == 1
  146.         if command.parameters[2] == var_id1
  147.           command.parameters[2] = var_id2
  148.           log = sprintf("增减金钱: 数量 %d -> %d\n", var_id1, var_id2)
  149.         elsif command.parameters[2] == var_id2
  150.           command.parameters[2] = var_id1
  151.           log = sprintf("增减金钱: 数量 %d -> %d\n", var_id2, var_id1)
  152.         end
  153.       end
  154.     when 126, 127, 128 # 增减物品,武器,防具
  155.       s = ["物品", "武器", "防具"][command.code-126]
  156.       # 使用变量指定的情况下
  157.       if command.parameters[2] == 1
  158.         if command.parameters[3] == var_id1
  159.           command.parameters[3] = var_id2
  160.           log = sprintf("增减%s: 数量 %d -> %d\n", s, var_id1, var_id2)
  161.         elsif command.parameters[3] == var_id2
  162.           command.parameters[3] = var_id1
  163.           log = sprintf("增减%s: 数量 %d -> %d\n", s, var_id2, var_id1)
  164.         end
  165.       end
  166.     when 201 # 场所移动
  167.       # 使用变量指定的情况下
  168.       if command.parameters[0] == 1
  169.         if command.parameters[1] == var_id1
  170.           command.parameters[1] = var_id2
  171.           log = sprintf(" 地图 %d -> %d", var_id1, var_id2)
  172.         elsif command.parameters[1] == var_id2
  173.           command.parameters[1] = var_id1
  174.           log = sprintf(" 地图 %d -> %d", var_id2, var_id1)
  175.         end
  176.         if command.parameters[2] == var_id1
  177.           command.parameters[2] = var_id2
  178.           log += sprintf(" X坐标 %d -> %d", var_id1, var_id2)
  179.         elsif command.parameters[2] == var_id2
  180.           command.parameters[2] = var_id1
  181.           log += sprintf(" X坐标 %d -> %d", var_id2, var_id1)
  182.         end
  183.         if command.parameters[3] == var_id1
  184.           command.parameters[3] = var_id2
  185.           log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)
  186.         elsif command.parameters[3] == var_id2
  187.           command.parameters[3] = var_id1
  188.           log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)
  189.         end
  190.       end
  191.       if log != ""
  192.         log = sprintf("场所移动:%s\n", log)
  193.       end
  194.     when 202 # 设置事件位置
  195.       # 使用变量指定的情况下
  196.       if command.parameters[1] == 1
  197.         if command.parameters[2] == var_id1
  198.           command.parameters[2] = var_id2
  199.           log = sprintf(" X坐标 %d -> %d", var_id1, var_id2)
  200.         elsif command.parameters[2] == var_id2
  201.           command.parameters[2] = var_id1
  202.           log = sprintf(" X坐标 %d -> %d", var_id2, var_id1)
  203.         end
  204.         if command.parameters[3] == var_id1
  205.           command.parameters[3] = var_id2
  206.           log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)
  207.         elsif command.parameters[3] == var_id2
  208.           command.parameters[3] = var_id1
  209.           log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)
  210.         end
  211.       end
  212.       if log != ""
  213.         log = sprintf("设置事件位置:%s\n", log)
  214.       end
  215.     when 231, 232 # 显示图片,移动图片
  216.       s = ["显示", "移动"][command.code-231]
  217.       # 使用变量指定的情况下
  218.       if command.parameters[3] == 1
  219.         if command.parameters[4] == var_id1
  220.           command.parameters[4] = var_id2
  221.           log = sprintf(" X坐标 %d -> %d", var_id1, var_id2)
  222.         elsif command.parameters[4] == var_id2
  223.           command.parameters[4] = var_id1
  224.           log = sprintf(" X坐标 %d -> %d", var_id2, var_id1)
  225.         end
  226.         if command.parameters[5] == var_id1
  227.           command.parameters[5] = var_id2
  228.           log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)
  229.         elsif command.parameters[5] == var_id2
  230.           command.parameters[5] = var_id1
  231.           log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)
  232.         end
  233.       end
  234.       if log != ""
  235.         log = sprintf("%s图片:%s\n", s, log)
  236.       end
  237.     when 355, 655 # 脚本
  238.       regex1 = /\$game_variables\[#{var_id1}\]/
  239.       regex2 = /\$game_variables\[#{var_id2}\]/
  240.       if command.parameters[0][regex1] != nil
  241.         command.parameters[0].gsub!(regex1) { "\001" }
  242.         log = sprintf(" %d -> %d", var_id1, var_id2)
  243.       end
  244.       if command.parameters[0][regex2] != nil
  245.         command.parameters[0].gsub!(regex2) { "$game_variables[#{var_id1}]" }
  246.         log += sprintf(" %d -> %d", var_id2, var_id1)
  247.       end
  248.       if command.parameters[0][/\001/] != nil
  249.         command.parameters[0].gsub!(/\001/) { "$game_variables[#{var_id2}]" }
  250.       end
  251.       if log != ""
  252.         log = sprintf("脚本:%s\n", log)
  253.       end
  254.     end
  255.     return log
  256.   end
  257.   #--------------------------------------------------------------------------
  258.   # ● 执行地图变量交换
  259.   #     map_id: 地图ID
  260.   #     var_id1: 变量1 编号
  261.   #     var_id2: 变量2 编号
  262.   #--------------------------------------------------------------------------
  263.   def swap_in_map(map_id, var_id1, var_id2)
  264.     File.open("VSwap.txt", "a") do |f|
  265.       map_name = sprintf("Data/Map%03d.rxdata", map_id)
  266.       if FileTest.exist?(map_name)
  267.         # 载入当前地图
  268.         map = load_data(map_name)
  269.         s = false
  270.         # 循环地图中所有事件
  271.         for i in 1..999
  272.           event = map.events[i]
  273.           if event != nil
  274.             t = false
  275.             log = sprintf(" □ 事件 %d: %s \n", event.id, event.name)
  276.             # 循环事件的每一页
  277.             page_id = 0
  278.             event.pages.each do |page|
  279.               page_id += 1
  280.               # 如果页条件中有变量引用
  281.               if page.condition.variable_valid
  282.                 # 交换变量
  283.                 if page.condition.variable_id == var_id1
  284.                   t = true
  285.                   page.condition.variable_id = var_id2
  286.                   log += sprintf("    页 %d: 条件引用变量 %d -> %d\n", page_id,
  287.                     var_id1, var_id2)
  288.                 elsif page.condition.variable_id == var_id2
  289.                   t = true
  290.                   page.condition.variable_id = var_id1
  291.                   log += sprintf("    页 %d: 条件引用变量 %d -> %d\n", page_id,
  292.                     var_id2, var_id1)
  293.                 end
  294.               end
  295.               # 如果指令不为空
  296.               if page.list.length > 0
  297.                 # 循环页的所有指令
  298.                 page.list.each do |command|
  299.                   vlog = swap_in_command(command, var_id1, var_id2)
  300.                   if vlog != ""
  301.                     t = true
  302.                     log += sprintf("    页 %d: 指令 %s", page_id, vlog)
  303.                   end
  304.                 end
  305.               end
  306.             end
  307.             # 输出事件提示字样
  308.             if t
  309.               unless s
  310.                 f.write("-----------------------------------------------------\n")
  311.                 f.write(sprintf(" ■ 地图ID: %d\n", map_id))
  312.                 f.write("-----------------------------------------------------\n")
  313.                 s = true
  314.               end
  315.               f.write(log)
  316.               save_data(map, map_name)
  317.             end
  318.           end
  319.         end
  320.       end
  321.     end
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ● 执行公共变量交换
  325.   #     var_id1: 变量1 编号
  326.   #     var_id2: 变量2 编号
  327.   #--------------------------------------------------------------------------
  328.   def swap_in_common(var_id1, var_id2)
  329.     File.open("VSwap.txt", "a") do |f|
  330.       # 载入公共事件
  331.       common_events = load_data("Data/CommonEvents.rxdata")
  332.       s = false
  333.       # 循环每个事件
  334.       for i in 1...common_events.size
  335.         event = common_events[i]
  336.         if event != nil
  337.           t = false
  338.           log = sprintf(" □ 公共事件 %d: %s \n", event.id, event.name)
  339.           # 如果指令不为空
  340.           if event.list.length > 0
  341.             # 循环事件的所有指令
  342.             event.list.each do |command|
  343.               vlog = swap_in_command(command, var_id1, var_id2)
  344.               if vlog != ""
  345.                 t = true
  346.                 log += sprintf("    指令 %s", vlog)
  347.               end
  348.             end
  349.           end
  350.           # 输出事件提示字样
  351.           if t
  352.             unless s
  353.               f.write("-----------------------------------------------------\n")
  354.               f.write(" ■ 公共事件\n")
  355.               f.write("-----------------------------------------------------\n")
  356.               s = true
  357.             end
  358.             f.write(log)
  359.             save_data(common_events, "Data/CommonEvents.rxdata")
  360.           end
  361.         end
  362.       end
  363.     end
  364.   end
  365.   #--------------------------------------------------------------------------
  366.   # ● 执行战斗变量交换
  367.   #     var_id1: 变量1 编号
  368.   #     var_id2: 变量2 编号
  369.   #--------------------------------------------------------------------------
  370.   def swap_in_troops(var_id1, var_id2)
  371.     File.open("VSwap.txt", "a") do |f|
  372.       # 载入战斗事件
  373.       troops = load_data("Data/Troops.rxdata")
  374.       s = false
  375.       # 循环地图中所有事件
  376.       for i in 1..troops.size
  377.         troop = troops[i]
  378.         if troop != nil
  379.           t = false
  380.           log = sprintf(" □ 队伍 %d: %s \n", troop.id, troop.name)
  381.           # 循环事件的每一页
  382.           page_id = 0
  383.           troop.pages.each do |page|
  384.             page_id += 1
  385.             # 如果指令不为空
  386.             if page.list.length > 0
  387.               # 循环页的所有指令
  388.               page.list.each do |command|
  389.                 vlog = swap_in_command(command, var_id1, var_id2)
  390.                 if vlog != ""
  391.                   t = true
  392.                   log += sprintf("    页 %d: 指令 %s", page_id, vlog)
  393.                 end
  394.               end
  395.             end
  396.           end
  397.           # 输出事件提示字样
  398.           if t
  399.             unless s
  400.               f.write("-----------------------------------------------------\n")
  401.               f.write(" ■ 战斗事件\n")
  402.               f.write("-----------------------------------------------------\n")
  403.               s = true
  404.             end
  405.             f.write(log)
  406.             save_data(troops, "Data/Troops.rxdata")
  407.           end
  408.         end
  409.       end
  410.     end
  411.   end
  412.   #--------------------------------------------------------------------------
  413.   # ● 批量交换变量
  414.   #     var_id1: 变量1 编号
  415.   #     var_id2: 变量2 编号
  416.   #--------------------------------------------------------------------------
  417.   def swap(var_id1, var_id2)
  418.     for map_id in 1..999
  419.       swap_in_map(map_id, var_id1, var_id2)
  420.     end
  421.     swap_in_common(var_id1, var_id2)
  422.     swap_in_troops(var_id1, var_id2)
  423.   end
  424. end
  425. #vswap = Variable_Swap.new
  426. #vswap.swap(1, 2)
  427. #exit
复制代码

作者: 各种压力的猫君    时间: 2012-3-6 05:19
SailCat 前辈都浮上来了……这个必须前排膜拜下。

悄悄收走……对我这种看着数据库不整齐就浑身不舒服的强迫症患者尤为适用……
作者: 1584927450    时间: 2012-4-3 20:01
挺有用的,两个字,给力




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1