MCPcopy Create free account
hub / github.com/OpenDungeons/OpenDungeons / skillButtonTreeClicked

Method skillButtonTreeClicked

source/modes/GameMode.cpp:1754–1814  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1752}
1753
1754bool GameMode::skillButtonTreeClicked(SkillType type)
1755{
1756 // If the skill is already done or not allowed, nothing to do
1757 const std::vector<SkillType>& skillDone = mGameMap->getLocalPlayer()->getSeat()->getSkillDone();
1758 if(std::find(skillDone.begin(), skillDone.end(), type) != skillDone.end())
1759 return false;
1760 const std::vector<SkillType>& skillNotAllowed = mGameMap->getLocalPlayer()->getSeat()->getSkillNotAllowed();
1761 if(std::find(skillNotAllowed.begin(), skillNotAllowed.end(), type) != skillNotAllowed.end())
1762 return false;
1763
1764 auto it = std::find(mSkillPending.begin(), mSkillPending.end(), type);
1765 if(it != mSkillPending.end())
1766 {
1767 // The skill is pending. We remove it as well as all its dependencies
1768 mSkillPending.erase(it);
1769
1770 for(it = mSkillPending.begin(); it != mSkillPending.end();)
1771 {
1772 SkillType pendingType = *it;
1773 const Skill* skill = SkillManager::getSkill(pendingType);
1774 if(skill == nullptr)
1775 {
1776 OD_LOG_ERR("null skill pendingType=" + Helper::toString(static_cast<uint32_t>(pendingType)));
1777 continue;
1778 }
1779
1780 if(!skill->dependsOn(type))
1781 {
1782 ++it;
1783 continue;
1784 }
1785 it = mSkillPending.erase(it);
1786 }
1787 return true;
1788 }
1789
1790 std::vector<SkillType> skillToAdd;
1791
1792 // The skill is not pending. We need to check availability to all its dependencies and
1793 // add them at the end of the list if all are available/done
1794 const Skill* skill = SkillManager::getSkill(type);
1795 std::vector<SkillType> dependencies;
1796 skill->buildDependencies(skillDone, dependencies);
1797
1798 // We check if one of the dependencies is not available. If not, we cannot skill
1799 for(SkillType skillType : dependencies)
1800 {
1801 if(std::find(skillNotAllowed.begin(), skillNotAllowed.end(), skillType) != skillNotAllowed.end())
1802 return false;
1803
1804 if(std::find(mSkillPending.begin(), mSkillPending.end(), skillType) != mSkillPending.end())
1805 continue;
1806
1807 skillToAdd.push_back(skillType);
1808 }
1809
1810 for(SkillType skillType : skillToAdd)
1811 mSkillPending.push_back(skillType);

Callers 1

operator()Method · 0.80

Calls 5

getLocalPlayerMethod · 0.80
dependsOnMethod · 0.80
buildDependenciesMethod · 0.80
toStringFunction · 0.50
getSeatMethod · 0.45

Tested by

no test coverage detected