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(); }
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); } }
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); }
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; } }
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); }
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; } }
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); }
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)); }
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); }