当前位置:首页 > 实操教程 > GOM引擎 > 正文内容

GOM引擎数学表达式命令配置指南 - 脚本运算怎么写

M2GM2026-10-06GOM引擎49
摘要:GOM引擎数值运算遵循命令名加三参数格式,MUL做乘法、DIV做整数除法、CHECKMOD检测余数、CALCUMOD拆分商与余数,PERCENT求占比、CalcPer取百分之几。首参数为结果位,除数为零会跳过整段,整数除法直接截断小数。本文给出按等级算金币并按10万一批拆分的完整NPC脚本配置。…
[TOCM]

前两天在本地测试版本里调一个奖励翻倍的脚本,原本想用MOV直接写死数值,结果玩家等级一变化,奖励就对不上了。翻到帮助文档才想起,GOM引擎里专门有一套数学表达式命令,乘法、除法、取余、求百分比全都能用变量完成,不用自己在对话里硬算。

很多新手写脚本遇到要算奖励、算经验、算概率,第一反应是把数字写死,一旦涉及比例就抓瞎。其实把MUL、DIV、MOD、PERCENT这几条命令理顺,绝大部分数值运算都能在脚本段里就地完成。下面按语法、参数、实战、坑点的顺序讲清楚。

数学表达式命令配图 - M2GM

语法速查

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百分比的标准用法。

数学表达式命令内容示意图 - M2GM

参数说明

几条运算命令的参数位置完全一致,照着表格对位填即可。

命令 参数关系 典型用法
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引擎都认,脚本里怎么写都行,但团队协作时建议统一大写,方便一眼认出是运算命令。

数学表达式命令脚本配置示意图 - M2GM

实战配置

下面做一个可落地的例子:玩家交任务时,按当前等级的两倍给金币,并把总数拆成每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发布,如需转载请注明出处。如有侵权请联系站长删除。

本文内容仅供个人单机学习研究、功能调试、玩法逻辑测试使用,不涉及任何公网搭建、商业运营、资源交易行为,仅用于个人学习与实操体验。

本文链接:https://www.m2gm.com/tech/gom/math-expression/

分享给朋友:

相关文章

NPC命令打开卧龙笔记怎么写?Blue引擎OPENBOOK书页详解

NPC命令打开卧龙笔记怎么写?Blue引擎OPENBOOK书页详解

OPENBOOK是BLUE引擎由NPC打开卧龙笔记书页的命令,后接三参数:参数1指定Data\books子目录,参数2指定该目录下uib文件,参数3指定跳转节名。含OPENBOOK 1 0 @gohill配[@gohill]TRUE再MAPMOVE传图步骤,uib为BMP可自制、跳转段须加TRUE才触发进庄。…

Blue引擎宝箱物品触发脚本教程 - OpenTreasureChest命令实操

Blue引擎宝箱物品触发脚本教程 - OpenTreasureChest命令实操

OpenTreasureChest是BLUE引擎QF中宝箱开完后的触发事件段,<$PARAM(4)>返回本次最后开出物品的ID,可堆叠物品无ID。本文说明该触发与OPENBOX开箱命令的区别、BoxItem.txt奖励配置分工、PARAM(4)取值规则和三步配置流程,解答开箱后物品不进包等常见问题。…

大秦插件NPC点击触发怎么带参数?NPC脚本传参脚本教程

大秦插件NPC点击触发怎么带参数?NPC脚本传参脚本教程

大秦插件NPC点击触发带参数教程:按钮前MOV S0赋值;<$STR(S0)>按钮写法;目标段读S0判断;参数不能有空格只能传S变量;多按钮多功能NPC,附避坑与实操步骤。…

SD插件SDBDelMonHp切割命令脚本教程 - 宝宝切割必查的参数细节

SD插件SDBDelMonHp切割命令脚本教程 - 宝宝切割必查的参数细节

SD插件宝宝切割教程:命令SDBDelMonHp六个参数,参数2选固定值或百分比切割,参数4控制切割对象只切怪物,参数5设百分比分母,含报错排查与三阶案例,适配SD插件脚本学习,仅供单机本地调试。…

宝宝名颜色改不掉?996引擎ChangeSlaveNameColor变色脚本教程

宝宝名颜色改不掉?996引擎ChangeSlaveNameColor变色脚本教程

996引擎ChangeSlaveNameColor教程:一个参数颜色值;253红254绿255蓝;改所有宝宝;下线恢复默认;新招宝宝默认色,附避坑与实操步骤。…

SD插件SDBMakePosion命令用法 - 宝宝攻击附毒与麻痹状态改变详解

SD插件SDBMakePosion命令用法 - 宝宝攻击附毒与麻痹状态改变详解

SD插件宝宝攻击状态教程:命令SDBMakePosion三个参数,状态编号0绿毒1红毒5麻痹12冰冻13蛛网,在宝宝物理魔法攻击触发调用,含状态效果对比与避坑,适配SD插件脚本学习,仅供单机本地调试。…

大秦插件NPC倒计时标签怎么用?SetNpcCountDown命令功能教程

大秦插件NPC倒计时标签怎么用?SetNpcCountDown命令功能教程

大秦插件NPC倒计时教程:三参数NPC标识秒数提示文字;显示在NPC头顶不是屏幕中间;到0自动消失;能多个NPC同时倒数;配合DelayCall做倒计时完触发,附避坑与实操步骤。…

大秦插件NPC对话框绝对坐标怎么设?SetNpcDialogPos脚本教程

大秦插件NPC对话框绝对坐标怎么设?SetNpcDialogPos脚本教程

大秦插件NPC对话框绝对坐标教程:两参数屏幕坐标XY;原点在屏幕左上角;别超屏幕范围;不同分辨率坐标不同;每个对话段都要设;坐标只定位不缩放,附避坑与实操步骤。…