Beispiel #1
0
        public static void DetonateTNT(RoomScene room, int posX, int posY, short width, short height)
        {
            Systems.camera.BeginCameraShake(13, 7);
            room.PlaySound(Systems.sounds.explosion, 1f, posX + (int)Math.Round(width * 0.5), posY + (int)Math.Round(height * 0.5));

            List <GameObject> objects = CollideRect.FindAllObjectsTouchingArea(
                room.objects[(byte)LoadOrder.Enemy], posX, posY, width, height
                );

            // Loop through Enemies and destroy any that can be destroyed by TNT.
            foreach (GameObject obj in objects)
            {
                Enemy enemy = (Enemy)obj;
                enemy.DamageByTNT();
            }
            ;

            TilemapLevel tilemap = room.tilemap;

            // Destroy Chompers Within Area of Effect
            short startX = Math.Max((short)0, (short)Math.Floor((double)(posX / (byte)TilemapEnum.TileWidth)));
            short startY = Math.Max((short)0, (short)Math.Floor((double)(posY / (byte)TilemapEnum.TileHeight)));
            short endX   = Math.Min(tilemap.XCount, (short)Math.Floor((double)((posX + width) / (byte)TilemapEnum.TileWidth)));
            short endY   = Math.Min((short)(tilemap.YCount + TilemapEnum.GapUp), (short)Math.Floor((double)((posY + height) / (byte)TilemapEnum.TileHeight)));

            // Locate Chompers
            var tilesFound = tilemap.GetTilesByMainIDsWithinArea(new byte[7] {
                (byte)TileEnum.ChomperFire, (byte)TileEnum.ChomperGrass, (byte)TileEnum.ChomperMetal, (byte)TileEnum.Plant, (byte)TileEnum.Box, (byte)TileEnum.Brick, (byte)TileEnum.Leaf
            }, startX, startY, endX, endY);

            var TileDict = Systems.mapper.TileDict;

            foreach (var tileInfo in tilesFound)
            {
                TileObject tile = TileDict[tileInfo.tileId];
                if (tile is Chomper)
                {
                    ((Chomper)tile).DestroyChomper(room, tileInfo.gridX, tileInfo.gridY);
                }
            }
        }
Beispiel #2
0
        public static void Detonate(RoomScene room, int midX, int midY)
        {
            TilemapLevel tilemap = room.tilemap;

            int gridX = (int)Math.Floor((double)(midX / (byte)TilemapEnum.TileWidth));
            int gridY = (int)Math.Floor((double)(midY / (byte)TilemapEnum.TileHeight));

            // Destroy Enemies Within Area of Effect
            List <GameObject> enemiesFound = CollideRect.FindAllObjectsTouchingArea(room.objects[(byte)LoadOrder.Enemy], midX - 144, midY - 96, 288, 192);

            foreach (GameObject enemy in enemiesFound)
            {
                ((Enemy)enemy).Die(DeathResult.Knockout);
            }

            // Heavily Damage Characters Within Area of Effect
            List <GameObject> charsFound = CollideRect.FindAllObjectsTouchingArea(room.objects[(byte)LoadOrder.Character], midX - 144, midY - 96, 288, 192);

            foreach (GameObject character in charsFound)
            {
                ((Character)character).wounds.ReceiveWoundDamage(DamageStrength.Major, true);
                ((Character)character).wounds.ReceiveWoundDamage(DamageStrength.Major, true);
                ((Character)character).wounds.ReceiveWoundDamage(DamageStrength.Major, true);
            }

            // Destroy Certain Tiles Within Area of Effect
            short startX = (short)Math.Max(0, gridX - 3);
            short startY = (short)Math.Max(0, gridY - 2);
            short endX   = (short)Math.Min(tilemap.XCount + (byte)TilemapEnum.GapLeft - 1, gridX + 3);
            short endY   = (short)Math.Min(tilemap.YCount + (byte)TilemapEnum.GapUp - 1, gridY + 2);

            // Locate Tiles: Chompers, Boxes, Bricks, Leafs, etc.
            var tilesFound = tilemap.GetTilesByMainIDsWithinArea(new byte[7] {
                (byte)TileEnum.ChomperFire, (byte)TileEnum.ChomperGrass, (byte)TileEnum.ChomperMetal, (byte)TileEnum.Plant, (byte)TileEnum.Box, (byte)TileEnum.Brick, (byte)TileEnum.Leaf
            }, startX, startY, endX, endY);

            var TileDict = Systems.mapper.TileDict;

            foreach (var tileInfo in tilesFound)
            {
                TileObject tile = TileDict[tileInfo.tileId];

                if (tile is Chomper)
                {
                    ((Chomper)tile).DestroyChomper(room, tileInfo.gridX, tileInfo.gridY);
                }
                else if (tile is Brick)
                {
                    ((Brick)tile).DestroyBrick(room, tileInfo.gridX, tileInfo.gridY);
                }
                else if (tile is Box)
                {
                    ((Box)tile).DestroyBox(room, tileInfo.gridX, tileInfo.gridY);
                }
                else if (tile is Leaf)
                {
                    ((Leaf)tile).TriggerEvent(room, tileInfo.gridX, tileInfo.gridY, 0);
                }
            }

            // Display Particle Effect
            ExplodeEmitter.BoxExplosion(room, "Particles/GrenadeFrag", midX, midY, 20, 15);
            ExplodeEmitter.BoxExplosion(room, "Particles/GrenadeFrag", midX, midY, 70, 50);

            room.PlaySound(Systems.sounds.explosion, 0.4f, midX, midY);

            // Camera Shake
            Systems.camera.BeginCameraShake(35, 6);
        }