Hooks
static bool BeforeCvPlot_calculateNatureYield(const CvPlot* self, YieldTypes eYield, TeamTypes eTeam, bool bIgnoreFeature, int& result);static void AfterCvPlot_calculateNatureYield(const CvPlot* self, YieldTypes eYield, TeamTypes eTeam, bool bIgnoreFeature, int& result);static int ReplaceCvPlot_calculateNatureYield(int (*original)(const CvPlot*, YieldTypes, TeamTypes, bool), const CvPlot* self, YieldTypes eYield, TeamTypes eTeam, bool bIgnoreFeature);CivRegisterBefore<CivHooks::CvPlot_calculateNatureYield>(host, &BeforeCvPlot_calculateNatureYield);CivRegisterAfter<CivHooks::CvPlot_calculateNatureYield>(host, &AfterCvPlot_calculateNatureYield);CivRegisterReplace<CivHooks::CvPlot_calculateNatureYield>(host, &ReplaceCvPlot_calculateNatureYield);
Code
7816int CvPlot::calculateNatureYield(YieldTypes eYield, TeamTypes eTeam, bool bIgnoreFeature) const7817{7818 ResourceTypes eResource;7819 int iYield;7820 ReligionTypes eMajority = NO_RELIGION;7821 BeliefTypes eSecondaryPantheon = NO_BELIEF;78227823#if !defined(MOD_RELIGION_PLOT_YIELDS) && !defined(MOD_API_PLOT_YIELDS)7824 if(isImpassable() || isMountain())7825 {7826 // No Feature, or the Feature isn't a Natural Wonder (which are impassable but allowed to be worked)7827 if(getFeatureType() == NO_FEATURE || !GC.getFeatureInfo(getFeatureType())->IsNaturalWonder())7828 {7829 return 0;7830 }7831 }7832#endif78337834 const CvYieldInfo& kYield = *GC.getYieldInfo(eYield);78357836 CvCity* pWorkingCity = getWorkingCity();7837 if(pWorkingCity)7838 {7839 eMajority = pWorkingCity->GetCityReligions()->GetReligiousMajority();7840 eSecondaryPantheon = pWorkingCity->GetCityReligions()->GetSecondaryReligionPantheonBelief();7841 }78427843 CvAssertMsg(getTerrainType() != NO_TERRAIN, "TerrainType is not assigned a valid value");78447845#if defined(MOD_RELIGION_PLOT_YIELDS) || defined(MOD_API_PLOT_YIELDS)7846 // Impassable terrain and mountains have no base yield7847 if(isImpassable() || isMountain()) {7848 iYield = 0;7849 } else7850#endif7851 iYield = GC.getTerrainInfo(getTerrainType())->getYield(eYield);78527853#if defined(MOD_API_PLOT_YIELDS)7854 if (MOD_API_PLOT_YIELDS) {7855 iYield += GC.getPlotInfo(getPlotType())->getYield(eYield);7856 }7857#endif78587859 // Extra yield for religion on this terrain7860 if(pWorkingCity != NULL && eMajority != NO_RELIGION)7861 {7862 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());7863 if(pReligion)7864 {7865 int iReligionChange = pReligion->m_Beliefs.GetTerrainYieldChange(getTerrainType(), eYield);7866 if (eSecondaryPantheon != NO_BELIEF)7867 {7868 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetTerrainYieldChange(getTerrainType(), eYield);7869 }7870 7871#if defined(MOD_RELIGION_PLOT_YIELDS)7872 if (MOD_RELIGION_PLOT_YIELDS) {7873 iReligionChange += pReligion->m_Beliefs.GetPlotYieldChange(getPlotType(), eYield);7874 if (eSecondaryPantheon != NO_BELIEF)7875 {7876 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetPlotYieldChange(getPlotType(), eYield);7877 }7878 }7879#endif78807881 iYield += iReligionChange;7882 }7883 }78847885 if(isHills())7886 {7887 iYield += kYield.getHillsChange();7888 }78897890 if(isMountain())7891 {7892 iYield += kYield.getMountainChange();7893 }78947895 if(isLake())7896 {7897 iYield += kYield.getLakeChange();7898 }78997900 if(!bIgnoreFeature)7901 {7902 if(getFeatureType() != NO_FEATURE)7903 {7904 CvFeatureInfo* pFeatureInfo = GC.getFeatureInfo(getFeatureType());79057906 // Some Features REPLACE the Yield of the Plot instead of adding to it7907 int iYieldChange = pFeatureInfo->getYieldChange(eYield);79087909 // Player Trait7910 if(m_eOwner != NO_PLAYER && getImprovementType() == NO_IMPROVEMENT)7911 {7912 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).GetPlayerTraits()->GetUnimprovedFeatureYieldChange(getFeatureType(), eYield);7913#if defined(MOD_API_UNIFIED_YIELDS)7914 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).getUnimprovedFeatureYieldChange(getFeatureType(), eYield);79157916 if(pWorkingCity != NULL && eMajority != NO_RELIGION)7917 {7918 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());7919 if(pReligion)7920 {7921 int iReligionChange = pReligion->m_Beliefs.GetUnimprovedFeatureYieldChange(getFeatureType(), eYield);7922 if (eSecondaryPantheon != NO_BELIEF)7923 {7924 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetUnimprovedFeatureYieldChange(getFeatureType(), eYield);7925 }7926 iYieldChange += iReligionChange;7927 }7928 }7929#endif7930 }79317932 // Leagues7933 if(pWorkingCity != NULL)7934 {7935 iYieldChange += GC.getGame().GetGameLeagues()->GetFeatureYieldChange(pWorkingCity->getOwner(), getFeatureType(), eYield);7936 }79377938 // Religion7939 if(pWorkingCity != NULL && eMajority != NO_RELIGION)7940 {7941 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());7942 if(pReligion)7943 {7944 int iReligionChange = pReligion->m_Beliefs.GetFeatureYieldChange(getFeatureType(), eYield);7945 if (eSecondaryPantheon != NO_BELIEF)7946 {7947 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetFeatureYieldChange(getFeatureType(), eYield);7948 }7949 iYieldChange += iReligionChange;7950 }7951 }79527953#if defined(MOD_API_UNIFIED_YIELDS)7954 if(m_eOwner != NO_PLAYER)7955 {7956 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).getFeatureYieldChange(getFeatureType(), eYield);7957 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).GetPlayerTraits()->GetFeatureYieldChange(getFeatureType(), eYield);7958 }7959#endif79607961 // Natural Wonders7962 if(m_eOwner != NO_PLAYER && pFeatureInfo->IsNaturalWonder())7963 {7964 int iMod = 0;79657966 // Boost from religion in nearby city?7967 if(pWorkingCity && eMajority != NO_RELIGION)7968 {7969 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());7970 if(pReligion)7971 {7972 int iReligionChange = pReligion->m_Beliefs.GetYieldChangeNaturalWonder(eYield);7973 if (eSecondaryPantheon != NO_BELIEF)7974 {7975 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetYieldChangeNaturalWonder(eYield);7976 }7977 iYieldChange += iReligionChange;79787979 int iReligionMod = pReligion->m_Beliefs.GetYieldModifierNaturalWonder(eYield);7980 if (eSecondaryPantheon != NO_BELIEF)7981 {7982 iReligionMod += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetYieldModifierNaturalWonder(eYield);7983 }7984 iMod += iReligionMod;7985 }7986 }79877988 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).GetPlayerTraits()->GetYieldChangeNaturalWonder(eYield);7989#if defined(MOD_API_UNIFIED_YIELDS)7990 iYieldChange += GET_PLAYER((PlayerTypes)m_eOwner).GetYieldChangesNaturalWonder(eYield);7991#endif79927993 iMod += GET_PLAYER((PlayerTypes)m_eOwner).GetPlayerTraits()->GetNaturalWonderYieldModifier();7994 if(iMod > 0)7995 {7996 iYieldChange *= (100 + iMod);7997 iYieldChange /= 100;7998 }7999 }80008001 if(pFeatureInfo->isYieldNotAdditive())8002 {8003 iYield = iYieldChange;8004 }8005 else8006 {8007 iYield += iYieldChange;8008 }8009 }8010 }80118012 if(eTeam != NO_TEAM)8013 {8014 eResource = getResourceType(eTeam);80158016 if(eResource != NO_RESOURCE)8017 {8018 iYield += GC.getResourceInfo(eResource)->getYieldChange(eYield);80198020 // Extra yield for religion8021 if(pWorkingCity != NULL && eMajority != NO_RELIGION)8022 {8023 const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, pWorkingCity->getOwner());8024 if(pReligion)8025 {8026 int iReligionChange = pReligion->m_Beliefs.GetResourceYieldChange(eResource, eYield);8027 if (eSecondaryPantheon != NO_BELIEF)8028 {8029 iReligionChange += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetResourceYieldChange(eResource, eYield);8030 }8031 iYield += iReligionChange;8032 }8033 }80348035#if defined(MOD_API_UNIFIED_YIELDS)8036 if(m_eOwner != NO_PLAYER)8037 {8038 iYield += GET_PLAYER((PlayerTypes)m_eOwner).getResourceYieldChange(eResource, eYield);8039 iYield += GET_PLAYER((PlayerTypes)m_eOwner).GetPlayerTraits()->GetResourceYieldChange(eResource, eYield);8040 }8041#endif8042 }8043 }80448045 if(isRiver())8046 {8047 iYield += ((bIgnoreFeature || (getFeatureType() == NO_FEATURE)) ? GC.getTerrainInfo(getTerrainType())->getRiverYieldChange(eYield) : GC.getFeatureInfo(getFeatureType())->getRiverYieldChange(eYield));8048 }80498050 if(isHills())8051 {8052 iYield += ((bIgnoreFeature || (getFeatureType() == NO_FEATURE)) ? GC.getTerrainInfo(getTerrainType())->getHillsYieldChange(eYield) : GC.getFeatureInfo(getFeatureType())->getHillsYieldChange(eYield));8053 }80548055#if defined(MOD_API_UNIFIED_YIELDS)8056 if(isFreshWater())8057 {8058 iYield += ((bIgnoreFeature || (getFeatureType() == NO_FEATURE)) ? GC.getTerrainInfo(getTerrainType())->getFreshWaterYieldChange(eYield) : GC.getFeatureInfo(getFeatureType())->getFreshWaterYieldChange(eYield));8059 }80608061 if(isCoastalLand())8062 {8063 iYield += ((bIgnoreFeature || (getFeatureType() == NO_FEATURE)) ? GC.getTerrainInfo(getTerrainType())->getCoastalLandYieldChange(eYield) : GC.getFeatureInfo(getFeatureType())->getCoastalLandYieldChange(eYield));8064 }80658066 if(eTeam != NO_TEAM)8067 {8068 iYield += ((bIgnoreFeature || (getFeatureType() == NO_FEATURE)) ? GET_TEAM(eTeam).getTerrainYieldChange(getTerrainType(), eYield) : GET_TEAM(eTeam).getFeatureYieldChange(getFeatureType(), eYield));8069 }8070#endif80718072 return std::max(0, iYield);8073}