From caea55ade466bba7f98870b651eac6f6c00f8452 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Thu, 19 Mar 2026 13:26:11 +0100 Subject: [PATCH] Single armor rework start --- daggerheart.mjs | 1 - .../sheets-configs/activeEffectConfig.mjs | 33 +++++++++++++++++-- module/data/activeEffect/baseEffect.mjs | 7 ++++ .../data/activeEffect/changeTypes/armor.mjs | 31 +++++++---------- .../sheets/activeEffects/activeEffects.less | 2 +- templates/sheets/activeEffect/changes.hbs | 10 +++--- .../activeEffect/typeChanges/armorChange.hbs | 1 - 7 files changed, 53 insertions(+), 32 deletions(-) diff --git a/daggerheart.mjs b/daggerheart.mjs index ba209856..77273b6c 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -281,7 +281,6 @@ Hooks.on('setup', () => { ...damageThresholds, 'proficiency', 'evasion', - 'armorScore', 'scars', 'levelData.level.current' ] diff --git a/module/applications/sheets-configs/activeEffectConfig.mjs b/module/applications/sheets-configs/activeEffectConfig.mjs index 4434931c..b255c038 100644 --- a/module/applications/sheets-configs/activeEffectConfig.mjs +++ b/module/applications/sheets-configs/activeEffectConfig.mjs @@ -153,6 +153,10 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac minLength: 0 }); }); + + htmlElement + .querySelector('.armor-change-checkbox') + ?.addEventListener('change', this.armorChangeToggle.bind(this)); } async _prepareContext(options) { @@ -190,10 +194,17 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac break; case 'changes': const fields = this.document.system.schema.fields.changes.element.fields; + + const singleTypes = ['armor']; const { base, ...typedChanges } = context.source.changes.reduce((acc, change, index) => { const type = CONFIG.DH.GENERAL.baseActiveEffectModes[change.type] ? 'base' : change.type; - if (!acc[type]) acc[type] = []; - acc[type].push({ ...change, index }); + if (singleTypes.includes(type)) { + acc[type] = { ...change, index }; + } else { + if (!acc[type]) acc[type] = []; + acc[type].push({ ...change, index }); + } + return acc; }, {}); partContext.changes = await Promise.all( @@ -206,14 +217,30 @@ export default class DhActiveEffectConfig extends foundry.applications.sheets.Ac return partContext; } + armorChangeToggle(event) { + if (event.target.checked) { + this.addArmorChange(); + } else { + this.removeTypedChange(event.target.dataset.index); + } + } + /* Could be generalised if needed later */ - static #addTypedChange() { + addArmorChange() { const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form)); const changes = Object.values(submitData.system?.changes ?? {}); changes.push(game.system.api.data.activeEffects.changeTypes.armor.getInitialValue()); return this.submit({ updateData: { system: { changes } } }); } + removeTypedChange(indexString) { + const submitData = this._processFormData(null, this.form, new FormDataExtended(this.form)); + const changes = Object.values(submitData.system.changes); + const index = Number(indexString); + changes.splice(index, 1); + return this.submit({ updateData: { system: { changes } } }); + } + _prepareChangeContext(change, fields) { if (typeof change.value !== 'string') change.value = JSON.stringify(change.value); const defaultPriority = game.system.api.documents.DhActiveEffect.CHANGE_TYPES[change.type]?.defaultPriority; diff --git a/module/data/activeEffect/baseEffect.mjs b/module/data/activeEffect/baseEffect.mjs index 111cf4c2..7dae7ab5 100644 --- a/module/data/activeEffect/baseEffect.mjs +++ b/module/data/activeEffect/baseEffect.mjs @@ -89,6 +89,13 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel { return true; } + get armorData() { + const armorChange = this.changes.find(x => x.type === CONFIG.DH.GENERAL.activeEffectModes.armor.id); + if (!armorChange) return null; + + return armorChange.armorData; + } + static getDefaultObject() { return { name: 'New Effect', diff --git a/module/data/activeEffect/changeTypes/armor.mjs b/module/data/activeEffect/changeTypes/armor.mjs index 94bab5f1..31e2eda3 100644 --- a/module/data/activeEffect/changeTypes/armor.mjs +++ b/module/data/activeEffect/changeTypes/armor.mjs @@ -76,36 +76,27 @@ export default class Armor extends foundry.abstract.DataModel { /* Helpers */ - get armorChange() { - if (this.changes.length !== 1) - throw new Error('Unexpected error. An armor effect should have a changes field of length 1.'); - - const actor = this.parent.actor?.type === 'character' ? this.parent.actor : null; - const changeData = this.changes[0]; - const maxParse = actor ? itemAbleRollParse(changeData.max, actor, this.parent.parent) : null; + get armorData() { + 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 { - ...changeData, - max: maxEvaluated ?? changeData.max + value: this.value, + max: maxEvaluated ?? this.max }; } - get armorData() { - return { value: this.armorChange.value, max: this.armorChange.max }; - } - async updateArmorMax(newMax) { - const { effect, ...baseChange } = this.armorChange; const newChanges = [ - { - ...baseChange, - max: newMax, - value: Math.min(this.armorChange.value, newMax) - } + ...this.parent.changes.map(change => ({ + ...change, + value: change.type === 'armor' ? Math.min(this.parent.value, newMax) : change.value, + typeData: change.type === 'armor' ? { ...change.typeData, max: newMax } : change.typeData + })) ]; - await this.parent.update({ 'system.changes': newChanges }); + await this.parent.parent.update({ 'system.changes': newChanges }); } static orderEffectsForAutoChange(armorEffects, increasing) { diff --git a/styles/less/sheets/activeEffects/activeEffects.less b/styles/less/sheets/activeEffects/activeEffects.less index f710d1f2..890ae797 100644 --- a/styles/less/sheets/activeEffects/activeEffects.less +++ b/styles/less/sheets/activeEffects/activeEffects.less @@ -35,7 +35,7 @@ .armor-change-container { header, ol { - grid-template-columns: 6rem 6rem 12rem 4rem 1rem; + grid-template-columns: 6rem 6rem 12rem 4rem; } } } diff --git a/templates/sheets/activeEffect/changes.hbs b/templates/sheets/activeEffect/changes.hbs index 9ae66477..e687c2e9 100644 --- a/templates/sheets/activeEffect/changes.hbs +++ b/templates/sheets/activeEffect/changes.hbs @@ -15,8 +15,8 @@
- {{localize "DAGGERHEART.GENERAL.armor"}} - + {{localize "DAGGERHEART.GENERAL.armor"}} + {{#if typedChanges.armor}}
{{localize "EFFECT.FIELDS.changes.element.value.label"}}
{{localize "DAGGERHEART.GENERAL.max"}}
@@ -24,10 +24,8 @@
{{localize "EFFECT.FIELDS.changes.element.priority.label"}}
    - {{#each typedChanges.armor as |armor|}} - {{> "systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs" armor fields=@root.systemFields.changes.element.fields}} - {{/each}} + {{> "systems/daggerheart/templates/sheets/activeEffect/typeChanges/armorChange.hbs" typedChanges.armor fields=@root.systemFields.changes.element.fields}}
- + {{/if}}
diff --git a/templates/sheets/activeEffect/typeChanges/armorChange.hbs b/templates/sheets/activeEffect/typeChanges/armorChange.hbs index 006f936d..6a04aba2 100644 --- a/templates/sheets/activeEffect/typeChanges/armorChange.hbs +++ b/templates/sheets/activeEffect/typeChanges/armorChange.hbs @@ -7,5 +7,4 @@ {{formInput fields.typeData.types.armor.fields.max name=(concat "system.changes." index ".typeData.max") value=typeData.max data-dtype="Number"}} {{formInput fields.typeData.types.armor.fields.armorInteraction name=(concat "system.changes." index ".typeData.armorInteraction") value=typeData.armorInteraction localize=true}} {{formInput fields.priority name=(concat "system.changes." index ".priority") value=priority}} - \ No newline at end of file