diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 9f970e1d..834a57a8 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -151,6 +151,10 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac }); }); + htmlElement + .querySelector('.stacking-change-checkbox') + ?.addEventListener('change', this.stackingChangeToggle.bind(this)); + htmlElement .querySelector('.armor-change-checkbox') ?.addEventListener('change', this.armorChangeToggle.bind(this)); @@ -209,6 +213,16 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac return partContext; } + stackingChangeToggle(event) { + const stackingFields = this.document.system.schema.fields.stacking.fields; + const systemData = { + stacking: event.target.checked + ? { value: stackingFields.value.initial, max: stackingFields.max.initial } + : null + }; + return this.submit({ updateData: { system: systemData } }); + } + armorChangeToggle(event) { if (event.target.checked) { this.addArmorChange(); diff --git a/module/applications/ui/effectsDisplay.mjs b/module/applications/ui/effectsDisplay.mjs index 9c181c7e..035041e1 100644 --- a/module/applications/ui/effectsDisplay.mjs +++ b/module/applications/ui/effectsDisplay.mjs @@ -89,12 +89,12 @@ export default class DhEffectsDisplay extends HandlebarsApplicationMixin(Applica const element = event.target.closest('.effect-container'); const effects = DhEffectsDisplay.getTokenEffects(); const effect = effects.find(x => x.id === element.dataset.effectId); - if (!effect || (delta >= 0 && !effect.system.stacking?.enabled)) { + if (!effect || (delta >= 0 && !effect.system.stacking)) { return; } - const maxValue = effect.system.stacking.max ?? Infinity; - const newValue = Math.clamp((effect.system.stacking.value ?? 1) + delta, 0, maxValue); + const maxValue = effect.system.stacking?.max ?? Infinity; + const newValue = Math.clamp((effect.system.stacking?.value ?? 1) + delta, 0, maxValue); if (newValue > 0) { await effect.update({ 'system.stacking.value': newValue }); } else { diff --git a/module/canvas/placeables/token.mjs b/module/canvas/placeables/token.mjs index cf6c8e21..35d34f83 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 && effect.system.stacking.value > 1) { + if (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 5b3d00ed..44e7ec0f 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -81,17 +81,19 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { label: 'DAGGERHEART.GENERAL.range' }) }), - stacking: new fields.SchemaField({ - enabled: new fields.BooleanField({ initial: false, label: 'DAGGERHEART.GENERAL.enabled' }), - value: new fields.NumberField({ - initial: 1, - min: 1, - integer: true, - nullable: false, - label: 'DAGGERHEART.GENERAL.value' - }), - max: new fields.NumberField({ integer: true, label: 'DAGGERHEART.GENERAL.max' }) - }) + stacking: new fields.SchemaField( + { + value: new fields.NumberField({ + initial: 1, + min: 1, + integer: true, + nullable: false, + label: 'DAGGERHEART.GENERAL.value' + }), + max: new fields.NumberField({ integer: true, label: 'DAGGERHEART.GENERAL.max' }) + }, + { nullable: true, initial: null } + ) }; } diff --git a/module/documents/activeEffect.mjs b/module/documents/activeEffect.mjs index ec31ec71..4aeba3af 100644 --- a/module/documents/activeEffect.mjs +++ b/module/documents/activeEffect.mjs @@ -109,15 +109,13 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } const existingEffect = this.actor.effects.find(x => x.origin === data.origin); - const stacks = data.system?.stacking?.enabled; + const stacks = Boolean(data.system?.stacking); 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 + 'system.stacking.value': Math.min(incrementedValue, existingEffect.system.stacking.max ?? Infinity) }); return false; } @@ -198,17 +196,13 @@ export default class DhActiveEffect extends foundry.documents.ActiveEffect { } catch (_) {} } - const evalValue = this.effectSafeEval(this.effectRollParse(key, parseModel, effect.parent, effect)); + const stackingParsedValue = effect.system.stacking + ? Roll.replaceFormulaData(key, { stacks: effect.system.stacking.value }) + : key; + const evalValue = itemAbleRollParse(stackingParsedValue, parseModel, effect.parent); return evalValue ?? key; } - static effectRollParse(value, actor, item, effect) { - const stackingParsedValue = effect.system.stacking?.enabled - ? Roll.replaceFormulaData(value, { stacks: effect.system.stacking.value }) - : value; - return itemAbleRollParse(stackingParsedValue, actor, item); - } - /** * Altered Foundry safeEval to allow non-numeric return * @param {string} expression diff --git a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json index 2f3ce20d..5b770e5d 100644 --- a/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json +++ b/src/packs/classes/feature_No_Mercy_njj2C3tMDeCHHOoh.json @@ -81,7 +81,6 @@ "type": "shortRest" }, "stacking": { - "enabled": true, "max": null } }, diff --git a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json index c4bf8ce8..b886b079 100644 --- a/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json +++ b/src/packs/classes/feature_Rogue_s_Dodge_hVaaPIjxoextIgSL.json @@ -80,7 +80,6 @@ "description": "
Until the next time an attack succeeds against you.
" }, "stacking": { - "enabled": true, "max": null } }, diff --git a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json index 5ff2ce3f..6a039bbf 100644 --- a/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json +++ b/src/packs/domains/domainCard_Corrosive_Projectile_qJaSNTuDfbPVr8Lb.json @@ -150,7 +150,6 @@ } ], "stacking": { - "enabled": true, "max": null }, "duration": { diff --git a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json index 8baedd50..c3493aea 100644 --- a/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json +++ b/src/packs/domains/domainCard_Rage_Up_GRL0cvs96vrTDckZ.json @@ -88,7 +88,6 @@ } ], "stacking": { - "enabled": true, "max": 2 }, "duration": { diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index 2783fe26..793c8164 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -293,6 +293,20 @@ } } + &.optional, + &.one-column.optional { + padding-top: 0; + padding-bottom: 4px; + min-height: auto; + row-gap: 0; + + legend { + display: flex; + align-items: center; + padding-left: 3px; + } + } + .list-w-img { padding: 5px; label { diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs index 47a48382..3d4a6a9e 100644 --- a/templates/sheets/activeEffect/changes.hbs +++ b/templates/sheets/activeEffect/changes.hbs @@ -15,7 +15,11 @@