Jelajahi Sumber

NKAI: fix dead end cancellation

Andrii Danylchenko 1 tahun lalu
induk
melakukan
9728413742

+ 1 - 1
AI/Nullkiller/Goals/ExploreNeighbourTile.cpp

@@ -26,7 +26,7 @@ bool ExploreNeighbourTile::operator==(const ExploreNeighbourTile & other) const
 
 void ExploreNeighbourTile::accept(AIGateway * ai)
 {
-	ExplorationHelper h(hero, ai->nullkiller.get());
+	ExplorationHelper h(hero, ai->nullkiller.get(), true);
 
 	for(int i = 0; i < tilesToExplore && hero->movementPointsRemaining() > 0; i++)
 	{

+ 5 - 3
AI/Nullkiller/Helpers/ExplorationHelper.cpp

@@ -24,8 +24,8 @@ namespace NKAI
 
 using namespace Goals;
 
-ExplorationHelper::ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai)
-	:ai(ai), cbp(ai->cb.get()), hero(hero)
+ExplorationHelper::ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai, bool useCPathfinderAccessibility)
+	:ai(ai), cbp(ai->cb.get()), hero(hero), useCPathfinderAccessibility(useCPathfinderAccessibility)
 {
 	ts = cbp->getPlayerTeam(ai->playerID);
 	sightRadius = hero->getSightRadius();
@@ -222,7 +222,9 @@ bool ExplorationHelper::hasReachableNeighbor(const int3 & pos) const
 		int3 tile = pos + dir;
 		if(cbp->isInTheMap(tile))
 		{
-			auto isAccessible = ai->pathfinder->isTileAccessible(hero, tile);
+			auto isAccessible = useCPathfinderAccessibility
+				? ai->cb->getPathsInfo(hero)->getPathInfo(tile)->reachable()
+				: ai->pathfinder->isTileAccessible(hero, tile);
 
 			if(isAccessible)
 				return true;

+ 2 - 1
AI/Nullkiller/Helpers/ExplorationHelper.h

@@ -34,9 +34,10 @@ private:
 	const TeamState * ts;
 	int3 ourPos;
 	bool allowDeadEndCancellation;
+	bool useCPathfinderAccessibility;
 
 public:
-	ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai);
+	ExplorationHelper(const CGHeroInstance * hero, const Nullkiller * ai, bool useCPathfinderAccessibility = false);
 	Goals::TSubgoal makeComposition() const;
 	bool scanSector(int scanRadius);
 	bool scanMap();