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}