Fixed so that party.tagTeam now uses a declared damageRollData(ChatDamageData) field. rollData.options.damage is retired.

This commit is contained in:
WBHarry 2026-07-17 17:41:32 +02:00
parent e087b379fc
commit ab1772264a
6 changed files with 25 additions and 68 deletions

View file

@ -141,7 +141,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
const hasRolled = Boolean(data.rollData); const hasRolled = Boolean(data.rollData);
if (!hasRolled) return false; if (!hasRolled) return false;
return !data.rollData.options.hasDamage || Boolean(data.rollData.options.damage); return !data.rollData.options.hasDamage || data.damageRollData.active;
}); });
return context; return context;
@ -379,7 +379,7 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
let rollIsSelected = false; let rollIsSelected = false;
for (const member of Object.values(members)) { for (const member of Object.values(members)) {
const rollFinished = Boolean(member.rollData); 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; rollsAreFinished = rollsAreFinished && rollFinished && damageFinished;
rollIsSelected = rollIsSelected || member.selected; rollIsSelected = rollIsSelected || member.selected;
@ -540,17 +540,10 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
await action.workflow.get('damage').execute(config, null, true); await action.workflow.get('damage').execute(config, null, true);
if (!config.damage) return; if (!config.damage) return;
const current = this.party.system.tagTeam.members[memberKey].rollData;
await this.updatePartyData( await this.updatePartyData(
{ {
[`system.tagTeam.members.${memberKey}.rollData`]: { [`system.tagTeam.members.${memberKey}.damageRollData`]: config.damage
...current,
options: {
...current.options,
damage: config.damage
}
}
}, },
this.getUpdatingParts(button) this.getUpdatingParts(button)
); );
@ -558,52 +551,25 @@ export default class TagTeamDialog extends HandlebarsApplicationMixin(Applicatio
static async #removeDamageRoll(_, button) { static async #removeDamageRoll(_, button) {
const { memberKey } = button.dataset; const { memberKey } = button.dataset;
const current = this.party.system.tagTeam.members[memberKey].rollData;
this.updatePartyData( this.updatePartyData(
{ {
[`system.tagTeam.members.${memberKey}.rollData`]: { [`system.tagTeam.members.${memberKey}.damageRollData.types`]:
...current, _replace({})
options: {
...current.options,
damage: null
}
}
}, },
this.getUpdatingParts(button) this.getUpdatingParts(button)
); );
} }
static async #rerollDamageDice(_, 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 memberData = this.party.system.tagTeam.members[memberKey];
const partData = memberData.rollData.options.damage[damageKey].parts[part]; await memberData.damageRollData.rerollDamageDie(damageKey, diceIndex, resultIndex);
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);
this.updatePartyData( this.updatePartyData(
{ {
[`system.tagTeam.members.${memberKey}.rollData`]: rollData [`system.tagTeam.members.${memberKey}.damageRollData.types`]: {
[damageKey]: memberData.damageRollData.types[damageKey].toJSON()
}
}, },
this.getUpdatingParts(button) this.getUpdatingParts(button)
); );

View file

@ -3,7 +3,6 @@ import ForeignDocumentUUIDArrayField from '../fields/foreignDocumentUUIDArrayFie
import TagTeamData from '../tagTeamData.mjs'; import TagTeamData from '../tagTeamData.mjs';
import GroupRollData from '../groupRollData.mjs'; import GroupRollData from '../groupRollData.mjs';
import { GoldField } from '../fields/actorField.mjs'; import { GoldField } from '../fields/actorField.mjs';
import { ChatDamageData } from '../chat-message/chatDamageData.mjs';
export default class DhParty extends BaseDataActor { export default class DhParty extends BaseDataActor {
/** @inheritdoc */ /** @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) { _onCreate(data, options, userId) {
super._onCreate(data, options, userId); super._onCreate(data, options, userId);

View file

@ -1,3 +1,5 @@
import { ChatDamageData } from './chat-message/chatDamageData.mjs';
export default class TagTeamData extends foundry.abstract.DataModel { export default class TagTeamData extends foundry.abstract.DataModel {
static defineSchema() { static defineSchema() {
const fields = foundry.data.fields; const fields = foundry.data.fields;
@ -37,6 +39,7 @@ export class MemberData extends foundry.abstract.DataModel {
}), }),
rollChoice: new fields.StringField({ nullable: true, initial: null }), rollChoice: new fields.StringField({ nullable: true, initial: null }),
rollData: new fields.JSONField({ nullable: true, initial: null }), rollData: new fields.JSONField({ nullable: true, initial: null }),
damageRollData: new fields.EmbeddedDataField(ChatDamageData),
selected: new fields.BooleanField({ initial: false }) selected: new fields.BooleanField({ initial: false })
}; };
} }

View file

@ -37,7 +37,7 @@ export default class DamageRoll extends DHRoll {
if (game.modules.get('dice-so-nice')?.active) { if (game.modules.get('dice-so-nice')?.active) {
config.mute = true; config.mute = true;
const pool = foundry.dice.terms.PoolTerm.fromRolls( 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])); diceRolls.push(Roll.fromTerms([pool]));
} }

View file

@ -6,12 +6,12 @@
</div> </div>
<div class="roll-dice-container"> <div class="roll-dice-container">
{{#each roll.dice as |dice index|}} {{#each roll.dice}}
{{#each results}} {{#each results as |result index|}}
{{#if active}} {{#if result.active}}
<a class="roll-dice" data-action="rerollDamageDice" data-member-key="{{../../key}}" data-dice="{{../key}}" data-result="{{index}}"> <a class="roll-dice" data-action="rerollDamageDice" data-member-key="{{../../../key}}" data-damage-key="{{@../../key}}" data-dice-index="{{@../key}}" data-result-index="{{index}}">
<span class="dice-label">{{result}}</span> <span class="dice-label">{{result.result}}</span>
<img src="{{concat "systems/daggerheart/assets/icons/dice/hope/" dice.denomination ".svg"}}" /> <img src="{{concat "systems/daggerheart/assets/icons/dice/hope/" ../denomination ".svg"}}" />
</a> </a>
{{/if}} {{/if}}
{{/each}} {{/each}}

View file

@ -100,15 +100,12 @@
<a class="roll-button" data-action="makeDamageRoll" data-member-key="{{@root.partId}}" {{#unless readyToRoll}}disabled{{/unless}}> <a class="roll-button" data-action="makeDamageRoll" data-member-key="{{@root.partId}}" {{#unless readyToRoll}}disabled{{/unless}}>
<img src="systems/daggerheart/assets/icons/dice/hope/d20.svg" /> <img src="systems/daggerheart/assets/icons/dice/hope/d20.svg" />
</a> </a>
<a class="delete-button" data-action="removeDamageRoll" data-member-key="{{@root.partId}}" {{#unless damage.active}}disabled{{/unless}}>
{{#if damage}} <i class="fa-solid fa-trash"></i>
<a class="delete-button" data-action="removeDamageRoll" data-member-key="{{@root.partId}}" {{#unless rollData.options.damage}}disabled{{/unless}}> </a>
<i class="fa-solid fa-trash"></i>
</a>
{{/if}}
</div> </div>
</span> </span>
{{#if damage}} {{#if damage.active}}
{{#if useCritDamage}} {{#if useCritDamage}}
{{> "systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs" damage=critDamage isCritical=true }} {{> "systems/daggerheart/templates/dialogs/tagTeamDialog/parts/tagTeamDamageParts.hbs" damage=critDamage isCritical=true }}
{{else}} {{else}}