소스 검색

Improve pandora box secondary skill handling

Dydzio 9 년 전
부모
커밋
bd651ec5ef
1개의 변경된 파일25개의 추가작업 그리고 29개의 파일을 삭제
  1. 25 29
      lib/mapObjects/CGPandoraBox.cpp

+ 25 - 29
lib/mapObjects/CGPandoraBox.cpp

@@ -65,32 +65,32 @@ void CGPandoraBox::giveContentsUpToExp(const CGHeroInstance *h) const
 			break;
 		}
 	}
+	
+	std::vector<std::pair<SecondarySkill, ui8>> unpossessedAbilities; //ability + ability level
+	int abilitiesRequiringSlot = 0;
 
-	if(gainedExp || changesPrimSkill || abilities.size())
+	//filter out unnecessary secondary skills
+	for (int i = 0; i < abilities.size(); i++)
 	{
-		std::vector<SecondarySkill> unpossessedAbilities;
-		std::vector<int> unpossessedAbilityLevels;
-		int abilitiesRequiringSlot = 0;
+		int curLev = h->getSecSkillLevel(abilities[i]);
+		bool abilityCanUseSlot = !curLev && ((h->secSkills.size() + abilitiesRequiringSlot) < GameConstants::SKILL_PER_HERO); //limit new abilities to number of slots
 
-		//filter out unnecessary secondary skills
-		for (int i = 0; i < abilities.size(); i++)
-		{
-			int curLev = h->getSecSkillLevel(abilities[i]);
-			bool abilityCanUseSlot = !curLev && ((h->secSkills.size() + abilitiesRequiringSlot) < GameConstants::SKILL_PER_HERO); //limit new abilities to number of slots
-
-			if (abilityCanUseSlot)
-				abilitiesRequiringSlot++;
+		if (abilityCanUseSlot)
+			abilitiesRequiringSlot++;
 
-			if ( (curLev && curLev < abilityLevels[i]) || abilityCanUseSlot )
-			{
-				unpossessedAbilities.push_back(abilities[i]);
-				unpossessedAbilityLevels.push_back(abilityLevels[i]);
-			}
+		if ((curLev && curLev < abilityLevels[i]) || abilityCanUseSlot)
+		{
+			unpossessedAbilities.push_back({ abilities[i], abilityLevels[i] });
 		}
-		
+	}
+
+	if(gainedExp || changesPrimSkill || unpossessedAbilities.size())
+	{
 		TExpType expVal = h->calculateXp(gainedExp);
 		//getText(iw,afterBattle,175,h); //wtf?
-
+		iw.text.addTxt(MetaString::ADVOB_TXT, 175); //%s learns something
+		iw.text.addReplacement(h->name);
+		
 		if(expVal)
 			iw.components.push_back(Component(Component::EXPERIENCE,0,expVal,0));
 			
@@ -98,19 +98,14 @@ void CGPandoraBox::giveContentsUpToExp(const CGHeroInstance *h) const
 			if(primskills[i])
 				iw.components.push_back(Component(Component::PRIM_SKILL,i,primskills[i],0));
 
-		for(int i=0; i<unpossessedAbilities.size(); i++)
-			iw.components.push_back(Component(Component::SEC_SKILL, unpossessedAbilities[i], unpossessedAbilityLevels[i],0));
+		for(auto abilityData : unpossessedAbilities)
+			iw.components.push_back(Component(Component::SEC_SKILL, abilityData.first, abilityData.second, 0));
 			
-		if (iw.components.size() > 0) //TODO:Create information that box was empty for now, and deliver to CGPandoraBox::giveContentsAfterExp
-		{
-			iw.text.addTxt(MetaString::ADVOB_TXT, 175); //%s learns something
-			iw.text.addReplacement(h->name);
-			cb->showInfoDialog(&iw);
-		}
+		cb->showInfoDialog(&iw);
 
 		//give sec skills
-		for (int i = 0; i<unpossessedAbilities.size(); i++)
-			cb->changeSecSkill(h, unpossessedAbilities[i], unpossessedAbilityLevels[i],true);
+		for (auto abilityData : unpossessedAbilities)
+			cb->changeSecSkill(h, abilityData.first, abilityData.second, true);
 
 		assert(h->secSkills.size() <= GameConstants::SKILL_PER_HERO);
 
@@ -125,6 +120,7 @@ void CGPandoraBox::giveContentsUpToExp(const CGHeroInstance *h) const
 		if(expVal)
 			cb->changePrimSkill(h, PrimarySkill::EXPERIENCE, expVal, false);
 	}
+	//else { } //TODO:Create information that box was empty for now, and deliver to CGPandoraBox::giveContentsAfterExp or refactor
 
 	if(!cb->isVisitCoveredByAnotherQuery(this, h))
 		giveContentsAfterExp(h);