Beispiel #1
0
        void operator() (const BuildingInfo::BaseNode& node)
        {
            pTactic_ = ICityBuildingTacticsPtr(new CityBuildingTactic(buildingType_, city_.getCvCity()->getIDInfo()));

            MakeBuildingTacticsDependenciesVisitor dependentTacticsVisitor(player_, city_, buildingType_);
            for (size_t i = 0, count = node.buildConditions.size(); i < count; ++i)
            {
                boost::apply_visitor(dependentTacticsVisitor, node.buildConditions[i]);
            }

            const std::vector<IDependentTacticPtr>& dependentTactics = dependentTacticsVisitor.getDependentTactics();
            for (size_t i = 0, count = dependentTactics.size(); i < count; ++i)
            {
                pTactic_->addDependency(dependentTactics[i]);
            }

            for (size_t i = 0, count = node.nodes.size(); i < count; ++i)
            {
                boost::apply_visitor(*this, node.nodes[i]);
            }

            if (node.happy > 0)
            {
                pTactic_->addTactic(ICityBuildingTacticPtr(new HappyBuildingTactic()));
                isEconomic_ = true;
            }

            if (node.health > 0)
            {
                pTactic_->addTactic(ICityBuildingTacticPtr(new HealthBuildingTactic()));
                isEconomic_ = true;
            }

            if (isEconomic_)
            {
                pTactic_->addTactic(ICityBuildingTacticPtr(new EconomicBuildingTactic()));
            }

            for (size_t i = 0, count = node.techs.size(); i < count; ++i)
            {
                if (player_.getTechResearchDepth(node.techs[i]) > 0)
                {
                    pTactic_->addTechDependency(ResearchTechDependencyPtr(new ResearchTechDependency(node.techs[i])));
                }
            }
        }
Beispiel #2
0
    IProcessTacticsPtr makeProcessTactics(const Player& player, ProcessTypes processType)
    {
        IProcessTacticsPtr pTactic = IProcessTacticsPtr(new ProcessTactic(processType));
        const CvProcessInfo& processInfo = gGlobals.getProcessInfo(processType);
        TechTypes techType = (TechTypes)processInfo.getTechPrereq();
        if (player.getTechResearchDepth(techType) > 0)
        {
            pTactic->addTechDependency(ResearchTechDependencyPtr(new ResearchTechDependency(techType)));

            for (int i = 0; i < NUM_COMMERCE_TYPES; ++i)
            {
                if (processInfo.getProductionToCommerceModifier(i) > 0)
                {
                    // todo - add tactics
                }
            }
        }

        return pTactic;
    }
Beispiel #3
0
        void operator() (const UnitInfo::BaseNode& node)
        {
            // always add bonus requirements, as cities' access can vary
            if (!node.andBonusTypes.empty())
            {
                dependentTactics_.push_back(IDependentTacticPtr(new CityBonusDependency(node.andBonusTypes, node.unitType, false)));
            }

            if (!node.orBonusTypes.empty())
            {
                dependentTactics_.push_back(IDependentTacticPtr(new CityBonusDependency(node.orBonusTypes, node.unitType, true)));
            }

            for (size_t i = 0, count = node.techTypes.size(); i < count; ++i)
            {
                if (player_.getTechResearchDepth(node.techTypes[i]) > 0)
                {
                    techDependencies_.push_back(ResearchTechDependencyPtr(new ResearchTechDependency(node.techTypes[i])));
                }
            }

            bool passedBuildingCheck = node.prereqBuildingType == NO_BUILDING;
            if (!passedBuildingCheck)
            {
                SpecialBuildingTypes specialBuildingType = (SpecialBuildingTypes)gGlobals.getBuildingInfo(node.prereqBuildingType).getSpecialBuildingType();
                if (specialBuildingType != NO_SPECIALBUILDING)
                {
                    passedBuildingCheck = player_.getCivHelper()->getSpecialBuildingNotRequiredCount(specialBuildingType) > 0;
                }
            }

            if (!passedBuildingCheck && pCity_)
            {
                passedBuildingCheck = pCity_->getNumBuilding(node.prereqBuildingType) > 0;
            }

            if (!passedBuildingCheck)
            {
                dependentTactics_.push_back(IDependentTacticPtr(new CityBuildingDependency(node.prereqBuildingType)));
            }
        }
Beispiel #4
0
    std::list<ICityImprovementTacticsPtr> makeCityBuildTactics(const Player& player, const City& city, const boost::shared_ptr<TechInfo>& pTechInfo)
    {
#ifdef ALTAI_DEBUG
        //player.getAnalysis()->recalcTechDepths();

        std::ostream& os = CivLog::getLog(*player.getCvPlayer())->getStream();
        os << "\nmakeCityBuildTactics: checking tech: " << gGlobals.getTechInfo(pTechInfo->getTechType()).getType();
#endif
        std::list<ICityImprovementTacticsPtr> cityBuildTactics;

        CityImprovementManager improvementManager(city.getCvCity()->getIDInfo(), true);
        TotalOutputWeights outputWeights = city.getPlotAssignmentSettings().outputWeights;

        improvementManager.simulateImprovements(outputWeights, __FUNCTION__);
        std::vector<CityImprovementManager::PlotImprovementData> baseImprovements = improvementManager.getImprovements();

        /*CityDataPtr pSimulationCityData(new CityData(city.getCvCity(), improvementManager.getImprovements(), improvementManager.getIncludeUnclaimedPlots()));
        std::vector<IProjectionEventPtr> events;
        events.push_back(IProjectionEventPtr(new ProjectionPopulationEvent()));

        ProjectionLadder base = getProjectedOutput(player, pSimulationCityData, 50, events);*/

        std::list<TechTypes> prereqTechs = pushTechAndPrereqs(pTechInfo->getTechType(), player);
#ifdef ALTAI_DEBUG
        os << " pushing techs: ";
        for (std::list<TechTypes>::const_iterator ci(prereqTechs.begin()), ciEnd(prereqTechs.end()); ci != ciEnd; ++ci)
        {
            os << gGlobals.getTechInfo(*ci).getType() << ", ";
        }
#endif
        TotalOutput baseCityOutput = improvementManager.simulateImprovements(outputWeights, __FUNCTION__);

        std::vector<CityImprovementManager::PlotImprovementData> newImprovements = improvementManager.getImprovements();
        MakeCityBuildTacticsVisitor visitor(player, city, newImprovements);
        boost::apply_visitor(visitor, pTechInfo->getInfo());

        const ICityImprovementTacticsPtr& pTactic = visitor.getTactic();
        if (pTactic)
        {
            pTactic->addDependency(ResearchTechDependencyPtr(new ResearchTechDependency(pTechInfo->getTechType())));

#ifdef ALTAI_DEBUG
            os << "\ncreated imp tactic: ";
            pTactic->debug(os);
#endif

            cityBuildTactics.push_back(pTactic);
        }

        /*pSimulationCityData = CityDataPtr(new CityData(city.getCvCity(), improvementManager.getImprovements(), improvementManager.getIncludeUnclaimedPlots()));
        events.clear();
        events.push_back(IProjectionEventPtr(new ProjectionPopulationEvent()));

        ProjectionLadder ladder = getProjectedOutput(player, pSimulationCityData, 50, events);
#ifdef ALTAI_DEBUG
        base.debug(os);
        ladder.debug(os);
        os << "\nImprovement delta = " << ladder.getOutput() - base.getOutput();
#endif*/

        for (std::list<TechTypes>::const_iterator ci(prereqTechs.begin()), ciEnd(prereqTechs.end()); ci != ciEnd; ++ci)
        {
            player.getCivHelper()->removeTech(*ci);
        }
        player.getCivHelper()->removeTech(pTechInfo->getTechType());

        return cityBuildTactics;
    }