GOM引擎数学表达式命令配置指南 - 脚本运算怎么写
摘要:GOM引擎数值运算遵循命令名加三参数格式,MUL做乘法、DIV做整数除法、CHECKMOD检测余数、CALCUMOD拆分商与余数,PERCENT求占比、CalcPer取百分之几。首参数为结果位,除数为零会跳过整段,整数除法直接截断小数。本文给出按等级算金币并按10万一批拆分的完整NPC脚本配置。…
前两天在本地测试版本里调一个奖励翻倍的脚本,原本想用MOV直接写死数值,结果玩家等级一变化,奖励就对不上了。翻到帮助文档才想起,GOM引擎里专门有一套数学表达式命令,乘法、除法、取余、求百分比全都能用变量完成,不用自己在对话里硬算。
很多新手写脚本遇到要算奖励、算经验、算概率,第一反应是把数字写死,一旦涉及比例就抓瞎。其实把MUL、DIV、MOD、PERCENT这几条命令理顺,绝大部分数值运算都能在脚本段里就地完成。下面按语法、参数、实战、坑点的顺序讲清楚。

语法速查
GOM引擎的数值运算命令都遵循同一个套路:命令名后面跟三个参数,前两个是参与运算的数,最后一个是保存结果的变量。乘法MUL N1 N2 N3表示N1=N2*N3,这就是MUL乘法;除法DIV N1 N2 N3表示N1=N2/N3,即DIV除法,这两条最常用。
[@运算]
#IF
#ACT
Mov N2 10
Mov N3 20
MUL N1 N2 N3
DIV N4 N2 N3
SENDMSG 5 相乘结果:<$STR(N1)> 相除结果:<$STR(N4)>
取余分两种写法,这就是MOD取余的标准用法。检测用的是CHECKMOD 被除数 除数 余数,判断余数是否等于某个值;运算用的是CALCUMOD 被除数 除数 整数取值 余数取值,把商和余数分别存进两个变量。
[@模除检测]
#IF
CHECKMOD 10 3 1
#SAY
10除以3余数正好是1,条件成立!
#ELSESAY
条件不成立!
[@模除运算]
#IF
#ACT
CALCUMOD 10 3 N1 N2
SENDMSG 0 10除以3等于<$STR(N1)> 余数为:<$STR(N2)>
百分比运算有两条,PERCENT N1 N2 N3表示N1=(N2/N3)*100,CalcPer 当前值 百分比 变量表示取当前值的百分之几,这就是CalcPer百分比的标准用法。

参数说明
几条运算命令的参数位置完全一致,照着表格对位填即可。
| 命令 | 参数关系 | 典型用法 |
|---|---|---|
MUL N1 N2 N3 |
N1=N2乘N3 | 把N2里的奖励翻倍,乘2存进N1 |
DIV N1 N2 N3 |
N1=N2除以N3 | 把N3里的经验按N3等分,结果存N1 |
CHECKMOD 被除数 除数 余数 |
判断余数是否等于第三参 | 判断数量是不是3的倍数 |
CALCUMOD 被除数 除数 商 余数 |
商和余数分别存两个变量 | 分批领奖,每批3个,看余几个 |
PERCENT N1 N2 N3 |
N1=(N2/N3)乘100 | 求当前血量占满血的百分比 |
CalcPer 当前值 百分比 变量 |
取当前值的百分之几 | 取当前攻击的百分之十 |
参数顺序别搞反。MUL和DIV的第一个参数都是结果变量,后面两个才是运算数,写的时候别把结果塞进第二个位置,否则原本的数会被覆盖。CALCUMOD四个参数里第三个存商、第四个存余数,顺序固定。
踩坑提醒
整数除法直接截断是第一坑。DIV做的是整数除法,10除以3得到的是3而不是3.33,小数部分直接丢掉,不会四舍五入。要判断余数,必须配合CHECKMOD或CALCUMOD,不能指望除法结果自带小数。
除数为零会让脚本段直接异常。DIV第三个参数如果是0,或者CHECKMOD里除数是0,运算没有意义,引擎会跳过这段。涉及变量做除数时,先用检测命令判断除数不为0再运算。
运算结果类型不匹配是第二坑。算出来的数值要拼进对话文本,必须先存进数字变量,再用<$STR(N0)>引用;直接往S字符变量里算,显示出来的是地址而不是数字。
命令名拼写以帮助文档为准,脚本内怎么写引擎都能识别,团队协作保持一种写法即可,方便一眼认出是运算命令。mul、MUL、Mul引擎都认,脚本里怎么写都行,但团队协作时建议统一大写,方便一眼认出是运算命令。

实战配置
下面做一个可落地的例子:玩家交任务时,按当前等级的两倍给金币,并把总数拆成每10万一批发,看余数判断要不要补一批。
第一步,打开本地测试版本目录D:\本地传奇版本\Mir200\Envir\Market_Def下的对应NPC脚本文件,在对话段末尾空出位置准备写运算。
第二步,先用MUL把当前等级乘2得到奖励系数,再乘一个基数算出金币总数,结果存进N0。
[@领取奖励]
#IF
#ACT
MUL N0 <$LEVEL> 2
MUL N1 N0 50000
SENDMSG 5 本次可领金币:<$STR(N1)>
第三步,用CALCUMOD把金币总数按10万一批拆分,商存N2,余数存N3,余数大于0就说明最后还要补一批。
#IF
#ACT
CALCUMOD N1 100000 N2 N3
GAMEGOLD + <$STR(N1)>
SENDMSG 5 共分<$STR(N2)>批发放,余零:<$STR(N3)>金币已一并到账!
第四步,保存后在M2控制台重载NPC脚本,上线找到这个NPC领取一次奖励,对照聊天栏里的数字和背包实际金币是否一致。
常见问题
1. 问:MUL乘法命令和直接MOV赋值有什么区别,什么时候必须用乘法?
MOV N1 100是把100这个固定数塞进去,写死不变。MUL N1 N2 N3是拿两个变量相乘,结果随变量实时变化。奖励要随等级翻倍、伤害要按系数放大、经验要按倍数结算时,必须用MUL,否则等级一变数字就对不上。固定常数才用MOV。
2. 问:脚本里inc和dec跟MUL、DIV有什么区别,能互相替代吗?
INC N1 1是在原数上加一个固定值,DEC N1 1是减,属于步进增减;MUL和DIV是乘除缩放。加加减减用inc、dec,按比例放大缩小用mul、div。三者不能互相替代:把奖励翻倍用inc要先读原值再加一遍,麻烦且容易出错,直接MUL N1 N1 2一步到位。(本条问题整理自百度知道真实提问:传奇变量inc和dec的用法,2018-03)
3. 问:这些数学运算命令应该写在脚本的哪个段里,写在对话脚本还是QFunction?
运算命令本身没有固定触发段,放在哪里取决于你想什么时候算。NPC对话里点按钮领奖,就写在该NPC的对话段#ACT下;登录时算一次属性,就写在QManage登录脚本;穿戴装备时算,写在QFunction。关键是#IF条件过完,#ACT后面按顺序写运算命令即可,引擎从上往下依次执行。(本条问题整理自百度知道真实提问:传奇gom引擎脚本命令常用命令分类,2026-07)
4. 问:算出来的结果在聊天栏显示成一堆奇怪数字,是哪里写错了?
九成是变量类型没转。数字变量算完直接引用<$STR(N0)>能正常显示;如果先把结果塞进了S开头的字符变量,再直接引用就会显示成内存地址。排查时把运算结果统一存进N数字变量,提示语里一律用<$STR(N0)>形式引用,不要混用S变量承接运算结果。
5. 问:DIV除法算10除以3为什么不是3.33,小数去哪了?
GOM引擎的DIV是整数除法,只保留商的整数部分,小数部分直接截断,不做四舍五入。要拿到余数做后续判断,用CALCUMOD 10 3 N1 N2,N1得商3,N2得余数1。想做更细的小数运算,引擎脚本层面不支持,需要把数值放大整数倍后再除法,最后人工缩放回来。
6. 问:MOD取余命令和PERCENT百分比命令在统计奖励时怎么搭配?
取余解决分批问题,百分比解决比例问题。比如每10万金币一批,用CALCUMOD 总数 100000 商变量 余数变量看余几个;再比如想按当前经验的百分之十发额外奖励,用CalcPer 当前经验 10 变量取绝对值,或用PERCENT 变量 当前经验 总经验算占比。一个管整除拆分,一个管比例缩放,搭配着用。(本条问题整理自百度知道真实提问:《传奇》服务端中变量运用的所有命令,2019-08)
要点回顾
数学表达式命令把脚本里的数值计算从写死变成了动态运算:乘除用MUL和DIV,取余用CHECKMOD检测、CALCUMOD拆分,求比例用PERCENT和CalcPer。记住第一个参数永远是结果位、除数不能为零、数字结果统一存N变量再用<$STR()>引用,日常算奖励、算经验、算概率就够了。
上面MUL、DIV、MOD、PERCENT四类数学运算的脚本实例,都在本地GOM引擎测试版本里逐个跑通过;这组命令只适配GOM引擎,换到其他引擎同名功能参数可能变形,要跨引擎使用得自己重测一遍。内容仅限单机本地学习调试。
扫描二维码推送至手机访问。
本文章M2GM发布,如需转载请注明出处。如有侵权请联系站长删除。
本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。













