using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Core.Logging.Interpolation;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppSystem.Collections.Generic;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyCompany("FixNewCityIntroSong")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.1.1.0")]
[assembly: AssemblyInformationalVersion("0.1.1+5dd4040edbff35ee8a0821550b29339a7498d9bb")]
[assembly: AssemblyProduct("Fix New City Intro Song")]
[assembly: AssemblyTitle("FixNewCityIntroSong")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.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.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace FixNewCityIntroSong
{
internal static class IntroMusicState
{
private static CutScenePreset _forcedPreset;
private static bool _forcedActive;
internal static void TryForceIntroMusic(CutSceneController controller)
{
if ((Object)(object)controller == (Object)null)
{
return;
}
CutScenePreset preset = controller.preset;
if ((SoCustomComparison)(object)preset == (SoCustomComparison)null || !IsIntroPreset(preset))
{
return;
}
MusicController instance = MusicController.Instance;
if (!((Object)(object)instance == (Object)null) && instance.cues != null)
{
MusicCue val = FindIntroCue(instance, preset);
if (!((SoCustomComparison)(object)val == (SoCustomComparison)null))
{
_forcedPreset = preset;
_forcedActive = true;
instance.PlayNewTrack(val, true);
}
}
}
internal static void StopForcedMusicIfNeeded(CutScenePreset preset)
{
if (_forcedActive && (!((SoCustomComparison)(object)_forcedPreset != (SoCustomComparison)null) || !((SoCustomComparison)(object)preset != (SoCustomComparison)null) || _forcedPreset == preset))
{
MusicController instance = MusicController.Instance;
if ((Object)(object)instance == (Object)null)
{
Reset();
return;
}
instance.StopCurrentTrack();
Reset();
}
}
private static void Reset()
{
_forcedPreset = null;
_forcedActive = false;
}
private static bool IsIntroPreset(CutScenePreset preset)
{
GameplayControls instance = GameplayControls.Instance;
if ((Object)(object)instance == (Object)null)
{
return false;
}
return instance.intro == preset;
}
private static MusicCue FindIntroCue(MusicController music, CutScenePreset preset)
{
//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Expected O, but got Unknown
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Invalid comparison between Unknown and I4
Enumerator<MusicCue> enumerator = music.cues.GetEnumerator();
while (enumerator.MoveNext())
{
MusicCue current = enumerator.Current;
if (((current != null) ? current.triggers : null) == null)
{
continue;
}
Enumerator<MusicTrigger> enumerator2 = current.triggers.GetEnumerator();
while (enumerator2.MoveNext())
{
MusicTrigger current2 = enumerator2.Current;
if (current2 != null && (int)current2.onGameState == 3 && (current2.cutSceneReference == preset || CutsceneNameMatches(current2.cutSceneReference, preset)))
{
return current;
}
}
}
enumerator = music.cues.GetEnumerator();
while (enumerator.MoveNext())
{
MusicCue current3 = enumerator.Current;
if ((SoCustomComparison)(object)current3 != (SoCustomComparison)null && string.Equals(((Object)current3).name, "IntroMusic", StringComparison.OrdinalIgnoreCase))
{
return current3;
}
}
string text = BuildCueDebugInfo(music, preset);
ManualLogSource logSource = FixNewCityIntroSongPlugin.LogSource;
if (logSource != null)
{
bool flag = default(bool);
BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(76, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Intro music: no matching cue found (no trigger match, no 'IntroMusic' cue). ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>(text);
}
logSource.LogWarning(val);
}
return null;
}
private static bool CutsceneNameMatches(CutScenePreset a, CutScenePreset b)
{
if ((SoCustomComparison)(object)a == (SoCustomComparison)null || (SoCustomComparison)(object)b == (SoCustomComparison)null)
{
return false;
}
string name = ((Object)a).name;
string name2 = ((Object)b).name;
if (string.IsNullOrWhiteSpace(name) || string.IsNullOrWhiteSpace(name2))
{
return false;
}
return string.Equals(name, name2, StringComparison.OrdinalIgnoreCase);
}
private static string BuildCueDebugInfo(MusicController music, CutScenePreset preset)
{
if (((music != null) ? music.cues : null) == null)
{
return "Cues=<null>.";
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("Cutscene=");
stringBuilder.Append(((SoCustomComparison)(object)preset != (SoCustomComparison)null) ? ((Object)preset).name : "<null>");
stringBuilder.Append(". Cues=[");
bool flag = true;
Enumerator<MusicCue> enumerator = music.cues.GetEnumerator();
while (enumerator.MoveNext())
{
MusicCue current = enumerator.Current;
if (!flag)
{
stringBuilder.Append(", ");
}
flag = false;
if ((SoCustomComparison)(object)current == (SoCustomComparison)null)
{
stringBuilder.Append("<null>");
continue;
}
int value = current.triggers?.Count ?? 0;
stringBuilder.Append(((Object)current).name);
stringBuilder.Append("(triggers=");
stringBuilder.Append(value);
stringBuilder.Append(")");
}
stringBuilder.Append("].");
return stringBuilder.ToString();
}
}
[HarmonyPatch(typeof(CutSceneController), "SetActive")]
internal static class CutSceneControllerSetActivePatch
{
public static void Prefix(CutSceneController __instance, bool val)
{
if (val)
{
IntroMusicState.TryForceIntroMusic(__instance);
}
}
public static void Postfix(CutSceneController __instance, bool val)
{
if (!val)
{
IntroMusicState.StopForcedMusicIfNeeded((__instance != null) ? __instance.preset : null);
}
}
}
[BepInPlugin("dema77sr.SOD.FixNewCityIntroSong", "FixNewCityIntroSong", "0.1.1")]
public class FixNewCityIntroSongPlugin : BasePlugin
{
public const string PLUGIN_GUID = "dema77sr.SOD.FixNewCityIntroSong";
public const string PLUGIN_NAME = "FixNewCityIntroSong";
public const string PLUGIN_VERSION = "0.1.1";
internal static ManualLogSource LogSource;
private Harmony _harmony;
public override void Load()
{
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0026: Expected O, but got Unknown
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Expected O, but got Unknown
if (LogSource == null)
{
LogSource = Logger.CreateLogSource("FixNewCityIntroSong");
}
ManualLogSource logSource = LogSource;
bool flag = default(bool);
BepInExInfoLogInterpolatedStringHandler val = new BepInExInfoLogInterpolatedStringHandler(18, 1, ref flag);
if (flag)
{
((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Plugin ");
((BepInExLogInterpolatedStringHandler)val).AppendFormatted<string>("dema77sr.SOD.FixNewCityIntroSong");
((BepInExLogInterpolatedStringHandler)val).AppendLiteral(" is loaded.");
}
logSource.LogInfo(val);
_harmony = new Harmony("dema77sr.SOD.FixNewCityIntroSong");
_harmony.PatchAll();
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "FixNewCityIntroSong";
public const string PLUGIN_NAME = "Fix New City Intro Song";
public const string PLUGIN_VERSION = "0.1.1";
}
}