Skip to content

Commit d40b4fd

Browse files
committed
Optimize AccessoryGeneMapper and MorphGeneTemplateMapper and MapData
1 parent ae7546a commit d40b4fd

3 files changed

Lines changed: 58 additions & 33 deletions

File tree

ImperatorToCK3/CommonUtils/Map/MapData.cs

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -473,31 +473,39 @@ public bool AreProvinceGroupsAdjacentByLand(FrozenSet<ulong> group1, FrozenSet<u
473473

474474
// Function for checking if two land provinces are connected to the same water body.
475475
public bool AreProvinceGroupsConnectedByWaterBody(FrozenSet<ulong> group1, FrozenSet<ulong> group2) {
476-
var group1WaterNeighbors = new HashSet<ulong>();
476+
var group1WaterBodies = new HashSet<ulong>();
477477
foreach (var provId in group1) {
478478
if (!NeighborsDict.TryGetValue(provId, out var neighbors)) {
479479
continue;
480480
}
481-
foreach (ulong neighbor in neighbors.Where(IsStaticWater)) {
482-
group1WaterNeighbors.Add(neighbor);
481+
foreach (var neighbor in neighbors) {
482+
if (!IsStaticWater(neighbor)) {
483+
continue;
484+
}
485+
if (waterBodiesDict.TryGetValue(neighbor, out var waterBodyId)) {
486+
group1WaterBodies.Add(waterBodyId);
487+
}
483488
}
484489
}
485-
if (group1WaterNeighbors.Count == 0) {
490+
if (group1WaterBodies.Count == 0) {
486491
return false;
487492
}
488493

489-
var group2WaterNeighbors = group2
490-
.SelectMany(provId => NeighborsDict.TryGetValue(provId, out var neighbors) ? neighbors : [])
491-
.Where(IsStaticWater)
492-
.ToFrozenSet();
493-
if (group2WaterNeighbors.Count == 0) {
494-
return false;
494+
foreach (var provId in group2) {
495+
if (!NeighborsDict.TryGetValue(provId, out var neighbors)) {
496+
continue;
497+
}
498+
foreach (var neighbor in neighbors) {
499+
if (!IsStaticWater(neighbor)) {
500+
continue;
501+
}
502+
if (waterBodiesDict.TryGetValue(neighbor, out var waterBodyId) && group1WaterBodies.Contains(waterBodyId)) {
503+
return true;
504+
}
505+
}
495506
}
496507

497-
var group1WaterBodies = group1WaterNeighbors.Select(id => waterBodiesDict[id]).ToFrozenSet();
498-
499-
return group2WaterNeighbors
500-
.Any(group2ProvId => group1WaterBodies.Contains(waterBodiesDict[group2ProvId]));
508+
return false;
501509
}
502510

503511
private void LoadAdjacencies(string adjacenciesFilename, ModFilesystem modFS) {

ImperatorToCK3/Mappers/Gene/AccessoryGeneMapper.cs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using commonItems;
2+
using System;
23
using System.Collections.Generic;
3-
using System.Linq;
44
using Assignment = System.Collections.Generic.KeyValuePair<string, string>;
55

66
namespace ImperatorToCK3.Mappers.Gene;
@@ -33,10 +33,14 @@ public AccessoryGeneMapper(string mappingsFilePath) {
3333
return null;
3434
}
3535

36-
return mappings
37-
.Where(mapping => mapping.Key == irObjectName)
38-
.Select(mapping => mapping.Value)
39-
.FirstOrDefault();
36+
for (int i = 0; i < mappings.Count; ++i) {
37+
var mapping = mappings[i];
38+
if (mapping.Key == irObjectName) {
39+
return mapping.Value;
40+
}
41+
}
42+
43+
return null;
4044
}
4145

4246
internal string? GetTemplateFromTemplate(string irGeneName, string irTemplateName, string[] validCK3TemplateIds) {
@@ -45,21 +49,31 @@ public AccessoryGeneMapper(string mappingsFilePath) {
4549
return null;
4650
}
4751

48-
return mappings
49-
.Where(mapping => mapping.Key == irTemplateName)
50-
.Select(mapping => mapping.Value)
51-
.Intersect(validCK3TemplateIds)
52-
.FirstOrDefault();
52+
for (int i = 0; i < mappings.Count; ++i) {
53+
var mapping = mappings[i];
54+
if (mapping.Key != irTemplateName) {
55+
continue;
56+
}
57+
if (Array.IndexOf(validCK3TemplateIds, mapping.Value) >= 0) {
58+
return mapping.Value;
59+
}
60+
}
61+
62+
return null;
5363
}
5464

5565
internal string? GetFallbackTemplateForGene(string irGeneName, string[] validCK3TemplateIds) {
5666
if (!TemplateToTemplateMappings.TryGetValue(irGeneName, out var mappings)) {
5767
return null;
5868
}
5969

60-
return mappings
61-
.Select(mapping => mapping.Value)
62-
.Intersect(validCK3TemplateIds)
63-
.FirstOrDefault();
70+
for (int i = 0; i < mappings.Count; ++i) {
71+
var template = mappings[i].Value;
72+
if (Array.IndexOf(validCK3TemplateIds, template) >= 0) {
73+
return template;
74+
}
75+
}
76+
77+
return null;
6478
}
6579
}

ImperatorToCK3/Mappers/Gene/MorphGeneTemplateMapper.cs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using commonItems;
22
using System.Collections.Generic;
3-
using System.Linq;
43
using Assignment = System.Collections.Generic.KeyValuePair<string, string>;
54

65
namespace ImperatorToCK3.Mappers.Gene;
@@ -23,10 +22,14 @@ public MorphGeneTemplateMapper(string mappingsFilePath) {
2322
return null;
2423
}
2524

26-
var ck3TemplateName = templateMappingsForGene
27-
.Where(mapping => mapping.Key == irTemplateName)
28-
.Select(mapping => mapping.Value)
29-
.FirstOrDefault();
25+
string? ck3TemplateName = null;
26+
for (int i = 0; i < templateMappingsForGene.Count; ++i) {
27+
var mapping = templateMappingsForGene[i];
28+
if (mapping.Key == irTemplateName) {
29+
ck3TemplateName = mapping.Value;
30+
break;
31+
}
32+
}
3033
if (ck3TemplateName is null) {
3134
Logger.Warn($"I:R template {irTemplateName} not found in morph gene template mappings!");
3235
}

0 commit comments

Comments
 (0)