Bazaar developer reference

CvPlot::calculateImprovementYieldChange(ImprovementTypes, YieldTypes, PlayerTypes, bool, RouteTypes) const

Defined in
CvPlot.cpp, line 8091
Class
CvPlot
Hook name
CivHooks::CvPlot_calculateImprovementYieldChange

Hooks

static bool BeforeCvPlot_calculateImprovementYieldChange(const CvPlot* self, ImprovementTypes eImprovement, YieldTypes eYield, PlayerTypes ePlayer, bool bOptimal, RouteTypes eAssumeThisRoute, int& result);static void AfterCvPlot_calculateImprovementYieldChange(const CvPlot* self, ImprovementTypes eImprovement, YieldTypes eYield, PlayerTypes ePlayer, bool bOptimal, RouteTypes eAssumeThisRoute, int& result);static int ReplaceCvPlot_calculateImprovementYieldChange(int (*original)(const CvPlot*, ImprovementTypes, YieldTypes, PlayerTypes, bool, RouteTypes), const CvPlot* self, ImprovementTypes eImprovement, YieldTypes eYield, PlayerTypes ePlayer, bool bOptimal, RouteTypes eAssumeThisRoute);CivRegisterBefore<CivHooks::CvPlot_calculateImprovementYieldChange>(host, &BeforeCvPlot_calculateImprovementYieldChange);CivRegisterAfter<CivHooks::CvPlot_calculateImprovementYieldChange>(host, &AfterCvPlot_calculateImprovementYieldChange);CivRegisterReplace<CivHooks::CvPlot_calculateImprovementYieldChange>(host, &ReplaceCvPlot_calculateImprovementYieldChange);

Code

8091int CvPlot::calculateImprovementYieldChange(ImprovementTypes eImprovement, YieldTypes eYield, PlayerTypes ePlayer, bool bOptimal, RouteTypes eAssumeThisRoute) const8092{8093	ResourceTypes eResource;8094	int iBestYield;8095	int iYield;8096	int iI;80978098	CvImprovementEntry* pImprovement = GC.getImprovementInfo(eImprovement);8099	if (!pImprovement)8100		return 0;81018102	iYield = pImprovement->GetYieldChange(eYield);81038104	int iYieldChangePerEra = pImprovement->GetYieldChangePerEra(eYield);8105	if (ePlayer != NO_PLAYER && iYieldChangePerEra > 0)8106	{8107		CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);81088109		int iPlotEra = GetArchaeologicalRecord().m_eEra;8110		int iNumEras = kPlayer.GetCurrentEra() - iPlotEra;81118112		if (iPlotEra != NO_ERA && iNumEras > 0)8113		{8114			iYield += (iNumEras * iYieldChangePerEra);8115		}8116	}81178118	if(isRiverSide())8119	{8120		iYield += pImprovement->GetRiverSideYieldChange(eYield);8121	}81228123	if(isCoastalLand())8124	{8125		iYield += pImprovement->GetCoastalLandYieldChange(eYield);8126	}81278128	if(isHills())8129	{8130		iYield += pImprovement->GetHillsYieldChange(eYield);8131	}8132	8133	// Check to see if there's a bonus to apply before doing any looping8134	if(pImprovement->GetAdjacentCityYieldChange(eYield) > 0 ||8135	        pImprovement->GetAdjacentMountainYieldChange(eYield) > 0)8136	{8137		for(iI = 0; iI < NUM_DIRECTION_TYPES; ++iI)8138		{8139			CvPlot* pAdjacentPlot = plotDirection(getX(), getY(), ((DirectionTypes)iI));81408141			if(pAdjacentPlot != NULL)8142			{8143				if(pAdjacentPlot->isCity())8144				{8145					// Is the owner of this Plot (with the Improvement) also the owner of an adjacent City?8146					if(pAdjacentPlot->getPlotCity()->getOwner() == getOwner())8147					{8148						iYield += pImprovement->GetAdjacentCityYieldChange(eYield);8149					}8150				}8151				else if(pAdjacentPlot->isMountain())8152				{8153					iYield += pImprovement->GetAdjacentMountainYieldChange(eYield);8154				}8155			}8156		}8157	}81588159#if defined(MOD_API_UNIFIED_YIELDS)8160	if(isFreshWater() || bOptimal)8161#else8162	if(bOptimal)8163#endif8164	{8165		iYield += pImprovement->GetFreshWaterYieldChange(eYield);8166	}81678168	if(bOptimal)8169	{8170		iBestYield = 0;81718172		for(iI = 0; iI < GC.getNumRouteInfos(); ++iI)8173		{8174			iBestYield = std::max(iBestYield, pImprovement->GetRouteYieldChanges(iI, eYield));8175		}81768177		iYield += iBestYield;8178	}8179	else8180	{8181		RouteTypes eRouteType = NO_ROUTE;8182		if(eAssumeThisRoute != NUM_ROUTE_TYPES)8183		{8184			eRouteType = eAssumeThisRoute;8185		}8186		else8187		{8188			eRouteType = getRouteType();8189		}81908191		if(eRouteType != NO_ROUTE)8192		{8193			iYield += pImprovement->GetRouteYieldChanges(eRouteType, eYield);8194		}8195	}81968197	bool bIsFreshWater = isFreshWater();81988199	if(bOptimal || ePlayer == NO_PLAYER)8200	{8201		for(iI = 0; iI < GC.getNumTechInfos(); ++iI)8202		{8203			iYield += pImprovement->GetTechYieldChanges(iI, eYield);82048205			if(bIsFreshWater)8206			{8207				iYield += pImprovement->GetTechFreshWaterYieldChanges(iI, eYield);8208			}8209			else8210			{8211				iYield += pImprovement->GetTechNoFreshWaterYieldChanges(iI, eYield);8212			}8213		}82148215		for(iI = 0; iI < GC.getNumPolicyInfos(); ++iI)8216		{8217			const PolicyTypes ePolicy = static_cast<PolicyTypes>(iI);8218			CvPolicyEntry* pkPolicyEntry = GC.getPolicyInfo(ePolicy);8219			if(pkPolicyEntry)8220			{8221				iYield += pkPolicyEntry->GetImprovementYieldChanges(eImprovement, eYield);8222			}8223		}8224	}8225	else8226	{8227		CvPlayerAI& kPlayer = GET_PLAYER(ePlayer);8228		CvTeam& kTeam = GET_TEAM(kPlayer.getTeam());82298230		iYield += kPlayer.getImprovementYieldChange(eImprovement, eYield);8231		iYield += kPlayer.GetPlayerTraits()->GetImprovementYieldChange(eImprovement, eYield);8232		iYield += kTeam.getImprovementYieldChange(eImprovement, eYield);82338234		if(bIsFreshWater)8235		{8236			iYield += kTeam.getImprovementFreshWaterYieldChange(eImprovement, eYield);8237		}8238		else8239		{8240			iYield += kTeam.getImprovementNoFreshWaterYieldChange(eImprovement, eYield);8241		}8242	}82438244	if(ePlayer != NO_PLAYER)8245	{8246		eResource = getResourceType(GET_PLAYER(ePlayer).getTeam());82478248		if(eResource != NO_RESOURCE)8249		{8250			iYield += pImprovement->GetImprovementResourceYield(eResource, eYield);8251		}8252	}82538254	// Working city8255	CvCity* pWorkingCity = getWorkingCity();8256	if(pWorkingCity)8257	{8258		ReligionTypes eMajority = pWorkingCity->GetCityReligions()->GetReligiousMajority();8259		if(eMajority != NO_RELIGION)8260		{8261			const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());8262			if(pReligion)8263			{8264				int iReligionChange = pReligion->m_Beliefs.GetImprovementYieldChange(eImprovement, eYield);8265				BeliefTypes eSecondaryPantheon = pWorkingCity->GetCityReligions()->GetSecondaryReligionPantheonBelief();8266				if (eSecondaryPantheon != NO_BELIEF)8267				{8268					iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetImprovementYieldChange(eImprovement, eYield);8269				}8270				iYield += iReligionChange;8271			}8272		}8273	}82748275	return iYield;8276}

Calls

Called by