传奇脚本条件判断执行顺序详解

来源: 作者: 点击:
您提供的脚本逻辑存在一个关键的执行顺序问题,导致了您观察到的现象。它的执行顺序是从上到下依次检测,但只执行第一个满足条件的#ACT段,而不是满足任意条件就跳转。

脚本实际执行流程分析

您脚本中[@TXWheel_1_2]段落的逻辑结构如下:
1. 第一步:检测 #IF SMALL G19 100000 (G19 < 100,000)
◦ 如果为真:则执行其后的#ACT(生成随机数,跳转到@TXWheel_2_1),然后BREAK结束整个脚本段。

◦ 如果为假:则继续执行下一个#IF进行判断。

2. 第二步:检测 #IF LARGE G19 1000000 (G19 > 1,000,000)
◦ 如果为真:则执行其后的#ACT,然后BREAK结束。

◦ 如果为假:则继续执行下一个#IF进行判断。

3. 第三步:检测 #IF CHECKGAMEGOLD > 9 (元宝 > 9)
◦ 如果为真:则执行其后的#ACT。

◦ 如果为假:则执行最后的#ELSEACT(弹出元宝不足提示)。

核心问题与错误原因

1. 您对逻辑的理解有误:这不是“满足三个条件之一就跳转”,而是“从上到下检查,只执行最先满足的那个条件块”。这是传奇脚本标准执行方式。

2. 报错信息根源:您收到的错误 变量P1取值在0到72之间 直接指出了语法问题。
◦ 在第三步的#ACT中,命令是 MOVR P1 72。

◦ MOVR命令的格式是 MOVR 变量名 随机数上限,其含义是:生成一个从 0 到 (随机数上限-1) 的整数。

◦ 因此,MOVR P1 72 的意思是生成一个 0 到 71 之间的随机数。但提示信息显示引擎将其解释为生成 0 到 72 之间的数,这可能是个微小歧义,但核心是参数72本身语法正确,不应该导致M2加载报错。报错的根本原因很可能不在这条命令本身,而在于您将LARGE改成SMALL时引发的其他语法错误(如条件嵌套不当、缺少结束符等),导致引擎解析后续参数时错乱。您看到的这个错误是解析错乱后的结果表象。

现象解释与修正方案

• 为何“把SMALL改成LARGE,游戏里点抽奖没反应”?

假设您将第一个#IF SMALL G19 100000改成了#IF LARGE G19 100000。
◦ 这意味着第一步检测变为:G19是否大于10万?

◦ 如果您的G19值小于10万,此条件不满足,流程进入第二步。

◦ 第二步检测G19是否大于100万?显然也不满足(都小于10万了),流程进入第三步。

◦ 第三步检测元宝>9。如果此时您包裹内元宝也不足10个,则条件不满足,于是执行最后的#ELSEACT,即弹出“元宝不足”的提示框,之后GOTO @TXWheel_1返回转盘界面。 这在您看来就是“点抽奖没反应”(实际是弹窗后回到了起点)。

• 正确的、符合您“满足任一条件则抽奖”意图的脚本写法应为:
[@TXWheel_1_2]
#IF
#ACT
;-- 条件判断开始 --
; 情况一:G19 < 100000
SMALL G19 100000
MOVR P1 96
MOV M35 <$STR(P1)>
GOTO @TXWheel_2_1
BREAK

; 情况二:G19 > 1000000
LARGE G19 1000000
MOVR P1 48
MOV M35 <$STR(P1)>
GOTO @TXWheel_2_1
BREAK

; 情况三:元宝 > 9
CHECKGAMEGOLD > 9
MOVR P1 72
MOV M35 <$STR(P1)>
GOTO @TXWheel_2_1
BREAK

; 以上条件均不满足
#ELSEACT
MESSAGEBOX [提示]:启动幸运大转轮1次需要10个元宝,你的元宝不足无法启动。\ \    请确保你的包裹内有多余的地方放奖品。
GOTO @TXWheel_1
BREAK

但请注意:以上写法只是逻辑示意,传奇脚本中多个#IF-#ACT块的串联通常需要用不同的标签分隔。更常见的实现方式是使用#IF配合#ACT与#ELSEACT的嵌套,或分别用GOTO跳转到不同的标签块进行处理。您原有的脚本结构,从语法上看是为了实现优先级判断(先判断G19大小,最后判断元宝),而非“或”关系。

结论与建议

1. 脚本逻辑:您原脚本是顺序优先级判断,不是“或”逻辑。它优先检查G19的数值区间,只有当前两个区间都不满足时,才检查元宝是否足够。
2. 报错原因:MOVR P1 72语法无误。报错极可能是您将LARGE改为SMALL时,破坏了脚本的语法结构(比如可能导致编译器将后续字符错误地解析为参数),引发M2加载失败。游戏内能运行但报错,是因为M2加载了有语法错误的脚本,执行到错误参数时触发。
3. 修改建议:
◦ 明确您的设计意图:是希望G19在不同区间有不同抽奖行为(当前逻辑),还是希望“G19小于10万 或 大于100万 或 元宝足够”这三种情况都执行同一个抽奖逻辑?

◦ 如果是前者(当前逻辑),请检查并修正您修改SMALL/LARGE时引入的语法错误,确保每个#IF-#ACT-#BREAK块完整独立。

◦ 如果是后者(或逻辑),您需要重写判断结构,例如可以将三种条件用#OR命令连接,或者用GOTO将三种情况引导至同一个执行标签。