九尾1.76的骰王脚本本质是一个围绕豹子判定的称号抢夺系统。玩家花元宝扔三个骰子,扔出三个相同数字即豹子,就能从上一任骰王手中夺走封号以及对应的攻击倍率加成。脚本的核心逻辑集中在豹子判定和称号转移两个环节,下面按文件配置、NPC脚本结构、骰子随机数生成、豹子判定与称号转移、奖励机制、变量占用和常见报错七个方面拆解。
## NPC文件与脚本路径配置
骰王NPC需要在MerChant.txt中注册。打开 `Mir200\Envir\MerChant.txt`,在文件末尾追加一行:
```
终极骰王 3 318 333 终极骰王 0 102 0
```
这行配置的含义是:NPC名称为终极骰王,所在地图编号3(盟重省),坐标(318,333),NPC外观编号102,朝向0。地图编号和坐标可以根据版本实际情况调整,改完后NPC会出现在对应位置。
脚本文件放在 `Mir200\Envir\Market_Def\` 目录下,文件名必须为“终极骰王-3.txt”,后缀中的-3代表地图编号,与MerChant.txt中配置的地图编号保持一致。如果NPC放在比奇省(地图编号0),文件名改为“终极骰王-0.txt”,MerChant.txt中的地图编号同步改为0。
## NPC对话脚本完整结构
脚本头部用CloseBigDialogBox关闭默认的大对话框,然后显示骰王介绍文字。完整的脚本结构如下:
```
[@main]
#IF
#ACT
CloseBigDialogBox
#SAY
<★★★★★/SCOLOR=249>本尊只奖励服务器<唯一/SCOLOR=250>的玩家。\
<获得此封号的玩家可以享受在线1.2倍攻击的待遇,其他玩家可以通/SCOLOR=243>\
<过骰子抢夺封号,不限制等级、职业、装备好坏,只要你觉得你运/SCOLOR=254>\
<气人品足够好,就可以发起挑战。当你看到(豹子)的时候,也就是/SCOLOR=250>\
<你获得1.2倍攻击的时候!心动吧!快来摇骰字吧!/SCOLOR=253>\
<╭────────────╮/SCOLOR=242>\
<│/SCOLOR=242><豪赌天下.九尾骰王/@独霸天下><│/SCOLOR=242>\
<╰────────────╯/SCOLOR=242>\
```
SCOLOR参数控制文字颜色,249为金色,250为白色,253为粉色,254为蓝色,242为灰色。这些颜色值在九尾引擎中是固定的,改其他数字可能显示不出预期效果。方框边框用制表符拼成,不参与脚本逻辑,只影响视觉呈现。
`<豪赌天下.九尾骰王/@独霸天下>` 是点击按钮,跳转到@独霸天下段落,该段落负责显示当前骰王信息和扔骰子入口。
## 骰王信息展示与扔骰子入口
@独霸天下段落显示当前骰王的角色名、当选时间和等级,这三个数据分别存在A46、A47、A48三个全局字符变量中:
```
[@独霸天下]
<当前骰王玩家/SCOLOR=254>:<[/SCOLOR=249><$STR(A46)><]/SCOLOR=249>\
<骰王当选时间/SCOLOR=254>:<[/SCOLOR=249><$STR(A47)><]/SCOLOR=249>\
<骰王当前等级/SCOLOR=254>:<[/SCOLOR=249><$STR(A48)><]/SCOLOR=249>\
○<●/SCOLOR=253>○<●/SCOLOR=253>○<●/SCOLOR=253><开始扔骰子去/@开始扔骰子去><●/SCOLOR=253>○<●/SCOLOR=253>○<●/SCOLOR=253>○\
<一、/SCOLOR=249><一百元宝/SCOLOR=250>可以扔一次骰子,扔到<豹子/SCOLOR=250>也就是三个数字一样就可\
以<获得封号/SCOLOR=250>,之前的封号玩家就会<失去/SCOLOR=250>1.2倍攻击!\
<二、/SCOLOR=249><目前此封号下线后效果保存/SCOLOR=254>\
```
`<$STR(A46)>` 是字符变量的标准引用格式,A46中存储的是上一任骰王的角色名称。A47存储当选时间,用 `<$DATETIME>` 格式记录。A48存储当选时的等级。这三个变量是全局字符变量,服务器重启后依然存在,对应“此封号下线后效果保存”的说明。
## 元宝扣费与骰子随机数生成
点击“开始扔骰子去”后进入扣费环节。脚本先检测元宝是否超过99,超过则扣除100元宝,不足则弹出提示:
```
[@开始扔骰子去]
#IF
CheckGameGold > 99
#ACT
GameGold - 100
GOTO @骰子活动
break
#ElseAct
MESSAGEBOX 元宝不足100个,无法扔骰子!
break
```
`CheckGameGold > 99` 检测当前元宝数量是否大于99,`GameGold - 100` 扣除100元宝。检测条件和扣费数值需要匹配,如果元宝价格改成200,检测条件改为 `CheckGameGold > 199`,扣费改为 `GameGold - 200`。
扣费成功后跳转到@骰子活动段落,这里生成三个1到6之间的随机数:
```
[@骰子活动]
#IF
#ACT
MOVR N20 1 7
MOVR N21 1 7
MOVR N22 1 7
MOV D0 <$STR(N20)>
MOV D1 <$STR(N21)>
MOV D2 <$STR(N22)>
playdice 3 @检测点数
break
```
`MOVR N20 1 7` 在1到6之间生成随机整数存入N20,后面两个MOVR同理。三个N变量分别存储三个骰子的点数。`MOV D0 <$STR(N20)>` 把N20的值复制到D0变量,这是playdice命令读取点数的关键。playdice命令的格式是 `playdice 骰子数量 @跳转标签`,第一个参数3表示显示三个骰子,第二个参数指定骰子动画播放完毕后跳转到哪个标签。D0、D1、D2三个变量分别对应三个骰子显示的点数,这是九尾引擎中playdice命令的固定映射规则。
## 豹子判定与称号转移
playdice动画播放完毕后跳转到@检测点数,脚本比对三个N变量是否相等:
```
[@检测点数]
#IF
EQUAL N20 <$STR(N21)>
EQUAL N20 <$STR(N22)>
#ACT
SendTopMsg 251 233 ◆◇◆玩家[%s]弹劾[<$STR(A46)>]成为新的九尾骰王,获得1.2倍攻击的奖励◆◇◆
SendCenterMsg 251 233 ◆◇◆玩家[%s]弹劾[<$STR(A46)>]成为新的九尾骰王,获得1.2倍攻击的奖励◆◇◆
GuildNoticeMsg 251 233 ◆◇◆玩家[%s]弹劾[<$STR(A46)>]成为新的九尾骰王,获得1.2倍攻击的奖励◆◇◆
AddTextList .\QuestDiary\登陆脚本\弹劾名单.txt <$STR(A46)>
MOV A46 <$USERNAME>
MOV A47 <$DATETIME>
MOV A48 <$LEVEL>
MOV G49 0
INC G49 <$MC>
INC G49 <$MAXMC>
INC G49 <$SC>
#CALL [\登陆脚本\封号脚本.txt] @封号设置
#CALL [\登陆脚本\封号检测.txt] @封号奖励
BREAK
CLOSE
```
`EQUAL N20 <$STR(N21)>` 和 `EQUAL N20 <$STR(N22)>` 两个条件同时成立时,三个骰子点数相同,即为豹子。条件判断只比对N变量,不比对D变量。D变量只负责传递给playdice命令用于动画显示,实际的豹子判定逻辑读取的是N20、N21、N22三个变量。
称号转移的核心命令是 `MOV A46 <$USERNAME>`,把A46变量的值从上一任骰王的名字改为当前玩家的名字。A47同步记录当选时间,A48记录等级。`MOV G49 0` 先把G49清零,然后用三条INC命令累加当前玩家的MC、MAXMC和SC数值,G49最终存储的是攻魔道总和,用于在骰王信息界面展示战斗力。
`AddTextList` 把上一任骰王的名字写入弹劾名单文件,记录称号变更历史。两条 `#CALL` 命令分别调用封号脚本和封号检测脚本,前者负责在数据库层面授予称号和属性加成,后者在玩家上线时检测当前骰王状态并恢复对应的倍率效果。
## 攻击倍率奖励的实现机制
脚本中声明的是1.2倍攻击奖励,实际倍率通过POWERRATE命令在封号脚本中设置。POWERRATE的格式为 `POWERRATE 操作符 倍率 有效时间`,倍率参数除以100为实际倍率。1.2倍攻击对应的命令写法是:
```
POWERRATE + 120 0
```
120除以100等于1.2,即1.2倍攻击。有效时间填0表示永久有效,与“此封号下线后效果保存”的说明对应。如果需要设置限时倍率,有效时间填秒数,例如600表示10分钟后自动失效。
POWERRATE的倍率参数使用加法或减法操作符,`POWERRATE + 120 0` 在玩家现有倍率基础上增加1.2倍。如果玩家身上已经有其他倍率效果,使用加法操作符会叠加。改用 `POWERRATE = 120 0` 则直接覆盖设置为1.2倍,不叠加。
部分引擎版本中POWERRATE需要指定类型参数,格式为 `POWERRATE 类型 倍率 时长`,类型参数1代表物攻倍率,2代表魔攻倍率,3代表双攻倍率。九尾引擎的POWERRATE命令默认作用于双攻,脚本中不写类型参数即可。
## 变量占用与冲突排查
脚本占用了以下几个变量。A46、A47、A48是全局字符变量,分别存储骰王角色名、当选时间和当选等级。G49是全局数字变量,存储骰王的攻魔道总和。N20、N21、N22是私人数字变量,在每次扔骰子时临时生成,小退后自动归零。D0、D1、D2是私人数字变量,用于传递骰子点数给playdice命令。
版本中如果已经有其他功能使用了A46到A48或G49,会出现数据互相覆盖的问题。排查方法是打开 `Mir200\Envir\QuestDiary\` 目录下所有脚本文件,搜索A46、A47、A48、G49这四个变量名,确认没有其他NPC或触发段落在使用。如果有冲突,把骰王脚本中的变量编号整体替换为未占用的编号,例如改用A80到A82和G80。
弹劾名单文件 `.\QuestDiary\登陆脚本\弹劾名单.txt` 的路径是相对路径,以M2Server所在的Mir200目录为基准。如果QuestDiary下没有“登陆脚本”这个子文件夹,需要手动创建,或者把路径改为已有的目录。路径中的反斜杠必须为英文半角,中文全角斜杠会导致文件创建失败。
## 常见报错与排查
扔骰子后骰子不显示或一直转圈不停止,检查playdice命令的格式是否正确。正确格式为 `playdice 3 @检测点数`,第一个参数是骰子数量,第二个参数是跳转标签。跳转标签必须存在于同一脚本文件中,写成@检测点数但文件中没有[@检测点数]段落,骰子动画播放完毕后找不到跳转目标,客户端会卡在动画状态。
豹子判定始终不触发,检查N20、N21、N22三个变量的随机数范围。`MOVR N20 1 7` 生成的随机数范围是1到6,如果误写成 `MOVR N20 7` 则范围变成0到6,可能出现0点骰子,与playdice命令的显示逻辑不匹配,豹子判定也会因为0点数的存在而出现异常。确保MOVR命令使用两个参数格式。
元宝扣除后骰子没反应,检查 `GOTO @骰子活动` 的跳转目标是否与文件中实际的段落标识一致。标识名称区分大小写,@骰子活动和@骰子活动(含空格)会被视为不同的标识。同时检查@骰子活动段落中是否有#IF空条件判断,部分引擎版本中空#IF会导致整个段落被跳过。
称号转移后新骰王没有获得攻击倍率加成,问题出在封号脚本的POWERRATE命令上。打开 `QuestDiary\登陆脚本\封号脚本.txt`,找到@封号设置段落中的POWERRATE语句,确认倍率参数是否正确。1.2倍对应120,2倍对应200,写错数字会导致倍率不符预期。同时确认有效时间参数是否设置合理,填0表示永久有效,填了非零值则倍率会在指定秒数后自动失效。
所有脚本文件必须保存为ANSI编码。用记事本另存为时在编码下拉菜单中选ANSI,选UTF-8会导致中文字符串乱码,虽然英文命令本身不受影响,但脚本中的中文NPC名称、变量引用和提示文字如果出现乱码,会导致条件判断失败或跳转目标找不到。修改脚本后重启M2Server,或在控制台执行 `@ReloadManage` 重新加载Market_Def目录下的NPC脚本,同时用 `@ReloadRobot` 重新加载机器人脚本以刷新封号检测逻辑。
传奇九尾1.76骰王脚本明文完整写法 从NPC配置到豹子判定与称号转移奖励机制详解
来源:
作者:
点击:

