/** Get the list of RuleResearchProject which can be researched in a Base. * @param projects the list of ResearchProject which are available. * @param ruleset the Game Ruleset * @param base a pointer to a Base */ void SavedGame::getAvailableResearchProjects (std::vector<RuleResearchProject *> & projects, Ruleset * ruleset, Base * base) const { const std::vector<const RuleResearchProject *> & discovereds(getDiscoveredResearchs()); const std::map<std::string, RuleResearchProject *> & researchProjects = ruleset->getResearchProjects(); const std::vector<ResearchProject *> & baseResearchProjects = base->getResearch(); std::vector<const RuleResearchProject *> unlockeds; for(std::vector<const RuleResearchProject *>::const_iterator it = discovereds.begin (); it != discovereds.end (); ++it) { for(std::vector<RuleResearchProject *>::const_iterator itUnlocked = (*it)->getUnlocked ().begin (); itUnlocked != (*it)->getUnlocked ().end (); ++itUnlocked) { unlockeds.push_back(*itUnlocked); } } for(std::map<std::string, RuleResearchProject *>::const_iterator iter = researchProjects.begin (); iter != researchProjects.end (); ++iter) { if (!isResearchAvailable(iter->second, unlockeds)) { continue; } std::vector<const RuleResearchProject *>::const_iterator itDiscovered = std::find(discovereds.begin (), discovereds.end (), iter->second); if (itDiscovered != discovereds.end ()) { continue; } if (std::find_if (baseResearchProjects.begin(), baseResearchProjects.end (), findRuleResearchProject(iter->second)) != baseResearchProjects.end ()) { continue; } if (iter->second->needItem() && base->getItems()->getItem(iter->second->getName ()) == 0) { continue; } projects.push_back (iter->second); } }
/** Get the list of RuleResearch which can be researched in a Base. * @param projects the list of ResearchProject which are available. * @param ruleset the Game Ruleset * @param base a pointer to a Base */ void SavedGame::getAvailableResearchProjects (std::vector<RuleResearch *> & projects, Ruleset * ruleset, Base * base) const { const std::vector<const RuleResearch *> & discovered(getDiscoveredResearch()); std::vector<std::string> researchProjects = ruleset->getResearchList(); const std::vector<ResearchProject *> & baseResearchProjects = base->getResearch(); std::vector<const RuleResearch *> unlocked; for(std::vector<const RuleResearch *>::const_iterator it = discovered.begin (); it != discovered.end (); ++it) { for(std::vector<std::string>::const_iterator itUnlocked = (*it)->getUnlocked ().begin (); itUnlocked != (*it)->getUnlocked ().end (); ++itUnlocked) { unlocked.push_back(ruleset->getResearch(*itUnlocked)); } } for(std::vector<std::string>::const_iterator iter = researchProjects.begin (); iter != researchProjects.end (); ++iter) { RuleResearch *research = ruleset->getResearch(*iter); if (!isResearchAvailable(research, unlocked, ruleset)) { continue; } std::vector<const RuleResearch *>::const_iterator itDiscovered = std::find(discovered.begin (), discovered.end (), research); if (itDiscovered != discovered.end ()) { continue; } if (std::find_if (baseResearchProjects.begin(), baseResearchProjects.end (), findRuleResearch(research)) != baseResearchProjects.end ()) { continue; } if (research->needItem() && base->getItems()->getItem(research->getName ()) == 0) { continue; } projects.push_back (research); } }