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(); } }
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)); }
// 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); }
// 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)); }
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); } }
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); }
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; } } }
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]; } } }
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); } } }
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(); } } }
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); }