From 60b55619e1035e5a10509e22055af079a76ac946 Mon Sep 17 00:00:00 2001 From: Chris Ryan <73275196+chrisryan10@users.noreply.github.com> Date: Fri, 22 Aug 2025 01:05:09 +1000 Subject: [PATCH] [PR] [Feature] 652 Allow override range measurement settings (#1030) * Look for rangeMeasurementSettingsOverride on the scene to switch off DH global range measurement settings. * Part progress on adding config tab to scene config * Hard coded template; no value applied/saved * Flag fix * Use the flags setting * Clean up * Remove import * Better initialisation of PARTS and TABS * Fix localisation --------- Co-authored-by: Chris Ryan Co-authored-by: WBHarry --- daggerheart.mjs | 5 ++++ lang/en.json | 11 +++++++ module/applications/_module.mjs | 1 + module/applications/scene/_module.mjs | 1 + .../scene/sceneConfigSettings.mjs | 25 ++++++++++++++++ module/canvas/placeables/measuredTemplate.mjs | 30 +++++++++++++------ module/canvas/placeables/ruler.mjs | 6 ++-- module/canvas/placeables/tokenRuler.mjs | 6 ++-- module/systemRegistration/handlebars.mjs | 3 ++ templates/scene/dh-config.hbs | 9 ++++++ 10 files changed, 82 insertions(+), 15 deletions(-) create mode 100644 module/applications/scene/_module.mjs create mode 100644 module/applications/scene/sceneConfigSettings.mjs create mode 100644 templates/scene/dh-config.hbs diff --git a/daggerheart.mjs b/daggerheart.mjs index 795764cc..9ed5feb1 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -145,6 +145,11 @@ Hooks.once('init', () => { // Make Compendium Dialog resizable foundry.applications.sidebar.apps.Compendium.DEFAULT_OPTIONS.window.resizable = true; + DocumentSheetConfig.registerSheet(foundry.documents.Scene, SYSTEM.id, applications.scene.DhSceneConfigSettings, { + makeDefault: true, + label: 'Daggerheart' + }); + settingsRegistration.registerDHSettings(); RegisterHandlebarsHelpers.registerHelpers(); diff --git a/lang/en.json b/lang/en.json index a7a615f5..d8a4b08f 100755 --- a/lang/en.json +++ b/lang/en.json @@ -26,6 +26,14 @@ "CONTROLS": { "inFront": "In Front" }, + "SCENE": { + "TABS": { + "SHEET": { + "dh": "Daggerheart" + } + } + }, + "DAGGERHEART": { "ACTIONS": { "TYPES": { @@ -2283,6 +2291,9 @@ "ResetSettings": { "resetConfirmationTitle": "Reset Settings", "resetConfirmationText": "Are you sure you want to reset the {settings}?" + }, + "Scene": { + "rangeMeasurementOverride": "Override Global Range Measurement Settings" } }, "UI": { diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index d4ceb229..3dd0c78f 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -2,6 +2,7 @@ export * as characterCreation from './characterCreation/_module.mjs'; export * as dialogs from './dialogs/_module.mjs'; export * as hud from './hud/_module.mjs'; export * as levelup from './levelup/_module.mjs'; +export * as scene from './scene/_module.mjs'; export * as settings from './settings/_module.mjs'; export * as sheets from './sheets/_module.mjs'; export * as sheetConfigs from './sheets-configs/_module.mjs'; diff --git a/module/applications/scene/_module.mjs b/module/applications/scene/_module.mjs new file mode 100644 index 00000000..6dc59081 --- /dev/null +++ b/module/applications/scene/_module.mjs @@ -0,0 +1 @@ +export { default as DhSceneConfigSettings } from './sceneConfigSettings.mjs'; \ No newline at end of file diff --git a/module/applications/scene/sceneConfigSettings.mjs b/module/applications/scene/sceneConfigSettings.mjs new file mode 100644 index 00000000..2ad7421a --- /dev/null +++ b/module/applications/scene/sceneConfigSettings.mjs @@ -0,0 +1,25 @@ +export default class DhSceneConfigSettings extends foundry.applications.sheets.SceneConfig { + constructor(options, ...args) { + super(options, ...args); + } + + static buildParts() { + const { footer, ...parts } = super.PARTS; + const tmpParts = { + ...parts, + dh: { template: "systems/daggerheart/templates/scene/dh-config.hbs" }, + footer + } + return tmpParts; + } + + static PARTS = DhSceneConfigSettings.buildParts(); + + static buildTabs() { + super.TABS.sheet.tabs.push({ id: "dh", icon: "fa-solid" }); + return super.TABS; + } + + static TABS = DhSceneConfigSettings.buildTabs(); + +} \ No newline at end of file diff --git a/module/canvas/placeables/measuredTemplate.mjs b/module/canvas/placeables/measuredTemplate.mjs index c9950650..49142685 100644 --- a/module/canvas/placeables/measuredTemplate.mjs +++ b/module/canvas/placeables/measuredTemplate.mjs @@ -10,29 +10,41 @@ export default class DhMeasuredTemplate extends foundry.canvas.placeables.Measur const splitRulerText = this.ruler.text.split(' '); if (splitRulerText.length > 0) { const rulerValue = Number(splitRulerText[0]); - const vagueLabel = this.constructor.getDistanceLabel(rulerValue, rangeMeasurementSettings); - this.ruler.text = vagueLabel; + const result = this.constructor.getRangeLabels(rulerValue, rangeMeasurementSettings); + this.ruler.text = result.distance + result.units ? (' ' + result.units) : ''; } } } - static getDistanceLabel(distance, settings) { + static getRangeLabels(distance, settings) { + let result = { distance: '', units: null } + const rangeMeasurementOverride = canvas.scene.flags.daggerheart?.rangeMeasurementOverride; + + if (rangeMeasurementOverride === true) { + result.distance = distance; + result.units = canvas.scene?.grid?.units; + return result + } if (distance <= settings.melee) { - return game.i18n.localize('DAGGERHEART.CONFIG.Range.melee.name'); + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.melee.name'); + return result; } if (distance <= settings.veryClose) { - return game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name'); + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryClose.name'); + return result; } if (distance <= settings.close) { - return game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name'); + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.close.name'); + return result; } if (distance <= settings.far) { - return game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.far.name'); + return result; } if (distance > settings.far) { - return game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); + result.distance = game.i18n.localize('DAGGERHEART.CONFIG.Range.veryFar.name'); } - return ''; + return result; } } diff --git a/module/canvas/placeables/ruler.mjs b/module/canvas/placeables/ruler.mjs index 6585a1cd..6e2f220d 100644 --- a/module/canvas/placeables/ruler.mjs +++ b/module/canvas/placeables/ruler.mjs @@ -8,9 +8,9 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler { const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; if (range.enabled) { - const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range); - context.cost = { total: distance, units: null }; - context.distance = { total: distance, units: null }; + const result = DhMeasuredTemplate.getRangeLabels(waypoint.measurement.distance.toNearest(0.01), range); + context.cost = { total: result.distance, units: result.units }; + context.distance = { total: result.distance, units: result.units }; } return context; diff --git a/module/canvas/placeables/tokenRuler.mjs b/module/canvas/placeables/tokenRuler.mjs index ff8fc0d5..056953f8 100644 --- a/module/canvas/placeables/tokenRuler.mjs +++ b/module/canvas/placeables/tokenRuler.mjs @@ -8,9 +8,9 @@ export default class DhpTokenRuler extends foundry.canvas.placeables.tokens.Toke const range = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.variantRules).rangeMeasurement; if (range.enabled) { - const distance = DhMeasuredTemplate.getDistanceLabel(waypoint.measurement.distance.toNearest(0.01), range); - context.cost = { total: distance, units: null }; - context.distance = { total: distance, units: null }; + const result = DhMeasuredTemplate.getRangeLabels(waypoint.measurement.distance.toNearest(0.01), range); + context.cost = { total: result.distance, units: result.units }; + context.distance = { total: result.distance, units: result.units }; } return context; diff --git a/module/systemRegistration/handlebars.mjs b/module/systemRegistration/handlebars.mjs index ff741b91..cb7be42a 100644 --- a/module/systemRegistration/handlebars.mjs +++ b/module/systemRegistration/handlebars.mjs @@ -35,5 +35,8 @@ export const preloadHandlebarsTemplates = async function () { 'systems/daggerheart/templates/ui/chat/parts/damage-part.hbs', 'systems/daggerheart/templates/ui/chat/parts/target-part.hbs', 'systems/daggerheart/templates/ui/chat/parts/button-part.hbs', + + 'systems/daggerheart/templates/scene/dh-config.hbs', + ]); }; diff --git a/templates/scene/dh-config.hbs b/templates/scene/dh-config.hbs new file mode 100644 index 00000000..0d20c302 --- /dev/null +++ b/templates/scene/dh-config.hbs @@ -0,0 +1,9 @@ +
+
+
+ + +
+
+
\ No newline at end of file