Changeset - r21223:4c519ca92b2d
[Not reviewed]
master
0 1 0
rubidium - 11 years ago 2014-02-06 21:01:50
rubidium@openttd.org
(svn r26311) -Codechange: use a different method for finding whether there is a nearby town when the map has thousands of towns (MJP)
1 file changed with 18 insertions and 0 deletions:
0 comments (0 inline, 0 general)
src/town_cmd.cpp
Show inline comments
 
@@ -340,6 +340,24 @@ static void AnimateTile_Town(TileIndex t
 
 */
 
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) {
0 comments (0 inline, 0 general)