Skip to content

变量类型 ​

技能变量 (variables) 分哪些类型, 每个字段怎么用, 以及运行时怎么被解析

技能变量 (variables) 用来描述技能在不同等级下的数值变化, 支持好几种类型. 你把变量块写在技能定义的 variables 下面

类型列表 ​

类型别名说明
expression—数学表达式, 可以引用 %level% 这类上下文变量. 最常用的一种
stringstr, text字符串值
random_textrandom_text_lines, random_lines, random_line, text_lines从候选行里随机挑一行
random_charrandom_chars, char_random, chars_random从候选里等概率随机挑一项
weighted_random_charweighted_random_chars, weighted_char, weighted_chars, weighted_char_random按权重随机挑一项
conditional_charcondition_char, case_char, if_char按条件分支挑一项
booleanbool, flag布尔值, 支持用表达式判断
constantconst, fixed固定值. 认不出的 type 也会回退到这种类型
range—区间取值
uniform—均匀分布随机数 (在 min~max 之间等概率)
gaussiannormal高斯 (正态) 分布随机数
skew_normalskewnormal偏态正态分布随机数
triangle—三角分布随机数

别名不用担心写错大小写和分隔符: 匹配别名前会先把字母转小写, 把 - 换成 _, 所以 Random-Text 这类写法也认

注意: string, random_text, random_char, weighted_random_char, conditional_char, boolean 都是非数值类型, min / max / decimals 对它们不起作用

未写 type 时的自动判定 ​

条件判定类型
写了 linesrandom_text
同时写了 min 和 maxrange
其他映射写法constant
变量直接写标量值 (damage: "10 + %level%")string, 标量就是取值

参数字段 ​

yaml
variables:
  damage:
    type: expression
    value: "10 + %level% * 5"
    min: 10
    max: 100
    decimals: 0
字段类型必填默认值取值范围说明
typestring否见上节自动判定, 最终回退 constant上表全部取值与别名变量类型
valuestring否""表达式或文本string / boolean 直接取这个键; 其他类型用整节配置参与计算, value 只是其中一个键
mindouble否不截断任意 double数值下限; 计算结果比它低时会被抬到 min
maxdouble否不截断任意 double数值上限; 计算结果比它高时会被压到 max
decimalsinteger否0≥ 0, 负数按 0小数位数. 0 表示四舍五入取整; 大于 0 时按 double 原样输出
defaultstring否""—表达式解析失败时的备用值; boolean 还会拿它当默认的布尔判断
lineslist<\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: 1

uniform 类型 ​

yaml
variables:
  bonus_damage:
    type: uniform
    value: "5~15"
    decimals: 0

random_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% 等形式可见 (见 原生脚本系统)