diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index b255c038..339c2c86 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -8,10 +8,7 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac } static DEFAULT_OPTIONS = { - classes: ['daggerheart', 'sheet', 'dh-style'], - actions: { - addTypedChange: DhActiveEffectConfig.#addTypedChange - } + classes: ['daggerheart', 'sheet', 'dh-style'] }; static PARTS = { diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index db05a9c7..15e83645 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -966,10 +966,13 @@ export default class CharacterSheet extends DHBaseActorSheet { const armorSources = []; for (var effect of Array.from(this.document.allApplicableEffects())) { const origin = effect.origin ? await foundry.utils.fromUuid(effect.origin) : effect.parent; - if (effect.type !== 'armor' || effect.disabled || effect.isSuppressed) continue; + if (!effect.system.armorData || effect.disabled || effect.isSuppressed) continue; + + const originIsActor = origin instanceof Actor; + const name = originIsActor ? effect.name : origin.name; armorSources.push({ uuid: effect.uuid, - name: origin.name, + name, ...effect.system.armorData }); } @@ -1018,15 +1021,14 @@ export default class CharacterSheet extends DHBaseActorSheet { /** Update specific armor source */ static async armorSourceUpdate(event) { const effect = await foundry.utils.fromUuid(event.target.dataset.uuid); - if (effect.system.changes.length !== 1) return; + const armorChange = effect.system.armorChange; + if (!armorChange) return; const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0); - const newChanges = [ - { - ...effect.system.changes[0], - value - } - ]; + const newChanges = effect.system.changes.map(change => ({ + ...change, + value: change.type === 'armor' ? value : change.value + })); event.target.value = value; const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress'); @@ -1038,19 +1040,19 @@ export default class CharacterSheet extends DHBaseActorSheet { static async armorSourcePipUpdate(event) { const target = event.target.closest('.armor-slot'); const effect = await foundry.utils.fromUuid(target.dataset.uuid); - if (effect.system.changes.length !== 1) return; - const { value, max } = effect.system.armorData; + const armorChange = effect.system.armorChange; + if (!armorChange) return; + + const { value } = effect.system.armorData; const inputValue = Number.parseInt(target.dataset.value); const decreasing = value >= inputValue; const newValue = decreasing ? inputValue - 1 : inputValue; - const newChanges = [ - { - ...effect.system.changes[0], - value: newValue - } - ]; + const newChanges = effect.system.changes.map(change => ({ + ...change, + value: change.type === 'armor' ? newValue : change.value + })); const container = target.closest('.slot-bar'); for (const armorSlot of container.querySelectorAll('.armor-slot i')) { diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index 7dae7ab5..fc87b353 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -89,11 +89,15 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { return true; } + get armorChange() { + return this.changes.find(x => x.type === CONFIG.DH.GENERAL.activeEffectModes.armor.id); + } + get armorData() { - const armorChange = this.changes.find(x => x.type === CONFIG.DH.GENERAL.activeEffectModes.armor.id); + const armorChange = this.armorChange; if (!armorChange) return null; - return armorChange.armorData; + return armorChange.typeData.getArmorData(armorChange); } static getDefaultObject() { diff --git a/module/data/activeEffect/changeTypes/armor.mjs b/module/data/activeEffect/changeTypes/armor.mjs index 31e2eda3..5ef38989 100644 --- a/module/data/activeEffect/changeTypes/armor.mjs +++ b/module/data/activeEffect/changeTypes/armor.mjs @@ -1,3 +1,5 @@ +import { itemAbleRollParse } from '../../../helpers/utils.mjs'; + const fields = foundry.data.fields; export default class Armor extends foundry.abstract.DataModel { @@ -76,14 +78,14 @@ export default class Armor extends foundry.abstract.DataModel { /* Helpers */ - get armorData() { + getArmorData(parentChange) { const actor = this.parent.parent?.actor?.type === 'character' ? this.parent.parent.actor : null; const maxParse = actor ? itemAbleRollParse(this.max, actor, this.parent.parent.parent) : null; const maxRoll = maxParse ? new Roll(maxParse).evaluateSync() : null; const maxEvaluated = maxRoll ? (maxRoll.isDeterministic ? maxRoll.total : null) : null; return { - value: this.value, + value: parentChange.value, max: maxEvaluated ?? this.max }; } diff --git a/module/data/actor/character.mjs b/module/data/actor/character.mjs index 9036d3ca..3d8580f0 100644 --- a/module/data/actor/character.mjs +++ b/module/data/actor/character.mjs @@ -469,8 +469,8 @@ export default class DhCharacter extends DhCreature { const increasing = armorChange >= 0; let remainingChange = Math.abs(armorChange); - const armorEffects = Array.from(this.parent.allApplicableEffects()).filter(x => x.type === 'armor'); - const orderedEffects = game.system.api.data.activeEffects.ArmorEffect.orderEffectsForAutoChange( + const armorEffects = Array.from(this.parent.allApplicableEffects()).filter(x => x.system.armorData); + const orderedEffects = game.system.api.data.activeEffects.changeTypes.armor.orderEffectsForAutoChange( armorEffects, increasing ); @@ -482,11 +482,11 @@ export default class DhCharacter extends DhCreature { usedArmorChange -= armorEffect.system.armorChange.value; } else { if (increasing) { - const remainingArmor = armorEffect.system.armorChange.max - armorEffect.system.armorChange.value; + const remainingArmor = armorEffect.system.armorData.max - armorEffect.system.armorData.value; usedArmorChange = Math.min(remainingChange, remainingArmor); remainingChange -= usedArmorChange; } else { - const changeChange = Math.min(armorEffect.system.armorChange.value, remainingChange); + const changeChange = Math.min(armorEffect.system.armorData.value, remainingChange); usedArmorChange -= changeChange; remainingChange -= changeChange; } @@ -499,12 +499,13 @@ export default class DhCharacter extends DhCreature { embeddedUpdates[armorEffect.parent.id].updates.push({ '_id': armorEffect.id, - 'system.changes': [ - { - ...armorEffect.system.armorChange, - value: armorEffect.system.armorChange.value + usedArmorChange - } - ] + 'system.changes': armorEffect.system.changes.map(change => ({ + ...change, + value: + change.type === 'armor' + ? armorEffect.system.armorChange.value + usedArmorChange + : change.value + })) }); } diff --git a/styles/less/sheets/activeEffects/activeEffects.less b/styles/less/sheets/activeEffects/activeEffects.less index 890ae797..077369cf 100644 --- a/styles/less/sheets/activeEffects/activeEffects.less +++ b/styles/less/sheets/activeEffects/activeEffects.less @@ -33,6 +33,21 @@ } .armor-change-container { + padding-top: 0; + padding-bottom: 4px; + row-gap: 0; + + legend { + display: flex; + align-items: center; + padding-left: 3px; + } + + header { + padding: 0; + left: -0.25rem; // TODO: Find why this header is offset 0.25rem to the right so this can be removed. + } + header, ol { grid-template-columns: 6rem 6rem 12rem 4rem; diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs index e687c2e9..fe9ed238 100644 --- a/templates/sheets/activeEffect/changes.hbs +++ b/templates/sheets/activeEffect/changes.hbs @@ -14,7 +14,7 @@ {{/each}} -
+
{{localize "DAGGERHEART.GENERAL.armor"}} {{#if typedChanges.armor}}