summaryrefslogtreecommitdiff
path: root/src/pathfinder
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-12-25 12:20:18 +0000
committerrubidium <rubidium@openttd.org>2010-12-25 12:20:18 +0000
commitb323000253a471b1a8553ad46bd9f107bea07d4d (patch)
treecdfdeda7b978585e6c499b1570d51c01e9340e3a /src/pathfinder
parent7cce50744308e4022f36659e30885920cf5d860a (diff)
downloadopenttd-b323000253a471b1a8553ad46bd9f107bea07d4d.tar.xz
(svn r21631) -Fix [FS#4325]: ships with the old pathfinder would easily show up as lost, even when it would eventually find a path. Now also the distance from the "end" of the pathfinding run to the destination is compared to the current distance to the destination; if the distance to the destination at the end of the pathfinder run is less than the current distance from the destination the ship won't be marked as lost. This means that the ships with the old pathfinder will less likely get marked as lost, but due to the design of the old ship pathfinder there "lostness" is merely a best guess. When you still get a lost message
Diffstat (limited to 'src/pathfinder')
-rw-r--r--src/pathfinder/opf/opf_ship.cpp7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/pathfinder/opf/opf_ship.cpp b/src/pathfinder/opf/opf_ship.cpp
index 4557e3a3f..985c2ed5d 100644
--- a/src/pathfinder/opf/opf_ship.cpp
+++ b/src/pathfinder/opf/opf_ship.cpp
@@ -205,8 +205,11 @@ Track OPFShipChooseTrack(const Ship *v, TileIndex tile, DiagDirection enterdir,
uint dist = FindShipTrack(v, tile, enterdir, tracks, 0, &track);
/* If the dist equals zero, or distr equals one (the extra reversing penalty),
- * then we found our destination and we are not lost. */
- path_found = (dist == 0 || distr == 1);
+ * then we found our destination and we are not lost.
+ * When we are not lost (yet) and the distance to our destination becomes
+ * less, then we aren't lost yet.
+ * So, we only become lost when the distance to our destination increases. */
+ path_found = (dist == 0 || distr == 1 || (!(v->vehicle_flags & VF_PATHFINDER_LOST) && min(dist, distr) < DistanceManhattan(tile, v->dest_tile)));
if (dist <= distr) return track;
return INVALID_TRACK; // We could better reverse
}