diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index fc62e870..c60a0b90 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -389,6 +389,41 @@ export default class DhpActor extends Actor { return this.system.difficulty ?? 10; } + /** @inheritDoc */ + async toggleStatusEffect(statusId, { active, overlay = false } = {}) { + const status = CONFIG.statusEffects.find(e => e.id === statusId); + if (!status) throw new Error(`Invalid status ID "${statusId}" provided to Actor#toggleStatusEffect`); + const existing = []; + + // Find the effect with the static _id of the status effect + if (status._id) { + const effect = this.effects.get(status._id); + if (effect) existing.push(effect.id); + } + + // If no static _id, find all effects that have this status + else { + for (const effect of this.effects) { + if (effect.statuses.has(status.id)) existing.push(effect.id); + } + } + + // Remove the existing effects unless the status effect is forced active + if (existing.length) { + if (active) return true; + await this.deleteEmbeddedDocuments('ActiveEffect', existing); + return false; + } + + // Create a new effect unless the status effect is forced inactive + if (!active && active !== undefined) return; + + const ActiveEffect = getDocumentClass('ActiveEffect'); + const effect = await ActiveEffect.fromStatusEffect(statusId); + if (overlay) effect.updateSource({ 'flags.core.overlay': true }); + return ActiveEffect.implementation.create(effect, { parent: this, keepId: true }); + } + getRollData() { const rollData = super.getRollData(); rollData.system = this.system.getRollData(); @@ -505,16 +540,16 @@ export default class DhpActor extends Actor { Object.entries(healings).forEach(([key, healing]) => { healing.parts.forEach(part => { const update = updates.find(u => u.key === key); - if (update) - update.value += part.total; + if (update) update.value += part.total; else updates.push({ value: part.total, key }); }); }); updates.forEach( u => - (u.value = - !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) ? u.value * -1 : u.value) + (u.value = !(u.key === 'fear' || this.system?.resources?.[u.key]?.isReversed === false) + ? u.value * -1 + : u.value) ); await this.modifyResource(updates); @@ -561,7 +596,7 @@ export default class DhpActor extends Actor { } } }); - + Object.keys(updates).forEach(async key => { const u = updates[key]; if (key === 'items') {