传奇魔剑版本王者生死决斗脚本完整配置参考 从NPC对话到地图参数与胜负判定全流程实现

来源: 作者: 点击:
王者生死决斗脚本的核心逻辑是:NPC处点击进入→传送到决斗地图SSJDC→地图参数限制回城和随机→死亡触发胜负判定→发放奖励并传回主城。整个脚本由Market_Def目录下的NPC对话脚本、MapInfo.txt中的地图参数、QFunction-0.txt中的死亡触发段落三部分构成,缺任何一块功能都不完整。

## NPC对话脚本与进入逻辑

脚本放在 `Mir200\Envir\Market_Def\` 目录下,文件名建议用“王者决斗使者.txt”。完整写法如下:

```
[@main]
#SAY
<-----------------------/SCOLOR=254>\
<王者生死决斗/SCOLOR=253>\
<-----------------------/SCOLOR=254>\
<你是不是在找人杀~/SCOLOR=250>\
<简单介绍:进入地图免费,这里是你杀人pk最好的地方!/SCOLOR=251>\
<特别注意:这里聚集了各路高手,没准备好千万不要随便进入/SCOLOR=252>\
<我要进入/@jing>\
<准备好了再说/@exit>\

[@jing]
#IF
CHECKLEVEL > 39
#ACT
MAPMOVE SSJDC
GIVE 回城卷 1
SENDMSG 0 <%s>进入生死决斗地图,大声叫到:不要迷恋姐,姐能让你吐血!不要迷恋哥,哥只是个传说!
SENDMSG 6 已进入生死决斗地图,死亡后将自动传出。
#ELSESAY
你的等级不足40级,无法进入生死决斗地图。
```

CHECKLEVEL > 39 限制进入等级,等级不足的玩家看到#ELSESAY中的提示。MAPMOVE SSJDC 把玩家传送到地图编号为SSJDC的决斗地图,这个编号必须在MapInfo.txt中已经定义过,否则传送会失败。GIVE 回城卷 1 给玩家发放一个回城卷作为保底道具,部分版本中决斗地图内禁止使用回城卷,这条命令只起到心理安慰作用,实际能不能用取决于地图参数配置。SENDMSG 0是全区全服公告,格式中的%s会自动替换为触发玩家的角色名。

## 地图参数配置

打开 `Mir200\Envir\MapInfo.txt`,找到或新增SSJDC地图的定义行。决斗地图的参数配置参考如下:

```
[SSJDC 生死决斗场] FIGHT4 NOHORSE NORECONNECT(0) NOPOSITIONMOVE
```

FIGHT4是挑战地图专用参数,激活后地图内禁止召唤英雄、死亡不掉落物品、不增加PK值。NOHORSE禁止骑马,避免玩家骑乘坐骑进入决斗区域。NORECONNECT(0)控制断线后的处理方式,括号内的0表示断线后不自动重连回本地图,玩家小退或掉线后重新上线会回到主城。NOPOSITIONMOVE禁止使用坐标移动类道具,防止玩家在对战中使用随机传送卷逃避战斗。

如果版本引擎不支持FIGHT4参数,可以拆解为多个独立参数使用:`DECGAMEGOLD(0)` 禁止扣游戏币、`NOPOSITIONMOVE` 禁止随机传送、`NORECALL` 禁止天地合一召唤。部分引擎中挑战地图还需要额外加上 `BattlingDisExit` 参数,作用是战斗状态下禁止退出地图,强制玩家打完再走。

地图本身的素材文件需要与SSJDC编号对应。如果服务端中没有现成的决斗场地图,从服务端的Maps文件夹中找一张面积适中、地形开阔的地图,把它的地图编号改为SSJDC,并在MapInfo.txt中按上述格式配置。

## 死亡触发与胜负判定

胜负判定的核心触发点在QFunction-0.txt中。当玩家在决斗地图内死亡时,引擎会触发@OnDie或@HumanDie段落,脚本在这里判断死亡位置是否在SSJDC地图内,是则传回主城并清理状态:

```
[@OnDie]
#IF
CHECKMAPNAME SSJDC
#ACT
SENDMSG 6 你在生死决斗中阵亡,3秒后传回主城。
DELAYGOTO 3 @传回主城
BREAK

[@传回主城]
#ACT
MAPMOVE 3 330 330
SENDMSG 0 玩家[<$USERNAME>]在生死决斗中败下阵来!
```

CHECKMAPNAME SSJDC 检测死亡瞬间玩家所在地图是否为决斗地图。DELAYGOTO 3 @传回主城 设置3秒延迟后跳转到传回段落,给玩家一个短暂的死亡动画缓冲时间。MAPMOVE 3 330 330 把玩家传送到盟重省坐标(330,330),3是盟重省的地图编号。如果版本的主城是比奇省,改为 MAPMOVE 0 330 330。SENDMSG 0 是失败公告,与进入时的公告形成呼应。

如果是双人约战模式,需要记录双方角色名。在NPC脚本中增加报名逻辑:

```
[@报名]
#IF
CHECK [800] 0
#ACT
SET [800] 1
MOV S10 <$USERNAME>
SENDMSG 6 你已报名参加生死决斗,等待对手应战。
#ELSESAY
你已经报名了,等待对手应战。
```

SET [800] 1 把标识800设为已报名状态,MOV S10 <$USERNAME> 把报名者角色名存入S10字符变量。后来者点击应战时,脚本检测S10中是否已有角色名,有则双方同时MAPMOVE到SSJDC地图,并记录双方的角色名用于后续胜负公告。

## 禁止回城与随机传送的处理

决斗地图内如果允许玩家使用回城卷和随机传送卷,对战就失去了意义。禁止方式分两层。

地图参数层面,在MapInfo.txt的SSJDC行中加入 `NOPOSITIONMOVE` 禁止坐标移动类道具,加入 `NORECALL` 禁止天地合一等召唤技能。部分引擎还支持 `DISABLEITEM 回城卷 随机传送卷` 参数,直接在地图内禁用指定物品的使用。

脚本层面,在QFunction-0.txt中增加物品使用拦截。当玩家在决斗地图内双击回城卷时触发@UseItem段落,检测地图名称为SSJDC则直接中断使用:

```
[@UseItem]
#IF
CHECKMAPNAME SSJDC
EQUAL <$USEITEMNAME> 回城卷
#ACT
SENDMSG 6 生死决斗中禁止使用回城卷!
BREAK
```

EQUAL <$USEITEMNAME> 回城卷 判断玩家双击的物品名称是否为回城卷。随机传送卷、地牢逃脱卷等道具可以按同样格式追加判断条件,每增加一种需要拦截的道具就增加一个EQUAL条件。

小退和掉线同样是一种逃避手段。FIGHT4地图参数中的NORECONNECT(0)已经处理了掉线重连的问题,玩家掉线后重新上线不会回到决斗地图。如果需要更严格的限制,可以在QFunction-0.txt的[@Login]段落中增加检测,玩家上线时如果检测到决斗状态标识仍然激活,直接清空该标识并提示决斗已中断。

## 倒计时与限时平局处理

无限期的决斗会导致双方都耗着不出手,设置倒计时强制结束是标配。在进入地图的[@jing]段落中增加计时变量:

```
[@jing]
#IF
CHECKLEVEL > 39
#ACT
MAPMOVE SSJDC
GIVE 回城卷 1
MOV G10 <$STR(G10)>
INC G10 1
SENDMSG 6 生死决斗开始!5分钟内未分出胜负,双方均判定为失败并传回主城。
DELAYGOTO 300 @决斗超时
SENDMSG 0 <%s>进入生死决斗地图,大声叫到:不要迷恋姐,姐能让你吐血!不要迷恋哥,哥只是个传说!
```

DELAYGOTO 300 @决斗超时 设置300秒(5分钟)后自动跳转到超时处理段落:

```
[@决斗超时]
#IF
CHECKMAPNAME SSJDC
#ACT
MAPMOVE 3 330 330
SENDMSG 6 决斗时间到,未分出胜负,你已被传回主城。
SENDMSG 0 生死决斗超时,双方均判定为失败!
BREAK
```

超时处理中先检测玩家是否还在决斗地图内,还在则传回主城。已经死亡的玩家在@OnDie段落中已经被传走了,超时段落执行时CHECKMAPNAME SSJDC不成立,脚本直接结束,不会重复传送。

倒计时秒数可以通过全局变量控制,方便GM在M2控制台中动态调整。把DELAYGOTO 300中的300改为 `<$STR(G15)>`,在M2控制台执行 `@SetGVar G15 600` 即可把决斗时间改为10分钟。

## 奖励发放与失败处理

决斗胜利方的奖励在死亡触发段落中发放。当检测到对方玩家死亡时,给存活方发放奖励:

```
[@OnDie]
#IF
CHECKMAPNAME SSJDC
#ACT
SENDMSG 6 你在生死决斗中阵亡,3秒后传回主城。
DELAYGOTO 3 @传回主城
SENDMSG 0 玩家[<$USERNAME>]在生死决斗中败下阵来!
GIVE 决斗勋章 1
BREAK
```

GIVE 决斗勋章 1 给死亡方发放一个安慰奖,作为参与决斗的纪念。胜利方的奖励需要反向判断:在死亡触发的同一时刻,检测地图内是否还有其他存活玩家,有则给存活玩家发放胜利奖励。这部分逻辑需要配合地图人数检测命令CHECKHUM完成:

```
[@OnDie]
#IF
CHECKMAPNAME SSJDC
CHECKHUM SSJDC 1
#ACT
SENDMSG 0 生死决斗产生胜者!
SENDMSG 6 决斗胜利!获得决斗王者称号。
GIVE 王者勋章 1
```

CHECKHUM SSJDC 1 检测决斗地图内剩余玩家数量是否为1,是1说明只有一个存活者,即为胜者。GIVE 王者勋章 1 发放胜利奖励,同时用SENDMSG 0发全服公告。如果地图内剩余人数大于1,说明还有其他玩家在决斗中,不给胜利奖励,避免多人混战时误判。

需要限制每人每天只能领取一次胜利奖励的话,在发放奖励前增加标识检测:

```
#IF
CHECK [801] 0
#ACT
SET [801] 1
GIVE 王者勋章 1
SENDMSG 6 今日首胜奖励已发放。
```

标识801在每天零点通过机器人脚本重置,重置方式是在AutoRunRobot.txt中增加 `#AutoRun NPC RUNONDAY 0:00 @重置决斗标识`,在RobotManage.txt中写入 `[@重置决斗标识] #ACT SET [801] 0`。

## 变量与标识分配

决斗脚本中使用的变量要避开版本中已有的任务变量。标识位[800]用于记录玩家是否已报名,[801]用于记录当日胜利奖励领取状态。全局变量G10用于记录决斗次数统计,G15用于控制倒计时秒数。字符变量S10用于存储约战发起者的角色名。

所有标识位和变量在脚本使用前必须确认未被其他NPC占用。搜索Market_Def目录下所有txt文件中的SET和MOV命令,检查700到850区间的标识位和G0到G20区间的全局变量是否已有其他用途。冲突的变量会导致两个功能的数