Skip to content
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

Naval base priorities #512

Merged
merged 3 commits into from
Oct 12, 2023
Merged
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
41 changes: 32 additions & 9 deletions src/hoi4_world/states/hoi4_states_converter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ namespace

constexpr int MAX_FACTORY_SLOTS = 12;
const std::vector<std::string> kResourceNames = {"steel", "oil", "tungsten", "aluminium", "chromium", "rubber"};

const std::map<std::string, int> kNavalBasePoints = {{"port", 5}, {"city", 4}, {"mine", 3}, {"farm", 2}, {"wood", 1}};

bool AllVic3ProvincesAreInSameState(const std::vector<std::string>& vic3_provinces,
int state_to_match,
Expand Down Expand Up @@ -498,7 +498,9 @@ std::tuple<std::optional<int>, std::optional<int>> DetermineNavalBase(const vic3
int source_state_id,
const hoi4::WorldFramework& world_framework,
int total_coastal_provinces,
const std::set<int>& hoi4_provinces)
const std::set<int>& hoi4_provinces,
const mappers::Hoi4ToVic3ProvinceMapping& hoi4_to_vic3_province_mappings,
const std::map<std::string, std::string>& 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);
Expand All @@ -523,16 +525,32 @@ std::tuple<std::optional<int>, std::optional<int>> DetermineNavalBase(const vic3
return {std::nullopt, std::nullopt};
}

// find a coastal province to make naval base.
auto level = static_cast<int>(total_naval_bases * naval_base_ratio / 5.0F);

// Find a coastal province to make naval base.
std::optional<int> 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))
{
continue;
}
int points = 0;
for (const auto& vic3_prov: hoi4_to_vic3_province_mappings.at(hoi4_province))
{
return {hoi4_province, static_cast<int>(total_naval_bases * naval_base_ratio / 5.0F)};
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};
}


Expand Down Expand Up @@ -998,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);
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());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down