Hooks
static bool BeforeCvMilitaryAI_RequestSpecificAttack(CvMilitaryAI* self, CvMilitaryTarget kTarget, int iNumUnitsWillingToBuild, bool& result);static void AfterCvMilitaryAI_RequestSpecificAttack(CvMilitaryAI* self, CvMilitaryTarget kTarget, int iNumUnitsWillingToBuild, bool& result);static bool ReplaceCvMilitaryAI_RequestSpecificAttack(bool (*original)(CvMilitaryAI*, CvMilitaryTarget, int), CvMilitaryAI* self, CvMilitaryTarget kTarget, int iNumUnitsWillingToBuild);// CivHooks.h gives this hook point no types, so nothing checks these hooks' parameters.host->RegisterHook(host->pluginIndex, CivHooks::CvMilitaryAI_RequestSpecificAttack::ID, CIV_HOOK_BEFORE, (void*)&BeforeCvMilitaryAI_RequestSpecificAttack);host->RegisterHook(host->pluginIndex, CivHooks::CvMilitaryAI_RequestSpecificAttack::ID, CIV_HOOK_AFTER, (void*)&AfterCvMilitaryAI_RequestSpecificAttack);host->RegisterHook(host->pluginIndex, CivHooks::CvMilitaryAI_RequestSpecificAttack::ID, CIV_HOOK_REPLACE, (void*)&ReplaceCvMilitaryAI_RequestSpecificAttack);
Code
705bool CvMilitaryAI::RequestSpecificAttack(CvMilitaryTarget kTarget, int iNumUnitsWillingToBuild)706{707 CvAIOperation* pOperation = NULL;708 int iNumRequiredSlots = 0;709 int iLandReservesUsed = 0;710 int iFilledSlots = 0;711712 if(kTarget.m_pTargetCity)713 {714 if(kTarget.m_bAttackBySea)715 {716 iFilledSlots = MilitaryAIHelpers::NumberOfFillableSlots(m_pPlayer, MUFORMATION_NAVAL_INVASION, true, &iNumRequiredSlots, &iLandReservesUsed);717 if((iNumRequiredSlots - iFilledSlots) <= iNumUnitsWillingToBuild && iLandReservesUsed <= GetLandReservesAvailable())718 {719 pOperation = m_pPlayer->addAIOperation(AI_OPERATION_NAVAL_ATTACK, kTarget.m_pTargetCity->getOwner(), kTarget.m_pTargetCity->getArea(), kTarget.m_pTargetCity, kTarget.m_pMusterCity);720 }721 }722 else723 {724 iFilledSlots = MilitaryAIHelpers::NumberOfFillableSlots(m_pPlayer,(GC.getGame().getHandicapInfo().GetID() > 4 && !(GC.getMap().GetAIMapHint() & 1)) ? MUFORMATION_BIGGER_CITY_ATTACK_FORCE : MUFORMATION_BASIC_CITY_ATTACK_FORCE, false, &iNumRequiredSlots, &iLandReservesUsed);725 if((iNumRequiredSlots - iFilledSlots) <= iNumUnitsWillingToBuild && iLandReservesUsed <= GetLandReservesAvailable())726 {727 pOperation = m_pPlayer->addAIOperation(AI_OPERATION_BASIC_CITY_ATTACK, kTarget.m_pTargetCity->getOwner(), kTarget.m_pTargetCity->getArea(), kTarget.m_pTargetCity, kTarget.m_pMusterCity);728 if (pOperation != NULL && !pOperation->ShouldAbort() && kTarget.m_pTargetCity->isCoastal(GC.getMIN_WATER_SIZE_FOR_OCEAN()))729 {730 int iFlavorNaval = m_pPlayer->GetFlavorManager()->GetPersonalityIndividualFlavor((FlavorTypes)GC.getInfoTypeForString("FLAVOR_NAVAL"));731 int iNumSuperiority = m_pPlayer->numOperationsOfType(AI_OPERATION_NAVAL_SUPERIORITY);732 int iNumBombard = m_pPlayer->numOperationsOfType(AI_OPERATION_NAVAL_BOMBARDMENT);733 int iMaxOperations = iFlavorNaval / 2;734 if(GC.getMap().GetAIMapHint() & 1)735 {736 iMaxOperations *= 2;737 }738 if (iNumSuperiority+iNumBombard <= iMaxOperations)739 m_pPlayer->addAIOperation(AI_OPERATION_NAVAL_SUPERIORITY, NO_PLAYER);740 }741 }742 }743744 if(pOperation != NULL && !pOperation->ShouldAbort())745 {746 return true;747 }748 }749 return false;750}