mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-12 02:28:11 +02:00
Merge pull request #664 from nullkiller/fix-broken-fort-gate-bypass
Try fix bypassing destroyed fort drawbridge
This commit is contained in:
commit
58b8fe3d26
@ -1161,7 +1161,7 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
|
||||
if(!params.startPosition.isValid()) //if got call for arrow turrets
|
||||
return ret;
|
||||
|
||||
const std::set<BattleHex> quicksands = getStoppers(params.perspective);
|
||||
const std::set<BattleHex> obstacles = getStoppers(params.perspective);
|
||||
|
||||
std::queue<BattleHex> hexq; //bfs queue
|
||||
|
||||
@ -1177,10 +1177,9 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
|
||||
{
|
||||
const BattleHex curHex = hexq.front();
|
||||
hexq.pop();
|
||||
|
||||
//walking stack can't step past the quicksands
|
||||
//TODO what if second hex of two-hex creature enters quicksand
|
||||
if(curHex != params.startPosition && vstd::contains(quicksands, curHex))
|
||||
|
||||
//walking stack can't step past the obstacles
|
||||
if(curHex != params.startPosition && isInObstacle(curHex, obstacles, params))
|
||||
continue;
|
||||
|
||||
const int costToNeighbour = ret.distances[curHex.hex] + 1;
|
||||
@ -1203,6 +1202,31 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
bool CBattleInfoCallback::isInObstacle(
|
||||
BattleHex hex,
|
||||
const std::set<BattleHex> & obstacles,
|
||||
const ReachabilityInfo::Parameters & params) const
|
||||
{
|
||||
auto occupiedHexes = battle::Unit::getHexes(hex, params.doubleWide, params.side);
|
||||
|
||||
for(auto occupiedHex : occupiedHexes)
|
||||
{
|
||||
if(vstd::contains(obstacles, occupiedHex))
|
||||
{
|
||||
if(occupiedHex == ESiegeHex::GATE_BRIDGE)
|
||||
{
|
||||
if(battleGetGateState() != EGateState::DESTROYED && params.side == BattleSide::ATTACKER)
|
||||
return true;
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
std::set<BattleHex> CBattleInfoCallback::getStoppers(BattlePerspective::BattlePerspective whichSidePerspective) const
|
||||
{
|
||||
std::set<BattleHex> ret;
|
||||
|
@ -142,5 +142,6 @@ public:
|
||||
protected:
|
||||
ReachabilityInfo getFlyingReachability(const ReachabilityInfo::Parameters & params) const;
|
||||
ReachabilityInfo makeBFS(const AccessibilityInfo & accessibility, const ReachabilityInfo::Parameters & params) const;
|
||||
bool isInObstacle(BattleHex hex, const std::set<BattleHex> & obstacles, const ReachabilityInfo::Parameters & params) const;
|
||||
std::set<BattleHex> getStoppers(BattlePerspective::BattlePerspective whichSidePerspective) const; //get hexes with stopping obstacles (quicksands)
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user