namespace BP
{
	namespace Weapon
	{
		class TorpedoLauncher : ScriptWeapon
		{   
			float m_spinRotVel;
			float m_spinAngle;
			//------------------------------------------------------------------------------------------------------------------------
			TorpedoLauncher(kWeapon @actor)
			{
				id = kWpn_TorpedoLauncher;
				super(actor);
				
				m_spinRotVel = 0;
				m_spinAngle = 0;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnSerialize(kDict& out dict)
			{
				SERIALIZE(m_spinRotVel);
				SERIALIZE(m_spinAngle);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnDeserialize(kDict& in dict)
			{
				DESERIALIZE_FLOAT(m_spinRotVel);
				DESERIALIZE_FLOAT(m_spinAngle);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnTick(void) override
			{
				ScriptWeapon::OnTick();
				float fAccel, fTarget;
				
				if ((self.Owner().Buttons() & BC_FORWARD) != 0)
				{
					kVec3 vVel = self.Owner().Actor().MovementComponent().Velocity();
					float fSpeed = vVel.Unit();
					
					fTarget = Math::Deg2Rad(24);
					fAccel = fSpeed * 0.0525f;
					
					self.PlayLoopingSound("sounds/shaders/Torpedo Launcher Motor Loop.ksnd");
				}
				else
				{
					fAccel = Math::Deg2Rad(0.5f);
					fTarget = (m_spinRotVel > 0) ? Math::Deg2Rad(1) : Math::Deg2Rad(-1);
					self.StopLoopingSounds();
				}
				
				m_spinRotVel = Math::IncMax(m_spinRotVel, fAccel, fTarget);
				m_spinAngle += m_spinRotVel;
				
				self.RenderMeshComponent().SetRotationOffset(2, m_spinAngle, 0, 1, 0);
				
				int animID = self.AnimTrackComponent().PlayingID();
				
				// firing animation pauses for a really long time and its annoying.
				// so force the animation to complete half-way through playing
				switch(animID)
				{
				case ANIM_WPN_ATK1:
				case ANIM_WPN_ATK2:
				case ANIM_WPN_ATK3:
				case ANIM_WPN_ATK4:
					if (self.AnimTrackComponent().TrackTime() >= 0.5f)
					{
						self.AnimTrackComponent().Flags() |= ANF_CYCLECOMPLETED;
					}
					break;
				default:
					break;
				};
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnLower(void) override
			{
				ScriptWeapon::OnLower();
				self.StopLoopingSounds();
				m_spinAngle = 0;
				self.RenderMeshComponent().SetRotationOffset(2, Math::Deg2Rad(0), 0, 1, 0);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnRaise(void) override
			{
				ScriptWeapon::OnRaise();
				m_spinRotVel = 0;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnFiredParticleFromAnim(kParticle@ pBlade) override
			{
				ScriptWeapon::OnFiredParticleFromAnim(@pBlade);
				
				// hack so that we consume ammo only once per fire animation
				if (self.AnimTrackComponent().TrackTime() < 0.3f)
				{
					self.Owner().ConsumeAmmo(1);
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
