Beispiel #1
0
        protected void WatchForCharacter()
        {
            // Only run the watch behavior every 16 frames.
            if (this.timer.frame16Modulus != this.test16Frame)
            {
                return;
            }

            // Make sure the cooldown is complete.
            if (this.actionEnd > this.timer.Frame)
            {
                return;
            }

            Bounds bounds = this.actor.bounds;

            // Determine view bounds based on direction actor is facing.
            int scanX = actor.posX + (actor.FaceRight ? bounds.Right : bounds.Left - this.viewDist);
            int scanY = actor.posY + bounds.Bottom - this.viewHeight;

            int objectId = CollideRect.FindOneObjectTouchingArea(
                this.actor.room.objects[(byte)LoadOrder.Character],
                scanX,
                scanY,
                this.viewDist,
                this.viewHeight
                );

            // If a character was located in the enemy's view range, enemy begins their stall (before their action).
            if (objectId != 0)
            {
                this.BeginStall();
            }
        }
Beispiel #2
0
        public override bool RunImpact(RoomScene room, GameObject actor, short gridX, short gridY, DirCardinal dir)
        {
            // Only Characters interact with doors.
            if (actor is Character == false)
            {
                return(false);
            }

            Character character = (Character)actor;

            // Display "Interaction" Prompt for Character (draws the 'interaction' hand icon above character head)
            //if(Systems.timer.frame16Modulus % 8 == 5) {
            //	StationaryParticle.SetParticle(character.room, Systems.mapper.atlas[(byte)AtlasGroup.Tiles], "Prompt/Hand", new Vector2(gridX * (byte)TilemapEnum.TileWidth, gridY * (byte)TilemapEnum.TileHeight - (byte)TilemapEnum.HalfHeight), Systems.timer.Frame + 8);
            //}

            // Make sure the character is overlapping the inner door.
            if (!CollideRect.IsTouchingRect(character, gridX * (byte)TilemapEnum.TileWidth + 16, gridX * (byte)TilemapEnum.TileWidth + (byte)TilemapEnum.TileWidth - 12, gridY * (byte)TilemapEnum.TileHeight, gridY * (byte)TilemapEnum.TileHeight + (byte)TilemapEnum.TileHeight * 2))
            {
                return(false);
            }

            // Make sure the Character is actually attempting to interact with the door.
            if (!character.input.isPressed(IKey.YButton))
            {
                return(false);
            }

            return(this.InteractWithDoor(character, room, gridX, gridY));
        }
Beispiel #3
0
        // An Inner Tile Impact checks for an additional, inner collision based on a designated rectangle.
        public static DirCardinal RunInnerImpact(GameObject actor, int x1, int x2, int y1, int y2)
        {
            // Check Overlap with Altered Border
            if (!CollideRect.IsTouchingRect(actor, x1, x2, y1, y2))
            {
                return(DirCardinal.None);
            }

            DirCardinal newDir = CollideRect.GetDirectionOfCollision(actor, x1, x2, y1, y2);

            if (newDir == DirCardinal.Down)
            {
                actor.CollidePosDown(y1 - actor.bounds.Bottom);
            }
            else if (newDir == DirCardinal.Right)
            {
                actor.CollidePosRight(x1 - actor.bounds.Right);
            }
            else if (newDir == DirCardinal.Left)
            {
                actor.CollidePosLeft(x2 - actor.bounds.Left);
            }
            else if (newDir == DirCardinal.Up)
            {
                actor.CollidePosUp(y2 - actor.bounds.Top);
            }

            return(newDir);
        }
Beispiel #4
0
 // Identical to RunInnerImpact, except it doesn't collide.
 public static DirCardinal RunOverlapTest(GameObject actor, int x1, int x2, int y1, int y2)
 {
     if (!CollideRect.IsTouchingRect(actor, x1, x2, y1, y2))
     {
         return(DirCardinal.None);
     }
     return(CollideRect.GetDirectionOfCollision(actor, x1, x2, y1, y2));
 }
Beispiel #5
0
        public static void DamageAbove(RoomScene room, short gridX, short gridY)
        {
            // Damage Creatures Above (if applicable)
            int enemyFoundId = CollideRect.FindOneObjectTouchingArea(room.objects[(byte)LoadOrder.Enemy], gridX * (byte)TilemapEnum.TileWidth + 16, gridY * (byte)TilemapEnum.TileHeight - 4, 16, 4);

            if (enemyFoundId > 0)
            {
                Enemy enemy = (Enemy)room.objects[(byte)LoadOrder.Enemy][enemyFoundId];
                enemy.Die(DeathResult.Knockout);
            }
        }
Beispiel #6
0
        private int WatchForCharacter(int midX, int midY)
        {
            int objectId = CollideRect.FindOneObjectTouchingArea(
                this.actor.room.objects[(byte)LoadOrder.Character],
                Math.Max(0, midX - this.reactDist),
                Math.Max(0, midY - this.reactDist),
                (short)(this.reactDist * 2),                // View Distance (Width)
                (short)(this.reactDist * 2)                 // View Height
                );

            return(objectId);
        }
Beispiel #7
0
        public void BounceSide(GameObject actor, int midY, sbyte strengthMod = 4, byte maxY = 2, sbyte relativeMult = 5)
        {
            actor.physics.velocity.X = FInt.Create(-strengthMod);

            if (maxY > 0)
            {
                short yDiff   = CollideRect.GetRelativeX(actor, midY);
                FInt  yAdjust = FInt.Create(Math.Min(maxY, Math.Abs(yDiff / relativeMult)));

                if (yDiff > 0)
                {
                    actor.physics.velocity.Y += yAdjust;
                }
                else
                {
                    actor.physics.velocity.Y -= yAdjust;
                }
            }
        }
Beispiel #8
0
        private void WatchForCharacter(int midX, int midY)
        {
            // If there is no character in sight, check for a new one:
            if (this.charWatched is Character == false)
            {
                int objectId = CollideRect.FindOneObjectTouchingArea(
                    this.room.objects[(byte)LoadOrder.Character],
                    Math.Max(0, midX - ViewDistance),
                    Math.Max(0, midY - ViewDistance),
                    (ViewDistance * 2),                    // View Distance (Width)
                    (ViewDistance * 2)                     // View Height
                    );

                if (objectId > 0)
                {
                    this.charWatched = (Character)this.room.objects[(byte)LoadOrder.Character][objectId];
                }
            }
        }
Beispiel #9
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 #10
0
        public override void RunTick()
        {
            // While Slammer is Passive
            if (this.state == SlammerState.Passive)
            {
                if (this.viewHeight == 0)
                {
                    return;
                }

                // Check for Characters within Slammer's View. Being Slamming if one is found.
                int objectId = CollideRect.FindOneObjectTouchingArea(
                    this.actor.room.objects[(byte)LoadOrder.Character],
                    this.actor.posX + 8,
                    this.viewY,
                    (byte)TilemapEnum.TileWidth * 2 - 20,
                    this.viewHeight
                    );

                if (objectId > 0)
                {
                    this.state = SlammerState.Slamming;
                }
            }

            // While Slammer is Slamming
            else if (this.state == SlammerState.Slamming)
            {
                this.fallAccel += FInt.Create(0.12);
                if (this.fallAccel > 2)
                {
                    this.fallAccel = FInt.Create(2);
                }
                this.physics.velocity.Y += this.fallAccel;

                // If Slammer has completed its maximum journey.
                if (this.actor.posY >= this.endY)
                {
                    this.EndSlam(this.actor);
                    return;
                }
            }

            // While Slammer is Reset Delayed
            else if (this.state == SlammerState.ResetDelay)
            {
                if (this.resetFrame <= Systems.timer.Frame)
                {
                    this.state = SlammerState.Resetting;
                }
            }

            // While Slammer is Resetting
            else if (this.state == SlammerState.Resetting)
            {
                this.physics.velocity.Y -= FInt.Create(0.3);
                if (this.actor.posY <= this.startY)
                {
                    this.SlammerHasReset();
                }
            }
        }
Beispiel #11
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);
        }