//////////////////////////////////////////////////////////////////////////////
//
// AVP_Behaviour_Dropship_Movement.h
//
// Copyright (C) 2007 Rebellion. All Rights Reserved.
//
//////////////////////////////////////////////////////////////////////////////

// B E G I N   F I L E   W R A P P E R ///////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
#pragma once
#endif

#ifndef __AVP_BEHAVIOUR_DROPSHIP_MOVEMENT_H__
#define __AVP_BEHAVIOUR_DROPSHIP_MOVEMENT_H__ 1

// E N D   F I L E   W R A P P E R ///////////////////////////////////////////

// I N C L U D E S ///////////////////////////////////////////////////////////

// asura
#include "Core/Asura_LinkList.h"

// avp axon
#include "Behaviour/Axon_Project_Behaviour.h"

// F O R W A R D   D E C L A R A T I O N S ///////////////////////////////////

class AVP_Brain_Actor_Dropship;
class AVP_ServerNode_VantagePoint_Dropship;

//////////////////////////////////////////////////////////////////////////////
//
// AVP_Behaviour_Dropship_Movement
//
//////////////////////////////////////////////////////////////////////////////

class AVP_Behaviour_Dropship_Movement : public Axon_Project_Behaviour
{
    typedef Axon_Project_Behaviour PARENT;

public:
    AVP_Behaviour_Dropship_Movement( AVP_Brain_Actor_Dropship* pxBrain );

	void FollowPath();
	void Hover();
	bool IsHovering() const;
	void AimAtTargetMode(bool bAimAtTarget);

protected:
    virtual void Deactivate();
    virtual void PerFrameUpdate( const float fTimeslice );

#ifndef ASURA_NO_DEBUG_OUTPUT
    virtual void RenderDebugInfo();
#endif

    AVP_Brain_Actor_Dropship* GetDropshipBrain() const;

private:

	Asura_Guid GetTarget() const;
	
    enum State
    {
        UNSET,
		FOLLOW_PATH,
		STOP_TO_HOVER,
		HOVER,
		FINISHED,
        NUM_STATES
    };

    void SwitchToState( const State eNextState );

private:

	void UpdatePath(float fTimeslice);
	bool Stop();
	void StayAtPoint();

	void UpdateAim();
	void SetDestination(const Asura_Vector_3& xDestination);

	void ExpandPath();

    State m_eCurrentState;
    float m_fTimeInState;

	float m_fTotalPathDistance;
	Asura_LinkList<Asura_Vector_3> m_xPathSegments;

	Asura_LinkList_It<Asura_Vector_3> m_xDestinationSegmentIt;
	Asura_Vector_3 m_xDestinationOnPath;

	Asura_Vector_3 m_xDestination;
	bool m_bAimAtTarget;

};

//////////////////////////////////////////////////////////////////////////////
//
// 
//
//////////////////////////////////////////////////////////////////////////////

#endif //__AVP_BEHAVIOUR_DROPSHIP_MOVEMENT_H__
