diff --git a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs index faf817e47..358d4b7fb 100644 --- a/ImperatorToCK3/CK3/Characters/CharacterCollection.cs +++ b/ImperatorToCK3/CK3/Characters/CharacterCollection.cs @@ -535,7 +535,7 @@ public void PurgeUnneededCharacters(Title.LandedTitles titles, DynastyCollection dynasties.FlattenDynastiesWithNoFounders(this, houses, ck3BookmarkDate); // Clean up title history. - titles.RemoveInvalidHoldersFromHistory(this); + titles.CleanUpHistory(this, ck3BookmarkDate); } public void RemoveEmployerIdFromLandedCharacters(Title.LandedTitles titles, Date conversionDate) { diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index d94ea93e2..415e59144 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -257,7 +257,7 @@ public ImmutableHashSet GetAllHolderIds() { return this.SelectMany(t => t.GetAllHolderIds()).ToImmutableHashSet(); } - public void RemoveInvalidHoldersFromHistory(CharacterCollection characters) { + public void CleanUpHistory(CharacterCollection characters, Date ck3BookmarkDate) { Logger.Debug("Removing invalid holders from history..."); var validIds = characters.Select(c => c.Id).ToImmutableHashSet(); @@ -270,6 +270,31 @@ public void RemoveInvalidHoldersFromHistory(CharacterCollection characters) { value => value.ToString() is string valStr && valStr != "0" && !validIds.Contains(valStr) ); } + + // Remove liege entries that are not valid (liege title is not held at the entry date). + foreach (var title in this) { + if (!title.History.Fields.TryGetValue("liege", out var liegeField)) { + continue; + } + + foreach (var (date, entriesList) in liegeField.DateToEntriesDict.ToArray()) { + if (entriesList.Count == 0) { + continue; + } + + var lastEntry = entriesList.Last(); + var liegeTitleId = lastEntry.Value.ToString(); + if (liegeTitleId is null || liegeTitleId == "0") { + continue; + } + + if (!TryGetValue(liegeTitleId, out var liegeTitle)) { + liegeField.DateToEntriesDict.Remove(date); + } else if (liegeTitle.GetHolderId(date) == "0") { + liegeField.DateToEntriesDict.Remove(date); + } + } + } } public void ImportImperatorCountries(