Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/module/item/base/sheet/rule-element-form/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
};
Expand Down
7 changes: 7 additions & 0 deletions src/module/rules/rule-element/item-alteration/alteration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,13 @@ class ItemAlteration extends foundry.abstract.DataModel<RuleElement, ItemAlterat
mode: this.mode,
itemType: item.type,
value: (this.value = this.parent.resolveValue(this.value, fallbackValue)),
...(this.property === "damage-dice-faces"
? {
overrideAppliesFacesUpgrade:
(this.parent as RuleElement & { overrideAppliesFacesUpgrade?: boolean })
.overrideAppliesFacesUpgrade ?? true,
}
: {}),
},
});
}
Expand Down
21 changes: 15 additions & 6 deletions src/module/rules/rule-element/item-alteration/handlers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,11 @@ const ITEM_ALTERATION_HANDLERS = {
choices: () => 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;
Expand Down Expand Up @@ -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}`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class ItemAlterationRuleElement extends RuleElement<ItemAlterationRuleSchema> {
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(),
};
}
Expand All @@ -58,7 +60,7 @@ class ItemAlterationRuleElement extends RuleElement<ItemAlterationRuleSchema> {
}

/** 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"];
Expand Down Expand Up @@ -197,6 +199,8 @@ type ItemAlterationRuleSchema = RuleElementSchema &
itemId: fields.StringField<string, string, false, false, false>;
/** 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 {
Expand Down
Loading