跳转到内容

变量 · 函数 · 数据类型

世界逻辑规则通过变量记住并计算值,用于分数、剩余尝试次数、任务阶段等。函数是多条规则共用的动作集合。enum 和数据类型将值组织成固定的形式。

功能作用使用的 type
变量记住值。动作「设置变量」(set_var)· 条件「比较」(compare)· 表达式 {名称}
函数只有被其他动作调用时才执行的规则。触发器「函数」(function)· 5 种调用动作
enum只能取固定值之一的类型。变量、数据类型字段的类型
数据类型由多个字段组成的类型(类似于类)。变量的类型
内容位置
变量 · enum · 数据类型窗口世界逻辑面板左上角的「变量」按钮
设置变量 · 比较 · 函数 type世界逻辑面板「添加动作」·「添加条件」· 触发器 type 菜单中的「变量 · 函数」分组,或逻辑图的添加节点窗口

为每位玩家计分,达到 10 分时显示标题。

  1. 点击世界逻辑面板中的「变量」。
  2. 在「变量」选项卡中点击「添加变量」。
  3. 设置名称 score、类型 int、范围「玩家」、初始值 0。
  4. 点击「应用」(Ctrl+Z 一步即可撤销)。
  5. 在给分的规则中添加动作「设置变量」。设置变量 score、计算 add、值 1。
  6. 在同一规则中添加动作「分支(如果)」。设置左侧 {score}、比较 >=、右侧 10。
  7. 在逻辑图中,将「若为真」行的黄色引脚放到空白处。会生成新的「函数」规则(func_1)。
  8. 在该函数规则中添加动作「屏幕标题」。

「变量」选项卡中的一行即为一个变量。

字段含义
名称在表达式中写作 {名称}。
类型基本类型 · enum · 数据类型之一
范围全局(每个场景一个值)· 玩家(每人一个值)
初始值留空时为该类型的零值。
类型值示例初始值(留空时)
booltrue · falsefalse
int30
float2.50
string你好空文本
player玩家名称空文本
actorActor id空文本
positionx y z(以空格分隔)0 0 0
enum该 enum 的一个值第一个值
数据类型每个字段的值(见下文)每个字段的初始值

所有值都以文本形式保存。数字保留到小数点后第三位。

未声明的名称也可以使用,该名称会成为全局文本变量。它与条件「标志」、动作「设置标志」使用同一存储。需要类型、玩家范围或初始值时再进行声明。

值字段(「设置变量」的值、「比较」的左侧 · 右侧等)中填写表达式。

  1. 将 {名称} 替换为其值。
  2. 如果剩余文本只包含数字和 + - * / % ( ),则进行计算(例如 {score} * 2 + 1)。
  3. 否则直接使用替换后的文本(例如 {player} 欢迎光临)。
  • 除以 0 的结果为 0。
  • 未知的名称会变为空文本。

名称的查找顺序为:局部变量(函数参数 · {index})→ 玩家变量 → 全局变量 → 特殊名称。

特殊名称值
{player}触发者的名称
{player_x} · {player_y} · {player_z}触发者的位置
{player_pos}触发者的位置 x y z
{time}场景开始后经过的秒数
{random}0~1 之间的随机数
{index}在「重复」中的当前序号(0, 1, 2 …)

动作「设置变量」(set_var)的字段。

字段值含义
变量名称若为数据类型变量,需写到字段,如 hero.hp。
范围auto · global · player · localauto = 按声明。没有声明时,若存在同名局部变量则为局部,否则为全局。local = 仅在本次执行内
计算见下表
数值表达式
计算含义
set改为该值。
add · sub · mul · div · mod加 · 减 · 乘 · 除 · 取余。除以 0 结果为 0。
min · max与当前值比较,取较小 · 较大者
append在末尾追加文本。
toggle在 true ↔ false 之间切换(不使用值)。

当前值不是数字时,在数字计算中视为 0。

条件「比较」(compare)和动作「分支(如果)」通过左侧 · 比较 · 右侧字段进行比较。

比较含义
== · !=两者都是数字时按数字比较,否则按文本比较(区分大小写)。
< · <= · > · >=只比较数字。不是数字时为假。
contains左侧文本包含右侧文本
starts_with左侧文本以右侧文本开头

函数是触发器为「函数」的规则。它不会自行发生,只有被调用动作按名称调用时才会执行。

「函数」触发器字段含义
函数名调用时使用的名称。
参数名以逗号分隔的名称(例如 amount, target)。调用时传入的值会成为局部变量 {amount}。
  • 函数继承调用方的触发者。
  • 函数规则的条件为假时,只跳过该函数。
  • 函数规则不使用过滤(仅一次 · 冷却 · 权限)。
动作type字段作用
调用函数call函数 · 参数(名称=表达式, …)执行函数,结束后执行下一个动作
依次(序列)sequence函数(逗号分隔)依次执行多个函数。前一个函数结束后才执行下一个
分支(如果)branch左 · 比较 · 右 · 若为真 · 若为假比较后调用一个函数。对应的一侧为空时什么也不做
重复repeat次数(1~100)· 函数按次数依次执行函数。{index} = 0, 1, 2 …
每个玩家for_each_player接收者 · 函数对每个接收者,以其为触发者依次执行函数
  • 被调用的函数遇到「等待」时,调用方也会一同等待。函数结束后才进入下一个动作。
  • 函数调用函数的深度最多为 16。超过时会中断并记录错误(递归循环)。
  • 参数表达式在调用时计算。

自 0.9.11 起:一个调用字段中只能写一个函数。写入多个函数会产生检查错误。要依次调用,请使用「依次(序列)」。存在两条以上同名函数规则时同样会产生检查错误。

函数信号
调用动作调用函数 · 依次 · 分支 · 重复 · 每个玩家发送信号
接收方该名称的一条「函数」规则该名称的所有「收到信号时」规则(广播)
等待等待函数结束(包括 wait)不等待
图黄色函数引脚 — 一个引脚一条线信号引脚 — 连线到所有接收规则

自 0.9.11 起:「变量」窗口改为三个选项卡(变量 · enum · 数据类型)。

在「enum」选项卡中点击「添加 enum」。

字段示例
名称Job
值(以逗号分隔)warrior, mage, archer
  • 可以作为变量、数据类型字段的类型选择。
  • 该类型变量的初始值为指定的初始值,没有时为第一个值。
  • enum 范围以外的初始值或「设置变量」值会产生检查注意。

在「数据类型」选项卡中点击「添加数据类型」,然后用「添加字段」添加字段。

字段示例
数据类型名称Hero
字段名称 · 字段类型 · 初始值hp · int · 20 / job · Job / gold · int

字段类型可以是基本类型、enum 或其他数据类型。

数据类型变量按字段展开为各自的值。变量 hero(类型 Hero)的写法如下。

使用位置示例
表达式{hero.hp} · {hero.job}
「设置变量」的变量字段hero.hp
「比较」的左侧{hero.job}
嵌套数据类型{hero.stats.str}
  • 范围遵循变量声明。
  • 对整个 hero 执行「设置变量」会产生检查错误。请选择字段。
  • 数据类型变量的初始值按字段(在数据类型选项卡中)设置。变量行中的初始值不会被使用。

点击「应用」时进行检查,并以通知显示问题。

类型内容
错误名称规则(以英文字母开头,仅限英文字母 · 数字 · _)· 名称重复(基本类型 · enum · 数据类型之间)· 没有值的 enum · 没有字段的数据类型 · 不存在的类型 · 包含自身的数据类型(循环)· 对整个数据类型执行「设置变量」· 重复的变量声明
注意enum 范围以外的初始值 · enum 范围以外的「设置变量」值 · 数据类型变量行的初始值

函数方面的检查如下。

类型内容
错误不存在的函数名 · 同名的函数规则 · 一个调用字段中有多个函数
注意没有调用动作的函数 · 函数规则中开启的过滤

「世界逻辑 变量 · enum · 数据类型」窗口中的按钮。

按钮作用
添加变量 · 添加 enum · 添加数据类型添加新行。
添加字段为数据类型添加字段。
移除(回收站)移除该行 · 字段。
应用一次性保存三个选项卡。撤销时为一步。
关闭不保存直接关闭。
键动作
Esc关闭窗口(丢弃未应用的内容)
Ctrl+Z撤销「应用」
  • 点击「应用」之前不会保存任何内容。
  • 运行中的变量值可以在运行的世界逻辑历史(「变量名 = 值」行)中查看。
  • 服务器插件也必须按相同规则执行变量和函数。服务器端的支持情况请确认服务器插件的版本。
  • 在服务器上,数据类型变量以展开后的名称(hero.hp 等)保存。