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
- CvCity::GetFeatureExtraYield(FeatureTypes, YieldTypes) const
- CvCity::getLakePlotYield(YieldTypes) const
- CvCity::GetPlotExtraYield(PlotTypes, YieldTypes) const
- CvCity::getPopulation(bool) const
- CvCity::GetResourceExtraYield(ResourceTypes, YieldTypes) const
- CvCity::getRiverPlotYield(YieldTypes) const
- CvCity::getSeaPlotYield(YieldTypes) const
- CvCity::getSeaResourceYield(YieldTypes) const
- CvCity::GetTerrainExtraYield(TerrainTypes, YieldTypes) const
- CvCity::isCapital() const
- CvCity::isCoastal(int) const
- CvCity::isRevealed(TeamTypes, bool) const
- CvGame::getActivePlayer() const
- CvGame::getActiveTeam()
- CvGame::getPlotExtraYield(int, int, YieldTypes) const
- CvGame::isDebugMode() const
- CvGlobals::getEXTRA_YIELD()
- CvGlobals::getGame()
- CvGlobals::getImprovementInfo(ImprovementTypes)
- CvGlobals::getResourceInfo(ResourceTypes)
- CvGlobals::getRouteInfo(RouteTypes)
- CvGlobals::getYieldInfo(YieldTypes)
- CvImprovementEntry::GetYieldAdjacentSameType(YieldTypes) const
- CvImprovementEntry::GetYieldChange(int) const
- CvPlayer::GetCapitalYieldChangeTimes100(YieldTypes) const
- CvPlayer::GetCapitalYieldPerPopChange(YieldTypes) const
- CvPlayer::GetCityYieldChangeTimes100(YieldTypes) const
- CvPlayer::GetCoastalCityYieldChange(YieldTypes) const
- CvPlayer::getExtraYieldThreshold(YieldTypes) const
- CvPlayer::GetPlayerPolicies() const
- CvPlayer::GetPlayerTraits() const
- CvPlayer::getPlotYieldChange(PlotTypes, YieldTypes) const
- CvPlayer::getSeaPlotYield(YieldTypes) const
- CvPlayer::getTeam() const
- CvPlayer::getTerrainYieldChange(TerrainTypes, YieldTypes) const
- CvPlayer::isGoldenAge() const
- CvPlayerAI::getPlayer(PlayerTypes)
- CvPlayerPolicies::GetImprovementCultureChange(ImprovementTypes)
- CvPlayerPolicies::GetNumericModifier(PolicyModifierType)
- CvPlayerPolicies::HasPolicy(PolicyTypes) const
- CvPlayerTraits::GetCapitalYieldChanges(YieldTypes) const
- CvPlayerTraits::GetCityYieldChanges(YieldTypes) const
- CvPlayerTraits::GetCoastalCityYieldChanges(YieldTypes) const
- CvPlayerTraits::GetPlotYieldChange(PlotTypes, YieldTypes) const
- CvPlayerTraits::GetTerrainYieldChange(TerrainTypes, YieldTypes) const
- CvPlayerTraits::GetYieldChangeStrategicResources(YieldTypes) const
- CvPlot::calculateImprovementYieldChange(ImprovementTypes, YieldTypes, PlayerTypes, bool, RouteTypes) const
- CvPlot::calculateNatureYield(YieldTypes, TeamTypes, bool) const
- CvPlot::ComputeYieldFromAdjacentImprovement(CvImprovementEntry &, ImprovementTypes, YieldTypes) const
- CvPlot::getFeatureType() const
- CvPlot::getImprovementType() const
- CvPlot::getOwner() const
- CvPlot::getPlotCity() const
- CvPlot::getPlotType() const
- CvPlot::getResourceType(TeamTypes) const
- CvPlot::getRevealedImprovementType(TeamTypes) const
- CvPlot::getRevealedOwner(TeamTypes) const
- CvPlot::getRevealedRouteType(TeamTypes) const
- CvPlot::getRouteType() const
- CvPlot::getTerrainType() const
- CvPlot::getWorkingCity() const
- CvPlot::getYield(YieldTypes) const
- CvPlot::isImpassable() const
- CvPlot::IsImprovementPillaged() const
- CvPlot::isLake() const
- CvPlot::isMountain() const
- CvPlot::isPotentialCityWork() const
- CvPlot::isRiver() const
- CvPlot::IsRoutePillaged() const
- CvPlot::isWater() const
- CvResourceInfo::getPolicyReveal() const
- CvResourceInfo::getResourceUsage() const
- CvResourceInfo::getTechReveal() const
- CvRouteInfo::getYieldChange(int) const
- CvTeam::getTeam(TeamTypes)
- CvTeam::GetTeamTechs() const
- CvTeamTechs::HasTech(TechTypes) const
- CvYieldInfo::getCityChange() const
- CvYieldInfo::getGoldenAgeYield() const
- CvYieldInfo::getGoldenAgeYieldThreshold() const
- CvYieldInfo::getMinCity() const
- CvYieldInfo::getPopulationChangeDivisor() const
- CvYieldInfo::getPopulationChangeOffset() const
std::max