#ifdef ASURA_USE_AXON
//////////////////////////////////////////////////////////////////////////////
//
// Axon_Gamescene_AStar.h
//
// Created by NJD - 24 October 2006
//
// Copyright (C) 2006 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 __AXON_GAMESCENE_ASTAR_H__
#define __AXON_GAMESCENE_ASTAR_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_HashedList.h"
#include "Core/Asura_LinkList.h"
#include "Core/Asura_Mempool.h"
#include "Network/Asura_Guid.h"

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

class Asura_ServerNode_GS2Node;
class Asura_ServerNode_GS2Spline;

//////////////////////////////////////////////////////////////////////////////
//
// Axon_Gamescene_AStar_System
// Very simple A* implementation for the gamescene to use.
//
//////////////////////////////////////////////////////////////////////////////

class Axon_Gamescene_AStar_System
{
public:
	static void GetRouteTo( const Asura_Guid uDestNodeGuid, const Asura_Guid uCurrNodeGuid, Asura_LinkList< Asura_Guid >& xRoute );

private:
	struct AStarNode
	{
		const Asura_ServerNode_GS2Node*   m_pxNode;
		float                             m_fCostToHere;
		float                             m_fCostToGoal;
		float                             m_fTotalCost;
		bool                              m_bOpen;
		bool                              m_bClosed;
		AStarNode*						  m_pxParent;
		const Asura_ServerNode_GS2Spline* m_pxLinkToHere;

		Asura_Guid GetGuid() const;
		bool IsDestroyed() const { return false; }
	};

	static AStarNode* GetAStarNode( const Asura_Guid uNodeGuid );
	static int CompareAStarNodes( AStarNode* const & pxAStarNodeOne, AStarNode* const & pxAStarNodeTwo );
	static void InsertNodeInOpenList( AStarNode* pxAStarNode );
	static AStarNode* GetOpenListHead();

	static float EstCostToGoal( const Asura_ServerNode_GS2Node* pxCurrNode, const Asura_ServerNode_GS2Node* pxDestNode );
	static float EstCostOfTraversal( const Asura_ServerNode_GS2Spline* pxLink );

private:
    static Asura_LinkList< AStarNode* > s_xOpenList;
	static Asura_Hashed_List< AStarNode > s_xAStarNodeList;
	static Asura_ResizingMempool s_xAStarNodeMempool;
};

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

#endif //__AXON_GAMESCENE_ASTAR_H__
#endif // ASURA_USE_AXON
