From d05ff6e77b401c87b69bdc68ce2d6652f431b667 Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 6 Feb 2014 21:01:50 +0000 Subject: (svn r26311) -Codechange: use a different method for finding whether there is a nearby town when the map has thousands of towns (MJP) --- src/town_cmd.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 13616a2cc..09ca7cee9 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -340,6 +340,24 @@ static void AnimateTile_Town(TileIndex tile) */ static bool IsCloseToTown(TileIndex tile, uint dist) { + /* On a large map with many towns, it may be faster to check the surroundings of the tile. + * An iteration in TILE_AREA_LOOP() is generally 2 times faster than one in FOR_ALL_TOWNS(). */ + if (Town::GetNumItems() > (size_t) (dist * dist * 2)) { + const int tx = TileX(tile); + const int ty = TileY(tile); + TileArea tile_area = TileArea( + TileXY(max(0, tx - (int) dist), max(0, ty - (int) dist)), + TileXY(min(MapMaxX(), tx + (int) dist), min(MapMaxY(), ty + (int) dist)) + ); + TILE_AREA_LOOP(atile, tile_area) { + if (GetTileType(atile) == MP_HOUSE) { + Town *t = Town::GetByTile(atile); + if (DistanceManhattan(tile, t->xy) < dist) return true; + } + } + return false; + } + const Town *t; FOR_ALL_TOWNS(t) { -- cgit v1.2.3-70-g09d2