Bazaar developer reference

CvUnit::EnemyScoreAtRange(const CvPlot *, bool) const

Defined in
CvUnit.cpp, line 13403
Class
CvUnit
Hook name
CivHooks::CvUnit_EnemyScoreAtRange

Hooks

static bool BeforeCvUnit_EnemyScoreAtRange(const CvUnit* self, const CvPlot* pPlot, bool onlyInterceptors, int& result);static void AfterCvUnit_EnemyScoreAtRange(const CvUnit* self, const CvPlot* pPlot, bool onlyInterceptors, int& result);static int ReplaceCvUnit_EnemyScoreAtRange(int (*original)(const CvUnit*, const CvPlot*, bool), const CvUnit* self, const CvPlot* pPlot, bool onlyInterceptors);CivRegisterBefore<CivHooks::CvUnit_EnemyScoreAtRange>(host, &BeforeCvUnit_EnemyScoreAtRange);CivRegisterAfter<CivHooks::CvUnit_EnemyScoreAtRange>(host, &AfterCvUnit_EnemyScoreAtRange);CivRegisterReplace<CivHooks::CvUnit_EnemyScoreAtRange>(host, &ReplaceCvUnit_EnemyScoreAtRange);

Code

13402#if defined(MOD_AI_SMART_V3)13403int CvUnit::EnemyScoreAtRange(const CvPlot* pPlot, bool onlyInterceptors) const13404{13405	VALIDATE_OBJECT13406	if(pPlot == NULL)13407	{13408		pPlot = plot();13409	}1341013411	int interceptorCount = 0;13412	CvPlayer& playerOwner = GET_PLAYER(m_eOwner);1341313414	// Loop through all the players13415	for(int iI = 0; iI < MAX_PLAYERS; iI++)13416	{13417		CvPlayer& kPlayer = GET_PLAYER((PlayerTypes)iI);13418		if(kPlayer.isAlive() && kPlayer.GetID() != playerOwner.GetID())13419		{13420			if (atWar(kPlayer.getTeam(), playerOwner.getTeam()))13421			{13422				CvUnit* pLoopUnit;13423				int iLoopUnit = 0;13424				for (pLoopUnit = kPlayer.firstUnit(&iLoopUnit); pLoopUnit != NULL; pLoopUnit = kPlayer.nextUnit(&iLoopUnit))13425				{13426					// Must be able to intercept or have combat value.13427					if (!pLoopUnit->isDelayedDeath() && (pLoopUnit->canAirDefend() || (!onlyInterceptors && (pLoopUnit->GetBaseCombatStrength() > 0))))13428					{13429						int plDistance = plotDistance(pLoopUnit->getX(), pLoopUnit->getY(), pPlot->getX(), pPlot->getY());13430						int rangeScore = GetRange() + (pLoopUnit->canAirDefend() ? (pLoopUnit->getUnitInfo().GetAirInterceptRange() / 2) : 0);13431						// Check a minimum range to be a target to intercept13432						if (plDistance <= rangeScore)13433						{13434							interceptorCount++;13435						}13436						// This is considered close range, counts double.13437						if (plDistance <= (rangeScore / 2))13438						{13439							interceptorCount++;13440						}13441					}13442				}13443			}13444		}13445	}13446	return interceptorCount;13447}

Calls

Called by