diff --git a/client/battle/BattleFieldController.cpp b/client/battle/BattleFieldController.cpp index 910cfef16..53d283866 100644 --- a/client/battle/BattleFieldController.cpp +++ b/client/battle/BattleFieldController.cpp @@ -136,8 +136,8 @@ BattleFieldController::BattleFieldController(BattleInterface & owner): shootingRangeLimitImages = std::make_shared("battle/rangeHighlights/rangeHighlightsRed.json"); shootingRangeLimitImages->preload(); - flipRangedFullDamageLimitImagesIntoPositions(rangedFullDamageLimitImages); - flipRangedFullDamageLimitImagesIntoPositions(shootingRangeLimitImages); + flipRangeLimitImagesIntoPositions(rangedFullDamageLimitImages); + flipRangeLimitImagesIntoPositions(shootingRangeLimitImages); if(!owner.siegeController) { @@ -446,6 +446,8 @@ std::set BattleFieldController::getHighlightedHexesForMovementTarget( return {}; } +#pragma region Range limit highlight helpers + std::vector BattleFieldController::getRangeHexes(BattleHex sourceHex, uint8_t distance) { std::vector rangeHexes; // used for return @@ -478,6 +480,20 @@ std::vector BattleFieldController::getRangeLimitHexes(BattleHex hover return limitHexes; } +bool BattleFieldController::IsHexInRangeLimit(BattleHex hex, std::vector & rangeLimitHexes, int * hexIndexInRangeLimit) +{ + bool hexInRangeLimit = false; + + if(!rangeLimitHexes.empty()) + { + auto pos = std::find(rangeLimitHexes.begin(), rangeLimitHexes.end(), hex); + *hexIndexInRangeLimit = std::distance(rangeLimitHexes.begin(), pos); + hexInRangeLimit = pos != rangeLimitHexes.end(); + } + + return hexInRangeLimit; +} + std::vector> BattleFieldController::getOutsideNeighbourDirectionsForLimitHexes(std::vector wholeRangeHexes, std::vector rangeLimitHexes) { std::vector> output; @@ -511,7 +527,7 @@ std::vector> BattleFieldController::getOutsideNeigh return output; } -std::vector> BattleFieldController::calculateRangeHighlightImages(std::vector> hexesNeighbourDirections, std::shared_ptr limitImages) +std::vector> BattleFieldController::calculateRangeLimitHighlightImages(std::vector> hexesNeighbourDirections, std::shared_ptr limitImages) { std::vector> output; // if no image is to be shown an empty image is still added to help with traverssing the range @@ -538,10 +554,10 @@ void BattleFieldController::calculateRangeLimitAndHighlightImages(uint8_t distan std::vector rangeHexes = getRangeHexes(hoveredHex, distance); rangeLimitHexes = getRangeLimitHexes(hoveredHex, rangeHexes, distance); std::vector> rangeLimitNeighbourDirections = getOutsideNeighbourDirectionsForLimitHexes(rangeHexes, rangeLimitHexes); - rangeLimitHexesHighligts = calculateRangeHighlightImages(rangeLimitNeighbourDirections, rangeLimitImages); + rangeLimitHexesHighligts = calculateRangeLimitHighlightImages(rangeLimitNeighbourDirections, rangeLimitImages); } -void BattleFieldController::flipRangedFullDamageLimitImagesIntoPositions(std::shared_ptr images) +void BattleFieldController::flipRangeLimitImagesIntoPositions(std::shared_ptr images) { images->getImage(hexEdgeMaskToFrameIndex[HexMasks::topRight])->verticalFlip(); images->getImage(hexEdgeMaskToFrameIndex[HexMasks::right])->verticalFlip(); @@ -561,8 +577,16 @@ void BattleFieldController::flipRangedFullDamageLimitImagesIntoPositions(std::sh images->getImage(hexEdgeMaskToFrameIndex[HexMasks::bottomLeftCorner])->horizontalFlip(); } +#pragma endregion + void BattleFieldController::showHighlightedHexes(Canvas & canvas) { + std::vector rangedFullDamageLimitHexes; + std::vector shootingRangeLimitHexes; + + std::vector> rangedFullDamageLimitHexesHighligts; + std::vector> shootingRangeLimitHexesHighligts; + std::set hoveredStackMovementRangeHexes = getMovementRangeForHoveredStack(); std::set hoveredSpellHexes = getHighlightedHexesForSpellRange(); std::set hoveredMoveHexes = getHighlightedHexesForMovementTarget(); @@ -573,12 +597,6 @@ void BattleFieldController::showHighlightedHexes(Canvas & canvas) 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()) { @@ -599,24 +617,12 @@ void BattleFieldController::showHighlightedHexes(Canvas & canvas) bool mouse = hoveredMouseHexes.count(hex); // calculate if hex is Ranged Full Damage Limit and its position in highlight array - bool isRangedFullDamageLimit = false; int hexIndexInRangedFullDamageLimit = 0; - if(!rangedFullDamageLimitHexes.empty()) - { - auto pos = std::find(rangedFullDamageLimitHexes.begin(), rangedFullDamageLimitHexes.end(), hex); - hexIndexInRangedFullDamageLimit = std::distance(rangedFullDamageLimitHexes.begin(), pos); - isRangedFullDamageLimit = pos != rangedFullDamageLimitHexes.end(); - } + bool hexInRangedFullDamageLimit = IsHexInRangeLimit(hex, rangedFullDamageLimitHexes, &hexIndexInRangedFullDamageLimit); // calculate if hex is Shooting Range Limit and its position in highlight array - bool isShootingRangeLimit = false; int hexIndexInShootingRangeLimit = 0; - if(!shootingRangeLimitHexes.empty()) - { - auto pos = std::find(shootingRangeLimitHexes.begin(), shootingRangeLimitHexes.end(), hex); - hexIndexInShootingRangeLimit = std::distance(shootingRangeLimitHexes.begin(), pos); - isShootingRangeLimit = pos != shootingRangeLimitHexes.end(); - } + bool hexInShootingRangeLimit = IsHexInRangeLimit(hex, shootingRangeLimitHexes, &hexIndexInShootingRangeLimit); if(stackMovement && mouse) // area where hovered stackMovement can move shown with highlight. Because also affected by mouse cursor, shade as well { @@ -631,11 +637,11 @@ void BattleFieldController::showHighlightedHexes(Canvas & canvas) { showHighlightedHex(canvas, cellUnitMovementHighlight, hex, false); } - if(isRangedFullDamageLimit) + if(hexInRangedFullDamageLimit) { showHighlightedHex(canvas, rangedFullDamageLimitHexesHighligts[hexIndexInRangedFullDamageLimit], hex, false); } - if(isShootingRangeLimit) + if(hexInShootingRangeLimit) { showHighlightedHex(canvas, shootingRangeLimitHexesHighligts[hexIndexInShootingRangeLimit], hex, false); } diff --git a/client/battle/BattleFieldController.h b/client/battle/BattleFieldController.h index 5890ec0e5..3a830f97f 100644 --- a/client/battle/BattleFieldController.h +++ b/client/battle/BattleFieldController.h @@ -60,25 +60,32 @@ class BattleFieldController : public CIntObject std::set getHighlightedHexesForSpellRange(); std::set getHighlightedHexesForMovementTarget(); +#pragma region Range limit highlight helpers + /// get all hexes within a certain distance of given hex std::vector getRangeHexes(BattleHex sourceHex, uint8_t distance); /// get only hexes at the limit of a range std::vector getRangeLimitHexes(BattleHex hoveredHex, std::vector hexRange, uint8_t distanceToLimit); + /// calculate if a hex is in range limit and return its index in range + bool IsHexInRangeLimit(BattleHex hex, std::vector & rangedFullDamageLimitHexes, int * hexIndexInRangeLimit); + /// 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); /// calculates what image to use as range limit, depending on the direction of neighbors /// a mask is used internally to mark the directions of all neighbours /// based on this mask the corresponding image is selected - std::vector> calculateRangeHighlightImages(std::vector> hexesNeighbourDirections, std::shared_ptr limitImages); + std::vector> calculateRangeLimitHighlightImages(std::vector> hexesNeighbourDirections, std::shared_ptr limitImages); /// calculates all hexes for a range limit and what images to be shown as highlight for each of the hexes void calculateRangeLimitAndHighlightImages(uint8_t distance, std::shared_ptr rangedFullDamageLimitImages, std::vector & rangedFullDamageLimitHexes, std::vector> & rangedFullDamageLimitHexesHighligts); /// to reduce the number of source images used, some images will be used as flipped versions of preloaded ones - void flipRangedFullDamageLimitImagesIntoPositions(std::shared_ptr images); + void flipRangeLimitImagesIntoPositions(std::shared_ptr images); + +#pragma endregion void showBackground(Canvas & canvas); void showBackgroundImage(Canvas & canvas);