#ifndef __CPATHFINDER_H__ #define __CPATHFINDER_H__ #include "global.h" #include #include class CGHeroInstance; struct CPathNode { bool accesible; //true if a hero can be on this node int dist; //distance from the first node of searching; -1 is infinity CPathNode * theNodeBefore; int3 coord; //coordiantes bool visited; }; struct CPath { std::vector nodes; //just get node by node int3 startPos(); // start point int3 endPos(); //destination point }; /** * main pathfinder class */ class CPathfinder { private: std::vector< std::vector > graph; void processNode(CPathNode & dp, const CGHeroInstance * hero, std::queue & mq, const CPathNode & cp, const int3 & src, bool diagonal); //helper function for getPath bool checkForVisitableDir(const int3 & src, const int3 & dst) const; public: CPath * getPath(int3 src, int3 dest, const CGHeroInstance * hero, unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero CPath * getPath(const int3 & src, const int3 & dest, const CGHeroInstance * hero, int (*getDist)(int3 & a, int3 & b), unsigned char type=0); //calculates path between src and dest; returns pointer to CPath or NULL if path does not exists; uses getDist to calculate distance; type - type of calculation: 0 - positions are normal positions of hero; 1 - given places are tiles blocked by hero static void convertPath(CPath * path, unsigned int mode); //mode=0 -> from 'manifest' to 'object' }; #endif // __CPATHFINDER_H__