using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Empress")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("EmpressKH2Menu")] [assembly: AssemblyTitle("EmpressKH2Menu")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 Empress.REPO.KH2Menu { internal static class EmpressKH2Access { private static readonly FieldRef> AllPagesRef = AccessTools.FieldRefAccess>("allPages"); private static readonly FieldRef PageStateRef = AccessTools.FieldRefAccess("currentPageState"); private static readonly FieldRef SoundHoverRef = AccessTools.FieldRefAccess("soundHover"); private static readonly FieldRef SoundTickRef = AccessTools.FieldRefAccess("soundTick"); private static readonly FieldRef SoundMoveRef = AccessTools.FieldRefAccess("soundMove"); private static readonly FieldRef SoundConfirmRef = AccessTools.FieldRefAccess("soundConfirm"); private static readonly FieldRef SoundActionRef = AccessTools.FieldRefAccess("soundAction"); private static readonly FieldRef SoundPageIntroRef = AccessTools.FieldRefAccess("soundPageIntro"); private static readonly FieldRef SoundWindowPopUpRef = AccessTools.FieldRefAccess("soundWindowPopUp"); private static readonly FieldRef SoundDenyRef = AccessTools.FieldRefAccess("soundDeny"); private static readonly FieldRef SoundDudRef = AccessTools.FieldRefAccess("soundDud"); private static readonly FieldRef SoundPageOutroRef = AccessTools.FieldRefAccess("soundPageOutro"); private static readonly FieldRef SoundWindowPopUpCloseRef = AccessTools.FieldRefAccess("soundWindowPopUpClose"); private static readonly FieldRef SoundClipsRef = AccessTools.FieldRefAccess("Sounds"); private static readonly FieldRef SoundSpatialBlendRef = AccessTools.FieldRefAccess("SpatialBlend"); private static readonly FieldRef SoundPitchRef = AccessTools.FieldRefAccess("Pitch"); private static readonly FieldRef SoundPitchDefaultRef = AccessTools.FieldRefAccess("PitchDefault"); private static readonly FieldRef SoundPitchRandomRef = AccessTools.FieldRefAccess("PitchRandom"); private static readonly FieldRef SoundVolumeRandomRef = AccessTools.FieldRefAccess("VolumeRandom"); private static readonly FieldRef SelectionRawImageRef = AccessTools.FieldRefAccess("rawImage"); private static readonly FieldRef SelectionCurrentScaleRef = AccessTools.FieldRefAccess("currentScale"); private static readonly FieldRef SelectionTargetScaleRef = AccessTools.FieldRefAccess("targetScale"); private static readonly FieldRef SelectionRectRef = AccessTools.FieldRefAccess("rectTransform"); public static bool AnyMenuPageOpen() { //IL_0044: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Invalid comparison between Unknown and I4 //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Invalid comparison between Unknown and I4 MenuManager instance = MenuManager.instance; if ((Object)(object)instance == (Object)null) { return false; } List list = AllPagesRef.Invoke(instance); if (list == null) { return false; } for (int i = 0; i < list.Count; i++) { MenuPage val = list[i]; if (!((Object)(object)val == (Object)null)) { PageState val2 = PageStateRef.Invoke(val); if ((int)val2 == 0 || (int)val2 == 1 || (int)val2 == 2) { return true; } } } return false; } public static void SwapMenuSounds(MenuManager manager, AudioClip move, AudioClip select, AudioClip cancel) { if (!((Object)(object)manager == (Object)null)) { Swap(SoundHoverRef.Invoke(manager), move); Swap(SoundTickRef.Invoke(manager), move); Swap(SoundMoveRef.Invoke(manager), move); Swap(SoundConfirmRef.Invoke(manager), select); Swap(SoundActionRef.Invoke(manager), select); Swap(SoundPageIntroRef.Invoke(manager), select); Swap(SoundWindowPopUpRef.Invoke(manager), select); Swap(SoundDenyRef.Invoke(manager), cancel); Swap(SoundDudRef.Invoke(manager), cancel); Swap(SoundPageOutroRef.Invoke(manager), cancel); Swap(SoundWindowPopUpCloseRef.Invoke(manager), cancel); } } public static void HideSelectionBox(MenuSelectionBox selectionBox) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)selectionBox == (Object)null)) { RawImage val = SelectionRawImageRef.Invoke(selectionBox); if ((Object)(object)val != (Object)null) { ((Graphic)val).color = new Color(0f, 0f, 0f, 0f); } SelectionCurrentScaleRef.Invoke(selectionBox) = Vector3.zero; SelectionTargetScaleRef.Invoke(selectionBox) = Vector3.zero; RectTransform val2 = SelectionRectRef.Invoke(selectionBox); if ((Object)(object)val2 != (Object)null) { ((Transform)val2).localScale = Vector3.zero; } } } private static void Swap(Sound sound, AudioClip clip) { if (sound != null && !((Object)(object)clip == (Object)null)) { SoundClipsRef.Invoke(sound) = (AudioClip[])(object)new AudioClip[1] { clip }; SoundSpatialBlendRef.Invoke(sound) = 0f; SoundPitchRef.Invoke(sound) = 1f; SoundPitchDefaultRef.Invoke(sound) = 1f; SoundPitchRandomRef.Invoke(sound) = 0f; SoundVolumeRandomRef.Invoke(sound) = 0f; } } } [BepInPlugin("com.empress.repo.kh2menu", "Empress KH2 Menu", "1.0.0")] public sealed class EmpressKH2MenuPlugin : BaseUnityPlugin { public const string PluginGuid = "com.empress.repo.kh2menu"; public const string PluginName = "Empress KH2 Menu"; public const string PluginVersion = "1.0.0"; private Harmony _harmony; internal static EmpressKH2MenuPlugin Instance { get; private set; } internal static ManualLogSource Log { get; private set; } internal static KH2MenuSettings Settings { get; private set; } internal static string PluginDirectory { get; private set; } private void Awake() { //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; PluginDirectory = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); Settings = new KH2MenuSettings(((BaseUnityPlugin)this).Config); ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); KH2MenuRuntime.EnsureHost(); KH2MenuAssets.Initialize(PluginDirectory, (MonoBehaviour)(object)KH2MenuRuntime.Instance, ((BaseUnityPlugin)this).Logger); _harmony = new Harmony("com.empress.repo.kh2menu"); _harmony.PatchAll(typeof(EmpressKH2MenuPlugin).Assembly); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Empress KH2 Menu v1.0.0 loaded."); } internal static void DebugLog(string message) { if (Settings != null && Settings.DebugLogs.Value) { Log.LogInfo((object)message); } } } internal sealed class KH2MenuSettings { public readonly ConfigEntry DebugLogs; public readonly ConfigEntry EnableStyle; public readonly ConfigEntry EnableSounds; public readonly ConfigEntry EnableMusic; public readonly ConfigEntry MusicVolume; public readonly ConfigEntry BackdropOpacity; public KH2MenuSettings(ConfigFile config) { //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Expected O, but got Unknown DebugLogs = config.Bind("Debug", "DebugLogs", false, "Logs verbose Empress KH2 Menu diagnostics."); EnableStyle = config.Bind("Menu", "EnableStyle", true, "Restyles every REPO menu page with the Kingdom Hearts 2 look."); EnableSounds = config.Bind("Menu", "EnableSounds", true, "Swaps menu hover, confirm, deny and tick sounds with the kh2 ogg files beside the DLL."); EnableMusic = config.Bind("Menu", "EnableMusic", true, "Plays kh2_music.ogg on the main menu instead of the vanilla menu music."); MusicVolume = config.Bind("Menu", "MusicVolume", 0.4f, new ConfigDescription("Volume of the menu music.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); BackdropOpacity = config.Bind("Menu", "BackdropOpacity", 1f, new ConfigDescription("Opacity of the dark KH2 backdrop behind menu pages.", (AcceptableValueBase)(object)new AcceptableValueRange(0.2f, 1f), Array.Empty())); } } internal static class KH2MenuAssets { private static readonly Dictionary Sprites = new Dictionary(); private static readonly Dictionary Clips = new Dictionary(); private static bool _started; public static bool Ready { get; private set; } public static void Initialize(string directory, MonoBehaviour runner, ManualLogSource log) { if (!_started && !((Object)(object)runner == (Object)null) && !string.IsNullOrEmpty(directory)) { _started = true; LoadSprite(directory, "kh2_bar"); LoadSprite(directory, "kh2_backdrop"); LoadSprite(directory, "kh2_menu_backdrop"); LoadSprite(directory, "kh2_pointer"); LoadSprite(directory, "kh2_title"); LoadSprite(directory, "kh2_window"); runner.StartCoroutine(LoadClips(directory, log)); } } public static Sprite GetSprite(string key) { Sprites.TryGetValue(key, out var value); return value; } public static AudioClip GetClip(string key) { Clips.TryGetValue(key, out var value); return value; } private static void LoadSprite(string directory, string name) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) string path = Path.Combine(directory, name + ".png"); if (!File.Exists(path)) { path = Path.Combine(directory, name + ".jpg"); } if (!File.Exists(path)) { path = Path.Combine(directory, name + ".jpeg"); } if (File.Exists(path)) { Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false) { wrapMode = (TextureWrapMode)1, filterMode = (FilterMode)1, anisoLevel = 16 }; if (ImageConversion.LoadImage(val, File.ReadAllBytes(path))) { Sprite value = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f); Sprites[name] = value; } } } private static IEnumerator LoadClips(string directory, ManualLogSource log) { string[] files = Directory.GetFiles(directory, "*.ogg", SearchOption.TopDirectoryOnly); for (int i = 0; i < files.Length; i++) { yield return LoadClip(files[i], log); } Ready = true; if (log != null) { log.LogInfo((object)("Empress KH2 Menu loaded " + Clips.Count + " sound(s).")); } } private static IEnumerator LoadClip(string path, ManualLogSource log) { string text = "file:///" + path.Replace("\\", "/"); UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip(text, (AudioType)14); try { yield return request.SendWebRequest(); if (!string.IsNullOrEmpty(request.error)) { if (log != null) { log.LogWarning((object)("Empress KH2 Menu could not load " + Path.GetFileName(path) + ": " + request.error)); } yield break; } AudioClip content = DownloadHandlerAudioClip.GetContent(request); if ((Object)(object)content == (Object)null) { yield break; } ((Object)content).name = Path.GetFileNameWithoutExtension(path); Clips[((Object)content).name.ToLowerInvariant().TrimEnd('.')] = content; } finally { ((IDisposable)request)?.Dispose(); } } } [HarmonyPatch(typeof(MenuManager), "Start")] internal static class KH2MenuPatchMenuManagerStart { private static void Postfix(MenuManager __instance) { KH2MenuStyler.ResetTracking(); KH2MenuSounds.Apply(__instance); } } [HarmonyPatch(typeof(MenuPage), "Start")] internal static class KH2MenuPatchMenuPageStart { private static void Postfix(MenuPage __instance) { KH2MenuStyler.StylePage(__instance); } } [HarmonyPatch(typeof(MenuPage), "OnEnable")] internal static class KH2MenuPatchMenuPageOnEnable { private static void Postfix(MenuPage __instance) { KH2MenuStyler.StylePage(__instance); } } [HarmonyPatch(typeof(MenuManager), "PageOpen")] internal static class KH2MenuPatchMenuManagerPageOpen { private static void Postfix(MenuPage __result) { KH2MenuStyler.StylePage(__result); } } [HarmonyPatch(typeof(MenuManager), "MenuEffectHover")] internal static class KH2MenuPatchMenuEffectHover { private static void Prefix(ref float pitch) { if (EmpressKH2MenuPlugin.Settings != null && EmpressKH2MenuPlugin.Settings.EnableSounds.Value && KH2MenuRuntime.MenuOpen()) { pitch = 1f; } } } [HarmonyPatch(typeof(MenuSelectionBox), "Update")] internal static class KH2MenuPatchMenuSelectionBoxUpdate { private static bool Prefix(MenuSelectionBox __instance) { if (EmpressKH2MenuPlugin.Settings == null || !EmpressKH2MenuPlugin.Settings.EnableStyle.Value || !KH2MenuRuntime.MenuOpen()) { return true; } EmpressKH2Access.HideSelectionBox(__instance); return false; } } [HarmonyPatch(typeof(LevelMusic), "Update")] internal static class KH2MenuPatchLevelMusic { private static bool Prefix() { return !SuppressMenuMusic(); } internal static bool SuppressMenuMusic() { if (EmpressKH2MenuPlugin.Settings == null || !EmpressKH2MenuPlugin.Settings.EnableMusic.Value) { return false; } return KH2MenuRuntime.OnMenu(); } } [HarmonyPatch(typeof(ConstantMusic), "Update")] internal static class KH2MenuPatchConstantMusic { private static bool Prefix() { return !KH2MenuPatchLevelMusic.SuppressMenuMusic(); } } internal sealed class KH2MenuRuntime : MonoBehaviour { private Canvas _backdropCanvas; private RectTransform _backdropRect; private Image _backdropImage; private Canvas _menuBackdropCanvas; private RectTransform _menuBackdrop; private Image _menuBackdropImage; private AudioSource _music; private float _soundApplyTimer; private bool _musicRouted; public static KH2MenuRuntime Instance { get; private set; } public bool MusicActive { get { if ((Object)(object)_music != (Object)null) { return _music.isPlaying; } return false; } } public static KH2MenuRuntime EnsureHost() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown if ((Object)(object)Instance != (Object)null) { return Instance; } GameObject val = new GameObject("Empress KH2 Menu Runtime"); val.transform.parent = null; ((Object)val).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)val); Instance = val.AddComponent(); return Instance; } private void Awake() { Instance = this; } private void EnsureBackdrop() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected O, but got Unknown //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_backdropCanvas != (Object)null)) { _backdropCanvas = new GameObject("Empress KH2 Menu Backdrop").AddComponent(); ((Component)_backdropCanvas).transform.SetParent(((Component)this).transform, false); _backdropCanvas.renderMode = (RenderMode)0; _backdropCanvas.sortingOrder = -30000; CanvasScaler obj = ((Component)_backdropCanvas).gameObject.AddComponent(); obj.uiScaleMode = (ScaleMode)1; obj.referenceResolution = new Vector2(1920f, 1080f); obj.matchWidthOrHeight = 0.5f; _backdropRect = ((Component)_backdropCanvas).GetComponent(); GameObject val = new GameObject("Empress KH2 Title Backdrop"); RectTransform obj2 = val.AddComponent(); ((Transform)obj2).SetParent((Transform)(object)_backdropRect, false); obj2.anchorMin = Vector2.zero; obj2.anchorMax = Vector2.one; obj2.offsetMin = Vector2.zero; obj2.offsetMax = Vector2.zero; _backdropImage = val.AddComponent(); _backdropImage.sprite = KH2MenuAssets.GetSprite("kh2_menu_backdrop") ?? KH2MenuAssets.GetSprite("kh2_title") ?? KH2MenuAssets.GetSprite("kh2_backdrop"); ((Graphic)_backdropImage).raycastTarget = false; _backdropImage.preserveAspect = false; ((Graphic)_backdropImage).color = Color.white; } } private void EnsureMusic() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown if (!((Object)(object)_music != (Object)null)) { GameObject val = new GameObject("Empress KH2 Menu Music"); val.transform.SetParent(((Component)this).transform, false); _music = val.AddComponent(); _music.playOnAwake = false; _music.loop = true; _music.spatialBlend = 0f; _music.priority = 0; } } public static bool OnMenu() { try { return SemiFunc.MenuLevel() && (Object)(object)MenuManager.instance != (Object)null; } catch { return false; } } public static bool MenuOpen() { try { return EmpressKH2Access.AnyMenuPageOpen(); } catch { return false; } } private void Update() { bool flag = OnMenu(); bool onMenu = MenuOpen(); TickBackdrop(flag); KH2MenuSuppression.SetActive(flag && EmpressKH2MenuPlugin.Settings != null && EmpressKH2MenuPlugin.Settings.EnableStyle.Value, _music); TickMusic(flag); TickSounds(onMenu); } private void TickSounds(bool onMenu) { if (onMenu && KH2MenuAssets.Ready && !((Object)(object)MenuManager.instance == (Object)null)) { _soundApplyTimer -= Time.unscaledDeltaTime; if (!(_soundApplyTimer > 0f)) { _soundApplyTimer = 1f; KH2MenuSounds.Apply(MenuManager.instance); } } } private void TickBackdrop(bool onMenu) { //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) if (!onMenu || EmpressKH2MenuPlugin.Settings == null || !EmpressKH2MenuPlugin.Settings.EnableStyle.Value) { if ((Object)(object)_backdropCanvas != (Object)null) { ((Component)_backdropCanvas).gameObject.SetActive(false); } if ((Object)(object)_menuBackdrop != (Object)null) { ((Component)_menuBackdrop).gameObject.SetActive(false); } return; } EnsureBackdrop(); ((Component)_backdropCanvas).gameObject.SetActive(true); if (!((Object)(object)_backdropImage == (Object)null)) { float num = Mathf.Max(0.98f, EmpressKH2MenuPlugin.Settings.BackdropOpacity.Value); ((Graphic)_backdropImage).color = new Color(1f, 1f, 1f, num); if ((Object)(object)_menuBackdropImage != (Object)null) { ((Graphic)_menuBackdropImage).color = new Color(1f, 1f, 1f, num); } if ((Object)(object)_menuBackdrop != (Object)null) { ((Component)_menuBackdrop).gameObject.SetActive(true); ((Transform)_menuBackdrop).SetAsFirstSibling(); } } } public void AttachBackdrop(MenuPage page) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Expected O, but got Unknown //IL_00a9: 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_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: 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) if ((Object)(object)page == (Object)null) { return; } Canvas componentInParent = ((Component)page).GetComponentInParent(true); if ((Object)(object)componentInParent == (Object)null) { return; } if ((Object)(object)_menuBackdrop != (Object)null && (Object)(object)_menuBackdropCanvas == (Object)(object)componentInParent) { ((Transform)_menuBackdrop).SetAsFirstSibling(); ((Component)_menuBackdrop).gameObject.SetActive(true); return; } if ((Object)(object)_menuBackdrop != (Object)null) { Object.Destroy((Object)(object)((Component)_menuBackdrop).gameObject); } _menuBackdropCanvas = componentInParent; GameObject val = new GameObject("Empress KH2 Menu Real Backdrop"); _menuBackdrop = val.AddComponent(); ((Transform)_menuBackdrop).SetParent(((Component)componentInParent).transform, false); _menuBackdrop.anchorMin = Vector2.zero; _menuBackdrop.anchorMax = Vector2.one; _menuBackdrop.offsetMin = Vector2.zero; _menuBackdrop.offsetMax = Vector2.zero; ((Transform)_menuBackdrop).SetAsFirstSibling(); _menuBackdropImage = val.AddComponent(); _menuBackdropImage.sprite = KH2MenuAssets.GetSprite("kh2_menu_backdrop") ?? KH2MenuAssets.GetSprite("kh2_title") ?? KH2MenuAssets.GetSprite("kh2_backdrop"); ((Graphic)_menuBackdropImage).raycastTarget = false; _menuBackdropImage.preserveAspect = false; ((Graphic)_menuBackdropImage).color = Color.white; } private void TickMusic(bool onMenu) { if (EmpressKH2MenuPlugin.Settings == null || !EmpressKH2MenuPlugin.Settings.EnableMusic.Value) { if ((Object)(object)_music != (Object)null && _music.isPlaying) { _music.Stop(); } return; } AudioClip clip = KH2MenuAssets.GetClip("kh2_music"); if ((Object)(object)clip == (Object)null) { return; } if (!onMenu) { if ((Object)(object)_music != (Object)null && _music.isPlaying) { _music.Stop(); } return; } EnsureMusic(); if ((Object)(object)_music.clip != (Object)(object)clip) { _music.clip = clip; } _music.volume = EmpressKH2MenuPlugin.Settings.MusicVolume.Value; RouteMusic(); if (!_music.isPlaying) { _music.Play(); } } private void RouteMusic() { if (!_musicRouted && !((Object)(object)_music == (Object)null) && !((Object)(object)AudioManager.instance == (Object)null) && !((Object)(object)AudioManager.instance.MusicMasterGroup == (Object)null)) { _music.outputAudioMixerGroup = AudioManager.instance.MusicMasterGroup; _musicRouted = true; } } } internal static class KH2MenuSounds { public static void Apply(MenuManager manager) { if (!((Object)(object)manager == (Object)null) && EmpressKH2MenuPlugin.Settings != null && EmpressKH2MenuPlugin.Settings.EnableSounds.Value) { AudioClip clip = KH2MenuAssets.GetClip("kh2_move"); AudioClip clip2 = KH2MenuAssets.GetClip("kh2_select"); AudioClip clip3 = KH2MenuAssets.GetClip("kh2_cancel"); EmpressKH2Access.SwapMenuSounds(manager, clip, clip2, clip3); } } } internal static class KH2MenuStyler { internal static readonly Color PanelColor = new Color(0.03f, 0.06f, 0.16f, 0.86f); internal static readonly Color PanelEdge = new Color(0.32f, 0.55f, 1f, 0.9f); internal static readonly Color TextColor = new Color(0.96f, 0.97f, 1f, 1f); internal static readonly Color HeaderColor = new Color(1f, 0.86f, 0.42f, 1f); internal static readonly Color TextOutline = new Color(0.05f, 0.12f, 0.32f, 1f); internal static readonly Color BarColor = new Color(0.16f, 0.4f, 1f, 0f); internal static readonly Color BarHoverColor = new Color(0.35f, 0.68f, 1f, 0.62f); private static readonly HashSet Styled = new HashSet(); public static void ResetTracking() { Styled.Clear(); } public static void StylePage(MenuPage page) { if (!((Object)(object)page == (Object)null) && EmpressKH2MenuPlugin.Settings != null && EmpressKH2MenuPlugin.Settings.EnableStyle.Value) { if (KH2MenuRuntime.OnMenu()) { KH2MenuRuntime.Instance?.AttachBackdrop(page); } if ((Object)(object)page.menuHeader != (Object)null) { StyleHeader(page.menuHeader); } TextMeshProUGUI[] componentsInChildren = ((Component)page).GetComponentsInChildren(true); for (int i = 0; i < componentsInChildren.Length; i++) { StyleText(componentsInChildren[i]); } Image[] componentsInChildren2 = ((Component)page).GetComponentsInChildren(true); for (int j = 0; j < componentsInChildren2.Length; j++) { StylePanel(componentsInChildren2[j]); } MenuButton[] componentsInChildren3 = ((Component)page).GetComponentsInChildren(true); for (int k = 0; k < componentsInChildren3.Length; k++) { StyleButton(componentsInChildren3[k]); } } } private static void StyleHeader(TextMeshProUGUI header) { //IL_0014: 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) //IL_0026: Unknown result type (might be due to invalid IL or missing references) if (Styled.Add(((Object)header).GetInstanceID())) { ((Graphic)header).color = HeaderColor; ((TMP_Text)header).fontStyle = (FontStyles)(((TMP_Text)header).fontStyle | 1); ApplyOutline(header, 0.22f); } } private static void StyleText(TextMeshProUGUI text) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)text == (Object)null) && Styled.Add(((Object)text).GetInstanceID()) && !(((Graphic)text).color.a < 0.05f)) { float num = ((Graphic)text).color.r * 0.3f + ((Graphic)text).color.g * 0.59f + ((Graphic)text).color.b * 0.11f; ((Graphic)text).color = ((num > 0.75f) ? HeaderColor : TextColor); ApplyOutline(text, 0.16f); } } private static void ApplyOutline(TextMeshProUGUI text, float width) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) Material fontMaterial = ((TMP_Text)text).fontMaterial; if (!((Object)(object)fontMaterial == (Object)null)) { fontMaterial.EnableKeyword("OUTLINE_ON"); fontMaterial.SetColor("_OutlineColor", TextOutline); fontMaterial.SetFloat("_OutlineWidth", width); } } private static void StylePanel(Image image) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)image == (Object)null || !Styled.Add(((Object)image).GetInstanceID()) || (Object)(object)((Component)image).GetComponentInParent() != (Object)null) { return; } Color color = ((Graphic)image).color; if (color.a < 0.12f) { return; } RectTransform rectTransform = ((Graphic)image).rectTransform; if ((Object)(object)rectTransform == (Object)null) { return; } Rect rect = rectTransform.rect; Vector2 size = ((Rect)(ref rect)).size; if (!(size.x < 90f) && !(size.y < 40f) && (!(color.r * 0.3f + color.g * 0.59f + color.b * 0.11f > 0.55f) || !(color.a > 0.85f))) { Sprite sprite = KH2MenuAssets.GetSprite("kh2_window"); if ((Object)(object)sprite != (Object)null) { image.sprite = sprite; image.type = (Type)1; } ((Graphic)image).color = new Color(PanelColor.r, PanelColor.g, PanelColor.b, Mathf.Clamp01(color.a * PanelColor.a + 0.12f)); } } private static void StyleButton(MenuButton button) { if (!((Object)(object)button == (Object)null) && Styled.Add(((Object)button).GetInstanceID())) { KH2ButtonStyle kH2ButtonStyle = ((Component)button).gameObject.GetComponent(); if ((Object)(object)kH2ButtonStyle == (Object)null) { kH2ButtonStyle = ((Component)button).gameObject.AddComponent(); } kH2ButtonStyle.Setup(button); } } } internal sealed class KH2ButtonStyle : MonoBehaviour { public static readonly List Active = new List(); private static readonly FieldRef HoveringRef = AccessTools.FieldRefAccess("hovering"); private MenuButton _button; private Image _bar; private Image _pointer; private RectTransform _rect; private TextMeshProUGUI _label; private float _blend; public bool Hovering { get; private set; } public RectTransform Rect => _rect; private void OnEnable() { if (!Active.Contains(this)) { Active.Add(this); } } private void OnDisable() { Active.Remove(this); } public void Setup(MenuButton button) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_006d: 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_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: 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_012e: Unknown result type (might be due to invalid IL or missing references) //IL_025e: Unknown result type (might be due to invalid IL or missing references) _button = button; _rect = ((Component)button).GetComponent(); if (!((Object)(object)_rect == (Object)null)) { _label = ((Component)button).GetComponentInChildren(true); GameObject val = new GameObject("Empress KH2 Bar"); RectTransform obj = val.AddComponent(); ((Transform)obj).SetParent((Transform)(object)_rect, false); obj.anchorMin = new Vector2(0f, 0.5f); obj.anchorMax = new Vector2(0f, 0.5f); obj.pivot = new Vector2(0f, 0.5f); obj.sizeDelta = new Vector2(GetBarWidth(), 42f); obj.anchoredPosition = GetBarPosition(0f); ((Transform)obj).SetAsFirstSibling(); _bar = val.AddComponent(); _bar.sprite = KH2MenuAssets.GetSprite("kh2_bar"); _bar.type = (Type)1; ((Graphic)_bar).color = KH2MenuStyler.BarColor; ((Graphic)_bar).raycastTarget = false; if ((Object)(object)_bar.sprite == (Object)null) { ((Graphic)_bar).color = new Color(0.12f, 0.3f, 0.8f, 0.4f); } GameObject val2 = new GameObject("Empress KH2 Pointer"); RectTransform obj2 = val2.AddComponent(); ((Transform)obj2).SetParent((Transform)(object)_rect, false); obj2.anchorMin = new Vector2(0f, 0.5f); obj2.anchorMax = new Vector2(0f, 0.5f); obj2.pivot = new Vector2(0f, 0.5f); obj2.sizeDelta = new Vector2(52f, 52f); ((Transform)obj2).localScale = new Vector3(-1f, 1f, 1f); obj2.anchoredPosition = GetPointerPosition(0f); _pointer = val2.AddComponent(); _pointer.sprite = KH2MenuAssets.GetSprite("kh2_pointer"); ((Graphic)_pointer).raycastTarget = false; _pointer.preserveAspect = true; ((Graphic)_pointer).color = new Color(1f, 1f, 1f, 0f); if ((Object)(object)_pointer.sprite == (Object)null) { ((Graphic)_pointer).color = new Color(1f, 0.85f, 0.3f, 0f); } } } private void Update() { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_button == (Object)null) && !((Object)(object)_bar == (Object)null)) { bool flag = false; try { flag = HoveringRef.Invoke(_button); } catch { flag = false; } Hovering = flag; _blend = Mathf.MoveTowards(_blend, flag ? 1f : 0f, Time.unscaledDeltaTime * 7f); ((Graphic)_bar).color = Color.Lerp(KH2MenuStyler.BarColor, KH2MenuStyler.BarHoverColor, _blend); ((Behaviour)_bar).enabled = _blend > 0.015f; float num = Mathf.Lerp(0f, 12f, _blend); RectTransform rectTransform = ((Graphic)_bar).rectTransform; rectTransform.sizeDelta = new Vector2(GetBarWidth(), 42f); rectTransform.anchoredPosition = GetBarPosition(num); if ((Object)(object)_pointer != (Object)null) { ((Behaviour)_pointer).enabled = _blend > 0.015f; ((Graphic)_pointer).color = new Color(1f, 1f, 1f, _blend); float num2 = Mathf.Sin(Time.unscaledTime * 6f) * 5f; ((Graphic)_pointer).rectTransform.anchoredPosition = GetPointerPosition(num + num2 * _blend); } } } private float GetBarWidth() { //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) float num = 220f; if ((Object)(object)_label != (Object)null) { float preferredWidth = ((TMP_Text)_label).preferredWidth; if (preferredWidth > 1f) { num = preferredWidth + 58f; } } else if ((Object)(object)_rect != (Object)null) { Rect rect = _rect.rect; num = ((Rect)(ref rect)).width + 20f; } return Mathf.Clamp(num, 190f, 330f); } private Vector2 GetBarPosition(float extend) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) return new Vector2(-22f + extend, 0f); } private Vector2 GetPointerPosition(float offset) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) return new Vector2(-22f + GetBarWidth() + 66f + offset, 0f); } } internal static class KH2MenuSuppression { private sealed class AudioState { private readonly bool _mute; private readonly bool _wasPlaying; private readonly float _volume; public AudioState(AudioSource source) { _mute = source.mute; _wasPlaying = source.isPlaying; _volume = source.volume; } public void Restore(AudioSource source) { source.mute = _mute; source.volume = _volume; if (_wasPlaying && !source.isPlaying) { source.UnPause(); } } } private static readonly List Behaviours = new List(); private static readonly List Renderers = new List(); private static readonly List Particles = new List(); private static readonly Dictionary AudioStates = new Dictionary(); private static bool _active; public static void SetActive(bool active, AudioSource ownMusic) { if (!active) { Restore(); return; } _active = true; SuppressTruckBehaviours(); SuppressRenderers(); SuppressParticles(); SuppressAudio(ownMusic); } private static void Restore() { if (!_active) { return; } for (int i = 0; i < Behaviours.Count; i++) { if ((Object)(object)Behaviours[i] != (Object)null) { Behaviours[i].enabled = true; } } for (int j = 0; j < Renderers.Count; j++) { if ((Object)(object)Renderers[j] != (Object)null) { Renderers[j].enabled = true; } } for (int k = 0; k < Particles.Count; k++) { if ((Object)(object)Particles[k] != (Object)null) { Particles[k].Play(true); } } foreach (KeyValuePair audioState in AudioStates) { if ((Object)(object)audioState.Key != (Object)null) { audioState.Value.Restore(audioState.Key); } } Behaviours.Clear(); Renderers.Clear(); Particles.Clear(); AudioStates.Clear(); _active = false; } private static void SuppressTruckBehaviours() { TruckMenuAnimated[] array = Object.FindObjectsOfType(true); foreach (TruckMenuAnimated val in array) { if (!((Object)(object)val == (Object)null) && ((Behaviour)val).enabled && !Behaviours.Contains((Behaviour)(object)val)) { Behaviours.Add((Behaviour)(object)val); ((Behaviour)val).enabled = false; } } } private static void SuppressRenderers() { Renderer[] array = Object.FindObjectsOfType(true); foreach (Renderer val in array) { if (!((Object)(object)val == (Object)null) && val.enabled && !Renderers.Contains(val) && ShouldSuppressVisual(((Component)val).transform)) { Renderers.Add(val); val.enabled = false; } } } private static void SuppressParticles() { ParticleSystem[] array = Object.FindObjectsOfType(true); foreach (ParticleSystem val in array) { if (!((Object)(object)val == (Object)null) && val.isPlaying && !Particles.Contains(val) && ShouldSuppressVisual(((Component)val).transform)) { Particles.Add(val); val.Stop(true, (ParticleSystemStopBehavior)0); } } } private static void SuppressAudio(AudioSource ownMusic) { AudioSource[] array = Object.FindObjectsOfType(true); foreach (AudioSource val in array) { if (!((Object)(object)val == (Object)null) && !((Object)(object)val == (Object)(object)ownMusic) && ShouldSuppressAudio(val)) { if (!AudioStates.ContainsKey(val)) { AudioStates[val] = new AudioState(val); } val.Pause(); val.mute = true; } } } private static bool ShouldSuppressVisual(Transform candidate) { if ((Object)(object)candidate == (Object)null) { return false; } if ((Object)(object)KH2MenuRuntime.Instance != (Object)null && candidate.IsChildOf(((Component)KH2MenuRuntime.Instance).transform)) { return false; } if ((Object)(object)((Component)candidate).GetComponentInParent(true) != (Object)null || (Object)(object)((Component)candidate).GetComponentInParent(true) != (Object)null || (Object)(object)((Component)candidate).GetComponentInParent(true) != (Object)null) { return false; } return true; } private static bool ShouldSuppressAudio(AudioSource source) { if ((Object)(object)source == (Object)null) { return false; } if ((Object)(object)KH2MenuRuntime.Instance != (Object)null && ((Component)source).transform.IsChildOf(((Component)KH2MenuRuntime.Instance).transform)) { return false; } if ((Object)(object)((Component)source).GetComponentInParent(true) != (Object)null || (Object)(object)((Component)source).GetComponentInParent(true) != (Object)null) { return false; } if (source.loop) { return true; } string text = TransformPath(((Component)source).transform).ToLowerInvariant(); if (!text.Contains("music") && !text.Contains("ambience") && !text.Contains("ambient") && !text.Contains("truck") && !text.Contains("mainmenu")) { return text.Contains("main menu"); } return true; } private static string TransformPath(Transform transformNode) { List list = new List(); while ((Object)(object)transformNode != (Object)null) { list.Add(((Object)transformNode).name); transformNode = transformNode.parent; } list.Reverse(); return string.Join("/", list.ToArray()); } } }