diff options
author | J0an Josep <juanjo.ng.83@gmail.com> | 2019-01-14 23:14:44 +0100 |
---|---|---|
committer | Charles Pigott <charlespigott@googlemail.com> | 2019-01-31 22:15:56 +0000 |
commit | aa63517c92e34facde14b0dc97850499a3ad42d3 (patch) | |
tree | 44739599d7e3f6873206db9c5fab66dc7fa0ffc1 /src/pathfinder/npf | |
parent | 19be1f4ace00f784270218cdb4041f302d2198c9 (diff) | |
download | openttd-aa63517c92e34facde14b0dc97850499a3ad42d3.tar.xz |
Fix #7060: [NPF] Do not check whether ignored first tiles are end nodes.
Diffstat (limited to 'src/pathfinder/npf')
-rw-r--r-- | src/pathfinder/npf/aystar.cpp | 2 | ||||
-rw-r--r-- | src/pathfinder/npf/aystar.h | 2 | ||||
-rw-r--r-- | src/pathfinder/npf/npf.cpp | 15 |
3 files changed, 12 insertions, 7 deletions
diff --git a/src/pathfinder/npf/aystar.cpp b/src/pathfinder/npf/aystar.cpp index 8bd63beb7..beac06291 100644 --- a/src/pathfinder/npf/aystar.cpp +++ b/src/pathfinder/npf/aystar.cpp @@ -170,7 +170,7 @@ int AyStar::Loop() if (current == NULL) return AYSTAR_EMPTY_OPENLIST; /* Check for end node and if found, return that code */ - if (this->EndNodeCheck(this, current) == AYSTAR_FOUND_END_NODE) { + if (this->EndNodeCheck(this, current) == AYSTAR_FOUND_END_NODE && !CheckIgnoreFirstTile(¤t->path)) { if (this->FoundEndNode != NULL) { this->FoundEndNode(this, current); } diff --git a/src/pathfinder/npf/aystar.h b/src/pathfinder/npf/aystar.h index 052feb6e8..890b023e8 100644 --- a/src/pathfinder/npf/aystar.h +++ b/src/pathfinder/npf/aystar.h @@ -59,6 +59,8 @@ struct OpenListNode { PathNode path; }; +bool CheckIgnoreFirstTile(const PathNode *node); + struct AyStar; /** diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp index 93c5f947a..c9a22f5f0 100644 --- a/src/pathfinder/npf/npf.cpp +++ b/src/pathfinder/npf/npf.cpp @@ -101,6 +101,11 @@ static inline void NPFSetFlag(AyStarNode *node, NPFNodeFlag flag, bool value) SB(node->user_data[NPF_NODE_FLAGS], flag, 1, value); } +bool CheckIgnoreFirstTile(const PathNode *node) +{ + return (node->parent == NULL && HasBit(node->node.user_data[NPF_NODE_FLAGS], NPF_FLAG_IGNORE_START_TILE)); +} + /** * Calculates the minimum distance travelled to get from t0 to t1 when only * using tracks (ie, only making 45 degree turns). Returns the distance in the @@ -853,11 +858,6 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) TileIndex src_tile = current->path.node.tile; DiagDirection src_exitdir = TrackdirToExitdir(src_trackdir); - /* Is src_tile valid, and can be used? - * When choosing track on a junction src_tile is the tile neighboured to the junction wrt. exitdir. - * But we must not check the validity of this move, as src_tile is totally unrelated to the move, if a roadvehicle reversed on a junction. */ - bool ignore_src_tile = (current->path.parent == NULL && NPFGetFlag(¤t->path.node, NPF_FLAG_IGNORE_START_TILE)); - /* Information about the vehicle: TransportType (road/rail/water) and SubType (compatible rail/road types) */ TransportType type = user->type; uint subtype = user->roadtypes; @@ -871,7 +871,10 @@ static void NPFFollowTrack(AyStar *aystar, OpenListNode *current) TrackdirBits trackdirbits; /* Find dest tile */ - if (ignore_src_tile) { + /* Is src_tile valid, and can be used? + * When choosing track on a junction src_tile is the tile neighboured to the junction wrt. exitdir. + * But we must not check the validity of this move, as src_tile is totally unrelated to the move, if a roadvehicle reversed on a junction. */ + if (CheckIgnoreFirstTile(¤t->path)) { /* Do not perform any checks that involve src_tile */ dst_tile = src_tile + TileOffsByDiagDir(src_exitdir); trackdirbits = GetDriveableTrackdirBits(dst_tile, src_trackdir, type, subtype); |