From 9e5bd665fdb376612984f4d41e632817e9f06960 Mon Sep 17 00:00:00 2001 From: Gil Pedersen Date: Mon, 20 Oct 2025 22:45:57 +0200 Subject: [PATCH] Upgrade baseModifier fields to support resolvable values --- .../rules/rule-element/special-statistic.ts | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/module/rules/rule-element/special-statistic.ts b/src/module/rules/rule-element/special-statistic.ts index e797c6a2408..72963255147 100644 --- a/src/module/rules/rule-element/special-statistic.ts +++ b/src/module/rules/rule-element/special-statistic.ts @@ -10,7 +10,7 @@ import { Statistic, StatisticData } from "@system/statistic/index.ts"; import { tupleHasValue } from "@util"; import * as R from "remeda"; import { RuleElement } from "../index.ts"; -import type { ModelPropsFromRESchema, RuleElementSchema } from "./data.ts"; +import { ResolvableValueField, RuleValue, type ModelPropsFromRESchema, type RuleElementSchema } from "./data.ts"; import fields = foundry.data.fields; /** Create a special-purpose statistic for use in checks and as a DC */ @@ -48,9 +48,9 @@ class SpecialStatisticRuleElement extends RuleElement { }), baseModifier: new fields.SchemaField( { - mod: new fields.NumberField({ required: false, nullable: true, integer: true, initial: null }), - check: new fields.NumberField({ required: false, nullable: true, integer: true, initial: null }), - dc: new fields.NumberField({ required: false, nullable: true, integer: true, initial: null }), + mod: new ResolvableValueField({ required: false, nullable: true, initial: null }), + check: new ResolvableValueField({ required: false, nullable: true, initial: null }), + dc: new ResolvableValueField({ required: false, nullable: true, initial: null }), }, { required: false, nullable: true, initial: null }, ), @@ -83,15 +83,16 @@ class SpecialStatisticRuleElement extends RuleElement { const label = this.itemCasting ? (extendedFrom?.label ?? this.label) : this.label; const checkType = this.type === "check" ? "check" : "attack-roll"; - const modCheckDC = - this.baseModifier && actor.type === "npc" - ? R.mapValues(this.baseModifier, (value, key) => { - const slug = typeof this.baseModifier?.mod === "number" && key !== "mod" ? `base-${key}` : "base"; - const label = "PF2E.ModifierTitle"; - const modifier = typeof value === "number" && key === "dc" ? value - 10 : value; - return typeof modifier === "number" ? [new Modifier({ slug, label, modifier })] : []; - }) - : { mod: [], check: [], dc: [] }; + const modCheckDC = this.baseModifier + ? R.mapValues(this.baseModifier, (value, key) => { + const resolvedValue = this.resolveValue(value); + const slug = typeof this.baseModifier?.mod === "number" && key !== "mod" ? `base-${key}` : "base"; + const label = "PF2E.ModifierTitle"; + const modifier = + typeof resolvedValue === "number" && key === "dc" ? resolvedValue - 10 : resolvedValue; + return typeof modifier === "number" ? [new Modifier({ slug, label, modifier })] : []; + }) + : { mod: [], check: [], dc: [] }; const data: Required> = { slug: this.slug, @@ -142,12 +143,12 @@ type SpecialStatisticSchema = RuleElementSchema & { /** A base modifier for use with NPC special statistics: separate check and DC values may also be specified. */ baseModifier: fields.SchemaField< { - mod: fields.NumberField; - check: fields.NumberField; - dc: fields.NumberField; + mod: ResolvableValueField; + check: ResolvableValueField; + dc: ResolvableValueField; }, - { mod: number | null; check: number | null; dc: number | null }, - { mod: number | null; check: number | null; dc: number | null }, + { mod: RuleValue; check: RuleValue; dc: RuleValue }, + { mod: RuleValue; check: RuleValue; dc: RuleValue }, false, true, true