AIPathfinder.h 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * AIPathfinder.h, part of VCMI engine
  3. *
  4. * Authors: listed in file AUTHORS in main folder
  5. *
  6. * License: GNU General Public License v2.0 or later
  7. * Full text of license available in license.txt file, in main folder
  8. *
  9. */
  10. #pragma once
  11. #include "AINodeStorage.h"
  12. #include "ObjectGraph.h"
  13. #include "GraphPaths.h"
  14. #include "../AIUtility.h"
  15. namespace NK2AI
  16. {
  17. class Nullkiller;
  18. struct PathfinderSettings
  19. {
  20. static constexpr uint8_t MaxTurnDistanceLimit = 255;
  21. bool useHeroChain;
  22. uint8_t scoutTurnDistanceLimit;
  23. uint8_t mainTurnDistanceLimit;
  24. bool allowBypassObjects;
  25. PathfinderSettings()
  26. :useHeroChain(false),
  27. scoutTurnDistanceLimit(MaxTurnDistanceLimit),
  28. mainTurnDistanceLimit(MaxTurnDistanceLimit),
  29. allowBypassObjects(true)
  30. { }
  31. };
  32. class AIPathfinder
  33. {
  34. private:
  35. std::shared_ptr<AINodeStorage> storage;
  36. Nullkiller * aiNk;
  37. static std::map<ObjectInstanceID, std::unique_ptr<GraphPaths>> heroGraphs;
  38. public:
  39. explicit AIPathfinder(Nullkiller * aiNk);
  40. void calculatePathInfo(std::vector<AIPath> & paths, const int3 & tile, bool includeGraph = false) const;
  41. bool isTileAccessible(const HeroPtr & hero, const int3 & tile) const;
  42. void updatePaths(const std::map<const CGHeroInstance *, HeroRole> & heroes, PathfinderSettings pathfinderSettings);
  43. void updateGraphs(const std::map<const CGHeroInstance *, HeroRole> & heroes, uint8_t mainScanDepth, uint8_t scoutScanDepth);
  44. void calculateQuickPathsWithBlocker(std::vector<AIPath> & result, const std::vector<const CGHeroInstance *> & heroes, const int3 & tile);
  45. std::shared_ptr<AINodeStorage>getStorage()
  46. {
  47. return storage;
  48. }
  49. std::vector<AIPath> getPathInfo(const int3 & tile, bool includeGraph = false)
  50. {
  51. std::vector<AIPath> result;
  52. calculatePathInfo(result, tile, includeGraph);
  53. return result;
  54. }
  55. };
  56. }