脚本基础
文件型自定义变量
说明 Blue 引擎中通过 VAR、LOADVAR、SAVEVAR 等命令管理的文件型自定义变量,包括声明、读取、保存和常见用法。
常用命令
| 命令 | 作用 |
|---|---|
VAR | 声明变量 |
LOADVAR | 从文件读取变量 |
SAVEVAR | 保存变量到文件 |
CHECKVAR | 判断变量值 |
CALCVAR | 对数字变量做运算 |
VAR 声明变量
同一作用域内不要重复声明同名变量,重复声明时引擎会报错。
在
VAR 命令声明 HardDisk 后,后续 LOADVAR,SAVEVAR,CALCVAR 无需再声明 HardDisk语法
VAR <类型> <作用域> <变量名> [默认值] [HardDisk]
例如:
#ACT
VAR STRING HUMAN 网站地址 "" HardDisk
VAR INTEGER HUMAN 今日积分 0 HardDisk
参数
| 参数位置 | 参数 | 说明 |
|---|---|---|
| 1 | STRING / INTEGER | 变量类型,分别表示字符串和整数 |
| 2 | HUMAN / GLOBAL / GUILD | 作用域,分别表示人物、全局、行会 |
| 3 | 变量名 | 自定义变量名称 |
| 4 | 默认值 | 可选,声明时直接赋初始值;整数常用 0,字符串为空时写 "" |
| 5 | HardDisk | 可选,表示是否实时写入数据 |
LOADVAR 读取变量
LOADVAR 用于把文件中的值读取到已声明变量里。
语法
LOADVAR <作用域> <变量名> <文件路径>
参数
| 参数位置 | 参数 | 说明 |
|---|---|---|
| 1 | HUMAN / GLOBAL / GUILD | 作用域,分别表示人物、全局、行会 |
| 2 | 变量名 | 已声明的文件型自定义变量名 |
| 3 | 文件路径 | 变量数据所在的文本文件 |
例如:
#ACT
LOADVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
如果文件里已经存在对应字段,执行后就可以继续对变量做判断、计算或显示。
全局变量读取示例
[@OnStart]
#ACT
VAR STRING GLOBAL 财富第一名
LOADVAR GLOBAL 财富第一名 ..\QUESTDIARY\数据文件\排名\自定义全局变量数据.txt
使用全局文件型变量时,通常要在引擎启动时先完成声明和初始化。
SAVEVAR 保存变量
SAVEVAR 用于把当前变量值写回指定文件。
语法
SAVEVAR <作用域> <变量名> <文件路径>
参数
| 参数位置 | 参数 | 说明 |
|---|---|---|
| 1 | HUMAN / GLOBAL / GUILD | 作用域,分别表示人物、全局、行会 |
| 2 | 变量名 | 需要保存的变量名 |
| 3 | 文件路径 | 保存目标文件 |
例如:
#ACT
SAVEVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
如果没有执行保存,内存里的变量值更新后不一定会同步回文件。
所以这套机制和普通变量最大的区别之一,就是“读写文件”通常要显式执行。
CHECKVAR 判断变量
CHECKVAR 用于检测文件型自定义变量是否满足某个条件。
语法
CHECKVAR <作用域> <变量名> <运算符> <值>
参数
| 参数位置 | 参数 | 说明 |
|---|---|---|
| 1 | HUMAN / GLOBAL / GUILD | 作用域,分别表示人物、全局、行会 |
| 2 | 变量名 | 需要检测的变量名 |
| 3 | > / < / = / ? | 比较运算符,其中 ? 表示大于等于 |
| 4 | 值 | 用于比较的目标值 |
例如:
#IF
CHECKVAR HUMAN 今日积分 = 5
#ACT
SENDMSG 7 等于 5
也可以配合变量写法:
#IF
CHECKVAR HUMAN 今日积分 = <$STR(M2)>
#ACT
SENDMSG 7 条件成立
CALCVAR 数值计算
CALCVAR 用于对数字型文件变量做运算。
语法
CALCVAR <作用域> <变量名> <运算符> <值>
参数
| 参数位置 | 参数 | 说明 |
|---|---|---|
| 1 | HUMAN / GLOBAL / GUILD | 作用域,分别表示人物、全局、行会 |
| 2 | 变量名 | 需要计算的数字型变量名 |
| 3 | + / - / * / / / = | 运算方式 |
| 4 | 值 | 参与运算的值 |
例如:
#ACT
CALCVAR HUMAN 今日积分 + 5
SAVEVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
如果变量类型是字符串,就不应直接按数字运算方式处理。
显示变量
文件型自定义变量声明并读取后,可以在对话框、提示文本等输出位置直接调用。
这组写法最常见的用途,不是继续做判断,而是把已经读到内存里的值直接显示给玩家看。
调用写法
| 写法 | 含义 | 说明 |
|---|---|---|
<$HUMAN(变量名)> | 读取人物文件型变量 | 按变量名读取当前人物作用域下的文件型自定义变量。 |
<$GLOBAL(变量名)> | 读取全局文件型变量 | 按变量名读取全局作用域下的文件型自定义变量。 |
<$GUILD(变量名)> | 读取行会文件型变量 | 按变量名读取当前行会作用域下的文件型自定义变量。 |
例如:
#SAY
当前积分:<$HUMAN(今日积分)>
全服第一:<$GLOBAL(财富第一名)>
当前行会宣言:<$GUILD(行会宣言)>
使用前要先满足什么
这类写法依赖前面的文件型自定义变量流程,本身不会自动去文件里读取数据。
使用前至少要先完成下面这些步骤:
- 用
VAR声明对应作用域和变量名。 - 用
LOADVAR把文件中的值读进来,或先通过脚本给变量赋值。 - 需要持久保存时,再用
SAVEVAR写回文件。
如果前面没有声明变量,或还没把值读进来,这里就可能显示为空、默认值,或者表现和预期不一致。
怎么理解这 3 种写法
<$HUMAN(...)>适合显示当前人物自己的文件型数据,例如积分、签到次数、个人称号记录。<$GLOBAL(...)>适合显示全服共用的数据,例如排行榜第一名、活动状态、全服累计次数。<$GUILD(...)>适合显示当前行会自己的文件型数据,例如行会宣言、行会积分、行会仓库备注。
一个完整调用示例
下面这类写法适合先读取,再在对话框中显示:
#ACT
VAR INTEGER HUMAN 今日积分
LOADVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
#SAY
你当前的积分为:<$HUMAN(今日积分)>
如果你只是想“把一个文件型自定义变量显示出来”,通常要先确认两件事:
- 变量名是否和前面声明、读取时使用的名称完全一致。
- 当前标签执行前,变量是否已经成功加载。
<$HUMAN(...)>、<$GLOBAL(...)>、<$GUILD(...)> 是文件型自定义变量的配套读取写法,不属于常规属性变量或通用变量标签。
全局变量声明位置
使用全局文件型变量时,这一步最容易写错。
全局文件型变量声明应放在 QManage 的 [@OnStart] 段下,在引擎启动后执行一次。
例如:
[@OnStart]
#ACT
VAR STRING GLOBAL 财富第一名
VAR INTEGER GLOBAL 第一财富值
LOADVAR GLOBAL 财富第一名 ..\QUESTDIARY\数据文件\排名\自定义全局变量数据.txt
LOADVAR GLOBAL 第一财富值 ..\QUESTDIARY\数据文件\排名\自定义全局变量数据.txt
如果全局声明位置写错,就容易出现读取不到、初始化不完整或运行期行为不稳定的问题。
一个完整示例
下面这类写法适合“读取个人积分文件,累加后再保存”:
#ACT
VAR INTEGER HUMAN 今日积分
LOADVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
CALCVAR HUMAN 今日积分 + 5
SAVEVAR HUMAN 今日积分 ..\QUESTDIARY\数据文件\网站\395973.txt
如果要在对话框中显示结果:
#SAY
你当前的积分为:<$HUMAN(今日积分)>
