Files
Sinmai-Assist/Cheat/UnlockUtage.cs
2025-10-13 18:18:32 +08:00

83 lines
2.9 KiB
C#

using System.Collections.Generic;
using System.Reflection;
using HarmonyLib;
using MAI2System;
using Manager;
using Manager.MaiStudio;
using MelonLoader;
using SinmaiAssist.Utils;
namespace SinmaiAssist.Cheat;
public class UnlockUtage
{
private static List<int> _needDoublePlayerMusicIdList = [];
private static ForceUtageModeType _forceUtageMode = ForceUtageModeType.Normal;
private static Dictionary<ForceUtageModeType, string> _utagePathMap = new()
{
{ ForceUtageModeType.Normal, "" },
{ ForceUtageModeType.Force1P, "_L.ma2" },
{ ForceUtageModeType.Force2P, "_R.ma2" }
};
private enum ForceUtageModeType
{
Normal,
Force1P,
Force2P
}
[HarmonyPrefix]
[HarmonyPatch(typeof(GameManager), "CanUnlockUtageTotalJudgement")]
public static bool ForceUnlockUtage(out ConstParameter.ResultOfUnlockUtageJudgement result1P, out ConstParameter.ResultOfUnlockUtageJudgement result2P)
{
result1P = ConstParameter.ResultOfUnlockUtageJudgement.Unlocked;
result2P = ConstParameter.ResultOfUnlockUtageJudgement.Unlocked;
return false;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameScoreList), "InitalizeUtage")]
public static void InitalizeUtage(GameScoreList __instance, int monitorIndex)
{
if (_needDoublePlayerMusicIdList.Contains(__instance.SessionInfo.musicId))
{
if (_forceUtageMode == 0)
{
if (monitorIndex == 0) __instance.SessionInfo.dPScoreFilePathAdd = "_L.ma2";
if (monitorIndex == 1) __instance.SessionInfo.dPScoreFilePathAdd = "_R.ma2";
}
else
{
__instance.SessionInfo.dPScoreFilePathAdd = _utagePathMap[_forceUtageMode];
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(MusicData), "Init")]
public static void ForceSetUtagePlayStyle(MusicData __instance)
{
if(!SinmaiAssist.MainConfig.Cheat.UnlockUtage.UnlockDoublePlayerMusic) return;
if (__instance.utagePlayStyle == UtagePlayStyle.DoublePlayerScore)
{
PropertyInfo utagePlayStyleProperty = typeof(MusicData).GetProperty("utagePlayStyle", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
utagePlayStyleProperty.SetValue(__instance, UtagePlayStyle.SinglePlayerScore);
_needDoublePlayerMusicIdList.Add(__instance.GetID());
#if Debug
MelonLogger.Msg($"DoublePlayerScoreLoadEvent: {__instance.GetID()}");
#endif
}
}
public static void SwitchUtageMode()
{
int current = (int)_forceUtageMode;
int next = (current + 1) % 3;
_forceUtageMode = (ForceUtageModeType)next;
GameMessageManager.SendMessage(0, $"Force Utage Mode: \n{_forceUtageMode.ToString()}");
GameMessageManager.SendMessage(1, $"Force Utage Mode: \n{_forceUtageMode.ToString()}");
}
}