mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 11:41:08 +01:00
Made some handlign for the damage when a tagTeamRoll crits
This commit is contained in:
parent
6d8d773a26
commit
bcc87334b6
2 changed files with 57 additions and 22 deletions
|
|
@ -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',
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue