diff --git a/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs index 23e80361e..1958caeec 100644 --- a/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/CoatOfArmsOutputterTests.cs @@ -24,6 +24,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; namespace ImperatorToCK3.UnitTests.Outputter; @@ -40,7 +41,7 @@ public CoatOfArmsOutputterTests() { } [Fact] - public void CoaIsOutputtedForCountryWithFlagSet() { + public async Task CoaIsOutputtedForCountryWithFlagSet() { var titles = new Title.LandedTitles(); var countries = new CountryCollection(); @@ -48,8 +49,8 @@ public void CoaIsOutputtedForCountryWithFlagSet() { var country = Country.Parse(countryReader, 1); countries.Add(country); - const string outputModName = "outputMod"; - var outputPath = Path.Combine("output", outputModName, "common/coat_of_arms/coat_of_arms/zzz_IRToCK3_coas.txt"); + const string outputModPath = "output/outputMod"; + var outputPath = Path.Combine(outputModPath, "common/coat_of_arms/coat_of_arms/zzz_IRToCK3_coas.txt"); SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputPath)); var ck3Religions = new ReligionCollection(titles); @@ -73,19 +74,19 @@ public void CoaIsOutputtedForCountryWithFlagSet() { new List>() ); - CoatOfArmsOutputter.OutputCoas(outputModName, titles, new List()); + await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List()); - using var file = File.OpenRead(outputPath); + await using var file = File.OpenRead(outputPath); var reader = new StreamReader(file); - Assert.Equal("d_IRTOCK3_ADI={", reader.ReadLine()); - Assert.Equal("\tpattern=\"pattern_solid.tga\"", reader.ReadLine()); - Assert.Equal("\tcolor1=red color2=green color3=blue", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("d_IRTOCK3_ADI={", await reader.ReadLineAsync()); + Assert.Equal("\tpattern=\"pattern_solid.tga\"", await reader.ReadLineAsync()); + Assert.Equal("\tcolor1=red color2=green color3=blue", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); } [Fact] - public void CoaIsNotOutputtedForCountryWithoutFlagSet() { + public async Task CoaIsNotOutputtedForCountryWithoutFlagSet() { var titles = new Title.LandedTitles(); var countries = new CountryCollection(); @@ -93,8 +94,8 @@ public void CoaIsNotOutputtedForCountryWithoutFlagSet() { var country = Country.Parse(countryReader, 2); countries.Add(country); - const string outputModName = "outputMod"; - var outputPath = Path.Combine("output", outputModName, "common/coat_of_arms/coat_of_arms/zzz_IRToCK3_coas.txt"); + const string outputModPath = "output/outputMod"; + var outputPath = Path.Combine(outputModPath, "common/coat_of_arms/coat_of_arms/zzz_IRToCK3_coas.txt"); SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputPath)); var ck3Religions = new ReligionCollection(titles); @@ -118,9 +119,9 @@ public void CoaIsNotOutputtedForCountryWithoutFlagSet() { new List>() ); - CoatOfArmsOutputter.OutputCoas(outputModName, titles, new List()); + await CoatOfArmsOutputter.OutputCoas(outputModPath, titles, new List()); - using var file = File.OpenRead(outputPath); + await using var file = File.OpenRead(outputPath); var reader = new StreamReader(file); Assert.True(reader.EndOfStream); diff --git a/ImperatorToCK3.UnitTests/Outputter/DynastiesOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/DynastiesOutputterTests.cs index 723c12e0a..9aea7b0bd 100644 --- a/ImperatorToCK3.UnitTests/Outputter/DynastiesOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/DynastiesOutputterTests.cs @@ -14,6 +14,7 @@ using ImperatorToCK3.Outputter; using System; using System.IO; +using System.Threading.Tasks; using Xunit; namespace ImperatorToCK3.UnitTests.Outputter; @@ -22,7 +23,7 @@ public class DynastiesOutputterTests { private static readonly Date ConversionDate = new(867, 1, 1); [Fact] - public void DynastiesAreOutputted() { + public async Task DynastiesAreOutputted() { const string outputModPath = "output/outputMod"; var locDB = new LocDB("english"); const string imperatorRoot = "TestFiles/Imperator/root"; @@ -56,20 +57,20 @@ public void DynastiesAreOutputted() { File.Delete(outputPath); } SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputPath)); - DynastiesOutputter.OutputDynasties(outputModPath, dynasties); + await DynastiesOutputter.OutputDynasties(outputModPath, dynasties); - using var file = File.OpenRead(outputPath); + await using var file = File.OpenRead(outputPath); var reader = new StreamReader(file); - Assert.Equal("dynn_irtock3_1={", reader.ReadLine()); - Assert.Equal("\tname = dynn_irtock3_1", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("dynn_irtock3_1={", await reader.ReadLineAsync()); + Assert.Equal("\tname = dynn_irtock3_1", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); - Assert.Equal("dynn_irtock3_2={", reader.ReadLine()); - Assert.Equal("\tname = dynn_irtock3_2", reader.ReadLine()); - Assert.Equal("\tculture = roman", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); - Assert.True(string.IsNullOrWhiteSpace(reader.ReadLine())); + Assert.Equal("dynn_irtock3_2={", await reader.ReadLineAsync()); + Assert.Equal("\tname = dynn_irtock3_2", await reader.ReadLineAsync()); + Assert.Equal("\tculture = roman", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); + Assert.True(string.IsNullOrWhiteSpace(await reader.ReadLineAsync())); Assert.True(reader.EndOfStream); } } \ No newline at end of file diff --git a/ImperatorToCK3.UnitTests/Outputter/NamedColorOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/NamedColorOutputterTests.cs index 51d37fc91..610c5da20 100644 --- a/ImperatorToCK3.UnitTests/Outputter/NamedColorOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/NamedColorOutputterTests.cs @@ -1,14 +1,14 @@ -using commonItems; using commonItems.Colors; using ImperatorToCK3.Outputter; using System.IO; +using System.Threading.Tasks; using Xunit; namespace ImperatorToCK3.UnitTests.Outputter; public class NamedColorOutputterTests { [Fact] - public void OutputterOutputsColorsNotFoundInCK3ColorCollection() { + public async Task OutputterOutputsColorsNotFoundInCK3ColorCollection() { var imperatorColors = new NamedColorCollection { ["a"] = new(1, 1, 1), ["b"] = new(2, 2, 2), @@ -22,8 +22,8 @@ public void OutputterOutputsColorsNotFoundInCK3ColorCollection() { }; Directory.CreateDirectory("output/colors_test/common/named_colors"); - NamedColorsOutputter.OutputNamedColors("colors_test", imperatorColors, ck3Colors); - var output = File.ReadAllText("output/colors_test/common/named_colors/IRtoCK3_colors_from_Imperator.txt"); + await NamedColorsOutputter.OutputNamedColors("output/colors_test", imperatorColors, ck3Colors); + var output = await File.ReadAllTextAsync("output/colors_test/common/named_colors/IRtoCK3_colors_from_Imperator.txt"); Assert.DoesNotContain("a=", output); Assert.DoesNotContain("b=", output); Assert.DoesNotContain("c=rgb {3 3 3}", output); @@ -31,7 +31,7 @@ public void OutputterOutputsColorsNotFoundInCK3ColorCollection() { } [Fact] - public void OutputterOutputsNothingWhenThereIsNothingToOutput() { + public async Task OutputterOutputsNothingWhenThereIsNothingToOutput() { var imperatorColors = new NamedColorCollection { ["a"] = new(1, 1, 1), ["b"] = new(2, 2, 2), @@ -44,7 +44,7 @@ public void OutputterOutputsNothingWhenThereIsNothingToOutput() { }; Directory.CreateDirectory("output/colors_test/common/named_colors"); - NamedColorsOutputter.OutputNamedColors("colors_test2", imperatorColors, ck3Colors); + await NamedColorsOutputter.OutputNamedColors("colors_test2", imperatorColors, ck3Colors); Assert.False(File.Exists("output/colors_test2/common/named_colors/IRtoCK3_colors_from_Imperator.txt")); } } \ No newline at end of file diff --git a/ImperatorToCK3.UnitTests/Outputter/SuccessionTriggersOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/SuccessionTriggersOutputterTests.cs index 03eb63f1a..eb738d01d 100644 --- a/ImperatorToCK3.UnitTests/Outputter/SuccessionTriggersOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/SuccessionTriggersOutputterTests.cs @@ -3,17 +3,17 @@ using ImperatorToCK3.Outputter; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Xunit; namespace ImperatorToCK3.UnitTests.Outputter; public class SuccessionTriggersOutputterTests { [Fact] - public void PrimogenitureAndSeniorityTriggersAreOutputted() { - const string outputModName = "outputMod"; + public async Task PrimogenitureAndSeniorityTriggersAreOutputted() { + const string outputModPath = "output/outputMod"; var outputFilePath = Path.Combine( - "output", - outputModName, + outputModPath, "common", "scripted_triggers", "IRToCK3_succession_triggers.txt" @@ -34,20 +34,20 @@ public void PrimogenitureAndSeniorityTriggersAreOutputted() { SystemUtils.TryCreateFolder(CommonFunctions.GetPath(outputFilePath)); - SuccessionTriggersOutputter.OutputSuccessionTriggers(outputModName, titles, date); + await SuccessionTriggersOutputter.OutputSuccessionTriggers(outputModPath, titles, date); - using var file = File.OpenRead(outputFilePath); + await 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:k_kingdom1", 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:k_kingdom2", reader.ReadLine()); - Assert.Equal("\t}", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("historical_succession_access_single_heir_succession_law_trigger={", await reader.ReadLineAsync()); + Assert.Equal("\tOR={", await reader.ReadLineAsync()); + Assert.Equal("\t\thas_title=title:k_kingdom1", await reader.ReadLineAsync()); + Assert.Equal("\t}", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); + Assert.Equal("historical_succession_access_single_heir_dynasty_house_trigger={", await reader.ReadLineAsync()); + Assert.Equal("\tOR={", await reader.ReadLineAsync()); + Assert.Equal("\t\thas_title=title:k_kingdom2", await reader.ReadLineAsync()); + Assert.Equal("\t}", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); Assert.True(reader.EndOfStream); } } \ No newline at end of file diff --git a/ImperatorToCK3.UnitTests/Outputter/TitlesOutputterTests.cs b/ImperatorToCK3.UnitTests/Outputter/TitlesOutputterTests.cs index 3c0f55448..29187002c 100644 --- a/ImperatorToCK3.UnitTests/Outputter/TitlesOutputterTests.cs +++ b/ImperatorToCK3.UnitTests/Outputter/TitlesOutputterTests.cs @@ -2,14 +2,15 @@ using ImperatorToCK3.CK3.Titles; using ImperatorToCK3.Outputter; using System.IO; +using System.Threading.Tasks; using Xunit; namespace ImperatorToCK3.UnitTests.Outputter; public class TitlesOutputterTests { [Fact] - public void TitlesAreOutputted() { - const string outputModName = "outputMod"; + public async Task TitlesAreOutputted() { + const string outputModPath = "output/outputMod"; var titles = new Title.LandedTitles(); var kingdom = titles.Add("k_kingdom"); @@ -27,82 +28,82 @@ public void TitlesAreOutputted() { var specialTitle = titles.Add("k_special_title"); specialTitle.History.AddFieldValue(new Date(20, 1, 1), "holder", "holder", "bob_42"); - var titleHistoryPath = Path.Combine("output", outputModName, "history", "titles"); + var titleHistoryPath = Path.Combine(outputModPath, "history", "titles"); var kingdomHistoryPath = Path.Combine(titleHistoryPath, "k_kingdom.txt"); var otherTitlesHistoryPath = Path.Combine(titleHistoryPath, "00_other_titles.txt"); SystemUtils.TryCreateFolder(titleHistoryPath); - var landedTitlesPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt"); + var landedTitlesPath = Path.Combine(outputModPath, "common", "landed_titles", "00_landed_titles.txt"); SystemUtils.TryCreateFolder(CommonFunctions.GetPath(landedTitlesPath)); - TitlesOutputter.OutputTitles(outputModName, titles); + await TitlesOutputter.OutputTitles(outputModPath, titles); Assert.True(File.Exists(kingdomHistoryPath)); - using var kingdomHistoryFile = File.OpenRead(kingdomHistoryPath); + await using var kingdomHistoryFile = File.OpenRead(kingdomHistoryPath); var reader = new StreamReader(kingdomHistoryFile); - Assert.Equal("k_kingdom={", reader.ReadLine()); - Assert.Equal("\t20.1.1 = { liege = 0 }", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("k_kingdom={", await reader.ReadLineAsync()); + Assert.Equal("\t20.1.1 = { liege = 0 }", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); Assert.True(reader.EndOfStream); Assert.True(File.Exists(otherTitlesHistoryPath)); - using var otherTitlesHistoryFile = File.OpenRead(otherTitlesHistoryPath); + await using var otherTitlesHistoryFile = File.OpenRead(otherTitlesHistoryPath); reader = new StreamReader(otherTitlesHistoryFile); - Assert.Equal("k_special_title={", reader.ReadLine()); - Assert.Equal("\t20.1.1 = { holder = bob_42 }", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("k_special_title={", await reader.ReadLineAsync()); + Assert.Equal("\t20.1.1 = { holder = bob_42 }", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); Assert.True(reader.EndOfStream); Assert.True(File.Exists(landedTitlesPath)); - using var landedTitlesFile = File.OpenRead(landedTitlesPath); + await using var landedTitlesFile = File.OpenRead(landedTitlesPath); reader = new StreamReader(landedTitlesFile); - Assert.Equal("k_kingdom = {", reader.ReadLine()); - Assert.Equal("\td_duchy = {", reader.ReadLine()); - Assert.Equal("\t\tc_county = {", reader.ReadLine()); - Assert.Equal("\t\t\tb_barony = {", reader.ReadLine()); - Assert.Equal("\t\t\t\tlandless = no", reader.ReadLine()); - Assert.Equal("\t\t\t\tdefinite_form = no", reader.ReadLine()); - Assert.Equal("\t\t\t\truler_uses_title_name = no", reader.ReadLine()); - Assert.Equal("\t\t\t}", reader.ReadLine()); - Assert.Equal("\t\t\tlandless = no", reader.ReadLine()); - Assert.Equal("\t\t\tdefinite_form = no", reader.ReadLine()); - Assert.Equal("\t\t\truler_uses_title_name = no", reader.ReadLine()); - Assert.Equal("\t\t}", reader.ReadLine()); - Assert.Equal("\t\tlandless = no", reader.ReadLine()); - Assert.Equal("\t\tdefinite_form = no", reader.ReadLine()); - Assert.Equal("\t\truler_uses_title_name = no", reader.ReadLine()); - Assert.Equal("\t}", reader.ReadLine()); - Assert.Equal("\tlandless = no", reader.ReadLine()); - Assert.Equal("\tdefinite_form = no", reader.ReadLine()); - Assert.Equal("\truler_uses_title_name = no", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); - Assert.Equal("k_special_title = {", reader.ReadLine()); - Assert.Equal("\tlandless = no", reader.ReadLine()); - Assert.Equal("\tdefinite_form = no", reader.ReadLine()); - Assert.Equal("\truler_uses_title_name = no", reader.ReadLine()); - Assert.Equal("}", reader.ReadLine()); + Assert.Equal("k_kingdom = {", await reader.ReadLineAsync()); + Assert.Equal("\td_duchy = {", await reader.ReadLineAsync()); + Assert.Equal("\t\tc_county = {", await reader.ReadLineAsync()); + Assert.Equal("\t\t\tb_barony = {", await reader.ReadLineAsync()); + Assert.Equal("\t\t\t\tlandless = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t\t\tdefinite_form = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t\t\truler_uses_title_name = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t\t}", await reader.ReadLineAsync()); + Assert.Equal("\t\t\tlandless = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t\tdefinite_form = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t\truler_uses_title_name = no", await reader.ReadLineAsync()); + Assert.Equal("\t\t}", await reader.ReadLineAsync()); + Assert.Equal("\t\tlandless = no", await reader.ReadLineAsync()); + Assert.Equal("\t\tdefinite_form = no", await reader.ReadLineAsync()); + Assert.Equal("\t\truler_uses_title_name = no", await reader.ReadLineAsync()); + Assert.Equal("\t}", await reader.ReadLineAsync()); + Assert.Equal("\tlandless = no", await reader.ReadLineAsync()); + Assert.Equal("\tdefinite_form = no", await reader.ReadLineAsync()); + Assert.Equal("\truler_uses_title_name = no", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); + Assert.Equal("k_special_title = {", await reader.ReadLineAsync()); + Assert.Equal("\tlandless = no", await reader.ReadLineAsync()); + Assert.Equal("\tdefinite_form = no", await reader.ReadLineAsync()); + Assert.Equal("\truler_uses_title_name = no", await reader.ReadLineAsync()); + Assert.Equal("}", await reader.ReadLineAsync()); Assert.True(reader.EndOfStream); } [Fact] - public void VariablesAreOutputted() { - const string outputModName = "outputMod2"; + public async Task VariablesAreOutputted() { + const string outputModPath = "output/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"); + var titleHistoryPath = Path.Combine(outputModPath, "history", "titles"); SystemUtils.TryCreateFolder(titleHistoryPath); - var landedTitlesPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt"); + var landedTitlesPath = Path.Combine(outputModPath, "common", "landed_titles", "00_landed_titles.txt"); SystemUtils.TryCreateFolder(CommonFunctions.GetPath(landedTitlesPath)); - TitlesOutputter.OutputTitles(outputModName, titles); + await TitlesOutputter.OutputTitles(outputModPath, titles); Assert.True(File.Exists(landedTitlesPath)); - using var landedTitlesFile = File.OpenRead(landedTitlesPath); + await 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.Equal("@default_ai_priority=20", await reader.ReadLineAsync()); + Assert.Equal("@default_ai_aggressiveness=40", await reader.ReadLineAsync()); Assert.True(reader.EndOfStream); } } \ No newline at end of file diff --git a/ImperatorToCK3/CK3/Characters/DNA.cs b/ImperatorToCK3/CK3/Characters/DNA.cs index bc0640a8a..091f423cd 100644 --- a/ImperatorToCK3/CK3/Characters/DNA.cs +++ b/ImperatorToCK3/CK3/Characters/DNA.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.CK3.Characters; @@ -43,13 +44,13 @@ IDictionary accessoryDNAValues this.accessoryDNAValues = new(accessoryDNAValues); } - public void OutputGenes(StreamWriter output) { - output.WriteLine("\t\tgenes={"); + public async Task OutputGenes(StreamWriter output) { + await output.WriteLineAsync("\t\tgenes={"); foreach (var dnaLine in DNALines) { - output.WriteLine($"\t\t\t{dnaLine}"); + await output.WriteLineAsync($"\t\t\t{dnaLine}"); } - output.WriteLine("\t\t}"); + await output.WriteLineAsync("\t\t}"); } } \ No newline at end of file diff --git a/ImperatorToCK3/CK3/Cultures/Culture.cs b/ImperatorToCK3/CK3/Cultures/Culture.cs index f7b117c7c..249b864a9 100644 --- a/ImperatorToCK3/CK3/Cultures/Culture.cs +++ b/ImperatorToCK3/CK3/Cultures/Culture.cs @@ -8,6 +8,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace ImperatorToCK3.CK3.Cultures; @@ -69,27 +70,27 @@ public string Serialize(string indent, bool withBraces) { return sb.ToString(); } - public void OutputHistory(string outputModPath, Date date) { + public async Task OutputHistory(string outputModPath, Date date) { if (innovationsFromImperator.Count == 0 && innovationProgressesFromImperator.Count == 0) { // Nothing to output. return; } var historyPath = Path.Combine(outputModPath, "history/cultures", Id + ".txt"); - using var historyWriter = File.CreateText(historyPath); - historyWriter.WriteLine("# This file was generated by the IRToCK3 converter."); + await using var historyWriter = File.CreateText(historyPath); + await historyWriter.WriteLineAsync("# This file was generated by the IRToCK3 converter."); - historyWriter.WriteLine($"{date} = {{"); + await historyWriter.WriteLineAsync($"{date} = {{"); foreach (var innovationId in innovationsFromImperator) { - historyWriter.WriteLine($"\tdiscover_innovation = {innovationId}"); + await historyWriter.WriteLineAsync($"\tdiscover_innovation = {innovationId}"); } foreach (var (innovationId, progress) in innovationProgressesFromImperator) { - historyWriter.WriteLine("\tadd_innovation_progress = {"); - historyWriter.WriteLine($"\t\tculture_innovation = {innovationId}"); - historyWriter.WriteLine($"\t\tprogress = {progress}"); - historyWriter.WriteLine("\t}"); + await historyWriter.WriteLineAsync("\tadd_innovation_progress = {"); + await historyWriter.WriteLineAsync($"\t\tculture_innovation = {innovationId}"); + await historyWriter.WriteLineAsync($"\t\tprogress = {progress}"); + await historyWriter.WriteLineAsync("\t}"); } - historyWriter.WriteLine("}"); + await historyWriter.WriteLineAsync("}"); } public void ImportInnovationsFromImperator(ISet irInventions, InnovationMapper innovationMapper) { diff --git a/ImperatorToCK3/CK3/Titles/Title.cs b/ImperatorToCK3/CK3/Titles/Title.cs index 216d3f26b..489062fbc 100644 --- a/ImperatorToCK3/CK3/Titles/Title.cs +++ b/ImperatorToCK3/CK3/Titles/Title.cs @@ -27,6 +27,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace ImperatorToCK3.CK3.Titles; @@ -1074,7 +1075,7 @@ private void SetRank() { Rank = GetRankForId(Id); } - public void OutputHistory(StreamWriter writer) { + public async Task OutputHistory(StreamWriter writer) { var sb = new StringBuilder(); var content = PDXSerializer.Serialize(History, "\t"); if (string.IsNullOrWhiteSpace(content)) { @@ -1083,7 +1084,7 @@ public void OutputHistory(StreamWriter writer) { } sb.Append(Id).AppendLine("={").Append(content).AppendLine("}"); - writer.Write(sb); + await writer.WriteAsync(sb); } public ISet GetProvincesInCountry(Date date) { diff --git a/ImperatorToCK3/Outputter/BookmarkOutputter.cs b/ImperatorToCK3/Outputter/BookmarkOutputter.cs index c43aa3d87..af8d1e19c 100644 --- a/ImperatorToCK3/Outputter/BookmarkOutputter.cs +++ b/ImperatorToCK3/Outputter/BookmarkOutputter.cs @@ -14,28 +14,29 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; using Color = SixLabors.ImageSharp.Color; namespace ImperatorToCK3.Outputter; public static class BookmarkOutputter { - public static void OutputBookmark(World world, Configuration config) { + public static async Task OutputBookmark(World world, Configuration config) { Logger.Info("Creating bookmark..."); - OutputBookmarkGroup(config); + await OutputBookmarkGroup(config); var path = Path.Combine("output", config.OutputModName, "common/bookmarks/bookmarks/00_bookmarks.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); + await using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); var provincePositions = world.MapData.ProvincePositions; - output.WriteLine("bm_converted = {"); + await output.WriteLineAsync("bm_converted = {"); - output.WriteLine("\tgroup = bm_converted"); - output.WriteLine($"\tstart_date = {config.CK3BookmarkDate}"); - output.WriteLine("\tis_playable = yes"); - output.WriteLine("\trecommended = yes"); - output.WriteLine("\tweight = { value = 100 }"); + await output.WriteLineAsync("\tgroup = bm_converted"); + await output.WriteLineAsync($"\tstart_date = {config.CK3BookmarkDate}"); + await output.WriteLineAsync("\tis_playable = yes"); + await output.WriteLineAsync("\trecommended = yes"); + await output.WriteLineAsync("\tweight = { value = 100 }"); var playerTitles = new List(world.LandedTitles.Where(title => title.PlayerCountry)); var localizations = new Dictionary<string, LocBlock>(); @@ -52,17 +53,19 @@ public static void OutputBookmark(World world, Configuration config) { continue; } - AddTitleToBookmarkScreen(title, output, holderId, world, localizations, provincePositions, config); + await AddTitleToBookmarkScreen(title, output, holderId, world, localizations, provincePositions, config); } - output.WriteLine("}"); + await output.WriteLineAsync("}"); - OutputBookmarkLoc(config, localizations); - DrawBookmarkMap(config, playerTitles, world); + await Task.WhenAll( + OutputBookmarkLoc(config, localizations), + DrawBookmarkMap(config, playerTitles, world) + ); Logger.IncrementProgress(); } - private static void AddTitleToBookmarkScreen( + private static async Task AddTitleToBookmarkScreen( Title title, StreamWriter output, string holderId, @@ -85,33 +88,33 @@ Configuration config } localizations.Add(holderDescLoc.Id, holderDescLoc); - output.WriteLine("\tcharacter = {"); + await output.WriteLineAsync("\tcharacter = {"); - output.WriteLine($"\t\tname = bm_converted_{holder.Id}"); + await output.WriteLineAsync($"\t\tname = bm_converted_{holder.Id}"); var dynastyId = holder.GetDynastyId(config.CK3BookmarkDate); if (dynastyId is not null) { - output.WriteLine($"\t\tdynasty = {dynastyId}"); + await output.WriteLineAsync($"\t\tdynasty = {dynastyId}"); } - output.WriteLine("\t\tdynasty_splendor_level = 1"); - output.WriteLine($"\t\ttype = {holder.GetAgeSex(config.CK3BookmarkDate)}"); - output.WriteLine($"\t\thistory_id = {holder.Id}"); - output.WriteLine($"\t\tbirth = {holder.BirthDate}"); - output.WriteLine($"\t\ttitle = {title.Id}"); + await output.WriteLineAsync("\t\tdynasty_splendor_level = 1"); + await output.WriteLineAsync($"\t\ttype = {holder.GetAgeSex(config.CK3BookmarkDate)}"); + await output.WriteLineAsync($"\t\thistory_id = {holder.Id}"); + await output.WriteLineAsync($"\t\tbirth = {holder.BirthDate}"); + await output.WriteLineAsync($"\t\ttitle = {title.Id}"); var gov = title.GetGovernment(config.CK3BookmarkDate); if (gov is not null) { - output.WriteLine($"\t\tgovernment = {gov}"); + await output.WriteLineAsync($"\t\tgovernment = {gov}"); } - output.WriteLine($"\t\tculture = {holder.GetCultureId(config.CK3BookmarkDate)}"); + await output.WriteLineAsync($"\t\tculture = {holder.GetCultureId(config.CK3BookmarkDate)}"); var faithId = holder.GetFaithId(config.CK3BookmarkDate); if (!string.IsNullOrEmpty(faithId)) { - output.WriteLine($"\t\treligion={faithId}"); + await output.WriteLineAsync($"\t\treligion={faithId}"); } - output.WriteLine("\t\tdifficulty = \"BOOKMARK_CHARACTER_DIFFICULTY_EASY\""); - WritePosition(output, title, config, provincePositions); - output.WriteLine("\t\tanimation = personality_rational"); + await output.WriteLineAsync("\t\tdifficulty = \"BOOKMARK_CHARACTER_DIFFICULTY_EASY\""); + await WritePosition(output, title, config, provincePositions); + await output.WriteLineAsync("\t\tanimation = personality_rational"); - output.WriteLine("\t}"); + await output.WriteLineAsync("\t}"); string templatePath = holder.GetAgeSex(config.CK3BookmarkDate) switch { "female" => "blankMod/templates/common/bookmark_portraits/female.txt", @@ -119,7 +122,7 @@ Configuration config "boy" => "blankMod/templates/common/bookmark_portraits/boy.txt", _ => "blankMod/templates/common/bookmark_portraits/male.txt" }; - string templateText = File.ReadAllText(templatePath); + string templateText = await File.ReadAllTextAsync(templatePath); templateText = templateText.Replace("REPLACE_ME_NAME", $"bm_converted_{holder.Id}"); templateText = templateText.Replace("REPLACE_ME_AGE", holder.GetAge(config.CK3BookmarkDate).ToString()); @@ -127,35 +130,33 @@ Configuration config templateText = templateText.Replace("ADD_GENES", genesStr); var outPortraitPath = Path.Combine("output", config.OutputModName, $"common/bookmark_portraits/bm_converted_{holder.Id}.txt"); - File.WriteAllText(outPortraitPath, templateText); + await File.WriteAllTextAsync(outPortraitPath, templateText); } - private static void OutputBookmarkGroup(Configuration config) { + private static async Task OutputBookmarkGroup(Configuration config) { var path = Path.Combine("output", config.OutputModName, "common/bookmarks/groups/00_bookmark_groups.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); + await using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); - output.WriteLine("bm_converted = {"); - output.WriteLine($"\tdefault_start_date = {config.CK3BookmarkDate}"); - output.WriteLine("}"); + await output.WriteLineAsync($"bm_converted = {{ default_start_date = {config.CK3BookmarkDate} }}"); } - private static void OutputBookmarkLoc(Configuration config, IDictionary<string, LocBlock> localizations) { + private static async Task OutputBookmarkLoc(Configuration config, IDictionary<string, LocBlock> localizations) { var outputName = config.OutputModName; var baseLocPath = Path.Combine("output", outputName, "localization"); foreach (var language in ConverterGlobals.SupportedLanguages) { var locFilePath = Path.Combine(baseLocPath, language, $"converter_bookmark_l_{language}.yml"); - using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, Encoding.UTF8); + await using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, Encoding.UTF8); - locWriter.WriteLine($"l_{language}:"); + await locWriter.WriteLineAsync($"l_{language}:"); // title localization foreach (var locBlock in localizations.Values) { - locWriter.WriteLine(locBlock.GetYmlLocLineForLanguage(language)); + await locWriter.WriteLineAsync(locBlock.GetYmlLocLineForLanguage(language)); } } } - private static void WritePosition(TextWriter output, Title title, Configuration config, IReadOnlyDictionary<ulong, ProvincePosition> provincePositions) { + private static async Task WritePosition(TextWriter output, Title title, Configuration config, IReadOnlyDictionary<ulong, ProvincePosition> provincePositions) { int count = 0; double sumX = 0; double sumY = 0; @@ -174,10 +175,10 @@ private static void WritePosition(TextWriter output, Title title, Configuration const double scale = (double)1080 / 4096; int finalX = (int)(scale * meanX); int finalY = 1080 - (int)(scale * meanY); - output.WriteLine($"\t\tposition = {{ {finalX} {finalY} }}"); + await output.WriteLineAsync($"\t\tposition = {{ {finalX} {finalY} }}"); } - private static void DrawBookmarkMap(Configuration config, List<Title> playerTitles, World ck3World) { + private static async Task DrawBookmarkMap(Configuration config, List<Title> playerTitles, World ck3World) { Logger.Info("Drawing bookmark map..."); var ck3ModFS = ck3World.ModFS; var provincesMapPath = ck3ModFS.GetActualFileLocation("map_data/provinces.png"); @@ -194,7 +195,7 @@ private static void DrawBookmarkMap(Configuration config, List<Title> playerTitl TransparentColorMode = PngTransparentColorMode.Clear, ColorType = PngColorType.RgbWithAlpha }); - using var provincesImage = Image.Load(provincesMapPath); + using var provincesImage = await Image.LoadAsync(provincesMapPath); provincesImage.Mutate(x => x.Resize(2160, 1080, KnownResamplers.NearestNeighbor) .Crop(1920, 1080) @@ -204,24 +205,24 @@ private static void DrawBookmarkMap(Configuration config, List<Title> playerTitl using (var flatmapMagickImage = new MagickImage(flatmapPath)) { flatmapMagickImage.Scale(2160, 1080); flatmapMagickImage.Crop(1920, 1080); - flatmapMagickImage.Write(tmpFlatmapPath); + await flatmapMagickImage.WriteAsync(tmpFlatmapPath); } - using var bookmarkMapImage = Image.Load(tmpFlatmapPath); + using var bookmarkMapImage = await Image.LoadAsync(tmpFlatmapPath); var mapData = ck3World.MapData; var provDefs = mapData.ProvinceDefinitions; foreach (var playerTitle in playerTitles) { - DrawPlayerTitleOnMap(config, ck3World, playerTitle, mapData, provincesImage, provDefs, bookmarkMapImage); + await DrawPlayerTitleOnMap(config, ck3World, playerTitle, mapData, provincesImage, provDefs, bookmarkMapImage); } var outputPath = Path.Combine("output", config.OutputModName, "gfx/interface/bookmarks/bm_converted.png"); - bookmarkMapImage.SaveAsPng(outputPath); - ResaveImageAsDDS(outputPath); + await bookmarkMapImage.SaveAsPngAsync(outputPath); + await ResaveImageAsDDS(outputPath); } - private static void DrawPlayerTitleOnMap( + private static async Task DrawPlayerTitleOnMap( Configuration config, World ck3World, Title playerTitle, @@ -263,8 +264,8 @@ Image bookmarkMapImage config.OutputModName, $"gfx/interface/bookmarks/bm_converted_bm_converted_{holder.Id}.png" ); - realmHighlightImage.SaveAsPng(highlightPath); - ResaveImageAsDDS(highlightPath); + await realmHighlightImage.SaveAsPngAsync(highlightPath); + await ResaveImageAsDDS(highlightPath); // Add the image on top of blank map image. // Make the realm on map semi-transparent. @@ -322,9 +323,9 @@ private static void InverseTransparent(Image<Rgba32> image, Rgba32 color) { }); } - private static void ResaveImageAsDDS(string imagePath) { + private static async Task ResaveImageAsDDS(string imagePath) { using (var magickImage = new MagickImage(imagePath)) { - magickImage.Write(Path.ChangeExtension(imagePath, ".dds")); + await magickImage.WriteAsync(Path.ChangeExtension(imagePath, ".dds")); } File.Delete(imagePath); } diff --git a/ImperatorToCK3/Outputter/CharacterOutputter.cs b/ImperatorToCK3/Outputter/CharacterOutputter.cs index ead34a853..7dc3d1ecb 100644 --- a/ImperatorToCK3/Outputter/CharacterOutputter.cs +++ b/ImperatorToCK3/Outputter/CharacterOutputter.cs @@ -2,13 +2,14 @@ using commonItems.Serialization; using System.Globalization; using System.IO; +using System.Threading.Tasks; using Character = ImperatorToCK3.CK3.Characters.Character; namespace ImperatorToCK3.Outputter; public static class CharacterOutputter { - public static void OutputCharacter(TextWriter output, Character character, Date conversionDate) { + public static async Task OutputCharacter(TextWriter output, Character character, Date conversionDate) { // Output ID. - output.WriteLine($"{character.Id}={{"); + await output.WriteLineAsync($"{character.Id}={{"); if (character.Dead) { // Don't output traits and attributes of dead characters (not needed). @@ -36,39 +37,39 @@ public static void OutputCharacter(TextWriter output, Character character, Date } // Output history. - output.Write(PDXSerializer.Serialize(character.History, "\t")); + await output.WriteAsync(PDXSerializer.Serialize(character.History, "\t")); - OutputPregnancies(output, character); - OutputPrisoners(output, character, conversionDate); + await OutputPregnancies(output, character); + await OutputPrisoners(output, character, conversionDate); - output.WriteLine("}"); + await output.WriteLineAsync("}"); } - private static void OutputPrisoners(TextWriter output, Character character, Date conversionDate) { + private static async Task OutputPrisoners(TextWriter output, Character character, Date conversionDate) { if (character.PrisonerIds.Count == 0) { return; } - output.WriteLine($"\t{conversionDate}={{"); + await output.WriteLineAsync($"\t{conversionDate}={{"); foreach (var (id, type) in character.PrisonerIds) { - output.WriteLine($"\t\timprison={{target = character:{id} type={type}}}"); + await output.WriteLineAsync($"\t\timprison={{target = character:{id} type={type}}}"); } - output.WriteLine("\t}"); + await output.WriteLineAsync("\t}"); } /// <summary> /// Outputs unborn children if pregnancy has lasted at most 3 months in Imperator /// </summary> - private static void OutputPregnancies( + private static async Task OutputPregnancies( TextWriter output, Character character ) { foreach (var pregnancy in character.Pregnancies) { Date conceptionDate = pregnancy.EstimatedConceptionDate; string fatherReference = $"character:{pregnancy.FatherId}"; - output.Write($"\t{conceptionDate}={{ effect={{ "); - output.Write($"make_pregnant_no_checks={{ father={fatherReference} {(pregnancy.IsBastard ? "known_bastard=yes " : "")}}} "); - output.WriteLine("} }"); + await output.WriteAsync($"\t{conceptionDate}={{ effect={{ "); + await output.WriteAsync($"make_pregnant_no_checks={{ father={fatherReference} {(pregnancy.IsBastard ? "known_bastard=yes " : "")}}} "); + await output.WriteLineAsync("} }"); } } } diff --git a/ImperatorToCK3/Outputter/CharactersOutputter.cs b/ImperatorToCK3/Outputter/CharactersOutputter.cs index f783dac33..e63a59a50 100644 --- a/ImperatorToCK3/Outputter/CharactersOutputter.cs +++ b/ImperatorToCK3/Outputter/CharactersOutputter.cs @@ -6,11 +6,21 @@ using System.Collections.Immutable; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class CharactersOutputter { - public static void OutputCharacters(string outputModName, CharacterCollection characters, Date conversionDate) { + public static async Task OutputEverything(string outputPath, CharacterCollection characters, Date conversionDate, ModFilesystem ck3ModFS) { + await Task.WhenAll( + OutputCharacters(outputPath, characters, conversionDate), + BlankOutHistoricalPortraitModifiers(ck3ModFS, outputPath) + ); + + Logger.IncrementProgress(); + } + + public static async Task OutputCharacters(string outputPath, CharacterCollection characters, Date conversionDate) { Logger.Info("Writing Characters..."); // Portrait modifiers need to be outputted before characters themselves, @@ -18,72 +28,72 @@ public static void OutputCharacters(string outputModName, CharacterCollection ch var charactersWithDNA = characters .Where(c => c.DNA is not null) .ToImmutableList(); - OutputPortraitModifiers(outputModName, charactersWithDNA, conversionDate); + await OutputPortraitModifiers(outputPath, charactersWithDNA, conversionDate); var charactersFromIR = characters.Where(c => c.FromImperator) .OrderBy(c => c.Id).ToImmutableList(); var charactersFromCK3 = characters.Except(charactersFromIR) .OrderBy(c => c.Id).ToImmutableList(); - var pathForCharactersFromIR = $"output/{outputModName}/history/characters/IRToCK3_fromImperator.txt"; - using var output = FileOpeningHelper.OpenWriteWithRetries(pathForCharactersFromIR); + var pathForCharactersFromIR = $"{outputPath}/history/characters/IRToCK3_fromImperator.txt"; + await using var output = FileOpeningHelper.OpenWriteWithRetries(pathForCharactersFromIR); foreach (var character in charactersFromIR) { - CharacterOutputter.OutputCharacter(output, character, conversionDate); + await CharacterOutputter.OutputCharacter(output, character, conversionDate); } - var pathForCharactersFromCK3 = $"output/{outputModName}/history/characters/IRToCK3_fromCK3.txt"; - using var output2 = FileOpeningHelper.OpenWriteWithRetries(pathForCharactersFromCK3, System.Text.Encoding.UTF8); + var pathForCharactersFromCK3 = $"{outputPath}/history/characters/IRToCK3_fromCK3.txt"; + await using var output2 = FileOpeningHelper.OpenWriteWithRetries(pathForCharactersFromCK3, System.Text.Encoding.UTF8); foreach (var character in charactersFromCK3) { - CharacterOutputter.OutputCharacter(output2, character, conversionDate); + await CharacterOutputter.OutputCharacter(output2, character, conversionDate); } - OutputCharactersDNA(outputModName, charactersWithDNA); + await OutputCharactersDNA(outputPath, charactersWithDNA); } - public static void BlankOutHistoricalPortraitModifiers(ModFilesystem ck3ModFS, string outputPath) { + public static async Task BlankOutHistoricalPortraitModifiers(ModFilesystem ck3ModFS, string outputPath) { Logger.Info("Blanking out historical portrait modifiers..."); const string modifiersFilePath = "gfx/portraits/portrait_modifiers/02_all_historical_characters.txt"; if (ck3ModFS.GetActualFileLocation(modifiersFilePath) is not null) { string dummyPath = Path.Combine(outputPath, modifiersFilePath); - using var output = FileOpeningHelper.OpenWriteWithRetries(dummyPath, System.Text.Encoding.UTF8); - output.WriteLine("# Dummy file to blank out historical portrait modifiers from CK3."); + await using var output = FileOpeningHelper.OpenWriteWithRetries(dummyPath, System.Text.Encoding.UTF8); + await output.WriteLineAsync("# Dummy file to blank out historical portrait modifiers from CK3."); } } - private static void OutputCharactersDNA(string outputModName, IEnumerable<Character> charactersWithDNA) { + private static async Task OutputCharactersDNA(string outputPath, IEnumerable<Character> charactersWithDNA) { Logger.Info("Outputting DNA..."); // Dump all into one file. - var path = Path.Combine("output", outputModName, "common/dna_data/IRToCK3_dna_data.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(path, System.Text.Encoding.UTF8); + var path = Path.Combine(outputPath, "common/dna_data/IRToCK3_dna_data.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(path, System.Text.Encoding.UTF8); foreach (var character in charactersWithDNA) { var dna = character.DNA!; - output.WriteLine($"{dna.Id}={{"); - output.WriteLine("\tportrait_info={"); + await output.WriteLineAsync($"{dna.Id}={{"); + await output.WriteLineAsync("\tportrait_info={"); - dna.OutputGenes(output); + await dna.OutputGenes(output); - output.WriteLine("\t}"); - output.WriteLine("\tenabled=yes"); - output.WriteLine("}"); + await output.WriteLineAsync("\t}"); + await output.WriteLineAsync("\tenabled=yes"); + await output.WriteLineAsync("}"); } } - private static void OutputPortraitModifiers(string outputModName, IReadOnlyCollection<Character> charactersWithDNA, Date conversionDate) { + private static async Task OutputPortraitModifiers(string outputPath, IReadOnlyCollection<Character> charactersWithDNA, Date conversionDate) { Logger.Debug("Outputting portrait modifiers..."); // Enforce hairstyles and beards (otherwise CK3 they will only be used on bookmark screen). // https://ck3.paradoxwikis.com/Characters_modding#Changing_appearance_through_scripts - var portraitModifiersOutputPath = Path.Combine("output", outputModName, "gfx/portraits/portrait_modifiers/IRToCK3_portrait_modifiers.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(portraitModifiersOutputPath, System.Text.Encoding.UTF8); + var portraitModifiersOutputPath = Path.Combine(outputPath, "gfx/portraits/portrait_modifiers/IRToCK3_portrait_modifiers.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(portraitModifiersOutputPath, System.Text.Encoding.UTF8); - OutputPortraitModifiersForGene("hairstyles", charactersWithDNA, output, conversionDate); + await OutputPortraitModifiersForGene("hairstyles", charactersWithDNA, output, conversionDate); var malesWithBeards = charactersWithDNA .Where(c => !c.Female && c.DNA!.AccessoryDNAValues.ContainsKey("beards")) .ToImmutableList(); - OutputPortraitModifiersForGene("beards", malesWithBeards, output, conversionDate); + await OutputPortraitModifiersForGene("beards", malesWithBeards, output, conversionDate); } - private static void OutputPortraitModifiersForGene( + private static async Task OutputPortraitModifiersForGene( string geneName, IReadOnlyCollection<Character> charactersWithDNA, TextWriter output, @@ -95,9 +105,9 @@ Date conversionDate c.DNA!.AccessoryDNAValues[geneName].TemplateName, c.DNA!.AccessoryDNAValues[geneName].ObjectName, }); - output.WriteLine($"IRToCK3_{geneName}_overrides = {{"); - output.WriteLine("\tusage = game"); - output.WriteLine("\tselection_behavior = max"); + await output.WriteLineAsync($"IRToCK3_{geneName}_overrides = {{"); + await output.WriteLineAsync("\tusage = game"); + await output.WriteLineAsync("\tselection_behavior = max"); foreach (var grouping in charactersByGeneValue) { var templateName = grouping.Key.TemplateName; var accessoryName = grouping.Key.ObjectName; @@ -110,26 +120,26 @@ Date conversionDate character.History.AddFieldValue(effectDate, "effects", "effect", characterEffectStr); } - output.WriteLine($"\t{templateName}_obj_{accessoryName} = {{"); - output.WriteLine("\t\tdna_modifiers = {"); - output.WriteLine("\t\t\taccessory = {"); - output.WriteLine("\t\t\t\tmode = add"); - output.WriteLine($"\t\t\t\tgene = {geneName}"); - output.WriteLine($"\t\t\t\ttemplate = {templateName}"); - output.WriteLine($"\t\t\t\taccessory = {accessoryName}"); - output.WriteLine("\t\t\t}"); - output.WriteLine("\t\t}"); + await output.WriteLineAsync($"\t{templateName}_obj_{accessoryName} = {{"); + await output.WriteLineAsync("\t\tdna_modifiers = {"); + await output.WriteLineAsync("\t\t\taccessory = {"); + await output.WriteLineAsync("\t\t\t\tmode = add"); + await output.WriteLineAsync($"\t\t\t\tgene = {geneName}"); + await output.WriteLineAsync($"\t\t\t\ttemplate = {templateName}"); + await output.WriteLineAsync($"\t\t\t\taccessory = {accessoryName}"); + await output.WriteLineAsync("\t\t\t}"); + await output.WriteLineAsync("\t\t}"); - output.WriteLine("\t\tweight = {"); - output.WriteLine("\t\t\tbase = 0"); - output.WriteLine("\t\t\tmodifier = {"); - output.WriteLine("\t\t\t\tadd = 999"); - output.WriteLine($"\t\t\t\thas_character_flag = {characterFlagName}"); - output.WriteLine("\t\t\t}"); + await output.WriteLineAsync("\t\tweight = {"); + await output.WriteLineAsync("\t\t\tbase = 0"); + await output.WriteLineAsync("\t\t\tmodifier = {"); + await output.WriteLineAsync("\t\t\t\tadd = 999"); + await output.WriteLineAsync($"\t\t\t\thas_character_flag = {characterFlagName}"); + await output.WriteLineAsync("\t\t\t}"); - output.WriteLine("\t\t}"); - output.WriteLine("\t}"); + await output.WriteLineAsync("\t\t}"); + await output.WriteLineAsync("\t}"); } - output.WriteLine("}"); + await output.WriteLineAsync("}"); } } diff --git a/ImperatorToCK3/Outputter/CoatOfArmsEmblemsOutputter.cs b/ImperatorToCK3/Outputter/CoatOfArmsEmblemsOutputter.cs index 152a2ff8b..36ebfd3f2 100644 --- a/ImperatorToCK3/Outputter/CoatOfArmsEmblemsOutputter.cs +++ b/ImperatorToCK3/Outputter/CoatOfArmsEmblemsOutputter.cs @@ -9,7 +9,7 @@ namespace ImperatorToCK3.Outputter; public static class CoatOfArmsEmblemsOutputter { - private static void ConvertColoredEmblems(Configuration config, ModFilesystem imperatorModFS) { + private static void ConvertColoredEmblems(string outputModPath, ModFilesystem imperatorModFS) { Logger.Info("Converting colored emblems..."); var coloredEmblemsFolder = "gfx/coat_of_arms/colored_emblems"; var acceptedExtensions = new HashSet<string>{ "dds", "tga", "png" }; @@ -31,7 +31,7 @@ void CopyEmblem(string emblemFilePath) { var image = new MagickImage(emblemFilePath); image.Negate(channels: Channels.Red); // Write the image to new file. - var outputPath = Path.Combine("output", config.OutputModName, "gfx/coat_of_arms/colored_emblems", fileName); + var outputPath = Path.Combine(outputModPath, "gfx/coat_of_arms/colored_emblems", fileName); try { image.Write(outputPath); } catch (Exception ex) { @@ -41,7 +41,7 @@ void CopyEmblem(string emblemFilePath) { } } - private static void CopyTexturedEmblems(Configuration config, ModFilesystem imperatorModFS) { + private static void CopyTexturedEmblems(string outputModPath, ModFilesystem imperatorModFS) { Logger.Info("Copying textured emblems..."); const string texturedEmblemsFolder = "gfx/coat_of_arms/textured_emblems"; var acceptedExtensions = new HashSet<string>{ "dds", "tga", "png" }; @@ -54,7 +54,7 @@ private static void CopyTexturedEmblems(Configuration config, ModFilesystem impe // Copy image to output path. var fileName = CommonFunctions.TrimPath(filePath); - var outputPath = Path.Combine("output", config.OutputModName, "gfx/coat_of_arms/textured_emblems", fileName); + var outputPath = Path.Combine(outputModPath, "gfx/coat_of_arms/textured_emblems", fileName); var wasCopied = SystemUtils.TryCopyFile(filePath, outputPath); if (!wasCopied) { Logger.Warn($"Failed to copy textured emblem {fileName}!"); @@ -62,8 +62,10 @@ private static void CopyTexturedEmblems(Configuration config, ModFilesystem impe } } - public static void CopyEmblems(Configuration config, ModFilesystem imperatorModFS) { - ConvertColoredEmblems(config, imperatorModFS); - CopyTexturedEmblems(config, imperatorModFS); + public static async Task CopyEmblems(string outputModPath, ModFilesystem imperatorModFS) { + await Task.WhenAll( + Task.Run(() => ConvertColoredEmblems(outputModPath, imperatorModFS)), + Task.Run(() => CopyTexturedEmblems(outputModPath, imperatorModFS)) + ); } } diff --git a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs index d02fbc0ac..12a165645 100644 --- a/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs +++ b/ImperatorToCK3/Outputter/CoatOfArmsOutputter.cs @@ -6,27 +6,28 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class CoatOfArmsOutputter { - public static void OutputCoas(string outputModName, Title.LandedTitles titles, IEnumerable<Dynasty> dynasties) { + public static async Task OutputCoas(string outputModPath, Title.LandedTitles titles, IEnumerable<Dynasty> dynasties) { Logger.Info("Outputting coats of arms..."); - var coasPath = Path.Combine("output", outputModName, "common", "coat_of_arms", "coat_of_arms"); + var coasPath = Path.Combine(outputModPath, "common", "coat_of_arms", "coat_of_arms"); var path = Path.Combine(coasPath, "zzz_IRToCK3_coas.txt"); - using var coasWriter = new StreamWriter(path); + await using var coasWriter = new StreamWriter(path); // Output CoAs for titles. foreach (var title in titles) { var coa = title.CoA; if (coa is not null) { - coasWriter.WriteLine($"{title.Id}={coa}"); + await coasWriter.WriteLineAsync($"{title.Id}={coa}"); } } // Output CoAs for dynasties. foreach (var dynasty in dynasties.Where(d => d.CoA is not null)) { - coasWriter.WriteLine($"{dynasty.Id}={dynasty.CoA}"); + await coasWriter.WriteLineAsync($"{dynasty.Id}={dynasty.CoA}"); } Logger.IncrementProgress(); diff --git a/ImperatorToCK3/Outputter/CulturesOutputter.cs b/ImperatorToCK3/Outputter/CulturesOutputter.cs index 01a86b21c..73fa862f4 100644 --- a/ImperatorToCK3/Outputter/CulturesOutputter.cs +++ b/ImperatorToCK3/Outputter/CulturesOutputter.cs @@ -3,28 +3,28 @@ using ImperatorToCK3.CK3.Cultures; using ImperatorToCK3.CommonUtils; using System.IO; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class CulturesOutputter { - public static void OutputCultures(string outputModName, CultureCollection cultures, Date date) { + public static async Task OutputCultures(string outputModPath, CultureCollection cultures, Date date) { Logger.Info("Outputting cultures..."); - var outputModPath = Path.Combine("output", outputModName); var outputPath = Path.Combine(outputModPath, "common/culture/cultures/IRtoCK3_all_cultures.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); foreach (var culture in cultures) { - output.WriteLine($"{culture.Id}={PDXSerializer.Serialize(culture)}"); + await output.WriteLineAsync($"{culture.Id}={PDXSerializer.Serialize(culture)}"); } - OutputCultureHistory(outputModPath, cultures, date); + await OutputCultureHistory(outputModPath, cultures, date); } - private static void OutputCultureHistory(string outputModPath, CultureCollection cultures, Date date) { + private static async Task OutputCultureHistory(string outputModPath, CultureCollection cultures, Date date) { Logger.Info("Outputting cultures history..."); foreach (var culture in cultures) { - culture.OutputHistory(outputModPath, date); + await culture.OutputHistory(outputModPath, date); } } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/DynastiesOutputter.cs b/ImperatorToCK3/Outputter/DynastiesOutputter.cs index 4cfb0384d..35a996c64 100644 --- a/ImperatorToCK3/Outputter/DynastiesOutputter.cs +++ b/ImperatorToCK3/Outputter/DynastiesOutputter.cs @@ -5,27 +5,37 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class DynastiesOutputter { - public static void OutputDynasties(string outputModPath, DynastyCollection dynasties) { + public static async Task OutputDynasties(string outputModPath, DynastyCollection dynasties) { Logger.Info("Writing dynasties..."); var outputPath = Path.Combine(outputModPath, "common/dynasties/irtock3_all_dynasties.txt"); - - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, encoding: Encoding.UTF8); + + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, encoding: Encoding.UTF8); foreach (var dynasty in dynasties.OrderBy(d => d.Id)) { - output.WriteLine($"{dynasty.Id}={PDXSerializer.Serialize(dynasty, string.Empty)}"); + await output.WriteLineAsync($"{dynasty.Id}={PDXSerializer.Serialize(dynasty, string.Empty)}"); } } - public static void OutputHouses(string outputModPath, HouseCollection houses) { + public static async Task OutputHouses(string outputModPath, HouseCollection houses) { Logger.Info("Writing dynasty houses..."); var outputPath = Path.Combine(outputModPath, "common/dynasty_houses/irtock3_all_houses.txt"); - - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, encoding: Encoding.UTF8); + + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, encoding: Encoding.UTF8); foreach (var house in houses.OrderBy(h => h.Id)) { - output.WriteLine($"{house.Id}={PDXSerializer.Serialize(house, string.Empty)}"); + await output.WriteLineAsync($"{house.Id}={PDXSerializer.Serialize(house, string.Empty)}"); } } + + public static async Task OutputDynastiesAndHouses(string outputModPath, DynastyCollection dynasties, HouseCollection houses) { + await Task.WhenAll( + OutputDynasties(outputModPath, dynasties), + Task.Run(() => OutputHouses(outputModPath, houses)) + ); + + Logger.IncrementProgress(); + } } diff --git a/ImperatorToCK3/Outputter/LocalizationOutputter.cs b/ImperatorToCK3/Outputter/LocalizationOutputter.cs index 16a9315d6..f09692db2 100644 --- a/ImperatorToCK3/Outputter/LocalizationOutputter.cs +++ b/ImperatorToCK3/Outputter/LocalizationOutputter.cs @@ -5,24 +5,25 @@ using ImperatorToCK3.CommonUtils; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class LocalizationOutputter { - public static void OutputLocalization(string outputName, World ck3World) { - var outputPath = Path.Combine("output", outputName); - var baseLocDir = Path.Join(outputPath, "localization"); + public static async Task OutputLocalization(string outputModPath, World ck3World) { + Logger.Info("Writing Localization..."); + var baseLocDir = Path.Join(outputModPath, "localization"); var baseReplaceLocDir = Path.Join(baseLocDir, "replace"); foreach (var language in ConverterGlobals.SupportedLanguages) { var locFilePath = Path.Join(baseReplaceLocDir, language, $"converter_l_{language}.yml"); - using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, encoding: System.Text.Encoding.UTF8); + await using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, encoding: System.Text.Encoding.UTF8); - locWriter.WriteLine($"l_{language}:"); + await locWriter.WriteLineAsync($"l_{language}:"); // title localization foreach (var title in ck3World.LandedTitles) { foreach (var locBlock in title.Localizations) { - locWriter.WriteLine(locBlock.GetYmlLocLineForLanguage(language)); + await locWriter.WriteLineAsync(locBlock.GetYmlLocLineForLanguage(language)); } } @@ -34,7 +35,7 @@ public static void OutputLocalization(string outputName, World ck3World) { continue; } - locWriter.WriteLine(locBlock.GetYmlLocLineForLanguage(language)); + await locWriter.WriteLineAsync(locBlock.GetYmlLocLineForLanguage(language)); uniqueKeys.Add(key); } } @@ -43,25 +44,27 @@ public static void OutputLocalization(string outputName, World ck3World) { // dynasty localization foreach (var language in ConverterGlobals.SupportedLanguages) { var dynastyLocFilePath = Path.Combine(baseLocDir, $"{language}/irtock3_dynasty_l_{language}.yml"); - using var dynastyLocWriter = FileOpeningHelper.OpenWriteWithRetries(dynastyLocFilePath, System.Text.Encoding.UTF8); + await using var dynastyLocWriter = FileOpeningHelper.OpenWriteWithRetries(dynastyLocFilePath, System.Text.Encoding.UTF8); - dynastyLocWriter.WriteLine($"l_{language}:"); + await dynastyLocWriter.WriteLineAsync($"l_{language}:"); foreach (var dynasty in ck3World.Dynasties) { var localizedName = dynasty.LocalizedName; if (localizedName is not null) { - dynastyLocWriter.WriteLine(localizedName.GetYmlLocLineForLanguage(language)); + await dynastyLocWriter.WriteLineAsync(localizedName.GetYmlLocLineForLanguage(language)); } else if (dynasty.FromImperator) { Logger.Warn($"Dynasty {dynasty.Id} has no localizations!"); - dynastyLocWriter.WriteLine($" {dynasty.Name}: \"{dynasty.Name}\""); + await dynastyLocWriter.WriteLineAsync($" {dynasty.Name}: \"{dynasty.Name}\""); } } } - OutputFallbackLocForMissingSecondaryLanguageLoc(baseLocDir, ck3World.ModFS); + await OutputFallbackLocForMissingSecondaryLanguageLoc(baseLocDir, ck3World.ModFS); + + Logger.IncrementProgress(); } - private static void OutputFallbackLocForMissingSecondaryLanguageLoc(string baseLocDir, ModFilesystem ck3ModFS) { + private static async Task OutputFallbackLocForMissingSecondaryLanguageLoc(string baseLocDir, ModFilesystem ck3ModFS) { var primaryLanguage = ConverterGlobals.PrimaryLanguage; var secondaryLanguages = ConverterGlobals.SecondaryLanguages; @@ -103,11 +106,11 @@ private static void OutputFallbackLocForMissingSecondaryLanguageLoc(string baseL Logger.Debug($"Outputting {linesToOutput.Count} fallback loc lines for {language}..."); var locFilePath = Path.Combine(baseLocDir, $"{language}/irtock3_fallback_loc_l_{language}.yml"); - using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, System.Text.Encoding.UTF8); + await using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locFilePath, System.Text.Encoding.UTF8); - locWriter.WriteLine($"l_{language}:"); + await locWriter.WriteLineAsync($"l_{language}:"); foreach (var line in linesToOutput) { - locWriter.WriteLine(line); + await locWriter.WriteLineAsync(line); } } } diff --git a/ImperatorToCK3/Outputter/NamedColorsOutputter.cs b/ImperatorToCK3/Outputter/NamedColorsOutputter.cs index 80fe9244a..e5dcd0957 100644 --- a/ImperatorToCK3/Outputter/NamedColorsOutputter.cs +++ b/ImperatorToCK3/Outputter/NamedColorsOutputter.cs @@ -3,6 +3,7 @@ using ImperatorToCK3.CommonUtils; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; @@ -10,10 +11,10 @@ public static class NamedColorsOutputter { /// <summary> /// Outputs named colors that exist in <paramref name="imperatorNamedColors"/> but not in <paramref name="ck3NamedColors"/>. /// </summary> - /// <param name="outputModName"></param> + /// <param name="outputModPath"></param> /// <param name="imperatorNamedColors"></param> /// <param name="ck3NamedColors"></param> - public static void OutputNamedColors(string outputModName, NamedColorCollection imperatorNamedColors, NamedColorCollection ck3NamedColors) { + public static async Task OutputNamedColors(string outputModPath, NamedColorCollection imperatorNamedColors, NamedColorCollection ck3NamedColors) { var diff = imperatorNamedColors.Where(colorPair => !ck3NamedColors.ContainsKey(colorPair.Key)) .ToList(); if (diff.Count == 0) { @@ -22,14 +23,14 @@ public static void OutputNamedColors(string outputModName, NamedColorCollection Logger.Info("Outputting named colors from Imperator game and mods..."); - var outputPath = Path.Combine("output", outputModName, "common", "named_colors", "IRtoCK3_colors_from_Imperator.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + var outputPath = Path.Combine(outputModPath, "common", "named_colors", "IRtoCK3_colors_from_Imperator.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); - output.WriteLine("colors = {"); + await output.WriteLineAsync("colors = {"); foreach (var (name, color) in diff) { - output.WriteLine($"\t{name}={color.OutputRgb()}"); + await output.WriteLineAsync($"\t{name}={color.OutputRgb()}"); } - output.WriteLine("}"); + await output.WriteLineAsync("}"); Logger.IncrementProgress(); } diff --git a/ImperatorToCK3/Outputter/OnActionOutputter.cs b/ImperatorToCK3/Outputter/OnActionOutputter.cs index f5bd8c67d..0a726f6ee 100644 --- a/ImperatorToCK3/Outputter/OnActionOutputter.cs +++ b/ImperatorToCK3/Outputter/OnActionOutputter.cs @@ -4,72 +4,84 @@ using ImperatorToCK3.CommonUtils; using System.IO; using System.Text; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class OnActionOutputter { - public static void OutputCustomGameStartOnAction(Configuration config) { + public static async Task OutputEverything(Configuration config, ModFilesystem ck3ModFS, string outputModPath){ + await OutputCustomGameStartOnAction(config); + if (config.FallenEagleEnabled) { + await DisableUnneededFallenEagleOnActions(outputModPath); + await RemoveStruggleStartFromFallenEagleOnActions(ck3ModFS, outputModPath); + } + Logger.IncrementProgress(); + } + + public static async Task OutputCustomGameStartOnAction(Configuration config) { + Logger.Info("Writing game start on-action..."); var filePath = $"output/{config.OutputModName}/common/on_action/IRToCK3_game_start.txt"; - using var writer = new StreamWriter(filePath, false, new UTF8Encoding(true)); + await using var writer = new StreamWriter(filePath, false, new UTF8Encoding(true)); const string customOnGameStartOnAction = "irtock3_on_game_start_after_lobby"; - writer.WriteLine("on_game_start_after_lobby = {"); - writer.WriteLine($"\ton_actions = {{ {customOnGameStartOnAction } }}"); - writer.WriteLine("}"); + await writer.WriteLineAsync("on_game_start_after_lobby = {"); + await writer.WriteLineAsync($"\ton_actions = {{ {customOnGameStartOnAction } }}"); + await writer.WriteLineAsync("}"); - writer.WriteLine($"{customOnGameStartOnAction} = {{"); - writer.WriteLine("\teffect = {"); + await writer.WriteLineAsync($"{customOnGameStartOnAction} = {{"); + await writer.WriteLineAsync("\teffect = {"); if (config.LegionConversion == LegionConversion.MenAtArms) { - writer.WriteLine(""" - # IRToCK3: add MAA regiments - random_player = { - trigger_event = irtock3_hidden_events.0001 - } - """); + await writer.WriteLineAsync(""" + # IRToCK3: add MAA regiments + random_player = { + trigger_event = irtock3_hidden_events.0001 + } + """); } if (config.LegionConversion == LegionConversion.MenAtArms) { - writer.WriteLine("\t\tset_global_variable = IRToCK3_create_maa_flag"); + await writer.WriteLineAsync("\t\tset_global_variable = IRToCK3_create_maa_flag"); } if (config.FallenEagleEnabled) { // As of the "Last of the Romans" update, TFE only disables Nicene for start dates >= 476.9.4. // But for the converter it's important that Nicene is disabled for all start dates >= 451.8.25. - writer.WriteLine(""" - # IRToCK3: disable Nicene after the Council of Chalcedon. - if = { - limit = { - game_start_date >= 451.8.25 - } - faith:armenian_apostolic = { - remove_doctrine = unavailable_doctrine - } - faith:nestorian = { - remove_doctrine = unavailable_doctrine - } - faith:coptic = { - remove_doctrine = unavailable_doctrine - } - faith:syriac = { - remove_doctrine = unavailable_doctrine - } - faith:chalcedonian = { - remove_doctrine = unavailable_doctrine - } - faith:nicene = { - add_doctrine = unavailable_doctrine - } - } - """); + await writer.WriteLineAsync(""" + # IRToCK3: disable Nicene after the Council of Chalcedon. + if = { + limit = { + game_start_date >= 451.8.25 + } + faith:armenian_apostolic = { + remove_doctrine = unavailable_doctrine + } + faith:nestorian = { + remove_doctrine = unavailable_doctrine + } + faith:coptic = { + remove_doctrine = unavailable_doctrine + } + faith:syriac = { + remove_doctrine = unavailable_doctrine + } + faith:chalcedonian = { + remove_doctrine = unavailable_doctrine + } + faith:nicene = { + add_doctrine = unavailable_doctrine + } + } + """); } - writer.WriteLine("\t}"); - writer.WriteLine("}"); + await writer.WriteLineAsync("\t}"); + await writer.WriteLineAsync("}"); } - - public static void DisableUnneededFallenEagleOnActions(string outputModName) { + + private static async Task DisableUnneededFallenEagleOnActions(string outputModPath) { + Logger.Info("Disabling unneeded Fallen Eagle on-actions..."); var onActionsToDisable = new OrderedSet<string> { "sea_minority_game_start.txt", "sevenhouses_on_actions.txt", @@ -82,19 +94,20 @@ public static void DisableUnneededFallenEagleOnActions(string outputModName) { "roman_vicar_positions_on_actions.txt", }; foreach (var filename in onActionsToDisable) { - var filePath = $"output/{outputModName}/common/on_action/{filename}"; - using var writer = new StreamWriter(filePath, append: false, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)); - writer.WriteLine("# disabled by IRToCK3"); + var filePath = $"{outputModPath}/common/on_action/{filename}"; + await using var writer = new StreamWriter(filePath, append: false, new UTF8Encoding(encoderShouldEmitUTF8Identifier: true)); + await writer.WriteLineAsync("# disabled by IRToCK3"); } } - public static void RemoveStruggleStartFromFallenEagleOnActions(ModFilesystem ck3ModFS, string outputModName) { + private static async Task RemoveStruggleStartFromFallenEagleOnActions(ModFilesystem ck3ModFS, string outputModPath) { + Logger.Info("Removing struggle start from Fallen Eagle on-actions..."); var inputPath = ck3ModFS.GetActualFileLocation("common/on_action/TFE_game_start.txt"); if (!File.Exists(inputPath)) { Logger.Debug("TFE_game_start.txt not found."); return; } - var fileContent = File.ReadAllText(inputPath); + var fileContent = await File.ReadAllTextAsync(inputPath); // List of blocks to remove as of 2024-01-07. string[] struggleStartBlocksToRemove = [ @@ -135,8 +148,8 @@ public static void RemoveStruggleStartFromFallenEagleOnActions(ModFilesystem ck3 fileContent = fileContent.Replace(block, ""); } - var outputPath = $"output/{outputModName}/common/on_action/TFE_game_start.txt"; - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath); - output.Write(fileContent); + var outputPath = $"{outputModPath}/common/on_action/TFE_game_start.txt"; + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath); + await output.WriteAsync(fileContent); } } diff --git a/ImperatorToCK3/Outputter/PillarOutputter.cs b/ImperatorToCK3/Outputter/PillarOutputter.cs index c87600744..347cd5bf1 100644 --- a/ImperatorToCK3/Outputter/PillarOutputter.cs +++ b/ImperatorToCK3/Outputter/PillarOutputter.cs @@ -3,17 +3,18 @@ using ImperatorToCK3.CK3.Cultures; using ImperatorToCK3.CommonUtils; using System.IO; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class PillarOutputter { - public static void OutputPillars(string outputModName, PillarCollection pillars) { + public static async Task OutputPillars(string outputPath, PillarCollection pillars) { Logger.Info("Outputting pillars..."); - var outputPath = Path.Combine("output", outputModName, "common/culture/pillars/IRtoCK3_all_pillars.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + var outputFilePath = Path.Combine(outputPath, "common/culture/pillars/IRtoCK3_all_pillars.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputFilePath, System.Text.Encoding.UTF8); foreach (var pillar in pillars) { - output.WriteLine($"{pillar.Id}={PDXSerializer.Serialize(pillar)}"); + await output.WriteLineAsync($"{pillar.Id}={PDXSerializer.Serialize(pillar)}"); } } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/ProvincesOutputter.cs b/ImperatorToCK3/Outputter/ProvincesOutputter.cs index 9d68acbfa..0b7f66927 100644 --- a/ImperatorToCK3/Outputter/ProvincesOutputter.cs +++ b/ImperatorToCK3/Outputter/ProvincesOutputter.cs @@ -1,4 +1,5 @@ -using ImperatorToCK3.CK3.Provinces; +using commonItems; +using ImperatorToCK3.CK3.Provinces; using ImperatorToCK3.CK3.Titles; using ImperatorToCK3.CommonUtils; using Open.Collections; @@ -8,17 +9,19 @@ namespace ImperatorToCK3.Outputter; public static class ProvincesOutputter { - public static void OutputProvinces( - string outputModName, + public static async Task OutputProvinces( + string outputModPath, ProvinceCollection provinces, Title.LandedTitles titles ) { + Logger.Info("Writing provinces..."); + // Output provinces to files named after their de jure kingdoms. var alreadyOutputtedProvinces = new ConcurrentHashSet<ulong>(); var deJureKingdoms = titles.GetDeJureKingdoms(); Parallel.ForEach(deJureKingdoms, kingdom => { - var filePath = $"output/{outputModName}/history/provinces/{kingdom.Id}.txt"; + var filePath = $"{outputModPath}/history/provinces/{kingdom.Id}.txt"; using var historyOutput = new StreamWriter(filePath); foreach (var province in provinces) { if (kingdom.KingdomContainsProvince(province.Id)) { @@ -29,8 +32,8 @@ Title.LandedTitles titles }); if (alreadyOutputtedProvinces.Count != provinces.Count) { - var filePath = $"output/{outputModName}/history/provinces/onlyDeJureDuchy.txt"; - using var historyOutput = TextWriter.Synchronized(new StreamWriter(filePath)); + var filePath = $"{outputModPath}/history/provinces/onlyDeJureDuchy.txt"; + await using var historyOutput = TextWriter.Synchronized(new StreamWriter(filePath)); var deJureDuchies = titles.GetDeJureDuchies(); Parallel.ForEach(deJureDuchies, duchy => { foreach (var province in provinces) { @@ -49,9 +52,9 @@ Title.LandedTitles titles // Create province mapping file. if (alreadyOutputtedProvinces.Count != provinces.Count) { - var mappingsPath = $"output/{outputModName}/history/province_mapping/province_mapping.txt"; - using var mappingsWriter = FileOpeningHelper.OpenWriteWithRetries(mappingsPath, System.Text.Encoding.UTF8); - using var threadSafeWriter = TextWriter.Synchronized(mappingsWriter); + var mappingsPath = $"{outputModPath}/history/province_mapping/province_mapping.txt"; + await using var mappingsWriter = FileOpeningHelper.OpenWriteWithRetries(mappingsPath, System.Text.Encoding.UTF8); + await using var threadSafeWriter = TextWriter.Synchronized(mappingsWriter); foreach (var province in provinces) { if (alreadyOutputtedProvinces.Contains(province.Id)) { @@ -63,9 +66,11 @@ Title.LandedTitles titles continue; } - threadSafeWriter.WriteLine($"{province.Id} = {baseProvId}"); + await threadSafeWriter.WriteLineAsync($"{province.Id} = {baseProvId}"); alreadyOutputtedProvinces.Add(province.Id); } } + + Logger.IncrementProgress(); } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/ReligionsOutputter.cs b/ImperatorToCK3/Outputter/ReligionsOutputter.cs index aa233a500..3ee0bf0f7 100644 --- a/ImperatorToCK3/Outputter/ReligionsOutputter.cs +++ b/ImperatorToCK3/Outputter/ReligionsOutputter.cs @@ -4,53 +4,62 @@ using ImperatorToCK3.CommonUtils; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class ReligionsOutputter { - public static void OutputHolySites(string outputModName, ReligionCollection ck3ReligionCollection) { + public static async Task OutputReligionsAndHolySites(string outputModPath, ReligionCollection ck3ReligionCollection) { + await Task.WhenAll( + OutputHolySites(outputModPath, ck3ReligionCollection), + OutputReligions(outputModPath, ck3ReligionCollection) + ); + Logger.IncrementProgress(); + } + + private static async Task OutputHolySites(string outputModPath, ReligionCollection ck3ReligionCollection) { Logger.Info("Writing holy sites..."); - var outputPath = Path.Combine("output", outputModName, "common/religion/holy_sites/IRtoCK3_sites.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + var outputPath = Path.Combine(outputModPath, "common/religion/holy_sites/IRtoCK3_sites.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); var sitesToOutput = ck3ReligionCollection.HolySites.Where(s => s.IsGeneratedByConverter) .ToList(); foreach (var site in sitesToOutput) { - output.WriteLine($"{site.Id}={PDXSerializer.Serialize(site)}"); + await output.WriteLineAsync($"{site.Id}={PDXSerializer.Serialize(site)}"); } // Output localization. foreach (string language in ConverterGlobals.SupportedLanguages) { - var locOutputPath = Path.Combine("output", outputModName, $"localization/{language}/IRtoCK3_holy_sites_l_{language}.yml"); - using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locOutputPath, System.Text.Encoding.UTF8); + var locOutputPath = Path.Combine(outputModPath, $"localization/{language}/IRtoCK3_holy_sites_l_{language}.yml"); + await using var locWriter = FileOpeningHelper.OpenWriteWithRetries(locOutputPath, System.Text.Encoding.UTF8); - locWriter.WriteLine($"l_{language}:"); + await locWriter.WriteLineAsync($"l_{language}:"); foreach (var site in sitesToOutput) { // holy site name var holySiteTitle = site.BaronyId ?? site.CountyId; if (holySiteTitle is not null) { string holySiteNameLocLine = $" holy_site_{site.Id}_name: \"${holySiteTitle}$\""; - locWriter.WriteLine(holySiteNameLocLine); + await locWriter.WriteLineAsync(holySiteNameLocLine); } else { - locWriter.WriteLine($" holy_site_{site.Id}_name: \"Holy site\""); // fallback + await locWriter.WriteLineAsync($" holy_site_{site.Id}_name: \"Holy site\""); // fallback } // holy site effect name string holySiteEffectLocLine = $" holy_site_{site.Id}_effect_name: \"From [holy_site|E] #weak ($holy_site_{site.Id}_name$)#!\""; - locWriter.WriteLine(holySiteEffectLocLine); + await locWriter.WriteLineAsync(holySiteEffectLocLine); } } } - public static void OutputReligions(string outputModName, ReligionCollection ck3ReligionCollection) { + private static async Task OutputReligions(string outputModPath, ReligionCollection ck3ReligionCollection) { Logger.Info("Writing religions..."); - var outputPath = Path.Combine("output", outputModName, "common/religion/religions/IRtoCK3_all_religions.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + var outputPath = Path.Combine(outputModPath, "common/religion/religions/IRtoCK3_all_religions.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); foreach (var religion in ck3ReligionCollection) { - output.WriteLine($"{religion.Id}={PDXSerializer.Serialize(religion)}"); + await output.WriteLineAsync($"{religion.Id}={PDXSerializer.Serialize(religion)}"); } } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/SuccessionTriggersOutputter.cs b/ImperatorToCK3/Outputter/SuccessionTriggersOutputter.cs index 98c5a42a7..3ce6c4099 100644 --- a/ImperatorToCK3/Outputter/SuccessionTriggersOutputter.cs +++ b/ImperatorToCK3/Outputter/SuccessionTriggersOutputter.cs @@ -3,13 +3,16 @@ using ImperatorToCK3.CommonUtils; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class SuccessionTriggersOutputter { - public static void OutputSuccessionTriggers(string outputModName, Title.LandedTitles landedTitles, Date ck3BookmarkDate) { - var outputPath = Path.Combine("output", outputModName, "common", "scripted_triggers", "IRToCK3_succession_triggers.txt"); + public static async Task OutputSuccessionTriggers(string outputModPath, Title.LandedTitles landedTitles, Date ck3BookmarkDate) { + Logger.Info("Writing Succession Triggers..."); + + var outputPath = Path.Combine(outputModPath, "common/scripted_triggers/IRToCK3_succession_triggers.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); var primogenitureTitles = new List<string>(); var seniorityTitles = new List<string>(); @@ -28,20 +31,22 @@ public static void OutputSuccessionTriggers(string outputModName, Title.LandedTi } } - output.WriteLine("historical_succession_access_single_heir_succession_law_trigger={"); - output.WriteLine("\tOR={"); + await output.WriteLineAsync("historical_succession_access_single_heir_succession_law_trigger={"); + await output.WriteLineAsync("\tOR={"); foreach (var primogenitureTitle in primogenitureTitles) { - output.WriteLine($"\t\thas_title=title:{primogenitureTitle}"); + await output.WriteLineAsync($"\t\thas_title=title:{primogenitureTitle}"); } - output.WriteLine("\t}"); - output.WriteLine("}"); + await output.WriteLineAsync("\t}"); + await output.WriteLineAsync("}"); - output.WriteLine("historical_succession_access_single_heir_dynasty_house_trigger={"); - output.WriteLine("\tOR={"); + await output.WriteLineAsync("historical_succession_access_single_heir_dynasty_house_trigger={"); + await output.WriteLineAsync("\tOR={"); foreach (var seniorityTitle in seniorityTitles) { - output.WriteLine($"\t\thas_title=title:{seniorityTitle}"); + await output.WriteLineAsync($"\t\thas_title=title:{seniorityTitle}"); } - output.WriteLine("\t}"); - output.WriteLine("}"); + await output.WriteLineAsync("\t}"); + await output.WriteLineAsync("}"); + + Logger.IncrementProgress(); } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/TitlesOutputter.cs b/ImperatorToCK3/Outputter/TitlesOutputter.cs index 4ca52c442..891ea9c0d 100644 --- a/ImperatorToCK3/Outputter/TitlesOutputter.cs +++ b/ImperatorToCK3/Outputter/TitlesOutputter.cs @@ -1,13 +1,15 @@ -using commonItems.Serialization; +using commonItems; +using commonItems.Serialization; using ImperatorToCK3.CK3.Titles; using ImperatorToCK3.CommonUtils; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class TitlesOutputter { - private static void OutputTitlesHistory(string outputModName, Title.LandedTitles titles) { + private static async Task OutputTitlesHistory(string outputModPath, Title.LandedTitles titles) { //output title history var alreadyOutputtedTitles = new HashSet<string>(); foreach (var title in titles) { @@ -18,43 +20,45 @@ private static void OutputTitlesHistory(string outputModName, Title.LandedTitles 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); + var historyOutputPath = Path.Combine(outputModPath, "history", "titles", $"{title.Id}.txt"); + await using var historyOutput = new StreamWriter(historyOutputPath); // output the kingdom's history + await 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); + await deJureVassal.OutputHistory(historyOutput); alreadyOutputtedTitles.Add(deJureVassalName); } } - var otherTitlesPath = Path.Combine("output", outputModName, "history", "titles", "00_other_titles.txt"); - using (var historyOutput = new StreamWriter(otherTitlesPath)) { + var otherTitlesPath = Path.Combine(outputModPath, "history", "titles", "00_other_titles.txt"); + await using (var historyOutput = new StreamWriter(otherTitlesPath)) { foreach (var title in titles) { // output the remaining titles if (alreadyOutputtedTitles.Contains(title.Id)) { continue; } - title.OutputHistory(historyOutput); + await title.OutputHistory(historyOutput); alreadyOutputtedTitles.Add(title.Id); } } } - public static void OutputTitles(string outputModName, Title.LandedTitles titles) { - var outputPath = Path.Combine("output", outputModName, "common", "landed_titles", "00_landed_titles.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); + public static async Task OutputTitles(string outputModPath, Title.LandedTitles titles) { + Logger.Info("Writing Landed Titles..."); + var outputPath = Path.Combine(outputModPath, "common/landed_titles/00_landed_titles.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(outputPath, System.Text.Encoding.UTF8); foreach (var (name, value) in titles.Variables) { - output.WriteLine($"@{name}={value}"); + await output.WriteLineAsync($"@{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)); + await output.WriteAsync(PDXSerializer.Serialize(topDeJureTitles, string.Empty, false)); - OutputTitlesHistory(outputModName, titles); + await OutputTitlesHistory(outputModPath, titles); + Logger.IncrementProgress(); } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/WarsOutputter.cs b/ImperatorToCK3/Outputter/WarsOutputter.cs index dddecf163..05f6d09db 100644 --- a/ImperatorToCK3/Outputter/WarsOutputter.cs +++ b/ImperatorToCK3/Outputter/WarsOutputter.cs @@ -4,33 +4,34 @@ using System.Text; using ImperatorToCK3.CK3.Wars; using ImperatorToCK3.CommonUtils; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; public static class WarsOutputter { - public static void OutputWars(string outputModName, IEnumerable<War> wars) { + public static async Task OutputWars(string outputModPath, IEnumerable<War> wars) { Logger.Info("Writing wars..."); // dumping all into one file - var path = Path.Combine("output",outputModName, "history/wars/00_wars.txt"); - using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); + var path = Path.Combine(outputModPath, "history/wars/00_wars.txt"); + await using var output = FileOpeningHelper.OpenWriteWithRetries(path, Encoding.UTF8); foreach (var war in wars) { - OutputWar(output, war); + await OutputWar(output, war); } Logger.IncrementProgress(); } - private static void OutputWar(TextWriter output, War war) { - output.WriteLine("war = {"); + private static async Task OutputWar(TextWriter output, War war) { + await output.WriteLineAsync("war = {"); - output.WriteLine($"\tstart_date = {war.StartDate}"); - output.WriteLine($"\tend_date = {war.EndDate}"); - output.WriteLine($"\ttargeted_titles={{ {string.Join(' ', war.TargetedTitles)} }}"); + await output.WriteLineAsync($"\tstart_date = {war.StartDate}"); + await output.WriteLineAsync($"\tend_date = {war.EndDate}"); + await output.WriteLineAsync($"\ttargeted_titles={{ {string.Join(' ', war.TargetedTitles)} }}"); if (war.CasusBelli is not null) { - output.WriteLine($"\tcasus_belli = {war.CasusBelli}"); + await output.WriteLineAsync($"\tcasus_belli = {war.CasusBelli}"); } - output.WriteLine($"\tattackers={{ {string.Join(' ', war.Attackers)} }}"); - output.WriteLine($"\tdefenders={{ {string.Join(' ', war.Defenders)} }}"); - output.WriteLine($"\tclaimant = {war.Claimant}"); + await output.WriteLineAsync($"\tattackers={{ {string.Join(' ', war.Attackers)} }}"); + await output.WriteLineAsync($"\tdefenders={{ {string.Join(' ', war.Defenders)} }}"); + await output.WriteLineAsync($"\tclaimant = {war.Claimant}"); - output.WriteLine("}"); + await output.WriteLineAsync("}"); } } \ No newline at end of file diff --git a/ImperatorToCK3/Outputter/WorldOutputter.cs b/ImperatorToCK3/Outputter/WorldOutputter.cs index 95c6c4885..b865ee96f 100644 --- a/ImperatorToCK3/Outputter/WorldOutputter.cs +++ b/ImperatorToCK3/Outputter/WorldOutputter.cs @@ -8,6 +8,7 @@ using System.IO; using System.Text; using System.Threading; +using System.Threading.Tasks; namespace ImperatorToCK3.Outputter; @@ -18,91 +19,62 @@ public static void OutputWorld(World ck3World, Imperator.World imperatorWorld, C var outputName = config.OutputModName; var outputPath = Path.Combine("output", config.OutputModName); - CreateModFolder(outputName); + CreateModFolder(outputPath); OutputModFile(outputName); - CreateFolders(outputName); - Logger.IncrementProgress(); - - CharactersOutputter.OutputCharacters(outputName, ck3World.Characters, ck3World.CorrectedDate); - CharactersOutputter.BlankOutHistoricalPortraitModifiers(ck3World.ModFS, outputPath); - Logger.IncrementProgress(); - - DynastiesOutputter.OutputDynasties(outputPath, ck3World.Dynasties); - DynastiesOutputter.OutputHouses(outputPath, ck3World.DynastyHouses); - Logger.IncrementProgress(); - - Logger.Info("Writing provinces..."); - ProvincesOutputter.OutputProvinces(outputName, ck3World.Provinces, ck3World.LandedTitles); - Logger.IncrementProgress(); - - Logger.Info("Writing Landed Titles..."); - TitlesOutputter.OutputTitles( - outputName, - ck3World.LandedTitles - ); - Logger.IncrementProgress(); - - PillarOutputter.OutputPillars(outputName, ck3World.CulturalPillars); - CulturesOutputter.OutputCultures(outputName, ck3World.Cultures, ck3World.CorrectedDate); - - ReligionsOutputter.OutputHolySites(outputName, ck3World.Religions); - ReligionsOutputter.OutputReligions(outputName, ck3World.Religions); - Logger.IncrementProgress(); - - WarsOutputter.OutputWars(outputName, ck3World.Wars); - - Logger.Info("Writing Succession Triggers..."); - SuccessionTriggersOutputter.OutputSuccessionTriggers(outputName, ck3World.LandedTitles, config.CK3BookmarkDate); - Logger.IncrementProgress(); + CreateFolders(outputPath); - Logger.Info("Writing Localization..."); - LocalizationOutputter.OutputLocalization(outputName, - ck3World + CopyBlankModFilesToOutput(outputPath); + + Task.WaitAll( + CharactersOutputter.OutputEverything(outputPath, ck3World.Characters, ck3World.CorrectedDate, ck3World.ModFS), + DynastiesOutputter.OutputDynastiesAndHouses(outputPath, ck3World.Dynasties, ck3World.DynastyHouses), + + ProvincesOutputter.OutputProvinces(outputPath, ck3World.Provinces, ck3World.LandedTitles), + TitlesOutputter.OutputTitles(outputPath, ck3World.LandedTitles), + + PillarOutputter.OutputPillars(outputPath, ck3World.CulturalPillars), + CulturesOutputter.OutputCultures(outputPath, ck3World.Cultures, ck3World.CorrectedDate), + + ReligionsOutputter.OutputReligionsAndHolySites(outputPath, ck3World.Religions), + + WarsOutputter.OutputWars(outputPath, ck3World.Wars), + + SuccessionTriggersOutputter.OutputSuccessionTriggers(outputPath, ck3World.LandedTitles, config.CK3BookmarkDate), + + LocalizationOutputter.OutputLocalization(outputPath, ck3World), + + OnActionOutputter.OutputEverything(config, ck3World.ModFS, outputPath), + + WriteDummyStruggleHistory(outputPath), + OutputLegendSeeds(outputPath, ck3World.LegendSeeds), + + NamedColorsOutputter.OutputNamedColors(outputPath, imperatorWorld.NamedColors, ck3World.NamedColors), + + CoatOfArmsEmblemsOutputter.CopyEmblems(outputPath, imperatorWorld.ModFS), + CoatOfArmsOutputter.OutputCoas(outputPath, ck3World.LandedTitles, ck3World.Dynasties), + Task.Run(() => CoatOfArmsOutputter.CopyCoaPatterns(imperatorWorld.ModFS, outputPath)), + + BookmarkOutputter.OutputBookmark(ck3World, config) ); - Logger.IncrementProgress(); - - Logger.Info("Writing game start on-action..."); - OnActionOutputter.OutputCustomGameStartOnAction(config); - if (config.FallenEagleEnabled) { - Logger.Info("Disabling unneeded Fallen Eagle on-actions..."); - OnActionOutputter.DisableUnneededFallenEagleOnActions(config.OutputModName); - - Logger.Info("Removing struggle start from Fallen Eagle on-actions..."); - OnActionOutputter.RemoveStruggleStartFromFallenEagleOnActions(ck3World.ModFS, config.OutputModName); - } - Logger.IncrementProgress(); if (config.LegionConversion == LegionConversion.MenAtArms) { MenAtArmsOutputter.OutputMenAtArms(outputName, ck3World.ModFS, ck3World.Characters, ck3World.MenAtArmsTypes); } - WriteDummyStruggleHistory(outputPath); - OutputLegendSeeds(outputPath, ck3World.LegendSeeds); - - NamedColorsOutputter.OutputNamedColors(outputName, imperatorWorld.NamedColors, ck3World.NamedColors); - - CoatOfArmsEmblemsOutputter.CopyEmblems(config, imperatorWorld.ModFS); - CoatOfArmsOutputter.OutputCoas(outputName, ck3World.LandedTitles, ck3World.Dynasties); - CoatOfArmsOutputter.CopyCoaPatterns(imperatorWorld.ModFS, outputPath); - - CopyBlankModFilesToOutput(outputPath); - - BookmarkOutputter.OutputBookmark(ck3World, config); - OutputPlaysetInfo(ck3World, outputName); } - private static void WriteDummyStruggleHistory(string outputPath) { + private static async Task WriteDummyStruggleHistory(string outputPath) { Logger.Info("Writing dummy struggles history file..."); // Just to make sure the history/struggles folder exists. string struggleDummyPath = Path.Combine(outputPath, "history/struggles/IRToCK3_dummy.txt"); - File.WriteAllText(struggleDummyPath, string.Empty, Encoding.UTF8); + await File.WriteAllTextAsync(struggleDummyPath, string.Empty, Encoding.UTF8); } - private static void OutputLegendSeeds(string outputPath, LegendSeedCollection legendSeeds) { + private static async Task OutputLegendSeeds(string outputPath, LegendSeedCollection legendSeeds) { Logger.Info("Writing legend seeds..."); - File.WriteAllText( + await File.WriteAllTextAsync( Path.Combine(outputPath, "common/legends/legend_seeds/IRtoCK3_all_legend_seeds.txt"), PDXSerializer.Serialize(legendSeeds, indent: "", withBraces: false) ); @@ -180,15 +152,12 @@ private static void OutputModFile(string outputName) { File.WriteAllText(descriptorFilePath, modText); } - private static void CreateModFolder(string outputName) { - var modPath = Path.Combine("output", outputName); - SystemUtils.TryCreateFolder(modPath); + private static void CreateModFolder(string outputModPath) { + SystemUtils.TryCreateFolder(outputModPath); } - private static void CreateFolders(string outputName) { + private static void CreateFolders(string outputPath) { Logger.Info("Creating folders..."); - - var outputPath = Path.Combine("output", outputName); SystemUtils.TryCreateFolder(Path.Combine(outputPath, "history", "titles")); SystemUtils.TryCreateFolder(Path.Combine(outputPath, "history", "characters")); @@ -227,6 +196,8 @@ private static void CreateFolders(string outputName) { SystemUtils.TryCreateFolder(Path.Combine(outputPath, "gfx", "coat_of_arms", "textured_emblems")); SystemUtils.TryCreateFolder(Path.Combine(outputPath, "gfx", "interface", "bookmarks")); SystemUtils.TryCreateFolder(Path.Combine(outputPath, "gfx", "portraits", "portrait_modifiers")); + + Logger.IncrementProgress(); } private static void OutputPlaysetInfo(World ck3World, string outputModName) {