using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using EvilSatellites.Objects; using SynthySound; using EvilSatellites.Screens; using Microsoft.Xna.Framework; namespace EvilSatellites.Weapons { public class LaserMG : AbstractWeapon { public AudioAsset sfxShoot; public ISoundEffect sfxReload; public ISoundEffect sfxSpindown; public ISoundEffect sfxSpinup; public ISoundEffect sfxSpinning; public ISoundEffect sfxEmpty; public GameScreen Screen; public LaserMG(IGameObject wielder, GameScreen screen) { _wielder = wielder; Screen = screen; MaxAmmo = 250; RemainingAmmo = MaxAmmo; FireRate = 90; State = WeaponState.Stopped; LoadSounds(); } public void LoadSounds() { sfxReload = Screen.Manager.Sound.Load(@"sfx/weapons/LaserMG/reload.wav", false); sfxSpindown = Screen.Manager.Sound.Load(@"sfx/weapons/LaserMG/spindown.wav", false); sfxSpinup = Screen.Manager.Sound.Load(@"sfx/weapons/LaserMG/spinup.wav", false); sfxSpinning = Screen.Manager.Sound.Load(@"sfx/weapons/LaserMG/spinning.wav", false); sfxSpinning.Loop = true; sfxShoot = new AudioAsset(Screen.Manager.Sound, @"sfx/weapons/LaserMG/fire", 1, 4); sfxEmpty = Screen.Manager.Sound.Load(@"sfx/weapons/LaserMG/empty.wav", false); sfxEmpty.ConnectToEffect(Screen.Manager.EnvironmentEffect); sfxReload.ConnectToEffect(Screen.Manager.EnvironmentEffect); sfxShoot.AddEffect(Screen.Manager.EnvironmentEffect); sfxSpindown.ConnectToEffect(Screen.Manager.EnvironmentEffect); sfxSpinup.ConnectToEffect(Screen.Manager.EnvironmentEffect); sfxSpinning.ConnectToEffect(Screen.Manager.EnvironmentEffect); } public override void Shoot(GameTime time) { if (State != WeaponState.Stopped) { return; } State = WeaponState.Starting; sfxSpinup.Reset(); sfxSpinup.Play(); TimerStart = 0; } public override void Stop() { if (State != WeaponState.Stopped) { sfxSpinning.Pause(); sfxSpinup.Pause(); sfxSpindown.Reset(); sfxSpindown.Play(); State = WeaponState.Stopping; } } public override void Update(GameTime time) { TimerStart += time.ElapsedGameTime.TotalMilliseconds; if (State == WeaponState.Starting) { if (TimerStart > 800) { State = WeaponState.Firing; sfxSpinning.Play(); TimerStart = 0; } } if (State == WeaponState.Firing) { if (TimerStart > FireRate) { if (RemainingAmmo > 0) { sfxShoot.Play(); RemainingAmmo--; TimerStart = TimerEnd; Projectile proj = new Projectile(Screen, _wielder.Position, _wielder.Rotation, _wielder); Screen.AddObject(proj); GameStats.ShotsFired++; } else { sfxEmpty.Reset(); sfxEmpty.Play(); TimerStart = TimerEnd; } } } if (State == WeaponState.Stopping) { if (TimerStart > 500) { State = WeaponState.Stopped; TimerStart = 0; } } base.Update(time); } public override void Reload(int amount) { RemainingAmmo += amount; sfxReload.Reset(); sfxReload.Play(); } } }