summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarkvater <Darkvater@openttd.org>2006-06-16 18:54:48 +0000
committerDarkvater <Darkvater@openttd.org>2006-06-16 18:54:48 +0000
commitfcf19e18eb4032e3544d4a49613c9f3dde60affc (patch)
treef0b730d01f85b688be29b0f3cec726093cbc952d
parent57d0d447f9b0cfa4274db2afaaa7b7c2f87b7eff (diff)
downloadopenttd-fcf19e18eb4032e3544d4a49613c9f3dde60affc.tar.xz
(svn r5288) - Fix [FS#199]: Tunnel construction could erronously terraform a foundationed tile with rails. This also fixes another bug where you could implicitly remove a foundation by raising nearby sloped land. Desirable perhaps, but unwanted.
-rw-r--r--clear_cmd.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/clear_cmd.c b/clear_cmd.c
index 792b430d3..648baaae1 100644
--- a/clear_cmd.c
+++ b/clear_cmd.c
@@ -241,7 +241,8 @@ int32 CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
TileIndex *ti = ts.tile_table;
for (count = ts.tile_table_count; count != 0; count--, ti++) {
- uint a, b, c, d, r, min;
+ uint a, b, c, d, min;
+ Slope s;
TileIndex tile = *ti;
_terraform_err_tile = tile;
@@ -251,14 +252,19 @@ int32 CmdTerraformLand(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
c = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(0, 1));
d = TerraformGetHeightOfTile(&ts, tile + TileDiffXY(1, 1));
- r = GetTileh(a, b, c, d, &min);
+ s = GetTileh(a, b, c, d, &min);
if (IsTileType(tile, MP_RAILWAY)) {
- if (IsSteepSlope(r)) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
+ if (IsSteepSlope(s)) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
if (IsPlainRailTile(tile)) {
+ /* We need to check if a rail is on a leveled foundation and
+ * then treat it as such. Important for correct tunneling */
extern const TrackBits _valid_tileh_slopes[2][15];
- if (GetTrackBits(tile) & ~_valid_tileh_slopes[0][r]) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
+ TrackBits tb = GetTrackBits(tile);
+ uint foundation = (GetRailFoundation(s, tb) == 0) ? 1 : 0;
+
+ if (tb & ~_valid_tileh_slopes[foundation][s]) return_cmd_error(STR_1008_MUST_REMOVE_RAILROAD_TRACK);
} else return_cmd_error(STR_5800_OBJECT_IN_THE_WAY);
}