传奇996引擎ALG-0903第十二节:ALG框架开发第一个NPC完整流程与脚本命名规范

来源: 作者: 点击:
996传奇三端引擎(ALG-0903 课程语境下的 ALG 框架)做第一个 NPC,本质就是打通“Merchant.txt 登记 → Market_Def 脚本文件 → QuestDiary 任务联动 → M2 重载生效”这条主链路。ALG 框架在原生 GOM 系基础上统一了目录约定与脚本加载顺序,但底层文件职责和老版 Mir2 完全一致。下面按实际落地顺序拆。

一、目录与文件职责(Mir200\Envir 下)
• Merchant.txt:NPC 花名册,登记名字、地图、坐标、外观、脚本路径,M2 启动与重载时读取

• Npcs.txt:管理类/系统类 NPC(雕像、石碑、固定功能),格式同 Merchant.txt

- Market_Def\:NPC 功能脚本根目录,文件名规则 NPC名-地图号.txt;支持建子目录,Merchant.txt 首字段写 子目录/NPC名
• Market_Def\QFunction-0.txt(QF):全局事件钩子(用物品、升级、杀怪、死亡触发)

- MapQuest_def\QManage.txt(QM):登录/建号/下线等生命周期触发
• QuestDiary\:复杂任务/活动/状态机脚本,NPC 内用 #CALL [\QuestDiary\路径\文件.txt] @段 调用

- DATA\cfg_model_info.xls + npclist:NPC 外观模型表,APP/RaceImg 对应客户端 npc.wzl/pak 索引

二、Merchant.txt 登记格式(空格分隔)

脚本路径名 地图号 X Y NPC显示名 方向 外观码 城堡(0/1) 移动(0/1) 移动间隔 变色(0/1) 变色速度

实例(盟重 3 号图,坐标 330 330,白衣老人外观 8):

新手向导 3 330 330 新手向导 0 8 0 0 0 0 0

• 新手向导 → Market_Def 里对应 新手向导-3.txt(-3 是地图号)

• 方向 0–8,外观码查 npclist / cfg_model_info.xls

• 末尾可追加变色模式/距离/固定色(ALG 框架继承原版扩展位)

- 子目录写法:新手引导/向导 3 330 330 新手向导 0 8 0 0 0 0 0 → 脚本文件 Market_Def\新手引导\向导-3.txt

三、Market_Def 第一个 NPC 脚本(新手向导-3.txt)
ALG 框架默认入口标签 [@Main](老版常写 [@main]),结构为 @标签 + #SAY/#IF/#ACT/#ELSESAY + <文字/@标签> 超链:
[@Main]
欢迎来到盟重省,我是新手向导!\ \
你的等级:<$LEVEL> 职业:<$JOB>\ \
<领取新手礼包/@GetGift> <传送到骷髅洞/@GoSkull> <离开/@Exit>\

[@GetGift]
#IF
CHECKVAR HUMAN 领过新手礼 1
#ACT
SENDMSG 6 你已领取过新手礼包!
CLOSE
#ELSE
#ACT
GIVE 乌木剑 1
GIVE 金创药(小) 5
GIVE 金币 1000
SET [HUMAN 领过新手礼] 1
SENDMSG 6 领取成功:乌木剑x1、金创药x5、金币1000!
CLOSE

[@GoSkull]
#IF
CHECKGOLD 500
#ACT
TAKE 金币 500
MAPMOVE 0 28 35
SENDMSG 6 传送至骷髅洞,扣除500金币!
CLOSE
#ELSE
#ACT
SENDMSG 6 金币不足500,无法传送!
CLOSE

[@Exit]
#ACT
CLOSE

要点:\ 换行;<文字/@标签> 是可点按钮;#IF 只写判断(CHECKGOLD/CHECKLEVELEX/CHECKVAR/CHECKITEM),#ACT 写执行(GIVE/TAKE/MAPMOVE/SET/SENDMSG);条件不满走 #ELSE / #ELSESAY;结尾 CLOSE 关窗 。编码必须 ANSI,UTF-8 必乱码 。

四、QuestDiary 联动(接任务→杀怪→提交)
Market_Def 里只做入口,复杂状态机放 QuestDiary:
文件 QuestDiary\新手任务\杀鸡任务.txt
[@接任务]
#IF
CHECKVAR HUMAN 杀鸡任务 1
#ACT
SENDMSG 6 任务进行中,去杀10只小鸡!
CLOSE
#ELSE
#ACT
SET [HUMAN 杀鸡任务] 1
MOV N1 0
SENDMSG 6 已接取任务:击杀小鸡10只,回来找我交任务!
CLOSE

[@交任务]
#IF
CHECKVAR HUMAN 杀鸡任务 1
LARGE N1 9
#ACT
SET [HUMAN 杀鸡任务] 2
GIVE 经验卷轴(小) 1
SENDMSG 6 任务完成!奖励经验卷轴x1
CLOSE
#ELSE
#ACT
SENDMSG 6 还没杀够10只小鸡!
CLOSE

杀怪计数在 QF(QFunction-0.txt)挂:
[@KillMon]
#IF
CHECKVAR HUMAN 杀鸡任务 1
EQUAL MONNAME 小鸡
#ACT
INC N1 1
#IF
LARGE N1 9
#ACT
SENDMSG 6 小鸡已够10只,回新手向导交任务!

NPC 主脚本里加一行跳转:

<接杀鸡任务/@接任务> <交杀鸡任务/@交任务>

并用 #CALL [\QuestDiary\新手任务\杀鸡任务.txt] @接任务 也可直接外链,ALG 框架两种写法都认 。

五、ALG 框架临时 NPC(脚本内动态创建)
不止 Merchant.txt 静态登记,ALG/996 支持运行时建删:
[@建临时NPC]
#ACT
CreateNPC 临时使者 3 335 335 8 临时使者-3 0 99999
SENDMSG 6 已在盟重创建临时使者!

[@删临时NPC]
#ACT
DelNpc 临时使者 3

CreateNPC 参数:名字 地图 X Y 外观 脚本名(在 Market_Def) 是否带地图前缀(0/1) NPCID(避开 cfg_npclist 冲突) 。

六、客户端外观补丁(三端一致)
1. 准备 NPC 序列帧图片 → 996 资源集成工具打包成 npc.wzl/pak → 丢客户端 anim\npc
2. 服务端 Envir\DATA\cfg_model_info.xls 加一行:NPC名、方向数、起始图片ID、APP/RaceImg
3. npclist 表登记外观码 → Merchant.txt 外观字段填该码
4. PC/安卓/iOS 三端共用同一套补丁,缺图显示默认老头或透明 。

七、重载与排错顺序
1. 改 Merchant.txt → M2「控制 → 重新加载 → 所有NPC」或 GM 命令 @reloadnpcall / @reloadnpc
2. 改 Market_Def 脚本 → 同上升级「重新加载NPC脚本」
3. 改 QF → 「重新加载功能脚本(QF)」;改 QM → 「重新加载QM脚本」;改 QuestDiary → 「重新加载任务脚本」
4. 场上已加载 NPC 改坐标不生效,需小退重进或删行重启 M2
5. 常见死点:文件名 向导-3.txt 写成 向导.txt(缺地图号)|Merchant 首字段与文件名不符|编码 UTF-8 乱码|#IF 段写了 GIVE/TAKE|外观码不在 npclist|子目录路径写反

八、ALG 框架第一个 NPC 最小可跑清单
• Merchant.txt:新手向导 3 330 330 新手向导 0 8 0 0 0 0 0

• Market_Def\新手向导-3.txt:[@Main] + 一个 <领礼包/@GetGift> + [@GetGift] 给物逻辑

- 编码 ANSI、M2 重载所有 NPC、进盟重 330 330 对话
• 扩任务再加 QuestDiary + QF 杀怪钩子

ALG 框架没改变 Mir2 NPC 的底色,只是把“登记→脚本→任务→重载”四步固化成课程里的标准动作;第一个 NPC 跑通,后面商店、转生、攻城、假人管理员全是同一套结构叠参数。