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()); }
public void Swat(HoldableCollider hc, int dir) { if (Hold.IsHeld && hitSeeker == null) { swatTimer = 0.1f; hitSeeker = hc; Hold.Holder.Swat(dir); } }
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)); }
public CustomCrystalHeart(Vector2 position) : base(position) { Add(holdableCollider = new HoldableCollider(OnHoldable)); Add(new MirrorReflection()); }
private bool DangerousCheck(HoldableCollider collider) { return(!Hold.IsHeld && Speed != Vector2.Zero); }
public bool Dangerous(HoldableCollider holdableCollider) { return(!Hold.IsHeld && Speed != Vector2.Zero && hitSeeker != holdableCollider); }
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; } }