(svn r10734) -Fix [FS#1030]: Revert r10513) and add special cases for collision detection on bridges/tunnels.
authorpeter1138
Mon, 30 Jul 2007 08:49:41 +0000
changeset 7371 0bb7e1279675
parent 7370 41adc721b1fa
child 7372 6fac48ff7c4d
(svn r10734) -Fix [FS#1030]: Revert r10513) and add special cases for collision detection on bridges/tunnels.
src/rail_cmd.cpp
src/train_cmd.cpp
src/vehicle.cpp
--- a/src/rail_cmd.cpp	Sun Jul 29 23:42:59 2007 +0000
+++ b/src/rail_cmd.cpp	Mon Jul 30 08:49:41 2007 +0000
@@ -1669,13 +1669,10 @@
 		/* check for a vehicle with that trackdir on the end tile of the tunnel */
 		if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true;
 
-		/* now check all tiles from start to end for a warping vehicle
-		 * NOTE: the hashes for tiles may overlap, so this could maybe be optimised a bit by not checking every tile? */
+		/* now check all tiles from start to end for a warping vehicle */
 		dest.track = 0x40;   //Vehicle inside a tunnel or on a bridge
-		for (; tile != end; tile += TileOffsByDiagDir(direction)) {
-			if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL)
-				return true;
-		}
+		if (VehicleFromPos(tile, &dest, SignalVehicleCheckProc) != NULL) return true;
+		if (VehicleFromPos(end, &dest, SignalVehicleCheckProc) != NULL) return true;
 
 		/* no vehicle found */
 		return false;
--- a/src/train_cmd.cpp	Sun Jul 29 23:42:59 2007 +0000
+++ b/src/train_cmd.cpp	Mon Jul 30 08:49:41 2007 +0000
@@ -2760,7 +2760,16 @@
 	tcc.num = 0;
 
 	/* find colliding vehicles */
-	VehicleFromPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum);
+	if (v->u.rail.track == TRACK_BIT_WORMHOLE) {
+		VehicleFromPos(v->tile, &tcc, FindTrainCollideEnum);
+		if (IsBridgeTile(v->tile)) {
+			VehicleFromPos(GetOtherBridgeEnd(v->tile), &tcc, FindTrainCollideEnum);
+		} else {
+			VehicleFromPos(GetOtherTunnelEnd(v->tile), &tcc, FindTrainCollideEnum);
+		}
+	} else {
+		VehicleFromPosXY(v->x_pos, v->y_pos, &tcc, FindTrainCollideEnum);
+	}
 
 	/* any dead -> no crash */
 	if (tcc.num == 0) return;
--- a/src/vehicle.cpp	Sun Jul 29 23:42:59 2007 +0000
+++ b/src/vehicle.cpp	Mon Jul 30 08:49:41 2007 +0000
@@ -471,8 +471,8 @@
 	if (remove) {
 		new_hash = NULL;
 	} else {
-		int x = GB(v->x_pos / TILE_SIZE, HASH_RES, HASH_BITS);
-		int y = GB(v->y_pos / TILE_SIZE, HASH_RES, HASH_BITS) << HASH_BITS;
+		int x = GB(TileX(v->tile), HASH_RES, HASH_BITS);
+		int y = GB(TileY(v->tile), HASH_RES, HASH_BITS) << HASH_BITS;
 		new_hash = &_new_vehicle_position_hash[(x + y) & TOTAL_HASH_MASK];
 	}