Bazaar developer reference

CvCitySpecializationAI::SelectSpecializations()

Defined in
CvCitySpecializationAI.cpp, line 912
Class
CvCitySpecializationAI
Hook name
CivHooks::CvCitySpecializationAI_SelectSpecializations

Hooks

static bool BeforeCvCitySpecializationAI_SelectSpecializations(CvCitySpecializationAI* self);static void AfterCvCitySpecializationAI_SelectSpecializations(CvCitySpecializationAI* self);static void ReplaceCvCitySpecializationAI_SelectSpecializations(void (*original)(CvCitySpecializationAI*), CvCitySpecializationAI* self);CivRegisterBefore<CivHooks::CvCitySpecializationAI_SelectSpecializations>(host, &BeforeCvCitySpecializationAI_SelectSpecializations);CivRegisterAfter<CivHooks::CvCitySpecializationAI_SelectSpecializations>(host, &AfterCvCitySpecializationAI_SelectSpecializations);CivRegisterReplace<CivHooks::CvCitySpecializationAI_SelectSpecializations>(host, &ReplaceCvCitySpecializationAI_SelectSpecializations);

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}

Calls

Called by