故事脚本

故事脚本的文法完全基于 Markdown,因此您不需要对您的编辑器进行任何配置就可以开始编写您的故事。

标题与段落

使用标题来说明当前说话的人物,使用 --- 分隔符来清空当前说话的人物。

每一段独立文本之间使用两个回车分割。

# 纳西妲

「你好呀」

# 我

「……」

「……你好」

---

突然有个羽毛球上前向我搭话,我莫名感觉到有些慌乱

定睛一看,才发现是个少女

上面的样例中,所有位于 # 我--- 之间的文本都会被当作 说的。

背景

若要添加/更换背景,可以使用 ![bg <transition>](url "<position> / <size> <animation>") 的格式进行声明。

  • 关于位置 <position> 和大小 <size> 的有关内容,请参考大小与位置章节。
  • 关于转场 <transition> 和动画 <animation> 的有关内容,请参考转场与动画章节。

人物立绘

人物立绘使用 ![fig <transition>](url "<name> <position> / <size> <animation>") 的方式来进行初始化声明。

  • <name> 用于唯一确定立绘的人物名称,以便后续操作的时候方便区分目标。
  • 关于位置 <position> 和大小 <size> 的有关内容,请参考大小与位置章节。
  • 关于转场 <transition> 和动画 <animation> 的有关内容,请参考转场与动画章节。

注意:人物名称是必选项,其他都是可选。当需要对人物立绘进行更新的时候,只需要给予相同的人物名称即可。

当需要移除立绘的时候,使用 ![fig remove ...](...) 操作,引擎会在动画完成之后移除相应的动画对象。

背景音乐

背景音乐使用 ![bgm](url) 的语法进行声明。

引擎会先淡出当前正在播放的背景音乐,之后开始播放当前的音乐。

![bgm](./bgm/boundless-bliss.mp3)

其他操作

  • 原地等待若干时间(毫秒)

    [wait](#2000)
    

流程控制

使用链接元素进行流程的控制。

  • 跳转到其他剧情文件

    [goto](./xxx.md)
    
  • 跳转到其他剧情文件并结束游戏

    [end](./xxx.md)
    

分支选项

我们使用无序列表来迫使用户做出一次选择。

无序列表中只能包含纯文本内容。

- 好啊
- 还是算了

之后可以用有序列表来根据用户的选择执行对应的操作。

有序列表中可以包含任何可解析的标签,当用户在上一次选择某条分支之后,程序会自动执行对应分支内的代码。

1. [goto](./happy_end.md)
2. [goto](./bad_end.md)

上文中如果您之前选择 好啊,那么将会跳转到 ./happy_end.md 中的剧情,否则会跳转到 ./bad_end.md 中的剧情。

角色语音

角色语音使用 ![v](url) 的方式声明,会与当前的文本段落自动绑定。

# 纳西妲

![v](./vocal/nahida-1.mp3)
「你说的对,但是原神是……」

![v](./vocal/nahida-2.mp3)
「后面忘了」

如果语音不能与任何文本匹配,或者一个段落中出现了多个语音文件,那么会抛出一个编译错误。

音效

对于只需要播放一次的简单音效,使用 ![sfx](url) 的方式声明。

![sfx](./sfx/open_letter.mp3)

内嵌代码(未实现)

可以使用 <script></script> 标签、代码块,以及行内代码的方式进行内嵌 JavaScript 代码。

<script>
  var a = 114514;
</script>

```js
var b = 1919810;
```

# 纳西妲

`if (a > b) {`
「我觉得您说的对」
`} else {`
「我觉得您说的不对」
`}`

以上代码会被编译成

export default async function* (ctx) {
  var a = 114514;
  var b = 1919810;
  if (a > b) {
    yield /* 纳西妲:「我觉得您说的对」 */ [];
  } else {
    yield /* 纳西妲:「我觉得您说的不对」 */ [];
  }
}

关于程序运行时的上下文对象 ctx,可以查看关于 ctx 的有关文档。