Skip to content

Condition scripts #247

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 70 additions & 37 deletions src/headless/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,43 +144,56 @@ static bool run_headless(Dataloader::path_vector_t const& roots, bool run_tests)
ret &= game_manager.update_clock();

// TODO - REMOVE TEST CODE
Logger::info("===== Ranking system test... =====");
if (game_manager.get_instance_manager()) {
const auto print_ranking_list = [](std::string_view title, std::vector<CountryInstance*> const& countries) -> void {
std::string text;
for (CountryInstance const* country : countries) {
text += StringUtils::append_string_views(
"\n ", country->get_identifier(),
" - Total #", std::to_string(country->get_total_rank()), " (", country->get_total_score().to_string(1),
"), Prestige #", std::to_string(country->get_prestige_rank()), " (", country->get_prestige().to_string(1),
"), Industry #", std::to_string(country->get_industrial_rank()), " (", country->get_industrial_power().to_string(1),
"), Military #", std::to_string(country->get_military_rank()), " (", country->get_military_power().to_string(1), ")"
);
}
Logger::info(title, ":", text);
};

CountryInstanceManager const& country_instance_manager =
game_manager.get_instance_manager()->get_country_instance_manager();

std::vector<CountryInstance*> const& great_powers = country_instance_manager.get_great_powers();
print_ranking_list("Great Powers", great_powers);
print_ranking_list("Secondary Powers", country_instance_manager.get_secondary_powers());
print_ranking_list("All countries", country_instance_manager.get_total_ranking());

Logger::info("===== RGO test... =====");
for (size_t i = 0; i < std::min<size_t>(3, great_powers.size()); ++i) {
CountryInstance const& great_power = *great_powers[i];
ProvinceInstance const* const capital_province = great_power.get_capital();
if (capital_province == nullptr) {
Logger::warning(great_power.get_identifier(), " has no capital ProvinceInstance set.");
} else {
print_rgo(*capital_province);
}
}
} else {
Logger::error("Instance manager not available!");
ret = false;
// Logger::info("===== Ranking system test... =====");
// if (game_manager.get_instance_manager()) {
// const auto print_ranking_list = [](std::string_view title, std::vector<CountryInstance*> const& countries) -> void {
// std::string text;
// for (CountryInstance const* country : countries) {
// text += StringUtils::append_string_views(
// "\n ", country->get_identifier(),
// " - Total #", std::to_string(country->get_total_rank()), " (", country->get_total_score().to_string(1),
// "), Prestige #", std::to_string(country->get_prestige_rank()), " (", country->get_prestige().to_string(1),
// "), Industry #", std::to_string(country->get_industrial_rank()), " (", country->get_industrial_power().to_string(1),
// "), Military #", std::to_string(country->get_military_rank()), " (", country->get_military_power().to_string(1), ")"
// );
// }
// Logger::info(title, ":", text);
// };

// CountryInstanceManager const& country_instance_manager =
// game_manager.get_instance_manager()->get_country_instance_manager();

// std::vector<CountryInstance*> const& great_powers = country_instance_manager.get_great_powers();
// print_ranking_list("Great Powers", great_powers);
// print_ranking_list("Secondary Powers", country_instance_manager.get_secondary_powers());
// print_ranking_list("All countries", country_instance_manager.get_total_ranking());

// Logger::info("===== RGO test... =====");
// for (size_t i = 0; i < std::min<size_t>(3, great_powers.size()); ++i) {
// CountryInstance const& great_power = *great_powers[i];
// ProvinceInstance const* const capital_province = great_power.get_capital();
// if (capital_province == nullptr) {
// Logger::warning(great_power.get_identifier(), " has no capital ProvinceInstance set.");
// } else {
// print_rgo(*capital_province);
// }
// }
// } else {
// Logger::error("Instance manager not available!");
// ret = false;
// }

Pop const& pop = *game_manager.get_instance_manager()->get_map_instance().get_province_instance_by_index(300)->get_pops().begin();

Logger::info(
"Pop has type ", pop.get_type()->get_identifier(),
", size ", pop.get_size(),
", culture ", pop.get_culture().get_identifier(),
", religion ", pop.get_religion().get_identifier(),
", ideology:"
);
for (auto [ideology, support] : pop.get_ideology_distribution()) {
Logger::info(" ", ideology.get_identifier(), " - ", support);
}

if (ret) {
Expand All @@ -206,6 +219,26 @@ static bool run_headless(Dataloader::path_vector_t const& roots, bool run_tests)
Logger::info("Ran ", --ticks_passed, " ticks in ", end_time - start_time);
}

ProvinceInstance const& province = *pop.get_location();
Logger::info("Province ", province.get_identifier(), " has ", province.get_total_population(), " pops with ideology:");
for (auto [ideology, support] : province.get_ideology_distribution()) {
Logger::info(" ", ideology.get_identifier(), " - ", support);
}

State const& state = *province.get_state();
Logger::info("State ", state.get_identifier(), " has ", state.get_total_population(), " pops with ideology:");
for (auto [ideology, support] : state.get_ideology_distribution()) {
Logger::info(" ", ideology.get_identifier(), " - ", support);
}

CountryInstance const& country = *state.get_owner();
Logger::info("Country ", country.get_identifier(), " has ", country.get_total_population(), " pops with ideology:");
for (auto [ideology, support] : country.get_ideology_distribution()) {
Logger::info(" ", ideology.get_identifier(), " - ", support);
}

Logger::info("National value of ", country.get_identifier(), " is ", country.get_national_value());

return ret;
}

Expand Down
7 changes: 0 additions & 7 deletions src/openvic-simulation/DefinitionManager.cpp

This file was deleted.

2 changes: 1 addition & 1 deletion src/openvic-simulation/DefinitionManager.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ namespace OpenVic {
SoundEffectManager PROPERTY_REF(sound_effect_manager);

public:
DefinitionManager();
DefinitionManager() : ui_manager { *this }, script_manager { *this } {}
};
}
35 changes: 34 additions & 1 deletion src/openvic-simulation/country/CountryInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,19 @@ bool CountryInstance::apply_history_to_country(CountryHistoryEntry const& entry,
for (auto const& [technology, level] : entry.get_technologies()) {
ret &= set_technology_unlock_level(*technology, level, good_instance_manager);
}

for (
Invention const& invention :
instance_manager.get_definition_manager().get_research_manager().get_invention_manager().get_inventions()
) {
if (
invention.get_limit().execute(instance_manager, this, this) &&
invention.get_chance().execute(instance_manager, this, this) > 0
) {
ret &= unlock_invention(invention, good_instance_manager);
}
}

for (auto const& [invention, activated] : entry.get_inventions()) {
ret &= set_invention_unlock_level(*invention, activated ? 1 : 0, good_instance_manager);
}
Expand Down Expand Up @@ -1210,6 +1223,19 @@ void CountryInstance::_update_population() {
life_needs_fulfilled_by_strata /= population_by_strata;
everyday_needs_fulfilled_by_strata /= population_by_strata;
luxury_needs_fulfilled_by_strata /= population_by_strata;

unemployment_fraction = pop_type_unemployed_count.get_total() / total_population;

const fixed_point_map_const_iterator_t<Culture const*> largest_culture_it = get_largest_item(culture_distribution);
largest_culture = largest_culture_it != culture_distribution.end() ? largest_culture_it->first : nullptr;

const fixed_point_map_const_iterator_t<Religion const*> largest_religion_it = get_largest_item(religion_distribution);
largest_religion = largest_religion_it != religion_distribution.end() ? largest_religion_it->first : nullptr;
} else {
unemployment_fraction = fixed_point_t::_0();

largest_culture = nullptr;
largest_religion = nullptr;
}

daily_research_points = fixed_point_t::_0();
Expand Down Expand Up @@ -1256,9 +1282,16 @@ void CountryInstance::_update_military(
MilitaryDefines const& military_defines = define_manager.get_military_defines();

regiment_count = 0;
multi_unit_army_count = 0;

for (ArmyInstance const* army : armies) {
regiment_count += army->get_unit_count();
const size_t unit_count = army->get_unit_count();

regiment_count += unit_count;

if (unit_count > 1) {
multi_unit_army_count++;
}
}

ship_count = 0;
Expand Down
5 changes: 5 additions & 0 deletions src/openvic-simulation/country/CountryInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,11 +228,15 @@ namespace OpenVic {

IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_distribution);
IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_unemployed_count);
fixed_point_t PROPERTY(unemployment_fraction);
IndexedMap<Ideology, fixed_point_t> PROPERTY(ideology_distribution);
fixed_point_map_t<Issue const*> PROPERTY(issue_distribution);
IndexedMap<CountryParty, fixed_point_t> PROPERTY(vote_distribution);
fixed_point_map_t<Culture const*> PROPERTY(culture_distribution);
fixed_point_map_t<Religion const*> PROPERTY(religion_distribution);
Culture const* PROPERTY(largest_culture, nullptr);
Religion const* PROPERTY(largest_religion, nullptr);

size_t PROPERTY(national_focus_capacity, 0);
// TODO - national foci

Expand Down Expand Up @@ -295,6 +299,7 @@ namespace OpenVic {
size_t PROPERTY(max_supported_regiment_count, 0);
size_t PROPERTY(mobilisation_potential_regiment_count, 0);
size_t PROPERTY(mobilisation_max_regiment_count, 0);
size_t PROPERTY(multi_unit_army_count, 0);
fixed_point_t PROPERTY(mobilisation_impact);
fixed_point_t PROPERTY(mobilisation_economy_impact);
fixed_point_t PROPERTY(supply_consumption);
Expand Down
2 changes: 1 addition & 1 deletion src/openvic-simulation/dataloader/Dataloader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1113,7 +1113,7 @@ bool Dataloader::load_defines(
Logger::error("Failed to load diplomatic actions!");
ret = false;
}
if (!definition_manager.get_script_manager().get_condition_manager().setup_conditions(definition_manager)) {
if (!definition_manager.get_script_manager().get_condition_manager().setup_conditions()) {
Logger::error("Failed to set up conditions!");
ret = false;
}
Expand Down
22 changes: 18 additions & 4 deletions src/openvic-simulation/map/ProvinceInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ size_t ProvinceInstance::get_pop_count() const {
/* REQUIREMENTS:
* MAP-65, MAP-68, MAP-70, MAP-234
*/
void ProvinceInstance::_update_pops(DefineManager const& define_manager) {
void ProvinceInstance::_update_pops(InstanceManager const& instance_manager) {
total_population = 0;
average_literacy = 0;
average_consciousness = 0;
Expand Down Expand Up @@ -275,7 +275,8 @@ void ProvinceInstance::_update_pops(DefineManager const& define_manager) {

max_supported_regiments = 0;

MilitaryDefines const& military_defines = define_manager.get_military_defines();
MilitaryDefines const& military_defines =
instance_manager.get_definition_manager().get_define_manager().get_military_defines();

using enum colony_status_t;

Expand All @@ -285,7 +286,7 @@ void ProvinceInstance::_update_pops(DefineManager const& define_manager) {
: is_owner_core() ? fixed_point_t::_1() : military_defines.get_pop_size_per_regiment_non_core_multiplier();

for (Pop& pop : pops) {
pop.update_gamestate(define_manager, owner, pop_size_per_regiment_multiplier);
pop.update_gamestate(instance_manager, owner, pop_size_per_regiment_multiplier);

const pop_size_t pop_size_s = pop.get_size();
// TODO - change casting if pop_size_t changes type
Expand Down Expand Up @@ -331,6 +332,19 @@ void ProvinceInstance::_update_pops(DefineManager const& define_manager) {
life_needs_fulfilled_by_strata /= population_by_strata;
everyday_needs_fulfilled_by_strata /= population_by_strata;
luxury_needs_fulfilled_by_strata /= population_by_strata;

unemployment_fraction = pop_type_unemployed_count.get_total() / total_population;

const fixed_point_map_const_iterator_t<Culture const*> largest_culture_it = get_largest_item(culture_distribution);
largest_culture = largest_culture_it != culture_distribution.end() ? largest_culture_it->first : nullptr;

const fixed_point_map_const_iterator_t<Religion const*> largest_religion_it = get_largest_item(religion_distribution);
largest_religion = largest_religion_it != religion_distribution.end() ? largest_religion_it->first : nullptr;
} else {
unemployment_fraction = fixed_point_t::_0();

largest_culture = nullptr;
largest_religion = nullptr;
}
}

Expand Down Expand Up @@ -460,7 +474,7 @@ void ProvinceInstance::update_gamestate(InstanceManager const& instance_manager)
for (BuildingInstance& building : buildings.get_items()) {
building.update_gamestate(today);
}
_update_pops(instance_manager.get_definition_manager().get_define_manager());
_update_pops(instance_manager);
}

void ProvinceInstance::province_tick(const Date today, PopValuesFromProvince& reusable_pop_values) {
Expand Down
6 changes: 5 additions & 1 deletion src/openvic-simulation/map/ProvinceInstance.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,12 +123,16 @@ namespace OpenVic {

IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_distribution);
IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_unemployed_count);
fixed_point_t PROPERTY(unemployment_fraction);
IndexedMap<PopType, std::vector<Pop*>> PROPERTY(pops_cache_by_type);
IndexedMap<Ideology, fixed_point_t> PROPERTY(ideology_distribution);
fixed_point_map_t<Issue const*> PROPERTY(issue_distribution);
IndexedMap<CountryParty, fixed_point_t> PROPERTY(vote_distribution);
fixed_point_map_t<Culture const*> PROPERTY(culture_distribution);
fixed_point_map_t<Religion const*> PROPERTY(religion_distribution);
Culture const* PROPERTY(largest_culture, nullptr);
Religion const* PROPERTY(largest_religion, nullptr);

size_t PROPERTY(max_supported_regiments, 0);

ProvinceInstance(
Expand All @@ -142,7 +146,7 @@ namespace OpenVic {
);

void _add_pop(Pop&& pop);
void _update_pops(DefineManager const& define_manager);
void _update_pops(InstanceManager const& instance_manager);
bool convert_rgo_worker_pops_to_equivalent(ProductionType const& production_type);
void initialise_rgo();

Expand Down
13 changes: 13 additions & 0 deletions src/openvic-simulation/map/State.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,19 @@ void State::update_gamestate() {
life_needs_fulfilled_by_strata /= population_by_strata;
everyday_needs_fulfilled_by_strata /= population_by_strata;
luxury_needs_fulfilled_by_strata /= population_by_strata;

unemployment_fraction = pop_type_unemployed_count.get_total() / total_population;

const fixed_point_map_const_iterator_t<Culture const*> largest_culture_it = get_largest_item(culture_distribution);
largest_culture = largest_culture_it != culture_distribution.end() ? largest_culture_it->first : nullptr;

const fixed_point_map_const_iterator_t<Religion const*> largest_religion_it = get_largest_item(religion_distribution);
largest_religion = largest_religion_it != religion_distribution.end() ? largest_religion_it->first : nullptr;
} else {
unemployment_fraction = fixed_point_t::_0();

largest_culture = nullptr;
largest_religion = nullptr;
}

// TODO - use actual values when State has factory data
Expand Down
3 changes: 3 additions & 0 deletions src/openvic-simulation/map/State.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,12 +38,15 @@ namespace OpenVic {

IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_distribution);
IndexedMap<PopType, pop_size_t> PROPERTY(pop_type_unemployed_count);
fixed_point_t PROPERTY(unemployment_fraction);
IndexedMap<PopType, std::vector<Pop*>> PROPERTY(pops_cache_by_type);
IndexedMap<Ideology, fixed_point_t> PROPERTY(ideology_distribution);
fixed_point_map_t<Issue const*> PROPERTY(issue_distribution);
IndexedMap<CountryParty, fixed_point_t> PROPERTY(vote_distribution);
fixed_point_map_t<Culture const*> PROPERTY(culture_distribution);
fixed_point_map_t<Religion const*> PROPERTY(religion_distribution);
Culture const* PROPERTY(largest_culture, nullptr);
Religion const* PROPERTY(largest_religion, nullptr);

fixed_point_t PROPERTY(industrial_power);

Expand Down
1 change: 1 addition & 0 deletions src/openvic-simulation/military/UnitInstanceGroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ size_t UnitInstanceGroup::get_unit_category_count(UnitType::unit_category_t unit

UnitType const* UnitInstanceGroup::get_display_unit_type() const {
if (units.empty()) {
Logger::error("Unit group ", name, " has no units!");
return nullptr;
}

Expand Down
Loading