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
CLinkList::getLengthCLinkList::insertAtEnd- CvGlobals::GetEngineUserInterface()
- CvGlobals::UnwrapUnitPointer(ICvUnit1 *)
- CvPlayer::firstUnit(int *, bool)
- CvPlayer::GetID() const
- CvPlayer::getNumUnits() const
- CvPlayer::nextUnit(int *, bool)
- CvUnit::GetCycleOrder() const
- CvUnit::GetID() const
- CvUnit::getOwner() const
- CvUnit::getX() const
- CvUnit::getY() const
- CvUnit::SetCycleOrder(int)
- CvUnit::workRate(bool, BuildTypes) const
- CvUnitCycler::DeleteNode(CvUnitCycler::Node *)
- CvUnitCycler::HeadNode()
FObjectHandle::FObjectHandleFObjectHandle::operator->FObjectHandle::operator=ICvUserInterface1::GetHeadSelectedUnit- plotDistance(int, int, int, int)
std::auto_ptr::auto_ptrstd::auto_ptr::get