#pragma once #include "openvic-simulation/economy/BuildingInstance.hpp" #include "openvic-simulation/pop/Pop.hpp" #include "openvic-simulation/types/fixed_point/FixedPointMap.hpp" #include "openvic-simulation/types/HasIdentifier.hpp" #include "openvic-simulation/types/OrderedContainers.hpp" namespace OpenVic { struct MapInstance; struct ProvinceDefinition; struct TerrainType; struct State; struct CountryDefinition; struct Crime; struct GoodDefinition; struct ArmyInstance; struct NavyInstance; struct Ideology; struct Culture; struct Religion; struct BuildingTypeManager; struct ProvinceHistoryEntry; struct IdeologyManager; struct IssueManager; struct ProvinceInstance : HasIdentifierAndColour { friend struct MapInstance; using life_rating_t = int8_t; enum struct colony_status_t : uint8_t { STATE, PROTECTORATE, COLONY }; private: ProvinceDefinition const& PROPERTY(province_definition); TerrainType const* PROPERTY(terrain_type); life_rating_t PROPERTY(life_rating); colony_status_t PROPERTY(colony_status); State const* PROPERTY_RW(state); CountryDefinition const* PROPERTY(owner); CountryDefinition const* PROPERTY(controller); // Cores being CountryDefinitions means then they won't be affected by tag switched (as desired) std::vector PROPERTY(cores); bool PROPERTY(slave); Crime const* PROPERTY_RW(crime); // TODO - change this into a factory-like structure GoodDefinition const* PROPERTY(rgo); IdentifierRegistry IDENTIFIER_REGISTRY(building); ordered_set PROPERTY(armies); ordered_set PROPERTY(navies); std::vector PROPERTY(pops); Pop::pop_size_t PROPERTY(total_population); fixed_point_map_t PROPERTY(pop_type_distribution); fixed_point_map_t PROPERTY(ideology_distribution); fixed_point_map_t PROPERTY(culture_distribution); fixed_point_map_t PROPERTY(religion_distribution); ProvinceInstance(ProvinceDefinition const& new_province_definition); void _add_pop(Pop&& pop); void _update_pops(); public: ProvinceInstance(ProvinceInstance&&) = default; inline explicit constexpr operator ProvinceDefinition const&() const { return province_definition; } bool expand_building(size_t building_index); bool add_pop(Pop&& pop); bool add_pop_vec(std::vector const& pop_vec); size_t get_pop_count() const; void update_gamestate(Date today); void tick(Date today); bool add_army(ArmyInstance& army); bool remove_army(ArmyInstance& army); bool add_navy(NavyInstance& navy); bool remove_navy(NavyInstance& navy); bool setup(BuildingTypeManager const& building_type_manager); bool apply_history_to_province(ProvinceHistoryEntry const* entry); void setup_pop_test_values( IdeologyManager const& ideology_manager, IssueManager const& issue_manager, CountryDefinition const& country ); }; }