|
@@ -18,7 +18,6 @@
|
|
|
#include "../../lib/mapObjects/CBank.h"
|
|
|
#include "../../lib/mapObjects/CGTownInstance.h"
|
|
|
#include "../../lib/mapObjects/CQuest.h"
|
|
|
-#include "../../lib/CPathfinder.h"
|
|
|
#include "../../lib/mapping/CMapDefines.h"
|
|
|
|
|
|
extern boost::thread_specific_ptr<CCallback> cb;
|
|
@@ -431,51 +430,37 @@ bool isBlockVisitObj(const int3 & pos)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
-int howManyTilesWillBeDiscovered(const int3 & pos, int radious, CCallback * cbp)
|
|
|
+bool hasReachableNeighbor(const int3 &pos, HeroPtr hero, CCallback * cbp)
|
|
|
{
|
|
|
- //TODO: do not explore dead-end boundaries
|
|
|
- int ret = 0;
|
|
|
- for(int x = pos.x - radious; x <= pos.x + radious; x++)
|
|
|
+ for(crint3 dir : int3::getDirs())
|
|
|
{
|
|
|
- for(int y = pos.y - radious; y <= pos.y + radious; y++)
|
|
|
+ int3 tile = pos + dir;
|
|
|
+ if(cbp->isInTheMap(tile) && cbp->getPathsInfo(hero.get())->getPathInfo(tile)->reachable())
|
|
|
{
|
|
|
- int3 npos = int3(x, y, pos.z);
|
|
|
- if(cbp->isInTheMap(npos) && pos.dist2d(npos) - 0.5 < radious && !cbp->isVisible(npos))
|
|
|
- {
|
|
|
- if(!boundaryBetweenTwoPoints(pos, npos, cbp))
|
|
|
- ret++;
|
|
|
- }
|
|
|
+ return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return ret;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
-bool boundaryBetweenTwoPoints(int3 pos1, int3 pos2, CCallback * cbp) //determines if two points are separated by known barrier
|
|
|
+int howManyTilesWillBeDiscovered(const int3 & pos, int radious, CCallback * cbp, HeroPtr hero)
|
|
|
{
|
|
|
- int xMin = std::min(pos1.x, pos2.x);
|
|
|
- int xMax = std::max(pos1.x, pos2.x);
|
|
|
- int yMin = std::min(pos1.y, pos2.y);
|
|
|
- int yMax = std::max(pos1.y, pos2.y);
|
|
|
-
|
|
|
- for(int x = xMin; x <= xMax; ++x)
|
|
|
+ int ret = 0;
|
|
|
+ for(int x = pos.x - radious; x <= pos.x + radious; x++)
|
|
|
{
|
|
|
- for(int y = yMin; y <= yMax; ++y)
|
|
|
+ for(int y = pos.y - radious; y <= pos.y + radious; y++)
|
|
|
{
|
|
|
- int3 tile = int3(x, y, pos1.z); //use only on same level, ofc
|
|
|
- if(std::abs(pos1.dist2d(tile) - pos2.dist2d(tile)) < 1.5)
|
|
|
+ int3 npos = int3(x, y, pos.z);
|
|
|
+ if(cbp->isInTheMap(npos) && pos.dist2d(npos) - 0.5 < radious && !cbp->isVisible(npos))
|
|
|
{
|
|
|
- if(!(cbp->isVisible(tile) && cbp->getTile(tile)->blocked)) //if there's invisible or unblocked tile between, it's good
|
|
|
- return false;
|
|
|
+ if(hasReachableNeighbor(npos, hero, cbp))
|
|
|
+ ret++;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- return true; //if all are visible and blocked, we're at dead end
|
|
|
-}
|
|
|
|
|
|
-int howManyTilesWillBeDiscovered(int radious, int3 pos, crint3 dir)
|
|
|
-{
|
|
|
- return howManyTilesWillBeDiscovered(pos + dir, radious, cb.get());
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
void getVisibleNeighbours(const std::vector<int3> & tiles, std::vector<int3> & out)
|