Skip to content

Commit 3e20ab2

Browse files
authored
Disable the ERE restoration decision if the ERE has no holder in history (#2364) #minor
closes #2359
1 parent 2c5c62b commit 3e20ab2

File tree

3 files changed

+89
-7
lines changed

3 files changed

+89
-7
lines changed

ImperatorToCK3/Outputter/CulturesOutputter.cs

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using ImperatorToCK3.CK3.Cultures;
99
using ImperatorToCK3.CommonUtils;
1010
using Microsoft.FSharp.Collections;
11-
using System.Collections;
1211
using System.Collections.Generic;
1312
using System.IO;
1413
using System.Linq;
@@ -126,7 +125,7 @@ private static void OutputCCULanguageParameters(string outputModPath, ModFilesys
126125
branchEffectNode.AllChildren = allChildren;
127126

128127
// Output the modified file.
129-
var tooutput = rootNode.AllChildren
128+
var toOutput = rootNode.AllChildren
130129
.Select(c => {
131130
if (c.IsLeafC) {
132131
return c.leaf.ToRaw;
@@ -139,7 +138,7 @@ private static void OutputCCULanguageParameters(string outputModPath, ModFilesys
139138
.Where(s => s is not null)
140139
.Cast<Types.Statement>()
141140
.ToList();
142-
var fsharpList = ListModule.OfSeq(tooutput);
141+
var fsharpList = ListModule.OfSeq(toOutput);
143142

144143
var outputFilePath = Path.Join(outputModPath, relativePath);
145144
// Output the file with UTF8-BOM encoding.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
using commonItems;
2+
using commonItems.Mods;
3+
using CWTools.CSharp;
4+
using CWTools.Parser;
5+
using CWTools.Process;
6+
using ImperatorToCK3.CK3.Titles;
7+
using System.IO;
8+
using System.Linq;
9+
using System.Text;
10+
using System.Threading.Tasks;
11+
12+
namespace ImperatorToCK3.Outputter;
13+
14+
internal static class DecisionsOutputter {
15+
internal static async Task TweakERERestorationDecision(Title.LandedTitles titles, ModFilesystem ck3ModFS,
16+
string outputModPath) {
17+
if (!titles.ContainsKey("e_byzantium")) {
18+
return;
19+
}
20+
21+
Logger.Info("Tweaking ERE restoration decision...");
22+
const string relativeDecisionsFilePath = "common/decisions/dlc_decisions/ep3_decisions.txt";
23+
24+
// The file may already be in the output mod.
25+
string? decisionsFilePath;
26+
string fileInOutputPath = Path.Join(outputModPath, relativeDecisionsFilePath);
27+
if (File.Exists(fileInOutputPath)) {
28+
decisionsFilePath = fileInOutputPath;
29+
} else {
30+
decisionsFilePath = ck3ModFS.GetActualFileLocation(relativeDecisionsFilePath);
31+
}
32+
33+
if (decisionsFilePath is null) {
34+
Logger.Warn($"Can't find {relativeDecisionsFilePath}!");
35+
return;
36+
}
37+
38+
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
39+
40+
var fileName = Path.GetFileName(decisionsFilePath);
41+
42+
var text = await File.ReadAllTextAsync(decisionsFilePath);
43+
var parsed = Parsers.ParseScriptFile(fileName, text);
44+
var decisionsFile = parsed.GetResult();
45+
46+
var processed = Parsers.ProcessStatements(fileName, decisionsFilePath, decisionsFile);
47+
48+
const string decisionName = "recreate_byzantine_empire_decision";
49+
var decisionNode = processed.Nodes.FirstOrDefault(n => n.Key == decisionName);
50+
if (decisionNode is null) {
51+
Logger.Warn($"Decision {decisionName} not found!");
52+
return;
53+
}
54+
55+
var isShownNode = decisionNode.Nodes.FirstOrDefault(n => n.Key == "is_shown");
56+
if (isShownNode is null) {
57+
Logger.Warn($"is_shown node not found in decision {decisionName}!");
58+
return;
59+
}
60+
61+
const string additionalCondition = "\t\texists = title:e_byzantium.previous_holder";
62+
var additionalStatements = CKParser.parseString(additionalCondition, fileName).GetResult();
63+
var rootNodeForStatements = Parsers.ProcessStatements(fileName, decisionsFilePath, additionalStatements);
64+
65+
var newChild = Child.NewLeafC(rootNodeForStatements.Leaves.First());
66+
isShownNode.SetTag(newChild.leaf.Key, newChild);
67+
68+
StringBuilder sb = new();
69+
foreach (var child in processed.Children) {
70+
sb.AppendLine(CKPrinter.api.prettyPrintStatement.Invoke(child.ToRaw));
71+
}
72+
73+
// Output the modified file with UTF8-BOM encoding.
74+
var outputFilePath = Path.Join(outputModPath, relativeDecisionsFilePath);
75+
await File.WriteAllTextAsync(outputFilePath, sb.ToString(), Encoding.UTF8);
76+
}
77+
}

ImperatorToCK3/Outputter/WorldOutputter.cs

+10-4
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,15 @@ public static void OutputWorld(World ck3World, Imperator.World imperatorWorld, C
6060
BookmarkOutputter.OutputBookmark(ck3World, config, ck3World.LocDB)
6161
);
6262

63-
63+
Task.WaitAll(
64+
DecisionsOutputter.TweakERERestorationDecision(ck3World.LandedTitles, ck3World.ModFS, outputPath),
6465

65-
if (config.LegionConversion == LegionConversion.MenAtArms) {
66-
MenAtArmsOutputter.OutputMenAtArms(outputName, ck3World.ModFS, ck3World.Characters, ck3World.MenAtArmsTypes);
67-
}
66+
Task.Run(() => {
67+
if (config.LegionConversion == LegionConversion.MenAtArms) {
68+
MenAtArmsOutputter.OutputMenAtArms(outputName, ck3World.ModFS, ck3World.Characters, ck3World.MenAtArmsTypes);
69+
}
70+
})
71+
);
6872

6973
// Localization should be output last, as it uses data written by other outputters.
7074
LocalizationOutputter.OutputLocalization(outputPath, ck3World);
@@ -204,6 +208,8 @@ private static void CreateFolders(string outputPath) {
204208
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "coat_of_arms", "coat_of_arms"));
205209
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "culture", "cultures"));
206210
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "culture", "pillars"));
211+
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "decisions"));
212+
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "decisions", "dlc_decisions"));
207213
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "dna_data"));
208214
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "dynasties"));
209215
SystemUtils.TryCreateFolder(Path.Combine(outputPath, "common", "dynasty_houses"));

0 commit comments

Comments
 (0)