Mercurial > hg > openttd
changeset 15980:0f57aae709d0 draft
(svn r20668) -Codechange: add (more) support for bridges over objects
author | rubidium <rubidium@openttd.org> |
---|---|
date | Sat, 28 Aug 2010 19:02:21 +0000 |
parents | 19c7eff41501 |
children | e880317a7797 |
files | src/object_cmd.cpp src/station_cmd.cpp src/tunnelbridge_cmd.cpp |
diffstat | 3 files changed, 16 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -127,7 +127,7 @@ } } -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 @@ /* 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:
--- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -667,11 +667,12 @@ * @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); }
--- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -394,6 +394,7 @@ 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; }