
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_FaceHugger_MovesJump.h
// Copyright (C) 2008 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_FACEHUGGER_MOVESJUMP_H__
#define __AVP_FACEHUGGER_MOVESJUMP_H__

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

#include "Entity/PhysicalObject/Moves/Asura_MoveData_Animation.h"
#include "Entity/PhysicalObject/Moves/Asura_MoveData_OrientationInterpolation.h"
#include "Entity/PhysicalObject/Moves/Asura_MoveData_PositionInterpolation.h"

#include "Entity/PhysicalObject/Actor/Vertebrates/FaceHugger/AVP_Messages_FaceHugger.h"
#include "Moves/AVP_Moves.h"

////////////////////////////////////////////////////////////////////////////////
// Forward declarations...
////////////////////////////////////////////////////////////////////////////////

class AVP_ClientActor_FaceHugger;


////////////////////////////////////////////////////////////////////////////////
// AVP_Move_FaceHugger_JumpSurface
////////////////////////////////////////////////////////////////////////////////

class AVP_Move_FaceHugger_JumpBase : public AVP_Move
{
public:
	AVP_Move_FaceHugger_JumpBase(Asura_Movement_System& xParentSystem, const Asura_Hash_ID uMoveHash);

protected:
	// Overridden functions...
	virtual bool		Start(const Asura_Msg_Move* pxStartMsg);
	virtual	bool		ShouldStart() const { return false; }

    Asura_MoveData_OrientationInterpolation	m_xOrientationInterpolationData;
    Asura_MoveData_PositionInterpolation	m_xPositionInterpolationData;

private:
	typedef AVP_Move PARENT;

    AVP_Move_FaceHugger_JumpBase(void);
	AVP_Move_FaceHugger_JumpBase(const AVP_Move_FaceHugger_JumpBase& xOther);
	AVP_Move_FaceHugger_JumpBase&	operator=(const AVP_Move_FaceHugger_JumpBase& xOther);
};

////////////////////////////////////////////////////////////////////////////////
// AVP_Move_FaceHugger_Jump
////////////////////////////////////////////////////////////////////////////////

class AVP_Move_FaceHugger_Jump : public AVP_Move_FaceHugger_JumpBase
{
public:
	AVP_Move_FaceHugger_Jump(Asura_Movement_System& xParentSystem);

	virtual const char*		GetName(void) const	{ return("AVP_Move_FaceHugger_Jump"); }
	static Asura_Hash_ID	GetStaticHash(void)	{ return(0x0b82612c); }	// Asura_GetHashID("AVP_Move_FaceHugger_Jump")); }

private:
	typedef AVP_Move_FaceHugger_JumpBase PARENT;

	AVP_Move_FaceHugger_Jump(void);
	AVP_Move_FaceHugger_Jump(const AVP_Move_FaceHugger_Jump& xOther);
	AVP_Move_FaceHugger_Jump&	operator=(const AVP_Move_FaceHugger_Jump& xOther);
};

////////////////////////////////////////////////////////////////////////////////
// AVP_Move_FaceHugger_Falling
////////////////////////////////////////////////////////////////////////////////

class AVP_Move_FaceHugger_Falling : public AVP_Move
{
public:
	AVP_Move_FaceHugger_Falling( Asura_Movement_System& xParentSystem );
	virtual const char*	 GetName() const { return "AVP_Move_FaceHugger_Falling"; }
	static Asura_Hash_ID GetStaticHash() { return 0x63a1d4c9; } //"AVP_Move_FaceHugger_Falling"

	virtual bool Start(const Asura_Msg_Move* pxStartMsg);

protected:

	virtual void UpdateStates(const float fTimeStep);
	virtual bool HasFinished() const;
	virtual bool CalculateVelocity(const float fTimeStep, Asura_AVector3_OutParam xVelocity) const;

private:
	Asura_MoveData_OrientationInterpolation	m_xOrientationInterpolationData;
	float m_fTimeSinceStart;
	bool m_bInAir;
	bool m_bFinished;
	Asura_AVector3 m_xAwayFromSurfaceStart;

	typedef AVP_Move PARENT;
};

#endif   // ifndef __AVP_FACEHUGGER_MOVESJUMP_H__
