private static Celeste.PlayerDeadBody PlayerDie(On.Celeste.Player.orig_Die orig, Celeste.Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { Celeste.Session session = (self.Scene as Celeste.Level).Session; Celeste.PlayerDeadBody playerDeadBody = orig(self, direction, evenIfInvincible, registerDeathInStats); if (playerDeadBody != null) { Celeste.Strawberry goldenStrawb = null; foreach (Celeste.Follower follower in self.Leader.Followers) { if (follower.Entity is Celeste.Strawberry && (follower.Entity as Celeste.Strawberry).Golden && !(follower.Entity as Celeste.Strawberry).Winged) { goldenStrawb = (follower.Entity as Celeste.Strawberry); } } Vector2?specialBoxLevel = (FactoryHelperModule.Instance._Session as FactoryHelperSession).SpecialBoxPosition; if (goldenStrawb == null && specialBoxLevel != null) { playerDeadBody.DeathAction = delegate { Engine.Scene = new Celeste.LevelExit(Celeste.LevelExit.Mode.Restart, session); }; } } return(playerDeadBody); }
private PlayerDeadBody Player_Die(On.Celeste.Player.orig_Die orig, Player self, Microsoft.Xna.Framework.Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { PlayerDeadBody result = orig(self, direction, evenIfInvincible, registerDeathInStats); if (result == null) { return(null); } if (Settings.RecordDeaths) { Vector2 newlocation = self.Position; newlocation.Y -= 16; deaths.Add(newlocation); } deathspopupdelays.Clear(); deaths.ForEach((_) => { deathspopupdelays.Add(GetRandom.NextFloat(0.25f)); }); if (Settings.RecordDeaths) { deathspopupdelays[deaths.Count - 1] = 0f; } deathTimer = 0f; return(result); }
public PlayerDeadBody OnDie(On.Celeste.Player.orig_Die orig, Player player, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { PlayerDeadBody corpse = orig(player, direction, evenIfInvincible, registerDeathInStats); if (GhostRecorder == null || GhostRecorder.Data == null) { return(corpse); } // This is hacky, but it works: // Check the stack trace for Celeste.Level+* <Pause>* // and throw away the data when we're just retrying. foreach (StackFrame frame in new StackTrace().GetFrames()) { MethodBase method = frame?.GetMethod(); if (method == null || method.DeclaringType == null) { continue; } if (!method.DeclaringType.FullName.StartsWith("Celeste.Level+") || !method.Name.StartsWith("<Pause>")) { continue; } GhostRecorder.Data = null; return(corpse); } GhostRecorder.Data.Dead = true; return(corpse); }
private PlayerDeadBody Player_Die(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { if (self.Dashes == 2) { twoDashesOnSpawn = true; } else { twoDashesOnSpawn = false; } foreach (Seeker seeker in spawnHelper.spawnedSeekers) { SeekerName nameObj = seeker.Get <SeekerName>(); nameObj.Name = null; } foreach (Snowball seeker in spawnHelper.spawnedSnowballs) { SnowballName nameObj = seeker.Get <SnowballName>(); nameObj.Name = null; } return(orig(self, direction, evenIfInvincible, registerDeathInStats)); }
private Celeste.PlayerDeadBody OnPlayerDie(On.Celeste.Player.orig_Die orig, Celeste.Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { PlayerDeadBody result = orig(self, direction, evenIfInvincible, registerDeathInStats); if (Settings.Enabled && result != null) { ApplyRules(self.Scene, "Die"); } return(result); }
private static PlayerDeadBody OnPlayerDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { PlayerDeadBody result = orig(self, direction, evenIfInvincible, registerDeathInStats); if (result != null && self.Scene is Level level && overworldWrapper != null) { // the player died, so we should close the "in-game overworld" before weird stuff happens. Close(level, true, true); } return(result); }
// Fixes bug with dreamSfx soundsource not being stopped private static PlayerDeadBody Player_Die(On.Celeste.Player.orig_Die orig, Player self, Vector2 dir, bool evenIfInvincible, bool registerDeathInStats) { SoundSource dreamSfxLoop = self.GetData().Get <SoundSource>("dreamSfxLoop"); if (dreamSfxLoop != null) { dreamSfxLoop.Stop(); } return(orig(self, dir, evenIfInvincible, registerDeathInStats)); }
private PlayerDeadBody PlayerOnDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { PlayerDeadBody playerDeadBody = orig(self, direction, evenIfInvincible, registerDeathInStats); if (playerDeadBody != null && Enabled) { causeOfDeath = GetCauseOfDeath(); deathPosition = self.Position; } return(playerDeadBody); }
private PlayerDeadBody onPlayerDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { if (!Settings.AllStrawberriesAreGoldens) { return(orig(self, direction, evenIfInvincible, registerDeathInStats)); } // get the first following strawberry before it is detached by the orig method Strawberry firstStrawberry = null; foreach (Follower follower in self.Leader.Followers) { if (follower.Entity is Strawberry) { firstStrawberry = (follower.Entity as Strawberry); break; } } Level level = self.SceneAs <Level>(); // call the orig method PlayerDeadBody deadBody = orig(self, direction, evenIfInvincible, registerDeathInStats); if (deadBody != null && !deadBody.HasGolden && firstStrawberry != null) { // the player is dead, doesn't have the actual golden but has a strawberry. // we have to do magic to make the game believe they had the golden. // (actually, we just do what vanilla does, but with a regular berry instead.) deadBody.HasGolden = true; deadBody.DeathAction = () => { LevelExit exit = new LevelExit(LevelExit.Mode.GoldenBerryRestart, level.Session) { GoldenStrawberryEntryLevel = firstStrawberry.ID.Level }; // if the berry saved the player's inventory on collection, pass it over to the scene. DynData <Strawberry> firstStrawberryData = new DynData <Strawberry>(firstStrawberry); if (firstStrawberryData.Data.ContainsKey("playerInventoryOnCollection")) { new DynData <LevelExit>(exit)["playerInventoryToRestore"] = firstStrawberryData.Get <PlayerInventory>("playerInventoryOnCollection"); } Engine.Scene = exit; }; } // proceed return(deadBody); }
private static Celeste.PlayerDeadBody OnDeath(On.Celeste.Player.orig_Die orig, Celeste.Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { Celeste.PlayerDeadBody result = orig(self, direction, evenIfInvincible, registerDeathInStats); if (result != null) { string level = self.SceneAs <Celeste.Level>().Session.Level; if (TrollLandModule.Session.DeathCountPerLevel.ContainsKey(level)) { TrollLandModule.Session.DeathCountPerLevel[level] += 1; } else { TrollLandModule.Session.DeathCountPerLevel[level] = 1; } } return(result); }
private PlayerDeadBody DieInEndless(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenifinvincible, bool registerdeathinstats) { var result = orig(self, direction, evenifinvincible, registerdeathinstats); var settings = this.InRandomizerSettings; if (result == null || settings == null || settings.Algorithm != LogicType.Endless) { return(result); } var dyn = new DynData <Session>(SaveData.Instance.CurrentSession); if (dyn.Get <bool?>("SavedByTheBell") ?? false) { dyn.Set <bool?>("SavedByTheBell", false); return(result); } result.DeathAction = () => Engine.Scene = (Scene) new LevelExit(LevelExit.Mode.GoldenBerryRestart, SaveData.Instance.CurrentSession); return(result); }
private static PlayerDeadBody Player_OnDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible = false, bool registerDeathsInStats = true) { IEnumerable <Player> players = self.Scene.Tracker.GetEntities <Player>().Cast <Player>(); int playerCount = players.Count(); int deadPlayers = players.Where(p => p.Dead).Count(); PlayerDeadBody body = self.Scene.Entities.FindFirst <PlayerDeadBody>(); // Kill all other players with "fake deaths" if we are the first player to die if (deadPlayers == 0) { if (!SaveData.Instance.Assists.Invincible || evenIfInvincible) { foreach (Player player in players) { if (player != self) { foreach (Follower follower in player.Leader.Followers) { self.Leader.Followers.Add(follower); } if (!player.Dead) { player.Scene.Add(new CustomPlayerDeadBody(player, Vector2.Zero, false, true)); } player.Scene.Remove(player); } } return(orig(self, direction, evenIfInvincible, registerDeathsInStats)); } } return(null); }
private static PlayerDeadBody onPlayerDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { bool hasSilver = false; SpeedBerry speedBerry = null; // check if the player is actually going to die first. if (!self.Dead && (evenIfInvincible || !SaveData.Instance.Assists.Invincible) && self.StateMachine.State != Player.StReflectionFall) { hasSilver = self.Leader.Followers.Any(follower => follower.Entity is SilverBerry); Follower speedBerryFollower = self.Leader.Followers.Find(follower => follower.Entity is SpeedBerry); if (speedBerryFollower != null) { speedBerry = (SpeedBerry)speedBerryFollower.Entity; // Don't restart the player to the starting room if there's still time left on the speed berry if (!speedBerry.TimeRanOut) { DynData <Strawberry> data = new DynData <Strawberry>(speedBerry); data["Golden"] = false; // set the starting position to the spawn point Level level = self.SceneAs <Level>(); data["start"] = level.GetSpawnPoint(new Vector2(level.Bounds.Left, level.Bounds.Top)) + new Vector2(8, -16); } } } PlayerDeadBody body = orig(self, direction, evenIfInvincible, registerDeathInStats); if (body != null) { DynData <PlayerDeadBody> data = new DynData <PlayerDeadBody>(body); data["hasSilver"] = hasSilver; data["hasSpeedBerry"] = (speedBerry != null); storedSpeedBerry = speedBerry; } return(body); }
private static PlayerDeadBody Player_Die(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { // Reset on death Immune = false; return(orig(self, direction, evenIfInvincible, registerDeathInStats)); }
private PlayerDeadBody PlayerOnDie(On.Celeste.Player.orig_Die orig, Player self, Vector2 direction, bool evenIfInvincible, bool registerDeathInStats) { currentPlayerDeadBody = orig(self, direction, evenIfInvincible, registerDeathInStats); return(currentPlayerDeadBody); }