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)); }
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); }
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)); }
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)); }