diff options
-rw-r--r-- | src/town_cmd.cpp | 210 |
1 files changed, 100 insertions, 110 deletions
diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 31cbe3ea1..63d7dc1f4 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -1717,152 +1717,142 @@ static bool CheckFree2x2Area(TileIndex tile, uint z, bool noslope) */ static bool BuildTownHouse(Town *t, TileIndex tile) { - int i; - uint bitmask; - HouseID house; - Slope slope; - uint z; - uint oneof = 0; - HouseSpec *hs; - /* no house allowed at all, bail out */ if (!CanBuildHouseHere(tile, false)) return false; - /* Above snow? */ - slope = GetTileSlope(tile, &z); + uint z; + Slope slope = GetTileSlope(tile, &z); /* Get the town zone type of the current tile, as well as the climate. * This will allow to easily compare with the specs of the new house to build */ - { - HouseZonesBits rad = GetTownRadiusGroup(t, tile); + HouseZonesBits rad = GetTownRadiusGroup(t, tile); - int land = _opt.landscape; - if (land == LT_ARCTIC && z >= _opt.snow_line) land = -1; + /* Above snow? */ + int land = _opt.landscape; + if (land == LT_ARCTIC && z >= _opt.snow_line) land = -1; - bitmask = (1 << rad) + (1 << (land + 12)); - } + uint bitmask = (1 << rad) + (1 << (land + 12)); /* bits 0-4 are used * bits 11-15 are used * bits 5-10 are not used. */ - { - HouseID houses[HOUSE_MAX]; - int num = 0; - uint probs[HOUSE_MAX]; - uint probability_max = 0; - - /* Generate a list of all possible houses that can be built. */ - for (i = 0; i < HOUSE_MAX; i++) { - hs = GetHouseSpecs(i); - /* Verify that the candidate house spec matches the current tile status */ - if ((~hs->building_availability & bitmask) == 0 && hs->enabled) { - /* Without NewHouses, all houses have probability '1' */ - uint cur_prob = (_loaded_newgrf_features.has_newhouses ? hs->probability : 1); - probability_max += cur_prob; - probs[num] = cur_prob; - houses[num++] = (HouseID)i; - } + HouseID houses[HOUSE_MAX]; + uint num = 0; + uint probs[HOUSE_MAX]; + uint probability_max = 0; + + /* Generate a list of all possible houses that can be built. */ + for (uint i = 0; i < HOUSE_MAX; i++) { + HouseSpec *hs = GetHouseSpecs(i); + /* Verify that the candidate house spec matches the current tile status */ + if ((~hs->building_availability & bitmask) == 0 && hs->enabled) { + /* Without NewHouses, all houses have probability '1' */ + uint cur_prob = (_loaded_newgrf_features.has_newhouses ? hs->probability : 1); + probability_max += cur_prob; + probs[num] = cur_prob; + houses[num++] = (HouseID)i; } + } - uint maxz = GetTileMaxZ(tile); + uint maxz = GetTileMaxZ(tile); - while (probability_max > 0) { - uint r = RandomRange(probability_max); - for (i = 0; i < num; i++) { - if (probs[i] > r) break; - r -= probs[i]; - } + while (probability_max > 0) { + uint r = RandomRange(probability_max); + uint i; + for (i = 0; i < num; i++) { + if (probs[i] > r) break; + r -= probs[i]; + } - house = houses[i]; - probability_max -= probs[i]; + HouseID house = houses[i]; + probability_max -= probs[i]; - /* remove tested house from the set */ - num--; - houses[i] = houses[num]; - probs[i] = probs[num]; + /* remove tested house from the set */ + num--; + houses[i] = houses[num]; + probs[i] = probs[num]; - hs = GetHouseSpecs(house); + HouseSpec *hs = GetHouseSpecs(house); - if (_loaded_newgrf_features.has_newhouses) { - if (hs->override != 0) { - house = hs->override; - hs = GetHouseSpecs(house); - } + if (_loaded_newgrf_features.has_newhouses) { + if (hs->override != 0) { + house = hs->override; + hs = GetHouseSpecs(house); + } - if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue; + if ((hs->extra_flags & BUILDING_IS_HISTORICAL) && !_generating_world) continue; - if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) { - uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile); - if (callback_res != CALLBACK_FAILED && callback_res == 0) continue; - } + if (HasBit(hs->callback_mask, CBM_HOUSE_ALLOW_CONSTRUCTION)) { + uint16 callback_res = GetHouseCallback(CBID_HOUSE_ALLOW_CONSTRUCTION, 0, 0, house, t, tile); + if (callback_res != CALLBACK_FAILED && callback_res == 0) continue; } + } - if (_cur_year < hs->min_date || _cur_year > hs->max_date) continue; + if (_cur_year < hs->min_date || _cur_year > hs->max_date) continue; - /* Special houses that there can be only one of. */ - if (hs->building_flags & BUILDING_IS_CHURCH) { - SetBit(oneof, TOWN_HAS_CHURCH); - } else if (hs->building_flags & BUILDING_IS_STADIUM) { - SetBit(oneof, TOWN_HAS_STADIUM); - } else { - oneof = 0; - } + /* Special houses that there can be only one of. */ + uint oneof = 0; - if (HASBITS(t->flags12 , oneof)) continue; + if (hs->building_flags & BUILDING_IS_CHURCH) { + SetBit(oneof, TOWN_HAS_CHURCH); + } else if (hs->building_flags & BUILDING_IS_STADIUM) { + SetBit(oneof, TOWN_HAS_STADIUM); + } - /* Make sure there is no slope? */ - bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0; - if (noslope && slope != SLOPE_FLAT) continue; + if (HASBITS(t->flags12 , oneof)) continue; - if (hs->building_flags & TILE_SIZE_2x2) { - if (!CheckFree2x2Area(tile, maxz, noslope) && - !CheckFree2x2Area(tile += TileDiffXY(-1, 0), maxz, noslope) && - !CheckFree2x2Area(tile += TileDiffXY( 0, -1), maxz, noslope) && - !CheckFree2x2Area(tile += TileDiffXY( 1, 0), maxz, noslope)) { - /* return to the original tile */ - tile += TileDiffXY(0, 1); - continue; /* continue the while() loop */ - } - } else if (hs->building_flags & TILE_SIZE_2x1) { - /* 'tile' is already checked above - CanBuildHouseHere() and slope test */ - if (!CheckBuildHouseSameZ(tile + TileDiffXY(1, 0), maxz, noslope)) { - if (!CheckBuildHouseSameZ(tile + TileDiffXY(-1, 0), maxz, noslope)) continue; - tile += TileDiffXY(-1, 0); - } - } else if (hs->building_flags & TILE_SIZE_1x2) { - if (!CheckBuildHouseSameZ(tile + TileDiffXY(0, 1), maxz, noslope)) { - if (!CheckBuildHouseSameZ(tile + TileDiffXY(0, -1), maxz, noslope)) continue; - tile += TileDiffXY(0, -1); - } + /* Make sure there is no slope? */ + bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0; + if (noslope && slope != SLOPE_FLAT) continue; + + if (hs->building_flags & TILE_SIZE_2x2) { + if (!CheckFree2x2Area(tile, maxz, noslope) && + !CheckFree2x2Area(tile += TileDiffXY(-1, 0), maxz, noslope) && + !CheckFree2x2Area(tile += TileDiffXY( 0, -1), maxz, noslope) && + !CheckFree2x2Area(tile += TileDiffXY( 1, 0), maxz, noslope)) { + /* return to the original tile */ + tile += TileDiffXY(0, 1); + continue; /* continue the while() loop */ + } + } else if (hs->building_flags & TILE_SIZE_2x1) { + /* 'tile' is already checked above - CanBuildHouseHere() and slope test */ + if (!CheckBuildHouseSameZ(tile + TileDiffXY(1, 0), maxz, noslope)) { + if (!CheckBuildHouseSameZ(tile + TileDiffXY(-1, 0), maxz, noslope)) continue; + tile += TileDiffXY(-1, 0); + } + } else if (hs->building_flags & TILE_SIZE_1x2) { + if (!CheckBuildHouseSameZ(tile + TileDiffXY(0, 1), maxz, noslope)) { + if (!CheckBuildHouseSameZ(tile + TileDiffXY(0, -1), maxz, noslope)) continue; + tile += TileDiffXY(0, -1); } + } - /* build the house */ - t->num_houses++; - IncreaseBuildingCount(t, house); + /* build the house */ + t->num_houses++; + IncreaseBuildingCount(t, house); - /* Special houses that there can be only one of. */ - t->flags12 |= oneof; + /* Special houses that there can be only one of. */ + t->flags12 |= oneof; - { - byte construction_counter = 0, construction_stage = 0; + byte construction_counter = 0; + byte construction_stage = 0; - if (_generating_world) { - uint32 r = Random(); + if (_generating_world) { + uint32 r = Random(); - construction_stage = TOWN_HOUSE_COMPLETED; - if (Chance16(1, 7)) construction_stage = GB(r, 0, 2); + construction_stage = TOWN_HOUSE_COMPLETED; + if (Chance16(1, 7)) construction_stage = GB(r, 0, 2); - if (construction_stage == TOWN_HOUSE_COMPLETED) { - ChangePopulation(t, hs->population); - } else { - construction_counter = GB(r, 2, 2); - } - } - MakeTownHouse(tile, t->index, construction_counter, construction_stage, house, Random()); + if (construction_stage == TOWN_HOUSE_COMPLETED) { + ChangePopulation(t, hs->population); + } else { + construction_counter = GB(r, 2, 2); } - - return true; } + + MakeTownHouse(tile, t->index, construction_counter, construction_stage, house, Random()); + + return true; } return false; |