From 286aaf7adabb6923531bdf878f36e9d1c1c812ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Tue, 11 May 2021 19:01:51 +0200 Subject: [PATCH] Properly store terrain ruler's state in the movement history --- CHANGELOG.md | 3 +++ src/compatibility.js | 9 +++++---- src/foundry_imports.js | 4 +++- src/movement_tracking.js | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6777dec..4042349 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ ### New features - Drag Ruler can now measure difficult terrain on gridless maps (if the Terrain Ruler module is installed and enabled) +### Bugfixes +- Fixed a bug that sometimes measured diagonals incorrectly with the 5/10/5 grid rule + ### Translation - Corrected typos in the german translation (thanks to CarnVanBeck!) diff --git a/src/compatibility.js b/src/compatibility.js index 6e80fb6..9ce5ab4 100644 --- a/src/compatibility.js +++ b/src/compatibility.js @@ -15,10 +15,12 @@ export function highlightMeasurementTerrainRuler(ray, startDistance, tokenShape= } } -export function measureDistances(segments, token, shape, gridSpaces=true, options={}) { +export function measureDistances(segments, token, shape, options={}) { const opts = duplicate(options) - opts.gridSpaces = gridSpaces; + if (!opts.gridSpaces) + opts.gridSpaces = true; const terrainRulerAvailable = game.modules.get("terrain-ruler")?.active && (!game.modules.get("TerrainLayer")?.active || canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS); + if (terrainRulerAvailable) { const firstNewSegmentIndex = segments.findIndex(segment => !segment.ray.dragRulerVisitedSpaces); const previousSegments = segments.slice(0, firstNewSegmentIndex); @@ -27,7 +29,7 @@ export function measureDistances(segments, token, shape, gridSpaces=true, option previousSegments.forEach(segment => segment.ray.terrainRulerVisitedSpaces = duplicate(segment.ray.dragRulerVisitedSpaces)); opts.costFunction = (x, y) => getCostFromSpeedProvider(token, getAreaFromPositionAndShape({x, y}, shape), {x, y}); if (previousSegments.length > 0) - opts.terrainRulerInitialState = previousSegments[previousSegments.length - 1]; + opts.terrainRulerInitialState = previousSegments[previousSegments.length - 1].ray.dragRulerFinalState; return distances.concat(terrainRuler.measureDistances(newSegments, opts)); } else { @@ -83,4 +85,3 @@ export function checkDependencies() { } } } - diff --git a/src/foundry_imports.js b/src/foundry_imports.js index c3c39f5..720e6cb 100644 --- a/src/foundry_imports.js +++ b/src/foundry_imports.js @@ -156,6 +156,8 @@ export function measure(destination, {gridSpaces=true, snap=false} = {}) { centeredRay.isPrevious = ray.isPrevious; ray.dragRulerVisitedSpaces = origin.dragRulerVisitedSpaces; centeredRay.dragRulerVisitedSpaces = ray.dragRulerVisitedSpaces; + ray.dragRulerFinalState = origin.dragRulerFinalState; + centeredRay.dragRulerFinalState = ray.dragRulerFinalState; if (ray.distance < 10) { if (label) label.visible = false; continue; @@ -168,7 +170,7 @@ export function measure(destination, {gridSpaces=true, snap=false} = {}) { const shape = getTokenShape(this.draggedToken) // Compute measured distance - const distances = measureDistances(centeredSegments, this.draggedToken, shape, gridSpaces); + const distances = measureDistances(centeredSegments, this.draggedToken, shape, {gridSpaces}); let totalDistance = 0; for (let [i, d] of distances.entries()) { diff --git a/src/movement_tracking.js b/src/movement_tracking.js index 03e078d..5bcb795 100644 --- a/src/movement_tracking.js +++ b/src/movement_tracking.js @@ -56,9 +56,9 @@ function calculateUpdate(combat, token, rays) { // Ignore rays that have the same start and end coordinates if (ray.A.x !== ray.B.x || ray.A.y !== ray.B.y) { if (terrainRulerAvailable) { - measureDistances([{ray}], token, getTokenShape(token), true, {terrainRulerInitialState: dragRulerFlags.rulerState}); + measureDistances([{ray}], token, getTokenShape(token), {terrainRulerInitialState: waypoints[waypoints.length - 1]?.dragRulerFinalState}); ray.A.dragRulerVisitedSpaces = ray.terrainRulerVisitedSpaces; - dragRulerFlags.rulerState = ray.terrainRulerFinalState; + ray.A.dragRulerFinalState = ray.terrainRulerFinalState; } waypoints.push(ray.A); }