2929#include " openvic-simulation/types/PopSize.hpp"
3030#include " openvic-simulation/types/UnitBranchType.hpp"
3131#include " openvic-simulation/utility/Containers.hpp"
32+ #include < openvic-simulation/utility/Logger.hpp>
3233#include " openvic-simulation/utility/Utility.hpp"
3334
3435using namespace OpenVic ;
@@ -1868,79 +1869,80 @@ void CountryInstance::country_tick_before_map(InstanceManager& instance_manager)
18681869 // + loan interest
18691870
18701871 fixed_point_t available_funds = cache_stockpile_start_of_tick = cash_stockpile;
1871- fixed_point_t actual_import_subsidies;
18721872 const fixed_point_t projected_administration_spending_copy = projected_administration_spending.get_untracked ();
18731873 const fixed_point_t projected_education_spending_copy = projected_education_spending.get_untracked ();
18741874 const fixed_point_t projected_military_spending_copy = projected_military_spending.get_untracked ();
18751875 const fixed_point_t projected_social_spending_copy = projected_social_spending.get_untracked ();
18761876 const fixed_point_t projected_import_subsidies_copy = projected_import_subsidies.get_untracked ();
18771877 if (projected_spending.get_untracked () <= available_funds) {
1878- actual_administration_spending. set ( projected_administration_spending_copy) ;
1879- actual_education_spending. set ( projected_education_spending_copy) ;
1880- actual_military_spending. set ( projected_military_spending_copy) ;
1881- actual_social_spending. set ( projected_social_spending_copy) ;
1882- actual_import_subsidies = projected_import_subsidies_copy;
1878+ actual_administration_budget = projected_administration_spending_copy;
1879+ actual_education_budget = projected_education_spending_copy;
1880+ actual_military_budget = projected_military_spending_copy;
1881+ actual_social_budget = projected_social_spending_copy;
1882+ actual_import_subsidies_budget = projected_import_subsidies_copy;
18831883 } else {
18841884 // TODO try take loan (callback?)
18851885 // update available_funds with loan
18861886
18871887 if (available_funds < projected_education_spending_copy) {
1888- actual_education_spending.set (available_funds);
1889- actual_administration_spending.set (0 );
1890- actual_military_spending.set (0 );
1891- actual_social_spending.set (0 );
1888+ actual_education_budget = available_funds;
1889+ actual_administration_budget = 0 ;
1890+ actual_military_budget = 0 ;
1891+ actual_social_budget = 0 ;
1892+ actual_import_subsidies_budget = 0 ;
18921893 } else {
18931894 available_funds -= projected_education_spending_copy;
1894- actual_education_spending. set ( projected_education_spending_copy) ;
1895+ actual_education_budget = projected_education_spending_copy;
18951896
18961897 if (available_funds < projected_administration_spending_copy) {
1897- actual_administration_spending.set (available_funds);
1898- actual_military_spending.set (0 );
1899- actual_social_spending.set (0 );
1898+ actual_administration_budget = available_funds;
1899+ actual_military_budget = 0 ;
1900+ actual_social_budget = 0 ;
1901+ actual_import_subsidies_budget = 0 ;
19001902 } else {
19011903 available_funds -= projected_administration_spending_copy;
1902- actual_administration_spending. set ( projected_administration_spending_copy) ;
1904+ actual_administration_budget = projected_administration_spending_copy;
19031905
19041906 if (available_funds < projected_social_spending_copy) {
1905- actual_social_spending.set (available_funds);
1906- actual_military_spending.set (0 );
1907+ actual_social_budget = available_funds;
1908+ actual_military_budget = 0 ;
1909+ actual_import_subsidies_budget = 0 ;
19071910 } else {
19081911 available_funds -= projected_social_spending_copy;
1909- actual_social_spending. set ( projected_social_spending_copy) ;
1912+ actual_social_budget = projected_social_spending_copy;
19101913
19111914 if (available_funds < projected_military_spending_copy) {
1912- actual_military_spending. set ( available_funds) ;
1913- actual_import_subsidies = 0 ;
1915+ actual_military_budget = available_funds;
1916+ actual_import_subsidies_budget = 0 ;
19141917 } else {
19151918 available_funds -= projected_military_spending_copy;
1916- actual_military_spending. set ( projected_military_spending_copy) ;
1919+ actual_military_budget = projected_military_spending_copy;
19171920
1918- actual_import_subsidies = std::min (available_funds, projected_import_subsidies_copy);
1921+ actual_import_subsidies_budget = std::min (available_funds, projected_import_subsidies_copy);
19191922 }
19201923 }
19211924 }
19221925 }
19231926 }
19241927
1928+ was_administration_budget_cut_yesterday = actual_administration_budget < projected_administration_spending_copy;
1929+ was_education_budget_cut_yesterday = actual_education_budget < projected_education_spending_copy;
1930+ was_military_budget_cut_yesterday = actual_military_budget < projected_military_spending_copy;
1931+ was_social_budget_cut_yesterday = actual_social_budget < projected_social_spending_copy;
1932+ was_import_subsidies_budget_cut_yesterday = actual_import_subsidies_budget < projected_import_subsidies_copy;
1933+
19251934 for (auto & data : goods_data.get_values ()) {
19261935 data.clear_daily_recorded_data ();
19271936 }
1928-
1929- actual_net_tariffs.set (
1930- has_import_subsidies.get_untracked ()
1931- ? -actual_import_subsidies
1932- : fixed_point_t ::_0
1933- );
19341937 taxable_income_by_pop_type.fill (0 );
1935- const fixed_point_t total_expenses = actual_import_subsidies
1936- + actual_administration_spending.get_untracked ()
1937- + actual_education_spending.get_untracked ()
1938- + actual_military_spending.get_untracked ()
1939- + actual_social_spending.get_untracked ();
1940- // TODO: + factory subsidies
1941- // TODO: + interest
1942- // TODO: + diplomatic costs
1943- cash_stockpile -= total_expenses;
1938+ actual_administration_spending
1939+ = actual_education_spending
1940+ = actual_military_spending
1941+ = actual_pensions_spending
1942+ = actual_unemployment_subsidies_spending
1943+ = actual_import_subsidies_spending
1944+ = actual_tariff_income
1945+ = 0 ;
19441946}
19451947
19461948void CountryInstance::country_tick_after_map (InstanceManager& instance_manager) {
@@ -2008,6 +2010,59 @@ void CountryInstance::country_tick_after_map(InstanceManager& instance_manager)
20082010 }
20092011 }
20102012
2013+ const fixed_point_t actual_administration_spending_copy = actual_administration_spending.load ();
2014+ if (OV_unlikely (actual_administration_spending_copy > actual_administration_budget)) {
2015+ Logger::error (
2016+ " Country " , get_identifier (), " has overspend on administration. Spending " , actual_administration_spending_copy,
2017+ " instead of the allocated " , actual_administration_budget ," This indicates a severe bug in the economy code."
2018+ );
2019+ }
2020+ cash_stockpile -= actual_administration_spending;
2021+
2022+ const fixed_point_t actual_education_spending_copy = actual_education_spending.load ();
2023+ if (OV_unlikely (actual_education_spending_copy > actual_education_budget)) {
2024+ Logger::error (
2025+ " Country " , get_identifier (), " has overspend on education. Spending " , actual_education_spending_copy,
2026+ " instead of the allocated " , actual_education_budget ," This indicates a severe bug in the economy code."
2027+ );
2028+ }
2029+ cash_stockpile -= actual_education_spending;
2030+
2031+ const fixed_point_t actual_military_spending_copy = actual_military_spending.load ();
2032+ if (OV_unlikely (actual_military_spending_copy > actual_military_budget)) {
2033+ Logger::error (
2034+ " Country " , get_identifier (), " has overspend on military. Spending " , actual_military_spending_copy,
2035+ " instead of the allocated " , actual_military_budget ," This indicates a severe bug in the economy code."
2036+ );
2037+ }
2038+ cash_stockpile -= actual_military_spending;
2039+
2040+ const fixed_point_t actual_social_spending_copy = actual_pensions_spending.load () + actual_unemployment_subsidies_spending.load ();
2041+ if (OV_unlikely (actual_social_spending_copy > actual_social_budget)) {
2042+ Logger::error (
2043+ " Country " , get_identifier (), " has overspend on pensions and/or unemployment subsidies. Spending " , actual_pensions_spending.load (),
2044+ " on pensions and " , actual_unemployment_subsidies_spending.load () ," on unemployment subsidies instead of the total allocated " , actual_social_budget ," This indicates a severe bug in the economy code."
2045+ );
2046+ }
2047+ cash_stockpile -= actual_pensions_spending;
2048+ cash_stockpile -= actual_unemployment_subsidies_spending;
2049+
2050+ const fixed_point_t actual_import_subsidies_spending_copy = actual_import_subsidies_spending.load ();
2051+ if (OV_unlikely (actual_import_subsidies_spending_copy > actual_import_subsidies_budget)) {
2052+ Logger::error (
2053+ " Country " , get_identifier (), " has overspend on import subsidies. Spending " , actual_import_subsidies_spending_copy,
2054+ " instead of the allocated " , actual_import_subsidies_budget ," This indicates a severe bug in the economy code."
2055+ );
2056+ }
2057+ cash_stockpile -= actual_import_subsidies_spending;
2058+
2059+ const fixed_point_t cash_stockpile_copy = cash_stockpile.load ();
2060+ if (OV_unlikely (cash_stockpile_copy < 0 )) {
2061+ Logger::error (" Country " , get_identifier (), " has overspend resulting in a cash stockpile of " , cash_stockpile_copy, " This indicates a severe bug in the economy code." );
2062+ }
2063+
2064+ cash_stockpile += actual_tariff_income;
2065+
20112066 const fixed_point_t gold_income_value = country_defines.get_gold_to_cash_rate () * total_gold_production;;
20122067 gold_income.set (gold_income_value);
20132068 cash_stockpile += gold_income_value;
@@ -2087,72 +2142,73 @@ void CountryInstance::request_salaries_and_welfare_and_import_subsidies(Pop& pop
20872142 SharedPopTypeValues const & pop_type_values = shared_country_values.get_shared_pop_type_values (pop_type);
20882143 ModifierEffectCache const & modifier_effect_cache = shared_country_values.get_modifier_effect_cache ();
20892144
2090- const fixed_point_t actual_administration_spending_value = actual_administration_spending.get_untracked ();
2091- if (actual_administration_spending_value > fixed_point_t ::_0) {
2145+ if (actual_administration_budget > fixed_point_t ::_0) {
20922146 const fixed_point_t administration_salary = fixed_point_t::mul_div (
20932147 pop_size * administration_salary_base_by_pop_type.at (pop_type).get_untracked (),
2094- actual_administration_spending_value ,
2148+ actual_administration_budget ,
20952149 projected_administration_spending_unscaled_by_slider.get_untracked ()
20962150 ) / Pop::size_denominator;
20972151 if (administration_salary > fixed_point_t ::_0) {
20982152 pop.add_government_salary_administration (administration_salary);
2153+ actual_administration_spending += administration_salary;
20992154 }
21002155 }
21012156
2102- const fixed_point_t actual_education_spending_value = actual_education_spending.get_untracked ();
2103- if (actual_education_spending_value > fixed_point_t ::_0) {
2157+ if (actual_education_budget > fixed_point_t ::_0) {
21042158 const fixed_point_t education_salary = fixed_point_t::mul_div (
21052159 pop_size * education_salary_base_by_pop_type.at (pop_type).get_untracked (),
2106- actual_education_spending_value ,
2160+ actual_education_budget ,
21072161 projected_education_spending_unscaled_by_slider.get_untracked ()
21082162 ) / Pop::size_denominator;
21092163 if (education_salary > fixed_point_t ::_0) {
21102164 pop.add_government_salary_education (education_salary);
2165+ actual_education_spending += education_salary;
21112166 }
21122167 }
21132168
2114- const fixed_point_t actual_military_spending_value = actual_military_spending.get_untracked ();
2115- if (actual_military_spending_value > fixed_point_t ::_0) {
2169+ if (actual_military_budget > fixed_point_t ::_0) {
21162170 const fixed_point_t military_salary = fixed_point_t::mul_div (
21172171 pop_size * military_salary_base_by_pop_type.at (pop_type).get_untracked (),
2118- actual_military_spending_value ,
2172+ actual_military_budget ,
21192173 projected_military_spending_unscaled_by_slider.get_untracked ()
21202174 ) / Pop::size_denominator;
21212175 if (military_salary > fixed_point_t ::_0) {
21222176 pop.add_government_salary_military (military_salary);
2177+ actual_military_spending += military_salary;
21232178 }
21242179 }
21252180
2126- const fixed_point_t actual_social_spending_value = actual_social_spending.get_untracked ();
2127- if (actual_social_spending_value > fixed_point_t ::_0) {
2181+ if (actual_social_budget > fixed_point_t ::_0) {
21282182 const fixed_point_t pension_income = fixed_point_t::mul_div (
21292183 pop_size * calculate_pensions_base (modifier_effect_cache, pop_type),
2130- actual_social_spending_value ,
2184+ actual_social_budget ,
21312185 projected_social_spending_unscaled_by_slider.get_untracked ()
21322186 ) / Pop::size_denominator;
21332187 if (pension_income > fixed_point_t ::_0) {
21342188 pop.add_pensions (pension_income);
2189+ actual_pensions_spending += pension_income;
21352190 }
21362191
21372192 const fixed_point_t unemployment_subsidies = fixed_point_t::mul_div (
21382193 pop.get_unemployed () * calculate_unemployment_subsidies_base (modifier_effect_cache, pop_type),
2139- actual_social_spending_value ,
2194+ actual_social_budget ,
21402195 projected_social_spending_unscaled_by_slider.get_untracked ()
21412196 ) / Pop::size_denominator;
21422197 if (unemployment_subsidies > fixed_point_t ::_0) {
21432198 pop.add_unemployment_subsidies (unemployment_subsidies);
2199+ actual_unemployment_subsidies_spending += unemployment_subsidies;
21442200 }
21452201 }
21462202
2147- const fixed_point_t actual_net_tariffs_value = actual_net_tariffs.get_untracked ();
2148- if (actual_net_tariffs_value < fixed_point_t ::_0) {
2203+ if (actual_import_subsidies_budget > fixed_point_t ::_0) {
21492204 const fixed_point_t import_subsidies = fixed_point_t::mul_div (
21502205 effective_tariff_rate.get_untracked () // < 0
21512206 * pop.get_yesterdays_import_value ().get_copy_of_value (),
2152- actual_net_tariffs_value , // < 0
2207+ actual_import_subsidies_budget , // < 0
21532208 projected_import_subsidies.get_untracked () // > 0
21542209 ); // effective_tariff_rate * actual_net_tariffs cancel out the negative
21552210 pop.add_import_subsidies (import_subsidies);
2211+ actual_import_subsidies_spending += import_subsidies;
21562212 }
21572213}
21582214
@@ -2174,8 +2230,7 @@ fixed_point_t CountryInstance::apply_tariff(const fixed_point_t money_spent_on_i
21742230 }
21752231
21762232 const fixed_point_t tariff = effective_tariff_rate_value * money_spent_on_imports;
2177- const std::lock_guard<std::mutex> lock_guard { actual_net_tariffs_mutex };
2178- actual_net_tariffs += tariff;
2233+ actual_tariff_income += tariff;
21792234 return tariff;
21802235}
21812236
0 commit comments