summaryrefslogtreecommitdiff
path: root/src/town_cmd.cpp
diff options
context:
space:
mode:
authorPatric Stout <truebrain@openttd.org>2021-01-07 08:01:23 +0100
committerGitHub <noreply@github.com>2021-01-07 08:01:23 +0100
commitc7609e767fa87fbd77f7f3f4bdbc748f2b5e5ffb (patch)
tree7d69c2c97f29188113f18134ce4f746949f70d04 /src/town_cmd.cpp
parent28c13ec90fbdc55d27d31652d31a48198b5d2492 (diff)
downloadopenttd-c7609e767fa87fbd77f7f3f4bdbc748f2b5e5ffb.tar.xz
Fix #7604: prevent houses to wander too far from town center when rebuilding (#8507)
When a multi-tile house is rebuild, it always used the most northern tile to build the new house. This can very easily lead to houses wandering off in the north-ish direction (either NW or NE). To prevent this, pick the tile closest to town center when rebuilding on a multi-tile house. This still means a house can be build away from a road, but it is no longer wandering around finding another town to call home.
Diffstat (limited to 'src/town_cmd.cpp')
-rw-r--r--src/town_cmd.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp
index d7ab29a66..ea13ff061 100644
--- a/src/town_cmd.cpp
+++ b/src/town_cmd.cpp
@@ -626,7 +626,28 @@ static void TileLoop_Town(TileIndex tile)
ClearTownHouse(t, tile);
/* Rebuild with another house? */
- if (GB(r, 24, 8) >= 12) BuildTownHouse(t, tile);
+ if (GB(r, 24, 8) >= 12) {
+ /* If we are multi-tile houses, make sure to replace the house
+ * closest to city center. If we do not do this, houses tend to
+ * wander away from roads and other houses. */
+ if (hs->building_flags & BUILDING_HAS_2_TILES) {
+ /* House tiles are always the most north tile. Move the new
+ * house to the south if we are north of the city center. */
+ TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
+ int x = Clamp(grid_pos.x, 0, 1);
+ int y = Clamp(grid_pos.y, 0, 1);
+
+ if (hs->building_flags & TILE_SIZE_2x2) {
+ tile = TILE_ADDXY(tile, x, y);
+ } else if (hs->building_flags & TILE_SIZE_1x2) {
+ tile = TILE_ADDXY(tile, 0, y);
+ } else if (hs->building_flags & TILE_SIZE_2x1) {
+ tile = TILE_ADDXY(tile, x, 0);
+ }
+ }
+
+ BuildTownHouse(t, tile);
+ }
}
cur_company.Restore();