fix: apply effects to embedded items after all embedded items have been prepared
This commit is contained in:
parent
ebb2421952
commit
bdb17cfac7
2 changed files with 27 additions and 22 deletions
|
@ -28,13 +28,11 @@ declare global {
|
||||||
* The Actor class for DS4
|
* The Actor class for DS4
|
||||||
*/
|
*/
|
||||||
export class DS4Actor extends Actor {
|
export class DS4Actor extends Actor {
|
||||||
initialized: boolean | undefined;
|
|
||||||
|
|
||||||
override prepareData(): void {
|
override prepareData(): void {
|
||||||
this.initialized = true;
|
|
||||||
this.data.reset();
|
this.data.reset();
|
||||||
this.prepareBaseData();
|
this.prepareBaseData();
|
||||||
this.prepareEmbeddedDocuments();
|
this.prepareEmbeddedDocuments();
|
||||||
|
this.applyActiveEffectsToItems();
|
||||||
this.applyActiveEffectsToBaseData();
|
this.applyActiveEffectsToBaseData();
|
||||||
this.prepareDerivedData();
|
this.prepareDerivedData();
|
||||||
this.applyActiveEffectsToDerivedData();
|
this.applyActiveEffectsToDerivedData();
|
||||||
|
@ -118,8 +116,33 @@ export class DS4Actor extends Actor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply active effects to items.
|
||||||
|
*
|
||||||
|
* @remarks
|
||||||
|
* Talents are handled before all other item types, because if the total rank of a talent is affected by any
|
||||||
|
* effects, that affects how many times effects provided by this talent need to be applied. At the moment, there is
|
||||||
|
* no special ordering among talents. This means that having a talents that provide effects that adjust the total
|
||||||
|
* rank of talents can lead to nondeterministic behavior and thus must be avoided.
|
||||||
|
*/
|
||||||
|
applyActiveEffectsToItems(): void {
|
||||||
|
/* Handle talents before all other item types, because their rank might be affected, which in turn affects how
|
||||||
|
many times effects provided by that talent are applied */
|
||||||
|
for (const item of this.itemTypes.talent) {
|
||||||
|
this.applyActiveEffectsToItem(item);
|
||||||
|
}
|
||||||
|
for (const item of this.items) {
|
||||||
|
if (item.type === "talent") continue;
|
||||||
|
this.applyActiveEffectsToItem(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected applyActiveEffectsToItem(item: DS4Item) {
|
||||||
|
item.overrides = {};
|
||||||
|
DS4ActiveEffect.applyEffetcs(item, this.itemEffects(item));
|
||||||
|
}
|
||||||
|
|
||||||
applyActiveEffectsToBaseData(): void {
|
applyActiveEffectsToBaseData(): void {
|
||||||
// reset overrides because our variant of applying active effects does not set them, it only adds overrides
|
|
||||||
this.overrides = {};
|
this.overrides = {};
|
||||||
DS4ActiveEffect.applyEffetcs(
|
DS4ActiveEffect.applyEffetcs(
|
||||||
this,
|
this,
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
// SPDX-License-Identifier: MIT
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
import { getGame } from "../../utils/utils";
|
import { getGame } from "../../utils/utils";
|
||||||
import { DS4ActiveEffect } from "../active-effect";
|
|
||||||
|
|
||||||
import type { ItemType } from "./item-data-source";
|
import type { ItemType } from "./item-data-source";
|
||||||
|
|
||||||
|
@ -28,23 +27,6 @@ export class DS4Item extends Item {
|
||||||
/** An object that tracks the changes to the data model which were applied by active effects */
|
/** An object that tracks the changes to the data model which were applied by active effects */
|
||||||
overrides: Record<string, unknown> = {};
|
overrides: Record<string, unknown> = {};
|
||||||
|
|
||||||
override prepareData() {
|
|
||||||
this.data.reset();
|
|
||||||
this.prepareBaseData();
|
|
||||||
this.prepareEmbeddedDocuments();
|
|
||||||
this.prepareDerivedData();
|
|
||||||
this.applyActiveEffects();
|
|
||||||
}
|
|
||||||
|
|
||||||
applyActiveEffects(): void {
|
|
||||||
if (!this.actor?.initialized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.overrides = {};
|
|
||||||
DS4ActiveEffect.applyEffetcs(this, this.actor.itemEffects(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
override prepareDerivedData(): void {
|
override prepareDerivedData(): void {
|
||||||
this.data.data.rollable = false;
|
this.data.data.rollable = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue