4343#include " openvic-simulation/types/Date.hpp"
4444#include " openvic-simulation/types/fixed_point/FixedPoint.hpp"
4545#include " openvic-simulation/types/IndexedFlatMap.hpp"
46- #include " openvic-simulation/types/PopSize.hpp"
46+ #include " openvic-simulation/population/PopSize.hpp"
47+ #include " openvic-simulation/population/PopSum.hpp"
4748#include " openvic-simulation/types/UnitBranchType.hpp"
4849#include " openvic-simulation/utility/Containers.hpp"
4950#include " openvic-simulation/utility/Logger.hpp"
@@ -1341,8 +1342,8 @@ void CountryInstance::_update_budget() {
13411342 OpenVic immediately updates both.
13421343 */
13431344
1344- pop_size_t total_non_colonial_population = 0 ;
1345- pop_size_t administrators = 0 ;
1345+ pop_sum_t total_non_colonial_population = 0 ;
1346+ pop_sum_t administrators = 0 ;
13461347 for (State const * const state_ptr : states) {
13471348 if (state_ptr == nullptr ) {
13481349 continue ;
@@ -1353,7 +1354,7 @@ void CountryInstance::_update_budget() {
13531354 continue ;
13541355 }
13551356
1356- IndexedFlatMap<PopType, pop_size_t > const & state_population_by_type = state.get_population_by_type ();
1357+ IndexedFlatMap<PopType, pop_sum_t > const & state_population_by_type = state.get_population_by_type ();
13571358
13581359 for (auto const & [pop_type, size] : state_population_by_type) {
13591360 if (pop_type.is_administrator ) {
@@ -1367,18 +1368,24 @@ void CountryInstance::_update_budget() {
13671368 administrative_efficiency_from_administrators.set (fixed_point_t ::_1);
13681369 administrator_percentage.set (fixed_point_t ::_0);
13691370 } else {
1370- administrator_percentage.set (fixed_point_t (administrators) / total_non_colonial_population);
1371-
1372- const fixed_point_t desired_administrators = desired_administrator_percentage.get_untracked () * total_non_colonial_population;
1373- const fixed_point_t administrative_efficiency_from_administrators_unclamped = std::min (
1374- fixed_point_t::mul_div (
1375- administrators,
1376- fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency ()),
1377- desired_administrators
1378- )
1379- * (fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency_modifier ())),
1380- fixed_point_t ::_1
1371+ administrator_percentage.set (fixed_point_t::from_fraction (administrators, total_non_colonial_population));
1372+
1373+ const pop_sum_t desired_administrators = fixed_point_t::multiply_truncate (
1374+ total_non_colonial_population,
1375+ desired_administrator_percentage.get_untracked ()
1376+ );
1377+ const pop_sum_t effective_administrators = fixed_point_t::multiply_truncate (
1378+ administrators,
1379+ fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency ())
13811380 );
1381+ const fixed_point_t administrative_efficiency_from_administrators_unclamped =
1382+ desired_administrators == 0
1383+ ? fixed_point_t ::_1
1384+ : std::min (
1385+ fixed_point_t::from_fraction (effective_administrators, desired_administrators)
1386+ * (fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency_modifier ())),
1387+ fixed_point_t ::_1
1388+ );
13821389
13831390 administrative_efficiency_from_administrators.set (
13841391 game_rules_manager.get_prevent_negative_administration_efficiency ()
@@ -1387,36 +1394,42 @@ void CountryInstance::_update_budget() {
13871394 );
13881395 }
13891396
1390- fixed_point_t projected_administration_spending_unscaled_by_slider_running_total = 0 ;
1391- fixed_point_t projected_education_spending_unscaled_by_slider_running_total = 0 ;
1392- fixed_point_t projected_military_spending_unscaled_by_slider_running_total = 0 ;
1393- fixed_point_t projected_pensions_spending_unscaled_by_slider_running_total = 0 ;
1394- fixed_point_t projected_unemployment_subsidies_spending_unscaled_by_slider_running_total = 0 ;
1397+ int64_t projected_administration_spending_unscaled_by_slider_running_total = 0 ;
1398+ int64_t projected_education_spending_unscaled_by_slider_running_total = 0 ;
1399+ int64_t projected_military_spending_unscaled_by_slider_running_total = 0 ;
1400+ int64_t projected_pensions_spending_unscaled_by_slider_running_total = 0 ;
1401+ int64_t projected_unemployment_subsidies_spending_unscaled_by_slider_running_total = 0 ;
13951402
1396- for (auto const & [pop_type, size] : get_population_by_type ()) {
1397- projected_administration_spending_unscaled_by_slider_running_total += size * administration_salary_base_by_pop_type.at (pop_type).get_untracked ();
1398- projected_education_spending_unscaled_by_slider_running_total += size * education_salary_base_by_pop_type.at (pop_type).get_untracked ();
1399- projected_military_spending_unscaled_by_slider_running_total += size * military_salary_base_by_pop_type.at (pop_type).get_untracked ();
1400- projected_pensions_spending_unscaled_by_slider_running_total += size * calculate_pensions_base (pop_type);
1401- projected_unemployment_subsidies_spending_unscaled_by_slider_running_total += get_unemployed_pops_by_type (pop_type)
1402- * calculate_unemployment_subsidies_base (pop_type);
1403- }
1404-
1405- projected_administration_spending_unscaled_by_slider.set (
1406- projected_administration_spending_unscaled_by_slider_running_total / Pop::size_denominator
1407- );
1408- projected_education_spending_unscaled_by_slider.set (
1409- projected_education_spending_unscaled_by_slider_running_total / Pop::size_denominator
1410- );
1411- projected_military_spending_unscaled_by_slider.set (
1412- projected_military_spending_unscaled_by_slider_running_total / Pop::size_denominator
1413- );
1414- projected_pensions_spending_unscaled_by_slider.set (
1415- projected_pensions_spending_unscaled_by_slider_running_total / Pop::size_denominator
1416- );
1417- projected_unemployment_subsidies_spending_unscaled_by_slider.set (
1418- projected_unemployment_subsidies_spending_unscaled_by_slider_running_total / Pop::size_denominator
1419- );
1403+ for (auto const & [pop_type, pop_size] : get_population_by_type ()) {
1404+ const int64_t size = type_safe::get (pop_size);
1405+ projected_administration_spending_unscaled_by_slider_running_total += size * administration_salary_base_by_pop_type.at (pop_type).get_untracked ().get_raw_value ();
1406+ projected_education_spending_unscaled_by_slider_running_total += size * education_salary_base_by_pop_type.at (pop_type).get_untracked ().get_raw_value ();
1407+ projected_military_spending_unscaled_by_slider_running_total += size * military_salary_base_by_pop_type.at (pop_type).get_untracked ().get_raw_value ();
1408+ projected_pensions_spending_unscaled_by_slider_running_total += size * calculate_pensions_base (pop_type).get_raw_value ();
1409+ projected_unemployment_subsidies_spending_unscaled_by_slider_running_total += type_safe::get (get_unemployed_pops_by_type (pop_type))
1410+ * calculate_unemployment_subsidies_base (pop_type).get_raw_value ();
1411+ }
1412+
1413+ projected_administration_spending_unscaled_by_slider.set (fixed_point_t::from_fraction (
1414+ projected_administration_spending_unscaled_by_slider_running_total,
1415+ type_safe::get (Pop::size_denominator)
1416+ ));
1417+ projected_education_spending_unscaled_by_slider.set (fixed_point_t::from_fraction (
1418+ projected_education_spending_unscaled_by_slider_running_total,
1419+ type_safe::get (Pop::size_denominator)
1420+ ));
1421+ projected_military_spending_unscaled_by_slider.set (fixed_point_t::from_fraction (
1422+ projected_military_spending_unscaled_by_slider_running_total,
1423+ type_safe::get (Pop::size_denominator)
1424+ ));
1425+ projected_pensions_spending_unscaled_by_slider.set (fixed_point_t::from_fraction (
1426+ projected_pensions_spending_unscaled_by_slider_running_total,
1427+ type_safe::get (Pop::size_denominator)
1428+ ));
1429+ projected_unemployment_subsidies_spending_unscaled_by_slider.set (fixed_point_t::from_fraction (
1430+ projected_unemployment_subsidies_spending_unscaled_by_slider_running_total,
1431+ type_safe::get (Pop::size_denominator)
1432+ ));
14201433}
14211434
14221435fixed_point_t CountryInstance::calculate_pensions_base (PopType const & pop_type) {
@@ -1498,9 +1511,18 @@ void CountryInstance::_update_population() {
14981511
14991512 for (auto const & [pop_type, pop_size] : get_population_by_type ()) {
15001513 if (pop_type.research_leadership_optimum > 0 && pop_size > 0 ) {
1501- const fixed_point_t factor = std::min (
1502- pop_size / (get_total_population () * pop_type.research_leadership_optimum ), fixed_point_t ::_1
1514+ const pop_sum_t optimum_size = fixed_point_t::multiply_truncate (
1515+ get_total_population (),
1516+ pop_type.research_leadership_optimum
15031517 );
1518+ const fixed_point_t factor = optimum_size == 0
1519+ ? fixed_point_t ::_1
1520+ : std::min (
1521+ fixed_point_t::from_fraction (
1522+ pop_size,
1523+ optimum_size
1524+ ), fixed_point_t ::_1
1525+ );
15041526
15051527 if (pop_type.research_points != 0 ) {
15061528 const fixed_point_t research_points = pop_type.research_points * factor;
@@ -1634,11 +1656,9 @@ void CountryInstance::_update_military() {
16341656 naval_unit_start_experience += get_modifier_effect_value (*modifier_effect_cache.get_naval_unit_start_experience ());
16351657
16361658 recruit_time = fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_unit_recruitment_time ());
1637- combat_width = combat_width_t (
1638- (
1639- type_safe::get (military_defines.get_base_combat_width ())
1640- + get_modifier_effect_value (*modifier_effect_cache.get_combat_width_additive ())
1641- ).floor <type_safe::underlying_type<combat_width_t >>()
1659+ combat_width = fixed_point_t::multiply_truncate (
1660+ military_defines.get_base_combat_width (),
1661+ get_modifier_effect_value (*modifier_effect_cache.get_combat_width_additive ())
16421662 );
16431663 dig_in_cap = get_modifier_effect_value (*modifier_effect_cache.get_dig_in_cap ()).floor <int32_t >();
16441664 military_tactics = military_defines.get_base_military_tactics () +
0 commit comments