Hooks
static bool BeforeCvTacticalAI_ExecuteMoveOfBlockingUnit(CvTacticalAI* self, UnitHandle pBlockingUnit, bool& result);static void AfterCvTacticalAI_ExecuteMoveOfBlockingUnit(CvTacticalAI* self, UnitHandle pBlockingUnit, bool& result);static bool ReplaceCvTacticalAI_ExecuteMoveOfBlockingUnit(bool (*original)(CvTacticalAI*, UnitHandle), CvTacticalAI* self, UnitHandle pBlockingUnit);CivRegisterBefore<CivHooks::CvTacticalAI_ExecuteMoveOfBlockingUnit>(host, &BeforeCvTacticalAI_ExecuteMoveOfBlockingUnit);CivRegisterAfter<CivHooks::CvTacticalAI_ExecuteMoveOfBlockingUnit>(host, &AfterCvTacticalAI_ExecuteMoveOfBlockingUnit);CivRegisterReplace<CivHooks::CvTacticalAI_ExecuteMoveOfBlockingUnit>(host, &ReplaceCvTacticalAI_ExecuteMoveOfBlockingUnit);
Code
7517/// Find an adjacent hex to move a blocking unit to7518bool CvTacticalAI::ExecuteMoveOfBlockingUnit(UnitHandle pBlockingUnit)7519{7520 if(!pBlockingUnit->canMove() || IsInQueuedAttack(pBlockingUnit.pointer()))7521 {7522 return false;7523 }75247525 CvPlot* pOldPlot = pBlockingUnit->plot();75267527 for(int iI = 0; iI < NUM_DIRECTION_TYPES; iI++)7528 {7529 CvPlot* pPlot = plotDirection(pBlockingUnit->getX(), pBlockingUnit->getY(), ((DirectionTypes)iI));7530 if(pPlot != NULL)7531 {7532 // Don't embark for one of these moves7533 if (!pOldPlot->isWater() && pPlot->isWater() && pBlockingUnit->getDomainType() == DOMAIN_LAND)7534 {7535 continue;7536 }75377538 // Has to be somewhere we can move and be empty of other units/enemy cities7539 if(!pPlot->getVisibleEnemyDefender(m_pPlayer->GetID()) && !pPlot->isEnemyCity(*pBlockingUnit.pointer()) && pBlockingUnit->GeneratePath(pPlot))7540 {7541#if defined(MOD_AI_SMART_V3)7542 ExecuteMoveToPlot(pBlockingUnit, pPlot, MOD_AI_SMART_V3);7543#else7544 ExecuteMoveToPlot(pBlockingUnit, pPlot);7545#endif7546 if(GC.getLogging() && GC.getAILogging())7547 {7548 CvString strTemp, strLogString;7549 strTemp = pBlockingUnit->getUnitInfo().GetDescription();7550 strLogString.Format("Moving blocking %s out of way, Leaving X: %d, Y: %d, Now At X: %d, Y: %d", strTemp.GetCString(), pOldPlot->getX(), pOldPlot->getY(), pBlockingUnit->getX(), pBlockingUnit->getY());7551 LogTacticalMessage(strLogString);7552 }7553 return true;7554 }7555 }7556 }7557 return false;7558}