diff options
author | tron <tron@openttd.org> | 2006-06-25 18:58:45 +0000 |
---|---|---|
committer | tron <tron@openttd.org> | 2006-06-25 18:58:45 +0000 |
commit | 09ec480c5626d81df0d092f6ef7c08ab6bc71d81 (patch) | |
tree | 7d055b2f524d9f89b1945a6d391a519a01f184b7 | |
parent | 06cbf50971cc4bf28d23f9032a72fea6a2ca7e29 (diff) | |
download | openttd-09ec480c5626d81df0d092f6ef7c08ab6bc71d81.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.c | 17 |
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; } } |