脚本内容
脚本内容直接出现在 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 | 该选项显示的文字 | 必填 |
next | string | 被选择后去到哪儿 | 自动推断 |
maxTimes | number | 此选项最多被选择多少次 | 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 {
// 脚本
}
}属性
| 属性 | 类型 | 描述 | 默认值 |
|---|---|---|---|
dice | dice | 检定时使用的骰子 | 全局检定模式 |
target | number | 检定目标值 | 必填 |
targetDesc | string | 目标值的描述文字 | 无 |
modifier | [{ name, value }] | 检定加值列表 | [] |
success | script | 检定成功时执行的脚本 | 无 |
fail | script | 检定失败时执行的脚本 | 无 |
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 { ... } // 可选
}属性
| 属性 | 类型 | 描述 | 默认值 |
|---|---|---|---|
enemies | enemy[] | 敌人列表,至少一个 | 必填 |
ATKActions | action[] | 攻击动作列表,至少一个 | 必填 |
SPActions | action[] | 技能列表 | [] |
otherActions | action[] | 特殊行动 | [] |
initiativeOrder | () => number[] | 返回行动顺序数组,-1 代表玩家 | 必填 |
isFinish | () => boolean | null | 返回 true/false/null | 必填 |
success | script | 胜利后执行的脚本 | 必填 |
fail | script | 失败后执行的脚本 | 必填 |
flee | script | 逃跑后执行的脚本 | 无 |
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 { "逃跑了。" }
}