Hooks
static bool BeforeCvAIOperationNavalSuperiority_FindBestTarget(CvAIOperationNavalSuperiority* self, CvPlot*& result);static void AfterCvAIOperationNavalSuperiority_FindBestTarget(CvAIOperationNavalSuperiority* self, CvPlot*& result);static CvPlot* ReplaceCvAIOperationNavalSuperiority_FindBestTarget(CvPlot* (*original)(CvAIOperationNavalSuperiority*), CvAIOperationNavalSuperiority* self);CivRegisterBefore<CivHooks::CvAIOperationNavalSuperiority_FindBestTarget>(host, &BeforeCvAIOperationNavalSuperiority_FindBestTarget);CivRegisterAfter<CivHooks::CvAIOperationNavalSuperiority_FindBestTarget>(host, &AfterCvAIOperationNavalSuperiority_FindBestTarget);CivRegisterReplace<CivHooks::CvAIOperationNavalSuperiority_FindBestTarget>(host, &ReplaceCvAIOperationNavalSuperiority_FindBestTarget);
Code
4372/// Find the nearest enemy naval unit to eliminate4373CvPlot* CvAIOperationNavalSuperiority::FindBestTarget()4374{4375 int iPlotLoop, iUnitLoop;4376 CvPlot* pPlot;4377 CvPlot* pBestPlot = NULL;4378 CvUnit* pInitialUnit;4379 CvCity* pCity;4380 CvCity* pEnemyCoastalCity = NULL;4381 CvPlot* pCoastalBarbarianCamp = NULL;4382 int iClosestEnemyDistance = MAX_INT;4383 int iClosestCampDistance = MAX_INT;4384 int iDistance;4385 CvPlayer& owningPlayer = GET_PLAYER(m_eOwner);43864387 if(GetFirstArmyID() == -1)4388 {4389 pInitialUnit = FindInitialUnit();4390 }4391 else4392 {4393 CvArmyAI* pThisArmy = owningPlayer.getArmyAI(m_viArmyIDs[0]);4394 int iUnitID = pThisArmy->GetFirstUnitID();4395 if(iUnitID != -1)4396 {4397 pInitialUnit = owningPlayer.getUnit(iUnitID);4398 }4399 else4400 {4401 pInitialUnit = FindInitialUnit();4402 }4403 }44044405 if(pInitialUnit != NULL)4406 {4407 WeightedPlotVector aPlotList;4408 aPlotList.reserve(64);44094410 int iUnitX = pInitialUnit->getX();4411 int iUnitY = pInitialUnit->getY();4412 int iBaseMoves = pInitialUnit->baseMoves();44134414 // Look at map for enemy naval units4415 for(iPlotLoop = 0; iPlotLoop < GC.getMap().numPlots(); iPlotLoop++)4416 {4417 pPlot = GC.getMap().plotByIndexUnchecked(iPlotLoop);44184419 if(pPlot->isRevealed(owningPlayer.getTeam()))4420 {4421 if(pPlot->isWater())4422 {4423 if(pPlot->getNumUnits() > 0)4424 {4425 int iPlotDistance = plotDistance(iUnitX, iUnitY, pPlot->getX(), pPlot->getY());4426 for(iUnitLoop = 0; iUnitLoop < pPlot->getNumUnits(); iUnitLoop++)4427 {4428 CvUnit* pLoopUnit = pPlot->getUnitByIndex(iUnitLoop);4429 {4430 if(pLoopUnit->isEnemy(owningPlayer.getTeam()))4431 {4432 int iScore = iBaseMoves * iPlotDistance;4433 if (pLoopUnit->isTrade()) // we want to plunder trade routes of possible4434 {4435 iScore /= 3;4436 }4437 if (pLoopUnit->isEmbarked()) // we want to take out embarked units more than ships4438 {4439 iScore = (iScore * 2) / 3;4440 }44414442 aPlotList.push_back(pPlot, iScore);4443 }4444 }4445 }4446 }4447 }44484449 // Backup plan is a coastal enemy city4450 else if(pPlot->isCity() && pPlot->isCoastalLand())4451 {4452 pCity = pPlot->getPlotCity();4453 if(pCity)4454 {4455 if(atWar(owningPlayer.getTeam(), pCity->getTeam()))4456 {4457 iDistance = plotDistance(pInitialUnit->getX(), pInitialUnit->getY(), pCity->getX(), pCity->getY());4458 if(iDistance < iClosestEnemyDistance)4459 {4460 iClosestEnemyDistance = iDistance;4461 pEnemyCoastalCity = pCity;4462 }4463 }4464 }4465 }44664467 else if(pPlot->isCoastalLand() && pPlot->getImprovementType() == GC.getBARBARIAN_CAMP_IMPROVEMENT())4468 {4469 iDistance = plotDistance(pInitialUnit->getX(), pInitialUnit->getY(), pPlot->getX(), pPlot->getY());4470 if(iDistance < iClosestCampDistance)4471 {4472 iClosestCampDistance = iDistance;4473 pCoastalBarbarianCamp = pPlot;4474 }4475 }4476 }4477 }44784479 int iBestTurns;4480 pBestPlot = GetReachablePlot(pInitialUnit, aPlotList, &iBestTurns);44814482 // None found, patrol over near closest enemy coastal city, or if not that a water tile adjacent to a camp4483 if(pBestPlot == NULL)4484 {4485 if(pEnemyCoastalCity != NULL)4486 {4487 // Find a coastal water tile adjacent to enemy city4488 for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; ++iDirectionLoop)4489 {4490 CvPlot* pAdjacentPlot = plotDirection(pEnemyCoastalCity->plot()->getX(), pEnemyCoastalCity->plot()->getY(), ((DirectionTypes)iDirectionLoop));4491 if(pAdjacentPlot != NULL && pAdjacentPlot->isWater() && pAdjacentPlot->isShallowWater())4492 {4493 if(pInitialUnit->GeneratePath(pAdjacentPlot))4494 {4495 pBestPlot = pAdjacentPlot;4496 }4497 }4498 }4499 }45004501 else4502 {4503 if(pCoastalBarbarianCamp != NULL)4504 {4505 // Find a coastal water tile adjacent to camp4506 for(int iDirectionLoop = 0; iDirectionLoop < NUM_DIRECTION_TYPES; ++iDirectionLoop)4507 {4508 CvPlot* pAdjacentPlot = plotDirection(pCoastalBarbarianCamp->getX(), pCoastalBarbarianCamp->getY(), ((DirectionTypes)iDirectionLoop));4509 if(pAdjacentPlot != NULL && pAdjacentPlot->isWater() && pAdjacentPlot->isShallowWater())4510 {4511 if(pInitialUnit->GeneratePath(pAdjacentPlot))4512 {4513 pBestPlot = pAdjacentPlot;4514 }4515 }4516 }4517 }4518 }4519 }4520 }45214522 return pBestPlot;4523}