你这串代码里的变量不对,不是 SetNewItemValue 写法问题,也不是 GOTO 跳段把值跳丢了。真正原因很简单:A63、A64、A65 在流程里都有 GetRandomText 喂过值,所以弹窗能读到;A60、A61、A62 从头到尾没有一次赋值,弹窗却直接引用,结果自然是空。空值显示出来就像“变量不对”,实际是没变量可读。
一、当前脚本的变量引用链路
[@3] 里执行了 GetRandomText 到 A63,再把 A63 加给 1 号武器第 4 条属性。
[@4] 里执行了 GetRandomText 到 A64,再把 A64 加给 1 号武器第 5 条属性。
[@5] 里执行了 GetRandomText 到 A65,再把 A65 加给 1 号武器第 6 条属性。
问题出在弹窗:
攻击伤害+<$STR(A60)>%
物理伤害减少+<$STR(A61)>%
魔法伤害减少+<$STR(A62)>%
这三个变量在整个脚本里没有任何 GetRandomText、MOV、EQUAL、赋值操作。也就是说,A60 到 A62 是真正意义上的空变量。GOM 引擎不会自动把 A63 的值拆成 A60、A61、A62,你必须手动每条都读一次。
二、A 变量在 GOM 里的特性
A 变量是角色个人存储变量,不会因为从 [@3] 跳到 [@4] 再跳到 [@5] 被清空。所以不要怀疑是 GOTO 弄丢了值。你现在的 A60 到 A62 不是被清掉的,是从来没填过。
但如果你的 A60 到 A62 在别的脚本里赋过值,到这个精炼脚本时却被覆盖,也会显示不对。A 变量名字短、全角色共享,任何一个 NPC 脚本都能改。处理办法是把这六个变量改成不容易撞车的名字,比如 A60 改成 A60_REFINE,或者统一换成 D 变量。
D 变量和 A 变量的区别在于:D 变量偏向数字型存储,适合存数值;A 变量偏向文本型存储,适合存字符串。这里全是纯数字,用 D60 到 D65 更稳。
三、GetRandomText 文件格式必须对
GetRandomText 是从文本文件里随机取一行,不是从变量数组里自动取值。所以你要取六个随机数,必须写六行命令。文件本身还得满足下面条件:
每行只能一个数字
数字不能带百分号
数字不能带逗号
不能有中文
不能有空行
不能有全角空格
保存格式用 ANSI,不要用 UTF-8 带 BOM
如果你用记事本保存,另存为的时候编码选 ANSI。如果你的文件里有 UTF-8 BOM,第一行数字前面会藏一个不可见字符,SetNewItemValue 读到它可能会失败。
文件路径也要核对。你写的是:
.\QuestDiary\数据文件\锻造数值.txt
实际位置一般是:
D:\MirServer\Mir200\Envir\QuestDiary\数据文件\锻造数值.txt
注意 QuestDiary 前面那一点,在脚本里表示当前 Envir 目录。如果文件不在对应位置,GetRandomText 就取不到值,A 变量照样空。
四、SetNewItemValue 的属性代码别照抄
你用了 1 4、1 5、1 6,同样一段代码在不同引擎里属性含义可能不一样。
常见的 GOM 属性代码对应:
4 对应忽视目标防御
5 对应攻击伤害反弹
6 对应体质
但这只是常见对应,你要在自己的 M2 说明书里确认。如果属性代码不对,变量有值也能加上,但加错属性,弹窗看起来还是不对。
验证方法:先只跑一条,比如只加 A63 到 1 4,打开武器面板看忽视目标防御涨没涨。涨了说明属性代码对,没涨说明代码表不对。
五、把赋值补全就修好了
最直接的改法是把 A60、A61、A62 全部补上 GetRandomText,让它们在弹窗之前都有值。下面这段直接把 [@3] 和 [@4] 合并成一次完整赋值,[@5] 只负责提示。
[@3]
IF
CHECKUSEITEM 1
ACT
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A60
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A61
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A62
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A63
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A64
GetRandomText .\QuestDiary\数据文件\锻造数值.txt A65
SetNewItemValue 1 4 + <$STR(A63)>
SetNewItemValue 1 5 + <$STR(A64)>
SetNewItemValue 1 6 + <$STR(A65)>
MESSAGEBOX [精炼成功]:你的武器<WEAPON>,成功的增加了:\ \体质+<STR(A65)>%\攻击伤害+<STR(A60)>%\物理伤害减少+<STR(A61)>%\魔法伤害减少+<STR(A62)>%\忽视目标防御+<STR(A63)>%\攻击伤害反弹+<$STR(A64)>%
SENDMSG 7 [精炼成功]:你的武器<$WEAPON>属性精炼成功,元素之石消耗完了。
ELSEACT
MESSAGEBOX [失败提示]:你身上的武器没有存在,元素之石消失了.
BREAK
这段把六个变量全部读满,弹窗每个引用都有值。原来 [@4] 如果还保留着,别让它单独只处理 A64,否则从 @4 入口进的时候 A60 到 A62 又是空的。要么让 @4 直接 GOTO @3 走完整流程,要么把完整读值代码复制到 @4 里。
六、用 D 变量替代 A 变量更省心
如果你不想纠结 A 变量被别的脚本覆盖,改成 D60 到 D65 会更稳:
D 变量适合纯数字
不会和文本变量混在一起
同样跨段保留
弹窗写法还是 <$STR(D60)>
改成 D 变量后的核心段:
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D60
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D61
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D62
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D63
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D64
GetRandomText .\QuestDiary\数据文件\锻造数值.txt D65
SetNewItemValue 1 4 + <$STR(D63)>
SetNewItemValue 1 5 + <$STR(D64)>
SetNewItemValue 1 6 + <$STR(D65)>
弹窗里的变量引用也改成 D60 到 D65。
七、加一条临时调试看哪一步断了
改完还是觉得变量不对,在弹窗前面加一条临时代码:
MESSAGEBOX [调试]:A60=<STR(A60)> A61=<STR(A61)> A62=<STR(A62)> A63=<STR(A63)> A64=<STR(A64)> A65=<STR(A65)>
能弹出值,说明赋值链路正常,问题在 SetNewItemValue 属性代码或者文件内容。
弹出来全是空,回读文件路径和编码。
弹出来五个值完全一样,说明锻造数值.txt 里只有一行,这是正常的随机取行结果。
传奇装备精炼脚本A63变量不对的定位与完整修复教程GOM引擎版
来源:
作者:
点击:

