Decompiled source of Music Fixes v1.0.0

BepInEx/plugins/PataponAudioFixes.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using P1.Sound;
using P1.System.Sound;
using P2.Media.Lrt;
using P2.Sound;
using P2.System.Sound;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("PataponAudioFixes")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("PataponAudioFixes")]
[assembly: AssemblyTitle("PataponAudioFixes")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PataponAudioFix
{
	[BepInPlugin("juras.patapon.audiofix", "Patapon Audio Fix", "1.0.0")]
	public class Plugin : BasePlugin
	{
		internal static ManualLogSource L;

		internal static ConfigEntry<uint> AudioFix_ThemeLoopFix;

		internal static ConfigEntry<uint> AudioFix_HelperMute;

		internal const bool DebugLog = false;

		internal static bool ThemeLoopFixEnabled => AudioFix_ThemeLoopFix.Value != 0;

		internal static bool HelperMuteEnabled => AudioFix_HelperMute.Value != 0;

		internal static void D(string message)
		{
		}

		internal static void DW(string message)
		{
		}

		public override void Load()
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			L = ((BasePlugin)this).Log;
			AudioFix_ThemeLoopFix = ((BasePlugin)this).Config.Bind<uint>("AudioFix", "AudioFix_ThemeLoopFix", 1u, "Set to 1 to enable the rhythm/theme loop playCount fix. Set to 0 to disable it.");
			AudioFix_HelperMute = ((BasePlugin)this).Config.Bind<uint>("AudioFix", "AudioFix_HelperMute", 1u, "Set to 1 to enable helper mute behavior. Set to 0 to disable it.");
			L.LogInfo((object)"Patapon Audio Fix 1.0.0 loaded");
			ManualLogSource l = L;
			bool flag = default(bool);
			BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(23, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("AudioFix_ThemeLoopFix: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(ThemeLoopFixEnabled ? "enabled" : "disabled");
			}
			l.LogInfo(val);
			ManualLogSource l2 = L;
			val = new BepInExInfoLogInterpolatedStringHandler(21, 1, ref flag);
			if (flag)
			{
				((BepInExLogInterpolatedStringHandler)val).AppendLiteral("AudioFix_HelperMute: ");
				((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(HelperMuteEnabled ? "enabled" : "disabled");
			}
			l2.LogInfo(val);
			new Harmony("juras.patapon.audiofix").PatchAll();
		}
	}
	internal sealed class PlayCountFixState
	{
		public bool Applied;

		public uint OriginalPlayCount;

		public uint VirtualPlayCount;
	}
	[HarmonyPatch(typeof(Rhythm), "playRhythm")]
	internal static class P1RhythmPlayCountVirtualWrapFix
	{
		private static void Prefix(Rhythm __instance, PlayRequest rhythmPlayRequest, out PlayCountFixState __state)
		{
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Invalid comparison between Unknown and I4
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Invalid comparison between Unknown and I4
			__state = new PlayCountFixState();
			if (!Plugin.ThemeLoopFixEnabled)
			{
				return;
			}
			try
			{
				if (__instance != null && rhythmPlayRequest != null && (int)rhythmPlayRequest.rhythmMood == 2 && (int)__instance.lastMood_ == 2)
				{
					uint playCount_ = __instance.playCount_;
					if (playCount_ > 16)
					{
						uint num = (playCount_ - 1) % 16 + 1;
						__state.Applied = true;
						__state.OriginalPlayCount = playCount_;
						__state.VirtualPlayCount = num;
						__instance.playCount_ = num;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(24, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 FIX] Prefix failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		private static void Postfix(Rhythm __instance, bool __result, PlayCountFixState __state)
		{
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			try
			{
				if (__instance != null && __state != null && __state.Applied)
				{
					__instance.playCount_ = (__result ? (__state.OriginalPlayCount + 1) : __state.OriginalPlayCount);
					Plugin.D($"[P1 FIX] Virtualized Mood_High playCount {__state.OriginalPlayCount} -> {__state.VirtualPlayCount}, restored to {__instance.playCount_}");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(25, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 FIX] Postfix failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "playRhythm")]
	internal static class P2RhythmPlayCountVirtualWrapFix
	{
		private static void Prefix(Rhythm __instance, out PlayCountFixState __state)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Invalid comparison between Unknown and I4
			__state = new PlayCountFixState();
			if (!Plugin.ThemeLoopFixEnabled)
			{
				return;
			}
			try
			{
				if (__instance != null && (int)__instance.lastMood_ == 2)
				{
					uint playCount_ = __instance.playCount_;
					if (playCount_ > 16)
					{
						uint num = (playCount_ - 1) % 16 + 1;
						__state.Applied = true;
						__state.OriginalPlayCount = playCount_;
						__state.VirtualPlayCount = num;
						__instance.playCount_ = num;
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(24, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 FIX] Prefix failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		private static void Postfix(Rhythm __instance, bool __result, PlayCountFixState __state)
		{
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			try
			{
				if (__instance != null && __state != null && __state.Applied)
				{
					__instance.playCount_ = (__result ? (__state.OriginalPlayCount + 1) : __state.OriginalPlayCount);
					Plugin.D($"[P2 FIX] Virtualized Mood_High playCount {__state.OriginalPlayCount} -> {__state.VirtualPlayCount}, restored to {__instance.playCount_}");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(25, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 FIX] Postfix failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	internal static class P1HelperMidiState
	{
		public static BgmPlayer? HelperPlayer;

		public static bool SequenceActive;

		public static bool HelperMuted;

		private static bool HasLastRhythmState;

		private static Mood LastMood;

		private static uint LastPlayCount;

		private static bool LastIsPlay;

		public const uint HelperMuteMask = uint.MaxValue;

		public static void Reset(string source)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (HelperMuted && HelperPlayer != null)
				{
					HelperPlayer.setMute(0u);
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] reset unmute failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
			SequenceActive = false;
			HelperMuted = false;
			HelperPlayer = null;
			HasLastRhythmState = false;
			LastMood = (Mood)0;
			LastPlayCount = 0u;
			LastIsPlay = false;
			Plugin.D("[P1 HELPER MIDI] reset from " + source);
		}

		public static void SetHelperMuted(bool muted, string source, bool force = false)
		{
			//IL_012f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0135: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			bool flag = default(bool);
			try
			{
				if (!force && HelperMuted == muted)
				{
					return;
				}
				BgmPlayer helperPlayer = HelperPlayer;
				if (helperPlayer == null)
				{
					ManualLogSource l = Plugin.L;
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(62, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] wanted muted=");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(muted);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" from ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", but helperPlayer is null");
					}
					l.LogWarning(val);
					HelperMuted = muted;
				}
				else
				{
					helperPlayer.setMute(muted ? uint.MaxValue : 0u);
					HelperMuted = muted;
					Plugin.D($"[P1 HELPER MIDI] {(muted ? "MUTED" : "UNMUTED")} helper from {source}, playId={helperPlayer.playId_}, rid={helperPlayer.getRID()}, isPlay={helperPlayer.isPlay()}");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l2 = Plugin.L;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(48, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] SetHelperMuted(");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(muted);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l2.LogWarning(val);
			}
		}

		public static void ResetProgress(string source)
		{
			SequenceActive = false;
			SetHelperMuted(muted: false, source, force: true);
			Plugin.D("[P1 HELPER MIDI] progress reset from " + source);
		}

		public static void OnSuccessfulRhythm(Rhythm rhythm, PlayRequest request)
		{
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!SequenceActive)
				{
					SequenceActive = true;
					SetHelperMuted(muted: true, $"first successful command mood={request.rhythmMood}, playCount={rhythm.playCount_}");
					Plugin.D($"[P1 HELPER MIDI] sequence started; helper muted immediately: mood={request.rhythmMood}, playCount={rhythm.playCount_}, playSEIndex={rhythm.playSEIndex_}");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] OnSuccessfulRhythm failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		public static void WatchRhythmState(Rhythm rhythm)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Invalid comparison between Unknown and I4
			try
			{
				Mood lastMood_ = rhythm.lastMood_;
				uint playCount_ = rhythm.playCount_;
				bool isPlay_ = rhythm.isPlay_;
				if (!HasLastRhythmState)
				{
					HasLastRhythmState = true;
					LastMood = lastMood_;
					LastPlayCount = playCount_;
					LastIsPlay = isPlay_;
					return;
				}
				if (SequenceActive && LastPlayCount != 0 && playCount_ == 0 && !isPlay_)
				{
					Plugin.D($"[P1 HELPER MIDI] rhythm loss detected: mood {LastMood}->{lastMood_}, playCount {LastPlayCount}->0, isPlay {LastIsPlay}->{isPlay_}");
					ResetProgress("rhythm loss");
				}
				else if (!HelperMuted && (int)lastMood_ == 2 && playCount_ != 0 && !isPlay_)
				{
					SetHelperMuted(muted: true, $"after Mood_High transition finished, playCount={playCount_}");
				}
				LastMood = lastMood_;
				LastPlayCount = playCount_;
				LastIsPlay = isPlay_;
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(42, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] WatchRhythmState failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(Director), "playMidi")]
	internal static class P1CaptureHelperMidiPlayer
	{
		private static void Postfix(Director __instance, int midiIndex, MixingCategory cate, float fadeTime)
		{
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_018f: Expected O, but got Unknown
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Invalid comparison between Unknown and I4
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Invalid comparison between Unknown and I4
			if (!Plugin.HelperMuteEnabled)
			{
				return;
			}
			try
			{
				if (!P1HelperMidiState.SequenceActive && midiIndex == 0 && (int)cate == 3)
				{
					P1HelperMidiState.Reset("playMidi(0, BGM)");
				}
				else
				{
					if (midiIndex != 0 || (int)cate != 4)
					{
						return;
					}
					BgmPlayer curPlayer_ = __instance.curPlayer_;
					if (curPlayer_ == null)
					{
						Plugin.L.LogWarning((object)"[P1 HELPER MIDI] wanted to capture helper player, but curPlayer_ is null");
						return;
					}
					bool value = P1HelperMidiState.HelperPlayer != null;
					P1HelperMidiState.HelperPlayer = curPlayer_;
					Plugin.D($"[P1 HELPER MIDI] CAPTURED helper player from playMidi(0, Rhythm), hadCachedPlayer={value}, playId={curPlayer_.playId_}, rid={curPlayer_.getRID()}, vol={curPlayer_.getVolumeValue()}, targetVol={curPlayer_.getTargetVolume()}, isPlay={curPlayer_.isPlay()}, sequenceActive={P1HelperMidiState.SequenceActive}, ");
					if (P1HelperMidiState.SequenceActive && P1HelperMidiState.HelperMuted)
					{
						P1HelperMidiState.SetHelperMuted(muted: true, "re-applied mute after playMidi(0, Rhythm) recapture", force: true);
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] capture failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "playRhythm")]
	internal static class P1HelperOnSuccessfulRhythm
	{
		private static void Postfix(Rhythm __instance, PlayRequest rhythmPlayRequest, bool __result)
		{
			if (Plugin.HelperMuteEnabled && __result && __instance != null && rhythmPlayRequest != null)
			{
				P1HelperMidiState.OnSuccessfulRhythm(__instance, rhythmPlayRequest);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "update")]
	internal static class P1HelperWatchRhythmState
	{
		private static void Postfix(Rhythm __instance)
		{
			if (Plugin.HelperMuteEnabled && __instance != null)
			{
				P1HelperMidiState.WatchRhythmState(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "clearPlayCount")]
	internal static class P1HelperResetOnClearPlayCount
	{
		private static void Postfix()
		{
			if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperMuted))
			{
				P1HelperMidiState.ResetProgress("Rhythm.clearPlayCount");
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "resetPlayCount")]
	internal static class P1HelperResetOnResetPlayCount
	{
		private static void Postfix()
		{
			if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperMuted))
			{
				P1HelperMidiState.ResetProgress("Rhythm.clearPlayCount");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "moodDown")]
	internal static class P1HelperResetOnMoodDown
	{
		private static void Postfix()
		{
			if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperMuted))
			{
				P1HelperMidiState.ResetProgress("Rhythm.clearPlayCount");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "startPlayGame")]
	internal static class P1HelperResetOnStartPlayGame
	{
		private static void Prefix()
		{
			if (Plugin.HelperMuteEnabled)
			{
				P1HelperMidiState.Reset("Director.startPlayGame");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "exitPlayGame")]
	internal static class P1HelperResetOnExitPlayGame
	{
		private static void Prefix()
		{
			if (Plugin.HelperMuteEnabled)
			{
				P1HelperMidiState.Reset("Director.exitPlayGame");
			}
		}
	}
	internal static class P2HelperMidiState
	{
		public static bool CommandsStarted;

		public static bool HelperMuted;

		public static RhythmBgmPlayer? HelperPlayer;

		public static Rhythm? RhythmInstance;

		private static bool HasLastRhythmState;

		private static Mood LastMood;

		private static uint LastPlayCount;

		public const uint HelperMuteMask = uint.MaxValue;

		public static bool BattleActive;

		public static void Reset(string source, bool forceLog = false)
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Expected O, but got Unknown
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			if (!BattleActive && !CommandsStarted && !HelperMuted && HelperPlayer == null && !HasLastRhythmState && !forceLog)
			{
				return;
			}
			try
			{
				if (HelperMuted && HelperPlayer != null)
				{
					((BgmPlayer)HelperPlayer).setMute(0u);
					Plugin.D("[P2 HELPER MIDI] UNMUTED helper during reset from " + source);
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 2, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] reset unmute failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
			BattleActive = false;
			CommandsStarted = false;
			HelperMuted = false;
			HelperPlayer = null;
			RhythmInstance = null;
			HasLastRhythmState = false;
			LastMood = (Mood)0;
			LastPlayCount = 0u;
			Plugin.D("[P2 HELPER MIDI] reset from " + source);
		}

		public static void CaptureHelperCandidate(RhythmBgmPlayer player, string source, BgmType type, MixingCategory cate, SubGameType subGameType, string detail)
		{
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0268: Expected O, but got Unknown
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0189: Unknown result type (might be due to invalid IL or missing references)
			//IL_018b: Invalid comparison between Unknown and I4
			//IL_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0190: Invalid comparison between Unknown and I4
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0195: Invalid comparison between Unknown and I4
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			//IL_0199: Invalid comparison between Unknown and I4
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0211: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (player == null)
				{
					return;
				}
				Plugin.D($"[P2 HELPER MIDI] addMidi candidate from {source}: type={type}, cate={cate}, subGameType={subGameType}, {detail}, playId={((BgmPlayer)player).playId_}, rid={((BgmPlayer)player).getRID()}, vol={((BgmPlayer)player).getVolumeValue()}, targetVol={((BgmPlayer)player).getTargetVolume()}, isPlay={((BgmPlayer)player).isPlay()}, isLoop={((BgmPlayer)player).isLoop()}, commandsStarted={CommandsStarted}, helperMuted={HelperMuted}");
				bool num = (int)type == 1;
				bool flag = (int)subGameType == 0;
				bool flag2 = (int)cate == 3 || (int)cate == 4;
				if (num && flag && flag2)
				{
					HelperPlayer = player;
					Plugin.D($"[P2 HELPER MIDI] CAPTURED helper candidate from {source}, type={type}, cate={cate}, subGameType={subGameType}, {detail}");
					if (CommandsStarted && !HelperMuted)
					{
						SetHelperMuted(muted: true, "late helper capture after commands already started");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag3 = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(54, 2, ref flag3);
				if (flag3)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] CaptureHelperCandidate failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		public static void ResetProgress(string source)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			SetHelperMuted(muted: false, source, force: true);
			CommandsStarted = false;
			HasLastRhythmState = false;
			LastMood = (Mood)0;
			LastPlayCount = 0u;
			Plugin.D("[P2 HELPER MIDI] progress reset from " + source);
		}

		public static void SetHelperMuted(bool muted, string source, bool force = false)
		{
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Expected O, but got Unknown
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			bool flag = default(bool);
			try
			{
				if (!force && HelperMuted == muted)
				{
					return;
				}
				RhythmBgmPlayer helperPlayer = HelperPlayer;
				if (helperPlayer == null)
				{
					ManualLogSource l = Plugin.L;
					BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(62, 2, ref flag);
					if (flag)
					{
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] wanted muted=");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(muted);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" from ");
						((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
						((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", but helperPlayer is null");
					}
					l.LogWarning(val);
					if (muted)
					{
						CommandsStarted = false;
					}
					else
					{
						HelperMuted = false;
					}
					return;
				}
				((BgmPlayer)helperPlayer).setMute(muted ? uint.MaxValue : 0u);
				HelperMuted = muted;
				if (!muted)
				{
					CommandsStarted = false;
				}
				Plugin.D($"[P2 HELPER MIDI] {(muted ? "MUTED" : "UNMUTED")} helper from {source}, playId={((BgmPlayer)helperPlayer).playId_}, rid={((BgmPlayer)helperPlayer).getRID()}, isPlay={((BgmPlayer)helperPlayer).isPlay()}");
			}
			catch (Exception ex)
			{
				ManualLogSource l2 = Plugin.L;
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(48, 3, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] SetHelperMuted(");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<bool>(muted);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l2.LogWarning(val);
			}
		}

		public static void OnSuccessfulRhythm(Rhythm rhythm)
		{
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Expected O, but got Unknown
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (rhythm != null)
				{
					RhythmInstance = rhythm;
					if (rhythm.playCount_ == 0 || rhythm.playSEIndex_ == 0)
					{
						Plugin.D($"[P2 HELPER MIDI] ignored early/empty playRhythm: mood={rhythm.lastMood_}, playCount={rhythm.playCount_}, playSEIndex={rhythm.playSEIndex_}");
					}
					else if (!CommandsStarted)
					{
						CommandsStarted = true;
						Plugin.D($"[P2 HELPER MIDI] Commands started at mood={rhythm.lastMood_}, playCount={rhythm.playCount_}, playSEIndex={rhythm.playSEIndex_}, helperPlayer={((HelperPlayer == null) ? "null" : "cached")}");
						SetHelperMuted(muted: true, "first successful playRhythm");
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] OnSuccessfulRhythm failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		public static void CheckForRhythmLoss(Rhythm rhythm)
		{
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Expected O, but got Unknown
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (rhythm == null)
				{
					return;
				}
				Mood lastMood_ = rhythm.lastMood_;
				uint playCount_ = rhythm.playCount_;
				if (!HasLastRhythmState)
				{
					HasLastRhythmState = true;
					LastMood = lastMood_;
					LastPlayCount = playCount_;
					return;
				}
				if (CommandsStarted && LastPlayCount != 0 && playCount_ == 0)
				{
					Plugin.D($"[P2 HELPER MIDI] rhythm loss detected by Rhythm.update: mood {LastMood}->{lastMood_}, playCount {LastPlayCount}->0, helperMuted={HelperMuted}");
					ResetProgress("Rhythm.update loss");
				}
				LastMood = lastMood_;
				LastPlayCount = playCount_;
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(44, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] CheckForRhythmLoss failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}

		public static void CheckLowLowMoodLoss(string source, int commandPoint, float commandBeatCount)
		{
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Expected O, but got Unknown
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_0165: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				if (!CommandsStarted && !HelperMuted)
				{
					return;
				}
				Rhythm rhythmInstance = RhythmInstance;
				if (rhythmInstance == null)
				{
					Plugin.D($"[P2 HELPER MIDI] low->low mood pulse, but RhythmInstance is null, commandPoint={commandPoint}, commandBeatCount={commandBeatCount}");
					return;
				}
				Mood lastMood_ = rhythmInstance.lastMood_;
				uint playCount_ = rhythmInstance.playCount_;
				uint playSEIndex_ = rhythmInstance.playSEIndex_;
				bool flag = playCount_ == 0;
				Plugin.D($"[P2 HELPER MIDI] low->low mood pulse while active: rhythmMood={lastMood_}, playCount={playCount_}, playSEIndex={playSEIndex_}, commandPoint={commandPoint}, commandBeatCount={commandBeatCount}, looksLikeLoss={flag}");
				if (flag)
				{
					ResetProgress($"{source}, rhythmMood={lastMood_}, playCount={playCount_}, commandPoint={commandPoint}, commandBeatCount={commandBeatCount}");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag2 = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(51, 2, ref flag2);
				if (flag2)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] CheckLowLowMoodLoss failed from ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(source);
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(Director), "playMidi")]
	internal static class P2TraceHelperMidiPlayMidi
	{
		private static void Postfix(Director __instance, int midiIndex, MixingCategory cate, float fadeTime)
		{
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: Expected O, but got Unknown
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Invalid comparison between Unknown and I4
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.HelperMuteEnabled)
			{
				return;
			}
			try
			{
				Plugin.D($"[P2 PLAYERTRACE] after playMidi argIndex={midiIndex}, argCate={cate}, curMIDIIndex={__instance.curMIDIIndex_}, curCate={__instance.curMidiCategory_}, bgmPlayers={((__instance.bgmPlayer_ == null) ? "null" : "not-null")}, commandsStarted={P2HelperMidiState.CommandsStarted}, helperMuted={P2HelperMidiState.HelperMuted}, helperPlayer={((P2HelperMidiState.HelperPlayer == null) ? "null" : "cached")}");
				if (!P2HelperMidiState.BattleActive && !P2HelperMidiState.CommandsStarted && midiIndex == 0 && (int)cate == 11)
				{
					P2HelperMidiState.Reset($"playMidi(0, {cate})");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(25, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 PLAYERTRACE] failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "playRhythm")]
	internal static class P2HelperOnSuccessfulRhythm
	{
		private static void Postfix(Rhythm __instance, bool __result)
		{
			if (Plugin.HelperMuteEnabled && __result && __instance != null)
			{
				P2HelperMidiState.OnSuccessfulRhythm(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "update")]
	internal static class P2HelperWatchRhythmState
	{
		private static void Postfix(Rhythm __instance)
		{
			if (Plugin.HelperMuteEnabled && __instance != null)
			{
				P2HelperMidiState.CheckForRhythmLoss(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "clearPlayCount")]
	internal static class P2HelperResetOnClearPlayCount
	{
		private static void Postfix()
		{
			if (Plugin.HelperMuteEnabled && (P2HelperMidiState.CommandsStarted || P2HelperMidiState.HelperMuted))
			{
				P2HelperMidiState.ResetProgress("Rhythm.clearPlayCount");
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "resetPlayCount")]
	internal static class P2HelperResetOnResetPlayCount
	{
		private static void Postfix()
		{
			if (Plugin.HelperMuteEnabled && (P2HelperMidiState.CommandsStarted || P2HelperMidiState.HelperMuted))
			{
				P2HelperMidiState.ResetProgress("Rhythm.resetPlayCount");
			}
		}
	}
	[HarmonyPatch]
	internal static class P2CaptureHelperFromAddMidi_MidiId
	{
		private static MethodBase TargetMethod()
		{
			return AccessTools.DeclaredMethod(typeof(BgmPlayers), "addMidi", new Type[4]
			{
				typeof(BgmType),
				typeof(MidiId),
				typeof(MixingCategory),
				typeof(SubGameType)
			}, (Type[])null);
		}

		private static void Postfix(RhythmBgmPlayer __result, BgmType type, MidiId id, MixingCategory cate, SubGameType subGameType)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.CaptureHelperCandidate(__result, "BgmPlayers.addMidi(MidiId)", type, cate, subGameType, $"id={id}");
			}
		}
	}
	[HarmonyPatch]
	internal static class P2CaptureHelperFromAddMidi_BankRid
	{
		private static MethodBase TargetMethod()
		{
			return AccessTools.DeclaredMethod(typeof(BgmPlayers), "addMidi", new Type[6]
			{
				typeof(BgmType),
				typeof(BankRIDHandle),
				typeof(RhythmParam),
				typeof(string),
				typeof(MixingCategory),
				typeof(SubGameType)
			}, (Type[])null);
		}

		private static void Postfix(RhythmBgmPlayer __result, BgmType type, BankRIDHandle rid, RhythmParam rhythmParam, string filename, MixingCategory cate, SubGameType subGameType)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.CaptureHelperCandidate(__result, "BgmPlayers.addMidi(BankRIDHandle)", type, cate, subGameType, "filename=" + filename);
			}
		}
	}
	[HarmonyPatch(typeof(Director), "startBattle")]
	internal static class P2HelperResetOnStartBattle
	{
		private static void Prefix(uint index)
		{
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.Reset($"Director.startBattle pre-reset index={index}");
				P2HelperMidiState.BattleActive = true;
				Plugin.D($"[P2 HELPER MIDI] battle active from Director.startBattle index={index}");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "exitBattle")]
	internal static class P2HelperResetOnExitBattle
	{
		private static void Prefix()
		{
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.Reset("Director.exitBattle");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "failedBattle")]
	internal static class P2HelperResetOnFailedBattle
	{
		private static void Prefix()
		{
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.Reset("Director.failedBattle");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "goalBattle")]
	internal static class P2HelperResetOnGoalBattle
	{
		private static void Prefix()
		{
			if (Plugin.HelperMuteEnabled)
			{
				P2HelperMidiState.Reset("Director.goalBattle");
			}
		}
	}
	[HarmonyPatch(typeof(Director), "onChangeMood")]
	internal static class P2HelperResetOnChangeMood
	{
		private static void Postfix(Director __instance, int newMood, int oldMood)
		{
			//IL_0194: Unknown result type (might be due to invalid IL or missing references)
			//IL_019b: Expected O, but got Unknown
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Invalid comparison between Unknown and I4
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Invalid comparison between Unknown and I4
			if (!Plugin.HelperMuteEnabled)
			{
				return;
			}
			try
			{
				if (P2HelperMidiState.CommandsStarted || P2HelperMidiState.HelperMuted)
				{
					Mood val = (Mood)oldMood;
					Mood val2 = (Mood)newMood;
					int num = -999;
					float num2 = -1f;
					try
					{
						num = __instance.getCommandPoint();
						num2 = __instance.getCommandBeatCount();
					}
					catch
					{
					}
					Plugin.D($"[P2 HELPER MIDI] onChangeMood fired oldMood={val}, newMood={val2}, commandPoint={num}, commandBeatCount={num2}, commandsStarted={P2HelperMidiState.CommandsStarted}, helperMuted={P2HelperMidiState.HelperMuted}, helperPlayer={((P2HelperMidiState.HelperPlayer == null) ? "null" : "cached")}");
					if ((int)val != 0 && (int)val2 == 0)
					{
						P2HelperMidiState.ResetProgress($"Director.onChangeMood {val}->{val2}");
					}
					else if ((int)val == 0 && (int)val2 == 0)
					{
						P2HelperMidiState.CheckLowLowMoodLoss("Director.onChangeMood Mood_Low->Mood_Low", num, num2);
					}
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val3 = new BepInExWarningLogInterpolatedStringHandler(43, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val3).AppendLiteral("[P2 HELPER MIDI] onChangeMood hook failed: ");
					((BepInExLogInterpolatedStringHandler)val3).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val3);
			}
		}
	}
	[HarmonyPatch(typeof(Rhythm), "playRhythm")]
	internal static class P2HelperResetOnFailedPlayRhythm
	{
		private static void Postfix(Rhythm __instance, bool __result)
		{
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.HelperMuteEnabled)
			{
				return;
			}
			try
			{
				if (__instance != null && !__result && (P2HelperMidiState.CommandsStarted || P2HelperMidiState.HelperMuted))
				{
					Plugin.D($"[P2 HELPER MIDI] failed playRhythm detected: mood={__instance.lastMood_}, playCount={__instance.playCount_}, playSEIndex={__instance.playSEIndex_}, helperMuted={P2HelperMidiState.HelperMuted}");
					P2HelperMidiState.ResetProgress("failed playRhythm");
				}
			}
			catch (Exception ex)
			{
				ManualLogSource l = Plugin.L;
				bool flag = default(bool);
				BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(48, 1, ref flag);
				if (flag)
				{
					((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER MIDI] failed playRhythm hook failed: ");
					((BepInExLogInterpolatedStringHandler)val).AppendFormatted<Exception>(ex);
				}
				l.LogWarning(val);
			}
		}
	}
}