From 75060fc05ea1321d00074296303eb5bcecc99590 Mon Sep 17 00:00:00 2001 From: SillyStar-Github <90102598+SillyStar-Github@users.noreply.github.com> Date: Tue, 31 Mar 2026 05:08:55 -0400 Subject: [PATCH] more code changes --- MelonLoader/AssetStore/StringStore.cs | 6 + MelonLoader/FileLoader.cs | 108 +++++++++--------- MelonLoader/ModFeatures.cs | 14 +-- .../BaseTextObjects/InGameText_Patch.cs | 14 +++ .../ButtonObjects/OptLanguageBtn_Patch.cs | 34 +++--- .../Patches/Managers/DrawCardManager_Patch.cs | 3 - .../Patches/Managers/InGameUI_Patch.cs | 2 +- .../Modes/Harvest/GardenBagMenu_Patch.cs | 37 +----- MelonLoader/Utils.cs | 22 +++- 9 files changed, 122 insertions(+), 118 deletions(-) diff --git a/MelonLoader/AssetStore/StringStore.cs b/MelonLoader/AssetStore/StringStore.cs index 767563e..6c0d1a3 100644 --- a/MelonLoader/AssetStore/StringStore.cs +++ b/MelonLoader/AssetStore/StringStore.cs @@ -12,8 +12,12 @@ namespace PvZ_Fusion_Translator.AssetStore public static Dictionary translationString = new(); + public static Dictionary izLevelTipDictionary = new(); + public static Dictionary izTipCollectionString = new(); + public static Dictionary fsLevelTipDictionary = new(); + public static Dictionary fsTipCollectionString = new(); public static Dictionary> patchesStore = new() @@ -74,7 +78,9 @@ namespace PvZ_Fusion_Translator.AssetStore { translationString.Clear(); translationStringRegex.Clear(); + izLevelTipDictionary.Clear(); izTipCollectionString.Clear(); + fsLevelTipDictionary.Clear(); fsTipCollectionString.Clear(); FileLoader.LoadStrings(); } diff --git a/MelonLoader/FileLoader.cs b/MelonLoader/FileLoader.cs index cd701f6..bb70c78 100644 --- a/MelonLoader/FileLoader.cs +++ b/MelonLoader/FileLoader.cs @@ -3,11 +3,14 @@ using Il2CppInterop.Runtime.InteropTypes.Arrays; using JetBrains.Annotations; using MelonLoader; using MelonLoader.TinyJSON; +using Newtonsoft.Json; using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.Patches.GameObjects; using PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects; using PvZ_Fusion_Translator.Patches.Modes.Odyssey; using PvZ_Fusion_Translator.Patches.OtherManagers; +using System.CodeDom.Compiler; +using System.Text; using System.Text.Encodings.Web; using System.Text.Json; using UnityEngine; @@ -77,17 +80,21 @@ namespace PvZ_Fusion_Translator if(travelBuffsContent != null) { - TravelMgr_Patch.translatedTravelBuffs = JsonSerializer.Deserialize>>(travelBuffsContent); + TravelMgr_Patch.translatedTravelBuffs = System.Text.Json.JsonSerializer.Deserialize>>(travelBuffsContent); } else { string travelBuffsPath = Path.Combine(GetAssetDir(AssetType.Strings, Utils.Language), "travel_buffs.json"); if(File.Exists(travelBuffsPath)) { - TravelMgr_Patch.translatedTravelBuffs = JsonSerializer.Deserialize>>(File.ReadAllText(travelBuffsPath)); + TravelMgr_Patch.translatedTravelBuffs = System.Text.Json.JsonSerializer.Deserialize>>(File.ReadAllText(travelBuffsPath)); } } + // load changelog + + LoadChangelogText(); + // load tips string izTipsContent = Utils.GetDataFromWeb($"https://raw.githubusercontent.com/Teyliu/PVZF-Translation/refs/heads/main/PvZ_Fusion_Translator/Localization/{Utils.Language.ToString()}/Strings/tips_iz.json").Result; @@ -152,6 +159,8 @@ namespace PvZ_Fusion_Translator } } + // load abyss buffs + Patches.Modes.Abyss.AbyssBuffMenu_Patch.LoadAbyssBuffData(); SaveStrings(); @@ -192,7 +201,7 @@ namespace PvZ_Fusion_Translator } else if(fileName.EndsWith("travel_buffs")) { - TravelMgr_Patch.translatedTravelBuffs = JsonSerializer.Deserialize>>(jsonString); + TravelMgr_Patch.translatedTravelBuffs = System.Text.Json.JsonSerializer.Deserialize>>(jsonString); } else if(fileName.EndsWith("tips_iz")) { @@ -202,6 +211,10 @@ namespace PvZ_Fusion_Translator { LoadFSStrings(jsonString); } + else if(fileName.EndsWith("abyss_buffs")) + { + Patches.Modes.Abyss.AbyssBuffMenu_Patch.LoadAbyssBuffData(); + } } string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language); @@ -255,7 +268,7 @@ namespace PvZ_Fusion_Translator var izLevelData = izDump.Item1; var izLevelDataDump = izDump.Item2; - var izTranslatedTips = JsonSerializer.Deserialize>(content); + var izTranslatedTips = System.Text.Json.JsonSerializer.Deserialize>(content); foreach (var level in izLevelData) { @@ -265,6 +278,7 @@ namespace PvZ_Fusion_Translator { if(izTranslatedTips.ContainsKey(level.name) && !StringStore.izTipCollectionString.ContainsKey(levelData.tips)) { + StringStore.izLevelTipDictionary.Add(level.name, izTranslatedTips[level.name]); StringStore.izTipCollectionString.Add(levelData.tips, izTranslatedTips[level.name]); } } @@ -277,7 +291,7 @@ namespace PvZ_Fusion_Translator var fusionShowcaseData = fusionShowcaseDump.Item1; var fusionShowcaseDataDump = fusionShowcaseDump.Item2; - var fsTranslatedTips = JsonSerializer.Deserialize>(content); + var fsTranslatedTips = System.Text.Json.JsonSerializer.Deserialize>(content); foreach (var level in fusionShowcaseData) { @@ -287,6 +301,7 @@ namespace PvZ_Fusion_Translator { if (fsTranslatedTips.ContainsKey(level.name) && !StringStore.fsTipCollectionString.ContainsKey(levelData.tips)) { + StringStore.fsLevelTipDictionary.Add(level.name, fsTranslatedTips[level.name]); StringStore.fsTipCollectionString.Add(levelData.tips, fsTranslatedTips[level.name]); } } @@ -503,51 +518,31 @@ namespace PvZ_Fusion_Translator // save regexs - string translationStringRegex = System.Text.Json.JsonSerializer.Serialize(StringStore.translationStringRegex, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string translationStringRegex = SerializeWithIndentation(StringStore.translationStringRegex, 2); File.WriteAllText(Path.Combine(stringDir, "translation_regexs.json"), translationStringRegex); // save strings - string translationString = System.Text.Json.JsonSerializer.Serialize(StringStore.translationString, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string translationString = SerializeWithIndentation(StringStore.translationString, 2); File.WriteAllText(Path.Combine(stringDir, "translation_strings.json"), translationString); // save iz tips - string izTipCollectionString = System.Text.Json.JsonSerializer.Serialize(StringStore.izTipCollectionString, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string izTipCollectionString = SerializeWithIndentation(StringStore.izLevelTipDictionary, 1, ' '); File.WriteAllText(Path.Combine(stringDir, "tips_iz.json"), izTipCollectionString); // save fs tips - string fsTipCollectionString = System.Text.Json.JsonSerializer.Serialize(StringStore.fsTipCollectionString, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string fsLevelTipDictionary = SerializeWithIndentation(StringStore.fsLevelTipDictionary); - File.WriteAllText(Path.Combine(stringDir, "tips_fs.json"), fsTipCollectionString); + File.WriteAllText(Path.Combine(stringDir, "tips_fs.json"), fsLevelTipDictionary); // save travel buffs - string travelBuffs = System.Text.Json.JsonSerializer.Serialize(TravelMgr_Patch.translatedTravelBuffs, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string travelBuffs = SerializeWithIndentation(TravelMgr_Patch.translatedTravelBuffs); File.WriteAllText(Path.Combine(stringDir, "travel_buffs.json"), travelBuffs); @@ -562,11 +557,7 @@ namespace PvZ_Fusion_Translator if(Patches.Modes.Abyss.AbyssBuffMenu_Patch.abyssBuffData != new Dictionary()) { - string abyssBuffData = System.Text.Json.JsonSerializer.Serialize(Patches.Modes.Abyss.AbyssBuffMenu_Patch.abyssBuffData, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string abyssBuffData = SerializeWithIndentation(Patches.Modes.Abyss.AbyssBuffMenu_Patch.abyssBuffData, 2); File.WriteAllText(Path.Combine(stringDir, "abyss_buffs.json"), abyssBuffData); } @@ -576,27 +567,36 @@ namespace PvZ_Fusion_Translator if(AlmanacPlantMenu_Patch.almanacJson != "") { - string plantAlmanac = System.Text.Json.JsonSerializer.Serialize(AlmanacPlantMenu_Patch.almanacJson, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string plantAlmanac = SerializeWithIndentation(AlmanacPlantMenu_Patch.almanacJson); File.WriteAllText(Path.Combine(almanacDir, "LawnStringsTranslate.json"), AlmanacPlantMenu_Patch.almanacJson); } if(AlmanacZombieMenu_Patch.almanacJson != "") { - string zombieAlmanac = System.Text.Json.JsonSerializer.Serialize(AlmanacZombieMenu_Patch.almanacJson, new JsonSerializerOptions - { - WriteIndented = true, - Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping - }); + string zombieAlmanac = SerializeWithIndentation(AlmanacZombieMenu_Patch.almanacJson); File.WriteAllText(Path.Combine(almanacDir, "ZombieStringsTranslate.json"), AlmanacZombieMenu_Patch.almanacJson); } } + public static string SerializeWithIndentation(T value, int size = 4, char indentChar = ' ') + { + var stringBuilder = new StringBuilder(); + var stringWriter = new StringWriter(); + using (JsonTextWriter writer = new JsonTextWriter(stringWriter)) + { + writer.Formatting = Formatting.Indented; + writer.Indentation = size; + writer.IndentChar = indentChar; + + Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); + serializer.Serialize(writer, value, typeof(T)); + } + + return stringWriter.ToString(); + } + public static void DumpJson() { string dumpDir = GetAssetDir(AssetType.Dumps); @@ -617,18 +617,18 @@ namespace PvZ_Fusion_Translator var izLevelData = izDump.Item1; var izLevelDataDump = izDump.Item2; - File.WriteAllText(Path.Combine(dumpDir, "tips_iz.json"), JsonSerializer.Serialize(izLevelDataDump, new JsonSerializerOptions + File.WriteAllText(Path.Combine(dumpDir, "tips_iz.json"), System.Text.Json.JsonSerializer.Serialize(izLevelDataDump, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping })); // dump fusion showcase tips - var fusionShowcaseDump = DumpIZStrings(); - var fusionShowcaseData = izDump.Item1; - var fusionShowcaseDataDump = izDump.Item2; + var fusionShowcaseDump = DumpFSStrings(); + var fusionShowcaseData = fusionShowcaseDump.Item1; + var fusionShowcaseDataDump = fusionShowcaseDump.Item2; - File.WriteAllText(Path.Combine(dumpDir, "tips_fs.json"), JsonSerializer.Serialize(fusionShowcaseDataDump, new JsonSerializerOptions + File.WriteAllText(Path.Combine(dumpDir, "tips_fs.json"), System.Text.Json.JsonSerializer.Serialize(fusionShowcaseDataDump, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping @@ -639,7 +639,7 @@ namespace PvZ_Fusion_Translator { achievementsList.Add(entry.Key, new AchievementObject(entry.Key, entry.Value.Item1, entry.Value.Item2)); } - File.WriteAllText(Path.Combine(dumpDir, "AchievementsText.json"), JsonSerializer.Serialize(achievementsList, new JsonSerializerOptions + File.WriteAllText(Path.Combine(dumpDir, "AchievementsText.json"), System.Text.Json.JsonSerializer.Serialize(achievementsList, new JsonSerializerOptions { WriteIndented = true, Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping @@ -695,7 +695,7 @@ namespace PvZ_Fusion_Translator } string json = File.ReadAllText(jsonFile); - var untranslatedStrings = JsonSerializer.Deserialize>(json); + var untranslatedStrings = System.Text.Json.JsonSerializer.Deserialize>(json); if (!untranslatedStrings.ContainsKey(text)) { @@ -705,7 +705,7 @@ namespace PvZ_Fusion_Translator Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, WriteIndented = true }; - File.WriteAllText(jsonFile, JsonSerializer.Serialize(untranslatedStrings, options)); + File.WriteAllText(jsonFile, System.Text.Json.JsonSerializer.Serialize(untranslatedStrings, options)); } } #endif diff --git a/MelonLoader/ModFeatures.cs b/MelonLoader/ModFeatures.cs index 90753bf..37054bb 100644 --- a/MelonLoader/ModFeatures.cs +++ b/MelonLoader/ModFeatures.cs @@ -10,8 +10,7 @@ namespace PvZ_Fusion_Translator public enum ModType { ReloadStrings, - ReloadTextures, - SwapLocalData + ReloadTextures } private class ModFeature @@ -44,22 +43,13 @@ namespace PvZ_Fusion_Translator Core.ShowToast("Textures Reloaded!"); return; } - - if(this.ModType == ModType.SwapLocalData) - { - Utils.SwapLocalData(); - string toast = (Utils.useLocal) ? "Using Local Data..." : "Using Online Data..."; - Core.ShowToast(toast); - return; - } } } private static Dictionary featureLists = new() { {ModType.ReloadStrings,new ModFeature("Reload Strings",ModType.ReloadStrings,KeyCode.Home, true)}, - {ModType.ReloadTextures,new ModFeature("Reload Textures",ModType.ReloadTextures,KeyCode.End, true)}, - {ModType.SwapLocalData,new ModFeature("Swap Level Data Type",ModType.SwapLocalData,KeyCode.PageUp, true)}, + {ModType.ReloadTextures,new ModFeature("Reload Textures",ModType.ReloadTextures,KeyCode.End, true)} }; diff --git a/MelonLoader/Patches/BaseTextObjects/InGameText_Patch.cs b/MelonLoader/Patches/BaseTextObjects/InGameText_Patch.cs index 26b5636..beb96e1 100644 --- a/MelonLoader/Patches/BaseTextObjects/InGameText_Patch.cs +++ b/MelonLoader/Patches/BaseTextObjects/InGameText_Patch.cs @@ -20,6 +20,10 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects [HarmonyPostfix] public static void ShowText(InGameText __instance) { + if(__instance.textHead == null) return; + + if(!__instance.textHead.active) return; + TranslateInGameText(__instance); } @@ -27,6 +31,10 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects [HarmonyPostfix] public static void DebugWarning(InGameText __instance) { + if(__instance.textHead == null) return; + + if(!__instance.textHead.active) return; + TranslateInGameText(__instance); } @@ -34,6 +42,10 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects [HarmonyPostfix] public static void Update(InGameText __instance) { + if(__instance.textHead == null) return; + + if(!__instance.textHead.active) return; + TranslateInGameText(__instance); } @@ -41,6 +53,8 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects { if (__instance.textMesh == null) return; + if(!__instance.textHead.active) return; + TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); currentText = __instance.textMesh.text; diff --git a/MelonLoader/Patches/GameObjects/ButtonObjects/OptLanguageBtn_Patch.cs b/MelonLoader/Patches/GameObjects/ButtonObjects/OptLanguageBtn_Patch.cs index d740bc5..0695f5b 100644 --- a/MelonLoader/Patches/GameObjects/ButtonObjects/OptLanguageBtn_Patch.cs +++ b/MelonLoader/Patches/GameObjects/ButtonObjects/OptLanguageBtn_Patch.cs @@ -42,8 +42,8 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects private static List AvailableToggles; private const int LanguagesPerPage = 5; private static int currentPage = 0; - private static OptionBtn[] buttonSlots = new OptionBtn[6]; // 5 language buttons + 1 next button - private static OptionBtn[] toggleSlots = new OptionBtn[3]; + public static OptionBtn[] buttonSlots = new OptionBtn[6]; // 5 language buttons + 1 next button + public static OptionBtn[] toggleSlots = new OptionBtn[3]; public static void CreateLanguageButtons(OptionBtn templateButton) { @@ -160,7 +160,13 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects data.Toggle = toggle; data.IsNextButton = false; btn.gameObject.SetActive(true); - UpdateButtonText(btn, StringStore.TranslateText(Utils.ToggleNames[toggle]), FontStore.LoadTMPFont(Utils.Language.ToString())); + string buttonText = Utils.ToggleNames[toggle]; + UpdateButtonText(btn, StringStore.TranslateText(buttonText), FontStore.LoadTMPFont(Utils.Language.ToString())); + if(i == 2) + { + string sourceMsg = "" + (!(Utils.useLocal) ? "Translation Source:\nOnline" : "Translation Source:\nLocal"); + FlashMessage(btn, sourceMsg, 0.1f, false); + } } else { @@ -211,7 +217,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects } } - private static void FlashMessage(OptionBtn button, string message, float yShift = 0.0f) + public static void FlashMessage(OptionBtn button, string message, float yShift = 0.0f, bool useTimer = true) { var child = button.transform.GetChild(0); if (child != null) @@ -236,13 +242,16 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects } child.gameObject.SetActive(true); - System.Threading.Tasks.Task.Delay(1000).ContinueWith(_ => + if(useTimer) { - if (button != null && child != null && child.gameObject.activeSelf) + System.Threading.Tasks.Task.Delay(1000).ContinueWith(_ => { - child.gameObject.SetActive(false); - } - }); + if (button != null && child != null && child.gameObject.activeSelf) + { + child.gameObject.SetActive(false); + } + }); + } } } @@ -266,7 +275,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects if (type == "SwapLocal") { - Utils.SwapLocalData(); + Utils.WarnLocalData(); } MelonPreferences.Save(); @@ -327,11 +336,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects else if (toggleType == "Audio") { FlashMessage(toggleData.Button, "Toggled custom audio!", 0.1f); - } - else if (toggleType == "SwapLocal") - { - string message = (Utils.useLocal) ? "Switched to local translations!" : "Switched to online translations!"; - FlashMessage(toggleData.Button, message, 0.1f); } } } diff --git a/MelonLoader/Patches/Managers/DrawCardManager_Patch.cs b/MelonLoader/Patches/Managers/DrawCardManager_Patch.cs index 20489ac..f8ccd3b 100644 --- a/MelonLoader/Patches/Managers/DrawCardManager_Patch.cs +++ b/MelonLoader/Patches/Managers/DrawCardManager_Patch.cs @@ -33,8 +33,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects } } - - [HarmonyPatch(nameof(DrawCardManager.Update))] [HarmonyPostfix] private static void Postfix_Update(DrawCardManager __instance) @@ -55,7 +53,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects } } } - } } } diff --git a/MelonLoader/Patches/Managers/InGameUI_Patch.cs b/MelonLoader/Patches/Managers/InGameUI_Patch.cs index 8e2f646..670187b 100644 --- a/MelonLoader/Patches/Managers/InGameUI_Patch.cs +++ b/MelonLoader/Patches/Managers/InGameUI_Patch.cs @@ -15,7 +15,7 @@ namespace PvZ_Fusion_Translator.Patches.Managers [HarmonyPostfix] private static void Start(InGameUI __instance) { - foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren()) + foreach(TextMeshProUGUI text in __instance.T) { if (text.text == null) continue; diff --git a/MelonLoader/Patches/Modes/Harvest/GardenBagMenu_Patch.cs b/MelonLoader/Patches/Modes/Harvest/GardenBagMenu_Patch.cs index 3f009bd..958b0dc 100644 --- a/MelonLoader/Patches/Modes/Harvest/GardenBagMenu_Patch.cs +++ b/MelonLoader/Patches/Modes/Harvest/GardenBagMenu_Patch.cs @@ -9,44 +9,17 @@ namespace PvZ_Fusion_Translator.Patches.Modes.Harvest [HarmonyPatch(typeof(GardenBagMenu))] public static class GardenBagMenu_Patch { - [HarmonyPatch(nameof(GardenBagMenu.SetTreasureCards))] + [HarmonyPatch(nameof(GardenBagMenu.Awake))] [HarmonyPostfix] - private static void SetTreasureCards(GardenBagMenu __instance) + private static void Awake(GardenBagMenu __instance) { TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); - foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren()) + Transform closeButtonTransform = __instance.transform.Find("Close"); + foreach(TextMeshProUGUI text in closeButtonTransform.GetComponentsInChildren()) { - if (txt.transform.parent.name.Contains("Close")) - { - txt.text = StringStore.TranslateText("合上"); - } - else - { - txt.text = StringStore.TranslateText(txt.text); - } - txt.font = fontAsset; + text.text = StringStore.TranslateText("合上"); } } - - //[HarmonyPatch(nameof(GardenBagMenu.SetTreasureCard))] - //[HarmonyPostfix] - //private static void SetTreasureCard(GardenBagMenu __instance) - //{ - // //TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); - - // //foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren()) - // //{ - // // if (txt.transform.parent.name.Contains("Close")) - // // { - // // txt.text = StringStore.TranslateText("合上"); - // // } - // // else - // // { - // // txt.text = StringStore.TranslateText(txt.text); - // // } - // // txt.font = fontAsset; - // //} - //} } } \ No newline at end of file diff --git a/MelonLoader/Utils.cs b/MelonLoader/Utils.cs index 05ba5ac..648005c 100644 --- a/MelonLoader/Utils.cs +++ b/MelonLoader/Utils.cs @@ -6,12 +6,14 @@ using MelonLoader.TinyJSON; using Newtonsoft.Json; using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.Patches.GameObjects; +using PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects; using PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects; using PvZ_Fusion_Translator.Patches.Modes.Super_Editor; using System.Diagnostics; using System.Text.RegularExpressions; using Unity.Burst.Intrinsics; using UnityEngine; +using UnityEngine.Events; using UnityEngine.Experimental.Rendering; using UnityEngine.UI; using static Il2Cpp.AlmanacPlantBank; @@ -340,11 +342,29 @@ namespace PvZ_Fusion_Translator public static bool useLocal = MelonPreferences.GetEntryValue("PvZ_Fusion_Translator", "UseLocal"); + public static void WarnLocalData() + { + BaseMenu newMenu = GameAPP.UIManager.Push(UIType.ConfirmMenu, GameAPP.canvasUp); + ConfirmMenu confirmMenu = newMenu.gameObject.GetComponent(); + + string modeTo = (Utils.useLocal) ? "online mode" : "local mode"; + confirmMenu.SetTitle($"WARNING: This button is meant for translator testing and can overwrite/interfere with the translation files saved in your installation. Proceed with caution. You are switching to {modeTo}.\nOnline Mode: Default, strings will auto-sync with the latest version when opening the game\nLocal Mode: Strings are only loaded from your installaion and do not update (meant for translators)"); + confirmMenu.transform.Find("window/text").GetComponent().text = Utils.RemoveColorTags(confirmMenu.transform.Find("window/text").GetComponent().text); + UIButton confirmButton = confirmMenu.transform.Find("Image").GetComponent(); + UIButton cancelButton = confirmMenu.transform.Find("Image2").GetComponent(); + + confirmButton.clickEvent = new UnityEvent(); + confirmButton.clickEvent.AddListener(new Action(() => SwapLocalData())); + confirmButton.clickEvent.AddListener(new Action(() => GameAPP.UIManager.Pop())); + } + public static void SwapLocalData() { Utils.useLocal = (Utils.useLocal) ? false : true; MelonPreferences.SetEntryValue("PvZ_Fusion_Translator", "UseLocal", Utils.useLocal); StringStore.Reload(); + string sourceMsg = "" + (!(Utils.useLocal) ? "Translation Source:\nOnline" : "Translation Source:\nLocal"); + OptLanguageBtn_Patch.FlashMessage(OptLanguageBtn_Patch.toggleSlots[2], sourceMsg, 0.1f, false); } public static async Task GetDataFromWeb(string url, bool isLog = true) @@ -460,7 +480,7 @@ namespace PvZ_Fusion_Translator { { ToggleEnum.Textures, "Textures"}, { ToggleEnum.Audio, "Audio"}, - { ToggleEnum.SwapLocal, "Swap Local\nTranslations"} + { ToggleEnum.SwapLocal, "Change Translation\nSource"} }; public enum ToggleEnum