Bazaar developer reference

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

Called by