简体中文
变量类型
技能变量 (variables) 分哪些类型, 每个字段怎么用, 以及运行时怎么被解析
技能变量 (variables) 用来描述技能在不同等级下的数值变化, 支持好几种类型. 你把变量块写在技能定义的 variables 下面
类型列表
| 类型 | 别名 | 说明 |
|---|---|---|
expression | — | 数学表达式, 可以引用 %level% 这类上下文变量. 最常用的一种 |
string | str, text | 字符串值 |
random_text | random_text_lines, random_lines, random_line, text_lines | 从候选行里随机挑一行 |
random_char | random_chars, char_random, chars_random | 从候选里等概率随机挑一项 |
weighted_random_char | weighted_random_chars, weighted_char, weighted_chars, weighted_char_random | 按权重随机挑一项 |
conditional_char | condition_char, case_char, if_char | 按条件分支挑一项 |
boolean | bool, flag | 布尔值, 支持用表达式判断 |
constant | const, fixed | 固定值. 认不出的 type 也会回退到这种类型 |
range | — | 区间取值 |
uniform | — | 均匀分布随机数 (在 min~max 之间等概率) |
gaussian | normal | 高斯 (正态) 分布随机数 |
skew_normal | skewnormal | 偏态正态分布随机数 |
triangle | — | 三角分布随机数 |
别名不用担心写错大小写和分隔符: 匹配别名前会先把字母转小写, 把 - 换成 _, 所以 Random-Text 这类写法也认
注意: string, random_text, random_char, weighted_random_char, conditional_char, boolean 都是非数值类型, min / max / decimals 对它们不起作用
未写 type 时的自动判定
| 条件 | 判定类型 |
|---|---|
写了 lines | random_text |
同时写了 min 和 max | range |
| 其他映射写法 | constant |
变量直接写标量值 (damage: "10 + %level%") | string, 标量就是取值 |
参数字段
yaml
variables:
damage:
type: expression
value: "10 + %level% * 5"
min: 10
max: 100
decimals: 0| 字段 | 类型 | 必填 | 默认值 | 取值范围 | 说明 |
|---|---|---|---|---|---|
type | string | 否 | 见上节自动判定, 最终回退 constant | 上表全部取值与别名 | 变量类型 |
value | string | 否 | "" | 表达式或文本 | string / boolean 直接取这个键; 其他类型用整节配置参与计算, value 只是其中一个键 |
min | double | 否 | 不截断 | 任意 double | 数值下限; 计算结果比它低时会被抬到 min |
max | double | 否 | 不截断 | 任意 double | 数值上限; 计算结果比它高时会被压到 max |
decimals | integer | 否 | 0 | ≥ 0, 负数按 0 | 小数位数. 0 表示四舍五入取整; 大于 0 时按 double 原样输出 |
default | string | 否 | "" | — | 表达式解析失败时的备用值; boolean 还会拿它当默认的布尔判断 |
lines | list<\string> | 否 | [] | — | random_text 的候选行; 也用来触发自动类型判定 |
变量名会被规范化; 以 emaki_ 开头的键会被跳过, 免得和内置注入的变量撞上
示例
expression 类型
yaml
variables:
damage:
type: expression
value: "10 + %level% * 5"
min: 10
max: 100
decimals: 0
radius:
type: expression
value: "3 + %level% * 0.5"
max: 10
decimals: 1uniform 类型
yaml
variables:
bonus_damage:
type: uniform
value: "5~15"
decimals: 0random_text 类型
yaml
variables:
cast_message:
type: random_text
lines:
- "<red>火焰爆发!"
- "<red>燃烧吧!"
- "<red>烈焰之力!"候选列表的键名是 lines
记住: random_text 只读 lines. 你写成 values 不会报错, 但候选列表会是空的. 反过来, 只要写了 lines 又没写 type, 类型就会被自动判定为 random_text
boolean 类型
yaml
variables:
is_aoe:
type: boolean
value: "%level% >= 5"标量简写
yaml
variables:
ignite_ticks: "40 + (%level% - 1) * 6"
empowered: "%level% >= 5 && %has_target% == 1"标量写法最省事: 按 string 类型解析, 取值仍是表达式文本
在脚本中使用变量
变量算出来的值, 你在脚本行, 阶段条件和文本里用 %var.<变量名>% 引用:
yaml
script:
actions:
cast:
- 'trigger | damage amount=%var.damage%'
- 'trigger | where %var.is_aoe%==true | spawn_particle particle=EXPLOSION count=10'变量按你声明的先后顺序计算, 后声明的变量可以引用先声明的变量:
yaml
variables:
damage:
type: expression
value: "10 + %level% * 5"
hit_message: "<red>造成 %damage% 点伤害"两种引用范围不同
两种位置的写法不一样, 别记混: 在 variables 内部互相引用时写 %变量名% (不带 var. 前缀); 在脚本行, 阶段条件与文本中引用时写 %var.变量名%. 上下文变量同理: 脚本里是 %var.level%, 而变量表达式里是 %level%
上下文变量
写 expression 这类非字符串类型时, 计算中可以直接读到下面这些上下文量:
| 变量 | 说明 |
|---|---|
%level% | 当前技能等级. 升级预览时是目标等级的前一级 (就是当前的等级) |
%target_level% | 升级的目标等级 |
%max_level% | 技能最大等级 |
%skill_id% | 技能 ID |
%trigger_id% | 触发器 ID |
%is_passive% | 是不是被动技能 (1 / 0) |
%player_level% | 玩家原版经验等级 |
%player_health% | 玩家当前生命值 |
%player_max_health% | 玩家最大生命值 |
%sneaking% | 是不是在潜行 (1 / 0) |
%has_target% | 有没有目标 (1 / 0) |
注入 MythicMobs
算出来的变量会注入 MythicMobs 技能的元数据, 你在 MythicMobs 技能里用 <skill.var.变量名> 读取. 另有 5 个内置变量会一直注入: emaki_skill_id, emaki_skill_level, emaki_trigger_id, emaki_is_passive, emaki_has_target
在原生脚本里, 同一批内置变量以 %var.emaki_skill_id% 等形式可见 (见 原生脚本系统)