From 66e3aae50e3c8bc042863e228d46460660ce7488 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 01:44:16 +0800 Subject: [PATCH 01/15] bepinex --- AquaMai.BepInEx/AquaMai.BepInEx.csproj | 86 +++ AquaMai.BepInEx/AssemblyLoader.cs | 72 ++ AquaMai.BepInEx/BuildInfo.cs | 11 + AquaMai.BepInEx/BuildInfo.g.cs | 9 + AquaMai.BepInEx/Main.cs | 89 +++ AquaMai.BepInEx/Properties/AssemblyInfo.cs | 16 + AquaMai.BepInEx/configSort.yaml | 96 +++ AquaMai.Core/AquaMai.Core.csproj | 2 +- AquaMai.Core/BuildInfo.cs | 4 +- AquaMai.Core/ConfigLoader.cs | 2 +- AquaMai.Core/Environment/MelonLogger.cs | 43 ++ AquaMai.Core/Helpers/EnableConditionHelper.cs | 2 +- AquaMai.Core/Helpers/FileSystem.cs | 5 +- AquaMai.Core/Helpers/KeyListener.cs | 2 +- AquaMai.Core/Helpers/MessageHelper.cs | 4 +- AquaMai.Core/Helpers/NetPacketHook.cs | 2 +- AquaMai.Core/Helpers/Shim.cs | 2 +- AquaMai.Core/Startup.cs | 14 +- AquaMai.Mods/AquaMai.Mods.csproj | 2 +- AquaMai.Mods/DeprecationWarning.cs | 3 +- .../Enhancement/ServerAnnouncement.cs | 4 +- AquaMai.Mods/Enhancement/ServerNotice.cs | 4 +- AquaMai.Mods/Enhancement/ServerResources.cs | 4 +- AquaMai.Mods/Fancy/CustomButton.cs | 4 +- AquaMai.Mods/Fancy/CustomSkins.cs | 2 +- .../CustomNoteTypes/CustomNoteTypes.cs | 2 +- .../Libs/CustomSlideNoteData.cs | 2 +- .../CustomNoteTypes/Libs/SlideCodeParser.cs | 2 +- AquaMai.Mods/Fancy/RandomBgm.cs | 2 +- AquaMai.Mods/Fix/DebugFeature.cs | 2 +- AquaMai.Mods/Fix/DisableReboot.cs | 2 +- .../Fix/Stability/FixMissingCharaCrash.cs | 2 +- .../Fix/Stability/SanitizeUserData.cs | 4 +- AquaMai.Mods/GameSettings/TouchSensitivity.cs | 2 +- AquaMai.Mods/GameSystem/AdxHidInput.cs | 4 +- AquaMai.Mods/GameSystem/Assets/Fonts.cs | 2 +- .../GameSystem/Assets/LoadLocalImages.cs | 2 +- AquaMai.Mods/GameSystem/Assets/MovieLoader.cs | 2 +- AquaMai.Mods/GameSystem/CustomCameraId.cs | 4 +- AquaMai.Mods/GameSystem/DisableTimeout.cs | 4 +- AquaMai.Mods/GameSystem/KeyMap.cs | 2 +- .../SinglePlayer.ExteraMouseInput.cs | 3 +- AquaMai.Mods/GameSystem/SinglePlayer.cs | 4 +- AquaMai.Mods/GameSystem/Unlock.cs | 2 +- AquaMai.Mods/GameSystem/Window.cs | 2 + AquaMai.Mods/Tweaks/ResetTouch.cs | 5 +- AquaMai.Mods/UX/DisableLightOutGame.cs | 4 +- AquaMai.Mods/UX/HideSelfMadeCharts.cs | 4 +- AquaMai.Mods/UX/ImmediateSave.cs | 4 +- AquaMai.Mods/UX/OneKeyEntryEnd.cs | 4 +- AquaMai.Mods/UX/OneKeyRetrySkip.cs | 4 +- AquaMai.Mods/UX/SelectionDetail.cs | 4 +- AquaMai.Mods/Utils/AntiLag.cs | 5 +- AquaMai.Mods/Utils/DisplayTouchInGame.cs | 4 +- AquaMai.Mods/Utils/LogNetworkErrors.cs | 2 +- AquaMai.Mods/Utils/LogNetworkRequests.cs | 2 +- AquaMai.Mods/Utils/LogUnity.cs | 4 +- AquaMai.Mods/Utils/LogUserId.cs | 2 +- AquaMai.Mods/Utils/ShowErrorLog.cs | 8 +- AquaMai.sln | 17 + AquaMai/AquaMai.csproj | 4 + AquaMai/AssemblyLoader.cs | 2 + AquaMai/Main.cs | 19 +- Libs/0Harmony.dll | Bin 263168 -> 204800 bytes Libs/BepInEx.Harmony.dll | Bin 0 -> 6656 bytes Libs/BepInEx.dll | Bin 0 -> 128000 bytes MelonLoader.TinyJSON/Decoder.cs | 392 +++++++++++ MelonLoader.TinyJSON/EncodeOptions.cs | 17 + MelonLoader.TinyJSON/Encoder.cs | 611 ++++++++++++++++ MelonLoader.TinyJSON/Extensions.cs | 31 + MelonLoader.TinyJSON/JSON.cs | 661 ++++++++++++++++++ MelonLoader.TinyJSON/LICENSE.md | 26 + .../MelonLoader.TinyJSON.csproj | 40 ++ MelonLoader.TinyJSON/README.md | 218 ++++++ MelonLoader.TinyJSON/Types/ProxyArray.cs | 104 +++ MelonLoader.TinyJSON/Types/ProxyBoolean.cs | 27 + MelonLoader.TinyJSON/Types/ProxyNumber.cs | 153 ++++ MelonLoader.TinyJSON/Types/ProxyObject.cs | 98 +++ MelonLoader.TinyJSON/Types/ProxyString.cs | 21 + MelonLoader.TinyJSON/Types/Variant.cs | 250 +++++++ 80 files changed, 3197 insertions(+), 85 deletions(-) create mode 100644 AquaMai.BepInEx/AquaMai.BepInEx.csproj create mode 100644 AquaMai.BepInEx/AssemblyLoader.cs create mode 100644 AquaMai.BepInEx/BuildInfo.cs create mode 100644 AquaMai.BepInEx/BuildInfo.g.cs create mode 100644 AquaMai.BepInEx/Main.cs create mode 100644 AquaMai.BepInEx/Properties/AssemblyInfo.cs create mode 100644 AquaMai.BepInEx/configSort.yaml create mode 100644 AquaMai.Core/Environment/MelonLogger.cs create mode 100644 Libs/BepInEx.Harmony.dll create mode 100644 Libs/BepInEx.dll create mode 100644 MelonLoader.TinyJSON/Decoder.cs create mode 100644 MelonLoader.TinyJSON/EncodeOptions.cs create mode 100644 MelonLoader.TinyJSON/Encoder.cs create mode 100644 MelonLoader.TinyJSON/Extensions.cs create mode 100644 MelonLoader.TinyJSON/JSON.cs create mode 100644 MelonLoader.TinyJSON/LICENSE.md create mode 100644 MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj create mode 100644 MelonLoader.TinyJSON/README.md create mode 100644 MelonLoader.TinyJSON/Types/ProxyArray.cs create mode 100644 MelonLoader.TinyJSON/Types/ProxyBoolean.cs create mode 100644 MelonLoader.TinyJSON/Types/ProxyNumber.cs create mode 100644 MelonLoader.TinyJSON/Types/ProxyObject.cs create mode 100644 MelonLoader.TinyJSON/Types/ProxyString.cs create mode 100644 MelonLoader.TinyJSON/Types/Variant.cs diff --git a/AquaMai.BepInEx/AquaMai.BepInEx.csproj b/AquaMai.BepInEx/AquaMai.BepInEx.csproj new file mode 100644 index 00000000..acd9b61f --- /dev/null +++ b/AquaMai.BepInEx/AquaMai.BepInEx.csproj @@ -0,0 +1,86 @@ + + + + Release + AnyCPU + {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0} + Library + AquaMai + AquaMai.BepInEx + net48 + 512 + true + 12 + 414 + $(ProjectDir)../Libs/;$(AssemblySearchPaths) + $(ProjectDir)../Output/ + false + false + false + + + + false + None + true + prompt + 4 + true + false + + + + DEBUG + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + MelonLoader.TinyJSON.dll + + + AquaMai.Config.Interfaces.dll + + + AquaMai.Config.dll + + + AquaMai.Core.dll + + + AquaMai.Mods.dll + + + AquaMai.ErrorReport.exe + + + configSort.yaml + + + + diff --git a/AquaMai.BepInEx/AssemblyLoader.cs b/AquaMai.BepInEx/AssemblyLoader.cs new file mode 100644 index 00000000..1167700c --- /dev/null +++ b/AquaMai.BepInEx/AssemblyLoader.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Reflection; + +namespace AquaMai; + +public static class AssemblyLoader +{ + public enum AssemblyName + { + TinyJSON, + ConfigInterfaces, + Config, + Core, + Mods, + } + + private static readonly Dictionary Assemblies = new() + { + [AssemblyName.TinyJSON] = "MelonLoader.TinyJSON.dll", + [AssemblyName.ConfigInterfaces] = "AquaMai.Config.Interfaces.dll", + [AssemblyName.Config] = "AquaMai.Config.dll", + [AssemblyName.Core] = "AquaMai.Core.dll", + [AssemblyName.Mods] = "AquaMai.Mods.dll", + }; + + private static readonly Dictionary LoadedAssemblies = []; + + public static Assembly GetAssembly(AssemblyName assemblyName) => LoadedAssemblies[assemblyName]; + + public static void LoadAssemblies() + { + foreach (var (assemblyName, assemblyFileName) in Assemblies) + { +# if DEBUG + AquaMai.LogSource.LogMessage($"Loading assembly \"{assemblyFileName}\"..."); +# endif + LoadedAssemblies[assemblyName] = LoadAssemblyFromResource(assemblyFileName); + } + } + + public static Assembly LoadAssemblyFromResource(string assemblyName) + { + var executingAssembly = Assembly.GetExecutingAssembly(); + using var decompressedStream = executingAssembly.GetManifestResourceStream(assemblyName); + if (decompressedStream != null) + { + return AppDomain.CurrentDomain.Load(StreamToBytes(decompressedStream)); + } + using var compressedStream = executingAssembly.GetManifestResourceStream($"{assemblyName}.compressed"); + if (compressedStream != null) + { + return AppDomain.CurrentDomain.Load(DecompressToBytes(compressedStream)); + } + throw new Exception($"Embedded assembly \"{assemblyName}\" not found."); + } + + private static byte[] StreamToBytes(Stream stream) + { + if (stream == null) + { + return []; + } + using var memoryStream = new MemoryStream(); + stream.CopyTo(memoryStream); + return memoryStream.ToArray(); + } + + private static byte[] DecompressToBytes(Stream stream) => StreamToBytes(new DeflateStream(stream, CompressionMode.Decompress)); +} diff --git a/AquaMai.BepInEx/BuildInfo.cs b/AquaMai.BepInEx/BuildInfo.cs new file mode 100644 index 00000000..96d4d10b --- /dev/null +++ b/AquaMai.BepInEx/BuildInfo.cs @@ -0,0 +1,11 @@ +namespace AquaMai; + +public static partial class BuildInfo +{ + public const string Name = "AquaMai"; + public const string Description = "Mod for Sinmai"; + public const string Author = "Aza ft. Clansty ft. Menci"; + public const string Company = null; + public const string DownloadLink = null; +} + diff --git a/AquaMai.BepInEx/BuildInfo.g.cs b/AquaMai.BepInEx/BuildInfo.g.cs new file mode 100644 index 00000000..bd4adb3b --- /dev/null +++ b/AquaMai.BepInEx/BuildInfo.g.cs @@ -0,0 +1,9 @@ +// Auto-generated file. Do not modify manually. +namespace AquaMai; + +public static partial class BuildInfo +{ + public const string Version = "0.0.0"; + public const string GitVersion = "0.0.0"; + public const string BuildDate = "1970-01-01T00:00:00Z"; +} diff --git a/AquaMai.BepInEx/Main.cs b/AquaMai.BepInEx/Main.cs new file mode 100644 index 00000000..b5947279 --- /dev/null +++ b/AquaMai.BepInEx/Main.cs @@ -0,0 +1,89 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using BepInEx; +using BepInEx.Logging; +using Manager; + +namespace AquaMai; + +[BepInPlugin("net.aquadx.aquamai", BuildInfo.Name, BuildInfo.GitVersion)] +public class AquaMai : BaseUnityPlugin +{ + public const string AQUAMAI_SAY = """ + 如果你在 dnSpy / ILSpy 里看到了这行字,请从 resources 中解包 DLLs。 + If you see this line in dnSpy / ILSpy, please unpack the DLLs from resources. + """; + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetConsoleOutputCP(uint wCodePageID); + + private void SetCoreBuildInfo(Assembly coreAssembly) + { + var coreBuildInfo = coreAssembly.GetType("AquaMai.Core.BuildInfo"); + var buildInfo = typeof(BuildInfo); + foreach (var field in buildInfo.GetFields()) + { + coreBuildInfo.GetField(field.Name)?.SetValue(null, field.GetValue(null)); + } + coreBuildInfo.GetField("ModAssembly")?.SetValue(null, Assembly.GetExecutingAssembly()); + } + + public readonly static ManualLogSource LogSource = BepInEx.Logging.Logger.CreateLogSource(BuildInfo.Name); + private void SetCoreLogger(Assembly coreAssembly) + { + var coreLogger = coreAssembly.GetType("AquaMai.Core.Environment.MelonLogger"); + coreLogger.GetField("MsgStringAction").SetValue(null, (Action)LogSource.LogMessage); + coreLogger.GetField("MsgObjectAction").SetValue(null, (Action)LogSource.LogMessage); + coreLogger.GetField("ErrorStringAction").SetValue(null, (Action)LogSource.LogError); + coreLogger.GetField("ErrorObjectAction").SetValue(null, (Action)LogSource.LogError); + coreLogger.GetField("WarningStringAction").SetValue(null, (Action)LogSource.LogWarning); + coreLogger.GetField("WarningObjectAction").SetValue(null, (Action)LogSource.LogWarning); + } + + private static MethodInfo onGUIMethod; + + public void Awake() + { + var harmony = new HarmonyLib.Harmony("net.aquadx.aquamai"); + + // Early initialization of AMDaemon.NET + try + { + AmManager.Instance.Initialize(); + harmony.PatchAll(typeof(AquaMai)); + } + catch (Exception ex) + { + LogSource.LogError($"AMDaemon.NET early initialization failed: {ex.Message}"); + return; + } + + // Prevent Chinese characters from being garbled + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) SetConsoleOutputCP(65001); + + AssemblyLoader.LoadAssemblies(); + + var modsAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Mods); + var coreAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Core); + SetCoreBuildInfo(coreAssembly); + SetCoreLogger(coreAssembly); + coreAssembly.GetType("AquaMai.Core.Startup") + .GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) + .Invoke(null, [modsAssembly, harmony]); + onGUIMethod = coreAssembly.GetType("AquaMai.Core.Startup") + .GetMethod("OnGUI", BindingFlags.Public | BindingFlags.Static); + } + + public void OnGUI() + { + onGUIMethod?.Invoke(null, []); + } + + [HarmonyLib.HarmonyPatch(typeof(AmManager), "Initialize")] + [HarmonyLib.HarmonyPrefix] + public static bool PreAmManagerInitialize() + { + return false; // Prevent AMDaemon.NET from initializing again + } +} diff --git a/AquaMai.BepInEx/Properties/AssemblyInfo.cs b/AquaMai.BepInEx/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..fabf7d00 --- /dev/null +++ b/AquaMai.BepInEx/Properties/AssemblyInfo.cs @@ -0,0 +1,16 @@ +using System.Reflection; + +[assembly: AssemblyTitle(AquaMai.BuildInfo.Description)] +[assembly: AssemblyDescription(AquaMai.BuildInfo.Description)] +[assembly: AssemblyCompany(AquaMai.BuildInfo.Company)] +[assembly: AssemblyProduct(AquaMai.BuildInfo.Name)] +[assembly: AssemblyCopyright("Created by " + AquaMai.BuildInfo.Author)] +[assembly: AssemblyTrademark(AquaMai.BuildInfo.Company)] +[assembly: AssemblyVersion(AquaMai.BuildInfo.Version)] +[assembly: AssemblyFileVersion(AquaMai.BuildInfo.GitVersion)] +// [assembly: HarmonyDontPatchAll] + +// Create and Setup a MelonGame Attribute to mark a Melon as Universal or Compatible with specific Games. +// If no MelonGame Attribute is found or any of the Values for any MelonGame Attribute on the Melon is null or empty it will be assumed the Melon is Universal. +// Values for MelonGame Attribute can be found in the Game's app.info file or printed at the top of every log directly beneath the Unity version. +// [assembly: MelonGame(null, null)] diff --git a/AquaMai.BepInEx/configSort.yaml b/AquaMai.BepInEx/configSort.yaml new file mode 100644 index 00000000..92ebafa8 --- /dev/null +++ b/AquaMai.BepInEx/configSort.yaml @@ -0,0 +1,96 @@ +常用: + - General + - GameSystem.SinglePlayer + - GameSystem.DisableTimeout + - UX.ImmediateSave + - GameSystem.QuickRetry + - UX.OneKeyEntryEnd + - UX.OneKeyRetrySkip + - GameSystem.TouchToButtonInput + - GameSystem.TestProof + - GameSettings.CreditConfig + - Fancy.GamePlay.ExtendNotesPool + +直读: + - GameSystem.Assets.LoadAssetBundleWithoutManifest + - GameSystem.Assets.LoadLocalImages + - GameSystem.Assets.MovieLoader + +全解和跳过: + - GameSystem.Unlock + - Tweaks.TimeSaving.SkipStartupWarning + - Tweaks.TimeSaving.EntryToMusicSelection + - Tweaks.TimeSaving.ExitToSave + - Tweaks.TimeSaving.SkipStartupDelays + - Tweaks.TimeSaving.SkipEventInfo + - Tweaks.TimeSaving.SkipTrackStart + - Tweaks.TimeSaving.SkipGoodbyeScreen + - Tweaks.TimeSaving.IWontTapOrSlideVigorously + - UX.QuickEndPlay + +美化: + - GameSystem.Assets.Fonts + - Fancy.CustomLogo + - Fancy.CustomPlaceName + - Fancy.CustomVersionString + - Fancy.CustomCreditsString + - Fancy.RandomBgm + - Fancy.CustomSkins + - Fancy.CustomButton + - Fancy.DemoMaster + - Fancy.GamePlay.AlignCircleSlideJudgeDisplay + - Fancy.GamePlay.SlideArrowAnimation + - Fancy.GamePlay.SlideFadeInTweak + - Fancy.GamePlay.SlideLayerReverse + +实用工具: + - UX.HideSelfMadeCharts + - UX.JudgeAccuracyInfo + - UX.PracticeMode + - UX.SelectionDetail + - UX.DisableLightOutGame + - Fancy.GamePlay.HideHanabi + - Fancy.GamePlay.JudgeDisplay4B + - Fancy.Triggers + +键位和灵敏度: + - GameSystem.HidInput + - GameSystem.AdxHidInput + - GameSystem.KeyMap + - GameSettings.TouchSensitivity + +调试: + - GameSystem.Window + - Utils.AntiLag + - Utils.DisplayTouchInGame + - GameSettings.JudgeAdjust + - Tweaks.IgnoreAimeServerError + - Utils.ShowNetErrorDetail + - Tweaks.LockFrameRate + - Tweaks.ResetTouch + - Tweaks.SkipUserVersionCheck + - Utils.DisplayFrameRate + - Utils.LogUserId + - Utils.LogNetworkRequests + - Utils.ShowErrorLog + - UX.NoAmDaemonAlert + +高级设置: + - Fancy.HideMask + - GameSettings.ForceAsServer + - GameSystem.RemoveEncryption + - GameSystem.Sound + - GameSystem.TouchPanelBaudRate + - GameSystem.TouchPanelBaudRate + - GameSystem.CustomCameraId + - GameSystem.OptionLoadFix + - UX.ServerAnnouncement + +过新过热: + - Fancy.CustomTrackStartDiff + - Fancy.GamePlay.BreakSlideJudgeBlink + - Fancy.GamePlay.CustomNoteTypes + - Fancy.GamePlay.DisableTrackStartTabs + - Fancy.GamePlay.FanJudgeFlip + - Fancy.GamePlay.RealisticRandomJudge + - Fancy.GamePlay.TrackStartProcessTweak diff --git a/AquaMai.Core/AquaMai.Core.csproj b/AquaMai.Core/AquaMai.Core.csproj index 5a2a9837..c4efeedb 100644 --- a/AquaMai.Core/AquaMai.Core.csproj +++ b/AquaMai.Core/AquaMai.Core.csproj @@ -33,6 +33,7 @@ + @@ -42,7 +43,6 @@ - diff --git a/AquaMai.Core/BuildInfo.cs b/AquaMai.Core/BuildInfo.cs index 2132ea96..422fa0f1 100644 --- a/AquaMai.Core/BuildInfo.cs +++ b/AquaMai.Core/BuildInfo.cs @@ -1,4 +1,4 @@ -using MelonLoader; +using System.Reflection; namespace AquaMai.Core; @@ -16,6 +16,6 @@ public static class BuildInfo public static string BuildDate; public static string DownloadLink; - public static MelonAssembly ModAssembly; + public static Assembly ModAssembly; } diff --git a/AquaMai.Core/ConfigLoader.cs b/AquaMai.Core/ConfigLoader.cs index e87088fc..41b41122 100644 --- a/AquaMai.Core/ConfigLoader.cs +++ b/AquaMai.Core/ConfigLoader.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.IO; using System.Reflection; -using MelonLoader; +using AquaMai.Core.Environment; using AquaMai.Config; using AquaMai.Config.Interfaces; using AquaMai.Config.Migration; diff --git a/AquaMai.Core/Environment/MelonLogger.cs b/AquaMai.Core/Environment/MelonLogger.cs new file mode 100644 index 00000000..f2ffaf6a --- /dev/null +++ b/AquaMai.Core/Environment/MelonLogger.cs @@ -0,0 +1,43 @@ +using System; + +namespace AquaMai.Core.Environment; + +public static class MelonLogger +{ + public static Action MsgStringAction = null; + public static Action MsgObjectAction = null; + public static Action ErrorStringAction = null; + public static Action ErrorObjectAction = null; + public static Action WarningStringAction = null; + public static Action WarningObjectAction = null; + + public static void Msg(string message) + { + MsgStringAction?.Invoke(message); + } + + public static void Msg(object message) + { + MsgObjectAction?.Invoke(message); + } + + public static void Error(string message) + { + ErrorStringAction?.Invoke(message); + } + + public static void Error(object message) + { + ErrorObjectAction?.Invoke(message); + } + + public static void Warning(string message) + { + WarningStringAction?.Invoke(message); + } + + public static void Warning(object message) + { + WarningObjectAction?.Invoke(message); + } +} diff --git a/AquaMai.Core/Helpers/EnableConditionHelper.cs b/AquaMai.Core/Helpers/EnableConditionHelper.cs index 475c24ae..9fead8cb 100644 --- a/AquaMai.Core/Helpers/EnableConditionHelper.cs +++ b/AquaMai.Core/Helpers/EnableConditionHelper.cs @@ -4,7 +4,7 @@ using AquaMai.Core.Attributes; using AquaMai.Core.Resources; using HarmonyLib; -using MelonLoader; +using AquaMai.Core.Environment; namespace AquaMai.Core.Helpers; diff --git a/AquaMai.Core/Helpers/FileSystem.cs b/AquaMai.Core/Helpers/FileSystem.cs index 3eab6f0b..f0608148 100644 --- a/AquaMai.Core/Helpers/FileSystem.cs +++ b/AquaMai.Core/Helpers/FileSystem.cs @@ -1,4 +1,3 @@ -using System; using System.IO; namespace AquaMai.Core.Helpers; @@ -7,9 +6,9 @@ public static class FileSystem { public static string ResolvePath(string path) { - var varExpanded = Environment.ExpandEnvironmentVariables(path); + var varExpanded = System.Environment.ExpandEnvironmentVariables(path); return Path.IsPathRooted(varExpanded) ? varExpanded - : Path.Combine(Environment.CurrentDirectory, varExpanded); + : Path.Combine(System.Environment.CurrentDirectory, varExpanded); } } diff --git a/AquaMai.Core/Helpers/KeyListener.cs b/AquaMai.Core/Helpers/KeyListener.cs index 0215dd4d..2b4c5657 100644 --- a/AquaMai.Core/Helpers/KeyListener.cs +++ b/AquaMai.Core/Helpers/KeyListener.cs @@ -5,7 +5,7 @@ using HarmonyLib; using Main; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Core.Helpers; diff --git a/AquaMai.Core/Helpers/MessageHelper.cs b/AquaMai.Core/Helpers/MessageHelper.cs index 6de142da..19e62f29 100644 --- a/AquaMai.Core/Helpers/MessageHelper.cs +++ b/AquaMai.Core/Helpers/MessageHelper.cs @@ -1,7 +1,7 @@ using DB; using HarmonyLib; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Process; using UnityEngine; @@ -39,4 +39,4 @@ public static void ShowMessage(string message, WindowSizeID size = WindowSizeID. sprite = sprite, }); } -} \ No newline at end of file +} diff --git a/AquaMai.Core/Helpers/NetPacketHook.cs b/AquaMai.Core/Helpers/NetPacketHook.cs index d20640d4..1643e7f4 100644 --- a/AquaMai.Core/Helpers/NetPacketHook.cs +++ b/AquaMai.Core/Helpers/NetPacketHook.cs @@ -2,7 +2,7 @@ using System.Text; using Net; using Net.Packet; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; using HarmonyLib; using System.IO; diff --git a/AquaMai.Core/Helpers/Shim.cs b/AquaMai.Core/Helpers/Shim.cs index 17a90f3d..629bd5d7 100644 --- a/AquaMai.Core/Helpers/Shim.cs +++ b/AquaMai.Core/Helpers/Shim.cs @@ -7,7 +7,7 @@ using MAI2.Util; using Manager; using Manager.UserDatas; -using MelonLoader; +using AquaMai.Core.Environment; using Net; using Net.Packet; using Net.Packet.Mai2; diff --git a/AquaMai.Core/Startup.cs b/AquaMai.Core/Startup.cs index b6c5bf85..ba1ddf8b 100644 --- a/AquaMai.Core/Startup.cs +++ b/AquaMai.Core/Startup.cs @@ -6,7 +6,7 @@ using AquaMai.Core.Attributes; using AquaMai.Core.Helpers; using AquaMai.Core.Resources; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Core; @@ -15,8 +15,8 @@ public class Startup { private static HarmonyLib.Harmony _harmony; - private static bool _hasErrors; - + private static bool _hasErrors; + private static bool _uiInit; private enum ModLifecycleMethod @@ -203,11 +203,11 @@ public static void Initialize(Assembly modsAssembly, HarmonyLib.Harmony harmony) } public static void OnGUI() - { - if (!_uiInit) - { + { + if (!_uiInit) + { _uiInit = true; - GuiSizes.SetupStyles(); + GuiSizes.SetupStyles(); } } } diff --git a/AquaMai.Mods/AquaMai.Mods.csproj b/AquaMai.Mods/AquaMai.Mods.csproj index 3811177a..b426af12 100644 --- a/AquaMai.Mods/AquaMai.Mods.csproj +++ b/AquaMai.Mods/AquaMai.Mods.csproj @@ -33,6 +33,7 @@ + @@ -43,7 +44,6 @@ - diff --git a/AquaMai.Mods/DeprecationWarning.cs b/AquaMai.Mods/DeprecationWarning.cs index 4afacde8..6f0c8e93 100644 --- a/AquaMai.Mods/DeprecationWarning.cs +++ b/AquaMai.Mods/DeprecationWarning.cs @@ -1,4 +1,5 @@ using AquaMai.Config.Attributes; +using AquaMai.Core.Environment; namespace AquaMai.Mods; @@ -23,7 +24,7 @@ public static void OnBeforeAllPatch() { if (v1_0_ModKeyMap_TestMode) { - MelonLoader.MelonLogger.Warning("ModKeyMap.TestMode has been deprecated (> v1.0). Please use GameSystem.KeyMap.Test instead."); + MelonLogger.Warning("ModKeyMap.TestMode has been deprecated (> v1.0). Please use GameSystem.KeyMap.Test instead."); } } } diff --git a/AquaMai.Mods/Enhancement/ServerAnnouncement.cs b/AquaMai.Mods/Enhancement/ServerAnnouncement.cs index 20ab399e..5afa16c7 100644 --- a/AquaMai.Mods/Enhancement/ServerAnnouncement.cs +++ b/AquaMai.Mods/Enhancement/ServerAnnouncement.cs @@ -6,7 +6,7 @@ using DB; using HarmonyLib; using JetBrains.Annotations; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; using Process; using UnityEngine; @@ -134,4 +134,4 @@ private static void EntryProcessOnStart() if (_announcement == null || !_announcement.showOnUserLogin) return; MessageHelper.ShowMessage(_announcement.announcement, title: _announcement.title, sprite: _sprite, size: WindowSizeID.LargeVerticalPostImage); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Enhancement/ServerNotice.cs b/AquaMai.Mods/Enhancement/ServerNotice.cs index 8c9b0766..59af62c9 100644 --- a/AquaMai.Mods/Enhancement/ServerNotice.cs +++ b/AquaMai.Mods/Enhancement/ServerNotice.cs @@ -3,7 +3,7 @@ using AquaMai.Core.Helpers; using AquaMai.Mods.Types; using JetBrains.Annotations; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; namespace AquaMai.Mods.Enhancement; @@ -53,4 +53,4 @@ private static Variant OnNetPacketComplete(string api, Variant request, Variant MessageHelper.ShowMessage(entry.content, title: entry.title); return null; } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Enhancement/ServerResources.cs b/AquaMai.Mods/Enhancement/ServerResources.cs index 67bc2854..fd1e1a91 100644 --- a/AquaMai.Mods/Enhancement/ServerResources.cs +++ b/AquaMai.Mods/Enhancement/ServerResources.cs @@ -10,7 +10,7 @@ using AquaMai.Core.Helpers; using AquaMai.Mods.Types; using HarmonyLib; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; using Monitor; using Process; @@ -239,4 +239,4 @@ private static bool VerifySignature(byte[] data, string signatureBase64) rsa.ImportParameters(param); return rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Fancy/CustomButton.cs b/AquaMai.Mods/Fancy/CustomButton.cs index 2ebb25d5..4ad6281d 100644 --- a/AquaMai.Mods/Fancy/CustomButton.cs +++ b/AquaMai.Mods/Fancy/CustomButton.cs @@ -2,7 +2,7 @@ using AquaMai.Core.Helpers; using HarmonyLib; using System.Reflection; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; using System.Collections.Generic; using System.IO; @@ -116,4 +116,4 @@ public static void ButtonManagerInitializePostfix(ButtonManager __instance) } } catch (Exception e) {MelonLogger.Msg($"[CustomButton] {e}");} } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Fancy/CustomSkins.cs b/AquaMai.Mods/Fancy/CustomSkins.cs index 46f6f422..c4a41b05 100644 --- a/AquaMai.Mods/Fancy/CustomSkins.cs +++ b/AquaMai.Mods/Fancy/CustomSkins.cs @@ -3,7 +3,7 @@ using AquaMai.Config.Attributes; using AquaMai.Core.Helpers; using HarmonyLib; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Monitor.Game; using Process; diff --git a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/CustomNoteTypes.cs b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/CustomNoteTypes.cs index 0614c970..9d8c6fb5 100644 --- a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/CustomNoteTypes.cs +++ b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/CustomNoteTypes.cs @@ -8,7 +8,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using UnityEngine; using AquaMai.Mods.Fancy.GamePlay.CustomNoteTypes.Libs; diff --git a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/CustomSlideNoteData.cs b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/CustomSlideNoteData.cs index a7531e8a..92e1d38f 100644 --- a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/CustomSlideNoteData.cs +++ b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/CustomSlideNoteData.cs @@ -2,7 +2,7 @@ using System.Linq; using DB; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Mods.Fancy.GamePlay.CustomNoteTypes.Libs; diff --git a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/SlideCodeParser.cs b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/SlideCodeParser.cs index 1aaeb7a4..f42cef0d 100644 --- a/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/SlideCodeParser.cs +++ b/AquaMai.Mods/Fancy/GamePlay/CustomNoteTypes/Libs/SlideCodeParser.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; -using MelonLoader; +using AquaMai.Core.Environment; namespace AquaMai.Mods.Fancy.GamePlay.CustomNoteTypes.Libs; diff --git a/AquaMai.Mods/Fancy/RandomBgm.cs b/AquaMai.Mods/Fancy/RandomBgm.cs index bec48456..dda9f018 100644 --- a/AquaMai.Mods/Fancy/RandomBgm.cs +++ b/AquaMai.Mods/Fancy/RandomBgm.cs @@ -7,7 +7,7 @@ using Mai2.Mai2Cue; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; namespace AquaMai.Mods.Fancy; diff --git a/AquaMai.Mods/Fix/DebugFeature.cs b/AquaMai.Mods/Fix/DebugFeature.cs index 0005f805..04152446 100644 --- a/AquaMai.Mods/Fix/DebugFeature.cs +++ b/AquaMai.Mods/Fix/DebugFeature.cs @@ -5,7 +5,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; using UnityEngine; diff --git a/AquaMai.Mods/Fix/DisableReboot.cs b/AquaMai.Mods/Fix/DisableReboot.cs index a4fe6316..cf6716c4 100644 --- a/AquaMai.Mods/Fix/DisableReboot.cs +++ b/AquaMai.Mods/Fix/DisableReboot.cs @@ -4,7 +4,7 @@ using AquaMai.Core.Attributes; using HarmonyLib; using Manager.Operation; -using MelonLoader; +using AquaMai.Core.Environment; namespace AquaMai.Mods.Fix; diff --git a/AquaMai.Mods/Fix/Stability/FixMissingCharaCrash.cs b/AquaMai.Mods/Fix/Stability/FixMissingCharaCrash.cs index 916fb1d4..80cadb37 100644 --- a/AquaMai.Mods/Fix/Stability/FixMissingCharaCrash.cs +++ b/AquaMai.Mods/Fix/Stability/FixMissingCharaCrash.cs @@ -4,7 +4,7 @@ using HarmonyLib; using Manager; using Manager.MaiStudio; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; using Util; diff --git a/AquaMai.Mods/Fix/Stability/SanitizeUserData.cs b/AquaMai.Mods/Fix/Stability/SanitizeUserData.cs index 0ddae205..7056a26d 100644 --- a/AquaMai.Mods/Fix/Stability/SanitizeUserData.cs +++ b/AquaMai.Mods/Fix/Stability/SanitizeUserData.cs @@ -6,7 +6,7 @@ using AquaMai.Config.Attributes; using AquaMai.Core.Helpers; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; using Net.VO.Mai2; @@ -371,4 +371,4 @@ private static System.Type ResolveEnumType(string enumName) } return result; } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/GameSettings/TouchSensitivity.cs b/AquaMai.Mods/GameSettings/TouchSensitivity.cs index 181901cf..ce495965 100644 --- a/AquaMai.Mods/GameSettings/TouchSensitivity.cs +++ b/AquaMai.Mods/GameSettings/TouchSensitivity.cs @@ -4,7 +4,7 @@ using HarmonyLib; using IO; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; namespace AquaMai.Mods.GameSettings; diff --git a/AquaMai.Mods/GameSystem/AdxHidInput.cs b/AquaMai.Mods/GameSystem/AdxHidInput.cs index 1ea936cd..585d8465 100644 --- a/AquaMai.Mods/GameSystem/AdxHidInput.cs +++ b/AquaMai.Mods/GameSystem/AdxHidInput.cs @@ -7,7 +7,7 @@ using AquaMai.Config.Types; using HarmonyLib; using HidLibrary; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Mods.GameSystem; @@ -157,4 +157,4 @@ public static bool Prefix( return false; } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/GameSystem/Assets/Fonts.cs b/AquaMai.Mods/GameSystem/Assets/Fonts.cs index 9204915c..7b737b3f 100644 --- a/AquaMai.Mods/GameSystem/Assets/Fonts.cs +++ b/AquaMai.Mods/GameSystem/Assets/Fonts.cs @@ -3,7 +3,7 @@ using AquaMai.Config.Attributes; using AquaMai.Core.Helpers; using HarmonyLib; -using MelonLoader; +using AquaMai.Core.Environment; using TMPro; using UnityEngine; using UnityEngine.TextCore.LowLevel; diff --git a/AquaMai.Mods/GameSystem/Assets/LoadLocalImages.cs b/AquaMai.Mods/GameSystem/Assets/LoadLocalImages.cs index d1585815..f2d0e970 100644 --- a/AquaMai.Mods/GameSystem/Assets/LoadLocalImages.cs +++ b/AquaMai.Mods/GameSystem/Assets/LoadLocalImages.cs @@ -7,7 +7,7 @@ using System.Text.RegularExpressions; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using AquaMai.Config.Attributes; using AquaMai.Core.Helpers; diff --git a/AquaMai.Mods/GameSystem/Assets/MovieLoader.cs b/AquaMai.Mods/GameSystem/Assets/MovieLoader.cs index 14cc1267..bbe21e15 100644 --- a/AquaMai.Mods/GameSystem/Assets/MovieLoader.cs +++ b/AquaMai.Mods/GameSystem/Assets/MovieLoader.cs @@ -7,7 +7,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Monitor.Game; using UnityEngine; diff --git a/AquaMai.Mods/GameSystem/CustomCameraId.cs b/AquaMai.Mods/GameSystem/CustomCameraId.cs index 2bddfb54..1b5fcf8b 100644 --- a/AquaMai.Mods/GameSystem/CustomCameraId.cs +++ b/AquaMai.Mods/GameSystem/CustomCameraId.cs @@ -4,7 +4,7 @@ using System.Linq; using HarmonyLib; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; using AquaMai.Config.Attributes; using AquaMai.Core.Helpers; @@ -151,4 +151,4 @@ public static void OnBeforePatch() MelonLogger.Msg($"[CustomCameraId] {line}"); } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/GameSystem/DisableTimeout.cs b/AquaMai.Mods/GameSystem/DisableTimeout.cs index 0b628fac..9005bbde 100644 --- a/AquaMai.Mods/GameSystem/DisableTimeout.cs +++ b/AquaMai.Mods/GameSystem/DisableTimeout.cs @@ -4,7 +4,7 @@ using AquaMai.Core.Attributes; using HarmonyLib; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; using Process.Entry.State; @@ -128,4 +128,4 @@ public static void ContinueMonitorPlayContinue(PlayableDirector ____director) ____director.extrapolationMode = DirectorWrapMode.Hold; } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/GameSystem/KeyMap.cs b/AquaMai.Mods/GameSystem/KeyMap.cs index 6da8a52d..e8776648 100644 --- a/AquaMai.Mods/GameSystem/KeyMap.cs +++ b/AquaMai.Mods/GameSystem/KeyMap.cs @@ -47,7 +47,7 @@ 如果使用 IO4 模拟,你可以在 segatools.ini 的 [io4] 和 [button] 部 public static readonly bool disableDebugInput = false; // Implemented in AquaMai.Mods/Fix/Common.cs [EnableIf(nameof(disableIO4))] - [HarmonyPatch("IO.Jvs+JvsSwitch", ".ctor", MethodType.Constructor, [typeof(int), typeof(string), typeof(KeyCode), typeof(bool), typeof(bool)])] + [HarmonyPatch("IO.Jvs+JvsSwitch, Assembly-CSharp", ".ctor", MethodType.Constructor, [typeof(int), typeof(string), typeof(KeyCode), typeof(bool), typeof(bool)])] [HarmonyPrefix] public static void PreJvsSwitchConstructor(ref bool invert) { diff --git a/AquaMai.Mods/GameSystem/SinglePlayer.ExteraMouseInput.cs b/AquaMai.Mods/GameSystem/SinglePlayer.ExteraMouseInput.cs index a1ac9ac2..16318009 100644 --- a/AquaMai.Mods/GameSystem/SinglePlayer.ExteraMouseInput.cs +++ b/AquaMai.Mods/GameSystem/SinglePlayer.ExteraMouseInput.cs @@ -1,4 +1,5 @@ using AquaMai.Config.Attributes; +using AquaMai.Core.Environment; using HarmonyLib; using System; using System.Collections; @@ -33,7 +34,7 @@ public static void MouseTouchPanelStart(MouseTouchPanel __instance) { return; } - MelonLoader.MelonLogger.Msg("ExteraMouseInput: Start"); + MelonLogger.Msg("ExteraMouseInput: Start"); leftCanvas = __instance.transform.parent.GetComponent(); UnityEngine.Object.Destroy(__instance.transform.parent.GetComponent()); MeshButtonRaycaster radiusRaycaster = __instance.transform.parent.gameObject.AddComponent(); diff --git a/AquaMai.Mods/GameSystem/SinglePlayer.cs b/AquaMai.Mods/GameSystem/SinglePlayer.cs index 29d0bcfb..e1120f4a 100644 --- a/AquaMai.Mods/GameSystem/SinglePlayer.cs +++ b/AquaMai.Mods/GameSystem/SinglePlayer.cs @@ -7,7 +7,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Monitor.Common; using Monitor.Entry; @@ -126,4 +126,4 @@ public static void OnAfterPatch() { Core.Helpers.GuiSizes.SinglePlayer = true; } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/GameSystem/Unlock.cs b/AquaMai.Mods/GameSystem/Unlock.cs index dfc1f5dc..1c94a9ec 100644 --- a/AquaMai.Mods/GameSystem/Unlock.cs +++ b/AquaMai.Mods/GameSystem/Unlock.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using System.Reflection; using System.Linq; -using MelonLoader; +using AquaMai.Core.Environment; using System.Collections; using Manager.UserDatas; using Net.VO.Mai2; diff --git a/AquaMai.Mods/GameSystem/Window.cs b/AquaMai.Mods/GameSystem/Window.cs index 26b8066b..ffaa3661 100644 --- a/AquaMai.Mods/GameSystem/Window.cs +++ b/AquaMai.Mods/GameSystem/Window.cs @@ -59,6 +59,7 @@ public static void OnBeforePatch() Screen.SetResolution(width, height, FullScreenMode.Windowed); } + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return; hwnd = GetWindowHandle(); if (alreadyWindowed) { @@ -84,6 +85,7 @@ public static void OnBeforePatch() public static void SetResizeable() { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return; if (hwnd == IntPtr.Zero) return; if (borderless) { diff --git a/AquaMai.Mods/Tweaks/ResetTouch.cs b/AquaMai.Mods/Tweaks/ResetTouch.cs index 64c79d32..b6f751a0 100644 --- a/AquaMai.Mods/Tweaks/ResetTouch.cs +++ b/AquaMai.Mods/Tweaks/ResetTouch.cs @@ -1,5 +1,6 @@ using AquaMai.Config.Attributes; using AquaMai.Config.Types; +using AquaMai.Core.Environment; using AquaMai.Core.Helpers; using AquaMai.Core.Resources; using HarmonyLib; @@ -29,7 +30,7 @@ public static void ResultProcessOnStart() { if (!afterTrack) return; SingletonStateMachine.Instance.StartTouchPanel(); - MelonLoader.MelonLogger.Msg("[TouchResetAfterTrack] Touch panel reset"); + MelonLogger.Msg("[TouchResetAfterTrack] Touch panel reset"); } [HarmonyPostfix] @@ -40,4 +41,4 @@ public static void OnGameMainObjectUpdate() SingletonStateMachine.Instance.StartTouchPanel(); MessageHelper.ShowMessage(Locale.TouchPanelReset); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/DisableLightOutGame.cs b/AquaMai.Mods/UX/DisableLightOutGame.cs index 1a7b3932..19f27bc8 100644 --- a/AquaMai.Mods/UX/DisableLightOutGame.cs +++ b/AquaMai.Mods/UX/DisableLightOutGame.cs @@ -2,7 +2,7 @@ using HarmonyLib; using IO; using Mecha; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; @@ -49,4 +49,4 @@ public static void AdvertiseProcessStart() { MechaManager.SetAllCuOff(); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/HideSelfMadeCharts.cs b/AquaMai.Mods/UX/HideSelfMadeCharts.cs index 96f9c717..47f9f55e 100644 --- a/AquaMai.Mods/UX/HideSelfMadeCharts.cs +++ b/AquaMai.Mods/UX/HideSelfMadeCharts.cs @@ -10,7 +10,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Process; using Util; @@ -138,4 +138,4 @@ public static void EntryProcessOnStart(ref EntryProcess __instance) // reset status on login isShowSelfMadeCharts = !defaultHide; } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/ImmediateSave.cs b/AquaMai.Mods/UX/ImmediateSave.cs index 92b35028..2d3f3a96 100644 --- a/AquaMai.Mods/UX/ImmediateSave.cs +++ b/AquaMai.Mods/UX/ImmediateSave.cs @@ -13,7 +13,7 @@ using Manager; using Manager.MaiStudio; using Manager.UserDatas; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor.Entry.Parts.Screens; using Net.Packet; using Net.Packet.Helper; @@ -249,4 +249,4 @@ public void OnGUI() GUI.Label(rect, Locale.SavingDontExit); } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/OneKeyEntryEnd.cs b/AquaMai.Mods/UX/OneKeyEntryEnd.cs index 5b3e71b9..8c93da27 100644 --- a/AquaMai.Mods/UX/OneKeyEntryEnd.cs +++ b/AquaMai.Mods/UX/OneKeyEntryEnd.cs @@ -8,7 +8,7 @@ using Mai2.Mai2Cue; using Main; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Process; namespace AquaMai.Mods.UX; @@ -85,4 +85,4 @@ public static void DoQuickSkip() new MusicSelectProcess(SharedInstances.ProcessDataContainer))); } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/OneKeyRetrySkip.cs b/AquaMai.Mods/UX/OneKeyRetrySkip.cs index 69ba0fc5..0b1b069c 100644 --- a/AquaMai.Mods/UX/OneKeyRetrySkip.cs +++ b/AquaMai.Mods/UX/OneKeyRetrySkip.cs @@ -4,7 +4,7 @@ using HarmonyLib; using MAI2.Util; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Process; namespace AquaMai.Mods.UX; @@ -66,4 +66,4 @@ public static void PostGameProcessUpdate(GameProcess __instance, Message[] ____m Singleton.Instance.SetQuickRetryFrag(flag: true); } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/UX/SelectionDetail.cs b/AquaMai.Mods/UX/SelectionDetail.cs index ef914c7a..ac045f5b 100644 --- a/AquaMai.Mods/UX/SelectionDetail.cs +++ b/AquaMai.Mods/UX/SelectionDetail.cs @@ -10,7 +10,7 @@ using Manager; using Manager.MaiStudio; using Manager.UserDatas; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; using UnityEngine; @@ -163,4 +163,4 @@ public void Close() Destroy(this); } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Utils/AntiLag.cs b/AquaMai.Mods/Utils/AntiLag.cs index 1266b254..1e206928 100644 --- a/AquaMai.Mods/Utils/AntiLag.cs +++ b/AquaMai.Mods/Utils/AntiLag.cs @@ -2,7 +2,7 @@ using AquaMai.Config.Attributes; using HarmonyLib; using Main; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Mods.Utils; @@ -41,7 +41,8 @@ private void OnTimer() #if DEBUG MelonLogger.Msg("[AntiLag] Trigger"); #endif + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) return; keybd_event(CTRL, 0, KEYEVENTF_KEYDOWN, 0); keybd_event(CTRL, 0, KEYEVENTF_KEYUP, 0); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Utils/DisplayTouchInGame.cs b/AquaMai.Mods/Utils/DisplayTouchInGame.cs index 611c126f..45c1ccfa 100644 --- a/AquaMai.Mods/Utils/DisplayTouchInGame.cs +++ b/AquaMai.Mods/Utils/DisplayTouchInGame.cs @@ -7,7 +7,7 @@ using AquaMai.Mods.UX.PracticeMode; using HarmonyLib; using Manager; -using MelonLoader; +using AquaMai.Core.Environment; using Monitor; using Process; using TMPro; @@ -197,4 +197,4 @@ private void OnGUI() } } } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Utils/LogNetworkErrors.cs b/AquaMai.Mods/Utils/LogNetworkErrors.cs index 73f59923..4e66ba4a 100644 --- a/AquaMai.Mods/Utils/LogNetworkErrors.cs +++ b/AquaMai.Mods/Utils/LogNetworkErrors.cs @@ -3,7 +3,7 @@ using HarmonyLib; using Manager; using Manager.Operation; -using MelonLoader; +using AquaMai.Core.Environment; using Net.Packet; namespace AquaMai.Mods.Utils; diff --git a/AquaMai.Mods/Utils/LogNetworkRequests.cs b/AquaMai.Mods/Utils/LogNetworkRequests.cs index dfee58c3..7cb4f3ca 100644 --- a/AquaMai.Mods/Utils/LogNetworkRequests.cs +++ b/AquaMai.Mods/Utils/LogNetworkRequests.cs @@ -6,7 +6,7 @@ using System.Text; using Net; using Net.Packet; -using MelonLoader; +using AquaMai.Core.Environment; using MelonLoader.TinyJSON; using HarmonyLib; using AquaMai.Core.Attributes; diff --git a/AquaMai.Mods/Utils/LogUnity.cs b/AquaMai.Mods/Utils/LogUnity.cs index 3826feba..f1d8e236 100644 --- a/AquaMai.Mods/Utils/LogUnity.cs +++ b/AquaMai.Mods/Utils/LogUnity.cs @@ -1,5 +1,5 @@ using AquaMai.Config.Attributes; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; namespace AquaMai.Mods.Utils; @@ -20,4 +20,4 @@ private static void Log(string msg, string stackTrace, LogType type) MelonLogger.Msg("[Unity] " + msg); MelonLogger.Msg("[Unity] " + stackTrace); } -} \ No newline at end of file +} diff --git a/AquaMai.Mods/Utils/LogUserId.cs b/AquaMai.Mods/Utils/LogUserId.cs index ff1fc73b..674cd37e 100644 --- a/AquaMai.Mods/Utils/LogUserId.cs +++ b/AquaMai.Mods/Utils/LogUserId.cs @@ -1,7 +1,7 @@ using System; using AquaMai.Config.Attributes; using HarmonyLib; -using MelonLoader; +using AquaMai.Core.Environment; using Net.Packet; using Net.Packet.Mai2; using Net.VO.Mai2; diff --git a/AquaMai.Mods/Utils/ShowErrorLog.cs b/AquaMai.Mods/Utils/ShowErrorLog.cs index 2f359248..c42dcb85 100644 --- a/AquaMai.Mods/Utils/ShowErrorLog.cs +++ b/AquaMai.Mods/Utils/ShowErrorLog.cs @@ -9,7 +9,7 @@ using AquaMai.Core.Helpers; using HarmonyLib; using Main; -using MelonLoader; +using AquaMai.Core.Environment; using UnityEngine; using BuildInfo = AquaMai.Core.BuildInfo; @@ -87,13 +87,13 @@ public static void ApplicationOnQuittingNew() private static Stream GetErrorReporterStream() { - var s = BuildInfo.ModAssembly.Assembly.GetManifestResourceStream("AquaMai.ErrorReport.exe"); + var s = BuildInfo.ModAssembly.GetManifestResourceStream("AquaMai.ErrorReport.exe"); if (s != null) { return s; } - s = BuildInfo.ModAssembly.Assembly.GetManifestResourceStream("AquaMai.ErrorReport.exe.compressed"); + s = BuildInfo.ModAssembly.GetManifestResourceStream("AquaMai.ErrorReport.exe.compressed"); return new DeflateStream(s, CompressionMode.Decompress); } @@ -144,4 +144,4 @@ public IEnumerator Show() } } } -} \ No newline at end of file +} diff --git a/AquaMai.sln b/AquaMai.sln index 3cfdcbcb..4ada5ed2 100644 --- a/AquaMai.sln +++ b/AquaMai.sln @@ -38,8 +38,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai", "AquaMai\AquaMai. {8731C0E0-53BE-4B1B-9828-193E738C6865} = {8731C0E0-53BE-4B1B-9828-193E738C6865} EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.BepInEx", "AquaMai.BepInEx\AquaMai.BepInEx.csproj", "{01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}" + ProjectSection(ProjectDependencies) = postProject + {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} = {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} + {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} = {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} + {8731C0E0-53BE-4B1B-9828-193E738C6865} = {8731C0E0-53BE-4B1B-9828-193E738C6865} + EndProjectSection +EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.ErrorReport", "AquaMai.ErrorReport\AquaMai.ErrorReport.csproj", "{F7E471E4-92B5-44A2-AFA3-7089AFEB6605}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonLoader.TinyJSON", "MelonLoader.TinyJSON\MelonLoader.TinyJSON.csproj", "{604377A8-CC01-417B-9D4F-22F50DD31014}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Release|Any CPU = Release|Any CPU @@ -74,10 +83,18 @@ Global {788BC472-59F7-46F6-B760-65C18BA74389}.Release|Any CPU.Build.0 = Release|Any CPU {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Release|Any CPU.Build.0 = Release|Any CPU + {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Release|Any CPU.ActiveCfg = Release|Any CPU {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Release|Any CPU.Build.0 = Release|Any CPU {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Debug|Any CPU.Build.0 = Debug|Any CPU + {604377A8-CC01-417B-9D4F-22F50DD31014}.Release|Any CPU.ActiveCfg = Release|Any CPU + {604377A8-CC01-417B-9D4F-22F50DD31014}.Release|Any CPU.Build.0 = Release|Any CPU + {604377A8-CC01-417B-9D4F-22F50DD31014}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {604377A8-CC01-417B-9D4F-22F50DD31014}.Debug|Any CPU.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AquaMai/AquaMai.csproj b/AquaMai/AquaMai.csproj index 392b8656..6460fec3 100644 --- a/AquaMai/AquaMai.csproj +++ b/AquaMai/AquaMai.csproj @@ -34,6 +34,7 @@ + @@ -57,6 +58,9 @@ + + MelonLoader.TinyJSON.dll + AquaMai.Config.Interfaces.dll diff --git a/AquaMai/AssemblyLoader.cs b/AquaMai/AssemblyLoader.cs index 85513061..967b0b92 100644 --- a/AquaMai/AssemblyLoader.cs +++ b/AquaMai/AssemblyLoader.cs @@ -10,6 +10,7 @@ public static class AssemblyLoader { public enum AssemblyName { + TinyJSON, ConfigInterfaces, Config, Core, @@ -18,6 +19,7 @@ public enum AssemblyName private static readonly Dictionary Assemblies = new() { + [AssemblyName.TinyJSON] = "MelonLoader.TinyJSON.dll", [AssemblyName.ConfigInterfaces] = "AquaMai.Config.Interfaces.dll", [AssemblyName.Config] = "AquaMai.Config.dll", [AssemblyName.Core] = "AquaMai.Core.dll", diff --git a/AquaMai/Main.cs b/AquaMai/Main.cs index fe0befc2..70ce3748 100644 --- a/AquaMai/Main.cs +++ b/AquaMai/Main.cs @@ -1,4 +1,5 @@ -using System.Reflection; +using System; +using System.Reflection; using System.Runtime.InteropServices; using MelonLoader; @@ -22,7 +23,18 @@ private void SetCoreBuildInfo(Assembly coreAssembly) { coreBuildInfo.GetField(field.Name)?.SetValue(null, field.GetValue(null)); } - coreBuildInfo.GetField("ModAssembly")?.SetValue(null, MelonAssembly); + coreBuildInfo.GetField("ModAssembly")?.SetValue(null, MelonAssembly.Assembly); + } + + private void SetCoreLogger(Assembly coreAssembly) + { + var coreLogger = coreAssembly.GetType("AquaMai.Core.Environment.MelonLogger"); + coreLogger.GetField("MsgStringAction").SetValue(null, (Action)MelonLogger.Msg); + coreLogger.GetField("MsgObjectAction").SetValue(null, (Action)MelonLogger.Msg); + coreLogger.GetField("ErrorStringAction").SetValue(null, (Action)MelonLogger.Error); + coreLogger.GetField("ErrorObjectAction").SetValue(null, (Action)MelonLogger.Error); + coreLogger.GetField("WarningStringAction").SetValue(null, (Action)MelonLogger.Warning); + coreLogger.GetField("WarningObjectAction").SetValue(null, (Action)MelonLogger.Warning); } private static MethodInfo onGUIMethod; @@ -30,13 +42,14 @@ private void SetCoreBuildInfo(Assembly coreAssembly) public override void OnInitializeMelon() { // Prevent Chinese characters from being garbled - SetConsoleOutputCP(65001); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) SetConsoleOutputCP(65001); AssemblyLoader.LoadAssemblies(); var modsAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Mods); var coreAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Core); SetCoreBuildInfo(coreAssembly); + SetCoreLogger(coreAssembly); coreAssembly.GetType("AquaMai.Core.Startup") .GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) .Invoke(null, [modsAssembly, HarmonyInstance]); diff --git a/Libs/0Harmony.dll b/Libs/0Harmony.dll index 0b9bdf1d7f998a91cddd65ad7c4d1e241e6e7ff7..99daef723fd1dd2189780b60d5a2f12c2a3e4e34 100644 GIT binary patch literal 204800 zcmc${37jNFnfITaS(Q~?-90na-BUgHGy~NnbqvD{$1ouGp~x-5aNh_hBvdhqQ&ib_ zi!k1@qN0w1H{Ob__kHhp?<&lCyX&#*`s%u?yUqXmdm^hUtEWfV_p|@cTc7UCh$o(S z;)y4oc;b#c?SdD3f#-P{{vUb7^B&}_-!b<5%a2)t7p?usBJcgfU)$%wp;N!M&pFp# z*POno5kIMM`3=)oUVh_^@h#I=Ts_^`cH{JQH%^~$#uKJ*h_AYO{n%Jxzl8LeCwktg zLxJ~qpNOB+P3?!?y6KUj4W3tmv%G`ecrfm1+{cJpZ;82m$F~6D-+r@%1J^I`j)CS9 z`|H0GuS4-xLH7)~p?h$TND`>mWq~)UH+ZY`ezd>o9_tn(kN>f$xa)7Z`qo?U-!hrx zOLUk3z0`FMJlTI<% zMj@{(_~H74!`gw-0YWq?p*`aYfZ9}4HMru3Mmw(ItduHKm2Xa;a_~<-KYhRxpLpK| zspxSXgslmuJG=;0E>w;}1_$9l1{>wS0RJZEKUlA9`w)R= z{MAztaYI}|&$T*mFvNMNkb^cN%Rp+FmxL{^-sU$N<2@RQ3mWF?(c;&Dq%w33i zD0&Ql_$WP&<}vDm;$v{l`-4k9W+p?0nd>8ya&_;?`A6L?Hyi`f{Hgo+u-@&HNV zoXH1ccG8y zT!JqJ>}R5RIv6Ng68N?S0wcsw&BtegI2@nFv+)J7@OcW(#R^Ou>69lj#f+t$3FpFL z3a)uJ@gmGmHAM{^k#l7cog>N%6hr((0xDLYi#=WGs|uPRRWV(8CGV_sr664iGwm{^ z)>%#g1mk{uE_7Te}|U%6sar zeXWpo^%P=fDSE+>7tTt5njnX>D{)mOHe@~JGbEq8$oxtx%e4njmW;w=bQ#18VSPp8 zJCsr%!>UK~asszEemIm4i7`=y=t>@a?8)X;_{;ItdUmei8OBfI*}0ZSe4QTG^VkJn zj)CaOcyE!H!Vr%Xrj)jQgsdmZU2*7BSJ2B2MzKQ4j6v%!$1$j*d zD7gLpGTob@=*NvmO*in)hbp$N=od;O)yIdqdq(?G$#>pN5yVZ%jSbgw!x4p0t;`RP zXm$�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�Y*r+#Cg9S`aGfdAHffM#CGvkHk`0{b$6 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%0AqZSm-&!O84SLvGB+_ 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 J|NieN@K3@17}ZO9%)A+4q1z*!Nv>p*ulH)6IZ_ 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 diff --git a/Libs/BepInEx.Harmony.dll b/Libs/BepInEx.Harmony.dll new file mode 100644 index 0000000000000000000000000000000000000000..5ee21c936e96922c1cac8e0e635cde4f4f8f16d7 GIT binary patch literal 6656 zcmeHLeQX@X6@R;XzSt&q%q1a#IL_v?M~siVi!UK14gO3p*oo_N9Ne1Ndw1*e!rty> zcaP*+1-XS%rBtQ#OHhQGs;CtbMHCfEDz#9gihq&{iTnYogg~l52vLw){%9+pzc;&k zKHEuX|3%Dd-n_4Q^XAQ)*_|Ev%J)ejq6q3IpAbEVmP?O-mk09@w{H4} zj_c$>3Ez5vL{Vd?b)^U1Cmh|hp~$|{3@Y1Nk6KrHi2CYCf&K^c=fb|p)Ig1!iO#`@ zB)I=S=#b;9iJEtAk(KxwMs_H29C3~A*g2+jHOgz^YniLa_El&Vp(i*`%l10v+zrPg z+q>57xEn4+K907cuZxK^Z=YvL9NbRP>l(I`j&DFC#}Soijab119D#l(w;NeA;kJN1 z&qiy!EfGcdwiAKL-qI%pv*sAyl};oRndF}I9*#i+nSl3V9$W7w`T#BW+nV(p!z#M0 zvAzk0(QZAGrFP)FoLdhb85%%)9q2Pi@vVKPodeAUzDY+no@r|80P$~W7a<%R^G&D? zzML?1VF&&rmxUKt6oI3}%%j0pT2 zQX4&^tcn}~r3hJ5Kt)K|+(udSW7$gDO-Xtb;g#s;G^(<>`xpEYfQtwr)O(a1+jjKC|xJdSqpzeY7S0Ur|9l^>;bT4q39uu6$sI5&F97%9was)pb zS>Q*Jpv-S;^ZQDH&IL|JdKWg?S`)EHR{}QB)dJrP*i0$FHrflgmU;yo67b6cP70_A zXb5;*z^Z_!0k5G40adI5+kZ{Khly9>Vc?zg8~T-;0(?r|OMjv#u>LE-AEkHbMVb)O z3i$s}PSL-JBlx(m5Tmv95Dvuc0;T}B(f#xmCFlwPSJS(|H_$%;x6*1UL7mhNxQn&` z-iWMCP(Nvaw~_^zrTYQDN>2dh=`7%#LdON{r>|p|^wT|5RAz+z8Q||rd4bOZ?~u;` zn({B`hZy|@!FfY)NV6X6;qxCrB)IU-UnrZnVO$!omUZ$N)GRtW4VDaVKsWWG z=IPX1EIK~cZ((*Fq4luTDhz{l*oHFL(v4e zH(+Q*%XU2@?^03srfaJ^WEG6O?ov5i?vN354Ca;?vXBaPIjcK&3H>GFFn?=uKOgaF zfei=q2X&A4gB$u<%OaP?9nEq@^1Df!(NU zE{^JUiPqINnfl`6D%5eyN+(l$iByR;1WTo!@KadDQNcRAOMFxODT{|FBT+ISIt$(T zLOuteYxz{Smdx$hlT4*kyEC(Rw7s*LnHNYJ8Re`*8c-bfym)Z`WfcrWt5LszdIqvHbuzHTy@T7ZjAaM1 zM<;)9>b3-W8FwGIou>8*$T^H{YA^l`KsmsDpXX>+v@*PY3Hke;LJ3jmf_b6J%XFdLR za9a=2%Q!^C^0LA=w+VbtPXi9p7_cGyX*mRX2=IXa*M2Rp;CQ4|(9vSq4@85C&_)=5Nr zF;B(4Cyb?m8LO0rcPZR)xQq(l4hJ@Ph1s_-MojU_eOhc6eDv376!vWRT|s=kx|x2O z9sF~EXA-=s@4qy{i{smgak?>10W}w3I{ePVQa9QpxO?#MoYSbgDT562tA;2rp2V#$ z4PB-*5tkdp8uubzF6Li?4HJ=8v70zY7gl?*FQV(`;IkM3)&FPQ9v--##W{XHr%OiQ Eza@f53IG5A literal 0 HcmV?d00001 diff --git a/Libs/BepInEx.dll b/Libs/BepInEx.dll new file mode 100644 index 0000000000000000000000000000000000000000..2fad63285d53f277fbb23d4b8db675b607a9f0c8 GIT binary patch literal 128000 zcmbrn37izg`95CLJ=-(ed$6;+%q+VLyMVK{b1blc0?Oe52!aO)0)pUu)7S$ZtTT@H z1>PD%yh36UbC|^YzLJ=z(V)>pqi)nhlNdEdV-6G7|MR@nJqN7G_xJhl2ddtB->SFX zdh4ybx@O^uE0n2}3giFhpDT4AeE!W6_rE(ukQ=)mXjFIAK0Erp(1K@2AAH>Lx$bqI zd#rc($=ydDzILs1_7U4qsvB@Oe5INM21vR27x-!okP=0qT(iz+RQ@abevl~q zodmuI5CGo~sfg|WW*Mp;xUbh5>fr5Z|1I3DRJ4K~MR?zeaPRt~PhXF)^JkP1G%2eu zcMuKeHN9TWI}!+y4KhkWKR}v_zgbGn>h+F3$wfrUsvxr>ua9P%0Lhn!RCP*;@_%wh8U0zM>=gW7-ycWcGaOW?ZJ2qIjc}e+qb4szaBdlIs^##J zZ_M0)3hS^9t9OBwnd?koOyO#Y>-GVW8RtwCJo#9Xmph60gfm(2WNh`*b$5l6il-7O zKcD^ll63c-`NWUAcUiLJ))f_*xVs_xG9O*e!<|xrE@$CRB{~K9BkB_Hg*IcY9!jxp z#O7ucCmGkG+s!I@N-K)BiB2}$)0(auj1zXJfy35hLMyDUIg~tQIOEX?;t}@awHZ>V z`eq|}N}TcN1n~&#c+T$Nidqn@r`ii>A7KQG;`bJ65Og;i%1ZSW(89uodnE(yg@_+d z{N4ggxD>CpGM??n6Ti1m$9UIjelS7s`!WN2ZMzyeaQ1*KP8-@X^<=76C<#q1W_U}W zr>-`4I_S3H<;$Tu!@IQ{syDo6%b^Ct`=lId2^(H*sKlnFCXyXp_$@?8W_x=I0{{lC zn;=W>3OLCkDe2+c_CZaFSP^FiGGEVdkp-+p>Nl!W-&{^jN@eQWiqur2h173Wr@n=$ zH%Z>4Aobos-j+_yaFL3RBK2FQqu8l zvxCfIVV$0cBC9V}gY>_zPX9Hgzh2Ulg7kAr>1%X)B8seXv7?MFrqw!VrbBTDXsbZ2 z0?h*YXtZvtz$8F3XCIBmV5N>Q`Wt|{?09oryQGHGhE}0LMB=obW)VH#^`7IcwrXOh{Ns! zt(H2DDwvAsn2FszrOlSuSfVDMn+Zm&G;2FXMq{|K#&SByvmhdjEQ`QIlsNA6mh!X| zy0LPedzJE(be2O^SL7-BmgIg;o#fPPwyj9nCOS6+r4tmNWik|4${z;+D;r7~**b3| zx|7`A$ZMnF?gOv;uGLCSsPlFq9!db-nZ@XJ-XSHF*jGfM!@(%3V!|&IN;w!!tOEMw zu;{`;ecGA&u20x_tfJsyUt#w)G&0-4P+;|lTM@h2!5G8L&ShqEnSTMDY1ndaMWP<> z`#^Ui+sE1@(Fk3A?A@#)299unPVquGU7rX{lOVrG%lyg$Vj^H?+6u7CusaWMVq%?$ z&jH2iNjMmMX%K94vyiD3loh&@vWoO}0W}l0;_mk#VO>NQMmRSYQ2XIX_nHrtin~8# z0mRM^1uy;u^`Hf1o)8psq@dulAd-~I!Jt9fa3i3hbS%b>rHlJQbL=@)a#5;~KvdLE zqDa7-2`(aKH)m}QjN3|jOMrAR>{||+Ub;w~C%t?LX%NZEOM0jXKc-0}3-3K%!l7SE z7g_9z@fdASOi}zf4y?^eX3d^>%3TC7RmQZY+yi&O97K%j7;mYMQ67xdF{c5l^nQ&z zy??-odl6Hub76_;;%H=5K|U0OxVNE19#c&|B24mmaCPdj)#R=kkaL(p+1^Zm&H_Sj z0CEL7*b1QG5g(HIhzmPO7im<^LZqfi(N_zu2 ze{GvlmsnMlb=kH#p)sgJtzFc@HmY4FxLf1S8e~aaN&TfHtR)?5s3e6yp>7AQd(gAw z4yP_7Y{aZ^2-m+$U^)T-ftu9TCIArW03iUDCKzuqv5`N6HHLYKa}re(cGl9X$sNUP z)&U-{d!QwO(9$8MwDnfiI7Y$hRfyvcI4DdrV2ci#YTBuVV_R9HHD$TSfKl8%7A{s) z&T;V9Ux{RzkoY1(+m3|XDY`QHGeKztK=Du%U0wlz=nW78oKq^|dR;^eJ(j^<$aYRA z&!vW$aLy2#F1KKxgeBT2NZ|u;OJ);2h4%prTKBUSPC(*hkrW4wCCv$TI`wVSaB^Vd zo(wAB4TRTf_%yPPGF|A`c0?|XuaE=f85fjCfN7=joCT&S%Gp3U zKMdsji^%y9<%G^4Cn-)NzfhfWaxs4BU6QG>i`9W??%ifcAd2iy=8~keIClPjrvH`g%)gU(1OD3 z94f+gTENBK2q^0I!%fN>yT&~eaJ`vni)PK%v=w#p2zz6q7{*XGJ9~FTuW^xsLaAfM zHdLlwYQ|j@)wZq6#6sg+){~OzGu$H3&c!U|VMbZBghXFI7NV9SwX$T0gv!@EbtGpv z@zCJ}>ae7`yaa*nBN{&X74aw0r+zH;DddD=V}^4Mq%fRIAO_k{w>JYtG8~HLo(so2 zokctkkRBu*7n;wGbWVb2xzMuJ9CA@rcBa;d3Fm0TneZqY{tSa>Q*xYb`!AKHwPM<&A~WEjSjaRh}R6~ zdh)ABP1TtZ7gebFMcm8Cr6%3bT;p60&~yt>F9KH}kbM_?Y6jyNH%ffAkPkbBdNb;x zwltrpdlmUu;A1&gm-$!@im&-tgK-$H&j&i%3P$a;FTaDsaK<6}NHz8X8La`|rP`kh z;Qy%hcnIBr?i)UZkG>)n^h93;GauI7q2DQUrtS~Oof zhK+<4D`r`JzsGch2CY-oM|04g-4Jhyq{n*WV33L28KAaAV^PyR3;L>!McE?k7$&+c zkys?!_p(vz0ONCL!4^*rnuDg}Eww(AT#-EN7<5h^v6`6eeuYeG!K5};8w>aS+KAOS zzy)Q~o&48;NIl|BfFK6-i{%G5C2JfSRW*iI<=gAeJH=DqPYjSUtk3ifUK=Yt1QeH$Ue=-&?^)A!)JO$TK_;u~-%MYbnk-4b`DW zOyUxod<|8AKb(C={{qC#))_PnJI{b-$Lf<@>LNN9$plk=pLs+xw_Mnj&8@Js`+Y$5 z>3GzI3E2&`E)3cph&Vq-aRyY>MI1Z()_@(&V7h^VLNdteP_|uE(^M^+QY%#S2o)Iv zlA#V#V{%-kDfMLT8FULtGygA0m^AXA!W*=H4qOh6$9C={^E$7EDncu^H>RF$!%78> z)o{@^?aY`q?`RNpD3}CIW73Q0Feb!7otbhz7Kd(f&w{;enfZSsGb^0`553$IK;}OK zXgJ$YvTUo>&yeLl2SURA5!`gMfhpK80OinA*v?akr(59 zOc!m*?y>s+30|3c%l#>E>#2o}8isI`ErzscYUu03E_mR$!EzC{Q)_iiX8anJ>KqKk z2eCDjns4OBBTjz4NPP~Yujm@g-3I`wL?2^Au@4Y^D$oyVH2NB%AEp=1qX)35AKK1w z@X^v^h5ae3C0&>OK3GP()P?cwa#)L zLt1Aw;^sPo^aDz>4s{|!41J?ADuJep-nvokHd~FPcBVNmg6{^Xz`*u9CYW+iapBkp-;PT03{Bkynf{AJdP~uBHqn_-6sIoN7;SbF1mhrdshZQkAD zkMMpWe!KTJ{g$v53!{yG40&?sploL(dtTIaI*$<^l7xl@GXIS-FA?!36Dcwaa;YFs zAyQ-(3pK@g$=oGedg0232H z;=QD0yDzhjx=}}|!?w*0>L0nk0{pE+p#KWXSb+u}Gs_F=AkJvC-LvT=?1B0ob8tA} zxIKVObbYa&y1P|9`$_I0oKFP)a=$?qMRqT_R{IB5&QUt;*S za`<6}pD&01!0_kgaBVZfqv81cvJ6iR!bSFb+#Y-#nb9Bc{ondNhY{l6@clP^|1IDD zo$vpie!KIw_AtIMgr1+?AGP-LS&YyL<_vqPi z|6hCIFs3hscLd72oqh4mtiz(DXm`+Qa;Ce6>17Os@nJ@$VrQ)eN;bbUbsB!3d8*d< z=4PbN!QkwkfzF<|K0jdWax{Bj1P%}qLy=N20zGcFsbM>-5eI-7XAZ+=DHAmx;y8|B zL1C{V~K^H$$KtEZOF{Z(8=5F;@!Ctn2kk zsR=V799Nrt9~!Vl&Vw8M@*3FIhb(s1Fd^bnZ!WCD=vvt|&iyNSaxR7=@=Ob}`UrvC z$3!FdG+GXMz>Z-bY9!=tR%ZSakegNR@9^^f&@j3ro6|(%1^yJU;r<(LUD}Pf{{fKu z3{HI%!i)v$>~ilA$Pq0J0xNr!p92`QpfWobf|D$g;_QUD1%qMkXX-d6<4_;TA}OL3 zDTY4bjOc0a#RGOEV@3P{xu25ib00%ZRQIc^8eB`!eOMxksqx;f{<%*}Lb#PiOE zlnKW|z>Uy}!m-nPpcu7)jG@+Zn7-SfWfH0;9C0x>v(HAwb@1pZoTwk@K-zjBvkzi- zLk-4ffTpF4r=sjfU?55@R>O|aXH$kst9k3CI;CEZ0kszL8nS_C${w3O2xF(Z-L7J0 zy5a9Z*7qQ@;cdvwN_WX#WHMWct1}&(Qd?r#s7HMg6z5hm?4kkk<{IIIouszGu$(7# zL5|#K=-h2g)_XC|877AKK_GI&5WB|dVQkt^johk~C{QbRp z>?<~@Cn-ALm!BSo$S4yvjZUR`>6#2pU6 zbmDO9;|=MaXzdnmkT?k-T57Nn;k+w7}JKbVQ!!pCVMTO&a1G`$<_}?C|tqgWo+mYtAfW5E_OG_|ZOgORe z)6E9r~n}V5Jv|H0f0ag(&Z9B%2k8YU`3n8e)f23x)HaW zARi8xroc1kHS#5(U^$lo~(n3Q*Bi&|%Tx5L$o11_b!4-vGI=!!Sp4wX8OfmKsT zc417}?5W9`ZRt>FbEqxhWRM_pTjkLs_quSG19-z2v@jdPH6LJFySGJP&~$Q`P1?>L zprqb1oaykhjbV2&{OW2j9P9^MtOCQC3Mi~McYBaJ^_=1C4is+=w8X?Z7%3CL(`^vnLn~L=27-rTq@2qEWr4FehM$^ujOowBfb3s&)C}p?a<1 z!m$9|6qq|{<~V502G1OnVmn!#CG4$6O+t2lZ}lFC;py}iSpJPXA&EYI1cR1 zwjvXM3pGF{6T2rnrke!r>;G%I8ighxf7-5lpb&2#I9+YtN_Z~Vri)ZdZZeo9+q#wcX(H2I3+sSH=tM+IjY;UOq|_LHPboE~J;302dnM!a zbTyTrZXben*+;d)$3PV`awj0BE&1!bt<+VyF!C!>(40Ytvg)1TBN4esF<8%>uN?#* zLs)DZwIItynZ733e)O(|ogQwkstqXfdQg4DPz?5QAT3<>@aYcoXSEF^Dvo58l!sS>4eeM)Z1)y zb@vWS*LBsW+EZPPsjgwEk*QHMi+;Z>)i!%3ushm1vH#uH%jqg@eTQ^7MU)=Y%uDts z82yamw^5AZ<>uLABuq!@yT@oNLG2|7D-xlmP|7mc?Sq`&=UG5(WQ+fFp@3kvJ9irE zkuW<-Td*#=N(^<*dXO~YR6x|xS!8jT!QLJ>iBE&&i_zo-zpLRe9u8s{yE=raQ5Z9s z#+pXUnMr$?1&94gSoSm7XVv(1SBE+qhX0-T--7=&qk3CvP;)Km7)F++HalJ4Zl|MN zO?KMs>PGL&Osz&70N|D$PkdbTx3+E?yt{=qtahedqQB90iM!ByAquZY&BXPn`eG4ShKoh0A#Im#Ns+uFXs^RIdoGWyRZ3X=spo6scbKfIriAL<6%c#?(Kg+CWS4`Fi|1sz7zEaA%X zHDEsJy@Yh$+i?6lWW(a%vjBX&vjMq;^bl8rPBhQV{YeC>_#A|=ZmR6J&jo77HbCru zZv*9Ym2F^$be9?42?-2$%-L@agVuSd)Eovm+qr<&gz`})^e+kn45pgwS@ncTHxhii zK*qY|_#@f{M*n%hW!o^amHAzWl$bh^BISf_$hcNG9~c(X&_@*}hqbeatSIFhdMq3w zO}U6erm@sAUd}i3SvIpV(-4KL=M+re#e^lpsoM zHLTW(?#DB_K3tut^WH_|+&sv&(acyz`w_>X+joPhCB0-N9V)_BWpJsgTs$TX`(4JvB<*R;R=k` z-UfN*qI?_Kz7|4;G-PPY?T6$J24UMg&Tuv(H#?3SN|ynsk6s*THJ=*pRvAqm<$00ZQ)LGexku^r*o0o`i>;4eA zuRhMX5=6|Vy0HRBkXkxYv@|0TcPC~y zK4SCjFuPU2xoiC#>JQBjhDY!9+@#qqY$THL@Oe^HCVh!^vaEW`y z2=rI5<#h34#Euu4ra(}7OH7x_pT4-zj_uvc1Wy3UjNYE~W(KfBbDOQBq@*a>F~P`r34Yo41Bkb+9hdL!CV$4{Zit?t2yT<`5n z1S{QJ9FU?B7gGs4J-&jg+|F#M)i*eC2cpCqR{|eI7S1=}U_N^z;alLOdcDKRkc&6K z?*h&(1=o#_Xqh>Cl`>#ufDsQ()w!80oNvH2-Fx855|;f%jhg4z`F3d=c_qxsfCV-) z0v6sL9b7-of$PnOBL`XDfqDnJO(UbvcJ$i>rM zfUGm;hY&bE0oN<;1c1w?hoGz}T!$fk6($};TU*f7y@Mf1o_YBVc7E<&(2{ZY4tT|Y zwstbR>dCg9B61}0-zso?I0f#zw(6E2noxL(?3>dOfg5nH7V z8R`hgJznHqAuL)`9C;t_18%1M1^`NQE)Rh@=YFKxpplj16{nBvK4J zPZF!8CRUR%V>PMLw$870ex|H7Sr#Lit?Tiw3bMj@;5-2SxZY+tcLPXS&MIW=JPa7u z(|$nI9qpS@5x70(-GFpF5BstBZQdK=kMP2sz!xbUiYNB+4fqq7U)*^VJnACd?IE-- zJJLN016{8rBb$wp&CeD`8jM$Obc)|&jM9Erz0pgL9Ff8F#LR)Xd>qb@L+Tc#`+|eNB zh0*-Njfi15PeU+w0?_y%t4aX&5&I#ZKGeB6!Z`{V*@Z1ggYg$DJ{#X=a<9w|pRg=< zEc_bhIJgOMeYQ!ktwZ$VLBQyL0zBRK>;t|NEBSt<%$GNr{|Db)D6Y>pHNS8}xgc37 z2v&8^qgdE6I8m~c^>GY&^3RBKZGx*O!G;iUdOs0+)wOz0h<8R00UrA~vD`_Bo%C?- zzAksNfPDa+wE$hWM5+wWsiJc^hKVMcs$TtA&M81ZY*rUGOd)Yw?iq;7E3N22U|9K^ zL1L8$zQ+{r8r!f}pjSiAuaJPZeom)Ydn46G^RjG{w*^6s%OMFGL0*!cioJ@Lks^b0 z6~kQ*Qv7S=C7zrL8pbbdgd_8pegK2knQ(J?;)6b z{cUlb*NH6rq6etn5^7jT$Me5FJ`1eleRbX}Mv&<NQ?#(QwZlA`ZUq6ugdO`eOxnsxRg{zH?|^gJE9SiKi~` zE)(riCgEF=MR0?$|7*SpeVzX8+OkaVEhKdQ1WO2e9|a&(z(`Ptq~SV`YbE{}*@&rC zY#6ev*Q?=r?^7f;bK1rVm>cV!8S{Pg%rjxpaxj-HlESY&)0ukj@=>KEshfODM>2oY zz!#w$7FnJ)Tb&QYZsVBD{DC&_(si($v@_^{-VqdCK|wi3m{|jn&51l=GB==?G5Gp` zm3l!l$eQsq?z54Ldp@{yZ^kILLUZzIWGA%4IWy$~7#9V6fHiu~E{I^8iJk#=KbOlD7#{eshKJXct_Q=?nuHQ!QFxepq zj(fR#weeAF=jQt+5*v|s?oHF+N#OiG>=kHK_{&pf96Ee7eLpb9YPM89fQSK|iyO%*A^we9( zN_Rbt;rtJTTiA`TD9|P)q0hYOlR16nN}usD({(M$f%!PgnG~H7`d-wXnu2=Ar~@;8R~RyD4=$G}w3UzE$$SrITdjb``v zYn1C&LMfA@7VcuAhTL7?>GAy^CA|xqj}hHjK{cdIuYNQ|DdD|VguOO6vZ#>$-|eA@ z-WZ9=0=ZbI>!HCX?IWZbko*!;8RfJU5@!-nN~tjJZ&)K_kN!kBUkNy~(5x7>vpJq91YXr_N_<+nH6Iw)-M*Cf z(C1=Y0JPk2tHV!7WISFM)M@TZ;GAd4jNJ7ESvc(IF_C|jlqK`qTuuIm2ym*B920bP zCU+!o)`*;#wc#|g_GIOSSy_TPVh_b|+6d9UP4v;2^P*p?(%CT3-7R1xOGEVP!Us!W z9+pqJ9|B`lCF2$k&Ar_rfZWQQhG{G|>AaZ%A~Ob|y&1Xzi8HOSZ~}Xrn9GX#YV%$;h zo8?$1lEfLCCb`&T!CHr9EnxpjPYSRRf=R(%oD_TwT{x&Z;y#Rs{ToCih2OBJ3yZ4b;Dc5x_f3gI3f~w=ySE|SFy%_vK&|_2 zz%AjZm;$Q&I|zy)=zR^gW?;X|NHyu%xNh-1g1Dj1lE!eo9iALTTT!PT#f}2^ec)u4 z;yndT0r3MMD){L;x!F4g>an(ufM+`t_?l)}tMBU`#ftAJAH$U|#Rs?cmD=+tOl?qx zRjB(#@R6;47YQ)&X@oI}QqRG+;q#ApXkMWr6xIV(_y*u#0`4vRj{xQ$=M=->W5*kJ z%CX`?XOor>``FKi<&0g^xGF>o^@+Sc0#&OSJK7|T!^Br~YzLY8aAZBUmOBo@U86?c zt*I}WJFgd&`l_+xwMaA2B}tR25lPTDSn4grn~8k3jRqrq?s*vU$S(4phx*G{S&}%b zX`4TkTEmX&9RLQcJK^T;BCbdZc~q`Qu)MVWfxEi5x zDEHpbFxbk?X4A#y6grt`tu%ih?cN6@T4xL51btr=+=AvGEjl3Xk2Zq4jPt{4Dl<=q zS|!sQHool2Dh|f9zL~l_OR-LU2dwlgzf~UZ;hn7Nx$S-Em3Exl68qohw&iq{bKC!x zZciyI29nDB&>(o`7S)7x<_y?r{#@4uvDd&$9$_dRZBXxH5)~#qx(XuU3C(qwn$UtL#Pk zKCponwaan3d!TIWU-lMVXdNPdKVy_M?LLfb>e5{i_Yq1EH42Zymx=g*-OyI+XYJod zd!_O|8g050%y9#vaiX%vAZXy^IXzeBJx4bn_c8F>gdwQ|Q(-5Kaw8q(!a_#Af7)(d zz(zML#63nE-V+q&M{r7Q$-n>Bfc`?;9q&&h!3!h)_Hztr!0wNc{0rt$!#V>VCeJay zNFJ)|00|FMz($!~{J?Z}UFXV}LV>DT=kL@H~yoW7ww(2G95{-Qb# z%aBxE$w8T#Mg}~zUgiv~Tho2&|DuxNOsFuHqwB%_z5Fj2 zu=HG z?nJOma@~W;^+L{ap9gdIxC-q4#J)i63BWq5;Pl{bV?sVXNXE^Z!hD-2?R3+b2dbHE z3G?Y7tY*DsEXO<~-pI2OXFkaJM8YvE}GF=uQ4{!EU zIy}oDJ|3UI9-x5nYcMAgNPpIe(_ZGvjYbF6nwIZqPC$8Z))6y0{2jd4z)W`V65Q*s z3(KpeIgrv|0u5carNe7O;TXRi#=Eq9Ct`Afz}bM8(uq*6r*w7qD#3ev}O_$HY_eS)}Fu z77a6l755?#uysm%G^CIHg7~lhKgNG^$M`i0J6pUb63ZP7*a{Z7p zRQ+JPhv(9G50;HPvx|8vee^KY1y)t`Cbk&P0v)8sE9g9S`MZu(Hg>Jd%Z@K#vR7#) ziz&uyVkV^U8=EvY?sfwTn=p@|+}vaozrFA{gEyJZN@SJH#=I#gr0Ia@zl!1>3j${9 z14x}(QSq3I!+l4+FL+0gJnnf+Uf#jeFRQr6YaYKP51HSugdQMQjBgWeMH2tq!MzeO zGQ*u^h`((t+KF_3?i)-eNCP*l-$W?eU3h|qF(Of<@2o+Bst7%LTtTCkKjw2!DIac7 zJyr@C4wsObg!dv)I9)-}bt6W{W}*2|7$^WsWjm2d;XW_I{J^+ZDDLkl9OpdU$Y})1 zWe2v*4;!$YXYel)QEh0ia#!&n80Uf1hpeb@r3f7%b}jX;)Uw>~ z5weZCc>R1#LGrdQSnU2? zz*Dd_r)s-)-W{cfzjAkW`crO!V|llu81CE1uxHAb1aVgxae*KnC?V3PTi#>k&o$1U&oWm*)Mm$8Vnd!mVD^|*M0 zg4#1*9sK-r{b&rDvW&aOLv06@^=lZuZnb9PbyKDy0zN*Aa4!d|8XO-+we}OsCq^_> zZyAwjWVwr7K4hnHdo(Z|@(yZb<>U<1IC(e~i~e79dK>&HKas%r-ucw-_lUu!D#%An z9#-3Rc<*#Ty?af$S#Zbn9$DM9ws+s!E^oP9E<|srPRIXl-^VtYN}r0yD5dD>eru!; zonnphp<}HsUo+{IR+sH#53;)Id~lA{Rqunl<2r^9j<>pY_Q9mpHO2?qt*(_mI4l4I zy|>{BL#>RN4{oRTh-wUr-NkZ$g3`8O7f!cmJ8AiInlc z_7amwGFDwP#}CQmgdvzbS7H)P#;WV)#37lSGz61hl$g{eW7V~D@{ml{4#8wwiHV(z z*;P7mhh(yD2qw>$nA9a>byZAG8Ip-N1d|s^OzM-d`YI;5A(`M)pB-9Fp~R#i8EdFw zf>%?AXnLm(!K5@Ew=^bWja5ue81=X69ci#c4ng#LhK zvPg=**g3K~(wRXH$s#GT_OZ7WgVOrzAU}hns?+An8Ia;7_R%V zh+b&%3G!;hFSkd$xIN;m0HLMBMfIc61(dtHBrwMiQ(Efzi#i$4#z1!mLwEdimYi^R z!`eh3g}36agP)9d_1~CGbmeb!|BQaqdly5d{$S%tjF6?nt;~(?dmwXW@gs~Wk?58Z zX__WA)Z)-<)>aT}6I+_Y&ijZy^=by=<+x*XE<7UhK0r?TvtQf>!&c-6NRU1ngpal( z{Dp)CApAWbWE&AOcCJqUA)}#p^Q?d%(Rjm6XM-mOkj-BaP0s-?JAURQ9I5#FpsiW* zI}A%W{@+R^*$#HeZLbv!+x?GGF!#p6wY`aL7FQ$@{98HLhTtdV;0Of&UJ3?3OVAGm z>H}2)FvI?FfDjP6)a5{^Nfd<eHV%~05!;Qh5&;iursFQidWJ3GSp7b3}5)5#(!ylRIm>=a^%&plO6 zES51XtRgs`7PxS1&=8IRFle34hVUskCX1xF{|4A2F&)fXtG1W)K3cunZEwAg)?WCT z6u9sdJ$w@-zU~8hVaLmvKME=zh@IV|^nTD)NQcfqbHROZ?+!tX(6P5B+r8I_aBwxH z%-RL(R>z{)ogO*(LNxEPy$~lOCIqdBvvj*ShI1j};I2bIJRC5d4X?rAO&>h?0H<(5 zbp@Zt3dS`9v{F(WY-eKgOFx2W6OD~9d9Jr5T=kG?L_bq1k2PA!T0XbP>*IN-%>621 zoQr=AehQbG9epxnB_}F+l!<{>w1PAJN z;iT#$7cdDvvO{r5aWLXZl7#Gap%YWsM}VzhbV8lGIK8n8m_vpI>cyQv%f%_Ik0Uf; z2;4ZxV7X1Dc!UP|Rte8QABo`1o&D3(V2k^0(obRc;4)N{|7z^x$ejCqxc21;d<)7yz@D`Il@~)c1skmli~7??Y1#gn{H{Ybw&ULx}E47AsA2{fV02H zgCezqaoDo|pa__Bl5htIk-<2crca0#POdhA3uyu)5jR;Rg(Fv*-|D0ra$Uf-guR-y zT373KBOu>)XfT1R@Do75Rd{}-Di>wB#cSd1SX57LG@|pGGam69Ll8ZGxVEsiI`4~^ z_gIjVMN%9LlxcS-gj?(>7z7nwRZAk&+EQ0=t5aUgls%G?6bD0G+I5(+eo6~d*7N?H z-O>=N%d~luA!rPsmU1#HZaX!d5?3y&Z>M5TKF{bT`x9#2x}J%hcntOufD=12qd}v!+x& zXD7_uaY!yU;oIVru~4yZjxEDt!(2?7@KW6AB4S$)4`;5Re3(1g$(E)(39%-=U!R_O zFBI>~IILVscLJi~MMf!oCBBb%KZgRQ5|tg^X67-Gc@#-;4g-Iy|BMPLu4If!B1KD{ zgjfro&({^u67xP|^$pY27t{9>Z-97U2bP3;_?kq^uGv!s7sPc~PEeRzZTPzIWVI5X;m%At8Wk;4UKEc6WCG5S+-3w%S zZ(-S=Kv~_r5pO*wUGmJiO!h&)iS&Iy8d%cOT^7q{s9TD6wn!K2 z*1O*{T3w3n4d-*lFgi9GwKCed6g4MrSEeJeZv8wcO{N}#PJ8?_vC83<4^a*5)G|gE z0`hYy-rdNB-@93{G5Wy|!UM|t2l0Bo%yAoI`JR76F`%~5sHtxFd%|yo&p+a$2xGFO zFeR+Q&j+ywxOHareLGAN)JEXZ^;X@(`yRr(0{^>kHJ_7flsW6kY^0tedmOHo5623}jE1V){B^9{2 zjQ1RIn5J3Ya-{W6f#bi0a3etd7Q(RcI7Gl|)ApVYpz^B-Mb1+yUQ_tW1iWqLJqlNU zj?8tKChyaS3=V@6_cp@SWG?F}$S(`|y%PC_YVtn}GIu8iskwZtNbNu8^dRXwqi-v| z2s$n-xEo;iiPdo&{A@L3f|(s<$n-KBH)Q%4ACIZ|zEDVf(9qxRU=Ls(!g9-603cvd z8X-WiDZsk{m?X%b7N%zcP+K? z7CXHYe|#q0QrBFEN&RTf-Oobf#})TFdA%)Wv_ES_JB?W`n=#p?}XI2#8TP;D;$_)9yMrq+niWyI84d zW&t7xL`yiG!1n8Uf;G)G_|*u}d;yvV8rxNN_6r?C@6%JdSL|uPZ?X*qFP-S38@tXGnc(%ItKS3Qd zs!yXKsRQm?ej6%6HxrYeUb7ANG>FQL=nH6`(JgptTB=z_jh@;KmvKnLmmQfDHY2b` zmEAu(d!Xe_*$w?8$Ce&6NFnJ^dQ$C%%b5x`hILboi|MhSs=YduCiy(vjfm!-Cu1-9 z6z(NUt4;OhZiKpv188%+n>rp@;#D9kWsl@bug!`&ZcM%NfKD}LpP#({>Wf8_~=g+9mDKl2n&>LMGiMEUBYnWz=bZG^$5tjMk4 zWytSvAiD>d-CwG*ll;1nA3D3L{J3>o$}d+Wx8B?%WboH22CTdPogTGVepAIW-F_%l zHk9z{7Qu5-8ri?c2l@I-=y)QR2Zisr;zkPYq5TYb;{~{<=_Q<>&~u)IyZ&_)n!m?l z_wXVMrgnPYT>v120sOxQ1Ob5fM}QC@sKMaADmr%DKl~Tsus`FrJHD3r6hTW~?Jxa& z0mo79Ve)Sz?uxQcDf2SrZgH#d`Zp3A{r@4yA~_BWGvo&X68V1u=U)vg@xn8N!^mrY z9m#N>Ls{eUD*`2JE9VndZzF%$1Y|xN%=^!QlRKB$;3Xz_b?GTS<$Q#)lW_S;;$47{ z4_*i`;$8&Ty_n7=4D%-m@l*@IzDEa!K?O_|&6CN1@)K@CprO|PF$mIq{APfemLMmF zoZ~T6q-!j;+&mF}%*z0_;O9}9nBzd62%mO2KwZ59ky_`wFckhggg++6)Phx7PyFSI z)vxO_hK;@rnfWWoM}G3ay%J#lDmeO%GZuaNt&x7lv8}GpdhyP~L|gH7fUAK*E_!b| zri>QNm-CpbkPgE#^vrbFFONnNy-V=QYrz<VY;L}Ef{cycxy#PegxGWA(49DZ$sDUmIty&lkOycbV- z!;tUdi?zIK1Cb<~Or6iD9oey|Fgv{b@MU-#`*cu#lw0;w_XQucf4`hvgA+&M=rf|Yf1Gs$xQyj(Yo zvt8ZX0@RRoV=BzZ6f6ufGac%tF_PH*0}SqQ`*kdH71SY_=DrGYek&ZKU%Ou;LbnBt z_&O165k~*5aO2}z@N)Y%06E_zg}5|+shmFEUN{hAj#q%=e;4m_C98fialZxUL>>La zL!H|Y%AW&AXCL>?ozeC0aj-@CwA{BDnT2wECZKcb??KwXBu%XLou(m3yhJ;9Wv zw3M79tlt|5jtw2ZVlEMU@%`AknNx{_q5SRe2BJtRZ5%`Uasvanw3_dO#MZ#tOFQ^9 z8osm|^e!GZPlXmkAer}AhTJyrIpP5bF4THHa$@vIp;@)+r!wO99 zhd^)Ct?UkfXk~lK{6?vZU{(OtL-3>U`Ny`$KdeyXe?$ir+o2eq2+npW1qj+9#jj|G z43^vB!Qg?e#J6eP4%t$+Ylp&K+ToobvhCdkKTk6Tj2VcXr;P)?hcHzxZSr0KrSXJ& z1fL^6bXUl4Bvy@KedcVIZ(0RE?NNRze{1E>Qf#{&-H^VgiOG#!mvrxkSD!3A0MFSq=-15!tSneMfiy>uMLv{ZL z4b|h@QEYA4d2AtJ7nN>V34Zv;5K8VcyFUTsBcBW;HTtoa&0i<^C-Tqz6lngKS(?8s znr_gMMcw!j6U`oTCcD;ss>}+rCw|pRZE}5gypC5JtNGdj)SGC=PpVbDQ=m;Bt80f+ z#A>#PYAXnlN<>NF!MYANNBXYNu^|ELz)xDL2tQm(8Pz{mBJ~0N*Qhg44=6Bf6E|K0 z+qB$gz{~p-E!Y2<8dS!dzzT={-4tVo-%at&gyqx4*xo8!T7}p_jr`^&j-I}-jeJq2 z6^5%7nGDpMs1wfs3&x7zdYV2)*S zp9rgU=+}7((Q%=nDtEjcJ6iLOxW59uN|^m2j6Z2DN!0f|e$1INZJ)cI-^JCQhXi?t z)imV2kLZA>(Uqmf8syhtlFT$$m!DY<_3c=*>YAYWLgz0drF>Jw{WjPVZ08lA_z-S0 z9_IKBV0gxr z--1Q(_Jn5o1~90$H{r3`B%`+wK(+l29;%I~a?H#Dwjx?C(bAK&}zuI z*8KxqE}0FL0`kj)?`9oj6|))J@-Gz6zo(H6<XE6rkju{jNQ7LO!ZwN z>2TK~b6NSP4Upu0Ff8_CpRkl<+A!>Z!D2h~Zcd=`MZ@r(5l(h(pZEbw-J6@iEEiN} z*;lv~Gd|N<4|x$`PewpjP?qVO>hF+)&yk}XyFVn?r9k}^Kr8%@;A?E3sh^Q}2Yms4 z>`30F0RN8>q4+l@3nT^Yipm0Q@n1!fFA^sv(073k~RLV9}E6Q^})A0hN1h0aBtX@zbV9A$QOtq3nG zNq-o|9~{tyd+X(EF4M&}4u1s8s|aQq4EYw!pAmWccE~{@pW6=kIgyx4qIr}>!V#do3DdTa ztlweT3Z{v=#56j@-MkR!jsYh%$J7CnDM&`=%6&Yhfu@lLvypNd{18DoO%2nKT#@Ef zNmHmyV^yY!Fb&BiaeKn}X?Pqiv1x5&)g4}4b+;A~+li8i*rvrdfYfQoN1pOAOV^sm z@>+AZzHlt(8z^WklHpdCH5HQ=8}LSJ6WJkir%pJstTy%0_4TXVUd%C)9zHKeYS= zWT7Em1N)atG^GHh3HTidQ+~MGTZ7V+uWZYmuMy5LWX{7ySOLaG=`PTHiVyx)>UL9K zj>yBZOu329*yaegNqT0Uq<^V3F&h~?$KaAj(H5P!Qg=y zH-@NLY(emnNL>UQ;k~(Qs8F6hmbhaK53B2ub|ZD~;^AzXW)^*2wndI0`J_%OUSf6e z6t-P@ikGWh`5EQM#cz`fbzAvbyd}Rf?Eh*~r~cI>thD6d4_oGGaL&}!;x(0>{YNNX zt9*oFh%E8iiXPVwRL<%8tfH3#uU*7&S?+yPdiFqrPq*qVrt}fp1ytsejf%ZZMssa$JPK|yxu#0?XjpXrMCT5scX=?j$N`?9R-P-fEzn^ z$vn(M)p~?~o<(@CliVX18GqPb2p#h1Ju_=ZA@FHvqKX3nkbA%v;{TZlTyNrATl_~- z1;OP``CY(U2qQ@S%f1EM0mZ}tm%@5hje$>I_v3#v{xdGa+{?h6T;32uAE6rXAFl~b zBMnxBXMitRXsMoYbYBv8Wp?4h7Bvmc!cv!JPXvBfaj%k?4~<(t(^5-&>8=)dgTO7~ zju&^1;BU?{PDhrU7cOg?ZmCx@3jwbKe@p#Q+^hE^z9&U@;2_4|Z6CT$hM3cr(>-Yl z-TNnguo5o^&7wRn_tHHtLi~R7UTLz_+`R}NIlXOqqssSsQ!VvV;q$>XQlCm5cz~rY zS;{#3Wa<8C9Npi}Xq(=wdS=a?)~tS(rTf_OxzkWO;d%KSroBA!a?DZ*#JAOTHdCD! zeK{6aJ1-n`eyR3ez?&Tp?8F?u3Yl%SVkYBU*t~RNT)lnBpkt{eh;OT7MA}I`ODE#@ zHGr|y*h2{)nq>Un>^J9NOC6A;JFsWl^tk$a-5{Rx{=H52(J|!nbDOE|K8*UwO6ka&@P7F+6|1;p$Q4v<0IZ$a`#^^BC_aA*C@X0>t&OL_=O4K0mf85b_4 zJ3d7>wC5{Lw)#sQIV|6WB|1{1P47!-{%DUAOq_8*?mm zqv+wIIkcaD!!EIDef`7AmZ!R(G=QGv44rSO`EO0rrXQ>8p_Y%E5H;L3|=Fn~1neNLX|ETeV zFBJU07qm@pSC>p<8Sm0I4@+)WkL=5`A3UA-??W4-)G3Safema-QMOe`Wvc^|#++tV z8~qqkJqZadb%xkRV#+H`akM*@^vQ#0KfhnV8oXu--6y8e-CHc}>6N7ZYZc|0S4;O_ z3u#4nkD*=tW$~iLV?!^`q)uL)L;Q8CS;oK3qWe$}-Dme@sy$KOv7s#z^9*UN7f4>i zT9;02RJqZ#hi}iMJ96y#;{73`gyTr|k{H|EkN^#HVA@x}BiL3YPsf|BRXLipMv^rR;#6!$4Sfm%^0@p_(XE}vB>#r;j{A^V#c9dan&L4 zLx9=CzR^fmMi~rGuhj9DR}gBQH;4xWPb{Z9s25LPE(^ zq&4F;cgDPW?g6Xj;idDv)h&qm-n;`=@iiu{9;rxxE)k_%~k9GRlkn^&A$z_7NNO<1fOWFi=nK~OW?*z}6@W%KR zlJ3ZT7<00^M$(y!8Je!Xr9$9xBe=YTS4Vy#v|kEsfAxZdezKA=_g62fuY%{Bd$0@# zs9#Bbg9yz-=p6|)AisIIzyEIueIT^MRDFnYX4a6lT8#>^3@i41X5u{D2$>+ElO=Sd z+6@|OQme+0cC6Yb#QYY5#{KgBBxHid&;m*Kz@ld+UK~169UwXUa4yrWRm(yk;x)Zz zCT_->{%E27VKHg_2r>7Cl0&~bRzjT!T^Y(_?-|KdUSug^glA~2#5_mpvPu16`bpE~ z;deqW2^CSIclUh+CAvuAZWYTrpP`H8i<%~toz2h{csGzSqZ0EPb-#pOlhC#5VWewP zd+q+ns=GtisULx+)c1sTy?QZpHfZOk#?73kZdSh%IX6Vd&3p`Y^s0nTjxh99^@fBd z&tlB4sdprF=3WeaLwy8IG^rbq?q%Hm_^0svw($Hera08Ztv!tSL)Bm~W)d;ysRz_d zqZYEh!C zkIuP&_B`0tNd{}vNZyYr&P$3v<=Uh!jgt0~Dk7#*H%QE1D;yLd^e42&dFoZQ$uJT6 zeVXTv1AgceKXirA&htapNa#90biHAYZc;DC$Yns?AhfeGIn()M(aHFFZGOs=3p{94{hpM3C+SpaGn}e+az?Ngsjl>5;{aewV_{1 z=o|^fLa!mD)RUr@k)gLGWJ&o(hW;d>)jsWgNrw;Lk;BN)UnO)prnB>KC-)yxhIu0O z&Y^z^Z303khf<->B-AVEdi~G^=$)I@xX|Z9djg?R2$@(AqvZ&faiJQs4w`rblkt;7 z6GFozG*Lpk`k|4izmr2#5GvQ^9tw z*3sUf5fU1PdC+Dx8=*4Kxd^c~UlvWw3w289UO&_=p^1KICkbuvLwNoe>Gt$P83}#M z4~>`5S47wILX*sLe)B?8L{1zmK+gR_yI0T_gr--7_7BaH&`QzS;?NvP_ZunulF+=0 zn1_V+6Pm7vRiT3=q-%3^=#Yw-YeLH_LWhUWs0bYsI!n@>D>-ZkU0y-k7`j?Qi$#|H z&~+y7MdBaoC?EQ=gf76cr5u`BAB0A$vxe^x8m%@Dp9R+)zE3EoJ{fgKBBplPZ+&}A zP2cYfxX%gZmHEWHKcAQ%3TB_33xN0E`P}x9+Gp-XaEo&{!5uN4@DX!1wU1V_$6nEX zP;sv&x;^4H)n3saS2KHF2*uSZxG}Y@l{tRceKokf)qOqOVXJP0JGgQyTqk}<;-KQY zNE=hLI=|UIL7g||JK*-!rf2P4Rd4H^?YpWsQ*>(=(|v!J2a)@AUAMvn?i6=v+Z~As z>Y4q10{o4`pSAH?T!QW^?N0-9r(n(-`3t}w3FeoA*?>5s)i*n|`y$Hn*N&IrZfJWQ zF&pD=!JRPj9k};&{)L#4|Af0c;)m3^@lZ!d9V)prcRUTre>bwGBc^)0pS5FZbvxY| z;vO-AaJRrIfwzkLh`4jb{Y>09#nn>gl_IBXo;Nqf`1bT-}B_M+P;m=gta`K(F6Y>LsnW5rasC$!SN(wW*Z zT3y{a1Kch?WM5$RZv9UC1ocS!{>c4DBbnE|Qx^gLO8ZK<$xdp%w)1enkrAZMTzm}D zUORgo_{{wb%PNn;k{pgOJMEAR6=}w$^lS z3r79{sn(8s5BYBB{t&Xg)l!eoOLiO2v<->Z5p!+FCx~-N$A@sgC;UgX^(98DQ(|wS zyqjV3qt%O@pMv^+XQXqqItSJmQY*XeK%Ae6HQppV-)dkO&RuIa#cjoKIP(~B2@`sxDO z+i9Z?1w6g$NVq4qur}w5o&TciIK*7xu++EDcp5c3Wg+Y6eW|H=lL|1Jx2~jnE?jcBwlkpC9QKR$ zrNy1#62AqUHybxgobLd>-S~mP4+;Eur-h?{r!Z+a1~xWYy%&ELy82^+Ey(J=1E)_1 z?2VS94xjk~Vs9AC0^lN~hU-TZ}tCqhBc*dcYg?*>JI}r2DDSxcN3Oe=~+%>2{ zOMPYWWVj0@&K{|~0k2%i_zmLT9UY9Lhr|z;ht#brW?@b{tC{eHvEPEjLbxHH=WE~` zQs0iQfowa**ZJx=I`@T;0r4f@Tj7S(cW|>Cb5WaC@ru0$l03f4Q>LXhb-#mBG>!f< z+{@R{-87%>RG|(m`3vBUg1=eZ{ItJ`4*wI0t6|nhaKBmG9>pF}>r)X+y(8|~3vK~? z;L7{po(vne2s?y?2kRs_6d5XXcy( z=Wvrd;*Hx8@ESK2RFJ!(C<-Xz4G2&%1O&7wD@fBUpNhPsX{KqVrDbIo%bw8Gvirp{ zdn_^2vaBBS@?@I*-fQjgfLeW?@8|n^{eJ)a;C0@6z1LbZvu5_}*|YcAdk*U(y-3rO z@#FC%|CT{`h~>1zOI*5BSAX%Y#kDK$S!GczZX5e3T6ItMo=#3;c;c(rI|K8ukMt<# zH7=yj8*BrC1+MA9xo)F@aqbg&Dr z|JG58yO`}2v3aj_G-HM$@V8ey9C}Pz#IO*9?TTv#<3G>k;=O@uy0tN!V-V9x=joqw5(oJcx-0C-C3z&yy3h8XZk6E*| z3)0y{S8aQC_{MH7qK9UChHnAuui4k*Iy<|HM4j%JaqGLeiVSTFj#y%I6Js>%8L_6D zo0wvFcAS~*>g+CR3?|NueZHH!xZh5ZHQ{c(1@~_^X;uW*LG0Gdcj)$RxVxg+=%G8i z`3T?cM!GoI&97{ zvIWJ9A2`qD)>A&6os-2c%$lvjcYU{HaZ%f7ucV0V2r6W`c)p*jbE=4sG}yO2iOtt+ zGuuuwYZfPB$VPt@=Ply`g4)>5@XpTZ4qNEtu0d_=`|cs_*rM?8pbUrS`$(7VV9UBk zxwf%KyGI9&blBn|q;rmg6-*uwG+I>Q${j}|9}jtA4znfJ&$5z&^2Dv09mz@qyOY^+ z>(kMlo%6+mn)MzuOXZ7AnwgpHVAjmNHDA2jlS){Qy07ns%S>GP3DGRJ#=AO?6~4@t zi{s(MW@>hZ*#gbt(AHzc3e9fA@i$IvHkh@uZ)fKM$`F5h-K!^M1+}sJu3%3`XYz0A z8J=zl?U?1;p0dqmIT7R8jvWvGxZ8NnA0=4MgiFU;k$Ww-jmQbYZ3+I{Yl(~S!=1`6 zII`n5ie;ksnpu0yLwjr-EadH5|r?(cyQh5>dwNxTG4Di20gP zjY`A=no*6e7Y{KrdPu3*z|7dUxF6Y<@?2nD)uCCIiXqJATQ_v@!@EPnw5>6sS(b^> z+O`OJmWe`b3rf1tyIhoLTd$gdqPMmcj~WctPuuJ{LxUHJL~R?G zGX^YE+x&(!%e%xVZ3`XZhkMio+SU*q}W@hZ$#p2gEs_hX;`}QB=Qa@sQ1^H zE%;t>KcAqM2$%kAx;-FPYc^xRnr=(PE6kQ#kLJd!rD7+uX6w1!n&72kpSDdcT4Gx! zKGe2(MQge(6Q66_$pK4j%f(@BGsmy#wp@IxZM$K6Q2eBApQF47#W`(D>A%FbLj106 z`G{S+n&qq+2O`we91 z+5S<1hraN)KuonSgspc1u_nQb-YS08%-+4T^H$0be|z26C4U8*@dxJhO*{6+giO(9n=z$5OHOOg$#!z213Mf1?BxX>20!m$cVuKcZEMHQ2EX87@1m2NC@DA~`W)$aZqQ$|^2LDsMry0fhx@gsm;%pJ8HKRCp3a4bFbc%DAuo}!p`(c*| zyv(p4c8Ttq(SFz^qBW!auuD{FM*CrxcuF(c54*$;X3b(ps0`U9_G{+f%Np{A2u>0B zGtTdO#Iwwdme?b63vVf$}}@dxWQoDm);ju z4t6&912Ic8YQYahy@Q<%{z%-Y8MWZY;${as8~lm5RWoYA{i0DbYQay%Jk6*DKNAZy zqZT|M?qX)t_JFvbnX#u2h=-Xiw=Nmg+4+FjpqV|fR2>kT4NsBaNw%moYQg2AI?XHO zfGE@Kv)oMYgW@L5#uar5`9iGLY}>%lkVE1{%~ls&GJhrB)ofIVbUrM;)9lxYks+;O zH(&TPi;Yu;g?ugQ`BG;&W($)-j*H`(ZJbgb@}0QoV6#Gg5WO>v$i5xe81l0y(<~$M zfsiv|g=X7EtqM6Of`^i)QTJa(6tgAb-}0%DUqvgkdDe>DO!1rePP4hWo?vH~9hY7c zcZOULxx*-z^h4ETi)J_W^8|a>V3=ne4Uw`b%ZQVr zw#ZjBqo|$bznSe8XRzj{v+OdQJe$PVYD<8#?90rkkyVyy+aqB=hFIkWW=7pzmc*5Bb7x}AZC&650)CelUXcye}=D)obip;^>DHq)SF>LOXOB@^@ zmj%{AUIoHaKEQ0gHQj4VfTvugZR^q2UUI#*ZAth5Y_qnthR9HFxlP-C2yp^?&9I@( z+(Lci7tD!?pzUk~e5JDt${pZ#hS^_5HR4^pQ=>jDFTv&SSRRD&jgj_my`uTWa-;Ti>m( ze88}Yb0HH#uakS2&9{1lIt5=R-!m9rcU&irG21IV`uO1+_tTnvg6pa%DRZbsd&T|< zMWNBMql3L^8z66DX0+#EX&z0U##k^|j@OKisw6pynQ`PK$&H4MTQ^B=)r?v4OQgyb%$lubVO622@?Fgu!O|oz9Hx)4bXkUP z^J!Mu(eLKabUvyYaqnqO`n*uQzJfnu_g}X-l-7(h7~Mk}A$RF?zx90}G+VZ6wmp4C z=qOp1N50MCwh`+>N6Qw?szz)K&6U4sHfF@rp?T7RTRzm!?j7OkoG<+hW~Fs{|(VdzJa;vt{otg=9ySCAtnu&6!w$YuM ziSli2qdPT|EqJ}0X)tSZk7jwjoUPfT zJ#fEA-lo|fV~@#Fxj-}baTZZ3@6#+O_p8t{`JiS4bB}_pWwzWpqVPm$x!h>j#HP@n z!M-#YAAeKjznK~PVX8Ebr#PF%(%~iMsj^tJc>^w)r^^qSEf+mA&W2VDhah<|yH2WRXjC%Q)X8qzLT#`%8JV zT&$T#pY7dlm4}!$iNkm)wo(4fY`5^}U>(~d!hEO0HXZjh?v$^wZLe*{m?f@v z$~}fB@=OndC!UhzkrsI_kinW!o(pBMW|Yfaaw{|HyCcHxlA%*Loo!)ME}k>&saa(- zu{eVXit}!{SToA=9{Ijzl;>jkZ)OXu({V3ovHVrD*eS&L~(0W}TSYELY3tG@CJ|K5VsoMYBy~ZU)=MY`Jw@ z@$F#ym>GGlmfvX4mwfJotxJi(-vaB~U=PbNnuVct*T_Q6`b2#Sb`P_?*0iVs@rYcZ zS#H#pfJfxx%;uq8j(Mz=`$&3+oPI_xR= zjAj#49|e0!vzh2wPs!Ic8x>t3o|2RY-JhUX+8D+1lzh|h6eUs3aVX3&ahnTf?4_)n(+l#M(RdrLe7X4zu~zA4a_fb{n%M z>wiYQ19lg)1=hm+17Q0NCR}sA2J2Ezxh$~W)xTM8m3GZ;8;`pqvbSarjQ0fVXE3zj ziLhs7vV;8`_PpF-FtN)UPdLd#Q#ntuDVkV(g~9y${U_{2neSj0`%AJ$v%N*$_U-a5 z2Me{oDnHlk{orW(Kjr5$j9lIiPPgxr-#gei`yOe%!LXf(i?;8RJ`R>{e^+*QuyOVe zWx8hDGN#)1%Z&~;$Nsr&F_^Uu{p<_*t7Z$p{w1R-xdiJ=J`3!J|M?2Y#-xZ!Z8_TFqt!@FzlGD*KC^4 zA^UOJsM)5N!m#h;Zp{W~N^wG(Ybci^a(C2m`w2PBV7B)MowENR7i*S1_>ldiT)}LC zHEr-I`%m(agZ*azS)OEe+%}^?bw4HJW^taj??=0X&1GgB;iu%i%obRmEOPQZC6{YP z$Ji;kUNbuWPRXsB(O7Uwey16Y1;5CywN%0aD~$!GWlzm$EI2LWnbGm?(&3C;!OSTA ztaPd4bg*^oepV(jqi=!3y8lOJGiw%g1--ieDvubR)VA_eG@~a9ev=0@qbCY3NWU97Peh&8{erX`%z7qnc=wC4H?wBzJ7Y(K#WGtiUX7a! zHc_*OqsqEplC=)@P~abOt!7)ZZs;zR^(HD|xoFO+>#o#f&Ayp9x4T(Q*KAqN9o;Re zo>{Y4G}hJGqPA+*p~oe&MS0##xikxZFei1_EzEc}EnJuuck6YZ`Ro$xDOK~f}7HDQ2|5$f7b+2Y!#y<=8pux~e5>LoK z!fd(q!Tf)AcUO;tSw*vTPtp>byV}aOW@{y$d~jDM*|x;`b~drdc@zu2SF%Yr-pS0mX|gHYTfNL| zxhP4ufz>QDJYUK43inapX!b#3$8cXY>@Kn`7oSaZb@o%%X7=Rv^i%l{5L<%hw7Z4- zsS?euv)IG^6@|GX(^1{co(rtE=H2fXs2yCy`=WMitGzkA z#}(;%Iy^7fbAoz1*g5-(@IDT<)&6KWUVz5mm%Ura(iOc1ZK4VJ_;Z0VCU=y!gC#r(v76YV@p)mH8K zp!zMmRJp9AxQ#r^ls_{g&oULvY#!bnQ4wWoL_5!NRnX3}TopS!T_VcWJ?(5$)e>zB zHh*rKs@#l(s8sdsY%|qd zZChwA5HnSaX3sfEu>Dtf9=d{kqdgV!oT<*NqByBM3s!{lT}|wWynrW3s#UgT$8e^s zRu`G!-V+w0uT~u&W=~tngj+nSRj|S2IZY89bvH%}-4i_^B_BW4FwtGhI#8CkWu zpP5m5wc4s}RCisz7 zvR7=1nG$ion$OJ0rCBXDn7BA$XGpVpy`61|dXpK=^-IMPb{Z@iN;PH^m1pGnkSb(0Pjq!z6!DNM z)9gjp`yy7UmUfIcVPdIEB?9W7Oal8uzwQqx`R==Hyn)O+;>H~w;i?%_J2jZ>tJ-grFY7V zv88sXeilnr76V|8g)&_m#3dNmgTz9adh< zj9ze91u~l_ep43fVMR-rUhW~SDoWeVn2w58mBGx&<%k;7&hv;W)Sf#`tr17m)OMa< ztJ-#+U#pw7=Tvnp;%l`^vuvkJ5l7XtntfyQi~L6YQ?t8W?UBdSUS>w=$JNKoj5-`w zUue(crVl-itFPPHzE$6An=e*7`&M~9)z%UxR99w3E+-VNtU_bmt0E!tgi6zFwIw<7 z2Q^x=Qm3JjKdL;<+~lappVSP^-jrh_e^w2e%`=US{I|MGvzx^vEPHi7Go!rIYK69q zG@lJVt+r}rc0Lb&;suM)8ClhbCSMlnvw zSmvp#W^daPB7ajoHLGz=j=ZP_XtvBPA@Y(MqS;9IP_?lkOY&~M}H@&9WCD=Ne-qtJ)v2-$htl5KzrHkpXW}^{HH`BM86(N>j(;3bF zKrC4MXp7NiT@Z`iL~HO+pXiHN!cD_83qyI4rb(LZMl3x|b2aOL@_L)@)hr*e^ffKl zY$I$@rnStB{TE}}%*^N$F{W+W^KHZ#W7@6RQ;0LpoDRi)IVl)<>q9j%k+Uz9}-@^rL2n z-JglfFrC%xCXW{)Gfls1_LcRS$f2el&rscs8Vxf=Gn*#{c)S`p%#^O#evfRYEK|N_ zzdG%V9B#UWnb9sIObeMAxr{K~uRT}F&jLr7(zj9xhUZArXl91zNYi*`^MpUfL0Vr( zidndSuf%7#|BmxbG-(W6Qb4kS?e%{p2SkwnK740#8K;k?oYzmLoDKc){HrzpjgL`c zW*Fsc;I;V}ntQpdRfxeXC})e94GrFgxh4`rLspZhXMf7UA}9yE=g74ny-}hPzl@Q= zCZR@B&gZXF!4}~K8S95+l248!w#%MmHN#4tlnSeI-xJ}@AkOD?&f!(~m=Hhd zjS@fRy=?fb9YK0SW7NXX7}oX?wohwB_}}=uc~VphBPoW%NmN#BNLwWB^Z&Smr>7F; zT#ly$rCQd`KZy6s;&$!!JA5wZcC9rWC0@2tiAp3DlID{hgl{BXEgPED4AQrc>c5fO zm)_8yYVqO#Ppq{T2-z$y_NP1p8E+c!zsdi8!;(wFR|7px6 zxZ$M47_JLFC4jeg(K1Sm$Rqi~NhBBXQG=zJ$r?+THHzAho+*-|3T>stS{_ArXQCgA ze{#E#r_z1?vX8>CU|26}=;)X^wp}WeqQuXk=N_*vzYgqqJ^E6`K#^bqx z#~>??7VU%fH;YO?I#WD@^CP{LOy&NSkCDS)wa;JaDU}jcIDSodSDNzw47U%lc5=EQ zlXWQ01;&^!1&!EBTnZ+Q!tG`yw)l`t8YOyqUzVkojXD}QauE6K!ag;LMjjR0Td$S> z`!j`c9$7z}^3UO%a}qs0r7#&sH+m*U74Dz!jK5mm8bhhbY7*C4ji^rIxWlhg@zF{? zIQrVf-`xyQAd!*NtDF8_y^9pN~{20))@VPQ0ZQDSwrn(pjuH0C5y1WS+IEOx9|M2sO*t6oXdh_WA1PGp|Ls1yw#8_yR^sVmDp&CJMSIO($wsvM zxc6>D{7QVxwJ@%i+m8(G&+_f{*NzxLJhK|kEja~sl%oCF`54b|482iq`}QfroJ0!3 zc0C80YkRxl^E1!B+T{PKSJ12QO8k!VvPry+nwmK_DgIn<;U402MGt8o?VqRm-{wZG zbh)kmzHj{Zo`2t-M*ACR%&*#Ou9e%Lk=u`-?Z?$?QyDowIe}W<=sAX_eTg*AUmlHV zzo#Naa!A9tCDUvnBST<~$1<8duC9=_v+ zO%_5|2wfp`h0qm3cRg0qyGVxJlKn3{#M zo&VWR^R^Oy&~VyN8E4#cYc4H3wQQ;?2B8Xv0JmVsRQBWNyZ< z5k#167VD&b=1rXEc47D|D;Qz6OX?@vMZ=Vd<}5|4E-W%HD=0Dd#`_C+vKHUuuQA6- z>X~tpdg)-+4`zKj>(g1E&H8NC=d(Va^@Va*+=s}GjyoWF>0p+Dkh56^LZ)8yA9D|j zDd`gMmPo>LktK*~$rO_%OT|RmEGreQRARF%E9hXcS!RvLPc~ToGdam}5c&9tXv>FV zaxKx8t=@&ud|p^=NwM6MRc+ZR&qdZl&Md69d?e?3KLE{uNh>Uq_&J3#j&>i8N8D+% zP}`2Nygm3OOCe-G;U#@j|7qEW{6A2qWJ_eGsN|R{C9U9ADQR7{de+oK^E+fiL+i4Y z;7$1sPE;>{r!4iF_W+eq2Ow# zQ|9g=Hv!+wTHv&pW7sZU%6ZhO0!Pggz){)HIyG3D2fpMqOZ6?>0r}^NF9B~JZ)oNH=@C^&%_!h4;COg(L`Mk==i@A^w;!VVli$#-NJNSgOj zouIkEI3a`NhsL-9*Clr#^zs9~F`+YX#uUQjw9d{wRCY!O=V+jx^KL#uSE6n0&a1gb zHp`Q}6P>9A#yUT1E(w|Fyg}<144m$~8ShfAb>7AiZkDv_+zu_%nsl2btx30=_v5>~ zANRBMkfhb?4$18v7lHI-%r~6pAxZ1m9g_5P%t`hHqVKJR|ABI2j7C0ltScd7G`76bbETEq^AW2r#_dwk1tWPb z@~_N!+1kVMUc@EyTs)b66m4EK=5^~wXa`UHHYh#!f_nKJ#hTe4_WM-W6_touBewnW zTt=?wt!O;7@#tZb1%4N-2f44FK)GfcR!hd4ktg_UVw3c45VPqc@*-DlDc+n{6j7eaAj;J7t;Xv)vZr@N9v+f5Mx#MdqNyW}F?0 zM}BELZ@yqZX3It$KgIljS~3g%AE@o3(?sPm#&l??tIK&l`lQp=5nWwuPSdh`x&%7C z7>skMnMRUR=7Et(E|a)MWsD*4@x%Ju7wnI@*yMuP*IdS^!O^>b8PRXLG{A?>IMa*Y zb6I45B7Z;d)3}4c;$rE%&+Oj)l6f8P>t`*wqffZhbDmfo+mp^C@8FB%9!}p*c6Ft* zl@t|RyC##jcURXY)5isOs_o{PZV|2&TQ8tXVHEV|Ln+!MjO`UBdb4XTr=8E(Y`QeQ z+!ZqR?_6%%o#yw(Rk|+5N`!a0Qr+=ZlcG1Wma_j+MQax>RrFNJYG`Qu?^`t8d4r;r z4L7Lm9y?t(D0&`cGg}v#-%dQ}y3RB^t<`m#qBT#qDO&S%o1!kdWhobFJx≷BIXe`+Nw5QJQ3bfo4H7TZM%p`jBxXk)N?{C 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 GetFieldsForType( Type type ) + { + if (EnforceHierarchyOrderEnabled) + { + var types = new Stack(); + while (type != null) + { + types.Push( type ); + type = type.BaseType; + } + + var fields = new List(); + while (types.Count > 0) + { + fields.AddRange( types.Pop().GetFields( BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ) ); + } + + return fields; + } + + return type.GetFields( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); + } + + + IEnumerable GetPropertiesForType( Type type ) + { + if (EnforceHierarchyOrderEnabled) + { + var types = new Stack(); + while (type != null) + { + types.Push( type ); + type = type.BaseType; + } + + var properties = new List(); + while (types.Count > 0) + { + properties.AddRange( types.Pop().GetProperties( BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ) ); + } + + return properties; + } + + return type.GetProperties( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance ); + } + + + void EncodeObject( object value, bool forceTypeHint ) + { + var type = value.GetType(); + + AppendOpenBrace(); + + forceTypeHint = forceTypeHint || TypeHintsEnabled; + + var includePublicProperties = IncludePublicPropertiesEnabled; + + var firstItem = !forceTypeHint; + if (forceTypeHint) + { + if (PrettyPrintEnabled) + { + AppendIndent(); + } + + EncodeString( ProxyObject.TypeHintKey ); + AppendColon(); + EncodeString( type.FullName ); + + // ReSharper disable once RedundantAssignment + firstItem = false; + } + + foreach (var field in GetFieldsForType( type )) + { + var shouldTypeHint = false; + var shouldEncode = field.IsPublic; + foreach (var attribute in field.GetCustomAttributes( true )) + { + if (excludeAttrType.IsInstanceOfType( attribute )) + { + shouldEncode = false; + } + + if (includeAttrType.IsInstanceOfType( attribute )) + { + shouldEncode = true; + } + + if (typeHintAttrType.IsInstanceOfType( attribute )) + { + shouldTypeHint = true; + } + } + + if (shouldEncode) + { + AppendComma( firstItem ); + EncodeString( field.Name ); + AppendColon(); + EncodeValue( field.GetValue( value ), shouldTypeHint ); + firstItem = false; + } + } + + foreach (var property in GetPropertiesForType( type )) + { + if (property.CanRead) + { + var shouldTypeHint = false; + var shouldEncode = includePublicProperties; + + foreach (var attribute in property.GetCustomAttributes( true )) + { + if (excludeAttrType.IsInstanceOfType( attribute )) + { + shouldEncode = false; + } + + if (includeAttrType.IsInstanceOfType( attribute )) + { + shouldEncode = true; + } + + if (typeHintAttrType.IsInstanceOfType( attribute )) + { + shouldTypeHint = true; + } + } + + if (shouldEncode) + { + AppendComma( firstItem ); + EncodeString( property.Name ); + AppendColon(); + EncodeValue( property.GetValue( value, null ), shouldTypeHint ); + firstItem = false; + } + } + } + + AppendCloseBrace(); + } + + + void EncodeProxyArray( ProxyArray value ) + { + if (value.Count == 0) + { + builder.Append( "[]" ); + } + else + { + AppendOpenBracket(); + + var firstItem = true; + foreach (var obj in value) + { + AppendComma( firstItem ); + EncodeValue( obj, false ); + firstItem = false; + } + + AppendCloseBracket(); + } + } + + + void EncodeProxyObject( ProxyObject value ) + { + if (value.Count == 0) + { + builder.Append( "{}" ); + } + else + { + AppendOpenBrace(); + + var firstItem = true; + foreach (var e in value.Keys) + { + AppendComma( firstItem ); + EncodeString( e ); + AppendColon(); + EncodeValue( value[e], false ); + firstItem = false; + } + + AppendCloseBrace(); + } + } + + + void EncodeDictionary( IDictionary value, bool forceTypeHint ) + { + if (value.Count == 0) + { + builder.Append( "{}" ); + } + else + { + AppendOpenBrace(); + + var firstItem = true; + foreach (var e in value.Keys) + { + AppendComma( firstItem ); + EncodeString( e.ToString() ); + AppendColon(); + EncodeValue( value[e], forceTypeHint ); + firstItem = false; + } + + AppendCloseBrace(); + } + } + + + // ReSharper disable once SuggestBaseTypeForParameter + void EncodeList( IList value, bool forceTypeHint ) + { + if (value.Count == 0) + { + builder.Append( "[]" ); + } + else + { + AppendOpenBracket(); + + var firstItem = true; + foreach (var obj in value) + { + AppendComma( firstItem ); + EncodeValue( obj, forceTypeHint ); + firstItem = false; + } + + AppendCloseBracket(); + } + } + + + void EncodeArray( Array value, bool forceTypeHint ) + { + if (value.Rank == 1) + { + EncodeList( value, forceTypeHint ); + } + else + { + var indices = new int[value.Rank]; + EncodeArrayRank( value, 0, indices, forceTypeHint ); + } + } + + + void EncodeArrayRank( Array value, int rank, int[] indices, bool forceTypeHint ) + { + AppendOpenBracket(); + + var min = value.GetLowerBound( rank ); + var max = value.GetUpperBound( rank ); + + if (rank == value.Rank - 1) + { + for (var i = min; i <= max; i++) + { + indices[rank] = i; + AppendComma( i == min ); + EncodeValue( value.GetValue( indices ), forceTypeHint ); + } + } + else + { + for (var i = min; i <= max; i++) + { + indices[rank] = i; + AppendComma( i == min ); + EncodeArrayRank( value, rank + 1, indices, forceTypeHint ); + } + } + + AppendCloseBracket(); + } + + + void EncodeString( string value ) + { + builder.Append( '\"' ); + + var charArray = value.ToCharArray(); + foreach (var c in charArray) + { + switch (c) + { + case '"': + builder.Append( "\\\"" ); + break; + + case '\\': + builder.Append( "\\\\" ); + break; + + case '\b': + builder.Append( "\\b" ); + break; + + case '\f': + builder.Append( "\\f" ); + break; + + case '\n': + builder.Append( "\\n" ); + break; + + case '\r': + builder.Append( "\\r" ); + break; + + case '\t': + builder.Append( "\\t" ); + break; + + default: + var codepoint = Convert.ToInt32( c ); + if ((codepoint >= 32) && (codepoint <= 126)) + { + builder.Append( c ); + } + else + { + builder.Append( "\\u" + Convert.ToString( codepoint, 16 ).PadLeft( 4, '0' ) ); + } + + break; + } + } + + builder.Append( '\"' ); + } + + + #region Helpers + + void AppendIndent() + { + for (var i = 0; i < indent; i++) + { + builder.Append( '\t' ); + } + } + + + void AppendOpenBrace() + { + builder.Append( '{' ); + + if (PrettyPrintEnabled) + { + builder.Append( '\n' ); + indent++; + } + } + + + void AppendCloseBrace() + { + if (PrettyPrintEnabled) + { + builder.Append( '\n' ); + indent--; + AppendIndent(); + } + + builder.Append( '}' ); + } + + + void AppendOpenBracket() + { + builder.Append( '[' ); + + if (PrettyPrintEnabled) + { + builder.Append( '\n' ); + indent++; + } + } + + + void AppendCloseBracket() + { + if (PrettyPrintEnabled) + { + builder.Append( '\n' ); + indent--; + AppendIndent(); + } + + builder.Append( ']' ); + } + + + void AppendComma( bool firstItem ) + { + if (!firstItem) + { + builder.Append( ',' ); + + if (PrettyPrintEnabled) + { + builder.Append( '\n' ); + } + } + + if (PrettyPrintEnabled) + { + AppendIndent(); + } + } + + + void AppendColon() + { + builder.Append( ':' ); + + if (PrettyPrintEnabled) + { + builder.Append( ' ' ); + } + } + + #endregion + } +} diff --git a/MelonLoader.TinyJSON/Extensions.cs b/MelonLoader.TinyJSON/Extensions.cs new file mode 100644 index 00000000..de57daeb --- /dev/null +++ b/MelonLoader.TinyJSON/Extensions.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace MelonLoader.TinyJSON +{ + public static class Extensions + { + public static bool AnyOfType( this IEnumerable source, Type expectedType ) + { + if (source == null) + { + throw new ArgumentNullException( "source" ); + } + + if (expectedType == null) + { + throw new ArgumentNullException( "expectedType" ); + } + + foreach (var item in source) + { + if (expectedType.IsInstanceOfType( item )) + { + return true; + } + } + + return false; + } + } +} diff --git a/MelonLoader.TinyJSON/JSON.cs b/MelonLoader.TinyJSON/JSON.cs new file mode 100644 index 00000000..05f27fc1 --- /dev/null +++ b/MelonLoader.TinyJSON/JSON.cs @@ -0,0 +1,661 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Reflection; + +namespace MelonLoader.TinyJSON +{ + /// + /// Mark members that should be included. + /// Public fields are included by default. + /// + [AttributeUsage( AttributeTargets.Field | AttributeTargets.Property )] + public sealed class Include : Attribute {} + + + /// + /// Mark members that should be excluded. + /// Private fields and all properties are excluded by default. + /// + [AttributeUsage( AttributeTargets.Field | AttributeTargets.Property )] + public class Exclude : Attribute {} + + + /// + /// Mark methods to be called after an object is decoded. + /// + [AttributeUsage( AttributeTargets.Method )] + public class AfterDecode : Attribute {} + + + /// + /// Mark methods to be called before an object is encoded. + /// + [AttributeUsage( AttributeTargets.Method )] + public class BeforeEncode : Attribute {} + + + /// + /// Mark members to force type hinting even when EncodeOptions.NoTypeHints is set. + /// + [AttributeUsage( AttributeTargets.Field | AttributeTargets.Property )] + public class TypeHint : Attribute {} + + + /// + /// Provide field and property aliases when an object is decoded. + /// If a field or property is not found while decoding, this list will be searched for a matching alias. + /// + [AttributeUsage( AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = true )] + public class DecodeAlias : Attribute + { + public string[] Names { get; private set; } + + + public DecodeAlias( params string[] names ) + { + Names = names; + } + + + public bool Contains( string name ) + { + return Array.IndexOf( Names, name ) > -1; + } + } + + + [Obsolete( "Use the Exclude attribute instead." )] + // ReSharper disable once UnusedMember.Global + public sealed class Skip : Exclude {} + + + [Obsolete( "Use the AfterDecode attribute instead." )] + // ReSharper disable once UnusedMember.Global + public sealed class Load : AfterDecode {} + + + public sealed class DecodeException : Exception + { + public DecodeException( string message ) + : base( message ) {} + + + public DecodeException( string message, Exception innerException ) + : base( message, innerException ) {} + } + + + // ReSharper disable once InconsistentNaming + public static class JSON + { + static readonly Type includeAttrType = typeof(Include); + static readonly Type excludeAttrType = typeof(Exclude); + static readonly Type decodeAliasAttrType = typeof(DecodeAlias); + + + public static Variant Load( string json ) + { + if (string.IsNullOrEmpty(json)) + { + throw new ArgumentNullException( "json" ); + } + + return Decoder.Decode( json ); + } + + + public static string Dump( object data ) + { + return Dump( data, EncodeOptions.None ); + } + + + public static string Dump( object data, EncodeOptions options ) + { + // Invoke methods tagged with [BeforeEncode] attribute. + if (data != null) + { + var type = data.GetType(); + if (!(type.IsEnum || type.IsPrimitive || type.IsArray)) + { + foreach (var method in type.GetMethods( instanceBindingFlags )) + { + if (method.GetCustomAttributes( false ).AnyOfType( typeof(BeforeEncode) )) + { + if (method.GetParameters().Length == 0) + { + method.Invoke( data, null ); + } + } + } + } + } + + return Encoder.Encode( data, options ); + } + + + public static void MakeInto( Variant data, out T item ) + { + item = DecodeType( data ); + } + + + public static void Populate( Variant data, T item ) where T : class + { + if (item == null) + { + throw new ArgumentNullException( nameof(item) ); + } + DecodeFields( data, ref item ); + } + + + static readonly Dictionary typeCache = new Dictionary(); + + static Type FindType( string fullName ) + { + if (fullName == null) + { + return null; + } + + Type type; + if (typeCache.TryGetValue( fullName, out type )) + { + return type; + } + + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + type = assembly.GetType( fullName ); + if (type != null) + { + typeCache.Add( fullName, type ); + return type; + } + } + + return null; + } + + static T DecodeType( Variant data ) + { + if (data == null) + { + return default(T); + } + + var type = typeof(T); + + Type nulledType = Nullable.GetUnderlyingType(type); + if (nulledType != null) + { + var makeFunc = decodeTypeMethod.MakeGenericMethod( nulledType ); + var v = makeFunc.Invoke( null, new object[] { data } ); + return (T) v; + } + + if (type.IsEnum) + { + return (T) Enum.Parse( type, data.ToString( CultureInfo.InvariantCulture ) ); + } + + if (type.IsPrimitive || type == typeof(string) || type == typeof(decimal)) + { + return (T) Convert.ChangeType( data, type ); + } + + if (type == typeof(Guid)) + { + return (T) (object) new Guid( data.ToString( CultureInfo.InvariantCulture ) ); + } + + if (type.IsArray) + { + if (type.GetArrayRank() == 1) + { + var makeFunc = decodeArrayMethod.MakeGenericMethod( type.GetElementType() ); + return (T) makeFunc.Invoke( null, new object[] { data } ); + } + + var arrayData = data as ProxyArray; + if (arrayData == null) + { + throw new DecodeException( "Variant is expected to be a ProxyArray here, but it is not." ); + } + + var arrayRank = type.GetArrayRank(); + var rankLengths = new int[arrayRank]; + if (arrayData.CanBeMultiRankArray( rankLengths )) + { + var elementType = type.GetElementType(); + if (elementType == null) + { + throw new DecodeException( "Array element type is expected to be not null, but it is." ); + } + + var array = Array.CreateInstance( elementType, rankLengths ); + var makeFunc = decodeMultiRankArrayMethod.MakeGenericMethod( elementType ); + try + { + makeFunc.Invoke( null, new object[] { arrayData, array, 1, rankLengths } ); + } + catch (Exception e) + { + throw new DecodeException( "Error decoding multidimensional array. Did you try to decode into an array of incompatible rank or element type?", e ); + } + + return (T) Convert.ChangeType( array, typeof(T) ); + } + + throw new DecodeException( "Error decoding multidimensional array; JSON data doesn't seem fit this structure." ); + } + + if (typeof(IList).IsAssignableFrom( type )) + { + var makeFunc = decodeListMethod.MakeGenericMethod( type.GetGenericArguments() ); + return (T) makeFunc.Invoke( null, new object[] { data } ); + } + + if (typeof(IDictionary).IsAssignableFrom( type )) + { + var makeFunc = decodeDictionaryMethod.MakeGenericMethod( type.GetGenericArguments() ); + return (T) makeFunc.Invoke( null, new object[] { data } ); + } + + // At this point we should be dealing with a class or struct. + T instance; + var proxyObject = data as ProxyObject; + if (proxyObject == null) + { + throw new InvalidCastException( "ProxyObject expected when decoding into '" + type.FullName + "'." ); + } + + // If there's a type hint, use it to create the instance. + var typeHint = proxyObject.TypeHint; + if (typeHint != null && typeHint != type.FullName) + { + var makeType = FindType( typeHint ); + if (makeType == null) + { + throw new TypeLoadException( "Could not load type '" + typeHint + "'." ); + } + + if (type.IsAssignableFrom( makeType )) + { + instance = (T) Activator.CreateInstance( makeType ); + type = makeType; + } + else + { + throw new InvalidCastException( "Cannot assign type '" + typeHint + "' to type '" + type.FullName + "'." ); + } + } + else + { + // We don't have a type hint, so just instantiate the type we have. + instance = Activator.CreateInstance(); + } + + foreach (var pair in proxyObject) + { + var field = type.GetField( pair.Key, instanceBindingFlags ); + + // If the field doesn't exist, search through any [DecodeAlias] attributes. + if (field == null) + { + var fields = type.GetFields( instanceBindingFlags ); + foreach (var fieldInfo in fields) + { + foreach (var attribute in fieldInfo.GetCustomAttributes( true )) + { + if (decodeAliasAttrType.IsInstanceOfType( attribute )) + { + if (((DecodeAlias) attribute).Contains( pair.Key )) + { + field = fieldInfo; + break; + } + } + } + } + } + + if (field != null) + { + var shouldDecode = field.IsPublic; + foreach (var attribute in field.GetCustomAttributes( true )) + { + if (excludeAttrType.IsInstanceOfType( attribute )) + { + shouldDecode = false; + } + + if (includeAttrType.IsInstanceOfType( attribute )) + { + shouldDecode = true; + } + } + + if (shouldDecode) + { + var makeFunc = decodeTypeMethod.MakeGenericMethod( field.FieldType ); + if (type.IsValueType) + { + // Type is a struct. + var instanceRef = (object) instance; + field.SetValue( instanceRef, makeFunc.Invoke( null, new object[] { pair.Value } ) ); + instance = (T) instanceRef; + } + else + { + // Type is a class. + field.SetValue( instance, makeFunc.Invoke( null, new object[] { pair.Value } ) ); + } + } + } + + var property = type.GetProperty( pair.Key, instanceBindingFlags ); + + // If the property doesn't exist, search through any [DecodeAlias] attributes. + if (property == null) + { + var properties = type.GetProperties( instanceBindingFlags ); + foreach (var propertyInfo in properties) + { + foreach (var attribute in propertyInfo.GetCustomAttributes( false )) + { + if (decodeAliasAttrType.IsInstanceOfType( attribute )) + { + if (((DecodeAlias) attribute).Contains( pair.Key )) + { + property = propertyInfo; + break; + } + } + } + } + } + + if (property != null) + { + if (property.CanWrite && property.GetCustomAttributes( false ).AnyOfType( includeAttrType )) + { + var makeFunc = decodeTypeMethod.MakeGenericMethod( new Type[] { property.PropertyType } ); + if (type.IsValueType) + { + // Type is a struct. + var instanceRef = (object) instance; + property.SetValue( instanceRef, makeFunc.Invoke( null, new object[] { pair.Value } ), null ); + instance = (T) instanceRef; + } + else + { + // Type is a class. + property.SetValue( instance, makeFunc.Invoke( null, new object[] { pair.Value } ), null ); + } + } + } + } + + // Invoke methods tagged with [AfterDecode] attribute. + foreach (var method in type.GetMethods( instanceBindingFlags )) + { + if (method.GetCustomAttributes( false ).AnyOfType( typeof(AfterDecode) )) + { + method.Invoke( instance, method.GetParameters().Length == 0 ? null : new object[] { data } ); + } + } + + return instance; + } + + static void DecodeFields( Variant data, ref T instance ) + { + var type = typeof(T); + var proxyObject = data as ProxyObject; + if (proxyObject == null) + { + throw new InvalidCastException( "ProxyObject expected when decoding into '" + type.FullName + "'." ); + } + + foreach (var pair in proxyObject) + { + var field = type.GetField( pair.Key, instanceBindingFlags ); + + // If the field doesn't exist, search through any [DecodeAlias] attributes. + if (field == null) + { + var fields = type.GetFields( instanceBindingFlags ); + foreach (var fieldInfo in fields) + { + foreach (var attribute in fieldInfo.GetCustomAttributes( true )) + { + if (decodeAliasAttrType.IsInstanceOfType( attribute )) + { + if (((DecodeAlias) attribute).Contains( pair.Key )) + { + field = fieldInfo; + break; + } + } + } + } + } + + if (field != null) + { + var shouldDecode = field.IsPublic; + foreach (var attribute in field.GetCustomAttributes( true )) + { + if (excludeAttrType.IsInstanceOfType( attribute )) + { + shouldDecode = false; + } + + if (includeAttrType.IsInstanceOfType( attribute )) + { + shouldDecode = true; + } + } + + if (shouldDecode) + { + var makeFunc = decodeTypeMethod.MakeGenericMethod( field.FieldType ); + if (type.IsValueType) + { + // Type is a struct. + var instanceRef = (object) instance; + field.SetValue( instanceRef, makeFunc.Invoke( null, new object[] { pair.Value } ) ); + instance = (T) instanceRef; + } + else + { + // Type is a class. + field.SetValue( instance, makeFunc.Invoke( null, new object[] { pair.Value } ) ); + } + } + } + + var property = type.GetProperty( pair.Key, instanceBindingFlags ); + + // If the property doesn't exist, search through any [DecodeAlias] attributes. + if (property == null) + { + var properties = type.GetProperties( instanceBindingFlags ); + foreach (var propertyInfo in properties) + { + foreach (var attribute in propertyInfo.GetCustomAttributes( false )) + { + if (decodeAliasAttrType.IsInstanceOfType( attribute )) + { + if (((DecodeAlias) attribute).Contains( pair.Key )) + { + property = propertyInfo; + break; + } + } + } + } + } + + if (property != null) + { + if (property.CanWrite && property.GetCustomAttributes( false ).AnyOfType( includeAttrType )) + { + var makeFunc = decodeTypeMethod.MakeGenericMethod( new Type[] { property.PropertyType } ); + if (type.IsValueType) + { + // Type is a struct. + var instanceRef = (object) instance; + property.SetValue( instanceRef, makeFunc.Invoke( null, new object[] { pair.Value } ), null ); + instance = (T) instanceRef; + } + else + { + // Type is a class. + property.SetValue( instance, makeFunc.Invoke( null, new object[] { pair.Value } ), null ); + } + } + } + } + + // Invoke methods tagged with [AfterDecode] attribute. + foreach (var method in type.GetMethods( instanceBindingFlags )) + { + if (method.GetCustomAttributes( false ).AnyOfType( typeof(AfterDecode) )) + { + method.Invoke( instance, method.GetParameters().Length == 0 ? null : new object[] { data } ); + } + } + } + + // ReSharper disable once UnusedMethodReturnValue.Local + static List DecodeList( Variant data ) + { + var list = new List(); + + var proxyArray = data as ProxyArray; + if (proxyArray == null) + { + throw new DecodeException( "Variant is expected to be a ProxyArray here, but it is not." ); + } + + foreach (var item in proxyArray) + { + list.Add( DecodeType( item ) ); + } + + return list; + } + + // ReSharper disable once UnusedMethodReturnValue.Local + static Dictionary DecodeDictionary( Variant data ) + { + var dict = new Dictionary(); + var type = typeof(TKey); + + var proxyObject = data as ProxyObject; + if (proxyObject == null) + { + throw new DecodeException( "Variant is expected to be a ProxyObject here, but it is not." ); + } + + foreach (var pair in proxyObject) + { + var k = (TKey) (type.IsEnum ? Enum.Parse( type, pair.Key ) : Convert.ChangeType( pair.Key, type )); + var v = DecodeType( pair.Value ); + dict.Add( k, v ); + } + + return dict; + } + + // ReSharper disable once UnusedMethodReturnValue.Local + static T[] DecodeArray( Variant data ) + { + var arrayData = data as ProxyArray; + if (arrayData == null) + { + throw new DecodeException( "Variant is expected to be a ProxyArray here, but it is not." ); + } + + var arraySize = arrayData.Count; + var array = new T[arraySize]; + + var i = 0; + foreach (var item in arrayData) + { + array[i++] = DecodeType( item ); + } + + return array; + } + + // ReSharper disable once UnusedMember.Local + static void DecodeMultiRankArray( ProxyArray arrayData, Array array, int arrayRank, int[] indices ) + { + var count = arrayData.Count; + for (var i = 0; i < count; i++) + { + indices[arrayRank - 1] = i; + if (arrayRank < array.Rank) + { + DecodeMultiRankArray( arrayData[i] as ProxyArray, array, arrayRank + 1, indices ); + } + else + { + array.SetValue( DecodeType( arrayData[i] ), indices ); + } + } + } + + + const BindingFlags instanceBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; + const BindingFlags staticBindingFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static; + static readonly MethodInfo decodeTypeMethod = typeof(JSON).GetMethod( "DecodeType", staticBindingFlags ); + static readonly MethodInfo decodeListMethod = typeof(JSON).GetMethod( "DecodeList", staticBindingFlags ); + static readonly MethodInfo decodeDictionaryMethod = typeof(JSON).GetMethod( "DecodeDictionary", staticBindingFlags ); + static readonly MethodInfo decodeArrayMethod = typeof(JSON).GetMethod( "DecodeArray", staticBindingFlags ); + static readonly MethodInfo decodeMultiRankArrayMethod = typeof(JSON).GetMethod( "DecodeMultiRankArray", staticBindingFlags ); + + // ReSharper disable once InconsistentNaming + public static void SupportTypeForAOT() + { + DecodeType( null ); + DecodeList( null ); + DecodeArray( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + DecodeDictionary( null ); + } + + // ReSharper disable once InconsistentNaming + // ReSharper disable once UnusedMember.Local + static void SupportValueTypesForAOT() + { + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + SupportTypeForAOT(); + } + } +} diff --git a/MelonLoader.TinyJSON/LICENSE.md b/MelonLoader.TinyJSON/LICENSE.md new file mode 100644 index 00000000..5fa84f8d --- /dev/null +++ b/MelonLoader.TinyJSON/LICENSE.md @@ -0,0 +1,26 @@ +Copyright (c) 2013 Patrick Hogan + +Based on MiniJSON by Calvin Rien +https://gist.github.com/darktable/1411710 + +Based on the JSON parser by Patrick van Bergen +http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj b/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj new file mode 100644 index 00000000..852684f9 --- /dev/null +++ b/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj @@ -0,0 +1,40 @@ + + + + Release + AnyCPU + {604377A8-CC01-417B-9D4F-22F50DD31014} + Library + MelonLoader.TinyJSON + MelonLoader.TinyJSON + net48 + 512 + true + 12 + 414 + $(ProjectDir)../Libs/;$(AssemblySearchPaths) + $(ProjectDir)../Output/ + false + false + + + + false + None + true + prompt + 4 + true + false + + + + DEBUG + + + + + + + + diff --git a/MelonLoader.TinyJSON/README.md b/MelonLoader.TinyJSON/README.md new file mode 100644 index 00000000..997981de --- /dev/null +++ b/MelonLoader.TinyJSON/README.md @@ -0,0 +1,218 @@ +## Description + +TinyJSON is a simple JSON library for C# that strives for ease of use. + +## Features + +* Transmogrify objects into JSON and back again. +* Uses reflection to dump and load object graphs automagically. +* Supports primitives, classes, structs, enums, lists, dictionaries and arrays. +* Supports single dimensional arrays, multidimensional arrays and jagged arrays. +* Parsed data uses proxy variants that can be implicitly cast to primitive types for cleaner code, or directly encoded back to JSON. +* Numeric types are handled without fuss. +* Polymorphic classes supported with a type hint encoded into the JSON. +* Supports optionally pretty printing JSON output. +* Supports optionally encode properties and private fields. +* Supports decoding fields and properties from aliased names. +* Unit tested. + +## Usage + +The API is namespaced under `TinyJSON` and the primary class is `JSON`. There are really only a few methods you need to know: + +```csharp +namespace TinyJSON +{ + public static class JSON + { + public static Variant Load( string json ); + public static string Dump( object data, EncodeOptions = EncodeOptions.None ); + public static void MakeInto( Variant data, out T item ); + } +} +``` + +`Load()` will load a string of JSON, returns `null` if invalid or a `Variant` proxy object if successful. The proxy allows for implicit casts and can convert between various C# numeric value types. + +```csharp +var data = JSON.Load( "{\"foo\": 1, \"bar\": 2.34}" ); +int i = data["foo"]; +float f = data["bar"]; +``` + +`Dump()` will take a C# object, list, dictionary or primitive value type and turn it into JSON. + +```csharp +var data = new List() { { 0 }, { 1 }, { 2 } }; +Console.WriteLine( JSON.Dump( data ) ); // output: [1,2,3] +``` + +TinyJSON can also handle classes, structs, enums and nested objects. Given these definitions: + +```csharp +enum TestEnum +{ + Thing1, + Thing2, + Thing3 +} + + +struct TestStruct +{ + public int x; + public int y; +} + + +class TestClass +{ + public string name; + public TestEnum type; + public List data = new List(); + + [Exclude] + public int _ignored; + + [BeforeEncode] + public void BeforeEncode() + { + Console.WriteLine( "BeforeEncode callback fired!" ); + } + + [AfterDecode] + public void AfterDecode() + { + Console.WriteLine( "AfterDecode callback fired!" ); + } +} +``` + +The following code: + +```csharp +var testClass = new TestClass(); +testClass.name = "Rumpelstiltskin Jones"; +testClass.type = TestEnum.Thing2; +testClass.data.Add( new TestStruct() { x = 1, y = 2 } ); +testClass.data.Add( new TestStruct() { x = 3, y = 4 } ); +testClass.data.Add( new TestStruct() { x = 5, y = 6 } ); + +var testClassJson = JSON.Dump( testClass, true ); +Console.WriteLine( testClassJson ); +``` + +Will output: + +```json +{ + "name": "Rumpelstiltskin Jones", + "type": "Thing2", + "data": [ + { + "x": 1, + "y": 2 + }, + { + "x": 3, + "y": 4 + }, + { + "x": 5, + "y": 6 + } + ] +} +``` + +You can use, `MakeInto()` can be used to reconstruct JSON data back into an object: + +```csharp +TestClass testClass; +JSON.MakeInto( JSON.Load( testClassJson ), out testClass ); +``` + +There are also `Make()` methods on `Variant` which provide options for slightly more natural syntax: + +```csharp +TestClass testClass; + +JSON.Load( json ).Make( out testClass ); +// or +testClass = JSON.Load( json ).Make(); +``` + +Finally, you'll notice that `TestClass` has the methods `BeforeEncode()` and `AfterDecode()` which have the `TinyJSON.BeforeEncode` and `TinyJSON.AfterDecode` attributes. These methods will be called *before* the object starts being serialized and *after* the object has been fully deserialized. This is useful when some further preparation or initialization logic is required. + +By default, only public fields are encoded, not properties or private fields. You can tag any field or property to be included with the `TinyJSON.Include` attribute, or force a public field to be excluded with the `TinyJSON.Exclude` attribute. + + +## Decode Aliases + +Fields and properties can be decoded from aliases using the `TinyJSON.DecodeAlias` attribute. While decoding, if no matching data is found in the JSON for a given field or property, its aliases will also be searched for. + +```csharp +class TestClass +{ + [DecodeAlias("anotherName")] + public string name; // decode from "name" or "anotherName" + + [DecodeAlias("anotherNumber", "yetAnotherNumber")] + public int number; // decode from "number", "anotherNumber", or "yetAnotherNumber" +} +``` + + +## Type Hinting + +When decoding polymorphic types, TinyJSON has no way of knowing which subclass to instantiate unless a type hint is included. So, by default, TinyJSON will add a key named `@type` to each encoded object with the fully qualified type of the object. + +## Encode Options + +Several options are currently available for JSON encoding, and can be passed in as a second parameter to `JSON.Dump()`. + +* `EncodeOptions.PrettyPrint` will output nicely formatted JSON to make it more readable. +* `EncodeOptions.NoTypeHints` will disable the outputting of type hints into the JSON output. This may be desirable if you plan to read the JSON into another application that might choke on the type information. You can override this on a per-member basis with the `TinyJSON.TypeHint` attribute. +* `EncodeOptions.IncludePublicProperties` will include public properties in the output. +* `EncodeOptions.EnforceHeirarchyOrder` will ensure fields and properties are encoded in class heirarchy order, from the root base class on down, but comes at a slight performance cost. + +## Using Variants + +For most use cases you can just assign, cast or make your object graph using the API outlined above, but at times you may need to work with the intermediate proxy objects to, say, dig through and iterate over a collection. To do this, cast the `Variant` to the appropriate subclass (likely either `ProxyArray` or `ProxyObject`) and you're good to go: + +```csharp +var list = JSON.Load( "[1,2,3]" ); +foreach (var item in list as ProxyArray) +{ + int number = item; + Console.WriteLine( number ); +} + +var dict = JSON.Load( "{\"x\":1,\"y\":2}" ); +foreach (var pair in dict as ProxyObject) +{ + float value = pair.Value; + Console.WriteLine( pair.Key + " = " + value ); +} +``` + +The non-collection `Variant` subclasses are `ProxyBoolean`, `ProxyNumber` and `ProxyString`. A variant can also be `null`. + +Any `Variant` object can be directly encoded to JSON by calling its `ToJSON()` method or passing it to `JSON.Dump()`. + +## Notes + +This project was developed with pain elimination and lightweight size in mind. It should be able to handle reasonable amounts of reasonable data at reasonable speeds, but it's not meant for massive data sets. + +The primary use case for this library is with Unity3D, so compatibility is focused there, though it should work with most modern C# environments. + +It has been used in several published games. It's good for preferences, level and progress data, etc. + +## Meta + +Handcrafted by Patrick Hogan [[twitter](http://twitter.com/pbhogan) • [github](http://github.com/pbhogan) • [website](http://www.gallantgames.com)] + +Based on [MiniJSON](https://gist.github.com/darktable/1411710) by Calvin Rien + +Released under the [MIT License](http://www.opensource.org/licenses/mit-license.php). + diff --git a/MelonLoader.TinyJSON/Types/ProxyArray.cs b/MelonLoader.TinyJSON/Types/ProxyArray.cs new file mode 100644 index 00000000..3a053eec --- /dev/null +++ b/MelonLoader.TinyJSON/Types/ProxyArray.cs @@ -0,0 +1,104 @@ +using System.Collections; +using System.Collections.Generic; + +namespace MelonLoader.TinyJSON +{ + public sealed class ProxyArray : Variant, IEnumerable + { + readonly List list; + + + public ProxyArray() + { + list = new List(); + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return list.GetEnumerator(); + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return list.GetEnumerator(); + } + + + public void Add( Variant item ) + { + list.Add( item ); + } + + + public override Variant this[ int index ] + { + get + { + return list[index]; + } + set + { + list[index] = value; + } + } + + + public int Count + { + get + { + return list.Count; + } + } + + + internal bool CanBeMultiRankArray( int[] rankLengths ) + { + return CanBeMultiRankArray( 0, rankLengths ); + } + + + bool CanBeMultiRankArray( int rank, int[] rankLengths ) + { + var count = list.Count; + rankLengths[rank] = count; + + if (rank == rankLengths.Length - 1) + { + return true; + } + + var firstItem = list[0] as ProxyArray; + if (firstItem == null) + { + return false; + } + + var firstItemCount = firstItem.Count; + + for (var i = 1; i < count; i++) + { + var item = list[i] as ProxyArray; + + if (item == null) + { + return false; + } + + if (item.Count != firstItemCount) + { + return false; + } + + if (!item.CanBeMultiRankArray( rank + 1, rankLengths )) + { + return false; + } + } + + return true; + } + } +} diff --git a/MelonLoader.TinyJSON/Types/ProxyBoolean.cs b/MelonLoader.TinyJSON/Types/ProxyBoolean.cs new file mode 100644 index 00000000..b4d07abc --- /dev/null +++ b/MelonLoader.TinyJSON/Types/ProxyBoolean.cs @@ -0,0 +1,27 @@ +using System; + +namespace MelonLoader.TinyJSON +{ + public sealed class ProxyBoolean : Variant + { + readonly bool value; + + + public ProxyBoolean( bool value ) + { + this.value = value; + } + + + public override bool ToBoolean( IFormatProvider provider ) + { + return value; + } + + + public override string ToString( IFormatProvider provider ) + { + return value ? "true" : "false"; + } + } +} diff --git a/MelonLoader.TinyJSON/Types/ProxyNumber.cs b/MelonLoader.TinyJSON/Types/ProxyNumber.cs new file mode 100644 index 00000000..af80ad3d --- /dev/null +++ b/MelonLoader.TinyJSON/Types/ProxyNumber.cs @@ -0,0 +1,153 @@ +using System; +using System.Globalization; + +namespace MelonLoader.TinyJSON +{ + public sealed class ProxyNumber : Variant + { + static readonly char[] floatingPointCharacters = { '.', 'e' }; + readonly IConvertible value; + + + public ProxyNumber( IConvertible value ) + { + var stringValue = value as string; + this.value = stringValue != null ? Parse( stringValue ) : value; + } + + + static IConvertible Parse( string value ) + { + if (value.IndexOfAny( floatingPointCharacters ) == -1) + { + if (value[0] == '-') + { + Int64 parsedValue; + if (Int64.TryParse( value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out parsedValue )) + { + return parsedValue; + } + } + else + { + UInt64 parsedValue; + if (UInt64.TryParse( value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out parsedValue )) + { + return parsedValue; + } + } + } + + Decimal decimalValue; + if (Decimal.TryParse( value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out decimalValue )) + { + // Check for decimal underflow. + if (decimalValue == Decimal.Zero) + { + Double parsedValue; + if (Double.TryParse( value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out parsedValue )) + { + if (Math.Abs( parsedValue ) > Double.Epsilon) + { + return parsedValue; + } + } + } + + return decimalValue; + } + + Double doubleValue; + if (Double.TryParse( value, NumberStyles.Float, NumberFormatInfo.InvariantInfo, out doubleValue )) + { + return doubleValue; + } + + return 0; + } + + + public override bool ToBoolean( IFormatProvider provider ) + { + return value.ToBoolean( provider ); + } + + + public override byte ToByte( IFormatProvider provider ) + { + return value.ToByte( provider ); + } + + + public override char ToChar( IFormatProvider provider ) + { + return value.ToChar( provider ); + } + + + public override decimal ToDecimal( IFormatProvider provider ) + { + return value.ToDecimal( provider ); + } + + + public override double ToDouble( IFormatProvider provider ) + { + return value.ToDouble( provider ); + } + + + public override short ToInt16( IFormatProvider provider ) + { + return value.ToInt16( provider ); + } + + + public override int ToInt32( IFormatProvider provider ) + { + return value.ToInt32( provider ); + } + + + public override long ToInt64( IFormatProvider provider ) + { + return value.ToInt64( provider ); + } + + + public override sbyte ToSByte( IFormatProvider provider ) + { + return value.ToSByte( provider ); + } + + + public override float ToSingle( IFormatProvider provider ) + { + return value.ToSingle( provider ); + } + + + public override string ToString( IFormatProvider provider ) + { + return value.ToString( provider ); + } + + + public override ushort ToUInt16( IFormatProvider provider ) + { + return value.ToUInt16( provider ); + } + + + public override uint ToUInt32( IFormatProvider provider ) + { + return value.ToUInt32( provider ); + } + + + public override ulong ToUInt64( IFormatProvider provider ) + { + return value.ToUInt64( provider ); + } + } +} diff --git a/MelonLoader.TinyJSON/Types/ProxyObject.cs b/MelonLoader.TinyJSON/Types/ProxyObject.cs new file mode 100644 index 00000000..b94c6645 --- /dev/null +++ b/MelonLoader.TinyJSON/Types/ProxyObject.cs @@ -0,0 +1,98 @@ +using System.Collections; +using System.Collections.Generic; +using System.Globalization; + +namespace MelonLoader.TinyJSON +{ + public sealed class ProxyObject : Variant, IEnumerable> + { + public const string TypeHintKey = "@type"; + readonly Dictionary dict; + + + public ProxyObject() + { + dict = new Dictionary(); + } + + + IEnumerator> IEnumerable>.GetEnumerator() + { + return dict.GetEnumerator(); + } + + + IEnumerator IEnumerable.GetEnumerator() + { + return dict.GetEnumerator(); + } + + + public void Add( string key, Variant item ) + { + dict.Add( key, item ); + } + + + public bool TryGetValue( string key, out Variant item ) + { + return dict.TryGetValue( key, out item ); + } + + + public string TypeHint + { + get + { + Variant item; + if (TryGetValue( TypeHintKey, out item )) + { + return item.ToString( CultureInfo.InvariantCulture ); + } + + return null; + } + } + + + public override Variant this[ string key ] + { + get + { + return dict[key]; + } + set + { + dict[key] = value; + } + } + + + public int Count + { + get + { + return dict.Count; + } + } + + + public Dictionary.KeyCollection Keys + { + get + { + return dict.Keys; + } + } + + + // ReSharper disable once UnusedMember.Global + public Dictionary.ValueCollection Values + { + get + { + return dict.Values; + } + } + } +} diff --git a/MelonLoader.TinyJSON/Types/ProxyString.cs b/MelonLoader.TinyJSON/Types/ProxyString.cs new file mode 100644 index 00000000..48003cd3 --- /dev/null +++ b/MelonLoader.TinyJSON/Types/ProxyString.cs @@ -0,0 +1,21 @@ +using System; + +namespace MelonLoader.TinyJSON +{ + public sealed class ProxyString : Variant + { + readonly string value; + + + public ProxyString( string value ) + { + this.value = value; + } + + + public override string ToString( IFormatProvider provider ) + { + return value; + } + } +} diff --git a/MelonLoader.TinyJSON/Types/Variant.cs b/MelonLoader.TinyJSON/Types/Variant.cs new file mode 100644 index 00000000..17738a1e --- /dev/null +++ b/MelonLoader.TinyJSON/Types/Variant.cs @@ -0,0 +1,250 @@ +using System; +using System.Globalization; + +namespace MelonLoader.TinyJSON +{ + public abstract class Variant : IConvertible + { + protected static readonly IFormatProvider FormatProvider = new NumberFormatInfo(); + + + // ReSharper disable once UnusedMember.Global + public void Make( out T item ) + { + JSON.MakeInto( this, out item ); + } + + + public T Make() + { + T item; + JSON.MakeInto( this, out item ); + return item; + } + + + public void Populate( T item ) where T : class + { + JSON.Populate( this, item ); + } + + + // ReSharper disable once InconsistentNaming + // ReSharper disable once UnusedMember.Global + public string ToJSON() + { + return JSON.Dump( this ); + } + + + public virtual TypeCode GetTypeCode() + { + return TypeCode.Object; + } + + + public virtual object ToType( Type conversionType, IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to " + conversionType.Name ); + } + + + public virtual DateTime ToDateTime( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to DateTime" ); + } + + + public virtual bool ToBoolean( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Boolean" ); + } + + public virtual byte ToByte( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Byte" ); + } + + + public virtual char ToChar( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Char" ); + } + + + public virtual decimal ToDecimal( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Decimal" ); + } + + + public virtual double ToDouble( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Double" ); + } + + + public virtual short ToInt16( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Int16" ); + } + + + public virtual int ToInt32( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Int32" ); + } + + + public virtual long ToInt64( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Int64" ); + } + + + public virtual sbyte ToSByte( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to SByte" ); + } + + + public virtual float ToSingle( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to Single" ); + } + + + public virtual string ToString( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to String" ); + } + + + public virtual ushort ToUInt16( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to UInt16" ); + } + + + public virtual uint ToUInt32( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to UInt32" ); + } + + + public virtual ulong ToUInt64( IFormatProvider provider ) + { + throw new InvalidCastException( "Cannot convert " + GetType() + " to UInt64" ); + } + + + public override string ToString() + { + return ToString( FormatProvider ); + } + + + // ReSharper disable once UnusedMemberInSuper.Global + public virtual Variant this[ string key ] + { + get + { + throw new NotSupportedException(); + } + + // ReSharper disable once UnusedMember.Global + set + { + throw new NotSupportedException(); + } + } + + + // ReSharper disable once UnusedMemberInSuper.Global + public virtual Variant this[ int index ] + { + get + { + throw new NotSupportedException(); + } + + // ReSharper disable once UnusedMember.Global + set + { + throw new NotSupportedException(); + } + } + + + public static implicit operator Boolean( Variant variant ) + { + return variant.ToBoolean( FormatProvider ); + } + + + public static implicit operator Single( Variant variant ) + { + return variant.ToSingle( FormatProvider ); + } + + + public static implicit operator Double( Variant variant ) + { + return variant.ToDouble( FormatProvider ); + } + + + public static implicit operator UInt16( Variant variant ) + { + return variant.ToUInt16( FormatProvider ); + } + + + public static implicit operator Int16( Variant variant ) + { + return variant.ToInt16( FormatProvider ); + } + + + public static implicit operator UInt32( Variant variant ) + { + return variant.ToUInt32( FormatProvider ); + } + + + public static implicit operator Int32( Variant variant ) + { + return variant.ToInt32( FormatProvider ); + } + + + public static implicit operator UInt64( Variant variant ) + { + return variant.ToUInt64( FormatProvider ); + } + + + public static implicit operator Int64( Variant variant ) + { + return variant.ToInt64( FormatProvider ); + } + + + public static implicit operator Decimal( Variant variant ) + { + return variant.ToDecimal( FormatProvider ); + } + + + public static implicit operator String( Variant variant ) + { + return variant.ToString( FormatProvider ); + } + + + public static implicit operator Guid( Variant variant ) + { + return new Guid( variant.ToString( FormatProvider ) ); + } + } +} From 10afaf19036f68c42edc76af68d1501d9a4d695b Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 11:48:18 +0800 Subject: [PATCH 02/15] net48 --- AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj | 2 +- AquaMai.Config/AquaMai.Config.csproj | 2 +- AquaMai.Core/AquaMai.Core.csproj | 2 +- AquaMai.ErrorReport/AquaMai.ErrorReport.csproj | 4 ++-- AquaMai.Mods/AquaMai.Mods.csproj | 2 +- AquaMai/AquaMai.csproj | 2 +- README.md | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj b/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj index 95c911c2..66dd87a3 100644 --- a/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj +++ b/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj @@ -7,7 +7,7 @@ Library AquaMai.Config.Interfaces AquaMai.Config.Interfaces - net472 + net48 512 true 12 diff --git a/AquaMai.Config/AquaMai.Config.csproj b/AquaMai.Config/AquaMai.Config.csproj index 1402de4a..d77fcf9c 100644 --- a/AquaMai.Config/AquaMai.Config.csproj +++ b/AquaMai.Config/AquaMai.Config.csproj @@ -7,7 +7,7 @@ Library AquaMai.Config AquaMai.Config - net472 + net48 512 true 12 diff --git a/AquaMai.Core/AquaMai.Core.csproj b/AquaMai.Core/AquaMai.Core.csproj index c4efeedb..35b26f58 100644 --- a/AquaMai.Core/AquaMai.Core.csproj +++ b/AquaMai.Core/AquaMai.Core.csproj @@ -7,7 +7,7 @@ Library AquaMai.Core AquaMai.Core - net472 + net48 512 true 12 diff --git a/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj b/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj index b2947ce4..de286974 100644 --- a/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj +++ b/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj @@ -2,7 +2,7 @@ WinExe - net472 + net48 enable true enable @@ -36,4 +36,4 @@ - \ No newline at end of file + diff --git a/AquaMai.Mods/AquaMai.Mods.csproj b/AquaMai.Mods/AquaMai.Mods.csproj index b426af12..8501de0b 100644 --- a/AquaMai.Mods/AquaMai.Mods.csproj +++ b/AquaMai.Mods/AquaMai.Mods.csproj @@ -7,7 +7,7 @@ Library AquaMai.Mods AquaMai.Mods - net472 + net48 512 true 12 diff --git a/AquaMai/AquaMai.csproj b/AquaMai/AquaMai.csproj index 6460fec3..ded965e1 100644 --- a/AquaMai/AquaMai.csproj +++ b/AquaMai/AquaMai.csproj @@ -7,7 +7,7 @@ Library AquaMai AquaMai - net472 + net48 512 true 12 diff --git a/README.md b/README.md index 7de34635..5d2b1497 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ ## Development 1. Copy `Assembly-CSharp.dll` and `AMDaemon.NET.dll` to `Libs` folder. -1. Install [.NET Framework 4.7.2 Developer Pack](https://dotnet.microsoft.com/en-us/download/dotnet-framework/thank-you/net472-developer-pack-offline-installer) +1. Install [.NET Framework 4.8 Developer Pack](https://dotnet.microsoft.com/en-us/download/dotnet-framework/thank-you/net48-developer-pack-offline-installer) 1. Run `build.ps1`. 1. Copy `Output/AquaMai.dll` to `Mods` folder. 1. Configure and copy `AquaMai.toml` to the same folder as your game executable: `Sinmai.exe` From 0850c4cba8d46999a8cd4bc39dd36e7a5ee383ef Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 12:06:39 +0800 Subject: [PATCH 03/15] Migrate sln to slnx --- AquaMai.BepInEx/AquaMai.BepInEx.csproj | 1 - AquaMai.Build/AquaMai.Build.csproj | 1 - .../AquaMai.Config.HeadlessLoader.csproj | 1 - .../AquaMai.Config.Interfaces.csproj | 1 - AquaMai.Config/AquaMai.Config.csproj | 1 - AquaMai.Core/AquaMai.Core.csproj | 1 - AquaMai.Mods/AquaMai.Mods.csproj | 1 - AquaMai.sln | 105 ------------------ AquaMai.slnx | 12 ++ AquaMai/AquaMai.csproj | 1 - .../MelonLoader.TinyJSON.csproj | 1 - build.cake | 2 +- 12 files changed, 13 insertions(+), 115 deletions(-) delete mode 100644 AquaMai.sln create mode 100644 AquaMai.slnx diff --git a/AquaMai.BepInEx/AquaMai.BepInEx.csproj b/AquaMai.BepInEx/AquaMai.BepInEx.csproj index acd9b61f..2bdf4d50 100644 --- a/AquaMai.BepInEx/AquaMai.BepInEx.csproj +++ b/AquaMai.BepInEx/AquaMai.BepInEx.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0} Library AquaMai AquaMai.BepInEx diff --git a/AquaMai.Build/AquaMai.Build.csproj b/AquaMai.Build/AquaMai.Build.csproj index ff6b804d..ae6b6eed 100644 --- a/AquaMai.Build/AquaMai.Build.csproj +++ b/AquaMai.Build/AquaMai.Build.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} Library AquaMai.Build AquaMai.Build diff --git a/AquaMai.Config.HeadlessLoader/AquaMai.Config.HeadlessLoader.csproj b/AquaMai.Config.HeadlessLoader/AquaMai.Config.HeadlessLoader.csproj index e23c3ba3..eb9796d8 100644 --- a/AquaMai.Config.HeadlessLoader/AquaMai.Config.HeadlessLoader.csproj +++ b/AquaMai.Config.HeadlessLoader/AquaMai.Config.HeadlessLoader.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66} Library AquaMai.Config.HeadlessLoader AquaMai.Config.HeadlessLoader diff --git a/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj b/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj index 66dd87a3..41f30921 100644 --- a/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj +++ b/AquaMai.Config.Interfaces/AquaMai.Config.Interfaces.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {DF1536F9-3B06-4463-B654-4CC3E708B610} Library AquaMai.Config.Interfaces AquaMai.Config.Interfaces diff --git a/AquaMai.Config/AquaMai.Config.csproj b/AquaMai.Config/AquaMai.Config.csproj index d77fcf9c..a7004860 100644 --- a/AquaMai.Config/AquaMai.Config.csproj +++ b/AquaMai.Config/AquaMai.Config.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {DF1536F9-3B06-4463-B654-4CC3E708B610} Library AquaMai.Config AquaMai.Config diff --git a/AquaMai.Core/AquaMai.Core.csproj b/AquaMai.Core/AquaMai.Core.csproj index 35b26f58..44612e4b 100644 --- a/AquaMai.Core/AquaMai.Core.csproj +++ b/AquaMai.Core/AquaMai.Core.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} Library AquaMai.Core AquaMai.Core diff --git a/AquaMai.Mods/AquaMai.Mods.csproj b/AquaMai.Mods/AquaMai.Mods.csproj index 8501de0b..d48a2ee9 100644 --- a/AquaMai.Mods/AquaMai.Mods.csproj +++ b/AquaMai.Mods/AquaMai.Mods.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {8731C0E0-53BE-4B1B-9828-193E738C6865} Library AquaMai.Mods AquaMai.Mods diff --git a/AquaMai.sln b/AquaMai.sln deleted file mode 100644 index 4ada5ed2..00000000 --- a/AquaMai.sln +++ /dev/null @@ -1,105 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.6.33815.320 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Config.Interfaces", "AquaMai.Config.Interfaces\AquaMai.Config.Interfaces.csproj", "{50C59E41-2939-407E-9CB7-B186F33DDCF9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Config", "AquaMai.Config\AquaMai.Config.csproj", "{B9CA039A-A0F1-4C87-A33E-3F959974BB3A}" - ProjectSection(ProjectDependencies) = postProject - {50C59E41-2939-407E-9CB7-B186F33DDCF9} = {50C59E41-2939-407E-9CB7-B186F33DDCF9} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Config.HeadlessLoader", "AquaMai.Config.HeadlessLoader\AquaMai.Config.HeadlessLoader.csproj", "{6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66}" - ProjectSection(ProjectDependencies) = postProject - {50C59E41-2939-407E-9CB7-B186F33DDCF9} = {50C59E41-2939-407E-9CB7-B186F33DDCF9} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Build", "AquaMai.Build\AquaMai.Build.csproj", "{4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5}" - ProjectSection(ProjectDependencies) = postProject - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66} = {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Core", "AquaMai.Core\AquaMai.Core.csproj", "{33C0D4ED-6A84-4659-9A05-12D43D75D0B3}" - ProjectSection(ProjectDependencies) = postProject - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A} = {B9CA039A-A0F1-4C87-A33E-3F959974BB3A} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.Mods", "AquaMai.Mods\AquaMai.Mods.csproj", "{8731C0E0-53BE-4B1B-9828-193E738C6865}" - ProjectSection(ProjectDependencies) = postProject - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A} = {B9CA039A-A0F1-4C87-A33E-3F959974BB3A} - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} = {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai", "AquaMai\AquaMai.csproj", "{788BC472-59F7-46F6-B760-65C18BA74389}" - ProjectSection(ProjectDependencies) = postProject - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} = {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} = {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} - {8731C0E0-53BE-4B1B-9828-193E738C6865} = {8731C0E0-53BE-4B1B-9828-193E738C6865} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.BepInEx", "AquaMai.BepInEx\AquaMai.BepInEx.csproj", "{01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}" - ProjectSection(ProjectDependencies) = postProject - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} = {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5} - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} = {33C0D4ED-6A84-4659-9A05-12D43D75D0B3} - {8731C0E0-53BE-4B1B-9828-193E738C6865} = {8731C0E0-53BE-4B1B-9828-193E738C6865} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AquaMai.ErrorReport", "AquaMai.ErrorReport\AquaMai.ErrorReport.csproj", "{F7E471E4-92B5-44A2-AFA3-7089AFEB6605}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MelonLoader.TinyJSON", "MelonLoader.TinyJSON\MelonLoader.TinyJSON.csproj", "{604377A8-CC01-417B-9D4F-22F50DD31014}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Release|Any CPU = Release|Any CPU - Debug|Any CPU = Debug|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {50C59E41-2939-407E-9CB7-B186F33DDCF9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {50C59E41-2939-407E-9CB7-B186F33DDCF9}.Release|Any CPU.Build.0 = Release|Any CPU - {50C59E41-2939-407E-9CB7-B186F33DDCF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {50C59E41-2939-407E-9CB7-B186F33DDCF9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A}.Release|Any CPU.Build.0 = Release|Any CPU - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B9CA039A-A0F1-4C87-A33E-3F959974BB3A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66}.Release|Any CPU.Build.0 = Release|Any CPU - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6B5E1F3E-D012-4CFB-A2FA-26A6CE06BE66}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5}.Release|Any CPU.Build.0 = Release|Any CPU - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C0C68C3-8B2E-4CA8-A26D-AE87CF2A38A5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3}.Release|Any CPU.Build.0 = Release|Any CPU - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {33C0D4ED-6A84-4659-9A05-12D43D75D0B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8731C0E0-53BE-4B1B-9828-193E738C6865}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8731C0E0-53BE-4B1B-9828-193E738C6865}.Release|Any CPU.Build.0 = Release|Any CPU - {8731C0E0-53BE-4B1B-9828-193E738C6865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8731C0E0-53BE-4B1B-9828-193E738C6865}.Debug|Any CPU.Build.0 = Debug|Any CPU - {788BC472-59F7-46F6-B760-65C18BA74389}.Release|Any CPU.ActiveCfg = Release|Any CPU - {788BC472-59F7-46F6-B760-65C18BA74389}.Release|Any CPU.Build.0 = Release|Any CPU - {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {788BC472-59F7-46F6-B760-65C18BA74389}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Release|Any CPU.Build.0 = Release|Any CPU - {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01F9CFFA-7DC3-4D3A-877D-9E93959A47A0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Release|Any CPU.Build.0 = Release|Any CPU - {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7E471E4-92B5-44A2-AFA3-7089AFEB6605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {604377A8-CC01-417B-9D4F-22F50DD31014}.Release|Any CPU.ActiveCfg = Release|Any CPU - {604377A8-CC01-417B-9D4F-22F50DD31014}.Release|Any CPU.Build.0 = Release|Any CPU - {604377A8-CC01-417B-9D4F-22F50DD31014}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {604377A8-CC01-417B-9D4F-22F50DD31014}.Debug|Any CPU.Build.0 = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {DDF15A6C-2A44-4EBE-BD85-F3EE61DCD8BF} - EndGlobalSection -EndGlobal diff --git a/AquaMai.slnx b/AquaMai.slnx new file mode 100644 index 00000000..9fa68ad6 --- /dev/null +++ b/AquaMai.slnx @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/AquaMai/AquaMai.csproj b/AquaMai/AquaMai.csproj index ded965e1..afc47b6c 100644 --- a/AquaMai/AquaMai.csproj +++ b/AquaMai/AquaMai.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {788BC472-59F7-46F6-B760-65C18BA74389} Library AquaMai AquaMai diff --git a/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj b/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj index 852684f9..a97d26e9 100644 --- a/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj +++ b/MelonLoader.TinyJSON/MelonLoader.TinyJSON.csproj @@ -3,7 +3,6 @@ Release AnyCPU - {604377A8-CC01-417B-9D4F-22F50DD31014} Library MelonLoader.TinyJSON MelonLoader.TinyJSON diff --git a/build.cake b/build.cake index 2382a5fb..6cc2df79 100644 --- a/build.cake +++ b/build.cake @@ -8,7 +8,7 @@ Task("Restore") .Does(() => { // 运行 dotnet restore - DotNetRestore("./AquaMai.sln"); + DotNetRestore("./AquaMai.slnx"); }); Task("PreBuild") From a26a4a8649df04d28de4dd64a592688a1376069c Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 13:04:38 +0800 Subject: [PATCH 04/15] Move common bootstrap logic to AquaMai.Common --- .github/workflows/aquamai.yaml | 8 +- AquaMai.BepInEx/AquaMai.BepInEx.csproj | 39 ++---- AquaMai.BepInEx/BuildInfo.cs | 11 -- AquaMai.BepInEx/FodyWeavers.xml | 6 + AquaMai.BepInEx/FodyWeavers.xsd | 111 ++++++++++++++++++ AquaMai.BepInEx/Main.cs | 72 ++++-------- AquaMai.BepInEx/Properties/AssemblyInfo.cs | 23 ++-- .../AquaMai.Common.csproj | 9 +- AquaMai.Common/AquaMai.cs | 99 ++++++++++++++++ .../AssemblyLoader.cs | 4 +- {AquaMai => AquaMai.Common}/BuildInfo.cs | 2 +- .../BuildInfo.g.cs | 2 +- .../configSort.yaml | 0 AquaMai.Config/AquaMai.Config.csproj | 4 +- .../AquaMai.ErrorReport.csproj | 5 +- .../AquaMai.MelonLoader.csproj | 57 +++++++++ AquaMai.MelonLoader/AquaMai.cs | 27 +++++ AquaMai.MelonLoader/FodyWeavers.xml | 6 + AquaMai.MelonLoader/FodyWeavers.xsd | 111 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 19 +++ AquaMai.Mods/AquaMai.Mods.csproj | 6 +- AquaMai.slnx | 12 +- AquaMai/AssemblyLoader.cs | 72 ------------ AquaMai/Main.cs | 65 ---------- AquaMai/Properties/AssemblyInfo.cs | 19 --- AquaMai/configSort.yaml | 96 --------------- build.cake | 2 +- 27 files changed, 501 insertions(+), 386 deletions(-) delete mode 100644 AquaMai.BepInEx/BuildInfo.cs create mode 100644 AquaMai.BepInEx/FodyWeavers.xml create mode 100644 AquaMai.BepInEx/FodyWeavers.xsd rename AquaMai/AquaMai.csproj => AquaMai.Common/AquaMai.Common.csproj (93%) create mode 100644 AquaMai.Common/AquaMai.cs rename {AquaMai.BepInEx => AquaMai.Common}/AssemblyLoader.cs (95%) rename {AquaMai => AquaMai.Common}/BuildInfo.cs (91%) rename {AquaMai.BepInEx => AquaMai.Common}/BuildInfo.g.cs (90%) rename {AquaMai.BepInEx => AquaMai.Common}/configSort.yaml (100%) create mode 100644 AquaMai.MelonLoader/AquaMai.MelonLoader.csproj create mode 100644 AquaMai.MelonLoader/AquaMai.cs create mode 100644 AquaMai.MelonLoader/FodyWeavers.xml create mode 100644 AquaMai.MelonLoader/FodyWeavers.xsd create mode 100644 AquaMai.MelonLoader/Properties/AssemblyInfo.cs delete mode 100644 AquaMai/AssemblyLoader.cs delete mode 100644 AquaMai/Main.cs delete mode 100644 AquaMai/Properties/AssemblyInfo.cs delete mode 100644 AquaMai/configSort.yaml diff --git a/.github/workflows/aquamai.yaml b/.github/workflows/aquamai.yaml index b0621210..502572e4 100644 --- a/.github/workflows/aquamai.yaml +++ b/.github/workflows/aquamai.yaml @@ -43,6 +43,7 @@ jobs: cd Output mkdir Upload move AquaMai.dll Upload + move AquaMai.BepInEx.dll Upload move AquaMai.*.toml Upload - uses: actions/upload-artifact@v4 @@ -53,6 +54,7 @@ jobs: - name: Upload CI release if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' shell: cmd + # TODO: Add AquaMai.BepInEx.dll run: build-assets\Releaser\AquaMaiReleaser.exe "Output\Upload\AquaMai.dll" "${{ env.GIT_DESCRIBE }}" - name: Send to Telegram @@ -62,11 +64,13 @@ jobs: $Form = @{ chat_id = "-1002231087502" media = @( - @{ type = "document"; media = "attach://aquamai_main"; caption = "${{ env.GIT_DESCRIBE }}`n${{ github.event.commits[0].message }}" }, + @{ type = "document"; media = "attach://aquamai_melonloader"; caption = "${{ env.GIT_DESCRIBE }}`n${{ github.event.commits[0].message }}" }, + @{ type = "document"; media = "attach://aquamai_bepinex" }, @{ type = "document"; media = "attach://aquamai_zh" } @{ type = "document"; media = "attach://aquamai_en" } ) | ConvertTo-Json - aquamai_main = Get-Item Output\Upload\AquaMai.dll + aquamai_melonloader = Get-Item Output\Upload\AquaMai.dll + aquamai_bepinex = Get-Item Output\Upload\AquaMai.BepInEx.dll aquamai_zh = Get-Item Output\Upload\AquaMai.zh.toml aquamai_en = Get-Item Output\Upload\AquaMai.en.toml } diff --git a/AquaMai.BepInEx/AquaMai.BepInEx.csproj b/AquaMai.BepInEx/AquaMai.BepInEx.csproj index 2bdf4d50..80c17a52 100644 --- a/AquaMai.BepInEx/AquaMai.BepInEx.csproj +++ b/AquaMai.BepInEx/AquaMai.BepInEx.csproj @@ -4,7 +4,7 @@ Release AnyCPU Library - AquaMai + AquaMai.BepInEx AquaMai.BepInEx net48 512 @@ -37,6 +37,7 @@ + @@ -48,38 +49,12 @@ - - - - - - - - - - - - MelonLoader.TinyJSON.dll - - - AquaMai.Config.Interfaces.dll - - - AquaMai.Config.dll - - - AquaMai.Core.dll - - - AquaMai.Mods.dll - - - AquaMai.ErrorReport.exe - - - configSort.yaml - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/AquaMai.BepInEx/BuildInfo.cs b/AquaMai.BepInEx/BuildInfo.cs deleted file mode 100644 index 96d4d10b..00000000 --- a/AquaMai.BepInEx/BuildInfo.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace AquaMai; - -public static partial class BuildInfo -{ - public const string Name = "AquaMai"; - public const string Description = "Mod for Sinmai"; - public const string Author = "Aza ft. Clansty ft. Menci"; - public const string Company = null; - public const string DownloadLink = null; -} - diff --git a/AquaMai.BepInEx/FodyWeavers.xml b/AquaMai.BepInEx/FodyWeavers.xml new file mode 100644 index 00000000..f254ee21 --- /dev/null +++ b/AquaMai.BepInEx/FodyWeavers.xml @@ -0,0 +1,6 @@ + + + + AquaMai.Common + + diff --git a/AquaMai.BepInEx/FodyWeavers.xsd b/AquaMai.BepInEx/FodyWeavers.xsd new file mode 100644 index 00000000..968f9b5e --- /dev/null +++ b/AquaMai.BepInEx/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A regular expression matching the assembly names to include in merging. + + + + + A regular expression matching the assembly names to exclude from merging. + + + + + A regular expression matching the resource names to include in merging. + + + + + A regular expression matching the resource names to exclude from merging. + + + + + A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true' + + + + + A string that is used as prefix for the namespace of the imported types. + + + + + A switch to control whether to import the full assemblies or only the referenced types. Default is 'false' + + + + + A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false' + + + + + + A regular expression matching the assembly names to include in merging. + + + + + A regular expression matching the assembly names to exclude from merging. + + + + + A regular expression matching the resource names to include in merging. + + + + + A regular expression matching the resource names to exclude from merging. + + + + + A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true' + + + + + A string that is used as prefix for the namespace of the imported types. + + + + + A switch to control whether to import the full assemblies or only the referenced types. Default is 'false' + + + + + A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false' + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/AquaMai.BepInEx/Main.cs b/AquaMai.BepInEx/Main.cs index b5947279..1d08d780 100644 --- a/AquaMai.BepInEx/Main.cs +++ b/AquaMai.BepInEx/Main.cs @@ -1,57 +1,28 @@ using System; using System.Reflection; -using System.Runtime.InteropServices; +using AquaMai.Common; using BepInEx; using BepInEx.Logging; using Manager; -namespace AquaMai; +namespace AquaMai.BepInEx; -[BepInPlugin("net.aquadx.aquamai", BuildInfo.Name, BuildInfo.GitVersion)] -public class AquaMai : BaseUnityPlugin +[BepInPlugin(PluginName, BuildInfo.Name, BuildInfo.GitVersion)] +public class Plugin : BaseUnityPlugin { - public const string AQUAMAI_SAY = """ - 如果你在 dnSpy / ILSpy 里看到了这行字,请从 resources 中解包 DLLs。 - If you see this line in dnSpy / ILSpy, please unpack the DLLs from resources. - """; + public const string PluginName = "net.aquadx.aquamai"; - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetConsoleOutputCP(uint wCodePageID); - - private void SetCoreBuildInfo(Assembly coreAssembly) - { - var coreBuildInfo = coreAssembly.GetType("AquaMai.Core.BuildInfo"); - var buildInfo = typeof(BuildInfo); - foreach (var field in buildInfo.GetFields()) - { - coreBuildInfo.GetField(field.Name)?.SetValue(null, field.GetValue(null)); - } - coreBuildInfo.GetField("ModAssembly")?.SetValue(null, Assembly.GetExecutingAssembly()); - } - - public readonly static ManualLogSource LogSource = BepInEx.Logging.Logger.CreateLogSource(BuildInfo.Name); - private void SetCoreLogger(Assembly coreAssembly) - { - var coreLogger = coreAssembly.GetType("AquaMai.Core.Environment.MelonLogger"); - coreLogger.GetField("MsgStringAction").SetValue(null, (Action)LogSource.LogMessage); - coreLogger.GetField("MsgObjectAction").SetValue(null, (Action)LogSource.LogMessage); - coreLogger.GetField("ErrorStringAction").SetValue(null, (Action)LogSource.LogError); - coreLogger.GetField("ErrorObjectAction").SetValue(null, (Action)LogSource.LogError); - coreLogger.GetField("WarningStringAction").SetValue(null, (Action)LogSource.LogWarning); - coreLogger.GetField("WarningObjectAction").SetValue(null, (Action)LogSource.LogWarning); - } - - private static MethodInfo onGUIMethod; + public readonly static ManualLogSource LogSource = global::BepInEx.Logging.Logger.CreateLogSource(BuildInfo.Name); public void Awake() { - var harmony = new HarmonyLib.Harmony("net.aquadx.aquamai"); + var harmony = new HarmonyLib.Harmony(PluginName); // Early initialization of AMDaemon.NET try { AmManager.Instance.Initialize(); - harmony.PatchAll(typeof(AquaMai)); + harmony.PatchAll(typeof(Plugin)); } catch (Exception ex) { @@ -59,25 +30,22 @@ public void Awake() return; } - // Prevent Chinese characters from being garbled - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) SetConsoleOutputCP(65001); - - AssemblyLoader.LoadAssemblies(); - - var modsAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Mods); - var coreAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Core); - SetCoreBuildInfo(coreAssembly); - SetCoreLogger(coreAssembly); - coreAssembly.GetType("AquaMai.Core.Startup") - .GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) - .Invoke(null, [modsAssembly, harmony]); - onGUIMethod = coreAssembly.GetType("AquaMai.Core.Startup") - .GetMethod("OnGUI", BindingFlags.Public | BindingFlags.Static); + Common.AquaMai.Bootstrap(new BootstrapOptions + { + CurrentAssembly = Assembly.GetExecutingAssembly(), + Harmony = harmony, + MsgStringAction = LogSource.LogMessage, + MsgObjectAction = LogSource.LogMessage, + ErrorStringAction = LogSource.LogError, + ErrorObjectAction = LogSource.LogError, + WarningStringAction = LogSource.LogWarning, + WarningObjectAction = LogSource.LogWarning, + }); } public void OnGUI() { - onGUIMethod?.Invoke(null, []); + Common.AquaMai.OnGUI(); } [HarmonyLib.HarmonyPatch(typeof(AmManager), "Initialize")] diff --git a/AquaMai.BepInEx/Properties/AssemblyInfo.cs b/AquaMai.BepInEx/Properties/AssemblyInfo.cs index fabf7d00..17aecbae 100644 --- a/AquaMai.BepInEx/Properties/AssemblyInfo.cs +++ b/AquaMai.BepInEx/Properties/AssemblyInfo.cs @@ -1,16 +1,11 @@ using System.Reflection; +using AquaMai.Common; -[assembly: AssemblyTitle(AquaMai.BuildInfo.Description)] -[assembly: AssemblyDescription(AquaMai.BuildInfo.Description)] -[assembly: AssemblyCompany(AquaMai.BuildInfo.Company)] -[assembly: AssemblyProduct(AquaMai.BuildInfo.Name)] -[assembly: AssemblyCopyright("Created by " + AquaMai.BuildInfo.Author)] -[assembly: AssemblyTrademark(AquaMai.BuildInfo.Company)] -[assembly: AssemblyVersion(AquaMai.BuildInfo.Version)] -[assembly: AssemblyFileVersion(AquaMai.BuildInfo.GitVersion)] -// [assembly: HarmonyDontPatchAll] - -// Create and Setup a MelonGame Attribute to mark a Melon as Universal or Compatible with specific Games. -// If no MelonGame Attribute is found or any of the Values for any MelonGame Attribute on the Melon is null or empty it will be assumed the Melon is Universal. -// Values for MelonGame Attribute can be found in the Game's app.info file or printed at the top of every log directly beneath the Unity version. -// [assembly: MelonGame(null, null)] +[assembly: AssemblyTitle(BuildInfo.Description)] +[assembly: AssemblyDescription(BuildInfo.Description)] +[assembly: AssemblyCompany(BuildInfo.Company)] +[assembly: AssemblyProduct(BuildInfo.Name)] +[assembly: AssemblyCopyright("Created by " + BuildInfo.Author)] +[assembly: AssemblyTrademark(BuildInfo.Company)] +[assembly: AssemblyVersion(BuildInfo.Version)] +[assembly: AssemblyFileVersion(BuildInfo.GitVersion)] diff --git a/AquaMai/AquaMai.csproj b/AquaMai.Common/AquaMai.Common.csproj similarity index 93% rename from AquaMai/AquaMai.csproj rename to AquaMai.Common/AquaMai.Common.csproj index afc47b6c..61506d19 100644 --- a/AquaMai/AquaMai.csproj +++ b/AquaMai.Common/AquaMai.Common.csproj @@ -4,8 +4,8 @@ Release AnyCPU Library - AquaMai - AquaMai + AquaMai.Common + AquaMai.Common net48 512 true @@ -32,6 +32,10 @@ DEBUG + + + + @@ -43,7 +47,6 @@ - diff --git a/AquaMai.Common/AquaMai.cs b/AquaMai.Common/AquaMai.cs new file mode 100644 index 00000000..65e81525 --- /dev/null +++ b/AquaMai.Common/AquaMai.cs @@ -0,0 +1,99 @@ +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using HarmonyLib; + +namespace AquaMai.Common; + +public class BootstrapOptions +{ + public required Assembly CurrentAssembly { get; set; } + public required Harmony Harmony { get; set; } + + public required Action MsgStringAction { get; set; } + public required Action MsgObjectAction { get; set; } + public required Action ErrorStringAction { get; set; } + public required Action ErrorObjectAction { get; set; } + public required Action WarningStringAction { get; set; } + public required Action WarningObjectAction { get; set; } +} + +public class AquaMai +{ + public const string AQUAMAI_SAY = """ + 如果你在 dnSpy / ILSpy 里看到了这行字,请从 resources 中解包 DLLs。 + If you see this line in dnSpy / ILSpy, please unpack the DLLs from resources. + """; + private static BootstrapOptions Options { get; set; } + + [DllImport("kernel32.dll", SetLastError = true)] + private static extern bool SetConsoleOutputCP(uint wCodePageID); + + private static void SetCoreBuildInfo(Assembly coreAssembly) + { + var coreBuildInfo = coreAssembly.GetType("AquaMai.Core.BuildInfo"); + var buildInfo = typeof(BuildInfo); + foreach (var field in buildInfo.GetFields()) + { + coreBuildInfo.GetField(field.Name)?.SetValue(null, field.GetValue(null)); + } + coreBuildInfo.GetField("ModAssembly")?.SetValue(null, Options.CurrentAssembly); + } + + private static void SetCoreLogger(Assembly coreAssembly) + { + var coreLogger = coreAssembly.GetType("AquaMai.Core.Environment.MelonLogger"); + coreLogger.GetField("MsgStringAction").SetValue(null, Options.MsgStringAction); + coreLogger.GetField("MsgObjectAction").SetValue(null, Options.MsgObjectAction); + coreLogger.GetField("ErrorStringAction").SetValue(null, Options.ErrorStringAction); + coreLogger.GetField("ErrorObjectAction").SetValue(null, Options.ErrorObjectAction); + coreLogger.GetField("WarningStringAction").SetValue(null, Options.WarningStringAction); + coreLogger.GetField("WarningObjectAction").SetValue(null, Options.WarningObjectAction); + } + + private static MethodInfo onGUIMethod; + + public static void EarlyStageLog(string message) + { + Options.MsgStringAction?.Invoke(message); + } + + public static void Bootstrap(BootstrapOptions options) + { + Options = options; + try + { + // Prevent Chinese characters from being garbled + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) SetConsoleOutputCP(65001); + + AssemblyLoader.LoadAssemblies(); + + var modsAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Mods); + var coreAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Core); + SetCoreBuildInfo(coreAssembly); + SetCoreLogger(coreAssembly); + var startupMethod = coreAssembly.GetType("AquaMai.Core.Startup") + .GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static); + onGUIMethod = coreAssembly.GetType("AquaMai.Core.Startup") + .GetMethod("OnGUI", BindingFlags.Public | BindingFlags.Static); + + startupMethod.Invoke(null, [modsAssembly, options.Harmony]); + } + catch (Exception ex) + { + Options.ErrorObjectAction?.Invoke(ex); + } + } + + public static void OnGUI() + { + try + { + onGUIMethod?.Invoke(null, []); + } + catch (Exception ex) + { + Options.ErrorObjectAction?.Invoke(ex); + } + } +} diff --git a/AquaMai.BepInEx/AssemblyLoader.cs b/AquaMai.Common/AssemblyLoader.cs similarity index 95% rename from AquaMai.BepInEx/AssemblyLoader.cs rename to AquaMai.Common/AssemblyLoader.cs index 1167700c..da7ea33f 100644 --- a/AquaMai.BepInEx/AssemblyLoader.cs +++ b/AquaMai.Common/AssemblyLoader.cs @@ -4,7 +4,7 @@ using System.IO.Compression; using System.Reflection; -namespace AquaMai; +namespace AquaMai.Common; public static class AssemblyLoader { @@ -35,7 +35,7 @@ public static void LoadAssemblies() foreach (var (assemblyName, assemblyFileName) in Assemblies) { # if DEBUG - AquaMai.LogSource.LogMessage($"Loading assembly \"{assemblyFileName}\"..."); + AquaMai.EarlyStageLog($"Loading assembly \"{assemblyFileName}\"..."); # endif LoadedAssemblies[assemblyName] = LoadAssemblyFromResource(assemblyFileName); } diff --git a/AquaMai/BuildInfo.cs b/AquaMai.Common/BuildInfo.cs similarity index 91% rename from AquaMai/BuildInfo.cs rename to AquaMai.Common/BuildInfo.cs index 96d4d10b..011b89b4 100644 --- a/AquaMai/BuildInfo.cs +++ b/AquaMai.Common/BuildInfo.cs @@ -1,4 +1,4 @@ -namespace AquaMai; +namespace AquaMai.Common; public static partial class BuildInfo { diff --git a/AquaMai.BepInEx/BuildInfo.g.cs b/AquaMai.Common/BuildInfo.g.cs similarity index 90% rename from AquaMai.BepInEx/BuildInfo.g.cs rename to AquaMai.Common/BuildInfo.g.cs index bd4adb3b..38b4118f 100644 --- a/AquaMai.BepInEx/BuildInfo.g.cs +++ b/AquaMai.Common/BuildInfo.g.cs @@ -1,5 +1,5 @@ // Auto-generated file. Do not modify manually. -namespace AquaMai; +namespace AquaMai.Common; public static partial class BuildInfo { diff --git a/AquaMai.BepInEx/configSort.yaml b/AquaMai.Common/configSort.yaml similarity index 100% rename from AquaMai.BepInEx/configSort.yaml rename to AquaMai.Common/configSort.yaml diff --git a/AquaMai.Config/AquaMai.Config.csproj b/AquaMai.Config/AquaMai.Config.csproj index a7004860..ca65944b 100644 --- a/AquaMai.Config/AquaMai.Config.csproj +++ b/AquaMai.Config/AquaMai.Config.csproj @@ -50,9 +50,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - - all - + diff --git a/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj b/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj index de286974..51c489ac 100644 --- a/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj +++ b/AquaMai.ErrorReport/AquaMai.ErrorReport.csproj @@ -24,7 +24,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + @@ -33,7 +33,4 @@ - - - diff --git a/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj new file mode 100644 index 00000000..6774e72e --- /dev/null +++ b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj @@ -0,0 +1,57 @@ + + + + Release + AnyCPU + Library + AquaMai.MelonLoader + AquaMai.MelonLoader + net48 + 512 + true + 12 + 414 + $(ProjectDir)../Libs/;$(AssemblySearchPaths) + $(ProjectDir)../Output/ + false + false + false + + + + false + None + true + prompt + 4 + true + false + + + + DEBUG + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + diff --git a/AquaMai.MelonLoader/AquaMai.cs b/AquaMai.MelonLoader/AquaMai.cs new file mode 100644 index 00000000..c98623d0 --- /dev/null +++ b/AquaMai.MelonLoader/AquaMai.cs @@ -0,0 +1,27 @@ +using System.Reflection; +using MelonLoader; + +namespace AquaMai.MelonLoader; + +public class AquaMai : MelonMod +{ + public override void OnInitializeMelon() + { + Common.AquaMai.Bootstrap(new Common.BootstrapOptions + { + CurrentAssembly = Assembly.GetExecutingAssembly(), + Harmony = HarmonyInstance, + MsgStringAction = MelonLogger.Msg, + MsgObjectAction = MelonLogger.Msg, + ErrorStringAction = MelonLogger.Error, + ErrorObjectAction = MelonLogger.Error, + WarningStringAction = MelonLogger.Warning, + WarningObjectAction = MelonLogger.Warning, + }); + } + + public override void OnGUI() + { + Common.AquaMai.OnGUI(); + } +} diff --git a/AquaMai.MelonLoader/FodyWeavers.xml b/AquaMai.MelonLoader/FodyWeavers.xml new file mode 100644 index 00000000..f254ee21 --- /dev/null +++ b/AquaMai.MelonLoader/FodyWeavers.xml @@ -0,0 +1,6 @@ + + + + AquaMai.Common + + diff --git a/AquaMai.MelonLoader/FodyWeavers.xsd b/AquaMai.MelonLoader/FodyWeavers.xsd new file mode 100644 index 00000000..968f9b5e --- /dev/null +++ b/AquaMai.MelonLoader/FodyWeavers.xsd @@ -0,0 +1,111 @@ + + + + + + + + + + + + A regular expression matching the assembly names to include in merging. + + + + + A regular expression matching the assembly names to exclude from merging. + + + + + A regular expression matching the resource names to include in merging. + + + + + A regular expression matching the resource names to exclude from merging. + + + + + A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true' + + + + + A string that is used as prefix for the namespace of the imported types. + + + + + A switch to control whether to import the full assemblies or only the referenced types. Default is 'false' + + + + + A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false' + + + + + + A regular expression matching the assembly names to include in merging. + + + + + A regular expression matching the assembly names to exclude from merging. + + + + + A regular expression matching the resource names to include in merging. + + + + + A regular expression matching the resource names to exclude from merging. + + + + + A switch to control whether the imported types are hidden (made private) or keep their visibility unchanged. Default is 'true' + + + + + A string that is used as prefix for the namespace of the imported types. + + + + + A switch to control whether to import the full assemblies or only the referenced types. Default is 'false' + + + + + A switch to enable compacting of the target assembly by skipping properties, events and unused methods. Default is 'false' + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/AquaMai.MelonLoader/Properties/AssemblyInfo.cs b/AquaMai.MelonLoader/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..95e31fd9 --- /dev/null +++ b/AquaMai.MelonLoader/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using AquaMai.Common; + +[assembly: AssemblyTitle(BuildInfo.Description)] +[assembly: AssemblyDescription(BuildInfo.Description)] +[assembly: AssemblyCompany(BuildInfo.Company)] +[assembly: AssemblyProduct(BuildInfo.Name)] +[assembly: AssemblyCopyright("Created by " + BuildInfo.Author)] +[assembly: AssemblyTrademark(BuildInfo.Company)] +[assembly: AssemblyVersion(BuildInfo.Version)] +[assembly: AssemblyFileVersion(BuildInfo.GitVersion)] +[assembly: MelonLoader.MelonInfo(typeof(AquaMai.MelonLoader.AquaMai), BuildInfo.Name, BuildInfo.GitVersion, BuildInfo.Author, BuildInfo.DownloadLink)] +[assembly: MelonLoader.MelonColor()] +[assembly: MelonLoader.HarmonyDontPatchAll] + +// Create and Setup a MelonGame Attribute to mark a Melon as Universal or Compatible with specific Games. +// If no MelonGame Attribute is found or any of the Values for any MelonGame Attribute on the Melon is null or empty it will be assumed the Melon is Universal. +// Values for MelonGame Attribute can be found in the Game's app.info file or printed at the top of every log directly beneath the Unity version. +[assembly: MelonLoader.MelonGame(null, null)] diff --git a/AquaMai.Mods/AquaMai.Mods.csproj b/AquaMai.Mods/AquaMai.Mods.csproj index d48a2ee9..9405b427 100644 --- a/AquaMai.Mods/AquaMai.Mods.csproj +++ b/AquaMai.Mods/AquaMai.Mods.csproj @@ -130,11 +130,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - + diff --git a/AquaMai.slnx b/AquaMai.slnx index 9fa68ad6..a652793e 100644 --- a/AquaMai.slnx +++ b/AquaMai.slnx @@ -1,12 +1,18 @@ - + + - - + + + + + + + diff --git a/AquaMai/AssemblyLoader.cs b/AquaMai/AssemblyLoader.cs deleted file mode 100644 index 967b0b92..00000000 --- a/AquaMai/AssemblyLoader.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.IO.Compression; -using System.Reflection; - -namespace AquaMai; - -public static class AssemblyLoader -{ - public enum AssemblyName - { - TinyJSON, - ConfigInterfaces, - Config, - Core, - Mods, - } - - private static readonly Dictionary Assemblies = new() - { - [AssemblyName.TinyJSON] = "MelonLoader.TinyJSON.dll", - [AssemblyName.ConfigInterfaces] = "AquaMai.Config.Interfaces.dll", - [AssemblyName.Config] = "AquaMai.Config.dll", - [AssemblyName.Core] = "AquaMai.Core.dll", - [AssemblyName.Mods] = "AquaMai.Mods.dll", - }; - - private static readonly Dictionary LoadedAssemblies = []; - - public static Assembly GetAssembly(AssemblyName assemblyName) => LoadedAssemblies[assemblyName]; - - public static void LoadAssemblies() - { - foreach (var (assemblyName, assemblyFileName) in Assemblies) - { -# if DEBUG - MelonLoader.MelonLogger.Msg($"Loading assembly \"{assemblyFileName}\"..."); -# endif - LoadedAssemblies[assemblyName] = LoadAssemblyFromResource(assemblyFileName); - } - } - - public static Assembly LoadAssemblyFromResource(string assemblyName) - { - var executingAssembly = Assembly.GetExecutingAssembly(); - using var decompressedStream = executingAssembly.GetManifestResourceStream(assemblyName); - if (decompressedStream != null) - { - return AppDomain.CurrentDomain.Load(StreamToBytes(decompressedStream)); - } - using var compressedStream = executingAssembly.GetManifestResourceStream($"{assemblyName}.compressed"); - if (compressedStream != null) - { - return AppDomain.CurrentDomain.Load(DecompressToBytes(compressedStream)); - } - throw new Exception($"Embedded assembly \"{assemblyName}\" not found."); - } - - private static byte[] StreamToBytes(Stream stream) - { - if (stream == null) - { - return []; - } - using var memoryStream = new MemoryStream(); - stream.CopyTo(memoryStream); - return memoryStream.ToArray(); - } - - private static byte[] DecompressToBytes(Stream stream) => StreamToBytes(new DeflateStream(stream, CompressionMode.Decompress)); -} diff --git a/AquaMai/Main.cs b/AquaMai/Main.cs deleted file mode 100644 index 70ce3748..00000000 --- a/AquaMai/Main.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.InteropServices; -using MelonLoader; - -namespace AquaMai; - -public class AquaMai : MelonMod -{ - public const string AQUAMAI_SAY = """ - 如果你在 dnSpy / ILSpy 里看到了这行字,请从 resources 中解包 DLLs。 - If you see this line in dnSpy / ILSpy, please unpack the DLLs from resources. - """; - - [DllImport("kernel32.dll", SetLastError = true)] - private static extern bool SetConsoleOutputCP(uint wCodePageID); - - private void SetCoreBuildInfo(Assembly coreAssembly) - { - var coreBuildInfo = coreAssembly.GetType("AquaMai.Core.BuildInfo"); - var buildInfo = typeof(BuildInfo); - foreach (var field in buildInfo.GetFields()) - { - coreBuildInfo.GetField(field.Name)?.SetValue(null, field.GetValue(null)); - } - coreBuildInfo.GetField("ModAssembly")?.SetValue(null, MelonAssembly.Assembly); - } - - private void SetCoreLogger(Assembly coreAssembly) - { - var coreLogger = coreAssembly.GetType("AquaMai.Core.Environment.MelonLogger"); - coreLogger.GetField("MsgStringAction").SetValue(null, (Action)MelonLogger.Msg); - coreLogger.GetField("MsgObjectAction").SetValue(null, (Action)MelonLogger.Msg); - coreLogger.GetField("ErrorStringAction").SetValue(null, (Action)MelonLogger.Error); - coreLogger.GetField("ErrorObjectAction").SetValue(null, (Action)MelonLogger.Error); - coreLogger.GetField("WarningStringAction").SetValue(null, (Action)MelonLogger.Warning); - coreLogger.GetField("WarningObjectAction").SetValue(null, (Action)MelonLogger.Warning); - } - - private static MethodInfo onGUIMethod; - - public override void OnInitializeMelon() - { - // Prevent Chinese characters from being garbled - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) SetConsoleOutputCP(65001); - - AssemblyLoader.LoadAssemblies(); - - var modsAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Mods); - var coreAssembly = AssemblyLoader.GetAssembly(AssemblyLoader.AssemblyName.Core); - SetCoreBuildInfo(coreAssembly); - SetCoreLogger(coreAssembly); - coreAssembly.GetType("AquaMai.Core.Startup") - .GetMethod("Initialize", BindingFlags.Public | BindingFlags.Static) - .Invoke(null, [modsAssembly, HarmonyInstance]); - onGUIMethod = coreAssembly.GetType("AquaMai.Core.Startup") - .GetMethod("OnGUI", BindingFlags.Public | BindingFlags.Static); - } - - public override void OnGUI() - { - base.OnGUI(); - onGUIMethod?.Invoke(null, []); - } -} diff --git a/AquaMai/Properties/AssemblyInfo.cs b/AquaMai/Properties/AssemblyInfo.cs deleted file mode 100644 index 08009822..00000000 --- a/AquaMai/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Reflection; -using MelonLoader; - -[assembly: AssemblyTitle(AquaMai.BuildInfo.Description)] -[assembly: AssemblyDescription(AquaMai.BuildInfo.Description)] -[assembly: AssemblyCompany(AquaMai.BuildInfo.Company)] -[assembly: AssemblyProduct(AquaMai.BuildInfo.Name)] -[assembly: AssemblyCopyright("Created by " + AquaMai.BuildInfo.Author)] -[assembly: AssemblyTrademark(AquaMai.BuildInfo.Company)] -[assembly: AssemblyVersion(AquaMai.BuildInfo.Version)] -[assembly: AssemblyFileVersion(AquaMai.BuildInfo.GitVersion)] -[assembly: MelonInfo(typeof(AquaMai.AquaMai), AquaMai.BuildInfo.Name, AquaMai.BuildInfo.GitVersion, AquaMai.BuildInfo.Author, AquaMai.BuildInfo.DownloadLink)] -[assembly: MelonColor()] -[assembly: HarmonyDontPatchAll] - -// Create and Setup a MelonGame Attribute to mark a Melon as Universal or Compatible with specific Games. -// If no MelonGame Attribute is found or any of the Values for any MelonGame Attribute on the Melon is null or empty it will be assumed the Melon is Universal. -// Values for MelonGame Attribute can be found in the Game's app.info file or printed at the top of every log directly beneath the Unity version. -[assembly: MelonGame(null, null)] diff --git a/AquaMai/configSort.yaml b/AquaMai/configSort.yaml deleted file mode 100644 index 92ebafa8..00000000 --- a/AquaMai/configSort.yaml +++ /dev/null @@ -1,96 +0,0 @@ -常用: - - General - - GameSystem.SinglePlayer - - GameSystem.DisableTimeout - - UX.ImmediateSave - - GameSystem.QuickRetry - - UX.OneKeyEntryEnd - - UX.OneKeyRetrySkip - - GameSystem.TouchToButtonInput - - GameSystem.TestProof - - GameSettings.CreditConfig - - Fancy.GamePlay.ExtendNotesPool - -直读: - - GameSystem.Assets.LoadAssetBundleWithoutManifest - - GameSystem.Assets.LoadLocalImages - - GameSystem.Assets.MovieLoader - -全解和跳过: - - GameSystem.Unlock - - Tweaks.TimeSaving.SkipStartupWarning - - Tweaks.TimeSaving.EntryToMusicSelection - - Tweaks.TimeSaving.ExitToSave - - Tweaks.TimeSaving.SkipStartupDelays - - Tweaks.TimeSaving.SkipEventInfo - - Tweaks.TimeSaving.SkipTrackStart - - Tweaks.TimeSaving.SkipGoodbyeScreen - - Tweaks.TimeSaving.IWontTapOrSlideVigorously - - UX.QuickEndPlay - -美化: - - GameSystem.Assets.Fonts - - Fancy.CustomLogo - - Fancy.CustomPlaceName - - Fancy.CustomVersionString - - Fancy.CustomCreditsString - - Fancy.RandomBgm - - Fancy.CustomSkins - - Fancy.CustomButton - - Fancy.DemoMaster - - Fancy.GamePlay.AlignCircleSlideJudgeDisplay - - Fancy.GamePlay.SlideArrowAnimation - - Fancy.GamePlay.SlideFadeInTweak - - Fancy.GamePlay.SlideLayerReverse - -实用工具: - - UX.HideSelfMadeCharts - - UX.JudgeAccuracyInfo - - UX.PracticeMode - - UX.SelectionDetail - - UX.DisableLightOutGame - - Fancy.GamePlay.HideHanabi - - Fancy.GamePlay.JudgeDisplay4B - - Fancy.Triggers - -键位和灵敏度: - - GameSystem.HidInput - - GameSystem.AdxHidInput - - GameSystem.KeyMap - - GameSettings.TouchSensitivity - -调试: - - GameSystem.Window - - Utils.AntiLag - - Utils.DisplayTouchInGame - - GameSettings.JudgeAdjust - - Tweaks.IgnoreAimeServerError - - Utils.ShowNetErrorDetail - - Tweaks.LockFrameRate - - Tweaks.ResetTouch - - Tweaks.SkipUserVersionCheck - - Utils.DisplayFrameRate - - Utils.LogUserId - - Utils.LogNetworkRequests - - Utils.ShowErrorLog - - UX.NoAmDaemonAlert - -高级设置: - - Fancy.HideMask - - GameSettings.ForceAsServer - - GameSystem.RemoveEncryption - - GameSystem.Sound - - GameSystem.TouchPanelBaudRate - - GameSystem.TouchPanelBaudRate - - GameSystem.CustomCameraId - - GameSystem.OptionLoadFix - - UX.ServerAnnouncement - -过新过热: - - Fancy.CustomTrackStartDiff - - Fancy.GamePlay.BreakSlideJudgeBlink - - Fancy.GamePlay.CustomNoteTypes - - Fancy.GamePlay.DisableTrackStartTabs - - Fancy.GamePlay.FanJudgeFlip - - Fancy.GamePlay.RealisticRandomJudge - - Fancy.GamePlay.TrackStartProcessTweak diff --git a/build.cake b/build.cake index 6cc2df79..5c549bae 100644 --- a/build.cake +++ b/build.cake @@ -30,7 +30,7 @@ Task("PreBuild") var versionContent = $@" // Auto-generated file. Do not modify manually. - namespace AquaMai; + namespace AquaMai.Common; public static partial class BuildInfo {{ From 769a2ca35c1006edd040d288aa8c56088107ca86 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 13:10:33 +0800 Subject: [PATCH 05/15] Move --- AquaMai.BepInEx/{Main.cs => Plugin.cs} | 19 ------------------- 1 file changed, 19 deletions(-) rename AquaMai.BepInEx/{Main.cs => Plugin.cs} (66%) diff --git a/AquaMai.BepInEx/Main.cs b/AquaMai.BepInEx/Plugin.cs similarity index 66% rename from AquaMai.BepInEx/Main.cs rename to AquaMai.BepInEx/Plugin.cs index 1d08d780..a419f86a 100644 --- a/AquaMai.BepInEx/Main.cs +++ b/AquaMai.BepInEx/Plugin.cs @@ -18,18 +18,6 @@ public void Awake() { var harmony = new HarmonyLib.Harmony(PluginName); - // Early initialization of AMDaemon.NET - try - { - AmManager.Instance.Initialize(); - harmony.PatchAll(typeof(Plugin)); - } - catch (Exception ex) - { - LogSource.LogError($"AMDaemon.NET early initialization failed: {ex.Message}"); - return; - } - Common.AquaMai.Bootstrap(new BootstrapOptions { CurrentAssembly = Assembly.GetExecutingAssembly(), @@ -47,11 +35,4 @@ public void OnGUI() { Common.AquaMai.OnGUI(); } - - [HarmonyLib.HarmonyPatch(typeof(AmManager), "Initialize")] - [HarmonyLib.HarmonyPrefix] - public static bool PreAmManagerInitialize() - { - return false; // Prevent AMDaemon.NET from initializing again - } } From 37ec129d93d0c9d4e3417b0e1eeb30e2477d40eb Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Jun 2025 14:39:32 +0800 Subject: [PATCH 06/15] try fix pr ci --- .github/workflows/aquamai.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/aquamai.yaml b/.github/workflows/aquamai.yaml index 502572e4..e50816b4 100644 --- a/.github/workflows/aquamai.yaml +++ b/.github/workflows/aquamai.yaml @@ -17,6 +17,7 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 + ref: ${{ github.head_ref }} - name: Get Git Describe run: echo "GIT_DESCRIBE=$(git describe --tags --always)" >> $env:GITHUB_ENV From 75ad59ba179d0af6106fd3cc85e4f0fbfb2421cc Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Jun 2025 14:46:17 +0800 Subject: [PATCH 07/15] try fix pr ci --- .github/workflows/aquamai.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/aquamai.yaml b/.github/workflows/aquamai.yaml index e50816b4..7bfa9687 100644 --- a/.github/workflows/aquamai.yaml +++ b/.github/workflows/aquamai.yaml @@ -14,10 +14,9 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: fetch-depth: 0 - ref: ${{ github.head_ref }} - name: Get Git Describe run: echo "GIT_DESCRIBE=$(git describe --tags --always)" >> $env:GITHUB_ENV From 1a62a0fa93933f76538f5569fccc2334fff2c2c5 Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Jun 2025 14:50:06 +0800 Subject: [PATCH 08/15] fix build --- .github/workflows/aquamai.yaml | 2 +- build.cake | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/aquamai.yaml b/.github/workflows/aquamai.yaml index 7bfa9687..502572e4 100644 --- a/.github/workflows/aquamai.yaml +++ b/.github/workflows/aquamai.yaml @@ -14,7 +14,7 @@ jobs: git config --global core.autocrlf false git config --global core.eol lf - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 diff --git a/build.cake b/build.cake index 5c549bae..26b3a549 100644 --- a/build.cake +++ b/build.cake @@ -48,7 +48,7 @@ Task("Build") .Does(() => { // 使用 dotnet build 进行构建 - DotNetBuild("./AquaMai.sln", new DotNetBuildSettings + DotNetBuild("./AquaMai.slnx", new DotNetBuildSettings { Configuration = configuration }); From c540d43fc50c6da6eae6772700d6851bfc9dad0e Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Jun 2025 14:57:32 +0800 Subject: [PATCH 09/15] fix assembly name, AquaMai.MelonLoader.dll -> AquaMai.dll --- AquaMai.MelonLoader/AquaMai.MelonLoader.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj index 6774e72e..c6afc845 100644 --- a/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj +++ b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj @@ -5,7 +5,7 @@ AnyCPU Library AquaMai.MelonLoader - AquaMai.MelonLoader + AquaMai net48 512 true From 3de08cb056b5c305967e11bfd0eea833daad0d97 Mon Sep 17 00:00:00 2001 From: Clansty Date: Sun, 29 Jun 2025 15:01:11 +0800 Subject: [PATCH 10/15] fix: buildinfo --- .gitignore | 2 +- AquaMai.Common/BuildInfo.g.cs | 9 --------- build.cake | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 AquaMai.Common/BuildInfo.g.cs diff --git a/.gitignore b/.gitignore index 86c03662..3935e1ee 100644 --- a/.gitignore +++ b/.gitignore @@ -372,5 +372,5 @@ MigrationBackup/ Output tools -AquaMai/BuildInfo.g.cs +AquaMai.Common/BuildInfo.g.cs .idea \ No newline at end of file diff --git a/AquaMai.Common/BuildInfo.g.cs b/AquaMai.Common/BuildInfo.g.cs deleted file mode 100644 index 38b4118f..00000000 --- a/AquaMai.Common/BuildInfo.g.cs +++ /dev/null @@ -1,9 +0,0 @@ -// Auto-generated file. Do not modify manually. -namespace AquaMai.Common; - -public static partial class BuildInfo -{ - public const string Version = "0.0.0"; - public const string GitVersion = "0.0.0"; - public const string BuildDate = "1970-01-01T00:00:00Z"; -} diff --git a/build.cake b/build.cake index 26b3a549..bad29589 100644 --- a/build.cake +++ b/build.cake @@ -39,7 +39,7 @@ Task("PreBuild") public const string BuildDate = ""{buildDate}""; }} "; - FileWriteText("./AquaMai/BuildInfo.g.cs", versionContent); + FileWriteText("./AquaMai.Common/BuildInfo.g.cs", versionContent); }); Task("Build") From 1316ae873cda720cdcd65e4f20f5c12ec84134a5 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 15:03:20 +0800 Subject: [PATCH 11/15] Update comment --- .github/workflows/aquamai.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/aquamai.yaml b/.github/workflows/aquamai.yaml index 502572e4..e63a5800 100644 --- a/.github/workflows/aquamai.yaml +++ b/.github/workflows/aquamai.yaml @@ -54,7 +54,7 @@ jobs: - name: Upload CI release if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/main' shell: cmd - # TODO: Add AquaMai.BepInEx.dll + # For MaiChartManager, upload MelonLoader version only. run: build-assets\Releaser\AquaMaiReleaser.exe "Output\Upload\AquaMai.dll" "${{ env.GIT_DESCRIBE }}" - name: Send to Telegram From 01f07bad1e1b763499bbc0e60384bbee32f11ffd Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 15:04:48 +0800 Subject: [PATCH 12/15] UseTargetName --- AquaMai.MelonLoader/AquaMai.MelonLoader.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj index c6afc845..2717711b 100644 --- a/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj +++ b/AquaMai.MelonLoader/AquaMai.MelonLoader.csproj @@ -5,7 +5,8 @@ AnyCPU Library AquaMai.MelonLoader - AquaMai + AquaMai.MelonLoader + AquaMai net48 512 true From 48b01db6a3d404d816328001cfad22f353aede44 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 18:09:07 +0800 Subject: [PATCH 13/15] Fix version --- AquaMai.BepInEx/Plugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AquaMai.BepInEx/Plugin.cs b/AquaMai.BepInEx/Plugin.cs index a419f86a..2e7172f5 100644 --- a/AquaMai.BepInEx/Plugin.cs +++ b/AquaMai.BepInEx/Plugin.cs @@ -7,7 +7,7 @@ namespace AquaMai.BepInEx; -[BepInPlugin(PluginName, BuildInfo.Name, BuildInfo.GitVersion)] +[BepInPlugin(PluginName, BuildInfo.Name, BuildInfo.Version)] public class Plugin : BaseUnityPlugin { public const string PluginName = "net.aquadx.aquamai"; From 123db0bbd1eee4de09e96b5b9050295da24a0e1e Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 18:09:58 +0800 Subject: [PATCH 14/15] Remove extra --- AquaMai.BepInEx/Plugin.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/AquaMai.BepInEx/Plugin.cs b/AquaMai.BepInEx/Plugin.cs index 2e7172f5..2b01d36b 100644 --- a/AquaMai.BepInEx/Plugin.cs +++ b/AquaMai.BepInEx/Plugin.cs @@ -1,9 +1,7 @@ -using System; -using System.Reflection; +using System.Reflection; using AquaMai.Common; using BepInEx; using BepInEx.Logging; -using Manager; namespace AquaMai.BepInEx; From 16af6da51ef072e812cffeeaa3cb490b3a0fb4a8 Mon Sep 17 00:00:00 2001 From: Menci Date: Sun, 29 Jun 2025 18:33:38 +0800 Subject: [PATCH 15/15] _isInitialized --- AquaMai.BepInEx/Plugin.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AquaMai.BepInEx/Plugin.cs b/AquaMai.BepInEx/Plugin.cs index 2b01d36b..e9afbd2c 100644 --- a/AquaMai.BepInEx/Plugin.cs +++ b/AquaMai.BepInEx/Plugin.cs @@ -12,8 +12,13 @@ public class Plugin : BaseUnityPlugin public readonly static ManualLogSource LogSource = global::BepInEx.Logging.Logger.CreateLogSource(BuildInfo.Name); + private static bool _isInitialized = false; + public void Awake() { + if (_isInitialized) return; + _isInitialized = true; + var harmony = new HarmonyLib.Harmony(PluginName); Common.AquaMai.Bootstrap(new BootstrapOptions