less cycle skips patch

--HG--
branch : openttd
This commit is contained in:
Pavel Stupnikov
2015-03-05 03:54:24 +03:00
parent 05578c759e
commit 9287d9d0ed
2 changed files with 63 additions and 8 deletions

View File

@@ -1296,6 +1296,47 @@ static void GrowTownInTile(TileIndex *tile_ptr, RoadBits cur_rb, DiagDirection t
GrowTownWithRoad(t1, tile, rcmd);
}
/**
* Checks whether it makes sense to go in particular direction for town expansion.
* Does a simple test for most obvious and common things only.
* @param tile search is currently at
* @param dir direction in which it indends to go
* @return true if is worth going in that direction
*/
static bool CanGrowTownInDirection(TileIndex tile, DiagDirection dir) {
TileIndex target_tile = tile + TileOffsByDiagDir(dir);
if (HasTileWaterGround(target_tile)) return false;
if (!IsValidTile(target_tile)) return false;
RoadBits target_rb = GetTownRoadBits(target_tile);
if (_settings_game.economy.allow_town_roads) {
switch (GetTileType(target_tile)) {
case MP_ROAD: {
if (target_rb == ROAD_NONE) {
/* can't build extra roads here (depot, standard station, etc) */
return false;
}
break;
}
case MP_HOUSE:
case MP_STATION:
case MP_INDUSTRY:
case MP_OBJECT:
/* checked for void and water earlier */
return false;
default:;
}
} else {
/* we can't build roads so bailing out if there is no way
* back or it ends with half-road (i.e. back is the only way) */
RoadBits back_rb = DiagDirToRoadBits(ReverseDiagDir(dir));
if (!(target_rb & back_rb) || !(target_rb & ~back_rb))
return false;
}
return true;
}
/**
* Returns "growth" if a house was built, or no if the build failed.
* @param t town to inquiry
@@ -1346,9 +1387,21 @@ static int GrowTownAtRoad(Town *t, TileIndex tile)
/* Only build in the direction away from the tunnel or bridge. */
target_dir = ReverseDiagDir(GetTunnelBridgeDirection(tile));
} else {
/* Select a random bit from the blockmask, walk a step
* and continue the search from there. */
do target_dir = RandomDiagDir(); while (!(cur_rb & DiagDirToRoadBits(target_dir)));
/* Select a random bit from the blockmask, and check whether
* we can grow in that direction. */
RoadBits dir_rb = ROAD_NONE;
do {
// excluding direction that failed check
cur_rb &= ~dir_rb;
if (cur_rb == ROAD_NONE) {
return GROWTH_SEARCH_STOPPED;
}
// selecting random direction
do {
target_dir = RandomDiagDir();
dir_rb = DiagDirToRoadBits(target_dir);
} while (!(cur_rb & dir_rb));
} while (!CanGrowTownInDirection(tile, target_dir));
}
tile = TileAddByDiagDir(tile, target_dir);