Skip to content

Commit 4b91655

Browse files
IhateTrainstanner918code-factor
authored
Rajas of Asia support (#2432) #minor
closes #2431 closes #2404 --------- Co-authored-by: tanner918 <[email protected]> Co-authored-by: codefactor-io <[email protected]>
1 parent 4e7f038 commit 4b91655

File tree

70 files changed

+20869
-1731
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+20869
-1731
lines changed

.github/workflows/build_dev_version.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,9 @@ jobs:
7777
# global-json-file: global.json
7878
- name: "Build backend"
7979
working-directory: ImperatorToCK3
80+
# Make sure it builds self-contained, because for the dev build we're not building the InnoSetup installer.
8081
run: |
81-
dotnet publish -p:PublishProfile=${{ matrix.build }} -c:Release --output:"../Publish/ImperatorToCK3"
82+
dotnet publish -p:PublishProfile=${{ matrix.build }} -c:Release --output:"../Publish/ImperatorToCK3" -p:SelfContained=true
8283
- name: Archive Publish folder
8384
uses: thedoctor0/zip-release@master
8485
with:

ImperatorToCK3.UnitTests/CK3/Cultures/CultureCollectionTests.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class CultureCollectionTests {
1414
private static readonly ModFilesystem ck3ModFS = new("TestFiles/CK3/game", Array.Empty<Mod>());
1515
private static readonly PillarCollection pillars;
1616
private static readonly ColorFactory colorFactory = new();
17-
private static readonly OrderedDictionary<string, bool> ck3ModFlags = [];
17+
private static readonly OrderedDictionary<string, bool> ck3ModFlags = new() {{"tfe", false}, {"wtwsms", false}, {"roa", false}};
1818

1919
static CultureCollectionTests() {
2020
pillars = new PillarCollection(colorFactory, []) {
@@ -51,7 +51,7 @@ public void ConverterHeritageCanBeMergedIntoExistingHeritage() {
5151
Assert.Single(cultures);
5252

5353
cultures.AddNameList(new NameList("name_list_albanian", new BufferedReader()));
54-
cultures.LoadConverterPillars("TestFiles/CK3/CultureCollectionTests/configurables/converter_pillars");
54+
cultures.LoadConverterPillars("TestFiles/CK3/CultureCollectionTests/configurables/converter_pillars", ck3ModFlags);
5555
cultures.LoadConverterCultures("TestFiles/CK3/CultureCollectionTests/configurables/converter_cultures.txt");
5656

5757
Assert.Equal(2, cultures.Count);
@@ -71,7 +71,7 @@ public void ConverterLanguageCanBeMergedIntoExistingLanguage() {
7171
cultures.AddPillar(new("language_illyrian", new() {Type = "language"}));
7272

7373
cultures.AddNameList(new NameList("name_list_albanian", new BufferedReader()));
74-
cultures.LoadConverterPillars("TestFiles/CK3/CultureCollectionTests/configurables/converter_pillars");
74+
cultures.LoadConverterPillars("TestFiles/CK3/CultureCollectionTests/configurables/converter_pillars", ck3ModFlags);
7575
cultures.LoadConverterCultures("TestFiles/CK3/CultureCollectionTests/configurables/converter_cultures.txt");
7676

7777
Assert.Equal(2, cultures.Count);

ImperatorToCK3.UnitTests/CK3/Cultures/PillarCollectionTests.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using commonItems.Mods;
22
using ImperatorToCK3.CK3.Cultures;
33
using System;
4+
using System.Collections.Generic;
45
using System.IO;
56
using Xunit;
67

@@ -18,13 +19,14 @@ public void WarningIsLoggedWhenPillarDataIsMissingType() {
1819
var pillarsFile = File.CreateText("pillars_test/common/culture/pillars/test_pillars.txt");
1920
pillarsFile.WriteLine("pillar_without_type = {}");
2021
pillarsFile.Close();
21-
22+
23+
OrderedDictionary<string, bool> ck3ModFlags = [];
2224
var modFS = new ModFilesystem("pillars_test", Array.Empty<Mod>());
23-
var collection = new PillarCollection(new commonItems.Colors.ColorFactory(), []);
25+
var collection = new PillarCollection(new commonItems.Colors.ColorFactory(), ck3ModFlags);
2426

2527
var consoleOut = new StringWriter();
2628
Console.SetOut(consoleOut);
27-
collection.LoadPillars(modFS);
29+
collection.LoadPillars(modFS, ck3ModFlags);
2830
Assert.Contains("[WARN] Pillar pillar_without_type has no type defined! Skipping.", consoleOut.ToString());
2931
}
3032
}

ImperatorToCK3.UnitTests/CK3/Titles/TitleTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private class TitleBuilder {
5858
"TestFiles/configurables/governorMappings.txt",
5959
"TestFiles/configurables/country_rank_map.txt");
6060
private GovernmentMapper governmentMapper = new(ck3GovernmentIds: Array.Empty<string>());
61-
private SuccessionLawMapper successionLawMapper = new("TestFiles/configurables/succession_law_map.txt");
61+
private SuccessionLawMapper successionLawMapper = new("TestFiles/configurables/succession_law_map.liquid", ck3ModFlags: []);
6262
private DefiniteFormMapper definiteFormMapper = new("TestFiles/configurables/definite_form_names.txt");
6363

6464
private readonly ReligionMapper religionMapper;

ImperatorToCK3.UnitTests/ImperatorToCK3.UnitTests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212
</PropertyGroup>
1313

1414
<ItemGroup>
15+
<PackageReference Include="AwesomeAssertions" Version="8.0.0-rc.3" />
1516
<PackageReference Include="coverlet.msbuild" Version="6.0.4">
1617
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1718
<PrivateAssets>all</PrivateAssets>
1819
</PackageReference>
19-
<PackageReference Include="FluentAssertions" Version="8.0.0-rc.2" />
2020
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
2121
<PackageReference Include="xunit" Version="2.9.3" />
2222
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1">

ImperatorToCK3.UnitTests/Mappers/Government/GovernmentMapperTests.cs

+34-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using commonItems;
2+
using ImperatorToCK3.CK3.Titles;
23
using ImperatorToCK3.Mappers.Government;
34
using System.Collections.Generic;
45
using Xunit;
@@ -10,22 +11,22 @@ public class GovernmentMapperTests {
1011
public void NonMatchGivesNull() {
1112
var reader = new BufferedReader("link = { ck3 = ck3Government ir = irGovernment }");
1213
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: new List<string> { "ck3Government" });
13-
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("nonMatchingGovernment", null, []);
14+
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("nonMatchingGovernment", rank: null, irCultureId: null, []);
1415
Assert.Null(ck3Gov);
1516
}
1617
[Fact]
1718
public void CK3GovernmentCanBeFound() {
1819
var reader = new BufferedReader("link = { ck3 = ck3Government ir = irGovernment }");
1920
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: new List<string> { "ck3Government" });
20-
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", null, []);
21+
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, irCultureId: null, []);
2122
Assert.Equal("ck3Government", ck3Gov);
2223
}
2324
[Fact]
2425
public void MultipleImperatorGovernmentsCanBeInARule() {
2526
var reader = new BufferedReader("link = { ck3 = ck3Government ir = irGovernment ir = irGovernment2 }");
2627
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: new List<string> { "ck3Government" });
27-
var ck3Gov1 = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", null, []);
28-
var ck3Gov2 = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment2", null, []);
28+
var ck3Gov1 = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, irCultureId: null, []);
29+
var ck3Gov2 = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment2", rank: null, irCultureId: null, []);
2930
Assert.Equal("ck3Government", ck3Gov1);
3031
Assert.Equal("ck3Government", ck3Gov2);
3132
}
@@ -36,7 +37,7 @@ public void CorrectRuleMatches() {
3637
"link = { ck3 = ck3Government2 ir = irGovernment2 }"
3738
);
3839
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: new List<string> { "ck3Government", "ck3Government2" });
39-
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment2", null, []);
40+
var ck3Gov = mapper.GetCK3GovernmentForImperatorGovernment("irGovernment2", rank: null, irCultureId: null, []);
4041
Assert.Equal("ck3Government2", ck3Gov);
4142
}
4243

@@ -48,10 +49,32 @@ public void CultureCanBeUsedToMatch() {
4849
"link = { ck3 = govC ir = irGovernment }"
4950
);
5051
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: new List<string> { "govA", "govB", "govC" });
51-
Assert.Equal("govA", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", "roman", []));
52-
Assert.Equal("govB", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", "greek", []));
53-
Assert.Equal("govC", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", "thracian", []));
54-
Assert.Equal("govC", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", null, []));
52+
Assert.Equal("govA", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, "roman", []));
53+
Assert.Equal("govB", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, "greek", []));
54+
Assert.Equal("govC", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, "thracian", []));
55+
Assert.Equal("govC", mapper.GetCK3GovernmentForImperatorGovernment("irGovernment", rank: null, irCultureId: null, []));
56+
}
57+
58+
[Fact]
59+
public void CK3TitleRankCanBeUsedToMatch() {
60+
var reader = new BufferedReader(
61+
"""
62+
link = { ck3 = administrative_government ir = imperium ck3_title_rank = ke } # only for kingdoms and empires
63+
link = { ck3 = feudal_government ir = imperium }
64+
"""
65+
);
66+
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: [ "administrative_government", "feudal_government" ]);
67+
68+
foreach (var rank in new List<TitleRank> { TitleRank.empire, TitleRank.kingdom }) {
69+
Assert.Equal("administrative_government",
70+
mapper.GetCK3GovernmentForImperatorGovernment(
71+
irGovernmentId: "imperium", rank, irCultureId: null, enabledCK3Dlcs: []));
72+
}
73+
foreach (var rank in new List<TitleRank> { TitleRank.duchy, TitleRank.county, TitleRank.barony }) {
74+
Assert.Equal("feudal_government",
75+
mapper.GetCK3GovernmentForImperatorGovernment(
76+
irGovernmentId: "imperium", rank, irCultureId: null, enabledCK3Dlcs: []));
77+
}
5578
}
5679

5780
[Fact]
@@ -70,7 +93,7 @@ public void CK3DlcCanBeUsedToMatch() {
7093
""");
7194
var mapper = new GovernmentMapper(reader, ck3GovernmentIds: [ "administrative_government", "feudal_government" ]);
7295

73-
Assert.Equal("administrative_government", mapper.GetCK3GovernmentForImperatorGovernment("imperium", null, enabledCK3Dlcs: ["roads_to_power"]));
74-
Assert.Equal("feudal_government", mapper.GetCK3GovernmentForImperatorGovernment("imperium", null, enabledCK3Dlcs: []));
96+
Assert.Equal("administrative_government", mapper.GetCK3GovernmentForImperatorGovernment("imperium", rank: null, irCultureId: null, enabledCK3Dlcs: ["roads_to_power"]));
97+
Assert.Equal("feudal_government", mapper.GetCK3GovernmentForImperatorGovernment("imperium", rank: null, irCultureId: null, enabledCK3Dlcs: []));
7598
}
7699
}

ImperatorToCK3.UnitTests/Mappers/SuccessionLaw/SuccessionLawMapperTests.cs

+72-15
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,25 @@ namespace ImperatorToCK3.UnitTests.Mappers.SuccessionLaw;
1010
[Collection("Sequential")]
1111
[CollectionDefinition("Sequential", DisableParallelization = true)]
1212
public class SuccessionLawMapperTests {
13+
private static readonly OrderedDictionary<string, bool> ck3ModFlags = [];
14+
private static readonly string[] enabledCK3Dlcs = [];
15+
1316
[Fact]
1417
public void NonMatchGivesEmptySet() {
1518
var reader = new BufferedReader("link = { ir=implaw ck3 = ck3law }");
1619
var mapper = new SuccessionLawMapper(reader);
1720

18-
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(new SortedSet<string> { "madeUpLaw" });
21+
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(impLaws: ["madeUpLaw"], irGovernment: null, enabledCK3Dlcs);
1922
Assert.Empty(ck3Laws);
2023
}
2124

2225
[Fact]
23-
public void Ck3LawCanBeFound() {
26+
public void CK3LawCanBeFound() {
2427
var reader = new BufferedReader("link = { ir=implaw ck3 = ck3law }");
2528
var mapper = new SuccessionLawMapper(reader);
2629

27-
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(new SortedSet<string> { "implaw" });
28-
Assert.Equal(new SortedSet<string> { "ck3law" }, ck3Laws);
30+
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(impLaws: ["implaw"], irGovernment: null, enabledCK3Dlcs);
31+
Assert.Equal(["ck3law"], ck3Laws);
2932
}
3033

3134
[Fact]
@@ -42,28 +45,82 @@ public void LinkWithNoCK3LawResultsInWarning() {
4245
[Fact]
4346
public void MultipleLawsCanBeReturned() {
4447
var reader = new BufferedReader(
45-
"link = { ir=implaw ck3 = ck3law ck3 = ck3law2 }\n" +
46-
"link = { ir=implaw ck3 = ck3law3 }\n" +
47-
"link = { ir=implaw2 ck3 = ck3law4 }\n" +
48-
"link = { ir=implaw3 ck3 = ck3law5 }\n"
48+
"""
49+
link = { ir=implaw ck3 = ck3law ck3 = ck3law2 }
50+
link = { ir=implaw ck3 = ck3law3 } # Will not be used because the first link matches implaw
51+
link = { ir=implaw2 ck3 = ck3law4 }
52+
link = { ir=implaw3 ck3 = ck3law5 }
53+
"""
4954
);
5055
var mapper = new SuccessionLawMapper(reader);
5156

52-
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(new SortedSet<string> { "implaw", "implaw3" });
53-
var expectedReturnedLaws = new SortedSet<string> { "ck3law", "ck3law2", "ck3law3", "ck3law5" };
57+
var ck3Laws = mapper.GetCK3LawsForImperatorLaws(impLaws: ["implaw", "implaw3"], irGovernment: null, enabledCK3Dlcs);
58+
var expectedReturnedLaws = new SortedSet<string> { "ck3law", "ck3law2", "ck3law5" };
5459
Assert.Equal(expectedReturnedLaws, ck3Laws);
5560
}
5661

62+
[Fact]
63+
public void EnabledCK3DlcsCanBeUsedInMappings() {
64+
var reader = new BufferedReader(
65+
"""
66+
link = { ir=implaw ck3=ck3lawForDLC has_ck3_dlc=roads_to_power }
67+
link = { ir=implaw ck3=ck3law }
68+
"""
69+
);
70+
var mapper = new SuccessionLawMapper(reader);
71+
72+
var ck3LawsWithDlc = mapper.GetCK3LawsForImperatorLaws(
73+
impLaws: ["implaw"],
74+
irGovernment: null,
75+
enabledCK3Dlcs:["roads_to_power"]);
76+
Assert.Equal(["ck3lawForDLC"], ck3LawsWithDlc);
77+
78+
var ck3LawsWithoutDlc = mapper.GetCK3LawsForImperatorLaws(
79+
impLaws: ["implaw"],
80+
irGovernment: null,
81+
enabledCK3Dlcs: []);
82+
Assert.Equal(["ck3law"], ck3LawsWithoutDlc);
83+
}
84+
85+
[Fact]
86+
public void ImperatorGovernmentCanBeUsedInMappings() {
87+
var reader = new BufferedReader(
88+
"""
89+
link = { ir=implaw ck3=ck3law1 ir_government=imperium ir_government=imperial_cult }
90+
link = { ir=implaw ck3=ck3law2 }
91+
"""
92+
);
93+
var mapper = new SuccessionLawMapper(reader);
94+
95+
var ck3LawsWithImperialGov = mapper.GetCK3LawsForImperatorLaws(
96+
impLaws: ["implaw"],
97+
irGovernment: "imperium",
98+
enabledCK3Dlcs: enabledCK3Dlcs);
99+
Assert.Equal(["ck3law1"], ck3LawsWithImperialGov);
100+
101+
var ck3LawsWithoutImperialGov = mapper.GetCK3LawsForImperatorLaws(
102+
impLaws: ["implaw"],
103+
irGovernment: "imperial_cult",
104+
enabledCK3Dlcs: enabledCK3Dlcs);
105+
Assert.Equal(["ck3law1"], ck3LawsWithoutImperialGov);
106+
107+
var ck3LawsWithoutImperatorGov = mapper.GetCK3LawsForImperatorLaws(
108+
impLaws: ["implaw"],
109+
irGovernment: "madeUpGov",
110+
enabledCK3Dlcs: enabledCK3Dlcs);
111+
Assert.Equal(["ck3law2"], ck3LawsWithoutImperatorGov);
112+
}
113+
57114
[Fact]
58115
public void MappingsAreReadFromFile() {
59-
var mapper = new SuccessionLawMapper("TestFiles/configurables/succession_law_map.txt");
116+
var mapper = new SuccessionLawMapper("TestFiles/configurables/succession_law_map.liquid", ck3ModFlags);
60117
Assert.Equal(
61-
new SortedSet<string> { "ck3law1", "ck3law2" },
62-
mapper.GetCK3LawsForImperatorLaws(new() { "implaw1" })
118+
["ck3law1", "ck3law2"],
119+
mapper.GetCK3LawsForImperatorLaws(impLaws: ["implaw1"], irGovernment: null, enabledCK3Dlcs)
63120
);
64121
Assert.Equal(
65-
new SortedSet<string> { "ck3law3" },
66-
mapper.GetCK3LawsForImperatorLaws(new() { "implaw2" })
122+
["ck3law3"],
123+
mapper.GetCK3LawsForImperatorLaws(impLaws: ["implaw2"], irGovernment: null, enabledCK3Dlcs)
67124
);
68125
}
69126
}

ImperatorToCK3.UnitTests/TestHelpers/TestCK3CultureCollection.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ namespace ImperatorToCK3.UnitTests.TestHelpers;
99
private static readonly ColorFactory colorFactory = new();
1010
private static readonly OrderedDictionary<string, bool> ck3ModFlags = [];
1111

12-
public void LoadConverterPillars(string filePath) {
13-
PillarCollection.LoadConverterPillars(filePath);
12+
public void LoadConverterPillars(string filePath, OrderedDictionary<string, bool> ck3ModFlags) {
13+
PillarCollection.LoadConverterPillars(filePath, ck3ModFlags);
1414
}
1515

1616
public void AddNameList(NameList nameList) {

ImperatorToCK3.sln.DotSettings

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
<s:Boolean x:Key="/Default/UserDictionary/Words/=pontifex/@EntryIndexedValue">True</s:Boolean>
109109
<s:Boolean x:Key="/Default/UserDictionary/Words/=Provs/@EntryIndexedValue">True</s:Boolean>
110110
<s:Boolean x:Key="/Default/UserDictionary/Words/=Qahtanite/@EntryIndexedValue">True</s:Boolean>
111+
<s:Boolean x:Key="/Default/UserDictionary/Words/=rajas/@EntryIndexedValue">True</s:Boolean>
111112
<s:Boolean x:Key="/Default/UserDictionary/Words/=rakaly/@EntryIndexedValue">True</s:Boolean>
112113
<s:Boolean x:Key="/Default/UserDictionary/Words/=rankless/@EntryIndexedValue">True</s:Boolean>
113114
<s:Boolean x:Key="/Default/UserDictionary/Words/=Rechtabra/@EntryIndexedValue">True</s:Boolean>

ImperatorToCK3/CK3/Characters/Character.cs

+4
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ public string? DeathReason {
216216
.WithLiteralField("if", "if")
217217
.WithSimpleField("sexuality", "sexuality", null)
218218
.WithLiteralField("domicile", "domicile")
219+
.WithLiteralField("create_maa_regiment", "create_maa_regiment")
220+
.WithSimpleField("add_gold", "add_gold", null)
221+
.WithSimpleField("add_piety_level", "add_piety_level", null)
222+
.WithSimpleField("add_prestige_level", "add_prestige_level", null)
219223
.Build();
220224

221225
public History History { get; } = historyFactory.GetHistory();

ImperatorToCK3/CK3/Characters/CharactersLoader.cs

+14-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,18 @@ public void LoadCK3Characters(ModFilesystem ck3ModFS, Date bookmarkDate) {
2626
loadedCharacters.Add(character);
2727
});
2828
parser.IgnoreAndLogUnregisteredItems();
29-
parser.ParseGameFolder("history/characters", ck3ModFS, "txt", recursive: true, parallel: true);
29+
parser.ParseGameFolder("history/characters", ck3ModFS, "txt", recursive: true);
30+
31+
// Make all animation_test_ characters die on 2.1.1.
32+
foreach (var character in loadedCharacters) {
33+
if (!character.Id.StartsWith("animation_test_")) {
34+
continue;
35+
}
36+
37+
var deathField = character.History.Fields["death"];
38+
deathField.RemoveAllEntries();
39+
deathField.AddEntryToHistory(new Date(2, 1, 1), "death", value: true);
40+
}
3041

3142
string[] irrelevantEffects = ["set_relation_rival", "set_relation_potential_rival", "set_relation_nemesis",
3243
"set_relation_lover", "set_relation_soulmate",
@@ -86,6 +97,8 @@ public void LoadCK3Characters(ModFilesystem ck3ModFS, Date bookmarkDate) {
8697
character.InitConcubinesCache();
8798
character.UpdateChildrenCacheOfParents();
8899
}
100+
101+
Logger.Info("Loaded CK3 characters.");
89102
}
90103

91104
private static void RemoveInvalidMotherAndFatherEntries(Character character, HashSet<string> femaleCharacterIds, HashSet<string> maleCharacterIds) {

ImperatorToCK3/CK3/Cultures/Pillar.cs

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ internal sealed class Pillar : IIdentifiable<string>, IPDXSerializable {
1111
public string Id { get; }
1212
public string Type { get; }
1313
public Color? Color { get; }
14+
private readonly Dictionary<string, string> parameters;
15+
public IReadOnlyDictionary<string, string> Parameters => parameters;
1416
private readonly List<KeyValuePair<string, StringOfItem>> attributes;
1517
public IReadOnlyCollection<KeyValuePair<string, StringOfItem>> Attributes => attributes;
1618

@@ -19,6 +21,7 @@ public Pillar(string id, PillarData pillarData) {
1921

2022
Type = pillarData.Type!;
2123
Color = pillarData.Color;
24+
parameters = new(pillarData.Parameters);
2225
attributes = new List<KeyValuePair<string, StringOfItem>>(pillarData.Attributes);
2326
}
2427

@@ -37,6 +40,10 @@ public string Serialize(string indent, bool withBraces) {
3740
if (Color is not null) {
3841
sb.Append(contentIndent).AppendLine($"color={Color}");
3942
}
43+
if (parameters.Count > 0) {
44+
sb.Append(contentIndent).Append("parameters=")
45+
.AppendLine(PDXSerializer.Serialize(parameters, indent: contentIndent, withBraces: true));
46+
}
4047
sb.AppendLine(PDXSerializer.Serialize(Attributes, indent: contentIndent, withBraces: false));
4148

4249
if (withBraces) {

0 commit comments

Comments
 (0)