private static void onLevelEnd(On.Celeste.Level.orig_End orig, Level self) { orig(self); // we're leaving the level: forget about the stored speed berry. storedSpeedBerry = null; }
private static void Player_Added(On.Celeste.Player.orig_Added orig, Player self, Scene scene) { orig(self, scene); if (storedSpeedBerry != null) { SpeedBerry berry; if (scene.Tracker.CountEntities <SpeedBerry>() == 0) { // create a new SpeedBerry in the current room EntityData newData = storedSpeedBerry.EntityData; Vector2 lastPos = newData.Position; newData.Position = self.Position + new Vector2(8, -16); scene.Add(berry = new SpeedBerry(newData, Vector2.Zero, storedSpeedBerry.ID, restored: true)); newData.Position = lastPos; berry.TimerDisplay = storedSpeedBerry.TimerDisplay; berry.TimerDisplay.TrackedBerry = berry; self.Leader.GainFollower(berry.Follower); storedSpeedBerry.RemoveSelf(); } else { storedSpeedBerry.TimerDisplay?.RemoveSelf(); } storedSpeedBerry = null; } }
private static void onTransitionEnd(On.Celeste.Player.orig_OnTransition orig, Player self) { orig(self); SpeedBerry speedBerry = self.Scene?.Tracker.GetEntity <SpeedBerry>(); if (speedBerry != null) { speedBerry.TimerDisplay?.StartTimer(); } }
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); }