Skip to content

Commit 57475e0

Browse files
authored
Merge pull request #587 from OpenVicProject/rework_budget_properties
Rework budget properties
2 parents df04c53 + 5e8365e commit 57475e0

File tree

2 files changed

+130
-61
lines changed

2 files changed

+130
-61
lines changed

src/openvic-simulation/country/CountryInstance.cpp

Lines changed: 110 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
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

3435
using 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

19461948
void 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

src/openvic-simulation/country/CountryInstance.hpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,20 +174,29 @@ namespace OpenVic {
174174

175175
CLAMPED_PROPERTY(administration_spending_slider_value);
176176
STATE_PROPERTY(fixed_point_t, projected_administration_spending_unscaled_by_slider);
177-
STATE_PROPERTY(fixed_point_t, actual_administration_spending);
177+
fixed_point_t actual_administration_budget;
178+
bool PROPERTY(was_administration_budget_cut_yesterday, false);
179+
atomic_fixed_point_t PROPERTY(actual_administration_spending);
178180

179181
CLAMPED_PROPERTY(education_spending_slider_value);
180182
STATE_PROPERTY(fixed_point_t, projected_education_spending_unscaled_by_slider);
181-
STATE_PROPERTY(fixed_point_t, actual_education_spending);
183+
fixed_point_t actual_education_budget;
184+
bool PROPERTY(was_education_budget_cut_yesterday, false);
185+
atomic_fixed_point_t PROPERTY(actual_education_spending);
182186

183187
CLAMPED_PROPERTY(military_spending_slider_value);
184188
STATE_PROPERTY(fixed_point_t, projected_military_spending_unscaled_by_slider);
185-
STATE_PROPERTY(fixed_point_t, actual_military_spending);
189+
fixed_point_t actual_military_budget;
190+
bool PROPERTY(was_military_budget_cut_yesterday, false);
191+
atomic_fixed_point_t PROPERTY(actual_military_spending);
186192

187193
CLAMPED_PROPERTY(social_spending_slider_value);
188194
STATE_PROPERTY(fixed_point_t, projected_pensions_spending_unscaled_by_slider);
189195
STATE_PROPERTY(fixed_point_t, projected_unemployment_subsidies_spending_unscaled_by_slider);
190-
STATE_PROPERTY(fixed_point_t, actual_social_spending);
196+
fixed_point_t actual_social_budget;
197+
bool PROPERTY(was_social_budget_cut_yesterday, false);
198+
atomic_fixed_point_t PROPERTY(actual_pensions_spending);
199+
atomic_fixed_point_t PROPERTY(actual_unemployment_subsidies_spending);
191200

192201
//base here means not scaled by slider or pop size
193202
IndexedFlatMap<PopType, DerivedState<fixed_point_t>> administration_salary_base_by_pop_type;
@@ -196,8 +205,13 @@ namespace OpenVic {
196205
IndexedFlatMap<PopType, DerivedState<fixed_point_t>> social_income_variant_base_by_pop_type;
197206

198207
CLAMPED_PROPERTY(tariff_rate_slider_value);
199-
std::mutex actual_net_tariffs_mutex;
200-
MutableState<fixed_point_t> actual_net_tariffs;
208+
fixed_point_t actual_import_subsidies_budget;
209+
bool PROPERTY(was_import_subsidies_budget_cut_yesterday, false);
210+
atomic_fixed_point_t actual_import_subsidies_spending;
211+
atomic_fixed_point_t actual_tariff_income;
212+
fixed_point_t get_actual_net_tariffs_balance() const {
213+
return actual_tariff_income.load() - actual_import_subsidies_spending.load();
214+
}
201215

202216
//TODO actual factory subsidies
203217
//projected cost is UI only and lists the different factories

0 commit comments

Comments
 (0)