From 9bcae7f663b8037175087a4655cadd6429bc7986 Mon Sep 17 00:00:00 2001 From: Seweryn Presnal Date: Thu, 5 Sep 2024 02:34:50 +0200 Subject: [PATCH 1/4] Fix blank ruling dynasty CoA when held title comes from vanilla CK3 --- ImperatorToCK3/CK3/Titles/LandedTitles.cs | 17 +++++++++++++++++ ImperatorToCK3/CK3/World.cs | 3 +++ ImperatorToCK3/Mappers/CoA/CoaMapper.cs | 12 +++++++----- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index 4ad6a731d..bee89a92b 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -1520,5 +1520,22 @@ public void LoadCulturalNamesFromConfigurables() { parser.IgnoreAndLogUnregisteredItems(); parser.ParseFile(filePath); } + + public void SetCoatsOfArms(CoaMapper coaMapper) { + Logger.Info("Setting coats of arms for CK3 titles..."); + + int counter = 0; + foreach (var title in this) { + var coa = coaMapper.GetCoaForFlagName(title.Id, warnIfMissing: title.Rank > TitleRank.duchy); + if (coa is null) { + continue; + } + + title.CoA = coa; + ++counter; + } + + Logger.Notice($"Set coats of arms for {counter} CK3 titles."); // TODO: CHANGE TO DEBUG + } } } \ No newline at end of file diff --git a/ImperatorToCK3/CK3/World.cs b/ImperatorToCK3/CK3/World.cs index e0ce1796c..c77ebf9b3 100644 --- a/ImperatorToCK3/CK3/World.cs +++ b/ImperatorToCK3/CK3/World.cs @@ -142,6 +142,9 @@ public World(Imperator.World impWorld, Configuration config) { Logger.IncrementProgress(); } + + LandedTitles.SetCoatsOfArms(new CoaMapper(ModFS)); + LandedTitles.LoadHistory(config, ModFS); LandedTitles.LoadCulturalNamesFromConfigurables(); diff --git a/ImperatorToCK3/Mappers/CoA/CoaMapper.cs b/ImperatorToCK3/Mappers/CoA/CoaMapper.cs index 41ba69799..2b12674b7 100644 --- a/ImperatorToCK3/Mappers/CoA/CoaMapper.cs +++ b/ImperatorToCK3/Mappers/CoA/CoaMapper.cs @@ -7,12 +7,12 @@ namespace ImperatorToCK3.Mappers.CoA; public sealed class CoaMapper { public CoaMapper() { } - public CoaMapper(ModFilesystem imperatorModFS) { + public CoaMapper(ModFilesystem modFS) { Logger.Info("Parsing CoAs..."); var parser = new Parser(); RegisterKeys(parser); const string coasPath = "common/coat_of_arms/coat_of_arms"; - parser.ParseGameFolder(coasPath, imperatorModFS, "txt", recursive: true); + parser.ParseGameFolder(coasPath, modFS, "txt", recursive: true); Logger.Info($"Loaded {coasMap.Count} coats of arms."); @@ -31,9 +31,11 @@ public void ParseCoAs(IEnumerable coaDefinitionStrings) { } } - public string? GetCoaForFlagName(string irFlagName) { - if (!coasMap.TryGetValue(irFlagName, out string? value)) { - Logger.Warn($"No CoA defined for flag name {irFlagName}."); + public string? GetCoaForFlagName(string flagName, bool warnIfMissing = true) { + if (!coasMap.TryGetValue(flagName, out string? value)) { + if (warnIfMissing) { + Logger.Warn($"No CoA defined for flag name {flagName}."); + } return null; } From 73b6813b30f9ff812a8b9ff84967901857371c90 Mon Sep 17 00:00:00 2001 From: Seweryn Presnal Date: Thu, 5 Sep 2024 02:35:48 +0200 Subject: [PATCH 2/4] Cleanup --- ImperatorToCK3/CK3/Titles/LandedTitles.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index bee89a92b..4ce642a25 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -1535,7 +1535,7 @@ public void SetCoatsOfArms(CoaMapper coaMapper) { ++counter; } - Logger.Notice($"Set coats of arms for {counter} CK3 titles."); // TODO: CHANGE TO DEBUG + Logger.Debug($"Set coats of arms for {counter} CK3 titles."); } } } \ No newline at end of file From 3152e9468d03487fabcbcf2fc9d63a96632a56aa Mon Sep 17 00:00:00 2001 From: Seweryn Presnal Date: Thu, 5 Sep 2024 03:02:11 +0200 Subject: [PATCH 3/4] Fix "Malformed token: @smLysX" --- .../Outputter/CoatOfArmsOutputterTests.cs | 4 ++-- ImperatorToCK3/CK3/Titles/LandedTitles.cs | 2 +- ImperatorToCK3/CK3/World.cs | 4 +++- ImperatorToCK3/Mappers/CoA/CoaMapper.cs | 15 ++++++++++++++- ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs | 10 ++++++++-- ImperatorToCK3/Outputter/WorldOutputter.cs | 2 +- 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs index c546d3e3d..2b09660ce 100644 --- a/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs @@ -76,7 +76,7 @@ public async Task CoaIsOutputtedForCountryWithFlagSet() { new List>() ); - await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List()); + await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List(), new CoaMapper()); await using var file = File.OpenRead(outputPath); var reader = new StreamReader(file); @@ -122,7 +122,7 @@ public async Task CoaIsNotOutputtedForCountryWithoutFlagSet() { new List>() ); - await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List()); + await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List(), new CoaMapper()); await using var file = File.OpenRead(outputPath); var reader = new StreamReader(file); diff --git a/ImperatorToCK3/CK3/Titles/LandedTitles.cs b/ImperatorToCK3/CK3/Titles/LandedTitles.cs index 4ce642a25..8465710ce 100644 --- a/ImperatorToCK3/CK3/Titles/LandedTitles.cs +++ b/ImperatorToCK3/CK3/Titles/LandedTitles.cs @@ -1526,7 +1526,7 @@ public void SetCoatsOfArms(CoaMapper coaMapper) { int counter = 0; foreach (var title in this) { - var coa = coaMapper.GetCoaForFlagName(title.Id, warnIfMissing: title.Rank > TitleRank.duchy); + var coa = coaMapper.GetCoaForFlagName(title.Id, warnIfMissing: false); if (coa is null) { continue; } diff --git a/ImperatorToCK3/CK3/World.cs b/ImperatorToCK3/CK3/World.cs index c77ebf9b3..c9004f0df 100644 --- a/ImperatorToCK3/CK3/World.cs +++ b/ImperatorToCK3/CK3/World.cs @@ -56,6 +56,7 @@ public sealed class World { public MapData MapData { get; } public IList Wars { get; } = new List(); public LegendSeedCollection LegendSeeds { get; } = []; + public CoaMapper CK3CoaMapper { get; } /// /// Date based on I:R save date, but normalized for CK3 purposes. @@ -143,7 +144,8 @@ public World(Imperator.World impWorld, Configuration config) { Logger.IncrementProgress(); } - LandedTitles.SetCoatsOfArms(new CoaMapper(ModFS)); + CK3CoaMapper = new(ModFS); + LandedTitles.SetCoatsOfArms(CK3CoaMapper); LandedTitles.LoadHistory(config, ModFS); LandedTitles.LoadCulturalNamesFromConfigurables(); diff --git a/ImperatorToCK3/Mappers/CoA/CoaMapper.cs b/ImperatorToCK3/Mappers/CoA/CoaMapper.cs index 2b12674b7..3c8f604f1 100644 --- a/ImperatorToCK3/Mappers/CoA/CoaMapper.cs +++ b/ImperatorToCK3/Mappers/CoA/CoaMapper.cs @@ -19,6 +19,10 @@ public CoaMapper(ModFilesystem modFS) { Logger.IncrementProgress(); } private void RegisterKeys(Parser parser) { + parser.RegisterRegex(CommonRegexes.Variable, (reader, variableName) => { // for variables like "@smCross = 0.22" + var variableValue = reader.GetString(); + variablesToOutput[variableName[1..]] = variableValue; + }); parser.RegisterKeyword("template", ParserHelpers.IgnoreItem); // we don't need templates, we need CoAs! parser.RegisterRegex(CommonRegexes.Catchall, (reader, flagName) => coasMap[flagName] = reader.GetStringOfItem().ToString()); } @@ -31,7 +35,11 @@ public void ParseCoAs(IEnumerable coaDefinitionStrings) { } } - public string? GetCoaForFlagName(string flagName, bool warnIfMissing = true) { + public string? GetCoaForFlagName(string flagName) { + return GetCoaForFlagName(flagName, warnIfMissing: true); + } + + public string? GetCoaForFlagName(string flagName, bool warnIfMissing) { if (!coasMap.TryGetValue(flagName, out string? value)) { if (warnIfMissing) { Logger.Warn($"No CoA defined for flag name {flagName}."); @@ -42,11 +50,16 @@ public void ParseCoAs(IEnumerable coaDefinitionStrings) { return value; } + /// /// For a given collection of flag names, returns ones that don't have a defined CoA. + /// public ISet GetAllMissingFlagKeys(IEnumerable flagKeys) { var existingFlagKeys = coasMap.Keys.ToHashSet(); return flagKeys.Where(flagKey => !existingFlagKeys.Contains(flagKey)).ToHashSet(); } private readonly Dictionary coasMap = []; + + private readonly Dictionary variablesToOutput = new(); + public IReadOnlyDictionary VariablesToOutput => variablesToOutput; } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs index b3d38a991..9162f7a21 100644 --- a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs +++ b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs @@ -2,6 +2,7 @@ using commonItems.Mods; using ImperatorToCK3.CK3.Dynasties; using ImperatorToCK3.CK3.Titles; +using ImperatorToCK3.Mappers.CoA; using System; using System.Collections.Generic; using System.IO; @@ -10,11 +11,16 @@ namespace ImperatorToCK3.Outputter; public static class CoatOfArmsOutputter { - public static async Task OutputCoas(string outputModPath, Title.LandedTitles titles, IEnumerable dynasties) { + public static async Task OutputCoas(string outputModPath, Title.LandedTitles titles, IEnumerable dynasties, CoaMapper ck3CoaMapper) { Logger.Info("Outputting coats of arms..."); + + // Output variables (like "@smCastleX = 0.27" in vanilla CK3). + var sb = new System.Text.StringBuilder(); + foreach (var (variableName, variableValue) in ck3CoaMapper.VariablesToOutput) { + sb.AppendLine($"{variableName}={variableValue}"); + } // Output CoAs for titles. - var sb = new System.Text.StringBuilder(); foreach (var title in titles) { var coa = title.CoA; if (coa is not null) { diff --git a/ImperatorToCK3/Outputter/WorldOutputter.cs b/ImperatorToCK3/Outputter/WorldOutputter.cs index 9be48da74..b38f8e2e3 100644 --- a/ImperatorToCK3/Outputter/WorldOutputter.cs +++ b/ImperatorToCK3/Outputter/WorldOutputter.cs @@ -51,7 +51,7 @@ public static void OutputWorld(World ck3World, Imperator.World imperatorWorld, C NamedColorsOutputter.OutputNamedColors(outputPath, imperatorWorld.NamedColors, ck3World.NamedColors), CoatOfArmsEmblemsOutputter.CopyEmblems(outputPath, imperatorWorld.ModFS), - CoatOfArmsOutputter.OutputCoas(outputPath, ck3World.LandedTitles, ck3World.Dynasties), + CoatOfArmsOutputter.OutputCoas(outputPath, ck3World.LandedTitles, ck3World.Dynasties, ck3World.CK3CoaMapper), Task.Run(() => CoatOfArmsOutputter.CopyCoaPatterns(imperatorWorld.ModFS, outputPath)), BookmarkOutputter.OutputBookmark(ck3World, config, ck3World.LocDB) From 0fa956c4596f97e08d8450c566eb12aceef339c4 Mon Sep 17 00:00:00 2001 From: Seweryn Presnal Date: Thu, 5 Sep 2024 03:06:29 +0200 Subject: [PATCH 4/4] Fix the outputting of CoA variables --- ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs index 9162f7a21..4e1da0e5f 100644 --- a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs +++ b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs @@ -17,7 +17,7 @@ public static async Task OutputCoas(string outputModPath, Title.LandedTitles tit // Output variables (like "@smCastleX = 0.27" in vanilla CK3). var sb = new System.Text.StringBuilder(); foreach (var (variableName, variableValue) in ck3CoaMapper.VariablesToOutput) { - sb.AppendLine($"{variableName}={variableValue}"); + sb.AppendLine($"@{variableName}={variableValue}"); } // Output CoAs for titles.