changeset 3918:06bbac429638 draft

(svn r5037) -Fix: assert when GetVehicleTrackdir() returns wrong trackdir - introduced by r5033 (thanks yanek)
author KUDr <KUDr@openttd.org>
date Tue, 30 May 2006 15:04:59 +0000
parents e0dc3975867d
children 98ff70fd829b
files yapf/yapf_road.cpp
diffstat 1 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/yapf/yapf_road.cpp
+++ b/yapf/yapf_road.cpp
@@ -301,10 +301,7 @@
 			return 0;
 		}
 
-		// set origin (tile, trackdir)
-		TileIndex src_tile = v->tile;
-		Trackdir src_td = GetVehicleTrackdir(v);
-		Yapf().SetOrigin(src_tile, TrackdirToTrackdirBits(src_td));
+		if (!SetOriginFromVehiclePos(v)) return UINT_MAX;
 
 		// set destination tile, trackdir
 		//   get available trackdirs on the destination tile
@@ -327,6 +324,21 @@
 		return dist;
 	}
 
+	/** Return true if the valid origin (tile/trackdir) was set from the current vehicle position. */
+	FORCEINLINE bool SetOriginFromVehiclePos(const Vehicle *v)
+	{
+		// set origin (tile, trackdir)
+		TileIndex src_tile = v->tile;
+		Trackdir src_td = GetVehicleTrackdir(v);
+		if ((GetTileTrackStatus(src_tile, TRANSPORT_ROAD) & TrackdirToTrackdirBits(src_td)) == 0) {
+			// sometimes the roadveh is not on the road (it resides on non-existing track)
+			// how should we handle that situation?
+			return false;
+		}
+		Yapf().SetOrigin(src_tile, TrackdirToTrackdirBits(src_td));
+		return true;
+	}
+
 	static Depot* stFindNearestDepot(Vehicle* v, TileIndex tile, Trackdir td)
 	{
 		Tpf pf;