From ab1772264a8b6f0dcce8a9506d5621d917aa5327 Mon Sep 17 00:00:00 2001 From: WBHarry Date: Fri, 17 Jul 2026 17:41:32 +0200 Subject: [PATCH] Fixed so that party.tagTeam now uses a declared damageRollData(ChatDamageData) field. rollData.options.damage is retired. --- module/applications/dialogs/tagTeamDialog.mjs | 56 ++++--------------- module/data/actor/party.mjs | 9 --- module/data/tagTeamData.mjs | 3 + module/dice/damageRoll.mjs | 2 +- .../parts/tagTeamDamageParts.hbs | 12 ++-- .../dialogs/tagTeamDialog/tagTeamMember.hbs | 11 ++-- 6 files changed, 25 insertions(+), 68 deletions(-) diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index 2b865304..417dd511 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -141,7 +141,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio const hasRolled = Boolean(data.rollData); if (!hasRolled) return false; - return !data.rollData.options.hasDamage || Boolean(data.rollData.options.damage); + return !data.rollData.options.hasDamage || data.damageRollData.active; }); return context; @@ -379,7 +379,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio let rollIsSelected = false; for (const member of Object.values(members)) { const rollFinished = Boolean(member.rollData); - const damageFinished = member.rollData?.options?.hasDamage ? Boolean(member.rollData.options.damage) : true; + const damageFinished = member.rollData?.options?.hasDamage ? member.damageRollData.active : true; rollsAreFinished = rollsAreFinished && rollFinished && damageFinished; rollIsSelected = rollIsSelected || member.selected; @@ -540,17 +540,10 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio await action.workflow.get('damage').execute(config, null, true); if (!config.damage) return; - - const current = this.party.system.tagTeam.members[memberKey].rollData; + await this.updatePartyData( { - [`system.tagTeam.members.${memberKey}.rollData`]: { - ...current, - options: { - ...current.options, - damage: config.damage - } - } + [`system.tagTeam.members.${memberKey}.damageRollData`]: config.damage }, this.getUpdatingParts(button) ); @@ -558,52 +551,25 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio static async #removeDamageRoll(_, button) { const { memberKey } = button.dataset; - const current = this.party.system.tagTeam.members[memberKey].rollData; this.updatePartyData( { - [`system.tagTeam.members.${memberKey}.rollData`]: { - ...current, - options: { - ...current.options, - damage: null - } - } + [`system.tagTeam.members.${memberKey}.damageRollData.types`]: + _replace({}) }, this.getUpdatingParts(button) ); } static async #rerollDamageDice(_, button) { - const { memberKey, damageKey, part, dice } = button.dataset; + const { memberKey, damageKey, diceIndex, resultIndex } = button.dataset; const memberData = this.party.system.tagTeam.members[memberKey]; - const partData = memberData.rollData.options.damage[damageKey].parts[part]; - const activeDiceResultKey = Object.keys(partData.dice[dice].results).find( - index => partData.dice[dice].results[index].active - ); - const { parsedRoll, rerolledDice } = await game.system.api.dice.DamageRoll.reroll( - partData, - dice, - activeDiceResultKey - ); - - const rollData = this.party.system.tagTeam.members[memberKey].rollData; - rollData.options.damage[damageKey].parts = rollData.options.damage[damageKey].parts.map((damagePart, index) => { - if (index !== Number.parseInt(part)) return damagePart; - - return { - ...damagePart, - total: parsedRoll.total, - dice: rerolledDice - }; - }); - rollData.options.damage[damageKey].total = rollData.options.damage[damageKey].parts.reduce((acc, part) => { - acc += part.total; - return acc; - }, 0); + await memberData.damageRollData.rerollDamageDie(damageKey, diceIndex, resultIndex); this.updatePartyData( { - [`system.tagTeam.members.${memberKey}.rollData`]: rollData + [`system.tagTeam.members.${memberKey}.damageRollData.types`]: { + [damageKey]: memberData.damageRollData.types[damageKey].toJSON() + } }, this.getUpdatingParts(button) ); diff --git a/module/data/actor/party.mjs b/module/data/actor/party.mjs index b735c65a..5b9cccab 100644 --- a/module/data/actor/party.mjs +++ b/module/data/actor/party.mjs @@ -3,7 +3,6 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayFie import TagTeamData from '../tagTeamData.mjs'; import GroupRollData from '../groupRollData.mjs'; import { GoldField } from '../fields/actorField.mjs'; -import { ChatDamageData } from '../chat-message/chatDamageData.mjs'; export default class DhParty extends BaseDataActor { /** @inheritdoc */ @@ -49,14 +48,6 @@ export default class DhParty extends BaseDataActor { } } - prepareDerivedData() { - for (const memberKey in this.tagTeam.members) { - const member = this.tagTeam.members[memberKey]; - member.damageRollData = member.rollData?.options.damage ? - ChatDamageData.fromJSON(JSON.stringify(member.rollData.options.damage)) : null; - } - } - _onCreate(data, options, userId) { super._onCreate(data, options, userId); diff --git a/module/data/tagTeamData.mjs b/module/data/tagTeamData.mjs index 640c2f6c..ef6536f1 100644 --- a/module/data/tagTeamData.mjs +++ b/module/data/tagTeamData.mjs @@ -1,3 +1,5 @@ +import { ChatDamageData } from './chat-message/chatDamageData.mjs'; + export default class TagTeamData extends foundry.abstract.DataModel { static defineSchema() { const fields = foundry.data.fields; @@ -37,6 +39,7 @@ export class MemberData extends foundry.abstract.DataModel { }), rollChoice: new fields.StringField({ nullable: true, initial: null }), rollData: new fields.JSONField({ nullable: true, initial: null }), + damageRollData: new fields.EmbeddedDataField(ChatDamageData), selected: new fields.BooleanField({ initial: false }) }; } diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 56712337..a191a8b4 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -37,7 +37,7 @@ export default class DamageRoll extends DHRoll { if (game.modules.get('dice-so-nice')?.active) { config.mute = true; const pool = foundry.dice.terms.PoolTerm.fromRolls( - Object.values(config.damage.types).map(x => x.roll) + Object.values(config.damage.types) ); diceRolls.push(Roll.fromTerms([pool])); } diff --git a/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs b/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs index 4145b706..3f7f457b 100644 --- a/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs +++ b/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs @@ -6,12 +6,12 @@
- {{#each roll.dice as |dice index|}} - {{#each results}} - {{#if active}} - - {{result}} - + {{#each roll.dice}} + {{#each results as |result index|}} + {{#if result.active}} + + {{result.result}} + {{/if}} {{/each}} diff --git a/templates/dialogs/tagTeamDialog/tagTeamMember.hbs b/templates/dialogs/tagTeamDialog/tagTeamMember.hbs index 7510422f..b608c8f0 100644 --- a/templates/dialogs/tagTeamDialog/tagTeamMember.hbs +++ b/templates/dialogs/tagTeamDialog/tagTeamMember.hbs @@ -100,15 +100,12 @@ - - {{#if damage}} - - - - {{/if}} + + +
- {{#if damage}} + {{#if damage.active}} {{#if useCritDamage}} {{> "systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs" damage=critDamage isCritical=true }} {{else}}