private void ReloadMenu() { menu = new DisablableTextMenu { new TextMenu.Header(Dialog.Clean("MODOPTIONS_RANDOMIZER_HEADER")) }; var hashtext = new TextMenuExt.EaseInSubHeaderExt("{hash}", true, menu) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; void updateHashText() { hashtext.Title = "v" + RandoModule.Instance.Metadata.VersionString; if (Settings.SeedType == SeedType.Custom) { hashtext.Title += " #" + Settings.Hash.ToString(); } } updateHashText(); var errortext = new TextMenuExt.EaseInSubHeaderExt("{error}", false, menu) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; var seedbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEED") + ": " + Settings.Seed); seedbutton.Pressed(() => { Audio.Play(SFX.ui_main_savefile_rename_start); menu.SceneAs <Overworld>().Goto <UI.OuiTextEntry>().Init <OuiRandoSettings>( Settings.Seed, (v) => Settings.Seed = v, RandoModule.MAX_SEED_CHARS ); }); seedbutton.Visible = Settings.SeedType == SeedType.Custom; var seedtypetoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEEDTYPE"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEEDTYPE_" + Enum.GetNames(typeof(SeedType))[i].ToUpperInvariant())); }, 0, (int)SeedType.Last - 1, (int)Settings.SeedType).Change((i) => { Settings.SeedType = (SeedType)i; seedbutton.Visible = Settings.SeedType == SeedType.Custom; // just in case... seedbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_SEED") + ": " + Settings.Seed; updateHashText(); }); var mapbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER")).Pressed(() => { Audio.Play(SFX.ui_main_button_select); menu.SceneAs <Overworld>().Goto <OuiMapPicker>(); }); var mapcountlbl = new TextMenuExt.SubHeaderExt(Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS")) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; var logictoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_LOGIC"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_LOGIC_" + Enum.GetNames(typeof(LogicType))[i].ToUpperInvariant())); }, 0, (int)LogicType.Last - 1, (int)Settings.Algorithm).Change((i) => { Settings.Algorithm = (LogicType)i; updateHashText(); }); var lengthtoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_LENGTH"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_LENGTH_" + Enum.GetNames(typeof(MapLength))[i].ToUpperInvariant())); }, 0, (int)MapLength.Last - 1, (int)Settings.Length).Change((i) => { Settings.Length = (MapLength)i; updateHashText(); }); var numdashestoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_NUMDASHES"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_NUMDASHES_" + Enum.GetNames(typeof(NumDashes))[i].ToUpperInvariant())); }, 0, (int)NumDashes.Last - 1, (int)Settings.Dashes).Change((i) => { Settings.Dashes = (NumDashes)i; updateHashText(); }); var difficultytoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_DIFFICULTY"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_DIFFICULTY_" + Enum.GetNames(typeof(Difficulty))[i].ToUpperInvariant())); }, 0, (int)Difficulty.Last - 1, (int)Settings.Difficulty).Change((i) => { Settings.Difficulty = (Difficulty)i; updateHashText(); }); var repeatroomstoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_REPEATROOMS"), Settings.RepeatRooms).Change((val) => { Settings.RepeatRooms = val; updateHashText(); }); var enterunknowntext = new TextMenuExt.EaseInSubHeaderExt(Dialog.Clean("MODOPTIONS_RANDOMIZER_ENTERUNKNOWN_EXPLAIN"), false, menu) { HeightExtra = 17f, Offset = new Vector2(30, -5), }; var enterunknowntoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_ENTERUNKNOWN"), Settings.EnterUnknown).Change((val) => { Settings.EnterUnknown = val; updateHashText(); }); enterunknowntoggle.OnEnter += () => { enterunknowntext.FadeVisible = true; }; enterunknowntoggle.OnLeave += () => { enterunknowntext.FadeVisible = false; }; var shinetoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_SHINE"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_SHINE_" + Enum.GetNames(typeof(ShineLights))[i].ToUpperInvariant())); }, 0, (int)ShineLights.Last - 1, (int)Settings.Lights).Change((i) => { Settings.Lights = (ShineLights)i; updateHashText(); }); var darktoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_DARK"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_DARK_" + Enum.GetNames(typeof(Darkness))[i].ToUpperInvariant())); }, 0, (int)Darkness.Last - 1, (int)Settings.Darkness).Change((i) => { Settings.Darkness = (Darkness)i; updateHashText(); }); var goldentoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_GOLDENBERRY"), Settings.SpawnGolden).Change((val) => { Settings.SpawnGolden = val; }); var moreoptions = false; repeatroomstoggle.Visible = false; enterunknowntoggle.Visible = false; goldentoggle.Visible = false; shinetoggle.Visible = false; darktoggle.Visible = false; var moreoptionsbtn = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MOREOPTIONS")); moreoptionsbtn.Pressed(() => { moreoptions = !moreoptions; moreoptionsbtn.Label = moreoptions ? Dialog.Clean("MODOPTIONS_RANDOMIZER_FEWEROPTIONS") : Dialog.Clean("MODOPTIONS_RANDOMIZER_MOREOPTIONS"); repeatroomstoggle.Visible = moreoptions; enterunknowntoggle.Visible = moreoptions; goldentoggle.Visible = moreoptions; shinetoggle.Visible = moreoptions; darktoggle.Visible = moreoptions; }); void syncModel() { repeatroomstoggle.Index = Settings.RepeatRooms ? 1 : 0; enterunknowntoggle.Index = Settings.EnterUnknown ? 1 : 0; logictoggle.Index = (int)Settings.Algorithm; lengthtoggle.Index = (int)Settings.Length; numdashestoggle.Index = (int)Settings.Dashes; difficultytoggle.Index = (int)Settings.Difficulty; shinetoggle.Index = (int)Settings.Lights; darktoggle.Index = (int)Settings.Darkness; mapcountlbl.Title = Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"); var locked = Settings.Rules != Ruleset.Custom; mapbutton.Disabled = locked; repeatroomstoggle.Disabled = locked; enterunknowntoggle.Disabled = locked; logictoggle.Disabled = locked; lengthtoggle.Disabled = locked; numdashestoggle.Disabled = locked; difficultytoggle.Disabled = locked; shinetoggle.Disabled = locked; darktoggle.Disabled = locked; } syncModel(); var rulestoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_RULES"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_RULES_" + Enum.GetNames(typeof(Ruleset))[i].ToUpperInvariant())); }, 0, (int)Ruleset.Last - 1, (int)Settings.Rules).Change((i) => { Settings.Rules = (Ruleset)i; Settings.Enforce(); syncModel(); updateHashText(); }); var startbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_START")); startbutton.Pressed(() => { if (this.entering) { return; } void reenableMenu() { this.builderThread = null; startbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_START"); updateHashText(); menu.DisableMovement = false; } if (this.builderThread == null) { errortext.FadeVisible = false; startbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_CANCEL"); hashtext.Title += " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_GENERATING"); menu.DisableMovement = true; this.builderThread = new Thread(() => { Settings.Enforce(); AreaKey newArea; try { newArea = RandoLogic.GenerateMap(Settings); } catch (ThreadAbortException) { return; } catch (Exception e) { if (e.Message == "Could not generate map") { errortext.Title = e.Message; } else { errortext.Title = "Encountered an error - Check log.txt for details"; Logger.LogDetailed(e, "randomizer"); } errortext.FadeVisible = true; reenableMenu(); return; } this.entering = true; Audio.SetMusic((string)null, true, true); Audio.SetAmbience((string)null, true); Audio.Play("event:/ui/main/savefile_begin"); // use the debug file SaveData.InitializeDebugMode(); // turn on variants mode SaveData.Instance.VariantMode = true; SaveData.Instance.AssistMode = false; // clear summit gems, just in case! SaveData.Instance.SummitGems = new bool[6]; // mark as completed to spawn golden berry SaveData.Instance.Areas[newArea.ID].Modes[0].Completed = true; var fade = new FadeWipe(this.Scene, false, () => { // assign to variable to suppress compiler warning var session = new Session(newArea, null, null); //session.FirstLevel = false; // setting this value here prevents the wakeup animation. set it in a hook. LevelEnter.Go(session, true); this.builderThread = null; this.entering = false; }); /*foreach (AreaData area in AreaData.Areas) { * Logger.Log("randomizer", $"Skeleton for {area.GetSID()}"); * RandoConfigFile.YamlSkeleton(area); * * }*/ }); this.builderThread.Start(); } else { this.builderThread.Abort(); reenableMenu(); } }); menu.Add(seedtypetoggle); menu.Add(seedbutton); menu.Add(rulestoggle); menu.Add(mapbutton); menu.Add(mapcountlbl); menu.Add(logictoggle); menu.Add(lengthtoggle); menu.Add(numdashestoggle); menu.Add(difficultytoggle); menu.Add(moreoptionsbtn); menu.Add(repeatroomstoggle); menu.Add(enterunknowntoggle); menu.Add(enterunknowntext); menu.Add(shinetoggle); menu.Add(darktoggle); menu.Add(goldentoggle); menu.Add(startbutton); menu.Add(hashtext); menu.Add(errortext); Scene.Add(menu); }
private void ReloadMenu() { menu = new DisablableTextMenu { new TextMenu.Header(Dialog.Clean("MODOPTIONS_RANDOMIZER_HEADER")) }; var hashtext = new TextMenuExt.EaseInSubHeaderExt("{hash}", true, menu) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; void updateHashText() { hashtext.Title = "v" + RandoModule.Instance.Metadata.VersionString; if (Settings.SeedType == SeedType.Custom) { hashtext.Title += " #" + Settings.Hash.ToString(); } } updateHashText(); var errortext = new TextMenuExt.EaseInSubHeaderExt("{error}", false, menu) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; var seedbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEED") + ": " + Settings.Seed); seedbutton.Pressed(() => { Audio.Play(SFX.ui_main_savefile_rename_start); menu.SceneAs <Overworld>().Goto <UI.OuiTextEntry>().Init <OuiRandoSettings>( Settings.Seed, (v) => Settings.Seed = v, RandoModule.MAX_SEED_CHARS ); }); seedbutton.Visible = Settings.SeedType == SeedType.Custom; var seedtypetoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEEDTYPE"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_SEEDTYPE_" + Enum.GetNames(typeof(SeedType))[i].ToUpperInvariant())); }, 0, (int)SeedType.Last - 1, (int)Settings.SeedType).Change((i) => { Settings.SeedType = (SeedType)i; seedbutton.Visible = Settings.SeedType == SeedType.Custom; // just in case... seedbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_SEED") + ": " + Settings.Seed; updateHashText(); }); var mapbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER")).Pressed(() => { Audio.Play(SFX.ui_main_button_select); menu.SceneAs <Overworld>().Goto <OuiMapPicker>(); }); var mapcountlbl = new TextMenuExt.SubHeaderExt(Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS")) { HeightExtra = -10f, Offset = new Vector2(30, -5), }; var logictoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_LOGIC"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_LOGIC_" + Enum.GetNames(typeof(LogicType))[i].ToUpperInvariant())); }, 0, (int)LogicType.Last - 1, (int)Settings.Algorithm).Change((i) => { Settings.Algorithm = (LogicType)i; updateHashText(); }); var lengthtoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_LENGTH"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_LENGTH_" + Enum.GetNames(typeof(MapLength))[i].ToUpperInvariant())); }, 0, (int)MapLength.Last - 1, (int)Settings.Length).Change((i) => { Settings.Length = (MapLength)i; updateHashText(); }); var numdashestoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_NUMDASHES"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_NUMDASHES_" + Enum.GetNames(typeof(NumDashes))[i].ToUpperInvariant())); }, 0, (int)NumDashes.Last - 1, (int)Settings.Dashes).Change((i) => { Settings.Dashes = (NumDashes)i; updateHashText(); }); var difficultytoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_DIFFICULTY"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_DIFFICULTY_" + Enum.GetNames(typeof(Difficulty))[i].ToUpperInvariant())); }, 0, (int)Difficulty.Last - 1, (int)Settings.Difficulty).Change((i) => { Settings.Difficulty = (Difficulty)i; updateHashText(); }); var repeatroomstoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_REPEATROOMS"), Settings.RepeatRooms).Change((val) => { Settings.RepeatRooms = val; updateHashText(); }); var enterunknowntext = new TextMenuExt.EaseInSubHeaderExt(Dialog.Clean("MODOPTIONS_RANDOMIZER_ENTERUNKNOWN_EXPLAIN"), false, menu) { HeightExtra = 17f, Offset = new Vector2(30, -5), }; var enterunknowntoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_ENTERUNKNOWN"), Settings.EnterUnknown).Change((val) => { Settings.EnterUnknown = val; updateHashText(); }); enterunknowntoggle.OnEnter += () => { enterunknowntext.FadeVisible = true; }; enterunknowntoggle.OnLeave += () => { enterunknowntext.FadeVisible = false; }; var shinetoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_SHINE"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_SHINE_" + Enum.GetNames(typeof(ShineLights))[i].ToUpperInvariant())); }, 0, (int)ShineLights.Last - 1, (int)Settings.Lights).Change((i) => { Settings.Lights = (ShineLights)i; updateHashText(); }); var darktoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_DARK"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_DARK_" + Enum.GetNames(typeof(Darkness))[i].ToUpperInvariant())); }, 0, (int)Darkness.Last - 1, (int)Settings.Darkness).Change((i) => { Settings.Darkness = (Darkness)i; updateHashText(); }); var goldentoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_GOLDENBERRY"), Settings.SpawnGolden).Change((val) => { Settings.SpawnGolden = val; }); var variantstoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_VARIANTS"), Settings.Variants).Change((val) => { Settings.Variants = val; }); var decorationstoggle = new TextMenu.OnOff(Dialog.Clean("MODOPTIONS_RANDOMIZER_DECORATIONS"), Settings.RandomDecorations).Change((val) => { Settings.RandomDecorations = val; }); var moreoptions = false; repeatroomstoggle.Visible = false; enterunknowntoggle.Visible = false; goldentoggle.Visible = false; shinetoggle.Visible = false; darktoggle.Visible = false; variantstoggle.Visible = false; decorationstoggle.Visible = false; var moreoptionsbtn = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_MOREOPTIONS")); moreoptionsbtn.Pressed(() => { moreoptions = !moreoptions; moreoptionsbtn.Label = moreoptions ? Dialog.Clean("MODOPTIONS_RANDOMIZER_FEWEROPTIONS") : Dialog.Clean("MODOPTIONS_RANDOMIZER_MOREOPTIONS"); repeatroomstoggle.Visible = moreoptions; enterunknowntoggle.Visible = moreoptions; goldentoggle.Visible = moreoptions; shinetoggle.Visible = moreoptions; darktoggle.Visible = moreoptions; variantstoggle.Visible = moreoptions; decorationstoggle.Visible = moreoptions; }); void syncModel() { repeatroomstoggle.Index = Settings.RepeatRooms ? 1 : 0; enterunknowntoggle.Index = Settings.EnterUnknown ? 1 : 0; variantstoggle.Index = Settings.Variants ? 1 : 0; logictoggle.Index = (int)Settings.Algorithm; lengthtoggle.Index = (int)Settings.Length; numdashestoggle.Index = (int)Settings.Dashes; difficultytoggle.Index = (int)Settings.Difficulty; shinetoggle.Index = (int)Settings.Lights; darktoggle.Index = (int)Settings.Darkness; mapcountlbl.Title = Settings.LevelCount.ToString() + " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_MAPPICKER_LEVELS"); var locked = Settings.Rules != Ruleset.Custom; mapbutton.Disabled = locked; repeatroomstoggle.Disabled = locked; enterunknowntoggle.Disabled = locked; logictoggle.Disabled = locked; lengthtoggle.Disabled = locked; numdashestoggle.Disabled = locked; difficultytoggle.Disabled = locked; shinetoggle.Disabled = locked; darktoggle.Disabled = locked; variantstoggle.Disabled = locked; } syncModel(); var rulestoggle = new TextMenu.Slider(Dialog.Clean("MODOPTIONS_RANDOMIZER_RULES"), (i) => { return(Dialog.Clean("MODOPTIONS_RANDOMIZER_RULES_" + Enum.GetNames(typeof(Ruleset))[i].ToUpperInvariant())); }, 0, (int)Ruleset.Last - 1, (int)Settings.Rules).Change((i) => { Settings.Rules = (Ruleset)i; Settings.Enforce(); syncModel(); updateHashText(); }); var startbutton = new TextMenu.Button(Dialog.Clean("MODOPTIONS_RANDOMIZER_START")); startbutton.Pressed(() => { if (this.entering) { return; } void reenableMenu() { this.builderThread = null; startbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_START"); updateHashText(); menu.DisableMovement = false; } if (this.builderThread == null) { errortext.FadeVisible = false; startbutton.Label = Dialog.Clean("MODOPTIONS_RANDOMIZER_CANCEL"); hashtext.Title += " " + Dialog.Clean("MODOPTIONS_RANDOMIZER_GENERATING"); menu.DisableMovement = true; this.builderThread = new Thread(() => { Settings.Enforce(); AreaKey newArea; try { newArea = RandoLogic.GenerateMap(Settings); } catch (ThreadAbortException) { return; } catch (GenerationError e) { errortext.Title = e.Message; errortext.FadeVisible = true; reenableMenu(); return; } catch (Exception e) { errortext.Title = "Encountered an error - Check log.txt for details"; Logger.LogDetailed(e, "randomizer"); errortext.FadeVisible = true; reenableMenu(); return; } // save settings RandoModule.Instance.SavedData.SavedSettings = Settings.Copy(); RandoModule.Instance.SaveSettings(); this.entering = true; RandoModule.StartMe = newArea; while (RandoModule.StartMe != null) { Thread.Sleep(10); } this.builderThread = null; this.entering = false; }); this.builderThread.Start(); } else { this.builderThread.Abort(); reenableMenu(); } }); menu.Add(seedtypetoggle); menu.Add(seedbutton); menu.Add(rulestoggle); menu.Add(mapbutton); menu.Add(mapcountlbl); menu.Add(logictoggle); menu.Add(lengthtoggle); menu.Add(numdashestoggle); menu.Add(difficultytoggle); menu.Add(moreoptionsbtn); menu.Add(repeatroomstoggle); menu.Add(enterunknowntoggle); menu.Add(enterunknowntext); menu.Add(shinetoggle); menu.Add(darktoggle); menu.Add(goldentoggle); menu.Add(variantstoggle); menu.Add(decorationstoggle); menu.Add(startbutton); menu.Add(hashtext); menu.Add(errortext); Scene.Add(menu); }
public override IEnumerator Enter(Oui from) { menu = new TextMenu(); // display the title and a dummy "Fetching" button menu.Add(new TextMenu.Header(Dialog.Clean("UPDATECHECKER_MENU_TITLE"))); menu.Add(subHeader = new TextMenuExt.SubHeaderExt(Dialog.Clean("UPDATECHECKER_MENU_HEADER"))); fetchingButton = new TextMenu.Button(Dialog.Clean("UPDATECHECKER_FETCHING")); fetchingButton.Disabled = true; menu.Add(fetchingButton); Scene.Add(menu); menu.Visible = Visible = true; menu.Focused = false; for (float p = 0f; p < 1f; p += Engine.DeltaTime * 4f) { menu.X = offScreenX + -1920f * Ease.CubeOut(p); alpha = Ease.CubeOut(p); yield return(null); } menu.Focused = true; task = new Task(() => { // 1. Download the updates list Logger.Log("UpdateChecker", "Downloading last versions list"); try { using (WebClient wc = new WebClient()) { string yamlData = wc.DownloadString("https://max480-random-stuff.appspot.com/celeste/everest_update.yaml"); updateCatalog = new Deserializer().Deserialize <Dictionary <string, ModUpdateInfo> >(yamlData); foreach (string name in updateCatalog.Keys) { updateCatalog[name].Name = name; } Logger.Log("UpdateChecker", $"Downloaded {updateCatalog.Count} item(s)"); } } catch (Exception e) { Logger.Log("UpdateChecker", $"Download failed! {e.ToString()}"); } // 2. Find out what actually has been updated availableUpdatesCatalog.Clear(); if (updateCatalog != null) { Logger.Log("UpdateChecker", "Checking for updates"); foreach (EverestModule module in Everest.Modules) { EverestModuleMetadata metadata = module.Metadata; if (metadata.PathArchive != null && updateCatalog.ContainsKey(metadata.Name)) { string xxHashStringInstalled = BitConverter.ToString(metadata.Hash).Replace("-", "").ToLowerInvariant(); Logger.Log("UpdateChecker", $"Mod {metadata.Name}: installed hash {xxHashStringInstalled}, latest hash(es) {string.Join(", ", updateCatalog[metadata.Name].xxHash)}"); if (!updateCatalog[metadata.Name].xxHash.Contains(xxHashStringInstalled)) { availableUpdatesCatalog.Add(updateCatalog[metadata.Name], metadata); } } } Logger.Log("UpdateChecker", $"{availableUpdatesCatalog.Count} update(s) available"); } }); task.Start(); }
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)); }