//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Base class for many flying NPCs
//
// $NoKeywords: $
//=============================================================================//

#include "cbase.h"
#include "ai_basenpc_flyer_new.h"
#include "ai_route.h"
#include "ai_navigator.h"

// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"

#define FLYER_ROUTE_REBUILD_TIME	3.0		// Time between route rebuilds


// NOTE: Never instantiate ai_base_npc_flyer_new directly!!
//IMPLEMENT_CUSTOM_AI( ai_base_npc_flyer_new, CAI_BaseNPCFlyerNew);


//------------------------------------------------------------------------------
// Purpose :
// Input   :
// Output  :
//------------------------------------------------------------------------------
CAI_BaseNPCFlyerNew::CAI_BaseNPCFlyerNew()
{
}


//------------------------------------------------------------------------------
// Used to set up a flyer
//------------------------------------------------------------------------------
void CAI_BaseNPCFlyerNew::SpawnFlyer()
{
	SetNavType( NAV_FLY );
	AddFlag(  FL_FLY );
	SetMoveType( MOVETYPE_STEP );			
	CapabilitiesAdd( bits_CAP_MOVE_FLY );
}


/*
void CAI_BaseNPCFlyerNew::InitCustomSchedules(void) 
{
	INIT_CUSTOM_AI(CAI_BaseNPCFlyerNew);

	ADD_CUSTOM_CONDITION(CAI_BaseNPCFlyerNew,	COND_FLYER_MOVE_BLOCKED);
	ADD_CUSTOM_CONDITION(CAI_BaseNPCFlyerNew,	COND_FLYER_MOVE_IMPOSSIBLE);
}
*/

//------------------------------------------------------------------------------
// Should be called during Select Schedule (BLEAH!) 
//------------------------------------------------------------------------------
void CAI_BaseNPCFlyerNew::ClearFlyerConditions(void)
{
//	ClearCondition( COND_FLYER_MOVE_BLOCKED );
//	ClearCondition( COND_FLYER_MOVE_IMPOSSIBLE );
}



//------------------------------------------------------------------------------
// Purpose :
// Input   :
// Output  :
//------------------------------------------------------------------------------
float CAI_BaseNPCFlyerNew::MinGroundDist(void)
{
	return 0;
}


//-----------------------------------------------------------------------------
// Sets the ground speed appropriately: 
//-----------------------------------------------------------------------------
float CAI_BaseNPCFlyerNew::GetIdealSpeed( )	const
{
	return m_flSpeed;
}


//------------------------------------------------------------------------------
// Purpose :
// Input   :
// Output  :
//------------------------------------------------------------------------------
void CAI_BaseNPCFlyerNew::StartTask( const Task_t *pTask )
{
	switch (pTask->iTask)
	{	
		// Activity is just idle (have no run)
		case TASK_RUN_PATH:
		{
			GetNavigator()->SetMovementActivity(ACT_IDLE);
			TaskComplete();
			break;
		}

		// Don't check for run/walk activity
		case TASK_SCRIPT_RUN_TO_TARGET:
		case TASK_SCRIPT_WALK_TO_TARGET:
		{
			if (GetTarget() == NULL)
			{
				TaskFail(FAIL_NO_TARGET);
			}
			else 
			{
				if (!GetNavigator()->SetGoal( GOALTYPE_TARGETENT ) )
				{
					TaskFail(FAIL_NO_ROUTE);
					GetNavigator()->ClearGoal();
				}
			}
			TaskComplete();
			break;
		}

		default:
		{
			BaseClass::StartTask(pTask);
		}
		break;
	}
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CAI_BaseNPCFlyerNew::RunTask( const Task_t *pTask )
{
	BaseClass::RunTask(pTask);
}