1 个不稳定版本
0.1.0 | 2023年4月28日 |
---|
#24 in #marker
39KB
721 行
对话脚本 - 一种用于编写交互式对话的语言
对话脚本是一种既易于阅读又易于解析的对话编写语言。对话可以被看作是一个状态机,其中每行对话都是一个状态,每个缩进块是一个子状态转换。
示例
%START%
ZELDA |SAY| "Hey there!"
ZELDA |SAY| "How are you?"
YOU |SAY| "I'm doing well, thanks!"
ZELDA |SAY| "Glad to hear it!"
%END%
更多示例脚本位于 example_scripts/
目录中。
语法
脚本的语法由行、块和注释组成。行是脚本的主要组成部分,而块和注释用于组织和注释脚本。
脚本中的行要么是 标记 要么是 命令。它们可以包含任何字母或符号,除了管道 ( | ),因为那些用于分隔命令。
标记
脚本必须以 %START%
标记开始,并以 %END%
标记结束,分别确定脚本的开始和结束。标记以全部大写、短横线命名法编写,并用百分号分隔。通过使用 [|GOTO| 命令],可以将对话流程重定向到标记之后。
命令
命令以全部大写、短横线命名法编写,并用管道分隔。命令可以有 '前缀' 和 '后缀'。支持一些内置命令,并且 (在大多数情况下) 可以通过自定义命令轻松扩展语言。
PREFIX |COMMAND| SUFFIX
SAY
|SAY|
命令用于显示对话。如果提供了可选的前缀,它表示说话者。后缀是必需的,它表示要显示的对话。
ZELDA |SAY| "Hey there!"
上面的命令将在带有说话者 ZELDA
的对话框中显示文本 "Hey there!"
。文本周围的引号被解释为文本,不是必需的。
|SAY| It was a dark and stormy night...
上面的命令将在没有说话者的对话框中显示文本 It was a dark and stormy night...
。
CHOICE
|CHOICE|
命令用于声明一系列选择。后缀是必需的,它表示玩家可以选择的选项。不允许使用前缀。
|CHOICE| "Yes"
PLAYER |SAY| "Yes"
|GOTO| %CONTINUE%
|CHOICE| "No"
PLAYER |SAY| "No"
|GOTO| %GO-BACK%
上述命令将显示一个带有文本 "是"
和 "否"
的选项列表。如果玩家选择 "是"
,将打印 PLAYER - "是"
并从 %CONTINUE%
标记处继续对话。如果玩家选择 "否"
,将打印 PLAYER - "否"
并从 %GO-BACK%
标记处继续对话。
转到
使用 |GOTO|
命令可以将对话流程重定向到标记。需要一个后缀,并且它必须是一个有效的标记。不允许使用前缀。
|GOTO| %START%
上述命令将对话流程重定向回 %START%
标记。与 |CHOICE|
命令结合使用,可以实现分支对话。以下是一个使用 |GOTO|
的分支对话示例。
%START%
Zelda |SAY| "This is a test."
Zelda |SAY| "You got that?"
|CHOICE| What?
You |SAY| "Come again?"
|GOTO| %START%
|CHOICE| Yes
You |SAY| "Ah, yes. Thank you."
Zelda |SAY| "You're welcome."
%END%
在上面的对话中,如果玩家选择 什么?
,对话将返回到开始。如果玩家选择 是
,对话将继续到结束。
块
块用于组织对话。它们通过4个空格缩进,可以包含任意数量的行或内嵌块。块可以嵌套到任意深度,尽管你应该避免深层次嵌套,因为它会使脚本难以阅读。|CHOICE| 和 |GOTO| 命令展示了如何使用块。当进入块时,对话将从块的第一个行开始继续。当退出块时,对话将从块之后的第一个行开始继续。
%START%
|SAY| 1
|SAY| 2
|SAY| 3
|SAY| 4
|SAY| 5
%END%
等价于
%START%
|SAY| 1
|SAY| 2
|SAY| 3
|SAY| 4
|SAY| 5
%END%
应该始终使用块来组织选择,并且从选择产生的命令应该在那个选择之后的块中。
注释
注释从 //
开始,并持续到行尾。它们可以用来注释脚本。
// This is a comment
许可证
本项目采用 MIT 许可证。
依赖
~4MB
~73K SLoC