Bazaar developer reference

CvCityCitizens::DoSpecialists()

Defined in
CvCityCitizens.cpp, line 2170
Class
CvCityCitizens
Hook name
CivHooks::CvCityCitizens_DoSpecialists

Hooks

static bool BeforeCvCityCitizens_DoSpecialists(CvCityCitizens* self);static void AfterCvCityCitizens_DoSpecialists(CvCityCitizens* self);static void ReplaceCvCityCitizens_DoSpecialists(void (*original)(CvCityCitizens*), CvCityCitizens* self);CivRegisterBefore<CivHooks::CvCityCitizens_DoSpecialists>(host, &BeforeCvCityCitizens_DoSpecialists);CivRegisterAfter<CivHooks::CvCityCitizens_DoSpecialists>(host, &AfterCvCityCitizens_DoSpecialists);CivRegisterReplace<CivHooks::CvCityCitizens_DoSpecialists>(host, &ReplaceCvCityCitizens_DoSpecialists);

Code

2169/// Called at the end of every turn: Looks at the specialists in this City and levels them up2170void CvCityCitizens::DoSpecialists()2171{2172	int iGPPChange;2173	int iCount;2174	int iMod;2175	for(int iSpecialistLoop = 0; iSpecialistLoop < GC.getNumSpecialistInfos(); iSpecialistLoop++)2176	{2177		const SpecialistTypes eSpecialist = static_cast<SpecialistTypes>(iSpecialistLoop);2178		CvSpecialistInfo* pkSpecialistInfo = GC.getSpecialistInfo(eSpecialist);2179		if(pkSpecialistInfo)2180		{2181			int iGPThreshold = GetSpecialistUpgradeThreshold((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass());21822183			// Does this Specialist spawn a GP?2184			if(pkSpecialistInfo->getGreatPeopleUnitClass() != NO_UNITCLASS)2185			{2186				iCount = GetSpecialistCount(eSpecialist);21872188				// GPP from Specialists2189				iGPPChange = pkSpecialistInfo->getGreatPeopleRateChange() * iCount * 100;21902191				// GPP from Buildings2192				iGPPChange += GetBuildingGreatPeopleRateChanges(eSpecialist) * 100;21932194				if(iGPPChange > 0)2195				{2196					iMod = 0;21972198					// City mod2199					iMod += GetCity()->getGreatPeopleRateModifier();22002201					// Player mod2202					iMod += GetPlayer()->getGreatPeopleRateModifier();22032204					// Player and Golden Age mods to this specific class2205					if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_SCIENTIST"))2206					{2207						iMod += GetPlayer()->getGreatScientistRateModifier();2208					}2209					else if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_WRITER"))2210					{ 2211						if (GetPlayer()->isGoldenAge())2212						{2213							iMod += GetPlayer()->GetPlayerTraits()->GetGoldenAgeGreatWriterRateModifier();2214						}2215						iMod += GetPlayer()->getGreatWriterRateModifier();2216					}2217					else if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_ARTIST"))2218					{2219						if (GetPlayer()->isGoldenAge())2220						{2221							iMod += GetPlayer()->GetPlayerTraits()->GetGoldenAgeGreatArtistRateModifier();2222						}2223						iMod += GetPlayer()->getGreatArtistRateModifier();2224					}2225					else if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_MUSICIAN"))2226					{2227						if (GetPlayer()->isGoldenAge())2228						{2229							iMod += GetPlayer()->GetPlayerTraits()->GetGoldenAgeGreatMusicianRateModifier();2230						}2231						iMod += GetPlayer()->getGreatMusicianRateModifier();2232					}2233					else if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_MERCHANT"))2234					{2235						iMod += GetPlayer()->getGreatMerchantRateModifier();2236					}2237					else if((UnitClassTypes)pkSpecialistInfo->getGreatPeopleUnitClass() == GC.getInfoTypeForString("UNITCLASS_ENGINEER"))2238					{2239						iMod += GetPlayer()->getGreatEngineerRateModifier();2240					}22412242#if defined(MOD_API_UNIFIED_YIELDS)2243					if (GetPlayer()->isGoldenAge())2244					{2245						GreatPersonTypes eGreatPerson = GetGreatPersonFromSpecialist(eSpecialist);22462247						iMod += GetPlayer()->getGoldenAgeGreatPersonRateModifier(eGreatPerson);2248						iMod += GetPlayer()->GetPlayerTraits()->GetGoldenAgeGreatPersonRateModifier(eGreatPerson);22492250						ReligionTypes eMajority = GetCity()->GetCityReligions()->GetReligiousMajority();2251						if(eMajority != NO_RELIGION)2252						{2253							const CvReligion* pReligion = GC.getGame().GetGameReligions()->GetReligion(eMajority, GetCity()->getOwner());2254							if(pReligion)2255							{2256								iMod += pReligion->m_Beliefs.GetGoldenAgeGreatPersonRateModifier(eGreatPerson);2257								BeliefTypes eSecondaryPantheon = GetCity()->GetCityReligions()->GetSecondaryReligionPantheonBelief();2258								if (eSecondaryPantheon != NO_BELIEF)2259								{2260									iMod += GC.GetGameBeliefs()->GetEntry(eSecondaryPantheon)->GetGoldenAgeGreatPersonRateModifier(eGreatPerson);2261								}2262							}2263						}2264					}2265#endif22662267					// Apply mod2268					iGPPChange *= (100 + iMod);2269					iGPPChange /= 100;22702271					ChangeSpecialistGreatPersonProgressTimes100(eSpecialist, iGPPChange);2272				}22732274				// Enough to spawn a GP?2275				if(GetSpecialistGreatPersonProgress(eSpecialist) >= iGPThreshold)2276				{2277					// No Minors2278					if(!GET_PLAYER(GetCity()->getOwner()).isMinorCiv())2279					{2280						// Reset progress on this Specialist2281						DoResetSpecialistGreatPersonProgressTimes100(eSpecialist);22822283						// Now... actually create the GP!2284						const UnitClassTypes eUnitClass = (UnitClassTypes) pkSpecialistInfo->getGreatPeopleUnitClass();2285						const CivilizationTypes eCivilization = GetCity()->getCivilizationType();2286						CvCivilizationInfo* pCivilizationInfo = GC.getCivilizationInfo(eCivilization);2287						if(pCivilizationInfo != NULL)2288						{2289							UnitTypes eUnit = (UnitTypes) pCivilizationInfo->getCivilizationUnits(eUnitClass);22902291#if defined(MOD_GLOBAL_TRULY_FREE_GP)2292							DoSpawnGreatPerson(eUnit, true, false, false);2293#else2294							DoSpawnGreatPerson(eUnit, true, false);2295#endif2296						}2297					}2298				}2299			}2300		}2301	}2302}

Calls

Called by