From 57a5f08687be4e72944465c6ea93187f5464bd6d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 23 Mar 2017 20:15:37 +0000 Subject: [PATCH] Fix handling of custom bridge heads on steep slopes. --- src/road_cmd.cpp | 6 +++++- src/tunnelbridge_cmd.cpp | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 962486f823..56f6888197 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -731,7 +731,11 @@ CommandCost CmdBuildRoad(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 if ((pieces & ~axial_pieces) && !_settings_game.construction.build_on_slopes) { return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); } - if ((_invalid_tileh_slopes_road[0][tileh] & (pieces & ~entrance_piece)) != ROAD_NONE) { + + /* Steep slopes behave the same as slopes with one corner raised. */ + const Slope normalised_tileh = IsSteepSlope(tileh) ? SlopeWithOneCornerRaised(GetHighestSlopeCorner(tileh)) : tileh; + + if ((_invalid_tileh_slopes_road[0][normalised_tileh & SLOPE_ELEVATED] & (pieces & ~entrance_piece)) != ROAD_NONE) { return_cmd_error(STR_ERROR_LAND_SLOPED_IN_WRONG_DIRECTION); } diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index c7428ac98b..630c95da68 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1556,7 +1556,7 @@ static int GetSlopePixelZ_TunnelBridge(TileIndex tile, uint x, uint y) if (5 <= pos && pos <= 10) return z; } else { // IsBridge(tile) if (IsRoadCustomBridgeHeadTile(tile)) { - return z + TILE_HEIGHT; + return z + TILE_HEIGHT + (IsSteepSlope(tileh) ? TILE_HEIGHT : 0); } DiagDirection dir = GetTunnelBridgeDirection(tile); @@ -1959,7 +1959,11 @@ static CommandCost TerraformTile_TunnelBridge(TileIndex tile, DoCommandFlag flag if (IsRoadCustomBridgeHeadTile(tile)) { const RoadBits pieces = GetCustomBridgeHeadAllRoadBits(tile); const RoadBits entrance_piece = DiagDirToRoadBits(direction); - if ((_invalid_tileh_slopes_road[0][tileh_new] & (pieces & ~entrance_piece)) != ROAD_NONE) { + + /* Steep slopes behave the same as slopes with one corner raised. */ + const Slope normalised_tileh_new = IsSteepSlope(tileh_new) ? SlopeWithOneCornerRaised(GetHighestSlopeCorner(tileh_new)) : tileh_new; + + if ((_invalid_tileh_slopes_road[0][normalised_tileh_new & SLOPE_ELEVATED] & (pieces & ~entrance_piece)) != ROAD_NONE) { return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR); } }