(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
authordarkvater
Fri, 21 Jan 2005 19:52:32 +0000
changeset 1082 a83d7ac6fecb
parent 1081 0d79fc43fae2
child 1083 8e64dc3ed29f
(svn r1583) -Fix: You should no longer be able to delete bridges on any type of underground when there is a vehicle on it
functions.h
tunnelbridge_cmd.c
vehicle.c
--- a/functions.h	Fri Jan 21 18:36:17 2005 +0000
+++ b/functions.h	Fri Jan 21 19:52:32 2005 +0000
@@ -214,6 +214,7 @@
 bool ScrollMainWindowToTile(TileIndex tile);
 bool ScrollMainWindowTo(int x, int y);
 void DrawSprite(uint32 img, int x, int y);
+uint GetCorrectTileHeight(TileIndex tile);
 bool EnsureNoVehicle(TileIndex tile);
 bool EnsureNoVehicleZ(TileIndex tile, byte z);
 void MarkAllViewportsDirty(int left, int top, int right, int bottom);
--- a/tunnelbridge_cmd.c	Fri Jan 21 18:36:17 2005 +0000
+++ b/tunnelbridge_cmd.c	Fri Jan 21 19:52:32 2005 +0000
@@ -742,7 +742,8 @@
 	*/
 	tile		+= direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
 	endtile	-= direction ? TILE_XY(0, 1) : TILE_XY( 1,0);
-	if ((v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8)) != NULL) {
+	/* Bridges on slopes might have their Z-value offset..correct this */
+	if ((v = FindVehicleBetween(tile, endtile, TilePixelHeight(tile) + 8 + GetCorrectTileHeight(tile))) != NULL) {
 		VehicleInTheWayErrMsg(v);
 		return CMD_ERROR;
 	}
@@ -804,25 +805,21 @@
 }
 
 static int32 ClearTile_TunnelBridge(uint tile, byte flags) {
-	int32 ret;
 	byte m5 = _map5[tile];
 
 	if ((m5 & 0xF0) == 0) {
 		if (flags & DC_AUTO)
 			return_cmd_error(STR_5006_MUST_DEMOLISH_TUNNEL_FIRST);
+
 		return DoClearTunnel(tile, flags);
 	} else if (m5 & 0x80) {
 		if (flags & DC_AUTO)
 			return_cmd_error(STR_5007_MUST_DEMOLISH_BRIDGE_FIRST);
 
-		ret = DoClearBridge(tile, flags);
-		if (ret == CMD_ERROR)
-			return CMD_ERROR;
-
-		return ret;
-	} else {
-		return CMD_ERROR;
-	}
+		return DoClearBridge(tile, flags);
+	} 
+	
+	return CMD_ERROR;
 }
 
 int32 DoConvertTunnelBridgeRail(uint tile, uint totype, bool exec)
--- a/vehicle.c	Fri Jan 21 18:36:17 2005 +0000
+++ b/vehicle.c	Fri Jan 21 19:52:32 2005 +0000
@@ -73,17 +73,27 @@
 	return v;
 }
 
+static inline uint Correct_Z(uint tileh)
+{
+	// needs z correction for slope-type graphics that have the NORTHERN tile lowered
+	// 1, 2, 3, 4, 5, 6 and 7
+	return (CORRECT_Z(tileh)) ? 8 : 0;
+}
+
+uint GetCorrectTileHeight(TileIndex tile)
+{
+	TileInfo ti;
+
+	FindLandscapeHeightByTile(&ti, tile);
+	return Correct_Z(ti.tileh);
+}
+
 bool EnsureNoVehicleZ(TileIndex tile, byte z)
 {
 	TileInfo ti;
 
 	FindLandscapeHeightByTile(&ti, tile);
-	// needs z correction for slope-type graphics that have the NORTHERN tile lowered
-	// 1, 2, 3, 4, 5, 6 and 7
-	if (CORRECT_Z(ti.tileh))
-		z += 8;
-
-	ti.z = z;
+	ti.z = z + Correct_Z(ti.tileh);
 
 	return VehicleFromPos(tile, &ti, EnsureNoVehicleProcZ) == NULL;
 }