| 1752 | } |
| 1753 | |
| 1754 | bool 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); |
no test coverage detected