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登记格式(空格分隔)
脚本路径名地图号XYNPC显示名方向外观码城堡(0/1)移动(0/1)移动间隔变色(0/1)变色速度
实例(盟重3号图,坐标330330,白衣老人外观8):
新手向导3330330新手向导0800000
•新手向导→Market_Def里对应新手向导-3.txt(-3是地图号)
•方向0–8,外观码查npclist/cfg_model_info.xls
•末尾可追加变色模式/距离/固定色(ALG框架继承原版扩展位)
-子目录写法:新手引导/向导3330330新手向导0800000→脚本文件Market_Def\新手引导\向导-3.txt
三、Market_Def第一个NPC脚本(新手向导-3.txt)
ALG框架默认入口标签[@Main](老版常写[@main]),结构为@标签+#SAY/#IF/#ACT/#ELSESAY+<文字/@标签>超链:
[@Main]
欢迎来到盟重省,我是新手向导!\\
你的等级:<$LEVEL>职业:<$JOB>\\
<领取新手礼包/@GetGift><传送到骷髅洞/@GoSkull><离开/@Exit>\
[@GetGift]
#IF
CHECKVARHUMAN领过新手礼1
#ACT
SENDMSG6你已领取过新手礼包!
CLOSE
#ELSE
#ACT
GIVE乌木剑1
GIVE金创药(小)5
GIVE金币1000
SET[HUMAN领过新手礼]1
SENDMSG6领取成功:乌木剑x1、金创药x5、金币1000!
CLOSE
[@GoSkull]
#IF
CHECKGOLD500
#ACT
TAKE金币500
MAPMOVE02835
SENDMSG6传送至骷髅洞,扣除500金币!
CLOSE
#ELSE
#ACT
SENDMSG6金币不足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
CHECKVARHUMAN杀鸡任务1
#ACT
SENDMSG6任务进行中,去杀10只小鸡!
CLOSE
#ELSE
#ACT
SET[HUMAN杀鸡任务]1
MOVN10
SENDMSG6已接取任务:击杀小鸡10只,回来找我交任务!
CLOSE
[@交任务]
#IF
CHECKVARHUMAN杀鸡任务1
LARGEN19
#ACT
SET[HUMAN杀鸡任务]2
GIVE经验卷轴(小)1
SENDMSG6任务完成!奖励经验卷轴x1
CLOSE
#ELSE
#ACT
SENDMSG6还没杀够10只小鸡!
CLOSE
杀怪计数在QF(QFunction-0.txt)挂:
[@KillMon]
#IF
CHECKVARHUMAN杀鸡任务1
EQUALMONNAME小鸡
#ACT
INCN11
#IF
LARGEN19
#ACT
SENDMSG6小鸡已够10只,回新手向导交任务!
NPC主脚本里加一行跳转:
<接杀鸡任务/@接任务><交杀鸡任务/@交任务>
并用#CALL[\QuestDiary\新手任务\杀鸡任务.txt]@接任务也可直接外链,ALG框架两种写法都认。
五、ALG框架临时NPC(脚本内动态创建)
不止Merchant.txt静态登记,ALG/996支持运行时建删:
[@建临时NPC]
#ACT
CreateNPC临时使者33353358临时使者-3099999
SENDMSG6已在盟重创建临时使者!
[@删临时NPC]
#ACT
DelNpc临时使者3
CreateNPC参数:名字地图XY外观脚本名(在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:新手向导3330330新手向导0800000
•Market_Def\新手向导-3.txt:[@Main]+一个<领礼包/@GetGift>+[@GetGift]给物逻辑
-编码ANSI、M2重载所有NPC、进盟重330330对话
•扩任务再加QuestDiary+QF杀怪钩子
ALG框架没改变Mir2NPC的底色,只是把“登记→脚本→任务→重载”四步固化成课程里的标准动作;第一个NPC跑通,后面商店、转生、攻城、假人管理员全是同一套结构叠参数。
一、目录与文件职责(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登记格式(空格分隔)
脚本路径名地图号XYNPC显示名方向外观码城堡(0/1)移动(0/1)移动间隔变色(0/1)变色速度
实例(盟重3号图,坐标330330,白衣老人外观8):
新手向导3330330新手向导0800000
•新手向导→Market_Def里对应新手向导-3.txt(-3是地图号)
•方向0–8,外观码查npclist/cfg_model_info.xls
•末尾可追加变色模式/距离/固定色(ALG框架继承原版扩展位)
-子目录写法:新手引导/向导3330330新手向导0800000→脚本文件Market_Def\新手引导\向导-3.txt
三、Market_Def第一个NPC脚本(新手向导-3.txt)
ALG框架默认入口标签[@Main](老版常写[@main]),结构为@标签+#SAY/#IF/#ACT/#ELSESAY+<文字/@标签>超链:
[@Main]
欢迎来到盟重省,我是新手向导!\\
你的等级:<$LEVEL>职业:<$JOB>\\
<领取新手礼包/@GetGift><传送到骷髅洞/@GoSkull><离开/@Exit>\
[@GetGift]
#IF
CHECKVARHUMAN领过新手礼1
#ACT
SENDMSG6你已领取过新手礼包!
CLOSE
#ELSE
#ACT
GIVE乌木剑1
GIVE金创药(小)5
GIVE金币1000
SET[HUMAN领过新手礼]1
SENDMSG6领取成功:乌木剑x1、金创药x5、金币1000!
CLOSE
[@GoSkull]
#IF
CHECKGOLD500
#ACT
TAKE金币500
MAPMOVE02835
SENDMSG6传送至骷髅洞,扣除500金币!
CLOSE
#ELSE
#ACT
SENDMSG6金币不足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
CHECKVARHUMAN杀鸡任务1
#ACT
SENDMSG6任务进行中,去杀10只小鸡!
CLOSE
#ELSE
#ACT
SET[HUMAN杀鸡任务]1
MOVN10
SENDMSG6已接取任务:击杀小鸡10只,回来找我交任务!
CLOSE
[@交任务]
#IF
CHECKVARHUMAN杀鸡任务1
LARGEN19
#ACT
SET[HUMAN杀鸡任务]2
GIVE经验卷轴(小)1
SENDMSG6任务完成!奖励经验卷轴x1
CLOSE
#ELSE
#ACT
SENDMSG6还没杀够10只小鸡!
CLOSE
杀怪计数在QF(QFunction-0.txt)挂:
[@KillMon]
#IF
CHECKVARHUMAN杀鸡任务1
EQUALMONNAME小鸡
#ACT
INCN11
#IF
LARGEN19
#ACT
SENDMSG6小鸡已够10只,回新手向导交任务!
NPC主脚本里加一行跳转:
<接杀鸡任务/@接任务><交杀鸡任务/@交任务>
并用#CALL[\QuestDiary\新手任务\杀鸡任务.txt]@接任务也可直接外链,ALG框架两种写法都认。
五、ALG框架临时NPC(脚本内动态创建)
不止Merchant.txt静态登记,ALG/996支持运行时建删:
[@建临时NPC]
#ACT
CreateNPC临时使者33353358临时使者-3099999
SENDMSG6已在盟重创建临时使者!
[@删临时NPC]
#ACT
DelNpc临时使者3
CreateNPC参数:名字地图XY外观脚本名(在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:新手向导3330330新手向导0800000
•Market_Def\新手向导-3.txt:[@Main]+一个<领礼包/@GetGift>+[@GetGift]给物逻辑
-编码ANSI、M2重载所有NPC、进盟重330330对话
•扩任务再加QuestDiary+QF杀怪钩子
ALG框架没改变Mir2NPC的底色,只是把“登记→脚本→任务→重载”四步固化成课程里的标准动作;第一个NPC跑通,后面商店、转生、攻城、假人管理员全是同一套结构叠参数。

