Skip to content

Commit

Permalink
Convert Backup Capitals (#312)
Browse files Browse the repository at this point in the history
* Get backup capital from owned states.

* Extract functions.

* Tests

* Increase code coverage.
  • Loading branch information
Idhrendur committed Apr 2, 2023
1 parent ec7e192 commit 6653e43
Show file tree
Hide file tree
Showing 7 changed files with 239 additions and 21 deletions.
2 changes: 2 additions & 0 deletions src/hoi4_world/countries/hoi4_countries_converter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ std::map<std::string, hoi4::Country> hoi4::ConvertCountries(const std::map<int,
const std::map<int, std::set<std::string>>& source_technologies,
const mappers::CountryMapper& country_mapper,
const std::map<int, int>& vic3_state_ids_to_hoi4_state_ids,
const std::vector<State>& states,
const std::vector<mappers::TechMapping>& tech_mappings)
{
std::map<std::string, Country> countries;
Expand All @@ -34,6 +35,7 @@ std::map<std::string, hoi4::Country> hoi4::ConvertCountries(const std::map<int,
source_country_technologies,
country_mapper,
vic3_state_ids_to_hoi4_state_ids,
states,
tech_mappings,
all_legacy_ship_variants,
all_ship_variants,
Expand Down
3 changes: 3 additions & 0 deletions src/hoi4_world/countries/hoi4_countries_converter.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@


#include <map>
#include <vector>

#include "src/hoi4_world/countries/hoi4_country.h"
#include "src/hoi4_world/countries/hoi4_country_converter.h"
#include "src/hoi4_world/states/hoi4_state.h"
#include "src/vic3_world/countries/vic3_country.h"


Expand All @@ -18,6 +20,7 @@ std::map<std::string, Country> ConvertCountries(const std::map<int, vic3::Countr
const std::map<int, std::set<std::string>>& source_technologies,
const mappers::CountryMapper& country_mapper,
const std::map<int, int>& vic3_state_ids_to_hoi4_state_ids,
const std::vector<State>& states,
const std::vector<mappers::TechMapping>& tech_mappings);

} // namespace hoi4
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ TEST(Hoi4worldCountriesCountriesConverter, CountriesAreConverted)
},
country_mapper,
{{1, 10}, {2, 20}},
{},
{
{{"source_technology_one"}, std::nullopt, {"dest_technology_one", "dest_technology_two"}},
{{"source_technology_two"}, std::nullopt, {"dest_technology_three", "dest_technology_four"}},
Expand Down
113 changes: 101 additions & 12 deletions src/hoi4_world/countries/hoi4_country_converter.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,109 @@
#include "src/hoi4_world/countries/hoi4_country_converter.h"

#include <numeric>

#include "src/hoi4_world/technology/technologies_converter.h"



namespace
{


bool StateAsCapitalCompareFunction(const hoi4::State& a, const hoi4::State& b)
{
// More victory points has priority.
const auto& a_victory_points = a.GetVictoryPoints();
const auto& b_victory_points = b.GetVictoryPoints();
const int a_victory_points_total = std::accumulate(a_victory_points.begin(),
a_victory_points.end(),
0,
[](int total, const std::pair<int, int>& victory_point) {
return victory_point.second + total;
});
const int b_victory_points_total = std::accumulate(b_victory_points.begin(),
b_victory_points.end(),
0,
[](int total, const std::pair<int, int>& victory_point) {
return victory_point.second + total;
});
if (a_victory_points_total > b_victory_points_total)
{
return true;
}
if (a_victory_points_total < b_victory_points_total)
{
return false;
}

// Next, higher industry matters.
const int a_factories = a.GetCivilianFactories() + a.GetMilitaryFactories() + a.GetDockyards();
const int b_factories = b.GetCivilianFactories() + b.GetMilitaryFactories() + b.GetDockyards();
if (a_factories > b_factories)
{
return true;
}
if (a_factories < b_factories)
{
return false;
}

// Still here? Try population.
if (a.GetManpower() > b.GetManpower())
{
return true;
}
if (a.GetManpower() < b.GetManpower())
{
return false;
}

// There's nothing else left. Lowest id wins.
return a.GetId() < b.GetId();
}


std::optional<int> DetermineBackupCapital(const std::string_view& tag, const std::vector<hoi4::State>& states)
{
std::vector<std::reference_wrapper<const hoi4::State>> owned_states;
for (const hoi4::State& state: states)
{
if (state.GetOwner() != tag)
{
continue;
}

owned_states.emplace_back(state);
}

if (owned_states.empty())
{
return std::nullopt;
}
std::ranges::sort(owned_states, StateAsCapitalCompareFunction);

return owned_states.begin()->get().GetId();
}


std::optional<int> ConvertCapital(const vic3::Country& source_country,
std::string_view tag,
const std::map<int, int>& vic3_state_ids_to_hoi4_state_ids,
const std::vector<hoi4::State>& states)
{
if (const std::optional<int> vic3_capital_state = source_country.GetCapitalState(); vic3_capital_state)
{
if (const auto state_id_mapping = vic3_state_ids_to_hoi4_state_ids.find(*vic3_capital_state);
state_id_mapping != vic3_state_ids_to_hoi4_state_ids.end())
{
return state_id_mapping->second;
}
}

return DetermineBackupCapital(tag, states);
}


std::vector<hoi4::EquipmentVariant> DetermineActiveVariants(const std::vector<hoi4::EquipmentVariant>& all_variants,
const hoi4::Technologies& technologies)
{
Expand Down Expand Up @@ -41,30 +138,22 @@ std::optional<hoi4::Country> hoi4::ConvertCountry(const vic3::Country& source_co
const std::set<std::string>& source_technologies,
const mappers::CountryMapper& country_mapper,
const std::map<int, int>& vic3_state_ids_to_hoi4_state_ids,
const std::vector<State>& states,
const std::vector<mappers::TechMapping>& tech_mappings,
const std::vector<EquipmentVariant>& all_legacy_ship_variants,
const std::vector<EquipmentVariant>& all_ship_variants,
const std::vector<EquipmentVariant>& all_plane_variants,
const std::vector<EquipmentVariant>& all_tank_variants)
{
const auto tag = country_mapper.GetHoiTag(source_country.GetTag());
const std::optional<std::string> tag = country_mapper.GetHoiTag(source_country.GetTag());
if (!tag.has_value())
{
return std::nullopt;
}

std::optional<int> capital_state;
if (const std::optional<int> vic3_capital_state = source_country.GetCapitalState(); vic3_capital_state)
{
if (const auto state_id_mapping = vic3_state_ids_to_hoi4_state_ids.find(*vic3_capital_state);
state_id_mapping != vic3_state_ids_to_hoi4_state_ids.end())
{
capital_state = state_id_mapping->second;
}
}

const std::optional<int> capital_state =
ConvertCapital(source_country, *tag, vic3_state_ids_to_hoi4_state_ids, states);
const Technologies technologies = ConvertTechnologies(source_technologies, tech_mappings);

const std::vector<EquipmentVariant>& active_legacy_ship_variants =
DetermineActiveVariants(all_legacy_ship_variants, technologies);
const std::vector<EquipmentVariant>& active_ship_variants = DetermineActiveVariants(all_ship_variants, technologies);
Expand Down
2 changes: 2 additions & 0 deletions src/hoi4_world/countries/hoi4_country_converter.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

#include "src/hoi4_world/countries/hoi4_country.h"
#include "src/hoi4_world/military/equipment_variant.h"
#include "src/hoi4_world/states/hoi4_state.h"
#include "src/mappers/country/country_mapper.h"
#include "src/mappers/technology/tech_mapping.h"
#include "src/vic3_world/countries/vic3_country.h"
Expand All @@ -20,6 +21,7 @@ std::optional<Country> ConvertCountry(const vic3::Country& source_country,
const std::set<std::string>& source_technologies,
const mappers::CountryMapper& country_mapper,
const std::map<int, int>& vic3_state_ids_to_hoi4_state_ids,
const std::vector<State>& states,
const std::vector<mappers::TechMapping>& tech_mappings,
const std::vector<EquipmentVariant>& all_legacy_ship_variants,
const std::vector<EquipmentVariant>& all_ship_variants,
Expand Down
Loading

0 comments on commit 6653e43

Please sign in to comment.