Bazaar developer reference

CvCitySpecializationAI::WeightProductionSubtypes(int, int)

Defined in
CvCitySpecializationAI.cpp, line 512
Class
CvCitySpecializationAI
Hook name
CivHooks::CvCitySpecializationAI_WeightProductionSubtypes

Hooks

static bool BeforeCvCitySpecializationAI_WeightProductionSubtypes(CvCitySpecializationAI* self, int iFlavorWonder, int iFlavorSpaceship, int& result);static void AfterCvCitySpecializationAI_WeightProductionSubtypes(CvCitySpecializationAI* self, int iFlavorWonder, int iFlavorSpaceship, int& result);static int ReplaceCvCitySpecializationAI_WeightProductionSubtypes(int (*original)(CvCitySpecializationAI*, int, int), CvCitySpecializationAI* self, int iFlavorWonder, int iFlavorSpaceship);CivRegisterBefore<CivHooks::CvCitySpecializationAI_WeightProductionSubtypes>(host, &BeforeCvCitySpecializationAI_WeightProductionSubtypes);CivRegisterAfter<CivHooks::CvCitySpecializationAI_WeightProductionSubtypes>(host, &AfterCvCitySpecializationAI_WeightProductionSubtypes);CivRegisterReplace<CivHooks::CvCitySpecializationAI_WeightProductionSubtypes>(host, &ReplaceCvCitySpecializationAI_WeightProductionSubtypes);

Code

511/// Compute the weight of each production subtype (return value is total of all these weights)512int CvCitySpecializationAI::WeightProductionSubtypes(int iFlavorWonder, int iFlavorSpaceship)513{514	bool bCriticalDefenseOn = false;515516	int iMilitaryTrainingWeight = 0;517	int iEmergencyUnitWeight = 0;518	int iSeaWeight = 0;519	int iWonderWeight = 0;520	int iSpaceshipWeight = 0;521522	int iFlavorOffense = 0;523	iFlavorOffense = m_pPlayer->GetGrandStrategyAI()->GetPersonalityAndGrandStrategy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_OFFENSE"));524525	int iUnitsRequested = m_pPlayer->GetNumUnitsNeededToBeBuilt();526527	// LONG-TERM MILITARY BUILD-UP528	iMilitaryTrainingWeight += (iFlavorOffense * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_TRAINING_PER_OFFENSE()) /* 10 */;529	iMilitaryTrainingWeight += (m_pPlayer->GetDiplomacyAI()->GetPersonalityMajorCivApproachBias(MAJOR_CIV_APPROACH_WAR) * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_TRAINING_PER_PERSONALITY() /* 10 */);530531	// EMERGENCY UNITS532	iEmergencyUnitWeight += iUnitsRequested * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_OPERATIONAL_UNITS_REQUESTED() /* 10 */;533	iEmergencyUnitWeight += m_pPlayer->GetMilitaryAI()->GetNumberCivsAtWarWith() * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_CIVS_AT_WAR_WITH() /* 100 */;534535	// Is our capital under threat?536	AICityStrategyTypes eCityStrategy = (AICityStrategyTypes) GC.getInfoTypeForString("AICITYSTRATEGY_CAPITAL_UNDER_THREAT");537	CvCity* pCapital;538	pCapital = m_pPlayer->getCapitalCity();539	if(pCapital && eCityStrategy != NO_AICITYSTRATEGY && pCapital->GetCityStrategyAI()->IsUsingCityStrategy(eCityStrategy))540	{541		iEmergencyUnitWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_CAPITAL_THREAT() /* 50 */;542	}543544	// Add in weights depending on what the military AI is up to545	MilitaryAIStrategyTypes eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_WAR_MOBILIZATION");546	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))547	{548		iMilitaryTrainingWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_WAR_MOBILIZATION() /* 150 */;549	}550	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_EMPIRE_DEFENSE");551	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))552	{553		iEmergencyUnitWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_EMPIRE_DEFENSE() /* 150 */;554	}555	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_EMPIRE_DEFENSE_CRITICAL");556	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))557	{558		bCriticalDefenseOn = true;559		iEmergencyUnitWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_EMPIRE_DEFENSE_CRITICAL() /* 1000 */;560	}561562	// Override all this if have too many units!563	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_ENOUGH_MILITARY_UNITS");564	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))565	{566		iMilitaryTrainingWeight = 0;567		iEmergencyUnitWeight = 0;568	}569570	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_NEED_NAVAL_UNITS");571	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))572	{573		iSeaWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEED_NAVAL_UNITS() /* 50 */;574	}575	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_NEED_NAVAL_UNITS_CRITICAL");576	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))577	{578		iSeaWeight += GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEED_NAVAL_UNITS_CRITICAL() /* 250 */;579	}580	eStrategy = (MilitaryAIStrategyTypes) GC.getInfoTypeForString("MILITARYAISTRATEGY_ENOUGH_NAVAL_UNITS");581	if(eStrategy != NO_MILITARYAISTRATEGY && m_pPlayer->GetMilitaryAI()->IsUsingStrategy(eStrategy))582	{583		iSeaWeight = 0;584	}585586	// Wonder is MIN between weight of wonders available to build and value from flavors (but not less than zero)587	int iWonderFlavorWeight = iFlavorWonder * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_FLAVOR_WONDER() /* 200 */;588	int iWeightOfWonders = (int)(m_iNextWonderWeight * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEXT_WONDER()); /* 0.2 */589	iWonderWeight = min(iWonderFlavorWeight, iWeightOfWonders);590	iWonderWeight = max(iWonderWeight, 0);591592	// One-half of normal weight if critical defense is on593	if(bCriticalDefenseOn)594	{595		iWonderWeight /= 2;596	}597598	if(CanBuildSpaceshipParts())599	{600		iSpaceshipWeight += iFlavorSpaceship * GC.getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_FLAVOR_SPACESHIP() /* 5 */;601	}602603	for(int iGrandStrategyLoop = 0; iGrandStrategyLoop < GC.getNumAIGrandStrategyInfos(); iGrandStrategyLoop++)604	{605		CvAIGrandStrategyXMLEntry* grandStrategy = GC.getAIGrandStrategyInfo((AIGrandStrategyTypes)iGrandStrategyLoop);606		if(grandStrategy)607		{608			if(iGrandStrategyLoop == m_pPlayer->GetGrandStrategyAI()->GetActiveGrandStrategy())609			{610				if(grandStrategy->GetSpecializationBoost(YIELD_PRODUCTION) > 0)611				{612					if(grandStrategy->GetFlavorValue((FlavorTypes)GC.getInfoTypeForString("FLAVOR_OFFENSE")) > 0)613					{614						iMilitaryTrainingWeight += grandStrategy->GetSpecializationBoost(YIELD_PRODUCTION);615					}616					else if(grandStrategy->GetFlavorValue((FlavorTypes)GC.getInfoTypeForString("FLAVOR_SPACESHIP")) > 0)617					{618						iSpaceshipWeight += grandStrategy->GetSpecializationBoost(YIELD_PRODUCTION);619					}620				}621			}622		}623	}624625	// Add weights to our weighted vector626	m_ProductionSubtypeWeights.push_back(PRODUCTION_SPECIALIZATION_MILITARY_TRAINING, iMilitaryTrainingWeight);627	m_ProductionSubtypeWeights.push_back(PRODUCTION_SPECIALIZATION_EMERGENCY_UNITS, iEmergencyUnitWeight);628	m_ProductionSubtypeWeights.push_back(PRODUCTION_SPECIALIZATION_MILITARY_NAVAL, iSeaWeight);629	m_ProductionSubtypeWeights.push_back(PRODUCTION_SPECIALIZATION_WONDER, iWonderWeight);630	m_ProductionSubtypeWeights.push_back(PRODUCTION_SPECIALIZATION_SPACESHIP, iSpaceshipWeight);631632	return iMilitaryTrainingWeight + iEmergencyUnitWeight + iSeaWeight + iWonderWeight + iSpaceshipWeight;633}

Calls

Called by