Bazaar developer reference

CvPlot::getYieldWithBuild(BuildTypes, YieldTypes, bool, PlayerTypes) const

Defined in
CvPlot.cpp, line 11157
Class
CvPlot
Hook name
CivHooks::CvPlot_getYieldWithBuild

Hooks

static bool BeforeCvPlot_getYieldWithBuild(const CvPlot* self, BuildTypes eBuild, YieldTypes eYield, bool bWithUpgrade, PlayerTypes ePlayer, int& result);static void AfterCvPlot_getYieldWithBuild(const CvPlot* self, BuildTypes eBuild, YieldTypes eYield, bool bWithUpgrade, PlayerTypes ePlayer, int& result);static int ReplaceCvPlot_getYieldWithBuild(int (*original)(const CvPlot*, BuildTypes, YieldTypes, bool, PlayerTypes), const CvPlot* self, BuildTypes eBuild, YieldTypes eYield, bool bWithUpgrade, PlayerTypes ePlayer);CivRegisterBefore<CivHooks::CvPlot_getYieldWithBuild>(host, &BeforeCvPlot_getYieldWithBuild);CivRegisterAfter<CivHooks::CvPlot_getYieldWithBuild>(host, &AfterCvPlot_getYieldWithBuild);CivRegisterReplace<CivHooks::CvPlot_getYieldWithBuild>(host, &ReplaceCvPlot_getYieldWithBuild);

Code

11157int CvPlot::getYieldWithBuild(BuildTypes eBuild, YieldTypes eYield, bool bWithUpgrade, PlayerTypes ePlayer) const11158{11159	int iYield;1116011161	const CvYieldInfo& kYield = *GC.getYieldInfo(eYield);11162	TeamTypes eTeam = GET_PLAYER(ePlayer).getTeam();1116311164	if(getTerrainType() == NO_TERRAIN)11165		return 0;1116611167	if(!isPotentialCityWork())11168		return 0;1116911170	bool bCity = false;1117111172	// Will the build remove the feature?11173	bool bIgnoreFeature = false;11174	if(getFeatureType() != NO_FEATURE)11175	{11176		if(GC.getBuildInfo(eBuild)->isFeatureRemove(getFeatureType()))11177			bIgnoreFeature = true;11178	}1117911180	// Nature yield11181	iYield = calculateNatureYield(eYield, getTeam(), bIgnoreFeature);1118211183	ImprovementTypes eImprovement = (ImprovementTypes)GC.getBuildInfo(eBuild)->getImprovement();1118411185	// If we're not changing the improvement that's here, use the improvement that's here already11186	if(eImprovement == NO_IMPROVEMENT)11187	{11188		if(!IsImprovementPillaged() || GC.getBuildInfo(eBuild)->isRepair())11189		{11190			eImprovement = getImprovementType();11191		}11192	}1119311194	if(eImprovement != NO_IMPROVEMENT)11195	{11196		if(bWithUpgrade)11197		{11198			//in the case that improvements upgrade, use 2 upgrade levels higher for the11199			//yield calculations.11200			ImprovementTypes eUpgradeImprovement = (ImprovementTypes)GC.getImprovementInfo(eImprovement)->GetImprovementUpgrade();11201			if(eUpgradeImprovement != NO_IMPROVEMENT)11202			{11203				//unless it's trade on a low food tile, in which case only use 1 level higher11204				if((eYield != YIELD_GOLD) || (getYield(YIELD_FOOD) >= GC.getFOOD_CONSUMPTION_PER_POPULATION()))11205				{11206					ImprovementTypes eUpgradeImprovement2 = (ImprovementTypes)GC.getImprovementInfo(eUpgradeImprovement)->GetImprovementUpgrade();11207					if(eUpgradeImprovement2 != NO_IMPROVEMENT)11208					{11209						eUpgradeImprovement = eUpgradeImprovement2;11210					}11211				}11212			}1121311214			if((eUpgradeImprovement != NO_IMPROVEMENT) && (eUpgradeImprovement != eImprovement))11215			{11216				eImprovement = eUpgradeImprovement;11217			}11218		}1121911220		iYield += calculateImprovementYieldChange(eImprovement, eYield, ePlayer, false);1122111222#if defined(MOD_API_UNIFIED_YIELDS)11223		if (getOwner() != NO_PLAYER)11224#else11225		if (eYield == YIELD_CULTURE && getOwner() != NO_PLAYER)11226#endif11227		{11228			CvImprovementEntry* pImprovement = GC.getImprovementInfo(eImprovement);11229#if defined(MOD_API_UNIFIED_YIELDS)11230			if(pImprovement && pImprovement->GetYieldChange(eYield) > 0)11231#else11232			if(pImprovement && pImprovement->GetYieldChange(YIELD_CULTURE) > 0)11233#endif11234			{11235#if defined(MOD_API_UNIFIED_YIELDS)11236				int iAdjacentCulture = pImprovement->GetYieldAdjacentSameType(eYield);11237#else11238				int iAdjacentCulture = pImprovement->GetCultureAdjacentSameType();11239#endif11240				if(iAdjacentCulture > 0)11241				{11242#if defined(MOD_API_UNIFIED_YIELDS)11243					iYield += ComputeYieldFromAdjacentImprovement(*pImprovement, eImprovement, eYield);11244#else11245					iYield += ComputeCultureFromAdjacentImprovement(*pImprovement, eImprovement);11246#endif11247				}11248			}1124911250#if defined(MOD_API_UNIFIED_YIELDS)11251			if (eYield == YIELD_CULTURE)11252			{11253#endif11254				iYield += GET_PLAYER(getOwner()).GetPlayerPolicies()->GetNumericModifier(POLICYMOD_EXTRA_CULTURE_FROM_IMPROVEMENTS);11255				iYield += GET_PLAYER(getOwner()).GetPlayerPolicies()->GetImprovementCultureChange(eImprovement);11256#if defined(MOD_API_UNIFIED_YIELDS)11257			}11258#endif11259		}11260	}1126111262	RouteTypes eRoute = (RouteTypes)GC.getBuildInfo(eBuild)->getRoute();1126311264	// If we're not changing the route that's here, use the route that's here already11265	if(eRoute == NO_ROUTE)11266	{11267		if(!IsRoutePillaged() || GC.getBuildInfo(eBuild)->isRepair())11268		{11269			eRoute = getRouteType();11270		}11271	}1127211273	if(eRoute != NO_ROUTE)11274	{11275		eImprovement = getImprovementType();11276		if(eImprovement != NO_IMPROVEMENT)11277		{11278			for(int iI = 0; iI < NUM_YIELD_TYPES; iI++)11279			{11280				iYield += GC.getImprovementInfo(eImprovement)->GetRouteYieldChanges(eRoute, iI);11281				if(getRouteType() != NO_ROUTE)11282				{11283					iYield -= GC.getImprovementInfo(eImprovement)->GetRouteYieldChanges(getRouteType(), iI);11284				}11285			}11286		}11287	}1128811289	CvCity* pCity = getPlotCity();1129011291	if(ePlayer != NO_PLAYER)11292	{11293		// City plot yield11294		if(pCity != NULL)11295		{11296			if(pCity->isRevealed(eTeam, false))11297			{11298				iYield += kYield.getCityChange();1129911300				if(kYield.getPopulationChangeDivisor() != 0)11301					iYield += (pCity->getPopulation() + kYield.getPopulationChangeOffset()) / kYield.getPopulationChangeDivisor();1130211303				bCity = true;11304			}11305		}1130611307		CvCity* pWorkingCity = getWorkingCity();1130811309		// Water plots11310		if(isWater())11311		{11312			if(!isImpassable() && !isMountain())11313			{11314				// Player sea plot yield11315				iYield += GET_PLAYER(ePlayer).getSeaPlotYield(eYield);1131611317				if(pWorkingCity != NULL)11318				{11319					if(pWorkingCity->isRevealed(eTeam, false))11320					{11321						int iCityYield;1132211323						// Worked lake plot11324						if(pWorkingCity->getLakePlotYield(eYield) > 0 && isLake())11325							iCityYield = pWorkingCity->getLakePlotYield(eYield);11326						// Worked sea plot11327						else11328							iCityYield = pWorkingCity->getSeaPlotYield(eYield);1132911330						iYield += iCityYield;11331					}11332				}1133311334				// Worked water resources11335				if(getResourceType(GET_PLAYER(ePlayer).getTeam()) != NO_RESOURCE)11336				{11337					if(pWorkingCity != NULL)11338					{11339						if(pWorkingCity->isRevealed(eTeam, false))11340							iYield += pWorkingCity->getSeaResourceYield(eYield);11341					}11342				}1134311344			}11345		}1134611347		// Worked river plot11348		if(isRiver())11349		{11350			if(!isImpassable() && !isMountain())11351			{11352				if(NULL != pWorkingCity)11353				{11354					if(pWorkingCity->isRevealed(eTeam, false))11355					{11356						iYield += pWorkingCity->getRiverPlotYield(eYield);11357					}11358				}11359			}11360		}1136111362		// Worked Feature extra yield (e.g. University bonus)11363		if(getFeatureType() != NO_FEATURE)11364		{11365			if(pWorkingCity != NULL)11366				iYield += pWorkingCity->GetFeatureExtraYield(getFeatureType(), eYield);11367		}113681136911370#if defined(MOD_API_UNIFIED_YIELDS) && defined(MOD_API_PLOT_YIELDS)11371		// Extra yield for plot11372		if(pWorkingCity != NULL)11373		{11374			iYield += pWorkingCity->GetPlotExtraYield(getPlotType(), eYield);11375		}11376#endif1137711378		// Extra yield for terrain11379		if(getTerrainType() != NO_TERRAIN)11380		{11381			if(pWorkingCity != NULL && !isImpassable() && !isMountain())11382			{11383				iYield += pWorkingCity->GetTerrainExtraYield(getTerrainType(), eYield);11384			}11385		}1138611387		ResourceTypes eResource = getResourceType(GET_PLAYER(ePlayer).getTeam());11388		if(eResource != NO_RESOURCE)11389		{11390			const CvResourceInfo* pkResourceInfo = GC.getResourceInfo(eResource);11391			if(pkResourceInfo != NULL && eTeam != NO_TEAM && GET_TEAM(eTeam).GetTeamTechs()->HasTech((TechTypes) pkResourceInfo->getTechReveal()))11392			{11393				if (pkResourceInfo->getPolicyReveal() == NO_POLICY || GET_PLAYER(ePlayer).GetPlayerPolicies()->HasPolicy((PolicyTypes)pkResourceInfo->getPolicyReveal()))11394				{11395					// Extra yield from resources11396					if(pWorkingCity != NULL)11397						iYield += pWorkingCity->GetResourceExtraYield(eResource, eYield);1139811399					// Extra yield from Resources with Trait11400					if(pkResourceInfo->getResourceUsage() == RESOURCEUSAGE_STRATEGIC)11401						iYield += GET_PLAYER(ePlayer).GetPlayerTraits()->GetYieldChangeStrategicResources(eYield);11402				}11403			}11404		}11405	}1140611407	if(bCity)11408	{11409		iYield = std::max(iYield, kYield.getMinCity());1141011411		// Mod for Player; used for Policies and such11412#if defined(MOD_BUGFIX_MINOR)11413		int iTemp = GET_PLAYER(getOwner()).GetCityYieldChangeTimes100(eYield);	// In hundreds - will be added to capitalYieldChange below11414#else11415		int iTemp = GET_PLAYER(getOwner()).GetCityYieldChange(eYield);	// In hundreds - will be added to capitalYieldChange below11416#endif11417#if defined(MOD_API_UNIFIED_YIELDS)11418		iTemp += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCityYieldChanges(eYield);11419#endif1142011421		// Coastal City Mod11422		if(pCity->isCoastal())11423		{11424			iYield += GET_PLAYER(getOwner()).GetCoastalCityYieldChange(eYield);11425#if defined(MOD_API_UNIFIED_YIELDS)11426			iYield += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCoastalCityYieldChanges(eYield);11427#endif11428		}1142911430		// Capital Mod11431		if(pCity->isCapital())11432		{11433#if defined(MOD_BUGFIX_MINOR)11434			iTemp += GET_PLAYER(getOwner()).GetCapitalYieldChangeTimes100(eYield);11435#else11436			iTemp += GET_PLAYER(getOwner()).GetCapitalYieldChange(eYield);11437#endif11438#if defined(MOD_API_UNIFIED_YIELDS)11439			iYield += GET_PLAYER(getOwner()).GetPlayerTraits()->GetCapitalYieldChanges(eYield);11440#endif1144111442			int iPerPopYield = pCity->getPopulation() * GET_PLAYER(getOwner()).GetCapitalYieldPerPopChange(eYield);11443			iPerPopYield /= 100;11444			iYield += iPerPopYield;11445		}1144611447		iYield += (iTemp / 100);11448	}1144911450	iYield += GC.getGame().getPlotExtraYield(m_iX, m_iY, eYield);1145111452	if(ePlayer != NO_PLAYER)11453	{11454		if(GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield) > 0)11455		{11456			if(iYield >= GET_PLAYER(ePlayer).getExtraYieldThreshold(eYield))11457			{11458				iYield += GC.getEXTRA_YIELD();11459			}11460		}1146111462		if(GET_PLAYER(ePlayer).isGoldenAge())11463		{11464			if(iYield >= kYield.getGoldenAgeYieldThreshold())11465			{11466				iYield += kYield.getGoldenAgeYield();11467			}11468		}11469	}1147011471	return std::max(0, iYield);11472}

Calls

Called by