Пример #1
0
        private void Initialize()
        {
            m_smokeTrail        = new ParticleEntity(Environment, "smokeTrail");
            m_smokeTrail.Zindex = ZSettings.Plane + 0.01f;             // Just behind plane.
            AddChild(m_smokeTrail);

            Sequence seq = new Sequence(Environment.contentManager);

            seq.AddFrame("plane\\Plan1", 0.1f);
            seq.AddFrame("plane\\Plan2", 0.1f);
            seq.AddFrame("plane\\Plan3", 0.2f);
            seq.AddFrame("plane\\Plan4", 0.1f);
            seq.Loop = true;

            m_anim.PlaySequence(seq);

            Registration = new Vector2(250.0f, 250.0f);

            Scale = 0.5f;
            CreateCollisionBody(Environment.CollisionWorld, BodyType.Kinematic, CollisionFlags.FixedRotation);

            AddCollisionCircle(50.0f, new Vector2(-50.0f, 0.0f));
            AddCollisionCircle(50.0f, Vector2.Zero);
            AddCollisionCircle(50.0f, new Vector2(50.0f, 0.0f));
            DesiredVelocity = new Vector2(k_defaultVelX, 0.0f);
            SnapToRung();

            Zindex = ZSettings.Plane;
        }
Пример #2
0
            public override void Update(float dt)
            {
                base.Update(dt);

                if (T >= 3f)
                {
                    T = 0;

                    for (var i = 0; i < 3; i++)
                    {
                        Timer.Add(() => {
                            var part = new ParticleEntity(new Particle(Controllers.Float,
                                                                       new TexturedParticleRenderer(CommonAse.Particles.GetSlice($"sleep"))));

                            part.Position = Self.Center;

                            if (Self.TryGetComponent <ZComponent>(out var z))
                            {
                                part.Position -= new Vector2(0, z.Z);
                            }

                            Self.Area.Add(part);

                            part.Particle.Velocity = new Vector2(Rnd.Float(8, 16) * (Rnd.Chance() ? -1 : 1), -Rnd.Float(30, 56));
                            part.Particle.Angle    = 0;
                            part.Particle.Alpha    = 0.9f;
                            part.Depth             = Layers.InGameUi;
                        }, i * 0.5f);
                    }
                }
            }
Пример #3
0
        public override void Update(float dt)
        {
            base.Update(dt);

            delay -= dt;

            if (delay <= 0)
            {
                delay = Rnd.Float(1f, 3f);
                var cn = Rnd.Int(1, 4);

                for (var i = 0; i < cn; i++)
                {
                    Timer.Add(() => {
                        var part      = new ParticleEntity(new Particle(Controllers.Float, new TexturedParticleRenderer(CommonAse.Particles.GetSlice($"heart_{Rnd.Int(1, 4)}"))));
                        part.Position = Center;

                        if (TryGetComponent <ZComponent>(out var z))
                        {
                            part.Position -= new Vector2(0, z.Z);
                        }

                        Area.Add(part);

                        part.Particle.Velocity = new Vector2(Rnd.Float(8, 16) * (Rnd.Chance() ? -1 : 1), -Rnd.Float(30, 56));
                        part.Particle.Angle    = 0;
                        part.Particle.Alpha    = 0.9f;
                        part.Depth             = Layers.InGameUi;
                    }, i * 0.3f);
                }
            }
        }
Пример #4
0
            public override void Update(float dt)
            {
                base.Update(dt);

                if (T >= RollTime)
                {
                    Become <PostRollState>();
                    return;
                }

                var body = Self.GetComponent <RectBodyComponent>();

                body.Velocity += direction * (RollTime - T * 0.5f);
                body.Position += body.Velocity * dt * 0.1f;

                lastParticle -= dt;

                if (lastParticle <= 0)
                {
                    lastParticle = 0.1f;

                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Self.Center;
                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                    Self.Area.Add(part);
                }
            }
Пример #5
0
            public override void Init()
            {
                base.Init();

                var z     = Self.GetComponent <ZComponent>();
                var start = z.Z;

                Tween.To(start + 8, start, x => z.Z = x, 0.15f, Ease.QuadIn).OnEnd = () => {
                    Tween.To(start, z.Z, x => z.Z = x, 0.15f, Ease.QuadIn);
                };

                Self.GetComponent <AudioEmitterComponent>().EmitRandomized("player_roll", 0.5f);
                var hp = Self.GetComponent <HealthComponent>();

                wasUnhittable = hp.Unhittable;
                hp.Unhittable = true;

                var body  = Self.GetComponent <RectBodyComponent>();
                var angle = body.Acceleration.LengthSquared() > 0.1f
                                        ?       body.Acceleration.ToAngle()
                                        : (Camera.Instance.ScreenToCamera(Input.Mouse.ScreenPosition) - Self.Center).ToAngle();

                direction = new Vector2((float)Math.Cos(angle) * RollForce, (float)Math.Sin(angle) * RollForce);

                for (var i = 0; i < 4; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Self.Center;
                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                    Self.Area.Add(part);
                }
            }
Пример #6
0
        private void Initialize()
        {
            m_magic_Trail        = new ParticleEntity(Environment, "starTrail");
            m_magic_Trail.Zindex = 0.9f;
            AddChild(m_magic_Trail);

            originalCameraPos = Environment.Camera.Position.X;
            float blinkOffTime = 0.5f;
            float blinkOnTime  = 0.25f;

            m_blinking = new Sequence(Environment.contentManager);
            m_blinking.AddFrame("Star\\NStar1", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar2", blinkOnTime);
            m_blinking.AddFrame("Star\\NStar3", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar4", blinkOnTime);
            m_blinking.AddFrame("Star\\NStar5", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar6", blinkOnTime);
            //Again
            m_blinking.AddFrame("Star\\NStar1", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar2", blinkOnTime);
            m_blinking.AddFrame("Star\\NStar3", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar4", blinkOnTime);
            m_blinking.AddFrame("Star\\NStar5", blinkOffTime);
            m_blinking.AddFrame("Star\\NStar6", blinkOnTime);

            Registration = new Vector2(75, 75);

            Zindex = ZSettings.SkyStar;
        }
Пример #7
0
        public override void Update(float dt)
        {
            base.Update(dt);

            t += dt;

            if (GetComponent <HealthComponent>().HasNoHealth || disk == 0)
            {
                return;
            }

            tillNext -= dt;

            if (tillNext <= 0)
            {
                tillNext = Rnd.Float(1, 3f);

                var part = new ParticleEntity(new Particle(Controllers.Float, new TexturedParticleRenderer(CommonAse.Particles.GetSlice($"note_{Rnd.Int(1, 3)}"))));
                part.Position = Center;
                Area.Add(part);

                part.Particle.Velocity = new Vector2(Rnd.Float(8, 16) * (Rnd.Chance() ? -1 : 1), -Rnd.Float(40, 66));
                part.Particle.Angle    = 0;
                part.Depth             = Layers.InGameUi;
            }
        }
Пример #8
0
        private bool Check(int x, int y)
        {
            var t = Level.Get(x, y);

            if (t == Tile.WallA || t == Tile.Transition)
            {
                Level.Set(x, y, Tile.Ice);
                Level.UpdateTile(x, y);
                Level.ReTileAndCreateBodyChunks(x, y, 2, 2);

                Level.Area.Add(new TileFx {
                    X = x * 16,
                    Y = y * 16 - 8
                });

                for (var i = 0; i < 3; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position = new Vector2(x * 16 + 8, y * 16 + 8);
                    Level.Area.Add(part);
                }

                Engine.Instance.Freeze = 0.5f;

                return(true);
            }

            return(false);
        }
Пример #9
0
        public override void Update(float dt)
        {
            base.Update(dt);

            lastParticle += dt;

            if (lastParticle >= 0.5f)
            {
                lastParticle = 0;

                var part = new ParticleEntity(new Particle(Controllers.Float, new TexturedParticleRenderer(CommonAse.Particles.GetSlice($"poison_{Rnd.Int(1, 4)}"))));
                part.Position = Entity.Center;

                if (Entity.TryGetComponent <ZComponent>(out var z))
                {
                    part.Position -= new Vector2(0, z.Z);
                }

                Entity.Area.Add(part);

                part.Particle.Velocity = new Vector2(Rnd.Float(8, 16) * (Rnd.Chance() ? -1 : 1), -Rnd.Float(30, 56));
                part.Particle.Angle    = 0;
                part.Particle.Alpha    = 0.8f;
                part.Depth             = Layers.InGameUi;
            }

            tillDamage -= dt;

            if (tillDamage <= 0)
            {
                tillDamage = Delay;
                Entity.GetComponent <HealthComponent>().ModifyHealth(-2, Entity);
            }
        }
Пример #10
0
        private void SpawnWave(Entity entity)
        {
            var filter = CheckDistance(entity);

            MobRegistry.SetupForBiome(Run.Level.Biome.Id);

            var c = Rnd.Int(5, 11);

            for (var i = 0; i < c; i++)
            {
                Timer.Add(() => {
                    var mob = MobRegistry.Generate();
                    entity.Area.Add(mob);
                    var v = MobRegistry.FindFor(mob.GetType());

                    if (v?.NearWall ?? false)
                    {
                        mob.Center = Room.GetRandomFreeTileNearWall(filter) * 16;
                    }
                    else if (v?.AwayFromWall ?? false)
                    {
                        mob.Center = Room.GetRandomWallFreeTile(filter) * 16;
                    }
                    else
                    {
                        mob.Center = Room.GetRandomFreeTile(filter) * 16;
                    }

                    if (mob.TryGetComponent <ZAnimationComponent>(out var z))
                    {
                        z.Animate();
                    }
                    else if (mob.TryGetComponent <MobAnimationComponent>(out var m))
                    {
                        m.Animate();
                    }

                    var where = mob.Center;

                    for (var j = 0; j < 8; j++)
                    {
                        var part = new ParticleEntity(Particles.Dust());

                        part.Position          = where + Rnd.Vector(-8, 8);
                        part.Particle.Scale    = Rnd.Float(1f, 1.3f);
                        part.Particle.Velocity = MathUtils.CreateVector(Rnd.AnglePI(), 40);
                        Run.Level.Area.Add(part);
                        part.Depth = 1;
                    }

                    Audio.PlaySfx("scroll");
                }, (i) * 0.2f);
            }

            wave++;
        }
Пример #11
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (delay > 0)
            {
                delay -= dt;

                return;
            }

            var s = dt * 300f * speed;

            Position += MathUtils.CreateVector(Weather.RainAngle, s);

            if (Y >= target)
            {
                if (!poofed)
                {
                    poofed = true;
                    var pos = Position + MathUtils.CreateVector(Weather.RainAngle, size);

                    if (!Player.InBuilding)
                    {
                        var c = Rnd.Int(2, 5);

                        for (var i = 0; i < c; i++)
                        {
                            var part = new ParticleEntity(Particles.Rain());

                            part.Position          = pos;
                            part.Particle.Velocity = new Vector2(Rnd.Float(-40, 40), Rnd.Float(-30, -50));
                            part.Particle.Scale    = Rnd.Float(1f, 1.6f);
                            Area.Add(part);
                            part.Depth = 0;
                        }
                    }
                }

                size -= 0.5f * s * (float)Math.Sin(Weather.RainAngle);

                if (size <= 0)
                {
                    Reset();
                    return;
                }
            }

            if (Position.Y > Camera.Instance.Bottom + 20)
            {
                Reset();
            }
        }
Пример #12
0
        public static void PoofFrom(Vector2 where, Vector2 from, int depth = 0)
        {
            for (var i = 0; i < 4; i++)
            {
                var part = new ParticleEntity(Particles.Dust());

                part.Position       = where;
                part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                Run.Level.Area.Add(part);
                part.Depth             = depth;
                part.Particle.Velocity = MathUtils.CreateVector((where - from).ToAngle(), 80);
            }
        }
Пример #13
0
        public static void Explosion(Vector2 where, float scale = 1)
        {
            var explosion = new ParticleEntity(Particles.Animated("explosion", "explosion"));

            explosion.Position = where;
            Run.Level.Area.Add(explosion);
            explosion.Depth             = 32;
            explosion.Particle.Velocity = Vector2.Zero;
            explosion.Particle.Scale    = scale;
            explosion.AddShadow();

            Lights.Flash = 1f;
        }
Пример #14
0
        public override void Use(Entity entity, Item item)
        {
            base.Use(entity, item);

            var where = entity.Center;

            for (var i = 0; i < 20; i++)
            {
                var part = new ParticleEntity(Particles.Dust());

                part.Position       = where + Rnd.Vector(-16, 16);
                part.Particle.Scale = Rnd.Float(1, 2f);
                Run.Level.Area.Add(part);
            }
        }
Пример #15
0
            public override void Update(float dt)
            {
                base.Update(dt);

                lastParticle -= dt;

                if (lastParticle <= 0)
                {
                    lastParticle = 0.25f;

                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Self.Center;
                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                    Self.Area.Add(part);
                }

                if (!Self.HasFlight)
                {
                    var anim = Self.GetComponent <PlayerGraphicsComponent>().Animation;

                    if (anim.Frame != lastFrame)
                    {
                        lastFrame = anim.Frame;

                        if (Run.Level != null && (lastFrame == 2 || lastFrame == 6))
                        {
                            var x = (int)(Self.CenterX / 16);
                            var y = (int)(Self.Bottom / 16);

                            if (!Run.Level.IsInside(x, y))
                            {
                                return;
                            }

                            var i      = Run.Level.ToIndex(x, y);
                            var tile   = Run.Level.Get(i);
                            var liquid = Run.Level.Liquid[i];
                            var room   = Self.GetComponent <RoomComponent>().Room;

                            Audio.PlaySfx(Run.Level.Biome.GetStepSound(liquid == 0 ? tile : (Tile)liquid),
                                          room != null && room.Tagged[Tags.MustBeKilled].Count > 0 ? 0.18f : 0.25f);
                        }
                    }
                }
            }
Пример #16
0
        public static void Poof(Vector2 where, int depth = 0)
        {
            if (Settings.LowQuality)
            {
                return;
            }

            for (var i = 0; i < 4; i++)
            {
                var part = new ParticleEntity(Particles.Dust());

                part.Position       = where;
                part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                Run.Level.Area.Add(part);
                part.Depth = depth;
            }
        }
Пример #17
0
        public static void Ash(Vector2 where, int depth = 0)
        {
            if (Settings.LowQuality)
            {
                return;
            }

            for (var i = 0; i < 4; i++)
            {
                var part = new ParticleEntity(Particles.Ash());

                part.Position          = where;
                part.Particle.Scale    = Rnd.Float(1f, 2f);
                part.Particle.Velocity = new Vector2(Rnd.Float(20, 30) * (Rnd.Chance() ? -1 : 1), -Rnd.Float(40, 66));
                Run.Level.Area.Add(part);
                part.Depth = depth;
            }
        }
Пример #18
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (from != null && TryGetComponent <HealthComponent>(out var h) && h.InvincibilityTimer <= 0.45f)
            {
                Done = true;

                if (!Camera.Instance.Overlaps(this))
                {
                    return;
                }

                if (TryGetComponent <PoolDropsComponent>(out var pool))
                {
                    pool.SpawnDrops();
                }

                for (var i = 0; i < 4; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Center;
                    part.Particle.Scale = Lens.util.math.Rnd.Float(0.4f, 0.8f);

                    Area.Add(part);
                }

                var d = AudioEmitterComponent.Dummy(Area, Center);

                if (Sprite == "cup" || Sprite.StartsWith("pot"))
                {
                    d.EmitRandomizedPrefixed("level_cup", 2, 0.75f);
                }
                else
                {
                    d.EmitRandomizedPrefixed("level_chair_break", 2, 0.75f);
                }

                Particles.BreakSprite(Area, GetComponent <SliceComponent>().Sprite, Position);
                Camera.Instance.Shake(2f);
                Engine.Instance.Freeze = 1f;
            }
        }
Пример #19
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (from != null && TryGetComponent <HealthComponent>(out var h) && h.InvincibilityTimer <= 0.45f)
            {
                Done = true;

                if (from is Player)
                {
                    var count = GlobalSave.GetInt("paintings_destroyed", 0) + 1;

                    if (count >= 100)
                    {
                        Achievements.Unlock("bk:van_no_gogh");
                    }

                    GlobalSave.Put("paintings_destroyed", count);
                }

                for (var i = 0; i < 4; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Center;
                    part.Particle.Scale = Lens.util.math.Rnd.Float(0.4f, 0.8f);

                    Area.Add(part);

                    part.Depth = Depth;
                }

                if (!HasComponent <AudioEmitterComponent>())
                {
                    AddComponent(new AudioEmitterComponent());
                }

                AudioEmitterComponent.Dummy(Area, Center).EmitRandomizedPrefixed("level_chair_break", 2, 0.5f);

                Particles.BreakSprite(Area, GetComponent <InteractableSliceComponent>().Sprite, Position, Depth);
                Camera.Instance.Shake(2f);
                Engine.Instance.Freeze = 1f;
            }
        }
Пример #20
0
        public override void Use(Entity entity, Item item)
        {
            if (!entity.TryGetComponent <RoomComponent>(out var r) || r.Room == null)
            {
                return;
            }

            var filter = CheckDistance(entity);

            MobRegistry.SetupForBiome(Run.Level.Biome.Id);

            for (var i = 0; i < Count; i++)
            {
                Timer.Add(() => {
                    var mob = MobRegistry.Generate();
                    entity.Area.Add(mob);

                    if (MobRegistry.FindFor(mob.GetType())?.NearWall ?? false)
                    {
                        mob.Center = r.Room.GetRandomFreeTileNearWall(filter) * 16;
                    }
                    else
                    {
                        mob.Center = r.Room.GetRandomFreeTile(filter) * 16;
                    }

                    var where = mob.Center;

                    for (var j = 0; j < 8; j++)
                    {
                        var part = new ParticleEntity(Particles.Dust());

                        part.Position          = where + Rnd.Vector(-8, 8);
                        part.Particle.Scale    = Rnd.Float(1f, 1.3f);
                        part.Particle.Velocity = MathUtils.CreateVector(Rnd.AnglePI(), 40);
                        Run.Level.Area.Add(part);
                        part.Depth = 1;
                    }

                    Audio.PlaySfx("scroll");
                }, (i - 1) * 0.2f);
            }
        }
Пример #21
0
        public static ProjectileUpdateCallback Make()
        {
            var t = 0f;

            return((p, dt) => {
                t += dt;

                if (t >= 0.1f)
                {
                    t = 0;

                    var part = new ParticleEntity(Particles.Dust());
                    p.Area.Add(part);
                    part.Particle.Position = p.Center;
                    part.Particle.Velocity = p.BodyComponent.Velocity * -0.2f;
                    part.Particle.Scale = Rnd.Float(0.6f, 0.8f);
                    part.Depth = Layers.Creature;
                }
            });
        }
Пример #22
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (charge)
            {
                sinceLastDamage += dt;

                if (sinceLastDamage >= ChangeDelay)
                {
                    var health = entity.GetComponent <HealthComponent>();
                    var h      = health.Health;
                    var s      = (lastChange - h) / health.MaxHealth * fill.Width;

                    var p = new ParticleEntity(new Particle(new HealthParticleController(), new HealthParticleRenderer(damage, s)));
                    p.Particle.Position = Position + barOffset + new Vector2((float)h / health.MaxHealth * fill.Width, 0);
                    p.Position          = p.Particle.Position;
                    p.AlwaysActive      = true;
                    p.AlwaysVisible     = true;
                    Area.Add(p);
                    p.Depth = Depth + 1;

                    Tween.To(h, lastChange, x => lastChange = x, 0.3f);
                    charge = false;
                }
            }

            if (entity.Awoken && !showedUp)
            {
                showedUp = true;
                Tween.To(0, Y, x => Y = x, 0.3f);
            }

            if (showedUp && (!entity.Awoken || (entity.Done && !tweened)))
            {
                Remove();
            }
        }
Пример #23
0
        public static void BreakRock(Level level, Dot ww, int x, int y, Tile l)
        {
            AudioEmitterComponent.Dummy(level.Area, ww).Emit($"level_rock_{Rnd.Int(1, 3)}", 0.5f);

            if (l.IsRock())
            {
                Drop.Create(l == Tile.TintedRock ? "bk:tinted_rock" : "bk:rock", null, level.Area, ww);
            }

            for (var i = 0; i < 3; i++)
            {
                var part = new ParticleEntity(Particles.Dust());

                part.Position = ww;
                level.Area.Add(part);
            }

            Particles.BreakSprite(level.Area, (l == Tile.TintedRock ? level.Tileset.TintedRock : (l == Tile.MetalBlock ? level.Tileset.MetalBlock : level.Tileset.Rock))[Rnd.Int(4)], ww);

            level.Set(x, y, Tile.Ember);
            level.UpdateTile(x, y);
            level.ReCreateBodyChunk(x, y);
        }
Пример #24
0
        private void CheckSupport()
        {
            if (!HadNoSupport && HasNoSupport && !Engine.EditingLevel)
            {
                if (Send(new LostSupportEvent {
                    Who = Entity
                }))
                {
                    return;
                }

                Entity.Position = LastSupportedPosition;

                for (var i = 0; i < 4; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Entity.Center;
                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                    Entity.Area.Add(part);
                }
            }
        }
Пример #25
0
        protected virtual void AnimateDeath(Entity from, bool timeout = false)
        {
            if (Dying)
            {
                return;
            }

            Dying      = true;
            deathTimer = 0.1f;

            try {
                var l = Math.Min(15, BodyComponent.Velocity.Length());

                if (l > 1f)
                {
                    var a = VectorExtension.ToAngle(BodyComponent.Velocity);

                    for (var i = 0; i < 4; i++)
                    {
                        var part = new ParticleEntity(Particles.Dust());

                        part.Position = Center;
                        Run.Level.Area.Add(part);
                        part.Particle.Velocity = MathUtils.CreateVector(a + Rnd.Float(-0.4f, 0.4f), l);
                        part.Depth             = Layers.WindFx;
                        part.Particle.Scale    = 0.7f;
                    }
                }

                Camera.Instance.ShakeMax(4);

                OnDeath?.Invoke(this, from, timeout);
                BodyComponent.Velocity = Vector2.Zero;
            } catch (Exception e) {
                Log.Error(e);
            }
        }
Пример #26
0
        public bool Pickup(Item item, bool animate = true)
        {
            if (item == null)
            {
                return(false);
            }

            var e = new ItemCheckEvent {
                Item    = item,
                Animate = animate
            };

            if (!Send(e))
            {
                if (e.Blocked)
                {
                    return(false);
                }

                if (Entity is Player p && (item.Type == ItemType.Scourge || item.Type == ItemType.Artifact || item.Type == ItemType.ConsumableArtifact))
                {
                    if (item.Type == ItemType.ConsumableArtifact)
                    {
                        p.AnimateItemPickup(item, () => {
                            item.Use(p);
                            item.Done = true;
                        }, false);
                    }
                    else if (animate)
                    {
                        p.AnimateItemPickup(item, () => {
                            if (item.Type == ItemType.Scourge)
                            {
                                Achievements.Unlock("bk:scourged");
                                var center = Entity.Center;

                                for (var i = 0; i < 10; i++)
                                {
                                    var part = new ParticleEntity(Particles.Scourge());

                                    part.Position       = center + Rnd.Vector(-4, 4);
                                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                                    Entity.Area.Add(part);
                                    part.Depth = 1;
                                }
                            }
                        });
                    }
                    else
                    {
                        Add(item);

                        if (item.Type == ItemType.Scourge)
                        {
                            Achievements.Unlock("bk:scourged");
                        }
                    }
                }
            }

            item.Unknown = false;
            Entity.Area.Remove(item);
            item.Done = false;

            return(true);
        }
Пример #27
0
        public override void Update(float dt)
        {
            base.Update(dt);

            if (prefix != null)
            {
                prefix.Update(dt);

                lastParticle -= dt;

                if (lastParticle <= 0)
                {
                    lastParticle = Rnd.Float(0.05f, 0.3f);

                    for (var i = 0; i < Rnd.Int(0, 3); i++)
                    {
                        var part = new ParticleEntity(Particles.Scourge());

                        part.Position       = Center + Rnd.Vector(-4, 4);
                        part.Particle.Scale = Rnd.Float(0.5f, 1.2f);
                        Area.Add(part);
                        part.Depth = 1;
                    }
                }
            }

            if (Target == null)
            {
                FindTarget();
            }
            else if (Target.Done || Target.GetComponent <RoomComponent>().Room != GetComponent <RoomComponent>().Room ||
                     (Target is Creature c && c.IsFriendly() == IsFriendly()) ||
                     (Target.TryGetComponent <BuffsComponent>(out var b) && b.Has <InvisibleBuff>()))
            {
                var old = Target;

                HandleEvent(new MobTargetChange {
                    Mob = this,
                    New = null,
                    Old = old
                });

                FindTarget();
            }

            if (TouchDamage == 0)
            {
                return;
            }

            var raging = GetComponent <BuffsComponent>().Has <RageBuff>();

            for (var i = CollidingToHurt.Count - 1; i >= 0; i--)
            {
                var entity = CollidingToHurt[i];

                if (entity.Done)
                {
                    CollidingToHurt.RemoveAt(i);
                    continue;
                }

                if ((!(entity is Creature c) || c.IsFriendly() != IsFriendly()))
                {
                    if (entity.GetComponent <HealthComponent>().ModifyHealth(-TouchDamage * (raging ? 2 : 1), this, DamageType.Contact))
                    {
                        OnHit(entity);
                    }
                }
            }

            if (GetComponent <RoomComponent>().Room == null)
            {
                Kill(null);
            }
        }
Пример #28
0
        public static void Make(Entity whoHurts, float hurtRadius = 32f, bool leave = true, Vec2 where = null, float damage = 16, float scale = 1, bool damageOwner = true)
        {
            Camera.Instance.Shake(10 * scale);
            Audio.SfxVolumeBuffer           = 0.5f;
            Audio.SfxVolumeBufferResetTimer = 1f;

            var w = where == null ? whoHurts.Center : new Vector2(where.X, where.Y);

            AnimationUtil.Explosion(w, scale);

            for (var i = 0; i < 4; i++)
            {
                var explosion = new ParticleEntity(Particles.Animated("explosion", "smoke"));
                explosion.Position = w;
                whoHurts.Area.Add(explosion);
                explosion.Depth                  = 31;
                explosion.Particle.Scale         = scale;
                explosion.Particle.AngleVelocity = 0;
                explosion.AddShadow();

                var a = explosion.Particle.Angle - Math.PI / 2;
                var d = 16;

                explosion.Particle.Position += new Vector2((float)Math.Cos(a) * d, (float)Math.Sin(a) * d);

                if (i == 0)
                {
                    explosion.AddComponent(new AudioEmitterComponent {
                        DestroySounds = false
                    });

                    explosion.GetComponent <AudioEmitterComponent>().EmitRandomizedPrefixed("level_explosion", 3);
                }
            }

            for (var i = 0; i < 6; i++)
            {
                var part = new ParticleEntity(Particles.Dust());

                part.Position = w + new Vector2(Rnd.Int(-4, 4), Rnd.Int(-4, 4));
                whoHurts.Area.Add(part);
                part.Depth             = 30;
                part.Particle.Velocity = MathUtils.CreateVector(Rnd.AnglePI(), 80);
            }

            Engine.Instance.Split  = 1f;
            Engine.Instance.Flash  = 1f;
            Engine.Instance.Freeze = 1f;

            var damager = whoHurts;

            if (whoHurts is Bomb b && b.Owner != null)
            {
                damager = b.Owner;
            }

            foreach (var e in whoHurts.Area.GetEntitesInRadius(w, hurtRadius, typeof(ExplodableComponent)))
            {
                if (e == whoHurts && !damageOwner)
                {
                    continue;
                }

                e.GetAnyComponent <BodyComponent>()?.KnockbackFrom(whoHurts, 4f);
                e.GetComponent <ExplodableComponent>().HandleExplosion(damager, whoHurts, damage);
            }

            if (Settings.Flashes)
            {
                Camera.Instance.TextureZoom -= 0.05f;
                Tween.To(1f, Camera.Instance.TextureZoom, x => Camera.Instance.TextureZoom = x, 0.2f);
            }

            if (leave)
            {
                whoHurts.Area.Add(new ExplosionLeftOver {
                    Center = w
                });
            }

            var xx    = (int)Math.Floor(w.X / 16f);
            var yy    = (int)Math.Floor(w.Y / 16f);
            var r     = (int)Math.Floor(hurtRadius / 16f);
            var level = Run.Level;
            var ice   = level.Biome is IceBiome;

            for (int x = -r; x <= r; x++)
            {
                for (int y = -r; y <= r; y++)
                {
                    var xm = x * 16;
                    var ym = y * 16;

                    if (Math.Sqrt(xm * xm + ym * ym) <= hurtRadius)
                    {
                        var index = level.ToIndex(x + xx, y + yy);
                        var l     = level.Get(index, true);
                        var ww    = new Dot((x + xx) * 16 + 8, (y + yy) * 16 + 8);

                        if (l.IsRock())
                        {
                            BreakRock(level, ww, x + xx, y + yy, l);
                            continue;
                        }

                        var tile = level.Get(index);

                        if (tile == Tile.Crack)
                        {
                            DiscoverCrack(whoHurts, level, x + xx, y + yy);
                        }
                        else if (tile == Tile.Planks || (ice && tile == Tile.WallA))
                        {
                            level.Break((x + xx) * 16, (y + yy) * 16);
                        }
                    }
                }
            }
        }
Пример #29
0
        public override bool HandleEvent(Event e)
        {
            if (e is LostSupportEvent)
            {
                if (GetComponent <HealthComponent>().Unhittable)
                {
                    return(true);
                }

                if (!GetComponent <BuffsComponent>().PitImmunity)
                {
                    GetComponent <HealthComponent>().ModifyHealth(-1, Run.Level);
                }


                for (var i = 0; i < 4; i++)
                {
                    var part = new ParticleEntity(Particles.Dust());

                    part.Position       = Center;
                    part.Particle.Scale = Rnd.Float(0.4f, 0.8f);
                    Area.Add(part);
                }
            }
            else if (e is RoomChangedEvent c)
            {
                if (c.New == null || Run.Level == null || Camera.Instance == null)
                {
                    return(base.HandleEvent(e));
                }

                if (c.New.Tagged[Tags.MustBeKilled].Count > 0)
                {
                    Audio.PlaySfx("level_door_shut");

                    foreach (var p in Area.Tagged[Tags.Player])
                    {
                        if (p.GetComponent <RoomComponent>().Room != c.New)
                        {
                            AnimationUtil.Poof(p.Center);
                            p.Center = Center;
                            AnimationUtil.Poof(p.Center);
                        }
                    }
                }

                ((InGameState)Engine.Instance.State).ResetFollowing();

                var pr = (PixelPerfectGameRenderer)Engine.Instance.StateRenderer;

                if (c.Old != null)
                {
                    if (Scourge.IsEnabled(Scourge.OfLost))
                    {
                        c.Old.Hide();
                    }

                    if (c.Old.Type == RoomType.DarkMarket || c.Old.Type == RoomType.Hidden)
                    {
                        pr.EnableClip = false;
                        c.Old.Hide(true);
                        InBuilding = false;
                        ((InGameState)Engine.Instance.State).UpdateRainVolume();
                    }
                }

                if (c.New.Type == RoomType.DarkMarket)
                {
                    Achievements.Unlock("bk:dark_market");
                }

                if (c.New.Type == RoomType.DarkMarket || c.New.Type == RoomType.Hidden)
                {
                    pr.EnableClip   = true;
                    pr.ClipPosition = new Vector2(c.New.X + 16, c.New.Y + 16);
                    pr.ClipSize     = new Vector2(c.New.Width - 16, c.New.Height - 32);
                    InBuilding      = true;
                    ((InGameState)Engine.Instance.State).UpdateRainVolume();
                }
                else
                {
                    pr.EnableClip = false;
                }

                if (c.New.Type == RoomType.Shop)
                {
                    Audio.PlaySfx("level_door_bell");
                }

                c.New.Discover();
                var level = Run.Level;

                if (InGameState.Ready)
                {
                    switch (c.New.Type)
                    {
                    case RoomType.Secret:
                    case RoomType.Special:
                    case RoomType.Shop:
                    case RoomType.SubShop:
                    case RoomType.Treasure: {
                        foreach (var door in c.New.Doors)
                        {
                            if (door.TryGetComponent <LockComponent>(out var component) && component.Lock is GoldLock)
                            {
                                if (!(c.New.Type == RoomType.Shop && ((door.Rooms[0] != null && door.Rooms[0].Type == RoomType.SubShop) ||
                                                                      (door.Rooms[1] != null && door.Rooms[1].Type == RoomType.SubShop))))
                                {
                                    component.Lock.SetLocked(false, this);
                                }
                            }
                        }

                        break;
                    }

                    case RoomType.OldMan:
                    case RoomType.Granny: {
                        if (c.New.Type == RoomType.OldMan)
                        {
                            GetComponent <StatsComponent>().SawDeal = true;
                        }

                        c.New.OpenHiddenDoors();

                        foreach (var r in Area.Tagged[Tags.Room])
                        {
                            var room = (Room)r;

                            if (room.Type == (c.New.Type == RoomType.OldMan ? RoomType.Granny : RoomType.OldMan))
                            {
                                room.CloseHiddenDoors();
                                break;
                            }
                        }

                        break;
                    }
                    }

                    if (c.New.Type == RoomType.Secret)
                    {
                        ExplosionMaker.CheckForCracks(level, c.New, this);
                    }
                }

                if (c.Old != null)
                {
                    if (c.Old.Type == RoomType.OldMan)
                    {
                        var found = false;

                        foreach (var p in c.Old.Tagged[Tags.Player])
                        {
                            if (p != this && p is Player)
                            {
                                found = true;

                                break;
                            }
                        }

                        if (!found)
                        {
                            c.Old.CloseHiddenDoors();
                        }
                    }
                    else if (c.Old.Type == RoomType.Treasure && Run.Type != RunType.BossRush && !Rnd.Chance(5))
                    {
                        var found = false;

                        foreach (var p in c.Old.Tagged[Tags.Player])
                        {
                            if (p != this && p is Player)
                            {
                                found = true;

                                break;
                            }
                        }

                        if (!found)
                        {
                            foreach (var door in c.Old.Doors)
                            {
                                var x = (int)Math.Floor(door.CenterX / 16);
                                var y = (int)Math.Floor(door.Bottom / 16);
                                var t = level.Get(x, y);

                                if (level.Get(x, y).Matches(TileFlags.Passable))
                                {
                                    var index = level.ToIndex(x, y);

                                    level.Set(index, level.Biome is IceBiome ? Tile.WallB : Tile.WallA);
                                    level.UpdateTile(x, y);
                                    level.ReCreateBodyChunk(x, y);
                                    level.LoadPassable();

                                    Camera.Instance.Shake(10);
                                }
                            }

                            c.Old.ApplyToEachTile((x, y) => {
                                if (Run.Level.Get(x, y).IsWall())
                                {
                                    return;
                                }

                                Timer.Add(() => {
                                    var part = new TileParticle();

                                    part.Top       = Run.Level.Tileset.WallTopADecor;
                                    part.TopTarget = Run.Level.Tileset.WallTopADecor;
                                    part.Side      = Run.Level.Tileset.FloorSidesD[0];
                                    part.Sides     = Run.Level.Tileset.WallSidesA[2];
                                    part.Tile      = Tile.WallA;

                                    part.X        = x * 16;
                                    part.Y        = y * 16;
                                    part.Target.X = x * 16;
                                    part.Target.Y = y * 16;
                                    part.TargetZ  = -8f;

                                    Area.Add(part);
                                }, Rnd.Float(0.5f));
                            });

                            foreach (var d in c.Old.Doors)
                            {
                                d.Done = true;
                            }

                            c.Old.Done = true;
                        }
                    }
                }

                // Darken the lighting in evil rooms
                if (c.New.Type == RoomType.OldMan || c.New.Type == RoomType.Spiked)
                {
                    Tween.To(0.7f, Lights.RadiusMod, x => Lights.RadiusMod = x, 0.3f);
                }
                else if (c.Old != null && (c.Old.Type == RoomType.OldMan || c.Old.Type == RoomType.Spiked))
                {
                    Tween.To(1f, Lights.RadiusMod, x => Lights.RadiusMod = x, 0.3f);
                }
            }
            else if (e is HealthModifiedEvent hm)
            {
                if (hm.Amount < 0)
                {
                    if ((hm.From is Mob m && m.HasPrefix) || (hm.From is creature.bk.BurningKnight k && k.InFight) || hm.From is BkOrbital)
                    {
                        hm.Amount = Math.Min(hm.Amount, -2);
                    }
                    else if (hm.Type != DamageType.Custom && hm.Type != DamageType.Explosive)
                    {
                        hm.Amount = Math.Max(-1, hm.Amount);
                    }
                }
            }
Пример #30
0
        private void Initialize()
        {
            float frameDelay = 0.2f;

            // Hail.
            m_hail = new Sequence(Environment.contentManager);
            m_hail.AddFrame("cloud\\CloudX3", float.PositiveInfinity);
            m_hail.Loop = true;

            // Rain.
            m_rain = new Sequence(Environment.contentManager);
            m_rain.AddFrame("cloud\\CloudX2", float.PositiveInfinity);

            m_rain.Loop = true;

            // Normal.
            m_norm = new Sequence(Environment.contentManager);
            m_norm.AddFrame("cloud\\CloudX1", float.PositiveInfinity);

            // Thunder.
            m_thunder = new Sequence(Environment.contentManager);
            m_thunder.AddFrame("cloud\\thunder1", frameDelay);
            m_thunder.AddFrame("cloud\\thunder2", frameDelay);
            m_thunder.AddFrame("cloud\\thunder3", frameDelay);
            m_thunder.Loop = true;

            // Lightning.
            m_lightning = new Sequence(Environment.contentManager);
            m_lightning.AddFrame("cloud\\Lighting1", frameDelay);
            m_lightning.AddFrame("cloud\\Lighting2", frameDelay);
            m_lightning.AddFrame("cloud\\Lighting3", frameDelay);
            m_lightning.Loop = true;

            /* TODO: INITIALIZE */
            m_h2r = new Sequence(Environment.contentManager);
            m_h2r.AddFrame("cloud\\SemiToBad3", frameDelay);
            m_h2r.AddFrame("cloud\\SemiToBad2", frameDelay);
            m_h2r.AddFrame("cloud\\SemiToBad1", frameDelay);
            m_h2r.Loop = false;


            m_r2n = new Sequence(Environment.contentManager);
            m_r2n.AddFrame("cloud\\NormSemi3", frameDelay);
            m_r2n.AddFrame("cloud\\NormSemi2", frameDelay);
            m_r2n.AddFrame("cloud\\NormSemi1", frameDelay);
            m_r2n.Loop = false;


            m_n2t = new Sequence(Environment.contentManager);
            m_n2t.AddFrame("cloud\\NormSemi1", frameDelay);
            m_n2t.AddFrame("cloud\\NormSemi2", frameDelay);
            m_n2t.AddFrame("cloud\\NormSemi3", frameDelay);
            m_n2t.Loop = false;


            m_t2l = new Sequence(Environment.contentManager);
            m_t2l.AddFrame("cloud\\SemiToBad1", frameDelay);
            m_t2l.AddFrame("cloud\\SemiToBad2", frameDelay);
            m_t2l.AddFrame("cloud\\SemiToBad3", frameDelay);
            m_t2l.Loop = false;



            m_r2h = new Sequence(Environment.contentManager);

            m_r2h.AddFrame("cloud\\SemiToBad1", frameDelay);
            m_r2h.AddFrame("cloud\\SemiToBad2", frameDelay);
            m_r2h.AddFrame("cloud\\SemiToBad3", frameDelay);
            m_r2h.Loop = false;


            m_n2r = new Sequence(Environment.contentManager);
            m_n2r.AddFrame("cloud\\NormSemi1", frameDelay);
            m_n2r.AddFrame("cloud\\NormSemi2", frameDelay);
            m_n2r.AddFrame("cloud\\NormSemi3", frameDelay);
            m_n2r.Loop = false;


            m_t2n = new Sequence(Environment.contentManager);
            m_t2n.AddFrame("cloud\\NormSemi3", frameDelay);
            m_t2n.AddFrame("cloud\\NormSemi2", frameDelay);
            m_t2n.AddFrame("cloud\\NormSemi1", frameDelay);
            m_t2n.Loop = false;


            m_l2t = new Sequence(Environment.contentManager);
            m_l2t.AddFrame("cloud\\SemiToBad3", frameDelay);
            m_l2t.AddFrame("cloud\\SemiToBad2", frameDelay);
            m_l2t.AddFrame("cloud\\SemiToBad1", frameDelay);
            m_l2t.Loop = false;


            m_rainParticle        = new ParticleEntity(Environment, "Rain");
            m_rainParticle.Zindex = ZSettings.Rain;
            AddChild(m_rainParticle);

            m_hailParticle        = new ParticleEntity(Environment, "Hail");
            m_hailParticle.Zindex = ZSettings.Rain;
            AddChild(m_hailParticle);



            UpdateState((int)Environment.Temperature, true);

            Registration = new Vector2(295.0f, 236.0f);

            CreateCollisionBody(Environment.CollisionWorld, BodyType.Kinematic, CollisionFlags.FixedRotation);

            Vector2 topleft     = new Vector2(168.0f, 290.0f) - Registration;
            Vector2 bottomright = new Vector2(431.0f, 1016.0f) - Registration;

            m_rainFixture = AddCollisionRectangle((bottomright - topleft) * 0.5f, (topleft + bottomright) * 0.5f);

            Zindex           = ZSettings.Cloud;
            transitionTarget = CLOUD_STATE.NORM;

            SnapToRung();
            //300 x 240
            AddCollisionCircle(130.0f, new Vector2(80.0f, 0.0f));
            AddCollisionCircle(130.0f, new Vector2(0.0f, 0.0f));
            AddCollisionCircle(130.0f, new Vector2(-80.0f, 0.0f));
        }