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
- CvAIGrandStrategyXMLEntry::GetFlavorValue(int) const
- CvAIGrandStrategyXMLEntry::GetSpecializationBoost(YieldTypes) const
- CvCity::GetCityStrategyAI() const
- CvCitySpecializationAI::CanBuildSpaceshipParts()
- CvCityStrategyAI::IsUsingCityStrategy(AICityStrategyTypes)
- CvDiplomacyAI::GetPersonalityMajorCivApproachBias(MajorCivApproachTypes) const
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_TRAINING_PER_OFFENSE()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_TRAINING_PER_PERSONALITY()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_CAPITAL_THREAT()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_CIVS_AT_WAR_WITH()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_EMPIRE_DEFENSE()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_EMPIRE_DEFENSE_CRITICAL()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_FLAVOR_SPACESHIP()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_FLAVOR_WONDER()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEED_NAVAL_UNITS()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEED_NAVAL_UNITS_CRITICAL()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_NEXT_WONDER()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_OPERATIONAL_UNITS_REQUESTED()
- CvGlobals::getAI_CITY_SPECIALIZATION_PRODUCTION_WEIGHT_WAR_MOBILIZATION()
- CvGlobals::getAIGrandStrategyInfo(AIGrandStrategyTypes)
- CvGlobals::getInfoTypeForString(const char *, bool) const
- CvGlobals::getNumAIGrandStrategyInfos()
- CvGrandStrategyAI::GetActiveGrandStrategy() const
- CvGrandStrategyAI::GetPersonalityAndGrandStrategy(FlavorTypes, bool)
- CvMilitaryAI::GetNumberCivsAtWarWith() const
- CvMilitaryAI::IsUsingStrategy(MilitaryAIStrategyTypes)
- CvPlayer::getCapitalCity()
- CvPlayer::GetDiplomacyAI() const
- CvPlayer::GetGrandStrategyAI() const
- CvPlayer::GetMilitaryAI() const
- CvPlayer::GetNumUnitsNeededToBeBuilt()
CvWeightedVector::push_backstd::maxstd::min