跳到主要内容

公式与比较条件

数值字段直接使用 Saturn NumberProvider,可写常量、公式字符串或带 type 的数值对象。公式使用 exp4j,不是 JavaScript;布尔组合使用 Saturn EntityCondition。

自动变量名​

将资源、组、选项的完整注册 ID中的 :、/、-、. 替换为 _。命名空间参与生成,其余合法 ID 字符保留。例如 example:warrior → example_warrior,my-pack:skills/fire.ball → my_pack_skills_fire_ball。

变量含义示例
input_<name>创建会话时捕获的具名输入input_bonus
base_<资源别名>冻结的资源基准base_example_points
selected_<选项别名>选项当前份数selected_example_warrior
group_<组别名>_distinct组内已选种类数group_example_talents_distinct
group_<组别名>_total组内已选份数之和group_example_attributes_total
resource_<资源别名>所有贡献计算后的最终值resource_example_points

资源、组和选项没有可手写的 key 字段。相同类别在同一方案内发生转换冲突时,整个数据包加载失败,例如 example:a-b 与 example:a_b。不会按加载顺序追加后缀;重排资源、组或选项也不会改名。

inputs 的映射名仍由作者配置。预设使用位置编号 preset_1、preset_2,不产生选择公式变量。Outcome、action 和规则的 key 用于稳定标识和诊断,仍需配置。

求值顺序​

捕获 inputs 和资源基准
→ 当前完整选择数量
→ 所有组的 distinct / total
→ 各选项每份资源贡献 × 份数
→ 最终资源值
→ 显示、可用、数量、完成规则及奖励条件

对每个资源,最终值等于基准加上所有已选项的贡献。每次点击都完整重算,不累计点击历史;要使相同选择集得到相同结果,计价应使用可重复求值的公式。

resource_changes 只能读取 input_*、base_*、selected_*、group_*,不能读取 resource_*。否则形成余额决定价格的阶段依赖,会在加载校验中报错。数量、条件和奖励计算可以读取最终 resource_*。

联动示例​

以下字段片段使用完整示例中的 ID:

{
"resource_changes": {
"example:points": "-3 + selected_example_warrior",
"example:fate": -1
}
}

弓术在未选战士时消耗 3 点,选战士后消耗 2 点;无论何种职业,都消耗 1 点命运。数量上限可写 "2 + 2 * selected_example_warrior",学者增加天赋名额可写 "1 + selected_example_scholar"。

需要随机开局时,将随机值放入 Plan 的 inputs,再读取 input_<name>,避免每次重算重新抽取。Saturn 的公式解码和异常回退行为直接沿用;SPB 不增加 provider 白名单或严格表达式求值层。被 Saturn 内部处理并回退的错误不会再被 SPB 判错,应结合日志验证自己的公式。SPB 仍检查方案变量作用域、资源边界、非法数量和向外抛出的求值异常。

spb:compare​

这是可嵌入 Saturn EntityCondition 字段的比较条件,不是独立注册表文件。

字段类型必填默认值作用
type资源 ID是—spb:compare
leftNumberProvider是—左值
operator比较运算符是—==、!=、<、<=、>、>=
rightNumberProvider是—右值
epsilon有限非负数否1e-8绝对误差容限
{
"type": "spb:compare",
"left": "resource_example_points",
"operator": "==",
"right": 0
}

epsilon > 0 时,== 表示差值绝对值不超过容限,!= 表示超过容限;< 要求 left < right - epsilon,<= 为 left <= right + epsilon,大于比较对称处理。epsilon: 0 直接使用 Saturn 的比较谓词,等号保留 Double.equals 的行为,例如 -0.0 与 0.0 不相等。需要比默认值更细的精度时显式设置容限。

配置通过的余额​

在 Plan 的 completion_rules 中使用以下条件;各条规则还需提供自己的 key:

规则条件
必须花完left: resource_example_points、operator: ==、right: 0
可以剩余,禁止透支同一 left,operator: >=、right: 0
允许剩余 1~3两条规则分别检查 >= 1 和 <= 3
多种点数同时符合分别检查 resource_example_points 和 resource_example_fate

Saturn 的普通资源条件读取真实玩家资源,适合自动开启等外部条件。检查未提交余额时读取这里的 resource_* 草稿变量。