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 Il2CppInterop.Runtime.InteropTypes; using Microsoft.CodeAnalysis; using P1.Sound; using P1.System.Sound; using P1.System.Sound.Rhythm; using P2.Sound; using UnityEngine; [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] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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; } } } namespace PataponAudioFix { [HarmonyPatch(typeof(Rhythm), "playRhythm")] internal static class P1RhythmPlayCountVirtualWrapFix { private static void Prefix(Rhythm __instance, PlayRequest rhythmPlayRequest, out PlayCountFixState __state) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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(ex); } l.LogWarning(val); } } private static void Postfix(Rhythm __instance, bool __result, PlayCountFixState __state) { //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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(ex); } l.LogWarning(val); } } } internal static class P1HelperMidiState { public static BgmPlayer? HelperPlayer; public static bool SequenceActive; public static bool HelperFadedOut; public static float CachedTargetVolume = 1f; private static bool HasLastRhythmState; private static Mood LastMood; private static uint LastPlayCount; private static bool LastIsPlay; public static void Reset(string source) { //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_00cf: Unknown result type (might be due to invalid IL or missing references) try { if (HelperFadedOut && HelperPlayer != null) { HelperPlayer.setMute(0u); Player? innerPlayer = GetInnerPlayer(HelperPlayer); if (innerPlayer != null) { innerPlayer.setVolumeDirect(CachedTargetVolume); } Plugin.D($"[P1 HELPER MIDI] reset: inner restored to {CachedTargetVolume} from {source}"); } } catch (Exception ex) { ManualLogSource l = Plugin.L; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(52, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] reset restore-volume failed from "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(source); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } l.LogWarning(val); } SequenceActive = false; HelperFadedOut = false; HelperPlayer = null; HasLastRhythmState = false; LastMood = (Mood)0; LastPlayCount = 0u; LastIsPlay = false; Plugin.D("[P1 HELPER MIDI] reset from " + source); } private static Player? GetInnerPlayer(BgmPlayer player) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown try { RhythmBgmPlayer obj = ((Il2CppObjectBase)player).TryCast(); return (obj != null) ? obj.rhythm_ : null; } catch (Exception ex) { ManualLogSource l = Plugin.L; bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(40, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] GetInnerPlayer failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } l.LogWarning(val); return null; } } public static float ReadInnerVolume(BgmPlayer player) { Player innerPlayer = GetInnerPlayer(player); if (innerPlayer == null) { return -1f; } return innerPlayer.getVolume(); } public static void SetHelperVolume(bool fadedOut, string source, bool force = false) { //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0201: 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 //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown bool flag = default(bool); try { if (!force && HelperFadedOut == fadedOut) { return; } BgmPlayer helperPlayer = HelperPlayer; if (helperPlayer == null) { ManualLogSource l = Plugin.L; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(65, 2, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] wanted fadedOut="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(fadedOut); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" from "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(source); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(", but helperPlayer is null"); } l.LogWarning(val); HelperFadedOut = fadedOut; return; } Player innerPlayer = GetInnerPlayer(helperPlayer); if (innerPlayer == null) { ManualLogSource l2 = Plugin.L; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(75, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] inner rhythm Player is null from "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(source); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("; falling back to setMute"); } l2.LogWarning(val); helperPlayer.setMute(fadedOut ? uint.MaxValue : 0u); HelperFadedOut = fadedOut; return; } if (fadedOut) { innerPlayer.setVolumeDirect(0f); Plugin.D($"[P1 HELPER MIDI] INNER-ZERO from {source}, innerVol={innerPlayer.getVolume()}, rid={helperPlayer.getRID()}, isPlay={helperPlayer.isPlay()}"); } else { innerPlayer.setVolumeDirect(CachedTargetVolume); Plugin.D($"[P1 HELPER MIDI] INNER-FULL vol={CachedTargetVolume} from {source}, innerVol={innerPlayer.getVolume()}, rid={helperPlayer.getRID()}, isPlay={helperPlayer.isPlay()}"); } HelperFadedOut = fadedOut; } catch (Exception ex) { ManualLogSource l3 = Plugin.L; BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(58, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P1 HELPER MIDI] SetHelperVolume(fadedOut="); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(fadedOut); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(") failed from "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(source); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral(": "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex); } l3.LogWarning(val); } } public static void ResetProgress(string source) { SequenceActive = false; SetHelperVolume(fadedOut: false, source, force: true); Plugin.D("[P1 HELPER MIDI] progress reset from " + source); } public static void OnSuccessfulRhythm(Rhythm rhythm, PlayRequest request) { } 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_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Expected O, but got Unknown //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) 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 (lastMood_ != LastMood || playCount_ != LastPlayCount || isPlay_ != LastIsPlay) { Plugin.D($"[P1 RHYTHM TRANS] mood={LastMood}->{lastMood_}, playCount={LastPlayCount}->{playCount_}, isPlay={LastIsPlay}->{isPlay_}, seqActive={SequenceActive}, fadedOut={HelperFadedOut}"); } if (isPlay_ && !LastIsPlay) { SequenceActive = true; SetHelperVolume(fadedOut: true, $"chant begin (isPlay->True) mood={lastMood_}, playCount={playCount_}"); } else if (!isPlay_ && LastIsPlay) { SequenceActive = false; SetHelperVolume(fadedOut: false, $"input window (isPlay->False) mood={lastMood_}, 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(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_0165: Unknown result type (might be due to invalid IL or missing references) //IL_016c: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_; float num = -1f; if (!P1HelperMidiState.HelperFadedOut) { num = P1HelperMidiState.ReadInnerVolume(curPlayer_); if (num > 0f) { P1HelperMidiState.CachedTargetVolume = num; } } Plugin.D($"[P1 HELPER MIDI] CAPTURED helper from playMidi(0, Rhythm), hadCachedPlayer={value}, playId={curPlayer_.playId_}, rid={curPlayer_.getRID()}, innerVol={num}, cachedTarget={P1HelperMidiState.CachedTargetVolume}, isPlay={curPlayer_.isPlay()}, sequenceActive={P1HelperMidiState.SequenceActive}"); if (P1HelperMidiState.SequenceActive && P1HelperMidiState.HelperFadedOut) { P1HelperMidiState.SetHelperVolume(fadedOut: true, "re-applied fade 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(ex); } l.LogWarning(val); } } } [HarmonyPatch(typeof(Rhythm), "playRhythm")] internal static class P1HelperOnSuccessfulRhythm { private static void Postfix(Rhythm __instance, PlayRequest rhythmPlayRequest, bool __result) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (Plugin.HelperMuteEnabled && __instance != null && rhythmPlayRequest != null) { Plugin.D($"[P1 EVENT] playRhythm result={__result}, mood={rhythmPlayRequest.rhythmMood}, lastMood={__instance.lastMood_}, playCount={__instance.playCount_}, playSEIndex={__instance.playSEIndex_}, isPlay={__instance.isPlay_}, seqActive={P1HelperMidiState.SequenceActive}"); if (__result) { 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() { Plugin.D($"[P1 EVENT] Rhythm.clearPlayCount fired, seqActive={P1HelperMidiState.SequenceActive}, fadedOut={P1HelperMidiState.HelperFadedOut}"); if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperFadedOut)) { P1HelperMidiState.ResetProgress("Rhythm.clearPlayCount"); } } } [HarmonyPatch(typeof(Rhythm), "resetPlayCount")] internal static class P1HelperResetOnResetPlayCount { private static void Postfix() { Plugin.D($"[P1 EVENT] Rhythm.resetPlayCount fired, seqActive={P1HelperMidiState.SequenceActive}, fadedOut={P1HelperMidiState.HelperFadedOut}"); if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperFadedOut)) { P1HelperMidiState.ResetProgress("Rhythm.resetPlayCount"); } } } [HarmonyPatch(typeof(Director), "moodDown")] internal static class P1HelperResetOnMoodDown { private static void Postfix() { Plugin.D($"[P1 EVENT] Director.moodDown fired, seqActive={P1HelperMidiState.SequenceActive}, fadedOut={P1HelperMidiState.HelperFadedOut}"); if (Plugin.HelperMuteEnabled && (P1HelperMidiState.SequenceActive || P1HelperMidiState.HelperFadedOut)) { P1HelperMidiState.ResetProgress("Director.moodDown"); } } } [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"); } } } [HarmonyPatch(typeof(Rhythm), "playRhythm")] internal static class P2RhythmPlayCountVirtualWrapFix { private static void Prefix(Rhythm __instance, out PlayCountFixState __state) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: 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(ex); } l.LogWarning(val); } } private static void Postfix(Rhythm __instance, bool __result, PlayCountFixState __state) { //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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(ex); } l.LogWarning(val); } } } [HarmonyPatch(typeof(BeatCommander), "update")] internal static class P2HelperFadeController { private const float KaesiBeat = 4f; private static int WarnCount; private static float CurVol = 1f; private static bool Applying; private static readonly Stopwatch Clock = Stopwatch.StartNew(); private static long LastMs; private static float LastBeat; private static bool HasLastBeat; private static float MsPerBeat = 500f; private static void SetCategoryVolume(float vol) { CriSoundManager instance = SingletonMonobehaviour.Instance; if (!((Object)(object)instance == (Object)null)) { instance.setCategorySetVolume((MixingCategory)Plugin.P2HelperCategory, vol, 0f); } } private static void Postfix(BeatCommander __instance) { //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Expected O, but got Unknown //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Invalid comparison between Unknown and I4 if (!Plugin.HelperMuteEnabled || __instance == null) { return; } try { float p2FadeMs = Plugin.P2FadeMs; float p2FullVolume = Plugin.P2FullVolume; long elapsedMilliseconds = Clock.ElapsedMilliseconds; float num = ((LastMs == 0L) ? 16f : Math.Min(p2FadeMs, elapsedMilliseconds - LastMs)); LastMs = elapsedMilliseconds; float commandBeatCount = __instance.getCommandBeatCount(); if (HasLastBeat) { float num2 = commandBeatCount - LastBeat; if (num2 > 0.0001f && num2 < 2f && num > 0f) { float num3 = num / num2; if (num3 > 50f && num3 < 5000f) { MsPerBeat = MsPerBeat * 0.9f + num3 * 0.1f; } } } LastBeat = commandBeatCount; HasLastBeat = true; bool num4 = (int)__instance.getState() == 3; float num5 = ((MsPerBeat > 0f) ? (Plugin.P2FadeLeadMs / MsPerBeat) : 0f); bool flag = !num4 && commandBeatCount < 4f && commandBeatCount >= 4f - num5; float num6 = ((num4 || flag) ? 0f : p2FullVolume); float num7 = p2FullVolume * (num / p2FadeMs); if (CurVol < num6) { CurVol = Math.Min(num6, CurVol + num7); } else if (CurVol > num6) { CurVol = Math.Max(num6, CurVol - num7); } if (num4 || CurVol < p2FullVolume - 0.001f) { SetCategoryVolume(CurVol); Applying = true; } else if (Applying) { SetCategoryVolume(p2FullVolume); Applying = false; } } catch (Exception ex) { if (WarnCount < 3) { WarnCount++; ManualLogSource l = Plugin.L; bool flag2 = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(35, 2, ref flag2); if (flag2) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("[P2 HELPER] controller failed (#"); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(WarnCount); ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("): "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } l.LogWarning(val); } } } } [BepInPlugin("juras.patapon.audiofix", "Music Fixes Extended", "2.0.0")] public class Plugin : BasePlugin { internal static ManualLogSource L; internal static ConfigEntry AudioFix_ThemeLoopFix; internal static ConfigEntry AudioFix_HelperMute; internal static ConfigEntry AudioFix_P2HelperCategory; internal static ConfigEntry AudioFix_P2FadeMs; internal static ConfigEntry AudioFix_P2FadeLeadMs; internal static ConfigEntry AudioFix_P2FullVolumePercent; internal const bool DebugLog = false; internal static bool ThemeLoopFixEnabled => AudioFix_ThemeLoopFix.Value != 0; internal static bool HelperMuteEnabled => AudioFix_HelperMute.Value != 0; internal static uint P2HelperCategory => AudioFix_P2HelperCategory.Value; internal static float P2FadeMs { get { if (AudioFix_P2FadeMs.Value >= 1) { return AudioFix_P2FadeMs.Value; } return 1f; } } internal static float P2FadeLeadMs => AudioFix_P2FadeLeadMs.Value; internal static float P2FullVolume { get { uint num = AudioFix_P2FullVolumePercent.Value; if (num > 100) { num = 100u; } return (float)num / 100f; } } internal static void D(string message) { } public override void Load() { //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Expected O, but got Unknown //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Expected O, but got Unknown //IL_0162: Unknown result type (might be due to invalid IL or missing references) L = ((BasePlugin)this).Log; AudioFix_ThemeLoopFix = ((BasePlugin)this).Config.Bind("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("AudioFix", "AudioFix_HelperMute", 1u, "Set to 1 to enable helper mute/fade behavior. Set to 0 to disable it."); AudioFix_P2HelperCategory = ((BasePlugin)this).Config.Bind("AudioFix_P2", "AudioFix_P2HelperCategory", 3u, "P2 only: CriSoundManager mixing category that carries the helper (3 = BGM). Only change if a game update moves the helper to a different category."); AudioFix_P2FadeMs = ((BasePlugin)this).Config.Bind("AudioFix_P2", "AudioFix_P2FadeMs", 400u, "P2 only: helper fade duration in milliseconds at the start/end of the chant phase. Higher = more gradual."); AudioFix_P2FadeLeadMs = ((BasePlugin)this).Config.Bind("AudioFix_P2", "AudioFix_P2FadeLeadMs", 250u, "P2 only: how many milliseconds BEFORE the chant the fade-out begins (anticipation). 0 = start exactly at the chant. Tempo-adaptive (stays constant during Fever)."); AudioFix_P2FullVolumePercent = ((BasePlugin)this).Config.Bind("AudioFix_P2", "AudioFix_P2FullVolumePercent", 70u, "P2 only: the helper's full (un-ducked) volume as a percent (0-100). Lower it if the helper jumps louder at the chant start; raise it if the helper is too quiet while drumming."); L.LogInfo((object)"Music Fixes Extended 2.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(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(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; } }