节点中的控制流
Mortar 现在支持在节点内部使用 if/else,用于根据变量、函数或枚举判断来显示不同文本。功能刻意保持轻量——暂不包含循环——以保证脚本可读性。
基本语法
let player_score: Number = 123
node ExampleNode {
if player_score > 100 {
text: "满分!"
} else {
text: "你还得加把劲。"
}
}
每个分支都可以包含任意节点语句:文本、赋值、选项甚至嵌套 if。序列化后会被折叠成带 condition 字段的 content 项,游戏端只需解析即可。
支持的表达式
可以比较数字、判断布尔值,也可以调用函数(无论有无参数):
fn has_map() -> Bool
fn get_hp() -> Number
fn get_hp_max() -> Number
fn has_item(name: String) -> Bool
node ExampleNode {
// 布尔函数调用作为条件
if has_map() {
text: "你摊开地图,研究下一步的路线。"
}
// 函数调用参与比较
if get_hp() > 0 {
text: "还站着!"
}
// 比较两侧都是函数调用
if get_hp() >= get_hp_max() {
text: "你的 HP 已经满了。"
}
// 带参数的函数调用
if has_item("sword") {
text: "你拔出了剑。"
}
// 取反和逻辑运算符
if get_hp() > 0 && !has_map() {
text: "你还活着,但迷路了。"
}
}
表达式会被解析成 AST(双目运算、单目运算、标识符或字面量)。当条件依赖游戏端数据时,可通过 fn has_map() -> Bool 由运行时代码来提供结果。
最佳实践
后续版本计划引入 while 等语句,但当前的 if/else 已足以覆盖大多数动态文本场景,并保持 Mortar 的简洁特性。