diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/town_cmd.cpp | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index d192e1a28..7649f925a 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -814,32 +814,38 @@ static RoadBits GetTownRoadGridElement(Town* t, TileIndex tile, DiagDirection di break; } - /* Skip slope optimisations */ + /* Stop if the tile is not a part of the grid lines */ if (rcmd == ROAD_NONE) return rcmd; - RoadBits rb_template; - switch (GetTileSlope(tile, NULL)) { - default: rb_template = ROAD_ALL; break; - case SLOPE_W: rb_template = ROAD_NW | ROAD_SW; break; - case SLOPE_SW: rb_template = ROAD_Y | ROAD_SW; break; - case SLOPE_S: rb_template = ROAD_SE | ROAD_SW; break; - case SLOPE_SE: rb_template = ROAD_X | ROAD_SE; break; - case SLOPE_E: rb_template = ROAD_NE | ROAD_SE; break; - case SLOPE_NE: rb_template = ROAD_Y | ROAD_NE; break; - case SLOPE_N: rb_template = ROAD_NW | ROAD_NE; break; - case SLOPE_NW: rb_template = ROAD_X | ROAD_NW; break; - case SLOPE_STEEP_W: - case SLOPE_STEEP_S: - case SLOPE_STEEP_E: - case SLOPE_STEEP_N: - rb_template = (dir == DIAGDIR_NE || dir == DIAGDIR_SW) ? ROAD_X : ROAD_Y; - break; - } + /* Optimise only X-junctions */ + if (COUNTBITS(rcmd) != 2) { + RoadBits rb_template; + + switch (GetTileSlope(tile, NULL)) { + default: rb_template = ROAD_ALL; break; + case SLOPE_W: rb_template = ROAD_NW | ROAD_SW; break; + case SLOPE_SW: rb_template = ROAD_Y | ROAD_SW; break; + case SLOPE_S: rb_template = ROAD_SW | ROAD_SE; break; + case SLOPE_SE: rb_template = ROAD_X | ROAD_SE; break; + case SLOPE_E: rb_template = ROAD_SE | ROAD_NE; break; + case SLOPE_NE: rb_template = ROAD_Y | ROAD_NE; break; + case SLOPE_N: rb_template = ROAD_NE | ROAD_NW; break; + case SLOPE_NW: rb_template = ROAD_X | ROAD_NW; break; + case SLOPE_STEEP_W: + case SLOPE_STEEP_S: + case SLOPE_STEEP_E: + case SLOPE_STEEP_N: + rb_template = ROAD_NONE; + break; + } - /* Check for the right growth dir */ - if (DiagDirToRoadBits(ReverseDiagDir(dir)) & (rcmd & rb_template)) return rb_template & rcmd; + /* Stop if the template is compatible to the growth dir */ + if (DiagDirToRoadBits(ReverseDiagDir(dir)) & rb_template) return rb_template; + /* If not generate a straight road in the direction of the growth */ + return DiagDirToRoadBits(dir) | DiagDirToRoadBits(ReverseDiagDir(dir)); + } - return (dir == DIAGDIR_NE || dir == DIAGDIR_SW) ? ROAD_X : ROAD_Y; + return rcmd; } /** |