(svn r5365) -Fix: It was possible to dig into a tunnel if certain rail combinations were ontop of it
authortron
Sun, 25 Jun 2006 18:58:45 +0000
changeset 4069 d2139f621c74
parent 4068 0c8b374a8ceb
child 4070 26943a1012f5
(svn r5365) -Fix: It was possible to dig into a tunnel if certain rail combinations were ontop of it
(Hopefully this time it works for real)
clear_cmd.c
--- a/clear_cmd.c	Sun Jun 25 17:51:23 2006 +0000
+++ b/clear_cmd.c	Sun Jun 25 18:58:45 2006 +0000
@@ -101,10 +101,13 @@
 		static const TrackBits safe_track[] = { TRACK_BIT_LOWER, TRACK_BIT_LEFT, TRACK_BIT_UPPER, TRACK_BIT_RIGHT };
 		static const Slope unsafe_slope[] = { SLOPE_S, SLOPE_W, SLOPE_N, SLOPE_E };
 
+		Slope tileh;
+		uint z;
+
 		// Nothing could be built at the steep slope - this avoids a bug
 		// when you have a single diagonal track in one corner on a
 		// basement and then you raise/lower the other corner.
-		Slope tileh = GetTileSlope(tile, NULL);
+		tileh = GetTileSlope(tile, &z);
 		if (tileh == unsafe_slope[mode] ||
 				tileh == ComplementSlope(unsafe_slope[mode])) {
 			_terraform_err_tile = tile;
@@ -115,6 +118,18 @@
 		// If we have a single diagonal track there, the other side of
 		// tile can be terraformed.
 		if (IsPlainRailTile(tile) && GetTrackBits(tile) == safe_track[mode]) {
+			/* If terraforming downwards prevent damaging a potential tunnel below.
+			 * This check is only necessary for flat tiles, because if the tile is
+			 * non-flat, then the corner opposing the rail is raised. Only this corner
+			 * can be lowered and this is a safe action
+			 */
+			if (tileh == SLOPE_FLAT &&
+					ts->direction == -1 &&
+					IsTunnelInWay(tile, z - TILE_HEIGHT)) {
+				_terraform_err_tile = tile;
+				_error_message = STR_1002_EXCAVATION_WOULD_DAMAGE;
+				return -1;
+			}
 			return 0;
 		}
 	}