示例#1
0
    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);
    }
示例#2
0
    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();
    }
示例#3
0
        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
        }