From 2d832e74d49e776ed65874027eca9c96138414f5 Mon Sep 17 00:00:00 2001 From: IrkTheImp <41175833+IrkTheImp@users.noreply.github.com> Date: Fri, 23 May 2025 18:19:37 -0500 Subject: [PATCH] modify ruler and token ruler to show distance ranges (#40) --- daggerheart.mjs | 2 ++ module/applications/settings.mjs | 2 +- module/ui/ruler.mjs | 15 +++++++++----- module/ui/tokenRuler.mjs | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 module/ui/tokenRuler.mjs diff --git a/daggerheart.mjs b/daggerheart.mjs index de8cbe4f..dfe8902b 100644 --- a/daggerheart.mjs +++ b/daggerheart.mjs @@ -9,6 +9,7 @@ import { registerDHPSettings } from './module/applications/settings.mjs'; import DhpChatLog from './module/ui/chatLog.mjs'; import DhpPlayers from './module/ui/players.mjs'; import DhpRuler from './module/ui/ruler.mjs'; +import DhpTokenRuler from './module/ui/tokenRuler.mjs'; globalThis.SYSTEM = SYSTEM; @@ -83,6 +84,7 @@ Hooks.once('init', () => { CONFIG.ui.combat = DhpCombatTracker; CONFIG.ui.chat = DhpChatLog; CONFIG.ui.players = DhpPlayers; + CONFIG.Token.rulerClass = DhpTokenRuler; game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent); diff --git a/module/applications/settings.mjs b/module/applications/settings.mjs index 1c2613f1..d66a2460 100644 --- a/module/applications/settings.mjs +++ b/module/applications/settings.mjs @@ -204,7 +204,7 @@ export const registerDHPSettings = () => { config: false, type: Object, default: { - enabled: false, + enabled: true, melee: 5, veryClose: 15, close: 30, diff --git a/module/ui/ruler.mjs b/module/ui/ruler.mjs index a12f3616..2c6848d2 100644 --- a/module/ui/ruler.mjs +++ b/module/ui/ruler.mjs @@ -1,12 +1,17 @@ export default class DhpRuler extends foundry.canvas.interaction.Ruler { - _getSegmentLabel(segment, totalDistance) { + _getWaypointLabelContext(waypoint, state) { + const context = super._getWaypointLabelContext(waypoint, state); + if (!context) return; + const range = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement); - if (!range.enabled) return super._getSegmentLabel(segment, totalDistance); - const segmentDistance = Math.round(segment.distance * 100) / 100; - const totalDistanceValue = Math.round(totalDistance * 100) / 100; + if (range.enabled) { + const distance = this.#getRangeLabel(waypoint.measurement.distance.toNearest(0.01), range); + context.cost = { total: distance, units: null }; + context.distance = { total: distance, units: null }; + } - return `${this.#getRangeLabel(segmentDistance, range)} [${this.#getRangeLabel(totalDistanceValue, range)}]`; + return context; } #getRangeLabel(distance, settings) { diff --git a/module/ui/tokenRuler.mjs b/module/ui/tokenRuler.mjs new file mode 100644 index 00000000..4faa516e --- /dev/null +++ b/module/ui/tokenRuler.mjs @@ -0,0 +1,34 @@ +export default class DhpTokenRuler extends foundry.canvas.placeables.tokens.TokenRuler { + _getWaypointLabelContext(waypoint, state) { + const context = super._getWaypointLabelContext(waypoint, state); + if (!context) return; + + const range = game.settings.get(SYSTEM.id, SYSTEM.SETTINGS.gameSettings.General.RangeMeasurement); + + if (range.enabled) { + const distance = this.#getRangeLabel(waypoint.measurement.distance.toNearest(0.01), range); + context.cost = { total: distance, units: null }; + context.distance = { total: distance, units: null }; + } + + return context; + } + + #getRangeLabel(distance, settings) { + if (distance <= settings.melee) { + return game.i18n.localize('DAGGERHEART.Range.Melee.Name'); + } + if (distance <= settings.veryClose) { + return game.i18n.localize('DAGGERHEART.Range.VeryClose.Name'); + } + if (distance <= settings.close) { + return game.i18n.localize('DAGGERHEART.Range.Close.Name'); + } + if (distance <= settings.far) { + return game.i18n.localize('DAGGERHEART.Range.Far.Name'); + } + if (distance <= settings.veryFar) { + return game.i18n.localize('DAGGERHEART.Range.VeryFar.Name'); + } + } +}