CvCityCitizens::GetAIBestSpecialistBuilding(int &)
- Defined in
- CvCityCitizens.cpp, line 1054
- Class
- CvCityCitizens
- Hook name
CivHooks::CvCityCitizens_GetAIBestSpecialistBuilding
Hooks
static bool BeforeCvCityCitizens_GetAIBestSpecialistBuilding(CvCityCitizens* self, int& iSpecialistValue, BuildingTypes& result);static void AfterCvCityCitizens_GetAIBestSpecialistBuilding(CvCityCitizens* self, int& iSpecialistValue, BuildingTypes& result);static BuildingTypes ReplaceCvCityCitizens_GetAIBestSpecialistBuilding(BuildingTypes (*original)(CvCityCitizens*, int&), CvCityCitizens* self, int& iSpecialistValue);CivRegisterBefore<CivHooks::CvCityCitizens_GetAIBestSpecialistBuilding>(host, &BeforeCvCityCitizens_GetAIBestSpecialistBuilding);CivRegisterAfter<CivHooks::CvCityCitizens_GetAIBestSpecialistBuilding>(host, &AfterCvCityCitizens_GetAIBestSpecialistBuilding);CivRegisterReplace<CivHooks::CvCityCitizens_GetAIBestSpecialistBuilding>(host, &ReplaceCvCityCitizens_GetAIBestSpecialistBuilding);
Code
1053/// What is the Building Type the AI likes the Specialist of most right now?1054BuildingTypes CvCityCitizens::GetAIBestSpecialistBuilding(int& iSpecialistValue)1055{1056 BuildingTypes eBestBuilding = NO_BUILDING;1057 int iBestSpecialistValue = -1;1058 int iBestUnmodifiedSpecialistValue = -1;10591060 SpecialistTypes eSpecialist;1061 int iValue;10621063 // Loop through all Buildings1064 for(int iBuildingLoop = 0; iBuildingLoop < GC.getNumBuildingInfos(); iBuildingLoop++)1065 {1066 const BuildingTypes eBuilding = static_cast<BuildingTypes>(iBuildingLoop);1067 CvBuildingEntry* pkBuildingInfo = GC.getBuildingInfo(eBuilding);10681069 if(pkBuildingInfo)1070 {1071 // Have this Building in the City?1072 if(GetCity()->GetCityBuildings()->GetNumBuilding(eBuilding) > 0)1073 {1074 // Can't add more than the max1075 if(IsCanAddSpecialistToBuilding(eBuilding))1076 {1077 eSpecialist = (SpecialistTypes) pkBuildingInfo->GetSpecialistType();10781079 iValue = GetSpecialistValue(eSpecialist);10801081 // Add a bit more weight to a Building if it has more slots (10% per). This will bias the AI to fill a single building over spreading Specialists out1082 int iTemp = ((GetNumSpecialistsAllowedByBuilding(*pkBuildingInfo) - 1) * iValue * 10);1083 iTemp /= 100;1084 iValue += iTemp;10851086 if(iValue > iBestSpecialistValue)1087 {1088 eBestBuilding = eBuilding;1089 iBestSpecialistValue = iValue;1090 iBestUnmodifiedSpecialistValue = iValue - iTemp;1091 }1092 }1093 }1094 }1095 }10961097 iSpecialistValue = iBestUnmodifiedSpecialistValue;1098 return eBestBuilding;1099}
Calls
- CvBuildingEntry::GetSpecialistType() const
- CvCity::GetCityBuildings() const
- CvCityBuildings::GetNumBuilding(BuildingTypes) const
- CvCityCitizens::GetCity()
- CvCityCitizens::GetNumSpecialistsAllowedByBuilding(const CvBuildingEntry &)
- CvCityCitizens::GetSpecialistValue(SpecialistTypes)
- CvCityCitizens::IsCanAddSpecialistToBuilding(BuildingTypes)
- CvGlobals::getBuildingInfo(BuildingTypes)
- CvGlobals::getNumBuildingInfos()