diff --git a/client/battle/BattleFieldController.cpp b/client/battle/BattleFieldController.cpp index 7b1e7b766..ffec27e7b 100644 --- a/client/battle/BattleFieldController.cpp +++ b/client/battle/BattleFieldController.cpp @@ -402,12 +402,7 @@ std::vector BattleFieldController::getRangedFullDamageHexes() if(!(hoveredStack && hoveredStack->isShooter())) return rangedFullDamageHexes; - auto rangedFullDamageDistance = GameConstants::BATTLE_PENALTY_DISTANCE; - - // overwrite full ranged damage distance from Additional info field of LIMITED_SHOOTING_RANGE bonus - auto bonus = hoveredStack->getBonus(Selector::type()(BonusType::LIMITED_SHOOTING_RANGE)); - if(bonus != nullptr && bonus->additionalInfo != CAddInfo::NONE) - rangedFullDamageDistance = bonus->additionalInfo[0]; + auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance(); // get only battlefield hexes that are in full range damage distance std::set fullRangeLimit; @@ -428,15 +423,11 @@ std::vector BattleFieldController::getRangedFullDamageLimitHexes(std: // 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 = GameConstants::BATTLE_PENALTY_DISTANCE; - - // overwrite full ranged damage distance from Additional info field of LIMITED_SHOOTING_RANGE bonus - auto bonus = hoveredStack->getBonus(Selector::type()(BonusType::LIMITED_SHOOTING_RANGE)); - if(bonus != nullptr && bonus->additionalInfo != CAddInfo::NONE) - rangedFullDamageDistance = bonus->additionalInfo[0]; + auto rangedFullDamageDistance = hoveredStack->getRangedFullDamageDistance(); // from ranged full damage hexes get only the ones at the limit for(auto & hex : rangedFullDamageHexes) diff --git a/lib/battle/CUnitState.cpp b/lib/battle/CUnitState.cpp index c374f06df..af0135028 100644 --- a/lib/battle/CUnitState.cpp +++ b/lib/battle/CUnitState.cpp @@ -591,6 +591,24 @@ int32_t CUnitState::getInitiative(int turn) const return valOfBonuses(Selector::type()(BonusType::STACKS_SPEED).And(Selector::turns(turn))); } +uint8_t CUnitState::getRangedFullDamageDistance() const +{ + if(!isShooter()) + return 0; + + uint8_t rangedFullDamageDistance = GameConstants::BATTLE_PENALTY_DISTANCE; + + // overwrite full ranged damage distance with the value set in Additional info field of LIMITED_SHOOTING_RANGE bonus + if(this->hasBonus(Selector::type()(BonusType::LIMITED_SHOOTING_RANGE))) + { + auto bonus = this->getBonus(Selector::type()(BonusType::LIMITED_SHOOTING_RANGE)); + if(bonus != nullptr && bonus->additionalInfo != CAddInfo::NONE) + rangedFullDamageDistance = bonus->additionalInfo[0]; + } + + return rangedFullDamageDistance; +} + bool CUnitState::canMove(int turn) const { return alive() && !hasBonus(Selector::type()(BonusType::NOT_ACTIVE).And(Selector::turns(turn))); //eg. Ammo Cart or blinded creature diff --git a/lib/battle/CUnitState.h b/lib/battle/CUnitState.h index 4b0758f0e..127095cf8 100644 --- a/lib/battle/CUnitState.h +++ b/lib/battle/CUnitState.h @@ -221,6 +221,7 @@ public: BattleHex getPosition() const override; void setPosition(BattleHex hex) override; int32_t getInitiative(int turn = 0) const override; + uint8_t getRangedFullDamageDistance() const; bool canMove(int turn = 0) const override; bool defended(int turn = 0) const override;