From ea94331c836b01ad1b23c4946cc112db36801129 Mon Sep 17 00:00:00 2001 From: Dakosha <149136937+Dak0sha@users.noreply.github.com> Date: Sat, 14 Jun 2025 00:53:45 +0300 Subject: [PATCH 1/8] Cherryzilla & zombie text patch --- MelonLoader/AssetStore/StringStore.cs | 6 ++-- .../MinorObjects/TrainingDummy_Patch.cs | 17 +++++++++ .../MinorObjects/UltimateChomper_Patch.cs | 17 +++++++++ .../GameObjects/MinorObjects/Zombie_Patch.cs | 35 +++++++++++++++---- ...PvZ Fusion Translator [MelonLoader].csproj | 2 ++ 5 files changed, 67 insertions(+), 10 deletions(-) create mode 100644 MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs create mode 100644 MelonLoader/Patches/GameObjects/MinorObjects/UltimateChomper_Patch.cs diff --git a/MelonLoader/AssetStore/StringStore.cs b/MelonLoader/AssetStore/StringStore.cs index d666b66..21c499a 100644 --- a/MelonLoader/AssetStore/StringStore.cs +++ b/MelonLoader/AssetStore/StringStore.cs @@ -29,7 +29,7 @@ namespace PvZ_Fusion_Translator.AssetStore // UI - Playing { @"-------UI - Playing" , "UI - Playing-------" }, { @"快捷键:(\d+)" , "Hotkey: {0}" }, - { @"场上敌人数量:(\d+)" , "Zombies: {0}" }, + { @"场上敌人数量:(\d+)$" , "Zombies: {0}" }, { @"难度:(\d+)" , "Difficulty: {0}" }, // UI - Adventure Mode @@ -117,8 +117,8 @@ namespace PvZ_Fusion_Translator.AssetStore { @"-------Strings - Others" , "Strings - Others-------" }, // { @"HP:(\d+)/(\d+)\s+一类:(\d+)/(\d+)" , "HP: {0}/{1}\nArmor: {2}/{3}" }, // { @"HP:(\d+)/(\d+)\s+二类:(\d+)/(\d+)" , "HP: {0}/{1}\nArmor: {2}/{3}" }, - { @"^HP:(\d+)/(\d+)\s+([^\s+])类:(\d+)/(\d+)" , "HP: {0}/{1}\nArmor: {3}/{4}" }, - { @"^HP:(\d+)/(\d+)" , "HP: {0}/{1}" }, + // { @"^HP:(\d+)/(\d+)\s+([^\s+])类:(\d+)/(\d+)" , "HP: {0}/{1}\nArmor: {3}/{4}" }, + // { @"^HP:(\d+)/(\d+)" , "HP: {0}/{1}" }, // { @"平衡性调整(([^\s]+))" , "Balance Adjustment ({0})" }, { @"旅行:守护 (\d+)轮已经完成" , "Odyssey: Last Stand | {0} Rounds Completed"}, diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs new file mode 100644 index 0000000..6ed9af6 --- /dev/null +++ b/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs @@ -0,0 +1,17 @@ +using HarmonyLib; +using Il2Cpp; +using PvZ_Fusion_Translator.AssetStore; + +namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects +{ + [HarmonyPatch(typeof(TrainingDummy), nameof(TrainingDummy.UpdateHealthText))] + public static class TrainingDummy_Patch + { + [HarmonyPostfix] + public static void UpdateHealthText(TrainingDummy __instance) + { + StringStore.TranslateText(__instance.healthText); + StringStore.TranslateText(__instance.healthTextShadow); + } + } +} \ No newline at end of file diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/UltimateChomper_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/UltimateChomper_Patch.cs new file mode 100644 index 0000000..d04c947 --- /dev/null +++ b/MelonLoader/Patches/GameObjects/MinorObjects/UltimateChomper_Patch.cs @@ -0,0 +1,17 @@ +using HarmonyLib; +using Il2Cpp; +using PvZ_Fusion_Translator.AssetStore; + +namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects +{ + [HarmonyPatch(typeof(UltimateChomper), nameof(UltimateChomper.UpdateText))] + public static class UltimateChomper_Patch + { + [HarmonyPostfix] + public static void UpdateText(UltimateChomper __instance) + { + StringStore.TranslateText(__instance.killingText); + StringStore.TranslateText(__instance.killingTextShadow); + } + } +} \ No newline at end of file diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs index 222b54e..621e41a 100644 --- a/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs +++ b/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs @@ -1,12 +1,33 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using HarmonyLib; +using Il2Cpp; +using PvZ_Fusion_Translator.AssetStore; +using UnityEngine; namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects { - class Zombie_Patch + [HarmonyPatch(typeof(Zombie))] + public static class Zombie_Patch { + [HarmonyPatch(nameof(Zombie.Start))] + [HarmonyPostfix] + public static void Start(Zombie __instance) + { + StringStore.TranslateText(__instance.healthText); + StringStore.TranslateText(__instance.healthTextShadow); + if (__instance.healthText.transform.rotation != Quaternion.Euler(0, 0, 0)) + __instance.healthText.transform.rotation = Quaternion.Euler(0f, 0f, 0f); + } + + [HarmonyPatch(nameof(Zombie.Update))] + [HarmonyPrefix] + public static void Update(Zombie __instance) + { + if (__instance.theZombieType == ZombieType.TrainingDummy || !Board.Instance.showZombieHealth) + return; + StringStore.TranslateText(__instance.healthText); + StringStore.TranslateText(__instance.healthTextShadow); + if (__instance.healthText.transform.rotation != Quaternion.Euler(0f, 0f, 0f)) + __instance.healthText.transform.rotation = Quaternion.Euler(0f, 0f, 0f); + } } -} +} \ No newline at end of file diff --git a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj index a2e65b8..b6b9f6e 100644 --- a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj +++ b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj @@ -406,6 +406,8 @@ + + From 4c15c96d0dd04c79953b4eacc678c437c13a0bf8 Mon Sep 17 00:00:00 2001 From: Dakosha <149136937+Dak0sha@users.noreply.github.com> Date: Sun, 15 Jun 2025 19:39:22 +0300 Subject: [PATCH 2/8] Zombie HP text rework --- MelonLoader/FileLoader.cs | 2 + .../MinorObjects/TrainingDummy_Patch.cs | 5 +- .../GameObjects/MinorObjects/Zombie_Patch.cs | 74 ++++++++++++++++++- ...PvZ Fusion Translator [MelonLoader].csproj | 2 +- 4 files changed, 75 insertions(+), 8 deletions(-) diff --git a/MelonLoader/FileLoader.cs b/MelonLoader/FileLoader.cs index 42eb115..0bc86f9 100644 --- a/MelonLoader/FileLoader.cs +++ b/MelonLoader/FileLoader.cs @@ -1,6 +1,7 @@ using Il2Cpp; using MelonLoader; using PvZ_Fusion_Translator.AssetStore; +using PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects; using PvZ_Fusion_Translator.Patches.OtherManagers; using System.Text.Encodings.Web; using System.Text.Json; @@ -76,6 +77,7 @@ namespace PvZ_Fusion_Translator { StringStore.translationStringRegex[key] = value; } + Zombie_Patch.LoadHPStrings(); } } SaveStrings(); diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs index 6ed9af6..de3d649 100644 --- a/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs +++ b/MelonLoader/Patches/GameObjects/MinorObjects/TrainingDummy_Patch.cs @@ -1,6 +1,5 @@ using HarmonyLib; using Il2Cpp; -using PvZ_Fusion_Translator.AssetStore; namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects { @@ -10,8 +9,8 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects [HarmonyPostfix] public static void UpdateHealthText(TrainingDummy __instance) { - StringStore.TranslateText(__instance.healthText); - StringStore.TranslateText(__instance.healthTextShadow); + Zombie_Patch.TranslateHpUI(__instance.healthText); + Zombie_Patch.TranslateHpUI(__instance.healthTextShadow); } } } \ No newline at end of file diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs index 621e41a..43117ba 100644 --- a/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs +++ b/MelonLoader/Patches/GameObjects/MinorObjects/Zombie_Patch.cs @@ -1,19 +1,41 @@ using HarmonyLib; using Il2Cpp; using PvZ_Fusion_Translator.AssetStore; +using System.Text.RegularExpressions; using UnityEngine; +using Il2CppTMPro; namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects { [HarmonyPatch(typeof(Zombie))] public static class Zombie_Patch { + private static Dictionary HPStrings = new Dictionary() + { + { "最后一击:(\\d+)\nDPS:(.+)$", "Last damage: {0}\nDPS: {1}" }, + { "^HP:(\\d+)/(\\d+)\n\\D+(\\d+)/(\\d+)\n\\D+(\\d+)/(\\d+)$", "HP: {0}/{1}\nType 1 armor: {2}/{3}\nType 2 armor: {4}/{5}" }, + { "^HP:(\\d+)/(\\d+)\n\\D+(\\d+)/(\\d+)$", "HP: {0}/{1}\nType 1 armor: {2}/{3}" }, + { "^HP:(\\d+)/(\\d+)$", "HP: {0}/{1}" }, + }; + + public static void LoadHPStrings() + { + foreach (var hp in HPStrings) + if (StringStore.translationStringRegex.ContainsKey(hp.Key)) + HPStrings[hp.Key] = StringStore.translationStringRegex[hp.Key]; + } + [HarmonyPatch(nameof(Zombie.Start))] [HarmonyPostfix] public static void Start(Zombie __instance) { - StringStore.TranslateText(__instance.healthText); - StringStore.TranslateText(__instance.healthTextShadow); + TranslateHpUI(__instance.healthText); + TranslateHpUI(__instance.healthTextShadow); + if (__instance.theFirstArmorHealth == 0 && __instance.theSecondArmorHealth != 0) + { + __instance.healthText.text = __instance.healthText.text.Replace("Type 1", "Type 2"); + __instance.healthTextShadow.text = __instance.healthText.text.Replace("Type 1", "Type 2"); + } if (__instance.healthText.transform.rotation != Quaternion.Euler(0, 0, 0)) __instance.healthText.transform.rotation = Quaternion.Euler(0f, 0f, 0f); } @@ -24,10 +46,54 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects { if (__instance.theZombieType == ZombieType.TrainingDummy || !Board.Instance.showZombieHealth) return; - StringStore.TranslateText(__instance.healthText); - StringStore.TranslateText(__instance.healthTextShadow); + TranslateHpUI(__instance.healthText); + TranslateHpUI(__instance.healthTextShadow); + if (__instance.theFirstArmorHealth == 0 && __instance.theSecondArmorHealth != 0) + { + __instance.healthText.text = __instance.healthText.text.Replace("Type 1", "Type 2"); + __instance.healthTextShadow.text = __instance.healthText.text.Replace("Type 1", "Type 2"); + } if (__instance.healthText.transform.rotation != Quaternion.Euler(0f, 0f, 0f)) __instance.healthText.transform.rotation = Quaternion.Euler(0f, 0f, 0f); } + + public static void TranslateHpUI(TextMeshPro textTMP) + { + if (textTMP) + { + string origText = textTMP.text; + string translatedText = TranslateHPText(origText); + textTMP.text = translatedText == origText ? origText : translatedText; + textTMP.autoSizeTextContainer = false; + if (translatedText != origText) + textTMP.font = FontStore.LoadTMPFont(Utils.Language.ToString()); + } + } + + public static string TranslateHPText(string originalText) + { + foreach (var entry in HPStrings) + { + var regex = new Regex(entry.Key); + if (regex.IsMatch(originalText)) + { + var match = regex.Match(originalText); + int groupCount = match.Groups.Count; + + List dynamicParts = new List(); + + for (int i = 1; i < groupCount; i++) + { + string groupValue = match.Groups[i].Value; + string translatedValue = StringStore.translationString.ContainsKey(groupValue) + ? StringStore.translationString[groupValue] + : groupValue; + dynamicParts.Add(translatedValue); + } + return originalText = string.Format(entry.Value, [.. dynamicParts]); + } + } + return originalText; + } } } \ No newline at end of file diff --git a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj index b6b9f6e..19d1b93 100644 --- a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj +++ b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj @@ -13,7 +13,7 @@ latest enable Debug;DebugEnglish;ReleaseMulti;ReleaseEnglish;DebugTesting;ReleaseOther;DebugObfuscate;ReleaseObfuscate - D:\PvZ Fusion\Game Files + G:\ML-Fusion 2.6.1\Game Files AnyCPU;ARM64;x64 From 311086a8459b6bc17e77634ef4514dc1b39ebf74 Mon Sep 17 00:00:00 2001 From: Dakosha <149136937+Dak0sha@users.noreply.github.com> Date: Tue, 24 Jun 2025 12:40:37 +0300 Subject: [PATCH 3/8] TravelStore fix --- .../Patches/GameObjects/TravelStore_Patch.cs | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/MelonLoader/Patches/GameObjects/TravelStore_Patch.cs b/MelonLoader/Patches/GameObjects/TravelStore_Patch.cs index edbf166..5725d5e 100644 --- a/MelonLoader/Patches/GameObjects/TravelStore_Patch.cs +++ b/MelonLoader/Patches/GameObjects/TravelStore_Patch.cs @@ -7,42 +7,33 @@ using UnityEngine; namespace PvZ_Fusion_Translator.Patches.GameObjects { [HarmonyPatch(typeof(TravelStore))] - internal class TravelStore_Patch + public static class TravelStore_Patch { [HarmonyPatch(nameof(TravelStore.Update))] [HarmonyPostfix] private static void Update(TravelStore __instance) - { - foreach (TextMeshProUGUI text in __instance.introduces) - { - text.text = StringStore.TranslateText(text.text); - } - - Transform moneyTransform = __instance.transform.Find("Money"); - if (moneyTransform != null) - { - StringStore.TranslateTextTransform(moneyTransform); - } - - foreach (TextMeshProUGUI text in __instance.points) - { - text.text = StringStore.TranslateText(text.text); - } + { + foreach (TextMeshProUGUI intr in __instance.introduces) + StringStore.TranslateTextUI(intr); + foreach (var textMesh in __instance.points) + StringStore.TranslateTextUI(textMesh); } - [HarmonyPatch(nameof(TravelStore.SetText), new Type[] { typeof(string)})] - [HarmonyPostfix] - private static void ShowText(TravelStore __instance) - { - foreach (TextMeshProUGUI text in __instance.introduces) - { - text.text = StringStore.TranslateText(text.text); - } - - foreach (TextMeshProUGUI text in __instance.points) + [HarmonyPatch(nameof(TravelStore.RefreshBuff))] + [HarmonyPostfix] + private static void RefreshBuff(TravelStore __instance) + { + foreach (TravelBuff buff in __instance.travelBuffs) { - text.text = StringStore.TranslateText(text.text); + TextMeshProUGUI cost = buff.transform.GetChild(1).GetComponent(); + if (!cost.text.Contains('0')) + StringStore.TranslateTextUI(cost); + cost.font = Resources.Load("fonts/Dynamic"); } + foreach (TextMeshProUGUI intr in __instance.introduces) + StringStore.TranslateTextUI(intr); + foreach (var textMesh in __instance.points) + StringStore.TranslateTextUI(textMesh); } } } From 55e4d5b9376acf2641342ff892b93902c212f456 Mon Sep 17 00:00:00 2001 From: Dakosha <149136937+Dak0sha@users.noreply.github.com> Date: Thu, 26 Jun 2025 00:17:56 +0300 Subject: [PATCH 4/8] MachineNut HP text patch --- .../GameObjects/MinorObjects/Plant_Patch.cs | 63 +++++++++++++------ 1 file changed, 43 insertions(+), 20 deletions(-) diff --git a/MelonLoader/Patches/GameObjects/MinorObjects/Plant_Patch.cs b/MelonLoader/Patches/GameObjects/MinorObjects/Plant_Patch.cs index 3aad6c8..0e0cbb2 100644 --- a/MelonLoader/Patches/GameObjects/MinorObjects/Plant_Patch.cs +++ b/MelonLoader/Patches/GameObjects/MinorObjects/Plant_Patch.cs @@ -1,24 +1,47 @@ -#if FIX -using HarmonyLib; +using HarmonyLib; using Il2Cpp; -using PvZ_Fusion_Translator.AssetStore; -using UnityEngine; +using System.Text.RegularExpressions; namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects { - [HarmonyPatch(typeof(Plant))] - public static class Plant_Patch - { - [HarmonyPostfix] - [HarmonyPatch(nameof(Plant.UpdateHealthText))] - private static void UpdateHealthText(Plant __instance) - { - Transform healthTransform = __instance.transform.Find("health"); - if (healthTransform != null) - { - StringStore.TranslateTextTransform(__instance.transform); - } - } - } -} -#endif \ No newline at end of file + [HarmonyPatch(typeof(Plant))] + public static class Plant_Patch + { + [HarmonyPostfix] + [HarmonyPatch(nameof(Plant.Awake))] + private static void Awake(Plant __instance) + { + if (!(__instance.thePlantType == PlantType.SuperMachineNut || __instance.thePlantType == PlantType.MachineNut)) + return; + __instance.healthSlider.healthText.text = __instance.healthSlider.healthTextShadow.text = ChangeHPText(__instance.healthSlider.healthTextShadow.text); + } + + [HarmonyPostfix] + [HarmonyPatch(nameof(Plant.UpdateText))] + private static void Update(Plant __instance) + { + if (!(__instance.thePlantType == PlantType.SuperMachineNut || __instance.thePlantType == PlantType.MachineNut)) + return; + if (__instance.thePlantHealth < __instance.thePlantMaxHealth) + return; + __instance.healthSlider.healthText.text = __instance.healthSlider.healthTextShadow.text = ChangeHPText(__instance.healthSlider.healthTextShadow.text); + } + + static string ChangeHPText(string originalText) + { + var regex = new Regex(@"(\d+)\d\d\d/(\d)000"); + if (regex.IsMatch(originalText)) + { + var match = regex.Match(originalText); + int groupCount = match.Groups.Count; + + List dynamicParts = new List(); + + for (int i = 1; i < groupCount; i++) + dynamicParts.Add(match.Groups[i].Value); + return originalText = string.Format("{0}k/{1}k", [.. dynamicParts]); + } + return originalText; + } + } +} \ No newline at end of file From 294532e87b86f35cd1d4591a10a9446b165dce3a Mon Sep 17 00:00:00 2001 From: Dakosha <149136937+Dak0sha@users.noreply.github.com> Date: Wed, 2 Jul 2025 09:55:59 +0300 Subject: [PATCH 5/8] UIButton patch --- .../GameObjects/ButtonObjects/EveBtn_Patch.cs | 42 ----------------- .../ButtonObjects/UIButton_Patch.cs | 46 +++++++++---------- ...PvZ Fusion Translator [MelonLoader].csproj | 1 - 3 files changed, 23 insertions(+), 66 deletions(-) delete mode 100644 MelonLoader/Patches/GameObjects/ButtonObjects/EveBtn_Patch.cs diff --git a/MelonLoader/Patches/GameObjects/ButtonObjects/EveBtn_Patch.cs b/MelonLoader/Patches/GameObjects/ButtonObjects/EveBtn_Patch.cs deleted file mode 100644 index 101f112..0000000 --- a/MelonLoader/Patches/GameObjects/ButtonObjects/EveBtn_Patch.cs +++ /dev/null @@ -1,42 +0,0 @@ -using HarmonyLib; -using Il2Cpp; -using Il2CppTMPro; -using PvZ_Fusion_Translator.AssetStore; -using UnityEngine; - -namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects -{ - [HarmonyPatch(typeof(EveManager))] - public static class EveManager_UIButton_Patch - { - [HarmonyPostfix] - [HarmonyPatch(nameof(EveManager.Balanced))] - private static void Start(EveManager __instance) - { - Transform sceneText = __instance.transform.FindChild("text"); - if(sceneText != null) - { - TextMeshProUGUI sceneTextTMP = sceneText.transform.GetComponent(); - if(sceneTextTMP != null) - { - sceneTextTMP.text = StringStore.TranslateText(sceneTextTMP.text); - } - } - Transform sceneTextShadow = sceneText.transform.FindChild("text2"); - if(sceneTextShadow != null) - { - TextMeshProUGUI sceneTextShadowTMP = sceneTextShadow.transform.GetComponent(); - if (sceneTextShadowTMP != null) - { - sceneTextShadowTMP.text = StringStore.TranslateText(sceneTextShadowTMP.text); - } - } - - if (__instance.name.Equals("Balanced")) - { - __instance.gameObject.SetActive(false); - __instance.gameObject.SetActive(true); - } - } - } -} \ No newline at end of file diff --git a/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs b/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs index d497e4d..ec2228f 100644 --- a/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs +++ b/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs @@ -2,9 +2,6 @@ using Il2Cpp; using Il2CppTMPro; using PvZ_Fusion_Translator.AssetStore; -using UnityEngine; -using UnityEngine.TextCore.Text; -using UnityEngine.UI; namespace PvZ_Fusion_Translator.Patches.GameObjects { @@ -13,29 +10,32 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects { [HarmonyPatch(nameof(UIButton.Start))] [HarmonyPostfix] - private static void Postfix_Start(UIButton __instance) + public static void Start(UIButton __instance) { - Text[] textComponents = __instance.GetComponentsInChildren(true); - - foreach (Text textComponent in textComponents) + try { - if (textComponent != null && !string.IsNullOrEmpty(textComponent.text)) - { - string translatedText = StringStore.TranslateText(textComponent.text); - if (!string.IsNullOrEmpty(translatedText) && translatedText != textComponent.text) - { - TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); - - TextMeshProUGUI newTMP = StringStore.ConvertToTextMeshPro(textComponent, fontAsset, true); - - if (newTMP != null) - { - newTMP.text = translatedText; - //Debug.Log($"Converted and translated text: {textComponent.text} -> {translatedText}"); - } - } - } + TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); + TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); + StringStore.TranslateTextUI(text, false); + StringStore.TranslateTextUI(textShadow, false); + text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; } + catch (Exception) { } + } + + [HarmonyPatch(nameof(UIButton.OnMouseUpAsButton))] + [HarmonyPostfix] + public static void OnMouseUpAsButton(UIButton __instance) + { + try + { + TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); + TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); + StringStore.TranslateTextUI(text, false); + StringStore.TranslateTextUI(textShadow, false); + text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; + } + catch (Exception) { } } } } diff --git a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj index 19d1b93..7c0a33c 100644 --- a/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj +++ b/MelonLoader/PvZ Fusion Translator [MelonLoader].csproj @@ -439,7 +439,6 @@ - From cc0b62090aadacbb4cc0eda7e3df404989e6b6b4 Mon Sep 17 00:00:00 2001 From: Nanami-Houko Date: Wed, 2 Jul 2025 21:37:07 +0800 Subject: [PATCH 6/8] Update credits --- MelonLoader/Core.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MelonLoader/Core.cs b/MelonLoader/Core.cs index d218420..8f36e36 100644 --- a/MelonLoader/Core.cs +++ b/MelonLoader/Core.cs @@ -3,7 +3,7 @@ using MelonLoader.Utils; using PvZ_Fusion_Translator.AssetStore; using UnityEngine; -[assembly: MelonInfo(typeof(PvZ_Fusion_Translator.Core), "PvZ Fusion Translator", "231.0.0", "dynaslash / arifrios1st / lancerx0", null)] +[assembly: MelonInfo(typeof(PvZ_Fusion_Translator.Core), "PvZ Fusion Translator", "231.0.0", "dynaslash / arifrios1st / lancerx0 / JustNull / Dakosha", null)] [assembly: MelonGame("LanPiaoPiao", "PlantsVsZombiesRH")] namespace PvZ_Fusion_Translator From 449b9db9f062269d12b76a9d5649830677b8f23c Mon Sep 17 00:00:00 2001 From: Nanami-Houko Date: Thu, 3 Jul 2025 10:44:07 +0800 Subject: [PATCH 7/8] Update credits again --- MelonLoader/Core.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MelonLoader/Core.cs b/MelonLoader/Core.cs index 8f36e36..d89b0e0 100644 --- a/MelonLoader/Core.cs +++ b/MelonLoader/Core.cs @@ -3,7 +3,7 @@ using MelonLoader.Utils; using PvZ_Fusion_Translator.AssetStore; using UnityEngine; -[assembly: MelonInfo(typeof(PvZ_Fusion_Translator.Core), "PvZ Fusion Translator", "231.0.0", "dynaslash / arifrios1st / lancerx0 / JustNull / Dakosha", null)] +[assembly: MelonInfo(typeof(PvZ_Fusion_Translator.Core), "PvZ Fusion Translator", "231.0.0", "dynaslash / arifrios1st / lancerx0 / JustNull / Dakosha / Mamoru-kun", null)] [assembly: MelonGame("LanPiaoPiao", "PlantsVsZombiesRH")] namespace PvZ_Fusion_Translator From 2eeaf52d6d23e305bfe48d6c327366b9945a146d Mon Sep 17 00:00:00 2001 From: Nanami-Houko Date: Thu, 3 Jul 2025 10:47:03 +0800 Subject: [PATCH 8/8] Hotfix for survival mode pagination --- .../ButtonObjects/UIButton_Patch.cs | 55 +++++++++++++++---- 1 file changed, 43 insertions(+), 12 deletions(-) diff --git a/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs b/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs index ec2228f..bd66319 100644 --- a/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs +++ b/MelonLoader/Patches/GameObjects/ButtonObjects/UIButton_Patch.cs @@ -2,6 +2,8 @@ using Il2Cpp; using Il2CppTMPro; using PvZ_Fusion_Translator.AssetStore; +using UnityEngine; +using UnityEngine.UI; namespace PvZ_Fusion_Translator.Patches.GameObjects { @@ -10,30 +12,59 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects { [HarmonyPatch(nameof(UIButton.Start))] [HarmonyPostfix] - public static void Start(UIButton __instance) + private static void Postfix_Start(UIButton __instance) { try { - TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); - TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); - StringStore.TranslateTextUI(text, false); - StringStore.TranslateTextUI(textShadow, false); - text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; + // Convert and translate legacy Text components + Text[] textComponents = __instance.GetComponentsInChildren(true); + foreach (Text textComponent in textComponents) + { + if (textComponent != null && !string.IsNullOrEmpty(textComponent.text)) + { + string translatedText = StringStore.TranslateText(textComponent.text); + if (!string.IsNullOrEmpty(translatedText) && translatedText != textComponent.text) + { + TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); + TextMeshProUGUI newTMP = StringStore.ConvertToTextMeshPro(textComponent, fontAsset, true); + + if (newTMP != null) + { + newTMP.text = translatedText; + } + } + } + } + + // Also handle TMP components directly under the button + if (__instance.transform.childCount >= 2) + { + TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); + TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); + + StringStore.TranslateTextUI(text, false); + StringStore.TranslateTextUI(textShadow, false); + text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; + } } catch (Exception) { } } [HarmonyPatch(nameof(UIButton.OnMouseUpAsButton))] [HarmonyPostfix] - public static void OnMouseUpAsButton(UIButton __instance) + public static void Postfix_OnMouseUpAsButton(UIButton __instance) { try { - TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); - TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); - StringStore.TranslateTextUI(text, false); - StringStore.TranslateTextUI(textShadow, false); - text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; + if (__instance.transform.childCount >= 2) + { + TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent(); + TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent(); + + StringStore.TranslateTextUI(text, false); + StringStore.TranslateTextUI(textShadow, false); + text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; + } } catch (Exception) { } }