
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_Vertebrate_JumpHandler.cpp
// Author : Andy Tate
// Date   : 27-Sep-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Core/Asura.h"

// This file's header...
#include "Actor/Vertebrates/AVP_Vertebrate_JumpHandler.h"

// Asura
#include "Attractors/Asura_Attractor_Data.h"

// Game independent header-files...
#include "Actor/Vertebrates/AVP_Vertebrate_InputHandler.h"
#include "Blueprint/AVP_Blueprint_HashIDs.h"
#include "Entity/PhysicalObject/Actor/Vertebrates/AVP_ClientActor_Vertebrate.h"
#include "Moves/AVP_Moves.h"


////////////////////////////////////////////////////////////////////////////////
// Constant declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Static variable declarations...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Private functions...
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Protected functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_Vertebrate_JumpHandler::CalculateJumpVelocity
// Author       : Andy Tate
// Date         : 28-Sep-2007
////////////////////////////////////////////////////////////////////////////////

void AVP_Vertebrate_JumpHandler::CalculateJumpVelocity(Asura_Vector_3& xJumpVelocity) const
{
	Asura_Physics_Object*	pxPhysicsObject	= m_xOwner.GetPhysicsObject();

	if(pxPhysicsObject == NULL)
	{
		xJumpVelocity.SetX(0.0f);
		xJumpVelocity.SetY(-m_fUpwardsSpeed);
		xJumpVelocity.SetZ(0.0f);
	}
	else
	{
		xJumpVelocity	 = pxPhysicsObject->GetGravityDirection();
		xJumpVelocity	*= -m_fUpwardsSpeed;
	}

	// HACK - Check if the owner is on constrained movement, and if so force a movement direction. This currently only works for upright characters.
	if ((m_xOwner.GetConstrainedMovementAttractorID() != uASURA_ATTRACTOR_ID_NONE) && m_xOwner.GetInputHandler())
	{
		Asura_Vector_3 xDirection = static_cast<const AVP_Vertebrate_InputHandler*>(m_xOwner.GetInputHandler())->GetMovementInput();
		xDirection = xDirection * m_xOwner.GetCurrentOrientation();
		xJumpVelocity.SetX(xDirection.x * 3.0f);
		xJumpVelocity.SetZ(xDirection.z * 3.0f);
	}
}

/// End of function 'AVP_Vertebrate_JumpHandler::CalculateJumpVelocity'. ///



////////////////////////////////////////////////////////////////////////////////
// Public functions...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_Vertebrate_JumpHandler::AVP_Vertebrate_JumpHandler
// Author       : Andy Tate
// Date         : 26-Sep-2007
////////////////////////////////////////////////////////////////////////////////

AVP_Vertebrate_JumpHandler::AVP_Vertebrate_JumpHandler(AVP_ClientActor_Vertebrate& xOwner)
: m_xOwner(xOwner)
, m_uJumpType(0)
, m_fUpwardsSpeed(10.0f)
{
	const Asura_Blueprint* pxActorBP = xOwner.GetBlueprint();
	if ( pxActorBP )
	{
		Asura_Value xVal;
		if ( pxActorBP->GetParameterValueByHashID( uAVP_BLUEPRINT_PARAM_TAPJUMPVELOCITY, xVal ) )
		{
			m_fUpwardsSpeed = xVal.GetFloatValue();
		}
	}
}

/// End of function 'AVP_Vertebrate_JumpHandler::AVP_Vertebrate_JumpHandler'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_Vertebrate_JumpHandler::Update
// Author       : Andy Tate
// Date         : 27-Sep-2007
////////////////////////////////////////////////////////////////////////////////

void AVP_Vertebrate_JumpHandler::Update(void)
{
}

/// End of function 'AVP_Vertebrate_JumpHandler::Update'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_Vertebrate_JumpHandler::Render
// Author       : Andy Tate
// Date         : 27-Sep-2007
////////////////////////////////////////////////////////////////////////////////

void AVP_Vertebrate_JumpHandler::Render(void) const
{
}

/// End of function 'AVP_Vertebrate_JumpHandler::Render'. ///



////////////////////////////////////////////////////////////////////////////////
// Function     : AVP_Vertebrate_JumpHandler::HandleJump
// Author       : Andy Tate
// Date         : 26-Sep-2007
////////////////////////////////////////////////////////////////////////////////

bool AVP_Vertebrate_JumpHandler::HandleJump(const float fJumpValue)
{
	if((fJumpValue == 0.0f) || ((m_xOwner.GetGroundType() == AVP_Actor_PhysicsObjectHandler::OFF_GROUND) && (m_xOwner.GetConstrainedMovementAttractorID() == uASURA_ATTRACTOR_ID_NONE)))
	{
		return(false);
	}
	else
	{
		// See if we already have a movement-controlling move in progress, and disallow jumps if we do.
		const Asura_Movement_System* pxMovementSystem = m_xOwner.GetMovementSystem();
		const AVP_Move* pxCurrentMove = pxMovementSystem ? static_cast<const AVP_Move*>(pxMovementSystem->GetCurrentMove()) : NULL;
		if (pxCurrentMove && (pxCurrentMove->IsDisableMovement() || (pxCurrentMove->GetAVPAnimationData() && !pxCurrentMove->GetAVPAnimationData()->GetDontCalculateVelocity())))
		{
			return false;
		}

		Asura_Vector_3	xJumpVelocity;

		CalculateJumpVelocity(xJumpVelocity);
		m_xOwner.SetJumpVelocity(xJumpVelocity);

		m_xOwner.OnBeginJumping();

		return(true);
	}
}

/// End of function 'AVP_Vertebrate_JumpHandler::BeginJump'. ///


/// End of file. ///
