Merge branch 'cassidy'

This commit is contained in:
SillyStar-Github 2025-10-12 13:34:27 -04:00
commit 4c5ade0ac5
2 changed files with 155 additions and 175 deletions

View file

@ -17,13 +17,59 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
[HarmonyPostfix] [HarmonyPostfix]
private static void InitNameAndInfoFromJson(AlmanacMgrZombie __instance) private static void InitNameAndInfoFromJson(AlmanacMgrZombie __instance)
{ {
#if MULTI_LANGUAGE TranslateTextAlmanac(__instance);
DumpAlmanacModdedZombies(__instance);
return;
}
[HarmonyPatch(nameof(AlmanacMgrZombie.OnMouseDown))]
[HarmonyPrefix]
private static bool OnMouseDown(AlmanacMgrZombie __instance)
{
TextMeshPro component = __instance.info.GetComponent<TextMeshPro>();
if (component != null)
{
component.pageToDisplay = component.pageToDisplay > component.m_pageNumber ? 1 : component.pageToDisplay + 1;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(AlmanacMgrZombie))]
public static partial class AlmanacMgrZombie_Patch
{
[HarmonyPatch(nameof(AlmanacMgrZombie.OnMouseDown))]
[HarmonyPostfix]
public static void DumpAlmanacModdedZombies(AlmanacMgrZombie __instance)
{
// Dump the texts if needed using Ctrl key
if (Input.GetKey(KeyCode.LeftControl))
{
FileLoader.DumpUntranslatedStrings(__instance.info.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"Info: {__instance.info.GetComponent<TextMeshPro>().text}");
FileLoader.DumpUntranslatedStrings(__instance.zombieName.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"Zombie Name: {__instance.zombieName.GetComponent<TextMeshPro>().text}");
}
}
}
// Patch to translate the modded almanac zombie names and info
[HarmonyPatch(typeof(AlmanacMgrZombie))]
public static partial class AlmanacMgrZombie_Patch
{
[HarmonyPatch(nameof(AlmanacMgrZombie.Start))]
[HarmonyPostfix]
public static void TranslateTextAlmanac(AlmanacMgrZombie __instance)
{
#if MULTI_LANGUAGE
string currentLanguage = Utils.Language.ToString(); string currentLanguage = Utils.Language.ToString();
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language); string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
#else #else
string almanacDir = almanacDir = GetAssetDir(AssetType.Almanac); string almanacDir = almanacDir = GetAssetDir(AssetType.Almanac);
string currentLanguage = "English"; string currentLanguage = "English";
#endif #endif
string path = Path.Combine(almanacDir, "ZombieStringsTranslate.json"); string path = Path.Combine(almanacDir, "ZombieStringsTranslate.json");
string moddedPath = Path.Combine(almanacDir, "ModdedZombiesTranslate.json"); string moddedPath = Path.Combine(almanacDir, "ModdedZombiesTranslate.json");
@ -33,13 +79,13 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
return; return;
} }
#if OBFUSCATE #if OBFUSCATE
if (CheckSumStore.IsModified(path)) if (CheckSumStore.IsModified(path))
{ {
Log.LogError("File {0} was modified!", path); Log.LogError("File {0} was modified!", path);
return; return;
} }
#endif #endif
string json; string json;
json = File.ReadAllText(path); json = File.ReadAllText(path);
@ -52,11 +98,11 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
hasAlmanacFont = true; hasAlmanacFont = true;
} }
#if MULTI_LANGUAGE #if MULTI_LANGUAGE
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage); TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage);
#else #else
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(); TMP_FontAsset fontAsset = FontStore.LoadTMPFont();
#endif #endif
TextMeshPro component = __instance.info.GetComponent<TextMeshPro>(); TextMeshPro component = __instance.info.GetComponent<TextMeshPro>();
TextMeshPro component2 = __instance.zombieName.GetComponent<TextMeshPro>(); TextMeshPro component2 = __instance.zombieName.GetComponent<TextMeshPro>();
@ -131,84 +177,6 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
Log.LogError($"Error parsing modded JSON in AlmanacMgrZombie_Patch: {ex.Message}"); Log.LogError($"Error parsing modded JSON in AlmanacMgrZombie_Patch: {ex.Message}");
} }
} }
DumpAlmanacModdedZombies(__instance);
return;
}
[HarmonyPatch(nameof(AlmanacMgrZombie.OnMouseDown))]
[HarmonyPrefix]
private static bool OnMouseDown(AlmanacMgrZombie __instance)
{
TextMeshPro component = __instance.info.GetComponent<TextMeshPro>();
if (component != null)
{
component.pageToDisplay = component.pageToDisplay > component.m_pageNumber ? 1 : component.pageToDisplay + 1;
return false;
}
return true;
}
}
[HarmonyPatch(typeof(AlmanacMgrZombie))]
public static partial class AlmanacMgrZombie_Patch
{
[HarmonyPatch(nameof(AlmanacMgrZombie.OnMouseDown))]
[HarmonyPostfix]
public static void DumpAlmanacModdedZombies(AlmanacMgrZombie __instance)
{
// Dump the texts if needed using Ctrl key
if (Input.GetKey(KeyCode.LeftControl))
{
FileLoader.DumpUntranslatedStrings(__instance.info.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"Info: {__instance.info.GetComponent<TextMeshPro>().text}");
FileLoader.DumpUntranslatedStrings(__instance.zombieName.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"Zombie Name: {__instance.zombieName.GetComponent<TextMeshPro>().text}");
}
}
}
// Patch to translate the modded almanac zombie names and info
[HarmonyPatch(typeof(AlmanacMgrZombie))]
public static partial class AlmanacMgrZombie_Patch
{
[HarmonyPatch(nameof(AlmanacMgrZombie.Start))]
[HarmonyPostfix]
public static void TranslateTextAlmanac(AlmanacMgrZombie __instance)
{
string currentLanguage = Utils.Language.ToString();
__instance.introduce.text = StringStore.TranslateText(__instance.introduce.text);
__instance.introduce.font = FontStore.LoadTMPFont(currentLanguage);
DumpAlmanacModdedZombies(__instance);
// translate all TMP components in info
foreach (TextMeshPro text in __instance.info.GetComponentsInChildren<TextMeshPro>())
{
if (text != null)
{
text.text = StringStore.TranslateText(text.text);
text.name = StringStore.TranslateText(text.name);
text.font = FontStore.LoadTMPFont(currentLanguage);
}
}
foreach (TextMeshPro text in __instance.zombieName.GetComponentsInChildren<TextMeshPro>())
{
if (text != null)
{
text.text = StringStore.TranslateText(text.text);
text.name = StringStore.TranslateText(text.name);
text.font = FontStore.LoadTMPFont(currentLanguage);
}
}
// Translate zombieName and its child
__instance.zombieName.name = StringStore.TranslateText(__instance.zombieName.name);
__instance.zombieName.GetComponent<TextMeshPro>().font = FontStore.LoadTMPFont(currentLanguage);
__instance.zombieName.transform.GetChild(0).name = StringStore.TranslateText(__instance.zombieName.transform.GetChild(0).name);
// Get both for less testing
__instance.zombieName.GetComponent<TextMeshPro>().text = StringStore.TranslateText(__instance.zombieName.GetComponent<TextMeshPro>().text);
__instance.zombieName.transform.GetChild(0).GetComponent<TextMeshPro>().text = StringStore.TranslateText(__instance.zombieName.transform.GetChild(0).GetComponent<TextMeshPro>().text);
__instance.zombieName.transform.GetChild(0).GetComponent<TextMeshPro>().font = FontStore.LoadTMPFont(currentLanguage);
} }
} }
} }

View file

@ -1,10 +1,11 @@
using System.IO; using HarmonyLib;
using HarmonyLib;
using Il2CppInterop.Runtime; using Il2CppInterop.Runtime;
using PvZ_Fusion_Translator__BepInEx_; using PvZ_Fusion_Translator__BepInEx_;
using PvZ_Fusion_Translator__BepInEx_.AssetStore; using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using System.IO;
using TMPro; using TMPro;
using UnityEngine; using UnityEngine;
using UnityEngine.TextCore.Text;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader; using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
@ -16,6 +17,39 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
[HarmonyPostfix] [HarmonyPostfix]
public static void InitNameAndInfoFromJson(AlmanacPlantBank __instance) public static void InitNameAndInfoFromJson(AlmanacPlantBank __instance)
{ {
TranslateTextAlmanac(__instance);
}
[HarmonyPatch(nameof(AlmanacPlantBank.OnMouseDown))]
[HarmonyPrefix]
private static bool OnMouseDown(AlmanacPlantBank __instance)
{
TranslateTextAlmanac(__instance);
TextMeshPro component = __instance.introduce.GetComponent<TextMeshPro>();
if (component != null)
{
component.pageToDisplay = component.pageToDisplay > component.m_pageNumber ? 1 : component.pageToDisplay + 1;
return false;
}
return true;
}
// This method is used to translate the text in the AlmanacPlantBank when it starts. And some plants like LibraHp plants have different text type in the Almanac.
[HarmonyPatch(nameof(AlmanacPlantBank.Start))]
[HarmonyPostfix]
public static void TranslateTextAlmanac(AlmanacPlantBank __instance)
{
// Dump the texts if needed
if (Input.GetKey(KeyCode.LeftControl))
{
FileLoader.DumpUntranslatedStrings(__instance.introduce.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"Info: {__instance.introduce.GetComponent<TextMeshPro>().text}");
FileLoader.DumpUntranslatedStrings(__instance.plantName.GetComponent<TextMeshPro>().text);
//Log.LogInfo($"PlantName Name: {__instance.plantName.GetComponent<TextMeshPro>().text}");
//Log.LogInfo($"PlantShadow Name: {__instance.plantName.transform.GetChild(0).GetComponent<TextMeshPro>().text}");
}
#if MULTI_LANGUAGE #if MULTI_LANGUAGE
string currentLanguage = Utils.Language.ToString(); string currentLanguage = Utils.Language.ToString();
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language); string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
@ -59,10 +93,10 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
TextMeshPro component3 = __instance.plantName.transform.GetChild(0).GetComponent<TextMeshPro>(); TextMeshPro component3 = __instance.plantName.transform.GetChild(0).GetComponent<TextMeshPro>();
TextMeshPro component4 = __instance.cost.GetComponent<TextMeshPro>(); TextMeshPro component4 = __instance.cost.GetComponent<TextMeshPro>();
TextMeshPro component5 = __instance.introduce.GetComponentInChildren<TextMeshPro>(); TextMeshPro component5 = __instance.introduce.GetComponentInChildren<TextMeshPro>();
#if DEBUG #if DEBUG
Log.LogWarning($"Introduce text: {component?.text}"); Log.LogWarning($"Introduce text: {component?.text}");
Log.LogWarning($"Plant name: {component2?.text}"); Log.LogWarning($"Plant name: {component2?.text}");
#endif #endif
//component.text = component.text ?? string.Empty; //component.text = component.text ?? string.Empty;
AlmanacPlantBank.PlantData plantData = JsonUtility.FromJson<AlmanacPlantBank.PlantData>(json); AlmanacPlantBank.PlantData plantData = JsonUtility.FromJson<AlmanacPlantBank.PlantData>(json);
@ -71,10 +105,10 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
{ {
if (plantInfo.seedType == __instance.theSeedType && !string.IsNullOrEmpty(plantInfo.name)) if (plantInfo.seedType == __instance.theSeedType && !string.IsNullOrEmpty(plantInfo.name))
{ {
#if DEBUG #if DEBUG
Log.LogInfo($"Processing plant type: {plantInfo.seedType}"); Log.LogInfo($"Processing plant type: {plantInfo.seedType}");
Log.LogInfo($"Plant info: {plantInfo.info}, Name: {plantInfo.name}, Cost: {plantInfo.cost}, Introduce: {plantInfo.introduce}"); Log.LogInfo($"Plant info: {plantInfo.info}, Name: {plantInfo.name}, Cost: {plantInfo.cost}, Introduce: {plantInfo.introduce}");
#endif #endif
component.autoSizeTextContainer = false; component.autoSizeTextContainer = false;
component.text = plantInfo.info + "\n\n" + plantInfo.introduce; component.text = plantInfo.info + "\n\n" + plantInfo.introduce;
component.overflowMode = TextOverflowModes.Page; component.overflowMode = TextOverflowModes.Page;
@ -87,9 +121,9 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
component2.text = plantInfo.name; component2.text = plantInfo.name;
component2.autoSizeTextContainer = true; component2.autoSizeTextContainer = true;
#if DEBUG #if DEBUG
Log.LogInfo($"Processing plant name: '{plantInfo.name}' (null: {plantInfo.name == null})"); Log.LogInfo($"Processing plant name: '{plantInfo.name}' (null: {plantInfo.name == null})");
#endif #endif
component3.text = Utils.RemoveColorTags(plantInfo.name ?? string.Empty); component3.text = Utils.RemoveColorTags(plantInfo.name ?? string.Empty);
component3.autoSizeTextContainer = true; component3.autoSizeTextContainer = true;
@ -131,9 +165,9 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
component2.text = plantInfo.name; component2.text = plantInfo.name;
component2.autoSizeTextContainer = true; component2.autoSizeTextContainer = true;
#if DEBUG #if DEBUG
Log.LogInfo($"Processing plant name: '{plantInfo.name}' (null: {plantInfo.name == null})"); Log.LogInfo($"Processing plant name: '{plantInfo.name}' (null: {plantInfo.name == null})");
#endif #endif
component3.text = Utils.RemoveColorTags(plantInfo.name ?? string.Empty); component3.text = Utils.RemoveColorTags(plantInfo.name ?? string.Empty);
component3.autoSizeTextContainer = true; component3.autoSizeTextContainer = true;
@ -154,35 +188,13 @@ namespace PvZ_Fusion_Translator__BepInEx_.Patches.Managers
} }
} }
} }
return;
}
[HarmonyPatch(nameof(AlmanacPlantBank.OnMouseDown))]
[HarmonyPrefix]
private static bool OnMouseDown(AlmanacPlantBank __instance)
{
TextMeshPro component = __instance.introduce.GetComponent<TextMeshPro>();
if (component != null)
{
component.pageToDisplay = component.pageToDisplay > component.m_pageNumber ? 1 : component.pageToDisplay + 1;
return false;
}
return true;
} }
[HarmonyPatch(nameof(AlmanacPlantBank.PVPInit))] [HarmonyPatch(nameof(AlmanacPlantBank.PVPInit))]
[HarmonyPostfix] [HarmonyPostfix]
private static void PVPInit(AlmanacPlantBank __instance) private static void PVPInit(AlmanacPlantBank __instance)
{ {
TextMeshPro component = __instance.introduce.GetComponent<TextMeshPro>(); TranslateTextAlmanac(__instance);
if (component != null)
{
string originalText = component.text;
component.autoSizeTextContainer = false;
component.text = StringStore.TranslateText(component.text);
__instance.introduce.GetComponent<TextMeshPro>().text = component.text;
}
Transform banTransform = __instance.transform.FindChild("Ban").GetChild(0); Transform banTransform = __instance.transform.FindChild("Ban").GetChild(0);
if (banTransform != null) if (banTransform != null)