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]))); } } }
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; }
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))); } }
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; }