注意
剧本是基于 JavaScript 的,但无需担心 —— 即使没有相关基础,只需花几分钟学习基础语法即可轻松上手剧本编写。
游戏的剧本应该放置于 scenario
文件夹中,游戏的资源应该放置于 public/static
文件夹中。
# 命令
使用命令操作舞台中的元素,基本格式是:模式.命令名称(命令参数)
模式
表示命令的执行方式,分为以下两种:
$
表示执行本条命令并立即继续向下执行$$
表示等待本条命令完成再继续向下执行
不同命令支持的模式不同,有些可以选择两种模式之一,有些只能使用其中一种模式。
# 对话
对话是视觉小说中最高频的结构,所以拥有特殊简化的语法。
一条对话由三个部分组成,角色`对话文本` + "对话配音"
,如果没有配音文件,可以省略配音部分。
使用$character
创建角色,下面的示例使用常量noi
来保存这个角色,之后这个角色的对话就都可以使用noi
简写。
const noi = $character("诺瓦")
noi`……我将踏上一段愉快的旅程。` + '/noi0001.flac'
对话默认以 $
模式运行,可以通过在对话前添加 $:
或 $$:
,指定对话的执行模式。
# 幕
幕是剧情的基本单元,由若干条命令组成,幕中的命令执行完毕后,将等待用户点击进入下一幕。
对话如果没有指定执行模式,将自动划分出新的一幕;使用 $action
可以手动划分出新的一幕。
在划分第 1 幕之前,称为第 0 幕,可以用于设置舞台的初始状态。
$.命令() // 第0幕
noi`……我将踏上一段愉快的旅程。` // 第1幕
$.命令() // 第1幕
noi`……与你一同的旅程。` // 第2幕
$action // 第3幕
$:noi`无论何时……都与你一起……` // 第3幕
# 剧本
剧本文件的命名格式为 *.scenario.(js|ts|jsx|tsx)
,例如 story.scenario.ts
。
.scenario
表示这是一个剧本文件,.ts
后缀表示所使用的 JavaScript 方言。
可以在剧本中使用除了 export
外的全部 JavaScript 功能,比如变量、条件和循环。
同时也可以选择启用某种方言特性,比如通过 TypeScript 使用类型标注。
剧情将从入口文件 scenario/index.scenario.(mjs|js|mts|ts|jsx|tsx)
开始。
# 拆分剧本
在剧本中使用 $include
将指定剧本的内容嵌入。
// scenario/index.scenario.tsx
noi`……我将踏上一段愉快的旅程。` // 第1幕
$include('./example.scenario.tsx')
$.命令() // 第2幕
// scenario/example.scenario.tsx
$.命令() // 第1幕
noi`……与你一同的旅程。` // 第2幕
# 调试剧本
在剧本中使用 $debugger
让剧情从指定位置开始。
noi`……我将踏上一段愉快的旅程。`
noi`……与你一同的旅程。`
$debugger // 剧情将从这里开始
noi`无论何时……都与你一起……`
# 内置变量
在剧本中使用 $store
访问包括设置,存档在内的全部游戏数据。
system: `当前游戏名称为:${$store.system.name}`
在剧本中使用 $context
访问游戏实例当前的运行时数据。
system: `当前游戏状态为:${$context.state.now()}`
# 参数
命令有一些常见的参数命名,以下说明它们代表的含义。
# 标识符
标识符,或者说 ID,用于后续操作时引用这个元素。
# 作用目标
操作元素的命令使用这个参数,填入目标的标识符。
# 持续时间
持续时间参数的单位为毫秒,具体所指参看命令说明。
# 资源路径
public/static
文件夹中的资源,填写时由 /
开头。
比如 public/static/咕.mp3
,填写为 /咕.mp3
。