[+] PractiseMode Debugging
Build AquaMai / build (SDEZ) (push) Has been cancelled Details
Build AquaMai / build (SDGA145) (push) Has been cancelled Details

pull/55/head
Clansty 2024-09-28 16:30:19 +08:00
parent 24ecaab570
commit 27b8e6bd21
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
6 changed files with 161 additions and 11 deletions

View File

@ -37,6 +37,11 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>SDGA145
DEBUG</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Reference Include="0Harmony">
<HintPath>Libs\0Harmony.dll</HintPath>
@ -314,6 +319,7 @@
<Compile Include="TouchSensitivity\Enable.cs" />
<Compile Include="Utils\JudgeAdjust.cs" />
<Compile Include="Utils\LogUserId.cs" />
<Compile Include="Utils\PractiseMode.cs" />
<Compile Include="Utils\WindowState.cs" />
<Compile Include="UX\CustomPlaceName.cs" />
<Compile Include="UX\CustomVersionString.cs" />

View File

@ -9,12 +9,15 @@ Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Any CPU = Release|Any CPU
SDGA145|Any CPU = SDGA145|Any CPU
Debug|Any CPU = Debug|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{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}.SDGA145|Any CPU.ActiveCfg = SDGA145|Any CPU
{788BC472-59F7-46F6-B760-65C18BA74389}.SDGA145|Any CPU.Build.0 = SDGA145|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
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -60,6 +60,7 @@ namespace AquaMai
public bool Windowed { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public bool PractiseMode { get; set; }
}
public class TimeSavingConfig

View File

@ -17,6 +17,7 @@ public class DebugFeature
private static MovieController _gameMovie;
private static GameMonitor[] _monitors;
private static object _debugFeatureOriginal;
private static System.Type _debugFeatureType;
[HarmonyPatch(typeof(GameProcess), "OnStart")]
[HarmonyPostfix]
@ -39,28 +40,79 @@ public class DebugFeature
else
{
MelonLogger.Msg(" > [DebugFeature] Already included");
_debugFeatureType = typeof(GameProcess).GetNestedType("DebugFeature", BindingFlags.Instance | BindingFlags.NonPublic);
h.PatchAll(typeof(GetOriginal));
}
}
public static void SetPause(bool pause)
public static bool Pause
{
get
{
if (IsPolyfill)
{
return PolyFill.isPause;
}
return (bool)_debugFeatureType.GetField("_debugPause", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(_debugFeatureOriginal);
}
set
{
if (IsPolyfill)
{
PolyFill.isPause = value;
}
else
{
_debugFeatureType.GetField("_debugPause", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(_debugFeatureOriginal, value);
}
SoundManager.PauseMusic(value);
_gameMovie.Pause(value);
NotesManager.Pause(value);
}
}
public static void Seek(int msec)
{
Singleton<GamePlayManager>.Instance.Initialize();
if (IsPolyfill)
{
PolyFill.isPause = pause;
PolyFill.DebugTimeSkip(msec);
}
else
{
var debugFeatureClass = typeof(GameProcess).GetNestedType("DebugFeature", BindingFlags.Instance | BindingFlags.NonPublic);
debugFeatureClass?.GetField("_debugPause", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(_debugFeatureOriginal, pause);
_debugFeatureType.GetMethod("DebugTimeSkip", BindingFlags.Instance | BindingFlags.NonPublic)?.Invoke(_debugFeatureOriginal, new object[] { msec });
}
}
public static double CurrentPlayMsec
{
get
{
if (IsPolyfill)
{
return PolyFill.timer;
}
return (double)_debugFeatureType.GetField("_debugTimer", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(_debugFeatureOriginal);
}
set
{
if (IsPolyfill)
{
PolyFill.timer = value;
}
else
{
_debugFeatureType.GetField("_debugTimer", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(_debugFeatureOriginal, value);
}
Seek(0);
}
SoundManager.PauseMusic(pause);
_gameMovie.Pause(pause);
NotesManager.Pause(pause);
}
[HarmonyPatch]
private static class GetOriginal
{
[HarmonyPatch(typeof(GameProcess), "OnStart")]
@ -71,7 +123,6 @@ public class DebugFeature
}
}
[HarmonyPatch]
private static class PolyFill
{
public static bool isPause;

View File

@ -31,7 +31,7 @@ public class MessageHelper
replaceText = true,
text = message,
changeSize = true,
sizeID = size
sizeID = size,
});
}
}

View File

@ -0,0 +1,89 @@
using AquaMai.Fix;
using AquaMai.Helpers;
using HarmonyLib;
using MelonLoader;
using Monitor;
using Process;
using UnityEngine;
using UrGUI.GUIWindow;
namespace AquaMai.Utils;
public class PractiseMode
{
private static double repeatStart = -1;
private static double repeatEnd = -1;
private static void SetRepeatEnd(double time)
{
if (repeatStart == -1)
{
MessageHelper.ShowMessage("Please set repeat start time first");
return;
}
if (time < repeatStart)
{
MessageHelper.ShowMessage("Repeat end time cannot be less than repeat start time");
return;
}
repeatEnd = time;
}
private static void ClearRepeat()
{
repeatStart = -1;
repeatEnd = -1;
}
private class DebugWindow : MonoBehaviour
{
private GUIWindow window;
public void Start()
{
window = GUIWindow.Begin("练习模式 测试");
window.Button("暂停", () => DebugFeature.Pause = !DebugFeature.Pause);
window.SameLine();
window.Button("向前", () => DebugFeature.Seek(-1000));
window.Button("向后", () => DebugFeature.Seek(1000));
window.SameLine(1, 1, 1);
window.Button("循环开始", () => repeatStart = DebugFeature.CurrentPlayMsec);
window.Button("循环结束", () => SetRepeatEnd(DebugFeature.CurrentPlayMsec));
window.Button("循环解除", ClearRepeat);
}
private void OnGUI()
{
window?.Draw();
}
}
private static DebugWindow debugWin;
[HarmonyPatch(typeof(GameProcess), "OnUpdate")]
[HarmonyPostfix]
public static void GameProcessPostUpdate(GameProcess __instance, GameMonitor[] ____monitors)
{
if (Input.GetKeyDown(KeyCode.F12))
{
if (debugWin is null)
{
debugWin = ____monitors[0].gameObject.AddComponent<DebugWindow>();
}
else
{
MelonLogger.Msg("[PractiseMode] 调试窗口作用中");
}
}
if (repeatStart >= 0 && repeatEnd >= 0)
{
if (DebugFeature.CurrentPlayMsec >= repeatEnd)
{
DebugFeature.CurrentPlayMsec = repeatStart;
}
}
}
}