/** @file /ai/PathFind/pathfind.h @brief Header s deklaraci CPathFind pro specificke vyhledavani cesty. Header obsahujici deklarace metod tridy CPathFind pro realizaci specifickeho vyhledavani cesty modulu vyhledavani cesty. @author PZ @version 0.1 */ #ifndef __PETR_ZITA_PATHFINDING_IMPLEMENTATION__ #define __PETR_ZITA_PATHFINDING_IMPLEMENTATION__ #pragma warning( disable : 4290 ) #include "common/Interface.h" #include "common/mm.h" #include "common/exc.h" #include "common/types.h" #include "common/Msg.h" #include "common/utils.h" #include "world/world_messages.h" #include "world/plan/plan.h" #include "ai/PathFind/pathenv.h" #include "ai/PathFind/pathfindtransciever.h" namespace ai_ns { /** Prostor jmen obalujici modul Vyhledavani cesty. */ namespace pathfind_ns { /** Trida CPathFindEngine je odvozena od ciste virtualni tridy CPathFindingSkelet, ktera obsahuje univerzalni kostru A* algoritmu a od tridy CPathFindTransciever (potomek CPathFindingSkelet), ktera obsahuje vse potrebne pro komunikaci s vnejsim svetem. Do teto tridy je treba dopsat metody pro praci s konkretnimi datovymi strukturami v "pathfind.cpp" a upravit makra v hlavickovem souboru "pathenv.h". */ class CPathFindEngine : public CPathFindTransciever { public: /** Konstruktor. */ CPathFindEngine(); /** Destruktor. */ ~CPathFindEngine(); /** Metoda pro zjisteni sirky mapy na ktere je realizovano vyhledavani. */ int getMapWidth(); /** Metoda pro zjisteni vysky mapy na ktere je realizovano vyhledavani. */ int getMapHeight(); /** Metoda pro nastaveni sirky mapy na ktere je realizovano vyhledavani. */ void setMapWidth(int value); /** Metoda pro nastaveni vysky mapy na ktere je realizovano vyhledavani. */ void setMapHeight(int value); private: /** Priznak razeni hexu, aby vyhledana cesta sla po hexech "primo". */ bool hex_order; /** Nastavena sirka mapy. */ int _mapWidth; /** Nastavena vyska mapy. */ int _mapHeight; /** Metoda zjistujici validitu souradnic na mape. */ bool validSou(COORDS & s); /** Metoda zjistujici cenu prechodu z jednoho hexu na druhy pro danou jednotku. Pro samotny vypocet se vola modul World. @param unit_id ID jednotky, se kterou chci pohyb udelat @param done_cost cena cesty, kterou jiz jednotka usla @param startsou souradnice startovniho hexu @param targetsou souradnice ciloveho hexu @throw E_8K_AI_Pathfind_WrongMessageResponse @return int (cena prechodu) */ int getCost(int unit_id,int done_cost,COORDS & startsou,COORDS & targetsou) throw(E_8K_AI_Pathfind_WrongMessageResponse); /** Metoda vracejici seznam sousednich uzlu pro urcity typ mapy (zde nastaveno na hexovou). */ TNEIGHBOURS chooseNeighbours(COORDS & sour); /** Metoda vracejici seznam sousednich uzlu na mrizkovite mape. */ TNEIGHBOURS chooseNeighboursGrid(COORDS &sour); /** Metoda vracejici seznam sousednich uzlu na hexove mape. */ TNEIGHBOURS chooseNeighboursHex(COORDS & sour,bool & hexorder); /** Metoda vracejici heuristicky odhad cesty pro urcity typ mapy (zde nastaveno na hexovou). */ int heuristicFunction(COORDS & start,COORDS & target); /** Metoda vracejici heuristicky odhad cesty pro mrizkovitou mapu (konkretne Manhattan Distance). */ int manhattanDistance(COORDS & start,COORDS & target); /** Metoda vracejici heuristicky odhad cesty pro hexovou mapu. */ int hexDistance(COORDS & start,COORDS & target); /** Metoda pripravujici modul Pathfind pro vyhledavani a floodfill na urcitem typu mapy. @throw E_8K_AI_Pathfind_WrongMessageResponse */ void initMapInfo() throw (E_8K_AI_Pathfind_WrongMessageResponse); }; } // end of namespace "pathfind_ns" } // end of namespace "ai_ns" #endif