From fd30c60f03ef3f921649177547421e758f5d2ae8 Mon Sep 17 00:00:00 2001 From: Seweryn Presnal Date: Mon, 9 Sep 2024 02:56:19 +0200 Subject: [PATCH] Fix revolt localization when I:R base country has no adjective defined --- .../Imperator/Countries/CountryNameTests.cs | 50 ++++++++++++++----- .../Imperator/Countries/CountryName.cs | 42 ++++++++++------ 2 files changed, 63 insertions(+), 29 deletions(-) diff --git a/ImperatorToCK3.UnitTests/Imperator/Countries/CountryNameTests.cs b/ImperatorToCK3.UnitTests/Imperator/Countries/CountryNameTests.cs index 9f69bc8c3..f1cb806c3 100644 --- a/ImperatorToCK3.UnitTests/Imperator/Countries/CountryNameTests.cs +++ b/ImperatorToCK3.UnitTests/Imperator/Countries/CountryNameTests.cs @@ -11,7 +11,7 @@ public class CountryNameTests { [Fact] public void NameDefaultsToEmpty() { var reader = new BufferedReader(string.Empty); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Empty(countryName.Name); } @@ -21,7 +21,7 @@ public void NameCanBeSet() { var reader = new BufferedReader( "name = someName adjective = someAdjective" ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Equal("someName", countryName.Name); } @@ -29,7 +29,7 @@ public void NameCanBeSet() { [Fact] public void AdjectiveLocKeyDefaultsTo_ADJ() { var reader = new BufferedReader(string.Empty); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Equal("_ADJ", countryName.GetAdjectiveLocKey()); } @@ -39,7 +39,7 @@ public void AdjectiveLocKeyCanBeSet() { var reader = new BufferedReader( "name = someName adjective = someAdjective" ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Equal("someAdjective", countryName.GetAdjectiveLocKey()); } @@ -47,7 +47,7 @@ public void AdjectiveLocKeyCanBeSet() { [Fact] public void BaseDefaultsToNullptr() { var reader = new BufferedReader(string.Empty); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Null(countryName.BaseName); } @@ -57,7 +57,7 @@ public void BaseCanBeSet() { var reader = new BufferedReader( "name = revolt\n base = { name = someName adjective = someAdjective }" ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); Assert.Equal("someName", countryName.BaseName!.Name); Assert.Equal("someAdjective", countryName.BaseName.GetAdjectiveLocKey()); @@ -67,7 +67,7 @@ public void BaseCanBeSet() { [Fact] public void AdjLocBlockDefaultsToNull() { var reader = new BufferedReader(string.Empty); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); Assert.Null(countryName.GetAdjectiveLocBlock(locDB, new())); @@ -78,7 +78,7 @@ public void AdjLocBlockReturnsCorrectLocForRevolts() { var reader = new BufferedReader( "adjective = CIVILWAR_FACTION_ADJECTIVE \n base = { name = someName adjective = someAdjective }" ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); var locBlock1 = locDB.AddLocBlock("CIVILWAR_FACTION_ADJECTIVE"); @@ -91,7 +91,7 @@ public void AdjLocBlockReturnsCorrectLocForRevolts() { [Fact] public void GetNameLocBlockDefaultsToNull() { var reader = new BufferedReader(string.Empty); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); Assert.Null(countryName.GetNameLocBlock(locDB, imperatorCountries: [])); @@ -100,7 +100,7 @@ public void GetNameLocBlockDefaultsToNull() { [Fact] public void GetNameLocBlockCorrectlyHandlesCompositeNames() { var reader = new BufferedReader("name=\"egyptian PROV4791_persia\""); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); @@ -123,7 +123,7 @@ public void GetNameLocBlockReturnsCorrectLocForRevolts() { var reader = new BufferedReader( "name = CIVILWAR_FACTION_NAME\n base = { name = someName adjective = someAdjective }" ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); var locBlock1 = locDB.AddLocBlock("CIVILWAR_FACTION_NAME"); @@ -146,7 +146,7 @@ public void DataTypesInCountryNamesAreReplaced() { """ ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); var civilWarLocBlock = locDB.AddLocBlock("CIVILWAR_FACTION_NAME"); @@ -173,7 +173,7 @@ public void DataTypesInCountryAdjectivesAreReplaced() { } """ ); - var countryName = ImperatorToCK3.Imperator.Countries.CountryName.Parse(reader); + var countryName = CountryName.Parse(reader); var locDB = new LocDB("english"); var civilWarAdjLocBlock = locDB.AddLocBlock("CIVILWAR_FACTION_ADJECTIVE"); @@ -202,4 +202,28 @@ public void DataTypesInCountryAdjectivesAreReplaced() { Assert.Equal("Antigonid", countryName.GetAdjectiveLocBlock(locDB, countries)!["english"]); } + + [Fact] + public void ProvinceNameCanBeUsedForRevoltTagNameAndAdjective() { + var reader = new BufferedReader( + """ + name="CIVILWAR_FACTION_NAME" + adjective="CIVILWAR_FACTION_ADJECTIVE" + base={ + name="PROV4526_hellenic" + } + """); + var countryName = CountryName.Parse(reader); + + var locDB = new LocDB("english"); + var civilWarLocBlock = locDB.AddLocBlock("CIVILWAR_FACTION_NAME"); + civilWarLocBlock["english"] = "$ADJ$ Revolt"; + var civilWarAdjLocBlock = locDB.AddLocBlock("CIVILWAR_FACTION_ADJECTIVE"); + civilWarAdjLocBlock["english"] = "$ADJ$"; + var provinceLocBlock = locDB.AddLocBlock("PROV4526_hellenic"); + provinceLocBlock["english"] = "Nikonia"; + + Assert.Equal("Nikonia Revolt", countryName.GetNameLocBlock(locDB, [])!["english"]); + Assert.Equal("Nikonia", countryName.GetAdjectiveLocBlock(locDB, [])!["english"]); + } } \ No newline at end of file diff --git a/ImperatorToCK3/Imperator/Countries/CountryName.cs b/ImperatorToCK3/Imperator/Countries/CountryName.cs index 872ee67f0..b8d43efb5 100644 --- a/ImperatorToCK3/Imperator/Countries/CountryName.cs +++ b/ImperatorToCK3/Imperator/Countries/CountryName.cs @@ -11,11 +11,7 @@ public sealed class CountryName : ICloneable { public CountryName? BaseName { get; private set; } public object Clone() { - return new CountryName { - Name = Name, - adjective = adjective, - BaseName = BaseName - }; + return new CountryName {Name = Name, adjective = adjective, BaseName = BaseName}; } public LocBlock? GetNameLocBlock(LocDB irLocDB, CountryCollection imperatorCountries) { @@ -32,14 +28,17 @@ public object Clone() { return directNameLocMatch; } - // special case for revolts + // Special case for revolts. if (BaseName is null) { return directNameLocMatch; } - var baseAdjLoc = BaseName.GetAdjectiveLocBlock(irLocDB, imperatorCountries); + + var baseAdjLoc = BaseName.GetAdjectiveLocBlock(irLocDB, imperatorCountries) ?? + BaseName.GetNameLocBlock(irLocDB, imperatorCountries); if (baseAdjLoc is null) { return directNameLocMatch; } + var locBlockToReturn = new LocBlock(Name, directNameLocMatch); locBlockToReturn.ModifyForEveryLanguage(baseAdjLoc, (orig, modifying, language) => { @@ -47,6 +46,7 @@ public object Clone() { if (toReturn is not null) { toReturn = ReplaceDataTypes(toReturn, language, irLocDB, imperatorCountries); } + return toReturn; }); return locBlockToReturn; @@ -59,16 +59,18 @@ private LocBlock GetCompositeNameLocBlock(string[] nameParts, LocDB irLocDB) { foreach (var language in secondaryLanguages) { compositeLocBlock[language] = string.Empty; } + foreach (var namePart in nameParts) { var namePartLoc = irLocDB.GetLocBlockForKey(namePart); if (namePartLoc is null) { continue; } - + compositeLocBlock.ModifyForEveryLanguage(namePartLoc, (orig, modifying, language) => { if (orig is null) { return modifying; } + return $"{orig} {modifying}".Trim(); }); } @@ -80,8 +82,10 @@ private LocBlock GetCompositeNameLocBlock(string[] nameParts, LocDB irLocDB) { var adjKey = GetAdjectiveLocKey(); var directAdjLocMatch = irLocDB.GetLocBlockForKey(adjKey); if (directAdjLocMatch is not null && adjKey == "CIVILWAR_FACTION_ADJECTIVE") { - // special case for revolts - var baseAdjLoc = BaseName?.GetAdjectiveLocBlock(irLocDB, imperatorCountries); + // Special case for revolts. + // If the BaseName only has a name and no adjective, use the name. + var baseAdjLoc = BaseName?.GetAdjectiveLocBlock(irLocDB, imperatorCountries) ?? + BaseName?.GetNameLocBlock(irLocDB, imperatorCountries); if (baseAdjLoc is not null) { var locBlockToReturn = new LocBlock(adjKey, directAdjLocMatch); locBlockToReturn.ModifyForEveryLanguage(baseAdjLoc, (orig, modifying, language) => { @@ -89,6 +93,7 @@ private LocBlock GetCompositeNameLocBlock(string[] nameParts, LocDB irLocDB) { if (toReturn is not null) { toReturn = ReplaceDataTypes(toReturn, language, irLocDB, imperatorCountries); } + return toReturn; }); return locBlockToReturn; @@ -96,7 +101,7 @@ private LocBlock GetCompositeNameLocBlock(string[] nameParts, LocDB irLocDB) { } else if (directAdjLocMatch is not null) { return directAdjLocMatch; } - + foreach (var country in imperatorCountries) { if (country.Name != Name) { continue; @@ -108,14 +113,16 @@ private LocBlock GetCompositeNameLocBlock(string[] nameParts, LocDB irLocDB) { return adjLoc; } } - + // Give up. return null; } + public string GetAdjectiveLocKey() { if (adjective is not null) { return adjective; } + return Name + "_ADJ"; } @@ -132,10 +139,11 @@ private string ReplaceDataTypes(string loc, string language, LocDB irLocDB, Coun } else { pryAdjLocBlock = irLocDB.GetLocBlockForKey("get_pry_adj_fallback"); } + if (pryAdjLocBlock is not null && pryAdjLocBlock.HasLocForLanguage(language)) { loc = loc.Replace(phrygianAdj, pryAdjLocBlock[language]); } - + const string mauryanAdj = "[GetCountry('MRY').Custom('get_mry_adj')]"; Country? mry = irCountries.FirstOrDefault(country => country.Tag == "MRY"); LocBlock? mryAdjLocBlock; @@ -144,10 +152,11 @@ private string ReplaceDataTypes(string loc, string language, LocDB irLocDB, Coun } else { mryAdjLocBlock = irLocDB.GetLocBlockForKey("get_mry_adj_fallback"); } + if (mryAdjLocBlock is not null && mryAdjLocBlock.HasLocForLanguage(language)) { loc = loc.Replace(mauryanAdj, mryAdjLocBlock[language]); } - + const string seleucidAdj = "[GetCountry('SEL').Custom('get_sel_adj')]"; Country? sel = irCountries.FirstOrDefault(country => country.Tag == "SEL"); LocBlock? selAdjLocBlock; @@ -156,16 +165,17 @@ private string ReplaceDataTypes(string loc, string language, LocDB irLocDB, Coun } else { selAdjLocBlock = irLocDB.GetLocBlockForKey("get_sel_adj_fallback"); } + if (selAdjLocBlock is not null && selAdjLocBlock.HasLocForLanguage(language)) { loc = loc.Replace(seleucidAdj, selAdjLocBlock[language]); } return loc; } - + public static CountryName Parse(BufferedReader reader) { var countryName = new CountryName(); - + var parser = new Parser(); parser.RegisterKeyword("name", r => countryName.Name = r.GetString()); parser.RegisterKeyword("adjective", r => countryName.adjective = r.GetString());