diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/BepInEx5Plugins.Ash.Alisa.KeysMenuFix.csproj b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/BepInEx5Plugins.Ash.Alisa.KeysMenuFix.csproj
new file mode 100644
index 0000000..24f422a
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/BepInEx5Plugins.Ash.Alisa.KeysMenuFix.csproj
@@ -0,0 +1,33 @@
+
+
+
+ net35
+ BepInEx5Plugins.Ash.Alisa.KeysMenuFix
+ KeysMenuFix
+ 1.0.0
+ true
+ 9.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ..\lib\SteamRelease\Assembly-CSharp.dll
+ false
+
+
+
+
+
+
+
diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_KeyRingUpdate.cs b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_KeyRingUpdate.cs
new file mode 100644
index 0000000..b766be1
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_KeyRingUpdate.cs
@@ -0,0 +1,258 @@
+using HarmonyLib;
+using System;
+using System.Reflection;
+using UnityEngine;
+
+namespace BepInEx5Plugins.Ash.Alisa.KeysMenuFix.HarmonyPatches
+{
+ [HarmonyPatch(typeof(KeysMenuV2), "KeyRingUpdate")]
+ public class KeysMenuV2_KeyRingUpdate
+ {
+ private static MethodInfo KeysMenuV2_UseKey01;
+ private static MethodInfo KeysMenuV2_UseKey02;
+ private static MethodInfo KeysMenuV2_UseKey03;
+ private static MethodInfo KeysMenuV2_UseKey04;
+ private static MethodInfo KeysMenuV2_UseKey05;
+ private static MethodInfo KeysMenuV2_UseKey06;
+ private static MethodInfo KeysMenuV2_UseKey07;
+ private static MethodInfo KeysMenuV2_UseKey08;
+
+ public static bool Prepare(MethodBase original)
+ {
+ if (original is null)
+ {
+ try
+ {
+ KeysMenuV2_UseKey01 = typeof(KeysMenuV2).GetMethod("UseKey01", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey02 = typeof(KeysMenuV2).GetMethod("UseKey02", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey03 = typeof(KeysMenuV2).GetMethod("UseKey03", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey04 = typeof(KeysMenuV2).GetMethod("UseKey04", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey05 = typeof(KeysMenuV2).GetMethod("UseKey05", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey06 = typeof(KeysMenuV2).GetMethod("UseKey06", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey07 = typeof(KeysMenuV2).GetMethod("UseKey07", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_UseKey08 = typeof(KeysMenuV2).GetMethod("UseKey08", BindingFlags.NonPublic | BindingFlags.Instance);
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine(exception);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // Activate/Deactivate key title objects only as necessary.
+ public static bool Prefix(KeysMenuV2 __instance
+ , ref int ___zoom
+ , ref Settings ___settings
+ )
+ {
+ if (ProgressManager.instance.data.puzzle01Done && !__instance.key02.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 2;
+ __instance.key02.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.torsoPuzzleDone && !__instance.key03.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 3;
+ __instance.key03.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.clockPuzzleIsDone && !__instance.key04.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 4;
+ __instance.key04.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.pianoPuzzleDone && !__instance.key05.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 5;
+ __instance.key05.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.libraryPuzzleState == 2 && !__instance.key06.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 6;
+ __instance.key06.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.gardenPuzzleDone && !__instance.key07.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 7;
+ __instance.key07.SetActive(true);
+ }
+
+ if (ProgressManager.instance.data.boss03Defeated && !__instance.key08.activeSelf)
+ {
+ ProgressManager.instance.data.keyAmount = 8;
+ __instance.key08.SetActive(true);
+ }
+
+ var currentKeyChanged = false;
+
+ if ((!__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsTag("Idle") || ___zoom != 2)
+ && __instance.currentKey != 0)
+ {
+ __instance.currentKey = 0;
+ currentKeyChanged = true;
+ }
+
+ if (ProgressManager.instance.data.keyAmount == 1 && __instance.keyAnim.GetInteger("KeyCount") != 1)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 1);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 2 && __instance.keyAnim.GetInteger("KeyCount") != 2)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 2);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 3 && __instance.keyAnim.GetInteger("KeyCount") != 3)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 3);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 4 && __instance.keyAnim.GetInteger("KeyCount") != 4)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 4);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 5 && __instance.keyAnim.GetInteger("KeyCount") != 5)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 5);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 6 && __instance.keyAnim.GetInteger("KeyCount") != 6)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 6);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 7 && __instance.keyAnim.GetInteger("KeyCount") != 7)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 7);
+ }
+ else if (ProgressManager.instance.data.keyAmount == 8 && __instance.keyAnim.GetInteger("KeyCount") != 8)
+ {
+ __instance.keyAnim.SetInteger("KeyCount", 8);
+ }
+
+ if (___zoom == 2)
+ {
+ if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle1"))
+ {
+ if (__instance.currentKey != 1)
+ {
+ __instance.currentKey = 1;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey01.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle2"))
+ {
+ if (__instance.currentKey != 2)
+ {
+ __instance.currentKey = 2;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey02.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle3"))
+ {
+ if (__instance.currentKey != 3)
+ {
+ __instance.currentKey = 3;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey03.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle8"))
+ {
+ if (__instance.currentKey != 4)
+ {
+ __instance.currentKey = 4;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey04.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle7"))
+ {
+ if (__instance.currentKey != 5)
+ {
+ __instance.currentKey = 5;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey05.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle4"))
+ {
+ if (__instance.currentKey != 6)
+ {
+ __instance.currentKey = 6;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey06.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle5"))
+ {
+ if (__instance.currentKey != 7)
+ {
+ __instance.currentKey = 7;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey07.Invoke(__instance, null);
+ }
+ }
+ else if (__instance.keyAnim.GetCurrentAnimatorStateInfo(0).IsName("Idle6"))
+ {
+ if (__instance.currentKey != 8)
+ {
+ __instance.currentKey = 8;
+ currentKeyChanged = true;
+ }
+
+ if (Input.GetKeyDown(___settings.keys["Action"]))
+ {
+ KeysMenuV2_UseKey08.Invoke(__instance, null);
+ }
+ }
+ }
+
+ if (currentKeyChanged)
+ {
+ __instance.key01Title.SetActive(__instance.currentKey == 1);
+ __instance.key02Title.SetActive(__instance.currentKey == 2);
+ __instance.key03Title.SetActive(__instance.currentKey == 3);
+ __instance.key04Title.SetActive(__instance.currentKey == 4);
+ __instance.key05Title.SetActive(__instance.currentKey == 5);
+ __instance.key06Title.SetActive(__instance.currentKey == 6);
+ __instance.key07Title.SetActive(__instance.currentKey == 7);
+ __instance.key08Title.SetActive(__instance.currentKey == 8);
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Update.cs b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Update.cs
new file mode 100644
index 0000000..654bb3f
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Update.cs
@@ -0,0 +1,76 @@
+using HarmonyLib;
+using System;
+using System.Reflection;
+using UnityEngine;
+
+namespace BepInEx5Plugins.Ash.Alisa.KeysMenuFix.HarmonyPatches
+{
+ [HarmonyPatch(typeof(KeysMenuV2), "Update")]
+ public class KeysMenuV2_Update
+ {
+ private static MethodInfo KeysMenuV2_SelectedItem;
+ private static MethodInfo KeysMenuV2_Move;
+ private static MethodInfo KeysMenuV2_Zoom;
+ private static MethodInfo KeysMenuV2_CloseKeysMenu;
+ private static MethodInfo KeysMenuV2_ItemFunction;
+ private static MethodInfo KeysMenuV2_KeyRingUpdate;
+
+ public static bool Prepare(MethodBase original)
+ {
+ if (original is null)
+ {
+ try
+ {
+ KeysMenuV2_SelectedItem = typeof(KeysMenuV2).GetMethod("SelectedItem", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_Move = typeof(KeysMenuV2).GetMethod("Move", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_Zoom = typeof(KeysMenuV2).GetMethod("Zoom", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_CloseKeysMenu = typeof(KeysMenuV2).GetMethod("CloseKeysMenu", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_ItemFunction = typeof(KeysMenuV2).GetMethod("ItemFunction", BindingFlags.NonPublic | BindingFlags.Instance);
+ KeysMenuV2_KeyRingUpdate = typeof(KeysMenuV2).GetMethod("KeyRingUpdate", BindingFlags.NonPublic | BindingFlags.Instance);
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine(exception);
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ // Call the Zoom method even if currentSelectedItem is null.
+ public static void Postfix(KeysMenuV2 __instance)
+ {
+ if (!__instance.locked)
+ {
+ __instance.RayCheckItem();
+ KeysMenuV2_SelectedItem.Invoke(__instance, null);
+ KeysMenuV2_Move.Invoke(__instance, null);
+ KeysMenuV2_Zoom.Invoke(__instance, null);
+
+ if (__instance.currentSelectedItem)
+ {
+ KeysMenuV2_CloseKeysMenu.Invoke(__instance, null);
+ KeysMenuV2_ItemFunction.Invoke(__instance, null);
+ }
+
+ if (__instance.keyRing_Obj.activeSelf)
+ {
+ KeysMenuV2_KeyRingUpdate.Invoke(__instance, null);
+ }
+ }
+
+ if (__instance.locked
+ && __instance.currentSelectedItem)
+ {
+ __instance.currentSelectedItem.transform.rotation = Quaternion.identity;
+ }
+
+ if (!__instance.itemList.itemsTotal[0].activeSelf
+ && __instance.titleNone.activeSelf)
+ {
+ __instance.titleNone.SetActive(false);
+ }
+ }
+ }
+}
diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Zoom.cs b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Zoom.cs
new file mode 100644
index 0000000..21b15e9
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/HarmonyPatches/KeysMenuV2_Zoom.cs
@@ -0,0 +1,76 @@
+using HarmonyLib;
+using UnityEngine;
+
+namespace BepInEx5Plugins.Ash.Alisa.KeysMenuFix.HarmonyPatches
+{
+ [HarmonyPatch(typeof(KeysMenuV2), "Zoom")]
+ public class KeysMenuV2_Zoom
+ {
+ // Check if currentSelectedItem is null before referencing it.
+ public static bool Prefix(KeysMenuV2 __instance
+ , ref Settings ___settings
+ , ref bool ___moving
+ , ref int ___zoom
+ , ref Vector3 ___zoomedIn
+ , ref float ___moveSpeed
+ , ref AudioSource ___audioSource
+ )
+ {
+ if (__instance.currentSelectedItem
+ && __instance.currentSelectedItem.name == "KeyRing"
+ && Input.GetKeyDown(___settings.keys["Action"])
+ && ___zoom == 0
+ && !___moving)
+ {
+ ___zoom = 1;
+ ___moving = true;
+ __instance.currentSelectedItem.transform.rotation = Quaternion.identity;
+ ___audioSource.PlayOneShot(__instance.keyRingZoomInSound, 1f);
+ }
+ else if (__instance.currentSelectedItem
+ && __instance.currentSelectedItem.name == "KeyRing"
+ && Input.GetKeyDown(___settings.keys["Cancel"])
+ && ___zoom == 2)
+ {
+ ___zoom = 3;
+ ___audioSource.PlayOneShot(__instance.keyRingZoomOutSound, 1f);
+ }
+
+ if (___zoom == 1)
+ {
+ __instance.rayPoint.localPosition = Vector3.MoveTowards(__instance.rayPoint.localPosition, ___zoomedIn, ___moveSpeed * Time.deltaTime);
+
+ if (__instance.rayPoint.localPosition == ___zoomedIn)
+ {
+ ___zoom = 2;
+ }
+ }
+ else if (___zoom == 3)
+ {
+ __instance.rayPoint.localPosition = Vector3.MoveTowards(__instance.rayPoint.localPosition, Vector3.zero, ___moveSpeed * Time.deltaTime);
+
+ if (__instance.rayPoint.localPosition == Vector3.zero)
+ {
+ ___zoom = 0;
+ ___moving = false;
+ }
+ }
+
+ if (__instance.currentSelectedItem
+ && __instance.currentSelectedItem.name == "KeyRing"
+ && ___zoom == 0
+ && !__instance.keyRingTitle.activeSelf)
+ {
+ __instance.keyRingTitle.SetActive(true);
+ }
+ else if ((__instance.currentSelectedItem
+ && __instance.currentSelectedItem.name != "KeyRing" || ___zoom != 0)
+ && __instance.keyRingTitle.activeSelf)
+ {
+ __instance.keyRingTitle.SetActive(false);
+ }
+
+ return false;
+ }
+ }
+}
diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/NuGet.Config b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/NuGet.Config
new file mode 100644
index 0000000..1864ded
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/NuGet.Config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/Plugin.cs b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/Plugin.cs
new file mode 100644
index 0000000..3fc377c
--- /dev/null
+++ b/BepInEx5Plugins.Ash.Alisa.KeysMenuFix/Plugin.cs
@@ -0,0 +1,26 @@
+using BepInEx;
+using HarmonyLib;
+using System;
+
+namespace BepInEx5Plugins.Ash.Alisa.KeysMenuFix
+{
+ [BepInPlugin(PluginInfo.PLUGIN_GUID, PluginInfo.PLUGIN_NAME, PluginInfo.PLUGIN_VERSION)]
+ public class Plugin : BaseUnityPlugin
+ {
+ private void Awake()
+ {
+ try
+ {
+ Logger.LogInfo($"Plugin {PluginInfo.PLUGIN_GUID} is loaded!");
+
+ var harmony = new Harmony(Info.Metadata.GUID);
+
+ harmony.PatchAll();
+ }
+ catch (Exception exception)
+ {
+ Console.WriteLine(exception);
+ }
+ }
+ }
+}