查看: 72|回复: 0

[转载发布] 变量名交换工具

[复制链接]
  • TA的每日心情
    开心
    2024-5-10 09:55
  • 签到天数: 37 天

    连续签到: 3 天

    [LV.5]常住居民I

    2028

    主题

    32

    回帖

    7260

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5184
    OK点
    16
    积分
    7260
    发表于 同元一千年八月三日(秋) | 显示全部楼层 |阅读模式
    猫儿的RGSS Assistant脚本第四弹——变量名交换工具
    不多说,上代码,功能见注释
    主要用于变量名搞乱了(相似功能的没放在一起)之后的整理重排
    1. #==============================================================================# ■ Variable_Swap#------------------------------------------------------------------------------#  变量互换工具 by SailCat#   该程序能够互换两个变量的一切引用#   使用说明:#     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:#     vswap = Variable_Swap.new#     vswap.swap(1, 2)  # 互换对变量1和变量2的所有引用#     互换日志写在工程目录下的VSwap.txt文件里#     Debug模式下运行的话,运行完后要关闭工程重新打开#     注释掉第316,359,406行的语句可以仅输出日志而不修改游戏工程#     注释掉第425行及以下的语句可以屏蔽这个功能,正常测试游戏#==============================================================================class Variable_Swap  #--------------------------------------------------------------------------  # ● 初期化  #--------------------------------------------------------------------------  def initialize    # 删除前次导出的文件    if FileTest.exist?("VSwap.txt")      File.delete("VSwap.txt")    end  end  #--------------------------------------------------------------------------  # ● 按事件内容交换变量  #     command: 事件指令  #     var_id1: 变量1 编号  #     var_id2: 变量2 编号  #--------------------------------------------------------------------------  def swap_in_command(command, var_id1, var_id2)    log = ""    # 检查相关变量的指令    case command.code    when 101, 401 # 显示文章      regex1 = /\\v\[#{var_id1}\]/      regex2 = /\\v\[#{var_id2}\]/      if command.parameters[0][regex1] != nil        command.parameters[0].gsub!(regex1) { "\001" }        log = sprintf(" 引用变量 %d -> %d", var_id1, var_id2)      end      if command.parameters[0][regex2] != nil        command.parameters[0].gsub!(regex2) { "\\v[#{var_id1}]" }        log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)      end      if command.parameters[0][/\001/] != nil        command.parameters[0].gsub!(/\001/) { "\\v[#{var_id2}]" }      end      if log != ""         log = sprintf("显示文章:%s\n", log)      end    when 102 # 显示选择项      regex1 = /\\v\[#{var_id1}\]/      regex2 = /\\v\[#{var_id2}\]/      for i in 0...command.parameters[0].size        if command.parameters[0][i][regex1] != nil          command.parameters[0][i].gsub!(regex1) { "\001" }          log += sprintf(" 引用变量 %d -> %d", var_id1, var_id2)        end        if command.parameters[0][i][regex2] != nil          command.parameters[0][i].gsub!(regex2) { "\\v[#{var_id1}]" }          log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)        end        if command.parameters[0][i][/\001/] != nil          command.parameters[0][i].gsub!(/\001/) { "\\v[#{var_id2}]" }        end      end      if log != ""         log = sprintf("显示选择项:%s\n", log)      end    when 103, 105 # 输入数值,接受按键      if command.parameters[0] == var_id1        command.parameters[0] = var_id2        log = sprintf("输入变量: %d -> %d\n", var_id1, var_id2)      elsif command.parameters[0] == var_id2        command.parameters[0] = var_id1        log = sprintf("输入变量: %d -> %d\n", var_id2, var_id1)      end    when 111 # 分歧      # 变量      if command.parameters[0] == 1        if command.parameters[1] == var_id1          command.parameters[1] = var_id2          log = sprintf(" 变量 %d -> %d", var_id1, var_id2)        elsif command.parameters[1] == var_id2          command.parameters[1] = var_id1          log = sprintf(" 变量 %d -> %d", var_id2, var_id1)        end        if command.parameters[2] == 1          if command.parameters[3] == var_id1            command.parameters[3] = var_id2            log += sprintf(" 参比变量 %d -> %d", var_id1, var_id2)          elsif command.parameters[3] == var_id2            command.parameters[3] = var_id1            log += sprintf(" 参比变量 %d -> %d", var_id2, var_id1)          end        end      # 脚本      elsif command.parameters[0] == 12        regex1 = /\$game_variables\[#{var_id1}\]/        regex2 = /\$game_variables\[#{var_id2}\]/        if command.parameters[1][regex1] != nil          command.parameters[1].gsub!(regex1) { "\001" }          log = sprintf(" 脚本变量 %d -> %d\n", var_id1, var_id2)        end        if command.parameters[1][regex2] != nil          command.parameters[1].gsub!(regex2) { "$game_variables[#{var_id1}]" }          log += sprintf(" 脚本变量 %d -> %d\n", var_id2, var_id1)        end        if command.parameters[1][/\001/] != nil          command.parameters[1].gsub!(/\001/) { "$game_variables[#{var_id2}]" }        end      end      if log != ""        log = sprintf("条件分歧:%s\n", log)      end    when 122 # 变量操作      # 只对单独操作的变量有效      if command.parameters[0] == command.parameters[1]        if command.parameters[0] == var_id1          command.parameters[0] = var_id2          command.parameters[1] = var_id2          log = sprintf(" 元变量 %d -> %d", var_id1, var_id2)        elsif command.parameters[0] == var_id2          command.parameters[0] = var_id1          command.parameters[1] = var_id1          log = sprintf(" 元变量 %d -> %d", var_id2, var_id1)        end      end      # 变量的引用      if command.parameters[3] == 1        if command.parameters[4] == var_id1          command.parameters[4] = var_id2          log += sprintf(" 引用变量 %d -> %d", var_id1, var_id2)        elsif command.parameters[4] == var_id2          command.parameters[4] = var_id1          log += sprintf(" 引用变量 %d -> %d", var_id2, var_id1)        end      end      if log != ""        log = sprintf("变量操作:%s\n", log)      end    when 125 # 增减金钱      # 使用变量指定的情况下      if command.parameters[1] == 1         if command.parameters[2] == var_id1          command.parameters[2] = var_id2          log = sprintf("增减金钱: 数量 %d -> %d\n", var_id1, var_id2)        elsif command.parameters[2] == var_id2          command.parameters[2] = var_id1          log = sprintf("增减金钱: 数量 %d -> %d\n", var_id2, var_id1)        end      end    when 126, 127, 128 # 增减物品,武器,防具      s = ["物品", "武器", "防具"][command.code-126]      # 使用变量指定的情况下      if command.parameters[2] == 1         if command.parameters[3] == var_id1          command.parameters[3] = var_id2          log = sprintf("增减%s: 数量 %d -> %d\n", s, var_id1, var_id2)        elsif command.parameters[3] == var_id2          command.parameters[3] = var_id1          log = sprintf("增减%s: 数量 %d -> %d\n", s, var_id2, var_id1)        end      end    when 201 # 场所移动      # 使用变量指定的情况下      if command.parameters[0] == 1         if command.parameters[1] == var_id1          command.parameters[1] = var_id2          log = sprintf(" 地图 %d -> %d", var_id1, var_id2)        elsif command.parameters[1] == var_id2          command.parameters[1] = var_id1          log = sprintf(" 地图 %d -> %d", var_id2, var_id1)        end        if command.parameters[2] == var_id1          command.parameters[2] = var_id2          log += sprintf(" X坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[2] == var_id2          command.parameters[2] = var_id1          log += sprintf(" X坐标 %d -> %d", var_id2, var_id1)        end        if command.parameters[3] == var_id1          command.parameters[3] = var_id2          log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[3] == var_id2          command.parameters[3] = var_id1          log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)        end      end      if log != ""        log = sprintf("场所移动:%s\n", log)      end    when 202 # 设置事件位置      # 使用变量指定的情况下      if command.parameters[1] == 1         if command.parameters[2] == var_id1          command.parameters[2] = var_id2          log = sprintf(" X坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[2] == var_id2          command.parameters[2] = var_id1          log = sprintf(" X坐标 %d -> %d", var_id2, var_id1)        end        if command.parameters[3] == var_id1          command.parameters[3] = var_id2          log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[3] == var_id2          command.parameters[3] = var_id1          log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)        end      end      if log != ""        log = sprintf("设置事件位置:%s\n", log)      end    when 231, 232 # 显示图片,移动图片      s = ["显示", "移动"][command.code-231]      # 使用变量指定的情况下      if command.parameters[3] == 1         if command.parameters[4] == var_id1          command.parameters[4] = var_id2          log = sprintf(" X坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[4] == var_id2          command.parameters[4] = var_id1          log = sprintf(" X坐标 %d -> %d", var_id2, var_id1)        end        if command.parameters[5] == var_id1          command.parameters[5] = var_id2          log += sprintf(" Y坐标 %d -> %d", var_id1, var_id2)        elsif command.parameters[5] == var_id2          command.parameters[5] = var_id1          log += sprintf(" Y坐标 %d -> %d", var_id2, var_id1)        end      end      if log != ""        log = sprintf("%s图片:%s\n", s, log)      end    when 355, 655 # 脚本      regex1 = /\$game_variables\[#{var_id1}\]/      regex2 = /\$game_variables\[#{var_id2}\]/      if command.parameters[0][regex1] != nil        command.parameters[0].gsub!(regex1) { "\001" }        log = sprintf(" %d -> %d", var_id1, var_id2)      end      if command.parameters[0][regex2] != nil        command.parameters[0].gsub!(regex2) { "$game_variables[#{var_id1}]" }        log += sprintf(" %d -> %d", var_id2, var_id1)      end      if command.parameters[0][/\001/] != nil        command.parameters[0].gsub!(/\001/) { "$game_variables[#{var_id2}]" }      end      if log != ""        log = sprintf("脚本:%s\n", log)      end    end    return log  end  #--------------------------------------------------------------------------  # ● 执行地图变量交换  #     map_id: 地图ID  #     var_id1: 变量1 编号  #     var_id2: 变量2 编号  #--------------------------------------------------------------------------  def swap_in_map(map_id, var_id1, var_id2)    File.open("VSwap.txt", "a") do |f|      map_name = sprintf("Data/Map%03d.rxdata", map_id)      if FileTest.exist?(map_name)        # 载入当前地图        map = load_data(map_name)        s = false        # 循环地图中所有事件        for i in 1..999          event = map.events[i]          if event != nil            t = false            log = sprintf(" □ 事件 %d: %s \n", event.id, event.name)            # 循环事件的每一页            page_id = 0            event.pages.each do |page|              page_id += 1              # 如果页条件中有变量引用              if page.condition.variable_valid                # 交换变量                if page.condition.variable_id == var_id1                  t = true                  page.condition.variable_id = var_id2                  log += sprintf("    页 %d: 条件引用变量 %d -> %d\n", page_id,                    var_id1, var_id2)                elsif page.condition.variable_id == var_id2                  t = true                  page.condition.variable_id = var_id1                  log += sprintf("    页 %d: 条件引用变量 %d -> %d\n", page_id,                    var_id2, var_id1)                end              end              # 如果指令不为空              if page.list.length > 0                # 循环页的所有指令                page.list.each do |command|                  vlog = swap_in_command(command, var_id1, var_id2)                  if vlog != ""                     t = true                    log += sprintf("    页 %d: 指令 %s", page_id, vlog)                  end                end              end            end            # 输出事件提示字样            if t              unless s                f.write("-----------------------------------------------------\n")                f.write(sprintf(" ■ 地图ID: %d\n", map_id))                f.write("-----------------------------------------------------\n")                s = true              end              f.write(log)              save_data(map, map_name)            end          end        end      end    end  end  #--------------------------------------------------------------------------  # ● 执行公共变量交换  #     var_id1: 变量1 编号  #     var_id2: 变量2 编号  #--------------------------------------------------------------------------  def swap_in_common(var_id1, var_id2)    File.open("VSwap.txt", "a") do |f|      # 载入公共事件      common_events = load_data("Data/CommonEvents.rxdata")      s = false      # 循环每个事件      for i in 1...common_events.size        event = common_events[i]        if event != nil          t = false          log = sprintf(" □ 公共事件 %d: %s \n", event.id, event.name)          # 如果指令不为空          if event.list.length > 0            # 循环事件的所有指令            event.list.each do |command|              vlog = swap_in_command(command, var_id1, var_id2)              if vlog != ""                 t = true                log += sprintf("    指令 %s", vlog)              end            end          end          # 输出事件提示字样          if t            unless s              f.write("-----------------------------------------------------\n")              f.write(" ■ 公共事件\n")              f.write("-----------------------------------------------------\n")              s = true            end            f.write(log)            save_data(common_events, "Data/CommonEvents.rxdata")          end        end      end    end  end  #--------------------------------------------------------------------------  # ● 执行战斗变量交换  #     var_id1: 变量1 编号  #     var_id2: 变量2 编号  #--------------------------------------------------------------------------  def swap_in_troops(var_id1, var_id2)    File.open("VSwap.txt", "a") do |f|      # 载入战斗事件      troops = load_data("Data/Troops.rxdata")      s = false      # 循环地图中所有事件      for i in 1..troops.size        troop = troops[i]        if troop != nil          t = false          log = sprintf(" □ 队伍 %d: %s \n", troop.id, troop.name)          # 循环事件的每一页          page_id = 0          troop.pages.each do |page|            page_id += 1            # 如果指令不为空            if page.list.length > 0              # 循环页的所有指令              page.list.each do |command|                vlog = swap_in_command(command, var_id1, var_id2)                if vlog != ""                   t = true                  log += sprintf("    页 %d: 指令 %s", page_id, vlog)                end              end            end          end          # 输出事件提示字样          if t            unless s              f.write("-----------------------------------------------------\n")              f.write(" ■ 战斗事件\n")              f.write("-----------------------------------------------------\n")              s = true            end            f.write(log)            save_data(troops, "Data/Troops.rxdata")          end        end      end    end  end  #--------------------------------------------------------------------------  # ● 批量交换变量  #     var_id1: 变量1 编号  #     var_id2: 变量2 编号  #--------------------------------------------------------------------------  def swap(var_id1, var_id2)    for map_id in 1..999      swap_in_map(map_id, var_id1, var_id2)    end    swap_in_common(var_id1, var_id2)    swap_in_troops(var_id1, var_id2)  endend#vswap = Variable_Swap.new#vswap.swap(1, 2)#exit复制代码
    复制代码
                 本帖来自P1论坛作者各种压力的猫君,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=224469  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-20 21:13 , Processed in 0.051446 second(s), 43 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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