传奇脚本逻辑全解:从触发机制到变量运算的完整执行链

来源: 作者: 点击:
传奇脚本本质是“事件驱动+条件分支+变量存储”的执行流,引擎在角色登录、杀怪、死亡、使用物品、点击NPC时触发对应标签,按“检测→执行→跳转/终止”的顺序逐行解析,所有逻辑围绕 Market_Def(NPC对话)、QuestDiary(任务流程)、MapQuest_def(全局/地图事件)三个目录展开。

一、脚本执行优先级与触发入口
引擎加载顺序决定执行先后:先跑 QManage.txt(登录/全局管理),再跑 QFunction.txt(地图/行为触发),最后加载 Market_Def 下的 NPC 脚本。触发标签分三类:
• 系统固定标签:[@Login](登录)、[@KillMonster](杀怪)、[@PlayDie](死亡)、[@GetItem](捡物)、[@UseItem_物品名](使用物品)、[@SpeedClose](加速断线),名字不可改,写在对应文件内自动生效。

• NPC 标签:以 NPC 文件名或脚本内定义的 [@段名] 为入口,如 [@老兵]、[@兑换使者],点击 NPC 时引擎匹配文件名或脚本内标签调用。

• 自定义触发:通过脚本内 #CALL 命令跳转至其他文件的 [@段名],实现模块化调用,如 #CALL [\QuestDiary\日常\押镖.txt] @开始押镖。

二、核心逻辑结构:条件分支与流程控制
脚本执行以“行”为单位,自上而下,遇控制命令跳转。基础结构为“标签→检测→执行→跳转/终止”:
[@段名]
IF

检测命令1
检测命令2
ACT

执行命令1
执行命令2
ELSEACT

执行命令3
BREAK
• #IF 后可接多个检测命令,需全部为真才执行 #ACT 块;任意一条为假则跳转至 #ELSEACT(若存在)。

• GOTO @段名 强制跳转至指定标签,常用于循环或流程分支;BREAK 终止当前脚本执行,防止穿透至下一段;CLOSE 关闭 NPC 对话框。

• 多分支用 #ELSEIF 嵌套,如:

IF

CHECKLEVEL > 50
ACT

GIVE 高级装备 1
ELSEIF

CHECKLEVEL > 30
ACT

GIVE 中级装备 1
ELSEACT

GIVE 初级装备 1
BREAK

三、变量体系:数据存取的底层逻辑
变量是脚本逻辑的核心,按作用域和存储方式分为五类:
• 临时变量(P0-P9、S0-S9):仅当前脚本对话有效,小退或关闭NPC后清空,用于临时计算,如 P0 记录当前兑换数量。

• 个人持久变量(D0-D9、N变量名):绑定角色账号,存盘后永久有效,用于任务进度、杀怪计数、充值记录,如 N杀怪计数 记录累计杀怪数,重启服务器不丢失。

• 全局变量(G0-G9):全服共享,用于活动开关、全服计数,如 G0 控制“双倍经验活动”是否开启(1为开,0为关)。

• 字符串变量(S、N):存储文本,如 N$玩家昵称 记录角色名,用于对话显示或条件判断。

• 标志位(ONOFF):通过 SETONOFF 命令设置,共1000个(0-999),用于复杂任务状态锁,如 SETONOFF 101 1 标记“已完成新手任务第一步”。

变量操作命令:MOV(赋值,MOV D0 100)、INC(自增,INC D0 1)、DEC(自减,DEC D0 1)、SUM(求和,SUM D0 D1 即 D0=D0+D1)、MOVR(随机数,MOVR D0 5 给 D0 赋0-4)、CALC(四则运算,CALC G10 = G10 + 1)、CHECKVAR(检测变量,CHECKVAR D0 100 判断 D0 是否等于100)。

四、检测命令:条件判断的底层规则
检测命令写在 #IF 后,用于判断角色状态、物品、地图、时间等条件,核心逻辑是“返回真/假”:
• 角色属性:CHECKLEVEL(等级,CHECKLEVEL > 35)、CHECKGOLD(金币)、CHECKGAMEGOLD(元宝)、CHECKEXP(经验)、CHECKPKPOINT(PK值)、CHECKJOB(职业,CHECKJOB Warrior 战士)、CHECKGENDER(性别,CHECKGENDER 0 男)。

• 物品检测:CHECKITEM(背包物品,CHECKITEM 金矿 5)、CHECKITEMW(穿戴装备,CHECKITEMW 屠龙)、CHECKDURA(持久,CHECKDURA 屠龙 10 持久大于10)、CHECKBAGSIZE(背包空位,CHECKBAGSIZE 3 至少3格空位)。

• 地图与环境:ISONMAP(当前地图,ISONMAP 0 比奇)、CHECKHUM(地图人数,CHECKHUM 0 50 比奇在线50人)、CHECKTIME(时间,CHECKTIME 18 0 22 0 18点-22点)、CHECKDAYOFWEEK(星期,CHECKDAYOFWEEK 6 周六)。

• 概率与随机:RANDOM(概率,RANDOM 5 20%概率)、MOVR(随机数,配合变量使用)。

• 变量检测:CHECKVAR(变量值)、CHECKONOFF(标志位,CHECKONOFF 101 1 判断标志位101是否为1)。

五、执行命令:动作触发的实现方式
执行命令写在 #ACT 后,用于修改角色属性、物品、地图状态、发送消息等:
• 物品与金钱:GIVE(给予,GIVE 金条 1)、TAKE(扣除,TAKE 金矿 5)、TAKEW(按序列号删物品)、TAKEB(脱装备,TAKEB ALL 脱全身)、GAMEGOLD(元宝,GAMEGOLD +500)、GOLD(金币,GOLD +1000000)、MAKE(脚下生成物品,MAKE 金币 10)。

• 属性修改:CHANGEEXP(经验,CHANGEEXP +10000)、CHANGELEVEL(等级,CHANGELEVEL +1)、CHANGEPKPOINT(PK值,CHANGEPKPOINT -100)、SETHEALTH(生命上限)、SETPOW(攻击)、SETMAGIC(魔法)、CHANGEJOB(转职,CHANGEJOB 1 法师)、CHANGEGENDER(变性,CHANGEGENDER 1 女)。

• 地图与怪物:MAPMOVE(定点传送,MAPMOVE 0 330 330 比奇安全区)、MAP(随机传地图,MAP 3 盟重)、MONCLEAR(清图怪,MONCLEAR 0 比奇)、MONGEN(刷怪,MONGEN 祖玛卫士 10 10 330 330 比奇坐标刷10只,10分钟刷新)。

• 消息发送:SENDMSG(消息,SENDMSG 5 欢迎光临 个人绿字;SENDMSG 0 全服公告 全服黄字)、MESSAGEBOX(弹窗,MESSAGEBOX 任务完成)、#BROADCAST(全服广播,#BROADCAST 服务器重启倒计时5分钟)。

• 流程控制:GOTO(跳转)、BREAK(终止)、CLOSE(关对话框)、#CALL(调用子程序,#CALL [\QuestDiary\活动\攻城.txt] @开始攻城)。

六、实战逻辑案例:杀怪计数领奖
需求:杀100只祖玛卫士,领屠龙刀,每日重置。
实现(QFunction-0.txt):
[@KillMonster]
IF

EQUAL N$怪物名 祖玛卫士
ACT

INC N$杀怪计数 1
IF

EQUAL N$杀怪计数 100
ACT

SENDMSG 5 杀满100只祖玛卫士,获得屠龙刀!
GIVE 屠龙 1
MOV N$杀怪计数 0
ELSEACT

SENDMSG 6 已杀祖玛卫士:<STR(N杀怪计数)>/100
BREAK
(每日重置需在 QManage.txt 的 [@Login] 或定时脚本中加 MOV N$杀怪计数 0)

七、脚本调试与常见错误
• 编码错误:脚本文件需存为 ANSI 编码,UTF8 会导致中文乱码、命令不识别。

• 变量作用域错误:临时变量 P0 在 NPC 对话结束后清空,需持久存储用 D0 或 N$。

• 标签重复:同一文件内标签名不可重复,否则引擎加载时覆盖。

• 命令参数错误:物品名需与 StdItems.DB 完全一致(含空格需用引号,如 "沃玛号角"),MAPMOVE 坐标需在地图范围内。

• 逻辑穿透:#IF 块后未加 BREAK,导致条件不成立时继续执行下一段 #ACT。

• 触发失效:系统标签名拼写错误(如 [@KillMon] 写成 [@Killmon]),或文件放错目录(QFunction 脚本需放 MapQuest_def 下)。

八、模块化脚本设计
大型服需将脚本拆分:基础功能(如兑换、传送)放 Market_Def,任务流程放 QuestDiary\任务,活动逻辑放 QuestDiary\活动,全局触发放 MapQuest_def,通过 #CALL 调用公共模块(如 [\QuestDiary\公共\变量重置.txt] @每日重置),避免代码冗余,便于维护。

脚本逻辑的核心是“触发→检测→执行→存储”的闭环,变量是连接各模块的纽带,条件分支决定流程走向,执行命令实现功能落地。理解引擎解析顺序(QManage→QFunction→NPC)、变量作用域(临时/持久/全局)、命令参数规则(物品名、坐标、数值),即可构建从简单兑换到复杂攻城、任务链的全套脚本逻辑。