diff --git a/daggerheart.mjs b/daggerheart.mjs index b1b2a0ca..f75ff1da 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -309,7 +309,7 @@ Hooks.on('chatMessage', (_, message) => { ? CONFIG.DH.ACTIONS.advantageState.disadvantage.value : undefined; const difficulty = rollCommand.difficulty; - const grantResources = Boolean(rollCommand.grantResources); + const grantResources = rollCommand.grantResources; const target = getCommandTarget({ allowNull: true }); const title = diff --git a/lang/en.json b/lang/en.json index 4d6815c3..e358977f 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2111,7 +2111,6 @@ "tier4": "tier 4", "domains": "Domains", "downtime": "Downtime", - "itemFeatures": "Item Features", "roll": "Roll", "rules": "Rules", "partyMembers": "Party Members", @@ -2120,7 +2119,8 @@ "questions": "Questions", "configuration": "Configuration", "base": "Base", - "triggers": "Triggers" + "triggers": "Triggers", + "deathMoves": "Deathmoves" }, "Tiers": { "singular": "Tier", @@ -2144,6 +2144,7 @@ "armorSlots": "Armor Slots", "artistAttribution": "Artwork By: {artist}", "attack": "Attack", + "automation": "Automation", "basics": "Basics", "bonus": "Bonus", "burden": "Burden", diff --git a/module/applications/dialogs/deathMove.mjs b/module/applications/dialogs/deathMove.mjs index 3eadede6..a9141158 100644 --- a/module/applications/dialogs/deathMove.mjs +++ b/module/applications/dialogs/deathMove.mjs @@ -43,7 +43,7 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV return context; } - async handleAvoidDeath() { + async handleAvoidDeath(useAutomation) { const target = this.actor.uuid; const config = await enrichedFateRoll({ target, @@ -53,6 +53,7 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV }); if (!config.roll.fate) return; + if (!useAutomation) return ''; let returnMessage = game.i18n.localize('DAGGERHEART.UI.Chat.deathMove.avoidScar'); if (config.roll.fate.value <= this.actor.system.levelData.level.current) { @@ -75,7 +76,7 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV return returnMessage; } - async handleRiskItAll() { + async handleRiskItAll(useAutomation) { const config = await enrichedDualityRoll({ reaction: true, traitValue: null, @@ -90,6 +91,7 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV }); if (!config.roll.result) return; + if (!useAutomation) return ''; const clearAllStressAndHitpointsUpdates = [ { key: 'hitPoints', clear: true }, @@ -128,7 +130,9 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV return chatMessage; } - async handleBlazeOfGlory() { + async handleBlazeOfGlory(useAutomation) { + if (!useAutomation) return ''; + this.actor.createEmbeddedDocuments('ActiveEffect', [ { name: game.i18n.localize('DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name'), @@ -160,19 +164,23 @@ export default class DhDeathMove extends HandlebarsApplicationMixin(ApplicationV let result = ''; + const deathMoveAutomation = game.settings.get( + CONFIG.DH.id, + CONFIG.DH.SETTINGS.gameSettings.Automation + ).deathMoveAutomation; if (CONFIG.DH.GENERAL.deathMoves.blazeOfGlory === this.selectedMove) { - result = await this.handleBlazeOfGlory(); + result = await this.handleBlazeOfGlory(deathMoveAutomation.blazeOfGlory); } if (CONFIG.DH.GENERAL.deathMoves.avoidDeath === this.selectedMove) { - result = await this.handleAvoidDeath(); + result = await this.handleAvoidDeath(deathMoveAutomation.avoidDeath); } if (CONFIG.DH.GENERAL.deathMoves.riskItAll === this.selectedMove) { - result = await this.handleRiskItAll(); + result = await this.handleRiskItAll(deathMoveAutomation.riskItAll); } - if (!result) return; + if (result === undefined) return; const autoExpandDescription = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance) .expandRollMessage?.desc; diff --git a/module/applications/settings/automationSettings.mjs b/module/applications/settings/automationSettings.mjs index 4407897d..e720733e 100644 --- a/module/applications/settings/automationSettings.mjs +++ b/module/applications/settings/automationSettings.mjs @@ -34,7 +34,7 @@ export default class DhAutomationSettings extends HandlebarsApplicationMixin(App tabs: { template: 'systems/daggerheart/templates/sheets/global/tabs/tab-navigation.hbs' }, header: { template: 'systems/daggerheart/templates/settings/automation-settings/header.hbs' }, general: { template: 'systems/daggerheart/templates/settings/automation-settings/general.hbs' }, - rules: { template: 'systems/daggerheart/templates/settings/automation-settings/rules.hbs' }, + rules: { template: 'systems/daggerheart/templates/settings/automation-settings/deathMoves.hbs' }, roll: { template: 'systems/daggerheart/templates/settings/automation-settings/roll.hbs' }, footer: { template: 'systems/daggerheart/templates/settings/automation-settings/footer.hbs' } }; @@ -42,7 +42,7 @@ export default class DhAutomationSettings extends HandlebarsApplicationMixin(App /** @inheritdoc */ static TABS = { main: { - tabs: [{ id: 'general' }, { id: 'rules' }, { id: 'roll' }], + tabs: [{ id: 'general' }, { id: 'deathMoves' }, { id: 'roll' }], initial: 'general', labelPrefix: 'DAGGERHEART.GENERAL.Tabs' } diff --git a/module/data/item/domainCard.mjs b/module/data/item/domainCard.mjs index 327dafce..9a14d45e 100644 --- a/module/data/item/domainCard.mjs +++ b/module/data/item/domainCard.mjs @@ -94,8 +94,10 @@ export default class DHDomainCard extends BaseDataItem { return false; } - if (!this.actor.system.loadoutSlot.available) { + if (!this.actor.system.loadoutSlot.available && !this.loadoutIgnore) { data.system.inVault = true; + await this.updateSource({ inVault: true }); + ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.loadoutMaxReached')); } } } diff --git a/module/data/settings/Automation.mjs b/module/data/settings/Automation.mjs index 436f0eb7..e9952b1c 100644 --- a/module/data/settings/Automation.mjs +++ b/module/data/settings/Automation.mjs @@ -55,6 +55,23 @@ export default class DhAutomation extends foundry.abstract.DataModel { initial: true, label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.resourceScrollTexts.label' }), + deathMoveAutomation: new fields.SchemaField({ + avoidDeath: new fields.BooleanField({ + required: true, + initial: true, + label: 'DAGGERHEART.CONFIG.DeathMoves.avoidDeath.name' + }), + riskItAll: new fields.BooleanField({ + required: true, + initial: true, + label: 'DAGGERHEART.CONFIG.DeathMoves.riskItAll.name' + }), + blazeOfGlory: new fields.BooleanField({ + required: true, + initial: true, + label: 'DAGGERHEART.CONFIG.DeathMoves.blazeOfGlory.name' + }) + }), defeated: new fields.SchemaField({ enabled: new fields.BooleanField({ required: true, diff --git a/module/enrichers/DualityRollEnricher.mjs b/module/enrichers/DualityRollEnricher.mjs index f6de8107..5b66179f 100644 --- a/module/enrichers/DualityRollEnricher.mjs +++ b/module/enrichers/DualityRollEnricher.mjs @@ -86,19 +86,22 @@ export const enrichedDualityRoll = async ( { reaction, traitValue, target, difficulty, title, label, advantage, grantResources, customConfig }, event ) => { + const shouldGrantResources = grantResources === undefined ? true : grantResources; + const config = { event: event ?? {}, title: title, headerTitle: label, + actionType: reaction ? 'reaction' : null, roll: { trait: traitValue && target ? traitValue : null, difficulty: difficulty, - advantage, - type: reaction ? 'reaction' : null + advantage + // type: reaction ? 'reaction' : null //not needed really but keeping it for troubleshooting }, skips: { - resources: !grantResources, - triggers: !grantResources + resources: !shouldGrantResources, + triggers: !shouldGrantResources }, type: 'trait', hasRoll: true, diff --git a/module/helpers/utils.mjs b/module/helpers/utils.mjs index 1cce581a..c0dd45bd 100644 --- a/module/helpers/utils.mjs +++ b/module/helpers/utils.mjs @@ -12,7 +12,7 @@ export function rollCommandToJSON(text) { const flavor = flavorMatch ? flavorMatch[1] : null; // Match key="quoted string" OR key=unquotedValue - const PAIR_RE = /(\w+)=("(?:[^"\\]|\\.)*"|\S+)/g; + const PAIR_RE = /(\w+)\s*=\s*("(?:[^"\\]|\\.)*"|[^\]\}\s]+)/g; //updated regex to allow escaped quotes in quoted strings and avoid matching closing brackets/braces const result = {}; for (const [, key, raw] of text.matchAll(PAIR_RE)) { let value; diff --git a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json index e803fb04..f1596519 100644 --- a/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json +++ b/src/packs/subclasses/feature_Rousing_Speech_PCmYTX02JLzBpgml.json @@ -14,15 +14,7 @@ "description": "

Once per long rest, you can give a heartfelt, inspiring speech. All allies within Far range clear 2 Stress.

", "chatDisplay": false, "actionType": "action", - "cost": [ - { - "scalable": false, - "key": "hitPoints", - "value": 1, - "step": null, - "consumeOnSuccess": false - } - ], + "cost": [], "uses": { "value": null, "max": "1", diff --git a/styles/less/global/elements.less b/styles/less/global/elements.less index e740d917..713a4481 100755 --- a/styles/less/global/elements.less +++ b/styles/less/global/elements.less @@ -54,6 +54,9 @@ input[type='checkbox'], input[type='radio'] { + height: 20px; + width: 20px; + &:checked::after { color: light-dark(@dark, @golden); } diff --git a/styles/less/hud/token-hud/token-hud.less b/styles/less/hud/token-hud/token-hud.less index ea58f673..e31ede4a 100644 --- a/styles/less/hud/token-hud/token-hud.less +++ b/styles/less/hud/token-hud/token-hud.less @@ -2,11 +2,13 @@ .status-effects { .effect-control { filter: none; + background: var(--dark-blue-90); } .effect-control-container { .effect-control { filter: none; + background: var(--dark-blue-90); } .effect-control-disabled-marker { @@ -22,6 +24,7 @@ .palette-category-title { grid-column: span var(--effect-columns); font-weight: bold; + color: light-dark(@dark-blue, @golden); } } } diff --git a/styles/less/ui/chat/chat.less b/styles/less/ui/chat/chat.less index 1b1e3c1c..494af5f1 100644 --- a/styles/less/ui/chat/chat.less +++ b/styles/less/ui/chat/chat.less @@ -82,7 +82,7 @@ } } - &:not(.duality .fate) { + &:not(.duality):not(.fate) { .font-20 { color: @dark; } @@ -176,7 +176,6 @@ } &.fate { - &.hope { --text-color: @golden; --bg-color: @golden-40; @@ -194,7 +193,6 @@ background-color: @chat-blue-bg; } } - } &.duality { diff --git a/styles/less/ui/chat/sheet.less b/styles/less/ui/chat/sheet.less index b632db35..66b539b4 100644 --- a/styles/less/ui/chat/sheet.less +++ b/styles/less/ui/chat/sheet.less @@ -3,68 +3,70 @@ .daggerheart.chat-sidebar.theme-light, #interface.theme-light { - .chat-message:not(.duality) .message-content { - color: @dark; + .chat-message:not(.duality):not(.fate) { + .message-content { + color: @dark; - blockquote { - border-left: 5px solid @dark-blue-40; - } + blockquote { + border-left: 5px solid @dark-blue-40; + } - a[href] { - color: @dark-blue; - } - - a[href]:hover, - a[href].active { - font-weight: bold; - text-shadow: 0 0 8px @dark-blue; - } - - button { - background: transparent; - border: 1px solid @dark-blue; - color: @dark-blue; - - &:hover { - background: @light-black; + a[href] { color: @dark-blue; } - &:disabled { + a[href]:hover, + a[href].active { + font-weight: bold; + text-shadow: 0 0 8px @dark-blue; + } + + button { background: transparent; + border: 1px solid @dark-blue; color: @dark-blue; &:hover { + background: @light-black; + color: @dark-blue; + } + + &:disabled { background: transparent; color: @dark-blue; + + &:hover { + background: transparent; + color: @dark-blue; + } + } + + &.reverted { + background: @dark-blue-10; + color: @dark-blue; + border: 1px solid @dark; + &:hover { + background: transparent; + color: @dark-blue; + } + img { + border-radius: 3px; + } } } - &.reverted { - background: @dark-blue-10; + .roll-buttons button { + height: 40px; + font-family: @font-body; + font-weight: bold; + } + + .dice-roll .dice-formula, + .dice-roll .dice-total { + background: @dark-blue-40; color: @dark-blue; - border: 1px solid @dark; - &:hover { - background: transparent; - color: @dark-blue; - } - img { - border-radius: 3px; - } } } - - .roll-buttons button { - height: 40px; - font-family: @font-body; - font-weight: bold; - } - - .dice-roll .dice-formula, - .dice-roll .dice-total { - background: @dark-blue-40; - color: @dark-blue; - } } } diff --git a/styles/less/ux/tooltip/tooltip.less b/styles/less/ux/tooltip/tooltip.less index 0f632772..8e6f638d 100644 --- a/styles/less/ux/tooltip/tooltip.less +++ b/styles/less/ux/tooltip/tooltip.less @@ -227,16 +227,6 @@ aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip.card-s outline: 1px solid light-dark(@dark-blue, @golden); } -.theme-light #tooltip:has(div.daggerheart.dh-style.tooltip.card-style), -.theme-light aside[role='tooltip']:has(div.daggerheart.dh-style.tooltip.card-style) { - background-image: url('../assets/parchments/dh-parchment-light.png'); -} - -.theme-light aside[role='tooltip'].locked-tooltip:has(div.daggerheart.dh-style.tooltip) { - box-shadow: 0 0 25px @dark-blue-90; - outline: 1px solid light-dark(@dark-blue, @golden); -} - #tooltip, .locked-tooltip, .daggerheart.dh-style.tooltip { diff --git a/system.json b/system.json index 8624bab7..4a5eee0f 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "daggerheart", "title": "Daggerheart", "description": "An unofficial implementation of the Daggerheart system", - "version": "1.6.0", + "version": "1.6.1", "compatibility": { "minimum": "13.346", "verified": "13.351", diff --git a/templates/dialogs/dice-roll/rollSelection.hbs b/templates/dialogs/dice-roll/rollSelection.hbs index 5851a33d..f31a4fa8 100644 --- a/templates/dialogs/dice-roll/rollSelection.hbs +++ b/templates/dialogs/dice-roll/rollSelection.hbs @@ -125,7 +125,6 @@ {{/if}}
- {{#if @root.advantage}} {{localize "DAGGERHEART.GENERAL.Modifier.plural"}}