Made some handlign for the damage when a tagTeamRoll crits

This commit is contained in:
WBHarry 2025-12-06 22:08:34 +01:00
parent 6d8d773a26
commit bcc87334b6
2 changed files with 57 additions and 22 deletions

View file

@ -1,3 +1,4 @@
import { getCritDamageBonus } from '../../helpers/utils.mjs';
import { GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs'; import { GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
@ -76,28 +77,37 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
cost: this.data.initiator.cost cost: this.data.initiator.cost
}; };
context.selectedData = Object.values(context.members).reduce( const selectedMember = Object.values(context.members).find(x => x.selected);
(acc, member) => { const selectedIsCritical = selectedMember?.roll?.system?.isCritical;
if (!member.roll) return acc; context.selectedData = {
if (member.selected) { result: selectedMember
acc.result = `${member.roll.system.roll.total} ${member.roll.system.roll.result.label}`; ? `${selectedMember.roll.system.roll.total} ${selectedMember.roll.system.roll.result.label}`
} : null,
damageValues: null
};
if (context.usesDamage) { for (const member of Object.values(context.members)) {
if (!acc.damageValues) acc.damageValues = {}; if (!member.roll) continue;
for (let damage of member.damageValues) { if (context.usesDamage) {
if (acc.damageValues[damage.key]) { if (!context.selectedData.damageValues) context.selectedData.damageValues = {};
acc.damageValues[damage.key].total += damage.total; for (let damage of member.damageValues) {
} else { const damageTotal = member.roll.system.isCritical
acc.damageValues[damage.key] = foundry.utils.deepClone(damage); ? damage.total
} : selectedIsCritical
? damage.total + (await getCritDamageBonus(member.roll.system.damage[damage.key].formula))
: damage.total;
if (context.selectedData.damageValues[damage.key]) {
context.selectedData.damageValues[damage.key].total += damageTotal;
} else {
context.selectedData.damageValues[damage.key] = {
...foundry.utils.deepClone(damage),
total: damageTotal
};
} }
} }
}
}
return acc;
},
{ result: null, damageValues: null }
);
context.showResult = Object.values(context.members).reduce((enabled, member) => { context.showResult = Object.values(context.members).reduce((enabled, member) => {
if (!member.roll) return enabled; if (!member.roll) return enabled;
if (context.usesDamage) { if (context.usesDamage) {
@ -201,21 +211,41 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
.map(key => game.messages.get(this.data.members[key].messageId)); .map(key => game.messages.get(this.data.members[key].messageId));
const systemData = foundry.utils.deepClone(mainRoll).system.toObject(); const systemData = foundry.utils.deepClone(mainRoll).system.toObject();
const criticalRoll = systemData.roll.isCritical;
for (let roll of secondaryRolls) { for (let roll of secondaryRolls) {
if (roll.system.hasDamage) { if (roll.system.hasDamage) {
for (let key in roll.system.damage) { for (let key in roll.system.damage) {
var damage = roll.system.damage[key]; var damage = roll.system.damage[key];
const damageTotal =
!roll.system.isCritical && criticalRoll
? (await getCritDamageBonus(damage.formula)) + damage.total
: damage.total;
if (systemData.damage[key]) { if (systemData.damage[key]) {
systemData.damage[key].total += damage.total; const updatedDamageParts = damage.parts;
systemData.damage[key].parts = [...systemData.damage[key].parts, ...damage.parts]; if (!roll.system.isCritical && criticalRoll) {
for (let part of updatedDamageParts) {
const criticalDamage = await getCritDamageBonus(part.formula);
if (criticalDamage) {
damage.formula = `${damage.formula} + ${criticalDamage}`;
part.formula = `${part.formula} + ${criticalDamage}`;
part.modifierTotal = part.modifierTotal + criticalDamage;
part.total += criticalDamage;
part.roll = new Roll(part.formula);
}
}
}
systemData.damage[key].formula = `${systemData.damage[key].formula} + ${damage.formula}`;
systemData.damage[key].total += damageTotal;
systemData.damage[key].parts = [...systemData.damage[key].parts, ...updatedDamageParts];
} else { } else {
systemData.damage[key] = damage; systemData.damage[key] = { ...damage, total: damageTotal, parts: updatedDamageParts };
} }
} }
} }
} }
systemData.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.chatMessageRollTitle');
systemData.title = game.i18n.localize('DAGGERHEART.APPLICATIONS.TagTeamSelect.chatMessageRollTitle');
const cls = getDocumentClass('ChatMessage'), const cls = getDocumentClass('ChatMessage'),
msgData = { msgData = {
type: 'dualityRoll', type: 'dualityRoll',

View file

@ -451,3 +451,8 @@ export async function waitForDiceSoNice(message) {
await game.dice3d.waitFor3DAnimationByMessageID(message.id); await game.dice3d.waitFor3DAnimationByMessageID(message.id);
} }
} }
export async function getCritDamageBonus(formula) {
const critRoll = new Roll(formula);
return critRoll.dice.reduce((acc, dice) => acc + dice.faces, 0);
}