Bazaar developer reference

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

Called by