22using commonItems . Collections ;
33using ImperatorToCK3 . CK3 . Religions ;
44using ImperatorToCK3 . Mappers . Region ;
5+ using System ;
56using System . Collections . Generic ;
67using System . IO ;
78
@@ -22,6 +23,7 @@ public ReligionMapper(ReligionCollection ck3Religions, ImperatorRegionMapper imp
2223 Logger . Info ( $ "Loaded { religionMappings . Count } religious links.") ;
2324
2425 RemoveMappingsWithNonexistentCK3Faiths ( ck3Religions ) ;
26+ BuildLookup ( ) ;
2527
2628 Logger . IncrementProgress ( ) ;
2729 }
@@ -34,14 +36,36 @@ public ReligionMapper(BufferedReader reader, ReligionCollection ck3Religions, Im
3436 parser . ParseStream ( reader ) ;
3537
3638 RemoveMappingsWithNonexistentCK3Faiths ( ck3Religions ) ;
39+ BuildLookup ( ) ;
3740 }
3841
3942 private void RemoveMappingsWithNonexistentCK3Faiths ( ReligionCollection ck3Religions ) {
4043 religionMappings . RemoveWhere ( m=> m . CK3FaithId is not null && ck3Religions . GetFaith ( m . CK3FaithId ) is null ) ;
4144 }
4245
46+ private void BuildLookup ( ) {
47+ religionLookup . Clear ( ) ;
48+ foreach ( var mapping in religionMappings ) {
49+ foreach ( var irReligionId in mapping . IrReligionIds ) {
50+ if ( ! religionLookup . TryGetValue ( irReligionId , out var list ) ) {
51+ list = new List < ReligionMapping > ( ) ;
52+ religionLookup [ irReligionId ] = list ;
53+ }
54+ list . Add ( mapping ) ;
55+ }
56+ }
57+ }
58+
4359 public string ? Match ( string irReligionId , string ? ck3CultureId , ulong ? ck3ProvinceId , ulong ? irProvinceId , string ? irHistoricalTag , Configuration config ) {
44- foreach ( var religionMapping in religionMappings ) {
60+ if ( string . IsNullOrEmpty ( irReligionId ) ) {
61+ return null ;
62+ }
63+
64+ if ( ! religionLookup . TryGetValue ( irReligionId , out var candidates ) ) {
65+ return null ;
66+ }
67+
68+ foreach ( var religionMapping in candidates ) {
4569 var possibleMatch = religionMapping . Match ( irReligionId , ck3CultureId , ck3ProvinceId , irProvinceId , irHistoricalTag , config , imperatorRegionMapper , ck3RegionMapper ) ;
4670 if ( possibleMatch is not null ) {
4771 return possibleMatch ;
@@ -57,6 +81,7 @@ private void RegisterKeys(Parser parser) {
5781 parser . IgnoreAndLogUnregisteredItems ( ) ;
5882 }
5983 private readonly List < ReligionMapping > religionMappings = new ( ) ;
84+ private readonly Dictionary < string , List < ReligionMapping > > religionLookup = new ( StringComparer . Ordinal ) ;
6085 private readonly ImperatorRegionMapper imperatorRegionMapper ;
6186 private readonly CK3RegionMapper ck3RegionMapper ;
6287}
0 commit comments