能量兑换声望和装备换能量是一套双向循环系统,装备回收后变成能量点,能量点积累到一定数量后兑换成声望或其他属性。核心依赖两个引擎内置变量,GAMEPOINT存储能量点数,CREDITPOINT存储声望点数。CHECKGAMEPOINT检测能量是否足够,GAMEPOINT + 数量增加能量,GAMEPOINT - 数量扣除能量,CREDITPOINT + 数量增加声望。NPC脚本不依赖自定义变量,所有数据由引擎直接管理,配好之后不需要额外做下线保存处理。
## NPC文件与脚本路径配置
NPC需要在MerChant.txt中注册。打开 `Mir200\Envir\MerChant.txt`,在文件末尾追加一行,格式为NPC名称 地图编号 X坐标 Y坐标 外观编号 朝向。地图编号和坐标按版本实际情况调整,NPC外观编号推荐使用102或108这类商人外观。
脚本文件放在 `Mir200\Envir\Market_Def\` 目录下,文件名格式为“NPC名称-地图编号.txt”。如果NPC放在盟重省(地图编号3),文件名写“能量使者-3.txt”。文件保存为ANSI编码,用记事本另存为时在编码下拉菜单中选ANSI,选UTF-8会导致中文字符串乱码。
## 主菜单脚本结构
脚本入口用[@main]段落,列出两个主要功能入口,同时显示当前能量点数方便玩家查看:
```
[@main]
我可以将您的成长值变为更有用的属性。\
想试试吗?\
先把你的成长值变为声望你看怎么样?\
兑换条件是100个能量换1个声望。\
当前能量点数:<$GAMEPOINT>\
<兑换声望/@兑换声望>\
<装备换能量/@兑换能量>\
<离开/@exit>
```
`<$GAMEPOINT>` 是引擎内置变量,直接返回玩家当前的游戏点数,不需要在任何地方声明或初始化。首次使用该变量的玩家能量值为0,随着装备回收和兑换操作自动增减。
## 能量兑换声望脚本
兑换逻辑分两步,先检测能量是否充足,充足则扣除能量并增加声望:
```
[@兑换声望]
#IF
CHECKGAMEPOINT > 99
#ACT
GAMEPOINT - 100
CREDITPOINT + 1
#SAY
您已经兑换了一点声望。\
当前声望:<$CREDITPOINT>点\
<返回/@main>
#ELSESAY
您的能量不够100,无法兑换声望。\
<返回/@main>
```
CHECKGAMEPOINT > 99 检测能量点数是否大于99,条件成立执行扣费和兑换。GAMEPOINT - 100 扣除100点能量,CREDITPOINT + 1 增加1点声望。检测条件写> 99而不是> 100,因为兑换消耗恰好是100点,能量等于100时应该允许兑换,> 99等价于>= 100。
声望有上限的情况下需要增加上限检测。CREDITPOINT的默认上限是255,达到上限后继续兑换不会产生效果,脚本中增加上限判断:
```
[@兑换声望]
#IF
CHECKCREDITPOINT > 254
#ACT
MESSAGEBOX 你的声望值已经到了最大值无法兑换!
GOTO @main
BREAK
#IF
CHECKGAMEPOINT > 99
#ACT
GAMEPOINT - 100
CREDITPOINT + 1
MESSAGEBOX 兑换成功。当前声望为<$CREDITPOINT>点!
GOTO @main
BREAK
#ELSEACT
MESSAGEBOX 兑换1点声望需要100点能量点数!
GOTO @main
BREAK
```
CHECKCREDITPOINT > 254 检测声望是否已达上限,达到上限直接提示并返回主菜单。两个#IF段落之间不共用#ACT,每个#IF独立执行,条件不成立时走#ELSEACT或跳到下一个#IF。BREAK命令在每个分支末尾跳出当前脚本段落,防止执行流程继续往下走触发不相关的逻辑。
兑换比例可以按版本需求调整。脚本中写100能量换1声望,改成60能量换1声望就把GAMEPOINT - 100改为GAMEPOINT - 60,CHECKGAMEPOINT的检测条件同步改为> 59。检测条件和扣除数值必须匹配,检测条件比扣除数值小1是最安全的写法。
## 装备换能量分级回收脚本
装备换能量按装备档次分级,不同档次的装备回收后获得不同数量的能量点。先写回收菜单:
```
[@兑换能量]
<一级回收>:可以将你不需要的沃玛装备换成100点能量\
<二级回收>:可以将你不需要的祖玛装备换成500点能量\
<三级回收>:可以将你不需要的赤月装备换成5000点能量\
<一级回收/@使一级回收>\
<二级回收/@使二级回收>\
<三级回收/@使三级回收>\
<返回/@main>
```
三个回收等级各自对应独立的装备列表页面。一级回收页面列出所有可回收的沃玛首饰:
```
[@使一级回收]
╔══════════════════════════╗\
┆选择你需要回收的沃玛首饰: 『<返回/@兑换能量>』 ┆\
╠══════╦══════╦══════╦══════╣\
┆『<龙之戒指/@回龙之>』┆『<幽灵项链/@回幽灵>』┆『<记忆项链/@回记忆>』┆\
╠══════╬══════╬══════╬══════╣\
┆『<铂金戒指/@回铂金>』┆『<心灵手镯/@回心灵>』┆『<天珠项链/@回天珠>』┆\
╠══════╬══════╬══════╬══════╣\
┆『<红宝石戒指/@回红宝>』┆『<思贝儿手镯/@回思贝>』┆『<生命项链/@回生命>』┆\
╚══════╩══════╩══════╩══════╝
```
每个装备按钮跳转到独立的回收段落。以龙之戒指为例:
```
[@回龙之]
#IF
CHECKITEM 龙之戒指 1
#ACT
TAKE 龙之戒指 1
GAMEPOINT + 100
SENDMSG 7 你获得了100点能量值!
#SAY
回收成功!当前能量点数:<$GAMEPOINT>\
<继续回收/@使一级回收>\
<返回主菜单/@main>
#ELSESAY
SENDMSG 5 〖提示〗你没有龙之戒指!
GOTO @使一级回收
```
CHECKITEM 龙之戒指 1 检测背包中是否有至少1个龙之戒指。条件成立时TAKE 龙之戒指 1 扣除装备,GAMEPOINT + 100 增加100点能量。SENDMSG 7 发送绿色聊天提示,告诉玩家获得了多少能量。条件不成立时走#ELSESAY分支,发送提示消息后跳回一级回收页面,让玩家继续选择其他装备。
二级回收和三级回收的脚本结构与一级回收完全相同,只需要把CHECKITEM和TAKE后面的装备名称改成祖玛装备和赤月装备,GAMEPOINT后面的数值改为500和5000。如果版本中装备名称较多,可以每页只显示6到8个按钮,用翻页按钮跳转到下一页的装备列表。
## 变量命令与操作符
GAMEPOINT和CREDITPOINT的加减操作使用+和-符号。`GAMEPOINT + 100` 增加100,`GAMEPOINT - 100` 扣除100。数值范围受引擎限制,GAMEPOINT的有效范围是0到2100000000,CREDITPOINT默认上限为255,部分引擎版本中可以通过引擎配置调整声望上限。
`<$GAMEPOINT>` 和 `<$CREDITPOINT>` 是直接引用变量值的内置常量,在#SAY和SENDMSG中直接书写即可,不需要用<$STR()>包裹。这与自定义变量N2、G88的引用格式不同,自定义变量在对话文本中必须写<$STR(N2)>才能解析出实际数值,而GAMEPOINT和CREDITPOINT本身就是引擎内置的常量接口。
CHECKGAMEPOINT和CHECKCREDITPOINT是条件判断命令,只能写在#IF段落中,不能写在#ACT中。格式为 `CHECKGAMEPOINT 操作符 数值`,操作符支持>、<、=。CHECKCREDITPOINT的用法相同,用于检测声望是否达到某个值。
如果版本中需要将能量值保存到自定义变量做额外记录,用 `MOV N10 <$GAMEPOINT>` 把能量值复制到N10变量,`MOV G88 <$GAMEPOINT>` 复制到全局变量G88。反向操作把自定义变量写回能量值,格式为 `MOV GAMEPOINT <$STR(N10)>`,将N10的值赋给GAMEPOINT。注意赋值命令的方向,MOV的第一个参数是目标变量,第二个参数是源值。
## 装备检测命令的配合使用
CHECKITEM用于检测背包中是否有指定物品,格式为 `CHECKITEM 物品名称 数量`。数量填1表示至少有一个,填2表示至少有两个。检测通过后TAKE命令扣除物品,格式为 `TAKE 物品名称 数量`,数量必须与CHECKITEM中的数量一致,否则会出现检测通过但扣除失败的异常。
TAKE命令不会自动判断物品是否存在,如果CHECKITEM检测没有通过而TAKE仍然执行,会出现扣除空气的问题。所有TAKE命令必须放在CHECKITEM条件成立的#ACT段落中,不能写在#IF外面。
如果版本中装备名称包含空格或特殊符号,CHECKITEM和TAKE后面的名称需要用英文双引号包裹,例如 `CHECKITEM “龙之戒指” 1`。不加引号时引擎会把空格后面的内容解析为数量参数,导致物品名称截断。
## 循环兑换与连续操作
玩家回收装备后通常希望继续回收同一等级的装备,在每个回收段落的#SAY中加入继续回收按钮:
```
<继续回收/@使一级回收>\
<返回主菜单/@main>
```
点击继续回收跳回该等级的装备列表页面,玩家的操作流程不中断。返回主菜单按钮用于切换回收等级或去兑换声望。
如果版本需要一键回收功能,用TakeBagItem命令批量收取背包中的指定装备。格式为 `TakeBagItem 物品名称 收取数量 元宝 金币 泡点值 泡点经验 变量 聚灵珠经验 是否显示提示`。泡点值参数对应的就是能量点数,TakeBagItem命令执行后会自动给玩家增加对应数量的泡点值,同时把实际回收的物品数量存入变量参数中。
一键回收脚本示例:
```
[@一键回收]
#IF
#ACT
TakeBagItem 龙之戒指 1 0 0 100 0 N10 0 1
TakeBagItem 幽灵项链 1 0 0 100 0 N11 0 1
TakeBagItem 记忆项链 1 0 0 100 0 N12 0 1
SENDMSG 6 一键回收完成,共回收<$STR(N10)>个龙之戒指、<$STR(N11)>个幽灵项链、<$STR(N12)>个记忆项链。
BREAK
```
TakeBagItem的第五个参数填100表示每个被回收的装备增加100点泡点值,即能量点数。第七个参数N10是变量占位,引擎会把实际回收的物品数量写入该变量,脚本中用<$STR(N10)>引用回收数量。
## 常见错误与排查
兑换后能量没减少或声望没增加,检查GAMEPOINT和CREDITPOINT的大小写。引擎内置变量名全部大写,写成gamepoint或GamePoint在部分引擎版本中不被识别,命令执行后无任何效果且不报错。统一用全大写格式。
CHECKGAMEPOINT的检测条件与GAMEPOINT的扣除数值不匹配是最常见的逻辑错误。检测写> 99扣除100是正确的,检测写> 100扣除100会导致能量恰好等于100时检测不通过,玩家看到能量足够却提示不够的提示。检测条件比扣除数值小1是安全写法。
装备回收后提示没有该装备但背包里确实有,检查CHECKITEM后面的装备名称是否与StdItems.DB中的记录完全一致,包括空格、括号和标点符号。数据库中的物品名称多一个空格或少一个括号,CHECKITEM检测就会失败。打开DBC2000编辑器进入StdItems.DB表核对装备名称。
兑换脚本不执行,检查#IF和#ACT是否完整书写,缺失任何一个标签引擎都无法解析脚本。每个#IF后面必须有#ACT或#SAY,#ACT中的每条命令以英文分号结尾,遗漏分号会导致该行命令被忽略。
脚本文件必须保存为ANSI编码。用记事本另存为时在编码下拉菜单中选ANSI,选UTF-8会导致中文字符串乱码,虽然英文命令本身不受影响,但脚本中的中文提示和物品名称如果包含中文会出现解析错误。修改脚本后重启M2Server,或在控制台执行@ReloadManage重新加载Market_Def目录下的NPC脚本。
传奇能量兑换声望与装备换能量脚本完整写法 双向循环系统NPC配置与变量命令详解
来源:
作者:
点击:

