Beispiel #1
0
        public HeartGemShard(HeartGem heart, Vector2 position, int index)
            : base(position)
        {
            Heart     = heart;
            heartData = new DynData <HeartGem>(Heart);

            this.index = index;

            Depth = Depths.Pickups;

            Collider             = new Hitbox(12f, 12f, -6f, -6f);
            Add(holdableCollider = new HoldableCollider(OnHoldable));
            Add(new PlayerCollider(OnPlayer));

            moveWiggler           = Wiggler.Create(0.8f, 2f);
            moveWiggler.StartZero = true;
            Add(moveWiggler);
            Add(collectSfx = new SoundSource());

            Add(shaker      = new Shaker(on: false));
            shaker.Interval = 0.1f;

            // index % 3 determines which third of the heart this piece looks like
            Add(sprite       = new Image(GFX.Game.GetAtlasSubtexturesAt("collectables/CommunalHelper/heartGemShard/shard", index % 3)).CenterOrigin());
            Add(outline      = new Image(GFX.Game.GetAtlasSubtexturesAt("collectables/CommunalHelper/heartGemShard/shard_outline", index % 3)).CenterOrigin());
            Add(scaleWiggler = Wiggler.Create(0.5f, 4f, f => sprite.Scale = Vector2.One * (1f + f * 0.25f)));

            Add(new BloomPoint(Heart.IsFake ? 0f : 0.75f, 16f));
            Add(new MirrorReflection());
        }
Beispiel #2
0
 public void Swat(HoldableCollider hc, int dir)
 {
     if (Hold.IsHeld && hitSeeker == null)
     {
         swatTimer = 0.1f;
         hitSeeker = hc;
         Hold.Holder.Swat(dir);
     }
 }
Beispiel #3
0
        public AbstractMiniHeart(EntityData data, Vector2 position, EntityID gid)
            : base(data.Position + position)
        {
            spriteName = data.Attr("sprite");

            Collider = new Hitbox(12f, 12f, -6f, -6f);

            Add(scaleWiggler = Wiggler.Create(0.5f, 4f, f => {
                sprite.Scale = Vector2.One * (1f + f * 0.3f);
            }));
            moveWiggler           = Wiggler.Create(0.8f, 2f);
            moveWiggler.StartZero = true;
            Add(moveWiggler);

            Add(new PlayerCollider(onPlayer));
            Add(holdableCollider = new HoldableCollider(onHoldable));
        }
        public AbstractMiniHeart(EntityData data, Vector2 position, EntityID gid)
            : base(data.Position + position)
        {
            spriteName         = data.Attr("sprite");
            refillDash         = data.Bool("refillDash", defaultValue: true);
            requireDashToBreak = data.Bool("requireDashToBreak", defaultValue: true);
            noGhostSprite      = data.Bool("noGhostSprite", defaultValue: false);
            particleColor      = data.Attr("particleColor");

            Collider = new Hitbox(12f, 12f, -6f, -6f);

            Add(scaleWiggler = Wiggler.Create(0.5f, 4f, f => {
                sprite.Scale = Vector2.One * (1f + f * 0.3f);
            }));
            moveWiggler           = Wiggler.Create(0.8f, 2f);
            moveWiggler.StartZero = true;
            Add(moveWiggler);

            Add(new PlayerCollider(onPlayer));
            Add(holdableCollider = new HoldableCollider(onHoldable));
        }
Beispiel #5
0
 public CustomCrystalHeart(Vector2 position)
     : base(position)
 {
     Add(holdableCollider = new HoldableCollider(OnHoldable));
     Add(new MirrorReflection());
 }
Beispiel #6
0
 private bool DangerousCheck(HoldableCollider collider)
 {
     return(!Hold.IsHeld && Speed != Vector2.Zero);
 }
Beispiel #7
0
 public bool Dangerous(HoldableCollider holdableCollider)
 {
     return(!Hold.IsHeld && Speed != Vector2.Zero && hitSeeker != holdableCollider);
 }
Beispiel #8
0
        public override void Update()
        {
            base.Update();
            if (Charge > 0 && base.Scene.OnInterval(fresh ? 0.5f : 0.1f))
            {
                bool collided = false;
                foreach (FakeWall wall in Scene.Tracker.GetEntities <FakeWall>())
                {
                    if (wall.Collider.Collide(this))
                    {
                        collided = true;
                    }
                }
                if (!collided)
                {
                    Level.ParticlesFG.Emit(particle, Hold.IsHeld ? 2 : 1, Position + particleOffset, Vector2.One * 5f);
                }
            }
            if (dead)
            {
                return;
            }
            if (swatTimer > 0f)
            {
                swatTimer -= Engine.DeltaTime;
            }
            hardVerticalHitSoundCooldown -= Engine.DeltaTime;
            base.Depth = 100;
            if (base.Scene.OnInterval(0.5f) && Running && Charge > 0)
            {
                Charge -= DischargeRate / 2;
            }
            string       newSprite;
            ParticleType newParticle = P_Low;

            if (DischargeRate == 0)
            {
                newSprite   = "infinite";
                newParticle = P_Infinite;
            }
            else if (fresh && Charge == MaxCharge)
            {
                newSprite   = "fresh";
                newParticle = P_Full;
            }
            else if (Charge > MaxCharge / 2)
            {
                newSprite   = "full";
                newParticle = P_Full;
            }
            else if (Charge > MaxCharge / 5)
            {
                newSprite   = "half";
                newParticle = P_Half;
            }
            else if (Charge > 0)
            {
                newSprite   = "low";
                newParticle = P_Low;
            }
            else
            {
                newSprite = "empty";
            }
            if (sprite.CurrentAnimationID != newSprite)
            {
                sprite.Play(newSprite);
                particle = newParticle;
                if (newSprite == "empty")
                {
                    Audio.Play("event:/classic/sfx0", Position);
                    Level.ParticlesFG.Emit(particle, 30, Position + particleOffset, Vector2.One * 10f);
                }
                else if (newSprite != "infinite" && newSprite != "full" && newSprite != "fresh")
                {
                    Audio.Play("event:/classic/sfx1", Position);
                }
            }
            if (Hold.IsHeld)
            {
                if (!Running)
                {
                    Running = true;
                    fresh   = false;
                }
                prevLiftSpeed = Vector2.Zero;
                LastHeld      = this;
            }
            else
            {
                if (OnGround())
                {
                    float target = (!OnGround(Position + Vector2.UnitX * 3f)) ? 20f : (OnGround(Position - Vector2.UnitX * 3f) ? 0f : (-20f));
                    Speed.X = Calc.Approach(Speed.X, target, 800f * Engine.DeltaTime);
                    Vector2 liftSpeed = base.LiftSpeed;
                    if (liftSpeed == Vector2.Zero && prevLiftSpeed != Vector2.Zero)
                    {
                        Speed         = prevLiftSpeed;
                        prevLiftSpeed = Vector2.Zero;
                        Speed.Y       = Math.Min(Speed.Y * 0.6f, 0f);
                        if (Speed.X != 0f && Speed.Y == 0f)
                        {
                            Speed.Y = -60f;
                        }
                        if (Speed.Y < 0f)
                        {
                            noGravityTimer = 0.15f;
                        }
                    }
                    else
                    {
                        prevLiftSpeed = liftSpeed;
                        if (liftSpeed.Y < 0f && Speed.Y < 0f)
                        {
                            Speed.Y = 0f;
                        }
                    }
                }
                else if (Hold.ShouldHaveGravity)
                {
                    float num = 800f;
                    if (Math.Abs(Speed.Y) <= 30f)
                    {
                        num *= 0.5f;
                    }
                    float num2 = 350f;
                    if (Speed.Y < 0f)
                    {
                        num2 *= 0.5f;
                    }
                    Speed.X = Calc.Approach(Speed.X, 0f, num2 * Engine.DeltaTime);
                    if (noGravityTimer > 0f)
                    {
                        noGravityTimer -= Engine.DeltaTime;
                    }
                    else
                    {
                        Speed.Y = Calc.Approach(Speed.Y, 200f, num * Engine.DeltaTime);
                    }
                }
                previousPosition = base.ExactPosition;
                MoveH(Speed.X * Engine.DeltaTime, onCollideH);
                MoveV(Speed.Y * Engine.DeltaTime, onCollideV);
                if (base.Right > (float)Level.Bounds.Right)
                {
                    base.Right = Level.Bounds.Right;
                    CollisionData data = new CollisionData
                    {
                        Direction = Vector2.UnitX
                    };
                    OnCollideH(data);
                }
                else if (base.Left < (float)Level.Bounds.Left)
                {
                    base.Left = Level.Bounds.Left;
                    CollisionData data = new CollisionData
                    {
                        Direction = -Vector2.UnitX
                    };
                    OnCollideH(data);
                }
                else if (base.Bottom > (float)Level.Bounds.Bottom && SaveData.Instance.Assists.Invincible)
                {
                    base.Bottom = Level.Bounds.Bottom;
                    Speed.Y     = -300f;
                    Audio.Play("event:/game/general/assist_screenbottom", Position);
                }
                else if (base.Top > (float)Level.Bounds.Bottom)
                {
                    RemoveSelf();
                }
                Player      entity     = base.Scene.Tracker.GetEntity <Player>();
                BatteryGate templeGate = CollideFirst <BatteryGate>();
                if (templeGate != null && entity != null)
                {
                    templeGate.Collidable = false;
                    MoveH((float)(Math.Sign(entity.X - base.X) * 32) * Engine.DeltaTime);
                    templeGate.Collidable = true;
                }
            }
            if (!dead)
            {
                foreach (BatteryCollider batteryCollider in base.Scene.Tracker.GetComponents <BatteryCollider>())
                {
                    batteryCollider.Check(this);
                }
                Hold.CheckAgainstColliders();
                if (!ignoreBarriers)
                {
                    foreach (SeekerBarrier entity in base.Scene.Tracker.GetEntities <SeekerBarrier>())
                    {
                        entity.Collidable = true;
                        bool flag = CollideCheck(entity);
                        entity.Collidable = false;
                        if (flag)
                        {
                            entity.OnReflectSeeker();
                            Die();
                        }
                    }
                }
            }
            if (hitSeeker != null && swatTimer <= 0f && !hitSeeker.Check(Hold))
            {
                hitSeeker = null;
            }
        }