Skip to content

脚本内容 ​

脚本内容直接出现在 dialog 的 { } 体内。

台词 ​

台词是最基础的脚本内容项,用引号包裹文字,按书写顺序显示在对话中。

语法 ​

"单行台词"
'也可以使用单引号'
"""这是多行台词,
   可以跨行书写。
   保留换行和缩进。"""
"支持 <b>HTML 和 Vue</b> 标签"

示例:

dialog greeting {
    "你好,旅行者。"
    "这是第二行台词。"
}

选项 ​

options 用于在一次对话中给玩家提供若干可选项,玩家选择后执行对应的脚本。

语法 ​

options {
    option "<text>" {
        // props
    }
}

简写形式(无脚本时可省略 { }):

option "A" x3 => forest;            // x3 = maxTimes,=> = next
option "B" x 2                      // x 与数字之间可空格
option "C" => forest
option "D"                          // 什么都没有
option "E" x1 { "带脚本时仍需 { }" }

属性 ​

属性类型描述默认值
<text>string该选项显示的文字必填
nextstring被选择后去到哪儿自动推断
maxTimesnumber此选项最多被选择多少次Infinity
visible() => boolean这个选项是否显示() => true

事件 ​

onChoose

  • 触发时机:当选项被选中。
  • 参数:无。
  • 返回值:void
  • 默认值:() => {}

和 dialog 类似,可以在其中写选择后的反馈脚本内容。

示例:

options {
    option "A" {
        "你选择了这个选项。"
    }
}

条件分支 ​

使用 if / elif / else 根据条件执行不同脚本,条件必须为返回布尔值的 JavaScript 表达式。

语法 ​

if (<condition>) {
    // 脚本
} elif (<condition>) {
    // 脚本
} else {
    // 脚本
}

示例:

if (Adv.bag.goldKey >= 1) {
    "你有金钥匙!"
    goto treasureRoom
} elif (Adv.bag.silverKey >= 1) {
    "你有银钥匙!"
} else {
    "你没有钥匙。"
}

检定 ​

check 是脚本内容项,按书写顺序出现在对话的 script(或选项的 script)中,而不是对话属性,用于进行一次骰子检定。

语法 ​

check {
    dice = <dice>
    target = <number>
    targetDesc = "<string>"
    modifier {
        mod "<name>" = <number>
        mod "<name>" { /* JS */ }
    }
    success {
        // 脚本
    }
    fail {
        // 脚本
    }
}

属性 ​

属性类型描述默认值
dicedice检定时使用的骰子全局检定模式
targetnumber检定目标值必填
targetDescstring目标值的描述文字无
modifier[{ name, value }]检定加值列表[]
successscript检定成功时执行的脚本无
failscript检定失败时执行的脚本无

modifier 中每个 mod 由名称(字符串)与数值或代码块组成:mod "名称" = 数值 或 mod "名称" { /* JS */ }。

success/fail 块内可包含任意脚本。

示例:

check {
    dice = d20
    target = 10
    targetDesc = "开锁难度"
    modifier {
        mod "敏捷" { return Adv.status.agility; }
        mod "工具" = 2
    }
    success {
        "门开了!"
        run { Adv.bag.gold += 10; }
    }
    fail {
        "门卡住了..."
        run { Adv.bag.gold -= 5; }
    }
}

运行代码 ​

run 用于嵌入一段 JavaScript 代码块。

语法 ​

run { /* JS */ }

示例:

run {
    Adv.bag.Gold += 10;
    Adv.status.hp = Math.min(Adv.status.hp + 20, 100);
    Adv.audio.play("/music/battle.mp3", "bgm", { loop: true });
}

跳转 ​

goto 会立即跳转到指定对话或场景,跳过后续脚本。

语法 ​

goto <dialogId>
goto <sceneId>

示例:

goto treasureRoom

结局 ​

ending 用于结束游戏并显示结局画面。

语法 ​

ending "<text>"

示例:

ending "你击败了魔王,王国重归和平。"

战斗 ​

battle 是脚本内容项,按顺序出现在 script 中,用于发起一场战斗。

语法 ​

battle {
    enemies { ... }
    ATKActions { ... }
    SPActions { ... }               // 可选
    otherActions { ... }            // 可选
    initiativeOrder { return [-1, 0, 1]; }
    isFinish { /* 返回 true / false / null */ }
    success { ... }
    fail { ... }
    flee { ... }                    // 可选
}

属性 ​

属性类型描述默认值
enemiesenemy[]敌人列表,至少一个必填
ATKActionsaction[]攻击动作列表,至少一个必填
SPActionsaction[]技能列表[]
otherActionsaction[]特殊行动[]
initiativeOrder() => number[]返回行动顺序数组,-1 代表玩家必填
isFinish() => boolean | null返回 true/false/null必填
successscript胜利后执行的脚本必填
failscript失败后执行的脚本必填
fleescript逃跑后执行的脚本无

enemies 中:enemy <模板ID> count <n> 引用已定义模板(count 缺省为 1),enemy <模板ID> 等价于 count 1,enemy { ...内联模板字段... } 为内联模板。

示例:

battle {
    enemies {
        enemy goblin count 2
        enemy orc
        // 内联定义
        enemy {
            name = "暗影刺客"
            hp = 40
            atk = 12
            move { Adv.print("刺客闪击!"); }
        }
    }
    ATKActions {
        action {
            name = "斩击"
            targetNum = 1
            onUse { targets[0].hp -= 10; }
        }
    }
    initiativeOrder { return [-1, 0, 1]; }
    isFinish {
        if (enemies[0].hp <= 0) return true;
        if (Adv.status.hp <= 0) return false;
        return null;
    }
    success { "胜利!" }
    fail { "失败..." }
    flee { "逃跑了。" }
}