mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-08-07 11:09:34 +00:00
Merge pull request #170 from Readixyee/tradeship-caching
Trade ship path caching
This commit is contained in:
@@ -12,6 +12,8 @@ export class PathFinder {
|
|||||||
private aStar: AStar;
|
private aStar: AStar;
|
||||||
private computeFinished = true;
|
private computeFinished = true;
|
||||||
|
|
||||||
|
private pathCache: Map<number, TileRef[]> = new Map();
|
||||||
|
|
||||||
private constructor(
|
private constructor(
|
||||||
private game: Game,
|
private game: Game,
|
||||||
private newAStar: (curr: TileRef, dst: TileRef) => AStar,
|
private newAStar: (curr: TileRef, dst: TileRef) => AStar,
|
||||||
@@ -53,6 +55,15 @@ export class PathFinder {
|
|||||||
return { type: PathFindResultType.Completed, tile: curr };
|
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.computeFinished) {
|
||||||
if (this.shouldRecompute(curr, dst)) {
|
if (this.shouldRecompute(curr, dst)) {
|
||||||
this.curr = curr;
|
this.curr = curr;
|
||||||
@@ -72,6 +83,9 @@ export class PathFinder {
|
|||||||
this.path = this.aStar.reconstructPath();
|
this.path = this.aStar.reconstructPath();
|
||||||
// Remove the start tile
|
// Remove the start tile
|
||||||
this.path.shift();
|
this.path.shift();
|
||||||
|
|
||||||
|
// save the path in the cache
|
||||||
|
this.pathCache.set(key, [...this.path]);
|
||||||
return this.nextTile(curr, dst);
|
return this.nextTile(curr, dst);
|
||||||
case PathFindResultType.Pending:
|
case PathFindResultType.Pending:
|
||||||
return { type: PathFindResultType.Pending };
|
return { type: PathFindResultType.Pending };
|
||||||
|
|||||||
Reference in New Issue
Block a user