diff --git a/daggerheart.mjs b/daggerheart.mjs index 5960c6b1..abe12524 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -3,6 +3,7 @@ import * as applications from './module/applications/_module.mjs'; import * as data from './module/data/_module.mjs'; import * as models from './module/data/_module.mjs'; import * as documents from './module/documents/_module.mjs'; +import { macros } from './module/_module.mjs'; import * as collections from './module/documents/collections/_module.mjs'; import * as dice from './module/dice/_module.mjs'; import * as fields from './module/data/fields/_module.mjs'; @@ -93,6 +94,7 @@ Hooks.once('init', () => { data, models, documents, + macros, dice, fields }; diff --git a/lang/en.json b/lang/en.json index 4032b6ed..feeb65b2 100755 --- a/lang/en.json +++ b/lang/en.json @@ -2486,6 +2486,14 @@ "secondaryWeapon": "Secondary Weapon" } }, + "MACROS": { + "Spotlight": { + "errors": { + "noActiveCombat": "There is no active encounter", + "noCombatantSelected": "A combatant token must be either selected or hovered to spotlight it" + } + } + }, "ROLLTABLES": { "FIELDS": { "formulaName": { "label": "Formula Name" } @@ -2725,6 +2733,12 @@ "setResourceIdentifier": "Set Resource Identifier" } }, + "Keybindings": { + "spotlight": { + "name": "Spotlight Combatant", + "hint": "Move the spotlight to a hovered or selected token that's present in an active encounter" + } + }, "Menu": { "title": "Daggerheart Game Settings", "automation": { diff --git a/module/_module.mjs b/module/_module.mjs index 2e1d6fb4..4a00e97c 100644 --- a/module/_module.mjs +++ b/module/_module.mjs @@ -7,3 +7,4 @@ export * as documents from './documents/_module.mjs'; export * as enrichers from './enrichers/_module.mjs'; export * as helpers from './helpers/_module.mjs'; export * as systemRegistration from './systemRegistration/_module.mjs'; +export * as macros from './macros/_modules.mjs'; diff --git a/module/config/settingsConfig.mjs b/module/config/settingsConfig.mjs index 0b28f0ab..c19e6e26 100644 --- a/module/config/settingsConfig.mjs +++ b/module/config/settingsConfig.mjs @@ -1,3 +1,7 @@ +export const keybindings = { + spotlight: 'DHSpotlight' +}; + export const menu = { Automation: { Name: 'GameSettingsAutomation', diff --git a/module/macros/_modules.mjs b/module/macros/_modules.mjs new file mode 100644 index 00000000..d4a5599f --- /dev/null +++ b/module/macros/_modules.mjs @@ -0,0 +1 @@ +export { default as spotlightCombatant } from './spotlightCombatant.mjs'; diff --git a/module/macros/spotlightCombatant.mjs b/module/macros/spotlightCombatant.mjs new file mode 100644 index 00000000..68a26ff9 --- /dev/null +++ b/module/macros/spotlightCombatant.mjs @@ -0,0 +1,21 @@ +/** + * Spotlights a combatant. + * The combatant can be selected in a number of ways. If many are applied at the same time, the following order is used: + * 1) SelectedCombatant + * 2) HoveredCombatant + */ +const spotlightCombatant = () => { + if (!game.combat) + return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noActiveCombat')); + + const selectedCombatant = canvas.tokens.controlled.length > 0 ? canvas.tokens.controlled[0].combatant : null; + const hoveredCombatant = game.canvas.tokens.hover?.combatant; + + const combatant = selectedCombatant ?? hoveredCombatant; + if (!combatant) + return ui.notifications.error(game.i18n.localize('DAGGERHEART.MACROS.Spotlight.errors.noCombatantSelected')); + + ui.combat.setCombatantSpotlight(combatant.id); +}; + +export default spotlightCombatant; diff --git a/module/systemRegistration/settings.mjs b/module/systemRegistration/settings.mjs index e7ec37f5..94ad5da7 100644 --- a/module/systemRegistration/settings.mjs +++ b/module/systemRegistration/settings.mjs @@ -18,6 +18,7 @@ import { import { CompendiumBrowserSettings, DhTagTeamRoll } from '../data/_module.mjs'; export const registerDHSettings = () => { + registerKeyBindings(); registerMenuSettings(); registerMenus(); registerNonConfigSettings(); @@ -33,6 +34,25 @@ export const registerDHSettings = () => { }); }; +export const registerKeyBindings = () => { + game.keybindings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.keybindings.spotlight, { + name: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.name'), + hint: game.i18n.localize('DAGGERHEART.SETTINGS.Keybindings.spotlight.hint'), + uneditable: [], + editable: [ + { + key: 's', + modifiers: [] + } + ], + onDown: game.system.api.macros.spotlightCombatant, + onUp: () => {}, + restricted: true, + reservedModifiers: [], + precedence: CONST.KEYBINDING_PRECEDENCE.NORMAL + }); +}; + const registerMenuSettings = () => { game.settings.register(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules, { scope: 'world', diff --git a/system.json b/system.json index 44c26886..9242a24a 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.9.5", + "version": "1.9.6", "compatibility": { "minimum": "13.346", "verified": "13.351",