diff --git a/module/applications/ui/effectsDisplay.mjs b/module/applications/ui/effectsDisplay.mjs index 4df42479..500ec39d 100644 --- a/module/applications/ui/effectsDisplay.mjs +++ b/module/applications/ui/effectsDisplay.mjs @@ -95,7 +95,10 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica if (!effect.system.stacking?.enabled) return; - const newValue = Math.min(effect.system.stacking.value + 1, effect.system.stacking.max); + const incrementedValue = effect.system.stacking.value + 1; + const newValue = effect.system.stacking.max + ? Math.min(incrementedValue, effect.system.stacking.max) + : incrementedValue; await effect.update({ 'system.stacking.value': newValue }); this.render(); } diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index ad60b931..26c96683 100644 --- a/module/canvas/placeables/token.mjs +++ b/module/canvas/placeables/token.mjs @@ -52,7 +52,7 @@ export default class DhTokenPlaceable extends foundry.canvas.placeables.Token { const icon = new PIXI.Sprite(tex); icon.tint = tint ?? 0xffffff; - if (effect?.system?.stacking?.enabled) { + if (effect?.system?.stacking?.enabled && effect.system.stacking.value > 1) { const stackOverlay = new PIXI.Text(effect.system.stacking.value, { fill: '#f3c267', stroke: '#000000', diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index 3867fa23..c0ed1b36 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -75,8 +75,7 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { nullable: false, label: 'DAGGERHEART.GENERAL.value' }), - max: new fields.NumberField({ label: 'DAGGERHEART.GENERAL.max' }) - // max: new fields.StringField({ required: true, nullable: false }), + max: new fields.NumberField({ integer: true, label: 'DAGGERHEART.GENERAL.max' }) }) }; } diff --git a/module/data/fields/action/effectsField.mjs b/module/data/fields/action/effectsField.mjs index 6afd470b..df0c0b09 100644 --- a/module/data/fields/action/effectsField.mjs +++ b/module/data/fields/action/effectsField.mjs @@ -106,22 +106,11 @@ export default class EffectsField extends fields.ArrayField { } /** - * Apply an Effect to a target or enable it if already on it + * Apply an Effect to a target * @param {object} effect Effect object containing ActiveEffect UUID * @param {object} actor Actor Document */ static async applyEffect(effect, actor) { - const existingEffect = actor.effects.find(e => e.origin === effect.uuid); - if (existingEffect) { - return effect.update( - foundry.utils.mergeObject({ - ...effect.constructor.getInitialDuration(), - disabled: false - }) - ); - } - - // Otherwise, create a new effect on the target const effectData = foundry.utils.mergeObject({ ...(effect.toObject?.() ?? effect), disabled: false, diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index 8c7f0668..2869ab98 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -106,6 +106,20 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { update.img = 'icons/magic/life/heart-cross-blue.webp'; } + const existingEffect = this.actor.effects.find(x => x.origin === data.origin); + const stacks = data.system?.stacking?.enabled; + if (existingEffect && !stacks) return false; + + if (existingEffect && stacks) { + const incrementedValue = existingEffect.system.stacking.value + 1; + await existingEffect.update({ + 'system.stacking.value': existingEffect.system.stacking.max + ? Math.min(incrementedValue, existingEffect.system.stacking.max) + : incrementedValue + }); + return false; + } + const statuses = Object.keys(data.statuses ?? {}); const immuneStatuses = statuses.filter( diff --git a/templates/ui/effects-display.hbs b/templates/ui/effects-display.hbs index 13daa4de..bdbd9fbe 100644 --- a/templates/ui/effects-display.hbs +++ b/templates/ui/effects-display.hbs @@ -8,7 +8,7 @@ - {{#if effect.system.stacking.enabled}} + {{#if (and effect.system.stacking.enabled (gt effect.system.stacking.value 1))}} {{effect.system.stacking.value}} {{/if}} {{#if effect.condition}}{{/if}} diff --git a/templates/ui/tooltip/effect-display.hbs b/templates/ui/tooltip/effect-display.hbs index 52419193..3dc6d9c3 100644 --- a/templates/ui/tooltip/effect-display.hbs +++ b/templates/ui/tooltip/effect-display.hbs @@ -24,8 +24,8 @@ {{/if}} - - {{#if effect.system.stacking.enabled}} + + {{#if (and effect.system.stacking.enabled effect.system.stacking.max)}}
{{localize "Stacks"}}
@@ -33,12 +33,10 @@ {{localize "Current"}} {{effect.system.stacking.value}}
- {{#if effect.system.stacking.max}} -
- {{localize "Max"}} - {{effect.system.stacking.max}} -
- {{/if}} +
+ {{localize "Max"}} + {{effect.system.stacking.max}} +
{{/if}} @@ -49,9 +47,15 @@

{{localize "DAGGERHEART.UI.EffectsDisplay.increaseStacks"}}

-

- {{localize "DAGGERHEART.UI.EffectsDisplay.decreaseStacks"}} -

+ {{#if (gt effect.system.stacking.value 1)}} +

+ {{localize "DAGGERHEART.UI.EffectsDisplay.decreaseStacks"}} +

+ {{else}} +

+ {{localize "DAGGERHEART.UI.EffectsDisplay.removeThing" thing=(localize "DAGGERHEART.GENERAL.Effect.single")}} +

+ {{/if}} {{else}}

{{localize "DAGGERHEART.UI.EffectsDisplay.removeThing" thing=(localize "DAGGERHEART.GENERAL.Effect.single")}}