namespace BP
{
	namespace Weapon
	{
		//Mag60 Animations (For Reference):
		// ANIM_WPN_ENTER
		// ANIM_WPN_EXIT
		// ANIM_WPN_IDLE
		// ANIM_WPN_RUN
		// ANIM_WPN_ATK1
		
		const float MAG60_SCOPE_TIME = 0.1f;
		const float MAG60_SCOPE_OFFSET_X = 70.0f;
		const float MAG60_SSHOT_TIME = 1.0f;
		const float MAG60_SSHOT_RECOIL_TIME = 0.1f;
		const float MAG60_SSHOT_MAX_PITCH_ANGLE = -70.0f;
		const float MAG60_SSHOT_PUSHBACK = 15.0f;
		const int MAG60_SSHOT_AMMO_CONSUME = 10;
		
		class Mag60 : ScriptWeapon
		{
			float sShotTime;
			float sShotRecoilTime;
			float scopeTime;
			//------------------------------------------------------------------------------------------------------------------------
			Mag60(kWeapon @actor)
			{
				id = kWpn_Magnum;
				super(actor);
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnBeginFire() override
			{
				ScriptWeapon::OnBeginFire();
				
				if (IsSuperShotReady())
				{
					self.FireProjectile("particles/BP/Magnum_Pistol_SBullet.particle", Math::vecZero);
					self.Owner().ConsumeAmmo(MAG60_SSHOT_AMMO_CONSUME - 1);
					self.PlaySound("sounds/shaders/BP/Mag60 Pistol SFire.ksnd");
					self.AnimTrackComponent().Set(ANIM_WPN_IDLE, 4.0f, ANF_LOOP);
					sShotTime = MAG60_SSHOT_TIME;
					sShotRecoilTime = MAG60_SSHOT_RECOIL_TIME;
					BP::LocalPlayer::LockControls(@self, CLF_WEAPON, true);
					
					kVec3 dir = -Math::AngleToDirectionXY(self.Owner().Actor().Yaw()) * MAG60_SSHOT_PUSHBACK;
					dir.z = 0.0f;
					self.Owner().Actor().MovementComponent().Velocity() += dir;
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
			bool IsSuperShotReady()
			{
				return self.ScopeReady() && self.Owner().GetAmmo(id) >= MAG60_SSHOT_AMMO_CONSUME && BP::Game::playerMag60Upgrade;
			}
			//------------------------------------------------------------------------------------------------------------------------
			void OnTick() override
			{
				ScriptWeapon::OnTick();
				
				if (IsSuperShotReady())
				{
					scopeTime = MIN(scopeTime + GAME_DELTA_TIME, MAG60_SCOPE_TIME);
				}
				else
				{
					scopeTime = MAX(scopeTime - GAME_DELTA_TIME, 0.0f);
				}
				self.Origin().x = Math::LerpClamped(0.0f, MAG60_SCOPE_OFFSET_X, scopeTime / MAG60_SCOPE_TIME);
				
				if (sShotRecoilTime > 0.0f)
				{
					sShotRecoilTime -= GAME_DELTA_TIME;
					float pitchAngle = Math::LerpClamped(MAG60_SSHOT_MAX_PITCH_ANGLE, 0, sShotRecoilTime / MAG60_SSHOT_RECOIL_TIME);
					self.Pitch() = Math::Deg2Rad(pitchAngle);
				}

				if (sShotTime > 0.0f)
				{
					sShotTime -= GAME_DELTA_TIME;
					if (sShotTime <= 0.0f)
					{
						self.AnimTrackComponent().Flags() |= ANF_CYCLECOMPLETED;
						BP::LocalPlayer::LockControls(@self, CLF_WEAPON, false);
					}
				}
			}
			//------------------------------------------------------------------------------------------------------------------------
		};
	}
}
