aboutsummaryrefslogtreecommitdiff
path: root/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp')
-rw-r--r--src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp154
1 files changed, 75 insertions, 79 deletions
diff --git a/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp b/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
index 70cb64d..7f030ab 100644
--- a/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
+++ b/src/openvic-simulation/economy/production/ResourceGatheringOperation.cpp
@@ -41,47 +41,23 @@ ResourceGatheringOperation::ResourceGatheringOperation(decltype(employee_count_p
fixed_point_t::_0(), {}, pop_type_keys
} {}
-void ResourceGatheringOperation::initialise_for_new_game(ProvinceInstance& location, ModifierEffectCache const& modifier_effect_cache) {
- if (production_type_nullable == nullptr) {
- output_quantity_yesterday = 0;
- revenue_yesterday = 0;
- return;
- }
-
- ProductionType const& production_type = *production_type_nullable;
- const fixed_point_t size_modifier = calculate_size_modifier(location, modifier_effect_cache);
- const Pop::pop_size_t total_worker_count_in_province = update_size_and_return_total_worker_count(location, modifier_effect_cache, size_modifier);
- hire(location, total_worker_count_in_province);
- Pop::pop_size_t total_owner_count_in_state_cache = 0;
- std::vector<Pop*> owner_pops_cache {};
- output_quantity_yesterday = produce(location, owner_pops_cache, total_owner_count_in_state_cache, modifier_effect_cache, size_modifier);
- revenue_yesterday = output_quantity_yesterday * production_type.get_output_good().get_base_price(); //TODO sell on market
- pay_employees(location, revenue_yesterday, total_worker_count_in_province, owner_pops_cache, total_owner_count_in_state_cache);
-}
-
-Pop::pop_size_t ResourceGatheringOperation::update_size_and_return_total_worker_count(
+void ResourceGatheringOperation::initialise_rgo_size_multiplier(
ProvinceInstance& location,
- ModifierEffectCache const& modifier_effect_cache,
- const fixed_point_t size_modifier
+ ModifierEffectCache const& modifier_effect_cache
) {
if (production_type_nullable == nullptr) {
size_multiplier = fixed_point_t::_0();
max_employee_count_cache = fixed_point_t::_0();
- return fixed_point_t::_0();
+ return;
}
- Pop::pop_size_t total_worker_count_in_province = 0; //not counting equivalents
ProductionType const& production_type = *production_type_nullable;
std::vector<Job> const& jobs = production_type.get_jobs();
- //can't use pop_type_distribution as it is not filled correctly yet (possibly due to equivalent pop type conversion)
- for (Pop const& pop : location.get_pops()){
- PopType const* pop_type = pop.get_type();
- for(Job const& job : jobs) {
- if (job.get_pop_type() == pop_type) {
- total_worker_count_in_province += pop.get_size();
- break;
- }
- }
+ IndexedMap<PopType, Pop::pop_size_t> const& province_pop_type_distribution = location.get_pop_type_distribution();
+
+ Pop::pop_size_t total_worker_count_in_province = 0; //not counting equivalents
+ for(Job const& job : jobs) {
+ total_worker_count_in_province += province_pop_type_distribution[*job.get_pop_type()];
}
fixed_point_t base_size_modifier = fixed_point_t::_1();
@@ -98,8 +74,9 @@ Pop::pop_size_t ResourceGatheringOperation::update_size_and_return_total_worker_
} else {
size_multiplier = ((total_worker_count_in_province / (base_size_modifier * base_workforce_size)).ceil() * fixed_point_t::_1_50()).floor();
}
+
+ const fixed_point_t size_modifier = calculate_size_modifier(location, modifier_effect_cache);
max_employee_count_cache = (size_modifier * size_multiplier * base_workforce_size).floor();
- return total_worker_count_in_province;
}
fixed_point_t ResourceGatheringOperation::calculate_size_modifier(ProvinceInstance const& location, ModifierEffectCache const& modifier_effect_cache) const {
@@ -123,6 +100,51 @@ fixed_point_t ResourceGatheringOperation::calculate_size_modifier(ProvinceInstan
return size_modifier > fixed_point_t::_0() ? size_modifier : fixed_point_t::_0();
}
+void ResourceGatheringOperation::rgo_tick(ProvinceInstance& location, ModifierEffectCache const& modifier_effect_cache) {
+ if (production_type_nullable == nullptr | location.get_owner() == nullptr) {
+ output_quantity_yesterday = 0;
+ revenue_yesterday = 0;
+ return;
+ }
+
+ ProductionType const& production_type = *production_type_nullable;
+ std::vector<Job> const& jobs = production_type.get_jobs();
+ IndexedMap<PopType, Pop::pop_size_t> const& province_pop_type_distribution = location.get_pop_type_distribution();
+
+ Pop::pop_size_t total_worker_count_in_province = 0; //not counting equivalents
+ for(Job const& job : jobs) {
+ total_worker_count_in_province += province_pop_type_distribution[*job.get_pop_type()];
+ }
+
+ hire(location, total_worker_count_in_province);
+
+ Pop::pop_size_t total_owner_count_in_state_cache = 0;
+ std::vector<Pop*> const* owner_pops_cache = nullptr;
+
+ if (production_type.get_owner().has_value()) {
+ PopType const& owner_pop_type = *production_type.get_owner()->get_pop_type();
+ total_owner_count_in_state_cache = location.get_state()->get_pop_type_distribution()[owner_pop_type];
+ owner_pops_cache = &location.get_mutable_state()->get_mutable_pops_cache_by_type()[owner_pop_type];
+ }
+
+ output_quantity_yesterday = produce(
+ location,
+ owner_pops_cache,
+ total_owner_count_in_state_cache,
+ modifier_effect_cache
+ );
+
+ revenue_yesterday = output_quantity_yesterday * production_type.get_output_good().get_base_price(); //TODO sell on market
+
+ pay_employees(
+ location,
+ revenue_yesterday,
+ total_worker_count_in_province,
+ owner_pops_cache,
+ total_owner_count_in_state_cache
+ );
+}
+
void ResourceGatheringOperation::hire(ProvinceInstance& location, Pop::pop_size_t available_worker_count) {
total_employees_count_cache = 0;
total_paid_employees_count_cache=0;
@@ -166,17 +188,15 @@ void ResourceGatheringOperation::hire(ProvinceInstance& location, Pop::pop_size_
fixed_point_t ResourceGatheringOperation::produce(
ProvinceInstance& location,
- std::vector<Pop*>& owner_pops_cache,
- Pop::pop_size_t& total_owner_count_in_state_cache,
- ModifierEffectCache const& modifier_effect_cache,
- const fixed_point_t size_modifier
+ std::vector<Pop*> const* const owner_pops_cache,
+ const Pop::pop_size_t total_owner_count_in_state_cache,
+ ModifierEffectCache const& modifier_effect_cache
) {
+ const fixed_point_t size_modifier = calculate_size_modifier(location, modifier_effect_cache);
if (size_modifier == fixed_point_t::_0()){
return fixed_point_t::_0();
}
- total_owner_count_in_state_cache = 0;
- owner_pops_cache = {};
if (production_type_nullable == nullptr || max_employee_count_cache <= 0) {
return fixed_point_t::_0();
}
@@ -187,35 +207,15 @@ fixed_point_t ResourceGatheringOperation::produce(
std::optional<Job> const& owner = production_type.get_owner();
if (owner.has_value()) {
- Job const& owner_job = owner.value();
- PopType const* owner_job_pop_type_nullable = owner_job.get_pop_type();
- if (owner_job_pop_type_nullable == nullptr) {
- Logger::error("Owner job for ", production_type.get_identifier(), " has nullptr as pop_type.");
- return fixed_point_t::_0();
- }
- PopType const& owner_pop_type = *owner_job_pop_type_nullable;
- State const* state_nullable = location.get_state();
- if (state_nullable == nullptr) {
+ State const* state_ptr = location.get_state();
+ if (state_ptr == nullptr) {
Logger::error("Province ", location.get_identifier(), " has no state.");
return fixed_point_t::_0();
}
- State const& state = *state_nullable;
- Pop::pop_size_t state_population = 0; //state.get_total_population() is not filled yet
- std::vector<ProvinceInstance*> const& provinces_in_state = state.get_provinces();
- for (ProvinceInstance* const province_nullable : provinces_in_state) {
- if (province_nullable == nullptr) {
- Logger::error("State ", state.get_identifier(), " has nullptr in provinces.");
- return fixed_point_t::_0();
- }
- ProvinceInstance& province = *province_nullable;
- for (Pop& pop : province.get_mutable_pops()){
- state_population += pop.get_size();
- if (&owner_pop_type == pop.get_type()) {
- owner_pops_cache.push_back(&pop);
- total_owner_count_in_state_cache += pop.get_size();
- }
- }
- }
+
+ State const& state = *state_ptr;
+ const Pop::pop_size_t state_population = state.get_total_population();
+ Job const& owner_job = owner.value();
if (total_owner_count_in_state_cache > 0) {
switch (owner_job.get_effect_type()) {
@@ -293,32 +293,27 @@ void ResourceGatheringOperation::pay_employees(
ProvinceInstance& location,
const fixed_point_t revenue,
const Pop::pop_size_t total_worker_count_in_province,
- std::vector<Pop*>& owner_pops_cache,
+ std::vector<Pop*> const* const owner_pops_cache,
const Pop::pop_size_t total_owner_count_in_state_cache
) {
total_owner_income_cache = 0;
total_employee_income_cache = 0;
- if (production_type_nullable == nullptr || revenue <= 0 || total_worker_count_in_province <= 0) {
+ if (revenue <= 0 || total_worker_count_in_province <= 0) {
if (revenue < 0) { Logger::error("Negative revenue for province ", location.get_identifier()); }
if (total_worker_count_in_province < 0) { Logger::error("Negative total worker count for province ", location.get_identifier()); }
return;
}
-
- ProductionType const& production_type = *production_type_nullable;
fixed_point_t revenue_left = revenue;
- if (total_owner_count_in_state_cache > 0) {
- Job const& owner_job = production_type.get_owner().value();
- PopType const* owner_job_pop_type_nullable = owner_job.get_pop_type();
-
+ if (total_owner_count_in_state_cache > 0) {
fixed_point_t owner_share = (fixed_point_t::_2() * total_owner_count_in_state_cache / total_worker_count_in_province);
constexpr fixed_point_t upper_limit = fixed_point_t::_0_50();
if (owner_share > upper_limit) {
owner_share = upper_limit;
}
- for(Pop* owner_pop_nullable : owner_pops_cache) {
- Pop& owner_pop = *owner_pop_nullable;
+ for(Pop* owner_pop_ptr : *owner_pops_cache) {
+ Pop& owner_pop = *owner_pop_ptr;
const fixed_point_t income_for_this_pop = revenue_left * owner_share * owner_pop.get_size() / total_owner_count_in_state_cache;
owner_pop.add_rgo_owner_income(income_for_this_pop);
total_owner_income_cache += income_for_this_pop;
@@ -329,13 +324,14 @@ void ResourceGatheringOperation::pay_employees(
if (total_paid_employees_count_cache > 0) {
for (Employee& employee : employees) {
Pop& employee_pop = employee.pop;
- PopType const* employee_pop_type_nullable = employee_pop.get_type();
- if (employee_pop_type_nullable == nullptr) {
+
+ PopType const* employee_pop_type = employee_pop.get_type();
+ if (employee_pop_type == nullptr) {
Logger::error("employee has nullptr pop_type.");
return;
}
- PopType const& employee_pop_type = *employee_pop_type_nullable;
- if (employee_pop_type.get_is_slave()) {
+
+ if (employee_pop_type->get_is_slave()) {
continue;
}