你这串代码里的变量不对,不是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-8BOM,第一行数字前面会藏一个不可见字符,SetNewItemValue读到它可能会失败。
文件路径也要核对。你写的是:
.\QuestDiary\数据文件\锻造数值.txt
实际位置一般是:
D:\MirServer\Mir200\Envir\QuestDiary\数据文件\锻造数值.txt
注意QuestDiary前面那一点,在脚本里表示当前Envir目录。如果文件不在对应位置,GetRandomText就取不到值,A变量照样空。
四、SetNewItemValue的属性代码别照抄
你用了14、15、16,同样一段代码在不同引擎里属性含义可能不一样。
常见的GOM属性代码对应:
4对应忽视目标防御
5对应攻击伤害反弹
6对应体质
但这只是常见对应,你要在自己的M2说明书里确认。如果属性代码不对,变量有值也能加上,但加错属性,弹窗看起来还是不对。
验证方法:先只跑一条,比如只加A63到14,打开武器面板看忽视目标防御涨没涨。涨了说明属性代码对,没涨说明代码表不对。
五、把赋值补全就修好了
最直接的改法是把A60、A61、A62全部补上GetRandomText,让它们在弹窗之前都有值。下面这段直接把[@3]和[@4]合并成一次完整赋值,[@5]只负责提示。
[@3]
IF
CHECKUSEITEM1
ACT
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA60
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA61
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA62
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA63
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA64
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA65
SetNewItemValue14+<$STR(A63)>
SetNewItemValue15+<$STR(A64)>
SetNewItemValue16+<$STR(A65)>
MESSAGEBOX[精炼成功]:你的武器<WEAPON>,成功的增加了:\ \体质+<STR(A65)>%\攻击伤害+<STR(A60)>%\物理伤害减少+<STR(A61)>%\魔法伤害减少+<STR(A62)>%\忽视目标防御+<STR(A63)>%\攻击伤害反弹+<$STR(A64)>%
SENDMSG7[精炼成功]:你的武器<$WEAPON>属性精炼成功,元素之石消耗完了。
ELSEACT
MESSAGEBOX[失败提示]:你身上的武器没有存在,元素之石消失了.
BREAK
这段把六个变量全部读满,弹窗每个引用都有值。原来[@4]如果还保留着,别让它单独只处理A64,否则从@4入口进的时候A60到A62又是空的。要么让@4直接GOTO@3走完整流程,要么把完整读值代码复制到@4里。
六、用D变量替代A变量更省心
如果你不想纠结A变量被别的脚本覆盖,改成D60到D65会更稳:
D变量适合纯数字
不会和文本变量混在一起
同样跨段保留
弹窗写法还是<$STR(D60)>
改成D变量后的核心段:
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD60
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD61
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD62
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD63
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD64
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD65
SetNewItemValue14+<$STR(D63)>
SetNewItemValue15+<$STR(D64)>
SetNewItemValue16+<$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里只有一行,这是正常的随机取行结果。
一、当前脚本的变量引用链路
[@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-8BOM,第一行数字前面会藏一个不可见字符,SetNewItemValue读到它可能会失败。
文件路径也要核对。你写的是:
.\QuestDiary\数据文件\锻造数值.txt
实际位置一般是:
D:\MirServer\Mir200\Envir\QuestDiary\数据文件\锻造数值.txt
注意QuestDiary前面那一点,在脚本里表示当前Envir目录。如果文件不在对应位置,GetRandomText就取不到值,A变量照样空。
四、SetNewItemValue的属性代码别照抄
你用了14、15、16,同样一段代码在不同引擎里属性含义可能不一样。
常见的GOM属性代码对应:
4对应忽视目标防御
5对应攻击伤害反弹
6对应体质
但这只是常见对应,你要在自己的M2说明书里确认。如果属性代码不对,变量有值也能加上,但加错属性,弹窗看起来还是不对。
验证方法:先只跑一条,比如只加A63到14,打开武器面板看忽视目标防御涨没涨。涨了说明属性代码对,没涨说明代码表不对。
五、把赋值补全就修好了
最直接的改法是把A60、A61、A62全部补上GetRandomText,让它们在弹窗之前都有值。下面这段直接把[@3]和[@4]合并成一次完整赋值,[@5]只负责提示。
[@3]
IF
CHECKUSEITEM1
ACT
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA60
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA61
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA62
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA63
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA64
GetRandomText.\QuestDiary\数据文件\锻造数值.txtA65
SetNewItemValue14+<$STR(A63)>
SetNewItemValue15+<$STR(A64)>
SetNewItemValue16+<$STR(A65)>
MESSAGEBOX[精炼成功]:你的武器<WEAPON>,成功的增加了:\ \体质+<STR(A65)>%\攻击伤害+<STR(A60)>%\物理伤害减少+<STR(A61)>%\魔法伤害减少+<STR(A62)>%\忽视目标防御+<STR(A63)>%\攻击伤害反弹+<$STR(A64)>%
SENDMSG7[精炼成功]:你的武器<$WEAPON>属性精炼成功,元素之石消耗完了。
ELSEACT
MESSAGEBOX[失败提示]:你身上的武器没有存在,元素之石消失了.
BREAK
这段把六个变量全部读满,弹窗每个引用都有值。原来[@4]如果还保留着,别让它单独只处理A64,否则从@4入口进的时候A60到A62又是空的。要么让@4直接GOTO@3走完整流程,要么把完整读值代码复制到@4里。
六、用D变量替代A变量更省心
如果你不想纠结A变量被别的脚本覆盖,改成D60到D65会更稳:
D变量适合纯数字
不会和文本变量混在一起
同样跨段保留
弹窗写法还是<$STR(D60)>
改成D变量后的核心段:
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD60
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD61
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD62
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD63
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD64
GetRandomText.\QuestDiary\数据文件\锻造数值.txtD65
SetNewItemValue14+<$STR(D63)>
SetNewItemValue15+<$STR(D64)>
SetNewItemValue16+<$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里只有一行,这是正常的随机取行结果。

