public void Explode()
{
if (ExplosionRadius <= 0.0f)
return;
Ballz.The().Match.World.StaticGeometry.SubtractCircle(Position.X, Position.Y, ExplosionRadius);
Ballz.The().Match.World.GraphicsEvents.Add(new CameraShakeEffect { Intensity = 2f, Duration = 0.2f, Start = Ballz.The().Match.GameTime });
Ballz.The().Match.World.GraphicsEvents.Add(SpriteGraphicsEffect.CreateExplosion(Ballz.The().Match.GameTime, Position, 0));
// TODO: damage to all players within explosion radius
foreach (var p in Ballz.The().Match.Players) {
foreach (var b in p.OwnedBalls) {
if (Vector2.Distance(b.Position, this.Position) < ExplosionRadius) {
if (!Ballz.The().GameSettings.FriendlyFire.Value && b.Player.TeamName == Team )
break;
b.ChangeHealth ( -this.HealthDecreaseFromExplosionImpact * Vector2.Distance(b.Position, this.Position)/ExplosionRadius );
b.PhysicsBody.ApplyLinearImpulse(HealthDecreaseFromExplosionImpact *
Vector2.Distance(b.Position, this.Position) / ExplosionRadius *
Vector2.Normalize(b.Position - this.Position)
);
}
}
}
if( ShotType == ShotType_T.Generating)
Ballz.The ().Match.World.Water.AddParticles(this.Position, 20);
// Remove projectile
Dispose();
}