aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation
diff options
context:
space:
mode:
author Hop311 <Hop3114@gmail.com>2023-10-29 19:59:06 +0100
committer GitHub <noreply@github.com>2023-10-29 19:59:06 +0100
commitd8ec90f07342876e9331819bd3cc372050f78248 (patch)
tree185f687df38bd114e25edf204cdef5eac7aec9c1 /src/openvic-simulation
parent8b454e644babdb9ed9f8f92a816e08b55f9b7401 (diff)
parentb2436cd3f80ac1cca6b42a54e087ab90d362be29 (diff)
Merge pull request #68 from OpenVicProject/fix/province-history
Improve Province Histories
Diffstat (limited to 'src/openvic-simulation')
-rw-r--r--src/openvic-simulation/history/ProvinceHistory.cpp106
-rw-r--r--src/openvic-simulation/history/ProvinceHistory.hpp18
2 files changed, 96 insertions, 28 deletions
diff --git a/src/openvic-simulation/history/ProvinceHistory.cpp b/src/openvic-simulation/history/ProvinceHistory.cpp
index 469bbfd..cc6c5b8 100644
--- a/src/openvic-simulation/history/ProvinceHistory.cpp
+++ b/src/openvic-simulation/history/ProvinceHistory.cpp
@@ -9,6 +9,8 @@ using namespace OpenVic::NodeTools;
ProvinceHistory::ProvinceHistory(
Country const* new_owner,
Country const* new_controller,
+ uint8_t new_colonial,
+ bool new_slave,
std::vector<Country const*>&& new_cores,
Good const* new_rgo,
uint8_t new_life_rating,
@@ -17,6 +19,8 @@ ProvinceHistory::ProvinceHistory(
std::map<Ideology const*, uint8_t>&& new_party_loyalties
) : owner { new_owner },
controller { new_controller },
+ colonial { new_colonial },
+ slave { new_slave },
cores { std::move(new_cores) },
rgo { new_rgo },
life_rating { new_life_rating },
@@ -32,6 +36,14 @@ Country const* ProvinceHistory::get_controller() const {
return controller;
}
+uint8_t ProvinceHistory::get_colony_status() const {
+ return colonial;
+}
+
+bool ProvinceHistory::is_slave() const {
+ return slave;
+}
+
const std::vector<Country const*>& ProvinceHistory::get_cores() const {
return cores;
}
@@ -65,15 +77,16 @@ bool ProvinceHistoryManager::add_province_history_entry(
Date date,
Country const* owner,
Country const* controller,
+ uint8_t colonial,
+ bool slave,
std::vector<Country const*>&& cores,
+ std::vector<Country const*>&& remove_cores,
Good const* rgo,
uint8_t life_rating,
TerrainType const* terrain_type,
std::map<Building const*, uint8_t>&& buildings,
std::map<Ideology const*, uint8_t>&& party_loyalties,
- bool updated_cores,
- bool updated_buildings,
- bool updated_loyalties
+ std::bitset<5> updates
) {
if (locked) {
Logger::error("Cannot add new history entry to province history registry: locked!");
@@ -87,16 +100,29 @@ bool ProvinceHistoryManager::add_province_history_entry(
if (existing_entry != province_registry.end()) {
if (owner != nullptr) existing_entry->second.owner = owner;
if (controller != nullptr) existing_entry->second.controller = controller;
- if (updated_cores) existing_entry->second.cores = std::move(cores);
if (rgo != nullptr) existing_entry->second.rgo = rgo;
- if (life_rating > 0) existing_entry->second.life_rating = life_rating;
if (terrain_type != nullptr) existing_entry->second.terrain_type = terrain_type;
- if (updated_buildings) existing_entry->second.buildings = std::move(buildings);
- if (updated_loyalties) existing_entry->second.party_loyalties = std::move(party_loyalties);
+ if (updates[0]) existing_entry->second.colonial = colonial;
+ if (updates[1]) existing_entry->second.slave = slave;
+ if (updates[2]) existing_entry->second.life_rating = life_rating;
+ if (updates[3]) existing_entry->second.buildings = std::move(buildings);
+ if (updates[4]) existing_entry->second.party_loyalties = std::move(party_loyalties);
+ // province history cores are additive
+ existing_entry->second.cores.insert(existing_entry->second.cores.end(), cores.begin(), cores.end());
+ for (const auto which : remove_cores) {
+ const auto core = std::find(cores.begin(), cores.end(), which);
+ if (core == cores.end()) {
+ Logger::error("In history of province ", province->get_identifier(), " tried to remove nonexistant core of country: ", which->get_identifier(), " at date ", date.to_string());
+ return false;
+ }
+ existing_entry->second.cores.erase(core);
+ }
} else {
province_registry.emplace(date, ProvinceHistory {
owner,
controller,
+ colonial,
+ slave,
std::move(cores),
rgo,
life_rating,
@@ -151,18 +177,18 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
Country const* owner = nullptr;
Country const* controller = nullptr;
std::vector<Country const*> cores;
+ std::vector<Country const*> remove_cores;
Good const* rgo;
- uint8_t life_rating = 0;
+ uint8_t life_rating, colonial;
+ bool slave;
TerrainType const* terrain_type;
std::map<Building const*, uint8_t> buildings;
std::map<Ideology const*, uint8_t> party_loyalties;
- bool updated_cores = false;
- bool updated_buildings = false;
- bool updated_loyalties = false;
+ std::bitset<5> updates;
bool ret = expect_dictionary_keys_and_default(
- [&game_manager, &buildings, &updated_buildings](std::string_view key, ast::NodeCPtr value) -> bool {
+ [&game_manager, &buildings, &updates](std::string_view key, ast::NodeCPtr value) -> bool {
// used for province buildings like forts or railroads
if (game_manager.get_economy_manager().get_building_manager().has_building_identifier(key)) {
Building const* building;
@@ -172,7 +198,7 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
ret &= expect_uint(assign_variable_callback(level))(value);
buildings.emplace(building, level);
- updated_buildings = true;
+ updates[3] = true;
return ret;
}
@@ -184,18 +210,51 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
},
"owner", ZERO_OR_ONE, game_manager.get_country_manager().expect_country_identifier(assign_variable_callback_pointer(owner)),
"controller", ZERO_OR_ONE, game_manager.get_country_manager().expect_country_identifier(assign_variable_callback_pointer(controller)),
- "add_core", ZERO_OR_MORE, [&game_manager, &cores, &updated_cores](ast::NodeCPtr node) -> bool {
+ "add_core", ZERO_OR_MORE, [&game_manager, &cores](ast::NodeCPtr node) -> bool {
Country const* core;
bool ret = game_manager.get_country_manager().expect_country_identifier(assign_variable_callback_pointer(core))(node);
cores.push_back(core);
- updated_cores = true;
return ret;
},
+ "remove_core", ZERO_OR_MORE, [&game_manager, &remove_cores](ast::NodeCPtr node) -> bool {
+ Country const* remove;
+
+ bool ret = game_manager.get_country_manager().expect_country_identifier(assign_variable_callback_pointer(remove))(node);
+ remove_cores.push_back(remove);
+ return ret;
+ },
+ "colonial", ZERO_OR_ONE, expect_uint<uint8_t>([&colonial, &updates](uint8_t colony_level) -> bool {
+ colonial = colony_level;
+ updates[0] = true;
+
+ return true;
+ }),
+ "colony", ZERO_OR_ONE, expect_uint<uint8_t>([&colonial, &updates](uint8_t colony_level) -> bool {
+ colonial = colony_level;
+ updates[0] = true;
+
+ return true;
+ }),
+ "is_slave", ZERO_OR_ONE, expect_bool([&slave, &updates](bool is_slave) -> bool {
+ if (is_slave) {
+ slave = true;
+ } else {
+ slave = false;
+ }
+ updates[1] = true;
+
+ return true;
+ }),
"trade_goods", ZERO_OR_ONE, game_manager.get_economy_manager().get_good_manager().expect_good_identifier(assign_variable_callback_pointer(rgo)),
- "life_rating", ZERO_OR_ONE, expect_uint(assign_variable_callback(life_rating)),
+ "life_rating", ZERO_OR_ONE, expect_uint<uint8_t>([&life_rating, &updates](uint8_t rating) -> bool {
+ life_rating = rating;
+ updates[2] = true;
+
+ return true;
+ }),
"terrain", ZERO_OR_ONE, game_manager.get_map().get_terrain_type_manager().expect_terrain_type_identifier(assign_variable_callback_pointer(terrain_type)),
- "party_loyalty", ZERO_OR_MORE, [&game_manager, &party_loyalties, &updated_loyalties](ast::NodeCPtr node) -> bool {
+ "party_loyalty", ZERO_OR_MORE, [&game_manager, &party_loyalties, &updates](ast::NodeCPtr node) -> bool {
Ideology const* ideology;
uint8_t amount; // percent I do believe
@@ -204,10 +263,10 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
"loyalty_value", ONE_EXACTLY, expect_uint(assign_variable_callback(amount))
)(node);
party_loyalties.emplace(ideology, amount);
- updated_loyalties = true;
+ updates[4] = true;
return ret;
},
- "state_building", ZERO_OR_MORE, [&game_manager, &buildings, &updated_buildings](ast::NodeCPtr node) -> bool {
+ "state_building", ZERO_OR_MORE, [&game_manager, &buildings, &updates](ast::NodeCPtr node) -> bool {
Building const* building;
uint8_t level;
@@ -217,7 +276,7 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
"upgrade", ZERO_OR_ONE, success_callback // doesn't appear to have an effect
)(node);
buildings.emplace(building, level);
- updated_buildings = true;
+ updates[3] = true;
return ret;
}
)(root);
@@ -227,15 +286,16 @@ inline bool ProvinceHistoryManager::_load_province_history_entry(GameManager& ga
date,
owner,
controller,
+ colonial,
+ slave,
std::move(cores),
+ std::move(remove_cores),
rgo,
life_rating,
terrain_type,
std::move(buildings),
std::move(party_loyalties),
- updated_cores,
- updated_buildings,
- updated_loyalties
+ updates
);
return ret;
}
diff --git a/src/openvic-simulation/history/ProvinceHistory.hpp b/src/openvic-simulation/history/ProvinceHistory.hpp
index 4094403..0304b2a 100644
--- a/src/openvic-simulation/history/ProvinceHistory.hpp
+++ b/src/openvic-simulation/history/ProvinceHistory.hpp
@@ -2,6 +2,7 @@
#include <map>
#include <vector>
+#include <bitset>
#include "openvic-simulation/map/Province.hpp"
#include "openvic-simulation/map/TerrainType.hpp"
@@ -19,7 +20,9 @@ namespace OpenVic {
private:
Country const* owner;
Country const* controller;
- std::vector<Country const*> cores;
+ uint8_t colonial;
+ bool slave;
+ std::vector<Country const*> cores; // non-standard, maintains cores between entries
Good const* rgo;
uint8_t life_rating;
TerrainType const* terrain_type;
@@ -29,6 +32,8 @@ namespace OpenVic {
ProvinceHistory(
Country const* new_owner,
Country const* new_controller,
+ uint8_t new_colonial,
+ bool new_slave,
std::vector<Country const*>&& new_cores,
Good const* new_rgo,
uint8_t new_life_rating,
@@ -40,6 +45,8 @@ namespace OpenVic {
public:
Country const* get_owner() const;
Country const* get_controller() const;
+ uint8_t get_colony_status() const; // 0 = state, 1 = protectorate, 2 = colony
+ bool is_slave() const;
const std::vector<Country const*>& get_cores() const;
bool is_core_of(Country const* country) const;
Good const* get_rgo() const;
@@ -64,15 +71,16 @@ namespace OpenVic {
Date date,
Country const* owner,
Country const* controller,
- std::vector<Country const*>&& cores,
+ uint8_t colonial,
+ bool slave,
+ std::vector<Country const*>&& cores, // additive to existing entries
+ std::vector<Country const*>&& remove_cores, // existing cores that need to be removed
Good const* rgo,
uint8_t life_rating,
TerrainType const* terrain_type,
std::map<Building const*, uint8_t>&& buildings,
std::map<Ideology const*, uint8_t>&& party_loyalties,
- bool updated_cores,
- bool updated_buildings,
- bool updated_loyalties
+ std::bitset<5> updates // bitmap of updated non-pointer values, top to bottom
);
void lock_province_histories();