From 567ccbd005942c8958c1ab3b2d1d0030e1faa96b Mon Sep 17 00:00:00 2001 From: kingofmen Date: Tue, 10 Oct 2023 22:43:23 -0700 Subject: [PATCH 1/3] Prefer significant provinces as naval base locations. --- .../states/hoi4_states_converter.cpp | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/hoi4_world/states/hoi4_states_converter.cpp b/src/hoi4_world/states/hoi4_states_converter.cpp index 3c3c3c7a..c85a92ac 100644 --- a/src/hoi4_world/states/hoi4_states_converter.cpp +++ b/src/hoi4_world/states/hoi4_states_converter.cpp @@ -24,7 +24,7 @@ namespace constexpr int MAX_FACTORY_SLOTS = 12; const std::vector kResourceNames = {"steel", "oil", "tungsten", "aluminium", "chromium", "rubber"}; - +const std::map kNavalBasePoints = {{"port", 5}, {"city", 4}, {"mine", 3}, {"farm", 2}, {"wood", 1}}; bool AllVic3ProvincesAreInSameState(const std::vector& vic3_provinces, int state_to_match, @@ -498,7 +498,9 @@ std::tuple, std::optional> DetermineNavalBase(const vic3 int source_state_id, const hoi4::WorldFramework& world_framework, int total_coastal_provinces, - const std::set& hoi4_provinces) + const std::set& hoi4_provinces, + const mappers::Hoi4ToVic3ProvinceMapping& hoi4_to_vic3_province_mappings, + const std::map& significant_provinces) { const int coastal_province_count = std::ranges::count_if(hoi4_provinces, [&world_framework](int province_id) { return world_framework.coastal_provinces.contains(province_id); @@ -523,16 +525,32 @@ std::tuple, std::optional> DetermineNavalBase(const vic3 return {std::nullopt, std::nullopt}; } - // find a coastal province to make naval base. + auto level = static_cast(total_naval_bases * naval_base_ratio / 5.0F); + + // Find a coastal province to make naval base. + std::optional target; + int best = -1; for (const auto& hoi4_province: hoi4_provinces) { - if (world_framework.coastal_provinces.IsProvinceCoastal(hoi4_province)) + if (!world_framework.coastal_provinces.IsProvinceCoastal(hoi4_province)) { - return {hoi4_province, static_cast(total_naval_bases * naval_base_ratio / 5.0F)}; + continue; + } + int points = 0; + for (const auto& vic3_prov: hoi4_to_vic3_province_mappings.at(hoi4_province)) + { + if (significant_provinces.contains(vic3_prov)) + { + points = kNavalBasePoints.at(significant_provinces.at(vic3_prov)); + } + if (points > best) + { + best = points; + target = hoi4_province; + } } } - - return {std::nullopt, std::nullopt}; + return {target, level}; } @@ -999,7 +1017,7 @@ hoi4::States CreateStates(const vic3::World& source_world, } const auto [naval_base_location, naval_base_level] = - DetermineNavalBase(source_world, vic3_state_id, world_framework, total_coastal_provinces, province_set); + DetermineNavalBase(source_world, vic3_state_id, world_framework, total_coastal_provinces, province_set, hoi4_to_vic3_province_mappings, significant_provinces); int infrastructure = infrastructure_mapper.Map(vic3_state_itr->second.GetInfrastructure()); From 5a615bfa53d5c06e963bb7767eca339be6ad25de Mon Sep 17 00:00:00 2001 From: kingofmen Date: Tue, 10 Oct 2023 23:23:55 -0700 Subject: [PATCH 2/3] Add test for naval base prioritisation. --- ..._states_converter_tests_state_contents.cpp | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/src/hoi4_world/states/hoi4_states_converter_tests_state_contents.cpp b/src/hoi4_world/states/hoi4_states_converter_tests_state_contents.cpp index 4238a75a..d9355b66 100644 --- a/src/hoi4_world/states/hoi4_states_converter_tests_state_contents.cpp +++ b/src/hoi4_world/states/hoi4_states_converter_tests_state_contents.cpp @@ -669,6 +669,49 @@ TEST(Hoi4worldStatesHoi4statesconverter, NavalBasesAreConvertedInCoastalStates) .naval_base_level = 2}))); } +TEST(Hoi4worldStatesHoi4statesconverter, NavalBasesPrioritisePorts) +{ + vic3::WorldBuilder world = vic3::WorldBuilder::CreateNullWorld() + .AddTestStates({{1, 2, 3}, {4, 5, 6}}) + .AddTestStateRegions({{1, 2, 3}, {4, 5, 6}}) + .AddStateRegions({ + {"REGION_ONE", vic3::StateRegion({{"x000002", "farm"}, {"x000001", "port"}}, {})}, + {"REGION_TWO", vic3::StateRegion({{"x000005", "mine"}, {"x000004", "city"}}, {})}, + }) + .AddBuildings({vic3::Building(vic3::BuildingType::NavalBase, 1, 0.0F, 9.0F, {}), + vic3::Building(vic3::BuildingType::NavalBase, 2, 0.0F, 10.0F, {})}); + mappers::WorldMapperBuilder world_mapper = std::move( + mappers::WorldMapperBuilder::CreateNullMapper().AddTestProvinces(6).AddCountries({{1, "ONE"}, {2, "TWO"}})); + world_mapper.CopyToVicWorld(world); + // Make all HoI provinces coastal. + hoi4::WorldFrameworkBuilder world_framework = + WorldFrameworkBuilder::CreateNullWorldFramework().AddTestLandProvinces(6).AddCoastalProvinces( + {{10, {11}}, {20, {21}}, {30, {31}}, {40, {41}}, {50, {51}}}); + const maps::MapData map_data({ + .province_neighbors = + { + {"10", {"20", "30"}}, + {"40", {"50", "60"}}, + }, + .province_definitions = world_framework.CopyProvinceDefinitions(), + }); + const auto hoi4_states = ConvertStates(world.Build(), world_mapper.Build(), world_framework.Build(), {}, map_data); + + // Naval base locations are the 'port' and 'city' provinces. + EXPECT_THAT(hoi4_states.states, + testing::ElementsAre(State(1, + {.owner = "ONE", + .provinces = {10, 20, 30}, + .victory_points = {{10, 1}}, + .naval_base_location = 10, + .naval_base_level = 1}), + State(2, + {.owner = "TWO", + .provinces = {40, 50, 60}, + .victory_points = {{40, 1}}, + .naval_base_location = 40, + .naval_base_level = 2}))); +} TEST(Hoi4worldStatesHoi4statesconverter, AirBaseLevelDefaultsToZero) { From 8bc66b6accdb17b23d7e3f373ff0c10c2b7f1a16 Mon Sep 17 00:00:00 2001 From: kingofmen Date: Tue, 10 Oct 2023 23:32:18 -0700 Subject: [PATCH 3/3] Formatting again. --- src/hoi4_world/states/hoi4_states_converter.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/hoi4_world/states/hoi4_states_converter.cpp b/src/hoi4_world/states/hoi4_states_converter.cpp index c85a92ac..bc42d86a 100644 --- a/src/hoi4_world/states/hoi4_states_converter.cpp +++ b/src/hoi4_world/states/hoi4_states_converter.cpp @@ -1016,8 +1016,13 @@ hoi4::States CreateStates(const vic3::World& source_world, dockyards = std::get<2>(all_factories); } - const auto [naval_base_location, naval_base_level] = - DetermineNavalBase(source_world, vic3_state_id, world_framework, total_coastal_provinces, province_set, hoi4_to_vic3_province_mappings, significant_provinces); + const auto [naval_base_location, naval_base_level] = DetermineNavalBase(source_world, + vic3_state_id, + world_framework, + total_coastal_provinces, + province_set, + hoi4_to_vic3_province_mappings, + significant_provinces); int infrastructure = infrastructure_mapper.Map(vic3_state_itr->second.GetInfrastructure());