1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-12 02:28:11 +02:00

Added common method for secondary skill availability checks

This commit is contained in:
Ivan Savenko 2022-11-14 19:08:49 +02:00
parent e06db2365d
commit 729357824b
4 changed files with 23 additions and 9 deletions

View File

@ -1700,9 +1700,7 @@ int CUniversityWindow::CItem::state()
{ {
if(parent->hero->getSecSkillLevel(SecondarySkill(ID)))//hero know this skill if(parent->hero->getSecSkillLevel(SecondarySkill(ID)))//hero know this skill
return 1; return 1;
if(!parent->hero->canLearnSkill())//can't learn more skills if(!parent->hero->canLearnSkill(SecondarySkill(ID)))//can't learn more skills
return 0;
if(parent->hero->type->heroClass->secSkillProbability[ID]==0)//can't learn this skill (like necromancy for most of non-necros)
return 0; return 0;
return 2; return 2;
} }

View File

@ -195,6 +195,23 @@ bool CGHeroInstance::canLearnSkill() const
return secSkills.size() < GameConstants::SKILL_PER_HERO; return secSkills.size() < GameConstants::SKILL_PER_HERO;
} }
bool CGHeroInstance::canLearnSkill(SecondarySkill which) const
{
if ( !canLearnSkill())
return false;
if (!cb->isAllowed(2, which))
return false;
if (getSecSkillLevel(which) > 0)
return false;
if (type->heroClass->secSkillProbability[which] == 0)
return false;
return true;
}
int CGHeroInstance::maxMovePoints(bool onLand) const int CGHeroInstance::maxMovePoints(bool onLand) const
{ {
TurnInfo ti(this); TurnInfo ti(this);
@ -1117,9 +1134,7 @@ std::vector<SecondarySkill> CGHeroInstance::getLevelUpProposedSecondarySkills()
std::vector<SecondarySkill> obligatorySkills; //hero is offered magic school or wisdom if possible std::vector<SecondarySkill> obligatorySkills; //hero is offered magic school or wisdom if possible
if (!skillsInfo.wisdomCounter) if (!skillsInfo.wisdomCounter)
{ {
if (cb->isAllowed(2, SecondarySkill::WISDOM) && if (canLearnSkill(SecondarySkill::WISDOM))
!getSecSkillLevel(SecondarySkill::WISDOM) &&
type->heroClass->secSkillProbability[SecondarySkill::WISDOM] > 0)
obligatorySkills.push_back(SecondarySkill::WISDOM); obligatorySkills.push_back(SecondarySkill::WISDOM);
} }
if (!skillsInfo.magicSchoolCounter) if (!skillsInfo.magicSchoolCounter)
@ -1133,7 +1148,7 @@ std::vector<SecondarySkill> CGHeroInstance::getLevelUpProposedSecondarySkills()
for (auto skill : ss) for (auto skill : ss)
{ {
if (cb->isAllowed(2, skill) && !getSecSkillLevel(skill) && type->heroClass->secSkillProbability[skill] > 0) //only schools hero doesn't know yet if (canLearnSkill(skill)) //only schools hero doesn't know yet
{ {
obligatorySkills.push_back(skill); obligatorySkills.push_back(skill);
break; //only one break; //only one
@ -1145,7 +1160,7 @@ std::vector<SecondarySkill> CGHeroInstance::getLevelUpProposedSecondarySkills()
//picking sec. skills for choice //picking sec. skills for choice
std::set<SecondarySkill> basicAndAdv, expert, none; std::set<SecondarySkill> basicAndAdv, expert, none;
for(int i = 0; i < VLC->skillh->size(); i++) for(int i = 0; i < VLC->skillh->size(); i++)
if (cb->isAllowed(2,i) && type->heroClass->secSkillProbability[i] > 0) if (canLearnSkill(SecondarySkill(i)))
none.insert(SecondarySkill(i)); none.insert(SecondarySkill(i));
for(auto & elem : secSkills) for(auto & elem : secSkills)

View File

@ -187,6 +187,7 @@ public:
/// Returns true if hero has free secondary skill slot. /// Returns true if hero has free secondary skill slot.
bool canLearnSkill() const; bool canLearnSkill() const;
bool canLearnSkill(SecondarySkill which) const;
void setPrimarySkill(PrimarySkill::PrimarySkill primarySkill, si64 value, ui8 abs); void setPrimarySkill(PrimarySkill::PrimarySkill primarySkill, si64 value, ui8 abs);
void setSecSkillLevel(SecondarySkill which, int val, bool abs);// abs == 0 - changes by value; 1 - sets to value void setSecSkillLevel(SecondarySkill which, int val, bool abs);// abs == 0 - changes by value; 1 - sets to value

View File

@ -4083,7 +4083,7 @@ bool CGameHandler::buySecSkill(const IMarket *m, const CGHeroInstance *h, Second
if (!h->canLearnSkill()) if (!h->canLearnSkill())
COMPLAIN_RET("Hero can't learn any more skills"); COMPLAIN_RET("Hero can't learn any more skills");
if (h->type->heroClass->secSkillProbability.at(skill)==0)//can't learn this skill (like necromancy for most of non-necros) if (!h->canLearnSkill(skill))
COMPLAIN_RET("The hero can't learn this skill!"); COMPLAIN_RET("The hero can't learn this skill!");
if (!vstd::contains(m->availableItemsIds(EMarketMode::RESOURCE_SKILL), skill)) if (!vstd::contains(m->availableItemsIds(EMarketMode::RESOURCE_SKILL), skill))