脚本基础

标签流程与调用

说明 NPC 脚本里的标签入口、流转方式、跳转与调用关系,作为组织完整功能流程的基础。

说明

使用 NPC 脚本中的标签时,通常需要先理清按钮入口和标签流转关系。

你需要重点掌握的是:

  • 标签是什么
  • 标签从哪里进入
  • 标签之间怎么跳转
  • 标签名应该怎么命名

需要继续了解 NPC 如何挂到地图上,以及脚本文件实际放在哪个目录时,可继续查看 MerChant.txt 和 Market_Def。

标签是什么

标签是脚本中的命名段落,用来表示某一段可被进入、执行或跳转的逻辑。

常见写法如下:

[@Main]
[@传送服务]
[@仓库服务]

每个标签下面通常会继续写 #IF、#ACT、#SAY 等内容。

标签怎么命名

标签定义必须写在方括号内。

也就是说,标签声明写法应是:

[@Main]

方括号内部可以写任意字符;标签名统一以 @ 开头。

更稳妥的写法是继续使用业务语义明确的名称,例如:

[@Main]
[@传送服务]
[@仓库服务]
[@每日奖励]

使用时应注意两点:

  • 定义标签时,完整写法在方括号内,例如 [@Main]
  • 跳转标签时,通常只写 @Main,不再带方括号

同一个脚本内,标签名不要重复。前面已经定义过的标签名,后面不要再声明第二次;否则回头看流程时,很难判断跳转实际会落到哪一段逻辑。

只要脚本内部保持一致,方括号内理论上可以写任意字符;但从可读性和维护成本来看,更建议统一使用 @ 加业务名称的写法,不要混用无语义缩写或临时命名。

例如:

[@Main]
#SAY
请选择功能

这表示脚本进入 [@Main] 后会输出一段对话内容。

标签从哪里进入

对 NPC 脚本来说,标签流程通常先由 NPC 配置定位到脚本,再进入主入口标签。

NPC 标签流程通常按下面顺序执行:

  1. 在 MerChant.txt 中配置 NPC 入口
  2. 引擎定位到 Market_Def 下的实际脚本文件
  3. 玩家点击 NPC 后,先进入主入口标签
  4. 主入口标签再输出对话和按钮

多数 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。

最小闭环

最常见的执行主线如下:

  1. 玩家点击 NPC
  2. 脚本进入 [@Main]
  3. [@Main] 输出功能按钮
  4. 玩家点击某个按钮,跳到对应功能标签
  5. 功能标签执行判断、命令或提示

条件判断、结果分支或更多功能按钮,通常都围绕这条闭环继续扩展。

学习建议

  • 使用标签流程前,应先掌握 #IF、#ACT、#SAY 的基础语法
  • 再配合对话框里的按钮、颜色、坐标和物品展示一起看
  • 需要组织完整 NPC 流程时,再把按钮和标签流转串起来
  • 编写 NPC 脚本时,可再配合查看 MerChant.txt 和 Market_Def 的目录说明

相关阅读