Bazaar developer reference

CvCityCitizens::GetSpecialistValue(SpecialistTypes)

Defined in
CvCityCitizens.cpp, line 1102
Class
CvCityCitizens
Hook name
CivHooks::CvCityCitizens_GetSpecialistValue

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}

Calls

Called by