Project1
标题:
变量名交换工具
[打印本页]
作者:
SailCat
时间:
2012-3-6 03:12
标题:
变量名交换工具
本帖最后由 SailCat 于 2012-3-6 03:12 编辑
猫儿的RGSS Assistant脚本第四弹——变量名交换工具
不多说,上代码,功能见注释
主要用于变量名搞乱了(相似功能的没放在一起)之后的整理重排
#==============================================================================
# ■ 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)
end
end
#vswap = Variable_Swap.new
#vswap.swap(1, 2)
#exit
复制代码
作者:
各种压力的猫君
时间:
2012-3-6 05:19
SailCat 前辈都浮上来了……这个必须前排膜拜下。
悄悄收走……对我这种看着数据库不整齐就浑身不舒服的强迫症患者尤为适用……
作者:
1584927450
时间:
2012-4-3 20:01
挺有用的,两个字,给力
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1