CvCitySpecializationAI::SelectProductionSpecialization(int &)
- Defined in
- CvCitySpecializationAI.cpp, line 997
- Class
- CvCitySpecializationAI
- Hook name
CivHooks::CvCitySpecializationAI_SelectProductionSpecialization
Hooks
static bool BeforeCvCitySpecializationAI_SelectProductionSpecialization(CvCitySpecializationAI* self, int& iReductionAmount, CitySpecializationTypes& result);static void AfterCvCitySpecializationAI_SelectProductionSpecialization(CvCitySpecializationAI* self, int& iReductionAmount, CitySpecializationTypes& result);static CitySpecializationTypes ReplaceCvCitySpecializationAI_SelectProductionSpecialization(CitySpecializationTypes (*original)(CvCitySpecializationAI*, int&), CvCitySpecializationAI* self, int& iReductionAmount);CivRegisterBefore<CivHooks::CvCitySpecializationAI_SelectProductionSpecialization>(host, &BeforeCvCitySpecializationAI_SelectProductionSpecialization);CivRegisterAfter<CivHooks::CvCitySpecializationAI_SelectProductionSpecialization>(host, &AfterCvCitySpecializationAI_SelectProductionSpecialization);CivRegisterReplace<CivHooks::CvCitySpecializationAI_SelectProductionSpecialization>(host, &ReplaceCvCitySpecializationAI_SelectProductionSpecialization);
Code
996/// Find production specializations needed997CitySpecializationTypes CvCitySpecializationAI::SelectProductionSpecialization(int& iReductionAmount)998{999 CitySpecializationTypes eSpecialization;10001001 // Find highest weighted subtype1002 m_ProductionSubtypeWeights.SortItems();10031004 ProductionSpecializationSubtypes eSubtype = m_ProductionSubtypeWeights.GetElement(0);10051006 int iNumSubTypes = 0;1007 eSpecialization = GC.GetGameCitySpecializations()->GetFirstSpecializationForYield(YIELD_PRODUCTION);1008 while(iNumSubTypes != (int)eSubtype)1009 {1010 eSpecialization = GC.GetGameCitySpecializations()->GetNextSpecializationForYield();1011 iNumSubTypes++;1012 FAssertMsg(eSpecialization != NO_CITY_SPECIALIZATION, "Production specializations in XML doesn't match NUM_PRODUCTION_SPECIALIZATION_SUBTYPES");1013 }10141015 // If this is the wonder type, make sure we have a city to build it1016 if(eSubtype == GetWonderSubtype())1017 {1018 CvCity* pCity = FindBestWonderCity();1019 if(pCity != NULL)1020 {1021 m_iWonderCityID = pCity->GetID();1022 m_bWonderChosen = true;1023 }10241025 // No wonder city, substitute default specialization instead1026 else1027 {1028 eSpecialization = GetEconomicDefaultSpecialization();1029 }1030 iReductionAmount = m_ProductionSubtypeWeights.GetWeight(0);1031 m_ProductionSubtypeWeights.SetWeight(0, 0);1032 }10331034 else1035 {1036 // Reduce weight for this subtype based on dividing original weight by <num of this type + 1>1037 int iOldWeight = m_ProductionSubtypeWeights.GetWeight(0);1038 m_iNumSpecializationsForThisSubtype[(int)iNumSubTypes]++;1039 int iNewWeight = iOldWeight * m_iNumSpecializationsForThisSubtype[(int)iNumSubTypes] / (m_iNumSpecializationsForThisSubtype[(int)iNumSubTypes] + 1);1040 iReductionAmount = iOldWeight - iNewWeight;1041 m_ProductionSubtypeWeights.SetWeight(0, iNewWeight);1042 }10431044 return eSpecialization;1045}
Calls
- CvCity::GetID() const
- CvCitySpecializationAI::FindBestWonderCity() const
- CvCitySpecializationAI::GetEconomicDefaultSpecialization() const
- CvCitySpecializationAI::GetWonderSubtype() const
- CvCitySpecializationXMLEntries::GetFirstSpecializationForYield(YieldTypes)
- CvCitySpecializationXMLEntries::GetNextSpecializationForYield()
- CvGlobals::GetGameCitySpecializations() const
CvWeightedVector::GetElementCvWeightedVector::GetWeightCvWeightedVector::SetWeightCvWeightedVector::SortItems