瀏覽代碼

UnitState has getRangedFullDamageDistance()

krs 2 年之前
父節點
當前提交
b8ad5b41f3
共有 3 個文件被更改,包括 22 次插入12 次删除
  1. 3 12
      client/battle/BattleFieldController.cpp
  2. 18 0
      lib/battle/CUnitState.cpp
  3. 1 0
      lib/battle/CUnitState.h

+ 3 - 12
client/battle/BattleFieldController.cpp

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

+ 18 - 0
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

+ 1 - 0
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;