Bazaar developer reference

CvUnitCycler::Rebuild(CvUnit *)

Defined in
CvUnitCycler.cpp, line 27
Class
CvUnitCycler
Hook name
CivHooks::CvUnitCycler_Rebuild

Hooks

static bool BeforeCvUnitCycler_Rebuild(CvUnitCycler* self, CvUnit * pkStartUnit);static void AfterCvUnitCycler_Rebuild(CvUnitCycler* self, CvUnit * pkStartUnit);static void ReplaceCvUnitCycler_Rebuild(void (*original)(CvUnitCycler*, CvUnit *), CvUnitCycler* self, CvUnit * pkStartUnit);CivRegisterBefore<CivHooks::CvUnitCycler_Rebuild>(host, &BeforeCvUnitCycler_Rebuild);CivRegisterAfter<CivHooks::CvUnitCycler_Rebuild>(host, &AfterCvUnitCycler_Rebuild);CivRegisterReplace<CivHooks::CvUnitCycler_Rebuild>(host, &ReplaceCvUnitCycler_Rebuild);

Code

27void CvUnitCycler::Rebuild(CvUnit *pkStartUnit /* = NULL */)28{29	// Delete contents of old list30	Node* pUnitNode = HeadNode();31	while(pUnitNode != NULL)32	{33		DeleteNode(pUnitNode);34		pUnitNode = HeadNode();35	}3637	if (pkStartUnit == NULL)38	{39		// If no unit supplied, use the selected unit.40		auto_ptr<ICvUnit1> pSelectedUnit(DLLUI->GetHeadSelectedUnit());41		pkStartUnit = GC.UnwrapUnitPointer(pSelectedUnit.get());4243		if (pkStartUnit && pkStartUnit->getOwner() != m_pkPlayer->GetID())44		{45			// Not ours, fall back to just selecting a worker46			pkStartUnit = NULL;47		}48	}4950	CvUnit* pLoopUnit;51	int iLoop;52	CvUnit* pkFirstUnit = m_pkPlayer->firstUnit(&iLoop);53	for(pLoopUnit = pkFirstUnit; pLoopUnit != NULL; pLoopUnit = m_pkPlayer->nextUnit(&iLoop))54	{55		// Reset cycle order (will be used later in this function)56		pLoopUnit->SetCycleOrder(0);5758		if (!pkStartUnit)59		{60			// Workers first61			if(pLoopUnit->workRate(true) > 0)62				pkStartUnit = pLoopUnit;63		}64	}6566	if (!pkStartUnit)67		pkStartUnit = pkFirstUnit;6869	// Add first unit to list70	if(pkStartUnit)71	{72		m_kNodeList.insertAtEnd(pkStartUnit->GetID());7374		// Current unit is the first one75		UnitHandle pCurrentUnit = pkStartUnit;76		pCurrentUnit->SetCycleOrder(1);7778		// Loop through units until everyone is accounted for79		int iNumUnits = m_pkPlayer->getNumUnits();80		while(m_kNodeList.getLength() < iNumUnits)81		{82			int iBestUnitScore = MAX_INT;83			CvUnit* pBestUnit = NULL;8485			int iX = pCurrentUnit->getX();86			int iY = pCurrentUnit->getY();87			for(pLoopUnit = m_pkPlayer->firstUnit(&iLoop); pLoopUnit != NULL; pLoopUnit = m_pkPlayer->nextUnit(&iLoop))88			{89				// If we've already added this unit to the cycle list, skip it90				if(pLoopUnit->GetCycleOrder() == 1)91					continue;9293				int iScore = plotDistance(iX, iY, pLoopUnit->getX(), pLoopUnit->getY());9495				// Closest unit yet96				if(iScore < iBestUnitScore)97				{98					iBestUnitScore = iScore;99					pBestUnit = pLoopUnit;100				}101			}102103			CvAssertMsg(pBestUnit, "Didn't find a unit to add to cycle list.");104105			if (pBestUnit)106			{107				m_kNodeList.insertAtEnd(pBestUnit->GetID());108109				// Now have a new current unit110				pCurrentUnit = pBestUnit;111				pCurrentUnit->SetCycleOrder(1);112			}113			else114				break;115		}116	}117}

Calls

Called by