Initial working pathfinding impl

This commit is contained in:
Manuel Vögele
2021-05-17 15:13:35 +02:00
parent 1f770f7597
commit 369159e6bb
3 changed files with 130 additions and 2 deletions
+21 -2
View File
@@ -1,8 +1,9 @@
import {highlightMeasurementTerrainRuler, measureDistances} from "./compatibility.js";
import {getGridPositionFromPixels} from "./foundry_fixes.js";
import {getCenterFromGridPositionObj, getGridPositionFromPixels, getGridPositionFromPixelsObj} from "./foundry_fixes.js";
import {Line} from "./geometry.js";
import {disableSnap, moveWithoutAnimation} from "./keybindings.js";
import {trackRays} from "./movement_tracking.js"
import {find_path} from "./pathfinding.js";
import {recalculate} from "./socket.js";
import {applyTokenSizeOffset, enumeratedZip, getSnapPointForEntity, getSnapPointForToken, getTokenShape, highlightTokenShape, sum} from "./util.js";
@@ -131,7 +132,7 @@ function scheduleMeasurement(destination, event) {
const mt = event._measureTime || 0;
const originalEvent = event.data.originalEvent;
if (Date.now() - mt > measurementInterval) {
this.measure(destination, {snap: !disableSnap});
this.measure(destination, {snap: !disableSnap, pathfinding: game.keyboard.isDown("y")});
event._measureTime = Date.now();
this._state = Ruler.STATES.MEASURING;
cancelScheduledMeasurement.call(this);
@@ -153,14 +154,32 @@ export function cancelScheduledMeasurement() {
// This is a modified version of Ruler.measure form foundry 0.7.9
export function measure(destination, options={}) {
const isToken = this.draggedEntity instanceof Token;
if (isToken && !this.draggedEntity.isVisible)
return []
options.pathfinding = options.pathfinding ?? false;
if (options.snap) {
destination = getSnapPointForEntity(destination.x, destination.y, this.draggedEntity);
}
// Remove waypoints generated by pathfinding
this.waypoints = this.waypoints.filter(waypoint => !waypoint.isPathfinding);
if (isToken && options.pathfinding) {
let path = find_path(getGridPositionFromPixelsObj(this.waypoints[this.waypoints.length - 1]), getGridPositionFromPixelsObj(destination));
if (path) {
path = path.map(point => getCenterFromGridPositionObj(point));
path.forEach(point => point.isPathfinding = true);
this.waypoints = this.waypoints.concat(path);
}
else {
// Don't show a path if the pathfinding yields no result to show the user that the destination is unreachable
destination = this.waypoints[this.waypoints.length - 1];
}
}
if(options.gridSpaces === undefined) {
options.gridSpaces = canvas.grid.type !== CONST.GRID_TYPES.GRIDLESS;
}