Bazaar developer reference

CvMilitaryAI::UpdateBaseData()

Defined in
CvMilitaryAI.cpp, line 2077
Class
CvMilitaryAI
Hook name
CivHooks::CvMilitaryAI_UpdateBaseData

Hooks

static bool BeforeCvMilitaryAI_UpdateBaseData(CvMilitaryAI* self);static void AfterCvMilitaryAI_UpdateBaseData(CvMilitaryAI* self);static void ReplaceCvMilitaryAI_UpdateBaseData(void (*original)(CvMilitaryAI*), CvMilitaryAI* self);CivRegisterBefore<CivHooks::CvMilitaryAI_UpdateBaseData>(host, &BeforeCvMilitaryAI_UpdateBaseData);CivRegisterAfter<CivHooks::CvMilitaryAI_UpdateBaseData>(host, &AfterCvMilitaryAI_UpdateBaseData);CivRegisterReplace<CivHooks::CvMilitaryAI_UpdateBaseData>(host, &ReplaceCvMilitaryAI_UpdateBaseData);

Code

2076/// Compute data we need later to make decisions during the turn processing2077void CvMilitaryAI::UpdateBaseData()2078{2079	AI_PERF_FORMAT("Military-AI-perf.csv", ("UpdateBaseData, Turn %03d, %s", GC.getGame().getElapsedGameTurns(), m_pPlayer->getCivilizationShortDescription()) );20802081	// Count how many Military Units I have right now2082	CvUnit* pLoopUnit;2083	int iLoop;20842085	m_iNumLandUnits = 0;2086	m_iNumRangedLandUnits = 0;2087	m_iNumMobileLandUnits = 0;2088	m_iNumAirUnits = 0;2089	m_iNumAntiAirUnits = 0;2090	m_iNumMeleeLandUnits = 0;2091	m_iNumNavalUnits = 0;2092	m_iNumLandUnitsInArmies = 0;2093	m_iNumNavalUnitsInArmies = 0;20942095	for(pLoopUnit = m_pPlayer->firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = m_pPlayer->nextUnit(&iLoop))2096	{2097		// Don't count civilians or exploration units2098		if(pLoopUnit->IsCanAttack() && pLoopUnit->AI_getUnitAIType() != UNITAI_EXPLORE && pLoopUnit->AI_getUnitAIType() != UNITAI_EXPLORE_SEA)2099		{2100			if(pLoopUnit->getDomainType() == DOMAIN_LAND)2101			{2102				m_iNumLandUnits++;21032104				if(pLoopUnit->getArmyID() != FFreeList::INVALID_INDEX)2105				{2106					m_iNumLandUnitsInArmies++;2107				}21082109				if(pLoopUnit->IsCanAttackRanged())2110				{2111					m_iNumRangedLandUnits++;2112				}2113				else if(pLoopUnit->getExtraIntercept() > 0)2114				{2115					// I'm an anti-air unit2116					m_iNumAntiAirUnits++;2117				}2118				else if(pLoopUnit->getUnitInfo().GetMoves() > 2)2119				{2120					m_iNumMobileLandUnits++;2121				}2122				else2123				{2124					m_iNumMeleeLandUnits++;2125				}2126			}2127			else if(pLoopUnit->getDomainType() == DOMAIN_SEA)2128			{2129				m_iNumNavalUnits++;21302131				if(pLoopUnit->getArmyID() != FFreeList::INVALID_INDEX)2132				{2133					m_iNumNavalUnitsInArmies++;2134				}2135			}2136			else if(pLoopUnit->getDomainType() == DOMAIN_AIR)2137			{2138				m_iNumAirUnits++;2139			}2140		}2141	}21422143	float fMultiplier;2144	int iNumUnitsWanted = 0;2145	bool bNavalMap = false;2146	EconomicAIStrategyTypes eStrategyNavalMap = (EconomicAIStrategyTypes) GC.getInfoTypeForString("ECONOMICAISTRATEGY_NAVAL_MAP");2147	if (m_pPlayer->GetEconomicAI()->IsUsingStrategy(eStrategyNavalMap))2148	{2149		bNavalMap = true;2150	}2151	int iFlavorOffense = m_pPlayer->GetGrandStrategyAI()->GetPersonalityAndGrandStrategy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_OFFENSE"));2152	int iFlavorDefense = m_pPlayer->GetGrandStrategyAI()->GetPersonalityAndGrandStrategy((FlavorTypes)GC.getInfoTypeForString("FLAVOR_DEFENSE"));21532154#if defined(MOD_AI_SMART_V3)2155	// This value will be between 10 and 100 based on highest threat without Xml values altered.2156	int threatBase = MOD_AI_SMART_V3 ? GetThreatWeight(m_pPlayer->GetMilitaryAI()->GetHighestThreat()) * 10 : m_pPlayer->GetMilitaryAI()->GetHighestThreat();2157	// Result value will be really between 0.5 and 1.5 this time!2158	fMultiplier = (float)0.40 + (((float)(threatBase + iFlavorOffense + iFlavorDefense)) / (float)100.0);2159#else2160	// Scale up or down based on true threat level and a bit by flavors (multiplier should range from about 0.5 to about 1.5)2161	fMultiplier = (float)0.40 + (((float)(m_pPlayer->GetMilitaryAI()->GetHighestThreat() + iFlavorOffense + iFlavorDefense)) / (float)100.0);2162#endif21632164	// first get the number of defenders that we think we need21652166	// Start with 3, to protect the capital2167	iNumUnitsWanted = GC.getAI_STRATEGY_DEFEND_MY_LANDS_BASE_UNITS();21682169	// 1 Unit per City & 1 per Settler2170	iNumUnitsWanted += (int)(m_pPlayer->getNumCities() * /*1.0*/ GC.getAI_STRATEGY_DEFEND_MY_LANDS_UNITS_PER_CITY());2171	iNumUnitsWanted += m_pPlayer->GetNumUnitsWithUnitAI(UNITAI_SETTLE, true);21722173#if defined(MOD_AI_SMART_V3)2174	int iDifficulty = MOD_AI_SMART_V3 ? 200 - GC.getGame().getHandicapInfo().getAIUnitCostPercent() : 100;2175	// Lets add the percentage difference based on unit maintenance.2176	iNumUnitsWanted = (iNumUnitsWanted * iDifficulty) / 100;2177#endif2178	m_iMandatoryReserveSize = (int)((float)iNumUnitsWanted * fMultiplier);21792180	// add in a few for the difficulty level (all above Chieftain are boosted)2181#if defined(MOD_AI_SMART_V3)2182	iDifficulty = MOD_AI_SMART_V3 ? 0 : max(0,GC.getGame().getHandicapInfo().GetID() - 1);2183#else2184	int iDifficulty = max(0,GC.getGame().getHandicapInfo().GetID() - 1);2185#endif2186	m_iMandatoryReserveSize += iDifficulty;21872188	m_iMandatoryReserveSize = max(1,m_iMandatoryReserveSize);21892190	// now we add in the strike forces we think we will need2191	if(m_pPlayer->isMinorCiv())2192	{2193		m_iMandatoryReserveSize = max(1,m_iMandatoryReserveSize/2);2194		iNumUnitsWanted = 0;2195	}2196	else2197	{2198		iNumUnitsWanted = 7; // size of a basic attack21992200		// if we are going for conquest we want at least one more task force2201		bool bConquestGrandStrategy = false;2202		AIGrandStrategyTypes eConquestGrandStrategy = (AIGrandStrategyTypes) GC.getInfoTypeForString("AIGRANDSTRATEGY_CONQUEST");2203		if(eConquestGrandStrategy != NO_AIGRANDSTRATEGY)2204		{2205			if(m_pPlayer->GetGrandStrategyAI()->GetActiveGrandStrategy() == eConquestGrandStrategy)2206			{2207				bConquestGrandStrategy = true;2208			}2209		}2210#if defined(MOD_AI_SMART_V3)2211		if(!MOD_AI_SMART_V3 && bConquestGrandStrategy)2212#else2213		if(bConquestGrandStrategy)2214#endif2215		{2216			iNumUnitsWanted *= 2;2217		}22182219		// add in a few more if the player is bold2220		iNumUnitsWanted += m_pPlayer->GetDiplomacyAI()->GetBoldness();22212222#if defined(MOD_AI_SMART_V3)2223		if (!MOD_AI_SMART_V3)2224		{2225#endif2226		// add in more if we are playing on a high difficulty2227		iNumUnitsWanted += iDifficulty;22282229		iNumUnitsWanted = (int)((float)iNumUnitsWanted * fMultiplier);2230#if defined(MOD_AI_SMART_V3)2231		}2232#endif22332234#if defined(MOD_AI_SMART_V3)2235		if (MOD_AI_SMART_V3)2236		{2237			iNumUnitsWanted = (iNumUnitsWanted * iDifficulty) / 125;22382239			iNumUnitsWanted = (int)((float)iNumUnitsWanted * fMultiplier);22402241			iNumUnitsWanted += m_iMandatoryReserveSize;22422243			if(bConquestGrandStrategy)2244			{2245				iNumUnitsWanted = (iNumUnitsWanted * 3) / 2;2246			}2247		}2248#endif2249		iNumUnitsWanted = max(1,iNumUnitsWanted);2250	}22512252	if (bNavalMap)2253	{2254		iNumUnitsWanted *= 2;2255		iNumUnitsWanted /= 3;2256		m_iMandatoryReserveSize *= 2;2257		m_iMandatoryReserveSize /= 3;2258	}22592260#if defined(MOD_AI_SMART_V3)2261	if (!MOD_AI_SMART_V3) iNumUnitsWanted += m_iMandatoryReserveSize;2262	m_iRecommendedMilitarySize = iNumUnitsWanted;2263#else2264	m_iRecommendedMilitarySize = m_iMandatoryReserveSize + iNumUnitsWanted;2265#endif2266}

Calls

Called by