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;
 				}