分支选择
本章你将学会用 menu 制作选项,用 navigate / label 控制剧情走向。
label 标签
label 是剧情的跳转锚点。navigate 跳转到指定标签:
dsl
label forest:
say "你来到了森林。" speaker="旁白"
navigate "town" // 跳回 town 标签或场景标签 vs 场景
- scene——一个完整画面,包含 UI 元素
- label——纯脚本片段,不含 UI 元素
navigate 既可以跳到 scene 也可以跳到 label。
menu 菜单选择
menu 弹出选项面板,玩家选择后跳转到对应标签:
dsl
menu "你要怎么做?"
"战斗" -> wolf_battle
"逃跑" -> wolf_flee- 第一行是提示文字
- 每行一个选项:
"显示文字" -> 目标标签
完整分支示例
dsl
label forest_encounter:
say "一只野狼挡住了你的去路!" speaker="系统"
menu "你要怎么做?"
"战斗" -> wolf_battle
"逃跑" -> wolf_flee
label wolf_battle:
say "你拔出武器,与野狼对峙!" speaker="旁白"
say "你战胜了野狼!" speaker="系统"
navigate "town"
label wolf_flee:
say "你转身跑开了。" speaker="旁白"
navigate "town"变量驱动的条件分支
用 if / else if / else 根据变量值分支:
dsl
define "npc.trust" 0 once
label chat:
if {npc.trust < 3}
say "新来的?坐吧。" speaker="老张"
set "npc.trust" {npc.trust + 1}
else if {npc.trust < 6}
say "又是你啊。" speaker="老张"
else
say "老朋友!这杯算我请的。" speaker="老张"
navigate "tavern"表达式语法
条件用 {} 包裹:{npc.trust < 3}、{player.gold >= 10}、{story.met_elder && story.has_clue}
set 修改变量
dsl
set "player.gold" {player.gold - 10} // 减 10
set "player.hp" {player.hp + 20} // 加 20
set "story.met_elder" true // 设为 trueset 支持复合赋值 += -= *= /= %=,无需花括号即可自增 / 自减,与花括号表达式等价:
dsl
set "player.gold" += 50 // player.gold = player.gold + 50
set "player.hp" -= 15 // player.hp = player.hp - 15多场景导航
剧情可以跨场景跳转。在 title_main.story 中用 navigate 跳到另一个 .story 文件中的场景:
dsl
// title_main.story
navigate "chapter1_intro"
// chapter1/chapter1.story
scene "chapter1_intro"
say "第一章开始" speaker="旁白"引擎会自动在所有 .story 文件中查找匹配的场景名或标签。
动手:做一个分支
把之前的 intro 标签扩展为带选择的版本:
dsl
label intro:
transition "fade" duration=1.0
character "narrator" name="旁白" color="#AAAAAA"
say "迷雾笼罩着这座小镇。" speaker="narrator"
say "前方有一座酒馆,不远处是广场。" speaker="narrator"
menu "你要去哪里?"
"去酒馆" -> go_tavern
"去广场" -> go_plaza
label go_tavern:
say "你推开了酒馆的门。" speaker="narrator"
navigate "title_main"
label go_plaza:
say "广场上空无一人。" speaker="narrator"
navigate "title_main"下一步
核心语法掌握得差不多了!最后一章打包发布,把你的游戏变成可执行文件。