namespace BP
{
	namespace Weapon
	{
		class FireStormCannonMP : ScriptWeapon
		{   
			float m_fFireIntervals;
			float m_spinRotVel;
			float m_spinAngle;
			bool m_bFiring;
			//------------------------------------------------------------------------------------------------------------------------
			FireStormCannonMP(kWeapon @actor)
			{
				id = kWpn_Firestorm_MP;
				super(actor);
				m_fFireIntervals = 0.0f;
				m_spinRotVel = 0.0f;
				m_spinAngle = 0.0f;
				m_bFiring = false;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnSerialize(kDict& out dict)
			{
				SERIALIZE(m_fFireIntervals);
				SERIALIZE(m_spinRotVel);
				SERIALIZE(m_spinAngle);
				SERIALIZE(m_bFiring);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnDeserialize(kDict& in dict)
			{
				DESERIALIZE_FLOAT(m_fFireIntervals);
				DESERIALIZE_FLOAT(m_spinRotVel);
				DESERIALIZE_FLOAT(m_spinAngle);
				DESERIALIZE_BOOL(m_bFiring);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnBeginFire(void) override
			{
				ScriptWeapon::OnBeginFire();
				m_fFireIntervals = 0.125f;
				self.PlayLoopingSound("sounds/shaders/Firestorm Cannon Spin.ksnd");
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnFire(void) override
			{
				ScriptWeapon::OnFire();
				m_spinRotVel = Math::IncMax(m_spinRotVel, 0.2f, 5);
				m_spinAngle += m_spinRotVel;
				
				m_bFiring = true;
				
				if (m_spinRotVel < 3.75f)
				{
					return;
				}
				
				m_fFireIntervals -= GAME_DELTA_TIME;
				if (m_fFireIntervals <= 0)
				{
					self.FireProjectile("particles/Multiplayer5.particle", kVec3(0, 0, 6));
					self.PlayLoopingSound("sounds/shaders/Firestorm Cannon Fire.ksnd");
					m_fFireIntervals = 0.125f;
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnEndFire(void) override
			{
				ScriptWeapon::OnEndFire();
				self.AnimTrackComponent().Flags() |= ANF_CYCLECOMPLETED;
				self.PlaySound("sounds/shaders/Firestorm Cannon Spin Stop.ksnd");
				self.StopLoopingSounds();
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnTick(void) override
			{
				ScriptWeapon::OnTick();
				self.RenderMeshComponent().SetRotationOffset(2, Math::Deg2Rad(m_spinAngle), 0, 1, 0);
				m_spinAngle += m_spinRotVel;
				
				if(m_bFiring)
				{
					m_bFiring = false;
					return;
				}
				
				m_spinRotVel = Math::IncMax(m_spinRotVel, Math::Deg2Rad(0.375f) * GAME_FRAME_UNIT, 0);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnLower(void) override
			{
				ScriptWeapon::OnLower();
				m_spinRotVel = 0.0f;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnRaise(void) override
			{
				ScriptWeapon::OnRaise();
				m_spinRotVel = 0.0f;
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
