diff --git a/lib/battle/AccessibilityInfo.cpp b/lib/battle/AccessibilityInfo.cpp index 22fa5196e..e2f1eab15 100644 --- a/lib/battle/AccessibilityInfo.cpp +++ b/lib/battle/AccessibilityInfo.cpp @@ -22,9 +22,10 @@ bool AccessibilityInfo::tileAccessibleWithGate(BattleHex tile, BattleSide side) if(accessibility == EAccessibility::ALIVE_STACK) { - auto destructible = destructibleEnemyTurns.find(tile); + if(!destructibleEnemyTurns) + return false; - return destructible != destructibleEnemyTurns.end(); + return destructibleEnemyTurns->at(tile.hex) >= 0; } if(accessibility != EAccessibility::ACCESSIBLE) diff --git a/lib/battle/AccessibilityInfo.h b/lib/battle/AccessibilityInfo.h index 1352c4da2..a9fd9722d 100644 --- a/lib/battle/AccessibilityInfo.h +++ b/lib/battle/AccessibilityInfo.h @@ -27,7 +27,7 @@ enum class EAccessibility DESTRUCTIBLE_WALL, GATE, //sieges -> gate opens only for defender stacks UNAVAILABLE, //indestructible wall parts, special battlefields (like boat-to-boat) - SIDE_COLUMN //used for first and last columns of hexes that are unavailable but wat machines can stand there + SIDE_COLUMN //used for first and last columns of hexes that are unavailable but war machines can stand there }; @@ -35,7 +35,7 @@ using TAccessibilityArray = std::array destructibleEnemyTurns; + const std::array * destructibleEnemyTurns = nullptr; public: bool accessible(BattleHex tile, const battle::Unit * stack) const; //checks for both tiles if stack is double wide diff --git a/lib/battle/CBattleInfoCallback.cpp b/lib/battle/CBattleInfoCallback.cpp index ef567ccf4..d3e259c8f 100644 --- a/lib/battle/CBattleInfoCallback.cpp +++ b/lib/battle/CBattleInfoCallback.cpp @@ -1083,28 +1083,25 @@ ReachabilityInfo CBattleInfoCallback::makeBFS(const AccessibilityInfo &accessibi for(BattleHex neighbour : BattleHexArray::neighbouringTilesCache[curHex.hex]) { - if(neighbour.isValid()) + auto additionalCost = 0; + + if(params.bypassEnemyStacks) { - auto additionalCost = 0; + auto enemyToBypass = params.destructibleEnemyTurns.at(neighbour); - if(params.bypassEnemyStacks) + if(enemyToBypass >= 0) { - auto enemyToBypass = params.destructibleEnemyTurns.find(neighbour); - - if(enemyToBypass != params.destructibleEnemyTurns.end()) - { - additionalCost = enemyToBypass->second; - } + additionalCost = enemyToBypass; } + } - const int costFoundSoFar = ret.distances[neighbour.hex]; + const int costFoundSoFar = ret.distances[neighbour.hex]; - if(accessibleCache[neighbour.hex] && costToNeighbour + additionalCost < costFoundSoFar) - { - hexq.push(neighbour); - ret.distances[neighbour.hex] = costToNeighbour + additionalCost; - ret.predecessors[neighbour.hex] = curHex; - } + if(accessibleCache[neighbour.hex] && costToNeighbour + additionalCost < costFoundSoFar) + { + hexq.push(neighbour); + ret.distances[neighbour.hex] = costToNeighbour + additionalCost; + ret.predecessors[neighbour.hex] = curHex; } } } @@ -1280,7 +1277,7 @@ ReachabilityInfo CBattleInfoCallback::getReachability(const ReachabilityInfo::Pa { auto accessibility = getAccessibility(params.knownAccessible); - accessibility.destructibleEnemyTurns = params.destructibleEnemyTurns; + accessibility.destructibleEnemyTurns = & params.destructibleEnemyTurns; return makeBFS(accessibility, params); } diff --git a/lib/battle/ReachabilityInfo.cpp b/lib/battle/ReachabilityInfo.cpp index e00393d4a..c94d8b830 100644 --- a/lib/battle/ReachabilityInfo.cpp +++ b/lib/battle/ReachabilityInfo.cpp @@ -22,6 +22,7 @@ ReachabilityInfo::Parameters::Parameters(const battle::Unit * Stack, BattleHex S flying(Stack->hasBonusOfType(BonusType::FLYING)) { knownAccessible = battle::Unit::getHexes(startPosition, doubleWide, side); + destructibleEnemyTurns.fill(-1); } ReachabilityInfo::ReachabilityInfo() diff --git a/lib/battle/ReachabilityInfo.h b/lib/battle/ReachabilityInfo.h index ddd702d9f..af09b17e3 100644 --- a/lib/battle/ReachabilityInfo.h +++ b/lib/battle/ReachabilityInfo.h @@ -33,12 +33,15 @@ struct DLL_LINKAGE ReachabilityInfo bool ignoreKnownAccessible = false; //Ignore obstacles if it is in accessible hexes bool bypassEnemyStacks = false; // in case of true will count amount of turns needed to kill enemy and thus move forward BattleHexArray knownAccessible; //hexes that will be treated as accessible, even if they're occupied by stack (by default - tiles occupied by stack we do reachability for, so it doesn't block itself) - std::map destructibleEnemyTurns; // hom many turns it is needed to kill enemy on specific hex + std::array destructibleEnemyTurns; // how many turns it is needed to kill enemy on specific hex (index <=> hex) BattleHex startPosition; //assumed position of stack BattleSide perspective = BattleSide::ALL_KNOWING; //some obstacles (eg. quicksands) may be invisible for some side - Parameters() = default; + Parameters() + { + destructibleEnemyTurns.fill(-1); + } Parameters(const battle::Unit * Stack, BattleHex StartPosition); };