From 41a80490befda13df13115f3e272d05247bcf4a2 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 28 Aug 2010 19:02:21 +0000 Subject: (svn r20668) -Codechange: add (more) support for bridges over objects --- src/object_cmd.cpp | 14 ++++++++++++-- src/station_cmd.cpp | 5 +++-- src/tunnelbridge_cmd.cpp | 1 + 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index d16cfeb78..dbfc6fda7 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -127,7 +127,7 @@ void UpdateCompanyHQ(TileIndex tile, uint score) } } -extern CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z); +extern CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z, bool check_bridge); static CommandCost ClearTile_Object(TileIndex tile, DoCommandFlag flags); /** @@ -189,12 +189,22 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 /* Check whether the ground is flat enough. */ int allowed_z = -1; TILE_AREA_LOOP(t, ta) { - cost.AddCost(CheckBuildableTile(t, 0, allowed_z)); + /* We'll do the bridge test later; it's quite custom. */ + cost.AddCost(CheckBuildableTile(t, 0, allowed_z, false)); } } } if (cost.Failed()) return cost; + /* Finally do a check for bridges. */ + TILE_AREA_LOOP(t, ta) { + if (MayHaveBridgeAbove(t) && IsBridgeAbove(t) && ( + !(spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) || + (GetTileMaxZ(t) + spec->height * TILE_HEIGHT >= GetBridgeHeight(GetSouthernBridgeEnd(t))))) { + return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); + } + } + int hq_score = 0; switch (type) { case OBJECT_TRANSMITTER: diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 9ef27c6f7..f6cba01bb 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -667,11 +667,12 @@ CommandCost ClearTile_Station(TileIndex tile, DoCommandFlag flags); * @param tile TileIndex to check. * @param invalid_dirs Prohibited directions for slopes (set of #DiagDirection). * @param allowed_z Height allowed for the tile. If allowed_z is negative, it will be set to the height of this tile. + * @param check_bridge Check for the existance of a bridge. * @return The cost in case of success, or an error code if it failed. */ -CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z) +CommandCost CheckBuildableTile(TileIndex tile, uint invalid_dirs, int &allowed_z, bool check_bridge = true) { - if (MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) { + if (check_bridge && MayHaveBridgeAbove(tile) && IsBridgeAbove(tile)) { return_cmd_error(STR_ERROR_MUST_DEMOLISH_BRIDGE_FIRST); } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index 315806f71..773d91e82 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -394,6 +394,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u case MP_OBJECT: { const ObjectSpec *spec = ObjectSpec::GetByTile(tile); if ((spec->flags & OBJECT_FLAG_ALLOW_UNDER_BRIDGE) == 0) goto not_valid_below; + if (GetTileMaxZ(tile) + spec->height * TILE_HEIGHT > z_start) return_cmd_error(STR_ERROR_OBJECT_IN_THE_WAY); break; } -- cgit v1.2.3-70-g09d2