#dialog #script #command #line #parser #marker #block

dialogue-rs

A Rust 库用于解析对话脚本

1 个不稳定版本

0.1.0 2023年4月28日

#24 in #marker

MIT/Apache

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