Bazaar developer reference

CvBuilderTaskingAI::IsImprovementBeneficial(CvPlot *, const CvBuildInfo &, YieldTypes, bool)

Defined in
CvBuilderTaskingAI.cpp, line 2056
Class
CvBuilderTaskingAI
Hook name
CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial

Hooks

static bool BeforeCvBuilderTaskingAI_IsImprovementBeneficial(CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK, bool& result);static void AfterCvBuilderTaskingAI_IsImprovementBeneficial(CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK, bool& result);static bool ReplaceCvBuilderTaskingAI_IsImprovementBeneficial(bool (*original)(CvBuilderTaskingAI*, CvPlot*, const CvBuildInfo&, YieldTypes, bool), CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK);CivRegisterBefore<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &BeforeCvBuilderTaskingAI_IsImprovementBeneficial);CivRegisterAfter<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &AfterCvBuilderTaskingAI_IsImprovementBeneficial);CivRegisterReplace<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &ReplaceCvBuilderTaskingAI_IsImprovementBeneficial);

Code

2055/// Determine if an improvement will increase any of the outputs of the plot2056bool CvBuilderTaskingAI::IsImprovementBeneficial(CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK)2057{2058	const ImprovementTypes eImprovement = (ImprovementTypes)kBuild.getImprovement();20592060	const FeatureTypes eFeature = pPlot->getFeatureType();20612062	bool bFeatureNeedsRemove = false;20632064	if(eFeature != NO_FEATURE)2065	{2066		if(kBuild.isFeatureRemove(eFeature))2067		{2068			bFeatureNeedsRemove = true;2069		}2070	}20712072	CvImprovementEntry* pkImprovementInfo = NULL;2073	if(eImprovement != NO_IMPROVEMENT)2074	{2075		pkImprovementInfo = GC.getImprovementInfo(eImprovement);2076	}2077	CvAssert(pkImprovementInfo);20782079	//This can technically happen if a build as passed in that doesn't contain an improvement..2080	//Returning false isn't the ideal error approach, but there's nothing better to do atm.2081	if(pkImprovementInfo == NULL)2082	{2083		return false;2084	}20852086	CvRouteInfo* pkPlotRouteInfo = NULL;2087	if(pPlot->getRouteType() != NO_ROUTE)2088	{2089		pkPlotRouteInfo = GC.getRouteInfo(pPlot->getRouteType());2090	}209120922093	int aiNaturalYieldTypes[NUM_YIELD_TYPES];2094	int aiImprovedYieldTypes[NUM_YIELD_TYPES];20952096	// hacky solution for the great artist's landmark.2097	// if an improvement generates culture, then it is beneficial2098	if(pkImprovementInfo->GetYieldChange(YIELD_CULTURE) > 0)2099	{2100		return true;2101	}21022103	for(uint ui = 0; ui < NUM_YIELD_TYPES; ui++)2104	{2105		// calculate natural yields2106		aiNaturalYieldTypes[ui] = 0;2107		aiNaturalYieldTypes[ui] = pPlot->calculateNatureYield((YieldTypes)ui, m_pPlayer->getTeam());21082109		// calculate improvement yields2110		aiImprovedYieldTypes[ui] = 0;21112112		bool bIgnoreFeature = false;2113		if(bFeatureNeedsRemove)2114		{2115			bIgnoreFeature = true;2116		}21172118		aiImprovedYieldTypes[ui] = pPlot->calculateNatureYield((YieldTypes)ui, m_pPlayer->getTeam(), bIgnoreFeature);2119		if(pkPlotRouteInfo)2120		{2121			aiImprovedYieldTypes[ui] += pkPlotRouteInfo->getYieldChange(ui);2122		}2123		aiImprovedYieldTypes[ui] += pPlot->calculateImprovementYieldChange(eImprovement, (YieldTypes)ui, m_pPlayer->GetID(), false /*bOptimal*/);2124	}21252126	if(eYield == NO_YIELD)2127	{2128		// if any of the yields are increased from their natural state, then the improvement is considered a success2129		for(uint ui = 0; ui < NUM_YIELD_TYPES; ui++)2130		{2131			if(bIsBreakEvenOK)2132			{2133				if(aiImprovedYieldTypes[ui] >= aiNaturalYieldTypes[ui])2134				{2135					return true;2136				}2137			}2138			else2139			{2140				if(aiImprovedYieldTypes[ui] > aiNaturalYieldTypes[ui])2141				{2142					return true;2143				}2144			}2145		}2146	}2147	else2148	{2149		if(bIsBreakEvenOK)2150		{2151			if(aiImprovedYieldTypes[eYield] >= aiNaturalYieldTypes[eYield])2152			{2153				return true;2154			}2155		}2156		else2157		{2158			if(aiImprovedYieldTypes[eYield] > aiNaturalYieldTypes[eYield])2159			{2160				return true;2161			}2162		}2163	}21642165	return false;2166}

Calls