标签流程与调用
说明
使用 NPC 脚本中的标签时,通常需要先理清按钮入口和标签流转关系。
你需要重点掌握的是:
- 标签是什么
- 标签从哪里进入
- 标签之间怎么跳转
- 标签名应该怎么命名
需要继续了解 NPC 如何挂到地图上,以及脚本文件实际放在哪个目录时,可继续查看 MerChant.txt 和 Market_Def。
标签是什么
标签是脚本中的命名段落,用来表示某一段可被进入、执行或跳转的逻辑。
常见写法如下:
[@Main]
[@传送服务]
[@仓库服务]
每个标签下面通常会继续写 #IF、#ACT、#SAY 等内容。
标签怎么命名
标签定义必须写在方括号内。
也就是说,标签声明写法应是:
[@Main]
方括号内部可以写任意字符;标签名统一以 @ 开头。
更稳妥的写法是继续使用业务语义明确的名称,例如:
[@Main]
[@传送服务]
[@仓库服务]
[@每日奖励]
使用时应注意两点:
- 定义标签时,完整写法在方括号内,例如
[@Main] - 跳转标签时,通常只写
@Main,不再带方括号
同一个脚本内,标签名不要重复。前面已经定义过的标签名,后面不要再声明第二次;否则回头看流程时,很难判断跳转实际会落到哪一段逻辑。
只要脚本内部保持一致,方括号内理论上可以写任意字符;但从可读性和维护成本来看,更建议统一使用 @ 加业务名称的写法,不要混用无语义缩写或临时命名。
例如:
[@Main]
#SAY
请选择功能
这表示脚本进入 [@Main] 后会输出一段对话内容。
标签从哪里进入
对 NPC 脚本来说,标签流程通常先由 NPC 配置定位到脚本,再进入主入口标签。
NPC 标签流程通常按下面顺序执行:
- 在
MerChant.txt中配置 NPC 入口 - 引擎定位到
Market_Def下的实际脚本文件 - 玩家点击 NPC 后,先进入主入口标签
- 主入口标签再输出对话和按钮
多数 NPC 脚本会把主入口写成 [@Main]。
按钮如何跳到标签
对话框中的按钮可以直接把流程跳到其他标签。
例如:
[@Main]
#SAY
<传送服务/@传送服务>\
<仓库服务/@仓库服务>
[@传送服务]
#SAY
这里是传送服务
[@仓库服务]
#SAY
这里是仓库服务
这段内容表示:
- 点击“传送服务”后进入
[@传送服务] - 点击“仓库服务”后进入
[@仓库服务]
对话框页里的按钮写法,本质上就是标签跳转入口。
GOTO 立即跳转标签
GOTO 用于把当前流程立即切到另一个标签,并从目标标签继续执行后续逻辑。
基本写法
GOTO <@标签名>
这里先按最常见的基础写法理解即可;如果你使用的是某些版本里的扩展写法,可再看 立即跳转标签。
例如:
[@Main]
#IF
CheckLevelEx > 50
#ACT
GOTO @高级传送菜单
#ELSESAY
等级不足,无法进入高级传送
[@高级传送菜单]
#SAY
<进入高级地图/@执行高级传送>\
<返回主菜单/@Main>
[@执行高级传送]
#ACT
MAPMOVE 3 330 330
这类写法适合处理下面几种场景:
- 条件成立后跳到结果标签
- 功能执行完后回主菜单
- 把一大段流程拆成多个独立标签
执行规则
GOTO会立即把执行流切到目标标签。GOTO不是#CALL,不会自动回到主入口标签或按钮来源标签。- 如果目标标签只是为了抽离一段处理逻辑,执行完后通常仍会按当前脚本的顺序继续往下执行。
- 如果你不希望后续逻辑继续执行,应显式写
BREAK,或显式GOTO到结果标签、主菜单标签。 - 需要更明确的结构时,也可以在目标标签里再写一次
GOTO。
常见用法
- 入口分流:满足条件后,切到结果页、功能页或提示页。
- 后续处理:前一段先准备默认值,再把变量修正或附加判断拆到处理标签中。
- 主流程拆段:把一大段连续逻辑拆成多个标签,按阶段逐段进入。
例如:
[@CalcReward]
#ACT
MOV S领取物品 金创药
#IF
CheckLevelEx ? 100
#ACT
GOTO @处理标识
Give <$STR(S领取物品)>
#ELSEACT
MessageBox 对不起,100级才能使用此功能!
[@处理标识]
#IF
CheckGameGold ? 10000
#ACT
MOV S领取物品 超级金创药
#IF
CheckGameGold ? 20000
#ACT
MOV S领取物品 打包金创药
这类写法适合先在主流程里保留默认值、准入判断和最终动作,再把中间的变量修正逻辑拆到独立标签中处理,避免把不同层级的条件直接堆在同一段 #ACT 中。
如果当前逻辑本来就是顺序执行,不要为了“看起来规范”额外拆标签并插入 GOTO。
什么时候优先用 GOTO
- 目标仍然是当前脚本文件中的其他标签
- 你想把主菜单、功能入口、结果提示拆开写
- 需要根据条件把流程分发到不同标签
- 需要把会污染当前主处理段的附加判断拆出去单独处理
DELAYGOTO 延时跳转标签
DELAYGOTO 用于延迟一段时间后,再进入指定标签处理逻辑。
基本写法
DELAYGOTO <毫秒> <@标签名>
这里先按基础写法理解即可;更完整的参数说明可再看 延时跳转标签。
例如:
[@Main]
#SAY
3 秒后进入传送确认页...
#ACT
DELAYGOTO 3000 @传送确认 比奇省 330 330
[@传送确认]
#SAY
即将前往 <$STR(S_CONTEXT[0])>(<$STR(S_CONTEXT[1])>:<$STR(S_CONTEXT[2])>)
按当前片段定义,DELAYGOTO 最多可继续传 5 个参数,目标标签中可通过下面这些变量读取:
<$STR(S_CONTEXT[0])><$STR(S_CONTEXT[1])><$STR(S_CONTEXT[2])><$STR(S_CONTEXT[3])><$STR(S_CONTEXT[4])>
什么时候适合用 DELAYGOTO
- 需要先显示提示,再进入下一段流程
- 需要给玩家短暂阅读时间或动画停顿时间
- 需要把少量上下文参数一起传给目标标签
如果目标标签执行完后还需要回主菜单、结果页或其它固定入口,应在目标标签中显式写后续 GOTO。
如果你要做的是周期性触发,而不是一次性延时跳转,应改看“定时器与触发”中的 OnTimer。
最小闭环
最常见的执行主线如下:
- 玩家点击 NPC
- 脚本进入
[@Main] [@Main]输出功能按钮- 玩家点击某个按钮,跳到对应功能标签
- 功能标签执行判断、命令或提示
条件判断、结果分支或更多功能按钮,通常都围绕这条闭环继续扩展。
学习建议
- 使用标签流程前,应先掌握
#IF、#ACT、#SAY的基础语法 - 再配合对话框里的按钮、颜色、坐标和物品展示一起看
- 需要组织完整 NPC 流程时,再把按钮和标签流转串起来
- 编写 NPC 脚本时,可再配合查看
MerChant.txt和Market_Def的目录说明
- 蓝海软件工具集 — 脚本格式化检查,快速定位缩进与注释问题
