private IEnumerator Cutscene(Level level) { player.StateMachine.State = Player.StDummy; player.Dashes = 1; Audio.SetMusic(null); if (bonfire != null) { yield return(1.0f); yield return(player.DummyWalkTo(bonfire.X - 12f)); yield return(0.2f); player.Facing = Facings.Right; player.DummyAutoAnimate = false; player.Sprite.Play("duck"); yield return(0.5f); var dreaming = level.Session.Dreaming; level.Session.Dreaming = false; bonfire.SetMode(Bonfire.Mode.Lit); level.Session.Dreaming = dreaming; yield return(1f); player.Sprite.Play("idle"); yield return(0.4f); player.DummyAutoAnimate = true; yield return(player.DummyWalkTo(bonfire.X - 24f)); yield return(0.4f); player.DummyAutoAnimate = false; player.Facing = Facings.Right; } else { player.Facing = Facings.Right; yield return(1.0f); player.DummyAutoAnimate = false; } player.Sprite.Play("sleep"); Audio.Play("event:/char/madeline/campfire_sit", player.Position); yield return(3f); FadeWipe fadeWipe = new FadeWipe(level, false, () => EndCutscene(level)); level.Add(fadeWipe); }
private void MainThreadHook(On.Celeste.AutoSplitterInfo.orig_Update orig, AutoSplitterInfo self) { orig(self); if (AreaHandoff != null) { AreaData.Areas.Add(AreaHandoff); var key = new AreaKey(AreaData.Areas.Count - 1); // does this trigger some extra behavior AreaHandoff = null; } if (StartMe != null && !Entering) { var newArea = StartMe.Value; 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/off variants mode SaveData.Instance.VariantMode = Settings.Variants; SaveData.Instance.AssistMode = false; // mark as completed to spawn golden berry SaveData.Instance.Areas[newArea.ID].Modes[0].Completed = true; // mark heart as not collected SaveData.Instance.Areas[newArea.ID].Modes[0].HeartGem = false; Entering = true; var fade = new FadeWipe(Engine.Scene, false, () => { // assign to variable to suppress compiler warning var session = new Session(newArea, null, null) { FirstLevel = true, StartedFromBeginning = true, }; session.SeedCleanRandom(Settings.SeedType == SeedType.Random); SaveData.Instance.StartSession(session); // need to set this earlier than we would get otherwise LevelEnter.Go(session, true); StartMe = null; Entering = false; }); /*foreach (AreaData area in AreaData.Areas) { * Logger.Log("randomizer", $"Skeleton for {area.GetSID()}"); * RandoConfigFile.YamlSkeleton(area); * * }*/ } }
private void StartGame() { StopSfx(); textCoroutine = null; session.Audio.Music.Event = areaMusic; if (menu != null) { menu.RemoveSelf(); menu = null; } FadeWipe fadeWipe = new FadeWipe(this, false, delegate { Engine.Scene = new LevelLoader(session); }); fadeWipe.OnUpdate = delegate(float f) { textAlpha = Math.Min(textAlpha, 1f - f); }; exiting = true; }
private void MainThreadHook(On.Celeste.AutoSplitterInfo.orig_Update orig, AutoSplitterInfo self) { orig(self); if (AreaHandoff != null) { if (AreaHandoff.ID < AreaData.Areas.Count) { AreaData.Areas[AreaHandoff.ID] = AreaHandoff; } else if (AreaHandoff.ID == AreaData.Areas.Count) { AreaData.Areas.Add(AreaHandoff); } else { throw new Exception("Strange edge case in the randomizer, please report this bug"); } var unused = new AreaKey(AreaData.Areas.Count - 1); // does this trigger some extra behavior AreaHandoff = null; } if (StartMe != null && !Entering) { var newArea = StartMe.Value; var area = AreaData.Get(newArea); var dyn = new DynData <AreaData>(area); var areaSettings = dyn.Get <RandoSettings>("RandoSettings"); Audio.SetMusic(null); Audio.SetAmbience(null); Audio.Play("event:/ui/main/savefile_begin"); // use the debug file SaveData.InitializeDebugMode(); // turn on/off variants mode SaveData.Instance.VariantMode = areaSettings.Variants; SaveData.Instance.AssistMode = false; // mark as completed to spawn golden berry SaveData.Instance.Areas[newArea.ID].Modes[0].Completed = true; // mark heart as not collected SaveData.Instance.Areas[newArea.ID].Modes[0].HeartGem = false; Entering = true; var unused = new FadeWipe(Engine.Scene, false, () => { // assign to variable to suppress compiler warning Session session; if (UseSession != null) { session = UseSession; UseSession = null; } else { session = new Session(newArea) { FirstLevel = true, StartedFromBeginning = true, }; session.SeedCleanRandom(Settings.SeedType == SeedType.Random); } SaveData.Instance.StartSession(session); // need to set this earlier than we would get otherwise StartMe = null; Entering = false; LevelEnter.Go(session, true); }); /*foreach (AreaData area in AreaData.Areas) { * Logger.Log("randomizer", $"Skeleton for {area.GetSID()}"); * RandoConfigFile.YamlSkeleton(area); * * }*/ } // update endless mode score var settings = (Engine.Scene is AreaComplete) ? this.endingSettings : this.InRandomizerSettings; if (settings != null && settings.Algorithm == LogicType.Endless) { this.CurrentScore = ComputeScore(settings); } else { this.CurrentScore = -1; } }
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 IEnumerator Cutscene() { Engine.TimeRate = 1f; boost.Active = false; yield return(null); yield return(0.152f); cameraOffset = new Vector2(0.0f, -20f); boost.Active = true; player.EnforceLevelBounds = false; yield return(null); BlackholeBG blackhole = Level.Background.Get <BlackholeBG>(); if (blackhole != null) { blackhole.Direction = -2.5f; blackhole.SnapStrength(Level, BlackholeBG.Strengths.High); blackhole.CenterOffset.Y = 100f; blackhole.OffsetOffset.Y = -50f; blackhole = null; } Add(new Coroutine(WaveCamera())); Add(new Coroutine(BirdRoutine(0.8f))); Level.Add(streaks = new AscendManager.Streaks(null)); for (var p = 0.0f; p < 1.0; p += Engine.DeltaTime / 12f) { fadeToWhite = p; streaks.Alpha = p; foreach (Parallax parallax in Level.Foreground.GetEach <Parallax>("blackhole")) { Parallax fg = parallax; fg.FadeAlphaMultiplier = 1f - p; } yield return(null); } while (bird != null) { yield return(null); } FadeWipe wipe = new FadeWipe(Level, false) { Duration = 4f }; var from = cameraOffset.Y; var to = 180; for (var p = 0.0f; p < 1.0; p += Engine.DeltaTime / 2f) { cameraOffset.Y = from + (to - from) * Ease.BigBackIn(p); yield return(null); } while (wipe.Percent < 1.0) { yield return(null); } EndCutscene(Level); }