Hooks
static bool BeforeCvBuilderTaskingAI_IsImprovementBeneficial(CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK, bool& result);static void AfterCvBuilderTaskingAI_IsImprovementBeneficial(CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK, bool& result);static bool ReplaceCvBuilderTaskingAI_IsImprovementBeneficial(bool (*original)(CvBuilderTaskingAI*, CvPlot*, const CvBuildInfo&, YieldTypes, bool), CvBuilderTaskingAI* self, CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK);CivRegisterBefore<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &BeforeCvBuilderTaskingAI_IsImprovementBeneficial);CivRegisterAfter<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &AfterCvBuilderTaskingAI_IsImprovementBeneficial);CivRegisterReplace<CivHooks::CvBuilderTaskingAI_IsImprovementBeneficial>(host, &ReplaceCvBuilderTaskingAI_IsImprovementBeneficial);
Code
2055/// Determine if an improvement will increase any of the outputs of the plot2056bool CvBuilderTaskingAI::IsImprovementBeneficial(CvPlot* pPlot, const CvBuildInfo& kBuild, YieldTypes eYield, bool bIsBreakEvenOK)2057{2058 const ImprovementTypes eImprovement = (ImprovementTypes)kBuild.getImprovement();20592060 const FeatureTypes eFeature = pPlot->getFeatureType();20612062 bool bFeatureNeedsRemove = false;20632064 if(eFeature != NO_FEATURE)2065 {2066 if(kBuild.isFeatureRemove(eFeature))2067 {2068 bFeatureNeedsRemove = true;2069 }2070 }20712072 CvImprovementEntry* pkImprovementInfo = NULL;2073 if(eImprovement != NO_IMPROVEMENT)2074 {2075 pkImprovementInfo = GC.getImprovementInfo(eImprovement);2076 }2077 CvAssert(pkImprovementInfo);20782079 //This can technically happen if a build as passed in that doesn't contain an improvement..2080 //Returning false isn't the ideal error approach, but there's nothing better to do atm.2081 if(pkImprovementInfo == NULL)2082 {2083 return false;2084 }20852086 CvRouteInfo* pkPlotRouteInfo = NULL;2087 if(pPlot->getRouteType() != NO_ROUTE)2088 {2089 pkPlotRouteInfo = GC.getRouteInfo(pPlot->getRouteType());2090 }209120922093 int aiNaturalYieldTypes[NUM_YIELD_TYPES];2094 int aiImprovedYieldTypes[NUM_YIELD_TYPES];20952096 // hacky solution for the great artist's landmark.2097 // if an improvement generates culture, then it is beneficial2098 if(pkImprovementInfo->GetYieldChange(YIELD_CULTURE) > 0)2099 {2100 return true;2101 }21022103 for(uint ui = 0; ui < NUM_YIELD_TYPES; ui++)2104 {2105 // calculate natural yields2106 aiNaturalYieldTypes[ui] = 0;2107 aiNaturalYieldTypes[ui] = pPlot->calculateNatureYield((YieldTypes)ui, m_pPlayer->getTeam());21082109 // calculate improvement yields2110 aiImprovedYieldTypes[ui] = 0;21112112 bool bIgnoreFeature = false;2113 if(bFeatureNeedsRemove)2114 {2115 bIgnoreFeature = true;2116 }21172118 aiImprovedYieldTypes[ui] = pPlot->calculateNatureYield((YieldTypes)ui, m_pPlayer->getTeam(), bIgnoreFeature);2119 if(pkPlotRouteInfo)2120 {2121 aiImprovedYieldTypes[ui] += pkPlotRouteInfo->getYieldChange(ui);2122 }2123 aiImprovedYieldTypes[ui] += pPlot->calculateImprovementYieldChange(eImprovement, (YieldTypes)ui, m_pPlayer->GetID(), false /*bOptimal*/);2124 }21252126 if(eYield == NO_YIELD)2127 {2128 // if any of the yields are increased from their natural state, then the improvement is considered a success2129 for(uint ui = 0; ui < NUM_YIELD_TYPES; ui++)2130 {2131 if(bIsBreakEvenOK)2132 {2133 if(aiImprovedYieldTypes[ui] >= aiNaturalYieldTypes[ui])2134 {2135 return true;2136 }2137 }2138 else2139 {2140 if(aiImprovedYieldTypes[ui] > aiNaturalYieldTypes[ui])2141 {2142 return true;2143 }2144 }2145 }2146 }2147 else2148 {2149 if(bIsBreakEvenOK)2150 {2151 if(aiImprovedYieldTypes[eYield] >= aiNaturalYieldTypes[eYield])2152 {2153 return true;2154 }2155 }2156 else2157 {2158 if(aiImprovedYieldTypes[eYield] > aiNaturalYieldTypes[eYield])2159 {2160 return true;2161 }2162 }2163 }21642165 return false;2166}