Code
911/// Find specializations needed (including for the next city we build)912void CvCitySpecializationAI::SelectSpecializations()913{914 CitySpecializationTypes eSpecialization;915 unsigned int iSpecializationsToAssign = (unsigned int)m_pPlayer->getNumCities() - (unsigned int) m_pPlayer->GetNumPuppetCities() + 1;916 int iOldWeight;917 int iNewWeight;918 int iReductionAmount;919920 m_SpecializationsNeeded.clear();921 m_bWonderChosen = false;922923 // Clear info about what we've picked924 for(int iI = 0; iI < NUM_SPECIALIZATION_YIELDS; iI++)925 {926 m_iNumSpecializationsForThisYield[iI] = 0;927 }928 for(int iI = 0; iI < NUM_PRODUCTION_SPECIALIZATION_SUBTYPES; iI++)929 {930 m_iNumSpecializationsForThisSubtype[iI] = 0;931 }932933 CvCity* pkWonderBuildCity = GetWonderBuildCity();934 CvBuildingEntry* pkProductionBuildingInfo = NULL;935 if(NULL != pkWonderBuildCity && pkWonderBuildCity->getProductionBuilding() != NO_BUILDING)936 {937 pkProductionBuildingInfo = GC.getBuildingInfo(pkWonderBuildCity->getProductionBuilding());938 }939940 // Do we have a wonder build in progress that we can't interrupt?941 if(!m_bInterruptWonders && NULL != pkProductionBuildingInfo && m_pPlayer->GetWonderProductionAI()->IsWonder(*pkProductionBuildingInfo))942 {943 m_SpecializationsNeeded.push_back(GetWonderSpecialization());944 m_iNumSpecializationsForThisYield[1 + (int)YIELD_PRODUCTION]++;945 iOldWeight = m_YieldWeights.GetWeight(YIELD_PRODUCTION);946 iReductionAmount = m_ProductionSubtypeWeights.GetWeight(GetWonderSubtype());947 m_YieldWeights.SetWeight(YIELD_PRODUCTION, (iOldWeight - iReductionAmount));948949 // Only one wonder at a time, so zero out the weight for this subtype entirely950 m_ProductionSubtypeWeights.SetWeight(GetWonderSubtype(), 0);951 m_bWonderChosen = true;952 }953 else954 {955 m_iWonderCityID = -1;956 }957958 // LOOP as many times as we have cities PLUS ONE959 while(m_SpecializationsNeeded.size() < iSpecializationsToAssign)960 {961 // Find highest weighted specialization962 m_YieldWeights.SortItems();963964 // Mark that we need one city of this type965 YieldTypes eYield = m_YieldWeights.GetElement(0);966 if(GC.GetGameCitySpecializations()->GetNumSpecializationsForYield(eYield) > 1)967 {968 if(eYield == YIELD_PRODUCTION)969 {970 eSpecialization = SelectProductionSpecialization(iReductionAmount);971972 iOldWeight = m_YieldWeights.GetWeight(0);973 m_iNumSpecializationsForThisYield[1 + (int)eYield]++;974 iNewWeight = iOldWeight - iReductionAmount;975 m_YieldWeights.SetWeight(0, iNewWeight);976 }977 else978 {979 FAssertMsg(false, "Code does not support > 1 specialization for yields other than production.");980 }981 }982 else983 {984 eSpecialization = GC.GetGameCitySpecializations()->GetFirstSpecializationForYield(eYield);985986 // Reduce weight for this specialization based on dividing original weight by <num of this type + 1>987 iOldWeight = m_YieldWeights.GetWeight(0);988 m_iNumSpecializationsForThisYield[1 + (int)eYield]++;989 iNewWeight = iOldWeight * m_iNumSpecializationsForThisYield[1 + (int)eYield] / (m_iNumSpecializationsForThisYield[1 + (int)eYield] + 1);990 m_YieldWeights.SetWeight(0, iNewWeight);991 }992 m_SpecializationsNeeded.push_back(eSpecialization);993 }994}