Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 21 additions & 16 deletions src/openvic-simulation/InstanceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include "openvic-simulation/misc/GameAction.hpp"
#include "openvic-simulation/types/TypedSpan.hpp"
#include "openvic-simulation/utility/Logger.hpp"
#include "openvic-simulation/utility/ThreadDeps.hpp"

using namespace OpenVic;

Expand Down Expand Up @@ -168,8 +169,8 @@ void InstanceManager::update_gamestate() {
update_modifier_sums();

// Update gamestate...
map_instance.update_gamestate(*this);
country_instance_manager.update_gamestate(today, map_instance);
map_instance.update_gamestate();
country_instance_manager.update_gamestate_after_map(today);
unit_instance_manager.update_gamestate();

gamestate_updated();
Expand Down Expand Up @@ -234,12 +235,19 @@ bool InstanceManager::setup() {
}

thread_pool.initialise_threadpool(
game_rules_manager,
good_instance_manager,
definition_manager.get_modifier_manager().get_modifier_effect_cache(),
definition_manager.get_define_manager().get_pops_defines(),
definition_manager.get_economy_manager().get_production_type_manager(),
strata_index_t(definition_manager.get_pop_manager().get_strata_count()),
ThreadDeps{
game_rules_manager,
good_instance_manager,
map_instance,
definition_manager.get_define_manager().get_military_defines(),
definition_manager.get_modifier_manager().get_modifier_effect_cache(),
definition_manager.get_define_manager().get_pops_defines(),
definition_manager.get_economy_manager().get_production_type_manager(),
definition_manager.get_modifier_manager().get_static_modifier_cache(),
country_index_t(definition_manager.get_country_definition_manager().get_country_definition_count()),
good_index_t(definition_manager.get_economy_manager().get_good_definition_manager().get_good_definition_count()),
strata_index_t(definition_manager.get_pop_manager().get_strata_count())
},
good_instance_manager.get_good_instances(),
country_instance_manager.get_country_instances(),
map_instance.get_province_instances()
Expand Down Expand Up @@ -305,8 +313,8 @@ bool InstanceManager::load_bookmark(Bookmark const& new_bookmark) {
OV_ERR_FAIL_COND_V_MSG(!all_has_state, false, "At least one land province has no state");

update_modifier_sums();
map_instance.initialise_for_new_game(*this);
country_instance_manager.update_gamestate(today, map_instance);
map_instance.initialise_for_new_game();
country_instance_manager.update_gamestate_after_map(today);
market_instance.execute_orders();

return ret;
Expand Down Expand Up @@ -359,12 +367,9 @@ void InstanceManager::update_modifier_sums() {
// full copy of all the modifiers affecting them in their modifier sum, but provinces only having their directly/locally
// applied modifiers in their modifier sum, hence requiring owner country modifier effect values to be looked up when
// determining the value of a global effect on the province.
country_instance_manager.update_modifier_sums(
today, definition_manager.get_modifier_manager().get_static_modifier_cache()
);
map_instance.update_modifier_sums(
today, definition_manager.get_modifier_manager().get_static_modifier_cache()
);
country_instance_manager.update_modifier_sums_before_map();
map_instance.update_modifier_sums(today);
country_instance_manager.update_modifier_sums_after_map();
}

bool InstanceManager::queue_game_action(game_action_t&& game_action) {
Expand Down
56 changes: 30 additions & 26 deletions src/openvic-simulation/country/CountryInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1782,7 +1782,7 @@ static constexpr Modifier const& get_country_status_static_effect(
}
}

void CountryInstance::update_modifier_sum(Date today, StaticModifierCache const& static_modifier_cache) {
void CountryInstance::update_modifier_sum_before_map(Date today, StaticModifierCache const& static_modifier_cache) {
// Update sum of national modifiers
modifier_sum.clear();

Expand Down Expand Up @@ -1856,19 +1856,23 @@ void CountryInstance::update_modifier_sum(Date today, StaticModifierCache const&
// TODO - calculate stats for each unit type (locked and unlocked)
}

void CountryInstance::make_room_for_province_modifier_sum(ModifierSum const& province_modifier_sum) {
modifier_sum.make_room_for(province_modifier_sum);
void CountryInstance::update_modifier_sum_after_map(Date today) {
for (ProvinceInstance const* const province_ptr : controlled_provinces) {
if (OV_likely(province_ptr != nullptr)) {
modifier_sum.add_modifier_sum(province_ptr->get_modifier_sum());
}
}
}

void CountryInstance::contribute_province_modifier_sum(ModifierSum const& province_modifier_sum) {
modifier_sum.add_modifier_sum(province_modifier_sum);
void CountryInstance::make_room_for_province_modifier_sum(ModifierSum const& province_modifier_sum) {
modifier_sum.make_room_for(province_modifier_sum);
}

fixed_point_t CountryInstance::get_modifier_effect_value(ModifierEffect const& effect) const {
return modifier_sum.get_modifier_effect_value(effect);
}

void CountryInstance::update_gamestate(const Date today, MapInstance& map_instance) {
void CountryInstance::update_gamestate_after_map(const Date today) {
if (is_civilised()) {
civilisation_progress = 0;
} else {
Expand Down Expand Up @@ -1932,14 +1936,14 @@ void CountryInstance::update_gamestate(const Date today, MapInstance& map_instan
province->set_connected_to_capital(false);
province->set_is_overseas(province_definition.get_continent() != capital_continent);

for (ProvinceDefinition::adjacency_t const& adjacency : province_definition.get_adjacencies()) {
// TODO - should we limit based on adjacency type? Straits and impassable still work in game,
// and water provinces don't have an owner so they'll get caught by the later checks anyway.
CountryInstance* neighbour = map_instance.get_province_instance_by_definition(adjacency.get_to()).get_owner();
if (neighbour != nullptr && neighbour != this) {
neighbouring_countries.insert(neighbour);
}
}
// for (ProvinceDefinition::adjacency_t const& adjacency : province_definition.get_adjacencies()) {
// // TODO - should we limit based on adjacency type? Straits and impassable still work in game,
// // and water provinces don't have an owner so they'll get caught by the later checks anyway.
// CountryInstance* neighbour = map_instance.get_province_instance_by_definition(adjacency.get_to()).get_owner();
// if (neighbour != nullptr && neighbour != this) {
// neighbouring_countries.insert(neighbour);
// }
// }
}

if (occupied_provinces_proportion != 0) {
Expand All @@ -1949,21 +1953,21 @@ void CountryInstance::update_gamestate(const Date today, MapInstance& map_instan

if (capital != nullptr) {
capital->set_connected_to_capital(true);
memory::vector<std::reference_wrapper<const ProvinceInstance>> province_checklist { *capital };
// memory::vector<std::reference_wrapper<const ProvinceInstance>> province_checklist { *capital };

for (size_t index = 0; index < province_checklist.size(); ++index) {
ProvinceInstance const& province = province_checklist[index];
// for (size_t index = 0; index < province_checklist.size(); ++index) {
// ProvinceInstance const& province = province_checklist[index];

for (ProvinceDefinition::adjacency_t const& adjacency : province.province_definition.get_adjacencies()) {
ProvinceInstance& adjacent_province = map_instance.get_province_instance_by_definition(adjacency.get_to());
// for (ProvinceDefinition::adjacency_t const& adjacency : province.province_definition.get_adjacencies()) {
// ProvinceInstance& adjacent_province = map_instance.get_province_instance_by_definition(adjacency.get_to());

if (adjacent_province.get_owner() == this && !adjacent_province.get_connected_to_capital()) {
adjacent_province.set_connected_to_capital(true);
adjacent_province.set_is_overseas(false);
province_checklist.emplace_back(adjacent_province);
}
}
}
// if (adjacent_province.get_owner() == this && !adjacent_province.get_connected_to_capital()) {
// adjacent_province.set_connected_to_capital(true);
// adjacent_province.set_is_overseas(false);
// province_checklist.emplace_back(adjacent_province);
// }
// }
// }
}

// Order of updates might need to be changed/functions split up to account for dependencies
Expand Down
6 changes: 3 additions & 3 deletions src/openvic-simulation/country/CountryInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -685,17 +685,17 @@ namespace OpenVic {
bool update_rule_set();

public:
void update_modifier_sum(Date today, StaticModifierCache const& static_modifier_cache);
void update_modifier_sum_before_map(Date today, StaticModifierCache const& static_modifier_cache);
void update_modifier_sum_after_map(Date today);
void make_room_for_province_modifier_sum(ModifierSum const& province_modifier_sum);
void contribute_province_modifier_sum(ModifierSum const& province_modifier_sum);
fixed_point_t get_modifier_effect_value(ModifierEffect const& effect) const;
constexpr void for_each_contributing_modifier(
ModifierEffect const& effect, ContributingModifierCallback auto callback
) const {
return modifier_sum.for_each_contributing_modifier(effect, std::move(callback));
}

void update_gamestate(const Date today, MapInstance& map_instance);
void update_gamestate_after_map(const Date today);
void country_tick_before_map(
TypedSpan<good_index_t, char> reusable_goods_mask,
forwardable_span<
Expand Down
20 changes: 10 additions & 10 deletions src/openvic-simulation/country/CountryInstanceManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,16 +292,16 @@ bool CountryInstanceManager::apply_history_to_countries(InstanceManager& instanc
return ret;
}

void CountryInstanceManager::update_modifier_sums(const Date today, StaticModifierCache const& static_modifier_cache) {
for (CountryInstance& country : country_instances) {
country.update_modifier_sum(today, static_modifier_cache);
}
void CountryInstanceManager::update_modifier_sums_before_map() {
thread_pool.process(work_t::COUNTRY_UPDATE_MODIFIER_SUMS_BEFORE_MAP);
}

void CountryInstanceManager::update_gamestate(const Date today, MapInstance& map_instance) {
for (CountryInstance& country : country_instances) {
country.update_gamestate(today, map_instance);
}
void CountryInstanceManager::update_modifier_sums_after_map() {
thread_pool.process(work_t::COUNTRY_UPDATE_MODIFIER_SUMS_AFTER_MAP);
}

void CountryInstanceManager::update_gamestate_after_map(const Date today) {
thread_pool.process(work_t::COUNTRY_UPDATE_GAMESTATE_AFTER_MAP);

// TODO - work out how to have ranking effects applied (e.g. static modifiers) applied at game start
// we can't just move update_rankings to the top of this function as it will choose initial GPs based on
Expand All @@ -311,10 +311,10 @@ void CountryInstanceManager::update_gamestate(const Date today, MapInstance& map
}

void CountryInstanceManager::country_manager_tick_before_map() {
thread_pool.process_country_ticks_before_map();
thread_pool.process(work_t::COUNTRY_TICK_BEFORE_MAP);
}

void CountryInstanceManager::country_manager_tick_after_map() {
thread_pool.process_country_ticks_after_map();
thread_pool.process(work_t::COUNTRY_TICK_AFTER_MAP);
shared_country_values.update_costs();
}
7 changes: 3 additions & 4 deletions src/openvic-simulation/country/CountryInstanceManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,8 @@ namespace OpenVic {
struct CountryHistoryManager;
struct GoodInstanceManager;
struct InstanceManager;
struct MapInstance;
struct PopsDefines;
struct PopType;
struct StaticModifierCache;
struct ThreadPool;

struct CountryInstanceManager {
Expand Down Expand Up @@ -71,8 +69,9 @@ namespace OpenVic {

bool apply_history_to_countries(InstanceManager& instance_manager);

void update_modifier_sums(const Date today, StaticModifierCache const& static_modifier_cache);
void update_gamestate(const Date today, MapInstance& map_instance);
void update_modifier_sums_before_map();
void update_modifier_sums_after_map();
void update_gamestate_after_map(const Date today);
void country_manager_tick_before_map();
void country_manager_tick_after_map();
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ void MarketInstance::place_market_sell_order(MarketSellOrder&& market_sell_order
}

void MarketInstance::execute_orders() {
thread_pool.process_good_execute_orders();
thread_pool.process(work_t::GOOD_EXECUTE_ORDERS);
}

void MarketInstance::record_price_history() {
Expand Down
24 changes: 9 additions & 15 deletions src/openvic-simulation/map/MapInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,23 +145,17 @@ bool MapInstance::apply_history_to_provinces(
return ret;
}

void MapInstance::update_modifier_sums(const Date today, StaticModifierCache const& static_modifier_cache) {
for (ProvinceInstance& province : get_province_instances()) {
province.update_modifier_sum(today, static_modifier_cache);
}

for (ProvinceInstance& province : get_province_instances()) {
province.update_country_modifier_sum();
}
void MapInstance::update_modifier_sums(const Date today) {
thread_pool.process(work_t::PROVINCE_UPDATE_MODIFIER_SUMS);
}

void MapInstance::update_gamestate(InstanceManager const& instance_manager) {
void MapInstance::update_gamestate() {
highest_province_population = 0;
total_map_population = 0;

for (ProvinceInstance& province : get_province_instances()) {
province.update_gamestate(instance_manager);
thread_pool.process(work_t::PROVINCE_UPDATE_GAMESTATE);

for (ProvinceInstance& province : get_province_instances()) {
// Update population stats
const pop_sum_t province_population = province.get_total_population();
if (highest_province_population < province_population) {
Expand All @@ -174,13 +168,13 @@ void MapInstance::update_gamestate(InstanceManager const& instance_manager) {
}

void MapInstance::map_tick() {
thread_pool.process_province_ticks();
thread_pool.process(work_t::PROVINCE_TICK);
//state tick
//after province tick as province tick sets pop employment to 0
//state tick will update pop employment via factories
}

void MapInstance::initialise_for_new_game(InstanceManager const& instance_manager) {
update_gamestate(instance_manager);
thread_pool.process_province_initialise_for_new_game();
void MapInstance::initialise_for_new_game() {
update_gamestate();
thread_pool.process(work_t::PROVINCE_INITIALISE_FOR_NEW_GAME);
}
6 changes: 3 additions & 3 deletions src/openvic-simulation/map/MapInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,9 @@ namespace OpenVic {
TypedSpan<reform_index_t, const Reform> reforms
);

void update_modifier_sums(const Date today, StaticModifierCache const& static_modifier_cache);
void update_gamestate(InstanceManager const& instance_manager);
void update_modifier_sums(const Date today);
void update_gamestate();
void map_tick();
void initialise_for_new_game(InstanceManager const& instance_manager);
void initialise_for_new_game();
};
}
Loading
Loading