Skip to content

Commit 98e6a59

Browse files
committed
Government salaries and social income
1 parent f79afcf commit 98e6a59

15 files changed

+495
-69
lines changed

src/openvic-simulation/InstanceManager.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ InstanceManager::InstanceManager(
2626
new_definition_manager.get_economy_manager().get_production_type_manager()
2727
},
2828
global_flags { "global" },
29-
country_instance_manager { new_definition_manager.get_country_definition_manager() },
29+
country_instance_manager {
30+
new_definition_manager.get_country_definition_manager(),
31+
new_definition_manager.get_modifier_manager().get_modifier_effect_cache(),
32+
new_definition_manager.get_define_manager().get_country_defines(),
33+
new_definition_manager.get_define_manager().get_pops_defines(),
34+
new_definition_manager.get_pop_manager().get_pop_types()
35+
},
3036
unit_instance_manager {
3137
new_definition_manager.get_pop_manager().get_culture_manager(),
3238
new_definition_manager.get_military_manager().get_leader_trait_manager(),
@@ -88,15 +94,15 @@ void InstanceManager::update_gamestate() {
8894
* SS-98, SS-101
8995
*/
9096
void InstanceManager::tick() {
91-
country_instance_manager.country_manager_reset_before_tick();
9297

9398
today++;
9499

95100
Logger::info("Tick: ", today);
96101

97102
// Tick...
103+
country_instance_manager.country_manager_tick_before_map(*this);
98104
map_instance.map_tick();
99-
country_instance_manager.country_manager_tick(*this);
105+
country_instance_manager.country_manager_tick_after_map(*this);
100106
unit_instance_manager.tick();
101107
market_instance.execute_orders();
102108

@@ -172,6 +178,7 @@ bool InstanceManager::setup() {
172178

173179
thread_pool.initialise_threadpool(
174180
definition_manager.get_define_manager().get_pops_defines(),
181+
country_instance_manager.get_shared_country_values(),
175182
definition_manager.get_pop_manager().get_stratas(),
176183
good_instance_manager.get_good_instances(),
177184
map_instance.get_province_instances()

src/openvic-simulation/country/CountryInstance.cpp

Lines changed: 224 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include <cstdint>
44

5+
#include "openvic-simulation/country/SharedCountryValues.hpp"
56
#include "openvic-simulation/country/CountryDefinition.hpp"
67
#include "openvic-simulation/defines/Define.hpp"
78
#include "openvic-simulation/DefinitionManager.hpp"
@@ -14,9 +15,13 @@
1415
#include "openvic-simulation/modifier/ModifierEffectCache.hpp"
1516
#include "openvic-simulation/modifier/StaticModifierCache.hpp"
1617
#include "openvic-simulation/politics/Ideology.hpp"
18+
#include "openvic-simulation/pop/Pop.hpp"
19+
#include "openvic-simulation/pop/PopType.hpp"
20+
#include "openvic-simulation/pop/PopNeedsMacro.hpp"
1721
#include "openvic-simulation/research/Invention.hpp"
1822
#include "openvic-simulation/research/Technology.hpp"
1923
#include "openvic-simulation/types/fixed_point/FixedPoint.hpp"
24+
#include "openvic-simulation/types/PopSize.hpp"
2025
#include "openvic-simulation/types/SliderValue.hpp"
2126

2227
using namespace OpenVic;
@@ -989,8 +994,9 @@ static inline constexpr fixed_point_t nonzero_or_one(fixed_point_t const& value)
989994
return value == fixed_point_t::_0() ? fixed_point_t::_1() : value;
990995
}
991996

992-
void CountryInstance::_update_budget(DefineManager const& define_manager, ModifierEffectCache const& modifier_effect_cache) {
993-
CountryDefines const& country_defines = define_manager.get_country_defines();
997+
void CountryInstance::_update_budget(SharedCountryValues const& shared_country_values) {
998+
CountryDefines const& country_defines = shared_country_values.get_country_defines();
999+
ModifierEffectCache const& modifier_effect_cache = shared_country_values.get_modifier_effect_cache();
9941000

9951001
const fixed_point_t min_tax = get_modifier_effect_value(*modifier_effect_cache.get_min_tax());
9961002
const fixed_point_t max_tax = nonzero_or_one(get_modifier_effect_value(*modifier_effect_cache.get_max_tax()));
@@ -1017,13 +1023,80 @@ void CountryInstance::_update_budget(DefineManager const& define_manager, Modifi
10171023
// TODO - make sure we properly update everything dependent on these sliders' values,
10181024
// as they might change if their sliders' bounds shrink past their previous values.
10191025

1020-
const fixed_point_t tax_efficiency = country_defines.get_base_country_tax_efficiency() +
1021-
get_modifier_effect_value(*modifier_effect_cache.get_tax_efficiency()) +
1022-
get_modifier_effect_value(*modifier_effect_cache.get_tax_eff()) / 100;
1026+
const fixed_point_t tax_efficiency = country_defines.get_base_country_tax_efficiency()
1027+
+ get_modifier_effect_value(*modifier_effect_cache.get_tax_efficiency())
1028+
+ get_modifier_effect_value(*modifier_effect_cache.get_tax_eff()) / 100;
10231029

10241030
for (auto const& [strata, tax_rate_slider_value] : tax_rate_slider_value_by_strata) {
10251031
effective_tax_rate_by_strata[strata] = tax_rate_slider_value.get_value() * tax_efficiency;
10261032
}
1033+
1034+
/*
1035+
In Victoria 2, administration efficiency is updated in the UI immediately.
1036+
However the corruption_cost_multiplier is only updated after 2 ticks.
1037+
1038+
OpenVic immediately updates both.
1039+
*/
1040+
1041+
if (total_population == 0) {
1042+
administrative_efficiency = fixed_point_t::_0();
1043+
} else {
1044+
pop_size_t administrators = 0;
1045+
for (auto const& [pop_type, size] : pop_type_distribution) {
1046+
if (pop_type.get_is_administrator()) {
1047+
administrators += size;
1048+
}
1049+
}
1050+
1051+
administrative_efficiency = administrators
1052+
* (fixed_point_t::_1() + get_modifier_effect_value(*modifier_effect_cache.get_administrative_efficiency()))
1053+
* (fixed_point_t::_1() + get_modifier_effect_value(*modifier_effect_cache.get_administrative_efficiency_modifier()))
1054+
/ total_population;
1055+
}
1056+
1057+
projected_administration_spending_unscaled_by_slider
1058+
= projected_education_spending_unscaled_by_slider
1059+
= projected_military_spending_unscaled_by_slider
1060+
= projected_pensions_spending_unscaled_by_slider
1061+
= projected_unemployment_subsidies_spending_unscaled_by_slider
1062+
= fixed_point_t::_0();
1063+
1064+
for (auto const& [pop_type, size] : pop_type_distribution) {
1065+
projected_administration_spending_unscaled_by_slider += size * calculate_administration_salary_base(pop_type, shared_country_values);
1066+
projected_education_spending_unscaled_by_slider += size * calculate_education_salary_base(pop_type, shared_country_values);
1067+
projected_military_spending_unscaled_by_slider += size * calculate_military_salary_base(pop_type, shared_country_values);
1068+
projected_pensions_spending_unscaled_by_slider += size * calculate_pensions_base(pop_type, shared_country_values);
1069+
projected_unemployment_subsidies_spending_unscaled_by_slider += pop_type_unemployed_count[pop_type]
1070+
* calculate_unemployment_subsidies_base(pop_type, shared_country_values);
1071+
}
1072+
1073+
projected_administration_spending_unscaled_by_slider /= Pop::size_denominator;
1074+
projected_education_spending_unscaled_by_slider /= Pop::size_denominator;
1075+
projected_military_spending_unscaled_by_slider /= Pop::size_denominator;
1076+
projected_pensions_spending_unscaled_by_slider /= Pop::size_denominator;
1077+
projected_unemployment_subsidies_spending_unscaled_by_slider /= Pop::size_denominator;
1078+
}
1079+
1080+
fixed_point_t CountryInstance::calculate_pensions_base(
1081+
PopType const& pop_type,
1082+
SharedCountryValues const& shared_country_values
1083+
) const {
1084+
return get_modifier_effect_value(*shared_country_values.get_modifier_effect_cache().get_pension_level())
1085+
* calculate_social_income_form_base(pop_type, shared_country_values);
1086+
}
1087+
fixed_point_t CountryInstance::calculate_unemployment_subsidies_base(
1088+
PopType const& pop_type,
1089+
SharedCountryValues const& shared_country_values
1090+
) const {
1091+
return get_modifier_effect_value(*shared_country_values.get_modifier_effect_cache().get_unemployment_benefit())
1092+
* calculate_social_income_form_base(pop_type, shared_country_values);
1093+
}
1094+
fixed_point_t CountryInstance::calculate_minimum_wage_base(
1095+
PopType const& pop_type,
1096+
SharedCountryValues const& shared_country_values
1097+
) const {
1098+
return get_modifier_effect_value(*shared_country_values.get_modifier_effect_cache().get_minimum_wage())
1099+
* calculate_social_income_form_base(pop_type, shared_country_values);
10271100
}
10281101

10291102
void CountryInstance::_update_current_tech(InstanceManager const& instance_manager) {
@@ -1409,10 +1482,10 @@ fixed_point_t CountryInstance::get_modifier_effect_value(ModifierEffect const& e
14091482
return modifier_sum.get_modifier_effect_value(effect);
14101483
}
14111484

1412-
void CountryInstance::update_gamestate(InstanceManager& instance_manager) {
1485+
void CountryInstance::update_gamestate(InstanceManager& instance_manager, SharedCountryValues const& shared_country_values) {
14131486
DefinitionManager const& definition_manager = instance_manager.get_definition_manager();
14141487
DefineManager const& define_manager = definition_manager.get_define_manager();
1415-
ModifierEffectCache const& modifier_effect_cache = definition_manager.get_modifier_manager().get_modifier_effect_cache();
1488+
ModifierEffectCache const& modifier_effect_cache = shared_country_values.get_modifier_effect_cache();
14161489

14171490
if (is_civilised()) {
14181491
civilisation_progress = fixed_point_t::_0();
@@ -1523,7 +1596,7 @@ void CountryInstance::update_gamestate(InstanceManager& instance_manager) {
15231596
definition_manager.get_military_manager().get_unit_type_manager(),
15241597
modifier_effect_cache
15251598
);
1526-
_update_budget(define_manager, modifier_effect_cache);
1599+
_update_budget(shared_country_values);
15271600

15281601
// These don't do anything yet
15291602
_update_politics();
@@ -1552,15 +1625,73 @@ void CountryInstance::update_gamestate(InstanceManager& instance_manager) {
15521625
}
15531626
}
15541627

1555-
void CountryInstance::country_reset_before_tick() {
1556-
for (auto pair : goods_data) {
1557-
pair.second.clear_daily_recorded_data();
1628+
void CountryInstance::country_tick_before_map(InstanceManager& instance_manager) {
1629+
//TODO AI sliders
1630+
//TODO stockpile management
1631+
1632+
const fixed_point_t projected_administration_spending = administration_spending_slider_value.get_value() * projected_administration_spending_unscaled_by_slider;
1633+
const fixed_point_t projected_education_spending = education_spending_slider_value.get_value() * projected_education_spending_unscaled_by_slider;
1634+
const fixed_point_t projected_military_spending = military_spending_slider_value.get_value() * projected_military_spending_unscaled_by_slider;
1635+
const fixed_point_t projected_social_spending = social_spending_slider_value.get_value() * (
1636+
projected_pensions_spending_unscaled_by_slider
1637+
+ projected_unemployment_subsidies_spending_unscaled_by_slider
1638+
);
1639+
1640+
const fixed_point_t projected_spending = projected_administration_spending
1641+
+ projected_education_spending
1642+
+ projected_military_spending
1643+
+ projected_social_spending;
1644+
// + tariffs (if negative)
1645+
// + reparations + war subsidies
1646+
// + stockpile costs
1647+
// + industrial subsidies
1648+
// + loan interest
1649+
1650+
fixed_point_t available_funds = cash_stockpile.get_copy_of_value();
1651+
if (projected_spending <= available_funds) {
1652+
actual_administration_spending = projected_administration_spending;
1653+
actual_education_spending = projected_education_spending;
1654+
actual_military_spending = projected_military_spending;
1655+
actual_social_spending = projected_social_spending;
1656+
} else {
1657+
//TODO try take loan (callback?)
1658+
//update available_funds with loan
1659+
1660+
if (available_funds < projected_education_spending) {
1661+
actual_education_spending = available_funds;
1662+
actual_administration_spending = actual_military_spending = actual_social_spending = fixed_point_t::_0();
1663+
} else {
1664+
available_funds -= projected_education_spending;
1665+
actual_education_spending = projected_education_spending;
1666+
1667+
if (available_funds < projected_administration_spending) {
1668+
actual_administration_spending = available_funds;
1669+
actual_military_spending = actual_social_spending = fixed_point_t::_0();
1670+
} else {
1671+
available_funds -= projected_administration_spending;
1672+
actual_administration_spending = projected_administration_spending;
1673+
1674+
if (available_funds < projected_social_spending) {
1675+
actual_social_spending = available_funds;
1676+
actual_military_spending = fixed_point_t::_0();
1677+
} else {
1678+
available_funds -= projected_social_spending;
1679+
actual_social_spending = projected_social_spending;
1680+
1681+
actual_military_spending = std::min(available_funds, projected_military_spending);
1682+
}
1683+
}
1684+
}
1685+
}
1686+
1687+
for (auto const& [good_instance, data] : goods_data) {
1688+
data.clear_daily_recorded_data();
15581689
}
15591690

15601691
taxable_income_by_pop_type.fill(fixed_point_t::_0());
15611692
}
15621693

1563-
void CountryInstance::country_tick(InstanceManager& instance_manager) {
1694+
void CountryInstance::country_tick_after_map(InstanceManager& instance_manager) {
15641695
DefinitionManager const& definition_manager = instance_manager.get_definition_manager();
15651696
DefineManager const& define_manager = definition_manager.get_define_manager();
15661697

@@ -1691,6 +1822,60 @@ void CountryInstance::report_output(ProductionType const& production_type, const
16911822
good_data.production_per_production_type[&production_type] += quantity;
16921823
}
16931824

1825+
void CountryInstance::request_salaries_and_welfare(Pop& pop, SharedCountryValues const& shared_country_values) const {
1826+
PopType const& pop_type = *pop.get_type();
1827+
const pop_size_t pop_size = pop.get_size();
1828+
1829+
const fixed_point_t administration_salary = fixed_point_t::mul_div(
1830+
pop_size * calculate_administration_salary_base(pop_type, shared_country_values),
1831+
actual_administration_spending,
1832+
projected_administration_spending_unscaled_by_slider
1833+
);
1834+
if (administration_salary > fixed_point_t::_0()) {
1835+
pop.add_government_salary_administration(administration_salary);
1836+
}
1837+
1838+
const fixed_point_t education_salary = fixed_point_t::mul_div(
1839+
pop_size * calculate_education_salary_base(pop_type, shared_country_values),
1840+
actual_education_spending,
1841+
projected_education_spending_unscaled_by_slider
1842+
);
1843+
if (education_salary > fixed_point_t::_0()) {
1844+
pop.add_government_salary_education(education_salary);
1845+
}
1846+
1847+
const fixed_point_t military_salary = fixed_point_t::mul_div(
1848+
pop_size * calculate_military_salary_base(pop_type, shared_country_values),
1849+
actual_military_spending,
1850+
projected_military_spending_unscaled_by_slider
1851+
);
1852+
if (military_salary > fixed_point_t::_0()) {
1853+
pop.add_government_salary_military(military_salary);
1854+
}
1855+
1856+
const fixed_point_t projected_social_spending_unscaled_by_slider =
1857+
projected_pensions_spending_unscaled_by_slider
1858+
+ projected_unemployment_subsidies_spending_unscaled_by_slider;
1859+
1860+
const fixed_point_t pension_income = fixed_point_t::mul_div(
1861+
pop_size * calculate_pensions_base(pop_type, shared_country_values),
1862+
actual_social_spending,
1863+
projected_social_spending_unscaled_by_slider
1864+
);
1865+
if (pension_income > fixed_point_t::_0()) {
1866+
pop.add_pensions(pension_income);
1867+
}
1868+
1869+
const fixed_point_t unemployment_subsidies = fixed_point_t::mul_div(
1870+
pop.get_unemployed() * calculate_unemployment_subsidies_base(pop_type, shared_country_values),
1871+
actual_social_spending,
1872+
projected_social_spending_unscaled_by_slider
1873+
);
1874+
if (unemployment_subsidies > fixed_point_t::_0()) {
1875+
pop.add_unemployment_subsidies(unemployment_subsidies);
1876+
}
1877+
}
1878+
16941879
CountryInstance::good_data_t& CountryInstance::get_good_data(GoodInstance const& good_instance) {
16951880
return goods_data[good_instance];
16961881
}
@@ -1830,9 +2015,22 @@ void CountryInstanceManager::update_rankings(Date today, DefineManager const& de
18302015
}
18312016
}
18322017

1833-
CountryInstanceManager::CountryInstanceManager(CountryDefinitionManager const& new_country_definition_manager)
2018+
CountryInstanceManager::CountryInstanceManager(
2019+
CountryDefinitionManager const& new_country_definition_manager,
2020+
ModifierEffectCache const& new_modifier_effect_cache,
2021+
CountryDefines const& new_country_defines,
2022+
PopsDefines const& new_pop_defines,
2023+
std::vector<PopType> const& pop_type_keys
2024+
)
18342025
: country_definition_manager { new_country_definition_manager },
1835-
country_definition_to_instance_map { &new_country_definition_manager.get_country_definitions() } {
2026+
country_definition_to_instance_map { &new_country_definition_manager.get_country_definitions() },
2027+
shared_country_values {
2028+
new_modifier_effect_cache,
2029+
new_country_defines,
2030+
new_pop_defines,
2031+
pop_type_keys
2032+
}
2033+
{
18362034
great_powers.reserve(16);
18372035
secondary_powers.reserve(16);
18382036
}
@@ -1999,7 +2197,7 @@ void CountryInstanceManager::update_modifier_sums(Date today, StaticModifierCach
19992197

20002198
void CountryInstanceManager::update_gamestate(InstanceManager& instance_manager) {
20012199
for (CountryInstance& country : country_instances.get_items()) {
2002-
country.update_gamestate(instance_manager);
2200+
country.update_gamestate(instance_manager, shared_country_values);
20032201
}
20042202

20052203
// TODO - work out how to have ranking effects applied (e.g. static modifiers) applied at game start
@@ -2009,14 +2207,21 @@ void CountryInstanceManager::update_gamestate(InstanceManager& instance_manager)
20092207
update_rankings(instance_manager.get_today(), instance_manager.get_definition_manager().get_define_manager());
20102208
}
20112209

2012-
void CountryInstanceManager::country_manager_reset_before_tick() {
2210+
void CountryInstanceManager::country_manager_tick_before_map(InstanceManager& instance_manager) {
2211+
//TODO parallellise?
20132212
for (CountryInstance& country : country_instances.get_items()) {
2014-
country.country_reset_before_tick();
2213+
country.country_tick_before_map(instance_manager);
20152214
}
20162215
}
20172216

2018-
void CountryInstanceManager::country_manager_tick(InstanceManager& instance_manager) {
2217+
void CountryInstanceManager::country_manager_tick_after_map(InstanceManager& instance_manager) {
2218+
//TODO parallellise?
2219+
//TODO update and pay government salaries and social spending
20192220
for (CountryInstance& country : country_instances.get_items()) {
2020-
country.country_tick(instance_manager);
2221+
country.country_tick_after_map(instance_manager);
20212222
}
2223+
2224+
shared_country_values.update_costs(instance_manager.get_good_instance_manager());
20222225
}
2226+
2227+
#undef DO_FOR_ALL_NEED_CATEGORIES

0 commit comments

Comments
 (0)