summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/object_cmd.cpp14
-rw-r--r--src/station_cmd.cpp5
-rw-r--r--src/tunnelbridge_cmd.cpp1
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;
}