diff --git a/src/core/pathfinding/PathFinding.ts b/src/core/pathfinding/PathFinding.ts index 87a059bde..aad574fbb 100644 --- a/src/core/pathfinding/PathFinding.ts +++ b/src/core/pathfinding/PathFinding.ts @@ -12,6 +12,8 @@ export class PathFinder { private aStar: AStar; private computeFinished = true; + private pathCache: Map = new Map(); + private constructor( private game: Game, private newAStar: (curr: TileRef, dst: TileRef) => AStar, @@ -53,6 +55,15 @@ export class PathFinder { return { type: PathFindResultType.Completed, tile: curr }; } + // make key the same between port a -> b and b -> a + const key = curr < dst ? curr * 1_000_000 + dst : dst * 1_000_000 + curr; + + // get the cached path + if (this.pathCache.has(key)) { + this.path = this.pathCache.get(key)!; + return { type: PathFindResultType.NextTile, tile: this.path.shift() }; + } + if (this.computeFinished) { if (this.shouldRecompute(curr, dst)) { this.curr = curr; @@ -72,6 +83,9 @@ export class PathFinder { this.path = this.aStar.reconstructPath(); // Remove the start tile this.path.shift(); + + // save the path in the cache + this.pathCache.set(key, [...this.path]); return this.nextTile(curr, dst); case PathFindResultType.Pending: return { type: PathFindResultType.Pending };