summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tunnelbridge_cmd.c72
1 files changed, 32 insertions, 40 deletions
diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c
index bddc02d2d..f4aeeaeeb 100644
--- a/tunnelbridge_cmd.c
+++ b/tunnelbridge_cmd.c
@@ -103,51 +103,44 @@ static inline const PalSpriteID *GetBridgeSpriteTable(int index, byte table)
static inline byte GetBridgeFlags(int index) { return _bridge[index].flags;}
-/** check if bridge can be built on slope
- * direction 0 = X-axis, direction 1 = Y-axis
- * is_start_tile = false <-- end tile
- * is_start_tile = true <-- start tile
+
+/** Check the slope at the bridge ramps in three easy steps:
+ * - valid slopes without foundation
+ * - valid slopes with foundation
+ * - rest is invalid
*/
-static uint32 CheckBridgeSlope(Axis direction, Slope tileh, bool is_start_tile)
+#define M(x) (1 << (x))
+static int32 CheckBridgeSlopeNorth(Axis axis, Slope tileh)
{
- if (IsSteepSlope(tileh)) return CMD_ERROR;
+ uint32 valid;
- if (is_start_tile) {
- /* check slope at start tile
- - no extra cost
- */
-#define M(x) (1 << (x))
- if (HASBIT(M(SLOPE_FLAT) | (direction == AXIS_X ? M(SLOPE_NE) : M(SLOPE_NW)), tileh)) return 0;
+ valid = M(SLOPE_FLAT) | (axis == AXIS_X ? M(SLOPE_NE) : M(SLOPE_NW));
+ if (HASBIT(valid, tileh)) return 0;
- // disallow certain start tiles to avoid certain crooked bridges
- if (tileh == SLOPE_S) return CMD_ERROR;
- } else {
- /* check slope at end tile
- - no extra cost
- */
- if (HASBIT(M(SLOPE_FLAT) | (direction == AXIS_X ? M(SLOPE_SW) : M(SLOPE_SE)), tileh)) return 0;
-#undef M
+ valid =
+ BRIDGE_FULL_LEVELED_FOUNDATION | M(SLOPE_N) |
+ (axis == AXIS_X ? M(SLOPE_E) : M(SLOPE_W));
+ if (HASBIT(valid, tileh)) return _price.terraform;
- // disallow certain end tiles to avoid certain crooked bridges
- if (tileh == SLOPE_N) return CMD_ERROR;
- }
+ return CMD_ERROR;
+}
- /* disallow common start/end tiles to avoid certain crooked bridges e.g.
- * start-tile: X 2,1 Y 2,4 (2 was disabled before)
- * end-tile: X 8,4 Y 8,1 (8 was disabled before)
- */
- if ((tileh == SLOPE_W && is_start_tile != (direction != AXIS_X)) ||
- (tileh == SLOPE_E && is_start_tile == (direction != AXIS_X))) {
- return CMD_ERROR;
- }
+static int32 CheckBridgeSlopeSouth(Axis axis, Slope tileh)
+{
+ uint32 valid;
- // slope foundations
- if (HASBIT(BRIDGE_FULL_LEVELED_FOUNDATION | BRIDGE_PARTLY_LEVELED_FOUNDATION, tileh)) {
- return _price.terraform;
- }
+ valid = M(SLOPE_FLAT) | (axis == AXIS_X ? M(SLOPE_SW) : M(SLOPE_SE));
+ if (HASBIT(valid, tileh)) return 0;
+
+ valid =
+ BRIDGE_FULL_LEVELED_FOUNDATION | M(SLOPE_S) |
+ (axis == AXIS_X ? M(SLOPE_W) : M(SLOPE_E));
+ if (HASBIT(valid, tileh)) return _price.terraform;
return CMD_ERROR;
}
+#undef M
+
uint32 GetBridgeLength(TileIndex begin, TileIndex end)
{
@@ -274,9 +267,8 @@ int32 CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
if (CmdFailed(ret)) return ret;
cost = ret;
- // true - bridge-start-tile, false - bridge-end-tile
- terraformcost = CheckBridgeSlope(direction, tileh_start, true);
- if (CmdFailed(terraformcost) || (terraformcost && !allow_on_slopes))
+ terraformcost = CheckBridgeSlopeNorth(direction, tileh_start);
+ if (CmdFailed(terraformcost) || (terraformcost != 0 && !allow_on_slopes))
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
cost += terraformcost;
@@ -287,8 +279,8 @@ int32 CmdBuildBridge(TileIndex end_tile, uint32 flags, uint32 p1, uint32 p2)
cost += ret;
// false - end tile slope check
- terraformcost = CheckBridgeSlope(direction, tileh_end, false);
- if (CmdFailed(terraformcost) || (terraformcost && !allow_on_slopes))
+ terraformcost = CheckBridgeSlopeSouth(direction, tileh_end);
+ if (CmdFailed(terraformcost) || (terraformcost != 0 && !allow_on_slopes))
return_cmd_error(STR_1000_LAND_SLOPED_IN_WRONG_DIRECTION);
cost += terraformcost;