using HarmonyLib; using Il2Cpp; using PvZ_Fusion_Translator.AssetStore; 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 Unity.Collections; using UnityEngine.Rendering; using static PvZ_Fusion_Translator.FileLoader; namespace PvZ_Fusion_Translator.Patches.Modes.Odyssey { public class TravelBuffInfo { public string name = ""; public string desc = ""; public TravelBuffInfo(string name_a = "", string desc_a = "") { name = name_a; desc = desc_a; } } public class TravelBuffSet { public SortedDictionary advancedBuffs = new(); public SortedDictionary ultimateBuffs = new(); public SortedDictionary debuffs = new(); public SortedDictionary unlocks = new(); public SortedDictionary investmentBuffs = new(); private Dictionary> _travelBuffSets = []; public TravelBuffSet() { advancedBuffs = new(); ultimateBuffs = new(); debuffs = new(); unlocks = new(); investmentBuffs = new(); _travelBuffSets = new() { { "advancedBuffs", advancedBuffs }, { "ultimateBuffs", ultimateBuffs }, { "debuffs", debuffs }, { "unlocks", unlocks }, { "investmentBuffs", investmentBuffs } }; } public SortedDictionary TryGet(string name) { switch(name) { case "advancedBuffs": return advancedBuffs; case "ultimateBuffs": return ultimateBuffs; case "debuffs": return debuffs; case "unlocks": return unlocks; case "investmentBuffs": return investmentBuffs; default: return null; } } public IEnumerator>> GetEnumerator() { foreach(var item in _travelBuffSets) { yield return new(item.Key, item.Value); } } } [HarmonyPatch(typeof(TravelMgr))] public static class TravelMgr_Patch { public static readonly TravelBuffSet templateTravelBuffs = new(); public static TravelBuffSet dumpedTravelBuffs = new(); public static TravelBuffSet translatedTravelBuffs = new(); public static Dictionary travelBuffString = new() { }; public static Dictionary buffLinks = new() { { BuffType.AdvancedBuff, "advancedBuffs" }, { BuffType.UltimateBuff, "ultimateBuffs" }, { BuffType.Debuff, "debuffs" }, { BuffType.UnlockPlant, "unlocks" }, { BuffType.InvestmentBuff, "investmentBuffs" } }; [HarmonyPatch(nameof(TravelMgr.GetText))] [HarmonyPostfix] public static void GetText(TravelMgr __instance, ref string __result) { if (travelBuffString.ContainsKey(__result)) { __result = travelBuffString[__result]; } else if(travelBuffString.ContainsKey(RemoveBuffName(__result))) { __result = travelBuffString[RemoveBuffName(__result)]; } else { __result = StringStore.TranslateText(__result); } } public static void DumpTravelBuffs() { TravelMgr.Instance.GetPlantBuffUnlockCount(PlantType.DoomGatling); dumpedTravelBuffs = new(); travelBuffString.Clear(); foreach (var pair in TravelDictionary.advancedBuffsText) { Utils.TryAdd(dumpedTravelBuffs.advancedBuffs, (int)pair.Key, new TravelBuffInfo("", pair.Value)); Utils.TryAdd(travelBuffString, pair.Value, pair.Value); } foreach (var pair in TravelDictionary.ultimateBuffsText) { Utils.TryAdd(dumpedTravelBuffs.ultimateBuffs, (int)pair.Key, new TravelBuffInfo("", pair.Value)); Utils.TryAdd(travelBuffString, pair.Value, pair.Value); } foreach (var pair in TravelDictionary.debuffData) { Utils.TryAdd(dumpedTravelBuffs.debuffs, (int)pair.Key, new TravelBuffInfo("", pair.Value.Item1)); Utils.TryAdd(travelBuffString, pair.Value.Item1, pair.Value.Item1); } foreach (var pair in TravelDictionary.unlocksText) { Utils.TryAdd(dumpedTravelBuffs.unlocks, (int)pair.Key, new TravelBuffInfo("", pair.Value)); Utils.TryAdd(travelBuffString, pair.Value, pair.Value); } foreach (var pair in TravelMgr.InvestBuffsData) { Utils.TryAdd(dumpedTravelBuffs.investmentBuffs, (int)pair.Key, new TravelBuffInfo("", pair.Value.GetDescription())); Utils.TryAdd(travelBuffString, pair.Value.GetDescription(), pair.Value.GetDescription()); } File.WriteAllText(Path.Combine(GetAssetDir(AssetType.Dumps), "travel_buffs.json"), SerializeWithIndentation(dumpedTravelBuffs)); string translatedTravelBuffsPath = Path.Combine(GetAssetDir(AssetType.Strings, Utils.Language), "travel_buffs.json"); if (!File.Exists(translatedTravelBuffsPath)) { File.WriteAllText(translatedTravelBuffsPath, SerializeWithIndentation(dumpedTravelBuffs)); translatedTravelBuffs = dumpedTravelBuffs; } } //System.Text.Json.JsonSerializer.Deserialize>>(travelBuffsContent); public static void GenerateTranslatedTravelBuffs(string travelBuffsContent) { if (!Core.isInitialized) return; DumpTravelBuffs(); TravelBuffSet travelBuffs = Newtonsoft.Json.JsonConvert.DeserializeObject(travelBuffsContent); translatedTravelBuffs = travelBuffs; travelBuffString.Clear(); foreach(var i in travelBuffs) { var originalBuffSet = dumpedTravelBuffs.TryGet(i.Item1); foreach(var j in originalBuffSet) { TravelBuffInfo originalBuff = j.Value; var translatedBuffSet = travelBuffs.TryGet(i.Item1); if (j.Value.desc == originalBuff.desc) { if (translatedBuffSet.ContainsKey(j.Key)) { Utils.TryAdd(travelBuffString, originalBuff.desc, translatedBuffSet[j.Key].desc); } } else if(j.Value.desc == RemoveBuffName(originalBuff.desc)) { if (translatedBuffSet.ContainsKey(j.Key)) { Utils.TryAdd(travelBuffString, originalBuff.desc, translatedBuffSet[j.Key].desc); } } /*var translatedBuffSet = travelBuffs[i.Key]; if(translatedBuffSet.ContainsKey(j.Key)) { string translatedBuff = travelBuffs[i.Key][j.Key]; travelBuffString[originalBuff] = translatedBuff; }*/ } } string travelBuffsToSave = SerializeWithIndentation(TravelMgr_Patch.translatedTravelBuffs); string stringDir = GetAssetDir(AssetType.Strings, Utils.Language); File.WriteAllText(Path.Combine(stringDir, "travel_buffs.json"), travelBuffsToSave); } public static string MatchTravelBuff(string originalText) { string res = ""; foreach (var i in dumpedTravelBuffs) { foreach (var j in dumpedTravelBuffs.TryGet(i.Item1)) { if (j.Value.desc == originalText || j.Value.desc == RemoveBuffName(originalText)) { var translatedBuffSet = translatedTravelBuffs.TryGet(i.Item1); if (translatedBuffSet.ContainsKey(j.Key)) { res = translatedBuffSet[j.Key].desc; } break; } } if (res != "") break; } return res; } public static string RemoveBuffName(string buffText) { string res = buffText; int firstColon = res.IndexOf(":"); if(firstColon > 0) { res = res.Substring(firstColon + 1); } return res; } public static Dictionary modifierNameDict = new Dictionary() { { "advancedBuffs", "COMMON_MODIFIER_TAG" }, { "ultimateBuffs", "EPIC_MODIFIER_TAG" }, { "debuffs", "ZOMBIE_MODIFIER_TAG" }, { "unlocks", "UNLOCK_MODIFIER_TAG" }, { "investmentBuffs", "INVEST_MODIFIER_TAG" } }; public static Dictionary fallbackNameDict = new Dictionary() { { "COMMON_MODIFIER_TAG", "Common Modifier" }, { "EPIC_MODIFIER_TAG", "Epic Modifier" }, { "ZOMBIE_MODIFIER_TAG", "Zombie Modifier" }, { "UNLOCK_MODIFIER_TAG", "Unlock Modifier" }, { "INVEST_MODIFIER_TAG", "Investment Modifier" } }; public static string TranslateNameTag(string originalText) { string res = originalText; string nameTag = modifierNameDict[originalText]; res = StringStore.translationString.ContainsKey(nameTag) ? StringStore.TranslateText(nameTag) : fallbackNameDict[nameTag]; return res; } public static ValueTuple FindBuffData(string buffText) { ValueTuple res = new(); foreach(var pair1 in translatedTravelBuffs) { foreach(var pair2 in pair1.Item2) { if(buffText == pair2.Value.desc) { if(pair2.Value.name != "") { res.Item1 = pair2.Value.name; res.Item4 = true; } else { res.Item1 = TranslateNameTag(pair1.Item1); res.Item4 = false; } res.Item2 = pair2.Key; } } } foreach(var pair1 in dumpedTravelBuffs) { foreach(var pair2 in pair1.Item2) { if(buffText == pair2.Value.desc) { if(pair2.Value.name != "") { res.Item1 = pair2.Value.name; res.Item4 = true; } else { res.Item1 = TranslateNameTag(pair1.Item1); res.Item4 = false; } res.Item2 = pair2.Key; } } } string finalBuffText = buffText; if(travelBuffString.ContainsKey(buffText)) { finalBuffText = travelBuffString[buffText]; } else { finalBuffText = StringStore.TranslateText(buffText); } res.Item3 = finalBuffText; return res; } public static string fallbackFBuffStr = "{0}: {1}"; public static string AddBuffName(string buffText) { string translatedBuff = buffText; if(Utils.CheckForUntranslatedText(buffText)) { if(travelBuffString.ContainsKey(buffText)) { translatedBuff = travelBuffString[buffText]; } } var buffData = FindBuffData(translatedBuff); if(buffData.Item1 != null && buffData.Item3 != null) { string buffFStr = StringStore.translationStringRegex.ContainsKey("BUFF_NAME_FORMAT") ? StringStore.translationStringRegex["BUFF_NAME_FORMAT"] : "{0}: {1}"; string fBuffDesc = string.Format(buffFStr, buffData.Item1, buffData.Item3); translatedBuff = fBuffDesc; } return translatedBuff; } } }