Browse Source

Corrected calculation of secondary skill speciality.

DjWarmonger 15 years ago
parent
commit
29e7530ff5
1 changed files with 11 additions and 10 deletions
  1. 11 10
      hch/CObjectHandler.cpp

+ 11 - 10
hch/CObjectHandler.cpp

@@ -981,8 +981,10 @@ void CGHeroInstance::initObj()
 			case 2://secondary skill
 				speciality.growthsWithLevel = true;
 				bonus.type = Bonus::SPECIAL_SECONDARY_SKILL; //needs to be recalculated with level, based on this value
+				bonus.valType = Bonus::BASE_NUMBER; // to receive nonzero value
 				bonus.subtype = it->subtype; //skill id
 				bonus.val = it->val; //value per level, in percent
+				speciality.bonuses.push_back (bonus);
 				switch (it->additionalinfo)
 				{
 					case 0: //normal
@@ -992,8 +994,7 @@ void CGHeroInstance::initObj()
 						bonus.valType = Bonus::PERCENT_TO_ALL;
 						break;
 				}
-				speciality.bonuses.push_back (bonus);
-				bonus.val = valOfBonuses(Bonus::SECONDARY_SKILL_PREMY, it->subtype) * it->val; //TODO: limit range to hero only
+				bonus.type = Bonus::SECONDARY_SKILL_PREMY; //value will be calculated later
 				speciality.bonuses.push_back(bonus);
 				break;
 			case 3://spell damage bonus, level dependant but calculated elsehwere
@@ -1117,10 +1118,8 @@ void CGHeroInstance::UpdateSpeciality()
 			switch (it->type)
 			{
 				case Bonus::SECONDARY_SKILL_PREMY:
-					it->val = (speciality.valOfBonuses(Bonus::SPECIAL_SECONDARY_SKILL, it->subtype) *
-						valOfBonuses(Selector::typeSybtype(Bonus::SECONDARY_SKILL_PREMY, it->subtype),this) * level);
-					//use only hero skills as bonuses to avoid feedback loop
-					break;
+					it->val = (speciality.valOfBonuses(Bonus::SPECIAL_SECONDARY_SKILL, it->subtype) * level);
+					break; //use only hero skills as bonuses to avoid feedback loop
 				case Bonus::PRIMARY_SKILL: //for crearures, that is
 					int creLevel = (*creatures)[it->additionalInfo]->level;
 					if(!creLevel)
@@ -1192,14 +1191,16 @@ void CGHeroInstance::updateSkill(int which, int val)
 	}
 	if (skillVal) //we don't need bonuses of other types here
 	{
-		if (hasBonusOfType(Bonus::SECONDARY_SKILL_PREMY, which))
+		Bonus * b = getBonus(Selector::typeSybtype(Bonus::SECONDARY_SKILL_PREMY, which) && Selector::sourceType(Bonus::SECONDARY_SKILL));
+		if (b) //only local hero bonus
 		{
-			getBonus(Selector::typeSybtype(Bonus::SECONDARY_SKILL_PREMY, which))->val = skillVal;
+			b->val = skillVal;
 		}
 		else
 		{
-			bonuses.push_back
-				(Bonus(Bonus::PERMANENT, Bonus::SECONDARY_SKILL_PREMY, id, skillVal, ID, which, Bonus::BASE_NUMBER));
+			Bonus bonus(Bonus::PERMANENT, Bonus::SECONDARY_SKILL_PREMY, id, skillVal, ID, which, Bonus::BASE_NUMBER);
+			bonus.source = Bonus::SECONDARY_SKILL;
+			bonuses.push_back (bonus);
 		}
 	}
 }