Skip to content
选择、分支与检定

选择、分支与检定

互动叙事和普通小说最大的区别是:

玩家不是只阅读,还要做决定。

NovaMark 里最常见的三种“剧情分流方式”是:

  1. if —— 普通条件分支
  2. 选择 —— 玩家主动决定
  3. @check —— 明确的成功 / 失败检定

1. 普通条件分支:if

if 最适合表达:

  • 是否满足某个条件
  • 某段剧情要不要显示
  • 某个结果是否成立
if item_count("money") >= 50
  > 你有足够的钱。
else
  > 你现在还付不起。
endif

你可以把它理解成

  • 条件成立 → 执行这一段
  • 条件不成立 → 执行另一段

它更像日常逻辑判断。


2. 玩家选择

如果你希望“由玩家来决定接下来发生什么”,就用选择。

? 你要怎么做?
- [敲门] -> .knock
- [直接推门] -> .push

结构解释

?

表示这是一个问题。

- [文本] -> 目标

表示一个可选项。

玩家选择后,会跳到对应目标。


3. 条件选项

有时候不是所有选项都应该随时可选。

例如:

  • 没有钥匙时不能开门
  • 金钱不足时不能购买

这时可以给选项加条件:

? 塔门紧闭,你要:
- [尝试推门] -> .push
- [使用钥匙] -> .unlock if has_item("key")

这会发生什么

如果条件不满足,这个选项不会正常生效。

客户端可以把它表现为:

  • disabled 按钮
  • 灰色选项
  • 不可选择提示

4. 块级选择:先更新状态,再跳转

当你在做问卷、量表、人格测试、属性累计题时,单纯跳转往往不够。

例如,你可能希望:

  • 选中某个答案后给 score 加分
  • 顺便打一个 flag
  • 然后再跳到下一题

这时可以使用块级选项

? 1. 感到不安、担心或烦躁
- [从未]
  @set score = score + 0
  -> .q2
- [有时]
  @set score = score + 1
  -> .q2
- [经常]
  @set score = score + 2
  -> .q2
- [持续]
  @set score = score + 3
  @flag stress_high
  -> .q2

你可以把它理解成

  • 先执行少量状态更新
  • 最后跳转到下一个标签或场景

执行顺序固定为:

选择命中 → 执行块内动作 → 执行最后的跳转

什么时候适合用它

最适合:

  • 心理量表
  • 属性问答
  • 好感度加减
  • 简单问卷打分

如果你的选项后面有大量叙事内容、媒体控制或复杂逻辑,仍然更推荐跳到独立标签。

当前限制

块级选项的语法分为两部分:

前置语句(Prelude):只允许以下四个白名单命令:

  • @set
  • @flag
  • @give
  • @take

结尾语句(Terminal):必须是以下两者之一:

  • -> target(跳转到标签或场景)
  • @call scene(调用子场景,调用后自动返回原场景继续执行)

@return 在块级选项体内不被允许。@call 之后也不允许再写其他语句。

也就是说,下面这些写法都是合法的:

- [显示结果]
  @flag viewed_result
  -> .evaluation
- [使用药水]
  @give potion 1
  -> .next
- [逛逛商店]
  @set visited_shop = true
  @call shop_scene

下面这些写法仍然不支持:

- [切换背景]
  @bg room_day.png
  -> .next
- [先调用再继续]
  @call shop_scene
  @set shop_visited = true

@call 之后不能再跟其他语句。


5. @check:明确的成功/失败检定

当你想表达“这不是普通条件,而是一次检定”,推荐使用 @check

@check roll("2d6") >= 8
@success
  > 你成功通过了检定。
@fail
  > 检定失败。
@endcheck

为什么不直接都用 if

因为 @check 更强调一种叙事语义:

  • 这是一次检定
  • 有明确成功和失败两个分支

相比普通 if,它更适合:

  • 掷骰
  • 对抗
  • 概率事件
  • 条件挑战

6. @check 的正式语法

@check 条件表达式
@success
  ...
@fail
  ...
@endcheck

这里要特别注意:

现在正式支持的是 @success / @fail / @endcheck

而不是旧的裸关键字写法。


7. 检定里可以写什么条件

6.1 数值比较

@check hp > 0

6.2 物品条件

@check has_item("magic_stone")

6.3 骰子

@check roll("1d20") + courage >= 15

6.4 逻辑组合

@check has_item("key") and item_count("money") >= 50

8. 什么时候该用哪一种

这是最重要的实际判断题。

if

当你只是想根据状态决定“要不要执行某段内容”时。

用选择

当你希望玩家主动决定接下来去哪里、做什么时。

如果选择只需要“少量状态更新 + 跳转”,优先考虑块级选项。

@check

当你想表达一次有明确成功/失败语义的检定时。


9. 一个组合示例

? 你要怎么处理这扇门?
- [直接推门] -> .push
- [使用钥匙] -> .unlock if has_item("key")

.push
@check roll("1d20") + courage >= 15
@success
  > 你硬生生把门撞开了。
@fail
  > 门纹丝不动,你的肩膀一阵发麻。
  @set hp = hp - 5
@endcheck

.unlock
> 你用钥匙打开了门。
@take key 1

这个例子同时用了:

  • 玩家选择
  • 条件选项
  • @check
  • 状态变化

这就是 NovaMark 里最常见的互动结构。


下一步

到这里,你已经掌握了 NovaMark 的基础语法:场景、对话、状态、分支。

接下来进入第二阶段,学习如何让故事更有表现力:

角色与情绪 →

Last updated on