1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-08-13 19:54:17 +02:00

UnitState has getRangedFullDamageDistance()

This commit is contained in:
krs
2023-05-17 22:03:33 +03:00
parent c562ce9c06
commit b8ad5b41f3
3 changed files with 22 additions and 12 deletions

View File

@@ -402,12 +402,7 @@ std::vector<BattleHex> 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<BattleHex> fullRangeLimit;
@@ -428,15 +423,11 @@ std::vector<BattleHex> 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)

View File

@@ -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

View File

@@ -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;