void RodinBTNodeEldTurnToward::OnFinish()
{
	WBCompEldAIMotion* pAIMotion = GET_WBCOMP( GetEntity(), EldAIMotion );
	ASSERT( pAIMotion );

	if( m_TurnState == ETTS_StartedTurn )
	{
		pAIMotion->StopMove();
	}
}
void RodinBTNodeEldMoveTo::OnFinish()
{
	WBCompEldAIMotion* pAIMotion = GET_WBCOMP( GetEntity(), EldAIMotion );
	ASSERT( pAIMotion );

	if( m_MoveState == EMTS_StartedMove )
	{
		pAIMotion->StopMove();
	}
}
RodinBTNode::ETickStatus RodinBTNodeEldTurnToward::Tick( float DeltaTime )
{
	Unused( DeltaTime );

	WBEntity* const		pEntity		= GetEntity();
	WBCompEldAIMotion*	pAIMotion	= GET_WBCOMP( pEntity, EldAIMotion );
	ASSERT( pAIMotion );

	if( m_TurnState == ETTS_Begin )
	{
		WBCompRodinBlackboard* const	pAIBlackboard	= GET_WBCOMP( pEntity, RodinBlackboard );
		ASSERT( pAIBlackboard );

		const WBEvent::EType			TargetType		= pAIBlackboard->GetType( m_TurnTargetBlackboardKey );

		if( TargetType == WBEvent::EWBEPT_Vector )
		{
			const Vector TurnTarget = pAIBlackboard->GetVector( m_TurnTargetBlackboardKey );

			pAIMotion->StartTurn( TurnTarget );
			m_TurnState = ETTS_StartedTurn;

			return ETS_Running;
		}
		else if( TargetType == WBEvent::EWBEPT_Entity )
		{
			WBEntity* const pTurnTargetEntity = pAIBlackboard->GetEntity( m_TurnTargetBlackboardKey );
			if( !pTurnTargetEntity )
			{
				return ETS_Fail;
			}

			WBCompEldTransform* const pTransform = pTurnTargetEntity->GetTransformComponent<WBCompEldTransform>();
			if( !pTransform )
			{
				return ETS_Fail;
			}

			const Vector TurnTarget = pTransform->GetLocation();

			pAIMotion->StartTurn( TurnTarget );
			m_TurnState = ETTS_StartedTurn;

			return ETS_Running;
		}
	}
	else
	{
		ASSERT( m_TurnState == ETTS_StartedTurn );

		if( pAIMotion->IsMoving() )
		{
			return ETS_Running;
		}
		else if( pAIMotion->DidMoveSucceed() )
		{
			return ETS_Success;
		}
	}

	return ETS_Fail;
}
RodinBTNode::ETickStatus RodinBTNodeEldMoveTo::Tick( float DeltaTime )
{
	Unused( DeltaTime );

	WBEntity* const		pEntity		= GetEntity();
	WBCompEldAIMotion*	pAIMotion	= GET_WBCOMP( pEntity, EldAIMotion );
	ASSERT( pAIMotion );

	if( m_MoveState == EMTS_Begin )
	{
		if( m_Wander )
		{
			pAIMotion->SetReachedThreshold( m_ReachedThresholdMin, m_ReachedThresholdMax );
			pAIMotion->StartWander( m_WanderTargetDistance );
			m_MoveState = EMTS_StartedMove;

			return ETS_Running;
		}
		else
		{
			WBCompRodinBlackboard* const	pAIBlackboard	= GET_WBCOMP( pEntity, RodinBlackboard );
			ASSERT( pAIBlackboard );

			const WBEvent::EType			TargetType		= pAIBlackboard->GetType( m_MoveTargetBlackboardKey );

			if( TargetType == WBEvent::EWBEPT_Vector )
			{
				const Vector MoveTarget = pAIBlackboard->GetVector( m_MoveTargetBlackboardKey );

				pAIMotion->SetReachedThreshold( m_ReachedThresholdMin, m_ReachedThresholdMax );
				pAIMotion->SetDeflectionRadius( m_FlyingDeflectionRadius );
				pAIMotion->StartMove( MoveTarget );
				m_MoveState = EMTS_StartedMove;

				return ETS_Running;
			}
			else if( TargetType == WBEvent::EWBEPT_Entity )
			{
				WBEntity* const pMoveTargetEntity = pAIBlackboard->GetEntity( m_MoveTargetBlackboardKey );
				if( !pMoveTargetEntity )
				{
					return ETS_Fail;
				}

//#if BUILD_DEV
//				PRINTF( "RodinBTNodeEldMoveTo: %s: %s moving to entity %s\n",
//					GetName().CStr(),
//					pEntity->GetUniqueName().CStr(),
//					pMoveTargetEntity->GetUniqueName().CStr() );
//#endif

				pAIMotion->SetReachedThreshold( m_ReachedThresholdMin, m_ReachedThresholdMax );
				pAIMotion->SetDeflectionRadius( m_FlyingDeflectionRadius );
				pAIMotion->StartFollow( pMoveTargetEntity );
				m_MoveState = EMTS_StartedMove;

				return ETS_Running;
			}
		}
	}
	else
	{
		ASSERT( m_MoveState == EMTS_StartedMove );

		if( pAIMotion->IsMoving() )
		{
			return ETS_Running;
		}
		else if( pAIMotion->DidMoveSucceed() )
		{
			return ETS_Success;
		}
	}

	return ETS_Fail;
}