private IEnumerator CollectRoutine(Player player) { Level level = Scene as Level; bool heartIsEnd = false; MapMetaModeProperties mapMetaModeProperties = (level != null) ? level.Session.MapData.GetMeta() : null; if (mapMetaModeProperties != null && mapMetaModeProperties.HeartIsEnd != null) { heartIsEnd = mapMetaModeProperties.HeartIsEnd.Value; } heartIsEnd &= !IsFake; if (heartIsEnd) { List <IStrawberry> strawbs = new List <IStrawberry>(); ReadOnlyCollection <Type> regBerries = StrawberryRegistry.GetBerryTypes(); foreach (Follower follower in player.Leader.Followers) { if (regBerries.Contains(follower.Entity.GetType()) && follower.Entity is IStrawberry) { strawbs.Add(follower.Entity as IStrawberry); } } foreach (IStrawberry strawb in strawbs) { strawb.OnCollect(); } } return(orig_CollectRoutine(player)); }
public new void RegisterAreaComplete() { bool completed = Completed; if (!completed) { Player player = base.Tracker.GetEntity <Player>(); if (player != null) { List <IStrawberry> strawbs = new List <IStrawberry>(); ReadOnlyCollection <Type> regBerries = StrawberryRegistry.GetBerryTypes(); foreach (Follower follower in player.Leader.Followers) { if (regBerries.Contains(follower.Entity.GetType()) && follower.Entity is IStrawberry) { strawbs.Add(follower.Entity as IStrawberry); } } foreach (IStrawberry strawb in strawbs) { strawb.OnCollect(); } } Completed = true; SaveData.Instance.RegisterCompletion(Session); Everest.Events.Level.Complete(this); } }
public override void OnStay(Player player) { base.OnStay(player); if (collectTimer <= 0f) { ReadOnlyCollection <Type> berryTypes = StrawberryRegistry.GetBerryTypes(); List <IStrawberry> followingBerries = new List <IStrawberry>(); foreach (Follower follower in player.Leader.Followers) { if (berryTypes.Contains(follower.Entity.GetType()) && follower.Entity is IStrawberry berry && (includeGoldens || !isGolden(berry))) { followingBerries.Add(berry); } } foreach (IStrawberry berry in followingBerries) { berry.OnCollect(); if (delayBetweenBerries) { collectTimer = 0.3f; break; } } } }
public override void Run(string stepName, BinaryPacker.Element el) { if (stepName.Length > 7 && StrawberryRegistry.TrackableContains(el)) { stepName = "entity:strawberry"; } base.Run(stepName, el); }
public override void Run(string stepName, BinaryPacker.Element el) { if (StrawberryRegistry.TrackableContains(el)) { stepName = "entity:strawberry"; } if (StrawberryRegistry.GetRegisteredBerries().Any(berry => berry.entityName == el.Name)) { TotalStrawberriesIncludingUntracked++; } base.Run(stepName, el); }
private bool isGolden(IStrawberry berry) { if (berry.GetType() == typeof(Strawberry)) { // vanilla berries are goldens if... they are goldens. return((berry as Strawberry).Golden); } else { // mod berries are "goldens" if they block normal collection. return(StrawberryRegistry.GetRegisteredBerries().ToList() .Find(berryDef => berryDef.berryClass == berry.GetType()) .blocksNormalCollection); } }
private IEnumerator SmashRoutine(Player player, Level level) { level.CanRetry = false; inCollectAnimation = true; Collidable = false; // mute sound Audio.SetMusic(null); Audio.SetAmbience(null); // collect all berries List <IStrawberry> list = new List <IStrawberry>(); ReadOnlyCollection <Type> berryTypes = StrawberryRegistry.GetBerryTypes(); foreach (Follower follower in player.Leader.Followers) { if (berryTypes.Contains(follower.Entity.GetType()) && follower.Entity is IStrawberry) { list.Add(follower.Entity as IStrawberry); } } foreach (IStrawberry item in list) { item.OnCollect(); } // play the collect jingle SoundEmitter.Play("event:/SC2020_heartShard_get", this); // overlap a white sprite Add(white = new Sprite(GFX.Game, "CollabUtils2/miniheart/white/white")); white.AddLoop("idle", "", 0.1f, animationFrames); white.Play("idle"); white.CenterOrigin(); // slow down time, visual effects Depth = -2000000; yield return(null); Celeste.Freeze(0.2f); yield return(null); Engine.TimeRate = 0.5f; player.Depth = -2000000; for (int i = 0; i < 10; i++) { Scene.Add(new AbsorbOrb(Position)); } level.Shake(); Input.Rumble(RumbleStrength.Strong, RumbleLength.Medium); level.Flash(Color.White); light.Alpha = (bloom.Alpha = 0f); level.FormationBackdrop.Display = true; level.FormationBackdrop.Alpha = 1f; // slow down time further, to a freeze Visible = false; for (float time = 0f; time < 2f; time += Engine.RawDeltaTime) { Engine.TimeRate = Calc.Approach(Engine.TimeRate, 0f, Engine.RawDeltaTime * 0.25f); yield return(null); } yield return(null); if (player.Dead) { yield return(100f); } Engine.TimeRate = 1f; Tag = Tags.FrozenUpdate; level.Frozen = true; // level is done! stop timer, save completion SaveData.Instance.RegisterHeartGem(level.Session.Area); level.TimerStopped = true; level.PauseLock = true; level.RegisterAreaComplete(); // display an endscreen if enabled in mod options AND speedrun timer is enabled (or else the endscreen won't show anything anyway). if (CollabModule.Instance.Settings.DisplayEndScreenForAllMaps && Settings.Instance.SpeedrunClock != SpeedrunType.Off) { Scene.Add(new AreaCompleteInfoInLevel()); // force the player to wait a bit, so that the info shows up yield return(0.5f); // wait for an input while (!Input.MenuConfirm.Pressed && !Input.MenuCancel.Pressed) { yield return(null); } } else { // wait 1 second max float timer = 0f; while (!Input.MenuConfirm.Pressed && !Input.MenuCancel.Pressed && timer <= 1f) { yield return(null); timer += Engine.DeltaTime; } } // get out of here, back to the lobby level.DoScreenWipe(false, () => Engine.Scene = new LevelExitToLobby(LevelExit.Mode.Completed, level.Session)); }
// Every Entity needs an Update sequence. This is where we do the bulk of our checking for things. public override void Update() { // Let's not do anything if the Strawberry is waiting for seeds. if (WaitingOnSeeds) { return; } if (!collected) { // Subtle up-and-down movement sequence. wobble += Engine.DeltaTime * 4f; sprite.Y = bloom.Y = light.Y = (float)Math.Sin(wobble) * 2f; // We'll check collection rules for our strawberry here. It's standard collection rules, so... if (Follower.Leader != null) { Player player = Follower.Leader.Entity as Player; // First in line of the normal-collection train? if (Follower.DelayTimer <= 0f && StrawberryRegistry.IsFirstStrawberry(this)) { if (player != null && player.Scene != null && !player.StrawberriesBlocked && player.OnSafeGround && player.StateMachine.State != 13) { // lot of checks! collectTimer += Engine.DeltaTime; if (collectTimer > 0.15f) { OnCollect(); } } else { collectTimer = Math.Min(collectTimer, 0f); } } // Not first in line? else if (Follower.FollowIndex > 0) { collectTimer = -0.15f; } } } // This spawns glittery particles if we're carrying the berry! if (Follower.Leader != null && Scene.OnInterval(0.08f)) { ParticleType type; if (!isOwned) { type = P_Glow; } else { type = P_GhostGlow; } SceneAs <Level>().ParticlesFG.Emit(type, Position + Calc.Random.Range(-Vector2.One * 6f, Vector2.One * 6f)); } base.Update(); }
public void orig_Update() { if (WaitingOnSeeds) { return; } if (!collected) { if (!Winged) { wobble += Engine.DeltaTime * 4f; Sprite obj = sprite; BloomPoint bloomPoint = bloom; float num2 = light.Y = (float)Math.Sin(wobble) * 2f; obj.Y = (bloomPoint.Y = num2); } int followIndex = Follower.FollowIndex; if (Follower.Leader != null && Follower.DelayTimer <= 0f && StrawberryRegistry.IsFirstStrawberry(this)) { bool flag = false; if (Follower.Leader.Entity is Player player && player.Scene != null && !player.StrawberriesBlocked) { if (Golden) { if (player.CollideCheck <GoldBerryCollectTrigger>() || (Scene as Level).Completed) { flag = true; } } else if (player.OnSafeGround && (!Moon || player.StateMachine.State != 13)) { flag = true; } } if (flag) { collectTimer += Engine.DeltaTime; if (collectTimer > 0.15f) { OnCollect(); } } else { collectTimer = Math.Min(collectTimer, 0f); } } else { if (followIndex > 0) { collectTimer = -0.15f; } if (Winged) { Y += flapSpeed * Engine.DeltaTime; if (flyingAway) { if (Y < (SceneAs <Level>().Bounds.Top - 16)) { RemoveSelf(); } } else { flapSpeed = Calc.Approach(flapSpeed, 20f, 170f * Engine.DeltaTime); if (Y < start.Y - 5f) { Y = start.Y - 5f; } else if (Y > start.Y + 5f) { Y = start.Y + 5f; } } } } } base.Update(); if (Follower.Leader != null && Scene.OnInterval(0.08f)) { ParticleType type = isGhostBerry ? Strawberry.P_GhostGlow : (Golden ? Strawberry.P_GoldGlow : ((!Moon) ? Strawberry.P_Glow : Strawberry.P_MoonGlow)); SceneAs <Level>().ParticlesFG.Emit(type, Position + Calc.Random.Range(-Vector2.One * 6f, Vector2.One * 6f)); } }