diff --git a/src/house.h b/src/house.h index a5ee83d409..3a799b0865 100644 --- a/src/house.h +++ b/src/house.h @@ -33,23 +33,23 @@ static const HouseID NUM_HOUSES_PER_GRF = NUM_HOUSES; ///< Number of supported h static const uint HOUSE_NUM_ACCEPTS = 16; ///< Max number of cargoes accepted by a tile static const uint HOUSE_ORIGINAL_NUM_ACCEPTS = 3; ///< Original number of accepted cargo types. -enum BuildingFlags : uint8_t { - TILE_NO_FLAG = 0, - TILE_SIZE_1x1 = 1U << 0, - TILE_NOT_SLOPED = 1U << 1, - TILE_SIZE_2x1 = 1U << 2, - TILE_SIZE_1x2 = 1U << 3, - TILE_SIZE_2x2 = 1U << 4, - BUILDING_IS_ANIMATED = 1U << 5, - BUILDING_IS_CHURCH = 1U << 6, - BUILDING_IS_STADIUM = 1U << 7, - BUILDING_HAS_1_TILE = TILE_SIZE_1x1 | TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2, - BUILDING_HAS_2_TILES = TILE_SIZE_2x1 | TILE_SIZE_1x2 | TILE_SIZE_2x2, - BUILDING_2_TILES_X = TILE_SIZE_2x1 | TILE_SIZE_2x2, - BUILDING_2_TILES_Y = TILE_SIZE_1x2 | TILE_SIZE_2x2, - BUILDING_HAS_4_TILES = TILE_SIZE_2x2, +enum class BuildingFlag : uint8_t { + Size1x1 = 0, + NotSloped = 1, + Size2x1 = 2, + Size1x2 = 3, + Size2x2 = 4, + IsAnimated = 5, + IsChurch = 6, + IsStadium = 7, }; -DECLARE_ENUM_AS_BIT_SET(BuildingFlags) +using BuildingFlags = EnumBitSet; + +static constexpr BuildingFlags BUILDING_HAS_1_TILE = {BuildingFlag::Size1x1, BuildingFlag::Size2x1, BuildingFlag::Size1x2, BuildingFlag::Size2x2}; +static constexpr BuildingFlags BUILDING_HAS_2_TILES = {BuildingFlag::Size2x1, BuildingFlag::Size1x2, BuildingFlag::Size2x2}; +static constexpr BuildingFlags BUILDING_2_TILES_X = {BuildingFlag::Size2x1, BuildingFlag::Size2x2}; +static constexpr BuildingFlags BUILDING_2_TILES_Y = {BuildingFlag::Size1x2, BuildingFlag::Size2x2}; +static constexpr BuildingFlags BUILDING_HAS_4_TILES = {BuildingFlag::Size2x2}; enum HouseZonesBits : uint8_t { HZB_BEGIN = 0, diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 8841ce4b38..151e855ed7 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -2502,7 +2502,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint first, uint last, int prop, Byt housespec->random_colour[3] = COLOUR_GREEN; /* House flags 40 and 80 are exceptions; these flags are never set automatically. */ - housespec->building_flags &= ~(BUILDING_IS_CHURCH | BUILDING_IS_STADIUM); + housespec->building_flags.Reset(BuildingFlag::IsChurch).Reset(BuildingFlag::IsStadium); /* Make sure that the third cargo type is valid in this * climate. This can cause problems when copying the properties @@ -9332,11 +9332,11 @@ void FinaliseCargoArray() */ static bool IsHouseSpecValid(HouseSpec *hs, const HouseSpec *next1, const HouseSpec *next2, const HouseSpec *next3, const std::string &filename) { - if (((hs->building_flags & BUILDING_HAS_2_TILES) != 0 && - (next1 == nullptr || !next1->enabled || (next1->building_flags & BUILDING_HAS_1_TILE) != 0)) || - ((hs->building_flags & BUILDING_HAS_4_TILES) != 0 && - (next2 == nullptr || !next2->enabled || (next2->building_flags & BUILDING_HAS_1_TILE) != 0 || - next3 == nullptr || !next3->enabled || (next3->building_flags & BUILDING_HAS_1_TILE) != 0))) { + if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) && + (next1 == nullptr || !next1->enabled || next1->building_flags.Any(BUILDING_HAS_1_TILE))) || + (hs->building_flags.Any(BUILDING_HAS_4_TILES) && + (next2 == nullptr || !next2->enabled || next2->building_flags.Any(BUILDING_HAS_1_TILE) || + next3 == nullptr || !next3->enabled || next3->building_flags.Any(BUILDING_HAS_1_TILE)))) { hs->enabled = false; if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} as multitile, but no suitable tiles follow. Disabling house.", filename, hs->grf_prop.local_id); return false; @@ -9345,8 +9345,8 @@ static bool IsHouseSpecValid(HouseSpec *hs, const HouseSpec *next1, const HouseS /* Some places sum population by only counting north tiles. Other places use all tiles causing desyncs. * As the newgrf specs define population to be zero for non-north tiles, we just disable the offending house. * If you want to allow non-zero populations somewhen, make sure to sum the population of all tiles in all places. */ - if (((hs->building_flags & BUILDING_HAS_2_TILES) != 0 && next1->population != 0) || - ((hs->building_flags & BUILDING_HAS_4_TILES) != 0 && (next2->population != 0 || next3->population != 0))) { + if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) && next1->population != 0) || + (hs->building_flags.Any(BUILDING_HAS_4_TILES) && (next2->population != 0 || next3->population != 0))) { hs->enabled = false; if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines multitile house {} with non-zero population on additional tiles. Disabling house.", filename, hs->grf_prop.local_id); return false; @@ -9361,7 +9361,7 @@ static bool IsHouseSpecValid(HouseSpec *hs, const HouseSpec *next1, const HouseS } /* Make sure that additional parts of multitile houses are not available. */ - if ((hs->building_flags & BUILDING_HAS_1_TILE) == 0 && (hs->building_availability & HZ_ZONALL) != 0 && (hs->building_availability & HZ_CLIMALL) != 0) { + if (!hs->building_flags.Any(BUILDING_HAS_1_TILE) && (hs->building_availability & HZ_ZONALL) != 0 && (hs->building_availability & HZ_CLIMALL) != 0) { hs->enabled = false; if (!filename.empty()) Debug(grf, 1, "FinaliseHouseArray: {} defines house {} without a size but marked it as available. Disabling house.", filename, hs->grf_prop.local_id); return false; @@ -9447,7 +9447,7 @@ static void FinaliseHouseArray() * don't want to have them influencing valid tiles. As such set * building_flags to zero here to make sure any house following * this one in the pool is properly handled as 1x1 house. */ - hs->building_flags = TILE_NO_FLAG; + hs->building_flags = {}; } /* Apply default cargo translation map for unset cargo slots */ diff --git a/src/newgrf_house.cpp b/src/newgrf_house.cpp index 21472557dc..55fdba282c 100644 --- a/src/newgrf_house.cpp +++ b/src/newgrf_house.cpp @@ -646,7 +646,7 @@ bool NewHouseTileLoop(TileIndex tile) } TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP); - if (hs->building_flags & BUILDING_HAS_1_TILE) TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP_TOP); + if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP_TOP); if (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) { /* If this house is marked as having a synchronised callback, all the @@ -656,10 +656,10 @@ bool NewHouseTileLoop(TileIndex tile) if (hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B)) { uint16_t random = GB(Random(), 0, 16); - if (hs->building_flags & BUILDING_HAS_1_TILE) AnimationControl(tile, random); - if (hs->building_flags & BUILDING_2_TILES_Y) AnimationControl(TileAddXY(tile, 0, 1), random); - if (hs->building_flags & BUILDING_2_TILES_X) AnimationControl(TileAddXY(tile, 1, 0), random); - if (hs->building_flags & BUILDING_HAS_4_TILES) AnimationControl(TileAddXY(tile, 1, 1), random); + if (hs->building_flags.Any(BUILDING_HAS_1_TILE)) AnimationControl(tile, random); + if (hs->building_flags.Any(BUILDING_2_TILES_Y)) AnimationControl(TileAddXY(tile, 0, 1), random); + if (hs->building_flags.Any(BUILDING_2_TILES_X)) AnimationControl(TileAddXY(tile, 1, 0), random); + if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) AnimationControl(TileAddXY(tile, 1, 1), random); } else { AnimationControl(tile, 0); } @@ -719,9 +719,9 @@ static void DoTriggerHouse(TileIndex tile, HouseTrigger trigger, uint8_t base_ra break; } /* Random value of first tile already set. */ - if (hs->building_flags & BUILDING_2_TILES_Y) DoTriggerHouse(TileAddXY(tile, 0, 1), trigger, random_bits, false); - if (hs->building_flags & BUILDING_2_TILES_X) DoTriggerHouse(TileAddXY(tile, 1, 0), trigger, random_bits, false); - if (hs->building_flags & BUILDING_HAS_4_TILES) DoTriggerHouse(TileAddXY(tile, 1, 1), trigger, random_bits, false); + if (hs->building_flags.Any(BUILDING_2_TILES_Y)) DoTriggerHouse(TileAddXY(tile, 0, 1), trigger, random_bits, false); + if (hs->building_flags.Any(BUILDING_2_TILES_X)) DoTriggerHouse(TileAddXY(tile, 1, 0), trigger, random_bits, false); + if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) DoTriggerHouse(TileAddXY(tile, 1, 1), trigger, random_bits, false); break; } } @@ -769,8 +769,8 @@ void WatchedCargoCallback(TileIndex tile, CargoTypes trigger_cargoes) hs = HouseSpec::Get(id); DoWatchedCargoCallback(north, tile, trigger_cargoes, r); - if (hs->building_flags & BUILDING_2_TILES_Y) DoWatchedCargoCallback(TileAddXY(north, 0, 1), tile, trigger_cargoes, r); - if (hs->building_flags & BUILDING_2_TILES_X) DoWatchedCargoCallback(TileAddXY(north, 1, 0), tile, trigger_cargoes, r); - if (hs->building_flags & BUILDING_HAS_4_TILES) DoWatchedCargoCallback(TileAddXY(north, 1, 1), tile, trigger_cargoes, r); + if (hs->building_flags.Any(BUILDING_2_TILES_Y)) DoWatchedCargoCallback(TileAddXY(north, 0, 1), tile, trigger_cargoes, r); + if (hs->building_flags.Any(BUILDING_2_TILES_X)) DoWatchedCargoCallback(TileAddXY(north, 1, 0), tile, trigger_cargoes, r); + if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) DoWatchedCargoCallback(TileAddXY(north, 1, 1), tile, trigger_cargoes, r); } diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index ace50e43e5..414b8854ac 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -84,13 +84,13 @@ void UpdateHousesAndTowns() if (t == north_tile) { const HouseSpec *hs = HouseSpec::Get(house_type); bool valid_house = true; - if (hs->building_flags & TILE_SIZE_2x1) { + if (hs->building_flags.Test(BuildingFlag::Size2x1)) { TileIndex tile = t + TileDiffXY(1, 0); if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; - } else if (hs->building_flags & TILE_SIZE_1x2) { + } else if (hs->building_flags.Test(BuildingFlag::Size1x2)) { TileIndex tile = t + TileDiffXY(0, 1); if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; - } else if (hs->building_flags & TILE_SIZE_2x2) { + } else if (hs->building_flags.Test(BuildingFlag::Size2x2)) { TileIndex tile = t + TileDiffXY(0, 1); if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; tile = t + TileDiffXY(1, 0); diff --git a/src/table/town_land.h b/src/table/town_land.h index 65ff08b0b1..aa744d8802 100644 --- a/src/table/town_land.h +++ b/src/table/town_land.h @@ -1833,443 +1833,443 @@ extern const HouseSpec _original_house_specs[] = { * | | | | | | | | | | | */ MS(1963, CalendarTime::MAX_YEAR, 187, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 70, 8, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 00 MS(1957, CalendarTime::MAX_YEAR, 85, 140, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_1, 130, 55, 8, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 01 MS(1968, CalendarTime::MAX_YEAR, 40, 100, STR_TOWN_BUILDING_NAME_SMALL_BLOCK_OF_FLATS_1, 90, 20, 8, 3, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 02 MS( 0, CalendarTime::MAX_YEAR, 5, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0, - BUILDING_IS_CHURCH | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}), HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 03 MS(1975, CalendarTime::MAX_YEAR, 220, 160, STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1, 160, 85, 10, 4, 6, - BUILDING_IS_ANIMATED | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsAnimated, BuildingFlag::Size1x1}), HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 04 MS(1975, CalendarTime::MAX_YEAR, 220, 160, STR_TOWN_BUILDING_NAME_LARGE_OFFICE_BLOCK_1, 160, 85, 10, 4, 6, - BUILDING_IS_ANIMATED | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsAnimated, BuildingFlag::Size1x1}), HZ_SUBARTC_ABOVE | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 05 MS( 0, CalendarTime::MAX_YEAR, 30, 80, STR_TOWN_BUILDING_NAME_TOWN_HOUSES_1, 80, 12, 4, 1, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 06 MS(1959, CalendarTime::MAX_YEAR, 140, 180, STR_TOWN_BUILDING_NAME_HOTEL_1, 150, 22, 6, 1, 2, - TILE_SIZE_1x2, + BuildingFlag::Size1x2, HZ_TEMP | HZ_ZON5 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 07 MS(1959, CalendarTime::MAX_YEAR, 0, 180, STR_TOWN_BUILDING_NAME_HOTEL_1, 150, 22, 6, 1, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 08 MS(1945, CalendarTime::MAX_YEAR, 0, 65, STR_TOWN_BUILDING_NAME_STATUE_1, 40, 0, 2, 0, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 09 MS(1945, CalendarTime::MAX_YEAR, 0, 65, STR_TOWN_BUILDING_NAME_FOUNTAIN_1, 40, 0, 2, 0, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0A MS( 0, CalendarTime::MAX_YEAR, 0, 60, STR_TOWN_BUILDING_NAME_PARK_1, 75, 0, 2, 0, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0B MS(1935, CalendarTime::MAX_YEAR, 0, 60, STR_TOWN_BUILDING_NAME_PARK_1, 75, 0, 2, 0, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0C MS(1951, CalendarTime::MAX_YEAR, 150, 130, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_2, 110, 65, 8, 2, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0D MS(1930, 1960, 95, 110, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0E MS(1930, 1960, 95, 105, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0F MS(1930, 1960, 95, 107, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 100, 48, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 10 MS(1977, CalendarTime::MAX_YEAR, 130, 200, STR_TOWN_BUILDING_NAME_MODERN_OFFICE_BUILDING_1, 150, 50, 10, 3, 6, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 11 MS(1983, CalendarTime::MAX_YEAR, 6, 145, STR_TOWN_BUILDING_NAME_WAREHOUSE_1, 110, 10, 6, 3, 8, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 12 MS(1985, CalendarTime::MAX_YEAR, 110, 155, STR_TOWN_BUILDING_NAME_OFFICE_BLOCK_3, 110, 55, 6, 2, 6, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 13 MS( 0, CalendarTime::MAX_YEAR, 65, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0, - BUILDING_IS_STADIUM | TILE_SIZE_2x2, + BuildingFlags({BuildingFlag::IsStadium, BuildingFlag::Size2x2}), HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 14 MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 15 MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 16 MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 17 MS( 0, 1951, 15, 70, STR_TOWN_BUILDING_NAME_OLD_HOUSES_1, 75, 6, 3, 1, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 18 MS( 0, 1952, 12, 75, STR_TOWN_BUILDING_NAME_COTTAGES_1, 75, 7, 3, 1, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 19 MS(1931, CalendarTime::MAX_YEAR, 13, 71, STR_TOWN_BUILDING_NAME_HOUSES_1, 75, 8, 3, 1, 0, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1A MS(1935, CalendarTime::MAX_YEAR, 100, 135, STR_TOWN_BUILDING_NAME_FLATS_1, 100, 35, 7, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1B MS(1963, CalendarTime::MAX_YEAR, 170, 145, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_2, 170, 50, 8, 3, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1C MS( 0, 1955, 100, 132, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_2, 135, 40, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1D MS(1973, CalendarTime::MAX_YEAR, 180, 155, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_3, 180, 64, 8, 3, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1E MS( 0, CalendarTime::MAX_YEAR, 35, 220, STR_TOWN_BUILDING_NAME_THEATER_1, 230, 23, 8, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1F MS(1958, CalendarTime::MAX_YEAR, 65, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0, - BUILDING_IS_STADIUM | TILE_SIZE_2x2, + BuildingFlags({BuildingFlag::IsStadium, BuildingFlag::Size2x2}), HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 20 MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 21 MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 22 MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 23 MS(2000, CalendarTime::MAX_YEAR, 140, 170, STR_TOWN_BUILDING_NAME_OFFICES_1, 250, 65, 8, 3, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 24 MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 25 MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 26 MS(1945, CalendarTime::MAX_YEAR, 35, 210, STR_TOWN_BUILDING_NAME_CINEMA_1, 230, 23, 8, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 27 MS(1983, CalendarTime::MAX_YEAR, 180, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3, - TILE_SIZE_2x2, + BuildingFlag::Size2x2, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 |HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 28 MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 29 MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2A MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2B MS( 0, CalendarTime::MAX_YEAR, 80, 100, STR_TOWN_BUILDING_NAME_FLATS_1, 90, 20, 5, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2C MS( 0, CalendarTime::MAX_YEAR, 80, 100, STR_TOWN_BUILDING_NAME_FLATS_1, 90, 20, 5, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2D MS( 0, CalendarTime::MAX_YEAR, 16, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2E MS( 0, CalendarTime::MAX_YEAR, 16, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2F MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 30 MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 31 MS(1966, CalendarTime::MAX_YEAR, 135, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 120, 60, 8, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 32 MS(1966, CalendarTime::MAX_YEAR, 135, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 120, 60, 8, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 33 MS(1970, CalendarTime::MAX_YEAR, 170, 170, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 70, 9, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 34 MS(1970, CalendarTime::MAX_YEAR, 170, 170, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 70, 9, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 35 MS(1974, CalendarTime::MAX_YEAR, 210, 200, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 10, 3, 5, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 36 MS(1974, CalendarTime::MAX_YEAR, 210, 200, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 10, 3, 5, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 37 MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_HOUSES_2, 60, 5, 2, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 38 MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_HOUSES_2, 60, 5, 2, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 39 MS( 0, CalendarTime::MAX_YEAR, 25, 100, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 80, 20, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3A MS( 0, CalendarTime::MAX_YEAR, 25, 100, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 80, 20, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3B MS( 0, CalendarTime::MAX_YEAR, 6, 85, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0, - BUILDING_IS_CHURCH | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}), HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3C MS( 0, CalendarTime::MAX_YEAR, 6, 85, STR_TOWN_BUILDING_NAME_CHURCH_1, 230, 2, 2, 0, 0, - BUILDING_IS_CHURCH | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}), HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3D MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3E MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3F MS( 0, 1960, 90, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 110, 45, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 40 MS( 0, 1960, 90, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 110, 45, 6, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 41 MS(1972, CalendarTime::MAX_YEAR, 140, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 3, - TILE_SIZE_1x2, + BuildingFlag::Size1x2, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 42 MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 43 MS(1972, CalendarTime::MAX_YEAR, 140, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 3, - TILE_SIZE_1x2, + BuildingFlag::Size1x2, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 44 MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 45 MS(1963, CalendarTime::MAX_YEAR, 105, 130, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 105, 50, 7, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 46 MS(1963, CalendarTime::MAX_YEAR, 105, 130, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 105, 50, 7, 2, 3, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 47 MS(1978, CalendarTime::MAX_YEAR, 190, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 135, 75, 9, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 48 MS(1978, CalendarTime::MAX_YEAR, 190, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 135, 75, 9, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 49 MS(1967, CalendarTime::MAX_YEAR, 250, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2, - TILE_SIZE_2x1, + BuildingFlag::Size2x1, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4A MS(1967, CalendarTime::MAX_YEAR, 0, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4B MS(1967, CalendarTime::MAX_YEAR, 250, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2, - TILE_SIZE_2x1, + BuildingFlag::Size2x1, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4C MS(1967, CalendarTime::MAX_YEAR, 0, 140, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 200, 60, 7, 2, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4D MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4E MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4F MS( 0, CalendarTime::MAX_YEAR, 16, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 5, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 50 MS( 0, CalendarTime::MAX_YEAR, 7, 30, STR_TOWN_BUILDING_NAME_HOUSES_2, 30, 4, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 51 MS( 0, CalendarTime::MAX_YEAR, 45, 130, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 15, 6, 2, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 52 MS( 0, CalendarTime::MAX_YEAR, 8, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 200, 3, 2, 0, 0, - BUILDING_IS_CHURCH | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}), HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 53 MS( 0, CalendarTime::MAX_YEAR, 18, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 7, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2, CT_PASSENGERS, CT_MAIL, CT_FOOD), // 54 MS(1973, CalendarTime::MAX_YEAR, 90, 110, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 24, 6, 2, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 55 MS(1962, CalendarTime::MAX_YEAR, 120, 120, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 25, 6, 2, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 56 MS(1984, CalendarTime::MAX_YEAR, 250, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 8, 3, 4, - TILE_SIZE_2x1, + BuildingFlag::Size2x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 57 MS(1984, CalendarTime::MAX_YEAR, 0, 190, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 140, 80, 8, 3, 4, - TILE_NO_FLAG, + {}, HZ_SUBTROPIC, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 58 MS( 0, CalendarTime::MAX_YEAR, 80, 110, STR_TOWN_BUILDING_NAME_FLATS_1, 95, 23, 6, 2, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 59 MS(1993, CalendarTime::MAX_YEAR, 180, 180, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 150, 90, 8, 3, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_GOODS), // 5A MS( 0, CalendarTime::MAX_YEAR, 8, 90, STR_TOWN_BUILDING_NAME_CHURCH_1, 200, 3, 2, 0, 0, - BUILDING_IS_CHURCH | TILE_SIZE_1x1, + BuildingFlags({BuildingFlag::IsChurch, BuildingFlag::Size1x1}), HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5B MS( 0, CalendarTime::MAX_YEAR, 18, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 90, 5, 6, 2, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5C MS( 0, CalendarTime::MAX_YEAR, 7, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 50, 3, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5D MS( 0, CalendarTime::MAX_YEAR, 15, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5E MS( 0, CalendarTime::MAX_YEAR, 17, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5F MS( 0, CalendarTime::MAX_YEAR, 19, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 60 MS( 0, CalendarTime::MAX_YEAR, 21, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 61 MS( 0, CalendarTime::MAX_YEAR, 75, 160, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 20, 8, 4, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 62 MS( 0, CalendarTime::MAX_YEAR, 35, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 9, 4, 1, 2, - TILE_SIZE_1x2, + BuildingFlag::Size1x2, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 63 MS( 0, CalendarTime::MAX_YEAR, 0, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 0, 4, 1, 2, - TILE_NO_FLAG, + {}, HZ_NOZNS, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 64 MS( 0, CalendarTime::MAX_YEAR, 85, 150, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 18, 8, 4, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 65 MS( 0, CalendarTime::MAX_YEAR, 11, 60, STR_TOWN_BUILDING_NAME_IGLOO_1, 45, 3, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 66 MS( 0, CalendarTime::MAX_YEAR, 10, 60, STR_TOWN_BUILDING_NAME_TEPEES_1, 45, 3, 3, 1, 1, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 67 MS( 0, CalendarTime::MAX_YEAR, 67, 140, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 130, 22, 8, 4, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 68 MS( 0, CalendarTime::MAX_YEAR, 86, 145, STR_TOWN_BUILDING_NAME_SHOPS_AND_OFFICES_1, 130, 23, 8, 4, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 69 MS( 0, CalendarTime::MAX_YEAR, 95, 165, STR_TOWN_BUILDING_NAME_TALL_OFFICE_BLOCK_1, 130, 28, 8, 4, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6A MS( 0, CalendarTime::MAX_YEAR, 30, 90, STR_TOWN_BUILDING_NAME_STATUE_1, 70, 10, 4, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6B MS( 0, CalendarTime::MAX_YEAR, 25, 75, STR_TOWN_BUILDING_NAME_TEAPOT_HOUSE_1, 65, 8, 3, 1, 2, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6C MS( 0, CalendarTime::MAX_YEAR, 18, 85, STR_TOWN_BUILDING_NAME_PIGGY_BANK_1, 95, 7, 3, 2, 4, - TILE_SIZE_1x1, + BuildingFlag::Size1x1, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1, CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 6D }; diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index 22f03d76a5..11dd675b5c 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -360,7 +360,7 @@ static void AnimateTile_Town(TileIndex tile) * Not exactly sure when this happens, but probably when a house changes. * Before this was just a return...so it'd leak animated tiles.. * That bug seems to have been here since day 1?? */ - if (!(HouseSpec::Get(GetHouseType(tile))->building_flags & BUILDING_IS_ANIMATED)) { + if (!HouseSpec::Get(GetHouseType(tile))->building_flags.Test(BuildingFlag::IsAnimated)) { DeleteAnimatedTile(tile); return; } @@ -479,9 +479,9 @@ static void RemoveNearbyStations(Town *t, TileIndex tile, BuildingFlags flags) const Station *st = *it; bool covers_area = st->TileIsInCatchment(tile); - if (flags & BUILDING_2_TILES_Y) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(0, 1)); - if (flags & BUILDING_2_TILES_X) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 0)); - if (flags & BUILDING_HAS_4_TILES) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 1)); + if (flags.Any(BUILDING_2_TILES_Y)) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(0, 1)); + if (flags.Any(BUILDING_2_TILES_X)) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 0)); + if (flags.Any(BUILDING_HAS_4_TILES)) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 1)); if (covers_area && !st->CatchmentCoversTown(t->index)) { it = t->stations_near.erase(it); @@ -520,11 +520,11 @@ static void AdvanceSingleHouseConstruction(TileIndex tile) */ static void AdvanceHouseConstruction(TileIndex tile) { - uint flags = HouseSpec::Get(GetHouseType(tile))->building_flags; - if (flags & BUILDING_HAS_1_TILE) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 0)); - if (flags & BUILDING_2_TILES_Y) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 1)); - if (flags & BUILDING_2_TILES_X) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 0)); - if (flags & BUILDING_HAS_4_TILES) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 1)); + BuildingFlags flags = HouseSpec::Get(GetHouseType(tile))->building_flags; + if (flags.Any(BUILDING_HAS_1_TILE)) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 0)); + if (flags.Any(BUILDING_2_TILES_Y)) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 1)); + if (flags.Any(BUILDING_2_TILES_X)) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 0)); + if (flags.Any(BUILDING_HAS_4_TILES)) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 1)); } /** @@ -619,7 +619,7 @@ static void TileLoop_Town(TileIndex tile) const HouseSpec *hs = HouseSpec::Get(house_id); /* If the lift has a destination, it is already an animated tile. */ - if ((hs->building_flags & BUILDING_IS_ANIMATED) && + if (hs->building_flags.Test(BuildingFlag::IsAnimated) && house_id < NEW_HOUSE_OFFSET && !LiftHasDestination(tile) && Chance16(1, 2)) { @@ -671,7 +671,7 @@ static void TileLoop_Town(TileIndex tile) Backup cur_company(_current_company, OWNER_TOWN); - if ((hs->building_flags & BUILDING_HAS_1_TILE) && + if (hs->building_flags.Any(BUILDING_HAS_1_TILE) && HasBit(t->flags, TOWN_IS_GROWING) && CanDeleteHouse(tile) && GetHouseAge(tile) >= hs->minimum_life && @@ -685,18 +685,18 @@ static void TileLoop_Town(TileIndex tile) /* 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) { + if (hs->building_flags.Any(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) { + if (hs->building_flags.Test(BuildingFlag::Size2x2)) { tile = TileAddXY(tile, x, y); - } else if (hs->building_flags & TILE_SIZE_1x2) { + } else if (hs->building_flags.Test(BuildingFlag::Size1x2)) { tile = TileAddXY(tile, 0, y); - } else if (hs->building_flags & TILE_SIZE_2x1) { + } else if (hs->building_flags.Test(BuildingFlag::Size2x1)) { tile = TileAddXY(tile, x, 0); } } @@ -2509,7 +2509,7 @@ static inline void ClearMakeHouseTile(TileIndex tile, Town *t, uint8_t counter, IncreaseBuildingCount(t, type); MakeHouseTile(tile, t->index, counter, stage, type, random_bits); - if (HouseSpec::Get(type)->building_flags & BUILDING_IS_ANIMATED) AddAnimatedTile(tile, false); + if (HouseSpec::Get(type)->building_flags.Test(BuildingFlag::IsAnimated)) AddAnimatedTile(tile, false); MarkTileDirtyByTile(tile); } @@ -2530,11 +2530,11 @@ static void MakeTownHouse(TileIndex tile, Town *t, uint8_t counter, uint8_t stag BuildingFlags size = HouseSpec::Get(type)->building_flags; ClearMakeHouseTile(tile, t, counter, stage, type, random_bits); - if (size & BUILDING_2_TILES_Y) ClearMakeHouseTile(tile + TileDiffXY(0, 1), t, counter, stage, ++type, random_bits); - if (size & BUILDING_2_TILES_X) ClearMakeHouseTile(tile + TileDiffXY(1, 0), t, counter, stage, ++type, random_bits); - if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(tile + TileDiffXY(1, 1), t, counter, stage, ++type, random_bits); + if (size.Any(BUILDING_2_TILES_Y)) ClearMakeHouseTile(tile + TileDiffXY(0, 1), t, counter, stage, ++type, random_bits); + if (size.Any(BUILDING_2_TILES_X)) ClearMakeHouseTile(tile + TileDiffXY(1, 0), t, counter, stage, ++type, random_bits); + if (size.Any(BUILDING_HAS_4_TILES)) ClearMakeHouseTile(tile + TileDiffXY(1, 1), t, counter, stage, ++type, random_bits); - ForAllStationsAroundTiles(TileArea(tile, (size & BUILDING_2_TILES_X) ? 2 : 1, (size & BUILDING_2_TILES_Y) ? 2 : 1), [t](Station *st, TileIndex) { + ForAllStationsAroundTiles(TileArea(tile, size.Any(BUILDING_2_TILES_X) ? 2 : 1, size.Any(BUILDING_2_TILES_Y) ? 2 : 1), [t](Station *st, TileIndex) { t->stations_near.insert(st); return true; }); @@ -2844,23 +2844,23 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile) /* Special houses that there can be only one of. */ uint oneof = 0; - if (hs->building_flags & BUILDING_IS_CHURCH) { + if (hs->building_flags.Test(BuildingFlag::IsChurch)) { SetBit(oneof, TOWN_HAS_CHURCH); - } else if (hs->building_flags & BUILDING_IS_STADIUM) { + } else if (hs->building_flags.Test(BuildingFlag::IsStadium)) { SetBit(oneof, TOWN_HAS_STADIUM); } if (t->flags & oneof) continue; /* Make sure there is no slope? */ - bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0; + bool noslope = hs->building_flags.Test(BuildingFlag::NotSloped); if (noslope && slope != SLOPE_FLAT) continue; - if (hs->building_flags & TILE_SIZE_2x2) { + if (hs->building_flags.Test(BuildingFlag::Size2x2)) { if (!CheckTownBuild2x2House(&tile, t, maxz, noslope)) continue; - } else if (hs->building_flags & TILE_SIZE_2x1) { + } else if (hs->building_flags.Test(BuildingFlag::Size2x1)) { if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SW)) continue; - } else if (hs->building_flags & TILE_SIZE_1x2) { + } else if (hs->building_flags.Test(BuildingFlag::Size1x2)) { if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SE)) continue; } else { /* 1x1 house checks are already done */ @@ -2909,13 +2909,13 @@ CommandCost CmdPlaceHouse(DoCommandFlag flags, TileIndex tile, HouseID house) int maxz = GetTileMaxZ(tile); /* Make sure there is no slope? */ - bool noslope = (hs->building_flags & TILE_NOT_SLOPED) != 0; + bool noslope = hs->building_flags.Test(BuildingFlag::NotSloped); if (noslope && slope != SLOPE_FLAT) return CommandCost(STR_ERROR_FLAT_LAND_REQUIRED); TileArea ta = tile; - if (hs->building_flags & TILE_SIZE_2x2) ta.Add(TileAddXY(tile, 1, 1)); - if (hs->building_flags & TILE_SIZE_2x1) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SW)); - if (hs->building_flags & TILE_SIZE_1x2) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SE)); + if (hs->building_flags.Test(BuildingFlag::Size2x2)) ta.Add(TileAddXY(tile, 1, 1)); + if (hs->building_flags.Test(BuildingFlag::Size2x1)) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SW)); + if (hs->building_flags.Test(BuildingFlag::Size1x2)) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SE)); /* Check additonal tiles covered by this house. */ for (const TileIndex &subtile : ta) { @@ -2957,16 +2957,16 @@ static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house) TileIndexDiff GetHouseNorthPart(HouseID &house) { if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks. - if (HouseSpec::Get(house - 1)->building_flags & TILE_SIZE_2x1) { + if (HouseSpec::Get(house - 1)->building_flags.Test(BuildingFlag::Size2x1)) { house--; return TileDiffXY(-1, 0); - } else if (HouseSpec::Get(house - 1)->building_flags & BUILDING_2_TILES_Y) { + } else if (HouseSpec::Get(house - 1)->building_flags.Any(BUILDING_2_TILES_Y)) { house--; return TileDiffXY(0, -1); - } else if (HouseSpec::Get(house - 2)->building_flags & BUILDING_HAS_4_TILES) { + } else if (HouseSpec::Get(house - 2)->building_flags.Any(BUILDING_HAS_4_TILES)) { house -= 2; return TileDiffXY(-1, 0); - } else if (HouseSpec::Get(house - 3)->building_flags & BUILDING_HAS_4_TILES) { + } else if (HouseSpec::Get(house - 3)->building_flags.Any(BUILDING_HAS_4_TILES)) { house -= 3; return TileDiffXY(-1, -1); } @@ -2998,17 +2998,17 @@ void ClearTownHouse(Town *t, TileIndex tile) t->cache.num_houses--; /* Clear flags for houses that only may exist once/town. */ - if (hs->building_flags & BUILDING_IS_CHURCH) { + if (hs->building_flags.Test(BuildingFlag::IsChurch)) { ClrBit(t->flags, TOWN_HAS_CHURCH); - } else if (hs->building_flags & BUILDING_IS_STADIUM) { + } else if (hs->building_flags.Test(BuildingFlag::IsStadium)) { ClrBit(t->flags, TOWN_HAS_STADIUM); } /* Do the actual clearing of tiles */ DoClearTownHouseHelper(tile, t, house); - if (hs->building_flags & BUILDING_2_TILES_Y) DoClearTownHouseHelper(tile + TileDiffXY(0, 1), t, ++house); - if (hs->building_flags & BUILDING_2_TILES_X) DoClearTownHouseHelper(tile + TileDiffXY(1, 0), t, ++house); - if (hs->building_flags & BUILDING_HAS_4_TILES) DoClearTownHouseHelper(tile + TileDiffXY(1, 1), t, ++house); + if (hs->building_flags.Any(BUILDING_2_TILES_Y)) DoClearTownHouseHelper(tile + TileDiffXY(0, 1), t, ++house); + if (hs->building_flags.Any(BUILDING_2_TILES_X)) DoClearTownHouseHelper(tile + TileDiffXY(1, 0), t, ++house); + if (hs->building_flags.Any(BUILDING_HAS_4_TILES)) DoClearTownHouseHelper(tile + TileDiffXY(1, 1), t, ++house); RemoveNearbyStations(t, tile, hs->building_flags); @@ -4090,8 +4090,8 @@ static CommandCost TerraformTile_Town(TileIndex tile, DoCommandFlag flags, int z GetHouseNorthPart(house); // modifies house to the ID of the north tile const HouseSpec *hs = HouseSpec::Get(house); - /* Here we differ from TTDP by checking TILE_NOT_SLOPED */ - if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) && + /* Here we differ from TTDP by checking BuildingFlag::NotSloped */ + if (!hs->building_flags.Test(BuildingFlag::NotSloped) && !IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) { bool allow_terraform = true; diff --git a/src/town_gui.cpp b/src/town_gui.cpp index 10508e5992..20482c88a5 100644 --- a/src/town_gui.cpp +++ b/src/town_gui.cpp @@ -1435,15 +1435,15 @@ void DrawHouseInGUI(int x, int y, HouseID house_id, int view) int y_delta = ScaleGUITrad(TILE_PIXELS / 2); const HouseSpec *hs = HouseSpec::Get(house_id); - if (hs->building_flags & TILE_SIZE_2x2) { + if (hs->building_flags.Test(BuildingFlag::Size2x2)) { draw(x, y - y_delta - y_delta, house_id, view); // North corner. draw(x + x_delta, y - y_delta, house_id + 1, view); // West corner. draw(x - x_delta, y - y_delta, house_id + 2, view); // East corner. draw(x, y, house_id + 3, view); // South corner. - } else if (hs->building_flags & TILE_SIZE_2x1) { + } else if (hs->building_flags.Test(BuildingFlag::Size2x1)) { draw(x + x_delta / 2, y - y_delta, house_id, view); // North east tile. draw(x - x_delta / 2, y, house_id + 1, view); // South west tile. - } else if (hs->building_flags & TILE_SIZE_1x2) { + } else if (hs->building_flags.Test(BuildingFlag::Size1x2)) { draw(x - x_delta / 2, y - y_delta, house_id, view); // North west tile. draw(x + x_delta / 2, y, house_id + 1, view); // South east tile. } else { @@ -1643,13 +1643,13 @@ struct BuildHouseWindow : public PickerWindow { ResetObjectToPlace(); } else { SetObjectToPlaceWnd(SPR_CURSOR_TOWN, PAL_NONE, HT_RECT | HT_DIAGONAL, this); - if (spec->building_flags & TILE_SIZE_2x2) { + if (spec->building_flags.Test(BuildingFlag::Size2x2)) { SetTileSelectSize(2, 2); - } else if (spec->building_flags & TILE_SIZE_2x1) { + } else if (spec->building_flags.Test(BuildingFlag::Size2x1)) { SetTileSelectSize(2, 1); - } else if (spec->building_flags & TILE_SIZE_1x2) { + } else if (spec->building_flags.Test(BuildingFlag::Size1x2)) { SetTileSelectSize(1, 2); - } else if (spec->building_flags & TILE_SIZE_1x1) { + } else if (spec->building_flags.Test(BuildingFlag::Size1x1)) { SetTileSelectSize(1, 1); } } @@ -1700,10 +1700,10 @@ struct BuildHouseWindow : public PickerWindow { line << "\n"; uint8_t size = 0; - if ((hs->building_flags & TILE_SIZE_1x1) != 0) size = 0x11; - if ((hs->building_flags & TILE_SIZE_2x1) != 0) size = 0x21; - if ((hs->building_flags & TILE_SIZE_1x2) != 0) size = 0x12; - if ((hs->building_flags & TILE_SIZE_2x2) != 0) size = 0x22; + if (hs->building_flags.Test(BuildingFlag::Size1x1)) size = 0x11; + if (hs->building_flags.Test(BuildingFlag::Size2x1)) size = 0x21; + if (hs->building_flags.Test(BuildingFlag::Size1x2)) size = 0x12; + if (hs->building_flags.Test(BuildingFlag::Size2x2)) size = 0x22; SetDParam(0, GB(size, 0, 4)); SetDParam(1, GB(size, 4, 4)); line << GetString(STR_HOUSE_PICKER_SIZE);