diff --git a/daggerheart.mjs b/daggerheart.mjs index df87d885..6e266ace 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -135,7 +135,7 @@ Hooks.on(socketEvent.GMUpdate, async (action, uuid, update) => { const renderDualityButton = async event => { const button = event.currentTarget, - attributeValue = button.dataset.attribute?.toLowerCase(), + traitValue = button.dataset.trait?.toLowerCase(), target = getCommandTarget(); if (!target) return; @@ -143,7 +143,8 @@ const renderDualityButton = async event => { event: event, title: button.dataset.label, roll: { - modifier: attributeValue ? target.system.attributes[attributeValue].data.value : null, + modifier: traitValue ? target.system.traits[traitValue].value : null, + label: button.dataset.label, type: button.dataset.actionType ?? null // Need check }, chatMessage: { @@ -218,28 +219,28 @@ Hooks.on('chatMessage', (_, message) => { return false; } - const attributeValue = rollCommand.attribute?.toLowerCase(); + const traitValue = rollCommand.trait?.toLowerCase(); // Target not required if an attribute is not used. - const target = attributeValue ? getCommandTarget() : undefined; - if (target || !attributeValue) { + const target = traitValue ? getCommandTarget() : undefined; + if (target || !traitValue) { new Promise(async (resolve, reject) => { - const attribute = target ? target.system.attributes[attributeValue] : undefined; - if (attributeValue && !attribute) { + const trait = target ? target.system.traits[traitValue] : undefined; + if (traitValue && !trait) { ui.notifications.error(game.i18n.localize('DAGGERHEART.Notification.Error.AttributeFaulty')); reject(); return; } - const title = attributeValue + const title = traitValue ? game.i18n.format('DAGGERHEART.Chat.DualityRoll.AbilityCheckTitle', { - ability: game.i18n.localize(abilities[attributeValue].label) + ability: game.i18n.localize(abilities[traitValue].label) }) : game.i18n.localize('DAGGERHEART.General.Duality'); const hopeAndFearRoll = `1${rollCommand.hope ?? 'd12'}+1${rollCommand.fear ?? 'd12'}`; const advantageRoll = `${rollCommand.advantage && !rollCommand.disadvantage ? '+d6' : rollCommand.disadvantage && !rollCommand.advantage ? '-d6' : ''}`; - const attributeRoll = `${attribute?.data?.value ? `${attribute.data.value > 0 ? `+${attribute.data.value}` : `${attribute.data.value}`}` : ''}`; + const attributeRoll = `${trait?.value ? `${trait.value > 0 ? `+${trait.value}` : `${trait.value}`}` : ''}`; const roll = await Roll.create(`${hopeAndFearRoll}${advantageRoll}${attributeRoll}`).evaluate(); setDiceSoNiceForDualityRoll( @@ -250,21 +251,21 @@ Hooks.on('chatMessage', (_, message) => { resolve({ roll, - attribute: attribute + trait: trait ? { - value: attribute.data.value, - label: `${game.i18n.localize(abilities[attributeValue].label)} ${attribute.data.value >= 0 ? `+` : ``}${attribute.data.value}` + value: trait.value, + label: `${game.i18n.localize(abilities[traitValue].label)} ${trait.value >= 0 ? `+` : ``}${trait.value}` } : undefined, title }); - }).then(async ({ roll, attribute, title }) => { + }).then(async ({ roll, trait, title }) => { const cls = getDocumentClass('ChatMessage'); const systemData = new DHDualityRoll({ title: title, origin: target?.id, roll: roll, - modifiers: attribute ? [attribute] : [], + modifiers: trait ? [trait] : [], hope: { dice: rollCommand.hope ?? 'd12', value: roll.dice[0].total }, fear: { dice: rollCommand.fear ?? 'd12', value: roll.dice[1].total }, advantage: @@ -282,10 +283,7 @@ Hooks.on('chatMessage', (_, message) => { sound: CONFIG.sounds.dice, system: systemData, user: game.user.id, - content: await foundry.applications.handlebars.renderTemplate( - 'systems/daggerheart/templates/chat/duality-roll.hbs', - systemData - ), + content: 'systems/daggerheart/templates/chat/duality-roll.hbs', rolls: [roll] }; diff --git a/module/applications/chatMessage.mjs b/module/applications/chatMessage.mjs index aef05bae..e54e8d40 100644 --- a/module/applications/chatMessage.mjs +++ b/module/applications/chatMessage.mjs @@ -3,6 +3,15 @@ import DHDualityRoll from '../data/chat-message/dualityRoll.mjs'; export default class DhpChatMessage extends foundry.documents.ChatMessage { async renderHTML() { + if ( + this.type === 'dualityRoll' || + this.type === 'adversaryRoll' || + this.type === 'damageRoll' || + this.type === 'abilityUse' + ) { + this.content = await foundry.applications.handlebars.renderTemplate(this.content, this.system); + } + /* We can change to fully implementing the renderHTML function if needed, instead of augmenting it. */ const html = await super.renderHTML(); diff --git a/module/applications/sheets/character.mjs b/module/applications/sheets/character.mjs index d41bdfbe..bea918e6 100644 --- a/module/applications/sheets/character.mjs +++ b/module/applications/sheets/character.mjs @@ -285,12 +285,14 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { } static async rollAttribute(event, button) { + const abilityLabel = game.i18n.localize(abilities[button.dataset.attribute].label); const config = { event: event, title: game.i18n.format('DAGGERHEART.Chat.DualityRoll.AbilityCheckTitle', { - ability: game.i18n.localize(abilities[button.dataset.attribute].label) + ability: abilityLabel }), roll: { + label: abilityLabel, modifier: button.dataset.value }, chatMessage: { @@ -368,7 +370,7 @@ export default class CharacterSheet extends DaggerheartSheet(ActorSheetV2) { static async attackRoll(event, button) { const weapon = await fromUuid(button.dataset.weapon); - if(!weapon) return; + if (!weapon) return; weapon.use(event); } diff --git a/module/data/chat-message/dualityRoll.mjs b/module/data/chat-message/dualityRoll.mjs index 56ac9a21..1c06adad 100644 --- a/module/data/chat-message/dualityRoll.mjs +++ b/module/data/chat-message/dualityRoll.mjs @@ -1,4 +1,4 @@ -import { DualityRollColor } from "../settings/Appearance.mjs"; +import { DualityRollColor } from '../settings/Appearance.mjs'; const fields = foundry.data.fields; const diceField = () => @@ -23,8 +23,7 @@ export default class DHDualityRoll extends foundry.abstract.TypeDataModel { modifiers: new fields.ArrayField( new fields.SchemaField({ value: new fields.NumberField({ integer: true }), - label: new fields.StringField({}), - title: new fields.StringField({}) + label: new fields.StringField({}) }) ), hope: diceField(), diff --git a/module/documents/actor.mjs b/module/documents/actor.mjs index 78116f1c..f378f4f0 100644 --- a/module/documents/actor.mjs +++ b/module/documents/actor.mjs @@ -144,18 +144,24 @@ export default class DhpActor extends Actor { fearDice = 'd12', advantageDice = 'd6', disadvantageDice = 'd6', - advantage = config.event.altKey ?? config.event.ctrlKey ? false : null, + advantage = config.event.altKey ? true : config.event.ctrlKey ? false : null, targets, damage = config.damage, - modifiers = this.formatRollModifier(config.roll.modifier), + modifiers = this.formatRollModifier(config.roll), rollConfig, formula, hope, fear; - + if (!config.event.shiftKey && !config.event.altKey && !config.event.ctrlKey) { const dialogClosed = new Promise((resolve, _) => { - this.type === 'character' ? new RollSelectionDialog(this.system.experiences, this.system.resources.hope.value, resolve).render(true) : new NpcRollSelectionDialog(this.system.experiences, resolve).render(true); + this.type === 'character' + ? new RollSelectionDialog( + this.system.experiences, + this.system.resources.hope.value, + resolve + ).render(true) + : new NpcRollSelectionDialog(this.system.experiences, resolve).render(true); }); rollConfig = await dialogClosed; @@ -164,7 +170,7 @@ export default class DhpActor extends Actor { advantage = rollConfig.advantage; hopeDice = rollConfig.hope; fearDice = rollConfig.fear; - + rollConfig.experiences.forEach(x => modifiers.push({ value: x.value, @@ -173,7 +179,7 @@ export default class DhpActor extends Actor { }) ); - if(this.type === 'character') { + if (this.type === 'character') { const automateHope = await game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope); if (automateHope && result.hopeUsed) { @@ -184,30 +190,36 @@ export default class DhpActor extends Actor { } } - if(this.type === 'character') { - formula = `1${hopeDice} + 1${fearDice}${advantage === true ? ` + 1d6` : advantage === false ? ` - 1d6` : ''}` + if (this.type === 'character') { + formula = `1${hopeDice} + 1${fearDice}${advantage === true ? ` + 1d6` : advantage === false ? ` - 1d6` : ''}`; } else { - formula = `${advantage === true || advantage === false ? 2 : 1}d20${advantage === true ? 'kh' : advantage === false ? 'kl' : ''}` + formula = `${advantage === true || advantage === false ? 2 : 1}d20${advantage === true ? 'kh' : advantage === false ? 'kl' : ''}`; } formula += ` ${modifiers.map(x => `+ ${x.value}`).join(' ')}`; const roll = await Roll.create(formula).evaluate(); - if(this.type === 'character') { + if (this.type === 'character') { setDiceSoNiceForDualityRoll(roll, advantageDice, disadvantageDice); hope = roll.dice[0].results[0].result; fear = roll.dice[1].results[0].result; - if(game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope) && config.roll.type === 'action') { - if(hope > fear) { + if ( + game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.Automation.Hope) && + config.roll.type === 'action' + ) { + if (hope > fear) { await this.update({ 'system.resources.hope.value': Math.min( this.system.resources.hope.value + 1, this.system.resources.hope.max ) }); - } else if(hope === fear) { + } else if (hope === fear) { await this.update({ 'system.resources': { - 'hope.value': Math.min(this.system.resources.hope.value + 1, this.system.resources.hope.max), + 'hope.value': Math.min( + this.system.resources.hope.value + 1, + this.system.resources.hope.max + ), 'stress.value': Math.max(this.system.resources.stress.value - 1, 0) } }); @@ -215,7 +227,7 @@ export default class DhpActor extends Actor { } } - if(config.checkTarget) { + if (config.checkTarget) { targets = Array.from(game.user.targets).map(x => ({ id: x.id, name: x.actor.name, @@ -225,7 +237,7 @@ export default class DhpActor extends Actor { })); } - if(config.chatMessage) { + if (config.chatMessage) { const configRoll = { title: config.title, origin: this.id, @@ -233,46 +245,42 @@ export default class DhpActor extends Actor { modifiers, advantageState: advantage }; - if(this.type === 'character') { + if (this.type === 'character') { configRoll.hope = { dice: hopeDice, value: hope }; configRoll.fear = { dice: fearDice, value: fear }; - configRoll.advantage = { dice: advantageDice, value: roll.dice[2]?.results[0].result ?? null } + configRoll.advantage = { dice: advantageDice, value: roll.dice[2]?.results[0].result ?? null }; /* advantage: { dice: advantageDice, value: advantage }, disadvantage: { dice: disadvantageDice, value: disadvantage } */ } - if(damage) configRoll.damage = damage; - if(targets) configRoll.targets = targets; - const systemData = this.type === 'character' && !config.roll.simple ? new DHDualityRoll(configRoll) : configRoll, - cls = getDocumentClass('ChatMessage'), - msg = new cls({ - type: config.chatMessage.type ?? 'dualityRoll', - sound: config.chatMessage.mute ? null : CONFIG.sounds.dice, - system: systemData, - // user: config.chatMessage.user ?? game.user.id, - content: await foundry.applications.handlebars.renderTemplate( - config.chatMessage.template, - systemData - ), - rolls: [roll] - }); + if (damage) configRoll.damage = damage; + if (targets) configRoll.targets = targets; + const systemData = + this.type === 'character' && !config.roll.simple ? new DHDualityRoll(configRoll) : configRoll, + cls = getDocumentClass('ChatMessage'), + msg = new cls({ + type: config.chatMessage.type ?? 'dualityRoll', + sound: config.chatMessage.mute ? null : CONFIG.sounds.dice, + system: systemData, + content: config.chatMessage.template, + rolls: [roll] + }); await cls.create(msg.toObject()); } return roll; } - formatRollModifier(modifier) { - return modifier.value !== null ? [ - { - value: modifier.value ? Number.parseInt(modifier.value) : 0, - label: - modifier.value >= 0 - ? `${modifier.title} +${modifier.value}` - : `${modifier.title} ${modifier.value}`, - title: modifier.title - } - ] - : []; + formatRollModifier(roll) { + const modifier = roll.modifier !== null ? Number.parseInt(roll.modifier) : null; + return modifier !== null + ? [ + { + value: modifier, + label: modifier >= 0 ? `${roll.label} +${modifier}` : `${roll.label} ${modifier}`, + title: roll.label + } + ] + : []; } // Delete when new roll logic test done diff --git a/module/enrichers/DualityRollEnricher.mjs b/module/enrichers/DualityRollEnricher.mjs index 93c3a999..6c5ca961 100644 --- a/module/enrichers/DualityRollEnricher.mjs +++ b/module/enrichers/DualityRollEnricher.mjs @@ -9,13 +9,13 @@ export function dualityRollEnricher(match, _options) { } export function getDualityMessage(roll) { - const attributeLabel = - roll.attribute && abilities[roll.attribute] + const traitLabel = + roll.trait && abilities[roll.trait] ? game.i18n.format('DAGGERHEART.General.Check', { - check: game.i18n.localize(abilities[roll.attribute].label) + check: game.i18n.localize(abilities[roll.trait].label) }) : null; - const label = attributeLabel ?? game.i18n.localize('DAGGERHEART.General.Duality'); + const label = traitLabel ?? game.i18n.localize('DAGGERHEART.General.Duality'); const dualityElement = document.createElement('span'); dualityElement.innerHTML = ` @@ -23,7 +23,7 @@ export function getDualityMessage(roll) { data-label="${label}" data-hope="${roll.hope ?? 'd12'}" data-fear="${roll.fear ?? 'd12'}" - ${roll.attribute && abilities[roll.attribute] ? `data-attribute="${roll.attribute}"` : ''} + ${roll.trait && abilities[roll.trait] ? `data-trait="${roll.trait}"` : ''} ${roll.advantage ? 'data-advantage="true"' : ''} ${roll.disadvantage ? 'data-disadvantage="true"' : ''} > diff --git a/templates/chat/duality-roll.hbs b/templates/chat/duality-roll.hbs index 6995b248..5222e4b8 100644 --- a/templates/chat/duality-roll.hbs +++ b/templates/chat/duality-roll.hbs @@ -79,7 +79,7 @@