public static bool ScrollingMenu_SortUnlocks(ScrollingMenu __instance, List <Unlock> myUnlockList, List <Unlock> ___listUnlocks)
        {
            List <DisplayedUnlock> displayedList = myUnlockList.ConvertAll(u => (DisplayedUnlock)u.__RogueLibsCustom);

            if (__instance.menuType == "FreeItems")
            {
                displayedList.RemoveAll(u => u is ItemUnlock itemUnlock && !itemUnlock.IsAvailableInItemTeleporter);
            }

            displayedList.Sort();
            CustomScrollingMenu menu = new CustomScrollingMenu(__instance, displayedList);

            if (RogueFramework.IsDebugEnabled(DebugFlags.UnlockMenus))
            {
                RogueFramework.LogDebug($"Setting up \"{menu.Type}\" menu.");
            }

            ___listUnlocks.Clear();
            ___listUnlocks.AddRange(menu.Unlocks.Select(du => du.Unlock));

            foreach (DisplayedUnlock du in menu.Unlocks)
            {
                du.Menu = menu;
            }

            if (menu.Type == UnlocksMenuType.Loadouts)
            {
                reRollLoadouts.Menu = menu;
                ___listUnlocks.Insert(0, reRollLoadouts.Unlock);
                if (RogueFramework.IsDebugEnabled(DebugFlags.EnableTools))
                {
                    RogueFramework.LogDebug("Adding \"GiveNuggets\" debug tool to the menu.");
                    giveNuggets.Menu = menu;
                    ___listUnlocks.Insert(0, giveNuggets.Unlock);
                }
            }
            if (menu.Type == UnlocksMenuType.MutatorMenu)
            {
                __instance.nuggetSlot.gameObject.SetActive(true);
                clearAllMutators.Menu = menu;
                ___listUnlocks.Insert(0, clearAllMutators.Unlock);
            }
            else if (menu.Type == UnlocksMenuType.RewardsMenu)
            {
                __instance.nuggetSlot.gameObject.SetActive(true);
                // clearAllItems.Menu = menu;
                // ___listUnlocks.Insert(0, clearAllItems.Unlock);
            }
            else if (menu.Type == UnlocksMenuType.TraitsMenu)
            {
                __instance.nuggetSlot.gameObject.SetActive(true);
                // clearAllTraits.Menu = menu;
                // ___listUnlocks.Insert(0, clearAllTraits.Unlock);
            }

            __instance.numButtons = ___listUnlocks.Count;
            return(false);
        }
        public static void ScrollingMenu_OpenScrollingMenu(ScrollingMenu __instance, ref float __state, List <Unlock> ___listUnlocks)
        {
            __instance.numButtons = ___listUnlocks.Count;
            float x     = __state / (__instance.numButtons - __instance.numButtonsOnScreen + 1f);
            bool  debug = RogueFramework.IsDebugEnabled(DebugFlags.UnlockMenus);

            if (debug)
            {
                RogueFramework.LogDebug($"Restoring menu's scrolling value of {__state} units.");
            }
            __instance.StartCoroutine(EnsureScrollbarValue(__instance, Mathf.Clamp01(1f - x)));

            if (__instance.menuType == "Challenges" || __instance.menuType == "FreeItems")
            {
                __instance.nuggetSlot.gameObject.SetActive(true);
            }
            else if (__instance.menuType == "Floors")
            {
                if (debug)
                {
                    RogueFramework.LogDebug("Setting up \"Floors\" menu.");
                }
                List <DisplayedUnlock> displayedUnlocks = GameController.gameController.sessionDataBig.floorUnlocks.Select(u => (DisplayedUnlock)u.__RogueLibsCustom).OrderBy(d => d).ToList();
                CustomScrollingMenu    menu             = new CustomScrollingMenu(__instance, displayedUnlocks);

                foreach (DisplayedUnlock du in displayedUnlocks.ToList())
                {
                    if (!du.IsAvailable)
                    {
                        displayedUnlocks.Remove(du);
                        __instance.buttonsData.Remove(du.ButtonData);
                        __instance.numButtons--;
                    }
                    else
                    {
                        du.Menu = menu;
                    }
                }

                foreach (ButtonData buttonData in __instance.buttonsData)
                {
                    SetupUnlocks(buttonData, buttonData.scrollingButtonUnlock);
                }
            }
            else if (__instance.menuType == "Traits")
            {
                if (debug)
                {
                    RogueFramework.LogDebug("Setting up \"Traits\" menu.");
                }
                __instance.numButtons = __instance.smallTraitList.Count;
                List <DisplayedUnlock> displayedUnlocks = __instance.smallTraitList.Select(u => (DisplayedUnlock)u.__RogueLibsCustom).OrderBy(d => d).ToList();
                CustomScrollingMenu    menu             = new CustomScrollingMenu(__instance, displayedUnlocks);

                foreach (DisplayedUnlock du in displayedUnlocks)
                {
                    du.Menu = menu;
                }

                foreach (ButtonData buttonData in __instance.buttonsData)
                {
                    SetupUnlocks(buttonData, buttonData.scrollingButtonUnlock);
                }
            }
            else if (__instance.menuType == "RemoveTrait" || __instance.menuType == "ChangeTraitRandom" || __instance.menuType == "UpgradeTrait")
            {
                if (debug)
                {
                    RogueFramework.LogDebug($"Setting up \"{__instance.menuType}\" menu.");
                }
                __instance.numButtons = __instance.customTraitList.Count;
                List <DisplayedUnlock> displayedUnlocks = __instance.customTraitList.Select(u => (DisplayedUnlock)u.__RogueLibsCustom).OrderBy(d => d).ToList();
                CustomScrollingMenu    menu             = new CustomScrollingMenu(__instance, displayedUnlocks);

                foreach (DisplayedUnlock du in displayedUnlocks)
                {
                    du.Menu = menu;
                }

                foreach (ButtonData buttonData in __instance.buttonsData)
                {
                    SetupUnlocks(buttonData, buttonData.scrollingButtonUnlock);
                }
            }
        }