Bazaar developer reference

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

Called by