Просмотр исходного кода

* more appropriate calculation of spell level by SPELL bonus

mateuszb 15 лет назад
Родитель
Сommit
f41c85212f
4 измененных файлов с 29 добавлено и 6 удалено
  1. 3 3
      hch/CArtHandler.cpp
  2. 4 0
      hch/CObjectHandler.cpp
  3. 19 1
      lib/HeroBonus.cpp
  4. 3 2
      lib/HeroBonus.h

+ 3 - 3
hch/CArtHandler.cpp

@@ -636,15 +636,15 @@ void CArtHandler::addBonuses()
 	//Sea Captain's Hat 
 	giveArtBonus(123,Bonus::WHIRLPOOL_PROTECTION,0); 
 	giveArtBonus(123,Bonus::SEA_MOVEMENT,+500); 
-	giveArtBonus(123,Bonus::SPELL,3,0); 
-	giveArtBonus(123,Bonus::SPELL,3,1); 
+	giveArtBonus(123,Bonus::SPELL,3,0, Bonus::INDEPENDENT_MAX); 
+	giveArtBonus(123,Bonus::SPELL,3,1, Bonus::INDEPENDENT_MAX); 
 
 	giveArtBonus(124,Bonus::SPELLS_OF_LEVEL,3,1); //Spellbinder's Hat
 	giveArtBonus(125,Bonus::ENEMY_CANT_ESCAPE,0); //Shackles of War
 	giveArtBonus(126,Bonus::BLOCK_SPELLS_ABOVE_LEVEL,0);//Orb of Inhibition
 
 	//Armageddon's Blade
-	giveArtBonus(128, Bonus::SPELL, 3, 26);
+	giveArtBonus(128, Bonus::SPELL, 3, 26, Bonus::INDEPENDENT_MAX);
 	giveArtBonus(128, Bonus::SPELL_IMMUNITY, 26);
 	ART_ATTACK_AND_DEFENSE(128, +3);
 	ART_PRIM_SKILL(128, 2, +3);

+ 4 - 0
hch/CObjectHandler.cpp

@@ -1285,6 +1285,10 @@ ui8 CGHeroInstance::getSpellSchoolLevel(const CSpell * spell, int *outSelectedSc
 
 
 	amax(skill, valOfBonuses(Bonus::MAGIC_SCHOOL_SKILL, 0)); //any school bonus
+	if (hasBonusOfType(Bonus::SPELL, spell->id))
+	{
+		amax(skill, valOfBonuses(Bonus::SPELL, spell->id));
+	}
 	assert(skill >= 0 && skill <= 3);
 	return skill;
 }

+ 19 - 1
lib/HeroBonus.cpp

@@ -22,6 +22,8 @@ int DLL_EXPORT BonusList::totalValue() const
 	int percentToBase = 0;
 	int percentToAll = 0;
 	int additive = 0;
+	int indepMax = 0;
+	bool hasIndepMax = false;
 
 	for(const_iterator i = begin(); i != end(); i++)
 	{
@@ -38,12 +40,28 @@ int DLL_EXPORT BonusList::totalValue() const
 			break;
 		case Bonus::ADDITIVE_VALUE:
 			additive += i->val;
+			break;
+		case Bonus::INDEPENDENT_MAX:
+			if (!indepMax)
+			{
+				indepMax = i->val;
+				hasIndepMax = true;
+			}
+			else
+			{
+				amax(indepMax, i->val);
+			}
+
 			break;
 		}
 	}
 	int modifiedBase = base + (base * percentToBase) / 100;
 	modifiedBase += additive;
-	return (modifiedBase * (100 + percentToAll)) / 100;
+	int valFirst = (modifiedBase * (100 + percentToAll)) / 100;
+	if (hasIndepMax)
+		return std::max(valFirst, indepMax);
+	else
+		return valFirst;
 }
 
 const DLL_EXPORT Bonus * BonusList::getFirst(const CSelector &selector) const

+ 3 - 2
lib/HeroBonus.h

@@ -208,7 +208,8 @@ struct DLL_EXPORT Bonus
 		ADDITIVE_VALUE,
 		BASE_NUMBER,
 		PERCENT_TO_ALL,
-		PERCENT_TO_BASE
+		PERCENT_TO_BASE,
+		INDEPENDENT_MAX //used for SPELL bonus
 	};
 
 	ui8 duration; //uses BonusDuration values
@@ -220,7 +221,7 @@ struct DLL_EXPORT Bonus
 	ui8 source;//source type" uses BonusSource values - what gave that bonus
 	si32 val;
 	ui32 id; //source id: id of object/artifact/spell
-	ui8 valType; 
+	ui8 valType; //by ValueType enum
 
 	si32 additionalInfo;
 	ui8 effectRange; //if not NO_LIMIT, bonus will be ommitted by default