rail_cmd.c
changeset 1816 e96c4a8136bf
parent 1813 a4b17980b9e4
child 1818 88ab405a9dfc
--- a/rail_cmd.c	Sun May 15 11:20:38 2005 +0000
+++ b/rail_cmd.c	Sun May 15 13:48:23 2005 +0000
@@ -1619,7 +1619,35 @@
 	dest.tile = tile;
 	dest.track = track;
 
-	return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
+	if (GetTileType(tile)==MP_TUNNELBRIDGE && ((_map5[tile] & 0xF0)==0)) {
+		// It is a tunnel we're checking, we need to do some special stuff
+		// because VehicleFromPos will not find the vihicle otherwise
+		byte direction = _map5[tile] & 3;
+		FindLengthOfTunnelResult flotr;
+		flotr = FindLengthOfTunnel(tile, direction);
+		dest.track = 1 << (direction & 1); // get the trackbit the vehicle would have if it has not entered the tunnel yet (ie is still visible)
+
+		// check for a vehicle with that trackdir on the start tile of the tunnel
+		if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
+			return true;
+
+		// check for a vehicle with that trackdir on the end tile of the tunnel
+		if (VehicleFromPos(flotr.tile, &dest, SignalVehicleCheckProc) != NULL)
+			return true;
+
+		// now check all tiles from start to end for a "hidden" vehicle
+		// NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile?
+		dest.track = 0x40; // trackbit for vehicles "hidden" inside a tunnel
+		for (; tile != flotr.tile; tile += TileOffsByDir(direction)) {
+			if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
+				return true;
+		}
+
+		// no vehicle found
+		return false;
+	} else {
+		return VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL;
+	};
 }
 
 static void SetSignalsAfterProc(TrackPathFinder *tpf)