소스 검색

Extract revenge calculation to separate method

M 1 년 전
부모
커밋
7bf273e01c
2개의 변경된 파일19개의 추가작업 그리고 13개의 파일을 삭제
  1. 18 13
      lib/battle/DamageCalculator.cpp
  2. 1 0
      lib/battle/DamageCalculator.h

+ 18 - 13
lib/battle/DamageCalculator.cpp

@@ -281,6 +281,20 @@ double DamageCalculator::getAttackHateFactor() const
 	return allHateEffects->valOfBonuses(Selector::subtype()(BonusSubtypeID(info.defender->creatureId()))) / 100.0;
 }
 
+double DamageCalculator::getAttackRevengeFactor() const
+{
+	if(info.attacker->hasBonusOfType(BonusType::REVENGE)) //HotA Haspid ability
+	{
+		int totalStackCount = info.attacker->unitBaseAmount();
+		int currentStackHealth = info.attacker->getAvailableHealth();
+		int creatureHealth = info.attacker->getMaxHealth();
+
+		return sqrt(static_cast<double>((totalStackCount + 1) * creatureHealth) / (currentStackHealth + creatureHealth) - 1);
+	}
+
+	return 0.0;
+}
+
 double DamageCalculator::getDefenseSkillFactor() const
 {
 	int defenseAdvantage = getTargetDefenseEffective() - getActorAttackEffective();
@@ -523,19 +537,10 @@ DamageEstimation DamageCalculator::calculateDmgRange() const
 
 	double resultingFactor = std::min(8.0, attackFactorTotal) * std::max( 0.01, defenseFactorTotal);
 
-	double revengeAdditionalMinDamage = 0.0;
-	double revengeAdditionalMaxDamage = 0.0;
-	if(info.attacker->hasBonusOfType(BonusType::REVENGE)) //HotA Haspid ability
-	{
-		int totalStackCount = info.attacker->unitBaseAmount();
-		int currentStackHealth = info.attacker->getAvailableHealth();
-		int creatureHealth = info.attacker->getMaxHealth();
-
-		double revengeFactor = sqrt(static_cast<double>((totalStackCount + 1) * creatureHealth) / (currentStackHealth + creatureHealth) - 1);
-
-		revengeAdditionalMinDamage = std::round(damageBase.min * revengeFactor);
-		revengeAdditionalMaxDamage = std::round(damageBase.max * revengeFactor);
-	}
+	//calculated separately since it bypasses cap on bonus damage
+	double revengeFactor = getAttackRevengeFactor();
+	double revengeAdditionalMinDamage = std::round(damageBase.min * revengeFactor);
+	double revengeAdditionalMaxDamage = std::round(damageBase.max * revengeFactor);
 
 	DamageRange damageDealt {
 		std::max<int64_t>( 1.0, std::floor(damageBase.min * resultingFactor + revengeAdditionalMinDamage)),

+ 1 - 0
lib/battle/DamageCalculator.h

@@ -51,6 +51,7 @@ class DLL_LINKAGE DamageCalculator
 	double getAttackDeathBlowFactor() const;
 	double getAttackDoubleDamageFactor() const;
 	double getAttackHateFactor() const;
+	double getAttackRevengeFactor() const;
 
 	double getDefenseSkillFactor() const;
 	double getDefenseArmorerFactor() const;