diff --git a/module/applications/dialogs/d20RollDialog.mjs b/module/applications/dialogs/d20RollDialog.mjs index 099b2d66..d0689ae8 100644 --- a/module/applications/dialogs/d20RollDialog.mjs +++ b/module/applications/dialogs/d20RollDialog.mjs @@ -78,7 +78,7 @@ export default class D20RollDialog extends HandlebarsApplicationMixin(Applicatio icon })); - context.hasSelectedEffects = Boolean(Object.keys(this.selectedEffects).length); + context.hasSelectedEffects = Boolean(this.selectedEffects && Object.keys(this.selectedEffects).length); context.selectedEffects = this.selectedEffects; this.config.costs ??= []; diff --git a/module/applications/sheets/actors/character.mjs b/module/applications/sheets/actors/character.mjs index b48d459d..67d623bc 100644 --- a/module/applications/sheets/actors/character.mjs +++ b/module/applications/sheets/actors/character.mjs @@ -337,15 +337,20 @@ export default class CharacterSheet extends DHBaseActorSheet { } const type = 'effect'; const cls = game.system.api.models.actions.actionsTypes[type]; - const action = new cls({ - ...cls.getSourceConfig(doc.system), - type: type, - chatDisplay: false, - cost: [{ - key: 'stress', - value: doc.system.recallCost - }] - }, { parent: doc.system }); + const action = new cls( + { + ...cls.getSourceConfig(doc.system), + type: type, + chatDisplay: false, + cost: [ + { + key: 'stress', + value: doc.system.recallCost + } + ] + }, + { parent: doc.system } + ); const config = await action.use(event); if (config) { return doc.update({ 'system.inVault': false }); @@ -706,8 +711,10 @@ export default class CharacterSheet extends DHBaseActorSheet { headerTitle: game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { ability: abilityLabel }), + effects: Array.from(await this.document.allApplicableEffects()), roll: { - trait: button.dataset.attribute + trait: button.dataset.attribute, + type: 'trait' }, hasRoll: true, actionType: 'action', diff --git a/module/dice/d20Roll.mjs b/module/dice/d20Roll.mjs index 5ca5f4f2..f679d725 100644 --- a/module/dice/d20Roll.mjs +++ b/module/dice/d20Roll.mjs @@ -127,20 +127,53 @@ export default class D20Roll extends DHRoll { const modifiers = foundry.utils.deepClone(this.options.roll.baseModifiers) ?? []; modifiers.push( - ...this.getBonus(`roll.${this.options.actionType}`, `${this.options.actionType?.capitalize()} Bonus`) - ); - modifiers.push( - ...this.getBonus(`roll.${this.options.roll.type}`, `${this.options.roll.type?.capitalize()} Bonus`) + ...this.getBonus( + `system.bonuses.roll.${this.options.actionType}`, + `${this.options.actionType?.capitalize()} Bonus` + ) ); + if (this.options.roll.type !== CONFIG.DH.GENERAL.rollTypes.attack.id) { + modifiers.push( + ...this.getBonus( + `system.bonuses.roll.${this.options.roll.type}`, + `${this.options.roll.type?.capitalize()} Bonus` + ) + ); + } + + if ( + this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.attack.id || + (this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.spellcast.id && this.options.hasDamage) + ) { + modifiers.push( + ...this.getBonus(`system.bonuses.roll.attack`, `${this.options.roll.type?.capitalize()} Bonus`) + ); + } + return modifiers; } - bonusEffectBuilder(config) { - const changeKeys = [`roll.${this.options.actionType}`, `roll.${this.options.roll.type}`]; - config.bonusEffects = foundry.utils.deepClone( - config.effects.filter(x => x.changes.some(x => changeKeys.includes(x.key))) - ); + getActionChangeKeys() { + const changeKeys = new Set([`system.bonuses.roll.${this.options.actionType}`]); + + if (this.options.roll.type !== CONFIG.DH.GENERAL.rollTypes.attack.id) { + changeKeys.add(`system.bonuses.roll.${this.options.roll.type}`); + } + + if ( + this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.attack.id || + (this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.spellcast.id && this.options.hasDamage) + ) { + changeKeys.add(`system.bonuses.roll.attack`); + } + + if (this.options.roll.trait && this.data.traits?.[this.options.roll.trait]) { + if (this.options.roll.type !== CONFIG.DH.GENERAL.rollTypes.spellcast.id) + changeKeys.add('system.bonuses.roll.trait'); + } + + return changeKeys; } static postEvaluate(roll, config = {}) { diff --git a/module/dice/damageRoll.mjs b/module/dice/damageRoll.mjs index 7aaf31ba..f1da7654 100644 --- a/module/dice/damageRoll.mjs +++ b/module/dice/damageRoll.mjs @@ -107,23 +107,27 @@ export default class DamageRoll extends DHRoll { return modifiers; } - bonusEffectBuilder() { + getActionChangeKeys() { const type = this.options.messageType ?? (this.options.hasHealing ? 'healing' : 'damage'); + const changeKeys = []; - return this.options.effects.reduce((acc, effect) => { - if (effect.changes.some(x => x.key.includes(`system.bonuses.${type}`))) { - acc[effect.id] = { - id: effect.id, - name: effect.name, - description: effect.description, - changes: effect.changes, - origEffect: effect, - selected: !effect.disabled - }; + for (const roll of this.options.roll) { + for (const damageType of roll.damageTypes) changeKeys.push(`system.bonuses.${type}.${damageType}`); + } + + const item = this.data.parent.items?.get(this.options.source.item); + if (item) { + switch (item.type) { + case 'weapon': + if (!this.options.hasHealing) + ['primaryWeapon', 'secondaryWeapon'].forEach(w => + changeKeys.push(`system.bonuses.damage.${w}`) + ); + break; } + } - return acc; - }, {}); + return changeKeys; } constructFormula(config) { @@ -161,7 +165,7 @@ export default class DamageRoll extends DHRoll { } if (config.isCritical && part.applyTo === CONFIG.DH.GENERAL.healingTypes.hitPoints.id) { - const total = part.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0); + let total = part.roll.dice.reduce((acc, term) => acc + term._faces * term._number, 0); if (total > 0) { part.roll.terms.push(...this.formatModifier(total)); } diff --git a/module/dice/dhRoll.mjs b/module/dice/dhRoll.mjs index 5133f2c8..1485085e 100644 --- a/module/dice/dhRoll.mjs +++ b/module/dice/dhRoll.mjs @@ -1,5 +1,4 @@ import D20RollDialog from '../applications/dialogs/d20RollDialog.mjs'; -import { BonusFields } from '../data/actor/character.mjs'; export default class DHRoll extends Roll { baseTerms = []; @@ -249,6 +248,26 @@ export default class DHRoll extends Roll { } bonusEffectBuilder() { + const changeKeys = this.getActionChangeKeys(); + return ( + this.options.effects?.reduce((acc, effect) => { + if (effect.changes.some(x => changeKeys.some(key => x.key.includes(key)))) { + acc[effect.id] = { + id: effect.id, + name: effect.name, + description: effect.description, + changes: effect.changes, + origEffect: effect, + selected: !effect.disabled + }; + } + + return acc; + }, {}) ?? [] + ); + } + + getActionChangeKeys() { return []; } } diff --git a/module/dice/dualityRoll.mjs b/module/dice/dualityRoll.mjs index 8c82f6b1..9490292a 100644 --- a/module/dice/dualityRoll.mjs +++ b/module/dice/dualityRoll.mjs @@ -173,21 +173,32 @@ export default class DualityRoll extends D20Roll { return modifiers; } - bonusEffectBuilder() { - return this.options.effects.reduce((acc, effect) => { - if (effect.changes.some(x => x.key.includes(`system.bonuses.roll`))) { - acc[effect.id] = { - id: effect.id, - name: effect.name, - description: effect.description, - changes: effect.changes, - origEffect: effect, - selected: !effect.disabled - }; - } + getActionChangeKeys() { + const changeKeys = new Set([`system.bonuses.roll.${this.options.actionType}`]); - return acc; - }, {}); + if (this.options.roll.type !== CONFIG.DH.GENERAL.rollTypes.attack.id) { + changeKeys.add(`system.bonuses.roll.${this.options.roll.type}`); + } + + if ( + this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.attack.id || + (this.options.roll.type === CONFIG.DH.GENERAL.rollTypes.spellcast.id && this.options.hasDamage) + ) { + changeKeys.add(`system.bonuses.roll.attack`); + } + + if (this.options.roll.trait && this.data.traits?.[this.options.roll.trait]) { + if (this.options.roll.type !== CONFIG.DH.GENERAL.rollTypes.spellcast.id) + changeKeys.add('system.bonuses.roll.trait'); + } + + const weapons = ['primaryWeapon', 'secondaryWeapon']; + weapons.forEach(w => { + if (this.options.source.item && this.options.source.item === this.data[w]?.id) + changeKeys.add(`system.bonuses.roll.${w}`); + }); + + return changeKeys; } static async buildEvaluate(roll, config = {}, message = {}) { diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 0e51b174..e60f4683 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -74,14 +74,12 @@
{{localize "DAGGERHEART.GENERAL.Effect.plural"}} -
- {{#each selectedEffects as |effect id|}} -
- - {{effect.name}} -
- {{/each}} -
+ {{#each selectedEffects as |effect id|}} +
+ + {{effect.name}} +
+ {{/each}}
{{/if}}