@@ -18,21 +18,41 @@ public PillarCollection(ColorFactory colorFactory, OrderedDictionary<string, boo
1818 }
1919
2020 public Pillar ? GetHeritageForId ( string heritageId ) {
21- var heritages = this . AsValueEnumerable ( ) . Where ( p => p . Type == "heritage" ) . ToFrozenSet ( ) ;
22- if ( mergedPillarsDict . TryGetValue ( heritageId , out var mergedHeritageId ) ) {
23- return heritages . AsValueEnumerable ( ) . FirstOrDefault ( p => p . Id == mergedHeritageId ) ;
21+ var idToLookup = mergedPillarsDict . TryGetValue ( heritageId , out var mergedHeritageId )
22+ ? mergedHeritageId
23+ : heritageId ;
24+ if ( heritagesById . TryGetValue ( idToLookup , out var heritage ) ) {
25+ return heritage ;
2426 }
25-
26- return heritages . AsValueEnumerable ( ) . FirstOrDefault ( p => p . Id == heritageId ) ;
27+
28+ foreach ( var pillar in this ) {
29+ if ( pillar . Type != "heritage" || pillar . Id != idToLookup ) {
30+ continue ;
31+ }
32+ heritagesById [ idToLookup ] = pillar ;
33+ return pillar ;
34+ }
35+
36+ return null ;
2737 }
2838
2939 public Pillar ? GetLanguageForId ( string languageId ) {
30- var languages = this . AsValueEnumerable ( ) . Where ( p => p . Type == "language" ) . ToFrozenSet ( ) ;
31- if ( mergedPillarsDict . TryGetValue ( languageId , out var mergedLanguageId ) ) {
32- return languages . AsValueEnumerable ( ) . FirstOrDefault ( p => p . Id == mergedLanguageId ) ;
40+ var idToLookup = mergedPillarsDict . TryGetValue ( languageId , out var mergedLanguageId )
41+ ? mergedLanguageId
42+ : languageId ;
43+ if ( languagesById . TryGetValue ( idToLookup , out var language ) ) {
44+ return language ;
3345 }
34-
35- return languages . AsValueEnumerable ( ) . FirstOrDefault ( p => p . Id == languageId ) ;
46+
47+ foreach ( var pillar in this ) {
48+ if ( pillar . Type != "language" || pillar . Id != idToLookup ) {
49+ continue ;
50+ }
51+ languagesById [ idToLookup ] = pillar ;
52+ return pillar ;
53+ }
54+
55+ return null ;
3656 }
3757
3858 public void LoadPillars ( ModFilesystem ck3ModFS , OrderedDictionary < string , bool > ck3ModFlags ) {
@@ -73,6 +93,13 @@ private void LoadPillar(string pillarId, BufferedReader pillarReader, OrderedDic
7393 }
7494 var pillar = new Pillar ( pillarId , pillarData ) ;
7595 AddOrReplace ( pillar ) ;
96+ if ( pillar . Type == "heritage" ) {
97+ heritagesById [ pillarId ] = pillar ;
98+ languagesById . Remove ( pillarId ) ;
99+ } else if ( pillar . Type == "language" ) {
100+ languagesById [ pillarId ] = pillar ;
101+ heritagesById . Remove ( pillarId ) ;
102+ }
76103
77104 // Perform some non-breaking validation.
78105 if ( pillar . Type == "heritage" ) {
@@ -148,6 +175,8 @@ private void LoadInvalidatingPillarIds(OrderedDictionary<string, bool> ck3ModFla
148175
149176 private PillarData pillarData = new ( ) ;
150177 private readonly Parser pillarDataParser = new ( ) ;
178+ private readonly Dictionary < string , Pillar > heritagesById = new ( StringComparer . Ordinal ) ;
179+ private readonly Dictionary < string , Pillar > languagesById = new ( StringComparer . Ordinal ) ;
151180
152181 private readonly IgnoredKeywordsSet ignoredModFlags = [ ] ;
153182}
0 commit comments