Fixed so changing armor values and taking damage works again

This commit is contained in:
WBHarry 2026-03-21 09:58:41 +01:00
parent 809bdc8678
commit e83d3f7d44
7 changed files with 42 additions and 32 deletions

View file

@ -27,11 +27,11 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
true true
); );
const armor = orderedArmorEffects.reduce((acc, effect) => { const armor = orderedArmorEffects.reduce((acc, effect) => {
const { value, max } = effect.system.armorData; const { current, max } = effect.system.armorData;
acc.push({ acc.push({
effect: effect, effect: effect,
marks: [...Array(max).keys()].reduce((acc, _, index) => { marks: [...Array(max).keys()].reduce((acc, _, index) => {
const spent = index < value; const spent = index < current;
acc[foundry.utils.randomID()] = { selected: false, disabled: spent, spent }; acc[foundry.utils.randomID()] = { selected: false, disabled: spent, spent };
return acc; return acc;
}, {}) }, {})
@ -192,7 +192,7 @@ export default class DamageReductionDialog extends HandlebarsApplicationMixin(Ap
const stressReductions = this.availableStressReductions const stressReductions = this.availableStressReductions
? Object.values(this.availableStressReductions).filter(red => red.selected) ? Object.values(this.availableStressReductions).filter(red => red.selected)
: []; : [];
const currentMarks = this.actor.system.armorScore.value + selectedArmorMarks.length; const currentMarks = this.actor.system.armorScore.current + selectedArmorMarks.length;
const maxArmorUsed = this.actor.system.rules.damageReduction.maxArmorMarked.value + selectedStressMarks.length; const maxArmorUsed = this.actor.system.rules.damageReduction.maxArmorMarked.value + selectedStressMarks.length;
const availableArmor = const availableArmor =

View file

@ -1003,16 +1003,16 @@ export default class CharacterSheet extends DHBaseActorSheet {
const effect = await foundry.utils.fromUuid(event.target.dataset.uuid); const effect = await foundry.utils.fromUuid(event.target.dataset.uuid);
const armorChange = effect.system.armorChange; const armorChange = effect.system.armorChange;
if (!armorChange) return; if (!armorChange) return;
const value = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0); const current = Math.max(Math.min(Number.parseInt(event.target.value), effect.system.armorData.max), 0);
const newChanges = effect.system.changes.map(change => ({ const newChanges = effect.system.changes.map(change => ({
...change, ...change,
value: change.type === 'armor' ? value : change.value value: change.type === 'armor' ? { ...change.value, current } : change.value
})); }));
event.target.value = value; event.target.value = current;
const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress'); const progressBar = event.target.closest('.status-bar.armor-slots').querySelector('progress');
progressBar.value = value; progressBar.value = current;
await effect.update({ 'system.changes': newChanges }); await effect.update({ 'system.changes': newChanges });
} }
@ -1023,24 +1023,24 @@ export default class CharacterSheet extends DHBaseActorSheet {
const armorChange = effect.system.armorChange; const armorChange = effect.system.armorChange;
if (!armorChange) return; if (!armorChange) return;
const { value } = effect.system.armorData; const { current } = effect.system.armorData;
const inputValue = Number.parseInt(target.dataset.value); const inputValue = Number.parseInt(target.dataset.value);
const decreasing = value >= inputValue; const decreasing = current >= inputValue;
const newValue = decreasing ? inputValue - 1 : inputValue; const newCurrent = decreasing ? inputValue - 1 : inputValue;
const newChanges = effect.system.changes.map(change => ({ const newChanges = effect.system.changes.map(change => ({
...change, ...change,
value: change.type === 'armor' ? newValue : change.value value: change.type === 'armor' ? { ...change.value, current: newCurrent } : change.value
})); }));
const container = target.closest('.slot-bar'); const container = target.closest('.slot-bar');
for (const armorSlot of container.querySelectorAll('.armor-slot i')) { for (const armorSlot of container.querySelectorAll('.armor-slot i')) {
const index = Number.parseInt(armorSlot.dataset.index); const index = Number.parseInt(armorSlot.dataset.index);
if (decreasing && index >= newValue) { if (decreasing && index >= newCurrent) {
armorSlot.classList.remove('fa-shield'); armorSlot.classList.remove('fa-shield');
armorSlot.classList.add('fa-shield-halved'); armorSlot.classList.add('fa-shield-halved');
} else if (!decreasing && index < newValue) { } else if (!decreasing && index < newCurrent) {
armorSlot.classList.add('fa-shield'); armorSlot.classList.add('fa-shield');
armorSlot.classList.remove('fa-shield-halved'); armorSlot.classList.remove('fa-shield-halved');
} }

View file

@ -51,8 +51,8 @@ export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) {
context.armorScore = this.document.system.armorData.max; context.armorScore = this.document.system.armorData.max;
break; break;
case 'effects': case 'effects':
context.effects.actives = context.effects.actives.filter(x => x.type !== 'armor'); context.effects.actives = context.effects.actives.filter(x => !x.system.armorData);
context.effects.inactives = context.effects.actives.filter(x => x.type !== 'armor'); context.effects.inactives = context.effects.inactives.filter(x => !x.system.armorData);
break; break;
} }
@ -64,7 +64,7 @@ export default class ArmorSheet extends ItemAttachmentSheet(DHBaseItemSheet) {
const armorEffect = this.document.system.armorEffect; const armorEffect = this.document.system.armorEffect;
if (Number.isNaN(value) || !armorEffect) return; if (Number.isNaN(value) || !armorEffect) return;
await armorEffect.system.armorChange.typeData.updateArmorMax(value); await armorEffect.system.armorChange.updateArmorMax(value);
this.render(); this.render();
} }

View file

@ -108,7 +108,7 @@ export default class BaseEffect extends foundry.data.ActiveEffectTypeDataModel {
const armorChange = this.armorChange; const armorChange = this.armorChange;
if (!armorChange) return null; if (!armorChange) return null;
return armorChange.getArmorData(armorChange); return armorChange.getArmorData();
} }
static getDefaultObject() { static getDefaultObject() {

View file

@ -23,7 +23,7 @@ export default class ArmorChange extends foundry.abstract.DataModel {
label: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label', label: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.label',
hint: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.hint' hint: 'DAGGERHEART.EFFECTS.ChangeTypes.armor.FIELDS.interaction.hint'
}) })
}), })
}; };
} }
@ -94,15 +94,15 @@ export default class ArmorChange extends foundry.abstract.DataModel {
/* Helpers */ /* Helpers */
getArmorData(parentChange) { getArmorData() {
const actor = this.parent.parent?.actor?.type === 'character' ? this.parent.parent.actor : null; 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 maxParse = actor ? itemAbleRollParse(this.value.max, actor, this.parent.parent.parent) : null;
const maxRoll = maxParse ? new Roll(maxParse).evaluateSync() : null; const maxRoll = maxParse ? new Roll(maxParse).evaluateSync() : null;
const maxEvaluated = maxRoll ? (maxRoll.isDeterministic ? maxRoll.total : null) : null; const maxEvaluated = maxRoll ? (maxRoll.isDeterministic ? maxRoll.total : null) : null;
return { return {
value: parentChange.value, current: this.value.current,
max: maxEvaluated ?? this.max max: maxEvaluated ?? this.value.max
}; };
} }
@ -110,8 +110,14 @@ export default class ArmorChange extends foundry.abstract.DataModel {
const newChanges = [ const newChanges = [
...this.parent.changes.map(change => ({ ...this.parent.changes.map(change => ({
...change, ...change,
value: change.type === 'armor' ? Math.min(change.value, newMax) : change.value, value:
typeData: change.type === 'armor' ? { ...change.typeData, max: newMax } : change.typeData change.type === 'armor'
? {
...change.value,
current: Math.min(change.value.current, newMax),
max: newMax
}
: change.value
})) }))
]; ];
await this.parent.parent.update({ 'system.changes': newChanges }); await this.parent.parent.update({ 'system.changes': newChanges });

View file

@ -479,14 +479,14 @@ export default class DhCharacter extends DhCreature {
for (const armorEffect of orderedEffects) { for (const armorEffect of orderedEffects) {
let usedArmorChange = 0; let usedArmorChange = 0;
if (clear) { if (clear) {
usedArmorChange -= armorEffect.system.armorChange.value; usedArmorChange -= armorEffect.system.armorChange.value.current;
} else { } else {
if (increasing) { if (increasing) {
const remainingArmor = armorEffect.system.armorData.max - armorEffect.system.armorData.value; const remainingArmor = armorEffect.system.armorData.max - armorEffect.system.armorData.current;
usedArmorChange = Math.min(remainingChange, remainingArmor); usedArmorChange = Math.min(remainingChange, remainingArmor);
remainingChange -= usedArmorChange; remainingChange -= usedArmorChange;
} else { } else {
const changeChange = Math.min(armorEffect.system.armorData.value, remainingChange); const changeChange = Math.min(armorEffect.system.armorData.current, remainingChange);
usedArmorChange -= changeChange; usedArmorChange -= changeChange;
remainingChange -= changeChange; remainingChange -= changeChange;
} }
@ -503,7 +503,10 @@ export default class DhCharacter extends DhCreature {
...change, ...change,
value: value:
change.type === 'armor' change.type === 'armor'
? armorEffect.system.armorChange.value + usedArmorChange ? {
...change.value,
current: armorEffect.system.armorChange.value.current + usedArmorChange
}
: change.value : change.value
})) }))
}); });
@ -519,11 +522,12 @@ export default class DhCharacter extends DhCreature {
async updateArmorEffectValue({ uuid, value }) { async updateArmorEffectValue({ uuid, value }) {
const effect = await foundry.utils.fromUuid(uuid); const effect = await foundry.utils.fromUuid(uuid);
const effectValue = effect.system.armorChange.value;
await effect.update({ await effect.update({
'system.changes': [ 'system.changes': [
{ {
...effect.system.armorChange, ...effect.system.armorChange,
value: effect.system.armorChange.value + value value: { ...effectValue, current: effectValue.current + value }
} }
] ]
}); });

View file

@ -7,7 +7,7 @@
<div class="slot-bar"> <div class="slot-bar">
{{#times source.max}} {{#times source.max}}
<a class='armor-slot' data-value="{{add this 1}}" data-uuid="{{source.uuid}}"> <a class='armor-slot' data-value="{{add this 1}}" data-uuid="{{source.uuid}}">
{{#if (gte ../value (add this 1))}} {{#if (gte ../current (add this 1))}}
<i class="fa-solid fa-shield" data-index="{{this}}"></i> <i class="fa-solid fa-shield" data-index="{{this}}"></i>
{{else}} {{else}}
<i class="fa-solid fa-shield-halved" data-index="{{this}}"></i> <i class="fa-solid fa-shield-halved" data-index="{{this}}"></i>
@ -21,13 +21,13 @@
<p class="armor-source-label">{{source.name}}</p> <p class="armor-source-label">{{source.name}}</p>
<div class="status-bar armor-slots"> <div class="status-bar armor-slots">
<div class='status-value'> <div class='status-value'>
<input class="bar-input armor-marks-input" value="{{source.value}}" data-uuid="{{source.uuid}}" type="number"> <input class="bar-input armor-marks-input" value="{{source.current}}" data-uuid="{{source.uuid}}" type="number">
<span>/</span> <span>/</span>
<span class="bar-label">{{source.max}}</span> <span class="bar-label">{{source.max}}</span>
</div> </div>
<progress <progress
class='progress-bar stress-color' class='progress-bar stress-color'
value='{{source.value}}' value='{{source.current}}'
max='{{source.max}}' max='{{source.max}}'
></progress> ></progress>
</div> </div>