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}