private static void onCreatePauseMenuButtons(Level level, TextMenu menu, bool minimal) { if (CollabModule.Instance.Session.LobbySID != null) { // find the position just under "Return to Map". int returnToMapIndex = menu.GetItems().FindIndex(item => item.GetType() == typeof(TextMenu.Button) && ((TextMenu.Button)item).Label == Dialog.Clean("MENU_PAUSE_RETURN")); if (returnToMapIndex == -1) { // fall back to the bottom of the menu. returnToMapIndex = menu.GetItems().Count - 1; } // add the "Return to Lobby" button TextMenu.Button returnToLobbyButton = new TextMenu.Button(Dialog.Clean("collabutils2_returntolobby")); returnToLobbyButton.Pressed(() => { level.PauseMainMenuOpen = false; menu.RemoveSelf(); openReturnToLobbyConfirmMenu(level, menu.Selection); }); returnToLobbyButton.ConfirmSfx = "event:/ui/main/message_confirm"; menu.Insert(returnToMapIndex + 1, returnToLobbyButton); } }
/// <summary> /// Add an Enter and Leave handler, displaying a description if selected. /// </summary> /// <param name="option">The input TextMenu.Item option.</param> /// <param name="containingMenu">The menu containing the TextMenu.Item option.</param> /// <param name="description"></param> /// <returns>The passed option.</returns> public static TextMenu.Item AddDescription(this TextMenu.Item option, TextMenu containingMenu, string description) { // build the description menu entry TextMenuExt.EaseInSubHeaderExt descriptionText = new TextMenuExt.EaseInSubHeaderExt(description, false, containingMenu) { TextColor = Color.Gray, HeightExtra = 0f }; List <TextMenu.Item> items = containingMenu.GetItems(); if (items.Contains(option)) { // insert the description after the option. containingMenu.Insert(items.IndexOf(option) + 1, descriptionText); } option.OnEnter += delegate { // make the description appear. descriptionText.FadeVisible = true; }; option.OnLeave += delegate { // make the description disappear. descriptionText.FadeVisible = false; }; return(option); }
/// <summary> /// Add an Enter and Leave handler, notifying the user that a relaunch is required to apply the changes. /// </summary> /// <param name="option">The input TextMenu.Item option.</param> /// <param name="containingMenu">The menu containing the TextMenu.Item option.</param> /// <param name="needsRelaunch">This method does nothing if this is set to false.</param> /// <returns>The passed option.</returns> public static TextMenu.Item NeedsRelaunch(this TextMenu.Item option, TextMenu containingMenu, bool needsRelaunch = true) { if (!needsRelaunch) { return(option); } // build the "Restart is required" text menu entry TextMenuExt.EaseInSubHeaderExt needsRelaunchText = new TextMenuExt.EaseInSubHeaderExt(Dialog.Clean("MODOPTIONS_NEEDSRELAUNCH"), false, containingMenu) { TextColor = Color.OrangeRed, HeightExtra = 0f }; List <TextMenu.Item> items = containingMenu.GetItems(); if (items.Contains(option)) { // insert the text after the option that needs relaunch. containingMenu.Insert(items.IndexOf(option) + 1, needsRelaunchText); } option.OnEnter += delegate { // make the description appear. needsRelaunchText.FadeVisible = true; }; option.OnLeave += delegate { // make the description disappear. needsRelaunchText.FadeVisible = false; }; return(option); }
private void ModifyLevelMenu(Level level, TextMenu pausemenu, bool minimal) { if (this.InRandomizer) { foreach (var item in new System.Collections.Generic.List <TextMenu.Item>(pausemenu.GetItems())) { if (item.GetType() == typeof(TextMenu.Button)) { var btn = (TextMenu.Button)item; if (btn.Label == Dialog.Clean("MENU_PAUSE_SAVEQUIT") || btn.Label == Dialog.Clean("MENU_PAUSE_RETURN")) { pausemenu.Remove(item); } if (btn.Label == Dialog.Clean("MENU_PAUSE_RESTARTAREA")) { btn.Label = Dialog.Clean("MENU_PAUSE_RESTARTRANDO"); } } } int returnIdx = pausemenu.GetItems().Count; pausemenu.Add(new TextMenu.Button(Dialog.Clean("MENU_PAUSE_QUITRANDO")).Pressed(() => { level.PauseMainMenuOpen = false; pausemenu.RemoveSelf(); TextMenu menu = new TextMenu(); menu.AutoScroll = false; menu.Position = new Vector2((float)Engine.Width / 2f, (float)((double)Engine.Height / 2.0 - 100.0)); menu.Add(new TextMenu.Header(Dialog.Clean("MENU_QUITRANDO_TITLE"))); menu.Add(new TextMenu.Button(Dialog.Clean("MENU_QUITRANDO_CONFIRM")).Pressed((Action)(() => { Engine.TimeRate = 1f; menu.Focused = false; level.Session.InArea = false; Audio.SetMusic((string)null, true, true); Audio.BusStopAll("bus:/gameplay_sfx", true); level.DoScreenWipe(false, (Action)(() => Engine.Scene = (Scene) new LevelExit(LevelExit.Mode.SaveAndQuit, level.Session, level.HiresSnow)), true); foreach (LevelEndingHook component in level.Tracker.GetComponents <LevelEndingHook>()) { if (component.OnEnd != null) { component.OnEnd(); } } }))); menu.Add(new TextMenu.Button(Dialog.Clean("MENU_QUITRANDO_CANCEL")).Pressed((Action)(() => menu.OnCancel()))); menu.OnPause = menu.OnESC = (Action)(() => { menu.RemoveSelf(); level.Paused = false; Engine.FreezeTimer = 0.15f; Audio.Play("event:/ui/game/unpause"); }); menu.OnCancel = (Action)(() => { Audio.Play("event:/ui/main/button_back"); menu.RemoveSelf(); level.Pause(returnIdx, minimal, false); }); level.Add((Entity)menu); })); } }
public void CreatePauseMenuButtons(Level level, TextMenu menu, bool minimal) { if (Everest.Flags.IsDisabled || !Settings.ShowModOptionsInGame) { return; } List <TextMenu.Item> items = menu.GetItems(); int index; // Find the options button and place our button below it. string cleanedOptions = Dialog.Clean("menu_pause_options"); index = items.FindIndex(_ => { TextMenu.Button other = (_ as TextMenu.Button); if (other == null) { return(false); } return(other.Label == cleanedOptions); }); if (index != -1) { index++; } // Otherwise, place it below the last button. else { index = items.Count; } TextMenu.Item itemModOptions = null; menu.Insert(index, itemModOptions = new TextMenu.Button(Dialog.Clean("menu_pause_modoptions")).Pressed(() => { int returnIndex = menu.IndexOf(itemModOptions); menu.RemoveSelf(); level.PauseMainMenuOpen = false; level.Paused = true; TextMenu options = OuiModOptions.CreateMenu(true, LevelExt.PauseSnapshot); options.OnESC = options.OnCancel = () => { Audio.Play(Sfxs.ui_main_button_back); options.CloseAndRun(Everest.SaveSettings(), () => level.Pause(returnIndex, minimal, false)); }; options.OnPause = () => { Audio.Play(Sfxs.ui_main_button_back); options.CloseAndRun(Everest.SaveSettings(), () => { level.Paused = false; Engine.FreezeTimer = 0.15f; }); }; level.Add(options); })); }
private void onCreatePauseMenuButtons(Level level, TextMenu menu, bool minimal) { int optionsIndex = menu.GetItems().FindIndex(item => item.GetType() == typeof(TextMenu.Button) && ((TextMenu.Button)item).Label == Dialog.Clean("menu_pause_options")); // insert ourselves just before Options if required (this is below Variants if variant mode is enabled) if (Settings.OptionsOutOfModOptionsMenuEnabled) { menu.Insert(optionsIndex, AbstractSubmenu.BuildOpenMenuButton <OuiExtendedVariantsSubmenu>(menu, true, null /* this is not used when in-game anyway */, new object[] { true })); } }
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(); if (!(items[2] is TextMenu.OnOff firstToggle)) { // ??? 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); } } }), }; foreach (var key in RandoLogic.AvailableAreas) { var area = AreaData.Get(key); var mode = AreaData.GetMode(key); 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(mode.MapData.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS")) { HeightExtra = -10f, Offset = new Vector2(30, -5), }); } Scene.Add(menu); }
public override void Update() { if (menu != null && menu.Focused && Selected) { Overworld.Maddy.Show = false; if (Input.MenuCancel.Pressed || Input.Pause.Pressed || Input.ESC.Pressed) { if (!Searching) { Audio.Play(SFX.ui_main_button_back); Overworld.Goto <OuiChapterSelect>(); } else { Searching = false; MInput.Disabled = false; } } } base.Update(); if (Searching) { // Otherwise spacebar will turn on free cam while searching ((patch_MountainRenderer)Overworld.Mountain).SetFreeCam(false); // Don't allow pressing any buttons while searching foreach (TextMenu.Item item in items) { item.Disabled = true; } } if (menu != null) { foreach (TextMenu.Item item in menu.GetItems()) { item.Disabled = Searching; } } MInput.Disabled = false; }
public override void CreateModMenuSection(TextMenu menu, bool inGame, EventInstance snapshot) { // Optional - reload mod settings when entering the mod options. // LoadSettings(); base.CreateModMenuSection(menu, inGame, snapshot); if (!inGame) { List <TextMenu.Item> items = menu.GetItems(); // change the "key config" labels (items[items.Count - 2] as TextMenu.Button).Label = Dialog.Clean("MODOPTIONS_COREMODULE_KEYCONFIG") + " " + (items[items.Count - 2] as TextMenu.Button).Label; (items[items.Count - 1] as TextMenu.Button).Label = Dialog.Clean("MODOPTIONS_COREMODULE_KEYCONFIG") + " " + (items[items.Count - 1] as TextMenu.Button).Label; // insert extra options before the "key config" options menu.Insert(items.Count - 2, new TextMenu.Button(Dialog.Clean("modoptions_coremodule_oobe")).Pressed(() => { OuiModOptions.Instance.Overworld.Goto <OuiOOBE>(); })); menu.Insert(items.Count - 2, new TextMenu.Button(Dialog.Clean("modoptions_coremodule_soundtest")).Pressed(() => { OuiModOptions.Instance.Overworld.Goto <OuiSoundTest>(); })); menu.Insert(items.Count - 2, new TextMenu.Button(Dialog.Clean("modoptions_coremodule_versionlist")).Pressed(() => { OuiModOptions.Instance.Overworld.Goto <OuiVersionList>(); })); menu.Insert(items.Count - 2, new TextMenu.Button(Dialog.Clean("modoptions_coremodule_modupdates")).Pressed(() => { OuiModOptions.Instance.Overworld.Goto <OuiModUpdateList>(); })); menu.Insert(items.Count - 2, new TextMenu.Button(Dialog.Clean("modoptions_coremodule_togglemods")).Pressed(() => { OuiModOptions.Instance.Overworld.Goto <OuiModToggler>(); })); } }
public void CreatePauseMenuButtons(Level level, TextMenu menu, bool minimal) { if (Everest.Flags.IsDisabled || !Settings.ShowModOptionsInGame) { return; } List <TextMenu.Item> items = menu.GetItems(); int index; // Find the options button and place our button below it. string cleanedOptions = Dialog.Clean("menu_pause_options"); index = items.FindIndex(_ => { TextMenu.Button other = (_ as TextMenu.Button); if (other == null) { return(false); } return(other.Label == cleanedOptions); }); if (index != -1) { index++; } // Otherwise, place it below the last button. else { index = items.Count; } TextMenu.Item itemModOptions = null; menu.Insert(index, itemModOptions = new TextMenu.Button(Dialog.Clean("menu_pause_modoptions")).Pressed(() => { int returnIndex = menu.IndexOf(itemModOptions); menu.RemoveSelf(); level.PauseMainMenuOpen = false; level.Paused = true; TextMenu options = OuiModOptions.CreateMenu(true, LevelExt.PauseSnapshot); options.OnESC = options.OnCancel = () => { Audio.Play(SFX.ui_main_button_back); options.CloseAndRun(Everest.SaveSettings(), () => { level.Pause(returnIndex, minimal, false); // adjust the Mod Options menu position, in case it moved (pause menu entries added/removed after changing mod options). TextMenu textMenu = level.Entities.GetToAdd().FirstOrDefault((Entity e) => e is TextMenu) as TextMenu; TextMenu.Button modOptionsButton = textMenu?.GetItems().OfType <TextMenu.Button>() .FirstOrDefault(button => button.Label == Dialog.Clean("menu_pause_modoptions")); if (modOptionsButton != null) { textMenu.Selection = textMenu.IndexOf(modOptionsButton); } }); }; options.OnPause = () => { Audio.Play(SFX.ui_main_button_back); options.CloseAndRun(Everest.SaveSettings(), () => { level.Paused = false; Engine.FreezeTimer = 0.15f; }); }; level.Add(options); })); }
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); }
public override void Update() { musicParamMenuEase = Calc.Approach(musicParamMenuEase, musicParamMenu?.Focused ?? false ? 1 : 0, Engine.DeltaTime * 2f); if (!(Selected && Focused)) { goto End; } if (musicParamMenu.Focused) { musicParamMenu.Update(); } if (Focused && musicParamMenu != null && Input.MenuJournal.Pressed && musicParamMenu.GetItems().Count != 0) { musicParamMenu.Selection = musicParamMenu.FirstPossibleSelection; musicParamMenu.Focused = !musicParamMenu.Focused; } if (Input.MenuRight.Pressed && selectedDigit < (digits.Length - 1) && !musicParamMenu.Focused) { selectedDigit = Math.Min(selectedDigit + 1, (digits.Length - 1)); wigglerDigits[selectedDigit].Start(); Audio.Play(SFX.ui_main_roll_down); } else if (Input.MenuLeft.Pressed && selectedDigit > 0 && !musicParamMenu.Focused) { selectedDigit = Math.Max(selectedDigit - 1, 0); wigglerDigits[selectedDigit].Start(); Audio.Play(SFX.ui_main_roll_up); } else if (Input.MenuDown.Pressed && !musicParamMenu.Focused) { UpdateDigits(selectedDigit, -1); } else if (Input.MenuUp.Pressed && !musicParamMenu.Focused) { UpdateDigits(selectedDigit, +1); } else if (Input.MenuConfirm.Pressed) { if (playing != null) { Audio.Stop(playing); } if (!string.IsNullOrEmpty(selectedPath)) { playing = playWithMusicParams(selectedPath, musicParams); playingPath = selectedPath; } } else if (Input.MenuCancel.Pressed || Input.Pause.Pressed || Input.ESC.Pressed) { if (musicParamMenu.Focused) { musicParamMenu.Focused = false; } else { Focused = false; Audio.Play(SFX.ui_main_button_back); Overworld.Goto <OuiModOptions>(); } } End: pressedTimer -= Engine.DeltaTime; timer += Engine.DeltaTime; for (int i = 0; i < digits.Length; i++) { wigglerDigits[i].Update(); } wigglerPath.Update(); wigglerBankPath.Update(); }
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); }