Bazaar developer reference

CvAIOperationNavalSuperiority::FindBestTarget()

Defined in
CvAIOperation.cpp, line 4373
Class
CvAIOperationNavalSuperiority
Hook name
CivHooks::CvAIOperationNavalSuperiority_FindBestTarget
Overrides
CvAINavalOperation::FindBestTarget()

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}

Calls

Called by