using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using Mono.Cecil; [assembly: CompilationRelaxations(8)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("FontPatch")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FontPatch")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: ComVisible(false)] [assembly: Guid("3f36e565-6c51-4574-91c5-79e5bf815137")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace FontPatch; public static class Paths { public static string ConfigPath => Paths.ConfigPath; public static string GameRootPath => Paths.GameRootPath; } public class Font { private const string FontFileName = "notosanssc"; private const string MarkerFileName = "汉化文本By_TooRed"; private const string TranslationZhPath = "Translation/zh"; private const string LocalizationsFolderName = "Localizations"; private const string StreamingAssetsPath = "REPO_Data/StreamingAssets"; private const string VersionFileName = "version.ini"; private static readonly string[] TargetFiles = new string[4] { "Game.tsv", "HUD.tsv", "Menu.tsv", "version.ini" }; public static ManualLogSource Mylog { get; } = Logger.CreateLogSource("FontPatch"); public static IEnumerable TargetDLLs { get; } = Array.Empty(); public static void Patch(AssemblyDefinition _) { } public static void Finish() { try { string text = Path.Combine(Paths.ConfigPath, "Translation/zh", "汉化文本By_TooRed"); bool num = File.Exists(text); if (!num || CheckVersionUpdate()) { Mylog.LogInfo((object)"开始更新文件..."); CopyFontFile(); CopyLocalizationFiles(); Mylog.LogInfo((object)"文件更新完成"); } else { Mylog.LogInfo((object)"无需更新,跳过"); } if (!num) { CreateMarkerFile(text); } } catch (Exception ex) { Mylog.LogError((object)("字体补丁执行异常:" + ex.Message)); } } private static bool CheckVersionUpdate() { string text = Path.Combine(Paths.ConfigPath, "Translation/zh", "Localizations", "version.ini"); string text2 = Path.Combine(Paths.GameRootPath, "REPO_Data/StreamingAssets", "Localizations", "version.ini"); if (!File.Exists(text)) { return false; } string text3 = ReadVersion(text); string text4 = (File.Exists(text2) ? ReadVersion(text2) : string.Empty); if (string.IsNullOrEmpty(text4) || CompareVersions(text3, text4) > 0) { Mylog.LogInfo((object)("检测到新版本:源版本" + text3 + " > 目标版本" + text4 + ",强制更新")); return true; } return false; } private static void CopyFontFile() { string text = Path.Combine(Paths.ConfigPath, "Translation/zh", "notosanssc"); string text2 = Path.Combine(Paths.GameRootPath, "notosanssc"); if (!File.Exists(text)) { Mylog.LogError((object)("源字体文件不存在:" + text)); return; } Mylog.LogInfo((object)"复制字体文件"); if (File.Exists(text2)) { File.Delete(text2); } File.Copy(text, text2, overwrite: true); } private static void CopyLocalizationFiles() { string text = Path.Combine(Paths.ConfigPath, "Translation/zh", "Localizations"); string path = Path.Combine(Paths.GameRootPath, "REPO_Data/StreamingAssets", "Localizations"); if (!Directory.Exists(text)) { Mylog.LogError((object)("源本地化文件夹不存在:" + text)); return; } string[] targetFiles = TargetFiles; foreach (string path2 in targetFiles) { string text2 = Path.Combine(text, path2); string text3 = Path.Combine(path, path2); if (!File.Exists(text2)) { Mylog.LogError((object)("源文件不存在:" + text2)); continue; } if (File.Exists(text3)) { File.Delete(text3); } File.Copy(text2, text3, overwrite: true); } Mylog.LogInfo((object)"复制本地化文件完成"); } private static string ReadVersion(string filePath) { try { string[] array = File.ReadAllLines(filePath); foreach (string text in array) { if (text.StartsWith("version=", StringComparison.OrdinalIgnoreCase)) { return text.Substring(8).Trim(); } } } catch (Exception ex) { Mylog.LogError((object)("读取版本文件失败:" + ex.Message)); } return string.Empty; } private static int CompareVersions(string version1, string version2) { if (string.IsNullOrEmpty(version1) || string.IsNullOrEmpty(version2)) { return 0; } string[] array = version1.Split(new char[1] { '.' }); string[] array2 = version2.Split(new char[1] { '.' }); int num = Math.Max(array.Length, array2.Length); for (int i = 0; i < num; i++) { int result; int num2 = ((i < array.Length && int.TryParse(array[i], out result)) ? result : 0); int result2; int num3 = ((i < array2.Length && int.TryParse(array2[i], out result2)) ? result2 : 0); if (num2 > num3) { return 1; } if (num2 < num3) { return -1; } } return 0; } private static void CreateMarkerFile(string markerFilePath) { try { using (File.Create(markerFilePath)) { } Mylog.LogInfo((object)"汉化补丁执行完成!"); } catch (IOException ex) { Mylog.LogError((object)("创建标记文件失败:" + ex.Message)); } } }