OpenClonk
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
C4ObjectList Class Reference

#include <C4ObjectList.h>

Inheritance diagram for C4ObjectList:
[legend]
Collaboration diagram for C4ObjectList:
[legend]

Classes

class  iterator
 
class  ReverseView
 

Public Types

enum  SortType { stNone =0, stMain, stContents, stReverse }
 
typedef int SortProc (C4Object *, C4Object *)
 

Public Member Functions

 C4ObjectList ()
 
 C4ObjectList (const C4ObjectList &List)
 
virtual ~C4ObjectList ()
 
iterator begin () const
 
const iterator end () const
 
const ReverseView reverse () const
 
virtual void Default ()
 
virtual void Clear ()
 
void Sort ()
 
void Copy (const C4ObjectList &rList)
 
void DrawIfCategory (C4TargetFacet &cgo, int iPlayer, uint32_t dwCat, bool fInvert)
 
void Draw (C4TargetFacet &cgo, int iPlayer, int MinPlane, int MaxPlane)
 
void DrawSelectMark (C4TargetFacet &cgo) const
 
void CloseMenus ()
 
void UpdateGraphics (bool fGraphicsChanged)
 
void UpdateFaces (bool bUpdateShape)
 
void ClearInfo (C4ObjectInfo *pInfo)
 
virtual bool Add (C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
 
bool AddSortCustom (C4Object *nObj, SortProc &pSortProc)
 
virtual bool Remove (C4Object *pObj)
 
virtual bool AssignInfo ()
 
virtual bool ValidateOwners ()
 
StdStrBuf GetNameList (C4DefList &rDefs) const
 
bool IsClear () const
 
bool DenumeratePointers ()
 
bool Write (char *szTarget)
 
void CompileFunc (StdCompiler *pComp, C4ValueNumbers *=nullptr)
 
void CompileFunc (StdCompiler *pComp, bool fSkipPlayerObjects, C4ValueNumbers *)
 
void Denumerate (C4ValueNumbers *)
 
bool IsContained (const C4Object *pObj) const
 
int ClearPointers (C4Object *pObj)
 
int ObjectCount (C4ID id=C4ID::None) const
 
int MassCount ()
 
int ListIDCount (int32_t dwCategory) const
 
C4ObjectGetObject (int Index=0) const
 
C4ObjectGetFirstObject () const
 
C4ObjectGetLastObject () const
 
C4ObjectFind (C4Def *def, int iOwner=ANY_OWNER, DWORD dwOCF=OCF_All)
 
C4ObjectFindOther (C4ID id, int iOwner=ANY_OWNER)
 
const C4ObjectLinkGetLink (const C4Object *pObj) const
 
C4ObjectLinkGetLink (const C4Object *pObj)
 
C4ID GetListID (int32_t dwCategory, int Index) const
 
bool ShiftContents (C4Object *pNewFirst)
 
void DeleteObjects ()
 
void UpdateScriptPointers ()
 
bool CheckSort (C4ObjectList *pList)
 
void CheckCategorySort ()
 

Public Attributes

C4ObjectLinkFirst
 
C4ObjectLinkLast
 
int Mass
 
std::list< int32_t > * pEnumerated
 

Protected Member Functions

virtual void InsertLinkBefore (C4ObjectLink *pLink, C4ObjectLink *pBefore)
 
virtual void InsertLink (C4ObjectLink *pLink, C4ObjectLink *pAfter)
 
virtual void RemoveLink (C4ObjectLink *pLnk)
 
iteratorAddIter (iterator *iter) const
 
void RemoveIter (iterator *iter) const
 

Protected Attributes

iteratorFirstIter {nullptr}
 

Friends

class iterator
 

Detailed Description

Definition at line 44 of file C4ObjectList.h.

Member Typedef Documentation

typedef int C4ObjectList::SortProc(C4Object *, C4Object *)

Definition at line 118 of file C4ObjectList.h.

Member Enumeration Documentation

Enumerator
stNone 
stMain 
stContents 
stReverse 

Definition at line 55 of file C4ObjectList.h.

Constructor & Destructor Documentation

C4ObjectList::C4ObjectList ( )

Definition at line 32 of file C4ObjectList.cpp.

References Default().

33 {
34  Default();
35 }
virtual void Default()

Here is the call graph for this function:

C4ObjectList::C4ObjectList ( const C4ObjectList List)

Definition at line 37 of file C4ObjectList.cpp.

References Copy(), and Default().

37  : FirstIter(nullptr)
38 {
39  Default();
40  Copy(List);
41 }
iterator * FirstIter
Definition: C4ObjectList.h:165
void Copy(const C4ObjectList &rList)
virtual void Default()

Here is the call graph for this function:

C4ObjectList::~C4ObjectList ( )
virtual

Definition at line 43 of file C4ObjectList.cpp.

References Clear().

44 {
45  Clear();
46 }
virtual void Clear()

Here is the call graph for this function:

Member Function Documentation

bool C4ObjectList::Add ( C4Object nObj,
SortType  eSort,
C4ObjectList pLstSorted = nullptr 
)
virtual

Definition at line 123 of file C4ObjectList.cpp.

References C4D_StaticBack, C4Object::Category, CheckCategorySort(), CheckSort(), C4Object::Def, First, GetLink(), C4Object::GetPlane(), C4Object::id, InsertLink(), Last, Mass, C4Object::Mass, C4ObjectLink::Next, C4ObjectLink::Obj, C4ObjectLink::Prev, C4PropList::Status, stMain, stReverse, and C4Object::Unsorted.

Referenced by C4GameObjects::Add(), C4LSectors::Add(), CompileFunc(), Copy(), DenumeratePointers(), C4Object::Enter(), C4Player::MakeCrewMember(), C4Player::PlaceReadyCrew(), C4GameObjects::PostLoad(), C4Object::StatusDeactivate(), C4LSectors::Update(), and C4MouseControl::UpdateSingleSelection().

124 {
125  C4ObjectLink *nLnk;
126  if (!nObj || !nObj->Def || !nObj->Status) return false;
127 
128 #ifdef _DEBUG
129  if (eSort==stMain)
130  {
132  if (pLstSorted)
133  assert(CheckSort(pLstSorted));
134  }
135 #endif
136 
137  // dbg: don't do double links
138  assert (!GetLink(nObj));
139 
140  // no self-sort
141  assert(pLstSorted != this);
142 
143  // Allocate new link
144  if (!(nLnk=new C4ObjectLink)) return false;
145  // Set link
146  nLnk->Obj=nObj;
147 
148  // Search insert position (default: end of list)
149  C4ObjectLink *cLnk = nullptr, *cPrev = Last;
150 
151  // Should sort?
152  if (eSort == stReverse)
153  {
154  // reverse sort: Add to beginning of list
155  cLnk = First; cPrev = nullptr;
156  }
157  else if (eSort)
158  {
159  // Sort override? Leave default as is.
160  bool fUnsorted = nObj->Unsorted;
161  if (!fUnsorted)
162  {
163  // Sort by master list?
164  if (pLstSorted)
165  {
166  cPrev = nullptr; cLnk = First;
167  while(cLnk && (!cLnk->Obj->Status || cLnk->Obj->Unsorted)) cLnk = cLnk->Next;
168 
169 #ifndef _DEBUG
170  if(cLnk)
171 #endif
172  {
173  C4ObjectLink* cLnk2;
174  for(cLnk2 = pLstSorted->First; cLnk2; cLnk2 = cLnk2->Next)
175  {
176  if(cLnk2->Obj->Status && !cLnk2->Obj->Unsorted)
177  {
178  if(cLnk2->Obj == nObj)
179  {
180  assert(!cLnk || cLnk->Obj != nObj);
181  break;
182  }
183 
184  if(cLnk && cLnk2->Obj == cLnk->Obj)
185  {
186  cPrev = cLnk;
187  cLnk = cLnk->Next;
188  while(cLnk && (!cLnk->Obj->Status || cLnk->Obj->Unsorted)) cLnk = cLnk->Next;
189 
190 #ifndef _DEBUG
191  if(!cLnk) break;
192 #endif
193  }
194  }
195  }
196 
197  assert(cLnk2 != nullptr);
198  }
199  }
200  else
201  {
202  // No master list: Find successor by matching Plane / id
203  // Sort by matching Plane/id is necessary for inventory shifting.
204  // It is not done for static back to allow multiobject outside structure.
205  // Unsorted objects are ignored in comparison.
206  if (!(nObj->Category & C4D_StaticBack))
207  for (cPrev=nullptr,cLnk=First; cLnk; cLnk=cLnk->Next)
208  if (cLnk->Obj->Status && !cLnk->Obj->Unsorted)
209  {
210  if (cLnk->Obj->GetPlane() == nObj->GetPlane())
211  if (cLnk->Obj->id == nObj->id)
212  break;
213  cPrev=cLnk;
214  }
215 
216  // Find successor by relative category
217  if(!cLnk)
218  for (cPrev=nullptr, cLnk=First; cLnk; cLnk=cLnk->Next)
219  if (cLnk->Obj->Status && !cLnk->Obj->Unsorted)
220  {
221  if (cLnk->Obj->GetPlane() <= nObj->GetPlane())
222  break;
223  cPrev=cLnk;
224  }
225  }
226 
227  cLnk = cPrev ? cPrev->Next : First;
228  }
229  }
230 
231  assert(!cPrev || cPrev->Next == cLnk);
232  assert(!cLnk || cLnk->Prev == cPrev);
233 
234  // Insert new link after predecessor
235  InsertLink(nLnk, cPrev);
236 
237 #ifdef _DEBUG
238  // Debug: Check sort
239  if (eSort == stMain)
240  {
242  if (pLstSorted)
243  assert(CheckSort(pLstSorted));
244  }
245 #endif
246 
247  // Add mass
248  Mass+=nObj->Mass;
249 
250  return true;
251 }
C4ID id
Definition: C4Object.h:108
int32_t Mass
Definition: C4Object.h:115
C4ObjectLink * First
Definition: C4ObjectList.h:51
int32_t GetPlane() const
Definition: C4Object.h:180
const C4ObjectLink * GetLink(const C4Object *pObj) const
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
void CheckCategorySort()
virtual void InsertLink(C4ObjectLink *pLink, C4ObjectLink *pAfter)
int32_t Status
Definition: C4PropList.h:168
const int32_t C4D_StaticBack
Definition: C4Def.h:40
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
bool Unsorted
Definition: C4Object.h:129
int32_t Category
Definition: C4Object.h:113
C4ObjectLink * Last
Definition: C4ObjectList.h:51
bool CheckSort(C4ObjectList *pList)
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

C4ObjectList::iterator * C4ObjectList::AddIter ( iterator iter) const
protected

Definition at line 952 of file C4ObjectList.cpp.

References FirstIter.

Referenced by C4ObjectList::iterator::iterator().

953 {
954  iterator * r = FirstIter;
955  FirstIter = iter;
956  return r;
957 }
iterator * FirstIter
Definition: C4ObjectList.h:165
friend class iterator
Definition: C4ObjectList.h:169

Here is the caller graph for this function:

bool C4ObjectList::AddSortCustom ( C4Object nObj,
SortProc pSortProc 
)
bool C4ObjectList::AssignInfo ( )
virtual

Reimplemented in C4GameObjects.

Definition at line 549 of file C4ObjectList.cpp.

References C4Object::AssignInfo(), Last, C4ObjectLink::Obj, C4ObjectLink::Prev, and C4PropList::Status.

Referenced by C4GameObjects::AssignInfo().

550 {
551  // the list seems to be traced backwards here, to ensure crew objects are added in correct order
552  // (or semi-correct, because this will work only if the crew order matches the main object list order)
553  // this is obsolete now, because the crew list is stored in the savegame
554  C4ObjectLink *cLnk;
555  for (cLnk=Last; cLnk; cLnk=cLnk->Prev)
556  if (cLnk->Obj->Status)
557  cLnk->Obj->AssignInfo();
558  return true;
559 }
int32_t Status
Definition: C4PropList.h:168
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
C4ObjectLink * Last
Definition: C4ObjectList.h:51
bool AssignInfo()
Definition: C4Object.cpp:2386
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

C4ObjectList::iterator C4ObjectList::begin ( ) const

Definition at line 944 of file C4ObjectList.cpp.

References First, and iterator.

Referenced by C4GameObjects::PostLoad(), and C4Object::ShiftContents().

945 {
946  return iterator(*this, First, false);
947 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
friend class iterator
Definition: C4ObjectList.h:169

Here is the caller graph for this function:

void C4ObjectList::CheckCategorySort ( )

Definition at line 846 of file C4ObjectList.cpp.

References First, C4Object::GetPlane(), C4ObjectLink::Next, C4ObjectLink::Obj, C4PropList::Status, and C4Object::Unsorted.

Referenced by Add().

847 {
848  // debug: Check whether object list is sorted correctly
849  C4ObjectLink *cLnk, *cPrev=nullptr;
850  for (cLnk=First; cLnk; cLnk=cLnk->Next)
851  if (!cLnk->Obj->Unsorted && cLnk->Obj->Status)
852  {
853  if (cPrev) assert(cPrev->Obj->GetPlane() >= cLnk->Obj->GetPlane());
854  cPrev = cLnk;
855  }
856 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
int32_t GetPlane() const
Definition: C4Object.h:180
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
bool Unsorted
Definition: C4Object.h:129
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ObjectList::CheckSort ( C4ObjectList pList)

Definition at line 820 of file C4ObjectList.cpp.

References First, Log(), LogSilent(), mkNamingAdapt(), C4ObjectLink::Next, C4ObjectLink::Obj, C4PropList::Status, and C4Object::Unsorted.

Referenced by Add(), and C4LSectors::CheckSort().

821 {
822  C4ObjectLink *cLnk = First, *cLnk2 = pList->First;
823  while (cLnk && (!cLnk->Obj->Status || cLnk->Obj->Unsorted)) cLnk = cLnk->Next;
824 
825  while (cLnk)
826  if (!cLnk2)
827  {
828  Log("CheckSort failure");
829  C4ValueNumbers numbers;
830  LogSilent(DecompileToBuf<StdCompilerINIWrite>(mkNamingAdapt(C4ObjectListDumpHelper(this, &numbers), "SectorList")).getData());
831  LogSilent(DecompileToBuf<StdCompilerINIWrite>(mkNamingAdapt(C4ObjectListDumpHelper(pList, &numbers), "MainList")).getData());
832  return false;
833  }
834  else
835  {
836  if (cLnk->Obj == cLnk2->Obj)
837  {
838  cLnk = cLnk->Next;
839  while (cLnk && (!cLnk->Obj->Status || cLnk->Obj->Unsorted)) cLnk = cLnk->Next;
840  }
841  cLnk2 = cLnk2->Next;
842  }
843  return true;
844 }
bool LogSilent(const char *szMessage, bool fConsole)
Definition: C4Log.cpp:124
C4ObjectLink * First
Definition: C4ObjectList.h:51
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
bool Unsorted
Definition: C4Object.h:129
bool Log(const char *szMessage)
Definition: C4Log.cpp:202
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::Clear ( )
virtual

Reimplemented in C4GameObjects.

Definition at line 48 of file C4ObjectList.cpp.

References First, FirstIter, Last, C4ObjectLink::Next, and pEnumerated.

Referenced by C4GameObjects::Clear(), C4MouseControl::Clear(), C4LSector::ClearObjects(), CompileFunc(), Copy(), C4GameObjects::DeleteObjects(), C4MouseControl::LeftUpDragNone(), C4GameObjects::PostLoad(), C4MouseControl::UpdateSingleSelection(), and ~C4ObjectList().

49 {
50  C4ObjectLink *cLnk,*nextLnk;
51  for (cLnk=First; cLnk; cLnk=nextLnk)
52  { nextLnk=cLnk->Next; delete cLnk; }
53  First=Last=nullptr;
54  if (pEnumerated)
55  {
56  delete pEnumerated;
57  pEnumerated=nullptr;
58  }
59 
60  for (iterator* it = FirstIter; it; it = it->Next)
61  {
62  it->link = NULL_LINK;
63  }
64 }
iterator * FirstIter
Definition: C4ObjectList.h:165
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
friend class iterator
Definition: C4ObjectList.h:169
C4ObjectLink * Last
Definition: C4ObjectList.h:51
std::list< int32_t > * pEnumerated
Definition: C4ObjectList.h:53

Here is the caller graph for this function:

void C4ObjectList::ClearInfo ( C4ObjectInfo pInfo)

Definition at line 561 of file C4ObjectList.cpp.

References C4Object::ClearInfo(), First, C4ObjectLink::Next, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4ObjectInfoList::DetachFromObjects().

562 {
563  C4ObjectLink *cLnk;
564  for (cLnk=First; cLnk; cLnk=cLnk->Next)
565  if (cLnk->Obj->Status)
566  cLnk->Obj->ClearInfo(pInfo);
567 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28
void ClearInfo(C4ObjectInfo *pInfo)
Definition: C4Object.cpp:2424

Here is the call graph for this function:

Here is the caller graph for this function:

int C4ObjectList::ClearPointers ( C4Object pObj)

Definition at line 366 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4ObjectLink::Obj, and Remove().

Referenced by C4MouseControl::ClearPointers(), and C4Game::ClearPointers().

367 {
368  int rval=0;
369  // Clear all primary list pointers
370  while (Remove(pObj)) rval++;
371  // Clear all sub pointers
372  C4Object *cobj; C4ObjectLink *clnk;
373  for (clnk=First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
374  cobj->ClearPointers(pObj);
375  return rval;
376 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Object * Obj
Definition: C4ObjectList.h:28
virtual bool Remove(C4Object *pObj)

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::CloseMenus ( )

Definition at line 697 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, and C4ObjectLink::Obj.

698 {
699  C4Object *cobj; C4ObjectLink *clnk;
700  for (clnk=First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
701  cobj->CloseMenu(true);
702 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Object * Obj
Definition: C4ObjectList.h:28
void C4ObjectList::CompileFunc ( StdCompiler pComp,
C4ValueNumbers numbers = nullptr 
)

Definition at line 507 of file C4ObjectList.cpp.

References First, StdCompiler::isDeserializer(), mkSTLContainerAdapt(), C4ObjectLink::Next, pEnumerated, StdCompiler::SEP_SEP2, and StdCompiler::Value().

508 {
509  // (Re)create list
510  delete pEnumerated; pEnumerated = new std::list<int32_t>();
511  // Decompiling: Build list
512  if (!pComp->isDeserializer())
513  for (C4ObjectLink *pPos = First; pPos; pPos = pPos->Next)
514  if (pPos->Obj->Status)
515  pEnumerated->push_back(pPos->Obj->Number);
516  // Compile list
518  // Decompiling: Delete list
519  if (!pComp->isDeserializer())
520  { delete pEnumerated; pEnumerated = nullptr; }
521  // Compiling: Nothing to do - list will be denumerated later
522 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
void Value(const T &rStruct)
Definition: StdCompiler.h:161
virtual bool isDeserializer()
Definition: StdCompiler.h:53
StdSTLContainerAdapt< C > mkSTLContainerAdapt(C &rTarget, StdCompiler::Sep eSep=StdCompiler::SEP_SEP)
Definition: StdAdaptors.h:681
std::list< int32_t > * pEnumerated
Definition: C4ObjectList.h:53

Here is the call graph for this function:

void C4ObjectList::CompileFunc ( StdCompiler pComp,
bool  fSkipPlayerObjects,
C4ValueNumbers numbers 
)

Definition at line 464 of file C4ObjectList.cpp.

References Add(), Clear(), StdStrBuf::getData(), StdStrBuf::getLength(), StdCompiler::hasNaming(), StdCompiler::isSerializer(), Last, LogF(), mkNamingAdapt(), mkNamingCountAdapt(), mkParAdapt(), mkPtrAdaptNoNull(), StdCompiler::Exception::Msg, ObjectCount(), StdCompiler::Exception::Pos, C4ObjectLink::Prev, stReverse, and StdCompiler::Value().

465 {
466  // "Object" section count
467  int32_t iObjCnt = ObjectCount();
468  pComp->Value(mkNamingCountAdapt(iObjCnt, "Object"));
469  if (pComp->isSerializer())
470  {
471  // skipping player objects would screw object counting in non-naming compilers
472  assert(!fSkipPlayerObjects || pComp->hasNaming());
473  // Decompile all objects in reverse order
474  for (C4ObjectLink *pPos = Last; pPos; pPos = pPos->Prev)
475  if (pPos->Obj->Status)
476  if (!fSkipPlayerObjects || !pPos->Obj->IsUserPlayerObject())
477  pComp->Value(mkNamingAdapt(mkParAdapt(*pPos->Obj, numbers), "Object"));
478  }
479  else
480  {
481  // FIXME: Check that no PlayerObjects are loaded when fSkipPlayerObjects is true
482  // i.e. that loading and saving was done with the same flag.
483  // Remove previous data
484  Clear();
485  // Load objects, add them to the list.
486  for (int i = 0; i < iObjCnt; i++)
487  {
488  C4Object *pObj = nullptr;
489  try
490  {
491  pComp->Value(mkNamingAdapt(mkParAdapt(mkPtrAdaptNoNull(pObj), numbers), "Object"));
492  Add(pObj, stReverse);
493  }
494  catch (StdCompiler::Exception *pExc)
495  {
496  // Failsafe object loading: If an error occurs during object loading, just skip that object and load the next one
497  if (!pExc->Pos.getLength())
498  LogF("ERROR: Object loading: %s", pExc->Msg.getData());
499  else
500  LogF("ERROR: Object loading(%s): %s", pExc->Pos.getData(), pExc->Msg.getData());
501  delete pExc;
502  }
503  }
504  }
505 }
const char * getData() const
Definition: StdBuf.h:442
virtual bool hasNaming()
Definition: StdCompiler.h:58
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
StdNamingCountAdapt< int_t > mkNamingCountAdapt(int_t &iCount, const char *szName)
Definition: StdAdaptors.h:976
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
Definition: StdAdaptors.h:92
bool isSerializer()
Definition: StdCompiler.h:54
StdPtrAdapt< T > mkPtrAdaptNoNull(T *&rpObj)
Definition: StdAdaptors.h:606
void Value(const T &rStruct)
Definition: StdCompiler.h:161
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
int ObjectCount(C4ID id=C4ID::None) const
C4ObjectLink * Last
Definition: C4ObjectList.h:51
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
Definition: StdAdaptors.h:458
size_t getLength() const
Definition: StdBuf.h:445
virtual void Clear()
bool LogF(const char *strMessage,...)
Definition: C4Log.cpp:260

Here is the call graph for this function:

void C4ObjectList::Copy ( const C4ObjectList rList)

Definition at line 704 of file C4ObjectList.cpp.

References Add(), Clear(), Default(), First, C4ObjectLink::Next, C4ObjectLink::Obj, and stNone.

Referenced by C4ObjectList(), C4Object::GrabContents(), and C4GameObjects::PostLoad().

705 {
706  Clear(); Default();
707  C4ObjectLink *cLnk;
708  for (cLnk=rList.First; cLnk; cLnk=cLnk->Next) Add(cLnk->Obj, C4ObjectList::stNone);
709 }
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
virtual void Default()
virtual void Clear()
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::Default ( )
virtual

Reimplemented in C4GameObjects.

Definition at line 711 of file C4ObjectList.cpp.

References First, Last, Mass, and pEnumerated.

Referenced by C4ObjectList(), C4Player::C4Player(), Copy(), C4GameObjects::Default(), C4MouseControl::Default(), and C4Object::Default().

712 {
713  First=Last=nullptr;
714  Mass=0;
715  pEnumerated=nullptr;
716 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Last
Definition: C4ObjectList.h:51
std::list< int32_t > * pEnumerated
Definition: C4ObjectList.h:53

Here is the caller graph for this function:

void C4ObjectList::DeleteObjects ( )

Definition at line 737 of file C4ObjectList.cpp.

References C4OS_DELETED, C4Game::ClearPointers(), First, Game, Mass, C4ObjectLink::Obj, Remove(), and C4PropList::Status.

Referenced by C4GameObjects::Clear(), and C4GameObjects::DeleteObjects().

738 {
739  // delete links and objects
740  while (First)
741  {
742  C4Object *pObj = First->Obj;
743  if (pObj->Status) Game.ClearPointers(pObj); // clear pointers to removed objects that weren't deleted (game end or section change)
744  pObj->Status = C4OS_DELETED;
745  Remove(pObj);
746  delete pObj;
747  }
748  // reset mass
749  Mass=0;
750 }
C4Game Game
Definition: C4Globals.cpp:52
C4ObjectLink * First
Definition: C4ObjectList.h:51
#define C4OS_DELETED
Definition: C4Object.h:34
int32_t Status
Definition: C4PropList.h:168
void ClearPointers(C4Object *cobj)
Definition: C4Game.cpp:921
C4Object * Obj
Definition: C4ObjectList.h:28
virtual bool Remove(C4Object *pObj)

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::Denumerate ( C4ValueNumbers numbers)

Definition at line 456 of file C4ObjectList.cpp.

References C4Object::Denumerate(), First, C4ObjectLink::Next, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4GameObjects::Denumerate().

457 {
458  C4ObjectLink *cLnk;
459  for (cLnk=First; cLnk; cLnk=cLnk->Next)
460  if (cLnk->Obj->Status)
461  cLnk->Obj->Denumerate(numbers);
462 }
void Denumerate(C4ValueNumbers *) override
Definition: C4Object.cpp:2308
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ObjectList::DenumeratePointers ( )

Definition at line 431 of file C4ObjectList.cpp.

References Add(), C4GameObjects::ObjectPointer(), Objects, pEnumerated, and stNone.

Referenced by C4Object::Denumerate(), and C4Player::DenumeratePointers().

432 {
433  if (!pEnumerated) return false;
434  // Denumerate all object pointers
435  for (std::list<int32_t>::const_iterator pNum = pEnumerated->begin(); pNum != pEnumerated->end(); ++pNum)
436  Add(::Objects.ObjectPointer(*pNum), stNone); // Add to tail, unsorted
437  // Delete old list
438  delete pEnumerated; pEnumerated = nullptr;
439  return true;
440 }
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
std::list< int32_t > * pEnumerated
Definition: C4ObjectList.h:53
C4Object * ObjectPointer(int32_t iNumber)
C4GameObjects Objects
Definition: C4Globals.cpp:48

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::Draw ( C4TargetFacet cgo,
int  iPlayer,
int  MinPlane,
int  MaxPlane 
)

Definition at line 378 of file C4ObjectList.cpp.

References C4D_Foreground, C4Object::Category, C4Object::Draw(), C4Object::DrawTopFace(), C4Object::GetPlane(), Last, C4ObjectLink::Obj, and C4ObjectLink::Prev.

Referenced by C4Viewport::Draw().

379 {
380  C4ObjectLink * clnk, * first;
381  for (first=Last; first; first=first->Prev)
382  if (first->Obj->GetPlane() >= MinPlane)
383  break;
384  // Draw objects (base)
385  for (clnk=first; clnk; clnk=clnk->Prev)
386  {
387  if (clnk->Obj->GetPlane() > MaxPlane)
388  break;
389  if (clnk->Obj->Category & C4D_Foreground)
390  continue;
391  clnk->Obj->Draw(cgo, iPlayer);
392  }
393  // Draw objects (top face)
394  for (clnk=first; clnk; clnk=clnk->Prev)
395  {
396  if (clnk->Obj->GetPlane() > MaxPlane)
397  break;
398  if (clnk->Obj->Category & C4D_Foreground)
399  continue;
400  clnk->Obj->DrawTopFace(cgo, iPlayer);
401  }
402 }
void Draw(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:1785
int32_t GetPlane() const
Definition: C4Object.h:180
void DrawTopFace(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:2045
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
int32_t Category
Definition: C4Object.h:113
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28
const int32_t C4D_Foreground
Definition: C4Def.h:53

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::DrawIfCategory ( C4TargetFacet cgo,
int  iPlayer,
uint32_t  dwCat,
bool  fInvert 
)

Definition at line 404 of file C4ObjectList.cpp.

References C4Object::Category, C4Object::Draw(), C4Object::DrawTopFace(), Last, C4ObjectLink::Obj, and C4ObjectLink::Prev.

Referenced by C4Viewport::Draw().

405 {
406  C4ObjectLink *clnk;
407  // Draw objects (base)
408  for (clnk=Last; clnk; clnk=clnk->Prev)
409  if (!(clnk->Obj->Category & dwCat) == fInvert)
410  clnk->Obj->Draw(cgo, iPlayer);
411  // Draw objects (top face)
412  for (clnk=Last; clnk; clnk=clnk->Prev)
413  if (!(clnk->Obj->Category & dwCat) == fInvert)
414  clnk->Obj->DrawTopFace(cgo, iPlayer);
415 }
void Draw(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:1785
void DrawTopFace(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:2045
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
int32_t Category
Definition: C4Object.h:113
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::DrawSelectMark ( C4TargetFacet cgo) const

Definition at line 690 of file C4ObjectList.cpp.

References C4Object::DrawSelectMark(), Last, C4ObjectLink::Obj, and C4ObjectLink::Prev.

Referenced by C4MouseControl::Draw().

691 {
692  C4ObjectLink *cLnk;
693  for (cLnk=Last; cLnk; cLnk=cLnk->Prev)
694  cLnk->Obj->DrawSelectMark(cgo);
695 }
void DrawSelectMark(C4TargetFacet &cgo) const
Definition: C4Object.cpp:2510
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

const C4ObjectList::iterator C4ObjectList::end ( ) const

Definition at line 948 of file C4ObjectList.cpp.

References iterator.

Referenced by C4ObjectListIterator::GetNext().

949 {
950  return iterator(*this, nullptr, false);
951 }
friend class iterator
Definition: C4ObjectList.h:169

Here is the caller graph for this function:

C4Object * C4ObjectList::Find ( C4Def def,
int  iOwner = ANY_OWNER,
DWORD  dwOCF = OCF_All 
)

Definition at line 296 of file C4ObjectList.cpp.

References ANY_OWNER, C4Object::Def, First, C4ObjectLink::Next, C4ObjectLink::Obj, C4Object::OCF, C4Object::Owner, and C4PropList::Status.

Referenced by C4Command::Acquire(), C4ObjectMenu::DoRefillInternal(), C4RoundResults::EvaluateGoals(), C4Command::Get(), C4MainMenu::MenuCommand(), and C4Command::Put().

297 {
298  C4ObjectLink *cLnk;
299  // Find link and object
300  for (cLnk=First; cLnk; cLnk=cLnk->Next)
301  if (cLnk->Obj->Status)
302  if (cLnk->Obj->Def==def)
303  if ((owner==ANY_OWNER) || (cLnk->Obj->Owner==owner))
304  if (dwOCF & cLnk->Obj->OCF)
305  return cLnk->Obj;
306  return nullptr;
307 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
const int ANY_OWNER
Definition: C4Constants.h:138
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
int32_t Owner
Definition: C4Object.h:110
int32_t Status
Definition: C4PropList.h:168
uint32_t OCF
Definition: C4Object.h:134
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

C4Object * C4ObjectList::FindOther ( C4ID  id,
int  iOwner = ANY_OWNER 
)

Definition at line 309 of file C4ObjectList.cpp.

References ANY_OWNER, C4Object::Def, First, C4Def::id, C4ObjectLink::Next, C4ObjectLink::Obj, C4Object::Owner, and C4PropList::Status.

310 {
311  C4ObjectLink *cLnk;
312  // Find link and object
313  for (cLnk=First; cLnk; cLnk=cLnk->Next)
314  if (cLnk->Obj->Status)
315  if (cLnk->Obj->Def->id!=id)
316  if ((owner==ANY_OWNER) || (cLnk->Obj->Owner==owner))
317  return cLnk->Obj;
318  return nullptr;
319 }
C4ID id
Definition: C4Def.h:101
C4ObjectLink * First
Definition: C4ObjectList.h:51
const int ANY_OWNER
Definition: C4Constants.h:138
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
int32_t Owner
Definition: C4Object.h:110
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28
C4Object* C4ObjectList::GetFirstObject ( ) const
inline

Definition at line 141 of file C4ObjectList.h.

References C4ObjectLink::Obj.

Referenced by C4Player::CheckElimination().

141 { return First ? First->Obj : nullptr; }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

C4Object* C4ObjectList::GetLastObject ( ) const
inline

Definition at line 142 of file C4ObjectList.h.

References C4ObjectLink::Obj.

Referenced by C4Object::PutAwayUnusedObject().

142 { return Last ? Last->Obj : nullptr; }
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

const C4ObjectLink * C4ObjectList::GetLink ( const C4Object pObj) const

Definition at line 335 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, and C4ObjectLink::Obj.

Referenced by Add(), C4Object::AssignInfo(), C4Command::Drop(), GetLink(), C4Player::MakeCrewMember(), C4GameObjects::PostLoad(), C4Command::Put(), Remove(), ShiftContents(), and C4Command::Throw().

336 {
337  if (!pObj) return nullptr;
338  C4ObjectLink *cLnk;
339  for (cLnk=First; cLnk; cLnk=cLnk->Next)
340  if (cLnk->Obj==pObj)
341  return cLnk;
342  return nullptr;
343 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

C4ObjectLink* C4ObjectList::GetLink ( const C4Object pObj)
inline

Definition at line 147 of file C4ObjectList.h.

References GetLink().

148  { return const_cast<C4ObjectLink*>(const_cast<const C4ObjectList*>(this)->GetLink(pObj)); }
const C4ObjectLink * GetLink(const C4Object *pObj) const

Here is the call graph for this function:

C4ID C4ObjectList::GetListID ( int32_t  dwCategory,
int  Index 
) const

Definition at line 69 of file C4ObjectList.cpp.

References C4D_All, C4Id2Def(), C4Def::Category, C4Object::Def, First, C4Def::id, Inside(), MaxTempListID, C4ObjectLink::Next, C4ID::None, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4MainMenu::ActivateRules(), C4RoundResults::EvaluateGoals(), and GetNameList().

70 {
71  int clid;
72  C4ObjectLink *clnk;
73  C4Def *cdef;
74 
75  // Create a temporary list of all id's and counts
76  for (clid=0; clid<MaxTempListID; clid++) TempListID[clid]=C4ID::None;
77  for (clnk=First; clnk && clnk->Obj; clnk=clnk->Next)
78  if (clnk->Obj->Status)
79  if ((dwCategory==C4D_All) || ( (cdef=C4Id2Def(clnk->Obj->Def->id)) && (cdef->Category & dwCategory) ))
80  for (clid=0; clid<MaxTempListID; clid++)
81  {
82  // Already there
83  if (TempListID[clid]==clnk->Obj->Def->id) break;
84  // End of list, add id
85  if (TempListID[clid]==C4ID::None) { TempListID[clid]=clnk->Obj->Def->id; break; }
86  }
87 
88  // Returns indexed id
89  if (Inside(Index,0,MaxTempListID-1)) return TempListID[Index];
90 
91  return C4ID::None;
92 }
C4ID id
Definition: C4Def.h:101
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
static const C4ID None
Definition: C4Id.h:39
const int MaxTempListID
const int32_t C4D_All
Definition: C4Def.h:39
Definition: C4Def.h:98
int32_t Status
Definition: C4PropList.h:168
C4ID TempListID[MaxTempListID]
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:84
int32_t Category
Definition: C4Def.h:117
C4Object * Obj
Definition: C4ObjectList.h:28
bool Inside(T ival, U lbound, V rbound)
Definition: Standard.h:43

Here is the call graph for this function:

Here is the caller graph for this function:

StdStrBuf C4ObjectList::GetNameList ( C4DefList rDefs) const

Definition at line 524 of file C4ObjectList.cpp.

References StdStrBuf::Append(), StdStrBuf::AppendFormat(), C4D_All, GetListID(), C4PropListStatic::GetName(), C4DefList::ID2Def(), and ObjectCount().

Referenced by C4Object::GetDataString().

525 {
526  int cpos,idcount;
527  C4ID c_id;
528  C4Def *cdef;
529  StdStrBuf Buf;
530  for (cpos=0; (c_id=GetListID(C4D_All,cpos)); cpos++)
531  if ((cdef=rDefs.ID2Def(c_id)))
532  {
533  idcount=ObjectCount(c_id);
534  if (cpos>0) Buf.Append(", ");
535  Buf.AppendFormat("%dx %s",idcount,cdef->GetName());
536  }
537  return Buf;
538 }
C4Def * ID2Def(C4ID id)
const char * GetName() const override
Definition: C4PropList.cpp:267
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:190
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:519
const int32_t C4D_All
Definition: C4Def.h:39
Definition: C4Def.h:98
Definition: C4Id.h:25
int ObjectCount(C4ID id=C4ID::None) const
C4ID GetListID(int32_t dwCategory, int Index) const

Here is the call graph for this function:

Here is the caller graph for this function:

C4Object * C4ObjectList::GetObject ( int  Index = 0) const

Definition at line 321 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4Object::AssignDeath(), C4Object::DirectComContents(), C4Object::DoCon(), C4MouseControl::LeftUpDragNone(), ObjectActionThrow(), ObjectComDrop(), ObjectComPut(), ObjectComPutTake(), ObjectComThrow(), C4Command::Put(), C4Player::RemoveCrewObjects(), C4MouseControl::RightUpDragNone(), C4Object::ShiftContents(), and C4MouseControl::UpdateSingleSelection().

322 {
323  int cIdx;
324  C4ObjectLink *cLnk;
325  // Find link and object
326  for (cLnk=First,cIdx=0; cLnk; cLnk=cLnk->Next)
327  if (cLnk->Obj->Status)
328  {
329  if (cIdx==Index) return cLnk->Obj;
330  cIdx++;
331  }
332  return nullptr;
333 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

void C4ObjectList::InsertLink ( C4ObjectLink pLink,
C4ObjectLink pAfter 
)
protectedvirtual

Reimplemented in C4NotifyingObjectList.

Definition at line 595 of file C4ObjectList.cpp.

References First, FirstIter, Last, C4ObjectLink::Next, C4ObjectLink::Obj, and C4ObjectLink::Prev.

Referenced by Add(), C4NotifyingObjectList::InsertLink(), and Sort().

596 {
597  // Insert after
598  if (pAfter)
599  {
600  pLnk->Prev=pAfter; pLnk->Next=pAfter->Next;
601  if (pAfter->Next) pAfter->Next->Prev=pLnk; else Last=pLnk;
602  pAfter->Next=pLnk;
603  }
604  // Insert at head
605  else
606  {
607  pLnk->Prev=nullptr; pLnk->Next=First;
608  if (First) First->Prev=pLnk; else Last=pLnk;
609  First=pLnk;
610  }
611 
612  // adjust iterators
613  if (pAfter)
614  {
615  for (iterator* it = FirstIter; it; it = it->Next)
616  {
617  if (it->link.Obj == pAfter->Obj)
618  {
619  it->link.Next = pLnk;
620  }
621  }
622  }
623 }
iterator * FirstIter
Definition: C4ObjectList.h:165
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
friend class iterator
Definition: C4ObjectList.h:169
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

void C4ObjectList::InsertLinkBefore ( C4ObjectLink pLink,
C4ObjectLink pBefore 
)
protectedvirtual

Reimplemented in C4NotifyingObjectList.

Definition at line 625 of file C4ObjectList.cpp.

References First, FirstIter, Last, C4ObjectLink::Next, C4ObjectLink::Obj, and C4ObjectLink::Prev.

Referenced by C4NotifyingObjectList::InsertLinkBefore().

626 {
627  // Insert before
628  if (pBefore)
629  {
630  pLnk->Prev = pBefore->Prev;
631  if (pBefore->Prev) pBefore->Prev->Next = pLnk; else First = pLnk;
632  pLnk->Next = pBefore; pBefore->Prev = pLnk;
633  }
634  // Insert at end
635  else
636  {
637  pLnk->Next = nullptr; pLnk->Prev = Last;
638  if (Last) Last->Next = pLnk; else First = pLnk;
639  Last = pLnk;
640  }
641 
642  // adjust iterators
643  if (pBefore)
644  {
645  for (iterator* it = FirstIter; it; it = it->Next)
646  {
647  if (it->link.Obj == pBefore->Obj)
648  {
649  it->link.Prev = pLnk;
650  }
651  }
652  }
653 }
iterator * FirstIter
Definition: C4ObjectList.h:165
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
friend class iterator
Definition: C4ObjectList.h:169
C4ObjectLink * Last
Definition: C4ObjectList.h:51
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

bool C4ObjectList::IsClear ( ) const

Definition at line 426 of file C4ObjectList.cpp.

References ObjectCount().

427 {
428  return (ObjectCount()==0);
429 }
int ObjectCount(C4ID id=C4ID::None) const

Here is the call graph for this function:

bool C4ObjectList::IsContained ( const C4Object pObj) const

Definition at line 417 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, and C4ObjectLink::Obj.

Referenced by C4LSectors::AssertObjectNotInList(), C4Object::IsPlayerObject(), C4Player::NotifyOwnedObjects(), and C4Player::SetObjectCrewStatus().

418 {
419  C4ObjectLink *cLnk;
420  for (cLnk=First; cLnk; cLnk=cLnk->Next)
421  if (cLnk->Obj==pObj)
422  return true;
423  return false;
424 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

int C4ObjectList::ListIDCount ( int32_t  dwCategory) const

Definition at line 94 of file C4ObjectList.cpp.

References C4D_All, C4Id2Def(), C4Def::Category, C4Object::Def, First, C4Def::id, MaxTempListID, C4ObjectLink::Next, C4ID::None, C4ObjectLink::Obj, and C4PropList::Status.

95 {
96  int clid;
97  C4ObjectLink *clnk;
98  C4Def *cdef;
99 
100  // Create a temporary list of all id's and counts
101  for (clid=0; clid<MaxTempListID; clid++) TempListID[clid]=C4ID::None;
102  for (clnk=First; clnk && clnk->Obj; clnk=clnk->Next)
103  if (clnk->Obj->Status)
104  if ((dwCategory==C4D_All) || ( (cdef=C4Id2Def(clnk->Obj->Def->id)) && (cdef->Category & dwCategory) ))
105  for (clid=0; clid<MaxTempListID; clid++)
106  {
107  // Already there
108  if (TempListID[clid]==clnk->Obj->Def->id) break;
109  // End of list, add id
110  if (TempListID[clid]==C4ID::None) { TempListID[clid]=clnk->Obj->Def->id; break; }
111  }
112 
113  // Count different id's
114  for (clid=0; clid<MaxTempListID; clid++)
115  if (TempListID[clid]==C4ID::None)
116  return clid;
117 
118  return MaxTempListID;
119 }
C4ID id
Definition: C4Def.h:101
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
static const C4ID None
Definition: C4Id.h:39
const int MaxTempListID
const int32_t C4D_All
Definition: C4Def.h:39
Definition: C4Def.h:98
int32_t Status
Definition: C4PropList.h:168
C4ID TempListID[MaxTempListID]
C4Def * C4Id2Def(C4ID id)
Definition: C4DefList.h:84
int32_t Category
Definition: C4Def.h:117
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

int C4ObjectList::MassCount ( )

Definition at line 355 of file C4ObjectList.cpp.

References First, Mass, C4Object::Mass, C4ObjectLink::Next, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4Object::UpdateMass().

356 {
357  C4ObjectLink *cLnk;
358  int iMass=0;
359  for (cLnk=First; cLnk; cLnk=cLnk->Next)
360  if (cLnk->Obj->Status)
361  iMass+=cLnk->Obj->Mass;
362  Mass=iMass;
363  return iMass;
364 }
int32_t Mass
Definition: C4Object.h:115
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

int C4ObjectList::ObjectCount ( C4ID  id = C4ID::None) const

Definition at line 345 of file C4ObjectList.cpp.

References C4Object::Def, First, C4Def::id, C4ObjectLink::Next, C4ID::None, C4ObjectLink::Obj, and C4PropList::Status.

Referenced by C4Object::AssignDeath(), CompileFunc(), C4Game::CompileRuntimeData(), C4FindObject::Count(), C4EditCursor::DoContextMenu(), C4ObjectMenu::DoRefillInternal(), C4ObjectMenu::Execute(), C4Network2Stats::ExecuteFrame(), C4Object::GetDataString(), GetNameList(), C4Game::InitGameFinal(), IsClear(), C4GameObjects::PostLoad(), C4ControlSyncCheck::Set(), and C4MouseControl::UpdateSingleSelection().

346 {
347  C4ObjectLink *cLnk;
348  int iCount=0;
349  for (cLnk=First; cLnk; cLnk=cLnk->Next)
350  if (cLnk->Obj->Status && (id==C4ID::None || cLnk->Obj->Def->id==id))
351  iCount++;
352  return iCount;
353 }
C4ID id
Definition: C4Def.h:101
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4Def * Def
Definition: C4Object.h:143
static const C4ID None
Definition: C4Id.h:39
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

bool C4ObjectList::Remove ( C4Object pObj)
virtual

Reimplemented in C4GameObjects.

Definition at line 253 of file C4ObjectList.cpp.

References BREAKPOINT_HERE, First, FirstIter, GetLink(), Mass, C4Object::Mass, C4ObjectLink::Next, C4ObjectLink::Obj, C4ObjectLink::Prev, and RemoveLink().

Referenced by C4Object::AssignInfo(), C4Object::AssignRemoval(), ClearPointers(), C4Player::ClearPointers(), C4Object::ClearPointers(), DeleteObjects(), C4Object::Exit(), C4GameObjects::PostLoad(), C4GameObjects::Remove(), C4LSectors::Remove(), C4Player::SetObjectCrewStatus(), C4Object::StatusActivate(), and C4LSectors::Update().

254 {
255  C4ObjectLink *cLnk;
256 
257  // Find link
258  for (cLnk=First; cLnk; cLnk=cLnk->Next)
259  if (cLnk->Obj==pObj) break;
260  if (!cLnk) return false;
261 
262  // Fix iterators
263  for (iterator * i = FirstIter; i; i = i->Next)
264  {
265  // adjust pointers of internal link field
266  if (i->link.Prev == cLnk)
267  {
268  i->link.Prev = cLnk->Prev;
269  }
270  else if (i->link.Next == cLnk)
271  {
272  i->link.Next = cLnk->Next;
273  }
274  else if (i->link.Obj == cLnk->Obj)
275  {
276  i->link.Obj = nullptr;
277  }
278  }
279 
280  // Remove link from list
281  RemoveLink(cLnk);
282 
283  // Deallocate link
284  delete cLnk;
285 
286  // Remove mass
287  Mass-=pObj->Mass; if (Mass<0) Mass=0;
288 
289 #if defined(_DEBUG)
290  if (GetLink(pObj)) BREAKPOINT_HERE;
291 #endif
292 
293  return true;
294 }
int32_t Mass
Definition: C4Object.h:115
virtual void RemoveLink(C4ObjectLink *pLnk)
iterator * FirstIter
Definition: C4ObjectList.h:165
C4ObjectLink * First
Definition: C4ObjectList.h:51
const C4ObjectLink * GetLink(const C4Object *pObj) const
C4ObjectLink * Next
Definition: C4ObjectList.h:29
#define BREAKPOINT_HERE
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
friend class iterator
Definition: C4ObjectList.h:169
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::RemoveIter ( iterator iter) const
protected

Definition at line 958 of file C4ObjectList.cpp.

References FirstIter.

Referenced by C4ObjectList::iterator::~iterator().

959 {
960  if (iter == FirstIter)
961  FirstIter = iter->Next;
962  else
963  {
964  iterator * i = FirstIter;
965  while (i->Next && i->Next != iter)
966  i = i->Next;
967  i->Next = iter->Next;
968  }
969 }
iterator * FirstIter
Definition: C4ObjectList.h:165
friend class iterator
Definition: C4ObjectList.h:169

Here is the caller graph for this function:

void C4ObjectList::RemoveLink ( C4ObjectLink pLnk)
protectedvirtual

Reimplemented in C4NotifyingObjectList.

Definition at line 589 of file C4ObjectList.cpp.

References First, Last, C4ObjectLink::Next, and C4ObjectLink::Prev.

Referenced by Remove(), C4NotifyingObjectList::RemoveLink(), and Sort().

590 {
591  if (pLnk->Prev) pLnk->Prev->Next=pLnk->Next; else First=pLnk->Next;
592  if (pLnk->Next) pLnk->Next->Prev=pLnk->Prev; else Last=pLnk->Prev;
593 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
C4ObjectLink * Last
Definition: C4ObjectList.h:51

Here is the caller graph for this function:

const ReverseView C4ObjectList::reverse ( ) const
inline

Definition at line 104 of file C4ObjectList.h.

Referenced by C4GameObjects::AssignLightRange(), C4PropertyCollection::CollectPropLists(), C4Game::ExecObjects(), C4ObjectList::iterator::operator==(), C4GameObjects::PostLoad(), and C4Object::ShiftContents().

104 { return ReverseView(*this); }

Here is the caller graph for this function:

bool C4ObjectList::ShiftContents ( C4Object pNewFirst)

Definition at line 718 of file C4ObjectList.cpp.

References First, GetLink(), Last, C4ObjectLink::Next, and C4ObjectLink::Prev.

Referenced by C4Object::DirectComContents().

719 {
720  // get link of new first (this ensures list is not empty)
721  C4ObjectLink *pNewFirstLnk = GetLink(pNewFirst);
722  if (!pNewFirstLnk) return false;
723  // already at front?
724  if (pNewFirstLnk == First) return true;
725  // sort it there:
726  // 1. Make cyclic list
727  Last->Next = First; First->Prev = Last;
728  // 2. Re-set first and last
729  First = pNewFirstLnk;
730  Last = pNewFirstLnk->Prev;
731  // 3. Uncycle list
732  First->Prev = Last->Next = nullptr;
733  // done, success
734  return true;
735 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
const C4ObjectLink * GetLink(const C4Object *pObj) const
C4ObjectLink * Next
Definition: C4ObjectList.h:29
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
C4ObjectLink * Last
Definition: C4ObjectList.h:51

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::Sort ( )

Definition at line 569 of file C4ObjectList.cpp.

References First, C4Object::id, InsertLink(), C4ObjectLink::Next, C4ObjectLink::Obj, and RemoveLink().

570 {
571  C4ObjectLink *cLnk;
572  bool fSorted;
573  // Sort by id
574  do
575  {
576  fSorted = true;
577  for (cLnk=First; cLnk && cLnk->Next; cLnk=cLnk->Next)
578  if (cLnk->Obj->id > cLnk->Next->Obj->id)
579  {
580  RemoveLink(cLnk);
581  InsertLink(cLnk,cLnk->Next);
582  fSorted = false;
583  break;
584  }
585  }
586  while (!fSorted);
587 }
C4ID id
Definition: C4Object.h:108
virtual void RemoveLink(C4ObjectLink *pLnk)
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
virtual void InsertLink(C4ObjectLink *pLink, C4ObjectLink *pAfter)
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

void C4ObjectList::UpdateFaces ( bool  bUpdateShape)

Definition at line 682 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4ObjectLink::Obj, C4PropList::Status, and C4Object::UpdateFace().

Referenced by C4GameObjects::PostLoad().

683 {
684  C4ObjectLink *cLnk;
685  for (cLnk=First; cLnk; cLnk=cLnk->Next)
686  if (cLnk->Obj->Status)
687  cLnk->Obj->UpdateFace(bUpdateShapes);
688 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:378
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::UpdateGraphics ( bool  fGraphicsChanged)

Definition at line 674 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4ObjectLink::Obj, C4PropList::Status, and C4Object::UpdateGraphics().

Referenced by C4GameObjects::PostLoad().

675 {
676  C4ObjectLink *cLnk;
677  for (cLnk=First; cLnk; cLnk=cLnk->Next)
678  if (cLnk->Obj->Status)
679  cLnk->Obj->UpdateGraphics(fGraphicsChanged);
680 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:404
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::UpdateScriptPointers ( )

Definition at line 804 of file C4ObjectList.cpp.

References First, and C4ObjectLink::Next.

Referenced by C4GameObjects::UpdateScriptPointers().

805 {
806  for (C4ObjectLink *cLnk=First; cLnk; cLnk=cLnk->Next)
807  cLnk->Obj->UpdateScriptPointers();
808 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29

Here is the caller graph for this function:

bool C4ObjectList::ValidateOwners ( )
virtual

Reimplemented in C4GameObjects.

Definition at line 540 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4ObjectLink::Obj, C4PropList::Status, and C4Object::ValidateOwner().

Referenced by C4GameObjects::ValidateOwners().

541 {
542  C4ObjectLink *cLnk;
543  for (cLnk=First; cLnk; cLnk=cLnk->Next)
544  if (cLnk->Obj->Status)
545  cLnk->Obj->ValidateOwner();
546  return true;
547 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
bool ValidateOwner()
Definition: C4Object.cpp:2376
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ObjectList::Write ( char *  szTarget)

Definition at line 442 of file C4ObjectList.cpp.

References First, C4ObjectLink::Next, C4PropListNumbered::Number, C4ObjectLink::Obj, SAppend(), sprintf, and C4PropList::Status.

443 {
444  char ostr[25];
445  szTarget[0]=0;
446  C4ObjectLink *cLnk;
447  for (cLnk=First; cLnk && cLnk->Obj; cLnk=cLnk->Next)
448  if (cLnk->Obj->Status)
449  {
450  sprintf(ostr,"%d;",cLnk->Obj->Number);
451  SAppend(ostr,szTarget);
452  }
453  return true;
454 }
void SAppend(const char *szSource, char *szTarget, int iMaxL)
Definition: Standard.cpp:257
#define sprintf
Definition: Standard.h:164
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:168
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the call graph for this function:

Friends And Related Function Documentation

friend class iterator
friend

Member Data Documentation

iterator* C4ObjectList::FirstIter {nullptr}
mutableprotected

Definition at line 165 of file C4ObjectList.h.

Referenced by AddIter(), Clear(), InsertLink(), InsertLinkBefore(), Remove(), and RemoveIter().

int C4ObjectList::Mass

Definition at line 52 of file C4ObjectList.h.

Referenced by Add(), Default(), DeleteObjects(), MassCount(), Remove(), and C4Object::UpdateMass().

std::list<int32_t>* C4ObjectList::pEnumerated

Definition at line 53 of file C4ObjectList.h.

Referenced by Clear(), CompileFunc(), Default(), and DenumeratePointers().


The documentation for this class was generated from the following files: