Skip to content

Commit ec48ae3

Browse files
Merge branch 'dev1.2' into techbranch
2 parents 2528d45 + 41817ee commit ec48ae3

8 files changed

Lines changed: 299 additions & 49 deletions

File tree

PolyMod.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
https://polymod.dev/nuget/v3/index.json;
1111
</RestoreAdditionalProjectSources>
1212
<Configurations>IL2CPP</Configurations>
13-
<Version>1.2.0-pre</Version>
13+
<Version>1.2.0-pre.1</Version>
1414
<PolytopiaVersion>2.13.0.14200</PolytopiaVersion>
1515
<Authors>PolyModdingTeam</Authors>
1616
<Description>The Battle of Polytopia's mod loader.</Description>

resources/localization.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,5 +160,29 @@
160160
"Portuguese (Brazil)": "Essa versão do PolyMod não foi desenvolvida para a versão atual do aplicativo e pode não funcionar corretamente!",
161161
"Elyrion": "πȱ∫ỹmȱδ ƒƒƒƒƒƒƒ ŋȱŧ ȱrrȱ #₺rr∑ŋŧ ƒƒƒƒƒƒƒ ỹ maỹ ŋȱŧ ~ȱr§ #ȱrr∑#ŧ∫ỹ!",
162162
"German (Germany)": "Diese Version von PolyMod ist nicht für die aktuelle Version der Anwendung ausgelegt und könnte nicht funktionieren!"
163+
},
164+
"polymod_hub_config": {
165+
"English": "SETTINGS"
166+
},
167+
"polymod_hub_debugenable": {
168+
"English": "ENABLE DEBUG"
169+
},
170+
"polymod_hub_debugdisable": {
171+
"English": "DISABLE DEBUG"
172+
},
173+
"polymod_hub_debugswitch": {
174+
"English": "Debug set to {0}."
175+
},
176+
"polymod_hub_updatespriteinfos": {
177+
"English": "UPDATE SPRITES"
178+
},
179+
"polymod_spriteinfo_updated": {
180+
"English": "Sprite info for mod {0} updated."
181+
},
182+
"polymod_spriteinfo_notupdated": {
183+
"English": "No sprite infos were found."
184+
},
185+
"polymod_popup_header": {
186+
"English": "POLYMOD"
163187
}
164188
}

src/Loader.cs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -303,24 +303,44 @@ public static void LoadSpriteFile(Mod mod, Mod.File file)
303303
Registry.sprites.Add(name, sprite);
304304
}
305305

306-
public static void LoadSpriteInfoFile(Mod mod, Mod.File file)
306+
public static void UpdateSprite(string name)
307+
{
308+
if (Registry.spriteInfos.ContainsKey(name) && Registry.sprites.ContainsKey(name))
309+
{
310+
Visual.SpriteInfo spriteData = Registry.spriteInfos[name];
311+
Sprite sprite = Visual.BuildSpriteWithTexture(Registry.sprites[name].texture, spriteData.pivot, (float)spriteData.pixelsPerUnit);
312+
GameManager.GetSpriteAtlasManager().cachedSprites["Heads"][name] = sprite;
313+
Registry.sprites[name] = sprite;
314+
}
315+
}
316+
317+
public static Dictionary<string, Visual.SpriteInfo>? LoadSpriteInfoFile(Mod mod, Mod.File file)
307318
{
308319
try
309320
{
310-
Registry.spriteInfos = Registry.spriteInfos
311-
.Concat(JsonSerializer.Deserialize<Dictionary<string, Visual.SpriteInfo>>(
312-
file.bytes,
313-
new JsonSerializerOptions()
314-
{
315-
Converters = { new Vector2Json() },
316-
}
317-
)!)
318-
.ToDictionary(e => e.Key, e => e.Value);
319-
Plugin.logger.LogInfo($"Registried sprite data from {mod.id} mod");
321+
var deserialized = JsonSerializer.Deserialize<Dictionary<string, Visual.SpriteInfo>>(
322+
file.bytes,
323+
new JsonSerializerOptions()
324+
{
325+
Converters = { new Vector2Json() },
326+
}
327+
);
328+
329+
if (deserialized != null)
330+
{
331+
foreach (var kvp in deserialized)
332+
{
333+
Registry.spriteInfos[kvp.Key] = kvp.Value;
334+
}
335+
}
336+
337+
Plugin.logger.LogInfo($"Registered sprite data from {mod.id} mod");
338+
return deserialized;
320339
}
321340
catch (Exception e)
322341
{
323342
Plugin.logger.LogError($"Error on loading sprite data from {mod.id} mod: {e.Message}");
343+
return null;
324344
}
325345
}
326346

src/Managers/Compatibility.cs

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
namespace PolyMod.Managers;
77
internal static class Compatibility
88
{
9-
internal static string signature = string.Empty;
10-
internal static string looseSignature = string.Empty;
9+
internal static string checksum = string.Empty;
10+
internal static bool shouldResetSettings = false;
1111
private static bool sawSignatureWarning;
1212

13-
public static void HashSignatures(StringBuilder looseSignatureString, StringBuilder signatureString)
13+
public static void HashSignatures(StringBuilder checksumString)
1414
{
15-
looseSignature = Util.Hash(looseSignatureString);
16-
signature = Util.Hash(signatureString);
15+
checksum = Util.Hash(checksumString);
1716
}
1817

1918
private static bool CheckSignatures(Action<int, BaseEventData> action, int id, BaseEventData eventData, Il2CppSystem.Guid gameId)
@@ -24,15 +23,15 @@ private static bool CheckSignatures(Action<int, BaseEventData> action, int id, B
2423
return true;
2524
}
2625

27-
string[] signatures = { string.Empty, string.Empty };
26+
string signature = string.Empty;
2827
try
2928
{
30-
signatures = File.ReadAllLines(Path.Combine(Application.persistentDataPath, $"{gameId}.signatures"));
29+
signature = File.ReadAllText(Path.Combine(Application.persistentDataPath, $"{gameId}.signatures"));
3130
}
3231
catch { }
33-
if (signatures[0] == string.Empty && signatures[1] == string.Empty) return true;
32+
if (signature == string.Empty) return true;
3433
if (Plugin.config.debug) return true;
35-
if (looseSignature != signatures[0])
34+
if (checksum != signature)
3635
{
3736
PopupManager.GetBasicPopup(new(
3837
Localization.Get("polymod.signature.mismatch"),
@@ -43,30 +42,29 @@ private static bool CheckSignatures(Action<int, BaseEventData> action, int id, B
4342
)).Show();
4443
return false;
4544
}
46-
if (signature != signatures[1])
47-
{
48-
PopupManager.GetBasicPopup(new(
49-
Localization.Get("polymod.signature.mismatch"),
50-
Localization.Get("polymod.signature.maybe.incompatible"),
51-
new(new PopupBase.PopupButtonData[] {
52-
new(
53-
"OK",
54-
callback: (UIButtonBase.ButtonAction)((int _, BaseEventData _) => {
55-
sawSignatureWarning = true;
56-
action(id, eventData);
57-
})
58-
)
59-
})
60-
)).Show();
61-
return false;
62-
}
6345
return true;
6446
}
6547

6648
[HarmonyPostfix]
6749
[HarmonyPatch(typeof(StartScreen), nameof(StartScreen.Start))]
6850
private static void StartScreen_Start()
6951
{
52+
string lastChecksum = checksum;
53+
try
54+
{
55+
lastChecksum = new(File.ReadAllText(Plugin.CHECKSUM_PATH));
56+
}
57+
catch (FileNotFoundException){}
58+
59+
File.WriteAllText(
60+
Plugin.CHECKSUM_PATH,
61+
checksum
62+
);
63+
if (lastChecksum != checksum)
64+
{
65+
shouldResetSettings = true;
66+
}
67+
7068
Version incompatibilityWarningLastVersion = Plugin.POLYTOPIA_VERSION.CutRevision();
7169
try
7270
{
@@ -139,10 +137,29 @@ private static void ClientBase_CreateSession(GameSettings settings, Il2CppSystem
139137
{
140138
File.WriteAllLinesAsync(
141139
Path.Combine(Application.persistentDataPath, $"{gameId}.signatures"),
142-
new string[] { looseSignature, signature }
140+
new string[] { checksum }
143141
);
144142
}
145143

144+
[HarmonyPrefix]
145+
[HarmonyPatch(typeof(TribeSelectorScreen), nameof(TribeSelectorScreen.Show))]
146+
private static bool TribeSelectorScreen_Show(bool instant = false)
147+
{
148+
if (shouldResetSettings)
149+
{
150+
RestorePreliminaryGameSettings();
151+
shouldResetSettings = false;
152+
}
153+
return true;
154+
}
155+
156+
internal static void RestorePreliminaryGameSettings()
157+
{
158+
GameManager.PreliminaryGameSettings.disabledTribes.Clear();
159+
GameManager.PreliminaryGameSettings.selectedSkins.Clear();
160+
GameManager.PreliminaryGameSettings.SaveToDisk();
161+
}
162+
146163
internal static void Init()
147164
{
148165
Harmony.CreateAndPatchAll(typeof(Compatibility));

0 commit comments

Comments
 (0)