Esempio n. 1
0
        private void changeStartingLevelSet(int direction)
        {
            lastDirection = direction;
            Audio.Play((direction > 0) ? "event:/ui/main/button_toggle_on" : "event:/ui/main/button_toggle_off");

            if (NewGameLevelSet == null)
            {
                NewGameLevelSet = "Celeste";
            }

            int id;

            if (direction > 0)
            {
                id = AreaData.Areas.FindLastIndex(area => area.GetLevelSet() == NewGameLevelSet) + direction;
            }
            else
            {
                id = AreaData.Areas.FindIndex(area => area.GetLevelSet() == NewGameLevelSet) + direction;
            }

            if (id >= AreaData.Areas.Count)
            {
                id = 0;
            }
            if (id < 0)
            {
                id = AreaData.Areas.Count - 1;
            }

            NewGameLevelSet = AreaData.Areas[id].GetLevelSet();

            Label = DialogExt.CleanLevelSet(NewGameLevelSet ?? "Celeste");
            ((patch_OuiFileSelectSlot)selectSlot).WiggleMenu();
        }
Esempio n. 2
0
        public TextMenu CreateMenu(bool inGame, EventInstance snapshot)
        {
            menu = new TextMenu();
            items.Clear();

            menu.Add(new TextMenu.Header(Dialog.Clean("maplist_title")));

            if (menu.Height > menu.ScrollableMinSize)
            {
                menu.Position.Y = menu.ScrollTargetY;
            }

            menu.Add(new TextMenu.SubHeader(Dialog.Clean("maplist_filters")));

            sets.Clear();
            foreach (AreaData area in AreaData.Areas)
            {
                string levelSet = area.GetLevelSet();
                if (string.IsNullOrEmpty(levelSet))
                {
                    continue;
                }
                if (levelSet == "Celeste")
                {
                    continue;
                }
                if (sets.Contains(levelSet))
                {
                    continue;
                }
                sets.Add(levelSet);
            }

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_type"), value => {
                if (value == 0)
                {
                    return(Dialog.Clean("levelset_celeste"));
                }
                if (value == 1)
                {
                    return(Dialog.Clean("maplist_type_allmods"));
                }
                return(DialogExt.CleanLevelSet(sets[value - 2]));
            }, 0, 1 + sets.Count, type).Change(value => {
                type = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_side"), value => ((char)('A' + value)).ToString(), 0, Enum.GetValues(typeof(AreaMode)).Length - 1, side).Change(value => {
                side = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.SubHeader(Dialog.Clean("maplist_list")));

            ReloadItems();

            return(menu);
        }
        public OuiFileSelectSlotLevelSetPicker(OuiFileSelectSlot selectSlot)
        {
            this.selectSlot = selectSlot;

            Label  = DialogExt.CleanLevelSet(NewGameLevelSet ?? "Celeste");
            Scale  = 0.5f;
            Action = () => changeStartingLevelSet(1);

            // find out what is the width of the biggest level set out there.
            float levelSetNameWidth = 0;

            foreach (AreaData areaData in AreaData.Areas)
            {
                levelSetNameWidth = Math.Max(levelSetNameWidth, ActiveFont.Measure(DialogExt.CleanLevelSet(areaData.GetLevelSet())).X);
            }
            arrowOffset = new Vector2(20f + levelSetNameWidth / 2 * Scale, 0f);
        }
        private void AddLevelSetMenu(string levelSetID)
        {
            List <AreaKey> keys = RandoLogic.LevelSets[levelSetID];

            menu.Add(new TextMenu.SubHeader(DialogExt.CleanLevelSet(keys[0].GetLevelSet())));
            foreach (var key in keys)
            {
                var area = AreaData.Get(key);
                var name = area.Name;
                name = name.DialogCleanOrNull() ?? name.SpacedPascalCase();
                if (key.Mode != AreaMode.Normal || (area.Mode.Length != 1 && area.Mode[1] != null))
                {
                    name += " " + Char.ToString((char)('A' + (int)key.Mode));
                }
                AddAreaToggle(name, key);
            }
        }
Esempio n. 5
0
        public OuiFileSelectSlotLevelSetPicker(OuiFileSelectSlot selectSlot)
        {
            this.selectSlot = selectSlot;

            // if the default starting level set still exists, set it by default.
            if (AreaData.Areas.Any(area => area.GetLevelSet() == CoreModule.Settings.DefaultStartingLevelSet))
            {
                NewGameLevelSet = CoreModule.Settings.DefaultStartingLevelSet;
            }

            Label  = DialogExt.CleanLevelSet(NewGameLevelSet ?? "Celeste");
            Scale  = 0.5f;
            Action = () => changeStartingLevelSet(1);

            // find out what is the width of the biggest level set out there.
            float levelSetNameWidth = 0;

            foreach (AreaData areaData in AreaData.Areas)
            {
                levelSetNameWidth = Math.Max(levelSetNameWidth, ActiveFont.Measure(DialogExt.CleanLevelSet(areaData.GetLevelSet())).X);
            }
            arrowOffset = new Vector2(20f + levelSetNameWidth / 2 * Scale, 0f);
        }
Esempio n. 6
0
        private void ReloadItems()
        {
            foreach (TextMenu.Item item in items)
            {
                menu.Remove(item);
            }
            items.Clear();

            string filterSet = null;

            if (type == 0)
            {
                filterSet = "Celeste";
            }
            else if (type >= 2)
            {
                filterSet = sets[type - 2];
            }

            string        lastLevelSet          = null;
            LevelSetStats levelSetStats         = null;
            int           levelSetAreaOffset    = 0;
            int           levelSetUnlockedAreas = int.MaxValue;
            int           levelSetUnlockedModes = int.MaxValue;
            string        name;

            List <AreaStats> areaStatsAll = SaveData.Instance.Areas;

            for (int i = 0; i < AreaData.Areas.Count; i++)
            {
                AreaData area = AreaData.Areas[i];
                if (!area.HasMode((AreaMode)side))
                {
                    continue;
                }

                string levelSet = area.GetLevelSet();

                if ((filterSet == null && levelSet == "Celeste") || (filterSet != null && filterSet != levelSet))
                {
                    continue;
                }

                if (lastLevelSet != levelSet)
                {
                    lastLevelSet          = levelSet;
                    levelSetStats         = SaveData.Instance.GetLevelSetStatsFor(levelSet);
                    levelSetAreaOffset    = levelSetStats.AreaOffset;
                    levelSetUnlockedAreas = levelSetStats.UnlockedAreas;
                    levelSetUnlockedModes = levelSetStats.UnlockedModes;
                    if (levelSet != "Celeste")
                    {
                        name = DialogExt.CleanLevelSet(levelSet);
                        TextMenuExt.SubHeaderExt levelSetHeader = new TextMenuExt.SubHeaderExt(name);
                        levelSetHeader.Alpha = 0f;
                        menu.Add(levelSetHeader);
                        items.Add(levelSetHeader);
                    }
                }

                name = area.Name;
                name = name.DialogCleanOrNull() ?? name.SpacedPascalCase();

                TextMenuExt.ButtonExt button = new TextMenuExt.ButtonExt(name);
                button.Alpha = 0f;

                if (area.Icon != "areas/null")
                {
                    button.Icon = area.Icon;
                }
                button.IconWidth = 64f;

                if (levelSet == "Celeste" && i > levelSetAreaOffset + levelSetUnlockedAreas)
                {
                    button.Disabled = true;
                }
                if (side == 1 && !areaStatsAll[i].Cassette)
                {
                    button.Disabled = true;
                }
                if (side >= 2 && levelSetUnlockedModes < (side + 1))
                {
                    button.Disabled = true;
                }

                menu.Add(button.Pressed(() => {
                    Inspect(area, (AreaMode)side);
                }));
                items.Add(button);
            }

            // Do this afterwards as the menu has now properly updated its size.
            for (int i = 0; i < items.Count; i++)
            {
                Add(new Coroutine(FadeIn(i, items[i])));
            }

            if (menu.Height > menu.ScrollableMinSize)
            {
                menu.Position.Y = menu.ScrollTargetY;
            }
        }
Esempio n. 7
0
        public TextMenu CreateMenu(bool inGame, EventInstance snapshot)
        {
            menu = new TextMenu();
            items.Clear();

            menu.Add(new TextMenu.Header(Dialog.Clean("maplist_title")));

            menu.Add(new TextMenu.SubHeader(Dialog.Clean("maplist_filters")));

            menu.Add(new TextMenu.Button(Dialog.Clean("maplist_reload")).Pressed(() => {
                Audio.Play(SFX.ui_postgame_unlock_newchapter);
                Overworld.Mountain.UntiltedCamera = cameraStart;
                OuiHelper_ChapterSelect_Reload.Reload();
                Overworld.Goto <OuiMapList>();
            }));

            sets.Clear();
            foreach (AreaData area in AreaData.Areas)
            {
                string levelSet = area.GetLevelSet();
                if (string.IsNullOrEmpty(levelSet))
                {
                    continue;
                }
                if (levelSet == "Celeste")
                {
                    continue;
                }
                if (sets.Contains(levelSet))
                {
                    continue;
                }
                sets.Add(levelSet);
            }

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_type"), value => {
                if (value == 0)
                {
                    return(Dialog.Clean("levelset_celeste"));
                }
                if (value == 1)
                {
                    return(Dialog.Clean("maplist_type_allmods"));
                }
                return(DialogExt.CleanLevelSet(sets[value - 2]));
            }, 0, 1 + sets.Count, type).Change(value => {
                type = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_side"), value => ((char)('A' + value)).ToString(), 0, Enum.GetValues(typeof(AreaMode)).Length - 1, side).Change(value => {
                side = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.SubHeader(Dialog.Clean("maplist_list")));

            ReloadItems();

            return(menu);
        }
Esempio n. 8
0
        private void ReloadItems()
        {
            foreach (TextMenu.Item item in items)
            {
                menu.Remove(item);
            }
            items.Clear();

            string filterSet = null;

            if (type == 0)
            {
                filterSet = "Celeste";
            }
            else if (type >= 3)
            {
                filterSet = sets[type - 3];
            }

            string        lastLevelSet          = null;
            LevelSetStats levelSetStats         = null;
            int           levelSetAreaOffset    = 0;
            int           levelSetUnlockedAreas = int.MaxValue;
            int           levelSetUnlockedModes = int.MaxValue;
            string        name;

            SaveData         save         = SaveData.Instance;
            List <AreaStats> areaStatsAll = save.Areas;

            for (int i = 0; i < AreaData.Areas.Count; i++)
            {
                AreaData area = AreaData.Get(i);
                if (area == null || !area.HasMode((AreaMode)side))
                {
                    continue;
                }

                // TODO: Make subchapters hidden by default in the map list, even in debug mode.
                if (!save.DebugMode && !string.IsNullOrEmpty(area.GetMeta()?.Parent))
                {
                    continue;
                }

                string levelSet = area.GetLevelSet();

                if (type != 1 && ((filterSet == null && levelSet == "Celeste") || (filterSet != null && filterSet != levelSet)))
                {
                    continue;
                }

                name = area.Name;
                name = name.DialogCleanOrNull() ?? name.SpacedPascalCase();

                if (lastLevelSet != levelSet)
                {
                    lastLevelSet          = levelSet;
                    levelSetStats         = SaveData.Instance.GetLevelSetStatsFor(levelSet);
                    levelSetAreaOffset    = levelSetStats.AreaOffset;
                    levelSetUnlockedAreas = levelSetStats.UnlockedAreas;
                    levelSetUnlockedModes = levelSetStats.UnlockedModes;
                    string setname = DialogExt.CleanLevelSet(levelSet);
                    TextMenuExt.SubHeaderExt levelSetHeader = new TextMenuExt.SubHeaderExt(setname);
                    levelSetHeader.Alpha = 0f;
                    menu.Add(levelSetHeader);
                    items.Add(levelSetHeader);
                }

                TextMenuExt.ButtonExt button = new TextMenuExt.ButtonExt(name);
                button.Alpha = 0f;

                if (area.Icon != "areas/null")
                {
                    button.Icon = area.Icon;
                }
                button.IconWidth = 64f;

                if (levelSet == "Celeste" && i > levelSetAreaOffset + levelSetUnlockedAreas)
                {
                    button.Disabled = true;
                }
                if (side == 1 && !areaStatsAll[i].Cassette)
                {
                    button.Disabled = true;
                }
                if (side >= 2 && levelSetUnlockedModes < (side + 1))
                {
                    button.Disabled = true;
                }

                menu.Add(button.Pressed(() => {
                    Inspect(area, (AreaMode)side);
                }));
                items.Add(button);
            }

            // compute a delay so that options don't take more than a second to show up if many mods are installed.
            float delayBetweenOptions = 0.03f;

            if (items.Count > 0)
            {
                delayBetweenOptions = Math.Min(0.03f, 1f / items.Count);
            }

            // Do this afterwards as the menu has now properly updated its size.
            for (int i = 0; i < items.Count; i++)
            {
                Add(new Coroutine(FadeIn(i, delayBetweenOptions, items[i])));
            }

            if (menu.Height > menu.ScrollableMinSize)
            {
                menu.Position.Y = menu.ScrollTargetY;
            }
        }
Esempio n. 9
0
        private TextMenu CreateMenu(bool inGame, EventInstance snapshot)
        {
            menu = new TextMenu();
            items.Clear();

            menu.Add(new TextMenu.Header(Dialog.Clean("maplist_title")));

            menu.Add(new patch_TextMenu.patch_SubHeader(Dialog.Clean("maplist_filters")));

            sets.Clear();
            foreach (AreaData area in AreaData.Areas)
            {
                string levelSet = area.GetLevelSet();
                if (string.IsNullOrEmpty(levelSet))
                {
                    continue;
                }
                if (levelSet == "Celeste")
                {
                    continue;
                }
                if (sets.Contains(levelSet))
                {
                    continue;
                }
                sets.Add(levelSet);
            }

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_type"), value => {
                if (value == 0)
                {
                    return(Dialog.Clean("levelset_celeste"));
                }
                if (value == 1)
                {
                    return(Dialog.Clean("maplist_type_everything"));
                }
                if (value == 2)
                {
                    return(Dialog.Clean("maplist_type_allmods"));
                }
                return(DialogExt.CleanLevelSet(sets[value - 3]));
            }, 0, 2 + sets.Count, type).Change(value => {
                type = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.Slider(Dialog.Clean("maplist_side"), value => ((char)('A' + value)).ToString(), 0, Enum.GetValues(typeof(AreaMode)).Length - 1, side).Change(value => {
                side = value;
                ReloadItems();
            }));

            menu.Add(new TextMenu.Button(Dialog.Clean("maplist_search")).Pressed(() => {
                Overworld.Goto <OuiMapSearch>();
            }));

            menu.Add(new patch_TextMenu.patch_SubHeader(Dialog.Clean("maplist_list")));

            ReloadItems();

            return(menu);
        }
Esempio n. 10
0
        private void ReloadMenu()
        {
            menu = new TextMenu {
                new TextMenu.Header(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_HEADER")),
                new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_TOGGLEALL")).Pressed(() => {
                    var items = menu.GetItems();
                    TextMenu.OnOff firstToggle = null;
                    foreach (var item in items)
                    {
                        if (item is TextMenu.OnOff)
                        {
                            firstToggle = item as TextMenu.OnOff;
                            break;
                        }
                    }
                    if (firstToggle == null)
                    {
                        // ???
                        return;
                    }

                    var newValue = 1 - firstToggle.Index;
                    for (int i = 0; i < items.Count; i++)
                    {
                        if (items[i] is TextMenu.OnOff toggle)
                        {
                            toggle.Index = newValue;
                            toggle.OnValueChange(toggle.Values[newValue].Item2);
                        }
                    }
                }),
            };

            var lvlCount = new Dictionary <RandoSettings.AreaKeyNotStupid, int>();

            foreach (var room in RandoLogic.AllRooms)
            {
                var notstupid = new RandoSettings.AreaKeyNotStupid(room.Area);
                if (lvlCount.TryGetValue(notstupid, out int c))
                {
                    lvlCount[notstupid] = c + 1;
                }
                else
                {
                    lvlCount[notstupid] = 1;
                }
            }
            string currentSet = null;

            foreach (var key in RandoLogic.AvailableAreas)
            {
                var area = AreaData.Get(key);
                var mode = AreaData.GetMode(key);

                if (currentSet != area.GetLevelSet())
                {
                    currentSet = area.GetLevelSet();
                    menu.Add(new TextMenu.SubHeader(DialogExt.CleanLevelSet(currentSet)));
                }

                var on   = Settings.MapIncluded(key);
                var name = area.Name;
                name = name.DialogCleanOrNull() ?? name.SpacedPascalCase();
                if (key.Mode != AreaMode.Normal || (area.Mode.Length != 1 && area.Mode[1] != null))
                {
                    name += " " + Char.ToString((char)('A' + (int)key.Mode));
                }

                menu.Add(new TextMenu.OnOff(name, on).Change(this.MakeChangeFunc(key)));
                menu.Add(new TextMenuExt.SubHeaderExt(lvlCount[new RandoSettings.AreaKeyNotStupid(key)].ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"))
                {
                    HeightExtra = -10f,
                    Offset      = new Vector2(30, -5),
                });
            }

            if (currentSet != "Celeste")
            {
                menu.Insert(2, new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_RESET")).Pressed(() => {
                    Settings.SetNormalMaps();
                    // this is a stupid way to do this
                    int levelsetIdx = -1;
                    foreach (var item in menu.GetItems())
                    {
                        if (item is TextMenu.SubHeader && !(item is TextMenuExt.SubHeaderExt))
                        {
                            levelsetIdx++;
                        }
                        else if (item is TextMenu.OnOff toggle)
                        {
                            toggle.Index = levelsetIdx == 0 ? 1 : 0;
                        }
                    }
                }));
            }

            Scene.Add(menu);
        }
        private Tuple <List <TextMenu.Item>, Action> MakeMapPicker(Action syncOutward)
        {
            var menu      = new List <TextMenu.Item>();
            var toggleAll = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_TOGGLEALL")).Pressed(() => {
                TextMenu.OnOff firstToggle = null;
                foreach (var item in menu)
                {
                    if (item is TextMenu.OnOff)
                    {
                        firstToggle = item as TextMenu.OnOff;
                        break;
                    }
                }

                if (firstToggle == null)
                {
                    // ???
                    return;
                }

                var newValue = 1 - firstToggle.Index;
                foreach (var item in menu)
                {
                    if (item is TextMenu.OnOff toggle)
                    {
                        toggle.Index = newValue;
                        toggle.OnValueChange(toggle.Values[newValue].Item2);
                    }
                }
            });

            menu.Add(toggleAll);

            var mapcountlbl = new TextMenuExt.SubHeaderExt(Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"))
            {
                HeightExtra = -10f,
                Offset      = new Vector2(30, -5),
            };

            menu.Add(mapcountlbl);

            void syncTotal()
            {
                mapcountlbl.Title = Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS");
            }

            void syncInner()
            {
                syncOutward();
                syncTotal();
            }

            Action AddAreaToggle(string name, AreaKey key)
            {
                var    toggle   = new TextMenu.OnOff(name, false);
                Action syncFunc = () => {
                    var on = Settings.MapIncluded(key);
                    toggle.Index = on ? 1 : 0;
                };
                var numLevels = RandoLogic.LevelCount[new RandoSettings.AreaKeyNotStupid(key)];

                menu.Add(toggle.Change(this.MakeChangeFunc(key, syncInner)));
                menu.Add(new TextMenuExt.SubHeaderExt(numLevels.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"))
                {
                    HeightExtra = -10f,
                    Offset      = new Vector2(30, -5),
                });
                syncFunc();
                return(syncFunc);
            }

            Action AddLevelSetToggle(string name, List <AreaKey> keys)
            {
                var    toggle   = new TextMenu.OnOff(name, false);
                Action syncFunc = () => {
                    var on = Settings.MapIncluded(keys[0]);
                    toggle.Index = on ? 1 : 0;
                };
                var numLevels = 0;

                foreach (AreaKey key in keys)
                {
                    numLevels += RandoLogic.LevelCount[new RandoSettings.AreaKeyNotStupid(key)];
                }
                menu.Add(toggle.Change(this.MakeChangeFunc(keys, syncInner)));
                menu.Add(new TextMenuExt.SubHeaderExt(numLevels.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"))
                {
                    HeightExtra = -10f,
                    Offset      = new Vector2(30, -5),
                });
                syncFunc();
                return(syncFunc);
            }

            Action AddLevelSetMenu(string levelSetID)
            {
                List <AreaKey> keys      = RandoLogic.LevelSets[levelSetID];
                var            syncFuncs = new List <Action>();

                menu.Add(new TextMenu.SubHeader(DialogExt.CleanLevelSet(keys[0].GetLevelSet())));
                foreach (var key in keys)
                {
                    var area = AreaData.Get(key);
                    var name = area.Name;
                    name = name.DialogCleanOrNull() ?? name.SpacedPascalCase();
                    if (key.Mode != AreaMode.Normal || (area.Mode.Length != 1 && area.Mode[1] != null))
                    {
                        name += " " + Char.ToString((char)('A' + (int)key.Mode));
                    }

                    syncFuncs.Add(AddAreaToggle(name, key));
                }

                return(() => {
                    foreach (var a in syncFuncs)
                    {
                        a();
                    }
                    syncTotal();
                });
            }

            var allSyncs = new List <Action>();

            // Create submenu for Celeste, campaigns, then other levelsets
            allSyncs.Add(AddLevelSetMenu("Celeste"));
            List <string> completedLevelSets = new List <string> {
                "Celeste"
            };

            var campaigns = RandoModule.Instance.MetaConfig.Campaigns;

            foreach (RandoMetadataCampaign campaign in campaigns)
            {
                menu.Add(new TextMenu.SubHeader(DialogExt.CleanLevelSet(campaign.Name)));
                foreach (RandoMetadataLevelSet levelSet in campaign.LevelSets)
                {
                    var name = levelSet.Name;
                    if (RandoLogic.LevelSets.TryGetValue(levelSet.ID, out var keys))
                    {
                        allSyncs.Add(AddLevelSetToggle(name, keys));
                        completedLevelSets.Add(levelSet.ID);
                    }
                }
            }

            foreach (string levelSet in RandoLogic.LevelSets.Keys)
            {
                if (!completedLevelSets.Contains(levelSet))
                {
                    allSyncs.Add(AddLevelSetMenu(levelSet));
                }
            }

            // If Celeste is not the only levelset, Reset should turn all other levelsets off
            if (RandoLogic.LevelSets.Count > 1)
            {
                menu.Insert(2, new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_RESET")).Pressed(() => {
                    Settings.SetNormalMaps();
                    // this is a stupid way to do this
                    int levelsetIdx = -1;
                    foreach (var item in menu)
                    {
                        if (item is TextMenu.SubHeader && !(item is TextMenuExt.SubHeaderExt))
                        {
                            levelsetIdx++;
                        }
                        else if (item is TextMenu.OnOff toggle)
                        {
                            toggle.Index = levelsetIdx == 0 ? 1 : 0;
                        }
                    }
                }));
            }

            Action finalSync = () => {
                foreach (var aa in allSyncs)
                {
                    aa();
                }
            };

            return(Tuple.Create(menu, finalSync));
        }
Esempio n. 12
0
        private void ReloadMenu()
        {
            menu = new TextMenu {
                new TextMenu.Header(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_HEADER")),
                new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_TOGGLEALL")).Pressed(() => {
                    var items = menu.GetItems();
                    TextMenu.OnOff firstToggle = null;
                    foreach (var item in items)
                    {
                        if (item is TextMenu.OnOff)
                        {
                            firstToggle = item as TextMenu.OnOff;
                            break;
                        }
                    }
                    if (firstToggle == null)
                    {
                        // ???
                        return;
                    }

                    var newValue = 1 - firstToggle.Index;
                    for (int i = 0; i < items.Count; i++)
                    {
                        if (items[i] is TextMenu.OnOff toggle)
                        {
                            toggle.Index = newValue;
                            toggle.OnValueChange(toggle.Values[newValue].Item2);
                        }
                    }
                }),
            };

            // Create submenu for Celeste, campaigns, then other levelsets
            AddLevelSetMenu("Celeste");
            List <string> completedLevelSets = new List <string> {
                "Celeste"
            };

            var campaigns = RandoModule.Instance.MetaConfig.Campaigns;

            foreach (RandoMetadataCampaign campaign in campaigns)
            {
                menu.Add(new TextMenu.SubHeader(DialogExt.CleanLevelSet(campaign.Name)));
                foreach (RandoMetadataLevelSet levelSet in campaign.LevelSets)
                {
                    var name = levelSet.Name;
                    if (RandoLogic.LevelSets.TryGetValue(levelSet.ID, out var keys))
                    {
                        AddLevelSetToggle(name, keys);
                        completedLevelSets.Add(levelSet.ID);
                    }
                }
            }

            foreach (string levelSet in RandoLogic.LevelSets.Keys)
            {
                if (!completedLevelSets.Contains(levelSet))
                {
                    AddLevelSetMenu(levelSet);
                }
            }

            // If Celeste is not the only levelset, Reset should turn all other levelsets off
            if (RandoLogic.LevelSets.Count > 1)
            {
                menu.Insert(2, new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_RESET")).Pressed(() => {
                    Settings.SetNormalMaps();
                    // this is a stupid way to do this
                    int levelsetIdx = -1;
                    foreach (var item in menu.GetItems())
                    {
                        if (item is TextMenu.SubHeader && !(item is TextMenuExt.SubHeaderExt))
                        {
                            levelsetIdx++;
                        }
                        else if (item is TextMenu.OnOff toggle)
                        {
                            toggle.Index = levelsetIdx == 0 ? 1 : 0;
                        }
                    }
                }));
            }

            Scene.Add(menu);
        }