#pragma once #include #include #include #include "openvic-simulation/country/Country.hpp" #include "openvic-simulation/economy/Building.hpp" #include "openvic-simulation/economy/Good.hpp" #include "openvic-simulation/history/Bookmark.hpp" #include "openvic-simulation/map/Province.hpp" #include "openvic-simulation/map/TerrainType.hpp" namespace OpenVic { struct ProvinceHistoryManager; struct ProvinceHistory { friend struct ProvinceHistoryManager; using building_level_map_t = std::map; private: Country const* owner; Country const* controller; Province::colony_status_t colonial; bool slave; std::vector cores; // non-standard, maintains cores between entries Good const* rgo; Province::life_rating_t life_rating; TerrainType const* terrain_type; building_level_map_t buildings; decimal_map_t party_loyalties; ProvinceHistory( Country const* new_owner, Country const* new_controller, Province::colony_status_t new_colonial, bool new_slave, std::vector&& new_cores, Good const* new_rgo, Province::life_rating_t new_life_rating, TerrainType const* new_terrain_type, building_level_map_t&& new_buildings, decimal_map_t&& new_party_loyalties ); public: Country const* get_owner() const; Country const* get_controller() const; Province::colony_status_t get_colony_status() const; // 0 = state, 1 = protectorate, 2 = colony bool is_slave() const; std::vector const& get_cores() const; bool is_core_of(Country const* country) const; Good const* get_rgo() const; Province::life_rating_t get_life_rating() const; TerrainType const* get_terrain_type() const; building_level_map_t const& get_buildings() const; decimal_map_t const& get_party_loyalties() const; }; struct ProvinceHistoryManager { private: std::map> province_histories; bool locked = false; inline bool _load_province_history_entry( GameManager const& game_manager, Province const& province, Date date, ast::NodeCPtr root, bool is_base_entry ); public: ProvinceHistoryManager() {} bool add_province_history_entry( Province const* province, Date date, Country const* owner, Country const* controller, std::optional&& colonial, std::optional&& slave, std::vector&& cores, // additive to existing entries std::vector&& remove_cores, // existing cores that need to be removed Good const* rgo, std::optional&& life_rating, TerrainType const* terrain_type, std::optional&& buildings, std::optional>&& party_loyalties ); void lock_province_histories(); bool is_locked() const; /* Returns history of province at date, if date doesn't have an entry returns closest entry before date. * Return can be nullptr if an error occurs. */ ProvinceHistory const* get_province_history(Province const* province, Date entry) const; /* Returns history of province at bookmark date. Return can be nullptr if an error occurs. */ inline ProvinceHistory const* get_province_history(Province const* province, Bookmark const* bookmark) const; bool load_province_history_file( GameManager const& game_manager, Province const& province, ast::NodeCPtr root ); }; } // namespace OpenVic