diff --git a/Code/ForceVariant.cs b/Code/ForceVariant.cs index 1fac4b9..b27f550 100644 --- a/Code/ForceVariant.cs +++ b/Code/ForceVariant.cs @@ -47,7 +47,6 @@ public static class ForceVariants { Variant.Invincible, }; - private static Dictionary itemList = new(); private static Hook enableHook, disableHook, aPressHook; private static TextMenu variantMenu; @@ -142,19 +141,6 @@ internal static void Load() { On.Celeste.ChangeRespawnTrigger.OnEnter += OnChangeRespawn; On.Celeste.Level.AssistMode += Level_AssistMode; On.Celeste.Level.VariantMode += Level_VariantMode; - - Delegate optionChanged = new Action>, TextMenu.Option>(OnChange); - disableHook = new Hook( - typeof(TextMenu.Option).GetMethod("LeftPressed", BindingFlags.Instance | BindingFlags.Public), - optionChanged); - - enableHook = new Hook( - typeof(TextMenu.Option).GetMethod("RightPressed", BindingFlags.Instance | BindingFlags.Public), - optionChanged); - - aPressHook = new Hook( - typeof(TextMenu.Option).GetMethod("ConfirmPressed", BindingFlags.Instance | BindingFlags.Public), - optionChanged); } internal static void Unload() { @@ -162,11 +148,6 @@ internal static void Unload() { On.Celeste.Level.AssistMode -= Level_AssistMode; On.Celeste.Level.VariantMode -= Level_VariantMode; On.Celeste.TextMenu.Close -= TextMenu_Close; - - enableHook?.Dispose(); - disableHook?.Dispose(); - aPressHook?.Dispose(); - enableHook = disableHook = aPressHook = null; } private static void OnChangeRespawn(On.Celeste.ChangeRespawnTrigger.orig_OnEnter orig, ChangeRespawnTrigger self, Player player) { @@ -174,17 +155,6 @@ private static void OnChangeRespawn(On.Celeste.ChangeRespawnTrigger.orig_OnEnter SaveToSession(); } - private static void OnChange(Action> orig, TextMenu.Option self) { - orig(self); - - if (itemList.ContainsKey(self)) { - bool value = self.Index >= 1; - int index = itemList[self]; - Variants_Default[index] = value; - - } - } - private static void Level_VariantMode(On.Celeste.Level.orig_VariantMode orig, Level self, int returnIndex, bool minimal) { orig(self, returnIndex, minimal); List list = self.Entities.ToAdd; @@ -200,22 +170,32 @@ private static void Level_AssistMode(On.Celeste.Level.orig_AssistMode orig, Leve private static void OnVariantMenu(TextMenu menu, bool assist) { variantMenu = menu; IsaSession session = GrabBagModule.Session; - itemList = new Dictionary(); On.Celeste.TextMenu.Close += TextMenu_Close; int index = assist ? 8 : 0; for (int i = 0; i < menu.Items.Count; ++i) { TextMenu.Item item = menu.Items[i]; - if (item is not TextMenu.OnOff) { + if (item is not TextMenu.OnOff onoff) { continue; } Variant v = (!assist && bingoUIMenuModified) ? Variant.NoGrabbing : menuLayout[index++]; - itemList.Add(item, (int)v); + + onoff.OnValueChange = OnChangeVariant(onoff.OnValueChange, onoff, v); } } + private static Action OnChangeVariant(Action orig, TextMenu.Option self, Variant v) { + return val => { + orig(val); + + bool value = self.Index >= 1; + int index = (int)v; + Variants_Default[index] = value; + }; + } + private static void TextMenu_Close(On.Celeste.TextMenu.orig_Close orig, TextMenu self) { orig(self); if (variantMenu != self) {