/* * AIPathfinder.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "AINodeStorage.h" #include "ObjectGraph.h" #include "GraphPaths.h" #include "../AIUtility.h" namespace NK2AI { class Nullkiller; struct PathfinderSettings { static constexpr uint8_t MaxTurnDistanceLimit = 255; bool useHeroChain; uint8_t scoutTurnDistanceLimit; uint8_t mainTurnDistanceLimit; bool allowBypassObjects; PathfinderSettings() :useHeroChain(false), scoutTurnDistanceLimit(MaxTurnDistanceLimit), mainTurnDistanceLimit(MaxTurnDistanceLimit), allowBypassObjects(true) { } }; class AIPathfinder { private: std::shared_ptr storage; Nullkiller * aiNk; static std::map> heroGraphs; public: explicit AIPathfinder(Nullkiller * aiNk); void calculatePathInfo(std::vector & paths, const int3 & tile, bool includeGraph = false) const; bool isTileAccessible(const HeroPtr & hero, const int3 & tile) const; void updatePaths(const std::map & heroes, PathfinderSettings pathfinderSettings); void updateGraphs(const std::map & heroes, uint8_t mainScanDepth, uint8_t scoutScanDepth); void calculateQuickPathsWithBlocker(std::vector & result, const std::vector & heroes, const int3 & tile); std::shared_ptrgetStorage() { return storage; } std::vector getPathInfo(const int3 & tile, bool includeGraph = false) { std::vector result; calculatePathInfo(result, tile, includeGraph); return result; } }; }