diff --git a/lib/battle/CBattleInfoCallback.cpp b/lib/battle/CBattleInfoCallback.cpp index ee9d3692f..1f2ca9f61 100644 --- a/lib/battle/CBattleInfoCallback.cpp +++ b/lib/battle/CBattleInfoCallback.cpp @@ -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 quicksands = getStoppers(params.perspective); + const std::set obstacles = getStoppers(params.perspective); std::queue 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 & 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 CBattleInfoCallback::getStoppers(BattlePerspective::BattlePerspective whichSidePerspective) const { std::set ret; diff --git a/lib/battle/CBattleInfoCallback.h b/lib/battle/CBattleInfoCallback.h index 47ddcc5ed..319b0186f 100644 --- a/lib/battle/CBattleInfoCallback.h +++ b/lib/battle/CBattleInfoCallback.h @@ -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 & obstacles, const ReachabilityInfo::Parameters & params) const; std::set getStoppers(BattlePerspective::BattlePerspective whichSidePerspective) const; //get hexes with stopping obstacles (quicksands) };