diff --git a/daggerheart.mjs b/daggerheart.mjs index 872da5f3..da04334c 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -8,7 +8,7 @@ import { getCommandTarget, rollCommandToJSON } from './module/helpers/utils.mjs' import { NarrativeCountdowns } from './module/applications/ui/countdowns.mjs'; import { DualityRollColor } from './module/data/settings/Appearance.mjs'; import { DHRoll, DualityRoll, D20Roll, DamageRoll, DualityDie } from './module/dice/_module.mjs'; -import { renderDualityButton } from './module/enrichers/DualityRollEnricher.mjs'; +import { enrichedDualityRoll, renderDualityButton } from './module/enrichers/DualityRollEnricher.mjs'; import { renderMeasuredTemplate } from './module/enrichers/TemplateEnricher.mjs'; import { registerCountdownHooks } from './module/data/countdowns.mjs'; import { @@ -188,49 +188,21 @@ Hooks.on('chatMessage', (_, message) => { } const traitValue = rollCommand.trait?.toLowerCase(); - const advantageState = rollCommand.advantage ? true : rollCommand.disadvantage ? false : null; + const advantage = rollCommand.advantage + ? CONFIG.DH.ACTIONS.advandtageState.advantage.value + : rollCommand.disadvantage + ? CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + : undefined; + const difficulty = rollCommand.difficulty; - // Target not required if an attribute is not used. - const target = traitValue ? getCommandTarget() : undefined; - if (target || !traitValue) { - new Promise(async (resolve, reject) => { - const trait = target ? target.system.traits[traitValue] : undefined; - if (traitValue && !trait) { - ui.notifications.error(game.i18n.localize('DAGGERHEART.UI.Notifications.attributeFaulty')); - reject(); - return; - } - - const title = traitValue - ? game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { - ability: game.i18n.localize(SYSTEM.ACTOR.abilities[traitValue].label) - }) - : game.i18n.localize('DAGGERHEART.GENERAL.duality'); - - const config = { - title: title, - roll: { - trait: traitValue - }, - data: { - traits: { - [traitValue]: trait - } - }, - source: target, - hasSave: false, - dialog: { configure: false }, - evaluate: true, - advantage: rollCommand.advantage == true, - disadvantage: rollCommand.disadvantage == true - }; - - await CONFIG.Dice.daggerheart['DualityRoll'].build(config); - - resolve(); - }); - } + const target = getCommandTarget(); + const title = traitValue + ? game.i18n.format('DAGGERHEART.UI.Chat.dualityRoll.abilityCheckTitle', { + ability: game.i18n.localize(SYSTEM.ACTOR.abilities[traitValue].label) + }) + : game.i18n.localize('DAGGERHEART.GENERAL.duality'); + enrichedDualityRoll({ traitValue, target, difficulty, title, label: 'test', actionType: null, advantage }); return false; } }); diff --git a/lang/en.json b/lang/en.json index ae6ccdf4..017d542d 100755 --- a/lang/en.json +++ b/lang/en.json @@ -1196,6 +1196,7 @@ }, "Roll": { "attack": "Attack Roll", + "difficulty": "Roll (Difficulty {difficulty})", "primaryWeaponAttack": "Primary Weapon Attack Roll", "secondaryWeaponAttack": "Secondary Weapon Attack Roll", "spellcast": "Spellcast Roll", @@ -1310,6 +1311,7 @@ "single": "Experience", "plural": "Experiences" }, + "failure": "Failure", "fear": "Fear", "features": "Features", "formula": "Formula", @@ -1345,6 +1347,7 @@ "scalable": "Scalable", "situationalBonus": "Situational Bonus", "stress": "Stress", + "success": "Success", "take": "Take", "Target": { "single": "Target", diff --git a/module/documents/chatMessage.mjs b/module/documents/chatMessage.mjs index 409b4dd0..46f95633 100644 --- a/module/documents/chatMessage.mjs +++ b/module/documents/chatMessage.mjs @@ -1,10 +1,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage { async renderHTML() { if (this.system.messageTemplate) - this.content = await foundry.applications.handlebars.renderTemplate( - this.system.messageTemplate, - this.system - ); + this.content = await foundry.applications.handlebars.renderTemplate(this.system.messageTemplate, { + ...this.system, + _source: this.system._source + }); /* We can change to fully implementing the renderHTML function if needed, instead of augmenting it. */ const html = await super.renderHTML(); diff --git a/module/enrichers/DualityRollEnricher.mjs b/module/enrichers/DualityRollEnricher.mjs index a2da2805..dde82a48 100644 --- a/module/enrichers/DualityRollEnricher.mjs +++ b/module/enrichers/DualityRollEnricher.mjs @@ -21,19 +21,34 @@ function getDualityMessage(roll) { ? game.i18n.localize(abilities[roll.trait].label) : game.i18n.localize('DAGGERHEART.GENERAL.duality'); + const advantage = roll.advantage + ? CONFIG.DH.ACTIONS.advandtageState.advantage.value + : roll.disadvantage + ? CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + : undefined; + const advantageLabel = + advantage === CONFIG.DH.ACTIONS.advandtageState.advantage.value + ? 'Advantage' + : advantage === CONFIG.DH.ACTIONS.advandtageState.disadvantage.value + ? 'Disadvantage' + : undefined; + const dualityElement = document.createElement('span'); dualityElement.innerHTML = ` `; @@ -43,16 +58,39 @@ function getDualityMessage(roll) { export const renderDualityButton = async event => { const button = event.currentTarget, traitValue = button.dataset.trait?.toLowerCase(), - target = getCommandTarget(); + target = getCommandTarget(), + difficulty = button.dataset.difficulty, + advantage = button.dataset.advantage ? Number(button.dataset.advantage) : undefined; + + await enrichedDualityRoll( + { + traitValue, + target, + difficulty, + title: button.dataset.title, + label: button.dataset.label, + actionType: button.dataset.actionType, + advantage + }, + event + ); +}; + +export const enrichedDualityRoll = async ( + { traitValue, target, difficulty, title, label, actionType, advantage }, + event +) => { if (!target) return; const config = { - event: event, - title: button.dataset.title, + event: event ?? {}, + title: title, roll: { modifier: traitValue ? target.system.traits[traitValue].value : null, - label: button.dataset.label, - type: button.dataset.actionType ?? null // Need check + label: label, + difficulty: difficulty, + advantage, + type: actionType ?? null // Need check, }, chatMessage: { template: 'systems/daggerheart/templates/ui/chat/duality-roll.hbs' diff --git a/styles/less/dialog/dice-roll/roll-selection.less b/styles/less/dialog/dice-roll/roll-selection.less index af6c3c20..5e36990e 100644 --- a/styles/less/dialog/dice-roll/roll-selection.less +++ b/styles/less/dialog/dice-roll/roll-selection.less @@ -131,13 +131,17 @@ display: flex; align-items: center; gap: 16px; + height: 32px; .roll-mode-select { width: min-content; + height: 100%; } button { flex: 1; + height: 100%; + font-family: @font-body; } } } diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index ca918145..e3129e30 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -136,14 +136,22 @@ {{/unless}} + {{localize "DAGGERHEART.GENERAL.formula"}}: {{@root.formula}} +
{{else}} diff --git a/templates/ui/chat/duality-roll.hbs b/templates/ui/chat/duality-roll.hbs index 5e67d3a3..8076e093 100644 --- a/templates/ui/chat/duality-roll.hbs +++ b/templates/ui/chat/duality-roll.hbs @@ -140,7 +140,17 @@
-
{{roll.result.label}}
+
+ {{#unless (eq _source.roll.success undefined)}} + {{#if _source.roll.success}} + {{localize "DAGGERHEART.GENERAL.success"}} {{localize "DAGGERHEART.GENERAL.withThing" thing=roll.result.label}} + {{else}} + {{localize "DAGGERHEART.GENERAL.failure"}} {{localize "DAGGERHEART.GENERAL.withThing" thing=roll.result.label}} + {{/if}} + {{else}} + {{roll.result.label}} + {{/unless}} +
{{roll.total}}