Skip to content

分支选择 ​

本章你将学会用 menu 制作选项,用 navigate / label 控制剧情走向。

label 标签 ​

label 是剧情的跳转锚点。navigate 跳转到指定标签:

dsl
label forest:
  say "你来到了森林。" speaker="旁白"
  navigate "town"   // 跳回 town 标签或场景

标签 vs 场景

  • scene——一个完整画面,包含 UI 元素
  • label——纯脚本片段,不含 UI 元素

navigate 既可以跳到 scene 也可以跳到 label。

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             // 设为 true

set 支持复合赋值 += -= *= /= %=,无需花括号即可自增 / 自减,与花括号表达式等价:

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"

下一步 ​

核心语法掌握得差不多了!最后一章打包发布,把你的游戏变成可执行文件。

基于 .NET 10 + Avalonia 12 · Apache-2.0 License