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}