跳至主要內容

变量

Mahiru大约 5 分钟

变量

注意

在你弄清楚如何使用场景跳转和分支跳转之前,请不要轻易使用变量系统,这可能会令你感到迷惑!

使用变量

设置变量:

setVar:a=1; // 可以设置数字
setVar:a=true // 可以设置布尔值
setVar:a=人物名称 // 可以设置字符串

设置随机数,请使用 random()

setVar:a=random();

random([lower=0], [upper=1], [floating]) 随机数是一个内置函数,它支持多个传参:

参数

  1. [lower=0] (number): 下限。
  2. [upper=1] (number): 上限。
  3. [floating] (boolean): 指定是否返回浮点数。

不写参数,它会生成一个是一个0-1区间的浮点数

setVar:a=random();

当然,我们也可以指定范围。比如,你想要5-10之间的随机数,你可以写成:

setVar:a=random(5,10);

当然你想要它使用范围生成的数值也有小数,那么可指定第三个参数:

setVar:a=random(5,10,true); # 将会生成5-10之间的浮点数

如果先前你定义过其他变量,也可以在设置变量时使用。

setVar:a=1;
setVar:b=a+1;

条件执行

在语句后加上 -when=(condition) 参数,可以根据条件判断当前语句是否要执行。

例如:

setVar:a=1;
; // 当 a 大于 1 时跳转到场景 1
changeScene:1.txt -when=a>1;
; // 只有 a 为 1 时才跳转,注意相等运算符是 ==
changeScene:2.txt -when=a==1;
; // 如果 a 小于 1,那么上面的语句不执行,自然就执行这一句了
changeScene:3.txt;

提示

= 是赋值符号,不可用于条件判断,==是相等运算符。

任何语句都可以加上 -when 参数来控制是否执行。通过组合 -when 参数和 jumpLabel callScene changeScene,你可以实现带条件判断的流程控制。

获取用户输入

使用getUserInput 指令来获取用户输入,例如:

getUserInput:name -title=如何称呼你 -buttonText=确认; 将用户输入写入 name 变量中

其中,title 参数是提示的文本,buttonText 是确认按钮的文本

变量插值

可以在语句中使用 {} 语法来进行变量插值,将某个变量传入语句中,例如:

setVar:name=WebGAL;
setVar:engine=WebGAL;
{name}:欢迎使用 {engine}!这是一款全新的网页端视觉小说引擎。;

长效变量(全局变量)

WebGAL 的普通变量是跟随存档的,也就是说,任何变量只存在于当前的游戏场景中,只有存档才能将其保存下来,读档将其恢复。

为了解决可能存在的作者希望设置多周目的问题,提供长效(全局)变量,一旦设置,则在整个游戏中生效,除非用户清除全部数据。

加上 -global 参数可以设置长效(全局)变量

setVar:a=1 -global;

这样就设置了一个不随存档读取而改变的变量。

使用例:

jumpLabel:turn-2 -when=a>0;
setVar:a=1 -global;
一周目;
changeScene:一周目剧情.txt;
label:turn-2;
二周目;
changeScene:二周目剧情.txt;

局部变量

callScene 传入的参数,会成为被调用场景的局部变量

; start.txt
callScene:battle.txt -enemy=史莱姆 -hp=100;

; battle.txt
旁白:遭遇了 {enemy},我方剩余血量 {hp}。;

局部变量属于这一次场景调用:它随存档一起保存和恢复,但调用结束后就消失,不会留给调用方。同一个场景因此可以用不同的参数反复调用。

要在场景内修改局部变量,给 setVar 加上 -local

setVar:hp=hp-30 -local;

变量的查找顺序

读取一个变量时,WebGAL 按下面的顺序查找,取第一个命中的:

  1. 当前场景的局部变量
  2. 普通变量
  3. 长效(全局)变量

也就是说局部变量会遮蔽同名的普通变量。如果同时存在局部变量 hp 和普通变量 hp,那么 {hp} 读到的永远是局部的那个,而 setVar:hp=1;(不加 -local)写的却是普通的那个,写进去的值读不出来。给参数取名时,注意与普通变量区分开。

返回值

被调用的场景可以用 return 把一个值交回调用方,写到调用方的哪个变量由 -writeReturnTo 参数指定:

; start.txt
callScene:battle.txt -enemy=史莱姆 -writeReturnTo=result;
旁白:战斗结果是 {result}。;

; battle.txt
return:胜利;

详见 callScenereturn

高级用法(>=4.5.4

使用内置变量进行更为高级的操作,如对配置变量进行修改,根据内置变量进行指定条件的逻辑运行等。

WebGAL 目前内置变量域有两个:stageuserData

提示

stage运行时内置变量userData存档内置变量

stage 可在 WebGAL 编辑器下面的state选项卡查看有哪些属性,userData则是可以在开发者工具中indexedDB查看。

使用$可以访问他们,如获取BGM的值:

setVar:a=($stage.bgm.volume);
WebGAL:当前的BGM音量为{a};

当然,你也可以直接在对话中使用它:

WebGAL:当前的BGM音量为{$stage.bgm.volume};

注意

获取单值变量时需要使用括号包裹,但进行数学运算时不需要。

我们还可以访问config.txt中的全局变量:

setVar:title=(Game_name);
WebGAL:当前的游戏标题为{title};

修改也不例外,当要修改游戏标题为新游戏标题时,setVar的变量名称需要设置为我们将修改的变量名称

global参数表示我们要修改的是配置变量:

setVar:Game_name=新游戏标题 -global;
WebGAL:当前的游戏标题为{Game_name};

注意

不加global则会赋值到游戏内变量,请注意何时使用global参数。

提示

可以修改的原始配置变量Title_imgTitle_bgmGame_nameGame_key
想要恢复则可以在游戏选项中使用清空所有数据即可恢复。

当然,你也可以在config.txt中创建一个自定义配置变量,如 创建一个版本号:

Game_name:欢迎使用WebGAL!;
Game_key:f60ad5725c1588;
Title_img:WebGAL_New_Enter_Image.png;
Title_bgm:s_Title.mp3;
Textbox_theme:imss;
; 增加版本号
version:1;

那么我们就可以在脚本里面对它进行获取,修改等操作:

setVar:v=(version);
WebGAL:当前的版本号为{v};
setVar:version=version*2 -global;
WebGAL:当前被修改的版本号为{version};

注意

config.txt暂未做特殊符号的转义处理。