using AlienAttack.MonoGame.Things.Bullets; using AlienAttack.MonoGame.Things.Muzzles; namespace AlienAttack.MonoGame.Things.Weapons; internal class Minigun : Weapon { public override int FireThreshold => 15; public override void Fire(Sprite owner, SpriteUpdateContext context) { // Calculate bullet spawn positions relative to the player's bounding box int x1 = (int)owner.XPosition + 14; int x2 = (int)owner.XPosition + owner.BoundBox.Width - 16; int y = (int)owner.YPosition + 10; // Create bullets with velocity (0, -4) MinigunBulletLarge bullet1 = new(x1, y, 0, -6, owner); MinigunBulletLarge bullet2 = new(x2, y, 0, -6, owner); // Queue the bullets for spawning context.SpawnSprite(bullet1); context.SpawnSprite(bullet2); context.AudioManager.PlayPlayerFire(); } } internal abstract class MinigunSingle : Weapon { public override void Fire(Sprite owner, SpriteUpdateContext context) { FireBulletFromMuzzleContext fireBulletContext = new() { Owner = owner, SpriteUpdateContext = context, BulletWidth = MinigunBulletSmall.Width, BulletHeight = MinigunBulletSmall.Height, Factory = (x, y, vx, vy2, o) => new MinigunBulletSmall(x, y, vx, vy2, o), ExtraOffset = new(4f, 0), Shots = [ new() { Muzzle = MuzzleId.Center, XVelocity = 0, YVelocity = -6 } ] }; FireFromMuzzle(fireBulletContext); context.AudioManager.PlayPlayerFire(); } } internal class MinigunSingleSlow : MinigunSingle { public override int FireThreshold => 20; } internal class MinigunSingleAverage : MinigunSingle { public override int FireThreshold => 15; } internal class MinigunSingleFast : MinigunSingle { public override int FireThreshold => 10; } internal abstract class MinigunDouble : Weapon { public override void Fire(Sprite owner, SpriteUpdateContext context) { FireBulletFromMuzzleContext fireBulletContext = new() { Owner = owner, SpriteUpdateContext = context, BulletWidth = MinigunBulletMedium.Width, BulletHeight = MinigunBulletMedium.Height, Factory = (x, y, vx, vy2, o) => new MinigunBulletMedium(x, y, vx, vy2, o), ExtraOffset = new(4f, 0), Shots = [ new() { Muzzle = MuzzleId.Left, XVelocity = 0, YVelocity = -6 }, new() { Muzzle = MuzzleId.Right, XVelocity = 0, YVelocity = -6 } ] }; FireFromMuzzle(fireBulletContext); context.AudioManager.PlayPlayerFire(); } } internal class MinigunDoubleSlow : MinigunDouble { public override int FireThreshold => 30; } internal class MinigunDoubleAverage : MinigunDouble { public override int FireThreshold => 20; } internal class MinigunDoubleFast : MinigunDouble { public override int FireThreshold => 15; } internal abstract class MinigunTriple : Weapon { public override void Fire(Sprite owner, SpriteUpdateContext context) { FireBulletFromMuzzleContext fireBulletContext = new() { Owner = owner, SpriteUpdateContext = context, BulletWidth = MinigunBulletMedium.Width, BulletHeight = MinigunBulletMedium.Height, Factory = (x, y, vx, vy2, o) => new MinigunBulletMedium(x, y, vx, vy2, o), ExtraOffset = new(4f, 0), Shots = [ new() { Muzzle = MuzzleId.Left, XVelocity = 0, YVelocity = -6 }, new() { Muzzle = MuzzleId.Center, XVelocity = 0, YVelocity = -6 }, new() { Muzzle = MuzzleId.Right, XVelocity = 0, YVelocity = -6 } ] }; FireFromMuzzle(fireBulletContext); context.AudioManager.PlayPlayerFire(); } } internal class MinigunTripleSlow : MinigunTriple { public override int FireThreshold => 30; } internal class MinigunTripleAverage : MinigunTriple { public override int FireThreshold => 20; } internal class MinigunTripleFast : MinigunTriple { public override int FireThreshold => 15; } internal abstract class MinigunTripleSpread : Weapon { public override void Fire(Sprite owner, SpriteUpdateContext context) { FireBulletFromMuzzleContext fireBulletContext = new() { Owner = owner, SpriteUpdateContext = context, BulletWidth = LaserBulletLarge.Width, BulletHeight = LaserBulletLarge.Height, Factory = (x, y, vx, vy2, o) => new LaserBulletLarge(x, y, vx, vy2, o), ExtraOffset = new(4f, 0), Shots = [ new() { Muzzle = MuzzleId.Left, XVelocity = -1, YVelocity = -6 }, new() { Muzzle = MuzzleId.Right, XVelocity = 1, YVelocity = -6 }, new() { Muzzle = MuzzleId.Center, XVelocity = 0, YVelocity = -6 } ] }; FireFromMuzzle(fireBulletContext); context.AudioManager.PlayPlayerFire(); } } internal class MinigunTripleSpreadSlow : MinigunTripleSpread { public override int FireThreshold => 30; } internal class MinigunTripleSpreadAverage : MinigunTripleSpread { public override int FireThreshold => 20; } internal class MinigunTripleSpreadFast : MinigunTripleSpread { public override int FireThreshold => 15; }