EconomicAIHelpers::IsTestStrategy_NeedImprovement(CvPlayer *, YieldTypes)
- Defined in
- CvEconomicAI.cpp, line 3785
- Hook name
CivHooks::EconomicAIHelpers_IsTestStrategy_NeedImprovement
Hooks
static bool BeforeEconomicAIHelpers_IsTestStrategy_NeedImprovement(CvPlayer* pPlayer, YieldTypes eYield, bool& result);static void AfterEconomicAIHelpers_IsTestStrategy_NeedImprovement(CvPlayer* pPlayer, YieldTypes eYield, bool& result);static bool ReplaceEconomicAIHelpers_IsTestStrategy_NeedImprovement(bool (*original)(CvPlayer*, YieldTypes), CvPlayer* pPlayer, YieldTypes eYield);CivRegisterBefore<CivHooks::EconomicAIHelpers_IsTestStrategy_NeedImprovement>(host, &BeforeEconomicAIHelpers_IsTestStrategy_NeedImprovement);CivRegisterAfter<CivHooks::EconomicAIHelpers_IsTestStrategy_NeedImprovement>(host, &AfterEconomicAIHelpers_IsTestStrategy_NeedImprovement);CivRegisterReplace<CivHooks::EconomicAIHelpers_IsTestStrategy_NeedImprovement>(host, &ReplaceEconomicAIHelpers_IsTestStrategy_NeedImprovement);
Code
3784/// "Need Improvement" Player Strategy: Do the cities need an improvement that increases a yield? Do we have access to an improvement that builds that yield?3785bool EconomicAIHelpers::IsTestStrategy_NeedImprovement(CvPlayer* pPlayer, YieldTypes eYield)3786{3787 // find the city strategy associated with this issue3788 AICityStrategyTypes eCityStrategy = NO_AICITYSTRATEGY;3789 switch(eYield)3790 {3791 case YIELD_FOOD:3792 eCityStrategy = (AICityStrategyTypes)GC.getInfoTypeForString("AICITYSTRATEGY_NEED_IMPROVEMENT_FOOD");3793 break;3794 case YIELD_PRODUCTION:3795 eCityStrategy = (AICityStrategyTypes)GC.getInfoTypeForString("AICITYSTRATEGY_NEED_IMPROVEMENT_PRODUCTION");3796 break;3797 }37983799 FAssertMsg(eCityStrategy != NO_AICITYSTRATEGY, "No strategy found. What?");3800 if(eCityStrategy == NO_AICITYSTRATEGY)3801 {3802 return false;3803 }38043805 // if enough cities are worried about this problem3806 int iNumCities = pPlayer->getNumCities();3807 if(iNumCities == 0)3808 {3809 return false; // no cities, no problem!3810 }38113812 int iCityLoop = 0;3813 CvCity* pLoopCity = NULL;3814 int iNumCitiesConcerned = 0;3815 for(pLoopCity = pPlayer->firstCity(&iCityLoop); pLoopCity != NULL; pLoopCity = pPlayer->nextCity(&iCityLoop))3816 {3817 if(pLoopCity->GetCityStrategyAI()->IsUsingCityStrategy(eCityStrategy))3818 {3819 iNumCitiesConcerned++;3820 }3821 }38223823 double fWarningRatio = GC.getAI_STRATEGY_NEED_IMPROVEMENT_CITY_RATIO();38243825 // if not enough cities are upset3826 if((iNumCitiesConcerned / (double)iNumCities) < fWarningRatio)3827 {3828 return false;3829 }38303831 // see if there's a builder3832 int iUnitLoop = 0;3833 CvUnit* pLoopUnit = NULL;3834 CvUnit* pBuilder = NULL;3835 for(pLoopUnit = pPlayer->firstUnit(&iUnitLoop); pLoopUnit != NULL; pLoopUnit = pPlayer->nextUnit(&iUnitLoop))3836 {3837 if(pLoopUnit->AI_getUnitAIType() == UNITAI_WORKER)3838 {3839 pBuilder = pLoopUnit;3840 break;3841 }3842 }38433844 // if no builder, ignore3845 // perhaps prompt a builder?3846 if(!pBuilder)3847 {3848 return false;3849 }38503851 // is there a build that I can create to improve the yield?38523853 // loop through the build types to find one that we can use3854 BuildTypes eBuild;3855 int iBuildIndex;3856 for(iBuildIndex = 0; iBuildIndex < GC.getNumBuildInfos(); iBuildIndex++)3857 {3858 eBuild = (BuildTypes)iBuildIndex;3859 CvBuildInfo* pkBuildInfo = GC.getBuildInfo(eBuild);3860 if(pkBuildInfo)3861 {3862 if(pkBuildInfo->getTechPrereq() != NO_TECH)3863 {3864 if(!(GET_TEAM(pPlayer->getTeam()).GetTeamTechs()->HasTech((TechTypes)GC.getBuildInfo(eBuild)->getTechPrereq())))3865 {3866 // don't have the tech needed for this build, so look at the next one3867 continue;3868 }3869 }38703871 ImprovementTypes eImprovement = (ImprovementTypes)GC.getBuildInfo(eBuild)->getImprovement();3872 if(eImprovement == NO_IMPROVEMENT)3873 {3874 continue;3875 }38763877 CvPlotsVector& aPlots = pPlayer->GetPlots();3878 bool bCanBuild = false;3879 for(uint ui = 0; ui < aPlots.size(); ui++)3880 {3881 if(aPlots[ui] < 0)3882 {3883 break;3884 }38853886 CvPlot* pPlot = GC.getMap().plotByIndex(aPlots[ui]);3887 if(pPlayer->canBuild(pPlot, eBuild, false /*test era*/, false /*test visible*/, false /*test gold*/))3888 {3889 bCanBuild = true;3890 break;3891 }3892 }38933894 if(!bCanBuild)3895 {3896 continue;3897 }38983899 // we can use an improvement that increases the yield3900 if(GC.getImprovementInfo(eImprovement)->GetYieldChange(eYield) > 0)3901 {3902 return false;3903 }3904 }3905 }39063907 return true;3908}
Calls
BaseVector::operator[]BaseVector::size- CvBuildInfo::getImprovement() const
- CvBuildInfo::getTechPrereq() const
- CvCity::GetCityStrategyAI() const
- CvCityStrategyAI::IsUsingCityStrategy(AICityStrategyTypes)
- CvGlobals::getAI_STRATEGY_NEED_IMPROVEMENT_CITY_RATIO()
- CvGlobals::getBuildInfo(BuildTypes)
- CvGlobals::getImprovementInfo(ImprovementTypes)
- CvGlobals::getInfoTypeForString(const char *, bool) const
- CvGlobals::getMap()
- CvGlobals::getNumBuildInfos()
- CvImprovementEntry::GetYieldChange(int) const
- CvMap::plotByIndex(int) const
- CvPlayer::canBuild(const CvPlot *, BuildTypes, bool, bool, bool, bool) const
- CvPlayer::firstCity(int *, bool)
- CvPlayer::firstUnit(int *, bool)
- CvPlayer::getNumCities() const
- CvPlayer::GetPlots()
- CvPlayer::getTeam() const
- CvPlayer::nextCity(int *, bool)
- CvPlayer::nextUnit(int *, bool)
- CvTeam::getTeam(TeamTypes)
- CvTeam::GetTeamTechs() const
- CvTeamTechs::HasTech(TechTypes) const
- CvUnit::AI_getUnitAIType() const