Пример #1
0
        public override bool RunImpact(RoomScene room, GameObject actor, short gridX, short gridY, DirCardinal dir)
        {
            if (actor is Projectile)
            {
                if (actor is GloveProjectile)
                {
                    this.DestroyBox(room, gridX, gridY);
                    return(false);
                }
                return(TileProjectileImpact.RunImpact((Projectile)actor, gridX, gridY, dir));
            }

            // Slam-Down Action can break boxes.
            if (actor is Character && ((Character)actor).status.action is SlamAction)
            {
                this.DestroyBox(room, gridX, gridY);
                return(true);
            }

            // Destroy Box
            if (dir == DirCardinal.Up)
            {
                BlockTile.DamageAbove(room, gridX, gridY);
                this.DestroyBox(room, gridX, gridY);
            }

            return(base.RunImpact(room, actor, gridX, gridY, dir));
        }
Пример #2
0
        public static void BreakFromBelow(RoomScene room, short gridX, short gridY)
        {
            // Damage Creatures Above (if applicable)
            BlockTile.DamageAbove(room, gridX, gridY);

            // Destroy Brick Tile
            room.tilemap.SetMainTile(gridX, gridY, 0, 0);
        }
Пример #3
0
        public override bool RunImpact(RoomScene room, GameObject actor, short gridX, short gridY, DirCardinal dir)
        {
            if (actor is Projectile)
            {
                if (actor is GloveProjectile)
                {
                    this.DestroyBrick(room, gridX, gridY);
                    return(false);
                }
                return(base.RunImpact(room, actor, gridX, gridY, dir));
            }

            // Nudge Brick Upward
            if (dir == DirCardinal.Up)
            {
                if (actor is Character)
                {
                    Character character = (Character)actor;

                    // Only Spikey Hats destroy Bricks
                    if (character.hat is SpikeyHat)
                    {
                        BlockTile.DamageAbove(room, gridX, gridY);
                        this.DestroyBrick(room, gridX, gridY);
                        return(base.RunImpact(room, actor, gridX, gridY, dir));
                    }
                }

                // Nudge. Damages enemies above.
                byte sub = room.tilemap.GetMainSubType(gridX, gridY);

                // Make the brick disappear (turn invisible) and replace it with a nudge particle. Then return the brick to visible after completion.
                if (sub < 10)
                {
                    SimpleEmitter.GravityParticle(room, this.Texture[sub], gridX * (byte)TilemapEnum.TileWidth, gridY * (byte)TilemapEnum.TileHeight);
                    room.tilemap.SetTileSubType(gridX, gridY, (byte)(sub + 10));
                    room.queueEvents.AddEvent(Systems.timer.Frame + 9, this.tileId, (short)gridX, (short)gridY);
                }

                BlockTile.DamageAbove(room, gridX, gridY);
                room.PlaySound(Systems.sounds.thudHit, 0.7f, gridX * (byte)TilemapEnum.TileWidth, gridY * (byte)TilemapEnum.TileHeight);
            }

            // Slam-Down Action can break bricks.
            if (actor is Character && ((Character)actor).status.action is SlamAction)
            {
                // Bricks will cause some hindrance, slowing down vertical velocity.
                actor.physics.velocity.Y *= FInt.Create(0.6);
                this.DestroyBrick(room, gridX, gridY);

                return(true);
            }

            return(base.RunImpact(room, actor, gridX, gridY, dir));
        }
Пример #4
0
        public override bool RunImpact(RoomScene room, GameObject actor, short gridX, short gridY, DirCardinal dir)
        {
            if (actor is Projectile)
            {
                if (actor is GloveProjectile)
                {
                    this.TriggerEvent(room, gridX, gridY, (byte)LeafTriggerEvent.BreakApart);
                    return(false);
                }
            }

            byte subType = room.tilemap.GetMainSubType(gridX, gridY);

            // If the SubType is over 20 (Untouchable), don't run any collisions. It's in an invisible and untouchable state.
            if (subType > 20)
            {
                return(false);
            }

            // Slam-Down Action can break leaves without any shake delay.
            if (actor is Character && ((Character)actor).status.action is SlamAction)
            {
                this.TriggerEvent(room, gridX, gridY, (byte)LeafTriggerEvent.BreakApart);
                return(true);
            }

            if (subType < 10)
            {
                // Destroy Leaf
                if (dir == DirCardinal.Up)
                {
                    BlockTile.DamageAbove(room, gridX, gridY);
                    this.TriggerEvent(room, gridX, gridY, (byte)LeafTriggerEvent.BreakApart);
                }

                // Begin Shaking. Add a Queue for 1 second that will break the leaf block.
                else if (dir == DirCardinal.Down)
                {
                    // Perform Shake Delay normally.
                    room.tilemap.SetTileSubType(gridX, gridY, (byte)(subType + 10));
                    room.queueEvents.AddEvent(Systems.timer.Frame + Leaf.LeafShakeDuration, this.tileId, gridX, gridY, (byte)LeafTriggerEvent.BreakApart);

                    // Create Visible Shaking Particle
                    LeafShakeParticle.SetParticle(room, this.atlas, this.Texture[subType], new Vector2(gridX * (byte)TilemapEnum.TileWidth, gridY * (byte)TilemapEnum.TileHeight), Systems.timer.Frame + Leaf.LeafShakeDuration);
                }
            }

            return(base.RunImpact(room, actor, gridX, gridY, dir));
        }