std::pair<std::vector<UnitTypes>, std::vector<UnitTypes> > getActualAndPossibleCombatUnits(const Player& player, const CvCity* pCity, DomainTypes domainType) { //#ifdef ALTAI_DEBUG // std::ostream& os = CivLog::getLog(*player.getCvPlayer())->getStream(); //#endif std::vector<UnitTypes> combatUnits, possibleCombatUnits; boost::shared_ptr<PlayerTactics> pTactics = player.getAnalysis()->getPlayerTactics(); for (PlayerTactics::UnitTacticsMap::const_iterator ci(pTactics->unitTacticsMap_.begin()), ciEnd(pTactics->unitTacticsMap_.end()); ci != ciEnd; ++ci) { if (ci->first != NO_UNIT) { //#ifdef ALTAI_DEBUG // os << "\nChecking unit: " << gGlobals.getUnitInfo(ci->first).getType(); //#endif const CvUnitInfo& unitInfo = gGlobals.getUnitInfo(ci->first); if (unitInfo.getDomainType() == domainType && unitInfo.getProductionCost() >= 0 && unitInfo.getCombat() > 0) { if (ci->second && !isUnitObsolete(player, player.getAnalysis()->getUnitInfo(ci->first))) { const boost::shared_ptr<UnitInfo> pUnitInfo = player.getAnalysis()->getUnitInfo(ci->first); bool depsSatisfied = false; if (pCity) { ICityUnitTacticsPtr pCityTactics = ci->second->getCityTactics(pCity->getIDInfo()); depsSatisfied = pCityTactics && pCityTactics->areDependenciesSatisfied(IDependentTactic::Ignore_None); } else { depsSatisfied = ci->second->areDependenciesSatisfied(player, IDependentTactic::Ignore_None); } bool couldConstruct = couldConstructUnit(player, 0, pUnitInfo, false); //#ifdef ALTAI_DEBUG // os << " deps = " << depsSatisfied << ", could construct = " << couldConstruct; //#endif if (depsSatisfied) { combatUnits.push_back(ci->first); possibleCombatUnits.push_back(ci->first); } else if (couldConstructUnit(player, 1, player.getAnalysis()->getUnitInfo(ci->first), true)) { possibleCombatUnits.push_back(ci->first); } } } } } return std::make_pair(combatUnits, possibleCombatUnits); }
IUnitTacticsPtr makeUnitTactics(const Player& player, const boost::shared_ptr<UnitInfo>& pUnitInfo) { const int lookAheadDepth = 2; if (couldConstructUnit(player, lookAheadDepth, pUnitInfo, true)) { const UnitTypes unitType = pUnitInfo->getUnitType(); const CvUnitInfo& unitInfo = gGlobals.getUnitInfo(unitType); IUnitTacticsPtr pTactic(new UnitTactic(unitType)); CityIter iter(*player.getCvPlayer()); while (CvCity* pCity = iter()) { #ifdef ALTAI_DEBUG CivLog::getLog(*player.getCvPlayer())->getStream() << "\n" << __FUNCTION__ << " Adding tactic for unit: " << unitInfo.getType(); #endif pTactic->addCityTactic(pCity->getIDInfo(), makeCityUnitTactics(player, player.getCity(pCity), pUnitInfo)); } MakeUnitTacticsDependenciesVisitor dependentTacticsVisitor(player, NULL); boost::apply_visitor(dependentTacticsVisitor, pUnitInfo->getInfo()); const std::vector<ResearchTechDependencyPtr>& dependentTechs = dependentTacticsVisitor.getTechDependencies(); for (size_t i = 0, count = dependentTechs.size(); i < count; ++i) { pTactic->addTechDependency(dependentTechs[i]); } return pTactic; } return IUnitTacticsPtr(); }
bool operator() (const UnitInfo::UpgradeNode& node) const { for (size_t i = 0, count = node.upgrades.size(); i < count; ++i) { UnitTypes upgradeUnit = getPlayerVersion(player_.getPlayerID(), node.upgrades[i]); if (upgradeUnit == NO_UNIT) // can't upgrade { return false; } if (!couldConstructUnit(player_, 0, player_.getAnalysis()->getUnitInfo(upgradeUnit), false)) { return false; } } return !node.upgrades.empty(); // can construct all upgrades, and there are some }