Decompiled source of REPO SOUNDBOARD v1.5.1

sonic.dll

Decompiled 12 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.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using MenuLib.Structs;
using MonoMod.RuntimeDetour;
using TMPro;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("sonic")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("sonic")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("98f6da0c-f28e-4d99-a81d-92f0e99ae946")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SingularitySoundboard;

[BepInPlugin("com.soundboard", "Soundboard", "1.0.0")]
[BepInDependency("nickklmao.menulib", "2.5.0")]
public class SoundboardPlugin : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static BuilderDelegate <>9__27_0;

		public static Func<PlayerAvatar, bool> <>9__32_0;

		public static Func<PlayerAvatar, bool> <>9__37_0;

		public static Func<Transform, bool> <>9__38_0;

		public static Func<Transform, float> <>9__38_1;

		public static Action<float> <>9__40_4;

		public static ScrollViewBuilderDelegate <>9__40_0;

		public static Action<float> <>9__40_5;

		public static ScrollViewBuilderDelegate <>9__40_1;

		public static Action<float> <>9__40_6;

		public static ScrollViewBuilderDelegate <>9__40_2;

		public static Func<PlayerAvatar, bool> <>9__40_8;

		public static Action<bool> <>9__40_7;

		public static ScrollViewBuilderDelegate <>9__40_3;

		public static ScrollViewBuilderDelegate <>9__42_0;

		public static ScrollViewBuilderDelegate <>9__42_1;

		public static Action<string> <>9__45_2;

		public static ScrollViewBuilderDelegate <>9__45_0;

		internal void <Awake>b__27_0(Transform parent)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, parent, new Vector2(126f, 86f));
		}

		internal bool <PlayAudioClip>b__32_0(PlayerAvatar p)
		{
			return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine;
		}

		internal bool <StopPlayback>b__37_0(PlayerAvatar p)
		{
			return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine;
		}

		internal bool <MenuPageMain_StartHook>b__38_0(Transform t)
		{
			return ((Object)t).name.Contains("Menu Button");
		}

		internal float <MenuPageMain_StartHook>b__38_1(Transform t)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			return t.localPosition.y;
		}

		internal RectTransform <AddGlobalControls>b__40_0(Transform scrollView)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOSlider("Volume", "Loudness", (Action<float>)delegate(float v)
			{
				CurrentVolume = v;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.volume = v;
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0f, 2f, 1, CurrentVolume, "", "", (BarBehavior)0)).rectTransform;
		}

		internal void <AddGlobalControls>b__40_4(float v)
		{
			CurrentVolume = v;
			if ((Object)(object)_localHearSelfSource != (Object)null)
			{
				_localHearSelfSource.volume = v;
			}
			Instance.SaveConfig();
		}

		internal RectTransform <AddGlobalControls>b__40_1(Transform scrollView)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOSlider("Pitch", "Deepness", (Action<float>)delegate(float p)
			{
				CurrentPitch = p;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.pitch = p;
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0.1f, 3f, 1, CurrentPitch, "", "", (BarBehavior)0)).rectTransform;
		}

		internal void <AddGlobalControls>b__40_5(float p)
		{
			CurrentPitch = p;
			if ((Object)(object)_localHearSelfSource != (Object)null)
			{
				_localHearSelfSource.pitch = p;
			}
			Instance.SaveConfig();
		}

		internal RectTransform <AddGlobalControls>b__40_2(Transform scrollView)
		{
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOSlider("Bass", "Thick", (Action<float>)delegate(float b)
			{
				CurrentBass = b;
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0f, 1f, 1, CurrentBass, "", "", (BarBehavior)0)).rectTransform;
		}

		internal void <AddGlobalControls>b__40_6(float b)
		{
			CurrentBass = b;
			Instance.SaveConfig();
		}

		internal RectTransform <AddGlobalControls>b__40_3(Transform scrollView)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOToggle("Loop Mode", (Action<bool>)delegate(bool l)
			{
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Expected O, but got Unknown
				IsLooping = l;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.loop = l;
				}
				PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine));
				if ((Object)(object)val != (Object)null)
				{
					object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
					if (obj != null)
					{
						AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj);
						if ((Object)(object)val2 != (Object)null)
						{
							val2.loop = l;
						}
					}
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, "ON", "OFF", IsLooping)).rectTransform;
		}

		internal void <AddGlobalControls>b__40_7(bool l)
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bf: Expected O, but got Unknown
			IsLooping = l;
			if ((Object)(object)_localHearSelfSource != (Object)null)
			{
				_localHearSelfSource.loop = l;
			}
			PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine));
			if ((Object)(object)val != (Object)null)
			{
				object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
				if (obj != null)
				{
					AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj);
					if ((Object)(object)val2 != (Object)null)
					{
						val2.loop = l;
					}
				}
			}
			Instance.SaveConfig();
		}

		internal bool <AddGlobalControls>b__40_8(PlayerAvatar p)
		{
			return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine;
		}

		internal RectTransform <ToggleQuickMenu>b__42_0(Transform scrollView)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOButton("\ud83d\udd04 REFRESH LAYOUT", (Action)RefreshQuickLayout, scrollView, Vector2.zero)).rectTransform;
		}

		internal RectTransform <ToggleQuickMenu>b__42_1(Transform scrollView)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			return ((REPOElement)MenuAPI.CreateREPOButton("STOP ALL", (Action)StopPlayback, scrollView, Vector2.zero)).rectTransform;
		}

		internal RectTransform <OpenFolder>b__45_0(Transform scrollView)
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			REPOInputField val2 = MenuAPI.CreateREPOInputField("SEARCH SFX", (Action<string>)delegate(string val)
			{
				currentSearchFilter = val.ToLower().Trim();
			}, scrollView, Vector2.zero, false, "Type here...", currentSearchFilter);
			return ((REPOElement)val2).rectTransform;
		}

		internal void <OpenFolder>b__45_2(string val)
		{
			currentSearchFilter = val.ToLower().Trim();
		}
	}

	[CompilerGenerated]
	private sealed class <MonitorPlayback>d__36 : IEnumerator<object>, IDisposable, IEnumerator
	{
		private int <>1__state;

		private object <>2__current;

		public AudioSource source;

		public AudioClip clip;

		public object recorder;

		private float <pitchedDuration>5__1;

		private Type <recType>5__2;

		private AudioClip <baked>5__3;

		object IEnumerator<object>.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		object IEnumerator.Current
		{
			[DebuggerHidden]
			get
			{
				return <>2__current;
			}
		}

		[DebuggerHidden]
		public <MonitorPlayback>d__36(int <>1__state)
		{
			this.<>1__state = <>1__state;
		}

		[DebuggerHidden]
		void IDisposable.Dispose()
		{
			<recType>5__2 = null;
			<baked>5__3 = null;
			<>1__state = -2;
		}

		private bool MoveNext()
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_012e: Expected O, but got Unknown
			switch (<>1__state)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<pitchedDuration>5__1 = clip.length / Mathf.Max(0.1f, CurrentPitch);
				break;
			case 1:
				<>1__state = -1;
				if (IsLooping && IsPlayingSound)
				{
					if (recorder != null)
					{
						<recType>5__2 = recorder.GetType();
						<recType>5__2.GetMethod("StopRecording")?.Invoke(recorder, null);
						AccessTools.Property(<recType>5__2, "SourceType").SetValue(recorder, 0);
						AccessTools.Property(<recType>5__2, "SourceType").SetValue(recorder, 1);
						<baked>5__3 = (AudioClip)AccessTools.Property(<recType>5__2, "AudioClip").GetValue(recorder);
						AccessTools.Property(<recType>5__2, "AudioClip").SetValue(recorder, <baked>5__3);
						<recType>5__2.GetMethod("StartRecording")?.Invoke(recorder, null);
						<recType>5__2 = null;
						<baked>5__3 = null;
					}
					break;
				}
				StopPlayback();
				return false;
			}
			if (IsPlayingSound)
			{
				<>2__current = (object)new WaitForSeconds(<pitchedDuration>5__1);
				<>1__state = 1;
				return true;
			}
			return false;
		}

		bool IEnumerator.MoveNext()
		{
			//ILSpy generated this explicit interface implementation from .override directive in MoveNext
			return this.MoveNext();
		}

		[DebuggerHidden]
		void IEnumerator.Reset()
		{
			throw new NotSupportedException();
		}
	}

	private static Dictionary<string, AssetBundle> _loadedBundles = new Dictionary<string, AssetBundle>();

	public static float CurrentBass = 0f;

	private static ConfigEntry<float> configBass;

	public static bool IsPlayingSound = false;

	public static float CurrentVolume = 1f;

	public static float CurrentPitch = 1f;

	public static bool IsLooping = false;

	private static string currentSearchFilter = "";

	private static float _currentClipLength = 0f;

	private static AudioSource _localHearSelfSource;

	private static REPOPopupPage _quickMenuPage;

	private static List<string> quickBoardSounds = new List<string>();

	private static List<string> favouriteSounds = new List<string>();

	private static List<string> repoSounds = new List<string>();

	private static List<string> memeSounds = new List<string>();

	private static List<string> otherSounds = new List<string>();

	private static List<string> myInstantsSounds = new List<string>();

	private static List<string> musicSounds = new List<string>();

	private static ConfigEntry<string> configQuickBoard;

	private static ConfigEntry<float> configVolume;

	private static ConfigEntry<float> configPitch;

	private static ConfigEntry<bool> configLoop;

	private static ConfigEntry<string> configFavourites;

	public static SoundboardPlugin Instance { get; private set; }

	private void Awake()
	{
		//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
		//IL_03f9: Expected O, but got Unknown
		//IL_03ae: Unknown result type (might be due to invalid IL or missing references)
		Instance = this;
		configVolume = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "Volume", 1f, "Default volume for soundboard.");
		configPitch = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "Pitch", 1f, "Default pitch for soundboard.");
		configLoop = ((BaseUnityPlugin)this).Config.Bind<bool>("Soundboard", "Loop", false, "Toggle if sounds should loop by default.");
		configFavourites = ((BaseUnityPlugin)this).Config.Bind<string>("Soundboard", "Favourites", "", "Comma-separated list of favourited sound names.");
		configQuickBoard = ((BaseUnityPlugin)this).Config.Bind<string>("Soundboard", "QuickBoard", "", "Sounds to show on screen.");
		configBass = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "BassBoost", 0f, "Default bass boost for soundboard.");
		CurrentBass = configBass.Value;
		if (!string.IsNullOrEmpty(configQuickBoard.Value))
		{
			quickBoardSounds = configQuickBoard.Value.Split(new char[1] { ',' }).ToList();
		}
		CurrentVolume = configVolume.Value;
		CurrentPitch = configPitch.Value;
		IsLooping = configLoop.Value;
		if (!string.IsNullOrEmpty(configFavourites.Value))
		{
			favouriteSounds = configFavourites.Value.Split(new char[1] { ',' }).ToList();
		}
		string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
		string[] files = Directory.GetFiles(directoryName);
		if (files.Length != 0)
		{
			string[] array = files;
			foreach (string text in array)
			{
				string text2 = Path.GetFileName(text).ToLower();
				if (text2.EndsWith(".dll") || text2.EndsWith(".repobundle") || text2.EndsWith(".hhh") || text2.EndsWith(".md") || text2.EndsWith(".png") || text2.EndsWith(".bundle") || text2.EndsWith(".ini") || text2.EndsWith(".json"))
				{
					continue;
				}
				AssetBundle val = AssetBundle.LoadFromFile(text);
				if (!((Object)(object)val != (Object)null))
				{
					continue;
				}
				string[] allAssetNames = val.GetAllAssetNames();
				foreach (string path in allAssetNames)
				{
					_loadedBundles[Path.GetFileNameWithoutExtension(path).ToUpper()] = val;
					string text3 = Path.GetFileNameWithoutExtension(path).ToUpper();
					if (text3.Contains("MYINSTANT") || text3.Contains("INSTANT"))
					{
						myInstantsSounds.Add(text3);
					}
					else if (text3.Contains("REPO") || text3.Contains("R E P O"))
					{
						repoSounds.Add(text3);
					}
					else if (text3.Contains("MEME"))
					{
						memeSounds.Add(text3);
					}
					else if (text3.StartsWith("MUSIC"))
					{
						musicSounds.Add(text3);
					}
					else
					{
						otherSounds.Add(text3);
					}
				}
			}
		}
		try
		{
			new Hook((MethodBase)AccessTools.Method(typeof(MenuPageMain), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageMain>, MenuPageMain>(MenuPageMain_StartHook));
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)("Menu hook failed: " + ex.Message));
		}
		object obj = <>c.<>9__27_0;
		if (obj == null)
		{
			BuilderDelegate val2 = delegate(Transform parent)
			{
				//IL_001d: Unknown result type (might be due to invalid IL or missing references)
				MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, parent, new Vector2(126f, 86f));
			};
			<>c.<>9__27_0 = val2;
			obj = (object)val2;
		}
		MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj);
		Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Singularity Soundboard loaded!");
	}

	private void Update()
	{
		if (Input.GetKeyDown((KeyCode)121))
		{
			ToggleQuickMenu();
		}
	}

	private void SaveConfig()
	{
		configVolume.Value = CurrentVolume;
		configPitch.Value = CurrentPitch;
		configLoop.Value = IsLooping;
		configFavourites.Value = string.Join(",", favouriteSounds);
		configQuickBoard.Value = string.Join(",", quickBoardSounds);
	}

	[HarmonyPatch(typeof(PlayerVoiceChat), "Update")]
	[HarmonyPrefix]
	private static void VoiceChatUpdatePrefix(object __instance)
	{
		//IL_0089: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Expected O, but got Unknown
		if (!IsPlayingSound || __instance == null)
		{
			return;
		}
		object value = AccessTools.Field(typeof(PlayerVoiceChat), "photonView").GetValue(__instance);
		if (value == null || !(bool)AccessTools.Property(value.GetType(), "IsMine").GetValue(value))
		{
			return;
		}
		AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance);
		if ((Object)(object)val != (Object)null)
		{
			val.pitch = CurrentPitch;
			val.loop = IsLooping;
		}
		object value2 = AccessTools.Field(typeof(PlayerVoiceChat), "recorder").GetValue(__instance);
		if (value2 != null)
		{
			Type type = value2.GetType();
			PropertyInfo property = type.GetProperty("Pitch");
			if (property != null)
			{
				property.SetValue(value2, CurrentPitch);
			}
			AccessTools.Property(type, "TransmitEnabled").SetValue(value2, true);
		}
		AccessTools.Field(typeof(PlayerVoiceChat), "isTalking").SetValue(__instance, true);
		AccessTools.Field(typeof(PlayerVoiceChat), "overrideMuteTimer").SetValue(__instance, 1f);
	}

	[HarmonyPatch(typeof(PlayerVoiceChat), "LateUpdate")]
	[HarmonyPostfix]
	private static void VoiceChatLateUpdatePostfix(object __instance)
	{
		//IL_00c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c7: Expected O, but got Unknown
		if (!IsPlayingSound || __instance == null)
		{
			return;
		}
		object value = AccessTools.Field(typeof(PlayerVoiceChat), "photonView").GetValue(__instance);
		if (value != null && (bool)AccessTools.Property(value.GetType(), "IsMine").GetValue(value))
		{
			object value2 = AccessTools.Field(typeof(PlayerVoiceChat), "playerAvatar").GetValue(__instance);
			bool flag = (bool)AccessTools.Property(value2.GetType(), "isDisabled").GetValue(value2);
			AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance);
			if ((Object)(object)val != (Object)null && val.isPlaying && flag)
			{
				val.volume = 0.5f;
			}
		}
	}

	public static void PlayAudioClip(AudioClip clip)
	{
		//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Expected O, but got Unknown
		if ((Object)(object)clip == (Object)null)
		{
			return;
		}
		PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine));
		if ((Object)(object)val == (Object)null)
		{
			return;
		}
		object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
		if (obj == null)
		{
			return;
		}
		AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj);
		object value = AccessTools.Field(typeof(PlayerVoiceChat), "recorder").GetValue(obj);
		if (!((Object)(object)val2 == (Object)null) && value != null)
		{
			StopPlayback();
			AudioClip clip2 = CreatePitchedAndResampledClip(clip, CurrentPitch, clip.frequency);
			AudioClip value2 = CreatePitchedAndResampledClip(clip, CurrentPitch, 48000);
			val2.Stop();
			val2.clip = clip2;
			val2.loop = IsLooping;
			val2.pitch = 1f;
			val2.spatialBlend = 0f;
			val2.Play();
			Type type = value.GetType();
			type.GetMethod("StopRecording")?.Invoke(value, null);
			AccessTools.Property(type, "SourceType").SetValue(value, 1);
			AccessTools.Property(type, "AudioClip").SetValue(value, value2);
			AccessTools.Property(type, "SamplingRate").SetValue(value, 48000);
			AccessTools.Property(type, "TransmitEnabled").SetValue(value, true);
			PropertyInfo property = type.GetProperty("Loop");
			if (property != null)
			{
				property.SetValue(value, IsLooping);
			}
			type.GetMethod("StartRecording")?.Invoke(value, null);
			SetupLocalSource(val);
			if ((Object)(object)_localHearSelfSource != (Object)null)
			{
				_localHearSelfSource.clip = clip2;
				_localHearSelfSource.pitch = 1f;
				_localHearSelfSource.volume = CurrentVolume;
				_localHearSelfSource.loop = IsLooping;
				_localHearSelfSource.Play();
			}
			IsPlayingSound = true;
			((MonoBehaviour)Instance).StartCoroutine(MonitorPlayback(val2, clip2, value));
		}
	}

	private static AudioClip CreatePitchedAndResampledClip(AudioClip input, float pitch, int targetFreq)
	{
		float[] array = new float[input.samples * input.channels];
		input.GetData(array, 0);
		int num = Mathf.RoundToInt((float)input.samples * ((float)targetFreq / (float)input.frequency) / pitch);
		float[] array2 = new float[num];
		float num2 = 0f;
		float num3 = 0f;
		float num4 = 0f;
		float num5 = 0f;
		float num6 = 100f;
		float num7 = 0.8f;
		float num8 = CurrentBass * 30f;
		float num9 = Mathf.Pow(10f, num8 / 40f);
		float num10 = (float)Math.PI * 2f * num6 / (float)targetFreq;
		float num11 = Mathf.Sin(num10);
		float num12 = Mathf.Cos(num10);
		float num13 = num11 / (2f * num7);
		float num14 = Mathf.Sqrt(num9) * 2f * num13;
		float num15 = num9 * (num9 + 1f - (num9 - 1f) * num12 + num14);
		float num16 = 2f * num9 * (num9 - 1f - (num9 + 1f) * num12);
		float num17 = num9 * (num9 + 1f - (num9 - 1f) * num12 - num14);
		float num18 = num9 + 1f + (num9 - 1f) * num12 + num14;
		float num19 = -2f * (num9 - 1f + (num9 + 1f) * num12);
		float num20 = num9 + 1f + (num9 - 1f) * num12 - num14;
		for (int i = 0; i < num; i++)
		{
			float num21 = (float)i * ((float)input.frequency / (float)targetFreq) * pitch;
			int num22 = (int)num21;
			int num23 = num22 + 1;
			float num24 = 0f;
			if (num22 < input.samples - 1)
			{
				float num25 = num21 - (float)num22;
				num24 = ((input.channels != 2) ? Mathf.Lerp(array[num22], array[num23], num25) : ((Mathf.Lerp(array[num22 * 2], array[num23 * 2], num25) + Mathf.Lerp(array[num22 * 2 + 1], array[num23 * 2 + 1], num25)) / 2f));
			}
			float num26 = num15 / num18 * num24 + num16 / num18 * num2 + num17 / num18 * num3 - num19 / num18 * num4 - num20 / num18 * num5;
			num3 = num2;
			num2 = num24;
			num5 = num4;
			num4 = num26;
			float num27 = (float)Math.Tanh(num26 * 0.9f);
			array2[i] = num27;
		}
		AudioClip val = AudioClip.Create(((Object)input).name + "_MegaBass", num, 1, targetFreq, false);
		val.SetData(array2, 0);
		return val;
	}

	private static AudioClip MakeMono(AudioClip stereoClip)
	{
		if (stereoClip.channels == 1)
		{
			return stereoClip;
		}
		float[] array = new float[stereoClip.samples * stereoClip.channels];
		stereoClip.GetData(array, 0);
		float[] array2 = new float[stereoClip.samples];
		for (int i = 0; i < array2.Length; i++)
		{
			array2[i] = (array[i * 2] + array[i * 2 + 1]) / 2f;
		}
		AudioClip val = AudioClip.Create(((Object)stereoClip).name + "_Mono", stereoClip.samples, 1, stereoClip.frequency, false);
		val.SetData(array2, 0);
		return val;
	}

	private static void SetupLocalSource(PlayerAvatar player)
	{
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Expected O, but got Unknown
		if (!((Object)(object)_localHearSelfSource != (Object)null) || !((Object)(object)((Component)_localHearSelfSource).transform.parent == (Object)(object)((Component)player).transform))
		{
			if ((Object)(object)_localHearSelfSource != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)_localHearSelfSource).gameObject);
			}
			GameObject val = new GameObject("SoundboardLocalOnly");
			val.transform.SetParent(((Component)player).transform, false);
			_localHearSelfSource = val.AddComponent<AudioSource>();
			_localHearSelfSource.spatialBlend = 0f;
			_localHearSelfSource.playOnAwake = false;
			_localHearSelfSource.volume = CurrentVolume;
			_localHearSelfSource.outputAudioMixerGroup = null;
		}
	}

	[IteratorStateMachine(typeof(<MonitorPlayback>d__36))]
	private static IEnumerator MonitorPlayback(AudioSource source, AudioClip clip, object recorder)
	{
		//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
		return new <MonitorPlayback>d__36(0)
		{
			source = source,
			clip = clip,
			recorder = recorder
		};
	}

	public static void StopPlayback()
	{
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Expected O, but got Unknown
		if ((Object)(object)_localHearSelfSource != (Object)null)
		{
			_localHearSelfSource.Stop();
		}
		PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine));
		if ((Object)(object)val != (Object)null)
		{
			object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val);
			AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj);
			if ((Object)(object)val2 != (Object)null)
			{
				val2.Stop();
			}
		}
		IsPlayingSound = false;
		((MonoBehaviour)Instance).StopAllCoroutines();
	}

	private static void MenuPageMain_StartHook(Action<MenuPageMain> orig, MenuPageMain self)
	{
		//IL_0022: 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)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		REPOButton val = MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, ((Component)self).transform, new Vector2(48.3f, 0f));
		List<Transform> list = (from Transform t in (IEnumerable)((Component)self).transform
			where ((Object)t).name.Contains("Menu Button")
			orderby t.localPosition.y descending
			select t).ToList();
		list.Insert(list.Count - 1, ((Component)val).transform);
		float num = 224f;
		foreach (Transform item in list)
		{
			item.localPosition = new Vector3(item.localPosition.x, num, item.localPosition.z);
			num -= 30f;
		}
		orig(self);
	}

	internal static void CreateSoundboardMenu()
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0181: Expected O, but got Unknown
		//IL_018f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0199: Expected O, but got Unknown
		REPOPopupPage soundboardPage = MenuAPI.CreateREPOPopupPage("SOUNDBOARD", (PresetSide)0, false, true, 0f);
		soundboardPage.scrollView.scrollSpeed = 3f;
		soundboardPage.maskPadding = new Padding(0f, 35f, 0f, 25f);
		AddGlobalControls(soundboardPage);
		if (favouriteSounds.Count > 0)
		{
			AddCategory(soundboardPage, "FAVOURITES", favouriteSounds, isFavourite: true);
		}
		if (repoSounds.Count > 0)
		{
			AddCategory(soundboardPage, "REPO SFX", repoSounds);
		}
		if (memeSounds.Count > 0)
		{
			AddCategory(soundboardPage, "MEMES", memeSounds);
		}
		if (myInstantsSounds.Count > 0)
		{
			AddCategory(soundboardPage, "MYINSTANTS", myInstantsSounds);
		}
		if (otherSounds.Count > 0)
		{
			AddCategory(soundboardPage, "OTHER", otherSounds);
		}
		if (musicSounds.Count > 0)
		{
			AddCategory(soundboardPage, "MUSIC", musicSounds);
		}
		soundboardPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Show On Screen", (Action)delegate
		{
			soundboardPage.ClosePage(true);
			ToggleQuickMenu();
		}, scrollView, Vector2.zero)).rectTransform), 0f, 0f);
		soundboardPage.AddElement((BuilderDelegate)delegate(Transform p)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			MenuAPI.CreateREPOButton("Back", (Action)delegate
			{
				soundboardPage.ClosePage(true);
			}, p, new Vector2(66f, 18f));
		});
		soundboardPage.OpenPage(false);
	}

	private static void AddGlobalControls(REPOPopupPage page)
	{
		//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_0021: Expected O, but got Unknown
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Expected O, but got Unknown
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Expected O, but got Unknown
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Expected O, but got Unknown
		object obj = <>c.<>9__40_0;
		if (obj == null)
		{
			ScrollViewBuilderDelegate val = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Volume", "Loudness", (Action<float>)delegate(float v)
			{
				CurrentVolume = v;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.volume = v;
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0f, 2f, 1, CurrentVolume, "", "", (BarBehavior)0)).rectTransform;
			<>c.<>9__40_0 = val;
			obj = (object)val;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
		object obj2 = <>c.<>9__40_1;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Pitch", "Deepness", (Action<float>)delegate(float p)
			{
				CurrentPitch = p;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.pitch = p;
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0.1f, 3f, 1, CurrentPitch, "", "", (BarBehavior)0)).rectTransform;
			<>c.<>9__40_1 = val2;
			obj2 = (object)val2;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f);
		object obj3 = <>c.<>9__40_2;
		if (obj3 == null)
		{
			ScrollViewBuilderDelegate val3 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Bass", "Thick", (Action<float>)delegate(float b)
			{
				CurrentBass = b;
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, 0f, 1f, 1, CurrentBass, "", "", (BarBehavior)0)).rectTransform;
			<>c.<>9__40_2 = val3;
			obj3 = (object)val3;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj3, 0f, 0f);
		object obj4 = <>c.<>9__40_3;
		if (obj4 == null)
		{
			ScrollViewBuilderDelegate val4 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOToggle("Loop Mode", (Action<bool>)delegate(bool l)
			{
				//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bf: Expected O, but got Unknown
				IsLooping = l;
				if ((Object)(object)_localHearSelfSource != (Object)null)
				{
					_localHearSelfSource.loop = l;
				}
				PlayerAvatar val5 = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine));
				if ((Object)(object)val5 != (Object)null)
				{
					object obj5 = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val5);
					if (obj5 != null)
					{
						AudioSource val6 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj5);
						if ((Object)(object)val6 != (Object)null)
						{
							val6.loop = l;
						}
					}
				}
				Instance.SaveConfig();
			}, scrollView, Vector2.zero, "ON", "OFF", IsLooping)).rectTransform;
			<>c.<>9__40_3 = val4;
			obj4 = (object)val4;
		}
		page.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f);
	}

	private static void RefreshQuickLayout()
	{
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)_quickMenuPage == (Object)null))
		{
			Canvas.ForceUpdateCanvases();
			((Component)_quickMenuPage).gameObject.SetActive(true);
			CanvasGroup component = ((Component)_quickMenuPage).GetComponent<CanvasGroup>();
			if ((Object)(object)component != (Object)null)
			{
				component.alpha = 1f;
				component.interactable = true;
				component.blocksRaycasts = true;
			}
			((Component)_quickMenuPage).transform.localScale = Vector3.one;
			VerticalLayoutGroup componentInChildren = ((Component)_quickMenuPage.scrollView).GetComponentInChildren<VerticalLayoutGroup>();
			if ((Object)(object)componentInChildren != (Object)null)
			{
				((LayoutGroup)componentInChildren).CalculateLayoutInputVertical();
				((LayoutGroup)componentInChildren).SetLayoutVertical();
				LayoutRebuilder.ForceRebuildLayoutImmediate(((Component)componentInChildren).GetComponent<RectTransform>());
			}
		}
	}

	private static void ToggleQuickMenu()
	{
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Expected O, but got Unknown
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Expected O, but got Unknown
		//IL_016d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0181: Expected O, but got Unknown
		if ((Object)(object)_quickMenuPage != (Object)null)
		{
			_quickMenuPage.ClosePage(false);
			Object.Destroy((Object)(object)((Component)_quickMenuPage).gameObject);
			_quickMenuPage = null;
			Cursor.visible = false;
			Cursor.lockState = (CursorLockMode)1;
			return;
		}
		Cursor.visible = true;
		Cursor.lockState = (CursorLockMode)0;
		_quickMenuPage = MenuAPI.CreateREPOPopupPage("Quick Board", (PresetSide)1, false, false, 5f);
		_quickMenuPage.scrollView.scrollSpeed = 3f;
		REPOPopupPage quickMenuPage = _quickMenuPage;
		object obj = <>c.<>9__42_0;
		if (obj == null)
		{
			ScrollViewBuilderDelegate val = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("\ud83d\udd04 REFRESH LAYOUT", (Action)RefreshQuickLayout, scrollView, Vector2.zero)).rectTransform;
			<>c.<>9__42_0 = val;
			obj = (object)val;
		}
		quickMenuPage.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 10f);
		REPOPopupPage quickMenuPage2 = _quickMenuPage;
		object obj2 = <>c.<>9__42_1;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("STOP ALL", (Action)StopPlayback, scrollView, Vector2.zero)).rectTransform;
			<>c.<>9__42_1 = val2;
			obj2 = (object)val2;
		}
		quickMenuPage2.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 10f);
		foreach (string audioToPlay in quickBoardSounds)
		{
			string cleanName = audioToPlay.Replace("REPO", "").Replace("MEME", "").Replace("_", " ")
				.Trim();
			_quickMenuPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
			{
				//IL_0036: Unknown result type (might be due to invalid IL or missing references)
				//IL_0053: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val3 = MenuAPI.CreateREPOButton(cleanName, (Action)delegate
				{
					PlayAudio(audioToPlay);
				}, scrollView, Vector2.zero);
				RectTransform rectTransform = ((REPOElement)val3).rectTransform;
				rectTransform.sizeDelta = new Vector2(200f, 35f);
				((TMP_Text)val3.labelTMP).fontSize = 14f;
				return rectTransform;
			}, 0f, 5f);
		}
		_quickMenuPage.OpenPage(false);
		RefreshQuickLayout();
	}

	private static void AddCategory(REPOPopupPage mainPage, string folderName, List<string> soundList, bool isFavourite = false)
	{
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Expected O, but got Unknown
		mainPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			REPOButton val = MenuAPI.CreateREPOButton(folderName, (Action)delegate
			{
				OpenFolder(folderName, soundList, isFavourite);
			}, scrollView, Vector2.zero);
			((TMP_Text)val.labelTMP).fontStyle = (FontStyles)0;
			return ((REPOElement)val).rectTransform;
		}, 0f, 0f);
	}

	[HarmonyPatch(typeof(PlayerVoiceChat), "Update")]
	[HarmonyPostfix]
	private static void SyncRemotePitch(PlayerVoiceChat __instance)
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Expected O, but got Unknown
		AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance);
		if ((Object)(object)val != (Object)null && IsPlayingSound)
		{
			val.pitch = CurrentPitch;
			val.loop = IsLooping;
		}
	}

	private static void OpenFolder(string title, List<string> sounds, bool isFavouriteCategory = false)
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Expected O, but got Unknown
		//IL_0184: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Expected O, but got Unknown
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		//IL_0158: Expected O, but got Unknown
		MenuAPI.CloseAllPagesAddedOnTop();
		REPOPopupPage folderPage = MenuAPI.CreateREPOPopupPage(title, (PresetSide)1, false, false, 5f);
		folderPage.scrollView.scrollSpeed = 3f;
		REPOPopupPage obj = folderPage;
		object obj2 = <>c.<>9__45_0;
		if (obj2 == null)
		{
			ScrollViewBuilderDelegate val2 = delegate(Transform scrollView)
			{
				//IL_0026: Unknown result type (might be due to invalid IL or missing references)
				REPOInputField val6 = MenuAPI.CreateREPOInputField("SEARCH SFX", (Action<string>)delegate(string val)
				{
					currentSearchFilter = val.ToLower().Trim();
				}, scrollView, Vector2.zero, false, "Type here...", currentSearchFilter);
				return ((REPOElement)val6).rectTransform;
			};
			<>c.<>9__45_0 = val2;
			obj2 = (object)val2;
		}
		obj.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 15f);
		foreach (string sound in sounds)
		{
			string audioToPlay = sound;
			string cleanName = sound.Replace("REPO", "").Replace("MEME", "").Replace("_", " ")
				.Trim();
			bool isFav = favouriteSounds.Contains(sound);
			if (!string.IsNullOrEmpty(currentSearchFilter) && !cleanName.ToLower().Contains(currentSearchFilter))
			{
				continue;
			}
			folderPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView)
			{
				//IL_0040: Unknown result type (might be due to invalid IL or missing references)
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0097: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
				//IL_012b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0150: Unknown result type (might be due to invalid IL or missing references)
				//IL_0149: 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)
				//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_0227: Unknown result type (might be due to invalid IL or missing references)
				//IL_023f: Unknown result type (might be due to invalid IL or missing references)
				//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
				REPOButton val3 = MenuAPI.CreateREPOButton(cleanName, (Action)delegate
				{
					PlayAudio(audioToPlay);
				}, scrollView, new Vector2(20f, 0f));
				RectTransform rectTransform = ((REPOElement)val3).rectTransform;
				rectTransform.sizeDelta = new Vector2(150f, 28f);
				TMP_Text labelTMP = (TMP_Text)(object)val3.labelTMP;
				labelTMP.fontSize = 15f;
				labelTMP.alignment = (TextAlignmentOptions)513;
				labelTMP.rectTransform.offsetMin = new Vector2(5f, 0f);
				string text = (isFavouriteCategory ? "UNFAV" : (isFav ? "★" : "☆"));
				REPOButton val4 = MenuAPI.CreateREPOButton(text, (Action)delegate
				{
					if (favouriteSounds.Contains(audioToPlay))
					{
						favouriteSounds.Remove(audioToPlay);
					}
					else
					{
						favouriteSounds.Add(audioToPlay);
					}
					Instance.SaveConfig();
					folderPage.ClosePage(false);
					OpenFolder(title, sounds, isFavouriteCategory);
				}, ((Component)rectTransform).transform, new Vector2(95f, 0f));
				val4.overrideButtonSize = new Vector2(isFavouriteCategory ? 45f : 25f, 25f);
				((Graphic)val4.labelTMP).color = (isFav ? Color.yellow : Color.white);
				((TMP_Text)val4.labelTMP).fontSize = 12f;
				REPOButton showBtn = null;
				showBtn = MenuAPI.CreateREPOButton("SHOW", (Action)delegate
				{
					//IL_005a: Unknown result type (might be due to invalid IL or missing references)
					if (!quickBoardSounds.Contains(audioToPlay))
					{
						quickBoardSounds.Add(audioToPlay);
						Instance.SaveConfig();
						if ((Object)(object)showBtn != (Object)null)
						{
							((Graphic)showBtn.labelTMP).color = Color.green;
						}
					}
				}, ((Component)rectTransform).transform, new Vector2(135f, 0f));
				showBtn.overrideButtonSize = new Vector2(40f, 25f);
				((TMP_Text)showBtn.labelTMP).fontSize = 10f;
				if (quickBoardSounds.Contains(audioToPlay))
				{
					((Graphic)showBtn.labelTMP).color = Color.green;
				}
				REPOButton val5 = MenuAPI.CreateREPOButton("HIDE", (Action)delegate
				{
					//IL_0057: Unknown result type (might be due to invalid IL or missing references)
					if (quickBoardSounds.Contains(audioToPlay))
					{
						quickBoardSounds.Remove(audioToPlay);
						Instance.SaveConfig();
						if ((Object)(object)showBtn != (Object)null)
						{
							((Graphic)showBtn.labelTMP).color = Color.white;
						}
					}
				}, ((Component)rectTransform).transform, new Vector2(175f, 0f));
				val5.overrideButtonSize = new Vector2(40f, 25f);
				((TMP_Text)val5.labelTMP).fontSize = 10f;
				return rectTransform;
			}, 0f, 4f);
		}
		folderPage.AddElement((BuilderDelegate)delegate(Transform p)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			MenuAPI.CreateREPOButton("Back", (Action)delegate
			{
				folderPage.ClosePage(true);
				CreateSoundboardMenu();
			}, p, new Vector2(66f, 18f));
		});
		folderPage.OpenPage(true);
	}

	private static void PlayAudio(string assetName)
	{
		if (!_loadedBundles.ContainsKey(assetName))
		{
			((BaseUnityPlugin)Instance).Logger.LogWarning((object)("Sound not found: " + assetName));
			return;
		}
		StopPlayback();
		AudioClip val = _loadedBundles[assetName].LoadAsset<AudioClip>(assetName);
		if ((Object)(object)val != (Object)null)
		{
			PlayAudioClip(val);
		}
		else
		{
			((BaseUnityPlugin)Instance).Logger.LogWarning((object)("Could not load audio: " + assetName));
		}
	}
}