public void VariablesAreOutputted() { const string outputModName = "outputMod2"; var titles = new Title.LandedTitles(); titles.Variables.Add("default_ai_priority", 20); titles.Variables.Add("default_ai_aggressiveness", 40); var titleHistoryPath = Path.Combine("output", outputModName, "history", "titles"); SystemUtils.TryCreateFolder(titleHistoryPath); var landedTitlesPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt"); SystemUtils.TryCreateFolder(CommonFunctions.GetPath(landedTitlesPath)); TitlesOutputter.OutputTitles(outputModName, titles, IMPERATOR_DE_JURE.NO); Assert.True(File.Exists(landedTitlesPath)); using var landedTitlesFile = File.OpenRead(landedTitlesPath); var reader = new StreamReader(landedTitlesFile); Assert.Equal("@default_ai_priority=20", reader.ReadLine()); Assert.Equal("@default_ai_aggressiveness=40", reader.ReadLine()); Assert.True(reader.EndOfStream); }
public void TitlesCanBeOverriddenByMods() { var reader = new BufferedReader( "e_empire1 = { k_kingdom2 = { d_duchy3 = { b_barony4 = { province = 12 } } } }\n" + "c_county5 = { landless = yes }\n" ); var titles = new Title.LandedTitles(); titles.LoadTitles(reader); var reader2 = new BufferedReader( "b_barony4 = { province = 15 }\n" + "c_county5 = { landless = no }\n" ); titles.LoadTitles(reader2); var barony = titles["b_barony4"]; var county = titles["c_county5"]; Assert.Equal(5, titles.Count); Assert.Equal((ulong)15, barony.Province); Assert.False(county.Landless); }
public void InitializeFromImperator( Imperator.Provinces.Province impProvince, Title.LandedTitles landedTitles, CultureMapper cultureMapper, ReligionMapper religionMapper ) { ImperatorProvince = impProvince; // If we're initializing this from Imperator provinces, then having an owner or being a wasteland/sea is not a given - // there are uncolonized provinces in Imperator, also uninhabitables have culture and religion. var impOwnerCountry = ImperatorProvince.OwnerCountry; if (impOwnerCountry is not null) { ownerTitle = impOwnerCountry.CK3Title; // linking to our holder's title } // Religion first SetReligionFromImperator(religionMapper); // Then culture SetCultureFromImperator(cultureMapper); // Holding type SetHoldingFromImperator(landedTitles); details.Buildings.Clear(); }
public void ImportImperatorProvinces(Imperator.World impWorld, Title.LandedTitles titles, CultureMapper cultureMapper, ReligionMapper religionMapper, ProvinceMapper provinceMapper) { Logger.Info("Importing Imperator Provinces..."); var counter = 0; // Imperator provinces map to a subset of CK3 provinces. We'll only rewrite those we are responsible for. foreach (var province in this) { var impProvinces = provinceMapper.GetImperatorProvinceNumbers(province.Id); // Provinces we're not affecting will not be in this list. if (impProvinces.Count == 0) { continue; } // Next, we find what province to use as its initializing source. var sourceProvince = DetermineProvinceSource(impProvinces, impWorld); if (sourceProvince is null) { Logger.Warn($"Could not determine source province for CK3 province {province.Id}!"); continue; // MISMAP, or simply have mod provinces loaded we're not using. } province.InitializeFromImperator(sourceProvince.Value.Value, titles, cultureMapper, religionMapper); // And finally, initialize it. ++counter; } Logger.Info($"{impWorld.Provinces.Count} Imperator provinces imported into {counter} CK3 provinces."); }
public static void OutputTitles(string outputModName, Title.LandedTitles titles, IMPERATOR_DE_JURE deJure) { var outputPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt"); using var outputStream = File.OpenWrite(outputPath); using var output = new StreamWriter(outputStream, System.Text.Encoding.UTF8); foreach (var(name, value) in titles.Variables) { output.WriteLine($"@{name}={value}"); } // titles with a de jure liege will be outputted under the liege var topDeJureTitles = titles.Where(t => t.DeJureLiege is null); output.Write(PDXSerializer.Serialize(topDeJureTitles, string.Empty, false)); if (deJure == IMPERATOR_DE_JURE.REGIONS) { var srcPath = Path.Combine("blankMod", "optionalFiles", "ImperatorDeJure", "common", "landed_titles"); var dstPath = Path.Combine("output", outputModName, "common", "landed_titles"); if (!SystemUtils.TryCopyFolder(srcPath, dstPath)) { Logger.Error("Could not copy ImperatorDeJure landed titles!"); } } OutputTitlesHistory(outputModName, titles); }
public void TitlesDefaultToEmpty() { var reader = new BufferedReader(string.Empty); var titles = new Title.LandedTitles(); titles.LoadTitles(reader); Assert.Empty(titles); }
public void RemoveEmployerIdFromLandedCharacters(Title.LandedTitles titles, Date conversionDate) { var landedCharacterIds = titles.GetHolderIds(conversionDate); foreach (var character in this.Where(character => landedCharacterIds.Contains(character.Id))) { character.EmployerId = null; } }
public void LocationServicesSucceedsForProvinceField() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesSucceedsForProvinceField.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.True(mapper.ProvinceIsInRegion(69, "test_region")); }
public CK3RegionMapper(string ck3Path, Title.LandedTitles landedTitles) { Logger.Info("Initializing Geography..."); var ck3MapDataPath = Path.Combine(ck3Path, "game", "map_data"); var regionFilePath = Path.Combine(ck3MapDataPath, "geographical_region.txt"); var islandRegionFilePath = Path.Combine(ck3MapDataPath, "island_region.txt"); LoadRegions(landedTitles, regionFilePath, islandRegionFilePath); }
public void SetHoldingLogicWorks() { var reader1 = new BufferedReader(" = { province_rank=city_metropolis }"); var reader2 = new BufferedReader(" = { province_rank=city fort=yes }"); var reader3 = new BufferedReader(" = { province_rank=city }"); var reader4 = new BufferedReader(" = { province_rank=settlement holy_site = 69 fort=yes }"); var reader5 = new BufferedReader(" = { province_rank=settlement fort=yes }"); var reader6 = new BufferedReader(" = { province_rank=settlement }"); var imperatorCountry = new ImperatorToCK3.Imperator.Countries.Country(1); var impProvince = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader1, 42); impProvince.LinkOwnerCountry(imperatorCountry); var impProvince2 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader2, 43); impProvince2.LinkOwnerCountry(imperatorCountry); var impProvince3 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader3, 44); impProvince3.LinkOwnerCountry(imperatorCountry); var impProvince4 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader4, 45); impProvince4.LinkOwnerCountry(imperatorCountry); var impProvince5 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader5, 46); impProvince5.LinkOwnerCountry(imperatorCountry); var impProvince6 = ImperatorToCK3.Imperator.Provinces.Province.Parse(reader6, 47); impProvince6.LinkOwnerCountry(imperatorCountry); var province1 = new Province(); var province2 = new Province(); var province3 = new Province(); var province4 = new Province(); var province5 = new Province(); var province6 = new Province(); var landedTitles = new Title.LandedTitles(); var cultureMapper = new CultureMapper(); var religionMapper = new ReligionMapper(); province1.InitializeFromImperator(impProvince, landedTitles, cultureMapper, religionMapper); province2.InitializeFromImperator(impProvince2, landedTitles, cultureMapper, religionMapper); province3.InitializeFromImperator(impProvince3, landedTitles, cultureMapper, religionMapper); province4.InitializeFromImperator(impProvince4, landedTitles, cultureMapper, religionMapper); province5.InitializeFromImperator(impProvince5, landedTitles, cultureMapper, religionMapper); province6.InitializeFromImperator(impProvince6, landedTitles, cultureMapper, religionMapper); Assert.Equal("city_holding", province1.Holding); Assert.Equal("castle_holding", province2.Holding); Assert.Equal("city_holding", province3.Holding); Assert.Equal("church_holding", province4.Holding); Assert.Equal("castle_holding", province5.Holding); Assert.Equal("none", province6.Holding); }
public void MultipleDuchiesCanBeLoaded() { var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }"); var region = CK3Region.Parse("region1", reader); Assert.Empty(region.Duchies); // not linked yet var titles = new Title.LandedTitles(); region.LinkDuchy(titles.Add("d_ivrea")); region.LinkDuchy(titles.Add("d_athens")); region.LinkDuchy(titles.Add("d_oppo")); Assert.Equal(3, region.Duchies.Count); }
public void PurgeLandlessVanillaCharacters(Title.LandedTitles titles, Date ck3BookmarkDate) { var landedCharacterIds = titles.GetHolderIds(ck3BookmarkDate); var farewellIds = dict.Keys.Where( id => !id.StartsWith("imperator") && !landedCharacterIds.Contains(id) ); foreach (var characterId in farewellIds) { this[characterId].BreakAllLinks(); Remove(characterId); } Logger.Info($"Purged {farewellIds.Count()} landless vanilla characters."); }
public void DuchyCanBeLoaded() { var reader = new BufferedReader("duchies = { d_duchy }"); var region = CK3Region.Parse("region1", reader); Assert.Empty(region.Duchies); // not linked yet var titles = new Title.LandedTitles(); region.LinkDuchy(titles.Add("d_duchy")); Assert.Collection(region.Duchies, item => Assert.Equal("d_duchy", item.Key) ); }
public void RegionMapperCanBeEnabled() { // We start humble, it's a machine. var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/empty.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.False(mapper.ProvinceIsInRegion(1, "test")); Assert.False(mapper.RegionNameIsValid("test")); Assert.Null(mapper.GetParentCountyName(1)); Assert.Null(mapper.GetParentDuchyName(1)); Assert.Null(mapper.GetParentRegionName(1)); }
public void LocationServicesSucceedsForCountyField() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } }" ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesSucceedsForCountyField.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.True(mapper.ProvinceIsInRegion(79, "test_region")); }
public static void OutputCoas(string outputModName, Title.LandedTitles titles) { // dumping all into one file var path = Path.Combine("output", outputModName, "common", "coat_of_arms", "coat_of_arms", "fromImperator.txt"); using var output = new StreamWriter(path); foreach (var title in titles) { var coa = title.CoA; if (coa is not null) { output.WriteLine($"{title.Id}={coa}"); } } }
public void LinkedRegionWillFailForProvinceMismatch() { var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }"); var region = CK3Region.Parse("region1", reader); var titles = new Title.LandedTitles(); var reader2 = new BufferedReader( "{ c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }" ); var duchy2 = titles.Add("d_athens"); duchy2.LoadTitles(reader2); region.LinkDuchy(duchy2); Assert.False(region.ContainsProvince(7)); }
public void LoadingBrokenCountyWillThrowException() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "k_anglia = { d_aquitane = { c_mers_broken = { b_hgy = { province = 69 } } } } \n" ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LoadingBrokenCountyWillThrowException.txt"; void action() => mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); KeyNotFoundException exception = Assert.Throws <KeyNotFoundException>(action); Assert.Equal("Region's test_region county c_mers does not exist!", exception.Message); }
public void RegionCanBeLinkedToDuchy() { var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }"); var region = CK3Region.Parse("region1", reader); var titles = new Title.LandedTitles(); var reader2 = new BufferedReader( "{ c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }" ); var duchy2 = titles.Add("d_athens"); duchy2.LoadTitles(reader2); Assert.False(region.Duchies.ContainsKey("d_athens")); // not linked yet region.LinkDuchy(duchy2); Assert.NotNull(region.Duchies["d_athens"]); }
public void LocationServicesFailForNonsense() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "k_ugada = { d_wakaba = { c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } } } \n" + "k_ghef = { d_hujhu = { c_defff = { b_cringe = { province = 6 } b_newbarony2 = { province = 4 } } } }" ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesFailForNonsense.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.False(mapper.ProvinceIsInRegion(1, "nonsense")); Assert.False(mapper.ProvinceIsInRegion(6, "test_superregion")); }
public static void OutputSuccessionTriggers(string outputModName, Title.LandedTitles landedTitles, Date ck3BookmarkDate) { var outputPath = Path.Combine("output", outputModName, "common", "scripted_triggers", "IRToCK3_succession_triggers.txt"); using var outputStream = File.OpenWrite(outputPath); using var output = new StreamWriter(outputStream, System.Text.Encoding.UTF8); var primogenitureTitles = new List <string>(); var seniorityTitles = new List <string>(); foreach (var landedTitle in landedTitles) { if (landedTitle.GetDeFactoLiege(ck3BookmarkDate) is not null) { continue; } if (landedTitle.SuccessionLaws.Contains("single_heir_succession_law")) { primogenitureTitles.Add(landedTitle.Id); } if (landedTitle.SuccessionLaws.Contains("single_heir_dynasty_house")) { seniorityTitles.Add(landedTitle.Id); } } output.WriteLine("historical_succession_access_single_heir_succession_law_trigger={"); output.WriteLine("\tOR={"); foreach (var primogenitureTitle in primogenitureTitles) { output.WriteLine($"\t\thas_title=title:{primogenitureTitle}"); } output.WriteLine("\t}"); output.WriteLine("}"); output.WriteLine("historical_succession_access_single_heir_dynasty_house_trigger={"); output.WriteLine("\tOR={"); foreach (var seniorityTitle in seniorityTitles) { output.WriteLine($"\t\thas_title=title:{seniorityTitle}"); } output.WriteLine("\t}"); output.WriteLine("}"); }
public void LinkedRegionCanLocateProvince() { var reader = new BufferedReader("duchies = { d_ivrea d_athens d_oppo }"); var region = CK3Region.Parse("region1", reader); var titles = new Title.LandedTitles(); var reader2 = new BufferedReader( "= { c_athens = { b_athens = { province = 79 } b_newbarony = { province = 56 } } }" ); var duchy2 = titles.Add("d_athens"); duchy2.LoadTitles(reader2); region.LinkDuchy(duchy2); Assert.True(region.ContainsProvince(79)); Assert.True(region.ContainsProvince(56)); }
public void WrongParentLocationsReturnNull() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "d_testduchy = { 1 2 3 } \n" + "d_testduchy2 = { 4 5 6 } " ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/WrongParentLocationsReturnNull.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.Null(mapper.GetParentCountyName(7)); Assert.Null(mapper.GetParentDuchyName(7)); Assert.Null(mapper.GetParentRegionName(7)); }
public void LocationServicesCorrectlyFail() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "d_testduchy = { 1 2 3 } \n" + "d_testduchy2 = { 4 5 6 } " ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesCorrectlyFail.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.False(mapper.ProvinceIsInRegion(4, "d_testduchy")); // province in different duchy Assert.False(mapper.ProvinceIsInRegion(9, "d_testduchy")); // province missing completely Assert.False(mapper.ProvinceIsInRegion(5, "test_region")); // province in different region }
public void TitlesCanBeLoadedRecursively() { var reader = new BufferedReader( "e_empire1 = { k_kingdom2 = { d_duchy3 = { b_barony4 = { province = 12 } } } }\n" + "c_county5 = { landless = yes }\n" ); var titles = new Title.LandedTitles(); titles.LoadTitles(reader); var barony = titles["b_barony4"]; var county = titles["c_county5"]; Assert.Equal(5, titles.Count); Assert.Equal((ulong)12, barony.Province); Assert.True(county.Landless); }
public void TitlesCanBeLoaded() { var reader = new BufferedReader( "b_barony = { province = 12 }\n" + "c_county = { landless = yes }\n" ); var titles = new Title.LandedTitles(); titles.LoadTitles(reader); var barony = titles["b_barony"]; var county = titles["c_county"]; Assert.Equal(2, titles.Count); Assert.Equal((ulong)12, barony.Province); Assert.True(county.Landless); }
private static void OutputTitlesHistory(string outputModName, Title.LandedTitles titles) { //output title history var alreadyOutputtedTitles = new HashSet <string>(); foreach (var title in titles) { // first output kingdoms + their de jure vassals to files named after the kingdoms if (title.Rank != TitleRank.kingdom || title.DeJureVassals.Count == 0) { // title is a not de jure kingdom continue; } var historyOutputPath = Path.Combine("output", outputModName, "history", "titles", $"{title.Id}.txt"); using var historyOutput = new StreamWriter(historyOutputPath); // output the kingdom's history title.OutputHistory(historyOutput); alreadyOutputtedTitles.Add(title.Id); // output the kingdom's de jure vassals' history foreach (var(deJureVassalName, deJureVassal) in title.GetDeJureVassalsAndBelow()) { deJureVassal.OutputHistory(historyOutput); alreadyOutputtedTitles.Add(deJureVassalName); } } var otherTitlesPath = Path.Combine("output", outputModName, "history", "titles", "00_other_titles.txt"); using (var historyOutput = new StreamWriter(otherTitlesPath)) { foreach (var title in titles) { // output the remaining titles if (alreadyOutputtedTitles.Contains(title.Id)) { continue; } title.OutputHistory(historyOutput); alreadyOutputtedTitles.Add(title.Id); } } }
public void CapitalsAreLinked() { var reader = new BufferedReader( "e_empire = {" + "\tcapital=c_county " + "\tk_kingdom = { d_duchy = { c_county = { b_barony = { province = 12 } } } } " + "}" ); var titles = new Title.LandedTitles(); titles.LoadTitles(reader); var empire = titles["e_empire"]; var capitalCounty = empire.CapitalCounty; Assert.NotNull(capitalCounty); Assert.Equal("c_county", capitalCounty.Id); Assert.Equal("c_county", empire.CapitalCountyId); }
public void LocationServicesWork() { var mapper = new CK3RegionMapper(); var landedTitles = new Title.LandedTitles(); var landedTitlesReader = new BufferedReader( "d_aquitane = { c_mers = { b_hgy = { province = 69 } } }" ); landedTitles.LoadTitles(landedTitlesReader); const string regionPath = "TestFiles/regions/CK3RegionMapperTests/LocationServicesWork.txt"; mapper.LoadRegions(landedTitles, regionPath, islandRegionPath); Assert.True(mapper.ProvinceIsInRegion(69, "c_mers")); Assert.True(mapper.ProvinceIsInRegion(69, "d_aquitane")); Assert.True(mapper.ProvinceIsInRegion(69, "test_region")); Assert.True(mapper.ProvinceIsInRegion(69, "test_region_bigger")); Assert.True(mapper.ProvinceIsInRegion(69, "test_region_biggest")); }
public void PrimogenitureAndSeniorityTriggersAreOutputted() { const string outputModName = "outputMod"; var outputFilePath = Path.Combine( "output", outputModName, "common", "scripted_triggers", "IRToCK3_succession_triggers.txt" ); var date = new Date(476, 1, 1); var titles = new Title.LandedTitles(); var kingdomPrimogeniture = titles.Add("k_kingdom1"); kingdomPrimogeniture.SuccessionLaws.Add("single_heir_succession_law"); var kingdomSeniority = titles.Add("k_kingdom2"); kingdomSeniority.SuccessionLaws.Add("single_heir_dynasty_house"); var vassal = titles.Add("d_vassal"); vassal.SuccessionLaws.Add("single_heir_succession_law"); vassal.SetDeFactoLiege(kingdomPrimogeniture, date); // has de facto liege, will not be added to the trigger SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputFilePath)); SuccessionTriggersOutputter.OutputSuccessionTriggers(outputModName, titles, date); using var file = File.OpenRead(outputFilePath); var reader = new StreamReader(file); Assert.Equal("historical_succession_access_single_heir_succession_law_trigger={", reader.ReadLine()); Assert.Equal("\tOR={", reader.ReadLine()); Assert.Equal($"\t\thas_title=title:{kingdomPrimogeniture.Id}", reader.ReadLine()); Assert.Equal("\t}", reader.ReadLine()); Assert.Equal("}", reader.ReadLine()); Assert.Equal("historical_succession_access_single_heir_dynasty_house_trigger={", reader.ReadLine()); Assert.Equal("\tOR={", reader.ReadLine()); Assert.Equal($"\t\thas_title=title:{kingdomSeniority.Id}", reader.ReadLine()); Assert.Equal("\t}", reader.ReadLine()); Assert.Equal("}", reader.ReadLine()); Assert.True(reader.EndOfStream); }