diff --git a/client/battle/BattleFieldController.cpp b/client/battle/BattleFieldController.cpp index 8e81f45af..3695ba411 100644 --- a/client/battle/BattleFieldController.cpp +++ b/client/battle/BattleFieldController.cpp @@ -502,50 +502,18 @@ std::vector BattleFieldController::getSootingRangeHexes() return sootingRangeHexes; } -std::vector BattleFieldController::getRangedFullDamageLimitHexes(std::vector rangedFullDamageHexes) +std::vector BattleFieldController::getRangeLimitHexes(BattleHex hoveredHex, std::vector rangeHexes, uint8_t distanceToLimit) { - std::vector rangedFullDamageLimitHexes; // used for return + std::vector limitHexes; // used for return - // if not a hovered arcer unit -> return - auto hoveredHex = getHoveredHex(); - const CStack * hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true); - - if(!(hoveredStack && hoveredStack->isShooter())) - return rangedFullDamageLimitHexes; - - auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance(); - - // from ranged full damage hexes get only the ones at the limit - for(auto & hex : rangedFullDamageHexes) + // from range hexes get only the ones at the limit + for(auto & hex : rangeHexes) { - if(BattleHex::getDistance(hoveredHex, hex) == rangedFullDamageDistance) - rangedFullDamageLimitHexes.push_back(hex); + if(BattleHex::getDistance(hoveredHex, hex) == distanceToLimit) + limitHexes.push_back(hex); } - return rangedFullDamageLimitHexes; -} - -std::vector BattleFieldController::getShootingRangeLimitHexes(std::vector shootingRangeHexes) -{ - std::vector shootingRangeLimitHexes; // used for return - - // if not a hovered arcer unit -> return - auto hoveredHex = getHoveredHex(); - const CStack * hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true); - - if(!(hoveredStack && hoveredStack->isShooter())) - return shootingRangeLimitHexes; - - auto shootingRangeDistance = hoveredStack->getSootingRangeDistance(); - - // from ranged full damage hexes get only the ones at the limit - for(auto & hex : shootingRangeHexes) - { - if(BattleHex::getDistance(hoveredHex, hex) == shootingRangeDistance) - shootingRangeLimitHexes.push_back(hex); - } - - return shootingRangeLimitHexes; + return limitHexes; } std::vector> BattleFieldController::getOutsideNeighbourDirectionsForLimitHexes(std::vector wholeRangeHexes, std::vector rangeLimitHexes) @@ -629,20 +597,35 @@ void BattleFieldController::showHighlightedHexes(Canvas & canvas) std::set hoveredSpellHexes = getHighlightedHexesForSpellRange(); std::set hoveredMoveHexes = getHighlightedHexesForMovementTarget(); - if(getHoveredHex() == BattleHex::INVALID) + BattleHex hoveredHex = getHoveredHex(); + if(hoveredHex == BattleHex::INVALID) return; - // calculate array with highlight images for ranged full damage limit - std::vector rangedFullDamageHexes = getRangedFullDamageHexes(); - std::vector rangedFullDamageLimitHexes = getRangedFullDamageLimitHexes(rangedFullDamageHexes); - std::vector> rangedFullDamageLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(rangedFullDamageHexes, rangedFullDamageLimitHexes); - std::vector> rangedFullDamageLimitHexesHighligts = calculateRangeHighlightImages(rangedFullDamageLimitHexesNeighbourDirections, rangedFullDamageLimitImages); - - // calculate array with highlight images for shooting range limit - std::vector shootingRangeHexes = getSootingRangeHexes(); - std::vector shootingRangeLimitHexes = getShootingRangeLimitHexes(shootingRangeHexes); - std::vector> shootingRangeLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(shootingRangeHexes, shootingRangeLimitHexes); - std::vector> shootingRangeLimitHexesHighligts = calculateRangeHighlightImages(shootingRangeLimitHexesNeighbourDirections, shootingRangeLimitImages); + const CStack * hoveredStack = getHoveredStack(); + + std::vector rangedFullDamageLimitHexes; + std::vector shootingRangeLimitHexes; + + std::vector> rangedFullDamageLimitHexesHighligts; + std::vector> shootingRangeLimitHexesHighligts; + + // skip range limit calculations if unit hovered is not a shooter + if(hoveredStack && hoveredStack->isShooter()) + { + // calculate array with highlight images for ranged full damage limit + std::vector rangedFullDamageHexes = getRangedFullDamageHexes(); + auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance(); + rangedFullDamageLimitHexes = getRangeLimitHexes(hoveredHex, rangedFullDamageHexes, rangedFullDamageDistance); + std::vector> rangedFullDamageLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(rangedFullDamageHexes, rangedFullDamageLimitHexes); + rangedFullDamageLimitHexesHighligts = calculateRangeHighlightImages(rangedFullDamageLimitHexesNeighbourDirections, rangedFullDamageLimitImages); + + // calculate array with highlight images for shooting range limit + std::vector shootingRangeHexes = getSootingRangeHexes(); + auto shootingRangeDistance = hoveredStack->getSootingRangeDistance(); + shootingRangeLimitHexes = getRangeLimitHexes(hoveredHex, shootingRangeHexes, shootingRangeDistance); + std::vector> shootingRangeLimitHexesNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(shootingRangeHexes, shootingRangeLimitHexes); + shootingRangeLimitHexesHighligts = calculateRangeHighlightImages(shootingRangeLimitHexesNeighbourDirections, shootingRangeLimitImages); + } auto const & hoveredMouseHexes = owner.actionsController->currentActionSpellcasting(getHoveredHex()) ? hoveredSpellHexes : hoveredMoveHexes; @@ -719,6 +702,14 @@ BattleHex BattleFieldController::getHoveredHex() return hoveredHex; } +const CStack* BattleFieldController::getHoveredStack() +{ + auto hoveredHex = getHoveredHex(); + const CStack* hoveredStack = owner.curInt->cb->battleGetStackByPos(hoveredHex, true); + + return hoveredStack; +} + BattleHex BattleFieldController::getHexAtPosition(Point hoverPos) { if (owner.attackingHero) diff --git a/client/battle/BattleFieldController.h b/client/battle/BattleFieldController.h index cbe4f8db9..acbe324fc 100644 --- a/client/battle/BattleFieldController.h +++ b/client/battle/BattleFieldController.h @@ -65,10 +65,8 @@ class BattleFieldController : public CIntObject std::vector getSootingRangeHexes(); - /// get only hexes at the limit of a ranged unit's full damage range - std::vector getRangedFullDamageLimitHexes(std::vector rangedFullDamageHexes); - - std::vector getShootingRangeLimitHexes(std::vector shootingRangeHexes); + /// get only hexes at the limit of a range + std::vector getRangeLimitHexes(BattleHex hoveredHex, std::vector hexRange, uint8_t distanceToLimit); /// get an array that has for each hex in range, an aray with all directions where an ouside neighbour hex exists std::vector> getOutsideNeighbourDirectionsForLimitHexes(std::vector rangedFullDamageHexes, std::vector rangedFullDamageLimitHexes); @@ -123,6 +121,9 @@ public: /// Returns ID of currently hovered hex or BattleHex::INVALID if none BattleHex getHoveredHex(); + /// Returns the currently hovered stack + const CStack* getHoveredStack(); + /// returns true if selected tile can be attacked in melee by current stack bool isTileAttackable(const BattleHex & number) const;