选择、分支与检定
互动叙事和普通小说最大的区别是:
玩家不是只阅读,还要做决定。
NovaMark 里最常见的三种“剧情分流方式”是:
if—— 普通条件分支- 选择 —— 玩家主动决定
@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 > 06.2 物品条件
@check has_item("magic_stone")6.3 骰子
@check roll("1d20") + courage >= 156.4 逻辑组合
@check has_item("key") and item_count("money") >= 508. 什么时候该用哪一种
这是最重要的实际判断题。
用 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 的基础语法:场景、对话、状态、分支。
接下来进入第二阶段,学习如何让故事更有表现力: