diff --git a/ImperatorToCK3.UnitTests/CK3/Characters/CharacterCollectionTests.cs b/ImperatorToCK3.UnitTests/CK3/Characters/CharacterCollectionTests.cs index c93f4ee81..f61d60068 100644 --- a/ImperatorToCK3.UnitTests/CK3/Characters/CharacterCollectionTests.cs +++ b/ImperatorToCK3.UnitTests/CK3/Characters/CharacterCollectionTests.cs @@ -25,7 +25,6 @@ using ImperatorToCK3.Mappers.TagTitle; using ImperatorToCK3.Mappers.Trait; using ImperatorToCK3.UnitTests.TestHelpers; -using Open.Collections; using System.Collections.Generic; using System.Linq; using Xunit; @@ -320,6 +319,8 @@ public void ImperatorCountriesGoldCanBeDistributedAmongRulerAndVassals() { config); // Import country 589. + var governmentMapper = new GovernmentMapper(ck3GovernmentIds: Array.Empty()); + var enabledCK3Dlcs = Array.Empty(); titles.ImportImperatorCountries( imperatorWorld.Countries, Array.Empty(), @@ -328,7 +329,7 @@ public void ImperatorCountriesGoldCanBeDistributedAmongRulerAndVassals() { ck3LocDB, provinceMapper, coaMapper, - new GovernmentMapper(ck3GovernmentIds: Array.Empty()), + governmentMapper, new SuccessionLawMapper(), definiteFormMapper, religionMapper, @@ -338,7 +339,7 @@ public void ImperatorCountriesGoldCanBeDistributedAmongRulerAndVassals() { conversionDate, config, new List>(), - enabledCK3Dlcs: []); + enabledCK3Dlcs: enabledCK3Dlcs); var provinces = new ProvinceCollection(ck3ModFS); var ck3MapData = new MapData(ck3ModFS); @@ -355,7 +356,7 @@ public void ImperatorCountriesGoldCanBeDistributedAmongRulerAndVassals() { definiteFormMapper, imperatorWorld.ImperatorRegionMapper, coaMapper, - countyLevelGovernorships: new List()); + countyLevelGovernorships: []); var ck3Country = titles["e_IRTOCK3_PRY"]; Assert.Equal("imperator1000", ck3Country.GetHolderId(conversionDate)); diff --git a/ImperatorToCK3.UnitTests/CK3/Titles/LandedTitlesTests.cs b/ImperatorToCK3.UnitTests/CK3/Titles/LandedTitlesTests.cs index f406933b1..3ae486bd1 100644 --- a/ImperatorToCK3.UnitTests/CK3/Titles/LandedTitlesTests.cs +++ b/ImperatorToCK3.UnitTests/CK3/Titles/LandedTitlesTests.cs @@ -301,6 +301,8 @@ public void GovernorshipsCanBeRecognizedAsCountyLevel() { var ck3LocDB = new TestCK3LocDB(); // Import country 589. + var governmentMapper = new GovernmentMapper(ck3GovernmentIds: Array.Empty()); + var enabledCK3Dlcs = Array.Empty(); titles.ImportImperatorCountries( imperatorWorld.Countries, imperatorWorld.Dependencies, @@ -309,7 +311,7 @@ public void GovernorshipsCanBeRecognizedAsCountyLevel() { ck3LocDB, provinceMapper, coaMapper, - new GovernmentMapper(ck3GovernmentIds: Array.Empty()), + governmentMapper, new SuccessionLawMapper(), definiteFormMapper, religionMapper, @@ -319,7 +321,7 @@ public void GovernorshipsCanBeRecognizedAsCountyLevel() { conversionDate, config, new List>(), - enabledCK3Dlcs: []); + enabledCK3Dlcs); Assert.Collection(titles, title => Assert.Equal("c_county1", title.Id), title => Assert.Equal("b_barony1", title.Id), diff --git a/ImperatorToCK3.UnitTests/CK3/Titles/RulerTermTests.cs b/ImperatorToCK3.UnitTests/CK3/Titles/RulerTermTests.cs index a8b19c2f0..9ce568395 100644 --- a/ImperatorToCK3.UnitTests/CK3/Titles/RulerTermTests.cs +++ b/ImperatorToCK3.UnitTests/CK3/Titles/RulerTermTests.cs @@ -51,19 +51,26 @@ public void ImperatorRulerTermIsCorrectlyConverted() { var impRulerTerm = ImperatorToCK3.Imperator.Countries.RulerTerm.Parse(reader); var govReader = new BufferedReader("link = {ir=dictatorship ck3=feudal_government }"); var govMapper = new GovernmentMapper(govReader, ck3GovernmentIds: new List {"feudal_government"}); - var ck3Religions = new ReligionCollection(new Title.LandedTitles()); + var landedTitles = new Title.LandedTitles(); + var ck3Religions = new ReligionCollection(landedTitles); var ck3RegionMapper = new CK3RegionMapper(); - var ck3RulerTerm = new RulerTerm(impRulerTerm, + var colorFactory = new ColorFactory(); + var ck3ModFlags = new OrderedDictionary(); + + var testTitle = landedTitles.Add("k_test_title"); + var ck3RulerTerm = new RulerTerm( + testTitle, + impRulerTerm, new ImperatorToCK3.CK3.Characters.CharacterCollection(), govMapper, new LocDB("english"), new TestCK3LocDB(), new ReligionMapper(ck3Religions, irRegionMapper, ck3RegionMapper), - new CultureMapper(irRegionMapper, ck3RegionMapper, new CultureCollection(new ColorFactory(), new PillarCollection(new ColorFactory(), []), [])), + new CultureMapper(irRegionMapper, ck3RegionMapper, new CultureCollection(colorFactory, new PillarCollection(colorFactory, ck3ModFlags), ck3ModFlags)), new NicknameMapper("TestFiles/configurables/nickname_map.txt"), new ProvinceMapper(), new Configuration(), - enabledCK3Dlcs: [] + enabledCK3Dlcs: Array.Empty() ); Assert.Equal("imperator69", ck3RulerTerm.CharacterId); Assert.Equal(new Date(500, 2, 3, AUC: true), ck3RulerTerm.StartDate); @@ -84,7 +91,8 @@ public void PreImperatorTermIsCorrectlyConverted() { ); var impRulerTerm = new ImperatorToCK3.Imperator.Countries.RulerTerm(preImpTermReader, countries); - var ck3Religions = new ReligionCollection(new Title.LandedTitles()); + var landedTitles = new Title.LandedTitles(); + var ck3Religions = new ReligionCollection(landedTitles); ck3Religions.LoadReligions(ck3ModFs, new ColorFactory()); var govReader = new BufferedReader("link = {ir=dictatorship ck3=feudal_government }"); var govMapper = new GovernmentMapper(govReader, ck3GovernmentIds: new List {"feudal_government"}); @@ -96,7 +104,11 @@ public void PreImperatorTermIsCorrectlyConverted() { ck3RegionMapper ); var ck3Characters = new ImperatorToCK3.CK3.Characters.CharacterCollection(); - var ck3RulerTerm = new RulerTerm(impRulerTerm, + + var testTitle = landedTitles.Add("k_test_title"); + var ck3RulerTerm = new RulerTerm( + testTitle, + impRulerTerm, ck3Characters, govMapper, new LocDB("english"), @@ -106,13 +118,11 @@ public void PreImperatorTermIsCorrectlyConverted() { new NicknameMapper("TestFiles/configurables/nickname_map.txt"), new ProvinceMapper(), new Configuration(), - enabledCK3Dlcs: [] + enabledCK3Dlcs: Array.Empty() ); + Assert.NotNull(ck3RulerTerm.CharacterId); Assert.Equal("imperatorRegnalSPAAlexander504_1_1BC", ck3RulerTerm.CharacterId); Assert.Equal(new Date(250, 1, 1, AUC: true), ck3RulerTerm.StartDate); - var ruler = ck3RulerTerm.PreImperatorRuler; - Assert.NotNull(ruler); - Assert.Equal("Alexander", ruler.Name); var conversionDate = new Date(1000, 1, 1); var ck3Character = ck3Characters["imperatorRegnalSPAAlexander504_1_1BC"]; diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index ddb21775b..7846d0f7f 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -245,13 +245,13 @@ internal Title Add( Imperator.Provinces.ProvinceCollection irProvinces, Imperator.Characters.CharacterCollection imperatorCharacters, bool regionHasMultipleGovernorships, - bool staticDeJure, LocDB irLocDB, CK3LocDB ck3LocDB, ProvinceMapper provinceMapper, CoaMapper coaMapper, DefiniteFormMapper definiteFormMapper, - ImperatorRegionMapper imperatorRegionMapper + ImperatorRegionMapper imperatorRegionMapper, + Configuration config ) { var newTitle = new Title(this, id, @@ -260,13 +260,13 @@ ImperatorRegionMapper imperatorRegionMapper irProvinces, imperatorCharacters, regionHasMultipleGovernorships, - staticDeJure, irLocDB, ck3LocDB, provinceMapper, coaMapper, definiteFormMapper, - imperatorRegionMapper + imperatorRegionMapper, + config ); dict[newTitle.Id] = newTitle; return newTitle; @@ -650,7 +650,6 @@ List countyLevelGovernorships irWorld.Provinces, irWorld.Characters, governorshipsPerRegion[governorship.Region.Id] > 1, - config.StaticDeJure, tagTitleMapper, irLocDB, ck3LocDB, @@ -658,7 +657,8 @@ List countyLevelGovernorships definiteFormMapper, imperatorRegionMapper, coaMapper, - countyLevelGovernorships + countyLevelGovernorships, + config ); ++counter; } @@ -672,7 +672,6 @@ private void ImportImperatorGovernorship( Imperator.Provinces.ProvinceCollection irProvinces, Imperator.Characters.CharacterCollection imperatorCharacters, bool regionHasMultipleGovernorships, - bool staticDeJure, TagTitleMapper tagTitleMapper, LocDB irLocDB, CK3LocDB ck3LocDB, @@ -680,7 +679,8 @@ private void ImportImperatorGovernorship( DefiniteFormMapper definiteFormMapper, ImperatorRegionMapper imperatorRegionMapper, CoaMapper coaMapper, - List countyLevelGovernorships + List countyLevelGovernorships, + Configuration config ) { var country = governorship.Country; @@ -703,12 +703,12 @@ List countyLevelGovernorships irProvinces, imperatorCharacters, regionHasMultipleGovernorships, - staticDeJure, irLocDB, ck3LocDB, provinceMapper, definiteFormMapper, - imperatorRegionMapper + imperatorRegionMapper, + config ); } else { Add( @@ -718,13 +718,13 @@ List countyLevelGovernorships irProvinces, imperatorCharacters, regionHasMultipleGovernorships, - staticDeJure, irLocDB, ck3LocDB, provinceMapper, coaMapper, definiteFormMapper, - imperatorRegionMapper + imperatorRegionMapper, + config ); } } diff --git a/ImperatorToCK3/CK3/Titles/RulerTerm.cs b/ImperatorToCK3/CK3/Titles/RulerTerm.cs index 410a38f13..aaca3a2b7 100644 --- a/ImperatorToCK3/CK3/Titles/RulerTerm.cs +++ b/ImperatorToCK3/CK3/Titles/RulerTerm.cs @@ -14,9 +14,9 @@ internal sealed class RulerTerm { public string? CharacterId { get; } public Date StartDate { get; } public string? Government { get; } - public Imperator.Countries.RulerTerm.PreImperatorRulerInfo? PreImperatorRuler { get; } public RulerTerm( + Title ck3Title, Imperator.Countries.RulerTerm imperatorRulerTerm, Characters.CharacterCollection characters, GovernmentMapper governmentMapper, @@ -33,22 +33,26 @@ public RulerTerm( } StartDate = imperatorRulerTerm.StartDate; if (imperatorRulerTerm.Government is not null) { - Government = governmentMapper.GetCK3GovernmentForImperatorGovernment(imperatorRulerTerm.Government, rank: null, null, enabledCK3Dlcs); + Government = governmentMapper.GetCK3GovernmentForImperatorGovernment( + irGovernmentId: imperatorRulerTerm.Government, + rank: ck3Title.Rank, + irCultureId: ck3Title.ImperatorCountry?.PrimaryCulture, + enabledCK3Dlcs); } - PreImperatorRuler = imperatorRulerTerm.PreImperatorRuler; - if (PreImperatorRuler?.BirthDate is null) { + var preImperatorRuler = imperatorRulerTerm.PreImperatorRuler; + if (preImperatorRuler?.BirthDate is null) { return; } - if (PreImperatorRuler.DeathDate is null) { + if (preImperatorRuler.DeathDate is null) { return; } - if (PreImperatorRuler.Country is not null) { + if (preImperatorRuler.Country is not null) { // create a new ruler character var character = new Character( - PreImperatorRuler, + preImperatorRuler, StartDate, - PreImperatorRuler.Country, + preImperatorRuler.Country, characters, irLocDB, ck3LocDB, diff --git a/ImperatorToCK3/CK3/Titles/Title.cs b/ImperatorToCK3/CK3/Titles/Title.cs index 7919923f1..93c3634e3 100644 --- a/ImperatorToCK3/CK3/Titles/Title.cs +++ b/ImperatorToCK3/CK3/Titles/Title.cs @@ -89,6 +89,23 @@ IReadOnlyCollection enabledCK3Dlcs enabledCK3Dlcs ); } + /// + /// Constructs a Title from an Imperator governorship. + /// + /// The collection that will contain this title. + /// ID that will be assigned to this title. + /// Source Imperator governorship. + /// Imperator country that owns the governorship. + /// Collection of all I:R provinces (not just the ones in the governorship). + /// Collection of all I:R characters. + /// Whether the governorship is in a region with multiple governorships. + /// I:R localization database. + /// CK3 localization database. + /// Province mapper to be used. + /// CoA mapper to be used. + /// Definite form mapper to be used. + /// I:R region mapper to be used. + /// Configuration object. private Title(LandedTitles parentCollection, string id, Governorship governorship, @@ -96,13 +113,13 @@ private Title(LandedTitles parentCollection, Imperator.Provinces.ProvinceCollection irProvinces, Imperator.Characters.CharacterCollection imperatorCharacters, bool regionHasMultipleGovernorships, - bool staticDeJure, LocDB irLocDB, CK3LocDB ck3LocDB, ProvinceMapper provinceMapper, CoaMapper coaMapper, DefiniteFormMapper definiteFormMapper, - ImperatorRegionMapper imperatorRegionMapper + ImperatorRegionMapper imperatorRegionMapper, + Configuration config ) { IsCreatedFromImperator = true; this.parentCollection = parentCollection; @@ -114,12 +131,12 @@ ImperatorRegionMapper imperatorRegionMapper irProvinces, imperatorCharacters, regionHasMultipleGovernorships, - staticDeJure, irLocDB, ck3LocDB, provinceMapper, definiteFormMapper, - imperatorRegionMapper + imperatorRegionMapper, + config ); } @@ -310,6 +327,7 @@ private void FillHolderAndGovernmentHistory(Country imperatorCountry, foreach (var impRulerTerm in imperatorCountry.RulerTerms) { var rulerTerm = new RulerTerm( + this, impRulerTerm, characters, governmentMapper, @@ -500,12 +518,12 @@ public void InitializeFromGovernorship( Imperator.Provinces.ProvinceCollection irProvinces, Imperator.Characters.CharacterCollection imperatorCharacters, bool regionHasMultipleGovernorships, - bool staticDeJure, LocDB irLocDB, CK3LocDB ck3LocDB, ProvinceMapper provinceMapper, DefiniteFormMapper definiteFormMapper, - ImperatorRegionMapper imperatorRegionMapper + ImperatorRegionMapper imperatorRegionMapper, + Configuration config ) { var governorshipStartDate = governorship.StartDate; @@ -515,7 +533,7 @@ ImperatorRegionMapper imperatorRegionMapper ClearHolderSpecificHistory(); - if (!staticDeJure) { + if (!config.StaticDeJure) { DeJureLiege = country.CK3Title; } SetDeFactoLiege(country.CK3Title, governorshipStartDate); @@ -530,12 +548,17 @@ ImperatorRegionMapper imperatorRegionMapper // ------------------ determine holder History.AddFieldValue(governorshipStartDate, "holder", "holder", $"imperator{impGovernor.Id}"); - // ------------------ determine government + // Determine government. Date normalizedGovernorshipStartDate = governorshipStartDate.Year >= 2 ? governorshipStartDate : new(2, 1, 1); - var ck3LiegeGov = country.CK3Title.GetGovernment(normalizedGovernorshipStartDate); - if (ck3LiegeGov is not null) { - History.AddFieldValue(normalizedGovernorshipStartDate, "government", "government", ck3LiegeGov); - } + string? currentCK3LiegeGov = country.CK3Title.GetGovernment(config.CK3BookmarkDate); + TrySetGovernmentForTitleFromGovernorship( + governorship, + country, + country.CK3Title.GetGovernment(normalizedGovernorshipStartDate), + normalizedGovernorshipStartDate, + currentCK3LiegeGov, + config.CK3BookmarkDate + ); // Determine color. var countryColor = country.Color1; @@ -548,10 +571,10 @@ ImperatorRegionMapper imperatorRegionMapper } } - // determine successions laws + // Determine successions laws. // https://github.com/ParadoxGameConverters/ImperatorToCK3/issues/90#issuecomment-817178552 OrderedSet successionLaws = []; - if (ck3LiegeGov is not null && ck3LiegeGov == "administrative_government") { + if (currentCK3LiegeGov is not null && currentCK3LiegeGov == "administrative_government") { successionLaws.Add("appointment_succession_law"); } else { successionLaws.Add("high_partition_succession_law"); @@ -625,6 +648,26 @@ private void TrySetAdjectiveFromGovernorship(Governorship governorship, Country } } + private void TrySetGovernmentForTitleFromGovernorship(Governorship governorship, Country country, string? ck3LiegeGovAtGovernorshipStartDate, Date normalizedGovernorshipStartDate, string? currentCK3LiegeGov, Date ck3BookmarkDate) { + bool govSet = false; + + // Set government at the start of the governorship. + if (ck3LiegeGovAtGovernorshipStartDate is not null) { + History.AddFieldValue(normalizedGovernorshipStartDate, "government", "government", ck3LiegeGovAtGovernorshipStartDate); + govSet = true; + } + + // Set the government at the bookmark date. + if (currentCK3LiegeGov is not null && currentCK3LiegeGov != ck3LiegeGovAtGovernorshipStartDate) { + History.AddFieldValue(ck3BookmarkDate, "government", "government", currentCK3LiegeGov); + govSet = true; + } + + if (!govSet) { + Logger.Warn($"Could not find CK3 government for {country.Tag} governorship of {governorship.Region.Id}!"); + } + } + private void TrySetNameFromGovernorship( Governorship governorship, ImperatorRegionMapper irRegionMapper, diff --git a/ImperatorToCK3/Data_Files/configurables/government_map.txt b/ImperatorToCK3/Data_Files/configurables/government_map.txt index 9fcd1bf35..af56a0af1 100644 --- a/ImperatorToCK3/Data_Files/configurables/government_map.txt +++ b/ImperatorToCK3/Data_Files/configurables/government_map.txt @@ -13,6 +13,7 @@ # multiple entries allowed for: ir, irCulture, has_ck3_dlc # multiple entries not allowed for: ck3 +# NOTE: Titles created from Imperator governorships do NOT use these mappings! They use the same government as their imported country. # NOTE: ck3_title_rank allows all possible rankings in one entry. So for example, ck3_title_rank = ke will work for kingdoms and empires ## Cultural Mappings @@ -32,16 +33,26 @@ link = { ir = oligarchic_republic ir = democratic_republic ck3 = republic_govern link = { ir = theocratic_republic ck3 = theocracy_government } # TFE link = { ir = dictatorship ck3 = feudal_government ir = despotic_monarchy ir = aristocratic_monarchy ir = plutocratic_monarchy } # TFE link = { ck3 = tribal_government ir = tribal_kingdom ir = tribal_federation } # TFE +#link = { # TFE, TODO: see what needs to be done in order to make the ruler with this government a head of faith, for example in Hellenic paganism +# ck3 = imperial_cult_government +# ir = imperial_cult +# ir = imperium +#} link = { ck3 = administrative_government # Should take precedence over TFE's imperial_government. has_ck3_dlc = roads_to_power - ck3_title_rank = e # limiting rank to empires for now since kingdom-level admin realms have a few issues at the moment that need to be looked at + ck3_title_rank = ke # limiting rank to empires and kingdoms + ir = imperium + ir = imperial_cult +} +link = { # TFE + ck3 = imperial_government + # Having the same title rank requirement as above prevents administrative_government realms from having imperial_government vassals. + ck3_title_rank = ke # duchies, kingdoms, and empires ir = imperium ir = imperial_cult } -link = { ir = imperium ir = imperial_cult ck3 = imperial_government } # TFE link = { ir = athenian_republic ir = aristocratic_republic ck3 = city_state_government ir = plutocratic_republic } # TFE -link = { ir = theocratic_monarchy ck3 = autocratic_government } # TFE link = { ir = stratocratic_monarchy ck3 = legion_government } # TFE link = { ir = tribal_chiefdom ck3 = nomadic_government } # TFE