Merge BepInEx and MelonLoader projects

This commit is contained in:
Emik 2026-10-21 19:34:57 +02:00
parent 36dfab123f
commit c6851be43e
Signed by: emik
GPG key ID: 6B0CD72A5E503BDF
522 changed files with 12632 additions and 25041 deletions

541
.gitignore vendored
View file

@ -1,137 +1,406 @@
################################################################################
# This .gitignore file was automatically created by Microsoft(R) Visual Studio.
################################################################################
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
/.vs/BepInEx/copilot-chat/bff105b7/sessions
/.vs
/bin
/obj
/MelonLoader/obj
/BepInEx/obj/Debug/net6.0
/BepInEx/obj
/BepInEx/bin/ReleaseMulti/net6.0
/AlmanacPlantBank_Patch.cs
/MelonLoader/bin/x64/Debug
/BepInEx/bin/Debug/net6.0
.HOWTO-sync-MelonLoader-from-origin-main.txt
/MelonLoader/bin/ReleaseMulti/net6.0
MelonLoader/bin/Debug/net6.0/WebSocketDotNet.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.XRModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.WindModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.VRModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.VideoModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.VFXModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.VehiclesModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityWebRequestWWWModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityWebRequestTextureModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityWebRequestModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityWebRequestAudioModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityWebRequestAssetBundleModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityTestProtocolModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityCurlModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityConnectModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityAnalyticsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UnityAnalyticsCommonModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UmbraModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UIModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UIElementsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.UI.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TLSModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TilemapModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TextRenderingModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TextCoreTextEngineModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TextCoreFontEngineModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TerrainPhysicsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.TerrainModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.SubsystemsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.SubstanceModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.StreamingModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.SpriteShapeModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.SpriteMaskModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.SharedInternalsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ScreenCaptureModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.PropertiesModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ProfilerModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.PhysicsModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.Physics2DModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.PerformanceReportingModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ParticleSystemModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.LocalizationModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.JSONSerializeModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.InputModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.InputLegacyModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.IMGUIModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ImageConversionModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.HotReloadModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.GridModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.GIModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.GameCenterModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.DSPGraphModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.DirectorModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.CrashReportingModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.CoreModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ContentLoadModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ClothModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AudioModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AssetBundleModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.ARModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AnimationModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AndroidJNIModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AIModule.dll
MelonLoader/bin/Debug/net6.0/UnityEngine.AccessibilityModule.dll
MelonLoader/bin/Debug/net6.0/Unity.VisualScripting.Core.dll
MelonLoader/bin/Debug/net6.0/Unity.TextMeshPro.dll
MelonLoader/bin/Debug/net6.0/Unity.RenderPipelines.Universal.Runtime.dll
MelonLoader/bin/Debug/net6.0/Unity.RenderPipelines.Core.Runtime.dll
MelonLoader/bin/Debug/net6.0/Unity.RenderPipeline.Universal.ShaderLibrary.dll
MelonLoader/bin/Debug/net6.0/Unity.Mathematics.dll
MelonLoader/bin/Debug/net6.0/Unity.InternalAPIEngineBridge.001.dll
MelonLoader/bin/Debug/net6.0/Unity.Collections.LowLevel.ILSupport.dll
MelonLoader/bin/Debug/net6.0/Unity.Collections.dll
MelonLoader/bin/Debug/net6.0/Unity.Burst.Unsafe.dll
MelonLoader/bin/Debug/net6.0/Unity.Burst.dll
MelonLoader/bin/Debug/net6.0/Unity.2D.SpriteShape.Runtime.dll
MelonLoader/bin/Debug/net6.0/Unity.2D.Common.Runtime.dll
MelonLoader/bin/Debug/net6.0/Unity.2D.Animation.Runtime.dll
MelonLoader/bin/Debug/net6.0/Tomlet.dll
MelonLoader/bin/Debug/net6.0/PvZ_Fusion_Translator.pdb
MelonLoader/bin/Debug/net6.0/PvZ_Fusion_Translator.dll
MelonLoader/bin/Debug/net6.0/PvZ_Fusion_Translator.deps.json
MelonLoader/bin/Debug/net6.0/MonoMod.Utils.dll
MelonLoader/bin/Debug/net6.0/MonoMod.RuntimeDetour.dll
MelonLoader/bin/Debug/net6.0/MonoMod.ILHelpers.dll
MelonLoader/bin/Debug/net6.0/MonoMod.Backports.dll
MelonLoader/bin/Debug/net6.0/Mono.Cecil.Rocks.dll
MelonLoader/bin/Debug/net6.0/Mono.Cecil.Pdb.dll
MelonLoader/bin/Debug/net6.0/Mono.Cecil.Mdb.dll
MelonLoader/bin/Debug/net6.0/Mono.Cecil.dll
MelonLoader/bin/Debug/net6.0/Microsoft.Extensions.Logging.Abstractions.dll
MelonLoader/bin/Debug/net6.0/Microsoft.Diagnostics.Runtime.dll
MelonLoader/bin/Debug/net6.0/Microsoft.Diagnostics.NETCore.Client.dll
MelonLoader/bin/Debug/net6.0/MelonLoader.xml
MelonLoader/bin/Debug/net6.0/MelonLoader.pdb
MelonLoader/bin/Debug/net6.0/MelonLoader.dll
MelonLoader/bin/Debug/net6.0/Il2CppSystem.Xml.dll
MelonLoader/bin/Debug/net6.0/Il2CppSystem.dll
MelonLoader/bin/Debug/net6.0/Il2CppSystem.Core.dll
MelonLoader/bin/Debug/net6.0/Il2CppSystem.Configuration.dll
MelonLoader/bin/Debug/net6.0/Il2Cppmscorlib.dll
MelonLoader/bin/Debug/net6.0/Il2CppMono.Security.dll
MelonLoader/bin/Debug/net6.0/Il2CppInterop.Runtime.dll
MelonLoader/bin/Debug/net6.0/Il2CppInterop.HarmonySupport.dll
MelonLoader/bin/Debug/net6.0/Il2CppInterop.Generator.dll
MelonLoader/bin/Debug/net6.0/Il2CppInterop.Common.dll
MelonLoader/bin/Debug/net6.0/Il2Cpp__Generated.dll
MelonLoader/bin/Debug/net6.0/bHapticsLib.dll
MelonLoader/bin/Debug/net6.0/AudioImportLib.dll
MelonLoader/bin/Debug/net6.0/AssetsTools.NET.dll
MelonLoader/bin/Debug/net6.0/AssetRipper.Primitives.dll
MelonLoader/bin/Debug/net6.0/Assembly-CSharp.dll
MelonLoader/bin/Debug/net6.0/AsmResolver.PE.File.dll
MelonLoader/bin/Debug/net6.0/AsmResolver.PE.dll
MelonLoader/bin/Debug/net6.0/AsmResolver.DotNet.dll
MelonLoader/bin/Debug/net6.0/AsmResolver.dll
MelonLoader/bin/Debug/net6.0/0Harmony.dll
/MelonLoader/bin
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
.idea/
# Emik.Morsels symlinks
/Directory.Build.local.props
/Directory.Build.props
/Directory.Build.targets
/global.json
/stylecop.json

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="applicationFrameMigrated" value="true" />
<option name="userId" value="385f382:1a158be20ab:-7feb" />
</MTProjectMetadataState>
</option>
</component>
</project>

View file

@ -1,179 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HarmonyLib;
using UnityEngine;
using AudioImportLib.BepInEx;
using BepInEx.Logging;
using System.Runtime;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
using BepInEx;
using BepInEx.Configuration;
namespace PvZ_Fusion_Translator__BepInEx_
{
internal class AudioStore
{
public static Dictionary<string, AudioClip> AudioClips = [];
public static Dictionary<string, (string, string)> AudioClipNames = [];
public static ManualLogSource Log = Core.Log;
public static ConfigEntry<bool> LogSounds;
public static ConfigEntry<string> category;
private static bool overrideEnabled;
public static string customAudioPath = Path.Combine(Paths.PluginPath, "PvZ_Fusion_Translator", "[Custom Audios]");
private static readonly string[] allowedExts = [".wav", ".mp3", ".ogg"];
#if AUDIO_TESTING
public Canvas Canvas { get; set; }
public RectTransform songRectTransform { get; private set; }
#endif
public static void Init()
{
LoadAudios();
}
public static void LoadAudios()
{
try
{
// Clear existing dictionaries to prevent duplicate key errors
AudioClips.Clear();
AudioClipNames.Clear();
if (!Directory.Exists(customAudioPath))
Directory.CreateDirectory(customAudioPath);
string[] audioFiles = Directory.GetFiles(customAudioPath, "*", SearchOption.AllDirectories);
var ovrClip = audioFiles.SingleOrDefault(f => Path.GetFileNameWithoutExtension(f) == "REPLACE_ALL");
if (ovrClip == null)
{
foreach (string file in audioFiles)
{
if (!allowedExts.Contains(Path.GetExtension(file)))
continue;
AudioClip clip = AudioImportLib.BepInEx.API.LoadAudioClip(file);
AudioClips.Add(clip.name, clip);
Log.LogInfo("Added Override: " + clip.name);
}
}
else
{
AudioClip clip = AudioImportLib.BepInEx.API.LoadAudioClip(ovrClip);
AudioClips.Add(clip.name, clip);
overrideEnabled = true;
Log.LogInfo("Added Override: " + clip.name);
}
}
catch (Exception ex)
{
Log.LogError($"Error loading audio clips: {ex.Message}");
}
}
#if AUDIO_TESTING
public static void InitializeCanvas()
{
Transform canvasTransform;
if (canvas != null) return; // Prevent duplicate canvas creation
canvas = new GameObject("AudioSourceCanvas").AddComponent<Canvas>();
canvas.renderMode = RenderMode.ScreenSpaceOverlay;
CanvasScaler scaler = canvas.gameObject.AddComponent<CanvasScaler>();
scaler.uiScaleMode = CanvasScaler.ScaleMode.ScaleWithScreenSize;
scaler.referenceResolution = new Vector2(1920, 1080);
canvas.gameObject.AddComponent<GraphicRaycaster>();
// Add a RectTransform for positioning text
GameObject songTextObject = new GameObject("SongText");
songTextObject.transform.SetParent(canvas.transform);
songRectTransform = songTextObject.AddComponent<RectTransform>();
songRectTransform.anchorMin = new Vector2(1, 1); // Top-right corner
songRectTransform.anchorMax = new Vector2(1, 1);
songRectTransform.pivot = new Vector2(1, 1);
songRectTransform.anchoredPosition = new Vector2(-20, -20); // Adjust margin
// Add a TextMeshPro component for the text
var textComponent = songTextObject.AddComponent<TextMeshProUGUI>();
textComponent.alignment = TextAlignmentOptions.Right;
textComponent.fontSize = 24;
textComponent.color = Color.white;
textComponent.text = "Current Song: None"; // Placeholder
}
public static void AudioSources()
{
if (!Directory.Exists(customAudioPath))
Directory.CreateDirectory(customAudioPath);
string path = Path.Combine(customAudioPath, "audio_source.json");
if (!File.Exists(path))
{
Log.LogError($"LawnStringsTranslate.json file not found at path: {path}");
return;
}
string json;
json = File.ReadAllText(path);
AudioClipNames = JsonSerializer.Deserialize<Dictionary<string, (string, string)>>(json);
}
public static (string, string) GetAudioSource(string clipName)
{
if (AudioClipNames.TryGetValue(clipName, out var audioSource))
{
return audioSource;
}
else
{
return ("Music", "Source Unknown");
}
}
public static void UpdateAudioSourceText(string clipName, string sourceName)
{
if (songRectTransform == null) InitializeCanvas();
var textComponent = songRectTransform.GetComponent<TextMeshProUGUI>();
if (textComponent != null)
{
textComponent.text = $"Current Song: {clipName}\nSource: {sourceName}";
}
}
#endif
[HarmonyPatch(typeof(AudioSource), "Play", [])]
public class AudioSource_Patch
{
public static void Prefix(AudioSource __instance)
{
if (Utils.customAudio)
{
if (__instance.clip == null)
return;
string audioClipName = overrideEnabled ? "REPLACE_ALL" : __instance.clip.name;
if (AudioClips.TryGetValue(audioClipName, out AudioClip replaceClip))
{
__instance.pitch = 1;
__instance.clip = replaceClip;
}
}
}
}
}
}

View file

@ -1,862 +0,0 @@
#if OBFUSCATE
using System.Security.Cryptography;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.IO;
using static Newtonsoft.Json.JsonConvert;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
using System.Collections.Generic;
using System;
namespace PvZ_Fusion_Translator__BepInEx_.AssetStore
{
internal class CheckSumStore
{
private static Dictionary<string, string> modifiedCheckSums = new Dictionary<string, string>();
private static Dictionary<string, string> checkSums = new Dictionary<string, string>()
{
#if !RELEASE || RELEASE
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_CloseButton" , "G/++rbb7GMZv51CxHKdVINtAji/x9zyyhlcbCCWyP2s=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_CloseButtonHighlight" , "nNygYVELdiLcY0xbk0I1uX92NRazxns+I1u7p0M/e4w=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_GroundDay" , "pExENxFbAGfBzLByFps1SX9AN1H6cL0QQK0jOFn3qu8=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_GroundNight" , "n3LXi5yONzLVTc0eNStQtLdlcEsihCi5iImxbB7rMdY=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_GroundNightPool" , "fe6efxJzsAn3i75Wg7WrCyAFVQhMKXnzh+uThkCJXV4=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_GroundPool" , "yKlIHtnBPI8tiUnlRCHYcCnqwarpiuzfOj4H3yGn40o=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_GroundRoof" , "cYTj11LkhWuJxO8j4h+s6+AG4JtgfZ2jfL4P/rWzGfc=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_Imitater" , "9BD3A5dWXxgklYK4TTQ/G7d8A8OtZHgZrnq3hIrSlDY=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_IndexBack" , "KqSOHoWk3g/Vd1vtwL1X5X33ft8TkxHnupydPB/f8lI=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_IndexButton" , "GWE8iGEa9rVJW3TGG0j2la9VwlxrJ/LfnLu0OMKxMZg=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_IndexButtonHighlight" , "kbz2ezXWjIGUC7Q0k3cagXMuRLpnU7l4xGiX7WdSMJE=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_PlantCard" , "lLnAYniK6sDgRW62t1Q/GGh9zIWkBOia+oFzntBBjx8=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_ZombieBack" , "r3fcC00ZRR8vQUTsPRj339mQZi4/pFcL4rewSbRtM7E=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_ZombieCard" , "Fp2qKy2IpiEkA1hZrgXgrxyOA6hteIEQ8sqPrOkaaI4=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_ZombieWindow" , "mRlpQuXwIiUhKwkZXcK8sDZ6aQKnl43Y5Pbw5NMsKmk=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Almanac_ZombieWindow2" , "GPvh5nRvUqJMjRHwhqC4SUUB3BUKfCgTk6AWO8eGq/M=" },
{ "Dumps\\Default Textures [Do Not Remove]\\CursorClick" , "r7q8kCmXo9FHCC00VPswxjsGba2OMpE4UzBByode7KI=" },
{ "Dumps\\Default Textures [Do Not Remove]\\CursorDefault" , "xUv6VFWl/tzVsUa5heAlzlOyFjdzXsX9kT7EobZTIFQ=" },
{ "Dumps\\Default Textures [Do Not Remove]\\garden_new" , "jkDprxF6ApST91S4TzAGyzj2MC9umC8XCaasbstkBt8=" },
{ "Dumps\\Default Textures [Do Not Remove]\\MainMenu" , "e2lbkFcEN6hqwDk3A0SHZJu7PwEcol1u/QZtvpq71gc=" },
{ "Dumps\\Default Textures [Do Not Remove]\\MainMenutravel" , "fvORSzOzZ6sNDHL3qC/eA7tExSe/TsLIBswcuuFgFZ4=" },
{ "Dumps\\Default Textures [Do Not Remove]\\plant" , "ophzSlF5tmOXKn/2lHZUYiE4pMibPTqBvfQMnuBSzb8=" },
{ "Dumps\\Default Textures [Do Not Remove]\\Present" , "YHoZLVSxMkA8c2u2RCP1tJbFFZZxeulpuGTGp7AtpWA=" },
{ "Dumps\\Default Textures [Do Not Remove]\\PresentOpen" , "TL+KhicnGWIIOcEyMdTErS1SyBO5citeF37g3CxRiuo=" },
{ "Dumps\\Default Textures [Do Not Remove]\\PresentOpenZ" , "Ij60phw5j3rhjwMyGiVUOuvp0lelEJqtYQHEECc6l14=" },
{ "Dumps\\Default Textures [Do Not Remove]\\PresentZ" , "fZF3EH0YB37P7j1LBJN9jIwniyCy1Oe2Tw2BsSGc4iA=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedBank" , "BjG7XCi4XIPZO+NHAgksjgSUoO3JPJrL7BGFEWNaQ0A=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Background" , "RB2fot78wqAGxeIIBuG8ZEnytADs/yxhdh3Jre74nMo=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Button" , "/KtMBXY5AmPsmt98HVMAuoDrocKr7s/+g7/6wfMJIxY=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Button2" , "JYwHTIvcmX8NS1wxlb7u1nMPG4BRA2mgm6R2IM/9NXk=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Button2_Glow" , "NRov8DgO5+9rqTXQASV8izLAp302/o5ufZgVrvb7aig=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Button_Disabled" , "nvfQ1CN+p9h1rUqVhOOLAlCmsdehs2qgVz6kmWERGkU=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedChooser_Button_Glow" , "Wg8LhHovWpNtScBLZbhcjgqQcr4C2pehb3QS2bpmO1Y=" },
{ "Dumps\\Default Textures [Do Not Remove]\\seedfog" , "SN9MPqY76N6ucf+vzs22J+2Bs23+1Tl56f7GrT3Z9Yc=" },
{ "Dumps\\Default Textures [Do Not Remove]\\seedlinkage" , "kqQiioaMU/fAv9+eTzdzV7KizreB80Qio2e9cyWtaOY=" },
{ "Dumps\\Default Textures [Do Not Remove]\\seedp" , "i7wDlTSmSBueQ2sCWU7usRbfGoncupi6+plQrjv9A8w=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedPacketSilhouette" , "AVSM7MUReK4oLDUajmkWjQqT577of/ZhaAepDOQk54o=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedPacket_Larger" , "C7ZuQNW+xi8YNyYtz09aAXOYP/t56u01WwgYo7FT0Tc=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedPacket_Night" , "YVCLQ3WeIUjevo0Wtf2xAOnDGAAzjl44bRHS1T5ProE=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedPacket_Other" , "kiidD0VdJ/U0xYxtM7f9uvUYsK2VHFIZU3750doVtHc=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SeedPacket_Pool" , "8MQOevWJrWgIsnWhYi2xt61yxoJARcINzSYzRG7yrnM=" },
{ "Dumps\\Default Textures [Do Not Remove]\\seedroof" , "zluDS1sgaJ4iHXt4PfJ3tqi+LVduGKB9+WLdWZZH0ik=" },
{ "Dumps\\Default Textures [Do Not Remove]\\seeds" , "JNHpZfk3qR+yWd4fhWsdNF+JxtfTOjTAKxLs61X0+co=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_almanac_shadow" , "SdZZ5VOq567+489ffjHcTbgWj3KjI01YKZgdUGj9yis=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Flower3" , "kIzmQGfYT3nCObTtM+C6F7WgE8oCj4M+Qq2II0n2IXw=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaf1" , "OwGYCIlBbK5j1dZxBjHlPkvswRy+QHgYVXvmOYoMt6E=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaf2" , "0ea/nJV5ziIA2Aher2Exfgz6lDuGDjqHf6Ra/bsmMrg=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaf3" , "nzELmsj1XUXJmOhMLixHLBzW5TGhZCkwoAOaRpRJlYw=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaf4" , "pXEZUhFqr2KC1pCQLB6MwwJhBM5ZI2teGOvYPgr011U=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaf5" , "SeX0iGZoN8ZbhKZSkonw9I7MS3lBVHVqzko1hX80LUg=" },
{ "Dumps\\Default Textures [Do Not Remove]\\SelectorScreen_Leaves" , "Fny+WEQ2N1yzFhdAPhR/zoK0P2HY4GDckluVL6u6Kz0=" },
{ "Dumps\\Default Textures [Do Not Remove]\\ShovelBank" , "Pas2yhjcl+HVwsIm68o9PRjAR72y5lTQm85e2vuYgBE=" },
// English
{ "Localization\\English\\Textures\\Game\\FinalWave" , "0O9Esd6GUDRmYE9NtcuIvmRzZU6RKUeR4U6Xiy5qi6o=" },
{ "Localization\\English\\Textures\\Game\\FlagMeterLevelProgress" , "CzuBH4sm7Nid4zloZF3i0bpNcA9ILPhrmOxVYI4IggA=" },
{ "Localization\\English\\Textures\\Game\\HugeWave" , "n9O7b5CuD9Yu+ccecqsmm4ofp10MAw6eoZmIxnX8WwM=" },
{ "Localization\\English\\Textures\\Game\\StartPlant" , "IIz47Bh/4MjFKaZaHx5PAxz97YukBkSqHv8nnN7tMLM=" },
{ "Localization\\English\\Textures\\Game\\StartReady" , "lhaXbwp0oHTrX1JFyJE8hnabkzj4bgNyWdFDMn32cbo=" },
{ "Localization\\English\\Textures\\Game\\StartSet" , "WPtmG9W8kFZQthgaycm6P17wmnqWW55CnU2JjsOGJkU=" },
{ "Localization\\English\\Textures\\Logo\\标题合集" , "IfcPnZSGmfNl1jdd4RiGaD2o3XHs/K0R7HKKLzcFftE=" },
{ "Localization\\English\\Textures\\Menu\\NewAdv" , "6UYMHlQ5SdT+gX7cJLy0iwyCXdxblrjdNe2l/OCeDcc=" },
{ "Localization\\English\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Adventure_button" , "7PPDxa4AOg4Q/ioviwKYKx2ftu82+zlvJdbeqWlGaBQ=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "+Drt7kOZRfinB9t8BsklSl8Np6NxDPJ21XvYuVoiwbY=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Almanac" , "Th6/Pun/NEn6797dnzdq8XnCqY9/oIORszG6K3xSFbo=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "hp6y9BUvolJ0bQdU1FY1Oyt57fizZFx8Q3zXYR4t/BI=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Challenges_button" , "LDMp8hCkHDSIrN9F92K93txxjFZ69qKyfG429oRyGfc=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "rSB360yGYMYQyNUJYb2xMCgGmSFAl7plLTr1BDMA8W8=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Challenge_button" , "0DWLUXJ5RYKci+loCThNfHEpk7tKV08vifffcK8owNg=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "AXW4pkVR9twu7/SJYvqScPeNswIoefGCBJXDf7SsXFA=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Help1" , "bwLeNCc4/VtLyocaVQhB++/7t2l4ngYQg+3r95RSMDs=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Help2" , "B7p5vi9AyiidPL4nvBTVdL+WhUbsKzHEIHyWWAut1KU=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Options1" , "TJEiHNySrGFxBP85FeP3hl4TcLCVjX1VXYt0navnK04=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Options2" , "SehcWmqt2cxQhPlcJqUKGeRyl0VgxGymyrVKLyGH9LA=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Quit1" , "zbJL06XIJDi1PjiR52BZCmNSYaRCWLb13owTgv9hVw0=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Quit2" , "diLLwcdEED5M+H4Y35Rnyu+W+R6FU7qVDs7DteLWFtw=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "9JoXGZoVFEVUJR+s/mEye3rkTIYwGLZCiajp12bAP/g=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "b2xzl7F7FEkFZpxGKwEwasmF5BkxaZJArAhcnPQ+Ng4=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_WoodSign1" , "RhYg1ymYR4mEqL0do6dIqRxts+BG9GlB4d5dc+gMjsU=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_WoodSign2" , "aV7MGtWrsnh5O2ikBof66Y4n+w9xhbQbkOObNP2GysY=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "bov/KzSszIVUaDK3x1AFJZU5kbiBArl+tBybTxi7cS4=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_ZenGarden" , "8x4Y+E/DvSPrr1sY1k3trPVtqLrRuUUVWktfLIx5qTI=" },
{ "Localization\\English\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "ldiEJGQVyYvquwZuPy/aYNf+Am24dG6iILuw/1k3dNQ=" },
{ "Localization\\English\\Textures\\Menu\\SZW" , "2FoSx111GS6QF3dQoUlqhsbVbDSB0MrnUFKilgsIyzo=" },
{ "Localization\\English\\Textures\\Menu\\thanks" , "bffGVtPUS70M8mNXyKDE9aU+XqGMLITegGGOaPMVL84=" },
{ "Localization\\English\\Textures\\Menu\\travel" , "vy+5i0dx1+DIECxAsVv/co8gIwM9zk8djIKCHbG9ykI=" },
{ "Localization\\English\\Textures\\Menu\\钥匙经典" , "PAPsrNZRY9UetFgFnEwZKdN1TgNbCrU7ZtaPZVzBxvg=" },
{ "Localization\\English\\Textures\\Particles\\Doom" , "FqBUBeIvzyyXL+cqO4Fi6CKI5gZW5QXfHYPTOYoeteM=" },
{ "Localization\\English\\Textures\\Particles\\ExplosionPowie" , "cuikfX+3LOtSw3EPB6DnjANO5bKkoYCMdWSm+StmW70=" },
{ "Localization\\English\\Textures\\Particles\\ExplosionSpudow" , "4pJ/gZsuKRsAbUL1YWsaaJC9NxrzhqUiQe6glK07ydU=" },
{ "Localization\\English\\Textures\\Particles\\guang" , "kh0dcDxOXgh8+Eq1TmKdJug5PdR+nzZrK5iS5Nkw7Gw=" },
{ "Localization\\English\\Textures\\Particles\\Sproing" , "WtzrUuUsjp/GmOfoHApij3VLMn+Tr5qUZ6GGqqhUyD0=" },
{ "Localization\\English\\Textures\\Particles\\SunExplosionPowie" , "3bSjOYpanuLnsl58oYUzOAXt94nony6Drq8qdpfRSGQ=" },
{ "Localization\\English\\Strings\\translation_regexs" , "rjxlsJwClOAJERCe9XmYJB1q+TX6h0p5zDHqCyu/9wE=" },
{ "Localization\\English\\Strings\\translation_strings" , "zsQF+z4URSZY7yuqTfuOIdc/sfcq6g1Hi6ZeedfBFS4=" },
{ "Localization\\English\\Almanac\\LawnStringsTranslate" , "7BFCUmTVKh5MdefAGxiqgbVtWHcyq9Jg/e8jCWcGI2A=" },
{ "Localization\\English\\Almanac\\ZombieStringsTranslate" , "4KU0HKBDqw5VPbvDqzByDS4nGSG0UAHZ6ek7iv0FOUA=" },
{ "Localization\\English\\Almanac\\AchievementsTextTranslate" , "Y0rNgt02JEkiv/jacilOR0NgACVjqyWpQNQrF9t9PIs=" },
// French
{ "Localization\\French\\Strings\\translation_regexs" , "Pv4R3N7SkRz8Ksp9DkHR+xMn3Tv7+t57FAwEYDveH4U=" },
{ "Localization\\French\\Strings\\translation_strings" , "atzVMZyXEHG93wcM7Uqz0tTHsWK+dxc1csQxLhHF5wA=" },
{ "Localization\\French\\Textures\\Game\\FinalWave" , "VTTPmIlVoXW7tU/sQyTlZZq2dy3qOlVs7cmPQYd2PMU=" },
{ "Localization\\French\\Textures\\Game\\FlagMeterLevelProgress" , "DVG5/OyuPfwy7dNOE8NCKmqZK0tKpwsr7As0df3c+0Y=" },
{ "Localization\\French\\Textures\\Game\\StartPlant" , "RkTaTLEoVW4TnXBg+UL3YlG+sdqg+WhP934sTpLlzzk=" },
{ "Localization\\French\\Textures\\Game\\StartReady" , "8/MDcBU6dbIHN1vESmyp27QWxIbifrZZn4IDxKldW3c=" },
{ "Localization\\French\\Textures\\Game\\StartSet" , "8+doc0lYZ2a3W3qpbMSeRturIOWpmyhHw9COvM4Ctkk=" },
{ "Localization\\French\\Textures\\Menu\\NewAdv" , "4noYYWThghcWgV9BCO4WJjEGqHg+SblIoCoCKgTXdAo=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Adventure_button" , "ZRxJ77hv8I2NmSiK6LTDgnOG9obBh+ueMa3R/NDCd5I=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "MoCVUnQ+U8HdUtA4haA7Cx3CmlC/hvVuvYc9bakMtW0=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Almanac" , "8txwE7D0UbRCH0hzukyZBACcCn1f9yiXLvhzBIkfKCg=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "WoiG0xkTP5oLEYBWOwnf+kkvbY3jD/xTVYgjBQ6/RLQ=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Challenges_button" , "3NEwHpNoT1jEl+4gDpOYQ/9osW9rvdfdmiJ0ALIV8Uw=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "RD2hIoFhO7AU6nmtrp5iJwjptYy6ociYKGUJxNsYHd0=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Challenge_button" , "eQO5Wj2FOU2kLRMmI6Hhp3lir/hmYhOGrct5dL6utI0=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "3cetfrmDbZHx1uumNbBApG5p8I2T8spnrqVhPqSxkI8=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Help1" , "2yINgPeQqUy6b/mzw/2mFfTxWUlzQrJoYC4Yz/VoGy0=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Help2" , "aaUDGQU1+0ltVD4OF2Luc/6pXK7LZ4B5jL9BtSNRnjo=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Options1" , "Lpt1mXltCSkn+9BeMOT+CzTxcQ7cwUtFem+I1tWHdqE=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Options2" , "MNNGXO8AboJJf9tMKXLpIB6j1foAj6bcHopNhHcpRVo=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Quit1" , "6NILc8MqiGcQ3ttSKGfDOEOgvUnIUNO/DWBIeNi4/pM=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Quit2" , "rwTFCgy3kNLCcBM5J6EjguUP4NuvfkDNJjks94eaP/g=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "UYwa4CPhRF8CiWro6Y22GfFQOlk8xCQ6Mldkgk4Jn0c=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "MzBfCyymyT0E4mGUdhps7O6IHJdHtwNtGoi3kRAS8Ok=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_WoodSign1" , "T2Ci2ItAeYw0hMbOP87XJefKbaye8Fhv5tN4H3V7TFg=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_WoodSign2" , "KnPecN+vhvShgMagZGtPKPzMLcc+N3Kqsrlt51YiKRU=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "v2L4jFj8hcIeJzle9LA0OLcCKwXXYdPVBucdslPTlF8=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_ZenGarden" , "ngbC53eTpHs9VaU1qViFJeJVCNhoZcvojiFpeqrXjMc=" },
{ "Localization\\French\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "F/nkF7zPU6FyWpOaxMim7/NbS6mH23er3ihfF2tVUSk=" },
{ "Localization\\French\\Textures\\Menu\\SZW" , "Z0uAEbNYk36lyCsPXGXnmjO0L3C1E68aA54stVpbYYs=" },
{ "Localization\\French\\Textures\\Menu\\thanks" , "bzYfnWlAyBzLCflijFAld5m0LBmzDS5vyCbUJs+cn0U=" },
{ "Localization\\French\\Textures\\Menu\\travel" , "Ca4e7HNOAXOUzKQAw+1+H1JRI14D1yLEn5cdXHmFcMo=" },
{ "Localization\\French\\Textures\\Menu\\钥匙经典" , "E+VDMHWhhtf9MwVo8SB9b2eDTE1v3u5Wd5DxoM935fo=" },
{ "Localization\\French\\Textures\\Particles\\Doom" , "q/QV2mCopjFnbwQUUTvoPtcyGV/UAwuxjB9v+GDm3OE=" },
{ "Localization\\French\\Textures\\Particles\\ExplosionPowie" , "mqTy7LXjfh1v7kEtwHzIckWjm/4P97dCs4CbyvzOESU=" },
{ "Localization\\French\\Textures\\Particles\\ExplosionSpudow" , "zFpkHlUNR9jWL/H8FQWy8habmtvu2wtMi/PpClRax2c=" },
{ "Localization\\French\\Textures\\Particles\\Sproing" , "FSStD7Lw1uNrSHqZkZCKrY+hcA6O1DOMKe/6R+jqNdk=" },
{ "Localization\\French\\Almanac\\LawnStringsTranslate" , "sjZ1qRYGKM3sKMimzIlfmd3e2T5gIV38wy3bU75pLjU=" },
{ "Localization\\French\\Almanac\\ZombieStringsTranslate" , "k6XiNRnACedQuAMhh2CHx9jwMfPEJTbG/UZpubs7EM8=" },
{ "Localization\\French\\Almanac\\AchievementsTextTranslate" , "cFzYB+rYT5//+JpvEHa8Or97RYJZdAI0zK3Pr0Fw9hU=" },
// Italian
{ "Localization\\Italian\\Strings\\translation_regexs" , "Fr7kZcK4cwoN6WsCARX06Od+PkzCv/FTetj7ME0cIok=" },
{ "Localization\\Italian\\Strings\\translation_strings" , "gXM9MZ66TBCflwXl3hMvH46U70kU2w3i4o0EQAd6Xp8=" },
{ "Localization\\Italian\\Textures\\Game\\FinalWave" , "J7mSpIXvwo0JbrS8RLLWr8jS5KwRcMoDT6aSIVykhiU=" },
{ "Localization\\Italian\\Textures\\Game\\FlagMeterLevelProgress" , "pwnHiUlgXSYUhEXhBWe1XUeeWfYTb0oTY9/UlerGPuU=" },
{ "Localization\\Italian\\Textures\\Game\\StartPlant" , "6OqWQtc8U0Qm8qyhkdhgOmLhR3yGVnLOFhZ6ZrDIjy4=" },
{ "Localization\\Italian\\Textures\\Game\\StartReady" , "3QPcKBCGX8TLM8xCqCDJqY0uCsRg0vUxGzmTkvfXujM=" },
{ "Localization\\Italian\\Textures\\Game\\StartSet" , "VS5T89S8Do4xqRwxSBt9kjV9o/minfu3M//piKAJVkQ=" },
{ "Localization\\Italian\\Textures\\Menu\\NewAdv" , "UEsXovFnKuglsJ9S59cnJjDnhfDyTAXtLtVEnw9oOD8=" },
{ "Localization\\Italian\\Textures\\Menu\\options_menuback" , "WjWI+u05cf2sNThCp2EaWE58r2HwXRIP1gfwvwNo84k=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Adventure_button" , "s4XJiAhMaWGMpyzt/fGQG/dESF2XeQQ9x+1FQWyLkiU=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "NrVoP4kXJ8zaw9/cdm2oRPo08C3oCa24xCO23d11UBo=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Almanac" , "cOdUtbMj5hqPyHoYfORNboSUikAGyoNtKO7DicYANRI=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "ComYfg7rKwHPcmZENPfQP5T9TFQ0ARRmVye2nGAc+3A=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Challenges_button" , "DMY8d7mlP2ZmBHZz6BjYM1SEFlkFWp9VuIbB7+bMVwk=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "/OvCfFYFwlvf+DefR1/XYIAQ7djymbF4EK1kiLJzXHU=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Challenge_button" , "0XDQd6EaJkRSnYezFxhMFFAse/i2ZlRVmW+Fn9kSWnY=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "UfKNb+QqlwzBdu1eORqEeDB9lVVKmGMpqRSExUAUAak=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Help1" , "RoyqJT79KbODd3PfK28pDvvnhcps9XVDxNNT1GjXu38=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Help2" , "UQdoBeSlI04NXh+VYjUyN9l3gT5p/CDRAU1jUsFqerU=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Options1" , "3ebMHMsiekRjU3Rnc5t+yIkeHNpyZi8/Oulst4WWacg=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Options2" , "PFlm0Sdy/1Kajr32uINpR6i7YXQ54a8dq0+OI0R8zec=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Quit1" , "bPWwEE74Tdb583NcXB8e5W/meXVvmwuWkuajv+/R5Ro=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Quit2" , "vBdX54EEKdZkJgiFcCQPtzRPoj0NSKTq7UA7rWDSTBg=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "ZPkJ309XC1P5w3x4IPhItEeLd5WVlU0mIaBoHX3b5Bg=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "8VuUajuH7+8MJqROk/3XFQOEx541qi89ykuQCNaJ+L0=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_ZenGarden" , "1tP+grtgWPu5HtvUa2ox+9assN+Wgj63wBkJoskr6K8=" },
{ "Localization\\Italian\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "sZuiY1fbj5mg0TXaMok/qJFwoYf3+OxkN+Bk3pbTjs8=" },
{ "Localization\\Italian\\Textures\\Menu\\SZW" , "6cXREWl13sjqgdz3Zf5kT1N7bCoIc7LyrHg3WNMVTyE=" },
{ "Localization\\Italian\\Textures\\Menu\\thanks" , "I2nKJztoIdeVy/CyGYN/r/DB+Gvv3geaFxOdtMdf3ao=" },
{ "Localization\\Italian\\Textures\\Particles\\Doom" , "8E+/HlnnJa52eoBgLYjMyjBCsb5bhc/rTnsJKs2hucA=" },
{ "Localization\\Italian\\Textures\\Particles\\ExplosionPowie" , "u2bgHV+XPb4gSz8CagwJdbKWszej9uoIcbM1Z5GRto8=" },
{ "Localization\\Italian\\Textures\\Particles\\ExplosionSpudow" , "CciMCMupOdEov98dK59e2wF2izCwW8jpBkwQE/EV/JY=" },
{ "Localization\\Italian\\Textures\\Particles\\Sproing" , "nYlKAmcK0rADsk4KS7FaQ3FZBfl+IGQuXb7O1GCML6Y=" },
{ "Localization\\Italian\\Almanac\\LawnStringsTranslate" , "npd2sE+VJ46XdwqP4cx+Jg7/mgxFiUUgpxEKxDrBUKk=" },
{ "Localization\\Italian\\Almanac\\ZombieStringsTranslate" , "GEhXXOMNHS12b+dR5Q6cxYrORjjyywpkPEKB3QzCn+I=" },
{ "Localization\\Italian\\Almanac\\AchievementsTextTranslate" , "Z4YUscuIUlrlLiaYWHTEvNjztVt291fLjJjkfc/lYBE=" },
// German
{ "Localization\\German\\Strings\\translation_regexs" , "v3wwSqcUG/g71BrZXhYkpxDYebHeO52n1I8QjjlOuUw=" },
{ "Localization\\German\\Strings\\translation_strings" , "LGDwWtGeEnEvv31TnvXdkVUEs5od34WPNQ0od7WKy60=" },
{ "Localization\\German\\Textures\\Game\\FinalWave" , "+MHS0Xz4nzGw+0knMtj5vJYSxaaT0KH/g8DWXUOv788=" },
{ "Localization\\German\\Textures\\Game\\FlagMeterLevelProgress" , "M0XScRnevh24JLXF48cG2GecSHlbP4vGUerW0xk63OA=" },
{ "Localization\\German\\Textures\\Game\\StartPlant" , "ab42rVDpP/bDtBjg9LvrfVmEf3E2Bry1pwOnMo8vF+A=" },
{ "Localization\\German\\Textures\\Game\\StartReady" , "7vV3VLAlAKbjXTBzaxlN+ulcOimET/gMvohDzyjFXoI=" },
{ "Localization\\German\\Textures\\Game\\StartSet" , "nNyPtyTiTsCPalXr/MgQob6EEb8kgyPZjMWmbXu3YFw=" },
{ "Localization\\German\\Textures\\Menu\\NewAdv" , "Lx7kxZzwBLios8g7raYwDDPcz2X48SshJaWuklBYUDc=" },
{ "Localization\\German\\Textures\\Menu\\options_menuback" , "WjWI+u05cf2sNThCp2EaWE58r2HwXRIP1gfwvwNo84k=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Adventure_button" , "8NsCGe3aSbZ00AJFlELTtD1hOJlu+RojAAvvD77ICpw=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "LcyIKu9BsVtJapQUrpkdefPiA+JTYkak3fg87Tx45JU=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Almanac" , "JrkVQQByD5XSa77HI5+MVGkrc+3nTDyKEP+Kuij6gPo=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "zUlJJqGxLiwafOpBogGO+zX621Q3EnetL+u5vROt6JQ=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Challenges_button" , "SWZKSjn8ytu5outezry04hHXcTmQD+f6KlWn4nlIZCA=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "9S0JmpQLSGprElTl2MzQoSuT+Eemhj7vaQ20lwi8Ynw=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Challenge_button" , "VRVyZIq8PBKunX8767vh70F/SA85Cifao+kvi7HMIHE=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "WIH6pTlcbWqOMk+H2OYsBft0jVBwYT7hhWiiWaZzT8s=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Help1" , "t9KLP/pCP5dWxWp7nAPjon/4224sE+yY2sX+MhqRJ1Q=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Help2" , "KZ7sZ8Q9Jus9Su3Tu3FLWmWJssq/RPnuOO/eQ7HgaXI=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Options1" , "nqTlln74GhHYs6GKAqcsoS7AzDnOD1jOjvfBBzMOEyo=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Options2" , "xtg2c+bnhPszl8u8BTma6O/xMxiZ/asBAA5jRCbWtek=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Quit1" , "xyxc8phjdNVui7E7RHFSSlu8OGIXw8HW2QpBCrKokmQ=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Quit2" , "PBuRnBbzOk257Jm2i3ISLoz3oeDzy6LNurXaf9LKV2E=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "92BwDgaXMJZXqrcCxdIm8XcZai1NuGH0amcno5E2uU0=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "YzxTyUcR2OvQ1ctFTKq3kd47A0tgiXp/kPQC/hgdom4=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_WoodSign1" , "T0wrDENK1CD3OgeosDNa4ab28lsSi9JmM7v8wbxB4bs=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_WoodSign2" , "9SZQ6SvrqFn5kPXbF1JD7F5uMfvGyV0xkar2qCvb2UM=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "jJD+LiAoEzsnPJeUFt2Gpf+e2P8JjKpnfLDDPh6Zcho=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_ZenGarden" , "5Z6wqSVe04hmNHCPdPrDlJrXqgblhY6OG843O19GVmw=" },
{ "Localization\\German\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "z6YuoHbmClwoKeBjsLa0wypSdcB3QrEh2wzzYnDk6Ek=" },
{ "Localization\\German\\Textures\\Menu\\SZW" , "op9D5nHLxn/WZ/TVVaeji8hj9qRQl1DeuHZF/rj/ZMA=" },
{ "Localization\\German\\Textures\\Menu\\thanks" , "myLBgPcIux3cNkPd833r01ZqJsCqBTty31xJE68ZD28=" },
{ "Localization\\German\\Textures\\Menu\\travel" , "ASg2t1qO64hqGJMqDTQ8da8KotTKpkGtzKIaKuO1MqU=" },
{ "Localization\\German\\Textures\\Menu\\钥匙经典" , "KuqwMj6aedb2J7e8rVQpMa5Ie97lAFbGuwGFZq3POJo=" },
{ "Localization\\German\\Textures\\Particles\\Doom" , "rY5dss0ZrDcUHYVTddyesRpU+r0HoF5eiBM4iDMhHhY=" },
{ "Localization\\German\\Textures\\Particles\\ExplosionPowie" , "Gu4iuRPXhL3KAlUjBjbBOpjPthKXlViQ+8lw2sreTNY=" },
{ "Localization\\German\\Textures\\Particles\\ExplosionSpudow" , "z0h6r4O2FdV1r4CbGVd4nmEpGHZeo8dM2wV9suiZq8o=" },
{ "Localization\\German\\Almanac\\AchievementsTextTranslate" , "12tsG4qJrdtX0dxUOa532CyrC+cF403BfFg3fsjRO+I=" },
{ "Localization\\German\\Almanac\\LawnStringsTranslate" , "Vqqn/gcnY7SIPEVbIxSBi6DXSVBwMyVCQvhOs4KCoJQ=" },
{ "Localization\\German\\Almanac\\ZombieStringsTranslate" , "RlBdepGFFohgICk5idOkRFo9t8FxUuiMw4hoo6eYs0Y=" },
// Spanish
{ "Localization\\Spanish\\Strings\\translation_regexs" , "4QFp251QrntXDcXjGrGYje8gvuKNHAxVp4FfLm0uHI4=" },
{ "Localization\\Spanish\\Strings\\translation_strings" , "BT+eTs1l2eWCDb+5CGgJJmjyAGqTulKOh2VuDIkwxTE=" },
{ "Localization\\Spanish\\Textures\\Game\\FinalWave" , "fcYpg8VM7fWplgQdj87NOj5jtGgCPzvW4c2fJOUiJIs=" },
{ "Localization\\Spanish\\Textures\\Game\\FlagMeterLevelProgress" , "4MdtfTqEleDpziEenobp9O5cP3L/nZk18gdT9xW2O9c=" },
{ "Localization\\Spanish\\Textures\\Game\\HugeWave" , "n9O7b5CuD9Yu+ccecqsmm4ofp10MAw6eoZmIxnX8WwM=" },
{ "Localization\\Spanish\\Textures\\Game\\StartPlant" , "s7phwlweOMyWGCtCtFoLSMSC/VQSxFPVoB9T+RZQyhk=" },
{ "Localization\\Spanish\\Textures\\Game\\StartReady" , "DRI5gg//9pDb5dOaR0PhlBzuhP2lryhT6aeklSCUTxY=" },
{ "Localization\\Spanish\\Textures\\Game\\StartSet" , "eiX7QvBlF+EcJrXsOxqOkzu0VF/6hb04uNRRHRA/RMA=" },
{ "Localization\\Spanish\\Textures\\Logo\\标题合集" , "zt6CxJgEU+kegWGRKzQKwJynE91Nbpk9hgSby2zHW/o=" },
{ "Localization\\Spanish\\Textures\\Menu\\MainMenu" , "ZTaVNrPrxtSad5bo89RQVNXxaprYLZuGsl6dvuAoJR4=" },
{ "Localization\\Spanish\\Textures\\Menu\\MainMenutravel" , "w7iF3kfdiOg8EdbPKZlfxfObZXSAdqAMzfDMtM+4Dd8=" },
{ "Localization\\Spanish\\Textures\\Menu\\NewAdv" , "itgAdOEzcDj7sUA11u4xX3BwY7vssEdui606FpUUrEk=" },
{ "Localization\\Spanish\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Adventure_button" , "yE5gPHXKy3xnVBFtSTC0zjhfl0tCrc6sHPK8AiiO/s0=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "gwHOCHLV9NAvvChiQt5X95UOLaStVZogt4DWAokvACg=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Almanac" , "xfqV6GfWdsrPhlVIduoQ6x5QWnci7DRO0E8qC6lItDA=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "a7NCRdhsKTG4/8CLniWG2j/3MbUh68YmT1QJWAVNCDI=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Challenges_button" , "LDMp8hCkHDSIrN9F92K93txxjFZ69qKyfG429oRyGfc=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "rSB360yGYMYQyNUJYb2xMCgGmSFAl7plLTr1BDMA8W8=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Challenge_button" , "OT8c2V3GBYxsCMO2nHs7+DbKkdHupmjujVexo/jm1us=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "utQuQr3NQGeGxfmtc3CC7s86/jTGH3SipAkDrAXVbxY=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Help1" , "+W/tytQsNLMSqPE3QnC43MgqBsU0H9XNrjk4RHundLA=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Help2" , "WNPFp01iipCzzArymTAcu4VLz5E+Hcm/bnjMZZ0eQ60=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_LevelNumbers" , "ES369OPOoW1RsrCvYQbKaUt0GF3zXXgUd3ZPnjDWXhc=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Options1" , "zOkXmvvFsyjLO/nq0Dgl88rTSrJWwBPMp6QiAobyqMw=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Options2" , "MycGypHA2qhq7cgAk97vlPX1gfxmeXoMxQ0FaKwQpkA=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Quit1" , "jtBCpgu/bShFN1ykigQtCjLb+U9aABHugP/8ezHmYxU=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Quit2" , "bbTsQCx08UTWFdM/0csjqYB8rSvCJJm3hZMWSDFmeI4=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Store" , "6gVEuBsk1/udDoEATm2tgmWMCkdme0+oxngcJAKrmP4=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_StoreHighlight" , "grdusCpWrRqZfBuNB1Dj7bKFzyQk3xFReAqoAEKYFhY=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "s6uGdZuYk0R0xmSa8KsCsZAziQC3F6AWyZaL+vqPi2Y=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "5iaDwlH8qBI3YyWWjyJ/azvzoOMuThRgYykZeAu55/I=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_WoodSign1" , "EzxodXEKdnZDB+CRtpfAMzlGaoqBoXhO79UprQAErmw=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_WoodSign2" , "vibMNgMtv+f43drQs5FWDYv/WaUn6VC3RVZv0qioywc=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "esQplw+1F5GBRJA2KPKbZWTQvPEpQp+d2oyym7Bz2OQ=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_ZenGarden" , "6TrN8Qb2J40RES+YBsBdk9b9A1yy81/+0ZCGSfOqmQM=" },
{ "Localization\\Spanish\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "zr7f1egwQiGj+qJiAM11sWpvRVgGkj1E3q2Tpa6t82Y=" },
{ "Localization\\Spanish\\Textures\\Menu\\SZW" , "zXZkY8n4Xa4BRXd2P7CrPeV/oyoImKa3aHZN0AQxrDA=" },
{ "Localization\\Spanish\\Textures\\Menu\\thanks" , "a38UKni0HkBOxxZOz8YLEuRomcdqRxH+cUxIiZv+57s=" },
{ "Localization\\Spanish\\Textures\\Menu\\travel" , "gyGKFv33M2THt9HsNOGXrzayuTk2O6eW7SpR+gq+6Ac=" },
{ "Localization\\Spanish\\Textures\\Menu\\钥匙经典" , "2x/0/QLjwKGhOFxClKDi+wmB+d0n3/B9Y48pW8Kr/uc=" },
{ "Localization\\Spanish\\Textures\\Particles\\Sproing" , "WtzrUuUsjp/GmOfoHApij3VLMn+Tr5qUZ6GGqqhUyD0=" },
{ "Localization\\Spanish\\Almanac\\LawnStringsTranslate" , "EyMLq+zINvouAEcKNy8fPEu0YIJ98NSLqpMs1NX/U1Y=" },
{ "Localization\\Spanish\\Almanac\\ZombieStringsTranslate" , "tVcpi3GfFH/0aqsaeCuzszFYi6s1IxzO6Zw7wnB0flU=" },
{ "Localization\\Spanish\\Almanac\\AchievementsTextTranslate" , "9PRacAZIbZjZZfc6/qoAggpiW2yZfKjWY7C4im+a2xg=" },
// Portuguese
{ "Localization\\Portuguese\\Strings\\translation_regexs" , "rzeZrvBSmqIGxLs/jHRAJycnkaoKthMidVOItF2PrbY=" },
{ "Localization\\Portuguese\\Strings\\translation_strings" , "j+vbHq7c9x5Rarc0yFX5eSQmHHtdXsgRqpCxJ9SGKi4=" },
{ "Localization\\Portuguese\\Textures\\Game\\FinalWave" , "MK0QFrw4Fco5s9xq+8quKs1Li+SinkQuh2OxfZA4gqo=" },
{ "Localization\\Portuguese\\Textures\\Game\\FlagMeterLevelProgress" , "YnkJry/FceiULgkq9RJleesNqgLp/SeKiE5MJA7Kplk=" },
{ "Localization\\Portuguese\\Textures\\Game\\HugeWave" , "jRqYPyzJm7kTbLeaSosHlGLWoUjF1mWqtVNdwtAcvuY=" },
{ "Localization\\Portuguese\\Textures\\Game\\StartPlant" , "7IkydSAOydpjYX1+LSb+Fpt0M0KRmVcwdvjGgXJYMKg=" },
{ "Localization\\Portuguese\\Textures\\Game\\StartReady" , "xoyag2YhVyujDnM/xAq9Xtym8HGKl/h1GCda1mfM3PM=" },
{ "Localization\\Portuguese\\Textures\\Game\\StartSet" , "92OXIRhqJJhmdtb0W/WMNVi1t5hdEzpiwzfX/7p4vRI=" },
{ "Localization\\Portuguese\\Textures\\Logo\\标题合集" , "Ac0MlmlulBOa2w5peHxP7KhJFPAGObirxua3kWLlstY=" },
{ "Localization\\Portuguese\\Textures\\Menu\\MainMenu" , "LNnYLNOJryrvG5XIO+ObgE3Nohxjo9n07UjaGjfVHSQ=" },
{ "Localization\\Portuguese\\Textures\\Menu\\MainMenutravel" , "ZwjI2ybianrOFPEfrLP/38t6y4QB7D6B8hAfr7fvSQ8=" },
{ "Localization\\Portuguese\\Textures\\Menu\\NewAdv" , "gxMOlYYsojAuEQkjdLIM46dkx4ssCH+ncPdK3QBlAFk=" },
{ "Localization\\Portuguese\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Adventure_button" , "6yGbPdJMpbrmHUm9VSCVKHQxJ1sy0YgM42EhxRr1FLQ=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "rdyOJvSoNOHM6uNuL6ehbayGUaOUE/CWs8ZzbzOCafs=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Almanac" , "+5i+4oc5FJDlzzC86ewxR6aaGt2pB6snfvsCpJGL3gw=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "NBmzBkLDe+lMK/wxbV3p2L2hhByBUBP8onsYXO8Pxnk=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Challenges_button" , "mAy8FXDBpR1tsmwAkNvYB+kg8KKZLxmOtVP3d3DWiJ0=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "jbM14CqEIK+GnRKoKUna7P78p4c74g8NNPEbp01f0VY=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Challenge_button" , "TXWmZyG1TjBnem8kcFVv93RfUnYHf8CqV1n5BQyTGLo=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "qUrCJfUYlEO32SCoPx89AzteV5hba2xzEjqCcNI2cJo=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Flower3" , "KQThbd2XxKVgA/b9DE8RKwYoNRGTCvOOlGfIlmdnNFI=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Help1" , "gJxez2SDkvOvUtS7q3E6xlnQWWWeG28KaXJSG5pqqeg=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Help2" , "FHAsPhSc3efXrwoZuiN3APOgXJQNf45znFcaoyZ7ZBE=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_LevelNumbers" , "ES369OPOoW1RsrCvYQbKaUt0GF3zXXgUd3ZPnjDWXhc=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Options1" , "FQKd+uBul2bwIcr6nmNq1N3X25C8MRgjyGBy26OuR3g=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Options2" , "xZN/+5sa+0b2eDmS7WV2rw/IV6zglPmF9qan62eJHAg=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Quit1" , "dLesJNU0+2/ep6cJnQBA2iUEgIOtve2ozeK9lBher/8=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Quit2" , "hvq+IpGRu+1Kvjz7g8797qjUIkMx8q3qcMyvJDnhMP4=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Store" , "WuaJyUo+GX7vDJ+R+MA6XRKF39j7lNZYOMCy+8wNzYE=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_StoreHighlight" , "bDeLuhI74R/OTEAAqiIkJJfVyywn4s80lTrgGFNTzLA=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Survival_button" , "mAy8FXDBpR1tsmwAkNvYB+kg8KKZLxmOtVP3d3DWiJ0=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Survival_highlight" , "jbM14CqEIK+GnRKoKUna7P78p4c74g8NNPEbp01f0VY=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "1mherm3clK7CvLh9GpVqMII32w+w54mKZE7Z9fkkZZo=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "3PVn0DR/33yNI2bjQnDDSSiFRUI+q+1j5lfk/R6JgxI=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_WoodSign1" , "EqYk1lM+BEqgaAqOJXF2HRPkYTgc9j2iMyjcd7/w/Vg=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_WoodSign2" , "0iGZDDOUZGqqbMV0CNnjMPVNbNXmvyrJlDIkJ0SV2jE=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "r2YuP2O+mEVhGmapNpFRX8NTx1uY43oaU7kgZyzUhok=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_ZenGarden" , "Ga88gKhsCeLtSoTYheuB6aPx5s34u9SqicGbLI/G6Ng=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "0xCUMxGOkVjkgU+fzmlzzSzC+acBGxKhmMjXT+idOk0=" },
{ "Localization\\Portuguese\\Textures\\Menu\\SZW" , "UVGfrlWecM6jEtNJPqjZ+zI66w3euAdOMNl1EPfKpxo=" },
{ "Localization\\Portuguese\\Textures\\Menu\\thanks" , "eHFnd+JUF/r6YRbpTtjmbs6Pywp92asO6TD/rLmO6Eg=" },
{ "Localization\\Portuguese\\Textures\\Menu\\travel" , "qmw+h5LBEWpIGaSe3HZF0XYUScF2VnGQxKWoD4cR2Pw=" },
{ "Localization\\Portuguese\\Textures\\Menu\\钥匙经典" , "g1DKaF3XxYSuiROmemzDz5C2cUcAQ7jPzuoV+nbC/Tw=" },
{ "Localization\\Portuguese\\Textures\\Particles\\Doom" , "FqBUBeIvzyyXL+cqO4Fi6CKI5gZW5QXfHYPTOYoeteM=" },
{ "Localization\\Portuguese\\Textures\\Particles\\ExplosionPowie" , "PHe2TsElYp9UvabT8sxF38JZc+4Hiz78HJyqH/Tzt3M=" },
{ "Localization\\Portuguese\\Textures\\Particles\\ExplosionSpudow" , "Hc/nhkiBIHrZzgdX8+zPYBVoGgNj8177Eqn/S/CvhUs=" },
{ "Localization\\Portuguese\\Textures\\Particles\\guang" , "zpzEG5fPPVYI3tf4DXE0hu3j5BlwIPSAKgcbpr/0wlw=" },
{ "Localization\\Portuguese\\Textures\\Particles\\Sproing" , "WtzrUuUsjp/GmOfoHApij3VLMn+Tr5qUZ6GGqqhUyD0=" },
{ "Localization\\Portuguese\\Textures\\Particles\\SunExplosionPowie" , "Cx5JShdk8H2FKNujBTOylSR0708YuufHqWUZiV+sG6c=" },
{ "Localization\\Portuguese\\Almanac\\LawnStringsTranslate" , "WilEedYB6brtG2gExyru8VCIPjYiH8KOvCZ3dXkSaUc=" },
{ "Localization\\Portuguese\\Almanac\\ZombieStringsTranslate" , "ihC0adgxNlZjMrbLFMrYbprM2fY5Po4GfxaGvLJiDaU=" },
{ "Localization\\Portuguese\\Almanac\\AchievementsTextTranslate" , "2gd4zJcz6giTsKjIyjIca3DkWOipeedtbQpX26AJnkE=" },
// Javanese
{ "Localization\\Javanese\\Strings\\translation_regexs" , "ci3jGT0t5FHqstahiDanSlnoXjHtfNLKD1JV2ZmbARQ=" },
{ "Localization\\Javanese\\Strings\\translation_strings" , "r84OFD0SmodV4abyygiyDmwPcfDZTPPvZ5XA+sYHAIA=" },
{ "Localization\\Javanese\\Textures\\Game\\FinalWave" , "ZuqUOUgNV8tNZ0vzyn0ME2VOYbD1TuksAP900r94QP8=" },
{ "Localization\\Javanese\\Textures\\Game\\FlagMeterLevelProgress" , "bZUyDcbcLtz+uG7pnXncJEgBQn6dkE0HUuO0py5Qqtg=" },
{ "Localization\\Javanese\\Textures\\Game\\HugeWave" , "yNfz9nK3LRYy307H6xe9fbIkBM1WryMNkpUpX/AjaY8=" },
{ "Localization\\Javanese\\Textures\\Game\\StartPlant" , "vx2ZKMq6MPzgi/wQkTCHS3q2MKGfDSV/nR0Y6wcV1RM=" },
{ "Localization\\Javanese\\Textures\\Game\\StartReady" , "U/G1MHSRD5N3XYuLz4aj5DAnj2OSIL7lTLSakoTd8o8=" },
{ "Localization\\Javanese\\Textures\\Game\\StartSet" , "uX5YiWkb7Fh5TmEJAyj5llaUEPIv8HoIgtLhQ4cenMo=" },
{ "Localization\\Javanese\\Textures\\Logo\\标题合集" , "uAh1wGHTmqL+eelty5vhYB6aeXxyt0j4PMXgyDsWg6c=" },
{ "Localization\\Javanese\\Textures\\Menu\\MainMenu" , "OZ1gfSCjvhys6N8eeM0OZKX/z/FDLtX6HW3MA/UqgLs=" },
{ "Localization\\Javanese\\Textures\\Menu\\MainMenutravel" , "V7dmKMS/Ta7LUobEgFudX3hVXCs8GBulEYJUIkvn+do=" },
{ "Localization\\Javanese\\Textures\\Menu\\NewAdv" , "y9AUQwwNxsOnkPM5LY5DT80cQ/X6WmNsGmzzo1VZdyY=" },
{ "Localization\\Javanese\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Adventure_button" , "5nPBRgfdFD0RWQ8j26FXzQBN630hSr+VRyKXr/9ALAM=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "39n+opclWXQEDzKDrsg2r0B5ZtCx7eMcryp13eJvZ1A=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Almanac" , "MAucz/pmIdNnun4hLfp0PDrjESlsAZ/iL49NCYl6feQ=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "Fea3OWEPntAYCFCP1DK0lrqQByQTQJ7TNWhS1wRfk3I=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Challenges_button" , "xdoeNs/98lT4BKon8Bcwk7m1S+fGbLeHgZISD9qVt1A=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "91z8WbCI7XptpUtaN7mJ1BWz+0JNRMYNbDcoxzb7YhA=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Challenge_button" , "6W1spOrj4FB/SgOb8851XRMAnXoudOjNyl6z4Egw/rs=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "2MhlockgUB7+YVxv096GrbPItf5IVWtuAiv/o65Dx3E=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Help1" , "TrxevH4mjIf4iCFdUXk/Skwq7Asg1dxteTGzqOjQk6o=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Help2" , "s8i2Ca+iB8CGihGdlzqFxZ8PYO7tdm4ODH3GiSqIyMA=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Options1" , "JmwncgGiBynAVjnGkPd0EKXh+MYkUhbpy7H90MYnfTE=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Options2" , "FBzi7WpQje1t1uadDIjcDCwVe994I+ICfmdx96NqrM4=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Quit1" , "N4yS6t5+p52vU93MbHeLgFik9uureOGgJFL8G4FwKho=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Quit2" , "NPtds1JqdvoLtHiAYxzyeM4RyvcrcYLu1HMSnO3252g=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_StartAdventure_Button1" , "fIaIRMLy8g56ifWSPZmKH6CCQLia550aovyHGJIRUBQ=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_StartAdventure_Highlight" , "n0+5ijqYlRWC/3l2JSqtZPnMDbFp7TLSeZefohaEqg8=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Store" , "6JxQIrwb++ekCR47/hQKyahxmMt0ntFDa8A6qETcs3M=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_StoreHighlight" , "8SnyShbhGdphCX4dqfWjuoQIZvlnpDsT7a9mrS6RLEs=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Survival_button" , "/mMMNvV2V0X7oSVyKWhLryEO7Bo+eCgDiHozjd4I3/I=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Survival_highlight" , "pNX/YY+qV9RmVt2dcXLTZ+magOEhQNxtxYCUQ4a+S4A=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "IlFeFIlDFW5QAMWwRrgwt9kvStq7pJXNYnWfa3o3zmo=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "aHyZVtF7SxvC8i5Cvj6eARj4+YrB64TZ5njk9whfdgk=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_WoodSign1" , "aJ7MmKsDxiIuExTTP+b26x548jJC9PR2l5An3/Xdlv4=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_WoodSign2" , "5G3x/AWLBZY10RKKdlll4yD9YFzTNqke1GJuTQk0nCo=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "S6vvweA+KTaP0m90S3lu8oitt0/kfc/XasW740bkeGs=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_ZenGarden" , "kgnex+VH/1wjfCM0gLUPRQ16Nb/jeBOBwz7Uz+tBrKU=" },
{ "Localization\\Javanese\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "cHufQXgZze8hFwdw5M1gzd/kgtMrFQGIaforUAQeVUk=" },
{ "Localization\\Javanese\\Textures\\Menu\\SZW" , "kJM+ICVWg9rIbVDkhX63KdViIjnVYH4IGC8rqvmnAQI=" },
{ "Localization\\Javanese\\Textures\\Menu\\thanks" , "UPSssI3shIEOMFKQKhRALT2SHpmBTMgHmxpBbRJmPIM=" },
{ "Localization\\Javanese\\Textures\\Menu\\travel" , "s0AOJiMph12ZnPEYyXZ66EbfBHl8xlwhHh70nlW3kkU=" },
{ "Localization\\Javanese\\Textures\\Menu\\钥匙经典" , "5VCHANL1SD1xv+QsPdIDIGeq1Ksw2Q0O9Z5fH1ilCBE=" },
{ "Localization\\Javanese\\Textures\\Particles\\Doom" , "OE2mWsoMv7SEqRWQJWzJ+A/5gQXeRtogIph28cHJyLI=" },
{ "Localization\\Javanese\\Textures\\Particles\\ExplosionPowie" , "P2jrh7tf2d/9EWHoMScwpkpm9ZSvd+ZACEJqSzen7lw=" },
{ "Localization\\Javanese\\Textures\\Particles\\ExplosionSpudow" , "PXVMwcdcn2pL3mN7O3JEMFvI78XGb/POvZ3Sh26bbOw=" },
{ "Localization\\Javanese\\Textures\\Particles\\guang" , "fWG+wb2CZqaSsaLhiscKXHpqWiyG7Z2qXtHhBzumlSU=" },
{ "Localization\\Javanese\\Textures\\Particles\\Sproing" , "+CRy8k+5wzAdG5wVPM3sTYny3hCmPURD42qnTOIv898=" },
{ "Localization\\Javanese\\Textures\\Particles\\SunExplosionPowie" , "ifNQQNn0abUE11stJvwS5wZQm2Y9kPhQx7bXtF0EnCs=" },
{ "Localization\\Javanese\\Almanac\\LawnStringsTranslate" , "5JgLhxOJA5v4dmZIlUuj5IhDJAijMQov7xNm4mhcKTw=" },
{ "Localization\\Javanese\\Almanac\\ZombieStringsTranslate" , "XpsMKQ0tZON0zeC0NAjZZqC/4SgSBFieYpDBMit2WFo=" },
{ "Localization\\Javanese\\Almanac\\AchievementsTextTranslate" , "g+5/ND/fdGs4fX7mX88GFp1vdI5lAicu4UcOhjLWoO8=" },
// Vietnamese
{ "Localization\\Vietnamese\\Strings\\translation_regexs" , "jkmDo2/shz/L1entNc/VMTHSwITTe1lDSWkXwu21HY0=" },
{ "Localization\\Vietnamese\\Strings\\translation_strings" , "DEcePF0ruVJLmtTWVL6cgpg6R14ha8loB7E1sEf6r1M=" },
{ "Localization\\Vietnamese\\Textures\\Game\\FinalWave" , "Ut9Z9amTQgL3Pdcza22zTjKANBKZ9iGQGwuiV9yia90=" },
{ "Localization\\Vietnamese\\Textures\\Game\\FlagMeterLevelProgress" , "4pMjKlDTK/eLQtYWZy1yjgAsDizgOQLZZcA6lYdDbqA=" },
{ "Localization\\Vietnamese\\Textures\\Game\\StartPlant" , "Vu7L6nDEl62NmhpQF+79hPc/Os3iJogr1N3DGUPv/Nw=" },
{ "Localization\\Vietnamese\\Textures\\Game\\StartReady" , "z3YlFfGkneA4LSSqqtlpnwNLJq3h7gwtl1ZvcxdgUxE=" },
{ "Localization\\Vietnamese\\Textures\\Game\\StartSet" , "snzA81WMzGmssVb862bG95eMRmDGn8t3tBEtj0M/OL4=" },
{ "Localization\\Vietnamese\\Textures\\Logo\\标题合集" , "xqL8p6JTWYSMJmWxxOsA6ToA9bdeA1PrFSWsfarm2uw=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\NewAdv" , "HgyAiO6/YX6jfqzcfW08m/EeXqFRsaGQlIv09U3kHyM=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Adventure_button" , "vkeO+XAUZURjHfog5dqM2EWmx4Q/Hkgm2lxKWWuEn84=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "bmw+kDo75C0h/xHg7U01xvGQqzjHBjgOvYjuZDLdOU8=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Almanac" , "1gsF1/5A/Wwg7X7NmYVvJi3vaavEqbAMDy96vLCElf0=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "Euqlx4l5PGWP/VDni40lyo6XONI7UH+jjT9NGbIdaSI=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Challenges_button" , "anKXed+ijHNf2PnlyRHOdnPNHujFsjwehPuS096dDS8=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "Fva/m+l9o97nj/niIO3eXfVP+I9hCK+Mhm0nrB/ZgBw=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Challenge_button" , "wSZkmGAeFCCEj0US6ZJaJACCwRuj6Tj5JNirlbkmCcc=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "NFH6cDojgh8QeUFF9EMBi+yBVCj2Pi20Up1qQH3EycU=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Help1" , "Y3CrU9B+tdD80MgmCUoWmpvmByahXIvI5tzUjPZZlQ4=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Help2" , "lYbzNUtHudgFvpoEaIQZ420RBmFJmxjrwNmVrq1V1KA=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Options1" , "PmdPi4VkTI/Dlal5s82jQ3xay2F9xA5n5pfcz0ad4bk=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Options2" , "31itkFsIYHeaNMjwiHXiOkeC4pA4onVejVbvMR9dhS4=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Quit1" , "AuhF4Z+C9UE6huKECVBDMRSs1sUEOCsX2yJRPFJ19do=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Quit2" , "JsbRYVZk+KV1870Nt8rlWb6Le2YLKXU8Gc8NXMCfg3o=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "GXlUgJI9mP+YYqwBU/e+0LeFh9VsCgRLepK3yYLd5JA=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "U5t2Fhn17ahAzH7h+nkgpEpEVf7qBBoGfHd3d9tYnVY=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_WoodSign1" , "2xGQ6lS/KxIwjmv3iu5cWBPGucSLBqcT7bdp8KCDC80=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_WoodSign2" , "nMB8AT0nDCBG0aHPxmTKIvVNMvhVm8wli2zU22edZR8=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "QhWvlqpFpjF0GYW3LTRaF7hjogvFH0CjtIGZNS1Q0rc=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_ZenGarden" , "2PjsUHvJWhcAdG/Wq6xydshRL0ufXkj61IQ1QBnAcjo=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "xQ3G4RgOY+/pR4ZjmPkY92Ei/qURxbSmXF3dEGpkuYU=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\SZW" , "0Rfvp6ZzoeqC0CN53g7VD1VjqTNY6pRbZyfJhPk16s8=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\thanks" , "9+56vhTLNddtzyzVQfaKvf7pUwBwQQYYleVVh8j2P2Q=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\travel" , "Vz1TbErS6YBlJK3xGVltUi+M2wLINDwv675IfMYK774=" },
{ "Localization\\Vietnamese\\Textures\\Menu\\钥匙经典" , "3vVVP4TSpnN+GhcKIorkVC6NiSXU90gQUhUFkp5JV9k=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\Doom" , "wGdj1YC7DgQ9gO+0qOUM3GvWkZvmSmFcdZPRuC0xWg4=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\ExplosionPowie" , "NLVTBUV+qnJSN8iDyN0/X5mCLuMf/gNf0eqQSNgyR/4=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\ExplosionSpudow" , "87XKk/0oU6tGGyCe1/2KzBHucjYc6fpEl6C5MQGz1bI=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\guang" , "4hMjrrMrOOkLgHlLzuIieJGzwy/SzmY/JI6KDKxA9EU=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\Sproing" , "Kt9TlS9eDVObwbNh9iy00bB5WjXufKPZv7i+mxUG9mw=" },
{ "Localization\\Vietnamese\\Textures\\Particles\\SunExplosionPowie" , "DGdHTnCA+6ovq0sE5TwBEayKAuF5cb+MEOv8xX5hmFU=" },
{ "Localization\\Vietnamese\\Almanac\\LawnStringsTranslate" , "CM3FWxA/MKhudP9bRjsTNY0ozLJ1K0nOVs/awEvOrnA=" },
{ "Localization\\Vietnamese\\Almanac\\ZombieStringsTranslate" , "yFHjQbsTxaw621AXaHzJLDulElVB1YlKI+nUxvjJuus=" },
{ "Localization\\Vietnamese\\Almanac\\AchievementsTextTranslate" , "Pyeukawk/N5uiUBKDs/erVzIzA+uqZZhtP2amyCKKdY=" },
// Indonesian
{ "Localization\\Indonesian\\Strings\\translation_regexs" , "4hmtjqn06LLDtClO8mlg13blxXj1hPwWdaSjygj7/2I=" },
{ "Localization\\Indonesian\\Strings\\translation_strings" , "qc4bxqtaJeZBI6nxL4jnf+VpQu/xpJKs/89IYfDcNC8=" },
{ "Localization\\Indonesian\\Textures\\Game\\FinalWave" , "EKjMvK+krWb8AEnvhL02z4ETUR4GEbtEspU8xTL0XJY=" },
{ "Localization\\Indonesian\\Textures\\Game\\FlagMeterLevelProgress" , "bZUyDcbcLtz+uG7pnXncJEgBQn6dkE0HUuO0py5Qqtg=" },
{ "Localization\\Indonesian\\Textures\\Game\\HugeWave" , "kHSyCA4DjKiacui1Z2Vij0VSKr3UqI7FeiZp6MiYeRI=" },
{ "Localization\\Indonesian\\Textures\\Game\\StartPlant" , "lraovY3Nx09xinbn9lF3g5OQPBmBzwkCS9EX3PeKrKA=" },
{ "Localization\\Indonesian\\Textures\\Game\\StartReady" , "WwJG+GIHjqZ/3PWlt7MmATmn8gegir5JdWLHSDOyONk=" },
{ "Localization\\Indonesian\\Textures\\Game\\StartSet" , "wnAy+G4MWwVp11UL9OovumPhS+bFoIw188yt7djqd5o=" },
{ "Localization\\Indonesian\\Textures\\Logo\\标题合集" , "i+dOUq/gv+NF4PbSsElYnsoi8WnrHFgTMCA+lEXwH9E=" },
{ "Localization\\Indonesian\\Textures\\Menu\\FlagMeterLevelProgress" , "CzuBH4sm7Nid4zloZF3i0bpNcA9ILPhrmOxVYI4IggA=" },
{ "Localization\\Indonesian\\Textures\\Menu\\MainMenu" , "OZ1gfSCjvhys6N8eeM0OZKX/z/FDLtX6HW3MA/UqgLs=" },
{ "Localization\\Indonesian\\Textures\\Menu\\MainMenutravel" , "V7dmKMS/Ta7LUobEgFudX3hVXCs8GBulEYJUIkvn+do=" },
{ "Localization\\Indonesian\\Textures\\Menu\\NewAdv" , "y9AUQwwNxsOnkPM5LY5DT80cQ/X6WmNsGmzzo1VZdyY=" },
{ "Localization\\Indonesian\\Textures\\Menu\\options_menuback" , "OGZ6SNFo8RbpPqWaO88qCzPm7r8Mv1WzUee9BlZDwFE=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Adventure_button" , "IZnCr7uu/muNeugOXMVymHMd5wJ+nfANiohpPnXKleo=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "qiAu0iMOKYUs9XDLgZ7LgVd+KiR0Xn0t0jtVNmjl2Yw=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Almanac" , "MAucz/pmIdNnun4hLfp0PDrjESlsAZ/iL49NCYl6feQ=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "Fea3OWEPntAYCFCP1DK0lrqQByQTQJ7TNWhS1wRfk3I=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Challenges_button" , "BTltkx67dDWnRIL/TaXUKcUYiQFT01zF0IicWldAV+E=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "GCd2qh/rfLbLserDnSzPekRvxIS6W9q+FeNWfkEqTcg=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Challenge_button" , "6W1spOrj4FB/SgOb8851XRMAnXoudOjNyl6z4Egw/rs=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "2MhlockgUB7+YVxv096GrbPItf5IVWtuAiv/o65Dx3E=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Help1" , "F3na7RpFGvO8bF5lvQbvJanJQmUqPEO5+vkKo4Cx220=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Help2" , "imagpCvSovqC6SkeR3BAJqH1u9ssin0C6jwIhx0wGpc=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Options1" , "DMwpZW09/p4CFkgsAqMPExEXzQYOb1TAWKURN4LOYc4=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Options2" , "s6wcmSMPErvL/4QuRE7ZYWtCg6Nl6A3FeVL1pK8cOrQ=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Quit1" , "fNNNbsaNEYP3bl3KwlypWIDZNCpm4wVDYUDsjzBw1zU=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Quit2" , "Qm2506IHHfwXKMkqS3gS39hjjZnV3AP2IHJlOrhYpCI=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Store" , "6gVEuBsk1/udDoEATm2tgmWMCkdme0+oxngcJAKrmP4=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_StoreHighlight" , "grdusCpWrRqZfBuNB1Dj7bKFzyQk3xFReAqoAEKYFhY=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Survival_button" , "0DWLUXJ5RYKci+loCThNfHEpk7tKV08vifffcK8owNg=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Survival_highlight" , "AXW4pkVR9twu7/SJYvqScPeNswIoefGCBJXDf7SsXFA=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "Q24q+w0RftOK+HcQTDvjG5xDpIEYMdecJyGTNGoh9+U=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "S2IYcVmWghuxAVeaV67EnZ1ZjxyLuEmqLRhknUAQ9dQ=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_WoodSign1" , "aJ7MmKsDxiIuExTTP+b26x548jJC9PR2l5An3/Xdlv4=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_WoodSign2" , "h5NWhUBnM+ro6J6xs7UDPEmT6055qZP49ppF4wIxePw=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "tu3PiZyJK6CcwaV78aQpqXcE5aLaHA9rPpgzMAbcEAk=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_ZenGarden" , "MAMBtit0msOsty3zZ1yczih8NsF+4nA7fw7BkYMjCk0=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "B17BIhLDvt00Opiag4nqg9a6SvClVr3LlCjzMLI00iY=" },
{ "Localization\\Indonesian\\Textures\\Menu\\SZW" , "OWT6LXWuE7Tr3nH6wYMuUfh1+K9y4TRqtb570pm7veU=" },
{ "Localization\\Indonesian\\Textures\\Menu\\thanks" , "APJpvesl3m2b09ru53RG0MJWcbpia+teT/SnPrnO55E=" },
{ "Localization\\Indonesian\\Textures\\Menu\\travel" , "YP1AGn+G7iYrZ5NQy08TbVxMjFfH7HzdyAMJtwEQ5L4=" },
{ "Localization\\Indonesian\\Textures\\Menu\\钥匙经典" , "5VCHANL1SD1xv+QsPdIDIGeq1Ksw2Q0O9Z5fH1ilCBE=" },
{ "Localization\\Indonesian\\Textures\\Particles\\Doom" , "8vtJfi6ngoltUJQbyCLvp0RnoRZbbVN+piV6lwR8KgU=" },
{ "Localization\\Indonesian\\Textures\\Particles\\ExplosionPowie" , "mmL5xtnIBT3ffswqXHMiz0rXmbj85rCmiWGNnzQq1oM=" },
{ "Localization\\Indonesian\\Textures\\Particles\\ExplosionSpudow" , "PXVMwcdcn2pL3mN7O3JEMFvI78XGb/POvZ3Sh26bbOw=" },
{ "Localization\\Indonesian\\Textures\\Particles\\guang" , "fWG+wb2CZqaSsaLhiscKXHpqWiyG7Z2qXtHhBzumlSU=" },
{ "Localization\\Indonesian\\Textures\\Particles\\Sproing" , "+CRy8k+5wzAdG5wVPM3sTYny3hCmPURD42qnTOIv898=" },
{ "Localization\\Indonesian\\Textures\\Particles\\SunExplosionPowie" , "ifNQQNn0abUE11stJvwS5wZQm2Y9kPhQx7bXtF0EnCs=" },
{ "Localization\\Indonesian\\Almanac\\LawnStringsTranslate" , "E/P7S2V3xWCnG/DZfW8shpV1ieJUvPf07U/TyJ9LPok=" },
{ "Localization\\Indonesian\\Almanac\\ZombieStringsTranslate" , "twHrylFgPp+RBQ6l10+QHIxgs/mI7p8lRC9etNsAKSU=" },
{ "Localization\\Indonesian\\Almanac\\AchievementsTextTranslate" , "eRZlZgKN2EtZV9BWYOPHPZHBuhLiHzYC3f/wDcwFnR4=" },
// Russian
{ "Localization\\Russian\\Strings\\translation_regexs" , "6ASIdaFZLLTSdckI4evzynZY3CtCfTuG/BS0ENft/9I=" },
{ "Localization\\Russian\\Strings\\translation_strings" , "mRs9Kx+QyCO5PUScMWyr1P1f3cIMscK0pWjVP4iinL8=" },
{ "Localization\\Russian\\Textures\\Game\\FinalWave" , "IOhfHr8EBtJYfpWWtELBUtmJNoxv1TdBFrhEfFPshVc=" },
{ "Localization\\Russian\\Textures\\Game\\FlagMeterLevelProgress" , "bGKyk8MpfsaYt95/NQ8kboA0Uxt6ay5PoL0l0RHZ/+M=" },
{ "Localization\\Russian\\Textures\\Game\\HugeWave" , "w1dq1brhzL0eGwj9GJS0vQZDgYVbWjDxRBx60xToKBc=" },
{ "Localization\\Russian\\Textures\\Game\\StartPlant" , "PIOtRaWW0ZdFMNBgyA3Ca4H4rMSLMvfXFvaY/ZZ/oEo=" },
{ "Localization\\Russian\\Textures\\Game\\StartReady" , "zUT1GiCxMDAPlxCyuYPmmztGxDCVdtjiB7C2+Qffpkg=" },
{ "Localization\\Russian\\Textures\\Game\\StartSet" , "ut3aHNTGhzVBNlvHTFIuyj+6SED8Pu9rOpIWKI0V8MQ=" },
{ "Localization\\Russian\\Textures\\Logo\\标题合集" , "qocM9muRdJBmjrs9yTHTknMLWX27aPY7AdMMdLIzd7c=" },
{ "Localization\\Russian\\Textures\\Menu\\NewAdv" , "PIDRlOMsgrLxpp51rWt//B2cBdmNKKEYTvuMUN0wFvI=" },
{ "Localization\\Russian\\Textures\\Menu\\options_menuback" , "HZfWszRsYXntilq2RRoQg6cYPNF7Api0ppAHYJ46wy4=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Adventure_button" , "UGbQ44kL1zXnsJcAr4vrZZu0hDSTEbtdKM2shtebg4w=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "drv1AX+e4D/mA+1IqymPQ5RllTfRatuI+a2/2YJD+GE=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Almanac" , "BdotPdigckPxfrORVW5EJucskfLdK06icpH+Q8mS9fs=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "XoTbNX+410xOdf6MX3BZiVlzD3MsWaqpF8KXZyxduXo=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Challenges_button" , "pcno2qw/DBMHX3VzGUHErYSAiQyGWseDJGjwHWZI//w=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "Bi5w/0q4C9CpWCjZGLLTHQek530srsp0/Kom4W29IG8=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Challenge_button" , "kfAEG09yl5h6dV0vHmPl6o72+Wu3kzvBXtyw62E1puk=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "VvP4urY9+U0EPEa19fByOzOX4yKuNzD7eLTuxlEBW2M=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Help1" , "jFKhKseKeZ+y1b1lLYBqfsM5GRGv6JVUa+Jo8sb9p0I=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Help2" , "c1xqKGKKyJhznB5vZpT8FkiSD/luKAEOVH7ZSr/rpp8=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Options1" , "BirUdLzY2B3sedbxZ1eqTwSo/l2UW+obPk+oZhhiSUw=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Options2" , "SLSw+97otiN10CyE6nX6QqHmiOjQR8aYuBUveZ8Lx9c=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Quit1" , "B5L16JYjqNJSD5pA9vhEq/C4gzFkz7VYnzcORjOytxA=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Quit2" , "+7s74lMPYaJu+U+572MRvmOolp33Q5xmu/TMOmRvlZc=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_StartAdventure_Button1" , "f+NFEqcMvJj20nysVA7mlGmFkJZAmmef+Gi8yUvwses=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_StartAdventure_Highlight" , "f+NFEqcMvJj20nysVA7mlGmFkJZAmmef+Gi8yUvwses=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Store" , "N+M6I8pUzeEaetRaE1Wjh2j4g7a1uwrBnqR+7zbsxxQ=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_StoreHighlight" , "QiFOWjJqdoRZMbXfTuKJwTdm5a3E6vm0rGkXwMaMCYs=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "ta02SAcbm7ErKiwz4vpZzrtuptJComb4X2DAwx8GiJw=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "28+kPzJUSqm5KKrUlA5GOAy5+q//1bknEniSze/Bb6M=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_WoodSign1" , "8CV21tQ/HxANofuuTatQO1Ul8zXQYwo1rfzU6iozCiU=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_WoodSign2" , "bG6o/CpJPm9XBfWq/m3f1cquTAOr5fbwRNtx7XEPcqg=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "v7BbNSzfQIVYLVrYSOIO2i1NbplOiQjYyQcR4rR8OJw=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_ZenGarden" , "WsYKxhTcuqTFT9jbeOne+W3/opToTbzZFnq7uGulJfQ=" },
{ "Localization\\Russian\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "aGRi1WWchHxPisQdbkX9xmsALia6I1jo8JpysSHb4BQ=" },
{ "Localization\\Russian\\Textures\\Menu\\SZW" , "eaqxoi1/FlIyUCfEpJnFgl1xoSwqP1XRHFIaobQzD1A=" },
{ "Localization\\Russian\\Textures\\Menu\\thanks" , "Juq3A9M9V/jScckNECv+JB2U7W+y6YivxELZV/nN3JE=" },
{ "Localization\\Russian\\Textures\\Menu\\travel" , "8lXVCidvQOeh8y9kG7xN51Ch9VyL8ThZah/OI1RxN6c=" },
{ "Localization\\Russian\\Textures\\Menu\\钥匙经典" , "wwcruWy65C8iXjA+SY1dvx/hrSQ/KvVkX4OOOZ6lS/s=" },
{ "Localization\\Russian\\Textures\\Particles\\Doom" , "OWddkj4pnY9xmSIuQIL0vb6F091j8UY2PEC4tZ6P3p8=" },
{ "Localization\\Russian\\Textures\\Particles\\ExplosionPowie" , "KbPmKOHVvOH9njUEBWb6SJPEdGOLbpAG0CpliNyUefA=" },
{ "Localization\\Russian\\Textures\\Particles\\ExplosionSpudow" , "k1C6TaoPE0ZRw79UAjDwlRaLjf4Q/b2N6JM9SN1I5fc=" },
{ "Localization\\Russian\\Textures\\Particles\\guang" , "+Xd4hpZk2VEhgHr9HATWRhjEbg4WlmXkh5DA+gXevIs=" },
{ "Localization\\Russian\\Textures\\Particles\\Sproing" , "i33iY8w5LR7Kdqf2vVQ7UmE9SrWZ+5AGepTy5QINyHE=" },
{ "Localization\\Russian\\Textures\\Particles\\SunExplosionPowie" , "BCXJtvwnDvIzc7cFnxN3wxR7t2o1rqa6hulW54PJLrc=" },
{ "Localization\\Russian\\Almanac\\LawnStringsTranslate" , "NwYjBl+2v0brh38S4AJpHHWDK/1hCJ5VVqY+Cf5jYkU=" },
{ "Localization\\Russian\\Almanac\\ZombieStringsTranslate" , "ejVysCnTehbMFkjAXN7n7NqWespRHmv5cXYM0hMlK0U=" },
{ "Localization\\Russian\\Almanac\\AchievementsTextTranslate" , "ST45TjReYXrBOfT3r2YeDakJm1SN/jtH/5z0Qp6Ms4c=" },
// Japanese
{ "Localization\\Japanese\\Strings\\translation_regexs" , "YXerYuvclj9na6pQOefuVfJVER28OAb2EkG/kMLqrGQ=" },
{ "Localization\\Japanese\\Strings\\translation_strings" , "hXi0RiHTbzptiAHqko0CRwDDWW9zoRSdQpOXpd4U3BI=" },
{ "Localization\\Japanese\\Textures\\Game\\FinalWave" , "tyOrI4m+7b595JZufjhesTYXqiSWuNg4Dlm0fN/ZzVg=" },
{ "Localization\\Japanese\\Textures\\Game\\FlagMeterLevelProgress" , "J8Gnugo3MCdQCFNaw91nOWKiYEJltD7EpScPvgJjVdQ=" },
{ "Localization\\Japanese\\Textures\\Game\\StartPlant" , "8+rIjUEkUtyYRsu9ZHsM6B26fT87U6BYHtjhef+sZSc=" },
{ "Localization\\Japanese\\Textures\\Game\\StartReady" , "G0wx/YkdgSZju5xUluqrq554u7ywOGxRPjQwfEEHwSo=" },
{ "Localization\\Japanese\\Textures\\Game\\StartSet" , "4jSRsYZN+mA3pMZQtjtxxo7z8PYpjyM4Ja1coeOERmQ=" },
{ "Localization\\Japanese\\Textures\\Menu\\NewAdv" , "9CgysaFPLkL+h3CB5zLiUxj7Z7xSZCTQKFr/pAvjW4I=" },
{ "Localization\\Japanese\\Textures\\Menu\\options_menuback" , "KcUX62UuqoR0UKas1yijEQP56fWbagBIpSwFIr4df+k=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Adventure_button" , "nqJjYCKTGCWuIHwSSRDpsJkPK7quA/4UgfX+EZsadsI=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "/oarc88nswGdHzRI7+ol5XUH8pqEudTJ/l4mtWr6ugw=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Almanac" , "GsHU22IdE1GMx+6eDcJoQ/+LJDJwLG3sovrPion7/68=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "7aHSIocT5JbGVTh7addi0+WrON9G6LPv2xmuDy/tPRg=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Challenges_button" , "ljfdR00zwozWSwI85JwzGAGQgjXL1sCNpr/+juvcx0M=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "hkii/10+OmfcVLNOB3ATpI5iHpPhw7mgiVRAs+kDsHc=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Challenge_button" , "tf/14faCSFk7b9vFFn64FAAUpLGZVmfInI4K0Qmx9aM=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "1ZC0zr0P3WkXzKvZ17YwkLID/6YYdTx9PZQimMSos6o=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Help1" , "8OR4iqxkdQ3PsxbobY+JaN/w0lXNc2A+Kbec/VJ/QVY=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Help2" , "i60mg9eK5WzjUA0iZfQtvDWq7HImRV14xNqfLzFmELo=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Options1" , "YJZBgCXj/ZH4F8zPo+t4dAGmGMSiDAcybs2xuu1LTiw=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Options2" , "yIbcIgBPjVP3JKNiF6dBPdJ90Yd+fKC+99KUjTfHOqQ=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Quit1" , "hkDaVb8qUDLKPp1MIyGY6x4teZAVev56kjJ7KihPMss=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Quit2" , "Tx8u8J/YpKF0lEd436EJfOMzXVzSWlsWDHBh5s73MU0=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "hn9D4J0aBhdrM23YNrZJXd2qbQrePLru5gCYBR34xgo=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "+RQ4US+xJ23ieUzvO3sBzHJBEmCz5wZz7Gv6UmFjtdk=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_WoodSign1" , "78kL8cLZGoQdNcZjPbXFAkhN9A0zyCun8ieAOUvva3k=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_WoodSign2" , "Fkn7CvIOoeB8QrUUtj2HySgUg5ZR+zvry6jythPN2BY=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "S2xZmAOn82/7uJ0q5Ej4tc59cheMme02Eb/CBjQjULI=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_ZenGarden" , "AE/8V2mkM15VErDDjg0g497fF4S3GYdSDRi9pDq0S+Q=" },
{ "Localization\\Japanese\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "KiN9KORVPhugq/laYeo+78CNeNW3CEVpVmi2J2WTNT8=" },
{ "Localization\\Japanese\\Textures\\Menu\\SZW" , "4jkQn+T+/oceMqVHefAyo7G/8LQ/3jZuF41rnEaFVy8=" },
{ "Localization\\Japanese\\Textures\\Menu\\thanks" , "aoTr0qV9HPJLz4WImY9FpU6mbB6Jy2WfOeXULgDWdlc=" },
{ "Localization\\Japanese\\Textures\\Menu\\travel" , "MwowpcnQ4BXqoE6I8n2iP6ZzmVSMNaUpyBkPIkaI2hE=" },
{ "Localization\\Japanese\\Textures\\Menu\\钥匙经典" , "FeQQRbKmP9uOZ37BtcHNjWH46zSe1tCrexTrnWcKX50=" },
{ "Localization\\Japanese\\Textures\\Particles\\Doom" , "x/jlt63Ryze1+Dhjm9A1M65LkwrpuN0tTwn6wq7OtPg=" },
{ "Localization\\Japanese\\Textures\\Particles\\ExplosionPowie" , "uEPr3YXyamejZGcJ9QYxkQ6GOnqK3Ddv5HsgBJCIyl0=" },
{ "Localization\\Japanese\\Textures\\Particles\\ExplosionSpudow" , "4wZzRVJGrKmZDuJXuA8O/0mvLJS08DrhfWiRk6Arb/M=" },
{ "Localization\\Japanese\\Textures\\Particles\\Sproing" , "pKet1LadsHBdq8mOR3IOtOngBHyfxdFLp2hipu8I4ZU=" },
{ "Localization\\Japanese\\Almanac\\LawnStringsTranslate" , "D4riwyc3qc5fWLhnspeXCgCip2cb5k1/t0PlEPJ7wdY=" },
{ "Localization\\Japanese\\Almanac\\ZombieStringsTranslate" , "AzhgHGtIesVnO8aGJnpnY/C8+5eua2Z3wN887spfz7U=" },
{ "Localization\\Japanese\\Almanac\\AchievementsTextTranslate" , "PAk0G69Abd/8mqXxsrg1dChYjb3/Hmgp2UD9fqVnqXw=" },
// Korean
{ "Localization\\Korean\\Strings\\translation_regexs" , "zWV/cHF92F+GrFwlSkGXyep2jqBDG5LAiGwyDtcG2rU=" },
{ "Localization\\Korean\\Strings\\translation_strings" , "qXdtfjxdZcK4Oe6ptsZd3Vg4rIavfM06ZkmMfmR8G1M=" },
{ "Localization\\Korean\\Textures\\Game\\FinalWave" , "7I9i/6CVcPOhoL2n3/NUNOedbaIyQqlsj5U+jVQauu4=" },
{ "Localization\\Korean\\Textures\\Game\\FlagMeterLevelProgress" , "yMpBQDYecmFimlzSnsO8vdyEPp0Q6O5lAg0DWFS1m6M=" },
{ "Localization\\Korean\\Textures\\Game\\StartPlant" , "yGZNl/ELOvk/XqMp5pIhwrSLkAa/T+2pWcYb/tVC8CY=" },
{ "Localization\\Korean\\Textures\\Game\\StartReady" , "aNTSN8/FwAmu63eHs7wzdoDCnw3h3KWQ4SCiPtBoTdQ=" },
{ "Localization\\Korean\\Textures\\Game\\StartSet" , "PcrGZLSUL2xrPGTMzZJBc/xC05UdlWoCeHP8vNm8BjQ=" },
{ "Localization\\Korean\\Textures\\Menu\\NewAdv" , "LidoBW/vXZhokFRjg8MRy7daY4wehQ9vd3dBLwTsFLU=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Adventure_button" , "XvILct+pOLn9Ke3VvtlZPo4Zpob6wgAaNwb5w1+i3z0=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Adventure_highlight" , "WTyEd+cIWl3fBF1guKAQuMvDdMDwFnsgyZXoklVRTdg=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Almanac" , "7DLBjkU41YWjh6up42n+2DU+UU4jzBcuCyIjoIQhK1E=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_AlmanacHighlight" , "1oUnvwRL6Jr+AwwXJKAB/jcmpWl+0UP69js6vIKZ9uY=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Challenges_button" , "qoPxgGKWuHKCg3pEmvkauWfmXFZWR0spWcoK6AvLysc=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Challenges_highlight" , "840p+IAAw8KPwkoNmvcWcOWwhpTzTtcLixzWr+MunS0=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Challenge_button" , "FwlC3AOwWWeiqereusDpkRatqnKKN3c/xq5iPAhVo5Q=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Challenge_highlight" , "RZPSyMMXOr7W5aOWcr5xSR9XiANkWWVk6/OUnxxpUpI=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Help1" , "Akybqv0glw81aMYpGoosQ3PR7Ukhq+cD+ZlEUkLC5Yw=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Help2" , "6RZFnrYjpZM932niXc1qmRtAJm97GlDHzh3Q9c1u5b0=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Options1" , "D7hYM4ZPRbA395EUkLhG4jf7lfJqSUalp7oZJQ9/BEs=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Options2" , "1Z3SHvyiFsK7Wy9I2tFONcVYjF50Ho4L2+CbePFqng8=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Quit1" , "eD9BNRKQU7qei+eAsCSIidMwvwEhuBLPcpZkb/Q/Ag8=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Quit2" , "scNdtWjkMrgtwBdXiS809HfOY+2+ycPqUAgH6RcFOfk=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_Vasebreaker_button" , "QPWZp3PBXeJK8y9Pu7euFoRNVsywdr5tCC6gOsKmlL8=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_vasebreaker_highlight" , "VGJtLoUZ4+EYlQUMHSOAUFYPwFr30w5/NLyl0G4Ba2Q=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_WoodSign1" , "CPf6iaNv3ftvdOMQwm/gJ8hXE/13KeS+GHzEBl6DrpM=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_WoodSign2" , "8Lr0ONZOInR+ZHz9ZQHHdr6e4jkARbxkDIm181Q/yWM=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_WoodSign2_press" , "8JALSm+TKjNzIAtOd6DXJjkjc0bqEBXhPqlTO6sKZ0c=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_ZenGarden" , "b8bJJeKpQJhesrxy3c3JconWq1RJkMwkOBOi1JcKkUA=" },
{ "Localization\\Korean\\Textures\\Menu\\SelectorScreen_ZenGardenHighlight" , "CwZAzOBJFFY9AG2tvPN58JggPNNEws9zEbcgMlsWEpc=" },
{ "Localization\\Korean\\Textures\\Menu\\SZW" , "ONrElpWA/7WkJq833t+slKToiieJtZhbz2dv2QSuQB0=" },
{ "Localization\\Korean\\Textures\\Menu\\thanks" , "HYnZf9x5uNG5tu5jga94X9+rILjt40bnKSR1qjkXF8M=" },
{ "Localization\\Korean\\Textures\\Menu\\travel" , "T/ngmCI6ilQ6k/pV2XZloY5OICc0bbKz0iwg/mcXpPw=" },
{ "Localization\\Korean\\Textures\\Menu\\钥匙经典" , "iO5Z+/6R8Pz1GoIh+TX5KWkCFJsOxfYYrMSV//9UJ34=" },
{ "Localization\\Korean\\Textures\\Particles\\Doom" , "FqBUBeIvzyyXL+cqO4Fi6CKI5gZW5QXfHYPTOYoeteM=" },
{ "Localization\\Korean\\Textures\\Particles\\ExplosionPowie" , "cuikfX+3LOtSw3EPB6DnjANO5bKkoYCMdWSm+StmW70=" },
{ "Localization\\Korean\\Textures\\Particles\\ExplosionSpudow" , "4pJ/gZsuKRsAbUL1YWsaaJC9NxrzhqUiQe6glK07ydU=" },
{ "Localization\\Korean\\Textures\\Particles\\guang" , "kh0dcDxOXgh8+Eq1TmKdJug5PdR+nzZrK5iS5Nkw7Gw=" },
{ "Localization\\Korean\\Textures\\Particles\\Sproing" , "WtzrUuUsjp/GmOfoHApij3VLMn+Tr5qUZ6GGqqhUyD0=" },
{ "Localization\\Korean\\Textures\\Particles\\SunExplosionPowie" , "3bSjOYpanuLnsl58oYUzOAXt94nony6Drq8qdpfRSGQ=" },
{ "Localization\\Korean\\Almanac\\LawnStringsTranslate" , "KRMiSTM91FoCR9sTGJU6hvsh0+sBMyHfqXwTSSea27M=" },
{ "Localization\\Korean\\Almanac\\ZombieStringsTranslate" , "xHI2LAW0JSEZN010GZPhPB60N0Csfbev2Mk5RwWFYyQ=" },
{ "Localization\\Korean\\Almanac\\AchievementsTextTranslate" , "J4/ZjY7vFNvwsMBx5eIwP7syuLD/+D7OaTY+YbUnq6s=" },
// Custom Textures
{ "[Custom Textures]\\Almanac_GroundDay" , "ruvrVDVaICj+5PzN5FIcLTma+GtTb2AuKkHA42jTVBw=" },
{ "[Custom Textures]\\Almanac_GroundNight" , "uwrsmHM/IFY1n+AkYYmgEhoWRoaefOjP6sQMCWLtJ2s=" },
{ "[Custom Textures]\\Almanac_GroundNightPool" , "MQrZAvJDWs7k0c8cQjeNp5WNfB1Yns54Wqib63Glhsg=" },
{ "[Custom Textures]\\Almanac_GroundPool" , "fgHaxsX/KUXzAuRTLE7itRtmjPJ8YPo01Sy6Y2O5XWU=" },
{ "[Custom Textures]\\Almanac_PlantCard" , "1Spu2IG3EoCLn0MhAwMxydN2E8xcffFVfnKGk0KowLY=" },
{ "[Custom Textures]\\Almanac_ZombieBack" , "PUxcz+EA7ehsPkyA3gsicvaANh+7vX56yKbrCNFd8cI=" },
{ "[Custom Textures]\\Almanac_ZombieCard" , "S3QeUIrxZ3BJiovEyHBz0AYIoVzT2mQ1JA5hN3Ke8B0=" },
{ "[Custom Textures]\\Almanac_ZombieWindow" , "0JHTUpc1HdZ8/s/4NVKnchFmyrUaXgTgv3kUwS18zKo=" },
{ "[Custom Textures]\\Almanac_ZombieWindow2" , "NA9+T0M/4BihrNsGQVQCyxX2IO8xuyIKCm1PT6aB/vc=" },
{ "[Custom Textures]\\CursorClick" , "cELLXJkEQM+ULhcuL3GXdJ6Lw9iJF0grx3NuSfI3iGE=" },
{ "[Custom Textures]\\CursorDefault" , "AfBSPF65+ZXswrGKH5NRB/b5oa4WR5vuIet3xQ9/hqc=" },
{ "[Custom Textures]\\plant" , "JqOyre0JXBHjvWqUafUaBEfym62ZVhte6sP68TDn4xQ=" },
{ "[Custom Textures]\\SeedChooser_Background" , "RBVMr9F/IJiTVV9G9iZyUQguN6c+fQGb1BUoyuAKbyY=" },
{ "[Custom Textures]\\seedfog" , "l4gO/839bvGY3zk1/JPHPrZiD5sqVq0dCnCflUr/ilQ=" },
{ "[Custom Textures]\\seedp" , "amr82tmtplngahLPlu4wdPlq5adTKqUMXZoZ9qJ6u1U=" },
{ "[Custom Textures]\\SeedPacketSilhouette" , "W6vow+euXzdwjAufkJuRtdaIEiEPmbeeOkOHiQBNmHA=" },
{ "[Custom Textures]\\SeedPacket_Larger" , "+TZxcpkpyz49vmlkTAYyohpQuneLwrw1eJdYpbN6wAs=" },
{ "[Custom Textures]\\SeedPacket_Night" , "0pv9hCIOuoj9wfH2FP18kNwLkYUz0wuxVs3zl3OiHC0=" },
{ "[Custom Textures]\\SeedPacket_Other" , "Y/xlegVxGFn6Dt1nsDAEFSnslM3lyQ6WyCSl7RfwA5k=" },
{ "[Custom Textures]\\SeedPacket_Pool" , "4m5EDn8xfUtrZ/qENCISIRbZVQEjgk9UN1//AelB1Tw=" },
{ "[Custom Textures]\\seedroof" , "z9o/8qUJkgtys4WmPRvCt/wJz056+0Fjvfvk6pHwbLo=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\CursorClick" , "4sKy7/xqFJqS/HVR1jUgMNvcPQdv6argIePfdcRhoIk=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\CursorDefault" , "zuNjht1GXgF/fOKCnW7KnOOaccjHRDB9m6giJvkKz1Q=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\garden_new" , "siziOyP+M2D5mI5ugtsjNI1O+zKcRqlHBDGrnSU1EV4=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\Present" , "glh2PeOuG8W1jQBiX8Xh0/4owPMGxFFXdOIc2siZ8Uo=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\PresentOpen" , "9DQZ4GIEeqoATt6MA55HEvQrBueZ3FN9raMdqOIhOUI=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\PresentOpenZ" , "BORx+RuCJUu8FLzDqdZcBFKFzMDbKB0KDZIkk4SnEmM=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\PresentZ" , "3VQDMgCU5gz1uGzQzRSatXOHd50q9nHozgkicb9wEQU=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SeedBank" , "ffJswlQikAaPhUily+jKz59tjUUsysRTyPetub7pVw4=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SeedChooser_Background" , "Z3jzRdTSxhpLU9HqeYhcDz+CfP1SerwzYteBh2gEX8M=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\seeds" , "Yaqa1lY4mMxmksslr1WjcV3vYAwrcLT6AVVHEvHS6Mw=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaf1" , "wAoIJKiNxAuEkhFW9QjUAXCbdQmq0Q5DtztG+1VWjig=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaf2" , "hRe+ceHzLid2ltXXaJsfLg3YHkb0xSwvgFh62XqUnpg=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaf3" , "sU5tHuXpjZGsDd0I5BMPmsHj0W4flayrCEhr36iudp8=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaf4" , "UnezQl5tm4gUZ3DwYCzRM85siS2dZWuo0HHx09fc/LU=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaf5" , "a73hDOb3r3gZAgpklCB2EkFjUaUbKJBXKhGT3tYosP0=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\SelectorScreen_Leaves" , "ll3lRI+y441evcV9CJoFufhI5VQeC2eIew9AFSW8xEU=" },
{ "Localization\\Spanish\\Textures\\[Custom Textures]\\ShovelBank" , "DUCNzvvDjIp8Kr8Clyx4eWwApiHiD8RmP+W05Mre+fI=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_GroundDay" , "HqSlvHQOonZvcid0jFZAj7az/P8uwKXZMT4Ukwyc8j0=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_GroundNight" , "qt947+pENaA91x4lYAYsNLcR6Xd6I1vNh/USyk45arw=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_GroundNightPool" , "A92M4I2N2OfpN/y4R40ATVBrI2U+StgZQjIr0iVCEeU=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_GroundPool" , "AmrvO/C5ggUeHr5+WOh16GWJ0jM1nXR+Vj/A87CRZ3U=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_GroundRoof" , "ftdvDcMiDrdIBIoOTcxU6b9qT+GmPEkH2+tG2HA8blk=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_PlantCard" , "1Spu2IG3EoCLn0MhAwMxydN2E8xcffFVfnKGk0KowLY=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_ZombieBack" , "PUxcz+EA7ehsPkyA3gsicvaANh+7vX56yKbrCNFd8cI=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_ZombieCard" , "S3QeUIrxZ3BJiovEyHBz0AYIoVzT2mQ1JA5hN3Ke8B0=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_ZombieWindow" , "0JHTUpc1HdZ8/s/4NVKnchFmyrUaXgTgv3kUwS18zKo=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\Almanac_ZombieWindow2" , "NA9+T0M/4BihrNsGQVQCyxX2IO8xuyIKCm1PT6aB/vc=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\plant" , "Q5VaxJhSrv/z55FH7YmLBovhYV3zLux887J0IdOpwnc=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedChooser_Background" , "jnVWbr791bRlpO5CYQ5ZC2WPH4d7j8O4ODW41hA88nk=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\seedfog" , "fyjLtioDqCumbQuOl+4jgUYFqK+cATeOzoNl1qgRttI=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\seedp" , "8qE/ZB7wdjFq6bNr6jWeCsVhhUD+JWORmpXryejDmjI=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedPacketSilhouette" , "W6vow+euXzdwjAufkJuRtdaIEiEPmbeeOkOHiQBNmHA=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedPacket_Larger" , "TtCGi5F02Qx/ix9OXY86bMNjHCdch1E7De9wMTp3JIs=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedPacket_Night" , "3QSOoNwMue9tK30JgCea/K2pGDlDv+Ibhp0NKRoZHN0=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedPacket_Other" , "7tjrV9SIzPaSEpMspdF7tKANXMu6ggeuj4XSy/UVACM=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\SeedPacket_Pool" , "U4zfEwx/0mUqIgUYvuQ10T+tWTqJ54V3RUJiA1+FJts=" },
{ "Localization\\Portuguese\\Textures\\[Custom Textures]\\seedroof" , "1W6A3m32iSQZ5WhJHK11tys1OQOvYLgdNGlUOe7wgnY=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_IndexBack" , "S8wmWen4Za178Mkwwu8DJkKvvB2c2CRJbaRjIW/zvhw=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_PlantCard" , "O2UWyplpXK69pTFXYDSA5KiRyKAZ22LCDN71GIb5ZDg=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_ZombieBack" , "L91uR40W1iPLqBd+ouENStDe9RN+xUOZtbF048MiD1U=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_ZombieCard" , "3QvRtOtCpI6sqh26+Zbr9vTR9RB8oSXy4m7iS2snZUI=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_ZombieWindow" , "+LHsQLlwsYWEVS11F+SustquGoxjbGiyrs58XwyeYMw=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\Almanac_ZombieWindow2" , "e51IJA1bz9dDEvmXtO6CeL6/M6KMXDvojCbTz2MtnLk=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\garden_new" , "WxH9rTrIHkmQeu0ALKfFuI6JvXo1uKQlwvgIc72+lhI=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\plant" , "ZkLNZASMXf7P0621AH2sFm3rbulCrs7otMLrrxiaqsA=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedBank" , "+5f20e56ArqQ3Mt2BXtpSM2vO7SV+mWOzIBalIEh4Ew=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedChooser_Background" , "kjv++O/zFxvPVoObxFTLXsH2MIp3zae4UJ8zu8kVOhY=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedChooser_Button" , "9d5FghH0XRShLwjivvcKtVqmlOQLZC/RqfT+Urv8PJo=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedChooser_Button_Disabled" , "iTsQO62+/80kG4jELlTnB/AXA8wvQKnqCgvQS4pDVlY=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedChooser_Button_Glow" , "cFJCF740SGrFKt7c5OOAcRSVdW5ZZ6sBuE+T3JSwgOU=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\seedfog" , "JFjRJErflXFgxgxXXGHr6fjLaVIpoYSS0hlWa5Fi09c=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\seedlinkage" , "3IAYdQXkrWvDMBpg5Zw4ZRU39zuY9OAd3lVhwp07aMk=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\seedp" , "oaPa7rvvRy+pP3yUvA82hSNJ9/LQIZ+RVGPfCYvaLUg=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedPacketSilhouette" , "ca+mkPyRnAjVIZZRieUCHFV2t3qiJnX2YQnd/z3iTvs=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedPacket_Larger" , "mFoaC4FBXiufdw/aG0SCLlxzpE1umDx3robELsUPhi8=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedPacket_Night" , "KZEvxdx4nQnrYVPv8FY4DbVDAQBCjlllMnxXQHJ1gkE=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedPacket_Other" , "EP7WPPrYdZvxAhRig/FBJWHEw67amJuOO9JO0Kqzh14=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\SeedPacket_Pool" , "8eLUx9OWZORq3ItJcbQltcsyc6oPAW9PThEHoul/LY0=" },
{ "Localization\\Javanese\\Textures\\[Custom Textures]\\seedroof" , "HhNxpjbMgvt2FZdZZ7kfl546x6+5B4B97DgSH80wkMg=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_IndexBack" , "DagukR2bViPz88Iu2B5w4QDMs4ykui/BYdk+lyaTK2o=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_PlantCard" , "O2UWyplpXK69pTFXYDSA5KiRyKAZ22LCDN71GIb5ZDg=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_ZombieBack" , "L91uR40W1iPLqBd+ouENStDe9RN+xUOZtbF048MiD1U=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_ZombieCard" , "3QvRtOtCpI6sqh26+Zbr9vTR9RB8oSXy4m7iS2snZUI=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_ZombieWindow" , "+LHsQLlwsYWEVS11F+SustquGoxjbGiyrs58XwyeYMw=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\Almanac_ZombieWindow2" , "e51IJA1bz9dDEvmXtO6CeL6/M6KMXDvojCbTz2MtnLk=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\garden_new" , "WxH9rTrIHkmQeu0ALKfFuI6JvXo1uKQlwvgIc72+lhI=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\plant" , "ZkLNZASMXf7P0621AH2sFm3rbulCrs7otMLrrxiaqsA=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedBank" , "+5f20e56ArqQ3Mt2BXtpSM2vO7SV+mWOzIBalIEh4Ew=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedChooser_Background" , "kjv++O/zFxvPVoObxFTLXsH2MIp3zae4UJ8zu8kVOhY=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedChooser_Button" , "9d5FghH0XRShLwjivvcKtVqmlOQLZC/RqfT+Urv8PJo=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedChooser_Button_Disabled" , "iTsQO62+/80kG4jELlTnB/AXA8wvQKnqCgvQS4pDVlY=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedChooser_Button_Glow" , "cFJCF740SGrFKt7c5OOAcRSVdW5ZZ6sBuE+T3JSwgOU=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\seedfog" , "JFjRJErflXFgxgxXXGHr6fjLaVIpoYSS0hlWa5Fi09c=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\seedlinkage" , "3IAYdQXkrWvDMBpg5Zw4ZRU39zuY9OAd3lVhwp07aMk=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\seedp" , "oaPa7rvvRy+pP3yUvA82hSNJ9/LQIZ+RVGPfCYvaLUg=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedPacket_Larger" , "mFoaC4FBXiufdw/aG0SCLlxzpE1umDx3robELsUPhi8=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedPacket_Night" , "KZEvxdx4nQnrYVPv8FY4DbVDAQBCjlllMnxXQHJ1gkE=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedPacket_Other" , "EP7WPPrYdZvxAhRig/FBJWHEw67amJuOO9JO0Kqzh14=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\SeedPacket_Pool" , "8eLUx9OWZORq3ItJcbQltcsyc6oPAW9PThEHoul/LY0=" },
{ "Localization\\Indonesian\\Textures\\[Custom Textures]\\seedroof" , "HhNxpjbMgvt2FZdZZ7kfl546x6+5B4B97DgSH80wkMg=" },
#endif
};
static string GetCheckSum(string filename)
{
using (var md5 = SHA256.Create())
{
byte[] bytes = md5.ComputeHash(File.ReadAllBytes(filename));
return Convert.ToBase64String(bytes);
}
}
public static void SaveCheckSum()
{
string stringDir = GetAssetDir(AssetType.Dumps);
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
string checkSumString = JsonSerializer.Serialize(checkSums, new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(Path.Combine(stringDir, "MD5.json"), checkSumString);
}
public static void SaveModifiedChecksum()
{
string stringDir = GetAssetDir(AssetType.Dumps);
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
string modifiedCheckSumString = JsonSerializer.Serialize(modifiedCheckSums, new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(Path.Combine(stringDir, "Modified_MD5.json"), modifiedCheckSumString);
}
public static bool IsModified(string filepath)
{
string fileName = Path.GetFileNameWithoutExtension(filepath);
string directory = Path.GetDirectoryName(filepath);
string slicedFilePath = directory.Substring(directory.IndexOf("PvZ_Fusion_Translator\\") + "PvZ_Fusion_Translator\\".Length);
string slicedKey = Path.Combine(slicedFilePath, fileName);
#if DEBUG
if (!checkSums.ContainsKey(slicedKey))
{
checkSums.Add(slicedKey, GetCheckSum(filepath));
SaveCheckSum();
modifiedCheckSums.Add(slicedKey, GetCheckSum(filepath));
SaveModifiedChecksum();
}
else
{
if ((checkSums[slicedKey] != GetCheckSum(filepath)))
{
checkSums[slicedKey] = GetCheckSum(filepath);
modifiedCheckSums.Add(slicedKey, GetCheckSum(filepath));
SaveModifiedChecksum();
}
}
#elif RELEASE
if (!checkSums.ContainsKey(slicedKey) | (checkSums[slicedKey] != GetCheckSum(filepath)))
{
return true;
}
#endif
return false;
}
public static void ConvertMD5Json()
{
string stringDir = GetAssetDir(AssetType.Dumps);
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
string checksumDumpPath = Path.Combine(stringDir, "MD5.json");
string checksumConvertPath = Path.Combine(stringDir, "MD5Convert.txt");
string json = File.ReadAllText(checksumDumpPath);
Dictionary<string, string> dictionary = DeserializeObject<Dictionary<string, string>>(json);
using StreamWriter writer = new StreamWriter(checksumConvertPath);
foreach (var kvp in dictionary)
{
string checksumKey = kvp.Key.Replace("\\", "\\\\");
writer.WriteLine($"{{ \"{kvp.Key}\" , \"{kvp.Value}\" }},");
}
Log.LogDebug($"MD5.json converted to MD5Convert.json at {checksumConvertPath}");
}
}
}
#endif

View file

@ -1,193 +0,0 @@
using TMPro;
using System.Collections.Generic;
using System.IO;
namespace PvZ_Fusion_Translator__BepInEx_.AssetStore
{
public static class FontStore
{
internal static Dictionary<string, TMP_FontAsset> fontAssetDict = [];
internal static Dictionary<string, TMP_FontAsset> fontAssetDictSecondary = [];
internal static void Init()
{
// Clear existing dictionaries to prevent duplicate key errors
fontAssetDict.Clear();
fontAssetDictSecondary.Clear();
string fontsDir = Path.Combine(Core.Instance.modsDirectory, "[Custom Fonts]");
#if MULTI_LANGUAGE
foreach (string file in Directory.GetFiles(fontsDir))
{
string fileName = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
if (fileExtension == ".ttf" || fileExtension == ".otf")
{
if (!fileName.EndsWith("_Almanac") && !fileName.EndsWith("_Fallback"))
{
string fontPath = Path.Combine("PvZ_Fusion_Translator", "[Custom Fonts]", fileName + fileExtension);
TMP_FontAsset fontAsset = FontHandler.LoadTMPFont(fontPath, true);
fontAsset.name = fileName;
if (!fontAssetDict.ContainsKey(fileName))
{
fontAssetDict.Add(fileName, fontAsset);
}
Log.LogInfo($"Font for language '{fileName}' loaded");
}
}
}
InitFallback();
#else
string defaultFontDir = Path.Combine("PvZ_Fusion_Translator", "[Custom Fonts]", "English.ttf");
TMP_FontAsset defaultFont = FontHandler.LoadTMPFont(defaultFontDir, true);
fontAssetDict.Add("English", defaultFont);
#endif
}
internal static void InitFallback()
{
string fontsDir = Path.Combine(Core.Instance.modsDirectory, "[Custom Fonts]");
foreach (string file in Directory.GetFiles(fontsDir))
{
string fileName = Path.GetFileNameWithoutExtension(file);
string fileExtension = Path.GetExtension(file);
if (fileExtension == ".ttf" || fileExtension == ".otf")
{
if (fileName.EndsWith("_Almanac") || fileName.EndsWith("_Fallback"))
{
string fallbackPath = Path.Combine("PvZ_Fusion_Translator", "[Custom Fonts]", fileName + fileExtension);
TMP_FontAsset fallbackFont = FontHandler.LoadTMPFont(fallbackPath, true);
fallbackFont.name = fileName;
string fileNameLanguage = fileName.Replace("_Fallback", "").Replace("_Almanac", "");
if (fontAssetDictSecondary.ContainsKey(fileNameLanguage))
{
if (fileName.EndsWith("_Fallback"))
{
if (!fontAssetDictSecondary.ContainsKey(fileNameLanguage + "_Almanac"))
{
fontAssetDictSecondary.Add(fileNameLanguage + "_Almanac", fontAssetDictSecondary[fileNameLanguage]);
}
fontAssetDictSecondary.Remove(fileNameLanguage);
}
else
{
if (!fontAssetDictSecondary.ContainsKey(fileNameLanguage + "_Fallback"))
{
fontAssetDictSecondary.Add(fileNameLanguage + "_Fallback", fontAssetDictSecondary[fileNameLanguage]);
}
fontAssetDictSecondary.Remove(fileNameLanguage);
}
if (!fontAssetDictSecondary.ContainsKey(fileName))
{
fontAssetDictSecondary.Add(fileName, fallbackFont);
}
}
else
{
if (!fontAssetDictSecondary.ContainsKey(fileNameLanguage))
{
fontAssetDictSecondary.Add(fileNameLanguage, fallbackFont);
}
}
// Log.LogInfo($"Fallback font for language '{fileNameLanguage}' loaded");
}
}
}
AddFallback();
}
public static void AddFallback()
{
foreach (var lang in fontAssetDict.Keys)
{
if (fontAssetDict[lang].fallbackFontAssetTable == null)
{
fontAssetDict[lang].fallbackFontAssetTable = new Il2CppSystem.Collections.Generic.List<TMP_FontAsset>();
}
if (fontAssetDictSecondary.ContainsKey(lang))
{
fontAssetDict[lang].fallbackFontAssetTable.Add(fontAssetDictSecondary[lang]);
Log.LogInfo("Fallback font for language '" + lang + "' added");
continue;
}
if (fontAssetDictSecondary.ContainsKey(lang + "_Almanac"))
{
fontAssetDict[lang].fallbackFontAssetTable.Add(fontAssetDictSecondary[lang + "_Almanac"]);
Log.LogInfo("Fallback font for language '" + lang + "' added");
continue;
}
if (fontAssetDictSecondary.ContainsKey(lang + "_Fallback"))
{
fontAssetDict[lang].fallbackFontAssetTable.Add(fontAssetDictSecondary[lang + "_Fallback"]);
Log.LogInfo("Fallback font for language '" + lang + "' added");
continue;
}
}
}
#if MULTI_LANGUAGE
public static TMP_FontAsset LoadTMPFont(string language)
{
if (fontAssetDict.TryGetValue(language, out TMP_FontAsset font))
{
TMP_FontAsset fontAsset = font;
if (fontAsset.fallbackFontAssetTable != null)
{
// Log.LogInfo("Fallback font for language '" + language + "' loaded. The name of the FB Font is" + fontAsset.fallbackFontAssetTable[0].name);
}
return fontAsset;
}
return fontAssetDict.GetValueOrDefault("English");
}
#else
public static TMP_FontAsset LoadTMPFont()
{
TMP_FontAsset defaultFont = fontAssetDict["English"];
return defaultFont;
}
#endif
public static TMP_FontAsset LoadTMPFontAlmanac(string language)
{
if (fontAssetDictSecondary.ContainsKey(language))
{
if (fontAssetDictSecondary.TryGetValue(language, out TMP_FontAsset almanacAsset))
{
return almanacAsset;
}
}
if (fontAssetDictSecondary.ContainsKey(language + "_Almanac"))
{
if (fontAssetDictSecondary.TryGetValue(language + "_Almanac", out TMP_FontAsset almanacAsset))
{
return almanacAsset;
}
}
return fontAssetDict.GetValueOrDefault("English");
}
#if MULTI_LANGUAGE
public static void Reload()
{
// Get the current language
string currentLanguage = Utils.Language.ToString();
// Load the font for the current language
_ = LoadTMPFont(currentLanguage);
}
#endif
}
}

View file

@ -1,411 +0,0 @@
using TMPro;
using System.Text.RegularExpressions;
using UnityEngine;
using System.Collections.Generic;
using System.IO;
namespace PvZ_Fusion_Translator__BepInEx_.AssetStore
{
public static class StringStore
{
internal static Dictionary<string, string> stringsDict = [];
public static Dictionary<string, string> translationStringRegex = new();
public static Dictionary<string, string> translationString = new();
public static Dictionary<string, Dictionary<string, string>> patchesStore = new()
{
{ "Difficulty", new Dictionary<string, string>
{
{ "English" , "Difficulty:" },
{ "French" , "Difficulté:" },
{ "Italian" , "Difficoltà:" },
{ "German" , "Schwierigkeit:" },
{ "Spanish" , "Dificultad:" },
{ "Portuguese" , "Dificuldade:" },
{ "Filipino" , "Ang Hirap:" },
{ "Vietnamese" , "Độ Khó:" },
{ "Indonesian" , "Kesulitan:" },
{ "Russian" , "Сложность:" },
{ "Japanese" , "困難:" },
{ "Korean", "난이도:" },
{ "Javanese" , "Kesulitan:" },
{ "Polish", "Trudność:"},
{ "Hungarian", "Nehézség:"},
{ "Arabic", "صعوبة:"},
// { "Ukrainian" , "Складність:" },
// { "Slovak" , "Náročnosť:" },
}
},
{ "Zombies", new Dictionary<string, string>
{
{ "English" , "Zombies:" },
{ "French" , "Les Zombies:" },
{ "Italian" , "Zombi:" },
{ "German" , "Zombies:" },
{ "Spanish" , "Zombis:" },
{ "Portuguese" , "Zumbis:" },
{ "Filipino" , "Mga Zombie:" },
{ "Vietnamese" , "Thây Ma:" },
{ "Indonesian" , "Zombi:" },
{ "Russian" , "Зомби:" },
{ "Japanese" , "ゾンビ:" },
{ "Korean", "좀비:" },
{ "Javanese" , "Mayit:" },
{ "Polish" , "Zombi:" },
{ "Hungarian" , "Zombik:" },
{ "Arabic" , "الزومبي:" },
// { "Ukrainian" , "Зомбі:" },
// { "Slovak" , "Zombíci:"}
}
}
};
internal static void Init()
{
FileLoader.LoadStrings();
}
internal static void Reload()
{
translationString.Clear();
translationStringRegex.Clear();
FileLoader.LoadStrings();
}
public static TextMeshPro TranslateText(TextMeshPro originalTMP, bool isLog = false)
{
#if MULTI_LANGUAGE
string currentLanguage = Utils.Language.ToString();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage);
#else
TMP_FontAsset fontAsset = FontStore.LoadTMPFont();
#endif
string translatedText = TranslateText(originalTMP.text);
originalTMP.font = fontAsset;
originalTMP.text = translatedText;
return originalTMP;
}
public static TextMeshProUGUI TranslateText(TextMeshProUGUI originalTMP, bool isLog = false)
{
#if MULTI_LANGUAGE
string currentLanguage = Utils.Language.ToString();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage);
#else
TMP_FontAsset fontAsset = FontStore.LoadTMPFont();
#endif
string translatedText = TranslateText(originalTMP.text);
originalTMP.font = fontAsset;
originalTMP.text = translatedText;
return originalTMP;
}
public static string TranslateText(string originalText, bool isLog = false)
{
string text = DoTranslateText(originalText, false);
string checkText;
#if DEBUG
Regex regex = new("\\p{IsCJKUnifiedIdeographs}+");
Match match = regex.Match(text);
if(match.Success)
{
// Log.LogDebug("Untranslated String: " + match.Value);
FileLoader.DumpUntranslatedStrings(text);
}
#endif
checkText = text;
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");
#if DEBUG
FileLoader.DumpUntranslatedStrings(originalText);
#endif
return originalText;
}
}
public static string TranslateColorText(string originalText, bool isLog = false)
{
string pattern = @"(<color[^>]*>.*?</color>)";
if (TestRegex(originalText, pattern))
{
return DoTranslateText(originalText, isLog);
}
return originalText;
}
public static string DoTranslateText(string originalText, bool isLog = false)
{
if (string.IsNullOrEmpty(originalText))
{
if (isLog)
Log.LogError("Text Null or Empty");
return string.Empty;
}
if (translationString.ContainsKey(originalText))
{
if (isLog)
Log.LogDebug($"Text '{originalText} found in translationString");
return translationString[originalText];
}
// Regex-based dynamic translation
foreach (var entry in translationStringRegex)
{
if (TestRegex(originalText, entry.Key))
{
// Extract dynamic parts from the original text
var regex = new Regex(entry.Key);
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(entry.Value, [.. dynamicParts]);
}
}
if (isLog)
Log.LogDebug($"Text '{originalText}' not translated");
return originalText;
}
public static bool TestRegex(string originalText, string pattern)
{
return Regex.IsMatch(originalText, pattern);
}
private static TextAlignmentOptions TextAnchorToTMPAlignment(TextAnchor anchor)
{
return anchor switch
{
TextAnchor.UpperLeft => TextAlignmentOptions.TopLeft,
TextAnchor.UpperCenter => TextAlignmentOptions.Top,
TextAnchor.UpperRight => TextAlignmentOptions.TopRight,
TextAnchor.MiddleLeft => TextAlignmentOptions.MidlineLeft,
TextAnchor.MiddleCenter => TextAlignmentOptions.Center,
TextAnchor.MiddleRight => TextAlignmentOptions.MidlineRight,
TextAnchor.LowerLeft => TextAlignmentOptions.BottomLeft,
TextAnchor.LowerCenter => TextAlignmentOptions.Bottom,
TextAnchor.LowerRight => TextAlignmentOptions.BottomRight,
_ => TextAlignmentOptions.Center
};
}
public static TextMeshProUGUI ConvertToTextMeshPro(UnityEngine.UI.Text oldText, TMP_FontAsset fontAsset, bool isLog = false)
{
if (oldText == null)
{
Log.LogError("UnityEngine.UI.Text component is null.");
return null;
}
if (fontAsset == null)
{
Log.LogError("TMP_FontAsset is null. Conversion cannot proceed.");
return null;
}
// Log.LogInfo($"Converting UnityEngine.UI.Text: {oldText.name}");
GameObject textObject = oldText.gameObject;
// Preserve text content and settings
string originalText = oldText.text;
originalText = TranslateText(originalText, isLog);
TextAnchor alignment = oldText.alignment;
Color color = oldText.color;
// Remove old Text component
UnityEngine.Object.DestroyImmediate(oldText);
// Add TextMeshProUGUI component
TextMeshProUGUI newTMP = textObject.AddComponent<TextMeshProUGUI>();
if (newTMP == null)
{
Log.LogError($"Failed to add TextMeshProUGUI to object: {textObject.name}");
return null;
}
// Configure TextMeshProUGUI
newTMP.text = originalText;
newTMP.color = color;
newTMP.alignment = TextAnchorToTMPAlignment(alignment);
newTMP.font = fontAsset;
// Log.LogInfo($"Successfully converted {textObject.name} to TextMeshProUGUI.");
return newTMP;
}
public static void TranslateTextTransform(Transform baseTransform, bool isAutoTextContainer = false, bool isLog = false)
{
if (!baseTransform) return;
#if MULTI_LANGUAGE
string currentLanguage = Utils.Language.ToString();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage);
#else
TMP_FontAsset fontAsset = FontStore.LoadTMPFont();
#endif
if (fontAsset == null)
{
#if MULTI_LANGUAGE
Log.LogError($"Font for language '{currentLanguage}' not found. Translation aborted.");
#else
Log.LogError("Font not found. Translation aborted.");
#endif
return;
}
// Local function for processing transforms
void ProcessTextTransform(Transform textTransform)
{
if (!textTransform) return;
// Handle TextMeshPro components
TextMeshPro textTMP = textTransform.GetComponent<TextMeshPro>();
if (textTMP)
{
textTMP.text = TranslateText(textTMP.text, isLog);
textTMP.autoSizeTextContainer = isAutoTextContainer;
textTMP.font = fontAsset;
}
TextMeshProUGUI textTMPUGUI = textTransform.GetComponent<TextMeshProUGUI>();
if (textTMPUGUI)
{
textTMPUGUI.text = TranslateText(textTMPUGUI.text, isLog);
textTMPUGUI.enableAutoSizing = isAutoTextContainer;
textTMPUGUI.font = fontAsset;
}
// Handle UnityEngine.UI.Text components
UnityEngine.UI.Text textUI = textTransform.GetComponent<UnityEngine.UI.Text>();
if (textUI)
{
ConvertToTextMeshPro(textUI, fontAsset, isLog);
}
}
// Process specific text paths
ProcessTextTransform(baseTransform.Find("text"));
ProcessTextTransform(baseTransform.Find("text1"));
// ProcessTextTransform(baseTransform.Find("text2"));
Transform shadowTransform = baseTransform.Find("text/shadow");
if (shadowTransform) ProcessTextTransform(shadowTransform);
shadowTransform = baseTransform.Find("text1/shadow");
if (shadowTransform) ProcessTextTransform(shadowTransform);
#if TESTING
Transform childTransform = baseTransform.GetChild(0);
if (childTransform) ProcessTextTransform(childTransform);
#endif
}
public static void TranslateTextUI(TextMeshPro textTMP, bool? isAutoTextContainer = null, bool isLog = false)
{
string currentLanguage = Utils.Language.ToString();
if (textTMP)
{
textTMP.text = TranslateText(textTMP.text, isLog);
if (isAutoTextContainer!=null) textTMP.autoSizeTextContainer = isAutoTextContainer.Value;
textTMP.font = FontStore.LoadTMPFont(currentLanguage);
}
}
public static void TranslateTextUI(TextMeshProUGUI textTMP, bool? isAutoTextContainer = null, bool isLog = false)
{
string currentLanguage = Utils.Language.ToString();
if (textTMP)
{
string origText = textTMP.text;
textTMP.text = TranslateText(origText, isLog) == "" ? origText : TranslateText(origText, isLog);
if (isAutoTextContainer != null) textTMP.autoSizeTextContainer = isAutoTextContainer.Value;
if (origText != textTMP.text)
textTMP.font = FontStore.LoadTMPFont(currentLanguage);
}
}
public static void TranslateTextUI(TMP_InputField TextInput)
{
string currentLanguage = Utils.Language.ToString();
if (TextInput)
{
string oriText = TextInput.m_Text;
TextInput.m_Text = TranslateText(oriText);
TextInput.m_OriginalText = TranslateText(oriText);
TextInput.fontAsset = FontStore.LoadTMPFont(currentLanguage);
}
}
public static void LogAll()
{
Log.LogInfo("Logging all StringStore entries.");
Log.LogInfo("Regex Entries: {0}", translationStringRegex.Count);
Log.LogInfo("String Entries: {0}", translationString.Count);
}
}
}

View file

@ -1,77 +0,0 @@
using System.Collections.Generic;
using System.Collections;
using UnityEngine;
using System.IO;
namespace PvZ_Fusion_Translator__BepInEx_.AssetStore
{
public static class TextureStore
{
internal static Dictionary<string, string> textureDict = [];
internal static Dictionary<string, string> spriteDict = [];
internal static void Init() => FileLoader.LoadTextures();
internal static void Reload()
{
textureDict.Clear();
#if MULTI_LANGUAGE
RestoreTextures();
#endif
if(!Utils.customTextures)
{
FileLoader.LoadDefaultTextures();
}
FileLoader.LoadTextures();
}
public static IEnumerator ReplaceTexturesCoroutine()
{
if (!Utils.customTextures)
{
FileLoader.LoadDefaultTextures();
}
while (true)
{
ReplaceTextures();
yield return new WaitForSeconds(0.5f); // Adjust this interval as needed
}
}
public static void ReplaceTextures()
{
Texture2D[] textures = Resources.FindObjectsOfTypeAll<Texture2D>();
foreach (Texture2D texture in textures)
{
if (texture.name.StartsWith("replaced_"))
continue;
Utils.TryReplaceTexture2D(texture);
}
}
#if MULTI_LANGUAGE
public static void RestoreTextures()
{
Texture2D[] textures = Resources.FindObjectsOfTypeAll<Texture2D>();
foreach (Texture2D texture in textures)
{
if (texture != null)
{
texture.name = texture.name.Replace("replaced_", "");
}
}
}
#endif
public static void LogAll()
{
Log.LogInfo("Logging all TextureStore entries.");
foreach (KeyValuePair<string, string> entry in textureDict)
{
Log.LogInfo("TextureDict Entry: " + entry.Key + " | " + entry.Value);
}
}
}
}

View file

@ -1,218 +0,0 @@
using System.Runtime.CompilerServices;
using TMPro;
using UnityEngine;
using UnityEngine.TextCore.Text;
using System.IO;
using System.Collections.Generic;
namespace PvZ_Fusion_Translator__BepInEx_.AssetStore
{
public static class WarningStore
{
#if MULTI_LANGUAGE
private static Dictionary<string, (string, string)> warningMessages = new()
{
{ "English", ("<size=10>The only valid source of this translation is from this community:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. If you got this <i>anywhere</i> else like \n" +
"<color=#8B0000>Plants Hybrid</color> and <color=#8B0000>superhybrid.online</color>, they stole it.\n" +
"Stray away from other sources as they may contain viruses.\n" +
"Please visit our community for future updates.</size>",
"Okay! Got it.") },
{ "French", ("<size=9.5>La seule source valide pour cette traduction provient de cette\n" +
"communauté :<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Si vous l'avez obtenue \n" +
"<i>ailleurs</i>, comme <color=#8B0000>Plants Hybrid</color> ou <color=#8B0000>superhybrid.online</color>, ils l'ont volée.\n" +
"Évitez les autres sources, car elles peuvent contenir des virus.\n" +
"Veuillez visiter notre communauté pour les mises à jour futures.",
"D'accord !") },
{ "Italian", ("<size=10>L'unica fonte valida di questa traduzione è questa community:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Se l'hai ottenuta <i>altrove</i>, come \n" +
"<color=#8B0000>Plants Hybrid</color> e <color=#8B0000>superhybrid.online</color>, l'hanno rubata.\n" +
"Evita altre fonti, potrebbero contenere virus.\n" +
"Visita la nostra community per aggiornamenti futuri.</size>",
"Va bene! Ho capito.") },
{ "German", ("<size=10>Die einzige gültige Quelle für diese Übersetzung stammt aus\n" +
"dieser Community: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Wenn Sie diese \n" +
"<i>irgendwo</i> anders gefunden haben, z. B. bei <color=#8B0000>Plants Hybrid</color> oder \n" +
"<color=#8B0000>superhybrid.online</color>, dann haben sie sie gestohlen.\n" +
"Meiden Sie andere Quellen, da diese Viren enthalten könnten.\n" +
"Bitte besuchen Sie unsere Community für zukünftige Updates.",
"Okay, verstanden!") },
{ "Spanish", ("<size=10>La única fuente válida de esta traducción proviene de esta\n" +
"comunidad: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Si la obtuvo <i>en cualquier</i>\n" +
"otro lugar como <color=#8B0000>Plants Hybrid</color> o <color=#8B0000>superhybrid.online</color>, la robaron.\n" +
"Manténgase alejado de otras fuentes, ya que podrían contener virus.\n" +
"Por favor, visite nuestra comunidad para futuras actualizaciones.",
"¡Entendido!") },
{ "Portuguese", ("<size=10>O lugar original e seguro dessa tradução vem daqui:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Se você baixou ela de <i>qualquer \n" +
"lugar</i> como <color=#8B0000>Plants Hybrid</color> ou <color=#8B0000>superhybrid.online</color>, eles\n" +
"roubaram. Evite baixar deles, pode conter vírus.\n" +
"Por favor, visite nossa comunidade para atualizações futuras.</size>",
"Okay, entendido.") },
{ "Filipino", ("<size=9>Ang tanging opisyal na source ng pagsasaling ito ay mula\n" +
"lamang dito: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Kung nakuha nmo ito <i>kahit \n" +
"saan pa</i> tulad ng <color=#8B0000>Plants Hybrid</color> at <color=#8B0000>superhybrid.online</color>, ito ay ninakaw. \n" +
"Lumayo sa ibang source dahil posibleng may kasamang virus.\n" +
"Paki-bisita ang aming komunidad para sa mga darating na update.</size>" ,
"Naiintindihan!") },
{ "Vietnamese", ("<size=8>Nguồn duy nhất hợp lệ của bản dịch này là từ cộng\n" +
"đồng này: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Nếu bạn nhận \n" +
"được nó <i>ở bất cứ nơi nào</i> khác như <color=#8B0000>Plants Hybrid</color> \n" +
"hoặc <color=#8B0000>superhybrid.online</color>, họ đã ăn cắp nó.\n" +
"Tránh xa các nguồn khác vì chúng có thể chứa \n" +
"virus. Hãy ghé thăm cộng đồng của chúng tôi để \n" +
"cập nhật trong tương lai.</size>",
"Đồng ý!") },
{ "Indonesian", ("<size=10>Satu-satunya sumber resmi dari terjemahan ini adalah \n" +
"komunitas kami: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Jika Anda \n" +
"mendapatkannya dari <i>sumber lain</i> seperti <color=#8B0000>Plants Hybrid</color> \n" +
"dan <color=#8B0000>superhybrid.online</color>, mereka mencurinya. \n" +
"Jauhi sumber lain karena mungkin ada virus.\n" +
"Silakan kunjungi komunitas kami untuk pembaruan berikutnya.</size>",
"Oke! Mengerti.") },
{ "Russian", ("<size=9>Единственный проверенный источник этого перевода —\n" +
"сообщество <color=#E6E6FA>discord.gg/DPAC5ZVJ8T</color>.\n" +
"Или же его замена <color=#E6E6FA>https://t.me/nekoshkindom</color>\n" +
"Если вы скачали этот мод <i>где-либо ещё</i>, возможно он содержит вирусы.\n" +
"Программист перевода: LancerX0.\n" +
"Переводчик: Nekosha.", "Хорошо!") },
{ "Japanese", ("<size=6>この翻訳の唯一の有効なソースは、このコミュニティからです:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>.<color=#8B0000>Plants Hybrid</color>や<color=#8B0000>superhybrid.online</color>、\n" +
"<color=#8B0000>YoutubeのBlue Fly</color>が作っているもの、他のどこかでこれを入手した場合、\n" +
"彼らはそれを盗んだことになります。ウイルスが含まれている可能性があるので、\n" +
"他のソースからは離れてください。今後のアップデートについては、\n私たちのコミュニティをご覧ください。</size>",
"了解しました!") },
{ "Korean", ("<size=8>이 번역은 Bloom(<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>)에서만\n" +
"제공됩니다. Bloom 디스코드 이외의 다른</i>서드 파티 사이트, \n" +
"예를 들어 <color=#8B0000>Plants Hybrid</color> 및 <color=#8B0000>superhybrid.online</color>, 또는\n" +
"<color=#8B0000>유튜브 Blue Fly</color>등에서 제공하는 파일은 무단으로 재배포된 것이며,\n" +
"이런 사이트들에는 바이러스가 포함되어 있을 가능성이 높습니다. \n향후 업데이트를 위해 저희 디스코드를 방문해 주세요.",
"확인") },
{ "Javanese" , ("<size=10>Sumber mung sing sah kanggo terjemahan iki saka komunitas iki:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Yen sampeyan nemokake iki <i>ing papan\n" +
"liya</i> kaya <color=#8B0000>Plants Hybrid</color> lan <color=#8B0000>superhybrid.online</color>, iku dicolong.\n" +
"Aja nyedhaki sumber liya amarga bisa ngandhut virus. Mangga\n" +
"ngunjungi komunitas kita kanggo nganyari ing mangsa ngarep.</size>",
"Oke! Ngertos.") },
{ "Polish" , ("<size=8>Jedynym wiarygodnym źródłem tego tłumaczenia jest ta społeczność:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Jeśli znalazłeś to <i>gdziekolwiek</i> indziej, np. \n" +
"<color=#8B0000>Plants Hybrid</color> i <color=#8B0000>superhybrid.online</color>, ukradli to.\n" +
"Omijaj inne źródła, ponieważ mogą zawierać wirusy.\n" +
"Odwiedź naszą społeczność, aby uzyskać przyszłe aktualizacje.</size>",
"Okay! Rozumiem.") },
{ "Hungarian" , ("<size=8>Ennek a fordításnak az egyetlen érvényes forrása ebből a közösségből származik:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Ha ezt <i>valahol</i> máshol szerezted, például \n" +
"<color=#8B0000>Plants Hybrid</color> és <color=#8B0000>superhybrid.online</color> oldalakon, akkor ők lopták.\n" +
"Kerüld a többi forrást, mert vírusokat tartalmazhatnak.\n" +
"Kérjük, látogass el közösségünkbe a jövőbeli frissítésekért.</size>",
"Oké! Értem.") },
{ "Arabic" , ("<size=10>The only valid source of this translation is from this community:\n" +
"<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. If you got this <i>anywhere</i> else like \n" +
"<color=#8B0000>Plants Hybrid</color> and <color=#8B0000>superhybrid.online</color>, they stole it.\n" +
"Stray away from other sources as they may contain viruses.\n" +
"Please visit our community for future updates.</size>",
"Okay! Got it.") },
// { "OTHER" , ("<size=10>A única fonte válida dessa tradução é desta\ncomunidade: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Se você obteve \nisso <i>em qualquer lugar</i> como <color=#8B0000>Plants Hybrid</color>\ne <color=#8B0000>superhybrid.online</color>,ou Blue Fly do Youtube,\nelses roubaram. Fique longe de sites falsos. Por favor,\nvisite nossa comunidade para futuras atualizações.</size>", "¡Okei! Entendido.") }
// { "OTHER" , ("<size=9.5>Ang translation na ito ay galing dito lamang:\n<color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Pag nakuha niyo ito <i>sa iba pa</i>\nkagaya ng <color=#8B0000>Plants Hybrid</color> o <color=#8B0000>superhybrid.online</color>, anumang\nginawagawa ng <color=#8B0000>Blue Fly mula sa Youtube</color>, o anumang\n<color=#8B0000>Sub2Unlock links</color>, scam sila. MAG INGAT dahil\nkasi baka may virus 'jan. Join kayo sa discord namin!\nFilipino Translation by ColinPogi</size>" , "Tayo magsi-laro!") }
};
#else
public static string warningMessage = "<size=10>La única fuente válida de esta traducción proviene de esta\ncomunidad: <color=#64DD17>discord.gg/DPAC5ZVJ8T</color>. Si la obtuvo <i>en cualquier</i>\notro lugar como <color=#8B0000>Plants Hybrid</color> o <color=#8B0000>superhybrid.online</color>, la robaron.\nManténgase alejado de otras fuentes, ya que podrían contener virus.\nPor favor, visite nuestra comunidad para futuras actualizaciones.";
public static string okayButton = "¡Entendido!";
#endif
#if MULTI_LANGUAGE
public static (string, string) GetWarningMessage(Utils.LanguageEnum language)
{
if (warningMessages.TryGetValue(language.ToString(), out var message))
{
return message;
}
else
{
return warningMessages["English"]; // Default to English if language code is not found
}
}
#endif
public static void WarningLoad(NoticeMenu noticeMenu)
{
//GameAPP.theGameStatus = GameStatus.OpenOptions;
//GameObject gameObject = UnityEngine.Object.Instantiate<GameObject>(Resources.Load<GameObject>("UI/Prefabs/NoticePauseMenu"), GameAPP.canvas.transform);
//gameObject.name = "WarningMessage";
//TextMeshProUGUI warning = gameObject.transform.GetChild(0).GetChild(0).GetComponent<TextMeshProUGUI>();
//TextMeshProUGUI warningShadow = gameObject.transform.GetChild(0).GetChild(1).GetComponent<TextMeshProUGUI>();
//Transform button = gameObject.transform.GetChild(1);
//warning.transform.position = new Vector3(0.7f, 0.4f, 0f);
//warningShadow.transform.position = new Vector3(0.7f, 0.4f, 0f);
#if MULTI_LANGUAGE
var (warningMessage, okayButton) = WarningStore.GetWarningMessage(Utils.Language);
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
Transform warningTransform = noticeMenu.transform.FindChild("窗口");
Transform warningTextTransform = warningTransform.FindChild("文字");
Transform warningTextShadowTransform = warningTransform.FindChild("文字2");
Transform[] array = [warningTextTransform, warningTextShadowTransform];
for (int i = 0; i < array.Length; i++)
{
if (array[i] != null)
{
array[i].GetComponent<TextMeshProUGUI>().text = warningMessage;
array[i].GetComponent<TextMeshProUGUI>().font = fontAsset;
}
}
#endif
//warning.text = warningMessage;
//warningShadow.text = warningMessage;
//warning.font = FontStore.LoadTMPFont(Utils.Language.ToString());
//warningShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString());
//button.GetComponent<PauseMenu_Btn>().buttonNumber = 10;
//button.GetChild(0).GetComponent<TextMeshProUGUI>().text = okayButton;
//button.GetChild(0).GetComponent<TextMeshProUGUI>().font = FontStore.LoadTMPFont(Utils.Language.ToString());
//button.GetChild(1).GetComponent<TextMeshProUGUI>().text = okayButton;
//gameObject.SetActive(false);
//gameObject.SetActive(true);
}
#if MULTI_LANGUAGE
public static bool isWarningMessageLoaded = false;
public static void WarningReload(Utils.LanguageEnum language, NoticeMenu noticeMenu)
{
// Log.LogInfo("Current Language is " + Utils.OldLanguage);
// Log.LogInfo("Changed Language to " + language);
if (Utils.OldLanguage.ToString() == language.ToString() && Utils.OldLanguage.ToString() != "English")
{
return;
}
if (!isWarningMessageLoaded)
{
WarningLoad(noticeMenu);
isWarningMessageLoaded = true;
}
return;
}
#else
public static bool isWarningMessageLoaded = false;
public static void WarningReload()
{
if (!WarningStore.isWarningMessageLoaded)
{
WarningStore.WarningLoad();
WarningStore.isWarningMessageLoaded = true;
}
}
#endif
}
}

View file

@ -1,185 +0,0 @@
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using BepInEx.Unity.IL2CPP.Utils;
using TMPro;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_.Patches.Managers;
using System;
using System.IO;
using System.Reflection;
using UnityEngine;
[BepInPlugin("PVZFusionTranslator_BepInEx", "PvZ Fusion Translator", "3.1.1")]
[BepInProcess("PlantsVsZombiesRH.exe")]
public class Core : BasePlugin
{
public string modsDirectory => Path.Combine(Paths.PluginPath, "PvZ_Fusion_Translator");
private static DateTime dtStart;
private static DateTime? dtStartToast;
private static string toast_txt;
public new static ManualLogSource Log;
public static Core Instance { get; private set; }
public static MonoBehaviour MonoInstance { get; private set; }
private Coroutine replaceTextureRoutine = null;
public ConfigEntry<bool> configDefaultTextures;
public ConfigEntry<bool> configDefaultAudio;
public ConfigEntry<string> configLanguage;
private static float lastCheck = 0f;
private static float checkTime = 0f;
private static float checkInterval = 2f;
private static bool stringreloaded = false;
public override void Load()
{
Log = base.Log;
Instance = this;
LoadConfig();
MonoInstance = AddComponent<UnityCoroutineHelper>();
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly());
dtStart = DateTime.Now;
FileLoader.LoadLanguage();
AudioStore.Init();
TextureStore.Init();
StringStore.Init();
FontStore.Init();
Utils.RegisterPlantIndices();
//Utils.RegisterRecipeLinks();
//PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects.Zombie_Patch.LoadHPStrings();
InitCoroutine();
}
public override bool Unload()
{
if (replaceTextureRoutine != null)
{
MonoInstance.StopCoroutine(replaceTextureRoutine);
Log.LogDebug("Coroutine Stopped");
}
FileLoader.SaveLanguage();
#if OBFUSCATE && !RELEASE
CheckSumStore.ConvertMD5Json();
#endif
return true;
}
public void InitCoroutine()
{
replaceTextureRoutine = MonoInstance.StartCoroutine(TextureStore.ReplaceTexturesCoroutine());
}
public static void ShowToast(string message)
{
toast_txt = message;
dtStartToast = DateTime.Now;
}
public void OnUpdate()
{
ModFeatures.OnLateUpdate();
if (Input.GetKeyDown(KeyCode.Insert))
{
Log.LogInfo("Insert press");
Utils.OpenSaveDirectory();
}
if (Input.GetKeyDown(KeyCode.Delete))
{
Log.LogInfo("del del");
Utils.OpenTrello();
}
if (TowerManager.Instance != null)
{
TowerManager_Patch.UpdateText();
}
if (Input.GetKeyDown(KeyCode.RightShift))
{
stringreloaded = !stringreloaded;
}
Core.DebugStringReload();
}
public static void DebugStringReload()
{
if (stringreloaded == true)
{
checkTime += Time.deltaTime;
if (checkTime >= checkInterval)
{
StringStore.Reload();
ShowToast("Strings Reloaded!");
checkTime = 0f;
}
}
}
public void OnGUI()
{
#if DEBUG
if (dtStartToast != null)
{
try
{
GUI.Button(new Rect(10f, 10f, 200f, 20f), "\n" + toast_txt + "\n");
}
catch(Exception e)
{
Log.LogError(e);
}
TimeSpan? timeSpan = DateTime.Now - dtStartToast;
TimeSpan t = new TimeSpan(0, 0, 2);
if (timeSpan > t)
{
dtStartToast = null;
}
}
#endif
}
private void LoadConfig()
{
string mainCategory = "PvZ_Fusion_Translator";
if(Config.TryGetEntry<bool>(new ConfigDefinition(mainCategory, "DefaultTextures"), out configDefaultTextures) == false)
{
configDefaultTextures = Config.Bind(new ConfigDefinition(mainCategory, "DefaultTextures"), false, new ConfigDescription("Use Default Textures + Translation Textures", new AcceptableValueList<bool>(true, false)));
}
bool defaultTextures = Config.TryGetEntry<bool>(new ConfigDefinition("PvZ_Fusion_Translator", "DefaultTextures"), out configDefaultTextures);
if (Config.TryGetEntry<bool>(new ConfigDefinition(mainCategory, "DefaultAudio"), out configDefaultAudio) == false)
{
configDefaultAudio = Config.Bind(new ConfigDefinition(mainCategory, "DefaultAudio"), false, new ConfigDescription("Use Default Audio", new AcceptableValueList<bool>(true, false)));
}
bool defaultAudio = Config.TryGetEntry<bool>(new ConfigDefinition("PvZ_Fusion_Translator", "DefaultAudio"), out configDefaultAudio);
if (Config.TryGetEntry<string>(new ConfigDefinition(mainCategory, "Language"), out configLanguage) == false)
{
configLanguage = Config.Bind(new ConfigDefinition(mainCategory, "Language"), "English", new ConfigDescription("Load the Game in this Language", new AcceptableValueList<string>("English", "French", "Italian", "German", "Spanish", "Portuguese", "Indonesian", "Vietnamese", "Javanese", "Russian", "Japanese", "Korean")));
}
bool language = Config.TryGetEntry<string>(new ConfigDefinition("PvZ_Fusion_Translator", "Language"), out configLanguage);
}
}
public class UnityCoroutineHelper : MonoBehaviour
{
public static UnityCoroutineHelper Instance { get; private set; }
public void Awake()
{
Instance = this;
}
}

View file

@ -1,382 +0,0 @@
using BepInEx.Configuration;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_.Patches.OtherManagers;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.Encodings.Web;
using System.Text.Json;
using UnityEngine;
using UnityEngine.Rendering;
namespace PvZ_Fusion_Translator__BepInEx_
{
internal static class FileLoader
{
internal enum AssetType
{
Textures,
Strings,
Dumps,
Almanac,
Sprites
}
public static string GetAssetDir(AssetType assetType, Utils.LanguageEnum? language = null)
{
string languagePath = language.HasValue ? ("Localization" + Path.DirectorySeparatorChar + language.ToString()) : string.Empty;
return Path.Combine(Core.Instance.modsDirectory, languagePath, assetType.ToString());
}
// private static string GetAssetDir(AssetType assetType) => Path.Combine(Core.Instance.modsDirectory, assetType.ToString());
#if MULTI_LANGUAGE
internal static void LoadStrings() => LoadStrings(Utils.Language);
internal static void LoadStrings(Utils.LanguageEnum language)
#else
internal static void LoadStrings(bool isLog = false)
#endif
{
#if MULTI_LANGUAGE
string stringDir = GetAssetDir(AssetType.Strings, Utils.Language);
#else
string stringDir = GetAssetDir(AssetType.Strings);
#endif
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
try
{
foreach (string filepath in Directory.EnumerateFiles(stringDir, "*.json", SearchOption.AllDirectories))
{
#if OBFUSCATE
if (CheckSumStore.IsModified(filepath))
{
Log.LogError("File {0} was modified!" , filepath);
continue;
}
#endif
string fileName = Path.GetFileNameWithoutExtension(filepath);
StringStore.stringsDict[fileName] = filepath;
#if DEBUG
Log.LogInfo("Loading File : " + filepath);
#endif
string jsonString = File.ReadAllText(filepath);
if (fileName.EndsWith("_strings"))
{
Dictionary<string, string> dictionary = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(jsonString);
foreach (var (key, value) in dictionary)
{
StringStore.translationString[key] = value;
}
}
else if (fileName.EndsWith("_regexs"))
{
Dictionary<string, string> dictionary = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, string>>(jsonString);
foreach (var (key, value) in dictionary)
{
StringStore.translationStringRegex[key] = value;
}
}
}
SaveStrings();
DumpJson();
}
catch (Exception e)
{
Log.LogError("Error loading string.");
Log.LogError(e.GetType() + " " + e.Message);
}
Log.LogInfo("Strings loaded successfully.");
}
internal static void LoadTextures()
{
// Default or Custom Texturse -> English Textures -> Localized Textures
try
{
if (Utils.customTextures)
{
LoadCustomTextures();
}
else
{
LoadDefaultTextures();
}
}
catch (Exception e)
{
Log.LogError("Error loading texture setting.");
Log.LogError($"{e.GetType()} {e.Message}");
}
#if MULTI_LANGUAGE
if (Utils.Language != Utils.LanguageEnum.English)
{
LoadLocalizedTextures(Utils.LanguageEnum.English);
}
LoadLocalizedTextures(Utils.Language);
#else
LoadLocalizedTextures();
#endif
Log.LogInfo("Textures loaded successfully.");
}
internal static void LoadLocalizedTextures(Utils.LanguageEnum? language = null)
{
ConfigEntry<bool> defaultTextureEntry;
Core.Instance.Config.TryGetEntry<bool>(new ConfigDefinition("PvZ_Fusion_Translator", "DefaultTextures"), out defaultTextureEntry);
string textureDir = GetAssetDir(AssetType.Textures, language);
if (!Directory.Exists(textureDir))
{
Directory.CreateDirectory(textureDir);
}
try
{
foreach (string filepath in Directory.EnumerateFiles(textureDir, "*.png", SearchOption.AllDirectories))
{
if (filepath.Contains("[Custom Textures]", StringComparison.OrdinalIgnoreCase) && defaultTextureEntry.Value)
{
continue;
}
#if OBFUSCATE
if (CheckSumStore.IsModified(filepath))
{
Log.LogError("File {0} was modified!" , filepath);
continue;
}
#endif
#if DEBUG
Log.LogDebug("Loading File : " + filepath);
#endif
Texture2D texture2D = Utils.LoadImage(filepath);
TextureStore.textureDict[Path.GetFileNameWithoutExtension(filepath)] = filepath;
}
}
catch (Exception e)
{
Log.LogError("Error loading Texture.");
Log.LogError(e.GetType() + " " + e.Message);
}
}
internal static void LoadDefaultTextures()
{
if (Core.Instance.configDefaultTextures.Value)
{
string textureDefaultDir = Path.Combine(Core.Instance.modsDirectory, AssetType.Dumps.ToString(), "Default Textures [Do Not Remove]");
if (!Directory.Exists(textureDefaultDir))
{
Directory.CreateDirectory(textureDefaultDir);
}
try
{
foreach (string filepath in Directory.EnumerateFiles(textureDefaultDir, "*.png", SearchOption.AllDirectories))
{
#if OBFUSCATE
if (CheckSumStore.IsModified(filepath))
{
Log.LogError("File {0} was modified!" , filepath);
continue;
}
#endif
Texture2D texture2D = Utils.LoadImage(filepath);
TextureStore.textureDict[Path.GetFileNameWithoutExtension(filepath)] = filepath;
}
}
catch (Exception e)
{
Log.LogError("Error loading Texture.");
Log.LogError(e.GetType() + " " + e.Message);
}
}
}
internal static void LoadCustomTextures()
{
string texturePackDir = Path.Combine(Core.Instance.modsDirectory, "[Custom Textures]");
if (!Directory.Exists(texturePackDir))
{
Directory.CreateDirectory(texturePackDir);
}
try
{
foreach (string filepath in Directory.EnumerateFiles(texturePackDir, "*.png", SearchOption.AllDirectories))
{
#if OBFUSCATE
if (CheckSumStore.IsModified(filepath))
{
Log.LogError("File {0} was modified!" , filepath);
continue;
}
#endif
Texture2D texture2D = Utils.LoadImage(filepath);
TextureStore.textureDict[Path.GetFileNameWithoutExtension(filepath)] = filepath;
}
}
catch (Exception e)
{
Log.LogError("Error loading Texture.");
Log.LogError(e.GetType() + " " + e.Message);
}
}
internal static void SaveStrings()
{
#if MULTI_LANGUAGE
string stringDir = GetAssetDir(AssetType.Strings, Utils.Language);
#else
string stringDir = GetAssetDir(AssetType.Strings);
#endif
if (!Directory.Exists(stringDir))
{
Directory.CreateDirectory(stringDir);
}
string translationStringRegex = System.Text.Json.JsonSerializer.Serialize(StringStore.translationStringRegex, new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(Path.Combine(stringDir, "translation_regexs.json"), translationStringRegex);
string translationString = System.Text.Json.JsonSerializer.Serialize(StringStore.translationString, new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
});
File.WriteAllText(Path.Combine(stringDir, "translation_strings.json"), translationString);
}
public static void DumpJson()
{
string dumpDir = GetAssetDir(AssetType.Dumps);
if (!Directory.Exists(dumpDir))
{
Directory.CreateDirectory(dumpDir);
}
string LawnStrings = Resources.Load<TextAsset>("LawnStrings").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, "ZombieStrings.json"), ZombieStrings);
File.WriteAllText(Path.Combine(dumpDir, "AbyssBuffData.json"), AbyssBuffData);
Dictionary<Achievement, AchievementObject> achievementsList = new Dictionary<Achievement, AchievementObject>();
foreach (var entry in AchievementClip.achievementsText)
{
var key = entry.Key;
var value = entry.Value;
achievementsList.Add(key, new AchievementObject(key, value.Item1, value.Item2));
}
File.WriteAllText(Path.Combine(dumpDir, "AchievementsText.json"), JsonSerializer.Serialize(achievementsList, new JsonSerializerOptions
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
}));
}
//#if DEBUG
public static void DumpUntranslatedStrings(string text)
{
string dumpDir = GetAssetDir(AssetType.Dumps);
string jsonFile = Path.Combine(dumpDir, "UntranslatedStrings.json");
if (!Directory.Exists(dumpDir))
{
Directory.CreateDirectory(dumpDir);
}
if (!File.Exists(jsonFile))
{
File.WriteAllText(jsonFile, "{}"); // Initialize empty JSON object
}
string json = File.ReadAllText(jsonFile);
var untranslatedStrings = JsonSerializer.Deserialize<Dictionary<string, string>>(json);
if (!untranslatedStrings.ContainsKey(text))
{
untranslatedStrings[text] = text;
var options = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
File.WriteAllText(jsonFile, JsonSerializer.Serialize(untranslatedStrings, options));
}
}
//#endif
#if MULTI_LANGUAGE
internal static void LoadLanguage()
{
try
{
// Load the language preference as a string and parse it into the enum
ConfigEntry<string> languageEntry;
Core.Instance.Config.TryGetEntry<string>(new ConfigDefinition("PvZ_Fusion_Translator", "Language"), out languageEntry);
string languageName = languageEntry.Value;
if (Enum.TryParse(languageName, out Utils.LanguageEnum loadedLanguage))
{
Utils.Language = loadedLanguage;
}
else
{
Log.LogWarning($"Invalid language '{languageName}' found in preferences. Falling back to English.");
Utils.Language = Utils.LanguageEnum.English; // Default fallback
}
Log.LogWarning($"Loaded language {languageName}");
}
catch (Exception e)
{
Log.LogError("Error loading language setting.");
Log.LogError($"{e.GetType()} {e.Message}");
}
Log.LogInfo($"Language has been loaded: {Utils.Language}");
}
internal static void SaveLanguage()
{
try
{
// Save the current language as a string
ConfigEntry<string> languageEntry;
Core.Instance.Config.TryGetEntry<string>(new ConfigDefinition("PvZ_Fusion_Translator", "Language"), out languageEntry);
languageEntry.Value = Utils.Language.ToString();
Core.Instance.Config.Save();
// Ensure changes are written to the config file
// MelonPreferences.Save();
}
catch (Exception e)
{
Log.LogError("Error saving language setting.");
Log.LogError($"{e.GetType()} {e.Message}");
}
// Log.LogInfo($"Language has been saved: {Utils.Language}");
}
#endif
}
}

View file

@ -1,45 +0,0 @@
using BepInEx;
using PvZ_Fusion_Translator__BepInEx_;
using System.IO;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_
{
public static class FontHandler
{
public static Font LoadFont(this string pathFromModsFolder, bool throwException)
{
string fontFilePath = Path.Combine(Paths.PluginPath, pathFromModsFolder);
if (!File.Exists(fontFilePath))
{
if (throwException)
Log.LogWarning($"Font not found at path: '{fontFilePath}'.");
return null;
}
Font font = new Font();
Font.Internal_CreateFontFromPath(font, fontFilePath); // Default size, adjust as needed
return font;
}
public static TMP_FontAsset ConvertToTMP(this Font font)
{
TMP_FontAsset fontAsset = TMP_FontAsset.CreateFontAsset(font);
if (fontAsset == null)
{
Log.LogWarning($"Failed to create TMP_FontAsset from font '{font.name}'.");
return null;
}
return fontAsset;
}
public static TMP_FontAsset LoadTMPFont(this string pathFromModsFolder, bool throwException)
{
Font font = pathFromModsFolder.LoadFont(throwException);
if (font == null)
return null;
return font.ConvertToTMP();
}
}
}

View file

@ -1,25 +0,0 @@
using BepInEx.Logging;
namespace PvZ_Fusion_Translator__BepInEx_
{
internal static class Log
{
private static readonly ManualLogSource Logger = BepInEx.Logging.Logger.CreateLogSource("PvZ_Fusion_Translator");
public static void LogDebug(object txt) => Logger.LogDebug(txt);
public static void LogDebug(string txt) => Logger.LogDebug(txt);
public static void LogDebug(string txt, params object[] args) => Logger.LogDebug(string.Format(txt, args));
public static void LogInfo(object txt) => Logger.LogInfo(txt);
public static void LogInfo(string txt) => Logger.LogInfo(txt);
public static void LogInfo(string txt, params object[] args) => Logger.LogInfo(string.Format(txt, args));
public static void LogWarning(object txt) => Logger.LogWarning(txt);
public static void LogWarning(string txt) => Logger.LogWarning(txt);
public static void LogWarning(string txt, params object[] args) => Logger.LogWarning(string.Format(txt, args));
public static void LogError(object txt) => Logger.LogError(txt);
public static void LogError(string txt) => Logger.LogError(txt);
public static void LogError(string txt, params object[] args) => Logger.LogError(string.Format(txt, args));
}
}

View file

@ -1,80 +0,0 @@
//#if DEBUG
using System;
using System.Collections.Generic;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_
{
public static class ModFeatures
{
public enum ModType
{
ReloadStrings,
ReloadTextures,
}
private class ModFeature
{
public string Name { get; private set; }
public ModType ModType { get; private set; }
public KeyCode KeyCode { get; private set; }
public bool IsActive { get; set; }
public ModFeature(string name, ModType modType, KeyCode keyCode, bool defaultValue = false)
{
Name = name;
ModType = modType;
KeyCode = keyCode;
IsActive = defaultValue;
}
public void ToggleFeature()
{
if (ModType == ModType.ReloadStrings)
{
StringStore.Reload();
Core.ShowToast("Strings Reloaded!");
return;
}
if (ModType == ModType.ReloadTextures)
{
TextureStore.Reload();
Core.ShowToast("Textures Reloaded!");
return;
}
}
}
private static readonly Dictionary<ModType, ModFeature> featureLists = new()
{
{ ModType.ReloadStrings, new ModFeature("Reload Strings", ModType.ReloadStrings, KeyCode.Home, true) },
{ ModType.ReloadTextures, new ModFeature("Reload Textures", ModType.ReloadTextures, KeyCode.End, true) },
};
public static void ToggleFeature(ModType modType)
{
if (!featureLists.ContainsKey(modType))
return;
featureLists[modType].ToggleFeature();
}
public static void OnLateUpdate()
{
foreach (var feature in featureLists.Values)
{
if (feature.KeyCode != KeyCode.None && Enum.IsDefined(typeof(KeyCode), feature.KeyCode))
{
if (Input.GetKeyDown(feature.KeyCode))
{
Log.LogDebug(feature.KeyCode);
feature.ToggleFeature();
}
}
}
}
}
}
//#endif

View file

@ -1,62 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_.Patches.Managers;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.BaseTextObjects
{
[HarmonyPatch(typeof(InGameText))]
public static class InGameText_Patch
{
[HarmonyPatch(nameof(InGameText.ShowText), new Type[] { typeof(string), typeof(float), typeof(bool), typeof(bool) })]
[HarmonyPrefix]
private static void ShowText_Pre(InGameText __instance, ref string text) => text = StringStore.TranslateText(text, true);
[HarmonyPatch(nameof(InGameText.ShowText), new Type[] { typeof(string), typeof(float), typeof(bool), typeof(bool) })]
[HarmonyPostfix]
private static void ShowText_Post(InGameText __instance)
{
#if MULTI_LANGUAGE
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
#else
TMP_FontAsset fontAsset = FontStore.LoadTMPFont();
#endif
foreach (TextMeshProUGUI txt in __instance.textMeshes)
{
string travelMatch = TravelMgr_Patch.MatchTravelBuff(txt.text);
string originalText = txt.text;
if (txt.gameObject.name.Contains("shadow"))
{
continue;
}
if (travelMatch != "")
{
txt.text = travelMatch;
if (txt.gameObject.name.Contains("main"))
{
originalText = txt.text;
Transform shadowText = txt.transform.parent.Find("Text_shadow");
if (shadowText != null)
{
shadowText.GetComponent<TextMeshProUGUI>().text = Utils.RemoveColorTags(originalText);
}
}
}
else if(System.Text.RegularExpressions.Regex.Match(txt.text, @"(<color[^>]*>.*?</color>)", System.Text.RegularExpressions.RegexOptions.Singleline).Success)
{
txt.text = StringStore.TranslateColorText(txt.text);
}
else
{
txt.text = StringStore.TranslateText(txt.text, true);
}
txt.font = fontAsset;
}
}
}
}

View file

@ -1,25 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.BaseTextObjects
{
[HarmonyPatch(typeof(TMP_InputField))]
public static class TMP_InputField_Patch
{
[HarmonyPatch(nameof(TMP_InputField.OnEnable))]
[HarmonyPostfix]
private static void OnEnable(TMP_InputField __instance)
{
if (!string.IsNullOrEmpty(__instance.text))
{
string text = StringStore.TranslateText(__instance.text);
__instance.m_Text = StringStore.TranslateText(text);
__instance.m_OriginalText = StringStore.TranslateText(text);
__instance.m_TextComponent.text = StringStore.TranslateText(text);
}
}
}
}

View file

@ -1,97 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_.Patches.Managers;
using UnityEngine.UI;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.BaseTextObjects
{
[HarmonyPatch(typeof(TextMeshProUGUI))]
public static class TextMeshProUGUI_Patch
{
[HarmonyPatch(nameof(TextMeshProUGUI.OnEnable))]
[HarmonyPostfix]
private static void OnEnable(TextMeshProUGUI __instance)
{
if (!string.IsNullOrEmpty(__instance.text))
{
if(__instance.transform.parent.parent != null)
{
if (__instance.transform.parent.parent.name.Contains("AbyssBagMenu"))
{
return;
}
}
__instance = StringStore.TranslateText(__instance);
__instance.autoSizeTextContainer = false;
if (__instance.name.StartsWith("LevelName"))
{
__instance.text = __instance.text.Replace("\n", " ");
if (__instance.name == "LevelName2" || __instance.name == "LevelName3")
{
TowerManager_Patch.updatedText.Add(__instance.transform);
}
}
if (__instance.transform.parent != null && __instance.transform.parent.name.StartsWith("Window"))
{
__instance.fontSizeMin = 10;
__instance.fontSize = 12;
}
// __instance.ForceMeshUpdate();
}
}
[HarmonyPatch(nameof(TextMeshProUGUI.Awake))]
[HarmonyPostfix]
private static void Awake(TextMeshProUGUI __instance)
{
if (!string.IsNullOrEmpty(__instance.text))
{
if (__instance.transform.parent.parent != null)
{
if (__instance.transform.parent.parent.name.Contains("AbyssBagMenu"))
{
return;
}
}
__instance = StringStore.TranslateText(__instance);
__instance.autoSizeTextContainer = false;
if (__instance.transform.parent != null && __instance.transform.parent.name.StartsWith("Window"))
{
__instance.fontSizeMin = 10;
__instance.fontSize = 12;
}
if (__instance.text == "Полный Хаос" && __instance.transform.parent.parent.Find("Image").GetComponent<Image>().activeSprite.name == "Present")
{
__instance.text += "\nБесконечно";
}
// __instance.ForceMeshUpdate();
}
}
}
[HarmonyPatch(typeof(TMP_SubMeshUI))]
public static class TMP_SubMeshUI_Patch
{
[HarmonyPatch(nameof(TMP_SubMeshUI.OnEnable))]
[HarmonyPostfix]
public static void OnEnable(TMP_SubMeshUI __instance)
{
if (!string.IsNullOrEmpty(__instance.textComponent.text))
{
string text = StringStore.TranslateText(__instance.textComponent.text);
__instance.m_TextComponent.text = StringStore.TranslateText(text);
__instance.textComponent.text = StringStore.TranslateText(text);
}
}
}
}

View file

@ -1,30 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.BaseTextObjects
{
[HarmonyPatch(typeof(TextMeshPro))]
public static class TextMeshPro_Patch
{
[HarmonyPatch(nameof(TextMeshPro.OnEnable))]
[HarmonyPostfix]
private static void OnEnable(TextMeshPro __instance)
{
if (!string.IsNullOrEmpty(__instance.text))
{
if (__instance.transform.parent.name.StartsWith("AlmanacHelp") || __instance.transform.parent.name.StartsWith("CardBank"))
{
__instance = StringStore.TranslateText(__instance);
__instance.autoSizeTextContainer = false;
return;
} else if (!(__instance.transform.name.Contains("AlmanacZombie") || __instance.transform.name.Contains("AlmanacPlant") || __instance.transform.name.Contains("Name") || __instance.transform.name.Contains("Tips") || __instance.transform.parent.name.Contains("Signboard") || __instance.transform.parent.name.Contains("text")))
{
__instance = StringStore.TranslateText(__instance);
__instance.autoSizeTextContainer = true;
}
}
}
}
}

View file

@ -1,110 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.Json;
using System.Text.RegularExpressions;
using HarmonyLib;
//using MelonLoader.TinyJSON;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_;
using TMPro;
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];
}
else
{
string translatedRegex = TranslateAbyssBuffRegex(text.text);
if (translatedRegex != null)
{
text.text = translatedRegex;
}
}
text.font = fontAsset;
}
}
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);
}
public static string TranslateAbyssBuffRegex(string originalText)
{
foreach (var x in abyssBuffData)
{
if (x.Key.Contains("{value}"))
{
string pattern = Regex.Escape(x.Key).Replace("\\{value}", "(\\d+)");
if (Regex.IsMatch(originalText, pattern))
{
var regex = new Regex(pattern);
var match = regex.Match(originalText);
return String.Format(x.Value.Replace("value", "0"), match.Groups[1].Value);
}
}
}
return null;
}
}
}

View file

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

View file

@ -1,49 +0,0 @@
//using System.Text.RegularExpressions;
//using HarmonyLib;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using TMPro;
//using PvZ_Fusion_Translator__BepInEx_.AssetStore;
//using UnityEngine.TextCore.Text;
//namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
//{
// [HarmonyPatch(typeof(AbyssDevelopMenu))]
// public static class AbyssDevelopMenu_Patch
// {
// [HarmonyPatch(nameof(AbyssDevelopMenu.UpdateInfo))]
// [HarmonyPostfix]
// private static void UpdateInfo(AbyssDevelopMenu __instance)
// {
// __instance.currentMoney.text = StringStore.TranslateText(__instance.currentMoney.text);
// __instance.upgradeTextInfo.text = StringStore.TranslateText(__instance.upgradeTextInfo.text);
// TextMeshProUGUI upgradeCostText = __instance.transform.FindChild("UpgradeCost").GetComponent<TextMeshProUGUI>();
// TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
// string regexStr = "([^\\s]+)\n当前等级:([^\\s]+)\n\n升级条件:\n([^\\s]+)\n\n升级消耗:([^\\s]+)";
// Regex regex = new Regex(regexStr);
// if (regex.IsMatch(upgradeCostText.text))
// {
// Match match = regex.Match(upgradeCostText.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);
// }
// upgradeCostText.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]);
// upgradeCostText.font = fontAsset;
// }
// }
// }
//}

View file

@ -1,49 +0,0 @@
using HarmonyLib;
using System;
using System.Collections.Generic;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using Unity.VisualScripting;
using UnityEngine;
using System.Text.RegularExpressions;
using UnityEngine.UI;
using PvZ_Fusion_Translator__BepInEx_;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AbyssMenu))]
public static class AbyssMenu_Patch
{
[HarmonyPatch(nameof(AbyssMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AbyssMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.levelInfo)
{
txt.text = StringStore.TranslateText(txt.text, false);
txt.font = fontAsset;
}
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = fontAsset;
}
}
[HarmonyPatch(nameof(AbyssMenu.UpdateLevelInfo))]
[HarmonyPostfix]
private static void UpdateLevelInfo(AbyssMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.levelInfo)
{
txt.text = StringStore.TranslateText(txt.text, pattern: "第(\\d+)关\n场景:([^\\s]+)\n总波数:(\\d+)波\n特殊环境:([^\\s]+)\n难度:(\\d+)");
txt.font = fontAsset;
}
}
}
}

View file

@ -1,57 +0,0 @@
using System.Text.RegularExpressions;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects
{
[HarmonyPatch(typeof(AbyssSelectBuffWindow))]
public static class AbyssSelectBuffWindow_Patch
{
[HarmonyPatch(nameof(AbyssSelectBuffWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(AbyssSelectBuffWindow __instance)
{
TranslateBuffWindow(__instance);
}
[HarmonyPatch(nameof(AbyssSelectBuffWindow.SetBuff))]
[HarmonyPostfix]
private static void SetBuff(AbyssSelectBuffWindow __instance)
{
TranslateBuffWindow(__instance);
}
public static void TranslateBuffWindow(AbyssSelectBuffWindow __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
AbyssBuffMenu_Patch.LoadAbyssBuffData();
foreach (TextMeshProUGUI titleText in __instance.titleText)
{
if (AbyssBuffMenu_Patch.abyssBuffData.ContainsKey(titleText.text))
{
if (titleText.name.Contains("shadow"))
{
titleText.text = Utils.RemoveColorTags(AbyssBuffMenu_Patch.abyssBuffData[titleText.text]);
}
else
{
titleText.text = AbyssBuffMenu_Patch.abyssBuffData[titleText.text];
}
}
titleText.font = fontAsset;
}
string translatedIntroduceText = (AbyssBuffMenu_Patch.abyssBuffData.ContainsKey(__instance.introduce.text)) ? AbyssBuffMenu_Patch.abyssBuffData[__instance.introduce.text] : AbyssBuffMenu_Patch.TranslateAbyssBuffRegex(__instance.introduce.text);
if (translatedIntroduceText != null)
{
__instance.introduce.text = translatedIntroduceText;
__instance.introduce.font = fontAsset;
}
}
}
}

View file

@ -1,55 +0,0 @@
//using HarmonyLib;
//using System;
//using System.Collections.Generic;
//using TMPro;
//using PvZ_Fusion_Translator__BepInEx_.AssetStore;
//using Unity.VisualScripting;
//using UnityEngine;
//using System.Text.RegularExpressions;
//namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
//{
// [HarmonyPatch(typeof(AbyssSettlementMenu))]
// public static class AbyssSettlementMenu_Patch
// {
// [HarmonyPatch(nameof(AbyssSettlementMenu.InitSettle))]
// [HarmonyPostfix]
// private static void InitSettle(AbyssSettlementMenu __instance)
// {
// TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
// 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首胜产出:(\\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非首胜无额外产出\n产出叶绿素总计:(\\d+)",
// "第(\\d+)关\n通关用时:(\\d+)分(\\d+)秒\n杀敌数量:(\\d+)\n关卡叶绿素产出:(\\d+)\n困难模式产出:(\\d+)\n非首胜无额外产出\n产出叶绿素总计:(\\d+)"
// ];
// foreach(string regexStr in regexStrList)
// {
// Regex regex = new Regex(regexStr);
// if (regex.IsMatch(__instance.settleInfo.text))
// {
// Match match = regex.Match(__instance.settleInfo.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);
// }
// __instance.settleInfo.text = string.Format(StringStore.translationStringRegex[regexStr], [.. dynamicParts]);
// __instance.settleInfo.font = fontAsset;
// }
// }
// }
// }
//}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AbyssStoreMenu))]
public static class AbyssStoreMenu_Patch
{
[HarmonyPatch(nameof(AbyssStoreMenu.Update))]
[HarmonyPostfix]
private static void UpdateInfo(AbyssStoreMenu __instance)
{
__instance.yourMoney.text = StringStore.TranslateText(__instance.yourMoney.text);
}
}
}

View file

@ -1,20 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureEvolutionMenu))]
public static class AdvantureEvolutionMenu_Patch
{
[HarmonyPatch(nameof(AdvantureEvolutionMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AdvantureEvolutionMenu __instance)
{
foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
}
}

View file

@ -1,20 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureHelpMenu))]
public static class AdvantureHelpMenu_Patch
{
[HarmonyPatch(nameof(AdvantureHelpMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AdvantureHelpMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
}
}

View file

@ -1,27 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureMenu2))]
public static class AdvantureMenu2_Patch
{
[HarmonyPatch(nameof(AdvantureMenu2.Awake))]
[HarmonyPostfix]
private static void Awake(AdvantureMenu2 __instance)
{
foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(AdvantureMenu2.AdjustDifficulty))]
[HarmonyPostfix]
private static void AdjustDifficulty(AdvantureMenu2 __instance)
{
__instance.difficulty.text = StringStore.TranslateText(__instance.difficulty.text);
}
}
}

View file

@ -1,63 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureMenu))]
public static class AdvantureMenu_Patch
{
[HarmonyPatch(nameof(AdvantureMenu.Start))]
[HarmonyPostfix]
private static void Start(AdvantureMenu __instance)
{
TranslateAdvantureMenu(__instance);
}
[HarmonyPatch(nameof(AdvantureMenu.ChangeDifficulty))]
[HarmonyPostfix]
private static void ChangeDifficulty(AdvantureMenu __instance)
{
TranslateAdvantureMenu(__instance);
}
[HarmonyPatch(nameof(AdvantureMenu.GetChapterDifficulty))]
[HarmonyPostfix]
private static void GetChapterDifficulty(AdvantureMenu __instance)
{
TranslateAdvantureMenu(__instance);
}
[HarmonyPatch(nameof(AdvantureMenu.UpdateChapterDifficulty))]
[HarmonyPostfix]
private static void UpdateChapterDifficulty(AdvantureMenu __instance)
{
TranslateAdvantureMenu(__instance);
}
[HarmonyPatch(nameof(AdvantureMenu.UpdateStarCount))]
[HarmonyPostfix]
private static void UpdateStarCount(AdvantureMenu __instance)
{
TranslateAdvantureMenu(__instance);
}
public static void TranslateAdvantureMenu(AdvantureMenu __instance)
{
bool hasSBString = StringStore.translationString.ContainsKey(__instance.difficulty.text + "_SB");
__instance.difficulty.text = Utils.RemoveSizeTags(hasSBString ? StringStore.TranslateText(__instance.difficulty.text + "_SB") : StringStore.TranslateText(__instance.difficulty.text));
__instance.chapterDifficulty.text = StringStore.TranslateText(__instance.chapterDifficulty.text);
__instance.starCount.text = StringStore.TranslateText(__instance.starCount.text);
foreach (TextMeshProUGUI text in __instance.title)
{
text.text = StringStore.TranslateText(text.text);
}
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
}
}

View file

@ -1,55 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureMissionMenu))]
public static class AdvantureMissionMenu_Patch
{
[HarmonyPatch(nameof(AdvantureMissionMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AdvantureMissionMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.contant.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateColorText(text.text);
}
//foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
//{
// text.text = StringStore.TranslateText(text.text);
//}
}
[HarmonyPatch(nameof(AdvantureMissionMenu.InitText))]
[HarmonyPostfix]
private static void InitText(AdvantureMissionMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.contant.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateColorText(text.text);
}
//foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
//{
// text.text = StringStore.TranslateText(text.text);
//}
}
[HarmonyPatch(nameof(AdvantureMissionMenu.SwitchAward))]
[HarmonyPostfix]
private static void SwitchAward(AdvantureMissionMenu __instance)
{
foreach(TextMeshProUGUI text in __instance.contant.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateColorText(text.text);
}
//foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
//{
// text.text = StringStore.TranslateText(text.text);
//}
}
}
}

View file

@ -1,60 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AdvantureStarMenu))]
public static class AdvantureStarMenu_Patch
{
[HarmonyPatch(nameof(AdvantureStarMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AdvantureStarMenu __instance)
{
foreach(TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(AdvantureStarMenu.GetNodes))]
[HarmonyPostfix]
private static void GetNodes(AdvantureStarMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(AdvantureStarMenu.UpdateStarText))]
[HarmonyPostfix]
private static void UpdateStarText(AdvantureStarMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(AdvantureStarMenu.InitTalents))]
[HarmonyPostfix]
private static void InitTalents(AdvantureStarMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
[HarmonyPatch(nameof(AdvantureStarMenu.ResetAward))]
[HarmonyPostfix]
private static void ResetAward(AdvantureStarMenu __instance)
{
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
}
}

View file

@ -1,88 +0,0 @@
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using UnityEngine.UI;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
using static PvZ_Fusion_Translator__BepInEx_.Utils;
using static PvZ_Fusion_Translator__BepInEx_.Log;
using static AlmanacPlantBank;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AlmanacPlantMenu))]
public static class AlmanacPlantMenu_Patch
{
[HarmonyPatch(nameof(AlmanacPlantMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AlmanacPlantMenu __instance)
{
TMP_FontAsset font = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>(true))
{
bool isPlantName = text.gameObject.name.Contains("Name") && text.transform.parent.name != "Background";
if (text.gameObject.name != "Description" && !isPlantName)
{
text.text = StringStore.TranslateText(text.text);
text.font = font;
text.autoSizeTextContainer = true;
}
}
// skin button resize
AlmanacPlantWindow window = __instance.window;
GameObject skinButton = window.skinButton;
GameObject skinTextObj = skinButton.transform.GetChild(0).gameObject;
GameObject skinShadowTextObj = skinTextObj.transform.GetChild(0).gameObject;
TextMeshProUGUI skinShadowText = skinShadowTextObj.GetComponent<TextMeshProUGUI>();
skinShadowText.text = StringStore.TranslateText("换肤_S");
skinButton.transform.localScale /= 1.75f;
skinButton.transform.localPosition = new Vector3(0.0f, 111.345f, 0.0f);
skinButton.transform.GetChild(1).Translate(new Vector3(-0.35f, 0));
skinButton.transform.GetChild(2).Translate(new Vector3(0.35f, 0));
}
[HarmonyPatch(nameof(AlmanacPlantMenu.SearchChanged))]
[HarmonyPrefix]
public static bool SearchChanged(AlmanacPlantMenu __instance, ref TMP_InputField inputField)
{
string search = inputField.text;
if (search != StringStore.TranslateText("搜索") && search != "")
{
string currentLanguage = Utils.Language.ToString();
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
string path = Path.Combine(almanacDir, "LawnStringsTranslate.json");
string moddedPath = Path.Combine(almanacDir, "ModdedPlantsTranslate.json");
string json;
json = File.ReadAllText(path);
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(currentLanguage);
PlantData plantData = JsonUtility.FromJson<PlantData>(json);
Il2CppSystem.Collections.Generic.List<PlantType> searchedPlants = new();
foreach (PlantInfo plantInfo in plantData.plants)
{
if (plantInfo.name.ToLower().Contains(search.ToLower()))
{
searchedPlants.Add((PlantType)plantInfo.seedType);
}
}
__instance.ShowPlants(searchedPlants);
return false;
}
return true;
}
}
}

View file

@ -1,189 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using System;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
using static PvZ_Fusion_Translator__BepInEx_.Log;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AlmanacPlantWindow))]
public static class AlmanacPlantWindow_Patch
{
[HarmonyPatch(nameof(AlmanacPlantWindow.UpdateText))]
[HarmonyPostfix]
private static void UpdateText(AlmanacPlantWindow __instance)
{
try
{
if (__instance == null)
{
Log.LogWarning("[AlmanacPlantWindow_Patch] __instance is null");
return;
}
if (__instance.showedPlantName == null || __instance.showedPlantIntroduce == null || __instance.plantTextContent == null)
{
Log.LogWarning("[AlmanacPlantWindow_Patch] Required UI components are null");
return;
}
string currentLanguage = Utils.Language.ToString();
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
string path = Path.Combine(almanacDir, "LawnStringsTranslate.json");
string moddedPath = Path.Combine(almanacDir, "ModdedPlantsTranslate.json");
if (!File.Exists(path))
{
Log.LogWarning($"[AlmanacPlantWindow_Patch] LawnStringsTranslate.json not found at: {path}");
return;
}
string json;
json = File.ReadAllText(path);
bool hasAlmanacFont = false;
TMP_FontAsset almanacFontAsset = null;
if (FontStore.fontAssetDictSecondary != null &&
(FontStore.fontAssetDictSecondary.ContainsKey(currentLanguage + "_Almanac") ||
FontStore.fontAssetDictSecondary.ContainsKey(currentLanguage)))
almanacFontAsset = FontStore.LoadTMPFontAlmanac(currentLanguage);
hasAlmanacFont = almanacFontAsset != null;
TMP_FontAsset fontAsset = null;
fontAsset = (hasAlmanacFont) ? FontStore.LoadTMPFontAlmanac(Utils.Language.ToString()) : FontStore.LoadTMPFont(Utils.Language.ToString());
AlmanacPlantBank.PlantData plantData = null;
plantData = JsonUtility.FromJson<AlmanacPlantBank.PlantData>(json);
bool foundMatch = false;
foreach (AlmanacPlantBank.PlantInfo plantInfo in plantData.plants)
{
if (plantInfo == null) continue;
if (plantInfo.seedType == (int)__instance.currentPlantType)
{
foundMatch = true;
try
{
if (__instance.showedPlantName != null)
{
foreach (TextMeshProUGUI text in __instance.showedPlantName)
{
if (text == null) continue;
text.autoSizeTextContainer = false;
string plantName = plantInfo.name ?? "";
text.text = $"{Utils.RemoveSizeTags(plantName)} ({plantInfo.seedType})";
text.font = fontAsset;
text.fontSizeMax = 21;
}
}
if (__instance.showedPlantIntroduce != null)
{
string info = plantInfo.info ?? "";
string introduce = plantInfo.introduce ?? "";
char[] toTrim = Environment.NewLine.ToCharArray();
__instance.showedPlantIntroduce.text = Utils.RemoveSizeTags(plantInfo.info) + "\n\n" + Utils.RemoveSizeTags(plantInfo.introduce) + "\n\n" + Utils.RemoveSizeTags(plantInfo.cost).TrimStart(toTrim) + "\n\n";
__instance.showedPlantIntroduce.font = fontAsset;
__instance.showedPlantIntroduce.margin = new Vector4(6, 2, 12, 0);
__instance.showedPlantIntroduce.enableWordWrapping = true;
__instance.showedPlantIntroduce.overflowMode = TextOverflowModes.ScrollRect;
Canvas.ForceUpdateCanvases();
__instance.showedPlantIntroduce.ForceMeshUpdate();
if (__instance.plantTextContent != null)
{
float textHeight = __instance.showedPlantIntroduce.preferredHeight;
__instance.plantTextContent.sizeDelta = new Vector2(__instance.plantTextContent.sizeDelta.x, textHeight);
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacPlantWindow_Patch] Error updating plant info: {ex.Message}");
}
break;
}
}
if (!foundMatch && File.Exists(moddedPath))
{
try
{
string moddedJson = File.ReadAllText(moddedPath);
if (!string.IsNullOrEmpty(moddedJson))
{
AlmanacPlantBank.PlantData moddedPlantData = JsonUtility.FromJson<AlmanacPlantBank.PlantData>(moddedJson);
if (moddedPlantData != null && moddedPlantData.plants != null)
{
foreach (AlmanacPlantBank.PlantInfo plantInfo in moddedPlantData.plants)
{
if (plantInfo == null) continue;
if (plantInfo.seedType == (int)__instance.currentPlantType)
{
try
{
if (__instance.showedPlantName != null)
{
foreach (TextMeshProUGUI text in __instance.showedPlantName)
{
if (text == null) continue;
text.autoSizeTextContainer = false;
string plantName = plantInfo.name ?? "";
text.text = $"{Utils.RemoveSizeTags(plantName)} ({plantInfo.seedType})";
text.font = fontAsset;
text.fontSizeMax = 21;
}
}
if (__instance.showedPlantIntroduce != null)
{
string info = plantInfo.info ?? "";
string introduce = plantInfo.introduce ?? "";
char[] toTrim = Environment.NewLine.ToCharArray();
__instance.showedPlantIntroduce.text = Utils.RemoveSizeTags(plantInfo.info) + "\n\n" + Utils.RemoveSizeTags(plantInfo.introduce) + "\n\n" + Utils.RemoveSizeTags(plantInfo.cost).TrimStart(toTrim) + "\n\n";
__instance.showedPlantIntroduce.font = fontAsset;
__instance.showedPlantIntroduce.margin = new Vector4(6, 2, 12, 0);
__instance.showedPlantIntroduce.enableWordWrapping = true;
__instance.showedPlantIntroduce.overflowMode = TextOverflowModes.ScrollRect;
Canvas.ForceUpdateCanvases();
__instance.showedPlantIntroduce.ForceMeshUpdate();
if (__instance.plantTextContent != null)
{
float textHeight = __instance.showedPlantIntroduce.preferredHeight;
__instance.plantTextContent.sizeDelta = new Vector2(__instance.plantTextContent.sizeDelta.x, textHeight);
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacPlantWindow_Patch] Error updating modded plant info: {ex.Message}");
}
break;
}
}
}
}
}
catch (Exception ex)
{
Log.LogWarning($"[AlmanacPlantWindow_Patch] Error reading ModdedPlantsTranslate.json: {ex.Message}");
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacPlantWindow_Patch] Unexpected error in UpdateText: {ex.Message}\n{ex.StackTrace}");
}
}
}
}

View file

@ -1,31 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using static PvZ_Fusion_Translator__BepInEx_.Log;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AlmanacZombieMenu))]
public static class AlmanacZombieMenu_Patch
{
[HarmonyPatch(nameof(AlmanacZombieMenu.Awake))]
[HarmonyPostfix]
private static void Awake(AlmanacZombieMenu __instance)
{
TMP_FontAsset font = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>(true))
{
bool isZombieName = text.gameObject.name.Contains("Name") && text.transform.parent.name != "Background";
if (text.gameObject.name != "Description" && !isZombieName)
{
text.text = StringStore.TranslateText(text.text);
text.font = font;
text.autoSizeTextContainer = true;
}
}
}
}
}

View file

@ -1,187 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using System;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
using static PvZ_Fusion_Translator__BepInEx_.Log;
using PvZ_Fusion_Translator__BepInEx_.Patches.Managers;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(AlmanacZombieWindow))]
public static class AlmanacZombieWindow_Patch
{
[HarmonyPatch(nameof(AlmanacZombieWindow.UpdateText))]
[HarmonyPostfix]
private static void UpdateText(AlmanacZombieWindow __instance)
{
try
{
string currentLanguage = Utils.Language.ToString();
string almanacDir = GetAssetDir(AssetType.Almanac, Utils.Language);
string path = Path.Combine(almanacDir, "ZombieStringsTranslate.json");
string moddedPath = Path.Combine(almanacDir, "ModdedZombiesTranslate.json");
if (!File.Exists(path))
{
Log.LogWarning($"[AlmanacZombieWindow_Patch] ZombieStringsTranslate.json not found at: {path}");
return;
}
string json;
json = File.ReadAllText(path);
bool hasAlmanacFont = false;
TMP_FontAsset almanacFontAsset = null;
if (FontStore.fontAssetDictSecondary != null &&
(FontStore.fontAssetDictSecondary.ContainsKey(currentLanguage + "_Almanac") ||
FontStore.fontAssetDictSecondary.ContainsKey(currentLanguage)))
{
almanacFontAsset = FontStore.LoadTMPFontAlmanac(currentLanguage);
hasAlmanacFont = almanacFontAsset != null;
}
TMP_FontAsset fontAsset = null;
fontAsset = (hasAlmanacFont) ? FontStore.LoadTMPFontAlmanac(Utils.Language.ToString()) : FontStore.LoadTMPFont(Utils.Language.ToString());
ZombieAlmanacData zombieAlmanacData = null;
zombieAlmanacData = JsonUtility.FromJson<ZombieAlmanacData>(json);
var zombieDataDic = ZombieDataManager.zombieDataDic;
bool foundMatch = false;
foreach (ZombieInfo zombieInfo in zombieAlmanacData.zombies)
{
if (zombieInfo == null) continue;
if (zombieInfo.theZombieType == __instance.currentZombieType)
{
foundMatch = true;
try
{
if (__instance.showedZombieName != null)
{
foreach (TextMeshProUGUI text in __instance.showedZombieName)
{
if (text == null) continue;
text.autoSizeTextContainer = false;
string zombieName = zombieInfo.name ?? "";
text.text = $"{Utils.RemoveSizeTags(zombieName)} ({(int)zombieInfo.theZombieType})";
text.font = fontAsset;
text.fontSizeMax = 21;
}
}
if (__instance.showedZombieIntroduce != null)
{
string info = zombieInfo.info ?? "";
string introduce = zombieInfo.introduce ?? "";
ZombieDataManager.ZombieData zombieData = zombieDataDic[__instance.currentZombieType];
string spawnInfo = "";
string spawnInfoFormat = StringStore.translationStringRegex["出怪等级: (\\d+)\\n出怪权重: (\\d+)"];
if(spawnInfoFormat != null)
{
spawnInfo = string.Format(spawnInfoFormat, new object[] { zombieData.summonLevel, zombieData.summonWeight }) + "\n\n";
}
__instance.showedZombieIntroduce.text = Utils.RemoveSizeTags(info) + "\n\n" + spawnInfo + Utils.RemoveSizeTags(introduce) + "\n\n";
__instance.showedZombieIntroduce.font = fontAsset;
__instance.showedZombieIntroduce.margin = new Vector4(3, 2, 12, 0);
__instance.showedZombieIntroduce.enableWordWrapping = true;
__instance.showedZombieIntroduce.overflowMode = TextOverflowModes.ScrollRect;
Canvas.ForceUpdateCanvases();
__instance.showedZombieIntroduce.ForceMeshUpdate();
if (__instance.zombieTextContent != null)
{
float textHeight = __instance.showedZombieIntroduce.preferredHeight;
__instance.zombieTextContent.sizeDelta = new Vector2(__instance.zombieTextContent.sizeDelta.x, textHeight);
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacZombieWindow_Patch] Error updating zombie info: {ex.Message}");
}
break;
}
}
if (!foundMatch && File.Exists(moddedPath))
{
try
{
string moddedJson = File.ReadAllText(moddedPath);
if (!string.IsNullOrEmpty(moddedJson))
{
ZombieAlmanacData moddedZombieData = JsonUtility.FromJson<ZombieAlmanacData>(moddedJson);
if (moddedZombieData != null && moddedZombieData.zombies != null)
{
foreach (ZombieInfo zombieInfo in moddedZombieData.zombies)
{
if (zombieInfo == null) continue;
if (zombieInfo.theZombieType == __instance.currentZombieType)
{
try
{
if (__instance.showedZombieName != null)
{
foreach (TextMeshProUGUI text in __instance.showedZombieName)
{
if (text == null) continue;
text.autoSizeTextContainer = false;
string zombieName = zombieInfo.name ?? "";
text.text = $"{Utils.RemoveSizeTags(zombieName)} ({(int)zombieInfo.theZombieType})";
text.font = fontAsset;
text.fontSizeMax = 21;
}
}
if (__instance.showedZombieIntroduce != null)
{
string info = zombieInfo.info ?? "";
string introduce = zombieInfo.introduce ?? "";
__instance.showedZombieIntroduce.text = Utils.RemoveSizeTags(info) + "\n\n" + Utils.RemoveSizeTags(introduce) + "\n\n";
__instance.showedZombieIntroduce.font = fontAsset;
__instance.showedZombieIntroduce.margin = new Vector4(3, 2, 12, 0);
__instance.showedZombieIntroduce.enableWordWrapping = true;
__instance.showedZombieIntroduce.overflowMode = TextOverflowModes.ScrollRect;
Canvas.ForceUpdateCanvases();
__instance.showedZombieIntroduce.ForceMeshUpdate();
if (__instance.zombieTextContent != null)
{
float textHeight = __instance.showedZombieIntroduce.preferredHeight;
__instance.zombieTextContent.sizeDelta = new Vector2(__instance.zombieTextContent.sizeDelta.x, textHeight);
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacZombieWindow_Patch] Error updating modded zombie info: {ex.Message}");
}
break;
}
}
}
}
}
catch (Exception ex)
{
Log.LogWarning($"[AlmanacZombieWindow_Patch] Error reading ModdedZombiesTranslate.json: {ex.Message}");
}
}
}
catch (Exception ex)
{
Log.LogError($"[AlmanacZombieWindow_Patch] Unexpected error in UpdateText: {ex.Message}\n{ex.StackTrace}");
}
}
}
}

View file

@ -1,49 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(Almanac))]
public static class Almanac_Patch
{
[HarmonyPatch(nameof(Almanac.Awake))]
[HarmonyPostfix]
private static void Awake(Almanac __instance)
{
TranslateAlmanacMenu(__instance);
}
[HarmonyPatch(nameof(Almanac.OldAlmanac))]
[HarmonyPostfix]
private static void OldAlmanac(Almanac __instance)
{
TranslateAlmanacMenu(__instance);
}
[HarmonyPatch(nameof(Almanac.AnimSwitch))]
[HarmonyPostfix]
private static void AnimSwitch(Almanac __instance)
{
TranslateAlmanacMenu(__instance);
}
public static void TranslateAlmanacMenu(Almanac __instance)
{
TMP_FontAsset font = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if (text.text == "关闭")
{
text.text = StringStore.TranslateText("合上");
}
else
{
text.text = StringStore.TranslateText(text.text);
}
text.font = font;
}
}
}
}

View file

@ -1,41 +0,0 @@
using HarmonyLib;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(BaseMenu))]
public static class BaseMenu_Patch
{
[HarmonyPatch(nameof(BaseMenu.Awake))]
[HarmonyPostfix]
private static void Awake(BaseMenu __instance)
{
TranslateBaseMenu(__instance, "Level");
TranslateBaseMenu(__instance, "Levels");
TranslateBaseMenu(__instance, "CustomLevel");
}
public static void TranslateBaseMenu(BaseMenu __instance, string levelsName)
{
Transform levels = __instance.transform.Find(levelsName);
if (levels != null)
{
List<Transform> children = levels.GetComponentsInChildren<Transform>(true).ToList();
foreach (Transform child in children)
{
if (child.name == "Nextpage" || child.name == "LastPage" || child.name == "BackToIndex")
{
StringStore.TranslateTextTransform(child);
}
}
StringStore.TranslateTextTransform(__instance.transform.Find("Goback"));
StringStore.TranslateTextTransform(__instance.transform.Find("Switich"));
}
}
}
}

View file

@ -1,27 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(Board))]
public static class Board_Patch
{
[HarmonyPatch(nameof(Board.Update))]
[HarmonyPostfix]
private static void Update(Board __instance)
{
foreach (SpriteRenderer spriteRenderer in __instance.GetComponentsInChildren<SpriteRenderer>())
{
if (spriteRenderer.sprite != null)
{
if (TextureStore.spriteDict.ContainsKey(spriteRenderer.sprite.name) && spriteRenderer.drawMode != SpriteDrawMode.Sliced)
{
spriteRenderer.drawMode = SpriteDrawMode.Sliced;
}
}
}
}
}
}

View file

@ -1,53 +0,0 @@
#if FIX
using System.Text.RegularExpressions;
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(AbyssBuffButton))]
public static class AbyssBuffButton_Patch
{
[HarmonyPatch(nameof(AbyssBuffButton.SetType))]
[HarmonyPostfix]
private static void SetType(AbyssBuffButton __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
Regex regex = new Regex("([^\\s]+)\n价格:(\\d+)");
if (regex.IsMatch(__instance.description.text))
{
Match match = regex.Match(__instance.description.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);
MelonLogger.Msg(translatedValue);
}
__instance.description.text = string.Format(StringStore.translationStringRegex["([^\\s]+)\n价格:(\\d+)"], [.. dynamicParts]);
__instance.description.font = fontAsset;
}
}
[HarmonyPatch(nameof(AbyssBuffButton.SetSold))]
[HarmonyPostfix]
private static void SetSold(AbyssBuffButton __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
__instance.description.text = StringStore.TranslateText(__instance.description.text);
__instance.description.font = fontAsset;
}
}
}
#endif

View file

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

View file

@ -1,18 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(AbyssLevelEnter))]
public static class AbyssLevelEnter_Patch
{
[HarmonyPatch(nameof(AbyssLevelEnter.SetLevel))]
[HarmonyPostfix]
private static void SetLevel(AbyssLevelEnter __instance)
{
__instance.levelName = StringStore.TranslateText(__instance.levelName);
}
}
}

View file

@ -1,26 +0,0 @@
using System.Linq;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(Advanture_Btn))]
public static class Advanture_Btn_Patch
{
[HarmonyPatch(nameof(Advanture_Btn.Start))]
[HarmonyPostfix]
private static void Start(Advanture_Btn __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
string originalKey = StringStore.translationString.FirstOrDefault(x => x.Value == txt.text).Key;
txt.text = (StringStore.translationString.ContainsKey(originalKey + "_MG")) ? StringStore.TranslateText(originalKey + "_MG") : StringStore.TranslateText(txt.text);
txt.font = fontAsset;
}
}
}
}

View file

@ -1,27 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Linq;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(CustomLevelEnter))]
public static class CustomLevelEnter_Patch
{
[HarmonyPatch(nameof(CustomLevelEnter.Start))]
[HarmonyPostfix]
private static void Start(CustomLevelEnter __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
string originalKey = StringStore.translationString.FirstOrDefault(x => x.Value == txt.text).Key;
txt.text = (StringStore.translationString.ContainsKey(originalKey + "_IZ")) ? StringStore.TranslateText(originalKey + "_IZ") : StringStore.TranslateText(txt.text);
txt.font = fontAsset;
}
}
}
}

View file

@ -1,20 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.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.translationString.ContainsKey(__instance.sceneText.text + "_FS")) ? StringStore.TranslateText(__instance.sceneText.text + "_FS") : StringStore.TranslateText(__instance.sceneText.text);
__instance.sceneText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}

View file

@ -1,20 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.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

@ -1,41 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(InGameBtn))]
public static class InGameBtn_Patch
{
[HarmonyPatch(nameof(InGameBtn.Update))]
[HarmonyPostfix]
private static void Update(InGameBtn __instance)
{
Transform sceneText = __instance.transform.FindChild("SceneText");
if(sceneText != null)
{
TextMeshProUGUI sceneTextTMP = sceneText.transform.GetComponent<TextMeshProUGUI>();
if(sceneTextTMP != null)
{
sceneTextTMP = AssetStore.StringStore.TranslateText(sceneTextTMP);
}
Transform sceneTextShadow = sceneText.transform.FindChild("SceneText");
if(sceneTextShadow != null)
{
TextMeshProUGUI sceneTextShadowTMP = sceneTextShadow.transform.GetComponent<TextMeshProUGUI>();
if (sceneTextShadowTMP != null)
{
sceneTextShadowTMP = AssetStore.StringStore.TranslateText(sceneTextShadowTMP);
}
}
}
foreach(TextMeshProUGUI text in __instance.transform.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
}
}
}
}

View file

@ -1,32 +0,0 @@
using HarmonyLib;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(MainMenu_Btn))]
public static class MainMenu_Btn_Patch
{
//[HarmonyPatch(nameof(MainMenu_Btn.OnMouseEnter))]
//[HarmonyPostfix]
//private static void OnMouseEnter(MainMenu_Btn __instance)
//{
// string textToShow = null;
// if (__instance.transform.parent.name == "recipe")
// {
// textToShow = "探索模式";
// }
// else if (__instance.name == "mysterious")
// {
// textToShow = "神秘模式";
// }
// if (textToShow != null)
// {
// InGameText.Instance.ShowText(textToShow, 2.0f);
// }
//}
}
}

View file

@ -1,26 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(NormalBtn))]
public class NormalBtn_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(NormalBtn.OnMouseUpAsButton))]
public static void OnMouseUpAsButton(NormalBtn __instance)
{
if (__instance.transform.childCount > 0)
{
Transform banTransform = __instance.transform.GetChild(0);
if (banTransform != null)
{
banTransform.GetComponent<TextMeshPro>().text = StringStore.TranslateText(banTransform.GetComponent<TextMeshPro>().text);
}
}
}
}
}

View file

@ -1,345 +0,0 @@
#if MULTI_LANGUAGE
using HarmonyLib;
using System.Collections.Generic;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using UnityEngine.UIElements;
using Object = UnityEngine.Object;
using BepInEx.Configuration;
using BepInEx;
using UnityEngine.Experimental.Rendering.RenderGraphModule;
using BepInEx.Unity.IL2CPP.Utils;
using Unity.VisualScripting.FullSerializer;
public class OptionButtonData
{
public OptionBtn Button { get; set; }
public Vector3 Position { get; set; }
public Utils.LanguageEnum? Language { get; set; } // Null if it's the "Next" button
public Utils.ToggleEnum? Toggle { get; set; } // Null if it's the "Next" button
public bool IsNextButton { get; set; }
public bool shifted = false;
}
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
internal class OptLanguageBtn_Patch
{
public static Dictionary<int, OptionButtonData> LanguageBtnDict = new();
public static Dictionary<int, OptionButtonData> ToggleBtnDict = new();
private static bool buttonsCreated = false;
private static bool togglesCreated = false;
private static OptionBtn cachedTemplateButton;
private static OptionBtn cachedTemplateToggleButton;
private const float startX = 4.3241f + 2.56f;
private const float startY = 2.7769f;
private const float ySpacing = 1.2505f;
private const float toggleStartX = 4.3241f;
private const float toggleStartY = -2.2251f;
private static List<Utils.LanguageEnum> AvailableLanguages;
private static List<Utils.ToggleEnum> AvailableToggles;
private const int LanguagesPerPage = 5;
private static int currentPage = 0;
private static OptionBtn[] buttonSlots = new OptionBtn[6]; // 5 language buttons + 1 next button
private static OptionBtn[] toggleSlots = new OptionBtn[2];
public static void CreateLanguageButtons(OptionBtn templateButton)
{
if (buttonsCreated) return;
buttonsCreated = true;
cachedTemplateButton = templateButton;
AvailableLanguages = Enum.GetValues(typeof(Utils.LanguageEnum))
.Cast<Utils.LanguageEnum>()
.Where(lang => lang != Utils.LanguageEnum.LANG_END)
.ToList();
for (int i = 0; i < 6; i++)
{
var newButton = Object.Instantiate(templateButton, templateButton.transform.parent);
newButton.optionType = 80 + i;
float yPos = startY - i * ySpacing;
Vector3 pos = new(startX, yPos);
newButton.transform.position = pos;
buttonSlots[i] = newButton;
LanguageBtnDict[newButton.GetInstanceID()] = new OptionButtonData
{
Button = newButton,
Position = pos
};
}
UpdatePage();
}
public static void CreateToggleButtons(OptionBtn templateButton)
{
if (togglesCreated) return;
togglesCreated = true;
cachedTemplateToggleButton = templateButton;
AvailableToggles = Enum.GetValues(typeof(Utils.ToggleEnum))
.Cast<Utils.ToggleEnum>()
.Where(lang => lang != Utils.ToggleEnum.TOGGLE_END)
.ToList();
for (int i = 0; i < 2; i++)
{
var newButton = Object.Instantiate(templateButton, templateButton.transform.parent);
newButton.optionType = 100 + i;
float yPos = toggleStartY - i * ySpacing;
Vector3 pos = new(toggleStartX, yPos);
newButton.transform.position = pos;
toggleSlots[i] = newButton;
ToggleBtnDict[newButton.GetInstanceID()] = new OptionButtonData
{
Button = newButton,
Position = pos
};
}
UpdatePage();
}
private static void UpdatePage()
{
int startIndex = currentPage * LanguagesPerPage;
int langCount = AvailableLanguages.Count;
int toggleCount = (togglesCreated) ? AvailableToggles.Count : 0;
for (int i = 0; i < 5; i++)
{
var btn = buttonSlots[i];
var data = LanguageBtnDict[btn.GetInstanceID()];
if (startIndex + i < langCount)
{
var lang = AvailableLanguages[startIndex + i];
data.Language = lang;
data.IsNextButton = false;
btn.gameObject.SetActive(true);
UpdateButtonText(btn, lang.ToString());
}
else
{
data.Language = null;
data.IsNextButton = false;
btn.gameObject.SetActive(false);
}
}
if (togglesCreated)
{
for (int i = 0; i < 2; i++)
{
var btn = toggleSlots[i];
var data = ToggleBtnDict[btn.GetInstanceID()];
if (i < toggleCount)
{
var toggle = AvailableToggles[i];
data.Toggle = toggle;
data.IsNextButton = false;
btn.gameObject.SetActive(true);
UpdateButtonText(btn, toggle.ToString());
}
else
{
data.Language = null;
data.IsNextButton = false;
btn.gameObject.SetActive(false);
}
}
}
// "Next" button always visible at index 5
var nextBtn = buttonSlots[5];
var nextData = LanguageBtnDict[nextBtn.GetInstanceID()];
nextData.Language = null;
nextData.IsNextButton = true;
nextBtn.gameObject.SetActive(true);
UpdateButtonText(nextBtn, "Next");
}
public static void UpdateButtonText(OptionBtn button, string languageName)
{
TMP_FontAsset defaultAsset = FontStore.LoadTMPFont("English");
for (int i = 0; i < 3; i++)
{
Transform textTransform = button.transform.GetChild(i);
if (textTransform != null)
{
if (i == 0) textTransform.gameObject.SetActive(false);
TextMeshProUGUI text = textTransform.GetComponent<TextMeshProUGUI>();
if (text != null)
{
if (i == 0)
{
text.text = "";
text.color = Color.red;
}
else
{
text.text = languageName;
}
text.fontSize = 16;
text.font = defaultAsset;
text.autoSizeTextContainer = false;
}
}
}
}
private static void FlashMessage(OptionBtn button, string message, float yShift = 0.0f)
{
var child = button.transform.GetChild(0);
if (child != null)
{
var text = child.GetComponent<TextMeshProUGUI>();
if (text != null)
{
text.text = message;
OptionButtonData data;
bool isToggle = ToggleBtnDict.TryGetValue(button.GetInstanceID(), out data);
if(isToggle)
{
text.transform.position = new Vector3(text.transform.position.x, text.transform.position.y + (ToggleBtnDict[button.GetInstanceID()].shifted ? 0.0f : yShift), text.transform.position.z);
ToggleBtnDict[button.GetInstanceID()].shifted = true;
}
else
{
text.transform.position = new Vector3(text.transform.position.x, text.transform.position.y + (LanguageBtnDict[button.GetInstanceID()].shifted ? 0.0f : yShift), text.transform.position.z);
LanguageBtnDict[button.GetInstanceID()].shifted = true;
}
}
child.gameObject.SetActive(true);
System.Threading.Tasks.Task.Delay(1000).ContinueWith(_ =>
{
if (button != null && child != null && child.gameObject.activeSelf)
{
child.gameObject.SetActive(false);
}
});
}
}
private static void ToggleCustomAssets(string type)
{
if (type != "Textures" && type != "Audio") return;
if (type == "Textures")
{
ConfigEntry<bool> customTexturesEntry;
Core.Instance.Config.TryGetEntry<bool>(new ConfigDefinition("PvZ_Fusion_Translator", "DefaultTextures"), out customTexturesEntry);
customTexturesEntry.BoxedValue = !customTexturesEntry.Value; // Toggle the config value
TextureStore.Reload();
Coroutine replaceTextureRoutine = Core.MonoInstance.StartCoroutine(TextureStore.ReplaceTexturesCoroutine());
}
if (type == "Audio")
{
ConfigEntry<bool> customAudioEntry;
Core.Instance.Config.TryGetEntry<bool>(new ConfigDefinition("PvZ_Fusion_Translator", "DefaultAudio"), out customAudioEntry);
customAudioEntry.BoxedValue = !customAudioEntry.Value; // Toggle the config value
}
Core.Instance.Config.Save();
}
[HarmonyPatch(typeof(OptionBtn))]
public static class OptLangBtn_Patch
{
[HarmonyPatch(nameof(OptionBtn.Awake))]
[HarmonyPostfix]
private static void Awake(OptionBtn __instance)
{
if (!buttonsCreated || cachedTemplateButton == null)
{
buttonsCreated = false;
togglesCreated = false;
CreateLanguageButtons(__instance);
CreateToggleButtons(__instance);
}
}
[HarmonyPatch("OnMouseUpAsButton")]
[HarmonyPrefix]
private static void OnMouseUpAsButton(OptionBtn __instance)
{
if (LanguageBtnDict.TryGetValue(__instance.GetInstanceID(), out var btnData))
{
if (btnData.IsNextButton)
{
currentPage = (currentPage + 1) % (int)Math.Ceiling((float)AvailableLanguages.Count / LanguagesPerPage);
UpdatePage();
return;
}
if (btnData.Language is Utils.LanguageEnum selectedLang)
{
string currentLang = Utils.Language.ToString();
if (currentLang == selectedLang.ToString())
{
FlashMessage(btnData.Button, "Already Selected!");
}
else
{
Utils.ChangeLanguage(selectedLang.ToString());
Debug.Log($"Language changed to: {selectedLang}");
FlashMessage(btnData.Button, "Language Changed!");
}
}
}
if (ToggleBtnDict.TryGetValue(__instance.GetInstanceID(), out var toggleData))
{
string toggleType = toggleData.Toggle.ToString();
ToggleCustomAssets(toggleType);
if (toggleType == "Textures")
{
FlashMessage(toggleData.Button, "<size=10>Toggled custom textures!", 0.1f);
}
else if (toggleType == "Audio")
{
FlashMessage(toggleData.Button, "<size=10>Toggled custom audio!", 0.1f);
}
}
}
[HarmonyPatch(nameof(OptionBtn.Update))]
[HarmonyPostfix]
private static void Update(OptionBtn __instance)
{
if (LanguageBtnDict.TryGetValue(__instance.GetInstanceID(), out var btnData))
{
btnData.Button.transform.position = btnData.Position;
}
if (ToggleBtnDict.TryGetValue(__instance.GetInstanceID(), out var toggleData))
{
toggleData.Button.transform.position = toggleData.Position;
}
}
}
}
}
#endif

View file

@ -1,69 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(OptionBtn))]
public static class OptionBtn_Patch
{
[HarmonyPatch(nameof(OptionBtn.Awake))]
[HarmonyPostfix]
private static void Awake(OptionBtn __instance)
{
Transform text_1Transform = __instance.transform.GetChild(0)?.transform;
if (text_1Transform != null)
{
TextMeshProUGUI text_1 = text_1Transform.GetComponent<TextMeshProUGUI>();
text_1 = StringStore.TranslateText(text_1);
text_1.autoSizeTextContainer = false;
}
Transform textTransform = __instance.transform.GetChild(1)?.transform;
if (textTransform != null)
{
TextMeshProUGUI text = textTransform.GetComponent<TextMeshProUGUI>();
text = StringStore.TranslateText(text);
text.autoSizeTextContainer = false;
}
Transform text2Transform = __instance.transform.GetChild(2)?.transform;
if (text2Transform != null)
{
TextMeshProUGUI text2 = text2Transform.GetComponent<TextMeshProUGUI>();
text2 = StringStore.TranslateText(text2);
text2.autoSizeTextContainer = false;
}
}
[HarmonyPatch("OnMouseUpAsButton")]
[HarmonyPostfix]
private static void OnMouseUpAsButtonPostfix(OptionBtn __instance)
{
Transform text_1Transform = __instance.transform.GetChild(0)?.transform;
if (text_1Transform != null)
{
TextMeshProUGUI text_1 = text_1Transform.GetComponent<TextMeshProUGUI>();
text_1 = StringStore.TranslateText(text_1);
text_1.autoSizeTextContainer = false;
}
Transform textTransform = __instance.transform.GetChild(1)?.transform;
if (textTransform != null)
{
TextMeshProUGUI text = textTransform.GetComponent<TextMeshProUGUI>();
text = StringStore.TranslateText(text);
text.autoSizeTextContainer = false;
}
Transform text2Transform = __instance.transform.GetChild(2)?.transform;
if (text2Transform != null)
{
TextMeshProUGUI text2 = text2Transform.GetComponent<TextMeshProUGUI>();
text2 = StringStore.TranslateText(text2);
}
}
}
}

View file

@ -1,42 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(PVPPotBtn))]
public class PVPPotBtn_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(PVPPotBtn.OnMouseUpAsButton))]
public static void OnMouseUpAsButton(PVPPotBtn __instance)
{
Transform sceneText = __instance.transform.FindChild("text");
if(sceneText != null)
{
TextMeshProUGUI sceneTextTMP = sceneText.transform.GetComponent<TextMeshProUGUI>();
if(sceneTextTMP != null)
{
sceneTextTMP.text = StringStore.TranslateText(sceneTextTMP.text);
}
}
Transform sceneTextShadow = sceneText.transform.FindChild("text_1");
if(sceneTextShadow != null)
{
TextMeshProUGUI sceneTextShadowTMP = sceneTextShadow.transform.GetComponent<TextMeshProUGUI>();
if (sceneTextShadowTMP != null)
{
sceneTextShadowTMP.text = StringStore.TranslateText(sceneTextShadowTMP.text);
}
}
if (__instance.name.Equals("ChangeBg_3") || __instance.name.Equals("ChangeBg_4"))
{
__instance.gameObject.SetActive(false);
__instance.gameObject.SetActive(true);
}
}
}
}

View file

@ -1,15 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(PauseMenu_Btn))]
public static class PauseMenu_Btn_Patch
{
[HarmonyPatch(nameof(PauseMenu_Btn.Start))]
[HarmonyPostfix]
private static void Start(PauseMenu_Btn __instance) => StringStore.TranslateTextTransform(__instance.transform);
}
}

View file

@ -1,24 +0,0 @@
#if FIX
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.ButtonObjects
{
[HarmonyPatch(typeof(SaveMenuBtn))]
public static class SaveMenuBtn_Patch
{
[HarmonyPatch(nameof(SaveMenuBtn.OnMouseUpAsButton))]
[HarmonyPostfix]
private static void OnMouseUpAsButton(SaveMenuBtn __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
__instance.theName.text = StringStore.TranslateText(__instance.theName.text);
__instance.theName.font = fontAsset;
}
}
}
#endif

View file

@ -1,85 +0,0 @@
using HarmonyLib;
using TMPro;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.UIElements;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(UIButton))]
public static class UIButton_Patch
{
[HarmonyPatch(typeof(UIButton), nameof(UIButton.Start))]
[HarmonyPostfix]
public static void Start(UIButton __instance)
{
if (__instance.transform.childCount >= 2)
{
TMP_FontAsset font = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI text in __instance.transform.GetComponentsInChildren<TextMeshProUGUI>())
{
if (__instance.transform.name == "Goback")
{
text.text = "合上";
}
text.text = StringStore.TranslateText(text.text);
text.font = font;
}
}
else
{
StringStore.TranslateTextTransform(__instance.transform);
if (__instance.transform.name == "Goback")
{
foreach (TextMeshProUGUI text in __instance.transform.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText("合上");
}
}
}
}
[HarmonyPatch(nameof(UIButton.OnMouseUpAsButton))]
[HarmonyPostfix]
public static void Postfix_OnMouseUpAsButton(UIButton __instance)
{
try
{
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 textShadow = __instance.transform.GetChild(1).GetComponent<TextMeshProUGUI>();
text.text = StringStore.TranslateText(text.text, false);
textShadow.text = StringStore.TranslateText(textShadow.text, false);
text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
textShadow.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}
catch (Exception) { }
}
}
}

View file

@ -1,52 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(Close))]
public static class Close_Patch
{
[HarmonyPatch(nameof(Close.Start))]
[HarmonyPostfix]
private static void Close_Start(Close __instance)
{
TextMeshPro closeText = __instance.transform.GetChild(0).GetComponent<TextMeshPro>();
closeText.text = "合上";
closeText = StringStore.TranslateText(closeText);
closeText.autoSizeTextContainer = true;
Transform AlmanacTransform = __instance.transform.parent.transform;
Transform nameTransform = AlmanacTransform.Find("Name");
if (nameTransform != null)
{
TextMeshPro nameTMP = nameTransform.transform.GetComponent<TextMeshPro>();
if (nameTMP)
{
nameTMP = StringStore.TranslateText(nameTMP);
nameTMP.autoSizeTextContainer = true;
}
Transform nameShadowTransform = nameTransform.Find("NameShadow");
if (nameShadowTransform)
{
TextMeshPro nameShadowTMP = nameShadowTransform.transform.GetComponent<TextMeshPro>();
if (nameShadowTMP)
{
nameShadowTMP = StringStore.TranslateText(nameShadowTMP);
nameShadowTMP.autoSizeTextContainer = true;
}
}
}
StringStore.TranslateTextTransform(AlmanacTransform.Find("Back"), true);
StringStore.TranslateTextTransform(AlmanacTransform.Find("NextPage"));
StringStore.TranslateTextTransform(AlmanacTransform.Find("LastPage"));
}
}
}

View file

@ -1,37 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(CrisisZombieWindow))]
public static class CrisisZombieWindow_Patch
{
[HarmonyPatch(nameof(CrisisZombieWindow.Start))]
[HarmonyPostfix]
private static void Start(CrisisZombieWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(CrisisZombieWindow.SetZombieType))]
[HarmonyPostfix]
private static void SetZombieType(CrisisZombieWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
}
}

View file

@ -1,24 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(CustomSettings))]
public static class CustomSettings_Patch
{
[HarmonyPatch(nameof(CustomSettings.Awake))]
[HarmonyPostfix]
private static void Awake(CustomSettings __instance)
{
__instance.textMesh = StringStore.TranslateText(__instance.textMesh);
}
[HarmonyPatch(nameof(CustomSettings.ChangeText))]
[HarmonyPostfix]
private static void ChangeText(CustomSettings __instance)
{
__instance.textMesh = StringStore.TranslateText(__instance.textMesh);
}
}
}

View file

@ -1,45 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(CustomSun))]
public static class CustomSun_Patch
{
[HarmonyPatch(nameof(CustomSun.Awake))]
[HarmonyPostfix]
private static void Awake(CustomSun __instance)
{
if (__instance.inputField.gameObject.activeSelf)
{
string oriTextSun = __instance.inputField.m_Text;
__instance.inputField.gameObject.SetActive(false);
__instance.inputField.m_Text = StringStore.TranslateText(oriTextSun);
__instance.inputField.m_OriginalText = StringStore.TranslateText(oriTextSun);
__instance.inputField.gameObject.SetActive(true);
}
if (__instance.setFlags.gameObject.activeSelf)
{
string oriTextFlags = __instance.setFlags.m_Text;
__instance.setFlags.gameObject.SetActive(false);
__instance.setFlags.m_Text = StringStore.TranslateText(oriTextFlags);
__instance.setFlags.m_OriginalText = StringStore.TranslateText(oriTextFlags);
__instance.setFlags.gameObject.SetActive(true);
}
Transform lookZombieTransform = __instance.lookZombie.transform.GetChild(0).transform;
if (lookZombieTransform != null)
{
TextMeshProUGUI lookZombieTMP = lookZombieTransform.GetComponent<TextMeshProUGUI>();
if (lookZombieTMP != null)
{
lookZombieTMP = StringStore.TranslateText(lookZombieTMP);
}
}
}
}
}

View file

@ -1,37 +0,0 @@
using System.Text.RegularExpressions;
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(EveBuffMenu))]
public static class EveBuffMenu_Patch
{
[HarmonyPatch(nameof(EveBuffMenu.Start))]
[HarmonyPostfix]
private static void Start(EveBuffMenu __instance)
{
foreach (EveOptionWindow window in __instance.windows)
{
EveOptionWindow_Patch.TranslateEveOptionWindow(window);
}
foreach (TextMeshProUGUI text in __instance.quitButton.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText("合上");
}
}
[HarmonyPatch(nameof(EveBuffMenu.InitWindows))]
[HarmonyPostfix]
private static void InitWindows(EveBuffMenu __instance)
{
foreach (EveOptionWindow window in __instance.windows)
{
EveOptionWindow_Patch.TranslateEveOptionWindow(window);
}
}
}
}

View file

@ -1,49 +0,0 @@
using System.Text.RegularExpressions;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(EveOptionWindow))]
public static class EveOptionWindow_Patch
{
[HarmonyPatch(nameof(EveOptionWindow.SetType))]
[HarmonyPostfix]
private static void SetType(EveOptionWindow __instance)
{
TranslateEveOptionWindow(__instance);
}
[HarmonyPatch(nameof(EveOptionWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(EveOptionWindow __instance)
{
TranslateEveOptionWindow(__instance);
}
[HarmonyPatch(nameof(EveOptionWindow.SelectedByRow))]
[HarmonyPostfix]
private static void SelectedByRow(EveOptionWindow __instance)
{
TranslateEveOptionWindow(__instance);
}
public static void TranslateEveOptionWindow(EveOptionWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
foreach (TextMeshProUGUI text in __instance.buttonText)
{
text.text = StringStore.TranslateText(text.text);
text.font = fontAsset;
}
}
}
}

View file

@ -1,66 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(ExploreEnterWindow))]
public static class ExploreEnterWindow_Patch
{
[HarmonyPatch(nameof(ExploreEnterWindow.Awake))]
[HarmonyPostfix]
private static void Awake(ExploreEnterWindow __instance)
{
PlantType thePlantType = (PlantType)__instance.selfType;
__instance.nameText.text = Utils.GetPlantNameFromAlmanac(thePlantType);
if (__instance.nameText.text == "")
{
__instance.nameText.text = StringStore.TranslateText(__instance.nameText.text);
}
__instance.nameText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
[HarmonyPatch(nameof(ExploreEnterWindow.SetInfo))]
[HarmonyPostfix]
private static void SetInfo(ExploreEnterWindow __instance)
{
PlantType thePlantType = (PlantType)__instance.selfType;
__instance.nameText.text = Utils.GetPlantNameFromAlmanac(thePlantType);
if (__instance.nameText.text == "")
{
__instance.nameText.text = StringStore.TranslateText(__instance.nameText.text);
}
__instance.nameText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
[HarmonyPatch(nameof(ExploreEnterWindow.SetIcon))]
[HarmonyPostfix]
private static void SetIcon(ExploreEnterWindow __instance)
{
PlantType thePlantType = (PlantType)__instance.selfType;
__instance.nameText.text = Utils.GetPlantNameFromAlmanac(thePlantType);
if (__instance.nameText.text == "")
{
__instance.nameText.text = StringStore.TranslateText(__instance.nameText.text);
}
__instance.nameText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
[HarmonyPatch(nameof(ExploreEnterWindow.SetDisable))]
[HarmonyPostfix]
private static void SetDisable(ExploreEnterWindow __instance)
{
if (__instance.disabled)
{
__instance.nameText.text = StringStore.TranslateText("敬请期待");
}
__instance.nameText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}

View file

@ -1,79 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using PvZ_Fusion_Translator__BepInEx_;
using System.Text.RegularExpressions;
using UnityEngine;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.Json;
namespace PvZ_Fusion_Translator__BepInEx_.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

@ -1,48 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(ExploreMenu))]
public static class ExploreMenu_Patch
{
[HarmonyPatch(nameof(ExploreMenu.Awake))]
[HarmonyPostfix]
private static void Awake(ExploreMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText(txt.text);
}
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 Vector3(94.4225f, -45.1565f, 0f);
// }
// }
//}
}
[HarmonyPatch(nameof(ExploreMenu.UpdateWindows))]
[HarmonyPostfix]
private static void UpdateWindows(ExploreMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText(txt.text);
}
}
}
}

View file

@ -1,37 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(FruitNinjaSelectWindow))]
public static class FruitNinjaSelectWindow_Patch
{
[HarmonyPatch(nameof(FruitNinjaSelectWindow.SetType))]
[HarmonyPostfix]
private static void SetType(FruitNinjaSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(FruitNinjaSelectWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(FruitNinjaSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
}
}

View file

@ -1,51 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(GardenBagMenu))]
public static class GardenBagMenu_Patch
{
[HarmonyPatch(nameof(GardenBagMenu.SetTreasureCards))]
[HarmonyPostfix]
private static void SetTreasureCards(GardenBagMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if(txt.transform.parent.name.Contains("Close"))
{
txt.text = StringStore.TranslateText("合上");
}
else
{
txt.text = StringStore.TranslateText(txt.text);
}
txt.font = fontAsset;
}
}
[HarmonyPatch(nameof(GardenBagMenu.SetTreasureCard))]
[HarmonyPostfix]
private static void SetTreasureCard(GardenBagMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if (txt.transform.parent.name.Contains("Close"))
{
txt.text = StringStore.TranslateText("合上");
}
else
{
txt.text = StringStore.TranslateText(txt.text);
}
txt.font = fontAsset;
}
}
}
}

View file

@ -1,24 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(GardenCard))]
public static class GardenCard_Patch
{
[HarmonyPatch(nameof(GardenCard.Start))]
[HarmonyPostfix]
private static void Start(GardenCard __instance)
{
__instance.text.text = StringStore.TranslateText(__instance.text.text).Replace("26", "16");
}
[HarmonyPatch(nameof(GardenCard.ChangeCardSprite))]
[HarmonyPostfix]
private static void ChangeCardSprite(GardenCard __instance)
{
__instance.text.text = StringStore.TranslateText(__instance.text.text).Replace("26", "16");
}
}
}

View file

@ -1,28 +0,0 @@
using HarmonyLib;
using System;
using System.Text.RegularExpressions;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(GardenPlant))]
public static class GardenPlant_Patch
{
[HarmonyPatch(nameof(GardenPlant.Start))]
[HarmonyPostfix]
private static void Start(GardenPlant __instance)
{
__instance.infoText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
__instance.infoText.text = StringStore.TranslateText(__instance.infoText.text);
}
[HarmonyPatch(nameof(GardenPlant.UpdateInfo))]
[HarmonyPostfix]
private static void UpdateInfo(GardenPlant __instance)
{
__instance.infoText.font = FontStore.LoadTMPFont(Utils.Language.ToString());
__instance.infoText.text = StringStore.TranslateText(__instance.infoText.text);
}
}
}

View file

@ -1,24 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(MainMenu))]
public class MainMenu_Patch
{
private static bool _warningShown = false;
[HarmonyPostfix]
[HarmonyPatch(nameof(MainMenu.AnimOver))]
private static void AnimOver(MainMenu __instance)
{
if (_warningShown || NoticeMenu.Instance == null)
return;
WarningStore.WarningReload(Utils.Language, NoticeMenu.Instance);
_warningShown = true;
}
}
}

View file

@ -1,21 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(AbyssGoods))]
public static class AbyssGoods_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(AbyssGoods.Start))]
private static void Start(AbyssGoods __instance)
{
__instance.costText.text = StringStore.TranslateText(__instance.costText.text, false);
__instance.costText_shadow.text = StringStore.TranslateText(__instance.costText_shadow.text, false);
__instance.hasText.text = StringStore.TranslateText(__instance.hasText.text, false);
__instance.hasText_shadow.text = StringStore.TranslateText(__instance.hasText_shadow.text, false);
}
}
}

View file

@ -1,56 +0,0 @@
using System.Text.RegularExpressions;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(Brain))]
public static class Brain_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(Brain.Awake))]
private static void Awake(Brain __instance)
{
// reposition original points
Transform pointsTransform = __instance.points.transform;
GameObject pointsObject = __instance.points.gameObject;
pointsTransform.position = new Vector3(-6.5f, pointsTransform.position.y, pointsTransform.position.z);
// instantiate and move new shadow
GameObject pointsShadowObject = UnityEngine.Object.Instantiate(pointsObject, parent: pointsTransform);
pointsShadowObject.SetActive(true);
Transform pointsShadowTransform = pointsShadowObject.transform;
pointsShadowTransform.position = new Vector3(-6.485f, pointsTransform.position.y - 0.015f, pointsTransform.position.z);
// set points text
TextMeshPro pointsShadowText = pointsShadowObject.GetComponent<TextMeshPro>();
pointsShadowText.text = __instance.points.text;
pointsShadowText.sortingOrder -= 2;
pointsShadowText.color = Color.black;
}
[HarmonyPostfix]
[HarmonyPatch(nameof(Brain.Update))]
private static void Update(Brain __instance)
{
if (__instance.transform.Find("Points").GetChild(0) != null)
{
TextMeshPro shadowText = __instance.transform.Find("Points").GetChild(0).GetComponent<TextMeshPro>();
shadowText.text = __instance.points.text;
}
}
[HarmonyPostfix]
[HarmonyPatch(nameof(Brain.WinAction))]
private static void WinAction(Brain __instance)
{
if (__instance.transform.Find("Points").GetChild(0) != null)
{
TextMeshPro shadowText = __instance.transform.Find("Points").GetChild(0).GetComponent<TextMeshPro>();
shadowText.text = __instance.points.text;
}
}
}
}

View file

@ -1,18 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(DY))]
public static class DY_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(DY.Update))]
private static void Update(DY __instance)
{
__instance.TextMeshPro.text = StringStore.TranslateText(__instance.TextMeshPro.text);
}
}
}

View file

@ -1,30 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(JigsawClip))]
public static class JigsawClip_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(JigsawClip.Awake))]
private static void Postfix_Awake(JigsawClip __instance)
{
if (!__instance || !__instance.description) return;
StringStore.TranslateTextUI(__instance.description);
}
[HarmonyPostfix]
[HarmonyPatch(nameof(JigsawClip.Update))]
private static void Postfix_Update(JigsawClip __instance)
{
if (!__instance || !__instance.description) return;
if (__instance.description.text != StringStore.TranslateText(__instance.description.text))
{
StringStore.TranslateTextUI(__instance.description);
}
}
}
}

View file

@ -1,18 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(LanternUmbrella))]
public class LanternUmbrella_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(LanternUmbrella.Update))]
private static void Update(LanternUmbrella __instance)
{
__instance.energyText = StringStore.TranslateText(__instance.energyText);
__instance.energyTextShadow = StringStore.TranslateText(__instance.energyTextShadow);
}
}
}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(MagnetBox))]
public class MagnetBox_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(MagnetBox.Update))]
private static void Update(MagnetBox __instance)
{
StringStore.TranslateTextTransform(__instance.transform);
}
}
}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(MagnetInterface))]
public class MagnetInterface_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(MagnetInterface.Update))]
private static void Update(MagnetInterface __instance)
{
StringStore.TranslateTextTransform(__instance.transform);
}
}
}

View file

@ -1,18 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(Money))]
public static class Money_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(Money.Update))]
private static void Update(Money __instance)
{
__instance.beanCount.text = StringStore.TranslateText(__instance.beanCount.text);
__instance.beanCount2.text = StringStore.TranslateText(__instance.beanCount2.text);
}
}
}

View file

@ -1,48 +0,0 @@
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[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<string> dynamicParts = new List<string>();
for (int i = 1; i < groupCount; i++)
dynamicParts.Add(match.Groups[i].Value);
return originalText = string.Format("{0}k/{1}k", [.. dynamicParts]);
}
return originalText;
}
}
}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(PlayerName))]
public static class PlayerName_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(PlayerName.Update))]
private static void Update(PlayerName __instance)
{
__instance.textMesh.text = StringStore.TranslateText(__instance.textMesh.text);
}
}
}

View file

@ -1,22 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(SelectYourPlants))]
public static class SelectYourPlants_Patch
{
[HarmonyPatch(nameof(SelectYourPlants.Awake))]
[HarmonyPostfix]
private static void Awake(SelectYourPlants __instance)
{
__instance.TextMeshProUGUI = StringStore.TranslateText(__instance.TextMeshProUGUI);
__instance.TextMeshProUGUI.autoSizeTextContainer = true;
__instance.TextMeshProUGUI2 = StringStore.TranslateText(__instance.TextMeshProUGUI2);
__instance.TextMeshProUGUI2.autoSizeTextContainer = true;
}
}
}

View file

@ -1,16 +0,0 @@
using HarmonyLib;
using System;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(TrainingDummy), nameof(TrainingDummy.UpdateHealthText))]
public static class TrainingDummy_Patch
{
[HarmonyPostfix]
public static void UpdateHealthText(TrainingDummy __instance)
{
Zombie_Patch.TranslateHpUI_T(__instance.healthText, __instance);
Zombie_Patch.TranslateHpUI_T(__instance.healthTextShadow, __instance);
}
}
}

View file

@ -1,16 +0,0 @@
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(TreasureMoney))]
public static class TreasureMoney_Patch
{
[HarmonyPostfix]
[HarmonyPatch(nameof(TreasureMoney.Update))]
private static void Update(TreasureMoney __instance)
{
__instance.text = StringStore.TranslateText(__instance.text);
}
}
}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(UIProgress2))]
public static class UIProgress2_Patch
{
[HarmonyPatch(nameof(UIProgress2.Update))]
[HarmonyPostfix]
private static void Update(UIProgress2 __instance)
{
__instance.t.text = StringStore.TranslateText(__instance.t.text);
}
}
}

View file

@ -1,17 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
namespace PvZ_Fusion_Translator__BepInEx_.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);
}
}
}

View file

@ -1,176 +0,0 @@
using HarmonyLib;
using System;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using System.Text.RegularExpressions;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects.MinorObjects
{
[HarmonyPatch(typeof(Zombie))]
public static class Zombie_Patch
{
private static Dictionary<string, string> HPStrings = new Dictionary<string, string>()
{
{ "最后一击:(\\d+)\nDPS:([^\\s]+)\n总伤害:(\\d+)", "Last Damage: {0}\nDPS: {1}\nTotal: {2}" },
{ "^HP:(\\d+)/(\\d+)\n一类:(\\d+)/(\\d+)\n二类:(\\d+)/(\\d+)$", "HP: {0}/{1}\nType 1 armor: {2}/{3}\nType 2 armor: {4}/{5}" },
{ "^HP:(\\d+)/(\\d+)\n一类:(\\d+)/(\\d+)$", "HP: {0}/{1}\nType 1 armor: {2}/{3}" },
{ "^HP:(\\d+)/(\\d+)\n二类:(\\d+)/(\\d+)$", "HP: {0}/{1}\nType 2 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)
{
TranslateHpUI(__instance.healthText, __instance);
TranslateHpUI(__instance.healthTextShadow, __instance);
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;
TranslateHpUI(__instance.healthText, __instance);
TranslateHpUI(__instance.healthTextShadow, __instance);
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, Zombie __instance)
{
if (textTMP)
{
string origText = textTMP.text;
string translatedText = origText;
string pattern = "(\\d+)阶\\n([\\s\\S]+)";
if (StringStore.TestRegex(translatedText, pattern))
{
var match = Regex.Match(translatedText, pattern, RegexOptions.Singleline);
string tier = match.Groups[1].Value;
string healthText = TranslateHPText(match.Groups[2].Value, __instance);
string fStr = StringStore.translationStringRegex[pattern];
translatedText = string.Format(fStr, new object[] { tier, healthText });
}
else
{
translatedText = TranslateHPText(origText, __instance);
}
textTMP.text = translatedText == origText ? origText : translatedText;
textTMP.autoSizeTextContainer = false;
if (translatedText != origText)
textTMP.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
public static void TranslateHpUI_T(TextMeshPro textTMP, TrainingDummy __instance)
{
if (textTMP)
{
string origText = textTMP.text;
string translatedText = TranslateHPText_T(origText, __instance);
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, Zombie __instance)
{
if(originalText == null)
{
return originalText;
}
string finalText = __instance.healthText.text;
int fIndex = -1;
bool found = false;
for (int i = 0; i < HPStrings.Count; i++)
{
var hp = HPStrings.ElementAt(i);
if(Regex.Match(originalText, hp.Key, RegexOptions.Singleline).Success)
{
fIndex = i;
found = true;
}
}
if (fIndex > -1 && found)
{
string fStr = HPStrings.ElementAt(fIndex).Value;
switch (fIndex)
{
case 1:
finalText = string.Format(fStr, __instance.theHealth, __instance.theMaxHealth, __instance.theFirstArmorHealth, __instance.theFirstArmorMaxHealth, __instance.theSecondArmorHealth, __instance.theSecondArmorMaxHealth);
break;
case 2:
finalText = string.Format(fStr, __instance.theHealth, __instance.theMaxHealth, __instance.theFirstArmorHealth, __instance.theFirstArmorMaxHealth);
break;
case 3:
finalText = string.Format(fStr, __instance.theHealth, __instance.theMaxHealth, __instance.theSecondArmorHealth, __instance.theSecondArmorMaxHealth);
break;
case 4:
finalText = string.Format(fStr, __instance.theHealth, __instance.theMaxHealth);
break;
default:
break;
}
}
return finalText;
}
public static string TranslateHPText_T(string originalText, TrainingDummy __instance)
{
string finalText = __instance.healthText.text;
int fIndex = -1;
bool found = false;
for (int i = 0; i < HPStrings.Count; i++)
{
var hp = HPStrings.ElementAt(i);
Regex regex = new Regex(hp.Key);
if (regex.IsMatch(originalText))
{
fIndex = i;
found = true;
}
}
if (fIndex > -1 && found)
{
string fStr = HPStrings.ElementAt(fIndex).Value;
string DPS = originalText.Split("\n")[1].Replace("DPS:", "");
DPS = StringStore.TranslateText(DPS);
switch (fIndex)
{
case 0:
finalText = string.Format(fStr, __instance.lastDamage, DPS, __instance.totalDamage);
break;
default:
break;
}
}
return finalText;
}
}
}

View file

@ -1,62 +0,0 @@
using HarmonyLib;
using UnityEngine.UI;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.IO;
using System;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(NoticeMenu))]
public class NoticePauseMenu_Patch
{
[HarmonyPrefix]
[HarmonyPatch(nameof(NoticeMenu.Awake))]
private static void Pre_Awake(NoticeMenu __instance)
{
GameObject contentObject = __instance.transform.FindChild("Scroll View/Viewport/Content").gameObject;
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]
[HarmonyPatch(nameof(NoticeMenu.Awake))]
private static void Post_Awake(NoticeMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
string stringDir = FileLoader.GetAssetDir(FileLoader.AssetType.Strings, Utils.Language);
string changelogDir = Path.Combine(stringDir, "changelog.txt");
string changelogText = File.ReadAllText(changelogDir);
GameObject contentObject = __instance.transform.FindChild("Scroll View/Viewport/Content").gameObject;
TextMeshProUGUI contentText = contentObject.GetComponent<TextMeshProUGUI>();
contentText.text = changelogText;
contentText.margin = new Vector4(6, 2, 12, 0);
contentText.enableWordWrapping = true;
contentText.overflowMode = TextOverflowModes.ScrollRect;
Canvas.ForceUpdateCanvases();
contentText.ForceMeshUpdate();
//float textHeight = contentText.preferredHeight;
//RectTransform contentRect = contentObject.GetComponent<RectTransform>();
//contentRect.sizeDelta = new Vector2(contentRect.sizeDelta.x, textHeight);
ContentSizeFitter sizeFitter = contentObject.AddComponent<ContentSizeFitter>();
sizeFitter.verticalFit = ContentSizeFitter.FitMode.PreferredSize;
}
}
}

View file

@ -1,19 +0,0 @@
using HarmonyLib;
using System;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(OtherMenu))]
public static class OtherMenu_Patch
{
[HarmonyPatch(nameof(OtherMenu.UpdateText))]
[HarmonyPostfix]
private static void UpdateText(OtherMenu __instance)
{
__instance.text1 = StringStore.TranslateText(__instance.text1);
__instance.text2 = StringStore.TranslateText(__instance.text2);
}
}
}

View file

@ -1,36 +0,0 @@
using System.Text.RegularExpressions;
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(PlantDamageMenu))]
public static class PlantDamageMenu_Patch
{
[HarmonyPatch(nameof(PlantDamageMenu.Awake))]
[HarmonyPostfix]
private static void Awake(PlantDamageMenu __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;
}
}
[HarmonyPatch(nameof(PlantDamageMenu.InitCards))]
[HarmonyPostfix]
private static void InitCards(PlantDamageMenu __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;
}
}
}
}

View file

@ -1,54 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using UnityEngine.UIElements;
using static PvZ_Fusion_Translator__BepInEx_.FileLoader;
using System;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(PlantInfoWindow))]
public static class PlantInfoWindow_Patch
{
[HarmonyPatch(nameof(PlantInfoWindow.InitText))]
[HarmonyPostfix]
private static void InitText(PlantInfoWindow __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
BigGardenPlant thePlant = __instance.plant;
foreach (TextMeshProUGUI txt in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
if (txt.name.Contains("Introduce") && thePlant != null)
{
PlantType thePlantType = thePlant.thePlantType;
txt.text = StringStore.TranslateText(txt.text);
string text = txt.text;
string[] lines = text.Split("\n");
lines[0] = Utils.GetPlantNameFromAlmanac(thePlantType);
string updatedText = String.Join("\n", lines);
txt.text = updatedText;
}
else
{
txt.text = StringStore.TranslateText(txt.text);
}
txt.font = fontAsset;
}
Transform parentWindowTransform = __instance.transform.parent;
Transform returnPlantTransform = parentWindowTransform.FindChild("Close");
foreach(TextMeshProUGUI txt in returnPlantTransform.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText("合上");
}
}
}
}

View file

@ -1,40 +0,0 @@
using HarmonyLib;
using TMPro;
using BepInEx.Unity.IL2CPP;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(PlayerShootingMenu))]
public static class PlayerShootingMenu_Patch
{
[HarmonyPatch(nameof(PlayerShootingMenu.Update))]
[HarmonyPostfix]
private static void Update(PlayerShootingMenu __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(PlayerShootingMenu.Refresh))]
[HarmonyPostfix]
private static void Refresh(PlayerShootingMenu __instance)
{
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
Transform refreshTransform = __instance.transform.FindChild("Button");
foreach (TextMeshProUGUI text in refreshTransform.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = fontAsset;
text.autoSizeTextContainer = false;
}
}
}
}

View file

@ -1,36 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(PlayerShootingWindow))]
public static class PlayerShootingWindow_Patch
{
[HarmonyPatch(nameof(PlayerShootingWindow.SetType))]
[HarmonyPostfix]
private static void SetType(PlayerShootingWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(PlayerShootingWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(PlayerShootingWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
}
}

View file

@ -1,37 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(RogueCardWindow))]
public static class RogueCardWindow_Patch
{
[HarmonyPatch(nameof(RogueCardWindow.InitCard))]
[HarmonyPostfix]
private static void InitCard(RogueCardWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(RogueCardWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(RogueCardWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
}
}

View file

@ -1,42 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using UnityEngine.TextCore.Text;
using UnityEngine.UI;
using static System.Net.Mime.MediaTypeNames;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(RogueStartMenu))]
public static class RogueStartMenu_Patch
{
[HarmonyPatch(nameof(RogueStartMenu.SetLeader))]
[HarmonyPostfix]
private static void SetLeader(RogueStartMenu __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(RogueStartMenu.EnterGame))]
[HarmonyPostfix]
private static void EnterGame(RogueStartMenu __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

@ -1,36 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(SeedLibrary))]
public static class SeedLibrary_Patch
{
[HarmonyPatch(nameof(SeedLibrary.ChangeSafeMode))]
[HarmonyPostfix]
private static void ChangeSafeMode(SeedLibrary __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;
}
Transform safetyBoxButtonTransform = __instance.transform.Find("SafeBox").Find("StartSafeMode");
if (__instance.safeMode == false && safetyBoxButtonTransform != null)
{
foreach (TextMeshProUGUI txt in safetyBoxButtonTransform.GetComponentsInChildren<TextMeshProUGUI>())
{
txt.text = StringStore.TranslateText("合上");
}
}
}
}
}

View file

@ -1,25 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(ShootingMenu))]
public static class ShootingMenu_Patch
{
[HarmonyPatch(nameof(ShootingMenu.Update))]
[HarmonyPostfix]
private static void Update(ShootingMenu __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

@ -1,73 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
using System.Text.RegularExpressions;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(ShootingSelectWindow))]
public static class ShootingSelectWindow_Patch
{
[HarmonyPatch(nameof(ShootingSelectWindow.InitPlantType))]
[HarmonyPostfix]
private static void InitCard(ShootingSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(ShootingSelectWindow.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(ShootingSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(ShootingSelectWindow.SetUpgradePlantTypes))]
[HarmonyPostfix]
private static void SetUpgradePlantTypes(ShootingSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(ShootingSelectWindow.GetMaxIndexInRoutes))]
[HarmonyPostfix]
private static void GetMaxIndexInRoutes(ShootingSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
[HarmonyPatch(nameof(ShootingSelectWindow.Start))]
[HarmonyPostfix]
private static void Start(ShootingSelectWindow __instance)
{
Transform introduceTransform = __instance.transform.FindChild("Images").FindChild("Introduce");
TextMeshProUGUI introduceText = introduceTransform.GetComponent<TextMeshProUGUI>();
TMP_FontAsset fontAsset = FontStore.LoadTMPFont(Utils.Language.ToString());
introduceText.text = StringStore.TranslateText(introduceText.text);
introduceText.font = fontAsset;
}
}
}

View file

@ -1,25 +0,0 @@
using HarmonyLib;
using TMPro;
using BepInEx.Unity.IL2CPP;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(SpriteRenderer))]
public static class SpriteRenderer_Patch
{
[HarmonyPatch(nameof(SpriteRenderer.InvokeSpriteChanged))]
[HarmonyPostfix]
private static void InvokeSpriteChanged(SpriteRenderer __instance)
{
if (__instance.sprite != null)
{
if (TextureStore.spriteDict.ContainsKey(__instance.sprite.name) && __instance.drawMode != SpriteDrawMode.Sliced)
{
__instance.drawMode = SpriteDrawMode.Sliced;
}
}
}
}
}

View file

@ -1,21 +0,0 @@
//using HarmonyLib;
//using System;
//using TMPro;
//using PvZ_Fusion_Translator__BepInEx_.AssetStore;
//using UnityEngine;
//namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
//{
// [HarmonyPatch(typeof(TowerOption))]
// public static class TowerOption_Patch
// {
// [HarmonyPatch(nameof(TowerOption.Start))]
// [HarmonyPostfix]
// private static void Postfix_Start(TowerOption __instance)
// {
// //TextMeshProUGUI[] allTexts = __instance.GetComponentsInChildren<TextMeshProUGUI>(true);
// __instance.introduce.text = StringStore.TranslateText(__instance.introduce.text);
// __instance.introduce.font = FontStore.LoadTMPFont(Utils.Language.ToString());
// }
// }
//}

View file

@ -1,39 +0,0 @@
using HarmonyLib;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using TMPro;
using UnityEngine;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(TowerUpgradeMenu))]
public static class TowerUpgradeMenu_Patch
{
[HarmonyPatch(nameof(TowerUpgradeMenu.Awake))]
[HarmonyPostfix]
private static void Awake(TowerUpgradeMenu __instance)
{
__instance.des.text = StringStore.TranslateText(__instance.des.text);
__instance.des2.text = StringStore.TranslateText(__instance.des2.text);
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
[HarmonyPatch(nameof(TowerUpgradeMenu.SetText))]
[HarmonyPostfix]
private static void SetText(TowerUpgradeMenu __instance)
{
__instance.des.text = StringStore.TranslateText(__instance.des.text);
__instance.des2.text = StringStore.TranslateText(__instance.des2.text);
foreach (TextMeshProUGUI text in __instance.GetComponentsInChildren<TextMeshProUGUI>())
{
text.text = StringStore.TranslateText(text.text);
text.font = FontStore.LoadTMPFont(Utils.Language.ToString());
}
}
}
}

View file

@ -1,26 +0,0 @@
using HarmonyLib;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using static PvZ_Fusion_Translator__BepInEx_.Patches.Managers.TravelMgr_Patch;
using UnityEngine;
using System.Collections.Generic;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(TravelBuffMenu))]
public static class TravelBuffMenu_Patch
{
[HarmonyPatch(nameof(TravelBuffMenu.RefeshOptions))]
[HarmonyPostfix]
private static void RefeshOptions(TravelBuffMenu __instance)
{
foreach (TravelBuffOptionButton button in __instance.options)
{
button.introduce.text = translatedTravelBuffs[buffLinks[button.buffType]][button.buffIndex];
List<string> buffSet = translatedTravelBuffs[buffLinks[button.buffType]];
string buffText = (button.buffIndex < buffSet.Count && button.show != null) ? buffSet[button.buffIndex] : StringStore.TranslateText(button.introduce.text);
button.introduce.text = buffText;
}
}
}
}

View file

@ -1,41 +0,0 @@
using HarmonyLib;
using System;
using TMPro;
using PvZ_Fusion_Translator__BepInEx_.AssetStore;
using static PvZ_Fusion_Translator__BepInEx_.Patches.Managers.TravelMgr_Patch;
using UnityEngine;
using System.Collections.Generic;
namespace PvZ_Fusion_Translator__BepInEx_.Patches.GameObjects
{
[HarmonyPatch(typeof(TravelBuffOptionButton))]
public static class TravelBuffOptionButton_Patch
{
[HarmonyPatch(nameof(TravelBuffOptionButton.SetBuff))]
[HarmonyPostfix]
private static void SetBuff(TravelBuffOptionButton __instance)
{
List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count && __instance.show != null) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
__instance.introduce.text = buffText;
}
[HarmonyPatch(nameof(TravelBuffOptionButton.Awake))]
[HarmonyPostfix]
private static void Awake(TravelBuffOptionButton __instance)
{
List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count && __instance.show != null) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
__instance.introduce.text = buffText;
}
[HarmonyPatch(nameof(TravelBuffOptionButton.OnAnimOver))]
[HarmonyPostfix]
private static void OnAnimOver(TravelBuffOptionButton __instance)
{
List<string> buffSet = translatedTravelBuffs[buffLinks[__instance.buffType]];
string buffText = (__instance.buffIndex < buffSet.Count && __instance.show != null) ? buffSet[__instance.buffIndex] : StringStore.TranslateText(__instance.introduce.text);
__instance.introduce.text = buffText;
}
}
}

Some files were not shown because too many files have changed in this diff Show more