diff --git a/src/main.js b/src/main.js index df3033d..6265f2a 100644 --- a/src/main.js +++ b/src/main.js @@ -5,11 +5,11 @@ import {checkDependencies, getHexSizeSupportTokenGridCenter} from "./compatibili import {moveEntities, onMouseMove} from "./foundry_imports.js" import {performMigrations} from "./migration.js" import {DragRulerRuler} from "./ruler.js"; -import {getMovementHistory, resetMovementHistory} from "./movement_tracking.js"; +import {getMovementHistory, removeLastHistoryEntryIfAt, resetMovementHistory} from "./movement_tracking.js"; import {registerSettings, settingsKey} from "./settings.js" import {recalculate} from "./socket.js"; import {SpeedProvider} from "./speed_provider.js" -import {setSnapParameterOnOptions} from "./util.js"; +import {isClose, setSnapParameterOnOptions} from "./util.js"; Hooks.once("init", () => { registerSettings() @@ -17,6 +17,7 @@ Hooks.once("init", () => { hookDragHandlers(Token); hookDragHandlers(MeasuredTemplate); hookKeyboardManagerFunctions() + hookLayerFunctions(); Ruler = DragRulerRuler; @@ -93,6 +94,22 @@ function hookKeyboardManagerFunctions() { } } +function hookLayerFunctions() { + const originalTokenLayerUndoHistory = TokenLayer.prototype.undoHistory; + TokenLayer.prototype.undoHistory = function () { + const historyEntry = this.history[this.history.length - 1]; + return originalTokenLayerUndoHistory.call(this).then((returnValue) => { + if (historyEntry.type === "update") { + for (const entry of historyEntry.data) { + const token = canvas.tokens.get(entry._id); + removeLastHistoryEntryIfAt(token, entry.x, entry.y); + } + } + return returnValue; + }); + } +} + function handleKeys(event, key, up) { if (event.repeat || this.hasFocus) return false diff --git a/src/movement_tracking.js b/src/movement_tracking.js index 9239c9a..6edc92f 100644 --- a/src/movement_tracking.js +++ b/src/movement_tracking.js @@ -1,6 +1,6 @@ import {measureDistances} from "./compatibility.js"; import {recalculate, updateCombatantDragRulerFlags} from "./socket.js"; -import {getTokenShape, zip} from "./util.js"; +import {getTokenShape, isClose, zip} from "./util.js"; function initTrackingFlag(combatant) { const initialFlag = {passedWaypoints: [], trackedRound: 0}; @@ -81,6 +81,20 @@ export function getMovementHistory(token) { return dragRulerFlags.passedWaypoints ?? []; } +export async function removeLastHistoryEntryIfAt(token, x, y) { + const history = getMovementHistory(token); + if (history.length === 0) + return; + const entry = history[history.length - 1]; + if (!isClose(x + token.w / 2, entry.x, 0.1) || !isClose(y + token.h / 2, entry.y, 0.1)) { + return; + } + history.pop(); + const combat = game.combat; + const combatant = combat.getCombatantByToken(token.id); + await updateCombatantDragRulerFlags(combat, [{_id: combatant.id, dragRulerFlags: combatant.data.flags.dragRuler}]); +} + export async function resetMovementHistory(combat, combatantId) { const combatant = combat.combatants.get(combatantId); const dragRulerFlags = combatant.data.flags.dragRuler; diff --git a/src/util.js b/src/util.js index 3a42f64..d46faf8 100644 --- a/src/util.js +++ b/src/util.js @@ -210,3 +210,7 @@ export function setSnapParameterOnOptions(sourceObject, options) { options.snap = !game.keyboard._downKeys.has("Shift"); } } + +export function isClose(a, b, delta) { + return Math.abs(a - b) <= delta; +}