# WebGAL 技术介绍

# 场景系统与预加载

# 场景获取

WebGAL 的场景是以文件为单位的,一般来说是后缀名为.txt的WebGAL 脚本文件。就像很多编程语言有一个 main函数作为入口一样,WebGAL 的入口场景是start.txt。WebGAL 会首先尝试获取 start.txt,然后调用WebGAL 解析器将脚本文件解析为 WebGAL 引擎可以执行的场景对象。在任何一个场景中,都可以使用choosechangeScenecallScene这样的方式切换或“调用”场景。切换场景会直接替换当前的场景,而“调用”场景则会向场景调用栈中推入一个新的场景开始执行,并在执行后回到调用该场景的父场景。

# 预加载场景中的资源

在 WebGAL 解析场景的同时,场景所包含的资源也会被解析出来。对于每个场景文件,WebGAL 都会将其包含的所有资源,包括图片、音频以及视频文件。这些文件会在场景被解析完后开始预加载,以尽可能减少用户在游戏流程中等待资源加载的可能性。同时,为了使游戏在切换场景时更为顺畅,WebGAL 也会加载被当前的场景文件引用的场景文件的资源。为了防止资源浪费,WebGAL 只会拓展一层场景做预加载。

# WebGAL 解析器

# 语句解析 Ⅰ 拆分场景

WebGAL 场景文件主要是以行来区分脚本的。在解析的一开始,WebGAL 解析器就会按照换行符将脚本分割开。如果有分号,则会取分号前的字符。所以,WebGAL 脚本的注释方式就是将脚本写在分号后。

# 语句解析 Ⅱ 脚本类型解析

WebGAL 的脚本一般是形如

command:content -arg1 -arg2 ......;comment

的形式。

其中,command 代表语句指令,比如 bgmchangeFigurechoose这样的指令,用于标明该语句对应的控制动作。而 content则代表语句的主要内容,比如 bgm:Teabreak.mp3表示的是播放一段音频文件作为 bgm。

# 语句解析 Ⅲ 对话的特殊处理

WebGAL 的对话一般以如下形式书写:

森川由绮:胸につかえていることを、时は解决してくれない。忘却のラベルを贴るだけで -voice_1.ogg;

对于视觉小说来说,由于对话一般是脚本的主要组成部分,所以 WebGAL 设计了一个语法糖。如果任何一个脚本的 command 部分无法被解析为任何一种指令,那么 WebGAL 就会将其视为对话。而语音也可以简写其参数,只需要给出文件名即可。如上的对话实际上最终会被解析成 say 指令。

所以,这段对话的真正表示应该为:

say:胸につかえていることを、时は解决してくれない。忘却のラベルを贴るだけで -speaker=森川由绮 vocal=voice_1.ogg;

除此以外,如果对话由一个人物发出,那么在对话人发生改变前,还可以省略人物名称:

森川由绮:胸につかえていることを;
时は解决してくれない;
忘却のラベルを贴るだけで;

对于对话的特殊处理大大提高了脚本编写的效率。

# 语句解析 Ⅳ 参数解析

在 content 后以-分隔的是附加参数。格外需要注意的是,附加参数的连字符-前需要有空格,否则 WebGAL 可能会认为这不是一个参数而是一个正常的连字符。

WebGAL 的参数是以 -key=value的形式表示的,其中,key 的类型为string,而value的类型则可以动态决定,并可以以下三种可能的类型存在: stringnumberboolean

比如 -key=svaluestring-key=1valuenumber-key=true-key=falsevalueboolean

其中,只写出 key而省略value的参数会被解析成 -key=true,这是一个简写的语法糖。这个语法糖非常重要,因为WebGAL 中有一个重要参数 -next,用于表示在执行完当前语句后立刻执行下一条语句。如果没有省略表示,则每次都需要书写-next=true

# 语句解析 Ⅴ 资源处理与预加载

在进行语句解析的时候,就可以获得语句所需要的资源了。比如,bgm语句一般需要音频资源,playVideo语句一般需要视频资源,changeBg语句一般需要图片资源。WebGAL 场景解析器会将所有场景中语句需要的资源合并起来,用于交给预加载器来预加载资源。同时,当遇到形如changeScenechoosecallScene等需要调用子场景的情况时,子场景也会被扫描出,解析并对其中的资源进行预加载。

# 流程控制系统

# 准备阶段:步进前操作

# 正式阶段 Ⅰ:读指令、执行条件判断

# 正式阶段 Ⅱ:调用、获取演出控制模块送演出控制器

# 结束阶段:处理连续演出、更新 Backlog

# 自动与快进

# 演出控制

# WebGAL 演出类型

# 演出的自动销毁、结束判断、阻塞逻辑

# 舞台控制器与动画控制

# 数据驱动的 Pixi 舞台控制器

# 动画与“变换”控制

# 存读档、回溯与用户数据

# WebGAL 状态表介绍

# 演出状态的存储与恢复

# 存档与其他用户数据的存储

# 鉴赏模块,以及一些细枝末节

# 鉴赏模块

# 离开浏览器状态保持与“继续游戏”

# 快捷键与鼠标操作