Skip to content

Math Expressions

Noogear edited this page Mar 9, 2026 · 1 revision

数学表达式

math 节点和 checkvalue 字段支持完整的数学表达式语法。

数值与常量

类型 示例
整数 123042
小数 3.140.5
科学计数法 2E71.5e-3
内置常量 pi(3.14159…)、e(2.71828…)
布尔值 true(→ 1.0)、false(→ 0.0)

所有表达式求值结果均为 double 类型。

变量引用

# 基本变量引用
- math: "{damage} * 1.5"
  store: "result"

# 带默认值(变量未定义时使用默认值)
- math: "{attack:-10} * 1.5"
  store: "result"
语法 说明
{varName} 引用变量
{varName:-defaultValue} 引用变量,未定义时使用默认值

运算符

算术运算(从左到右结合)

运算符 说明 示例
+ 加法 {hp} + 100
- 减法 {max_hp} - {hp}
* 乘法 {damage} * 1.5
/ 除法 {hp} / {max_hp}
% 取模 {score} % 10
^ 幂运算(右结合 2 ^ 10 → 1024

比较运算(返回 1.0 = true,0.0 = false)

运算符 说明
== 等于
!= 不等于
> < >= <= 大小比较

逻辑运算(支持短路求值)

运算符 说明
&& 逻辑与(第一个为 false 时不计算第二个)
|| 逻辑或(第一个为 true 时不计算第二个)
! 逻辑非(一元前缀)

一元运算(前缀)

运算符 说明
- 取负
+ 取正(无实际效果)
! 逻辑非(0.0 → 1.0,非零 → 0.0)

三元条件

条件 ? 为真时的值 : 为假时的值
# 暴击加成
- math: "{is_critical} >= 1 ? {damage} * 2 : {damage}"
  store: "finalDmg"

# 嵌套三元
- math: "{x} > 10 ? {y} * 2 : {x} < 5 ? {y} / 2 : {y}"
  store: "result"

三元运算符为右结合——嵌套时最右侧的 : 优先与最近的 ? 配对。

条件判定规则:0.0 视为 false,其他值视为 true。

运算符优先级(从高到低)

  1. 一元运算:!-+
  2. 幂运算:^
  3. 乘除取模:*/%
  4. 加减:+-
  5. 比较:==!=><>=<=
  6. 逻辑与:&&
  7. 逻辑或:||
  8. 三元:?:

使用括号 () 可以改变运算顺序:

- math: "({a} + {b}) * {c}"
  store: "result"

内置函数

三角函数(弧度制)

sin(x)   cos(x)   tan(x)
asin(x)  acos(x)  atan(x)
sinh(x)  cosh(x)  tanh(x)

算术函数

函数 说明 示例
sqrt(x) 平方根 sqrt(144) → 12
cbrt(x) 立方根 cbrt(27) → 3
abs(x) 绝对值 abs(-5) → 5
log(x) 以 10 为底的对数 log(100) → 2
ln(x) 自然对数 ln(e) → 1

取整函数

函数 说明 示例
round(x) 四舍五入 round(3.7) → 4
ceil(x) 向上取整 ceil(3.1) → 4
floor(x) 向下取整 floor(3.9) → 3

比较与随机

函数 说明 示例
min(a, b) 取最小值 min({hp}, 100)
max(a, b) 取最大值 max({damage}, 1)
rand(n) [0, n) 随机数 rand(1) → 0.0~1.0

高级函数

函数 说明
clamp(value, min, max) 将值限制在 [min, max] 区间
lerp(a, b, t) 线性插值:a + (b - a) × t
saturate(x) 等价于 clamp(x, 0, 1)
sign(x) 符号函数,返回 -1、0 或 1
step(edge, x) x ≥ edge 返回 1.0,否则 0.0
smoothstep(e0, e1, x) GLSL 风格平滑过渡
map(x, inMin, inMax, outMin, outMax) 线性值重映射

使用场景

在 math 节点中

- math: "{attack} * (1 + {level} * 0.1)"
  store: "scaledDamage"

在 check 的 value 中(数值操作符时自动解析)

- check: hp
  op: "<="
  value: "{max_hp} * 0.3"           # hp 低于 30% 最大生命

复杂公式组合

# 带随机浮动的伤害
- math: "{base} * (1 + rand(0.4) - 0.2)"
  store: "randomizedDamage"

# RPG 伤害公式
- math: "clamp({attack} * (1 + {level} * 0.05) - {defense} * 0.3, 1, 99999)"
  store: "finalDmg"

# 冷却时间钳制
- math: "clamp({speed} * 0.8, 0.5, 5.0)"
  store: "cooldown"

# 距离计算
- math: "sqrt({x}^2 + {y}^2 + {z}^2)"
  store: "distance"

Clone this wiki locally