1
0
Fork 0

Codechange: Use EnumBitSet for BuildingFlags.

pull/13428/head
Peter Nelson 2025-01-30 19:53:49 +00:00 committed by Peter Nelson
parent 113205c540
commit 95bd53ddf1
7 changed files with 202 additions and 202 deletions

View File

@ -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_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. static const uint HOUSE_ORIGINAL_NUM_ACCEPTS = 3; ///< Original number of accepted cargo types.
enum BuildingFlags : uint8_t { enum class BuildingFlag : uint8_t {
TILE_NO_FLAG = 0, Size1x1 = 0,
TILE_SIZE_1x1 = 1U << 0, NotSloped = 1,
TILE_NOT_SLOPED = 1U << 1, Size2x1 = 2,
TILE_SIZE_2x1 = 1U << 2, Size1x2 = 3,
TILE_SIZE_1x2 = 1U << 3, Size2x2 = 4,
TILE_SIZE_2x2 = 1U << 4, IsAnimated = 5,
BUILDING_IS_ANIMATED = 1U << 5, IsChurch = 6,
BUILDING_IS_CHURCH = 1U << 6, IsStadium = 7,
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,
}; };
DECLARE_ENUM_AS_BIT_SET(BuildingFlags) using BuildingFlags = EnumBitSet<BuildingFlag, uint8_t>;
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 { enum HouseZonesBits : uint8_t {
HZB_BEGIN = 0, HZB_BEGIN = 0,

View File

@ -2502,7 +2502,7 @@ static ChangeInfoResult TownHouseChangeInfo(uint first, uint last, int prop, Byt
housespec->random_colour[3] = COLOUR_GREEN; housespec->random_colour[3] = COLOUR_GREEN;
/* House flags 40 and 80 are exceptions; these flags are never set automatically. */ /* 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 /* Make sure that the third cargo type is valid in this
* climate. This can cause problems when copying the properties * 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) 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 && if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) &&
(next1 == nullptr || !next1->enabled || (next1->building_flags & BUILDING_HAS_1_TILE) != 0)) || (next1 == nullptr || !next1->enabled || next1->building_flags.Any(BUILDING_HAS_1_TILE))) ||
((hs->building_flags & BUILDING_HAS_4_TILES) != 0 && (hs->building_flags.Any(BUILDING_HAS_4_TILES) &&
(next2 == nullptr || !next2->enabled || (next2->building_flags & BUILDING_HAS_1_TILE) != 0 || (next2 == nullptr || !next2->enabled || next2->building_flags.Any(BUILDING_HAS_1_TILE) ||
next3 == nullptr || !next3->enabled || (next3->building_flags & BUILDING_HAS_1_TILE) != 0))) { next3 == nullptr || !next3->enabled || next3->building_flags.Any(BUILDING_HAS_1_TILE)))) {
hs->enabled = false; 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); 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; 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. /* 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. * 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 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) || if ((hs->building_flags.Any(BUILDING_HAS_2_TILES) && next1->population != 0) ||
((hs->building_flags & BUILDING_HAS_4_TILES) != 0 && (next2->population != 0 || next3->population != 0))) { (hs->building_flags.Any(BUILDING_HAS_4_TILES) && (next2->population != 0 || next3->population != 0))) {
hs->enabled = false; 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); 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; 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. */ /* 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; 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); 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; return false;
@ -9447,7 +9447,7 @@ static void FinaliseHouseArray()
* don't want to have them influencing valid tiles. As such set * don't want to have them influencing valid tiles. As such set
* building_flags to zero here to make sure any house following * building_flags to zero here to make sure any house following
* this one in the pool is properly handled as 1x1 house. */ * 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 */ /* Apply default cargo translation map for unset cargo slots */

View File

@ -646,7 +646,7 @@ bool NewHouseTileLoop(TileIndex tile)
} }
TriggerHouse(tile, HOUSE_TRIGGER_TILE_LOOP); 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 (hs->callback_mask.Test(HouseCallbackMask::AnimationStartStop)) {
/* If this house is marked as having a synchronised callback, all the /* 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)) { if (hs->extra_flags.Test(HouseExtraFlag::SynchronisedCallback1B)) {
uint16_t random = GB(Random(), 0, 16); uint16_t random = GB(Random(), 0, 16);
if (hs->building_flags & BUILDING_HAS_1_TILE) AnimationControl(tile, random); if (hs->building_flags.Any(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.Any(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.Any(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_4_TILES)) AnimationControl(TileAddXY(tile, 1, 1), random);
} else { } else {
AnimationControl(tile, 0); AnimationControl(tile, 0);
} }
@ -719,9 +719,9 @@ static void DoTriggerHouse(TileIndex tile, HouseTrigger trigger, uint8_t base_ra
break; break;
} }
/* Random value of first tile already set. */ /* 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.Any(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.Any(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_HAS_4_TILES)) DoTriggerHouse(TileAddXY(tile, 1, 1), trigger, random_bits, false);
break; break;
} }
} }
@ -769,8 +769,8 @@ void WatchedCargoCallback(TileIndex tile, CargoTypes trigger_cargoes)
hs = HouseSpec::Get(id); hs = HouseSpec::Get(id);
DoWatchedCargoCallback(north, tile, trigger_cargoes, r); 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.Any(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.Any(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_HAS_4_TILES)) DoWatchedCargoCallback(TileAddXY(north, 1, 1), tile, trigger_cargoes, r);
} }

View File

@ -84,13 +84,13 @@ void UpdateHousesAndTowns()
if (t == north_tile) { if (t == north_tile) {
const HouseSpec *hs = HouseSpec::Get(house_type); const HouseSpec *hs = HouseSpec::Get(house_type);
bool valid_house = true; bool valid_house = true;
if (hs->building_flags & TILE_SIZE_2x1) { if (hs->building_flags.Test(BuildingFlag::Size2x1)) {
TileIndex tile = t + TileDiffXY(1, 0); TileIndex tile = t + TileDiffXY(1, 0);
if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; 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); TileIndex tile = t + TileDiffXY(0, 1);
if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; 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); TileIndex tile = t + TileDiffXY(0, 1);
if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false; if (!IsTileType(tile, MP_HOUSE) || GetCleanHouseType(tile) != house_type + 1) valid_house = false;
tile = t + TileDiffXY(1, 0); tile = t + TileDiffXY(1, 0);

View File

@ -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, 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, HZ_TEMP | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 00 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 01 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, 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, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 02 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, 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, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 03 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 04 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 05 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, 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, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 06 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 07 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, MS(1959, CalendarTime::MAX_YEAR, 0, 180, STR_TOWN_BUILDING_NAME_HOTEL_1, 150, 22, 6, 1, 2,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 08 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 09 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0A 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, 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, HZ_TEMP | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0B 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, 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, HZ_TEMP | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0C 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0D 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0E 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 0F 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 10 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 11 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, 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, HZ_TEMP | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 12 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, 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, HZ_TEMP | HZ_ZON5,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 13 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, 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, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 14 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, MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 15 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, MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 16 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, MS( 0, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_1, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 17 CT_PASSENGERS, CT_MAIL, CT_GOODS), // 17
MS( 0, 1951, 15, 70, STR_TOWN_BUILDING_NAME_OLD_HOUSES_1, 75, 6, 3, 1, 0, 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, HZ_TEMP | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 18 CT_PASSENGERS, CT_MAIL, CT_GOODS), // 18
MS( 0, 1952, 12, 75, STR_TOWN_BUILDING_NAME_COTTAGES_1, 75, 7, 3, 1, 0, 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, HZ_TEMP | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 19 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, 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, HZ_TEMP | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1A 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1B 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1C 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1D 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, 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, HZ_TEMP | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1E 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 1F 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 20 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, MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 21 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, MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 22 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, MS(1958, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_STADIUM_2, 300, 5, 4, 0, 0,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 23 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, 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, HZ_TEMP | HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 24 CT_PASSENGERS, CT_MAIL, CT_GOODS), // 24
MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1, 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, HZ_SUBARTC_BELOW | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 25 CT_PASSENGERS, CT_MAIL, CT_FOOD), // 25
MS( 0, 1960, 15, 70, STR_TOWN_BUILDING_NAME_HOUSES_2, 75, 6, 3, 1, 1, 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, HZ_SUBARTC_ABOVE | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 26 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 27 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, 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, HZ_TEMP | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 |HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 28 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, MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 29 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, MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2A 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, MS(1983, CalendarTime::MAX_YEAR, 0, 250, STR_TOWN_BUILDING_NAME_SHOPPING_MALL_1, 300, 5, 8, 2, 3,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 2B 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, 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, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2C 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2D 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, 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, HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2E 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2F CT_PASSENGERS, CT_MAIL, CT_FOOD), // 2F
MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, 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, HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 30 CT_PASSENGERS, CT_MAIL, CT_FOOD), // 30
MS( 0, 1963, 14, 80, STR_TOWN_BUILDING_NAME_HOUSES_2, 70, 6, 3, 1, 2, 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, HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 31 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, 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, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 32 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 33 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, 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, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 34 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 35 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, 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, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 36 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 37 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, 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, HZ_SUBARTC_BELOW | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 38 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 39 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, 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, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3A 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3B 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, 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, HZ_SUBARTC_BELOW | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3C 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 3D 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, 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, HZ_SUBARTC_BELOW | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3E 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 3F 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, 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, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 40 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, 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, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 41 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, 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, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 42 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, MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 43 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, 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, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 44 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, MS(1972, CalendarTime::MAX_YEAR, 0, 160, STR_TOWN_BUILDING_NAME_HOTEL_1, 160, 25, 6, 1, 2,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 45 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, 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, HZ_SUBARTC_BELOW | HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 46 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, 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, HZ_SUBARTC_ABOVE| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 47 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, 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, HZ_SUBARTC_BELOW | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 48 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 49 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, 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, HZ_SUBARTC_BELOW| HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4A 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, 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, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4B 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, 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, HZ_SUBARTC_ABOVE | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4C 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, 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, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 4D 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4E 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 4F 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 50 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, 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, HZ_SUBTROPIC | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 51 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 52 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, 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, HZ_SUBTROPIC | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 53 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2,
CT_PASSENGERS, CT_MAIL, CT_FOOD), // 54 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 55 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 56 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 57 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, 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, HZ_SUBTROPIC,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 58 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 59 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, 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, HZ_SUBTROPIC | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_GOODS), // 5A 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5B 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5C 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, 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, HZ_TOYLND | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5D 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, 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, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5E 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, 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, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 5F 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, 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, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 60 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, 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, HZ_TOYLND | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 61 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 62 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 63 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, MS( 0, CalendarTime::MAX_YEAR, 0, 90, STR_TOWN_BUILDING_NAME_HOUSES_2, 80, 0, 4, 1, 2,
TILE_NO_FLAG, {},
HZ_NOZNS, HZ_NOZNS,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 64 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 65 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, 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, HZ_TOYLND | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 66 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, 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, HZ_TOYLND | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 67 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 68 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 69 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6A 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6B 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_CANDY), // 6C 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, 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, HZ_TOYLND | HZ_ZON5 | HZ_ZON4 | HZ_ZON3 | HZ_ZON2 | HZ_ZON1,
CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 6D CT_PASSENGERS, CT_MAIL, CT_FIZZY_DRINKS), // 6D
}; };

View File

@ -360,7 +360,7 @@ static void AnimateTile_Town(TileIndex tile)
* Not exactly sure when this happens, but probably when a house changes. * Not exactly sure when this happens, but probably when a house changes.
* Before this was just a return...so it'd leak animated tiles.. * Before this was just a return...so it'd leak animated tiles..
* That bug seems to have been here since day 1?? */ * 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); DeleteAnimatedTile(tile);
return; return;
} }
@ -479,9 +479,9 @@ static void RemoveNearbyStations(Town *t, TileIndex tile, BuildingFlags flags)
const Station *st = *it; const Station *st = *it;
bool covers_area = st->TileIsInCatchment(tile); bool covers_area = st->TileIsInCatchment(tile);
if (flags & BUILDING_2_TILES_Y) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(0, 1)); if (flags.Any(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.Any(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_HAS_4_TILES)) covers_area |= st->TileIsInCatchment(tile + TileDiffXY(1, 1));
if (covers_area && !st->CatchmentCoversTown(t->index)) { if (covers_area && !st->CatchmentCoversTown(t->index)) {
it = t->stations_near.erase(it); it = t->stations_near.erase(it);
@ -520,11 +520,11 @@ static void AdvanceSingleHouseConstruction(TileIndex tile)
*/ */
static void AdvanceHouseConstruction(TileIndex tile) static void AdvanceHouseConstruction(TileIndex tile)
{ {
uint flags = HouseSpec::Get(GetHouseType(tile))->building_flags; BuildingFlags flags = HouseSpec::Get(GetHouseType(tile))->building_flags;
if (flags & BUILDING_HAS_1_TILE) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 0)); if (flags.Any(BUILDING_HAS_1_TILE)) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 0));
if (flags & BUILDING_2_TILES_Y) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 1)); if (flags.Any(BUILDING_2_TILES_Y)) AdvanceSingleHouseConstruction(TileAddXY(tile, 0, 1));
if (flags & BUILDING_2_TILES_X) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 0)); if (flags.Any(BUILDING_2_TILES_X)) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 0));
if (flags & BUILDING_HAS_4_TILES) AdvanceSingleHouseConstruction(TileAddXY(tile, 1, 1)); 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); const HouseSpec *hs = HouseSpec::Get(house_id);
/* If the lift has a destination, it is already an animated tile. */ /* 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 && house_id < NEW_HOUSE_OFFSET &&
!LiftHasDestination(tile) && !LiftHasDestination(tile) &&
Chance16(1, 2)) { Chance16(1, 2)) {
@ -671,7 +671,7 @@ static void TileLoop_Town(TileIndex tile)
Backup<CompanyID> cur_company(_current_company, OWNER_TOWN); Backup<CompanyID> 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) && HasBit(t->flags, TOWN_IS_GROWING) &&
CanDeleteHouse(tile) && CanDeleteHouse(tile) &&
GetHouseAge(tile) >= hs->minimum_life && 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 /* 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 * closest to city center. If we do not do this, houses tend to
* wander away from roads and other houses. */ * 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 tiles are always the most north tile. Move the new
* house to the south if we are north of the city center. */ * house to the south if we are north of the city center. */
TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile); TileIndexDiffC grid_pos = TileIndexToTileIndexDiffC(t->xy, tile);
int x = Clamp(grid_pos.x, 0, 1); int x = Clamp(grid_pos.x, 0, 1);
int y = Clamp(grid_pos.y, 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); 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); 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); tile = TileAddXY(tile, x, 0);
} }
} }
@ -2509,7 +2509,7 @@ static inline void ClearMakeHouseTile(TileIndex tile, Town *t, uint8_t counter,
IncreaseBuildingCount(t, type); IncreaseBuildingCount(t, type);
MakeHouseTile(tile, t->index, counter, stage, type, random_bits); 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); 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; BuildingFlags size = HouseSpec::Get(type)->building_flags;
ClearMakeHouseTile(tile, t, counter, stage, type, random_bits); 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.Any(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.Any(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_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); t->stations_near.insert(st);
return true; return true;
}); });
@ -2844,23 +2844,23 @@ static bool TryBuildTownHouse(Town *t, TileIndex tile)
/* Special houses that there can be only one of. */ /* Special houses that there can be only one of. */
uint oneof = 0; uint oneof = 0;
if (hs->building_flags & BUILDING_IS_CHURCH) { if (hs->building_flags.Test(BuildingFlag::IsChurch)) {
SetBit(oneof, TOWN_HAS_CHURCH); 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); SetBit(oneof, TOWN_HAS_STADIUM);
} }
if (t->flags & oneof) continue; if (t->flags & oneof) continue;
/* Make sure there is no slope? */ /* 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 (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; 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; 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; if (!CheckTownBuild2House(&tile, t, maxz, noslope, DIAGDIR_SE)) continue;
} else { } else {
/* 1x1 house checks are already done */ /* 1x1 house checks are already done */
@ -2909,13 +2909,13 @@ CommandCost CmdPlaceHouse(DoCommandFlag flags, TileIndex tile, HouseID house)
int maxz = GetTileMaxZ(tile); int maxz = GetTileMaxZ(tile);
/* Make sure there is no slope? */ /* 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); if (noslope && slope != SLOPE_FLAT) return CommandCost(STR_ERROR_FLAT_LAND_REQUIRED);
TileArea ta = tile; TileArea ta = tile;
if (hs->building_flags & TILE_SIZE_2x2) ta.Add(TileAddXY(tile, 1, 1)); if (hs->building_flags.Test(BuildingFlag::Size2x2)) ta.Add(TileAddXY(tile, 1, 1));
if (hs->building_flags & TILE_SIZE_2x1) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SW)); if (hs->building_flags.Test(BuildingFlag::Size2x1)) 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::Size1x2)) ta.Add(TileAddByDiagDir(tile, DIAGDIR_SE));
/* Check additonal tiles covered by this house. */ /* Check additonal tiles covered by this house. */
for (const TileIndex &subtile : ta) { for (const TileIndex &subtile : ta) {
@ -2957,16 +2957,16 @@ static void DoClearTownHouseHelper(TileIndex tile, Town *t, HouseID house)
TileIndexDiff GetHouseNorthPart(HouseID &house) TileIndexDiff GetHouseNorthPart(HouseID &house)
{ {
if (house >= 3) { // house id 0,1,2 MUST be single tile houses, or this code breaks. 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--; house--;
return TileDiffXY(-1, 0); 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--; house--;
return TileDiffXY(0, -1); 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; house -= 2;
return TileDiffXY(-1, 0); 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; house -= 3;
return TileDiffXY(-1, -1); return TileDiffXY(-1, -1);
} }
@ -2998,17 +2998,17 @@ void ClearTownHouse(Town *t, TileIndex tile)
t->cache.num_houses--; t->cache.num_houses--;
/* Clear flags for houses that only may exist once/town. */ /* 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); 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); ClrBit(t->flags, TOWN_HAS_STADIUM);
} }
/* Do the actual clearing of tiles */ /* Do the actual clearing of tiles */
DoClearTownHouseHelper(tile, t, house); DoClearTownHouseHelper(tile, t, house);
if (hs->building_flags & BUILDING_2_TILES_Y) DoClearTownHouseHelper(tile + TileDiffXY(0, 1), t, ++house); if (hs->building_flags.Any(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.Any(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_HAS_4_TILES)) DoClearTownHouseHelper(tile + TileDiffXY(1, 1), t, ++house);
RemoveNearbyStations(t, tile, hs->building_flags); 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 GetHouseNorthPart(house); // modifies house to the ID of the north tile
const HouseSpec *hs = HouseSpec::Get(house); const HouseSpec *hs = HouseSpec::Get(house);
/* Here we differ from TTDP by checking TILE_NOT_SLOPED */ /* Here we differ from TTDP by checking BuildingFlag::NotSloped */
if (((hs->building_flags & TILE_NOT_SLOPED) == 0) && !IsSteepSlope(tileh_new) && if (!hs->building_flags.Test(BuildingFlag::NotSloped) && !IsSteepSlope(tileh_new) &&
(GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) { (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
bool allow_terraform = true; bool allow_terraform = true;

View File

@ -1435,15 +1435,15 @@ void DrawHouseInGUI(int x, int y, HouseID house_id, int view)
int y_delta = ScaleGUITrad(TILE_PIXELS / 2); int y_delta = ScaleGUITrad(TILE_PIXELS / 2);
const HouseSpec *hs = HouseSpec::Get(house_id); 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, 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 + 1, view); // West corner.
draw(x - x_delta, y - y_delta, house_id + 2, view); // East corner. draw(x - x_delta, y - y_delta, house_id + 2, view); // East corner.
draw(x, y, house_id + 3, view); // South 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 - y_delta, house_id, view); // North east tile.
draw(x - x_delta / 2, y, house_id + 1, view); // South west 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 - y_delta, house_id, view); // North west tile.
draw(x + x_delta / 2, y, house_id + 1, view); // South east tile. draw(x + x_delta / 2, y, house_id + 1, view); // South east tile.
} else { } else {
@ -1643,13 +1643,13 @@ struct BuildHouseWindow : public PickerWindow {
ResetObjectToPlace(); ResetObjectToPlace();
} else { } else {
SetObjectToPlaceWnd(SPR_CURSOR_TOWN, PAL_NONE, HT_RECT | HT_DIAGONAL, this); 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); SetTileSelectSize(2, 2);
} else if (spec->building_flags & TILE_SIZE_2x1) { } else if (spec->building_flags.Test(BuildingFlag::Size2x1)) {
SetTileSelectSize(2, 1); SetTileSelectSize(2, 1);
} else if (spec->building_flags & TILE_SIZE_1x2) { } else if (spec->building_flags.Test(BuildingFlag::Size1x2)) {
SetTileSelectSize(1, 2); SetTileSelectSize(1, 2);
} else if (spec->building_flags & TILE_SIZE_1x1) { } else if (spec->building_flags.Test(BuildingFlag::Size1x1)) {
SetTileSelectSize(1, 1); SetTileSelectSize(1, 1);
} }
} }
@ -1700,10 +1700,10 @@ struct BuildHouseWindow : public PickerWindow {
line << "\n"; line << "\n";
uint8_t size = 0; uint8_t size = 0;
if ((hs->building_flags & TILE_SIZE_1x1) != 0) size = 0x11; if (hs->building_flags.Test(BuildingFlag::Size1x1)) size = 0x11;
if ((hs->building_flags & TILE_SIZE_2x1) != 0) size = 0x21; if (hs->building_flags.Test(BuildingFlag::Size2x1)) size = 0x21;
if ((hs->building_flags & TILE_SIZE_1x2) != 0) size = 0x12; if (hs->building_flags.Test(BuildingFlag::Size1x2)) size = 0x12;
if ((hs->building_flags & TILE_SIZE_2x2) != 0) size = 0x22; if (hs->building_flags.Test(BuildingFlag::Size2x2)) size = 0x22;
SetDParam(0, GB(size, 0, 4)); SetDParam(0, GB(size, 0, 4));
SetDParam(1, GB(size, 4, 4)); SetDParam(1, GB(size, 4, 4));
line << GetString(STR_HOUSE_PICKER_SIZE); line << GetString(STR_HOUSE_PICKER_SIZE);