diff --git a/module/documents/Actor/GenericActor.mjs b/module/documents/Actor/GenericActor.mjs index d52b185..171af63 100644 --- a/module/documents/Actor/GenericActor.mjs +++ b/module/documents/Actor/GenericActor.mjs @@ -1,4 +1,15 @@ export class DotDungeonActor extends Actor { + + /* + Using this to take a "snapshot" of the system data prior to applying AE's so + that the inputs can still have the non-modified value in them, while we still + provide all that data to AE's without needing to disable any inputs. + */ + prepareEmbeddedDocuments() { + this.preAE = foundry.utils.deepClone(this.system); + super.prepareEmbeddedDocuments(); + }; + async createEmbeddedItem(defaults, opts = {}) { let items = await this.createEmbeddedDocuments(`Item`, defaults); if (!Array.isArray(items)) items = items ? [items] : []; diff --git a/module/documents/Actor/Player.mjs b/module/documents/Actor/Player.mjs index 6140ecb..2c5840d 100644 --- a/module/documents/Actor/Player.mjs +++ b/module/documents/Actor/Player.mjs @@ -5,11 +5,16 @@ export class Player extends DotDungeonActor { applyActiveEffects() { super.applyActiveEffects(); - // These are the (groups of) fields that ActiveEffects may modify safely - // and remain editable in the sheet. This needs to be done because of default - // Foundry behaviour that otherwise prevents these fields from being edited - delete this.overrides.system.stats; - delete this.overrides.system.skills; + /* + These are the (groups of) fields that ActiveEffects may modify safely and + remain editable in the sheet. This needs to be done because of default + Foundry behaviour that otherwise prevents these fields from being edited. + The deletes must use optional chaining otherwise they can cause issues + during the document preparation lifecycle as an actor with no AE's affecting + anything in one of these areas will result in these paths being undefined. + */ + delete this.overrides.system?.stats; + delete this.overrides.system?.skills; }; async createCustomPet() { diff --git a/module/sheets/Actors/PC/PlayerSheetV2.mjs b/module/sheets/Actors/PC/PlayerSheetV2.mjs index 142744b..0968a6e 100644 --- a/module/sheets/Actors/PC/PlayerSheetV2.mjs +++ b/module/sheets/Actors/PC/PlayerSheetV2.mjs @@ -74,7 +74,7 @@ export class PlayerSheetv2 extends GenericActorSheet { /** @type {ActorHandler} */ const actor = this.actor; - ctx.original = actor.toObject().system; + ctx.preAE = actor.preAE; ctx.system = actor.system; ctx.flags = actor.flags; ctx.items = this.actor.itemTypes; @@ -93,13 +93,12 @@ export class PlayerSheetv2 extends GenericActorSheet { get #statData() { const stats = []; - const original = this.actor.toObject().system; - const usedDice = new Set(Object.values(original.stats)); - for (const statName in original.stats) { + const usedDice = new Set(Object.values(this.actor.system.stats)); + for (const statName in this.actor.system.stats) { const stat = { key: statName, name: localizer(`dotdungeon.stat.${statName}`), - original: original.stats[statName], + original: this.actor.preAE.stats[statName], value: this.actor.system.stats[statName], }; @@ -114,7 +113,7 @@ export class PlayerSheetv2 extends GenericActorSheet { return { value: die, label: localizer(`dotdungeon.die.${die}`, { stat: statName }), - disabled: usedDice.has(die) && original.stats[statName] !== die, + disabled: usedDice.has(die) && this.actor.preAE.stats[statName] !== die, }; }) ]; @@ -130,9 +129,9 @@ export class PlayerSheetv2 extends GenericActorSheet { key: skill, name: game.i18n.format(`dotdungeon.skills.${skill}`), value, - original: original.skills[statName][skill], + original: this.actor.preAE.skills[statName][skill], formula: `1` + stat.value + modifierToString(value, { spaces: true }), - rollDisabled: value === -1, + rollDisabled: this.actor.preAE.skills[statName][skill] === -1, }); };