浏览代码

Fixed http://bugs.vcmi.eu/view.php?id=2611

AlexVinS 9 年之前
父节点
当前提交
f8bf2c3746
共有 2 个文件被更改,包括 30 次插入3 次删除
  1. 29 2
      lib/CBattleCallback.cpp
  2. 1 1
      lib/HeroBonus.h

+ 29 - 2
lib/CBattleCallback.cpp

@@ -880,8 +880,16 @@ bool CBattleInfoCallback::battleCanShoot(const CStack * stack, BattleHex dest) c
 	if(!stack || !dst)
 		return false;
 
-	if(stack->hasBonusOfType(Bonus::FORGETFULL)) //forgetfulness
-		return false;
+	//forgetfulness
+	TBonusListPtr forgetfulList = stack->getBonuses(Selector::type(Bonus::FORGETFULL),"");
+	if(!forgetfulList->empty())
+	{
+		int forgetful = forgetfulList->valOfBonuses(Selector::type(Bonus::FORGETFULL));
+
+		//advanced+ level
+		if(forgetful > 1)
+			return false;
+	}
 
 	if(stack->getCreature()->idNumber == CreatureID::CATAPULT && dst) //catapult cannot attack creatures
 		return false;
@@ -1040,6 +1048,25 @@ TDmgRange CBattleInfoCallback::calculateDmgRange(const BattleAttackInfo &info) c
 		multBonus *= (100 - info.defenderBonuses->valOfBonuses(Bonus::GENERAL_DAMAGE_REDUCTION, 1)) / 100.0;
 	}
 
+	if(info.shooting)
+	{
+		//todo: set actual percentage in spell bonus configuration instead of just level; requires non trivial backward compatibility handling
+
+		//get list first, total value of 0 also counts
+		TBonusListPtr forgetfulList = info.attackerBonuses->getBonuses(Selector::type(Bonus::FORGETFULL),"");
+
+		if(!forgetfulList->empty())
+		{
+			int forgetful = forgetfulList->valOfBonuses(Selector::type(Bonus::FORGETFULL));
+
+			//none of basic level
+			if(forgetful == 0 || forgetful == 1)
+				multBonus *= 0.5;
+			else
+				logGlobal->warn("Attempt to calculate shooting damage with adv+ FORGETFULL effect");
+		}
+	}
+
 	TBonusListPtr curseEffects = info.attackerBonuses->getBonuses(Selector::type(Bonus::ALWAYS_MINIMUM_DAMAGE));
 	TBonusListPtr blessEffects = info.attackerBonuses->getBonuses(Selector::type(Bonus::ALWAYS_MAXIMUM_DAMAGE));
 	int curseBlessAdditiveModifier = blessEffects->totalValue() - curseEffects->totalValue();

+ 1 - 1
lib/HeroBonus.h

@@ -424,7 +424,7 @@ public:
 	TInternalContainer::size_type operator-=(std::shared_ptr<Bonus> const &i);
 
 	// BonusList functions
-	int totalValue() const; //subtype -> subtype of bonus, if -1 then any
+	int totalValue() const;
 	void getBonuses(BonusList &out, const CSelector &selector, const CSelector &limit) const;
 	void getAllBonuses(BonusList &out) const;