// SPDX-FileCopyrightText: 2021 Johannes Loher // // SPDX-License-Identifier: MIT import { DS4Actor } from "./actor/actor"; import { getGame } from "./helpers"; declare global { interface DocumentClassConfig { ActiveEffect: typeof DS4ActiveEffect; } } type PromisedType = T extends Promise ? U : T; export class DS4ActiveEffect extends ActiveEffect { /** * A fallback icon that can be used if no icon is defined for the effect. */ static FALLBACK_ICON = "icons/svg/aura.svg"; /** * A cached reference to the source document to avoid recurring database lookups */ protected source: PromisedType> | undefined = undefined; /** @override */ apply(actor: DS4Actor, change: foundry.data.ActiveEffectData["changes"][number]): unknown { change.value = Roll.replaceFormulaData(change.value, actor.data); try { change.value = Roll.safeEval(change.value).toString(); } catch (e) { // this is a valid case, e.g., if the effect change simply is a string } return super.apply(actor, change); } /** * Gets the current source name based on the cached source object. */ async getCurrentSourceName(): Promise { const game = getGame(); const origin = await this.getSource(); if (origin === null) return game.i18n.localize("None"); return origin.name ?? game.i18n.localize("Unknown"); } /** * Gets the source document for this effect. Uses the cached {@link DS4ActiveEffect#origin} if it has already been * set. */ protected async getSource(): ReturnType { if (this.source === undefined) { this.source = this.data.origin !== undefined ? await fromUuid(this.data.origin) : null; } return this.source; } }