void CSovereign::InitEnemyObjectList (CSystem *pSystem) // InitEnemyObjectList // // Compiles and caches a list of enemy objects in the system { int i; if (m_pEnemyObjectsSystem != pSystem) { m_EnemyObjects.RemoveAll(); for (i = 0; i < pSystem->GetObjectCount(); i++) { CSpaceObject *pObj = pSystem->GetObject(i); if (pObj && pObj->ClassCanAttack() && IsEnemy(pObj->GetSovereign())) m_EnemyObjects.FastAdd(pObj); } m_pEnemyObjectsSystem = pSystem; } }
bool CNavigationPath::PathIsClear (CSystem *pSystem, CSovereign *pSovereign, const CVector &vFrom, const CVector &vTo, CSpaceObject **retpEnemy, CVector *retvAway) // PathIsClear // // Returns TRUE if the path from vFrom to vTo is free from enemy stations. // If FALSE, retpEnemy is initialized with the enemy that is blocking the // path and retvAway is a unit vector away from the enemy that avoids it { int i; // Loop over all objects in the system CSpaceObject *pNearestEnemy = NULL; Metric rNearestDist = MAX_SAFE_DIST; CVector vNearestAway; for (i = 0; i < pSystem->GetObjectCount(); i++) { CSpaceObject *pObj = pSystem->GetObject(i); CSovereign *pObjSovereign; if (pObj && (pObj->GetScale() == scaleStructure || ((pObj->GetScale() == scaleShip) && (pObj->GetVel().Length2() < MIN_SPEED2))) && (pObjSovereign = pObj->GetSovereign()) && (pObjSovereign->IsEnemy(pSovereign)) && pObj->CanAttack()) { CVector vAway; Metric rDist = CalcDistanceToPath(pObj->GetPos(), vFrom, vTo, NULL, &vAway); if (rDist < rNearestDist) { rNearestDist = rDist; pNearestEnemy = pObj; vNearestAway = vAway; } } } // If we found a threatening object, return it if (pNearestEnemy) { if (retpEnemy) *retpEnemy = pNearestEnemy; if (retvAway) *retvAway = vNearestAway; return false; } // Otherwise, the path is OK return true; }