namespace BP
{
	namespace Input
	{
		const int BC_CROUCH = 1 << 6;
		
		uint16 lastButtons;
		uint16 buttons;
		//------------------------------------------------------------------------------------------------------------------------
		void OnTick()
		{
			lastButtons = buttons;
			buttons = LocalPlayer.Buttons();
		}
		//------------------------------------------------------------------------------------------------------------------------
		// Returns true while the button is held down
		//------------------------------------------------------------------------------------------------------------------------
		bool Crouch()
		{
			return (buttons & BC_CROUCH) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		// Returns true during the frame the user pressed down the button
		//------------------------------------------------------------------------------------------------------------------------
		bool CrouchDown()
		{
			return (lastButtons & BC_CROUCH) == 0 && (buttons & BC_CROUCH) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		// Returns true the first frame the user releases the button
		//------------------------------------------------------------------------------------------------------------------------
		bool CrouchUp()
		{
			return (lastButtons & BC_CROUCH) != 0 && (buttons & BC_CROUCH) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool Attack()
		{
			return (buttons & BC_ATTACK) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool AttackDown()
		{
			return (lastButtons & BC_ATTACK) == 0 && (buttons & BC_ATTACK) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool AttackUp()
		{
			return (lastButtons & BC_ATTACK) != 0 && (buttons & BC_ATTACK) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool AltFireDown()
		{
			return (lastButtons & BC_ALTFIRE) == 0 && (buttons & BC_ALTFIRE) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool Jump()
		{
			return (buttons & BC_JUMP) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool JumpDown()
		{
			return (lastButtons & BC_JUMP) == 0 && (buttons & BC_JUMP) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool JumpUp()
		{
			return (lastButtons & BC_JUMP) != 0 && (buttons & BC_JUMP) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool Forward()
		{
			return (buttons & BC_FORWARD) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ForwardDown()
		{
			return (lastButtons & BC_FORWARD) == 0 && (buttons & BC_FORWARD) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ForwardUp()
		{
			return (lastButtons & BC_FORWARD) != 0 && (buttons & BC_FORWARD) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool Backward()
		{
			return (buttons & BC_BACKWARD) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool BackwardDown()
		{
			return (lastButtons & BC_BACKWARD) == 0 && (buttons & BC_BACKWARD) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool BackwardUp()
		{
			return (lastButtons & BC_BACKWARD) != 0 && (buttons & BC_BACKWARD) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeLeft()
		{
			return (buttons & BC_STRAFELEFT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeLeftDown()
		{
			return (lastButtons & BC_STRAFELEFT) == 0 && (buttons & BC_STRAFELEFT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeLeftUp()
		{
			return (lastButtons & BC_STRAFELEFT) == 0 && (buttons & BC_STRAFELEFT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeRight()
		{
			return (buttons & BC_STRAFERIGHT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeRightDown()
		{
			return (lastButtons & BC_STRAFERIGHT) == 0 && (buttons & BC_STRAFERIGHT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool StrafeRightUp()
		{
			return (lastButtons & BC_STRAFERIGHT) != 0 && (buttons & BC_STRAFERIGHT) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomIn()
		{
			return (buttons & BC_SCOPEZOOMIN) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomInDown()
		{
			return (lastButtons & BC_SCOPEZOOMIN) == 0 && (buttons & BC_SCOPEZOOMIN) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomInUp()
		{
			return (lastButtons & BC_SCOPEZOOMIN) != 0 && (buttons & BC_SCOPEZOOMIN) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomOut()
		{
			return (buttons & BC_SCOPEZOOMOUT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomOutDown()
		{
			return (lastButtons & BC_SCOPEZOOMOUT) == 0 && (buttons & BC_SCOPEZOOMOUT) != 0;
		}
		//------------------------------------------------------------------------------------------------------------------------
		bool ScopeZoomOutUp()
		{
			return (lastButtons & BC_SCOPEZOOMOUT) != 0 && (buttons & BC_SCOPEZOOMOUT) == 0;
		}
		//------------------------------------------------------------------------------------------------------------------------	
	}
}
