(svn r5906) -Fix [ 1203146 ]: GetVehicleOutOfTunnelTile always returned v->tile, now the exit-tile of the tunnel based on the vehicle's direction is correctly returned. Based on a patch by glx.
authorDarkvater
Tue, 15 Aug 2006 01:28:07 +0000
changeset 4276 86604f15f27f
parent 4275 5350bd872282
child 4277 3539bd14f023
(svn r5906) -Fix [ 1203146 ]: GetVehicleOutOfTunnelTile always returned v->tile, now the exit-tile of the tunnel based on the vehicle's direction is correctly returned. Based on a patch by glx.
tunnelbridge_cmd.c
--- a/tunnelbridge_cmd.c	Tue Aug 15 00:26:24 2006 +0000
+++ b/tunnelbridge_cmd.c	Tue Aug 15 01:28:07 2006 +0000
@@ -1425,15 +1425,27 @@
 	return 0;
 }
 
+/** Retrieve the exit-tile of the vehicle from inside a tunnel
+ * Very similar to GetOtherTunnelEnd(), but we use the vehicle's
+ * direction for determining which end of the tunnel to find
+ * @param v the vehicle which is inside the tunnel and needs an exit
+ * @return the exit-tile of the tunnel based on the vehicle's direction */
 TileIndex GetVehicleOutOfTunnelTile(const Vehicle *v)
 {
-	TileIndex tile;
-	TileIndexDiff delta = (v->direction & 2) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
+	TileIndex tile = v->tile;
+	DiagDirection dir = DirToDiagDir(v->direction);
+	TileIndexDiff delta = TileOffsByDir(dir);
 	byte z = v->z_pos;
 
-	for (tile = v->tile;; tile += delta) {
-		if (IsTunnelTile(tile) && GetTileZ(tile) == z) break;
-	}
+	dir = ReverseDiagDir(dir);
+	do {
+		tile += delta;
+	} while (
+		!IsTunnelTile(tile) ||
+		GetTunnelDirection(tile) != dir ||
+		GetTileZ(tile) != z
+	);
+
 	return tile;
 }