Hooks
static bool BeforeCvCityCitizens_GetSpecialistValue(CvCityCitizens* self, SpecialistTypes eSpecialist, int& result);static void AfterCvCityCitizens_GetSpecialistValue(CvCityCitizens* self, SpecialistTypes eSpecialist, int& result);static int ReplaceCvCityCitizens_GetSpecialistValue(int (*original)(CvCityCitizens*, SpecialistTypes), CvCityCitizens* self, SpecialistTypes eSpecialist);CivRegisterBefore<CivHooks::CvCityCitizens_GetSpecialistValue>(host, &BeforeCvCityCitizens_GetSpecialistValue);CivRegisterAfter<CivHooks::CvCityCitizens_GetSpecialistValue>(host, &AfterCvCityCitizens_GetSpecialistValue);CivRegisterReplace<CivHooks::CvCityCitizens_GetSpecialistValue>(host, &ReplaceCvCityCitizens_GetSpecialistValue);
Code
1101/// How valuable is eSpecialist?1102int CvCityCitizens::GetSpecialistValue(SpecialistTypes eSpecialist)1103{11041105 CvSpecialistInfo* pSpecialistInfo = GC.getSpecialistInfo(eSpecialist);1106 if (pSpecialistInfo == NULL)1107 {1108 //This function should NEVER be called with an invalid specialist info type.1109 CvAssert(pSpecialistInfo);1110 return 0;1111 }11121113 int iValue = 0;11141115 CvPlayer* pPlayer = m_pCity->GetPlayer();11161117 // factor in the fact that specialists may need less food1118 int iFoodConsumptionBonus = (pPlayer->isHalfSpecialistFood()) ? 1 : 0;11191120 // Yield Values1121 int iFoodYieldValue = (GC.getAI_CITIZEN_VALUE_FOOD() * (pPlayer->specialistYield(eSpecialist, YIELD_FOOD) + iFoodConsumptionBonus));1122 int iProductionYieldValue = (GC.getAI_CITIZEN_VALUE_PRODUCTION() * pPlayer->specialistYield(eSpecialist, YIELD_PRODUCTION));1123 int iGoldYieldValue = (GC.getAI_CITIZEN_VALUE_GOLD() * pPlayer->specialistYield(eSpecialist, YIELD_GOLD));1124 int iScienceYieldValue = (GC.getAI_CITIZEN_VALUE_SCIENCE() * pPlayer->specialistYield(eSpecialist, YIELD_SCIENCE));1125 int iCultureYieldValue = (GC.getAI_CITIZEN_VALUE_CULTURE() * m_pCity->GetCultureFromSpecialist(eSpecialist)); 1126#if defined(MOD_API_UNIFIED_YIELDS)1127 iCultureYieldValue += (GC.getAI_CITIZEN_VALUE_CULTURE() * pPlayer->specialistYield(eSpecialist, YIELD_CULTURE));1128#endif1129 int iFaithYieldValue = (GC.getAI_CITIZEN_VALUE_FAITH() * pPlayer->specialistYield(eSpecialist, YIELD_FAITH));1130#if defined(MOD_API_UNIFIED_YIELDS_TOURISM)1131 int iTourismYieldValue = (GC.getAI_CITIZEN_VALUE_CULTURE() * pPlayer->specialistYield(eSpecialist, YIELD_TOURISM));1132#endif1133#if defined(MOD_API_UNIFIED_YIELDS_GOLDEN_AGE)1134 int iGoldenAgeYieldValue = (GC.getAI_CITIZEN_VALUE_CULTURE() * pPlayer->specialistYield(eSpecialist, YIELD_GOLDEN_AGE_POINTS));1135#endif1136 int iGPPYieldValue = pSpecialistInfo->getGreatPeopleRateChange() * 3; // TODO: un-hardcode this1137 int iHappinessYieldValue = (m_pCity->GetPlayer()->isHalfSpecialistUnhappiness()) ? 5 : 0; // TODO: un-hardcode this1138 iHappinessYieldValue = m_pCity->GetPlayer()->IsEmpireUnhappy() ? iHappinessYieldValue * 2 : iHappinessYieldValue; // TODO: un-hardcode this11391140 // How much surplus food are we making?1141 int iExcessFoodTimes100 = m_pCity->getYieldRateTimes100(YIELD_FOOD, false) - (m_pCity->foodConsumption() * 100);11421143 bool bAvoidGrowth = IsAvoidGrowth();11441145 // City Focus1146 CityAIFocusTypes eFocus = GetFocusType();1147 if(eFocus == CITY_AI_FOCUS_TYPE_FOOD)1148 iFoodYieldValue *= 3;1149 else if(eFocus == CITY_AI_FOCUS_TYPE_PRODUCTION)1150 iProductionYieldValue *= 3;1151 else if(eFocus == CITY_AI_FOCUS_TYPE_GOLD)1152 iGoldYieldValue *= 3;1153 else if(eFocus == CITY_AI_FOCUS_TYPE_SCIENCE)1154 iScienceYieldValue *= 3;1155 else if(eFocus == CITY_AI_FOCUS_TYPE_CULTURE)1156#if defined(MOD_API_UNIFIED_YIELDS_TOURISM)1157 {1158 iCultureYieldValue *= 3;1159 iTourismYieldValue *= 2;1160 }1161#else1162 iCultureYieldValue *= 3;1163#endif1164 else if(eFocus == CITY_AI_FOCUS_TYPE_GOLD_GROWTH)1165 {1166 iFoodYieldValue *= 2;1167 iGoldYieldValue *= 2;1168 }1169 else if(eFocus == CITY_AI_FOCUS_TYPE_PROD_GROWTH)1170 {1171 iFoodYieldValue *= 2;1172 iProductionYieldValue *= 2;1173 }1174 else if(eFocus == CITY_AI_FOCUS_TYPE_FAITH)1175 {1176 iFaithYieldValue *= 3;1177 }1178 else if(eFocus == CITY_AI_FOCUS_TYPE_GREAT_PEOPLE)1179 {1180 iGPPYieldValue *= 3;1181 }11821183 // Food can be worth less if we don't want to grow1184 if(iExcessFoodTimes100 >= 0 && bAvoidGrowth)1185 {1186 // If we at least have enough Food to feed everyone, zero out the value of additional food1187 iFoodYieldValue = 0;1188 }1189 // We want to grow here1190 else1191 {1192 // If we have a non-default and non-food focus, only worry about getting to 0 food1193 if(eFocus != NO_CITY_AI_FOCUS_TYPE && eFocus != CITY_AI_FOCUS_TYPE_FOOD && eFocus != CITY_AI_FOCUS_TYPE_PROD_GROWTH && eFocus != CITY_AI_FOCUS_TYPE_GOLD_GROWTH)1194 {1195 int iFoodT100NeededFor0 = -iExcessFoodTimes100;11961197 if(iFoodT100NeededFor0 > 0)1198 {1199 iFoodYieldValue *= 8;1200 }1201 else1202 {1203 iFoodYieldValue /= 2;1204 }1205 }1206 // If our surplus is not at least 2, really emphasize food plots1207 else if(!bAvoidGrowth)1208 {1209 int iFoodT100NeededFor2 = 200 - iExcessFoodTimes100;12101211 if(iFoodT100NeededFor2 > 0)1212 {1213 iFoodYieldValue *= 8;1214 }1215 else if (eFocus != CITY_AI_FOCUS_TYPE_FOOD)1216 {1217 iFoodYieldValue /= 2;1218 }1219 }1220 }12211222 if((eFocus == NO_CITY_AI_FOCUS_TYPE || eFocus == CITY_AI_FOCUS_TYPE_PROD_GROWTH || eFocus == CITY_AI_FOCUS_TYPE_GOLD_GROWTH) && !bAvoidGrowth && m_pCity->getPopulation() < 5)1223 {1224 iFoodYieldValue *= 4;1225 }12261227 iValue += iFoodYieldValue;1228 iValue += iProductionYieldValue;1229 iValue += iGoldYieldValue;1230 iValue += iScienceYieldValue;1231 iValue += iCultureYieldValue;1232 iValue += iFaithYieldValue;1233#if defined(MOD_API_UNIFIED_YIELDS_TOURISM)1234 iValue += iTourismYieldValue;1235#endif1236#if defined(MOD_API_UNIFIED_YIELDS_GOLDEN_AGE)1237 iValue += iGoldenAgeYieldValue;1238#endif1239 iValue += iGPPYieldValue;1240 iValue += iHappinessYieldValue;12411242 return iValue;1243}