namespace BP
{
	namespace Weapon
	{
		const int RAZOR_THROWS_TILL_NOBLOOD = 3; //when it's the blood texture how many missed throws till it becomes clean again
		
		RazorWind@ RazorWindScript()
		{
			return cast<RazorWind>(Scripts[kWpn_RazorWind]);
		}
		
		//RazorWind Properties not in class so it doesn't get reset on map load
		int RazorNoBloodThrowCount; 
		int RazorTextureIndex = -1;

		class RazorWind : ScriptWeapon
		{   
			float m_fZOffset;
			float m_fInitialZOffset;
			float m_fSpinAngle;
			float m_fExtraSpinSpeed;
			//------------------------------------------------------------------------------------------------------------------------
			RazorWind(kWeapon @actor)
			{
				id = kWpn_RazorWind;
				super(actor);
				
				m_fInitialZOffset = self.Origin().z;
				m_fZOffset = m_fInitialZOffset;
				m_fSpinAngle = 0.0;
				m_fExtraSpinSpeed = 0.0;
				
				self.RenderMeshComponent().AltTexture() = RazorTextureIndex;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnSerialize(kDict& out dict)
			{
				SERIALIZE(m_fZOffset);
				SERIALIZE(m_fInitialZOffset);
				SERIALIZE(m_fSpinAngle);
				SERIALIZE(m_fExtraSpinSpeed);
				SERIALIZE(RazorNoBloodThrowCount);
				SERIALIZE(RazorTextureIndex);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnDeserialize(kDict& in dict)
			{
				DESERIALIZE_FLOAT(m_fZOffset);
				DESERIALIZE_FLOAT(m_fInitialZOffset);
				DESERIALIZE_FLOAT(m_fSpinAngle);
				DESERIALIZE_FLOAT(m_fExtraSpinSpeed);
				DESERIALIZE_INT(RazorNoBloodThrowCount);
				DESERIALIZE_INT(RazorTextureIndex);
				
				self.RenderMeshComponent().AltTexture() = RazorTextureIndex;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnBeginFire(void) override
			{
				ScriptWeapon::OnBeginFire();
				self.AnimTrackComponent().ChangeSpeed(2.0f);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnTick() override
			{
				ScriptWeapon::OnTick();
				
				self.RenderMeshComponent().SetRotationOffset(2, m_fSpinAngle, 0, 0, 1);
				m_fSpinAngle += Math::Deg2Rad(10.0f + (m_fExtraSpinSpeed * 20.0)) * 0.5f * GAME_FRAME_TIME;
				m_fExtraSpinSpeed = Math::Max(m_fExtraSpinSpeed - GAME_DELTA_TIME, 0.0f);
				
				self.Origin().y = m_fZOffset;
				
				if (m_fZOffset != m_fInitialZOffset)
				{
					m_fZOffset = (m_fInitialZOffset - m_fZOffset) * 0.1f + m_fZOffset;
				}
				
				if (self.GetTarget() is null)
				{
					return;
				}
				
				if (self.GetTarget().IsStale())
				{
					kActor@ pNull = null;
					
					self.SetTarget(pNull);
					self.RenderMeshComponent().SwapOutMesh(0);
					BP::LocalPlayer::LockControls(@self, CLF_WEAPON, false);
					
					m_fZOffset = (5*GAME_SCALE);
					m_fExtraSpinSpeed = 1.0f;
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnFiredParticleFromAnim(kParticle@ pBlade) override
			{
				ScriptWeapon::OnFiredParticleFromAnim(@pBlade);
			
				RazorNoBloodThrowCount = MAX(RazorNoBloodThrowCount - 1, 0);
				if (RazorNoBloodThrowCount == 0)
				{
					RazorTextureIndex = -1;
					self.RenderMeshComponent().AltTexture() = -1;
				}
				self.RenderMeshComponent().SwapOutMesh(1);
				BP::LocalPlayer::LockControls(@self, CLF_WEAPON, true);
				
				kActor@ pController = ActorFactory.Spawn(kActor_Misc_BladeController, pBlade.Origin(), 0.0f, 0.0f, 0.0f);
				if (pController is null)
				{
					return;
				}
				
				// target the controller so we can monitor it's lifetime
				self.SetTarget(pController);
				
				// make controller target the blade so it can control it
				pController.SetTarget(pBlade);
				pController.PlayLoopingSound("sounds/shaders/Razor Wind Fly Loop.ksnd");
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
