Skip to content

文字

文字是剧情的基石,也是最基础的演出元素。

在 ShxNovel 中,Rewrite 用于编写剧情与演出脚本,并原样使用 JavaScript / TypeScript 作为语法。如果你是一位了解 JavaScript 的开发者,Rewrite 的学习成本应该会比较低,且总是可以使用最新的 ES 语法。

对于不熟悉 JavaScript 的创作者也无须担心,Rewrite 只使用了其中极少且直观的一部分语法,大多数情况下,你只需要像写台词一样编写文本内容即可。引擎会通过类型提示与结构约定,尽可能减少语法层面的负担。

在 story 目录下新建一个 ts 文件,使用你喜欢的命名方式,例如 story.ts

通常情况下,推荐一个文件对应一个章节,以保持结构清晰,便于维护与拆分。

将下面的代码复制到文件中,并将 1.1.1 替换为你希望使用的章节标识:

story.ts
useChapter("1.1.1");

useChapter 用于声明一个新的章节作用域,在同一个章节中,所有剧情、角色与演出指令都会被组织在这一作用域下。在接下来的内容中,我们将从最基础的文本剧情开始,逐步引入视觉与演出元素。

character 用于声明一个在当前章节中可发言的角色。

第一个参数为角色名称,当使用 null 时,表示不显示角色名称。
为了方便剧本编写,你可以自定义角色代称,例如表示 aside(旁白)与 me(第一人称)。

const aside = character(null);
const me = character("卡咖喱");

上述代码并不会立即产生任何对白,而只是创建了两个可用于发言的角色句柄


在 Rewrite 中,使用 反引号(模板字符串)来编写对白内容:

aside `你好, rewrite`;
me `哥们今天为什么罚抄?是不是因为上课没听讲?`;

我们可以连续使用多个字符串,它们将被自动连接并显示为连续的对话。

me `哥们今天为什么罚抄?` `是不是因为上课没听讲?`
aside `不是,我在上学路上追了一路小鸟。`
`最后被风祭市的环保人士拦下,送去学生组织了。`

在需要排版时还可以分行书写,这种情况下,显示的文本之间并不会出现换行。

在 Rewrite 提供的语法内,所有字符串都可以使用反引号来书写。因此如果读者不熟悉语法,也可以避免使用双引号或单引号。

可以使用 // 来编写注释,其后的内容都会被视作注释。也可以使用 /* */ 来编写多行注释。

me `超自研?难道她们真的处罚你吗?` // 欧派?
aside `本来是没有处罚的。`
// 注释:追妻无罪
`但是一不小心冒犯到里面的人了...` // 果然是欧派。

在使用 VSCode 作为编辑器时,可以使用 ctrl + / 来快速注释一个段落。

默认情况下,character(null) 的发言将不显示直角引号,而有名称的角色则会显示。

实际上 character 还有第二个参数可以用于指定是否显示直角引号:

const special = character(null, true); // 说话会带直角引号的旁白
const one = character("卡咖喱", false); // 说话不带直角引号的卡咖喱

除此之外,我们还提供了一个名为 useQuote 的方法,来产生一个临时句柄,用于控制引号显示:

me `今天真不走运啊。`; // 有引号
me.useQuote(false) `今天真不走运啊。`; // 不带引号
me `今天真不走运啊。`; // 有引号

在 Rewrite 中,剧情是以 语段(Segment) 为单位自动解析的。

一个语段从一次角色发言(或旁白)开始,并持续到下一个角色发言出现之前。

me `我晕`
/* 这里编写的内容,都属于 me 这次发言的演出或补充 */
aside `别提这事了,我想喝咖啡。`
/* 这里编写的内容,则属于 aside 这次发言 */

也就是说,默认情况下,演出永远属于它前面的那一句话(或利用 directive 进行控制!)。
具体如何描述这些变化(例如动作、表情或镜头),我们将在后续章节中详细介绍。