mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Merge pull request #219 from dydzio0614/patch-2
Update secondary skill handling. Fix issue 2307
This commit is contained in:
@@ -65,35 +65,49 @@ 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++)
|
||||
{
|
||||
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 ((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));
|
||||
|
||||
for(int i=0; i<primskills.size(); i++)
|
||||
if(primskills[i])
|
||||
iw.components.push_back(Component(Component::PRIM_SKILL,i,primskills[i],0));
|
||||
|
||||
for(int i=0; i<abilities.size(); i++)
|
||||
iw.components.push_back(Component(Component::SEC_SKILL,abilities[i],abilityLevels[i],0));
|
||||
|
||||
for(auto abilityData : unpossessedAbilities)
|
||||
iw.components.push_back(Component(Component::SEC_SKILL, abilityData.first, abilityData.second, 0));
|
||||
|
||||
cb->showInfoDialog(&iw);
|
||||
|
||||
//give sec skills
|
||||
for(int i=0; i<abilities.size(); i++)
|
||||
{
|
||||
int curLev = h->getSecSkillLevel(abilities[i]);
|
||||
for (auto abilityData : unpossessedAbilities)
|
||||
cb->changeSecSkill(h, abilityData.first, abilityData.second, true);
|
||||
|
||||
if( (curLev && curLev < abilityLevels[i]) || (h->canLearnSkill() ))
|
||||
{
|
||||
cb->changeSecSkill(h,abilities[i],abilityLevels[i],true);
|
||||
}
|
||||
}
|
||||
assert(h->secSkills.size() <= GameConstants::SKILL_PER_HERO);
|
||||
|
||||
//give prim skills
|
||||
for(int i=0; i<primskills.size(); i++)
|
||||
@@ -106,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);
|
||||
|
Reference in New Issue
Block a user