Skip to content

Commit 0c7295f

Browse files
committed
Added custom languages
1 parent 96d1e96 commit 0c7295f

File tree

5 files changed

+86
-13
lines changed

5 files changed

+86
-13
lines changed

PolyMod.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</RestoreAdditionalProjectSources>
1212
<Configurations>IL2CPP</Configurations>
1313
<RootNamespace>PolyMod</RootNamespace>
14-
<Version>1.2.11</Version>
14+
<Version>1.2.11-pre</Version>
1515
<PolytopiaVersion>2.16.4.15698</PolytopiaVersion>
1616
<Authors>PolyModdingTeam</Authors>
1717
<Description>The Battle of Polytopia's mod loader.</Description>

src/Loader.cs

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,6 @@ internal record TypeMapping(Type type, bool shouldCreateCache = true);
5151
/// </summary>
5252
internal static List<GameModeButtonsInformation> gamemodes = new();
5353

54-
/// <summary>
55-
/// A dictionary of skin types of tribes, which can flood tiles, keyed by custom flood tile effect.
56-
/// </summary>
57-
internal static Dictionary<TileData.EffectType, SkinType> customFloodingSkins = new();
58-
5954
/// <summary>
6055
/// Handlers for processing specific data types during mod loading.
6156
/// </summary>
@@ -105,7 +100,7 @@ out TribeAbility.Type tribeAbilityType
105100
string tileEffectId = skinId.ToLowerInvariant() + "_flood";
106101
EnumCache<TileData.EffectType>.AddMapping(tileEffectId, (TileData.EffectType)Registry.autoidx);
107102
EnumCache<TileData.EffectType>.AddMapping(tileEffectId, (TileData.EffectType)Registry.autoidx);
108-
customFloodingSkins.Add((TileData.EffectType)Registry.autoidx, skinValue);
103+
Visual.customFloodingSkins.Add((TileData.EffectType)Registry.autoidx, skinValue);
109104
Plugin.logger.LogInfo("Created mapping for tileEffect with id " + tileEffectId + " and index " + Registry.autoidx);
110105
Registry.autoidx++;
111106
}
@@ -407,6 +402,17 @@ internal static void LoadMods(Dictionary<string, Mod> mods, out bool dependencyC
407402
{
408403
LoadSpriteInfoFile(mod, file);
409404
}
405+
Match languageMatch = Regex.Match(Path.GetFileName(file.name), @"^language(?:_(.*))?\.json$");
406+
if (languageMatch.Success)
407+
{
408+
string languageName = languageMatch.Groups[1].Value;
409+
LoadLanguageFile(
410+
mod,
411+
file,
412+
languageName
413+
);
414+
continue;
415+
}
410416
}
411417
if (!mod.client && id != "polytopia")
412418
{
@@ -589,6 +595,23 @@ public static void LoadLocalizationFile(Mod mod, Mod.File file)
589595
}
590596
}
591597

598+
public static void LoadLanguageFile(Mod mod, Mod.File file, string languageName)
599+
{
600+
try
601+
{
602+
var dict = JsonSerializer.Deserialize<Dictionary<string, string>>(file.bytes);
603+
if(dict != null)
604+
{
605+
Loc.languagesToAdd.Add(languageName, dict);
606+
Plugin.logger.LogInfo($"Registered language from {mod.id} mod");
607+
}
608+
}
609+
catch (Exception e)
610+
{
611+
Plugin.logger.LogError($"Error on loading language file from {mod.id} mod: {e.StackTrace}");
612+
}
613+
}
614+
592615
/// <summary>
593616
/// Loads a sprite file from a mod.
594617
/// </summary>

src/Managers/Loc.cs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ namespace PolyMod.Managers;
1111
/// </summary>
1212
public static class Loc
1313
{
14+
internal static Dictionary<string, Dictionary<string, string>> languagesToAdd = new();
1415
/// <summary>
1516
/// Patches the localization getter to handle custom enum values.
1617
/// </summary>
@@ -89,6 +90,48 @@ public static void BuildAndLoadLocalization(Dictionary<string, Dictionary<string
8990
}
9091
}
9192

93+
[HarmonyPrefix]
94+
[HarmonyPatch(typeof(Localization), nameof(Localization.Init))]
95+
public static bool Localization_Init()
96+
{
97+
if (Localization.initialized)
98+
return true;
99+
100+
if (LocalizationManager.Sources.Count == 0)
101+
LocalizationManager.UpdateSources();
102+
103+
foreach(var name in languagesToAdd.Keys)
104+
{
105+
Dictionary<string, string> terms = languagesToAdd[name];
106+
107+
LanguageSourceData source = LocalizationManager.Sources[0];
108+
int languageIndex = source.GetLanguageIndex(name);
109+
string languageName = terms["language"];
110+
if (languageIndex == -1)
111+
{
112+
source.AddLanguage(languageName, name);
113+
languageIndex = source.GetLanguageIndex(languageName);
114+
}
115+
116+
foreach (var kvp in terms)
117+
{
118+
TermData term = source.GetTermData(kvp.Key);
119+
if (term == null)
120+
{
121+
source.AddTerm(kvp.Key);
122+
term = source.GetTermData(kvp.Key);
123+
}
124+
125+
term.Languages[languageIndex] = kvp.Value;
126+
}
127+
128+
LocalizationManager.UpdateSources();
129+
130+
Plugin.logger.LogInfo($"{name} language added and loaded!");
131+
}
132+
return true;
133+
}
134+
92135
/// <summary>
93136
/// Initializes the Loc manager by patching the necessary methods.
94137
/// </summary>

src/Managers/Main.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -388,12 +388,14 @@ internal static void Load(GameLogicData gameLogicData, JObject json)
388388
if (mod.status != Mod.Status.Success) continue;
389389
foreach (var file in mod.files)
390390
{
391+
if (mod.status != Mod.Status.Success) break;
391392
if (Path.GetFileName(file.name) == "localization.json")
392393
{
393394
Loader.LoadLocalizationFile(mod, file);
394395
continue;
395396
}
396-
if (Regex.IsMatch(Path.GetFileName(file.name), @"^patch(_.*)?\.json$"))
397+
Match patchMatch = Regex.Match(Path.GetFileName(file.name), @"^patch(_.*)?\.json$");
398+
if (patchMatch.Success)
397399
{
398400
var patchText = new StreamReader(new MemoryStream(file.bytes)).ReadToEnd();
399401
var template = new Api.GldConfigTemplate(patchText, mod.id);
@@ -410,7 +412,8 @@ internal static void Load(GameLogicData gameLogicData, JObject json)
410412
);
411413
continue;
412414
}
413-
if (Regex.IsMatch(Path.GetFileName(file.name), @"^prefab(_.*)?\.json$"))
415+
Match prefabMatch = Regex.Match(Path.GetFileName(file.name), @"^prefab(?:_(.*))?\.json$");
416+
if (prefabMatch.Success)
414417
{
415418
Loader.LoadPrefabInfoFile(
416419
mod,

src/Managers/Visual.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,10 @@ public UnitPrefabInfo(string type, string tribe, string skin)
7070
private static bool firstTimeOpeningPreview = true;
7171
private static UnitData.Type currentUnitTypeUI = UnitData.Type.None;
7272
private static TribeType attackerTribe = TribeType.None;
73+
/// <summary>
74+
/// A dictionary of skin types of tribes, which can flood tiles, keyed by custom flood tile effect.
75+
/// </summary>
76+
internal static Dictionary<TileData.EffectType, SkinType> customFloodingSkins = new();
7377

7478
/// <summary>The type of a custom prefab.</summary>
7579
public enum PrefabType
@@ -312,9 +316,9 @@ private static void TerrainRenderer_UpdateGraphics(TerrainRenderer __instance, T
312316
{
313317
foreach (var effect in tile.data.effects)
314318
{
315-
if(Loader.customFloodingSkins.ContainsKey(effect))
319+
if(customFloodingSkins.ContainsKey(effect))
316320
{
317-
skinType = Loader.customFloodingSkins[effect];
321+
skinType = customFloodingSkins[effect];
318322
break;
319323
}
320324
}
@@ -355,9 +359,9 @@ private static void TerrainRenderer_UpdateGraphics(TerrainRenderer __instance, T
355359
[HarmonyPatch(typeof(TileData), nameof(TileData.Flood))]
356360
private static void TileData_Flood(TileData __instance, PlayerState playerState)
357361
{
358-
if(Loader.customFloodingSkins.ContainsValue(playerState.skinType))
362+
if(customFloodingSkins.ContainsValue(playerState.skinType))
359363
{
360-
TileData.EffectType effectType = Loader.customFloodingSkins.FirstOrDefault(x => x.Value == playerState.skinType).Key;
364+
TileData.EffectType effectType = customFloodingSkins.FirstOrDefault(x => x.Value == playerState.skinType).Key;
361365
__instance.AddEffect(effectType);
362366
}
363367
}

0 commit comments

Comments
 (0)