diff --git a/deps/lexy-vdf b/deps/lexy-vdf index 5be381929..4863eaf81 160000 --- a/deps/lexy-vdf +++ b/deps/lexy-vdf @@ -1 +1 @@ -Subproject commit 5be3819293ef27ad81b9465fa7d78db4baeaf8ed +Subproject commit 4863eaf8122aa07eaa32fe265f5f0d5152b4b5da diff --git a/deps/openvic-dataloader b/deps/openvic-dataloader index 7211a228e..4f4a053df 160000 --- a/deps/openvic-dataloader +++ b/deps/openvic-dataloader @@ -1 +1 @@ -Subproject commit 7211a228e68c8a6b1ad1c1c5ec68c8d720b6d2ba +Subproject commit 4f4a053dff51fe28e473ac8b3528a95dc6e5dec6 diff --git a/scripts b/scripts index 21d142795..3a4190526 160000 --- a/scripts +++ b/scripts @@ -1 +1 @@ -Subproject commit 21d142795539d65f30a1862502aae5aa43bd7650 +Subproject commit 3a4190526bde8e3fcd49c3ebcf77b5a87dc8ab62 diff --git a/src/openvic-simulation/economy/FactoryProducer.cpp b/src/openvic-simulation/economy/FactoryProducer.cpp index 81ebd4a70..98c04b2ec 100644 --- a/src/openvic-simulation/economy/FactoryProducer.cpp +++ b/src/openvic-simulation/economy/FactoryProducer.cpp @@ -1,5 +1,10 @@ #include "FactoryProducer.hpp" +#include "openvic-simulation/economy/Good.hpp" +#include "openvic-simulation/pop/Pop.hpp" +#include "openvic-simulation/types/fixed_point/FixedPoint.hpp" + + using namespace OpenVic; FactoryProducer::FactoryProducer( @@ -20,7 +25,8 @@ FactoryProducer::FactoryProducer( market_spendings_yesterday { new_market_spendings_yesterday }, paychecks_yesterday { new_paychecks_yesterday }, unprofitable_days { new_unprofitable_days }, subsidised_days { new_subsidised_days }, days_without_input { new_days_without_input }, hiring_priority { new_hiring_priority }, - profit_history_current { new_profit_history_current }, daily_profit_history { std::move(new_daily_profit_history) } {} + profit_history_current { new_profit_history_current }, daily_profit_history { std::move(new_daily_profit_history) }, + employees_per_job_cache {} {} FactoryProducer::FactoryProducer(ProductionType const& new_production_type, const fixed_point_t new_size_multiplier) : FactoryProducer { new_production_type, new_size_multiplier, 0, 0, 0, {}, {}, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, {} } {} @@ -37,3 +43,54 @@ fixed_point_t FactoryProducer::get_average_profitability_last_seven_days() const return sum / (1 + profit_history_current); } + +void FactoryProducer::produce( + const fixed_point_t input_modifier, const fixed_point_t throughput_modifier, const fixed_point_t output_modifier +) { + fixed_point_t my_input_multiplier = input_modifier, my_throughput_multiplier = throughput_modifier, + my_output_multiplier = output_modifier; + for (Job const& job : production_type.get_jobs()) { + const fixed_point_t number_of_employees_in_job = employees_per_job_cache[&job]; + switch (job.get_effect_type()) { + case Job::effect_t::INPUT: + my_input_multiplier += job.get_effect_multiplier() * number_of_employees_in_job / + (size_multiplier * production_type.get_base_workforce_size()); + break; + case Job::effect_t::OUTPUT: + my_output_multiplier += job.get_effect_multiplier() * number_of_employees_in_job / + (size_multiplier * production_type.get_base_workforce_size()); + break; + case Job::effect_t::THROUGHPUT: + my_throughput_multiplier *= + job.get_effect_multiplier() * number_of_employees_in_job / production_type.get_base_workforce_size(); + break; + } + } + + my_input_multiplier *= my_throughput_multiplier; + my_output_multiplier *= my_throughput_multiplier; + + fixed_point_t lack_of_inputs_multiplier = 1; + for (const auto& [good, base_input_amount] : production_type.get_input_goods()) { + const fixed_point_t desired_input = base_input_amount * my_input_multiplier; + const fixed_point_t in_stock = stockpile[good]; + if (desired_input > in_stock) { + fixed_point_t relative_inputs = in_stock / desired_input; + if (relative_inputs < lack_of_inputs_multiplier) { + lack_of_inputs_multiplier = relative_inputs; + } + } + } + + if (lack_of_inputs_multiplier < 1) { + my_input_multiplier *= lack_of_inputs_multiplier; + my_output_multiplier *= lack_of_inputs_multiplier; + days_without_input++; + } + + for (const auto& [good, base_input_amount] : production_type.get_input_goods()) { + stockpile[good] -= base_input_amount * my_input_multiplier; + } + + output_quantity_yesterday = production_type.get_base_output_quantity() * my_output_multiplier; +} diff --git a/src/openvic-simulation/economy/FactoryProducer.hpp b/src/openvic-simulation/economy/FactoryProducer.hpp index 623ec4815..5570b7a36 100644 --- a/src/openvic-simulation/economy/FactoryProducer.hpp +++ b/src/openvic-simulation/economy/FactoryProducer.hpp @@ -13,6 +13,8 @@ namespace OpenVic { static constexpr uint8_t DAYS_OF_HISTORY = 7; using daily_profit_history_t = std::array; + ordered_map employees_per_job_cache; + uint8_t PROPERTY(profit_history_current); daily_profit_history_t PROPERTY(daily_profit_history); ProductionType const& PROPERTY(production_type); @@ -47,5 +49,8 @@ namespace OpenVic { fixed_point_t get_profitability_yesterday() const; fixed_point_t get_average_profitability_last_seven_days() const; + void produce( + const fixed_point_t input_modifier, const fixed_point_t throughput_modifier, const fixed_point_t output_modifier + ); }; } diff --git a/src/openvic-simulation/pop/Pop.cpp b/src/openvic-simulation/pop/Pop.cpp index 170132175..536459d53 100644 --- a/src/openvic-simulation/pop/Pop.cpp +++ b/src/openvic-simulation/pop/Pop.cpp @@ -533,8 +533,8 @@ bool PopManager::load_pop_into_vector( *non_integer_size = true; } - if (culture != nullptr && religion != nullptr && size >= 1) { - vec.emplace_back(Pop { type, *culture, *religion, size.to_int64_t(), militancy, consciousness, rebel_type }); + if (culture != nullptr && religion != nullptr && size >= 1 && size <= std::numeric_limits::max()) { + vec.emplace_back(Pop { type, *culture, *religion, size.to_int32_t(), militancy, consciousness, rebel_type }); } else { Logger::warning( "Some pop arguments are invalid: culture = ", culture, ", religion = ", religion, ", size = ", size diff --git a/src/openvic-simulation/pop/Pop.hpp b/src/openvic-simulation/pop/Pop.hpp index cdecf4401..647d06dfe 100644 --- a/src/openvic-simulation/pop/Pop.hpp +++ b/src/openvic-simulation/pop/Pop.hpp @@ -30,7 +30,7 @@ namespace OpenVic { struct Pop { friend struct PopManager; - using pop_size_t = int64_t; + using pop_size_t = int32_t; static constexpr pop_size_t MAX_SIZE = std::numeric_limits::max();