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

#include <C4ObjectList.h>

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

Public Types

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

Public Member Functions

 C4NotifyingObjectList ()=default
 
 C4NotifyingObjectList (const C4NotifyingObjectList &List)=default
 
 C4NotifyingObjectList (const C4ObjectList &List)
 
 ~C4NotifyingObjectList () override=default
 
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

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

Protected Attributes

iteratorFirstIter {nullptr}
 

Detailed Description

Definition at line 172 of file C4ObjectList.h.

Member Typedef Documentation

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

Definition at line 118 of file C4ObjectList.h.

Member Enumeration Documentation

enum C4ObjectList::SortType
inherited
Enumerator
stNone 
stMain 
stContents 
stReverse 

Definition at line 55 of file C4ObjectList.h.

Constructor & Destructor Documentation

C4NotifyingObjectList::C4NotifyingObjectList ( )
default
C4NotifyingObjectList::C4NotifyingObjectList ( const C4NotifyingObjectList List)
default
C4NotifyingObjectList::C4NotifyingObjectList ( const C4ObjectList List)
inline

Definition at line 177 of file C4ObjectList.h.

177 : C4ObjectList(List) { }
C4NotifyingObjectList::~C4NotifyingObjectList ( )
overridedefault

Member Function Documentation

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

Definition at line 123 of file C4ObjectList.cpp.

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

Referenced by C4GameObjects::Add(), C4LSectors::Add(), C4ObjectList::CompileFunc(), C4ObjectList::Copy(), C4ObjectList::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
protectedinherited

Definition at line 952 of file C4ObjectList.cpp.

References C4ObjectList::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 
)
inherited
bool C4ObjectList::AssignInfo ( )
virtualinherited

Reimplemented in C4GameObjects.

Definition at line 549 of file C4ObjectList.cpp.

References C4Object::AssignInfo(), C4ObjectList::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
inherited

Definition at line 944 of file C4ObjectList.cpp.

References C4ObjectList::First, and C4ObjectList::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 ( )
inherited

Definition at line 846 of file C4ObjectList.cpp.

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

Referenced by C4ObjectList::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)
inherited

Definition at line 820 of file C4ObjectList.cpp.

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

Referenced by C4ObjectList::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 ( )
virtualinherited

Reimplemented in C4GameObjects.

Definition at line 48 of file C4ObjectList.cpp.

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

Referenced by C4GameObjects::Clear(), C4MouseControl::Clear(), C4LSector::ClearObjects(), C4ObjectList::CompileFunc(), C4ObjectList::Copy(), C4GameObjects::DeleteObjects(), C4MouseControl::LeftUpDragNone(), C4GameObjects::PostLoad(), C4MouseControl::UpdateSingleSelection(), and C4ObjectList::~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)
inherited

Definition at line 561 of file C4ObjectList.cpp.

References C4Object::ClearInfo(), C4ObjectList::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)
inherited

Definition at line 366 of file C4ObjectList.cpp.

References C4ObjectList::First, C4ObjectLink::Next, C4ObjectLink::Obj, and C4ObjectList::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 ( )
inherited

Definition at line 697 of file C4ObjectList.cpp.

References C4ObjectList::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 
)
inherited

Definition at line 507 of file C4ObjectList.cpp.

References C4ObjectList::First, StdCompiler::isDeserializer(), mkSTLContainerAdapt(), C4ObjectLink::Next, C4ObjectList::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 
)
inherited

Definition at line 464 of file C4ObjectList.cpp.

References C4ObjectList::Add(), C4ObjectList::Clear(), StdStrBuf::getData(), StdStrBuf::getLength(), StdCompiler::hasNaming(), StdCompiler::isSerializer(), C4ObjectList::Last, LogF(), mkNamingAdapt(), mkNamingCountAdapt(), mkParAdapt(), mkPtrAdaptNoNull(), StdCompiler::Exception::Msg, C4ObjectList::ObjectCount(), StdCompiler::Exception::Pos, C4ObjectLink::Prev, C4ObjectList::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)
inherited

Definition at line 704 of file C4ObjectList.cpp.

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

Referenced by C4ObjectList::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 ( )
virtualinherited

Reimplemented in C4GameObjects.

Definition at line 711 of file C4ObjectList.cpp.

References C4ObjectList::First, C4ObjectList::Last, C4ObjectList::Mass, and C4ObjectList::pEnumerated.

Referenced by C4ObjectList::C4ObjectList(), C4Player::C4Player(), C4ObjectList::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 ( )
inherited

Definition at line 737 of file C4ObjectList.cpp.

References C4OS_DELETED, C4Game::ClearPointers(), C4ObjectList::First, Game, C4ObjectList::Mass, C4ObjectLink::Obj, C4ObjectList::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)
inherited

Definition at line 456 of file C4ObjectList.cpp.

References C4Object::Denumerate(), C4ObjectList::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 ( )
inherited

Definition at line 431 of file C4ObjectList.cpp.

References C4ObjectList::Add(), C4GameObjects::ObjectPointer(), Objects, C4ObjectList::pEnumerated, and C4ObjectList::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 
)
inherited

Definition at line 378 of file C4ObjectList.cpp.

References C4D_Foreground, C4Object::Category, C4Object::Draw(), C4Object::DrawTopFace(), C4Object::GetPlane(), C4ObjectList::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 
)
inherited

Definition at line 404 of file C4ObjectList.cpp.

References C4Object::Category, C4Object::Draw(), C4Object::DrawTopFace(), C4ObjectList::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
inherited

Definition at line 690 of file C4ObjectList.cpp.

References C4Object::DrawSelectMark(), C4ObjectList::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
inherited

Definition at line 948 of file C4ObjectList.cpp.

References C4ObjectList::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 
)
inherited

Definition at line 296 of file C4ObjectList.cpp.

References ANY_OWNER, C4Object::Def, C4ObjectList::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 
)
inherited

Definition at line 309 of file C4ObjectList.cpp.

References ANY_OWNER, C4Object::Def, C4ObjectList::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
inlineinherited

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
inlineinherited

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
inherited

Definition at line 335 of file C4ObjectList.cpp.

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

Referenced by C4ObjectList::Add(), C4Object::AssignInfo(), C4Command::Drop(), C4ObjectList::GetLink(), C4Player::MakeCrewMember(), C4GameObjects::PostLoad(), C4Command::Put(), C4ObjectList::Remove(), C4ObjectList::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)
inlineinherited

Definition at line 147 of file C4ObjectList.h.

References C4ObjectList::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
inherited

Definition at line 69 of file C4ObjectList.cpp.

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

Referenced by C4MainMenu::ActivateRules(), C4RoundResults::EvaluateGoals(), and C4ObjectList::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
inherited

Definition at line 524 of file C4ObjectList.cpp.

References StdStrBuf::Append(), StdStrBuf::AppendFormat(), C4D_All, C4ObjectList::GetListID(), C4PropListStatic::GetName(), C4DefList::ID2Def(), and C4ObjectList::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
inherited

Definition at line 321 of file C4ObjectList.cpp.

References C4ObjectList::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 C4NotifyingObjectList::InsertLink ( C4ObjectLink pLink,
C4ObjectLink pAfter 
)
overrideprotectedvirtual

Reimplemented from C4ObjectList.

Definition at line 662 of file C4ObjectList.cpp.

References C4ObjectList::InsertLink(), ObjectListChangeListener, and C4ObjectListChangeListener::OnObjectAdded().

663 {
664  C4ObjectList::InsertLink(pLink, pAfter);
666 }
virtual void OnObjectAdded(C4ObjectList *pList, C4ObjectLink *pLnk)
Definition: C4ObjectList.h:36
virtual void InsertLink(C4ObjectLink *pLink, C4ObjectLink *pAfter)
C4ObjectListChangeListener & ObjectListChangeListener

Here is the call graph for this function:

void C4NotifyingObjectList::InsertLinkBefore ( C4ObjectLink pLink,
C4ObjectLink pBefore 
)
overrideprotectedvirtual

Reimplemented from C4ObjectList.

Definition at line 656 of file C4ObjectList.cpp.

References C4ObjectList::InsertLinkBefore(), ObjectListChangeListener, and C4ObjectListChangeListener::OnObjectAdded().

657 {
658  C4ObjectList::InsertLinkBefore(pLink, pBefore);
660 }
virtual void InsertLinkBefore(C4ObjectLink *pLink, C4ObjectLink *pBefore)
virtual void OnObjectAdded(C4ObjectList *pList, C4ObjectLink *pLnk)
Definition: C4ObjectList.h:36
C4ObjectListChangeListener & ObjectListChangeListener

Here is the call graph for this function:

bool C4ObjectList::IsClear ( ) const
inherited

Definition at line 426 of file C4ObjectList.cpp.

References C4ObjectList::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
inherited

Definition at line 417 of file C4ObjectList.cpp.

References C4ObjectList::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
inherited

Definition at line 94 of file C4ObjectList.cpp.

References C4D_All, C4Id2Def(), C4Def::Category, C4Object::Def, C4ObjectList::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 ( )
inherited

Definition at line 355 of file C4ObjectList.cpp.

References C4ObjectList::First, C4ObjectList::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
inherited

Definition at line 345 of file C4ObjectList.cpp.

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

Referenced by C4Object::AssignDeath(), C4ObjectList::CompileFunc(), C4Game::CompileRuntimeData(), C4FindObject::Count(), C4EditCursor::DoContextMenu(), C4ObjectMenu::DoRefillInternal(), C4ObjectMenu::Execute(), C4Network2Stats::ExecuteFrame(), C4Object::GetDataString(), C4ObjectList::GetNameList(), C4Game::InitGameFinal(), C4ObjectList::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)
virtualinherited

Reimplemented in C4GameObjects.

Definition at line 253 of file C4ObjectList.cpp.

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

Referenced by C4Object::AssignInfo(), C4Object::AssignRemoval(), C4ObjectList::ClearPointers(), C4Player::ClearPointers(), C4Object::ClearPointers(), C4ObjectList::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
protectedinherited

Definition at line 958 of file C4ObjectList.cpp.

References C4ObjectList::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 C4NotifyingObjectList::RemoveLink ( C4ObjectLink pLnk)
overrideprotectedvirtual

Reimplemented from C4ObjectList.

Definition at line 668 of file C4ObjectList.cpp.

References ObjectListChangeListener, C4ObjectListChangeListener::OnObjectRemove(), and C4ObjectList::RemoveLink().

669 {
672 }
virtual void RemoveLink(C4ObjectLink *pLnk)
C4ObjectListChangeListener & ObjectListChangeListener
virtual void OnObjectRemove(C4ObjectList *pList, C4ObjectLink *pLnk)
Definition: C4ObjectList.h:35

Here is the call graph for this function:

const ReverseView C4ObjectList::reverse ( ) const
inlineinherited

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)
inherited

Definition at line 718 of file C4ObjectList.cpp.

References C4ObjectList::First, C4ObjectList::GetLink(), C4ObjectList::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 ( )
inherited

Definition at line 569 of file C4ObjectList.cpp.

References C4ObjectList::First, C4Object::id, C4ObjectList::InsertLink(), C4ObjectLink::Next, C4ObjectLink::Obj, and C4ObjectList::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)
inherited

Definition at line 682 of file C4ObjectList.cpp.

References C4ObjectList::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)
inherited

Definition at line 674 of file C4ObjectList.cpp.

References C4ObjectList::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 ( )
inherited

Definition at line 804 of file C4ObjectList.cpp.

References C4ObjectList::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 ( )
virtualinherited

Reimplemented in C4GameObjects.

Definition at line 540 of file C4ObjectList.cpp.

References C4ObjectList::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)
inherited

Definition at line 442 of file C4ObjectList.cpp.

References C4ObjectList::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:

Member Data Documentation

iterator* C4ObjectList::FirstIter {nullptr}
mutableprotectedinherited
std::list<int32_t>* C4ObjectList::pEnumerated
inherited

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