这段装备精炼脚本在执行之后会出现弹窗提示里变量显示错误,核心原因是变量定义顺序、读取时机不匹配,同时部分变量没有赋值就直接调用,会出现空值或者读取上一轮残留数据的情况。先拆解原有脚本逻辑,再定位问题,最后给出修改后的完整代码。
原脚本分段执行逻辑,[@3]读取A63,给第4号元素属性增加数值,跳转[@4]。[@4]读取A64,给第5号元素属性增加数值,跳转[@5]。[@5]里面判断身上装备,读取A65,给第6号元素属性增加数值。弹窗MESSAGEBOX内直接调用A60、A61、A62,但是在整个脚本流程里,A60、A61、A62从来没有执行GetRandomText读取文本赋值,这就是最主要的变量错误根源。脚本运行时A60、A61、A62没有从锻造数值txt文件获取随机值,读取的是内存里残留旧变量,导致弹窗显示异常,数值错乱,甚至出现空白或者乱码。
第二个问题,变量读取时机。脚本分三段跳转,A63、A64、A65依次读取,但是弹窗内一次性展示全部六条属性,前面A60、A61、A62缺失读取语句。原有代码只读取了A63、A64、A65三个变量,剩下三个属性对应的变量完全没有获取随机文本,变量为空,弹窗调用直接出错。
第三个潜在问题,变量不会自动清空。多次执行精炼操作,变量不会自动重置,上一次精炼保存的A60至A65数据会保留在内存,下一次精炼如果部分变量没有重新赋值,就继续沿用旧数据,造成属性数值和弹窗文字对不上,玩家看到的提示文字和实际装备增加的属性不一致。
第四个风险点,装备检测语句位置。[@5]中#IF CHECKUSEITEM 1写在读取A65和SetNewItemValue前面,逻辑上是先判断有没有佩戴武器,再读取数值写入属性。如果玩家在脚本执行中途取下武器,会出现数值已经读取,但是装备不存在,造成变量已经生成,但是属性无法写入装备,消耗材料但是精炼不生效。
第五个隐患,文本读取文件路径,GetRandomText读取QuestDiary目录锻造数值.txt,要确认文本文件编码,保存格式必须为ANSI编码,使用UTF8编码会造成读取变量失败,变量读取为空。txt文件内每行单独放置一个数字,不能有多余空格、中文注释,否则读取失败,变量拿到无效字符。
修改思路,在脚本最开始一次性读取全部六个变量A60、A61、A62、A63、A64、A65,统一从锻造数值.txt获取随机数值,保证弹窗展示的变量全部有来源。统一做变量清零,每次精炼开始先清空A60到A65,清除上一轮残留变量。调整装备判断位置,优先校验玩家是否佩戴武器,校验通过之后再读取随机数值,执行属性写入,避免材料消耗之后无装备可写入属性。
修改后的完整脚本:
[@3]
#IF
CHECKUSEITEM 1
#ACT
MOV A60 0
MOV A61 0
MOV A62 0
MOV A63 0
MOV A64 0
MOV A65 0
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 3 + <$STR(A60)>
SetNewItemValue 1 4 + <$STR(A61)>
SetNewItemValue 1 5 + <$STR(A62)>
SetNewItemValue 1 6 + <$STR(A63)>
SetNewItemValue 1 7 + <$STR(A64)>
SetNewItemValue 1 8 + <$STR(A65)>
MESSAGEBOX [精炼成功]:你的武器<$WEAPON>,成功的增加了:\ \体质+<$STR(A65)>%\攻击伤害+<$STR(A60)>%\物理伤害减少+<$STR(A61)>%\魔法伤害减少+<$STR(A62)>%\忽视目标防御+<$STR(A63)>%\攻击伤害反弹+<$STR(A64)>%
SENDMSG 7 [精炼成功]:你的武器<$WEAPON>属性精炼成功,元素之石消耗完了。
BREAK
调整之后,脚本先判断是否佩戴武器,再一次性清零全部变量,读取六组随机数值,依次写入装备六条元素属性,弹窗调用的A60到A65全部已经赋值,不会出现读取旧残留变量的问题。不需要分段跳转[@4][@5],减少多次跳转带来的逻辑中断风险。
额外需要核对的细节,SetNewItemValue后面的属性序号,确认引擎内元素属性编号是否匹配,1 3、1 4这类序号不同引擎定义存在差异,如果属性加错,核对引擎说明书里面装备元素属性顺序。锻造数值.txt文件,每行单独一个数字,不要空行,文件放置路径QuestDiary\数据文件\,文件夹名称区分大小写,路径名称不要中文特殊符号。
增加材料扣除判断,原有脚本缺少材料消耗判断,建议在#IF条件内增加材料检测,检测成功之后再执行#ACT区块,防止不消耗材料直接精炼。示例在#IF内增加HAVEITEM判断,检测对应精炼材料,同时在#ACT内增加TAKE扣除材料,避免无材料触发精炼。
补充失败分支,原有脚本没有精炼失败逻辑,如需概率失败,可以增加RAND随机判断,失败分支不执行SetNewItemValue,弹窗提示精炼失败,材料扣除或者保留根据需求自行设定。
变量使用习惯,脚本内使用完变量,建议每次执行前统一MOV清零,防止多次调用脚本时,旧变量残留造成数值错乱。GetRandomText读取文本,如果txt文件行数不足,会读取空值,需要保证txt内数字行数足够,大于随机读取的最大行数,避免读取空内容。
脚本测试步骤,保存脚本之后重启M2,重载Quest脚本,进入游戏测试精炼。测试时观察弹窗内六条数值是否和写入装备的属性保持一致,如果数值对不上,优先核对SetNewItemValue的属性序号,其次检查txt文件编码与内容格式。
如果修改后依旧变量异常,检查引擎版本,部分旧版本引擎对多变量同时GetRandomText支持有限,可分开多次读取,同时关闭引擎内变量缓存相关选项。也可以单独写一段测试脚本,单独输出A60到A65的数值,MESSAGEBOX单独打印每个变量,排查哪一个变量读取为空。

