Bazaar developer reference

CvHomelandAI::IsAnyValidExploreMoves(const CvUnit *) const

Defined in
CvHomelandAI.cpp, line 175
Class
CvHomelandAI
Hook name
CivHooks::CvHomelandAI_IsAnyValidExploreMoves

Hooks

static bool BeforeCvHomelandAI_IsAnyValidExploreMoves(const CvHomelandAI* self, const CvUnit* pUnit, bool& result);static void AfterCvHomelandAI_IsAnyValidExploreMoves(const CvHomelandAI* self, const CvUnit* pUnit, bool& result);static bool ReplaceCvHomelandAI_IsAnyValidExploreMoves(bool (*original)(const CvHomelandAI*, const CvUnit*), const CvHomelandAI* self, const CvUnit* pUnit);CivRegisterBefore<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &BeforeCvHomelandAI_IsAnyValidExploreMoves);CivRegisterAfter<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &AfterCvHomelandAI_IsAnyValidExploreMoves);CivRegisterReplace<CivHooks::CvHomelandAI_IsAnyValidExploreMoves>(host, &ReplaceCvHomelandAI_IsAnyValidExploreMoves);

Code

175bool CvHomelandAI::IsAnyValidExploreMoves(const CvUnit* pUnit) const176{177	CvEconomicAI* pEconomicAI = m_pPlayer->GetEconomicAI();178	FFastVector<int>& aiExplorationPlots = pEconomicAI->GetExplorationPlots();179	FFastVector<int>& aiExplorationPlotRatings = pEconomicAI->GetExplorationPlotRatings();180181	if (aiExplorationPlots.size() > 0)182	{183		int iUnitX = pUnit->getX();184		int iUnitY = pUnit->getY();185186		// Filter the list with some quick checks, then add the rest to a list that we can sort by distance187		DistanceSortedPlotArray aDistanceList;188		aDistanceList.reserve( aiExplorationPlots.size() );189190		for(uint ui = 0; ui < aiExplorationPlots.size(); ui++)191		{192			int iPlot = aiExplorationPlots[ui];193			if(iPlot < 0)194			{195				continue;196			}197198			CvPlot* pEvalPlot = GC.getMap().plotByIndex(iPlot);199			if(!pEvalPlot)200			{201				continue;202			}203204			if(aiExplorationPlotRatings[ui] == 0)205			{206				continue;207			}208209			int iDistX = abs( pEvalPlot->getX() - iUnitX );210			int iDistY = abs( pEvalPlot->getY() - iUnitY );211212			aDistanceList.push_back(std::pair<int, CvPlot*>((iDistX*iDistX)+(iDistY*iDistY), pEvalPlot));213214		}215216		if (aDistanceList.size())217		{218			std::sort(aDistanceList.begin(), aDistanceList.end(), SortUnitDistance);219220			for (DistanceSortedPlotArray::const_iterator itr = aDistanceList.begin(); itr != aDistanceList.end(); ++itr)221			{222				CvPlot* pEvalPlot = (*itr).second;223				if(!IsValidExplorerEndTurnPlot(pUnit, pEvalPlot))224				{225					continue;226				}227				// hitting the path finder, may not be the best idea. . .228				bool bCanFindPath = GC.getPathFinder().GenerateUnitPath(pUnit, iUnitX, iUnitY, pEvalPlot->getX(), pEvalPlot->getY(), MOVE_TERRITORY_NO_ENEMY | MOVE_MAXIMIZE_EXPLORE | MOVE_UNITS_IGNORE_DANGER /*iFlags*/, true/*bReuse*/);229				if(!bCanFindPath)230				{231					continue;232				}233234				return true;235			}236		}237	}238239240	return false;241}

Calls

Called by