Skip to content

Commit c48629b

Browse files
authored
Fix the warning about hash detected collision for loc key "Mallobald" (#2761) #patch
1 parent 037caee commit c48629b

File tree

15 files changed

+74
-15
lines changed

15 files changed

+74
-15
lines changed

ImperatorToCK3.UnitTests/CK3/Characters/CK3CharacterTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using ImperatorToCK3.UnitTests.Mappers.Trait;
2525
using ImperatorToCK3.UnitTests.TestHelpers;
2626
using System;
27+
using System.Collections.Frozen;
2728
using System.Collections.Generic;
2829
using System.Linq;
2930
using Xunit;
@@ -44,6 +45,7 @@ public class CK3CharacterTests {
4445
private static readonly ModFilesystem CK3ModFS = new(CK3Root, Array.Empty<Mod>());
4546
private static readonly DNAFactory DNAFactory = new(IRModFS, CK3ModFS);
4647
private static TestCK3CultureCollection cultures = new();
48+
private static readonly FrozenDictionary<string, string> characterNameOverrides = FrozenDictionary<string, string>.Empty;
4749

4850
static CK3CharacterTests() {
4951
var irProvinces = new ImperatorToCK3.Imperator.Provinces.ProvinceCollection {new(1), new(2), new(3)};
@@ -89,9 +91,9 @@ internal Character Build() {
8991
irMapData,
9092
provinceMapper,
9193
deathReasonMapper,
92-
DNAFactory,
9394
new Date(867, 1, 1),
9495
config,
96+
nameOverrides: characterNameOverrides,
9597
unlocalizedImperatorNames: []
9698
);
9799
return character;

ImperatorToCK3.UnitTests/CK3/Characters/CharacterCollectionTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
using System.Linq;
3030
using Xunit;
3131
using System;
32+
using System.IO;
3233

3334
namespace ImperatorToCK3.UnitTests.CK3.Characters;
3435

@@ -379,4 +380,39 @@ public void ImperatorCountriesGoldCanBeDistributedAmongRulerAndVassals() {
379380
Assert.Equal(25, ck3Vassal2.Gold);
380381
});
381382
}
383+
384+
[Fact]
385+
public void ImperatorCharacterNamesCanBeOverriddenByConfigurable() {
386+
Date ck3BookmarkDate = new(867, 1, 1);
387+
var configuration = new Configuration { CK3BookmarkDate = ck3BookmarkDate };
388+
var imperatorWorld = new TestImperatorWorld(configuration);
389+
390+
imperatorWorld.Characters.Add(new(0) {Name = "Mallobald"});
391+
392+
Directory.CreateDirectory("configurables");
393+
const string overridesFilePath = "configurables/character_name_overrides.txt";
394+
File.WriteAllText(overridesFilePath, "Mallobald = Mallobald_collision_fix # avoids hash collision in CK3");
395+
396+
var ck3Characters = new CharacterCollection();
397+
var config = new Configuration { CK3BookmarkDate = ck3BookmarkDate };
398+
ck3Characters.ImportImperatorCharacters(
399+
imperatorWorld,
400+
new ReligionMapper(new ReligionCollection(new Title.LandedTitles()), irRegionMapper, new CK3RegionMapper()),
401+
new CultureMapper(irRegionMapper, new CK3RegionMapper(), cultures),
402+
cultures,
403+
new TraitMapper(),
404+
new NicknameMapper(),
405+
new ProvinceMapper(),
406+
new DeathReasonMapper(),
407+
new DNAFactory(irModFS, ck3ModFS),
408+
new TestCK3LocDB(),
409+
new Date(1000, 1, 1, AUC: true),
410+
config);
411+
412+
var ck3Character = ck3Characters["imperator0"];
413+
Assert.Equal("Mallobald_collision_fix", ck3Character.GetName(ck3BookmarkDate));
414+
415+
// Clean up.
416+
File.Delete(overridesFilePath);
417+
}
382418
}

ImperatorToCK3.UnitTests/CK3/Dynasties/DynastyTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using commonItems.Mods;
55
using commonItems.Serialization;
66
using ImperatorToCK3.CK3;
7-
using ImperatorToCK3.CK3.Characters;
87
using ImperatorToCK3.CK3.Dynasties;
98
using ImperatorToCK3.CK3.Religions;
109
using ImperatorToCK3.CK3.Titles;
@@ -23,6 +22,7 @@
2322
using Xunit;
2423
using Character = ImperatorToCK3.CK3.Characters.Character;
2524
using System;
25+
using System.Collections.Frozen;
2626
using CharacterCollection = ImperatorToCK3.Imperator.Characters.CharacterCollection;
2727

2828
// ReSharper disable StringLiteralTypo
@@ -39,6 +39,7 @@ public class DynastyTests {
3939
private static readonly ImperatorRegionMapper IRRegionMapper;
4040
private static readonly CultureMapper CultureMapper;
4141
private static readonly TestCK3CultureCollection Cultures = [];
42+
private static readonly FrozenDictionary<string, string> characterNameOverrides = FrozenDictionary<string, string>.Empty;
4243

4344
static DynastyTests() {
4445
var irProvinces = new ImperatorToCK3.Imperator.Provinces.ProvinceCollection {new(1), new(2), new(3)};
@@ -87,9 +88,9 @@ public Character Build() {
8788
irMapData,
8889
provinceMapper,
8990
deathReasonMapper,
90-
new DNAFactory(IRModFS, ck3ModFS),
9191
new Date(867, 1, 1),
9292
config,
93+
nameOverrides: characterNameOverrides,
9394
unlocalizedImperatorNames: []
9495
);
9596
return character;

ImperatorToCK3.sln.DotSettings

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
<s:Boolean x:Key="/Default/UserDictionary/Words/=legwear/@EntryIndexedValue">True</s:Boolean>
8989
<s:Boolean x:Key="/Default/UserDictionary/Words/=librakaly/@EntryIndexedValue">True</s:Boolean>
9090
<s:Boolean x:Key="/Default/UserDictionary/Words/=magick/@EntryIndexedValue">True</s:Boolean>
91+
<s:Boolean x:Key="/Default/UserDictionary/Words/=mallobald/@EntryIndexedValue">True</s:Boolean>
9192
<s:Boolean x:Key="/Default/UserDictionary/Words/=mapping_0027s/@EntryIndexedValue">True</s:Boolean>
9293
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mauretania/@EntryIndexedValue">True</s:Boolean>
9394
<s:Boolean x:Key="/Default/UserDictionary/Words/=Maurya/@EntryIndexedValue">True</s:Boolean>

ImperatorToCK3/CK3/Characters/Character.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using ImperatorToCK3.Mappers.Trait;
1717
using ImperatorToCK3.Mappers.UnitType;
1818
using Open.Collections;
19+
using System.Collections.Frozen;
1920
using System.Collections.Generic;
2021
using System.Text;
2122
using ZLinq;
@@ -371,9 +372,9 @@ internal Character(
371372
MapData irMapData,
372373
ProvinceMapper provinceMapper, // used to determine ck3 province for religion mapper
373374
DeathReasonMapper deathReasonMapper,
374-
DNAFactory dnaFactory,
375375
Date dateOnConversion,
376376
Configuration config,
377+
FrozenDictionary<string, string> nameOverrides,
377378
ConcurrentHashSet<string> unlocalizedImperatorNames
378379
) {
379380
this.characters = characters;
@@ -395,6 +396,9 @@ ConcurrentHashSet<string> unlocalizedImperatorNames
395396
}
396397
} else {
397398
var nameLoc = ImperatorCharacter.Name;
399+
if (nameOverrides.TryGetValue(nameLoc, out var overrideName)) {
400+
nameLoc = overrideName;
401+
}
398402
var name = nameLoc.Replace(' ', '_');
399403
SetName(name, null);
400404
if (!string.IsNullOrEmpty(name)) {

ImperatorToCK3/CK3/Characters/CharacterCollection.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
using System.Collections.Concurrent;
2222
using System.Collections.Frozen;
2323
using System.Collections.Generic;
24+
using System.IO;
2425
using System.Linq;
2526
using System.Text.RegularExpressions;
2627
using System.Threading.Tasks;
@@ -45,6 +46,8 @@ Configuration config
4546
Logger.Info("Importing Imperator Characters...");
4647

4748
var unlocalizedImperatorNames = new ConcurrentHashSet<string>();
49+
50+
var nameOverrides = GetImperatorCharacterNameOverrides();
4851

4952
var parallelOptions = new ParallelOptions {
5053
MaxDegreeOfParallelism = Environment.ProcessorCount - 1,
@@ -62,9 +65,9 @@ Configuration config
6265
impWorld.MapData,
6366
provinceMapper,
6467
deathReasonMapper,
65-
dnaFactory,
6668
conversionDate,
6769
config,
70+
nameOverrides,
6871
unlocalizedImperatorNames
6972
);
7073
});
@@ -89,6 +92,16 @@ Configuration config
8992
}
9093
}
9194

95+
private static FrozenDictionary<string, string> GetImperatorCharacterNameOverrides() {
96+
const string configurablePath = "configurables/character_name_overrides.txt";
97+
if (!File.Exists(configurablePath)) {
98+
Logger.Warn($"{configurablePath} not found, will not override any Imperator character names.");
99+
return FrozenDictionary<string, string>.Empty;
100+
}
101+
var reader = new BufferedReader(File.ReadAllText(configurablePath));
102+
return reader.GetAssignments().ToFrozenDictionary();
103+
}
104+
92105
private void ImportImperatorCharacter(
93106
Imperator.Characters.Character irCharacter,
94107
ReligionMapper religionMapper,
@@ -100,9 +113,9 @@ private void ImportImperatorCharacter(
100113
MapData irMapData,
101114
ProvinceMapper provinceMapper,
102115
DeathReasonMapper deathReasonMapper,
103-
DNAFactory dnaFactory,
104116
Date endDate,
105117
Configuration config,
118+
FrozenDictionary<string, string> nameOverrides,
106119
ConcurrentHashSet<string> unlocalizedImperatorNames) {
107120
// Create a new CK3 character.
108121
var newCharacter = new Character(
@@ -117,9 +130,9 @@ private void ImportImperatorCharacter(
117130
irMapData,
118131
provinceMapper,
119132
deathReasonMapper,
120-
dnaFactory,
121133
endDate,
122134
config,
135+
nameOverrides,
123136
unlocalizedImperatorNames
124137
);
125138
irCharacter.CK3Character = newCharacter;

ImperatorToCK3/Data_Files/blankMod/output/common/culture/name_lists/IRToCK3_central_germanic.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
Hraugmund Hraugram Hraugric Hroco Ingast Ingbald Inger Ingmund
3535
Ingoht Ingoleik Ingomar Ingram Ingrand Ingrauc Ingric Ingsun
3636
Inguiomer Ingwald Laikwald Leigmund Leikbolad Leikrauc Leko
37-
Malact Malleik Mallobald Mallobaudes Mallovendus Malo Malobald
37+
Malact Malleik Mallobald_collision_fix Mallobaudes Mallovendus Malo Malobald # In CK3 there's a hash collision between the keys "Mallobald" and "laamp_base_contract_schemes.2541.e.tt.employer_has_trait.paranoid", so the key "Mallobald" has been changed to "Mallobald_collision_fix".
38+
3839
Malogan Malogast Maloger Malogund Maloram Malorand Malorauc
3940
Maloric Malowind Malwald Marcobold Marcogan Marcogast Marcoger
4041
Marcogund Marcoleik Marcomer Marcomund Marcoram Marcorauc

ImperatorToCK3/Data_Files/blankMod/output/localization/french/ir_names_l_french.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@
510510
Leko: "Leko"
511511
Malact: "Malact"
512512
Malleik: "Malleik"
513-
Mallobald: "Mallobald"
513+
Mallobald_collision_fix: "Mallobald"
514514
Mallobaudes: "Mallobaudes"
515515
Mallovendus: "Mallovendus"
516516
Malo: "Malo"

ImperatorToCK3/Data_Files/blankMod/output/localization/german/ir_names_l_german.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@
510510
Leko: "Leko"
511511
Malact: "Malact"
512512
Malleik: "Malleik"
513-
Mallobald: "Mallobald"
513+
Mallobald_collision_fix: "Mallobald"
514514
Mallobaudes: "Mallobaudes"
515515
Mallovendus: "Mallovendus"
516516
Malo: "Malo"

ImperatorToCK3/Data_Files/blankMod/output/localization/korean/ir_names_l_korean.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@
510510
Leko: "레코"
511511
Malact: "마랔트"
512512
Malleik: "말라잌"
513-
Mallobald: "말로발드"
513+
Mallobald_collision_fix: "말로발드"
514514
Mallobaudes: "말로바우뎃"
515515
Mallovendus: "말로벤둣"
516516
Malo: "마로"

0 commit comments

Comments
 (0)