@@ -1368,18 +1368,24 @@ void CountryInstance::_update_budget() {
13681368 administrative_efficiency_from_administrators.set (fixed_point_t ::_1);
13691369 administrator_percentage.set (fixed_point_t ::_0);
13701370 } else {
1371- administrator_percentage.set (fixed_point_t (administrators) / total_non_colonial_population);
1372-
1373- const fixed_point_t desired_administrators = desired_administrator_percentage.get_untracked () * type_safe::get (total_non_colonial_population);
1374- const fixed_point_t administrative_efficiency_from_administrators_unclamped = std::min (
1375- fixed_point_t::mul_div (
1376- type_safe::get (administrators),
1377- fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency ()),
1378- desired_administrators
1379- )
1380- * (fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_administrative_efficiency_modifier ())),
1381- 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 ()
13821376 );
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 ())
1380+ );
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+ );
13831389
13841390 administrative_efficiency_from_administrators.set (
13851391 game_rules_manager.get_prevent_negative_administration_efficiency ()
@@ -1388,36 +1394,42 @@ void CountryInstance::_update_budget() {
13881394 );
13891395 }
13901396
1391- fixed_point_t projected_administration_spending_unscaled_by_slider_running_total = 0 ;
1392- fixed_point_t projected_education_spending_unscaled_by_slider_running_total = 0 ;
1393- fixed_point_t projected_military_spending_unscaled_by_slider_running_total = 0 ;
1394- fixed_point_t projected_pensions_spending_unscaled_by_slider_running_total = 0 ;
1395- 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 ;
13961402
1397- for (auto const & [pop_type, size] : get_population_by_type ()) {
1398- projected_administration_spending_unscaled_by_slider_running_total += size * administration_salary_base_by_pop_type.at (pop_type).get_untracked ();
1399- projected_education_spending_unscaled_by_slider_running_total += size * education_salary_base_by_pop_type.at (pop_type).get_untracked ();
1400- projected_military_spending_unscaled_by_slider_running_total += size * military_salary_base_by_pop_type.at (pop_type).get_untracked ();
1401- projected_pensions_spending_unscaled_by_slider_running_total += size * calculate_pensions_base (pop_type);
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 ();
14021409 projected_unemployment_subsidies_spending_unscaled_by_slider_running_total += type_safe::get (get_unemployed_pops_by_type (pop_type))
1403- * calculate_unemployment_subsidies_base (pop_type);
1410+ * calculate_unemployment_subsidies_base (pop_type). get_raw_value () ;
14041411 }
14051412
1406- projected_administration_spending_unscaled_by_slider.set (
1407- projected_administration_spending_unscaled_by_slider_running_total / Pop::size_denominator
1408- );
1409- projected_education_spending_unscaled_by_slider.set (
1410- projected_education_spending_unscaled_by_slider_running_total / Pop::size_denominator
1411- );
1412- projected_military_spending_unscaled_by_slider.set (
1413- projected_military_spending_unscaled_by_slider_running_total / Pop::size_denominator
1414- );
1415- projected_pensions_spending_unscaled_by_slider.set (
1416- projected_pensions_spending_unscaled_by_slider_running_total / Pop::size_denominator
1417- );
1418- projected_unemployment_subsidies_spending_unscaled_by_slider.set (
1419- projected_unemployment_subsidies_spending_unscaled_by_slider_running_total / Pop::size_denominator
1420- );
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+ ));
14211433}
14221434
14231435fixed_point_t CountryInstance::calculate_pensions_base (PopType const & pop_type) {
@@ -1499,9 +1511,18 @@ void CountryInstance::_update_population() {
14991511
15001512 for (auto const & [pop_type, pop_size] : get_population_by_type ()) {
15011513 if (pop_type.research_leadership_optimum > 0 && pop_size > 0 ) {
1502- const fixed_point_t factor = std::min (
1503- 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
15041517 );
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+ );
15051526
15061527 if (pop_type.research_points != 0 ) {
15071528 const fixed_point_t research_points = pop_type.research_points * factor;
@@ -1635,11 +1656,9 @@ void CountryInstance::_update_military() {
16351656 naval_unit_start_experience += get_modifier_effect_value (*modifier_effect_cache.get_naval_unit_start_experience ());
16361657
16371658 recruit_time = fixed_point_t ::_1 + get_modifier_effect_value (*modifier_effect_cache.get_unit_recruitment_time ());
1638- combat_width = combat_width_t (
1639- (
1640- type_safe::get (military_defines.get_base_combat_width ())
1641- + get_modifier_effect_value (*modifier_effect_cache.get_combat_width_additive ())
1642- ).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 ())
16431662 );
16441663 dig_in_cap = get_modifier_effect_value (*modifier_effect_cache.get_dig_in_cap ()).floor <int32_t >();
16451664 military_tactics = military_defines.get_base_military_tactics () +
0 commit comments