DjWarmonger %!s(int64=13) %!d(string=hai) anos
pai
achega
329f39bb2a
Modificáronse 2 ficheiros con 13 adicións e 7 borrados
  1. 11 6
      lib/BattleState.cpp
  2. 2 1
      lib/HeroBonus.h

+ 11 - 6
lib/BattleState.cpp

@@ -2541,15 +2541,19 @@ void CStack::stackEffectToFeature(std::vector<Bonus> & sf, const Bonus & sse)
 	 	sf.push_back(featureGenerator(Bonus::FORGETFULL, 0, sse.val, sse.turnsRemain));
 	 	sf.back().sid = sse.sid;
 	 	break;
-	case 62: //blind
-		sf.push_back(makeFeatureVal(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, 0, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
+	case Spells::BLIND: //blind
+		sf.push_back(makeFeatureVal(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, sse.sid, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
 		sf.back().sid = sse.sid;
 		sf.push_back(makeFeatureVal(Bonus::GENERAL_ATTACK_REDUCTION, Bonus::UNTIL_ATTACK | Bonus::N_TURNS, 0, power, Bonus::SPELL_EFFECT, sse.turnsRemain));
 		sf.back().sid = sse.sid;
+		sf.push_back(makeFeatureVal(Bonus::NO_RETALIATION, Bonus::UNITL_BEING_ATTACKED, 0, 0, Bonus::SPELL_EFFECT, 0)); // don't retaliate after basilisk / unicorn attack
+		sf.back().sid = sse.sid;
 	 	break;
-	case 70: //Stone Gaze
-	case 74: //Paralyze
-		sf.push_back(makeFeatureVal(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, 0, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
+	case Spells::STONE_GAZE: //Stone Gaze
+	case Spells::PARALYZE: //Paralyze
+		sf.push_back(makeFeatureVal(Bonus::NOT_ACTIVE, Bonus::UNITL_BEING_ATTACKED | Bonus::N_TURNS, sse.sid, 0, Bonus::SPELL_EFFECT, sse.turnsRemain));
+		sf.back().sid = sse.sid;
+		sf.push_back(makeFeatureVal(Bonus::NO_RETALIATION, Bonus::UNITL_BEING_ATTACKED, 0, 0, Bonus::SPELL_EFFECT, 0)); // don't retaliate after basilisk / unicorn attack
 		sf.back().sid = sse.sid;
 		break;
 	case 71: //Poison
@@ -2812,7 +2816,8 @@ bool CStack::ableToRetaliate() const
 	return alive() 
 		&& (counterAttacks > 0 || hasBonusOfType(Bonus::UNLIMITED_RETALIATIONS))
 		&& !hasBonusOfType(Bonus::SIEGE_WEAPON)
-		&& !hasBonusOfType(Bonus::HYPNOTIZED);
+		&& !hasBonusOfType(Bonus::HYPNOTIZED)
+		&& !hasBonusOfType(Bonus::NO_RETALIATION);
 }
 
 std::string CStack::getName() const

+ 2 - 1
lib/HeroBonus.h

@@ -138,6 +138,7 @@ namespace PrimarySkill
 	BONUS_NAME(HEALER)									\
 	BONUS_NAME(SIEGE_WEAPON)							\
 	BONUS_NAME(HYPNOTIZED)								\
+	BONUS_NAME(NO_RETALIATION) /*temporary bonus for basilisk, unicorn and scorpicore paralyze*/\
 	BONUS_NAME(ADDITIONAL_RETALIATION) /*value - number of additional retaliations*/ \
 	BONUS_NAME(MAGIC_MIRROR) /* value - chance of redirecting in %*/ \
 	BONUS_NAME(ALWAYS_MINIMUM_DAMAGE) /*unit does its minimum damage from range; subtype: -1 - any attack, 0 - melee, 1 - ranged, value: additional damage penalty (it'll subtracted from dmg), additional info - multiplicative anti-bonus for dmg in % [eg 20 means that creature will inflict 80% of normal minimal dmg]*/ \
@@ -146,7 +147,7 @@ namespace PrimarySkill
 	BONUS_NAME(IN_FRENZY) /*value - level*/				\
 	BONUS_NAME(SLAYER) /*value - level*/				\
 	BONUS_NAME(FORGETFULL) /*forgetfulness spell effect, value - level*/ \
-	BONUS_NAME(NOT_ACTIVE)								\
+	BONUS_NAME(NOT_ACTIVE) /* subtype - spell ID (paralyze, blind, stone gaze) for graphical effect*/ 								\
 	BONUS_NAME(NO_LUCK) /*eg. when fighting on cursed ground*/	\
 	BONUS_NAME(NO_MORALE) /*eg. when fighting on cursed ground*/ \
 	BONUS_NAME(DARKNESS) /*val = radius */ \