From bbf27e5b4d6b62c8a6abb7a321862c8879b38e6e Mon Sep 17 00:00:00 2001 From: WBHarry Date: Sun, 19 Jul 2026 22:13:37 +0200 Subject: [PATCH] Fixed TagTeamDialog --- module/applications/dialogs/damageDialog.mjs | 14 +++++--- module/applications/dialogs/tagTeamDialog.mjs | 35 ++++++++++++------- module/data/chat-message/chatDamageData.mjs | 5 +-- templates/dialogs/tagTeamDialog/result.hbs | 19 ++++++---- 4 files changed, 48 insertions(+), 25 deletions(-) diff --git a/module/applications/dialogs/damageDialog.mjs b/module/applications/dialogs/damageDialog.mjs index 46bfde76..0d98ce24 100644 --- a/module/applications/dialogs/damageDialog.mjs +++ b/module/applications/dialogs/damageDialog.mjs @@ -6,6 +6,7 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application this.roll = roll; this.config = config; + this.originalIsCritical = config.isCritical; this.selectedEffects = this.config.bonusEffects; } @@ -121,13 +122,16 @@ export default class DamageDialog extends HandlebarsApplicationMixin(Application } static async submitRoll() { - const isCritical = this.config.isCritical; const { damageFormula, resourceFormulas } = this.roll.constructFormulas({ ...this.config, isCritical: false }); /* Sideeffect occuring in constructFormulas that sets this.config.isCritical to the false value. Can remove the below if it can be prevented */ - this.config.isCritical = isCritical; - damageFormula.roll.options.isCritical = isCritical; - for (const formula of resourceFormulas) - formula.roll.options.isCritical = isCritical; + this.config.isCritical = this.originalIsCritical; + + /* If a critical has been forced in the Dialog, save that forced state to the damage roll */ + if (this.config.isCritical && !this.originalIsCritical) { + damageFormula.roll.options.isCritical = true; + for (const formula of resourceFormulas) + formula.roll.options.isCritical = true; + } this.config.damageFormula = damageFormula; this.config.resourceFormulas = resourceFormulas; diff --git a/module/applications/dialogs/tagTeamDialog.mjs b/module/applications/dialogs/tagTeamDialog.mjs index 5779bd00..e03d6658 100644 --- a/module/applications/dialogs/tagTeamDialog.mjs +++ b/module/applications/dialogs/tagTeamDialog.mjs @@ -1,6 +1,7 @@ import { ResourceUpdateMap } from '../../data/action/baseAction.mjs'; import { ChatDamageData } from '../../data/chat-message/chatDamageData.mjs'; import { MemberData } from '../../data/tagTeamData.mjs'; +import DamageRoll from '../../dice/damageRoll.mjs'; import { getCritDamageBonus, shouldUseHopeFearAutomation } from '../../helpers/utils.mjs'; import { emitGMUpdate, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; import PartySheet from '../sheets/actors/party.mjs'; @@ -235,8 +236,12 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } } - const selectedRoll = Object.values(this.party.system.tagTeam.members).find(member => member.selected); - const critSelected = !selectedRoll ? undefined : (selectedRoll?.roll?.isCritical ?? false); + if (data.damageRollData.main) { + const selectedRoll = Object.values(this.party.system.tagTeam.members).find(member => member.selected); + const critSelected = !selectedRoll ? undefined : (selectedRoll?.roll?.isCritical ?? false); + const useCritDamage = critSelected || (critSelected === undefined && data.roll?.isCritical); + data.damageRollData.main.options.isCritical = useCritDamage; + } return { ...data, @@ -249,7 +254,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio damageRollOptions, damage: data.damageRollData, critDamage: this.getCriticalDamage(data.damageRollData), - useCritDamage: critSelected || (critSelected === undefined && data.roll?.isCritical) + useCritDamage: false }; } @@ -640,17 +645,13 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio secondaryRoll.damageRollData = baseSecondaryRoll.damageRollData ? ChatDamageData.fromJSON(JSON.stringify(baseSecondaryRoll.damageRollData)) : null; - const isCritical = overrideIsCritical ?? mainRoll.roll.isCritical; - if (isCritical) mainRoll.damageRollData = this.getCriticalDamage(mainRoll.damageRollData); - if (secondaryRoll.damageRollData) { - const secondaryDamage = (displayVersion ? overrideIsCritical : isCritical) - ? this.getCriticalDamage(secondaryRoll.damageRollData) - : secondaryRoll.damageRollData; + const secondaryDamage = secondaryRoll.damageRollData; + if (mainRoll.damageRollData) { if (secondaryDamage.main) { if (mainRoll.damageRollData.main) { - mainRoll.damageRollData.main = Roll.fromTerms([ + mainRoll.damageRollData.main = DamageRoll.fromTerms([ ...baseMainRoll.damageRollData.main.terms, new foundry.dice.terms.OperatorTerm({ operator: '+' }), ...baseSecondaryRoll.damageRollData.main.terms @@ -672,7 +673,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio for (const [key, damage] of Object.entries(secondaryDamage.resources ?? {})) { if (key in mainRoll.damageRollData.resources) { - mainRoll.damageRollData.resources[key] = Roll.fromTerms([ + mainRoll.damageRollData.resources[key] = DamageRoll.fromTerms([ ...baseMainRoll.damageRollData.resources[key].terms, new foundry.dice.terms.OperatorTerm({ operator: '+' }), ...baseSecondaryRoll.damageRollData.resources[key].terms @@ -696,6 +697,12 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio } } + if (mainRoll.damageRollData.main) { + const isCritical = overrideIsCritical ?? mainRoll.roll.isCritical; + mainRoll.damageRollData.main.options.isCritical = isCritical; + } + + return mainRoll; } catch (err) { console.error(err); @@ -755,7 +762,11 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio }; if (joinedRoll.damageRollData.main) { - systemData.damage.main = joinedRoll.damageRollData.toJSON(); + systemData.damage.main = joinedRoll.damageRollData.main.toJSON(); + // isCritical is used internally in TagTeamDialog to force-flip damage from normal to critical and vice versa. + // It's deleted here to avoid interupting normal critical damage logic in the chatMessage. + // If someone explicitly set their own damage roll to be a forced critical, then I think it's fine that isn't transmitted to the final joined roll. + delete systemData.damage.main.options.isCritical; } for (const type of Object.keys(joinedRoll.damageRollData?.resources ?? {})) { systemData.damage.resources[type] = joinedRoll.damageRollData.resources[type].toJSON(); diff --git a/module/data/chat-message/chatDamageData.mjs b/module/data/chat-message/chatDamageData.mjs index a31a9ef1..da28061f 100644 --- a/module/data/chat-message/chatDamageData.mjs +++ b/module/data/chat-message/chatDamageData.mjs @@ -41,11 +41,12 @@ export class ChatDamageData extends foundry.abstract.DataModel { } _prepareRolls() { - this.main &&= Roll.fromData({ + this.main &&= Roll.fromData({ ...this.main, options: { ...this.main.options, - isCritical: this.main.options.isCritical || this.isCritical + isCritical: + this.main.options.isCritical === false ? false : (this.main.options.isCritical || this.isCritical) } }); diff --git a/templates/dialogs/tagTeamDialog/result.hbs b/templates/dialogs/tagTeamDialog/result.hbs index 88f579a6..ffeeefd9 100644 --- a/templates/dialogs/tagTeamDialog/result.hbs +++ b/templates/dialogs/tagTeamDialog/result.hbs @@ -18,11 +18,11 @@ {{#if joinedRoll.damageRollData}}
- {{#each joinedRoll.damageRollData.types as |damage key|}} -
-
{{localize (concat "DAGGERHEART.CONFIG.HealingType." key ".name")}}
-
{{damage.total}}
-
+ {{#if joinedRoll.damageRollData.main}} + {{> damageSummary roll=joinedRoll.damageRollData.main label=(localize "DAGGERHEART.GENERAL.damage")}} + {{/if}} + {{#each joinedRoll.damageRollData.resources as |roll key|}} + {{> damageSummary roll=roll label=(localize (concat "DAGGERHEART.CONFIG.HealingType." key ".name"))}} {{/each}}
{{/if}} @@ -38,4 +38,11 @@ - \ No newline at end of file + + +{{#*inline "damageSummary"}} +
+
{{label}}
+
{{roll.total}}
+
+{{/inline}} \ No newline at end of file