Skip to content

Commit e952763

Browse files
authored
Fix for unlinked family members crashing conversion (#264) #patch
* fix for unlinked family members crashing conversion * Update Family.cpp
1 parent 7be3078 commit e952763

File tree

6 files changed

+17
-1
lines changed

6 files changed

+17
-1
lines changed

ImperatorToCK3/Source/CK3/Dynasties/Dynasty.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ CK3::Dynasty::Dynasty(const Imperator::Family& impFamily, const mappers::Localiz
1212

1313
const auto& impMembers = impFamily.getMembers();
1414
if (!impMembers.empty()) {
15-
culture = impMembers[0].second->getCK3Character()->culture; // make head's culture the dynasty culture
15+
auto firstMember = impMembers[0];
16+
culture = firstMember.second->getCK3Character()->culture; // make head's culture the dynasty culture
1617
}
1718
else {
1819
Log(LogLevel::Warning) << "Couldn't determine culture for dynasty " << ID << ", needs manual setting!";

ImperatorToCK3/Source/Imperator/Families/Families.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ void Imperator::Families::loadFamilies(std::istream& theStream) {
1919
}
2020

2121

22+
void Imperator::Families::removeUnlinkedMembers() {
23+
for (const auto& family : families) {
24+
family.second->removeUnlinkedMembers();
25+
}
26+
}
27+
28+
2229
void Imperator::Families::registerKeys() {
2330
registerRegex(commonItems::integerRegex, [this](const std::string& theFamilyID, std::istream& theStream) {
2431
const auto familyStr = commonItems::stringOfItem(theStream).getString();

ImperatorToCK3/Source/Imperator/Families/Families.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Families : commonItems::parser {
1515
public:
1616
void loadFamilies(const std::string& thePath);
1717
void loadFamilies(std::istream& theStream);
18+
void removeUnlinkedMembers();
1819

1920
auto& operator= (const Families& obj) { this->families = obj.families; return *this; }
2021

ImperatorToCK3/Source/Imperator/Families/Family.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,8 @@ void Imperator::Family::linkMember(const std::shared_ptr<Character>& newMemberPt
2222
// matching ID was not found
2323
Log(LogLevel::Warning) << "Family " << ID << ": cannot link " << newMemberPtr->getID() << ": not found in members!";
2424
}
25+
26+
27+
void Imperator::Family::removeUnlinkedMembers() {
28+
std::erase_if(members, [](auto member) { return member.second == nullptr; });
29+
}

ImperatorToCK3/Source/Imperator/Families/Family.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class Family {
1717
Family() = default;
1818

1919
void linkMember(const std::shared_ptr<Character>& newMemberPtr);
20+
void removeUnlinkedMembers();
2021

2122
[[nodiscard]] auto getID() const { return ID; }
2223
[[nodiscard]] const auto& getKey() const { return key; }

ImperatorToCK3/Source/Imperator/ImperatorWorld.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ Imperator::World::World(const Configuration& theConfiguration, const commonItems
104104
// Link all the intertwining pointers
105105
Log(LogLevel::Info) << "-- Linking Characters with Families";
106106
characters.linkFamilies(families);
107+
families.removeUnlinkedMembers();
107108
Log(LogLevel::Info) << "-- Linking Characters with Spouses";
108109
characters.linkSpouses();
109110
Log(LogLevel::Info) << "-- Linking Characters with Mothers and Fathers";

0 commit comments

Comments
 (0)