From 2bb3f368e3a5d9cf244c50d4999d2dd842068e1f Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Thu, 6 Feb 2025 20:08:50 +0000 Subject: [PATCH] Codechange: Use EnumBitSet for IndustryBehaviours. --- src/disaster_vehicle.cpp | 16 +++--- src/industry_cmd.cpp | 52 +++++++++--------- src/industry_gui.cpp | 4 +- src/industrytype.h | 47 ++++++++-------- src/newgrf.cpp | 2 +- src/newgrf_industries.cpp | 10 ++-- src/saveload/afterload.cpp | 4 +- src/script/api/script_industry.cpp | 6 +-- src/script/api/script_industrytype.cpp | 8 +-- src/table/build_industry.h | 74 +++++++++++++------------- 10 files changed, 111 insertions(+), 112 deletions(-) diff --git a/src/disaster_vehicle.cpp b/src/disaster_vehicle.cpp index 063f48da37..f5891de93e 100644 --- a/src/disaster_vehicle.cpp +++ b/src/disaster_vehicle.cpp @@ -427,9 +427,9 @@ static void DestructIndustry(Industry *i) * @param image_override The image at the time the aircraft is firing. * @param leave_at_top True iff the vehicle leaves the map at the north side. * @param news_message The string that's used as news message. - * @param industry_flag Only attack industries that have this flag set. + * @param behaviour Only attack industries that have this behaviour set. */ -static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, bool leave_at_top, StringID news_message, IndustryBehaviour industry_flag) +static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, bool leave_at_top, StringID news_message, IndustryBehaviour behaviour) { v->tick_counter++; v->image_override = (v->state == 1 && HasBit(v->tick_counter, 2)) ? image_override : 0; @@ -481,7 +481,7 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, b IndustryID ind = GetIndustryIndex(tile); v->dest_tile = TileIndex{ind}; - if (GetIndustrySpec(Industry::Get(ind)->type)->behaviour & industry_flag) { + if (GetIndustrySpec(Industry::Get(ind)->type)->behaviour.Test(behaviour)) { v->state = 1; v->age = CalendarTime::MIN_DATE; } @@ -493,13 +493,13 @@ static bool DisasterTick_Aircraft(DisasterVehicle *v, uint16_t image_override, b /** Airplane handling. */ static bool DisasterTick_Airplane(DisasterVehicle *v) { - return DisasterTick_Aircraft(v, SPR_F_15_FIRING, true, STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY, INDUSTRYBEH_AIRPLANE_ATTACKS); + return DisasterTick_Aircraft(v, SPR_F_15_FIRING, true, STR_NEWS_DISASTER_AIRPLANE_OIL_REFINERY, IndustryBehaviour::AirplaneAttacks); } /** Helicopter handling. */ static bool DisasterTick_Helicopter(DisasterVehicle *v) { - return DisasterTick_Aircraft(v, SPR_AH_64A_FIRING, false, STR_NEWS_DISASTER_HELICOPTER_FACTORY, INDUSTRYBEH_CHOPPER_ATTACKS); + return DisasterTick_Aircraft(v, SPR_AH_64A_FIRING, false, STR_NEWS_DISASTER_HELICOPTER_FACTORY, IndustryBehaviour::ChopperAttacks); } /** Helicopter rotor blades; keep these spinning */ @@ -775,7 +775,7 @@ static void Disaster_Airplane_Init() Industry *found = nullptr; for (Industry *i : Industry::Iterate()) { - if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_AIRPLANE_ATTACKS) && + if (GetIndustrySpec(i->type)->behaviour.Test(IndustryBehaviour::AirplaneAttacks) && (found == nullptr || Chance16(1, 2))) { found = i; } @@ -801,7 +801,7 @@ static void Disaster_Helicopter_Init() Industry *found = nullptr; for (Industry *i : Industry::Iterate()) { - if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CHOPPER_ATTACKS) && + if (GetIndustrySpec(i->type)->behaviour.Test(IndustryBehaviour::ChopperAttacks) && (found == nullptr || Chance16(1, 2))) { found = i; } @@ -886,7 +886,7 @@ static void Disaster_CoalMine_Init() for (m = 0; m < 15; m++) { for (const Industry *i : Industry::Iterate()) { - if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) { + if (GetIndustrySpec(i->type)->behaviour.Test(IndustryBehaviour::CanSubsidence) && --index < 0) { SetDParam(0, i->town->index); AddTileNewsItem(STR_NEWS_DISASTER_COAL_MINE_SUBSIDENCE, NT_ACCIDENT, i->location.tile + TileDiffXY(1, 1)); // keep the news, even when the mine closes diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index 68bad28303..bfe7e34d2d 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -171,7 +171,7 @@ Industry::~Industry() } } - if (GetIndustrySpec(this->type)->behaviour & INDUSTRYBEH_PLANT_FIELDS) { + if (GetIndustrySpec(this->type)->behaviour.Test(IndustryBehaviour::PlantFields)) { TileArea ta = TileArea(this->location.tile, 0, 0).Expand(21); /* Remove the farmland and convert it to regular tiles over time. */ @@ -502,7 +502,7 @@ static CommandCost ClearTile_Industry(TileIndex tile, DoCommandFlag flags) !_cheats.magic_bulldozer.value) || ((flags & DC_AUTO) != 0) || (_current_company == OWNER_WATER && - ((indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) || + (indspec->behaviour.Test(IndustryBehaviour::BuiltOnWater) || HasBit(GetIndustryTileSpec(GetIndustryGfx(tile))->slopes_refused, 5)))) { SetDParam(1, indspec->name); return CommandCost(flags & DC_AUTO ? STR_ERROR_GENERIC_OBJECT_IN_THE_WAY : INVALID_STRING_ID); @@ -1197,9 +1197,9 @@ static void ProduceIndustryGoods(Industry *i) /* Handle non-callback cargo production. */ if (!indsp->callback_mask.Test(IndustryCallbackMask::Production256Ticks)) ProduceIndustryGoodsHelper(i, true); - IndustryBehaviour indbehav = indsp->behaviour; + IndustryBehaviours indbehav = indsp->behaviour; - if ((indbehav & INDUSTRYBEH_PLANT_FIELDS) != 0) { + if (indbehav.Test(IndustryBehaviour::PlantFields)) { uint16_t cb_res = CALLBACK_FAILED; if (indsp->callback_mask.Test(IndustryCallbackMask::SpecialEffect)) { cb_res = GetIndustryCallback(CBID_INDUSTRY_SPECIAL_EFFECT, Random(), 0, i, i->type, i->location.tile); @@ -1214,7 +1214,7 @@ static void ProduceIndustryGoods(Industry *i) if (plant) PlantRandomFarmField(i); } - if ((indbehav & INDUSTRYBEH_CUT_TREES) != 0) { + if (indbehav.Test(IndustryBehaviour::CutTrees)) { uint16_t cb_res = CALLBACK_FAILED; if (indsp->callback_mask.Test(IndustryCallbackMask::SpecialEffect)) { cb_res = GetIndustryCallback(CBID_INDUSTRY_SPECIAL_EFFECT, Random(), 1, i, i->type, i->location.tile); @@ -1472,7 +1472,7 @@ bool IsSlopeRefused(Slope current, Slope refused) */ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTileLayout &layout, IndustryType type) { - IndustryBehaviour ind_behav = GetIndustrySpec(type)->behaviour; + IndustryBehaviours ind_behav = GetIndustrySpec(type)->behaviour; for (const IndustryTileLayoutTile &it : layout) { IndustryGfx gfx = GetTranslatedIndustryTileID(it.gfx); @@ -1495,10 +1495,10 @@ static CommandCost CheckIfIndustryTilesAreFree(TileIndex tile, const IndustryTil const IndustryTileSpec *its = GetIndustryTileSpec(gfx); /* Perform land/water check if not disabled */ - if (!HasBit(its->slopes_refused, 5) && ((HasTileWaterClass(cur_tile) && IsTileOnWater(cur_tile)) == !(ind_behav & INDUSTRYBEH_BUILT_ONWATER))) return CommandCost(STR_ERROR_SITE_UNSUITABLE); + if (!HasBit(its->slopes_refused, 5) && ((HasTileWaterClass(cur_tile) && IsTileOnWater(cur_tile)) != ind_behav.Test(IndustryBehaviour::BuiltOnWater))) return CommandCost(STR_ERROR_SITE_UNSUITABLE); - if ((ind_behav & (INDUSTRYBEH_ONLY_INTOWN | INDUSTRYBEH_TOWN1200_MORE)) || // Tile must be a house - ((ind_behav & INDUSTRYBEH_ONLY_NEARTOWN) && IsTileType(cur_tile, MP_HOUSE))) { // Tile is allowed to be a house (and it is a house) + if (ind_behav.Any({IndustryBehaviour::OnlyInTown, IndustryBehaviour::Town1200More}) || // Tile must be a house + (ind_behav.Test(IndustryBehaviour::OnlyNearTown) && IsTileType(cur_tile, MP_HOUSE))) { // Tile is allowed to be a house (and it is a house) if (!IsTileType(cur_tile, MP_HOUSE)) { return CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS); } @@ -1576,11 +1576,11 @@ static CommandCost CheckIfIndustryTileSlopes(TileIndex tile, const IndustryTileL */ static CommandCost CheckIfIndustryIsAllowed(TileIndex tile, IndustryType type, const Town *t) { - if ((GetIndustrySpec(type)->behaviour & INDUSTRYBEH_TOWN1200_MORE) && t->cache.population < 1200) { + if (GetIndustrySpec(type)->behaviour.Test(IndustryBehaviour::Town1200More) && t->cache.population < 1200) { return CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS_WITH_POPULATION_OF_1200); } - if ((GetIndustrySpec(type)->behaviour & INDUSTRYBEH_ONLY_NEARTOWN) && DistanceMax(t->xy, tile) > 9) { + if (GetIndustrySpec(type)->behaviour.Test(IndustryBehaviour::OnlyNearTown) && DistanceMax(t->xy, tile) > 9) { return CommandCost(STR_ERROR_CAN_ONLY_BE_BUILT_NEAR_TOWN_CENTER); } @@ -1860,7 +1860,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, /* Clear all input cargo types */ i->accepted.clear(); /* Query actual types */ - uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? INDUSTRY_NUM_INPUTS : 3; + uint maxcargoes = indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited) ? INDUSTRY_NUM_INPUTS : 3; for (uint j = 0; j < maxcargoes; j++) { uint16_t res = GetIndustryCallback(CBID_INDUSTRY_INPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; @@ -1872,7 +1872,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, /* Industries without "unlimited" cargo types support depend on the specific order/slots of cargo types. * They need to be able to blank out specific slots without aborting the callback sequence, * and solve this by returning undefined cargo indexes. Skip these. */ - if (!IsValidCargoType(cargo) && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) { + if (!IsValidCargoType(cargo) && !indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited)) { /* As slots are allocated as needed now, this means we do need to add a slot for the invalid cargo. */ Industry::AcceptedCargo &a = i->accepted.emplace_back(); a.cargo = INVALID_CARGO; @@ -1898,7 +1898,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, /* Clear all output cargo types */ i->produced.clear(); /* Query actual types */ - uint maxcargoes = (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) ? INDUSTRY_NUM_OUTPUTS : 2; + uint maxcargoes = indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited) ? INDUSTRY_NUM_OUTPUTS : 2; for (uint j = 0; j < maxcargoes; j++) { uint16_t res = GetIndustryCallback(CBID_INDUSTRY_OUTPUT_CARGO_TYPES, j, 0, i, type, INVALID_TILE); if (res == CALLBACK_FAILED || GB(res, 0, 8) == UINT8_MAX) break; @@ -1908,7 +1908,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, } CargoType cargo = GetCargoTranslation(GB(res, 0, 8), indspec->grf_prop.grffile); /* Allow older GRFs to skip slots. */ - if (!IsValidCargoType(cargo) && !(indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED)) { + if (!IsValidCargoType(cargo) && !indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited)) { /* As slots are allocated as needed now, this means we do need to add a slot for the invalid cargo. */ Industry::ProducedCargo &p = i->produced.emplace_back(); p.cargo = INVALID_CARGO; @@ -1956,7 +1956,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type, } } - if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) { + if (GetIndustrySpec(i->type)->behaviour.Test(IndustryBehaviour::PlantOnBuild)) { for (uint j = 0; j != 50; j++) PlantRandomFarmField(i); } InvalidateWindowData(WC_INDUSTRY_DIRECTORY, 0, IDIWD_FORCE_REBUILD); @@ -2301,7 +2301,7 @@ static uint32_t GetScaledIndustryGenerationProbability(IndustryType it, bool *fo * For simplicity we scale in both cases, though scaling the probabilities of all industries has no effect. */ chance = (ind_spc->check_proc == CHECK_REFINERY || ind_spc->check_proc == CHECK_OIL_RIG) ? Map::ScaleBySize1D(chance) : Map::ScaleBySize(chance); - *force_at_least_one = (chance > 0) && !(ind_spc->behaviour & INDUSTRYBEH_NOBUILT_MAPCREATION) && (_game_mode != GM_EDITOR); + *force_at_least_one = (chance > 0) && !ind_spc->behaviour.Test(IndustryBehaviour::NoBuildMapCreation) && (_game_mode != GM_EDITOR); return chance; } } @@ -2322,13 +2322,13 @@ static uint16_t GetIndustryGamePlayProbability(IndustryType it, uint8_t *min_num const IndustrySpec *ind_spc = GetIndustrySpec(it); uint8_t chance = ind_spc->appear_ingame[to_underlying(_settings_game.game_creation.landscape)]; if (!ind_spc->enabled || ind_spc->layouts.empty() || - ((ind_spc->behaviour & INDUSTRYBEH_BEFORE_1950) && TimerGameCalendar::year > 1950) || - ((ind_spc->behaviour & INDUSTRYBEH_AFTER_1960) && TimerGameCalendar::year < 1960) || + (ind_spc->behaviour.Test(IndustryBehaviour::Before1950) && TimerGameCalendar::year > 1950) || + (ind_spc->behaviour.Test(IndustryBehaviour::After1960) && TimerGameCalendar::year < 1960) || (chance = GetIndustryProbabilityCallback(it, IACT_RANDOMCREATION, chance)) == 0) { *min_number = 0; return 0; } - *min_number = (ind_spc->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) ? 1 : 0; + *min_number = ind_spc->behaviour.Test(IndustryBehaviour::CanCloseLastInstance) ? 1 : 0; return chance; } @@ -2663,7 +2663,7 @@ void IndustryBuildData::TryBuildNewIndustry() /** * Protects an industry from closure if the appropriate flags and conditions are met - * INDUSTRYBEH_CANCLOSE_LASTINSTANCE must be set (which, by default, it is not) and the + * CanCloseLastInstance must be set (which, by default, it is not) and the * count of industries of this type must one (or lower) in order to be protected * against closure. * @param type IndustryType been queried @@ -2674,8 +2674,8 @@ static bool CheckIndustryCloseDownProtection(IndustryType type) const IndustrySpec *indspec = GetIndustrySpec(type); /* oil wells (or the industries with that flag set) are always allowed to closedown */ - if ((indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _settings_game.game_creation.landscape == LandscapeType::Temperate) return false; - return (indspec->behaviour & INDUSTRYBEH_CANCLOSE_LASTINSTANCE) == 0 && Industry::GetIndustryTypeCount(type) <= 1; + if (indspec->behaviour.Test(IndustryBehaviour::DontIncrProd) && _settings_game.game_creation.landscape == LandscapeType::Temperate) return false; + return !indspec->behaviour.Test(IndustryBehaviour::CanCloseLastInstance) && Industry::GetIndustryTypeCount(type) <= 1; } /** @@ -2843,7 +2843,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) if (standard || (!callback_enabled && (indspec->life_type & (INDUSTRYLIFE_ORGANIC | INDUSTRYLIFE_EXTRACTIVE)) != 0)) { /* decrease or increase */ - bool only_decrease = (indspec->behaviour & INDUSTRYBEH_DONT_INCR_PROD) && _settings_game.game_creation.landscape == LandscapeType::Temperate; + bool only_decrease = indspec->behaviour.Test(IndustryBehaviour::DontIncrProd) && _settings_game.game_creation.landscape == LandscapeType::Temperate; if (original_economy) { if (only_decrease || Chance16(1, 3)) { @@ -2883,7 +2883,7 @@ static void ChangeIndustryProduction(Industry *i, bool monthly) /* Prevent production to overflow or Oil Rig passengers to be over-"produced" */ new_prod = Clamp(new_prod, 1, 255); - if (IsValidCargoType(p.cargo) && p.cargo == GetCargoTypeByLabel(CT_PASSENGERS) && !(indspec->behaviour & INDUSTRYBEH_NO_PAX_PROD_CLAMP)) { + if (IsValidCargoType(p.cargo) && p.cargo == GetCargoTypeByLabel(CT_PASSENGERS) && !indspec->behaviour.Test(IndustryBehaviour::NoPaxProdClamp)) { new_prod = Clamp(new_prod, 0, 16); } @@ -3118,7 +3118,7 @@ bool IndustrySpec::IsProcessingIndustry() const { /* Lumber mills are neither raw nor processing */ return (this->life_type & INDUSTRYLIFE_PROCESSING) != 0 && - (this->behaviour & INDUSTRYBEH_CUT_TREES) == 0; + !this->behaviour.Test(IndustryBehaviour::CutTrees); } /** diff --git a/src/industry_gui.cpp b/src/industry_gui.cpp index c416345cdc..b3c90c8e8a 100644 --- a/src/industry_gui.cpp +++ b/src/industry_gui.cpp @@ -158,7 +158,7 @@ static inline void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixTy { static_assert(std::tuple_size_v> <= lengthof(suffixes)); - if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) { + if (indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited)) { /* Reworked behaviour with new many-in-many-out scheme */ for (uint j = 0; j < lengthof(suffixes); j++) { if (IsValidCargoType(cargoes[j])) { @@ -210,7 +210,7 @@ void GetCargoSuffix(CargoSuffixInOut use_input, CargoSuffixType cst, const Indus suffix.text.clear(); suffix.display = CSD_CARGO; if (!IsValidCargoType(cargo)) return; - if (indspec->behaviour & INDUSTRYBEH_CARGOTYPES_UNLIMITED) { + if (indspec->behaviour.Test(IndustryBehaviour::CargoTypesUnlimited)) { uint8_t local_id = indspec->grf_prop.grffile->cargo_map[cargo]; // should we check the value for valid? uint cargotype = local_id << 16 | use_input; GetCargoSuffix(cargotype, cst, ind, ind_type, indspec, suffix); diff --git a/src/industrytype.h b/src/industrytype.h index b42dbe3c0f..568a7c04ed 100644 --- a/src/industrytype.h +++ b/src/industrytype.h @@ -53,31 +53,30 @@ enum IndustryConstructionType : uint8_t { }; /** Various industry behaviours mostly to represent original TTD specialities */ -enum IndustryBehaviour : uint32_t { - INDUSTRYBEH_NONE = 0, - INDUSTRYBEH_PLANT_FIELDS = 1 << 0, ///< periodically plants fields around itself (temp and arctic farms) - INDUSTRYBEH_CUT_TREES = 1 << 1, ///< cuts trees and produce first output cargo from them (lumber mill) - INDUSTRYBEH_BUILT_ONWATER = 1 << 2, ///< is built on water (oil rig) - INDUSTRYBEH_TOWN1200_MORE = 1 << 3, ///< can only be built in towns larger than 1200 inhabitants (temperate bank) - INDUSTRYBEH_ONLY_INTOWN = 1 << 4, ///< can only be built in towns (arctic/tropic banks, water tower) - INDUSTRYBEH_ONLY_NEARTOWN = 1 << 5, ///< is always built near towns (toy shop) - INDUSTRYBEH_PLANT_ON_BUILT = 1 << 6, ///< Fields are planted around when built (all farms) - INDUSTRYBEH_DONT_INCR_PROD = 1 << 7, ///< do not increase production (oil wells) in the temperate climate - INDUSTRYBEH_BEFORE_1950 = 1 << 8, ///< can only be built before 1950 (oil wells) - INDUSTRYBEH_AFTER_1960 = 1 << 9, ///< can only be built after 1960 (oil rigs) - INDUSTRYBEH_AI_AIRSHIP_ROUTES = 1 << 10, ///< ai will attempt to establish air/ship routes to this industry (oil rig) - INDUSTRYBEH_AIRPLANE_ATTACKS = 1 << 11, ///< can be exploded by a military airplane (oil refinery) - INDUSTRYBEH_CHOPPER_ATTACKS = 1 << 12, ///< can be exploded by a military helicopter (factory) - INDUSTRYBEH_CAN_SUBSIDENCE = 1 << 13, ///< can cause a subsidence (coal mine, shaft that collapses) +enum class IndustryBehaviour : uint8_t { + PlantFields = 0, ///< periodically plants fields around itself (temp and arctic farms) + CutTrees = 1, ///< cuts trees and produce first output cargo from them (lumber mill) + BuiltOnWater = 2, ///< is built on water (oil rig) + Town1200More = 3, ///< can only be built in towns larger than 1200 inhabitants (temperate bank) + OnlyInTown = 4, ///< can only be built in towns (arctic/tropic banks, water tower) + OnlyNearTown = 5, ///< is always built near towns (toy shop) + PlantOnBuild = 6, ///< Fields are planted around when built (all farms) + DontIncrProd = 7, ///< do not increase production (oil wells) in the temperate climate + Before1950 = 8, ///< can only be built before 1950 (oil wells) + After1960 = 9, ///< can only be built after 1960 (oil rigs) + AIAirShipRoutes = 10, ///< ai will attempt to establish air/ship routes to this industry (oil rig) + AirplaneAttacks = 11, ///< can be exploded by a military airplane (oil refinery) + ChopperAttacks = 12, ///< can be exploded by a military helicopter (factory) + CanSubsidence = 13, ///< can cause a subsidence (coal mine, shaft that collapses) /* The following flags are only used for newindustries and do no represent any normal behaviour */ - INDUSTRYBEH_PROD_MULTI_HNDLING = 1 << 14, ///< Automatic production multiplier handling - INDUSTRYBEH_PRODCALLBACK_RANDOM = 1 << 15, ///< Production callback needs random bits in var 10 - INDUSTRYBEH_NOBUILT_MAPCREATION = 1 << 16, ///< Do not force one instance of this type to appear on map generation - INDUSTRYBEH_CANCLOSE_LASTINSTANCE = 1 << 17, ///< Allow closing down the last instance of this type - INDUSTRYBEH_CARGOTYPES_UNLIMITED = 1 << 18, ///< Allow produced/accepted cargoes callbacks to supply more than 2 and 3 types - INDUSTRYBEH_NO_PAX_PROD_CLAMP = 1 << 19, ///< Do not clamp production of passengers. (smooth economy only) + ProdMultiHandling = 14, ///< Automatic production multiplier handling + ProdCallbackRandom = 15, ///< Production callback needs random bits in var 10 + NoBuildMapCreation = 16, ///< Do not force one instance of this type to appear on map generation + CanCloseLastInstance = 17, ///< Allow closing down the last instance of this type + CargoTypesUnlimited = 18, ///< Allow produced/accepted cargoes callbacks to supply more than 2 and 3 types + NoPaxProdClamp = 19, ///< Do not clamp production of passengers. (smooth economy only) }; -DECLARE_ENUM_AS_BIT_SET(IndustryBehaviour) +using IndustryBehaviours = EnumBitSet; /** Flags for miscellaneous industry tile specialities */ enum IndustryTileSpecialFlags : uint8_t { @@ -117,7 +116,7 @@ struct IndustrySpec { uint16_t input_cargo_multiplier[INDUSTRY_NUM_INPUTS][INDUSTRY_NUM_OUTPUTS]; ///< Input cargo multipliers (multiply amount of incoming cargo for the produced cargoes) IndustryLifeType life_type; ///< This is also known as Industry production flag, in newgrf specs LandscapeTypes climate_availability; ///< Bitmask, giving landscape enums as bit position - IndustryBehaviour behaviour; ///< How this industry will behave, and how others entities can use it + IndustryBehaviours behaviour; ///< How this industry will behave, and how others entities can use it uint8_t map_colour; ///< colour used for the small map StringID name; ///< Displayed name of the industry StringID new_industry_text; ///< Message appearing when the industry is built diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 439239b65d..c18ebd93be 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -3832,7 +3832,7 @@ static ChangeInfoResult IndustriesChangeInfo(uint first, uint last, int prop, By break; case 0x1A: // Special industry flags to define special behavior - indsp->behaviour = (IndustryBehaviour)buf.ReadDWord(); + indsp->behaviour = IndustryBehaviours{buf.ReadDWord()}; break; case 0x1B: // New industry text ID diff --git a/src/newgrf_industries.cpp b/src/newgrf_industries.cpp index 55992c157b..761685315d 100644 --- a/src/newgrf_industries.cpp +++ b/src/newgrf_industries.cpp @@ -191,7 +191,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ case 0x8A: return ClampTo(GetTileZ(this->tile) * (this->ro.grffile->grf_version >= 8 ? 1 : TILE_HEIGHT)); /* Distance to the nearest water/land tile */ - case 0x8B: return GetClosestWaterDistance(this->tile, (GetIndustrySpec(this->industry->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0); + case 0x8B: return GetClosestWaterDistance(this->tile, !GetIndustrySpec(this->industry->type)->behaviour.Test(IndustryBehaviour::BuiltOnWater)); /* Square of Euclidian distance from town */ case 0x8D: return ClampTo(DistanceSquare(this->industry->town->xy, this->tile)); @@ -216,7 +216,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ case 0x42: { // waiting cargo, but only if those two callback flags are set IndustryCallbackMasks callback = indspec->callback_mask; if (callback.Any({IndustryCallbackMask::ProductionCargoArrival, IndustryCallbackMask::Production256Ticks})) { - if ((indspec->behaviour & INDUSTRYBEH_PROD_MULTI_HNDLING) != 0) { + if (indspec->behaviour.Test(IndustryBehaviour::ProdMultiHandling)) { if (this->industry->prod_level == 0) return 0; return ClampTo(this->industry->GetAccepted(variable - 0x40).waiting / this->industry->prod_level); } else { @@ -230,7 +230,7 @@ static uint32_t GetCountAndDistanceOfClosestInstance(uint8_t param_setID, uint8_ /* Manhattan distance of closes dry/water tile */ case 0x43: if (this->tile == INVALID_TILE) break; - return GetClosestWaterDistance(this->tile, (indspec->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0); + return GetClosestWaterDistance(this->tile, !indspec->behaviour.Test(IndustryBehaviour::BuiltOnWater)); /* Layout number */ case 0x44: return this->industry->selected_layout; @@ -605,9 +605,9 @@ void IndustryProductionCallback(Industry *ind, int reason) { const IndustrySpec *spec = GetIndustrySpec(ind->type); IndustriesResolverObject object(ind->location.tile, ind, ind->type); - if ((spec->behaviour & INDUSTRYBEH_PRODCALLBACK_RANDOM) != 0) object.callback_param1 = Random(); + if (spec->behaviour.Test(IndustryBehaviour::ProdCallbackRandom)) object.callback_param1 = Random(); int multiplier = 1; - if ((spec->behaviour & INDUSTRYBEH_PROD_MULTI_HNDLING) != 0) multiplier = ind->prod_level; + if (spec->behaviour.Test(IndustryBehaviour::ProdMultiHandling)) multiplier = ind->prod_level; object.callback_param2 = reason; for (uint loop = 0;; loop++) { diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index c91d8ee29d..7197fc52b5 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1477,7 +1477,7 @@ bool AfterLoadGame() for (Industry *i : Industry::Iterate()) { uint j; - if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) { + if (GetIndustrySpec(i->type)->behaviour.Test(IndustryBehaviour::PlantOnBuild)) { for (j = 0; j != 50; j++) PlantRandomFarmField(i); } } @@ -1954,7 +1954,7 @@ bool AfterLoadGame() SetWaterClassDependingOnSurroundings(t, true); } if (IsTileType(t, MP_INDUSTRY)) { - if ((GetIndustrySpec(GetIndustryType(t))->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0) { + if (GetIndustrySpec(GetIndustryType(t))->behaviour.Test(IndustryBehaviour::BuiltOnWater)) { SetWaterClassDependingOnSurroundings(t, true); } else { SetWaterClass(t, WATER_CLASS_INVALID); diff --git a/src/script/api/script_industry.cpp b/src/script/api/script_industry.cpp index ec1b40aad9..287b34b496 100644 --- a/src/script/api/script_industry.cpp +++ b/src/script/api/script_industry.cpp @@ -165,14 +165,14 @@ { if (!IsValidIndustry(industry_id)) return false; - return (::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0; + return ::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour.Test(IndustryBehaviour::BuiltOnWater); } /* static */ bool ScriptIndustry::HasHeliport(IndustryID industry_id) { if (!IsValidIndustry(industry_id)) return false; - return (::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0; + return ::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour.Test(IndustryBehaviour::AIAirShipRoutes); } /* static */ TileIndex ScriptIndustry::GetHeliportLocation(IndustryID industry_id) @@ -194,7 +194,7 @@ { if (!IsValidIndustry(industry_id)) return false; - return (::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0; + return ::GetIndustrySpec(::Industry::Get(industry_id)->type)->behaviour.Test(IndustryBehaviour::AIAirShipRoutes); } /* static */ TileIndex ScriptIndustry::GetDockLocation(IndustryID industry_id) diff --git a/src/script/api/script_industrytype.cpp b/src/script/api/script_industrytype.cpp index 91cde357b4..195171d5f1 100644 --- a/src/script/api/script_industrytype.cpp +++ b/src/script/api/script_industrytype.cpp @@ -46,7 +46,7 @@ if (!IsValidIndustryType(industry_type)) return false; if (_settings_game.game_creation.landscape != LandscapeType::Temperate) return true; - return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_DONT_INCR_PROD) == 0; + return !::GetIndustrySpec(industry_type)->behaviour.Test(IndustryBehaviour::DontIncrProd); } /* static */ Money ScriptIndustryType::GetConstructionCost(IndustryType industry_type) @@ -141,21 +141,21 @@ { if (!IsValidIndustryType(industry_type)) return false; - return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0; + return ::GetIndustrySpec(industry_type)->behaviour.Test(IndustryBehaviour::BuiltOnWater); } /* static */ bool ScriptIndustryType::HasHeliport(IndustryType industry_type) { if (!IsValidIndustryType(industry_type)) return false; - return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0; + return ::GetIndustrySpec(industry_type)->behaviour.Test(IndustryBehaviour::AIAirShipRoutes); } /* static */ bool ScriptIndustryType::HasDock(IndustryType industry_type) { if (!IsValidIndustryType(industry_type)) return false; - return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0; + return ::GetIndustrySpec(industry_type)->behaviour.Test(IndustryBehaviour::AIAirShipRoutes); } /* static */ IndustryType ScriptIndustryType::ResolveNewGRFID(SQInteger grfid, SQInteger grf_local_id) diff --git a/src/table/build_industry.h b/src/table/build_industry.h index 841f66b43f..510a248dea 100644 --- a/src/table/build_industry.h +++ b/src/table/build_industry.h @@ -1152,7 +1152,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_COAL, 15, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic}), - INDUSTRYBEH_CAN_SUBSIDENCE, + IndustryBehaviour::CanSubsidence, STR_INDUSTRY_NAME_COAL_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_COAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1162,7 +1162,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_INVALID, 0, CT_INVALID, 0, 5, CT_COAL, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_BLACK_HOLE, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic}), - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_POWER_STATION, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1172,7 +1172,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_GOODS, 0, CT_INVALID, 0, 5, CT_WOOD, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Temperate, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_SAWMILL, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1182,7 +1182,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_WOOD, 13, CT_INVALID, 0, 30, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic}), - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_FOREST, STR_NEWS_INDUSTRY_PLANTED, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1192,7 +1192,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_GOODS, 0, CT_INVALID, 0, 5, CT_OIL, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic, LandscapeType::Tropic}), - INDUSTRYBEH_AIRPLANE_ATTACKS, + IndustryBehaviour::AirplaneAttacks, STR_INDUSTRY_NAME_OIL_REFINERY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1202,7 +1202,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_OIL, 15, CT_PASSENGERS, 2, 5, CT_INVALID, 0, CT_INVALID, 0, CT_INVALID, 0, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Temperate, - INDUSTRYBEH_BUILT_ONWATER | INDUSTRYBEH_AFTER_1960 | INDUSTRYBEH_AI_AIRSHIP_ROUTES, + IndustryBehaviours({IndustryBehaviour::BuiltOnWater, IndustryBehaviour::After1960, IndustryBehaviour::AIAirShipRoutes}), STR_INDUSTRY_NAME_OIL_RIG, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1212,7 +1212,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_GOODS, 0, CT_INVALID, 0, 5, MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_STEEL, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Temperate, - INDUSTRYBEH_CHOPPER_ATTACKS, + IndustryBehaviour::ChopperAttacks, STR_INDUSTRY_NAME_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1222,7 +1222,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_GOODS, 0, CT_INVALID, 0, 5, CT_PAPER, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Arctic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_PRINTING_WORKS, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1232,7 +1232,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_STEEL, 0, CT_INVALID, 0, 5, CT_IRON_ORE, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Temperate, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_STEEL_MILL, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1242,7 +1242,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_GRAIN_WHEAT_MAIZE, 10, MCT_LIVESTOCK_FRUIT, 10, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic}), - INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT, + IndustryBehaviours({IndustryBehaviour::PlantFields, IndustryBehaviour::PlantOnBuild}), STR_INDUSTRY_NAME_FARM, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1252,7 +1252,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_COPPER_ORE, 10, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_COPPER_ORE_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1262,7 +1262,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_OIL, 12, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeTypes({LandscapeType::Temperate, LandscapeType::Arctic, LandscapeType::Tropic}), - INDUSTRYBEH_DONT_INCR_PROD | INDUSTRYBEH_BEFORE_1950, + IndustryBehaviours({IndustryBehaviour::DontIncrProd, IndustryBehaviour::Before1950}), STR_INDUSTRY_NAME_OIL_WELLS, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_OIL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1272,7 +1272,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_VALUABLES_GOLD_DIAMONDS, 6, CT_INVALID, 0, 5, MCT_VALUABLES_GOLD_DIAMONDS, 0, CT_INVALID, 0, CT_INVALID, 0, INDUSTRYLIFE_BLACK_HOLE, LandscapeType::Temperate, - INDUSTRYBEH_TOWN1200_MORE, + IndustryBehaviour::Town1200More, STR_INDUSTRY_NAME_BANK, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1282,7 +1282,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_FOOD, 0, CT_INVALID, 0, 5, MCT_LIVESTOCK_FRUIT, 256, MCT_GRAIN_WHEAT_MAIZE, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeTypes({LandscapeType::Arctic, LandscapeType::Tropic}), - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_FOOD_PROCESSING_PLANT, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1292,7 +1292,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_PAPER, 0, CT_INVALID, 0, 5, CT_WOOD, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Arctic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_PAPER_MILL, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1302,7 +1302,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Arctic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_GOLD_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1312,7 +1312,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_INVALID, 0, CT_INVALID, 0, 5, MCT_VALUABLES_GOLD_DIAMONDS, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_BLACK_HOLE, LandscapeTypes({LandscapeType::Arctic, LandscapeType::Tropic}), - INDUSTRYBEH_ONLY_INTOWN, + IndustryBehaviour::OnlyInTown, STR_INDUSTRY_NAME_BANK_TROPIC_ARCTIC, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1322,7 +1322,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_VALUABLES_GOLD_DIAMONDS, 7, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_DIAMOND_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1332,7 +1332,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_IRON_ORE, 10, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Temperate, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_IRON_ORE_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1342,7 +1342,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_LIVESTOCK_FRUIT, 10, CT_INVALID, 0, 15, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_FRUIT_PLANTATION, STR_NEWS_INDUSTRY_PLANTED, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1352,7 +1352,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_RUBBER, 10, CT_INVALID, 0, 15, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_RUBBER_PLANTATION, STR_NEWS_INDUSTRY_PLANTED, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1362,7 +1362,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_WATER, 12, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_WATER_SUPPLY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1372,7 +1372,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_INVALID, 0, CT_INVALID, 0, 5, CT_WATER, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_BLACK_HOLE, LandscapeType::Tropic, - INDUSTRYBEH_ONLY_INTOWN, + IndustryBehaviour::OnlyInTown, STR_INDUSTRY_NAME_WATER_TOWER, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1382,7 +1382,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_GOODS, 0, CT_INVALID, 0, 5, CT_RUBBER, 256, CT_COPPER_ORE, 256, CT_WOOD, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Tropic, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_FACTORY_2, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1392,7 +1392,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { MCT_GRAIN_WHEAT_MAIZE, 11, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeType::Tropic, - INDUSTRYBEH_PLANT_FIELDS | INDUSTRYBEH_PLANT_ON_BUILT, + IndustryBehaviours({IndustryBehaviour::PlantFields, IndustryBehaviour::PlantOnBuild}), STR_INDUSTRY_NAME_FARM_2, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1402,7 +1402,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_WOOD, 0, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Tropic, - INDUSTRYBEH_CUT_TREES, + IndustryBehaviour::CutTrees, STR_INDUSTRY_NAME_LUMBER_MILL, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_LACK_OF_TREES, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1412,7 +1412,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_COTTON_CANDY, 13, CT_INVALID, 0, 30, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_COTTON_CANDY_FOREST, STR_NEWS_INDUSTRY_PLANTED, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1422,7 +1422,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_CANDY, 0, CT_INVALID, 0, 5, CT_SUGAR, 256, CT_TOFFEE, 256, CT_COTTON_CANDY, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_CANDY_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1432,7 +1432,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_BATTERIES, 11, CT_INVALID, 0, 30, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_ORGANIC, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_BATTERY_FARM, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_FARM, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_FARM), @@ -1442,7 +1442,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_COLA, 12, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_COLA_WELLS, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1452,7 +1452,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_INVALID, 0, CT_INVALID, 0, 5, CT_TOYS, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_BLACK_HOLE, LandscapeType::Toyland, - INDUSTRYBEH_ONLY_NEARTOWN, + IndustryBehaviour::OnlyNearTown, STR_INDUSTRY_NAME_TOY_SHOP, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1462,7 +1462,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_TOYS, 0, CT_INVALID, 0, 5, CT_PLASTIC, 256, CT_BATTERIES, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_TOY_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1472,7 +1472,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_PLASTIC, 14, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_PLASTIC_FOUNTAINS, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1482,7 +1482,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_FIZZY_DRINKS, 0, CT_INVALID, 0, 5, CT_COLA, 256, CT_BUBBLES, 256, CT_INVALID, 256, INDUSTRYLIFE_PROCESSING, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_FIZZY_DRINK_FACTORY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_SUPPLY_PROBLEMS, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1492,7 +1492,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_BUBBLES, 13, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_BUBBLE_GENERATOR, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1502,7 +1502,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_TOFFEE, 10, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_TOFFEE_QUARRY, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), @@ -1512,7 +1512,7 @@ static const IndustrySpec _origin_industry_specs[NEW_INDUSTRYOFFSET] = { CT_SUGAR, 11, CT_INVALID, 0, 5, CT_INVALID, 256, CT_INVALID, 256, CT_INVALID, 256, INDUSTRYLIFE_EXTRACTIVE, LandscapeType::Toyland, - INDUSTRYBEH_NONE, + {}, STR_INDUSTRY_NAME_SUGAR_MINE, STR_NEWS_INDUSTRY_CONSTRUCTION, STR_NEWS_INDUSTRY_CLOSURE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_INCREASE_GENERAL, STR_NEWS_INDUSTRY_PRODUCTION_DECREASE_GENERAL), };