diff --git a/src/module/item/base/sheet/rule-element-form/base.ts b/src/module/item/base/sheet/rule-element-form/base.ts index 6f5dd43db72..bf0970c0a7a 100644 --- a/src/module/item/base/sheet/rule-element-form/base.ts +++ b/src/module/item/base/sheet/rule-element-form/base.ts @@ -139,7 +139,14 @@ class RuleElementForm< form: await this.#getFormHelpers(mergedRule), autogenerate, rootId: this.sheet.id, - hiddenFields: ["ignored", "requiresEquipped", "requiresInvestment", "removeUponCreate", "battleForm"], + hiddenFields: [ + "ignored", + "requiresEquipped", + "requiresInvestment", + "removeUponCreate", + "battleForm", + "overrideAppliesFacesUpgrade", + ], omittedFields: ["key", "priority", "spinoff"], validationFailures, }; diff --git a/src/module/rules/rule-element/item-alteration/alteration.ts b/src/module/rules/rule-element/item-alteration/alteration.ts index 6bbb4c60427..6ffee38049d 100644 --- a/src/module/rules/rule-element/item-alteration/alteration.ts +++ b/src/module/rules/rule-element/item-alteration/alteration.ts @@ -55,6 +55,13 @@ class ItemAlteration extends foundry.abstract.DataModel DAMAGE_DICE_FACES, initial: null, } as const), + overrideAppliesFacesUpgrade: new fields.BooleanField({ + required: false, + nullable: false, + initial: true, + }), }, validate: (data) => { const hasBasicStructure = R.isPlainObject(data) && "mode" in data && "value" in data; @@ -342,14 +347,18 @@ const ITEM_ALTERATION_HANDLERS = { const item = data.item; const mode = data.alteration.mode; - if (!item.system.damage.die) return; - if (mode === "upgrade" && !item.flags[SYSTEM_ID].damageFacesUpgraded) { - item.system.damage.die = nextDamageDieSize({ upgrade: item.system.damage.die }); + const die = item.system.damage.die; + if (mode === "upgrade" && !item.flags[SYSTEM_ID].damageFacesUpgraded && die) { + item.system.damage.die = nextDamageDieSize({ upgrade: die }); item.flags[SYSTEM_ID].damageFacesUpgraded = true; - } else if (mode === "downgrade") { - item.system.damage.die = nextDamageDieSize({ downgrade: item.system.damage.die }); + } else if (mode === "downgrade" && die) { + item.system.damage.die = nextDamageDieSize({ downgrade: die }); } else if (mode === "override" && typeof data.alteration.value === "number") { - if (data.alteration.value > Number(item.system.damage.die.replace("d", ""))) { + if ( + data.alteration.overrideAppliesFacesUpgrade && + die && + data.alteration.value > Number(die.replace("d", "")) + ) { item.flags[SYSTEM_ID].damageFacesUpgraded = true; } item.system.damage.die = `d${data.alteration.value}`; diff --git a/src/module/rules/rule-element/item-alteration/rule-element.ts b/src/module/rules/rule-element/item-alteration/rule-element.ts index ea206e3321c..7ac6156a16a 100644 --- a/src/module/rules/rule-element/item-alteration/rule-element.ts +++ b/src/module/rules/rule-element/item-alteration/rule-element.ts @@ -45,6 +45,8 @@ class ItemAlterationRuleElement extends RuleElement { initial: undefined, }), battleForm: new fields.BooleanField(), + /** When false, a damage-die override to a larger size does not set `damageFacesUpgraded` */ + overrideAppliesFacesUpgrade: new fields.BooleanField({ initial: true }), ...ItemAlteration.defineSchema(), }; } @@ -58,7 +60,7 @@ class ItemAlterationRuleElement extends RuleElement { } /** Alteration properties that should be processed at the end of data preparation */ - static #DELAYED_PROPERTIES = ["pd-recovery-dc"]; + static #DELAYED_PROPERTIES = ["damage-dice-faces", "pd-recovery-dc"]; /** Alteration properties that should only be processed when requested directly */ static #LAZY_PROPERTIES = ["description"]; @@ -197,6 +199,8 @@ type ItemAlterationRuleSchema = RuleElementSchema & itemId: fields.StringField; /** Whether this rule element is compatible with battle forms */ battleForm: fields.BooleanField; + /** If true (default), `damage-dice-faces` override to a larger die sets `damageFacesUpgraded` */ + overrideAppliesFacesUpgrade: fields.BooleanField; }; interface ApplyAlterationOptions {