2024-02-07 18:16:07 +08:00
using System ;
2024-09-17 03:24:35 +08:00
using System.IO ;
2024-09-17 02:58:37 +08:00
using System.Runtime.InteropServices ;
2024-02-07 18:16:07 +08:00
using AquaMai.Fix ;
2024-09-05 02:31:07 +08:00
using AquaMai.Helpers ;
2024-09-17 04:13:51 +08:00
using AquaMai.Utils ;
2024-04-08 14:59:54 +08:00
using AquaMai.UX ;
2024-02-07 15:38:36 +08:00
using MelonLoader ;
2024-02-07 17:06:58 +08:00
using Tomlet ;
2024-02-07 13:45:47 +08:00
namespace AquaMai
{
public static class BuildInfo
{
public const string Name = "AquaMai" ;
public const string Description = "Mod for Sinmai" ;
public const string Author = "Aza" ;
public const string Company = null ;
2024-09-17 11:21:11 +08:00
public const string Version = "1.1.0" ;
2024-02-07 13:45:47 +08:00
public const string DownloadLink = null ;
}
public class AquaMai : MelonMod
{
2024-02-07 15:38:36 +08:00
public static Config AppConfig { get ; private set ; }
2024-09-17 02:58:37 +08:00
private static bool _hasErrors ;
2024-09-02 17:35:31 +08:00
2024-09-11 00:26:45 +08:00
private void Patch ( Type type )
2024-02-07 18:16:07 +08:00
{
MelonLogger . Msg ( $"> Patching {type}" ) ;
2024-09-17 02:48:07 +08:00
try
2024-09-11 00:38:13 +08:00
{
2024-09-17 02:48:07 +08:00
HarmonyInstance . PatchAll ( type ) ;
foreach ( var nested in type . GetNestedTypes ( ) )
{
Patch ( nested ) ;
}
}
catch ( Exception e )
{
MelonLogger . Error ( $"Failed to patch {type}: {e}" ) ;
2024-09-17 02:58:37 +08:00
_hasErrors = true ;
2024-09-11 00:38:13 +08:00
}
2024-02-07 18:16:07 +08:00
}
2024-09-02 17:35:31 +08:00
2024-02-07 18:40:13 +08:00
/ * *
* Apply patches using reflection , based on the settings
* /
2024-09-11 00:26:45 +08:00
private void ApplyPatches ( )
2024-02-07 18:40:13 +08:00
{
// Iterate over all properties of AppConfig
foreach ( var categoryProp in AppConfig . GetType ( ) . GetProperties ( ) )
{
// Get the value of the category property (e.g., UX, Cheat)
var categoryValue = categoryProp . GetValue ( AppConfig ) ;
if ( categoryValue = = null ) continue ;
var categoryType = categoryValue . GetType ( ) ;
// Iterate over properties in the category (e.g., SkipWarningScreen, SinglePlayer)
foreach ( var settingProp in categoryType . GetProperties ( ) )
{
// The property should be a boolean
if ( settingProp . PropertyType ! = typeof ( bool ) ) continue ;
2024-09-02 17:35:31 +08:00
2024-02-07 18:40:13 +08:00
// Check if the boolean value is true
2024-09-05 02:31:07 +08:00
if ( ! ( bool ) settingProp . GetValue ( categoryValue ) ) continue ;
2024-09-02 17:35:31 +08:00
2024-02-07 18:40:13 +08:00
// Get the Type from the config directive name
var directiveType = Type . GetType ( $"AquaMai.{categoryProp.Name}.{settingProp.Name}" ) ;
2024-02-07 18:20:39 +08:00
2024-02-07 18:40:13 +08:00
// If the type is found, call the Patch method
2024-09-11 00:26:45 +08:00
if ( directiveType ! = null )
{
Patch ( directiveType ) ;
}
2024-02-07 18:40:13 +08:00
}
}
}
2024-09-02 17:35:31 +08:00
2024-09-17 02:58:37 +08:00
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool SetConsoleOutputCP ( uint wCodePageID ) ;
2024-09-17 03:24:35 +08:00
private void WriteEmbeddedResourceToFile ( string resource , string file )
{
using var s = MelonAssembly . Assembly . GetManifestResourceStream ( resource ) ;
using var fs = File . Open ( file , FileMode . Create ) ;
s . CopyTo ( fs ) ;
}
2024-09-02 17:35:31 +08:00
public override void OnInitializeMelon ( )
2024-02-07 13:45:47 +08:00
{
2024-09-17 02:58:37 +08:00
// Prevent Chinese characters from being garbled
SetConsoleOutputCP ( 65001 ) ;
2024-02-07 16:53:13 +08:00
MelonLogger . Msg ( "Loading mod settings..." ) ;
2024-02-07 18:16:24 +08:00
2024-02-07 17:06:58 +08:00
// Check if AquaMai.toml exists
2024-09-17 03:24:35 +08:00
if ( ! File . Exists ( "AquaMai.toml" ) )
2024-02-07 17:06:58 +08:00
{
2024-09-17 03:24:35 +08:00
WriteEmbeddedResourceToFile ( "AquaMai.AquaMai.toml" , "AquaMai.example.toml" ) ;
WriteEmbeddedResourceToFile ( "AquaMai.AquaMai.zh.toml" , "AquaMai.example.zh.toml" ) ;
MelonLogger . Error ( "======================================!!!" ) ;
2024-02-07 17:06:58 +08:00
MelonLogger . Error ( "AquaMai.toml not found! Please create it." ) ;
2024-09-17 03:24:35 +08:00
MelonLogger . Error ( "找不到配置文件 AquaMai.toml! 请创建。" ) ;
MelonLogger . Error ( "Example copied to AquaMai.example.toml" ) ;
MelonLogger . Error ( "示例已复制到 AquaMai.example.zh.toml" ) ;
MelonLogger . Error ( "=========================================" ) ;
2024-02-07 17:06:58 +08:00
return ;
}
2024-02-07 18:16:24 +08:00
2024-02-07 17:06:58 +08:00
// Read AquaMai.toml to load settings
2024-09-17 03:24:35 +08:00
AppConfig = TomletMain . To < Config > ( File . ReadAllText ( "AquaMai.toml" ) ) ;
2024-09-02 17:35:31 +08:00
2024-09-06 23:15:53 +08:00
// Migrate old settings
AppConfig . UX . LoadAssetsPng = AppConfig . UX . LoadAssetsPng | | AppConfig . UX . LoadJacketPng ;
AppConfig . UX . LoadJacketPng = false ;
2024-02-07 18:16:07 +08:00
// Fixes that does not have side effects
// These don't need to be configurable
2024-09-05 02:31:07 +08:00
2024-09-27 21:50:27 +08:00
WindowState . Execute ( ) ;
2024-09-05 02:31:07 +08:00
// Helpers
Patch ( typeof ( MessageHelper ) ) ;
Patch ( typeof ( MusicDirHelper ) ) ;
Patch ( typeof ( SharedInstances ) ) ;
// Fixes
2024-02-07 18:16:07 +08:00
Patch ( typeof ( FixCharaCrash ) ) ;
2024-09-05 02:31:07 +08:00
Patch ( typeof ( BasicFix ) ) ;
Patch ( typeof ( DisableReboot ) ) ;
2024-09-12 21:54:37 +08:00
Patch ( typeof ( ExtendNotesPool ) ) ;
2024-09-17 02:48:07 +08:00
Patch ( typeof ( FixCheckAuth ) ) ;
2024-09-27 20:18:53 +08:00
Patch ( typeof ( DebugFeature ) ) ;
2024-09-05 02:31:07 +08:00
// UX
2024-04-08 14:59:54 +08:00
Patch ( typeof ( CustomVersionString ) ) ;
2024-09-02 23:02:47 +08:00
Patch ( typeof ( CustomPlaceName ) ) ;
2024-05-20 22:31:27 +08:00
Patch ( typeof ( RunCommandOnEvents ) ) ;
2024-09-17 04:13:51 +08:00
// Utils
Patch ( typeof ( JudgeAdjust ) ) ;
2024-09-05 02:31:07 +08:00
// Apply patches based on the settings
ApplyPatches ( ) ;
2024-02-07 18:20:39 +08:00
2024-09-17 02:58:37 +08:00
if ( _hasErrors )
{
2024-09-17 03:24:35 +08:00
MelonLogger . Warning ( "========================================================================!!!" ) ;
2024-09-17 02:58:37 +08:00
MelonLogger . Warning ( "加载过程中检测到错误!" ) ;
MelonLogger . Warning ( "- 请检查你是否安装了错误的 AquaMai 版本,比如在 SDGA 上使用了 SDEZ 的版本" ) ;
MelonLogger . Warning ( "- 你是否正在使用魔改的 Assembly-CSharp.dll, 这会导致函数不一致而无法找到需要修改的函数" ) ;
MelonLogger . Warning ( "- 请检查是否有冲突的 Mod, 或者开启了不兼容的选项" ) ;
2024-09-17 03:24:35 +08:00
MelonLogger . Warning ( "===========================================================================" ) ;
2024-09-17 02:58:37 +08:00
MelonLogger . Warning ( "Errors detected while loading!" ) ;
MelonLogger . Warning ( "- Check if you have installed the wrong version of AquaMai, such as using SDEZ version on SDGA" ) ;
MelonLogger . Warning ( "- Are you using a modified Assembly-CSharp.dll, which will cause inconsistent functions and cannot find the functions that need to be modified" ) ;
MelonLogger . Warning ( "- Check for conflicting mods, or enabled incompatible options" ) ;
2024-09-17 03:24:35 +08:00
MelonLogger . Warning ( "===========================================================================" ) ;
2024-09-17 02:58:37 +08:00
}
2024-02-07 16:53:13 +08:00
MelonLogger . Msg ( "Loaded!" ) ;
2024-02-07 13:45:47 +08:00
}
}
2024-02-07 18:16:24 +08:00
}