Merge branch 'cassidy'

This commit is contained in:
SillyStar-Github 2025-11-16 01:08:33 -05:00
commit 1dde065d6d
33 changed files with 911 additions and 467 deletions

View file

@ -585,6 +585,7 @@
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\BepInEx\plugins&quot;" /> <Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\BepInEx\plugins&quot;" />
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePathMelon)\Translation Builds\&quot;" />
</Target> </Target>
</Project> </Project>

View file

@ -394,7 +394,7 @@ namespace PvZ_Fusion_Translator__BepInEx_
Javanese, //Filipino, Javanese, //Filipino,
Vietnamese, Vietnamese,
Indonesian, Indonesian,
//Russian, Russian, //NOTE: legacy language
Japanese, Japanese,
Korean, Korean,

View file

@ -122,7 +122,43 @@ namespace PvZ_Fusion_Translator.AssetStore
checkText = text; checkText = text;
return checkText; return checkText;
}
public static string TranslateText(string originalText, string pattern, bool isLog = false)
{
if (TestRegex(originalText, pattern) && translationStringRegex.ContainsKey(pattern))
{
// Extract dynamic parts from the original text
var regex = new Regex(pattern);
var match = regex.Match(originalText);
int groupCount = match.Groups.Count;
if (isLog)
Log.LogDebug("Text found in translationStringRegex {0}: {1}", match, groupCount);
// List to hold formatted dynamic parts
List<string> dynamicParts = [];
// Loop through each group and determine its translation
for (int i = 1; i < groupCount; i++)
{
string groupValue = match.Groups[i].Value;
string translatedValue = translationString.ContainsKey(groupValue)
? translationString[groupValue]
: groupValue;
dynamicParts.Add(translatedValue);
}
// Format the output string with dynamic parts
return string.Format(translationStringRegex[pattern], [.. dynamicParts]);
}
else
{
if (isLog)
Log.LogDebug($"Text '{originalText}' not translated");
FileLoader.DumpUntranslatedStrings(originalText);
return originalText;
}
} }
public static string DoTranslateText(string originalText, bool isLog = false) public static string DoTranslateText(string originalText, bool isLog = false)

View file

@ -6,6 +6,7 @@ using PvZ_Fusion_Translator.Patches.OtherManagers;
using System.Text.Encodings.Web; using System.Text.Encodings.Web;
using System.Text.Json; using System.Text.Json;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering;
namespace PvZ_Fusion_Translator namespace PvZ_Fusion_Translator
{ {
@ -312,8 +313,10 @@ namespace PvZ_Fusion_Translator
} }
string LawnStrings = Resources.Load<TextAsset>("LawnStrings").text; string LawnStrings = Resources.Load<TextAsset>("LawnStrings").text;
string ZombieStrings = Resources.Load<TextAsset>("ZombieStrings").text; string ZombieStrings = Resources.Load<TextAsset>("ZombieStrings").text;
string AbyssBuffData = Resources.Load<TextAsset>("AbyssBuffData").text;
File.WriteAllText(Path.Combine(dumpDir, "LawnStrings.json"), LawnStrings); File.WriteAllText(Path.Combine(dumpDir, "LawnStrings.json"), LawnStrings);
File.WriteAllText(Path.Combine(dumpDir, "ZombieStrings.json"), ZombieStrings); File.WriteAllText(Path.Combine(dumpDir, "ZombieStrings.json"), ZombieStrings);
File.WriteAllText(Path.Combine(dumpDir, "AbyssBuffData.json"), AbyssBuffData);
Dictionary<Achievement, AchievementObject> achievementsList = new Dictionary<Achievement, AchievementObject>(); Dictionary<Achievement, AchievementObject> achievementsList = new Dictionary<Achievement, AchievementObject>();
foreach (Il2CppSystem.Collections.Generic.KeyValuePair<Achievement, Il2CppSystem.Tuple<string, string>> entry in AchievementClip.achievementsText) foreach (Il2CppSystem.Collections.Generic.KeyValuePair<Achievement, Il2CppSystem.Tuple<string, string>> entry in AchievementClip.achievementsText)

View file

@ -2,6 +2,7 @@
using Il2Cpp; using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using PvZ_Fusion_Translator.Patches.Managers;
namespace PvZ_Fusion_Translator.Patches.BaseTextObjects namespace PvZ_Fusion_Translator.Patches.BaseTextObjects
{ {
@ -25,7 +26,16 @@ namespace PvZ_Fusion_Translator.Patches.BaseTextObjects
foreach (TextMeshProUGUI txt in __instance.textMeshes) foreach (TextMeshProUGUI txt in __instance.textMeshes)
{ {
string travelMatch = TravelMgr_Patch.MatchTravelBuff(txt.text);
if(travelMatch != "")
{
txt.text = travelMatch;
}
else
{
txt.text = StringStore.TranslateText(txt.text, true); txt.text = StringStore.TranslateText(txt.text, true);
}
txt.font = fontAsset; txt.font = fontAsset;
} }
} }

View file

@ -1,30 +1,30 @@
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using MelonLoader; //using MelonLoader;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using UnityEngine; //using UnityEngine;
using UnityEngine.TextCore.Text; //using UnityEngine.TextCore.Text;
using UnityEngine.UI; //using UnityEngine.UI;
using static MelonLoader.MelonLogger; //using static MelonLoader.MelonLogger;
namespace PvZ_Fusion_Translator.Patches.GameObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects
{ //{
[HarmonyPatch(typeof(AbyssBagMenu))] // [HarmonyPatch(typeof(AbyssBagMenu))]
public static class AbyssBagMenu_Patch // public static class AbyssBagMenu_Patch
{ // {
[HarmonyPatch(nameof(AbyssBagMenu.Awake))] // [HarmonyPatch(nameof(AbyssBagMenu.Awake))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void Awake_Post(AbyssCheckInBag __instance) // private static void Awake_Post(AbyssCheckInBag __instance)
{ // {
foreach(TextMeshProUGUI text in __instance.transform.FindChild("Background").GetComponentsInChildren<TextMeshProUGUI>()) // foreach(TextMeshProUGUI text in __instance.transform.FindChild("Background").GetComponentsInChildren<TextMeshProUGUI>())
{ // {
text.text = text.text + "_深渊"; // text.text = text.text + "_深渊";
text.text = StringStore.TranslateText("背包_深渊"); // text.text = StringStore.TranslateText("背包_深渊");
text.font = FontStore.LoadTMPFont(Utils.Language.ToString()); // text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
} // }
AbyssMenu2.Instance.UpdateIcons(); // AbyssMenu2.Instance.UpdateIcons();
} // }
} // }
} //}

View file

@ -0,0 +1,104 @@
using HarmonyLib;
using Il2Cpp;
using Il2CppTMPro;
using MelonLoader.TinyJSON;
using PvZ_Fusion_Translator.AssetStore;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using UnityEngine.TextCore.Text;
namespace PvZ_Fusion_Translator.Patches.GameObjects
{
[HarmonyPatch(typeof(AbyssBuffMenu))]
public static class AbyssBuffMenu_Patch
{
public static Dictionary<string, string> abyssBuffData = new Dictionary<string, string>();
[HarmonyPatch(nameof(AbyssBuffMenu.Awake))]
[HarmonyPostfix]
public static void Post_Awake(AbyssBuffMenu __instance)
{
LoadAbyssBuffData();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = fontAsset;
}
TranslateWindows(__instance, fontAsset);
}
[HarmonyPatch(nameof(AbyssBuffMenu.SelectWindow))]
[HarmonyPostfix]
public static void Post_SelectWindow(AbyssBuffMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
TranslateWindows(__instance, fontAsset);
}
[HarmonyPatch(nameof(AbyssBuffMenu.SetFavorite))]
[HarmonyPostfix]
public static void Post_SetFavorite(AbyssBuffMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = fontAsset;
}
}
public static void TranslateWindows(AbyssBuffMenu __instance, TMP_FontAsset fontAsset)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if (abyssBuffData.ContainsKey(text.text))
{
text.text = abyssBuffData[text.text];
text.font = fontAsset;
}
else
{
foreach (var x in abyssBuffData)
{
if (x.Key.Contains("{value}"))
{
string pattern = Regex.Escape(x.Key).Replace("\\{value}", "(\\d+)");
if (Regex.IsMatch(text.text, pattern))
{
var regex = new Regex(pattern);
var match = regex.Match(text.text);
text.text = String.Format(x.Value.Replace("value", "0"), match.Groups[1].Value);
text.font = fontAsset;
break;
}
}
}
}
}
foreach(AbyssBuffWindow window in __instance.GetComponentsInChildren<AbyssBuffWindow>())
{
window.buffName.autoSizeTextContainer = true;
}
}
public static void LoadAbyssBuffData()
{
abyssBuffData.Clear();
string abyssBuffText = File.ReadAllText(Path.Combine(FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language), "abyss_buffs.json"));
abyssBuffData = JsonSerializer.Deserialize<Dictionary<string, string>>(abyssBuffText);
}
}
}

View file

@ -1,31 +1,31 @@
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using MelonLoader; //using MelonLoader;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using UnityEngine; //using UnityEngine;
using UnityEngine.TextCore.Text; //using UnityEngine.TextCore.Text;
using UnityEngine.UI; //using UnityEngine.UI;
using static MelonLoader.MelonLogger; //using static MelonLoader.MelonLogger;
namespace PvZ_Fusion_Translator.Patches.GameObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects
{ //{
[HarmonyPatch(typeof(AbyssCheckInBag))] // [HarmonyPatch(typeof(AbyssCheckInBag))]
public static class AbyssCheckInBag_Patch // public static class AbyssCheckInBag_Patch
{ // {
[HarmonyPatch(nameof(AbyssCheckInBag.MoveFromBag))] // [HarmonyPatch(nameof(AbyssCheckInBag.MoveFromBag))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void MoveFromBag(AbyssCheckInBag __instance) // private static void MoveFromBag(AbyssCheckInBag __instance)
{ // {
AbyssMenu2.Instance.UpdateIcons(); // AbyssMenu2.Instance.UpdateIcons();
} // }
[HarmonyPatch(nameof(AbyssCheckInBag.SellIcon))] // [HarmonyPatch(nameof(AbyssCheckInBag.SellIcon))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void SellIcon(AbyssCheckInBag __instance) // private static void SellIcon(AbyssCheckInBag __instance)
{ // {
AbyssMenu2.Instance.UpdateIcons(); // AbyssMenu2.Instance.UpdateIcons();
} // }
} // }
} //}

View file

@ -1,48 +1,48 @@
using System.Text.RegularExpressions; //using System.Text.RegularExpressions;
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using MelonLoader; //using MelonLoader;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using UnityEngine.TextCore.Text; //using UnityEngine.TextCore.Text;
namespace PvZ_Fusion_Translator.Patches.GameObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects
{ //{
[HarmonyPatch(typeof(AbyssDevelopMenu))] // [HarmonyPatch(typeof(AbyssDevelopMenu))]
public static class AbyssDevelopMenu_Patch // public static class AbyssDevelopMenu_Patch
{ // {
[HarmonyPatch(nameof(AbyssDevelopMenu.UpdateInfo))] // [HarmonyPatch(nameof(AbyssDevelopMenu.UpdateInfo))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void UpdateInfo(AbyssDevelopMenu __instance) // private static void UpdateInfo(AbyssDevelopMenu __instance)
{ // {
__instance.currentMoney.text = StringStore.TranslateText(__instance.currentMoney.text); // __instance.currentMoney.text = StringStore.TranslateText(__instance.currentMoney.text);
__instance.upgradeTextInfo.text = StringStore.TranslateText(__instance.upgradeTextInfo.text); // __instance.upgradeTextInfo.text = StringStore.TranslateText(__instance.upgradeTextInfo.text);
TextMeshProUGUI upgradeCostText = __instance.transform.FindChild("UpgradeCost").GetComponent<TextMeshProUGUI>(); // TextMeshProUGUI upgradeCostText = __instance.transform.FindChild("UpgradeCost").GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); // TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
string regexStr = "([^\\s]+)\n当前等级:([^\\s]+)\n\n升级条件:\n([^\\s]+)\n\n升级消耗:([^\\s]+)"; // string regexStr = "([^\\s]+)\n当前等级:([^\\s]+)\n\n升级条件:\n([^\\s]+)\n\n升级消耗:([^\\s]+)";
Regex regex = new Regex(regexStr); // Regex regex = new Regex(regexStr);
if (regex.IsMatch(upgradeCostText.text)) // if (regex.IsMatch(upgradeCostText.text))
{ // {
Match match = regex.Match(upgradeCostText.text); // Match match = regex.Match(upgradeCostText.text);
int groupCount = match.Groups.Count; // int groupCount = match.Groups.Count;
List<string> dynamicParts = []; // List<string> dynamicParts = [];
for (int i = 1; i < groupCount; i++) // for (int i = 1; i < groupCount; i++)
{ // {
string groupValue = match.Groups[i].Value; // string groupValue = match.Groups[i].Value;
string translatedValue = StringStore.translationString.ContainsKey(groupValue) ? StringStore.translationString[groupValue] : groupValue; // string translatedValue = StringStore.translationString.ContainsKey(groupValue) ? StringStore.translationString[groupValue] : groupValue;
dynamicParts.Add(translatedValue); // dynamicParts.Add(translatedValue);
} // }
upgradeCostText.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]); // upgradeCostText.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]);
upgradeCostText.font = fontAsset; // upgradeCostText.font = fontAsset;
} // }
} // }
} // }
} //}

View file

@ -1,104 +1,104 @@
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using MelonLoader; //using MelonLoader;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using UnityEngine; //using UnityEngine;
using UnityEngine.TextCore.Text; //using UnityEngine.TextCore.Text;
using UnityEngine.UI; //using UnityEngine.UI;
using static MelonLoader.MelonLogger; //using static MelonLoader.MelonLogger;
namespace PvZ_Fusion_Translator.Patches.GameObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects
{ //{
[HarmonyPatch(typeof(AbyssMenu2))] // [HarmonyPatch(typeof(AbyssMenu2))]
public static class AbyssMenu2_Patch // public static class AbyssMenu2_Patch
{ // {
private static void UpdateAbyss2Text(AbyssMenu2 __instance) // private static void UpdateAbyss2Text(AbyssMenu2 __instance)
{ // {
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); // TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
__instance.buffCountText.text = StringStore.TranslateText(__instance.buffCountText.text); // __instance.buffCountText.text = StringStore.TranslateText(__instance.buffCountText.text);
__instance.buffCountText.font = fontAsset; // __instance.buffCountText.font = fontAsset;
__instance.money.text = StringStore.TranslateText(__instance.money.text); // __instance.money.text = StringStore.TranslateText(__instance.money.text);
__instance.money.font = fontAsset; // __instance.money.font = fontAsset;
__instance.refreshText.text = StringStore.TranslateText(__instance.refreshText.text); // __instance.refreshText.text = StringStore.TranslateText(__instance.refreshText.text);
__instance.refreshText.font = fontAsset; // __instance.refreshText.font = fontAsset;
__instance.statistics.text = StringStore.TranslateText(__instance.statistics.text); // __instance.statistics.text = StringStore.TranslateText(__instance.statistics.text);
__instance.statistics.font = fontAsset; // __instance.statistics.font = fontAsset;
Transform buffTextTransform = __instance.transform.FindChild("BuffText").transform; // Transform buffTextTransform = __instance.transform.FindChild("BuffText").transform;
if (buffTextTransform != null) StringStore.TranslateTextTransform(buffTextTransform); // if (buffTextTransform != null) StringStore.TranslateTextTransform(buffTextTransform);
Transform moneyTransform = __instance.transform.FindChild("Money").transform; // Transform moneyTransform = __instance.transform.FindChild("Money").transform;
if (moneyTransform != null) StringStore.TranslateTextTransform(moneyTransform); // if (moneyTransform != null) StringStore.TranslateTextTransform(moneyTransform);
Transform buffCountTextTransform = __instance.transform.FindChild("BuffCountText").transform; // Transform buffCountTextTransform = __instance.transform.FindChild("BuffCountText").transform;
if (buffCountTextTransform != null) StringStore.TranslateTextTransform(buffCountTextTransform); // if (buffCountTextTransform != null) StringStore.TranslateTextTransform(buffCountTextTransform);
Transform refreshTextTransform = __instance.transform.FindChild("RefreshText").transform; // Transform refreshTextTransform = __instance.transform.FindChild("RefreshText").transform;
if (refreshTextTransform != null) StringStore.TranslateTextTransform(refreshTextTransform); // if (refreshTextTransform != null) StringStore.TranslateTextTransform(refreshTextTransform);
Transform optionsTransform = __instance.transform.FindChild("Options").transform; // Transform optionsTransform = __instance.transform.FindChild("Options").transform;
foreach (AbyssBuffButton abyssBuffButton in optionsTransform.GetComponentsInChildren<AbyssBuffButton>()) // foreach (AbyssBuffButton abyssBuffButton in optionsTransform.GetComponentsInChildren<AbyssBuffButton>())
{ // {
foreach (TextMeshProUGUI textMesh in abyssBuffButton.GetComponentsInChildren<TextMeshProUGUI>()) // foreach (TextMeshProUGUI textMesh in abyssBuffButton.GetComponentsInChildren<TextMeshProUGUI>())
{ // {
textMesh.text = StringStore.TranslateText(textMesh.text); // textMesh.text = StringStore.TranslateText(textMesh.text);
} // }
} // }
foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>()) // foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{ // {
text.text = StringStore.TranslateText(text.text); // text.text = StringStore.TranslateText(text.text);
text.font = fontAsset; // text.font = fontAsset;
} // }
} // }
[HarmonyPatch(nameof(AbyssMenu2.Start))] // [HarmonyPatch(nameof(AbyssMenu2.Start))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void Start(AbyssMenu2 __instance) // private static void Start(AbyssMenu2 __instance)
{ // {
UpdateAbyss2Text(__instance); // UpdateAbyss2Text(__instance);
Utils.ConvertButtonText(__instance.transform, "Help"); // Utils.ConvertButtonText(__instance.transform, "Help");
// custom bag text :D // // custom bag text :D
__instance.transform.FindChild("Bag").FindChild("text").GetComponent<Text>().text += "_深渊"; // __instance.transform.FindChild("Bag").FindChild("text").GetComponent<Text>().text += "_深渊";
Utils.ConvertButtonText(__instance.transform, "Bag"); // Utils.ConvertButtonText(__instance.transform, "Bag");
} // }
[HarmonyPatch(nameof(AbyssMenu2.UpdateIcons))] // [HarmonyPatch(nameof(AbyssMenu2.UpdateIcons))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void UpdateIcons(AbyssMenu2 __instance) // private static void UpdateIcons(AbyssMenu2 __instance)
{ // {
UpdateAbyss2Text(__instance); // UpdateAbyss2Text(__instance);
} // }
[HarmonyPatch(nameof(AbyssMenu2.UpdateBuff))] // [HarmonyPatch(nameof(AbyssMenu2.UpdateBuff))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void UpdateBuff(AbyssMenu2 __instance) // private static void UpdateBuff(AbyssMenu2 __instance)
{ // {
UpdateAbyss2Text(__instance); // UpdateAbyss2Text(__instance);
} // }
[HarmonyPatch(nameof(AbyssMenu2.BuyBuff))] // [HarmonyPatch(nameof(AbyssMenu2.BuyBuff))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void BuyBuff(AbyssMenu2 __instance) // private static void BuyBuff(AbyssMenu2 __instance)
{ // {
UpdateAbyss2Text(__instance); // UpdateAbyss2Text(__instance);
} // }
[HarmonyPatch(nameof(AbyssMenu2.ShowBag))] // [HarmonyPatch(nameof(AbyssMenu2.ShowBag))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void ShowBag(AbyssMenu2 __instance) // private static void ShowBag(AbyssMenu2 __instance)
{ // {
UpdateAbyss2Text(__instance); // UpdateAbyss2Text(__instance);
} // }
} // }
} //}

View file

@ -22,7 +22,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
foreach (TextMeshProUGUI txt in __instance.levelInfo) foreach (TextMeshProUGUI txt in __instance.levelInfo)
{ {
txt.text = StringStore.TranslateText(txt.text, false); txt.text = StringStore.TranslateText(txt.text, pattern: "第(\\d+)关\n场景:([^\\s]+)\n总波数:(\\d+)波\n特殊环境:([^\\s]+)\n难度:(\\d+)");
txt.font = fontAsset; txt.font = fontAsset;
} }
@ -41,28 +41,9 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
foreach (TextMeshProUGUI txt in __instance.levelInfo) foreach (TextMeshProUGUI txt in __instance.levelInfo)
{ {
string regexStr = "第(\\d+)关\n场景:([^\\s]+)\n总波数:(\\d+)波\n特殊环境:([^\\s:]+)\n减伤强度:(\\d+)"; txt.text = StringStore.TranslateText(txt.text, pattern: "第(\\d+)关\n场景:([^\\s]+)\n总波数:(\\d+)波\n特殊环境:([^\\s]+)\n难度:(\\d+)");
Regex regex = new Regex(regexStr);
if(regex.IsMatch(txt.text))
{
Match match = regex.Match(txt.text);
int groupCount = match.Groups.Count;
List<string> dynamicParts = [];
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);
}
txt.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]);
txt.font = fontAsset; txt.font = fontAsset;
} }
} }
} }
}
} }

View file

@ -1,55 +1,55 @@
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using MelonLoader; //using MelonLoader;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using Unity.VisualScripting; //using Unity.VisualScripting;
using UnityEngine; //using UnityEngine;
using System.Text.RegularExpressions; //using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator.Patches.GameObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects
{ //{
[HarmonyPatch(typeof(AbyssSettlementMenu))] // [HarmonyPatch(typeof(AbyssSettlementMenu))]
public static class AbyssSettlementMenu_Patch // public static class AbyssSettlementMenu_Patch
{ // {
[HarmonyPatch(nameof(AbyssSettlementMenu.InitSettle))] // [HarmonyPatch(nameof(AbyssSettlementMenu.InitSettle))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void InitSettle(AbyssSettlementMenu __instance) // private static void InitSettle(AbyssSettlementMenu __instance)
{ // {
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); // TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
string[] regexStrList = [ // string[] regexStrList = [
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n极限模式产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)", // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n极限模式产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)",
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n极限模式产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)", // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n极限模式产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)",
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)", // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)",
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n困难模式产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)", // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n困难模式产出:(\\d+)\n首胜产出:(\\d+)\n剩余小推车数量:(\\d+),获得叶绿素:(\\d+)\n产出叶绿素总计:(\\d+)",
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)", // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)",
"第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n困难模式产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)" // "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n困难模式产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)"
]; // ];
foreach(string regexStr in regexStrList) // foreach(string regexStr in regexStrList)
{ // {
Regex regex = new Regex(regexStr); // Regex regex = new Regex(regexStr);
if (regex.IsMatch(__instance.settleInfo.text)) // if (regex.IsMatch(__instance.settleInfo.text))
{ // {
Match match = regex.Match(__instance.settleInfo.text); // Match match = regex.Match(__instance.settleInfo.text);
int groupCount = match.Groups.Count; // int groupCount = match.Groups.Count;
List<string> dynamicParts = []; // List<string> dynamicParts = [];
for (int i = 1; i < groupCount; i++) // for (int i = 1; i < groupCount; i++)
{ // {
string groupValue = match.Groups[i].Value; // string groupValue = match.Groups[i].Value;
string translatedValue = StringStore.translationString.ContainsKey(groupValue) ? StringStore.translationString[groupValue] : groupValue; // string translatedValue = StringStore.translationString.ContainsKey(groupValue) ? StringStore.translationString[groupValue] : groupValue;
dynamicParts.Add(translatedValue); // dynamicParts.Add(translatedValue);
} // }
__instance.settleInfo.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]); // __instance.settleInfo.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]);
__instance.settleInfo.font = fontAsset; // __instance.settleInfo.font = fontAsset;
} // }
} // }
} // }
} // }
} //}

View file

@ -1,26 +1,26 @@
using HarmonyLib; //using HarmonyLib;
using Il2Cpp; //using Il2Cpp;
using Il2CppTMPro; //using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; //using PvZ_Fusion_Translator.AssetStore;
using UnityEngine; //using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects //namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects
{ //{
[HarmonyPatch(typeof(AbyssCheckSellMenu))] // [HarmonyPatch(typeof(AbyssCheckSellMenu))]
public static class AbyssCheckSellMenu_Patch // public static class AbyssCheckSellMenu_Patch
{ // {
[HarmonyPatch(nameof(AbyssCheckSellMenu.SellIcon))] // [HarmonyPatch(nameof(AbyssCheckSellMenu.SellIcon))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void SellIcon(AbyssCheckSellMenu __instance) // private static void SellIcon(AbyssCheckSellMenu __instance)
{ // {
AbyssMenu2.Instance.UpdateIcons(); // AbyssMenu2.Instance.UpdateIcons();
} // }
[HarmonyPatch(nameof(AbyssCheckSellMenu.MoveInBag))] // [HarmonyPatch(nameof(AbyssCheckSellMenu.MoveInBag))]
[HarmonyPostfix] // [HarmonyPostfix]
private static void MoveInBag(AbyssCheckSellMenu __instance) // private static void MoveInBag(AbyssCheckSellMenu __instance)
{ // {
AbyssMenu2.Instance.UpdateIcons(); // AbyssMenu2.Instance.UpdateIcons();
} // }
} // }
} //}

View file

@ -0,0 +1,20 @@
using HarmonyLib;
using Il2Cpp;
using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(ExploreMakeSceneButton))]
public class ExploreMakeSceneButton_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(ExploreMakeSceneButton.Start))]
public static void Start(ExploreMakeSceneButton __instance)
{
__instance.sceneText.text = StringStore.TranslateText(__instance.sceneText.text);
__instance.sceneText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}

View file

@ -0,0 +1,20 @@
using HarmonyLib;
using Il2Cpp;
using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(ExploreMakeZombieButton))]
public class ExploreMakeZombieButton_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(ExploreMakeZombieButton.Start))]
public static void Start(ExploreMakeZombieButton __instance)
{
__instance.sceneText.text = Utils.GetZombieNameFromAlmanac(__instance.theZombieType);
__instance.sceneText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}

View file

@ -27,11 +27,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
text.font = FontStore.LoadTMPFont(Utils.Language.ToString()); text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
textShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString()); textShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString());
if(!text.name.Contains("_EVACUATE"))
{
text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true;
}
} }
else else
{ {
@ -68,6 +63,24 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
try try
{ {
if (__instance.transform.childCount >= 2) if (__instance.transform.childCount >= 2)
{
if(__instance.name == "EditMode")
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent<TextMeshProUGUI>();
TextMeshProUGUI[] extraTexts = __instance.transform.GetChild(1).GetComponentsInChildren<TextMeshProUGUI>();
text.text = StringStore.TranslateText(text.text, false);
text.font = fontAsset;
foreach(TextMeshProUGUI extraText in extraTexts)
{
extraText.text = StringStore.TranslateText(extraText.text, false);
extraText.font = fontAsset;
}
}
else
{ {
TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent<TextMeshProUGUI>(); TextMeshProUGUI text = __instance.transform.GetChild(0).GetComponent<TextMeshProUGUI>();
TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent<TextMeshProUGUI>(); TextMeshProUGUI textShadow = __instance.transform.GetChild(1).GetComponent<TextMeshProUGUI>();
@ -77,7 +90,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
text.font = FontStore.LoadTMPFont(Utils.Language.ToString()); text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
textShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString()); textShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString());
text.autoSizeTextContainer = textShadow.autoSizeTextContainer = true; }
} }
} }
catch (Exception) { } catch (Exception) { }

View file

@ -0,0 +1,72 @@
using HarmonyLib;
using Il2Cpp;
using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore;
using System.Text.RegularExpressions;
using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects
{
[HarmonyPatch(typeof(ExploreMakeMenu))]
public static class ExploreMakeMenu_Patch
{
[HarmonyPatch(nameof(ExploreMakeMenu.Awake))]
[HarmonyPostfix]
private static void Awake(ExploreMakeMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText(txt.text);
txt.font = fontAsset;
}
}
[HarmonyPatch(nameof(ExploreMakeMenu.InitMenu))]
[HarmonyPostfix]
private static void InitMenu(ExploreMakeMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if(txt.text.Contains("关卡制作中:"))
{
string plantName = Utils.GetPlantNameFromAlmanac(txt.text.Split(":")[1]);
txt.text = String.Format(StringStore.translationStringRegex["关卡制作中:([^\\s]+)"], plantName);
}
else
{
txt.text = StringStore.TranslateText(txt.text);
}
}
}
[HarmonyPatch(nameof(ExploreMakeMenu.ViewScene))]
[HarmonyPostfix]
private static void ViewScene(ExploreMakeMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText(txt.text);
txt.font = fontAsset;
}
}
[HarmonyPatch(nameof(ExploreMakeMenu.InitZombieButtons))]
[HarmonyPostfix]
private static void InitZombieButtons(ExploreMakeMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText(txt.text);
txt.font = fontAsset;
}
}
}
}

View file

@ -22,17 +22,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
} }
Transform randomLevelTextTransform = __instance.transform.FindChild("RandomLevel"); Transform randomLevelTextTransform = __instance.transform.FindChild("RandomLevel");
foreach (TextMeshProUGUI txt in randomLevelTextTransform.GetComponentsInChildren<TextMeshProUGUI>())
{
if (txt.name.Contains("Text (TMP)"))
{
txt.autoSizeTextContainer = true;
if (txt.name == "Text (TMP)")
{
txt.transform.localPosition = new UnityEngine.Vector3(94.4225f, -45.1565f, 0f);
}
}
}
} }
[HarmonyPatch(nameof(ExploreMenu.UpdateWindows))] [HarmonyPatch(nameof(ExploreMenu.UpdateWindows))]

View file

@ -3,30 +3,48 @@ using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
namespace PvZ_Fusion_Translator.Patches.GameObjects namespace PvZ_Fusion_Translator.Patches.GameObjects
{ {
[HarmonyPatch(typeof(NoticeMenu))] [HarmonyPatch(typeof(NoticeMenu))]
public class NoticePauseMenu_Patch public class NoticePauseMenu_Patch
{ {
[HarmonyPrefix]
[HarmonyPatch(nameof(NoticeMenu.Awake))]
private static void Pre_Awake(NoticeMenu __instance)
{
GameObject contentObject = __instance.transform.FindChild("Scroll View").GetChild(0).GetChild(0).gameObject; //bc normal Find or FindChild didn't work
TextMeshProUGUI contentText = contentObject.GetComponent<TextMeshProUGUI>();
File.WriteAllText(Path.Combine(FileLoader.GetAssetDir(FileLoader.AssetType.Dumps), "changelog.txt"), contentText.text);
string stringDir = FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language);
string changelogDir = Path.Combine(stringDir, "changelog.txt");
if (!File.Exists(changelogDir))
{
File.WriteAllText(changelogDir, contentText.text);
}
}
[HarmonyPostfix] [HarmonyPostfix]
[HarmonyPatch(nameof(NoticeMenu.Start))] [HarmonyPatch(nameof(NoticeMenu.Awake))]
private static void Start(NoticeMenu __instance) private static void Post_Awake(NoticeMenu __instance)
{ {
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString()); TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
Transform warningTransform = __instance.transform.FindChild("窗口"); string stringDir = FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language);
Transform warningTextTransform = warningTransform.FindChild("文字"); string changelogDir = Path.Combine(stringDir, "changelog.txt");
Transform warningTextShadowTransform = warningTransform.FindChild("文字2");
Transform[] array = [warningTextTransform, warningTextShadowTransform];
for (int i = 0; i < array.Length; i++) string changelogText = File.ReadAllText(changelogDir);
{
if (array[i] != null) GameObject contentObject = __instance.transform.FindChild("Scroll View").GetChild(0).GetChild(0).gameObject; //bc normal Find or FindChild didn't work
{
array[i].GetComponent<TextMeshProUGUI>().text = StringStore.TranslateText(array[i].GetComponent<TextMeshProUGUI>().text); TextMeshProUGUI contentText = contentObject.GetComponent<TextMeshProUGUI>();
array[i].GetComponent<TextMeshProUGUI>().font = fontAsset; contentText.text = changelogText;
}
} ContentSizeFitter sizeFitter = contentObject.AddComponent<ContentSizeFitter>();
sizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
} }
} }
} }

View file

@ -2,6 +2,7 @@
using Il2Cpp; using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using static PvZ_Fusion_Translator.Patches.Managers.TravelMgr_Patch;
using UnityEngine; using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects namespace PvZ_Fusion_Translator.Patches.GameObjects
@ -13,9 +14,9 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void RefeshOptions(TravelBuffMenu __instance) private static void RefeshOptions(TravelBuffMenu __instance)
{ {
foreach(TravelBuffOptionButton button in __instance.options) foreach (TravelBuffOptionButton button in __instance.options)
{ {
button.introduce.text = StringStore.TranslateText(button.introduce.text); button.introduce.text = translatedTravelBuffs[buffLinks[button.buffType]][button.buffIndex];
} }
} }
} }

View file

@ -2,6 +2,7 @@
using Il2Cpp; using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using static PvZ_Fusion_Translator.Patches.Managers.TravelMgr_Patch;
namespace PvZ_Fusion_Translator.Patches.GameObjects namespace PvZ_Fusion_Translator.Patches.GameObjects
{ {
@ -12,54 +13,27 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void SetBuff(TravelBuffOptionButton __instance) private static void SetBuff(TravelBuffOptionButton __instance)
{ {
__instance.introduce.text = StringStore.TranslateText(__instance.introduce.text); List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
} }
[HarmonyPatch(nameof(TravelBuffOptionButton.Awake))] [HarmonyPatch(nameof(TravelBuffOptionButton.Awake))]
[HarmonyPostfix] [HarmonyPostfix]
private static void Awake(TravelBuffOptionButton __instance) private static void Awake(TravelBuffOptionButton __instance)
{ {
__instance.introduce.text = StringStore.TranslateText(__instance.introduce.text); List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
} }
[HarmonyPatch(nameof(TravelBuffOptionButton.OnAnimOver))] [HarmonyPatch(nameof(TravelBuffOptionButton.OnAnimOver))]
[HarmonyPostfix] [HarmonyPostfix]
private static void OnAnimOver(TravelBuffOptionButton __instance) private static void OnAnimOver(TravelBuffOptionButton __instance)
{ {
__instance.introduce.text = StringStore.TranslateText(__instance.introduce.text); List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
} string buffText = (__instance.buffIndex < buffSet.Count) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
[HarmonyPatch(nameof(TravelBuffOptionButton.SetBackground))]
[HarmonyPostfix]
private static void SetBackground(TravelBuffOptionButton __instance)
{
__instance.introduce.text = StringStore.TranslateText(__instance.introduce.text);
} }
//[HarmonyPatch(nameof(TravelMenuMgr.SetText))]
//[HarmonyPostfix]
//private static void SetText(TravelMenuMgr __instance)
//{
// foreach(TextMeshProUGUI text in __instance.textMesh)
// {
// text.text = StringStore.TranslateText(text.text);
// }
// foreach(TextMeshProUGUI text in __instance.textMeshShadow)
// {
// text.text = StringStore.TranslateText(text.text);
// }
//}
//[HarmonyPatch(nameof(TravelMenuMgr.SetRichText), [typeof(int), typeof(int), typeof(TextMeshProUGUI), typeof(string)])]
//[HarmonyPostfix]
//private static void SetRichText(TravelMenuMgr __instance)
//{
// foreach(TextMeshProUGUI text in __instance.textMesh)
// {
// text.text = StringStore.TranslateText(text.text);
// }
// foreach(TextMeshProUGUI text in __instance.textMeshShadow)
// {
// text.text = StringStore.TranslateText(text.text);
// }
//}
} }
} }

View file

@ -2,43 +2,50 @@
using Il2Cpp; using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using static PvZ_Fusion_Translator.Patches.Managers.TravelMgr_Patch;
using UnityEngine; using UnityEngine;
using MelonLoader;
namespace PvZ_Fusion_Translator.Patches.GameObjects namespace PvZ_Fusion_Translator.Patches.GameObjects
{ {
[HarmonyPatch(typeof(TravelLookBuff))] [HarmonyPatch(typeof(TravelLookBuff))]
public static class TravelLookBuff_Patch public static class TravelLookBuff_Patch
{ {
private static void TranslateTexts(TravelLookBuff instance) [HarmonyPatch(nameof(TravelLookBuff.Clear))]
[HarmonyPostfix]
public static void Post_Clear(TravelLookBuff __instance)
{ {
instance.introduce.text = StringStore.TranslateText(instance.introduce.text); __instance.introduce.text = StringStore.TranslateText("无");
__instance.set = false;
Transform transform = instance.rectTransform.transform; foreach (TextMeshProUGUI text in __instance.transform.FindChild("Images").FindChild("Button").GetComponentsInChildren<TextMeshProUGUI>())
var component1 = transform.GetChild(0).GetComponent<TextMeshProUGUI>(); {
var component2 = transform.GetChild(1).GetComponent<TextMeshProUGUI>(); text.text = StringStore.TranslateText(text.text);
}
}
if (component1 != null) component1.text = StringStore.TranslateText(component1.text); [HarmonyPatch(nameof(TravelLookBuff.OnMouseUpAsButton))]
if (component2 != null) component2.text = StringStore.TranslateText(component2.text); [HarmonyPostfix]
public static void Post_OnMouseUpAsButton(TravelLookBuff __instance)
{
foreach (TextMeshProUGUI text in __instance.transform.FindChild("Images").FindChild("Button").GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
} }
[HarmonyPatch(nameof(TravelLookBuff.SetBuff))] [HarmonyPatch(nameof(TravelLookBuff.SetBuff))]
[HarmonyPostfix] [HarmonyPostfix]
private static void SetBuff(TravelLookBuff __instance) => TranslateTexts(__instance); public static void Post_SetBuff(TravelLookBuff __instance)
{
List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
__instance.introduce.text = buffText;
[HarmonyPatch(nameof(TravelLookBuff.OnMouseUpAsButton))] foreach (TextMeshProUGUI text in __instance.transform.FindChild("Images").FindChild("Button").GetComponentsInChildren<TextMeshProUGUI>())
[HarmonyPostfix] {
private static void OnMouseUpAsButton(TravelLookBuff __instance) => TranslateTexts(__instance); text.text = StringStore.TranslateText(text.text);
}
[HarmonyPatch(nameof(TravelLookBuff.Clear))] }
[HarmonyPostfix]
private static void Clear(TravelLookBuff __instance) => TranslateTexts(__instance);
[HarmonyPatch(nameof(TravelLookBuff.SetText), new Type[] { typeof(string) })]
[HarmonyPostfix]
private static void SetText_String(TravelLookBuff __instance) => TranslateTexts(__instance);
[HarmonyPatch(nameof(TravelLookBuff.SetText), new Type[] { typeof(bool), typeof(int) })]
[HarmonyPostfix]
private static void SetText_Bool(TravelLookBuff __instance) => TranslateTexts(__instance);
} }
} }

View file

@ -15,7 +15,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void Postfix_Start(TravelLookMenu __instance) private static void Postfix_Start(TravelLookMenu __instance)
{ {
foreach(TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>()) foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{ {
txt.text = StringStore.TranslateText(txt.text); txt.text = StringStore.TranslateText(txt.text);
txt.font = FontStore.LoadTMPFont(Utils.Language.ToString()); txt.font = FontStore.LoadTMPFont(Utils.Language.ToString());
@ -36,7 +36,7 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void Update(TravelLookMenu __instance) private static void Update(TravelLookMenu __instance)
{ {
if(savedAssetString != __instance.treasureText.text) if (savedAssetString != __instance.treasureText.text)
{ {
__instance.treasureText.text = StringStore.TranslateText(__instance.treasureText.text); __instance.treasureText.text = StringStore.TranslateText(__instance.treasureText.text);
savedAssetString = __instance.treasureText.text; savedAssetString = __instance.treasureText.text;

View file

@ -15,41 +15,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
{ {
__instance.text = StringStore.TranslateText(__instance.text); __instance.text = StringStore.TranslateText(__instance.text);
__instance.text_shadow = StringStore.TranslateText(__instance.text_shadow); __instance.text_shadow = StringStore.TranslateText(__instance.text_shadow);
//TextMeshProUGUI pointsText = __instance.transform.GetChild(0).GetComponent<TextMeshProUGUI>();
//pointsText = StringStore.TranslateText(pointsText);
//pointsText.autoSizeTextContainer = true;
//Transform TravelMenuTransform = __instance.transform.parent.transform;
//Transform refreshTransform = TravelMenuTransform.Find("Refresh2").transform.Find("bank");
//if (refreshTransform != null)
//{
// Transform text_1Transform = refreshTransform.Find("text_1");
// if (text_1Transform != null)
// {
// TextMeshProUGUI text_1 = text_1Transform.GetComponent<TextMeshProUGUI>();
// if (text_1)
// {
// text_1 = StringStore.TranslateText(text_1);
// text_1.autoSizeTextContainer = true;
// }
// }
// Transform text_2Transform = refreshTransform.Find("text_2");
// if (text_2Transform != null)
// {
// TextMeshProUGUI text_2 = text_2Transform.GetComponent<TextMeshProUGUI>();
// if (text_2)
// {
// text_2 = StringStore.TranslateText(text_2);
// text_2.autoSizeTextContainer = true;
// }
// }
//}
} }
[HarmonyPatch(nameof(TravelRefresh.OnMouseUpAsButton))] [HarmonyPatch(nameof(TravelRefresh.OnMouseUpAsButton))]
@ -58,41 +23,6 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
{ {
__instance.text = StringStore.TranslateText(__instance.text); __instance.text = StringStore.TranslateText(__instance.text);
__instance.text_shadow = StringStore.TranslateText(__instance.text_shadow); __instance.text_shadow = StringStore.TranslateText(__instance.text_shadow);
//TextMeshProUGUI pointsText = __instance.transform.GetChild(0).GetComponent<TextMeshProUGUI>();
//pointsText = StringStore.TranslateText(pointsText);
//pointsText.autoSizeTextContainer = true;
//Transform TravelMenuTransform = __instance.transform.parent.transform;
//Transform refreshTransform = TravelMenuTransform.Find("Refresh2").transform.Find("bank");
//if (refreshTransform != null)
//{
// Transform text_1Transform = refreshTransform.Find("text_1");
// if (text_1Transform != null)
// {
// TextMeshProUGUI text_1 = text_1Transform.GetComponent<TextMeshProUGUI>();
// if (text_1)
// {
// text_1 = StringStore.TranslateText(text_1);
// text_1.autoSizeTextContainer = true;
// }
// }
// Transform text_2Transform = refreshTransform.Find("text_2");
// if (text_2Transform != null)
// {
// TextMeshProUGUI text_2 = text_2Transform.GetComponent<TextMeshProUGUI>();
// if (text_2)
// {
// text_2 = StringStore.TranslateText(text_2);
// text_2.autoSizeTextContainer = true;
// }
// }
//}
} }
} }
} }

View file

@ -2,6 +2,7 @@
using Il2Cpp; using Il2Cpp;
using Il2CppTMPro; using Il2CppTMPro;
using PvZ_Fusion_Translator.AssetStore; using PvZ_Fusion_Translator.AssetStore;
using static PvZ_Fusion_Translator.Patches.Managers.TravelMgr_Patch;
using UnityEngine; using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects namespace PvZ_Fusion_Translator.Patches.GameObjects
@ -13,11 +14,18 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
[HarmonyPostfix] [HarmonyPostfix]
private static void Update(TravelStore __instance) private static void Update(TravelStore __instance)
{ {
foreach (TextMeshProUGUI intr in __instance.introduces) foreach(TextMeshProUGUI text in __instance.introduces)
intr.text = StringStore.TranslateText(intr.text); {
if(__instance.currentSelect != null)
{
text.text = translatedTravelBuffs[buffLinks[(BuffType)__instance.currentSelect.theBuffType]][__instance.currentSelect.theBuffNumber];
}
}
foreach (var textMesh in __instance.points) foreach (var textMesh in __instance.points)
{
textMesh.text = StringStore.TranslateText(textMesh.text); textMesh.text = StringStore.TranslateText(textMesh.text);
} }
}
[HarmonyPatch(nameof(TravelStore.RefreshBuff))] [HarmonyPatch(nameof(TravelStore.RefreshBuff))]
[HarmonyPostfix] [HarmonyPostfix]
@ -28,12 +36,19 @@ namespace PvZ_Fusion_Translator.Patches.GameObjects
TextMeshProUGUI cost = buff.transform.GetChild(1).GetComponent<TextMeshProUGUI>(); TextMeshProUGUI cost = buff.transform.GetChild(1).GetComponent<TextMeshProUGUI>();
cost.text = StringStore.TranslateText(cost.text); cost.text = StringStore.TranslateText(cost.text);
cost.font = FontStore.LoadTMPFont(Utils.Language.ToString()); cost.font = FontStore.LoadTMPFont(Utils.Language.ToString());
//FileLoader.DumpUntranslatedStrings(cost.text);
} }
foreach (TextMeshProUGUI intr in __instance.introduces)
intr.text = StringStore.TranslateText(intr.text); foreach (TextMeshProUGUI text in __instance.introduces)
{
if (__instance.currentSelect != null)
{
text.text = translatedTravelBuffs[buffLinks[(BuffType)__instance.currentSelect.theBuffType]][__instance.currentSelect.theBuffNumber];
}
}
foreach (var textMesh in __instance.points) foreach (var textMesh in __instance.points)
{
textMesh.text = StringStore.TranslateText(textMesh.text); textMesh.text = StringStore.TranslateText(textMesh.text);
} }
} }
}
} }

View file

@ -0,0 +1,125 @@
//using HarmonyLib;
//using Il2Cpp;
//using MelonLoader;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Text.Json;
//using System.Threading.Tasks;
//using Unity.VisualScripting;
//using UnityEngine;
//namespace PvZ_Fusion_Translator.Patches.Managers
//{
// [HarmonyPatch(typeof(AbyssBuffData))]
// public static class AbyssBuffData_Patch
// {
// [HarmonyPatch(nameof(AbyssBuffData.LoadData))]
// [HarmonyPostfix]
// public static void Pre_LoadData(AbyssBuffData __instance)
// {
// string originalAbyssBuffStr = Resources.Load<TextAsset>("AbyssBuffData").text;
// Dictionary<string, List<AbyssBuffInfo>> originalAbyssBuffData = JsonSerializer.Deserialize<Dictionary<string, List<AbyssBuffInfo>>>(originalAbyssBuffStr);
// List<AbyssBuffInfo> infos = originalAbyssBuffData["infos"];
// Il2CppSystem.Collections.Generic.Dictionary<AbyssBuff, Il2CppSystem.ValueTuple<string, string, float>> result = new();
// string abyssBuffDataDir = Path.Combine(FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language), "abyss_buffs.json");
// if (!File.Exists(abyssBuffDataDir))
// {
// File.WriteAllText(abyssBuffDataDir, originalAbyssBuffStr);
// }
// Dictionary<string, string> abyssBuffData = JsonSerializer.Deserialize<Dictionary<string, string>>(File.ReadAllText(abyssBuffDataDir));
// for (int i = 0; i < infos.Count; i++)
// {
// AbyssBuffInfo originalTuple = infos[i];
// Il2CppSystem.ValueTuple<string, string, float> translatedTuple = new();
// translatedTuple.Item1 = abyssBuffData.ContainsKey(originalTuple.name) ? abyssBuffData[originalTuple.name] : originalTuple.name;
// translatedTuple.Item2 = abyssBuffData.ContainsKey(originalTuple.introduce) ? abyssBuffData[originalTuple.introduce] : originalTuple.introduce;
// translatedTuple.Item3 = originalTuple.value;
// foreach (var x in AbyssBuffData.buffDatas)
// {
// if (x.Value.Item1 == originalTuple.name)
// {
// AbyssBuffData.buffDatas[x.Key] = translatedTuple;
// break;
// }
// }
// }
// }
// }
// public enum AbyssBuffClone
// {
// 生存_聚塑,
// 生存_启命,
// 生存_坚定,
// 生存_弥合,
// 生存_警戒,
// 生存_霸体,
// 生存_共存,
// 生存_护盾,
// 生存_治疗,
// 生存_主宰,
// 寒冰_聚塑,
// 寒冰_刺骨,
// 寒冰_凛风,
// 寒冰_冻结,
// 寒冰_保护,
// 寒冰_折磨,
// 寒冰_扩散,
// 寒冰_凝神,
// 寒冰_破冰,
// 寒冰_永冻,
// 魅惑_聚塑,
// 魅惑_感应,
// 魅惑_催眠,
// 魅惑_无畏,
// 魅惑_脆弱,
// 魅惑_黑曜,
// 魅惑_转世,
// 魅惑_支援,
// 魅惑_沉重,
// 魅惑_共鸣,
// 烈焰_聚塑,
// 烈焰_爆破,
// 烈焰_怒火,
// 烈焰_红唇,
// 烈焰_融化,
// 烈焰_燃烧,
// 烈焰_浴火,
// 烈焰_鬼火,
// 烈焰_诅咒,
// 烈焰_太阳,
// 通用_断水,
// 通用_千斤,
// 通用_急迫,
// 通用_折扣,
// 通用_密植,
// 通用_超级,
// 通用_究极,
// 通用_极速,
// 通用_强力,
// 通用_专注,
// 通用_迸发,
// 通用_投资,
// 通用_机遇,
// 通用_命运,
// 通用_时停,
// 通用_升级,
// 蒜毒_聚塑,
// 蒜毒_腐蚀,
// 蒜毒_侵蚀,
// 蒜毒_血清,
// 蒜毒_混乱,
// 蒜毒_虚弱,
// 蒜毒_反胃,
// 蒜毒_虫噬,
// 蒜毒_百毒,
// 蒜毒_爆裂
// }
//}

View file

@ -0,0 +1,12 @@
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//namespace PvZ_Fusion_Translator.Patches.Managers
//{
// public class AbyssInfo_Patch
// {
// }
//}

View file

@ -26,7 +26,8 @@ namespace PvZ_Fusion_Translator.Patches.Managers
if(new Regex("([^\\s]+),推荐难度:(\\d+)").IsMatch(array[i].text)) if(new Regex("([^\\s]+),推荐难度:(\\d+)").IsMatch(array[i].text))
{ {
array[i].text = string.Format(fStr, StringStore.TranslateText(parts[0]), parts[1]); string customName = (StringStore.translationString.ContainsKey(parts[0] + "_IZ")) ? parts[0] + "_IZ" : parts[0];
array[i].text = string.Format(fStr, StringStore.TranslateText(customName), parts[1]);
} }
array[i] = StringStore.TranslateText(array[i]); array[i] = StringStore.TranslateText(array[i]);

View file

@ -1,5 +1,7 @@
using HarmonyLib; using HarmonyLib;
using Il2Cpp; using Il2Cpp;
using System.Text.Encodings.Web;
using System.Text.Json;
namespace PvZ_Fusion_Translator.Patches.Managers namespace PvZ_Fusion_Translator.Patches.Managers
{ {

View file

@ -0,0 +1,102 @@
using Il2Cpp;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Threading.Tasks;
using HarmonyLib;
namespace PvZ_Fusion_Translator.Patches.Managers
{
[HarmonyPatch(typeof(TravelMgr))]
public static class TravelMgr_Patch
{
public static Dictionary<BuffType, string> buffLinks = new Dictionary<BuffType, string>()
{
{ BuffType.AdvancedBuff, "advancedUpgrades" },
{ BuffType.UltimateBuff, "ultimateUpgrades" },
{ BuffType.UnlockPlant, "strongUltimates" },
{ BuffType.Debuff, "debuffs" },
};
public static Dictionary<string, List<string>> dumpedTravelBuffs = new Dictionary<string, List<string>>()
{
{ "advancedUpgrades", [] },
{ "ultimateUpgrades", [] },
{ "strongUltimates", [] },
{ "debuffs", [] }
};
public static Dictionary<string, List<string>> translatedTravelBuffs = new Dictionary<string, List<string>>();
public static void DumpTravelBuffs(Il2CppSystem.Collections.Generic.Dictionary<int, string> source, Dictionary<string, List<string>> dest, string index)
{
foreach (var i in source)
{
if (!Utils.CheckForUntranslatedText(i.Value))
{
break;
}
dest[index].Add(i.Value);
}
}
public static string MatchTravelBuff(string originalText)
{
string res = "";
foreach(var i in dumpedTravelBuffs)
{
if(i.Value.Contains(originalText))
{
res = translatedTravelBuffs[i.Key][i.Value.IndexOf(originalText)];
break;
}
}
return res;
}
[HarmonyPatch(nameof(TravelMgr.Awake))]
[HarmonyPrefix]
private static void Pre_Awake(TravelMgr __instance)
{
// Dump buffs
dumpedTravelBuffs = new Dictionary<string, List<string>>() // reset dump
{
{ "advancedUpgrades", [] },
{ "ultimateUpgrades", [] },
{ "strongUltimates", [] },
{ "debuffs", [] }
};
DumpTravelBuffs(TravelMgr.advancedBuffs, dumpedTravelBuffs, "advancedUpgrades");
DumpTravelBuffs(TravelMgr.ultimateBuffs, dumpedTravelBuffs, "ultimateUpgrades");
DumpTravelBuffs(TravelMgr.unlocks, dumpedTravelBuffs, "strongUltimates");
DumpTravelBuffs(TravelMgr.debuffs, dumpedTravelBuffs, "debuffs");
string dumpDir = FileLoader.GetAssetDir(FileLoader.AssetType.Dumps);
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
File.WriteAllText(Path.Combine(dumpDir, "travel_buffs.json"), JsonSerializer.Serialize(dumpedTravelBuffs, options));
string stringDir = FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language);
string travelBuffDir = Path.Combine(stringDir, "travel_buffs.json");
if(!File.Exists(travelBuffDir))
{
File.WriteAllText(travelBuffDir, JsonSerializer.Serialize(dumpedTravelBuffs, options));
}
string travelBuffs = File.ReadAllText(Path.Combine(stringDir, "travel_buffs.json"));
translatedTravelBuffs = JsonSerializer.Deserialize<Dictionary<string, List<string>>>(travelBuffs);
}
}
}

View file

@ -400,6 +400,10 @@
<Compile Include="Log.cs" /> <Compile Include="Log.cs" />
<Compile Include="ModFeatures.cs" /> <Compile Include="ModFeatures.cs" />
<Compile Include="AssetStore\AudioStore.cs" /> <Compile Include="AssetStore\AudioStore.cs" />
<Compile Include="Patches\GameObjects\AbyssBuffMenu_Patch.cs" />
<Compile Include="Patches\GameObjects\ButtonObjects\ExploreMakeSceneButton_Patch.cs" />
<Compile Include="Patches\GameObjects\ButtonObjects\ExploreMakeZombieButton_Patch.cs" />
<Compile Include="Patches\GameObjects\ExploreMakeMenu_Patch.cs" />
<Compile Include="Patches\GameObjects\SpriteRenderer_Patch.cs" /> <Compile Include="Patches\GameObjects\SpriteRenderer_Patch.cs" />
<Compile Include="Patches\GameObjects\Board_Patch.cs" /> <Compile Include="Patches\GameObjects\Board_Patch.cs" />
<Compile Include="Patches\GameObjects\ButtonObjects\MainMenu_Btn_Patch.cs" /> <Compile Include="Patches\GameObjects\ButtonObjects\MainMenu_Btn_Patch.cs" />
@ -457,10 +461,13 @@
<Compile Include="Patches\GameObjects\TravelLookBuff_Patch.cs" /> <Compile Include="Patches\GameObjects\TravelLookBuff_Patch.cs" />
<Compile Include="Patches\GameObjects\ShootingMenu_Patch.cs" /> <Compile Include="Patches\GameObjects\ShootingMenu_Patch.cs" />
<Compile Include="Patches\GameObjects\TravelLookMenu_Patch.cs" /> <Compile Include="Patches\GameObjects\TravelLookMenu_Patch.cs" />
<Compile Include="Patches\Managers\AbyssBuffData_Patch.cs" />
<Compile Include="Patches\Managers\AbyssInfo_Patch.cs" />
<Compile Include="Patches\Managers\ChessManager_Patch.cs" /> <Compile Include="Patches\Managers\ChessManager_Patch.cs" />
<Compile Include="Patches\Managers\CustomLevelShower_Patch.cs" /> <Compile Include="Patches\Managers\CustomLevelShower_Patch.cs" />
<Compile Include="Patches\Managers\Garden_Patch.cs" /> <Compile Include="Patches\Managers\Garden_Patch.cs" />
<Compile Include="Patches\Managers\DrawCardManager_Patch.cs" /> <Compile Include="Patches\Managers\DrawCardManager_Patch.cs" />
<Compile Include="Patches\Managers\TravelMgr_Patch.cs" />
<Compile Include="Patches\Managers\TreasureManager_Patch.cs" /> <Compile Include="Patches\Managers\TreasureManager_Patch.cs" />
<Compile Include="Patches\Managers\TowerManager_Patch.cs" /> <Compile Include="Patches\Managers\TowerManager_Patch.cs" />
<Compile Include="Patches\Managers\SaveMenu_Patch.cs" /> <Compile Include="Patches\Managers\SaveMenu_Patch.cs" />
@ -510,6 +517,7 @@
</ItemGroup> </ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent"> <Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Mods&quot;" /> <Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Mods\&quot;" />
<Exec Command="COPY &quot;$(TargetPath)&quot; &quot;$(GamePath)\Translation Builds\&quot;" />
</Target> </Target>
</Project> </Project>

View file

@ -343,7 +343,7 @@ namespace PvZ_Fusion_Translator
Javanese, //Filipino, Javanese, //Filipino,
Vietnamese, Vietnamese,
Indonesian, Indonesian,
//Russian, Russian, //NOTE: legacy language
Japanese, Japanese,
Korean, Korean,