Example #1
0
        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));
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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;
                    }
                }
            }
        }
Example #4
0
 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);
        }
Example #6
0
 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);
     }
 }
Example #7
0
        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));
        }
Example #8
0
        // 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));
     }
 }