summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortron <tron@openttd.org>2006-06-25 18:58:45 +0000
committertron <tron@openttd.org>2006-06-25 18:58:45 +0000
commit276055a5743d205004a89d318e6b783c4e051619 (patch)
tree7d055b2f524d9f89b1945a6d391a519a01f184b7
parent4b2c02afdea0b51e1867d426e9401aa73abbbc74 (diff)
downloadopenttd-276055a5743d205004a89d318e6b783c4e051619.tar.xz
(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)
-rw-r--r--clear_cmd.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/clear_cmd.c b/clear_cmd.c
index 62331b73c..7cb068b6c 100644
--- a/clear_cmd.c
+++ b/clear_cmd.c
@@ -101,10 +101,13 @@ static int TerraformProc(TerraformerState *ts, TileIndex tile, int mode)
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 @@ static int TerraformProc(TerraformerState *ts, TileIndex tile, int mode)
// 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;
}
}