Skip to content

Fix revolt localization when I:R base country has no adjective defined #2162

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions ImperatorToCK3.UnitTests/Imperator/Countries/CountryNameTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -21,15 +21,15 @@ 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);
}

[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());
}
Expand All @@ -39,15 +39,15 @@ 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());
}

[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);
}
Expand All @@ -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());
Expand All @@ -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()));
Expand All @@ -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");
Expand All @@ -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: []));
Expand All @@ -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");

Expand All @@ -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");
Expand All @@ -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");
Expand All @@ -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");
Expand Down Expand Up @@ -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"]);
}
}
42 changes: 26 additions & 16 deletions ImperatorToCK3/Imperator/Countries/CountryName.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -32,21 +28,25 @@ 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) => {
string? toReturn = orig?.Replace("$ADJ$", modifying);
if (toReturn is not null) {
toReturn = ReplaceDataTypes(toReturn, language, irLocDB, imperatorCountries);
}

return toReturn;
});
return locBlockToReturn;
Expand All @@ -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();
});
}
Expand All @@ -80,23 +82,26 @@ 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) => {
var toReturn = orig?.Replace("$ADJ$", modifying);
if (toReturn is not null) {
toReturn = ReplaceDataTypes(toReturn, language, irLocDB, imperatorCountries);
}

return toReturn;
});
return locBlockToReturn;
}
} else if (directAdjLocMatch is not null) {
return directAdjLocMatch;
}

foreach (var country in imperatorCountries) {
if (country.Name != Name) {
continue;
Expand All @@ -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";
}

Expand All @@ -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;
Expand All @@ -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;
Expand All @@ -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());
Expand Down
Loading