Hooks
static bool BeforeCvCityCitizens_DoAddSpecialistToBuilding(CvCityCitizens* self, BuildingTypes eBuilding, bool bForced);static void AfterCvCityCitizens_DoAddSpecialistToBuilding(CvCityCitizens* self, BuildingTypes eBuilding, bool bForced);static void ReplaceCvCityCitizens_DoAddSpecialistToBuilding(void (*original)(CvCityCitizens*, BuildingTypes, bool), CvCityCitizens* self, BuildingTypes eBuilding, bool bForced);CivRegisterBefore<CivHooks::CvCityCitizens_DoAddSpecialistToBuilding>(host, &BeforeCvCityCitizens_DoAddSpecialistToBuilding);CivRegisterAfter<CivHooks::CvCityCitizens_DoAddSpecialistToBuilding>(host, &AfterCvCityCitizens_DoAddSpecialistToBuilding);CivRegisterReplace<CivHooks::CvCityCitizens_DoAddSpecialistToBuilding>(host, &ReplaceCvCityCitizens_DoAddSpecialistToBuilding);
Code
2332/// Adds and initializes a Specialist for this building2333void CvCityCitizens::DoAddSpecialistToBuilding(BuildingTypes eBuilding, bool bForced)2334{2335 CvAssert(eBuilding > -1);2336 CvAssert(eBuilding < GC.getNumBuildingInfos());23372338 CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);2339 if(pkBuildingInfo == NULL)2340 {2341 return;2342 }23432344 SpecialistTypes eSpecialist = (SpecialistTypes) pkBuildingInfo->GetSpecialistType();23452346 // Can't add more than the max2347 if(IsCanAddSpecialistToBuilding(eBuilding))2348 {2349 // If we're force-assigning a specialist, then we can reduce the count on forced default specialists2350 if(bForced)2351 {2352 if(GetNumForcedDefaultSpecialists() > 0)2353 ChangeNumForcedDefaultSpecialists(-1);2354 }23552356 // If we don't already have an Unassigned Citizen to turn into a Specialist, find one from somewhere2357 if(GetNumUnassignedCitizens() == 0)2358 {2359 DoRemoveWorstCitizen(true, /*Don't remove this type*/ eSpecialist);2360 if(GetNumUnassignedCitizens() == 0)2361 {2362 // Still nobody, all the citizens may be assigned to the eSpecialist we are looking for, try again2363 if(!DoRemoveWorstSpecialist(NO_SPECIALIST, eBuilding))2364 {2365 return; // For some reason we can't do this, we must exit, else we will be going over the population count2366 }2367 }2368 }23692370 // Increase count for the whole city2371 m_aiSpecialistCounts[eSpecialist]++;2372 m_aiNumSpecialistsInBuilding[eBuilding]++;23732374 if(bForced)2375 {2376 m_aiNumForcedSpecialistsInBuilding[eBuilding]++;2377 }23782379 GetCity()->processSpecialist(eSpecialist, 1);2380 GetCity()->UpdateReligion(GetCity()->GetCityReligions()->GetReligiousMajority());23812382 ChangeNumUnassignedCitizens(-1);23832384 ICvUserInterface2* pkIFace = GC.GetEngineUserInterface();2385 pkIFace->setDirty(GameData_DIRTY_BIT, true);2386 pkIFace->setDirty(CityInfo_DIRTY_BIT, true);2387 //pkIFace->setDirty(InfoPane_DIRTY_BIT, true );2388 pkIFace->setDirty(CityScreen_DIRTY_BIT, true);2389 pkIFace->setDirty(ColoredPlots_DIRTY_BIT, true);23902391 CvCity* pkCity = GetCity();2392 auto_ptr<ICvCity1> pCity = GC.WrapCityPointer(pkCity);23932394 pkIFace->SetSpecificCityInfoDirty(pCity.get(), CITY_UPDATE_TYPE_SPECIALISTS);2395 }2396}