Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

节点中的控制流

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 的简洁特性。