Decompiled source of Scary Company v0.0.1

ScaryCompany.dll

Decompiled 11 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading.Tasks;
using BepInEx;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ScaryCompany.audio;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.Audio;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ScaryCompany")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+f69faac1182112586c370f50803b57bbbcbf16a9")]
[assembly: AssemblyProduct("ScaryCompany")]
[assembly: AssemblyTitle("ScaryCompany")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
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;
		}
	}
	[CompilerGenerated]
	[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 ScaryCompany
{
	[BepInPlugin("ScaryCompany", "ScaryCompany", "1.0.0")]
	public class ScaryCompany : BaseUnityPlugin
	{
		public static string ModDirectory;

		public static ScaryCompany Instance { get; private set; }

		public static ManualLogSource Logger { get; set; }

		private static Harmony? Harmony { get; set; }

		private void Awake()
		{
			Instance = this;
			Logger = ((BaseUnityPlugin)this).Logger;
			ModDirectory = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			Patch();
			Logger.LogInfo((object)"ScaryCompany loaded successfully.");
		}

		private static void Patch()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0018: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony = new Harmony("ScaryCompany");
			}
			Logger.LogDebug((object)"Patching...");
			Harmony.PatchAll();
			Logger.LogDebug((object)"Finished patching!");
		}

		internal static void Unpatch()
		{
			Logger.LogDebug((object)"Unpatching...");
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			Logger.LogDebug((object)"Finished unpatching!");
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "ScaryCompany";

		public const string PLUGIN_NAME = "ScaryCompany";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace ScaryCompany.Patches
{
	[HarmonyPatch(typeof(BoomboxItem))]
	public class BoomboxPatch
	{
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		public static void OverwriteBoomboxMusic(BoomboxItem __instance)
		{
			__instance.musicAudios = (AudioClip[])(object)new AudioClip[1] { AudioManager.Instance.GetClip(AudioList.Music0) };
		}
	}
	[HarmonyPatch(typeof(EntranceTeleport))]
	public class EntrancePatch
	{
		[HarmonyPatch("TeleportPlayer")]
		[HarmonyPostfix]
		private static void TriggerSoundOnEntry(EntranceTeleport __instance)
		{
			if (__instance.isEntranceToBuilding)
			{
				ScaryCompany.Logger.LogInfo((object)"Player Entered Building.");
				AudioManager.Instance.LoopRandomClip(AudioCategory.Ambience);
			}
			else
			{
				ScaryCompany.Logger.LogInfo((object)"Player Exited Building.");
				AudioManager.Instance.StopAll(AudioCategory.Ambience);
			}
		}
	}
	[HarmonyPatch(typeof(FlashlightItem))]
	public class FlashlightPatch
	{
		private const float FlickerChance = 0.05f;

		private const float FlickerMaxPitchOffset = 0.1f;

		private const float FlickerMinTime = 0.3f;

		private const float FlickerMaxTime = 1.3f;

		private const float FlickerRoutineMinTime = 0.05f;

		private const float FlickerRoutineMaxTime = 0.15f;

		private static readonly HashSet<FlashlightItem> ActiveFlickers = new HashSet<FlashlightItem>();

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void Flicker(FlashlightItem __instance)
		{
			if (((GrabbableObject)__instance).isBeingUsed && !ActiveFlickers.Contains(__instance))
			{
				float num = 0.05f * Time.deltaTime;
				if (!(Random.value >= num))
				{
					float duration = Random.Range(0.3f, 1.3f);
					((MonoBehaviour)__instance).StartCoroutine(FlickerRoutine(__instance, duration));
				}
			}
		}

		private static IEnumerator FlickerRoutine(FlashlightItem flashlight, float duration)
		{
			ActiveFlickers.Add(flashlight);
			AudioManager.Instance.PlayClipRandomPitch(AudioList.Flicker0, 0.1f);
			float waitTime;
			for (float elapsed = 0f; elapsed < duration; elapsed += waitTime)
			{
				((Behaviour)flashlight.flashlightBulb).enabled = !((Behaviour)flashlight.flashlightBulb).enabled;
				float pitchOffset = Random.Range(-0.1f, 0.1f);
				AudioManager.Instance.PlayClipRandomPitch(AudioList.Flicker0, pitchOffset);
				waitTime = Random.Range(0.05f, 0.15f);
				yield return (object)new WaitForSeconds(waitTime);
			}
			((Behaviour)flashlight.flashlightBulb).enabled = true;
			ActiveFlickers.Remove(flashlight);
		}
	}
	[HarmonyPatch(typeof(FlowermanAI))]
	public class FlowermanPatch
	{
		[HarmonyPatch(typeof(FlowermanAI), "Update")]
		[HarmonyPostfix]
		public static void OnStalk(FlowermanAI __instance)
		{
			if (!((Object)(object)AudioManager.Instance == (Object)null) && AudioManager.Instance.IsInitialized)
			{
				PlayerControllerB localPlayerController = GameNetworkManager.Instance.localPlayerController;
				if (((EnemyAI)__instance).currentBehaviourStateIndex == 0 && (Object)(object)((EnemyAI)__instance).targetPlayer == (Object)(object)localPlayerController)
				{
					AudioManager.Instance.FadeIn(AudioList.FlowermanStalk, 1f, 1f, loop: true);
				}
				else
				{
					AudioManager.Instance.FadeOut(AudioList.FlowermanStalk, 3f);
				}
			}
		}
	}
	[HarmonyPatch(typeof(JesterAI))]
	public class JesterPopPatch
	{
		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void EnterChase(JesterAI __instance)
		{
			if (!((Object)(object)__instance == (Object)null))
			{
				if (((EnemyAI)__instance).currentBehaviourStateIndex == 2)
				{
					AudioManager.Instance.PlayClip(AudioList.JesterPop);
					AudioManager.Instance.LoopClip(AudioList.JesterChase);
				}
				else
				{
					AudioManager.Instance.StopClip(AudioList.JesterChase);
				}
			}
		}
	}
	[HarmonyPatch(typeof(PlayerControllerB))]
	public class PlayerPatch
	{
		private const float SoundIntervalSeconds = 20f;

		private const float SoundChance = 0.05f;

		private const float MinDistance = 5f;

		private const float MaxDistance = 20f;

		private const float MaxPitchOffset = 0.2f;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void PlayRandomSounds(PlayerControllerB __instance)
		{
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
			if (__instance.isInsideFactory)
			{
				float num = Time.deltaTime * 0.05f;
				if (!(Random.value >= num))
				{
					ScaryCompany.Logger.LogInfo((object)"Playing random ambience sound");
					float num2 = Random.Range(5f, 20f);
					Vector2 val = new Vector2(Random.value * 2f - 1f, Random.value * 2f - 1f);
					Vector2 val2 = ((Vector2)(ref val)).normalized * num2;
					Vector3 targetPosition = ((Component)__instance).transform.position + new Vector3(val2.x, 0f, val2.y);
					AudioManager.Instance.PlayClipPositioned(AudioCategory.Random, targetPosition, 1.2f);
				}
			}
		}
	}
	[HarmonyPatch(typeof(RoundManager))]
	public class RoundManagerPatch
	{
		private const float DoorIntervalSeconds = 180f;

		private const float DoorChance = 1f / 180f;

		private const float FlickerIntervalSeconds = 20f;

		private const float FlickerChance = 0.05f;

		private const float FlickerMaxPitchOffset = 0.1f;

		private const float FlickerMinTime = 0.7f;

		private const float FlickerMaxTime = 4.5f;

		private const float FlickerRoutineMinTime = 0.05f;

		private const float FlickerRoutineMaxTime = 0.15f;

		private static Coroutine? _activeFlicker;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void DoorSlam(RoundManager __instance)
		{
			//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
			if (!((NetworkBehaviour)__instance).IsServer || !RoundManager.Instance.dungeonCompletedGenerating)
			{
				return;
			}
			float num = 1f / 180f * Time.deltaTime;
			if (Random.value > num)
			{
				return;
			}
			List<PlayerControllerB> players = StartOfRound.Instance.allPlayerScripts.Where((PlayerControllerB player) => Object.op_Implicit((Object)(object)player) && player != null && player.isPlayerControlled && !player.isPlayerDead).ToList();
			if (players.Count == 0)
			{
				return;
			}
			ScaryCompany.Logger.LogInfo((object)"Door slam triggered!");
			DoorLock[] array = Object.FindObjectsOfType<DoorLock>();
			ScaryCompany.Logger.LogInfo((object)("Found " + array.Length + " doors"));
			array = array.Where((DoorLock door) => door.isDoorOpened).ToArray();
			if (array.Length == 0)
			{
				ScaryCompany.Logger.LogInfo((object)"No open doors found!");
				return;
			}
			List<float> list = array.Select((DoorLock door) => players.Select(delegate(PlayerControllerB player)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val2 = ((Component)player).transform.position - ((Component)door).transform.position;
				return ((Vector3)(ref val2)).magnitude;
			}).Prepend(float.MaxValue).Min()).ToList();
			int num2 = list.IndexOf(list.Min());
			DoorLock closestDoor = array[num2];
			PlayerControllerB val = players.OrderBy(delegate(PlayerControllerB player)
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				//IL_001b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0020: Unknown result type (might be due to invalid IL or missing references)
				Vector3 val2 = ((Component)player).transform.position - ((Component)closestDoor).transform.position;
				return ((Vector3)(ref val2)).sqrMagnitude;
			}).First();
			closestDoor.isDoorOpened = false;
			closestDoor.OpenOrCloseDoor(val);
			AudioManager.Instance.PlayClipPositioned(AudioCategory.DoorSlam, ((Component)closestDoor).transform.position);
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void LightFlicker(RoundManager __instance)
		{
			if (((NetworkBehaviour)__instance).IsServer && _activeFlicker == null)
			{
				float num = 0.05f * Time.deltaTime;
				if (!(Random.value >= num))
				{
					ScaryCompany.Logger.LogInfo((object)"Light flicker triggered!");
					float duration = Random.Range(0.7f, 4.5f);
					_activeFlicker = ((MonoBehaviour)__instance).StartCoroutine(FlickerRoutine(__instance, duration));
				}
			}
		}

		private static IEnumerator FlickerRoutine(RoundManager instance, float duration)
		{
			List<Light> poweredLights = instance.allPoweredLights;
			if (poweredLights == null || poweredLights.Count == 0)
			{
				ScaryCompany.Logger.LogInfo((object)"No lights found!");
				_activeFlicker = null;
				yield break;
			}
			List<float> intensities = poweredLights.Select((Light l) => l.intensity).ToList();
			float waitTime;
			for (float elapsed = 0f; elapsed < duration; elapsed += waitTime)
			{
				for (int i = 0; i < poweredLights.Count; i++)
				{
					Light light = poweredLights[i];
					if (Object.op_Implicit((Object)(object)light))
					{
						light.intensity = ((light.intensity > 0f) ? 0f : intensities[i]);
					}
				}
				if (GameNetworkManager.Instance.localPlayerController.isInsideFactory)
				{
					AudioList clip = AudioManager.GetRandomClip(AudioCategory.LightFlicker);
					AudioManager.Instance.PlayClipRandomPitch(clip, 0.1f);
				}
				waitTime = Random.Range(0.05f, 0.15f);
				yield return (object)new WaitForSeconds(waitTime);
			}
			for (int i2 = 0; i2 < poweredLights.Count; i2++)
			{
				if (Object.op_Implicit((Object)(object)poweredLights[i2]))
				{
					poweredLights[i2].intensity = intensities[i2];
				}
			}
			_activeFlicker = null;
		}
	}
	[HarmonyPatch(typeof(StartOfRound))]
	public class StartOfRoundPatch
	{
		[HarmonyPatch("Awake")]
		[HarmonyPostfix]
		public static void SpawnAudioManager()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			if (!((Object)(object)AudioManager.Instance != (Object)null))
			{
				GameObject val = new GameObject("AudioManager");
				val.AddComponent<AudioManager>();
				Object.DontDestroyOnLoad((Object)(object)val);
			}
		}
	}
	[HarmonyPatch(typeof(WalkieTalkie))]
	public class WalkieTalkiePatch
	{
		private const float GhostIntervalSeconds = 120f;

		private const float GhostChance = 1f / 120f;

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		public static void OnGhostNoise(WalkieTalkie __instance)
		{
			if (((GrabbableObject)__instance).isBeingUsed && !(((GrabbableObject)__instance).insertedBattery.charge <= 0f) && !((Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)(object)GameNetworkManager.Instance.localPlayerController))
			{
				float num = 1f / 120f * Time.deltaTime;
				if (!(Random.value > num))
				{
					AudioManager.Instance.PlayClip(AudioList.WalkieNoise);
					AudioManager.Instance.PlayClip(AudioList.WalkieGhost);
				}
			}
		}

		[HarmonyPatch("SwitchWalkieTalkieOn")]
		[HarmonyPostfix]
		public static void OnItemActivate(WalkieTalkie __instance)
		{
			if (!((GrabbableObject)__instance).isBeingUsed)
			{
				AudioManager.Instance.StopClip(AudioList.WalkieNoise);
				AudioManager.Instance.StopClip(AudioList.WalkieGhost);
			}
		}
	}
}
namespace ScaryCompany.audio
{
	public enum AudioCategory
	{
		Ambience,
		Entity,
		Miscellaneous,
		Random,
		Music,
		DoorSlam,
		LightFlicker
	}
	public class AudioList
	{
		private static int _currentIndex;

		public static readonly AudioList Ambience0 = new AudioList("ambience0.mp3", AudioCategory.Ambience, 0.3f, spatial: false);

		public static readonly AudioList Ambience1 = new AudioList("ambience1.mp3", AudioCategory.Ambience, 0.3f, spatial: false);

		public static readonly AudioList JesterChase = new AudioList("jester.mp3", AudioCategory.Entity);

		public static readonly AudioList JesterPop = new AudioList("jester_pop.mp3", AudioCategory.Entity);

		public static readonly AudioList FlowermanStalk = new AudioList("flowerman_stalk.ogg", AudioCategory.Entity, 0.1f, spatial: false);

		public static readonly AudioList FlowermanAnger = new AudioList("flowerman_anger.wav", AudioCategory.Entity);

		public static readonly AudioList Flicker0 = new AudioList("light_flicker0.mp3", AudioCategory.LightFlicker, 1f, spatial: false);

		public static readonly AudioList Flicker1 = new AudioList("light_flicker1.mp3", AudioCategory.LightFlicker, 1f, spatial: false);

		public static readonly AudioList WalkieNoise = new AudioList("radio_noise.wav", AudioCategory.Miscellaneous, 0.3f, spatial: false);

		public static readonly AudioList WalkieGhost = new AudioList("walkie_ghost.wav", AudioCategory.Miscellaneous, 0.1f, spatial: false);

		public static readonly AudioList DoorSlam0 = new AudioList("door_slam0.mp3", AudioCategory.DoorSlam);

		public static readonly AudioList DoorSlam1 = new AudioList("door_slam1.mp3", AudioCategory.DoorSlam);

		public static readonly AudioList Random0 = new AudioList("random0.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Random1 = new AudioList("random1.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Random2 = new AudioList("random2.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Random3 = new AudioList("random3.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Random4 = new AudioList("random4.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Random5 = new AudioList("random5.wav", AudioCategory.Random, 0.3f);

		public static readonly AudioList Music0 = new AudioList("music0.mp3", AudioCategory.Music);

		public string Filename { get; }

		public AudioCategory Category { get; }

		public int Index { get; }

		public float Volume { get; }

		public bool Spatial { get; }

		public static AudioList[] Values => new AudioList[19]
		{
			Ambience0, Ambience1, JesterChase, JesterPop, FlowermanStalk, FlowermanAnger, Flicker0, Flicker1, WalkieNoise, WalkieGhost,
			DoorSlam0, DoorSlam1, Random0, Random1, Random2, Random3, Random4, Random5, Music0
		};

		private AudioList(string filename, AudioCategory category, float volume = 1f, bool spatial = true)
		{
			Filename = filename;
			Category = category;
			Volume = volume;
			Spatial = spatial;
			Index = _currentIndex;
			_currentIndex++;
		}

		public override string ToString()
		{
			return Filename;
		}
	}
	[RequireComponent(typeof(AudioManager))]
	public class AudioManager : MonoBehaviour
	{
		private const float MinSoundDistance = 0.1f;

		private const float MaxSoundDistance = 50f;

		private const float DefaultPitch = 1f;

		public static AudioManager Instance;

		private readonly Dictionary<int, Coroutine> _activeFades = new Dictionary<int, Coroutine>();

		private AudioSource[] _audioSources = null;

		private GameObject[] _objects = null;

		public bool IsInitialized { get; private set; }

		private async void Awake()
		{
			Instance = this;
			ScaryCompany.Logger.LogInfo((object)"AudioManager: Awake starting...");
			try
			{
				AudioList[] audioData = AudioList.Values;
				_objects = (GameObject[])(object)new GameObject[audioData.Length];
				_audioSources = (AudioSource[])(object)new AudioSource[audioData.Length];
				ScaryCompany.Logger.LogInfo((object)$"AudioManager: Array initialized with size {audioData.Length}");
				for (int i = 0; i < audioData.Length; i++)
				{
					AudioList info = audioData[i];
					string path = Path.Combine(ScaryCompany.ModDirectory, info.Filename);
					ScaryCompany.Logger.LogInfo((object)("AudioManager: Awaiting load for " + info.Filename + "..."));
					AudioClip clip = await SoundLoader.LoadAudio(path);
					if ((Object)(object)clip != (Object)null)
					{
						GameObject newObject = new GameObject(info.Filename);
						_objects[i] = newObject;
						AudioSource newSource = newObject.AddComponent<AudioSource>();
						if ((Object)(object)newSource == (Object)null)
						{
							ScaryCompany.Logger.LogError((object)"AudioManager: Unity failed to AddComponent<AudioSource>!");
							continue;
						}
						newSource.clip = clip;
						newSource.playOnAwake = false;
						newSource.volume = info.Volume;
						newSource.spatialize = false;
						newSource.spatialBlend = (info.Spatial ? 1f : 0f);
						newSource.spread = (info.Spatial ? 0f : 360f);
						newSource.rolloffMode = (AudioRolloffMode)1;
						newSource.minDistance = 0.1f;
						newSource.maxDistance = 50f;
						AudioMixerGroup mixerGroup = (info.Spatial ? SoundManager.Instance.diageticMixer.outputAudioMixerGroup : SoundManager.Instance.ambienceAudioNonDiagetic.outputAudioMixerGroup);
						newSource.outputAudioMixerGroup = mixerGroup;
						_audioSources[i] = newSource;
						ScaryCompany.Logger.LogInfo((object)$"AudioManager: Slot {i} finalized for {info.Filename}");
					}
					else
					{
						ScaryCompany.Logger.LogWarning((object)$"AudioManager: Failed to get clip for {info.Filename}, skipping slot {i}");
					}
				}
				IsInitialized = true;
				ScaryCompany.Logger.LogInfo((object)"AudioManager: Initialization complete.");
			}
			catch (Exception ex)
			{
				Exception e = ex;
				ScaryCompany.Logger.LogError((object)$"AudioManager: Fatal error in Awake loop: {e}");
			}
		}

		private void PlayClip(AudioList clip, float pitch, bool loop, Vector3? position = null)
		{
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			if (_audioSources == null)
			{
				throw new NullReferenceException("_audioSources");
			}
			if (_audioSources[clip.Index].isPlaying)
			{
				return;
			}
			pitch = Mathf.Clamp(pitch, 0f, 2f);
			AudioSource val = _audioSources[clip.Index];
			val.pitch = pitch;
			val.loop = loop;
			if (position.HasValue)
			{
				if (!clip.Spatial)
				{
					ScaryCompany.Logger.LogWarning((object)"AudioManager: Playing a positioned, non-spatial sound!");
				}
				((Component)val).gameObject.transform.position = position.Value;
			}
			ScaryCompany.Logger.LogInfo((object)("Playing clip: " + clip.Filename + " at pitch: " + pitch + " loop: " + loop));
			val.Play();
		}

		public void PlayClip(AudioList clip, float pitch)
		{
			PlayClip(clip, pitch, loop: false);
		}

		public void PlayClipRandomPitch(AudioList clip, float maxPitchOffset)
		{
			float num = 1f - Random.Range(0f - maxPitchOffset, maxPitchOffset);
			num = Mathf.Clamp(num, 0f, 2f);
			PlayClip(clip, num, loop: false);
		}

		public void PlayClip(AudioList clip)
		{
			PlayClip(clip, 1f, loop: false);
		}

		public void LoopClip(AudioList clip, float pitch)
		{
			PlayClip(clip, pitch, loop: true);
		}

		public void LoopClip(AudioList clip)
		{
			PlayClip(clip, 1f, loop: true);
		}

		public void LoopRandomClip(AudioCategory category, float pitch)
		{
			AudioList[] array = AudioList.Values.Where((AudioList entry) => entry.Category == category).ToArray();
			if (array.Length != 0)
			{
				AudioList clip = array[Random.Range(0, array.Length)];
				PlayClip(clip, pitch, loop: true);
			}
		}

		public void LoopRandomClip(AudioCategory category)
		{
			LoopRandomClip(category, 1f);
		}

		public void StopClip(AudioList clip)
		{
			if (_audioSources == null)
			{
				throw new NullReferenceException("_audioSources");
			}
			if (_audioSources[clip.Index].isPlaying)
			{
				_audioSources[clip.Index].Stop();
			}
		}

		public void StopAll()
		{
			if (_audioSources == null)
			{
				throw new NullReferenceException("_audioSources");
			}
			AudioList[] values = AudioList.Values;
			foreach (AudioList clip in values)
			{
				StopClip(clip);
			}
		}

		public void StopAll(AudioCategory category)
		{
			if (_audioSources == null)
			{
				throw new NullReferenceException("_audioSources");
			}
			AudioList[] array = AudioList.Values.Where((AudioList entry) => entry.Category == category).ToArray();
			AudioList[] array2 = array;
			foreach (AudioList clip in array2)
			{
				StopClip(clip);
			}
		}

		public AudioClip GetClip(AudioList clip)
		{
			if (_audioSources != null)
			{
				return _audioSources[clip.Index].clip;
			}
			throw new NullReferenceException("_audioSources");
		}

		public void PlayClipPositioned(AudioCategory category, Vector3 targetPosition, float pitch = 1f)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			if (_audioSources == null)
			{
				throw new NullReferenceException("_audioSources");
			}
			AudioList randomClip = GetRandomClip(category);
			PlayClip(randomClip, pitch, loop: false, targetPosition);
		}

		public void FadeOut(AudioList clip, float duration)
		{
			int index = clip.Index;
			if (_audioSources[index].isPlaying)
			{
				if (_activeFades.ContainsKey(index))
				{
					((MonoBehaviour)this).StopCoroutine(_activeFades[index]);
					_activeFades.Remove(index);
				}
				_activeFades[index] = ((MonoBehaviour)this).StartCoroutine(FadeRoutine(_audioSources[index], 0f, duration, stopAtEnd: true, index));
			}
		}

		public void FadeIn(AudioList clip, float duration, float pitch = 1f, bool loop = false)
		{
			int index = clip.Index;
			AudioSource val = _audioSources[index];
			if (!val.isPlaying)
			{
				val.volume = 0f;
				val.pitch = pitch;
				val.loop = loop;
				val.Play();
			}
			if (_activeFades.ContainsKey(index))
			{
				((MonoBehaviour)this).StopCoroutine(_activeFades[index]);
				_activeFades.Remove(index);
			}
			_activeFades[index] = ((MonoBehaviour)this).StartCoroutine(FadeRoutine(val, clip.Volume, duration, stopAtEnd: false, index));
		}

		private IEnumerator FadeRoutine(AudioSource source, float targetVolume, float duration, bool stopAtEnd, int index)
		{
			float startVolume = source.volume;
			float elapsed = 0f;
			while (elapsed < duration)
			{
				elapsed += Time.deltaTime;
				source.volume = Mathf.Lerp(startVolume, targetVolume, elapsed / duration);
				yield return null;
			}
			source.volume = targetVolume;
			if (stopAtEnd && targetVolume <= 0f)
			{
				source.Stop();
			}
			_activeFades.Remove(index);
		}

		public static AudioList GetRandomClip(AudioCategory category)
		{
			AudioList[] array = AudioList.Values.Where((AudioList entry) => entry.Category == category).ToArray();
			if (array.Length != 0)
			{
				return array[Random.Range(0, array.Length)];
			}
			throw new InvalidOperationException($"No clips found for category {category}");
		}
	}
	public static class SoundLoader
	{
		public static async Task<AudioClip> LoadAudio(string path)
		{
			ScaryCompany.Logger.LogInfo((object)("[SoundLoader] Loading " + path));
			string uri = "file:///" + path.Replace("\\", "/");
			UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(uri, GetAudioType(path));
			try
			{
				UnityWebRequestAsyncOperation operation = request.SendWebRequest();
				while (!((AsyncOperation)operation).isDone)
				{
					await Task.Yield();
				}
				if ((int)request.result != 1)
				{
					ScaryCompany.Logger.LogError((object)("[SoundLoader] Failed: " + request.error));
					return null;
				}
				AudioClip clip = DownloadHandlerAudioClip.GetContent(request);
				((Object)clip).name = Path.GetFileName(path);
				return clip;
			}
			finally
			{
				((IDisposable)request)?.Dispose();
			}
		}

		private static AudioType GetAudioType(string path)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			string text = Path.GetExtension(path).ToLower();
			if (1 == 0)
			{
			}
			AudioType result = (AudioType)(text switch
			{
				".wav" => 20, 
				".ogg" => 14, 
				".mp3" => 13, 
				_ => 0, 
			});
			if (1 == 0)
			{
			}
			return result;
		}
	}
}