Bazaar developer reference

CvPlot::calculateYield(YieldTypes, bool)

Defined in
CvPlot.cpp, line 8280
Class
CvPlot
Hook name
CivHooks::CvPlot_calculateYield

The game stores each tile's yields and calls this to work them out again only when something about the tile changes, so a new rule hooked here shows on a tile from its next such change. CvPlot::getYield reads the stored yields.

Hooks

static bool BeforeCvPlot_calculateYield(CvPlot* self, YieldTypes eYield, bool bDisplay, int& result);static void AfterCvPlot_calculateYield(CvPlot* self, YieldTypes eYield, bool bDisplay, int& result);static int ReplaceCvPlot_calculateYield(int (*original)(CvPlot*, YieldTypes, bool), CvPlot* self, YieldTypes eYield, bool bDisplay);CivRegisterBefore<CivHooks::CvPlot_calculateYield>(host, &BeforeCvPlot_calculateYield);CivRegisterAfter<CivHooks::CvPlot_calculateYield>(host, &AfterCvPlot_calculateYield);CivRegisterReplace<CivHooks::CvPlot_calculateYield>(host, &ReplaceCvPlot_calculateYield);

Code

8280int CvPlot::calculateYield(YieldTypes eYield, bool bDisplay)8281{8282	CvCity* pCity = 0;8283	CvCity* pWorkingCity = 0;8284	ImprovementTypes eImprovement = NO_IMPROVEMENT;8285	RouteTypes eRoute = NO_ROUTE;8286	PlayerTypes ePlayer = NO_PLAYER;8287	bool bCity = false;8288	int iYield = 0;82898290	const CvYieldInfo& kYield = *GC.getYieldInfo(eYield);82918292	if(bDisplay && GC.getGame().isDebugMode())8293	{8294		return getYield(eYield);8295	}82968297	if(getTerrainType() == NO_TERRAIN)8298	{8299		return 0;8300	}83018302	if(!isPotentialCityWork())8303	{8304		return 0;8305	}83068307	bCity = false;83088309	if(bDisplay)8310	{8311		ePlayer = getRevealedOwner(GC.getGame().getActiveTeam());8312		eImprovement = getRevealedImprovementType(GC.getGame().getActiveTeam());8313		eRoute = getRevealedRouteType(GC.getGame().getActiveTeam());83148315		if(ePlayer == NO_PLAYER)8316		{8317			ePlayer = GC.getGame().getActivePlayer();8318		}8319	}8320	else8321	{8322		ePlayer = getOwner();8323		eImprovement = getImprovementType();8324		eRoute = getRouteType();8325	}83268327	iYield = calculateNatureYield(eYield, ((ePlayer != NO_PLAYER) ? GET_PLAYER(ePlayer).getTeam() : NO_TEAM));83288329#if defined(MOD_API_UNIFIED_YIELDS)8330	if (ePlayer != NO_PLAYER) {8331		CvPlayer& kPlayer = GET_PLAYER(ePlayer);8332#if defined(MOD_API_PLOT_YIELDS)8333		iYield += kPlayer.GetPlayerTraits()->GetPlotYieldChange(getPlotType(), eYield);8334		iYield += kPlayer.getPlotYieldChange(getPlotType(), eYield);8335#endif8336		iYield += kPlayer.GetPlayerTraits()->GetTerrainYieldChange(getTerrainType(), eYield);8337		iYield += kPlayer.getTerrainYieldChange(getTerrainType(), eYield);8338	}8339#endif83408341	if(eImprovement != NO_IMPROVEMENT && !IsImprovementPillaged())8342	{8343		int iCultureBoost = calculateImprovementYieldChange(eImprovement, eYield, ePlayer);8344		iYield += iCultureBoost;83458346#if !defined(MOD_API_UNIFIED_YIELDS)8347		if(eYield == YIELD_CULTURE)8348#endif8349		{8350			CvImprovementEntry* pImprovement = GC.getImprovementInfo(eImprovement);8351#if defined(MOD_API_UNIFIED_YIELDS)8352			if(pImprovement && pImprovement->GetYieldChange(eYield) > 0)8353#else8354			if(pImprovement && pImprovement->GetYieldChange(YIELD_CULTURE) > 0)8355#endif8356			{8357#if defined(MOD_API_UNIFIED_YIELDS)8358				int iAdjacentCulture = pImprovement->GetYieldAdjacentSameType(eYield);8359#else8360				int iAdjacentCulture = pImprovement->GetCultureAdjacentSameType();8361#endif8362				if(iAdjacentCulture > 0)8363				{8364#if defined(MOD_API_UNIFIED_YIELDS)8365					iYield += ComputeYieldFromAdjacentImprovement(*pImprovement, eImprovement, eYield);8366#else8367					iYield += ComputeCultureFromAdjacentImprovement(*pImprovement, eImprovement);8368#endif8369				}8370			}8371#if defined(MOD_API_UNIFIED_YIELDS)8372			if(eYield == YIELD_CULTURE && getOwner() != NO_PLAYER)8373#else8374			if(getOwner() != NO_PLAYER)8375#endif8376			{8377				iYield += GET_PLAYER(getOwner()).GetPlayerPolicies()->GetNumericModifier(POLICYMOD_EXTRA_CULTURE_FROM_IMPROVEMENTS);8378				iYield += GET_PLAYER(getOwner()).GetPlayerPolicies()->GetImprovementCultureChange(eImprovement);8379			}8380		}8381	}83828383	if(eRoute != NO_ROUTE && !IsRoutePillaged())8384	{8385		CvRouteInfo* pkRouteInfo = GC.getRouteInfo(eRoute);8386		if(pkRouteInfo)8387		{8388			iYield += pkRouteInfo->getYieldChange(eYield);8389		}8390	}83918392	if(ePlayer != NO_PLAYER)8393	{8394		pCity = getPlotCity();83958396		if(pCity != NULL)8397		{8398			if(!bDisplay || pCity->isRevealed(GC.getGame().getActiveTeam(), false))8399			{8400				iYield += kYield.getCityChange();84018402				if(kYield.getPopulationChangeDivisor() != 0)8403				{8404					iYield += (pCity->getPopulation() + kYield.getPopulationChangeOffset()) / kYield.getPopulationChangeDivisor();8405				}8406				bCity = true;8407			}8408		}84098410		pWorkingCity = getWorkingCity();84118412		if(isWater())8413		{8414			if(!isImpassable() && !isMountain())8415			{8416				iYield += GET_PLAYER(ePlayer).getSeaPlotYield(eYield);84178418				if(pWorkingCity != NULL)8419				{8420					if(!bDisplay || pWorkingCity->isRevealed(GC.getGame().getActiveTeam(), false))8421					{8422						int iCityYield = 0;8423						if (isLake())8424						{8425							if (pWorkingCity->getLakePlotYield(eYield) > 0)8426							{8427								iCityYield = pWorkingCity->getLakePlotYield(eYield);8428							}8429						}8430						else8431						{8432							iCityYield = pWorkingCity->getSeaPlotYield(eYield);8433						}8434						iYield += iCityYield;8435					}8436				}84378438				if(getResourceType(GET_PLAYER(ePlayer).getTeam()) != NO_RESOURCE)8439				{8440					if(pWorkingCity != NULL)8441					{8442						if(!bDisplay || pWorkingCity->isRevealed(GC.getGame().getActiveTeam(), false))8443						{8444							iYield += pWorkingCity->getSeaResourceYield(eYield);8445						}8446					}8447				}84488449			}8450		}84518452		if(isRiver())8453		{8454			if(!isImpassable() && !isMountain())8455			{8456				if(NULL != pWorkingCity)8457				{8458					if(!bDisplay || pWorkingCity->isRevealed(GC.getGame().getActiveTeam(), false))8459					{8460						iYield += pWorkingCity->getRiverPlotYield(eYield);8461					}8462				}8463			}8464		}84658466		// Extra yield for features8467		if(getFeatureType() != NO_FEATURE)8468		{8469			if(pWorkingCity != NULL)8470			{8471				iYield += pWorkingCity->GetFeatureExtraYield(getFeatureType(), eYield);8472			}8473		}84748475#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)8476		// Extra yield for plot8477		if(pWorkingCity != NULL)8478		{8479			iYield += pWorkingCity->GetPlotExtraYield(getPlotType(), eYield);8480		}8481#endif84828483		// Extra yield for terrain8484		if(getTerrainType() != NO_TERRAIN)8485		{8486			if(pWorkingCity != NULL && !isImpassable() && !isMountain())8487			{8488				iYield += pWorkingCity->GetTerrainExtraYield(getTerrainType(), eYield);8489			}8490		}84918492		ResourceTypes eResource = getResourceType(GET_PLAYER(ePlayer).getTeam());8493		if(eResource != NO_RESOURCE)8494		{8495			TeamTypes eTeam = GET_PLAYER(ePlayer).getTeam();8496			const CvResourceInfo* pkResourceInfo = GC.getResourceInfo(eResource);8497			if(pkResourceInfo != NULL && eTeam != NO_TEAM && GET_TEAM(eTeam).GetTeamTechs()->HasTech((TechTypes) pkResourceInfo->getTechReveal()))8498			{8499				if (pkResourceInfo->getPolicyReveal() == NO_POLICY || GET_PLAYER(ePlayer).GetPlayerPolicies()->HasPolicy((PolicyTypes)pkResourceInfo->getPolicyReveal()))8500				{8501					// Extra yield from resources8502					if(pWorkingCity != NULL)8503						iYield += pWorkingCity->GetResourceExtraYield(eResource, eYield);85048505					// Extra yield from Trait8506					if(pkResourceInfo->getResourceUsage() == RESOURCEUSAGE_STRATEGIC)8507					{8508						iYield += GET_PLAYER(ePlayer).GetPlayerTraits()->GetYieldChangeStrategicResources(eYield);8509					}8510				}8511			}8512		}8513	}85148515	if(bCity)8516	{8517		iYield = std::max(iYield, kYield.getMinCity());85188519		// Mod for Player; used for Policies and such8520#if defined(MOD_BUGFIX_MINOR)8521		int iTemp = GET_PLAYER(getOwner()).GetCityYieldChangeTimes100(eYield);	// In hundreds - will be added to capitalYieldChange below8522#else8523		int iTemp = GET_PLAYER(getOwner()).GetCityYieldChange(eYield);	// In hundreds - will be added to capitalYieldChange below8524#endif8525#if defined(MOD_API_UNIFIED_YIELDS)8526		iYield += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCityYieldChanges(eYield);8527#endif85288529		// Coastal City Mod8530		if(pCity->isCoastal())8531		{8532			iYield += GET_PLAYER(getOwner()).GetCoastalCityYieldChange(eYield);8533#if defined(MOD_API_UNIFIED_YIELDS)8534			iYield += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCoastalCityYieldChanges(eYield);8535#endif8536		}85378538		// Capital Mod8539		if(pCity->isCapital())8540		{8541#if defined(MOD_BUGFIX_MINOR)8542			iTemp += GET_PLAYER(getOwner()).GetCapitalYieldChangeTimes100(eYield);8543#else8544			iTemp += GET_PLAYER(getOwner()).GetCapitalYieldChange(eYield);8545#endif8546#if defined(MOD_API_UNIFIED_YIELDS)8547			iYield += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCapitalYieldChanges(eYield);8548#endif85498550			int iPerPopYield = pCity->getPopulation() * GET_PLAYER(getOwner()).GetCapitalYieldPerPopChange(eYield);8551			iPerPopYield /= 100;8552			iYield += iPerPopYield;8553		}85548555		iYield += (iTemp / 100);8556	}85578558	iYield += GC.getGame().getPlotExtraYield(m_iX, m_iY, eYield);85598560	if(ePlayer != NO_PLAYER)8561	{8562		if(GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield) > 0)8563		{8564			if(iYield >= GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield))8565			{8566				iYield += GC.getEXTRA_YIELD();8567			}8568		}85698570		if(GET_PLAYER(ePlayer).isGoldenAge())8571		{8572			if(iYield >= kYield.getGoldenAgeYieldThreshold())8573			{8574				iYield += kYield.getGoldenAgeYield();8575			}8576		}8577	}85788579	return std::max(0, iYield);8580}

Calls

Called by