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

#include <C4GameObjects.h>

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

Public Types

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

Public Member Functions

 C4GameObjects ()
 
 ~C4GameObjects ()
 
void Default ()
 
void Init (int32_t iWidth, int32_t iHeight)
 
void Clear (bool fClearInactive)
 
void Clear ()
 
bool Add (C4Object *nObj)
 
bool Remove (C4Object *pObj)
 
C4ObjectListObjectsAt (int ix, int iy)
 
void CrossCheck ()
 
C4ObjectAtObject (int ctx, int cty, DWORD &ocf, C4Object *exclude=nullptr)
 
void Synchronize ()
 
void UpdateSolidMasks ()
 
C4ObjectObjectPointer (int32_t iNumber)
 
C4ObjectSafeObjectPointer (int32_t iNumber)
 
int PostLoad (bool fKeepInactive, C4ValueNumbers *)
 
void Denumerate (C4ValueNumbers *)
 
void UpdateScriptPointers ()
 
C4Value GRBroadcast (const char *szFunction, C4AulParSet *pPars, bool fPassError, bool fRejectTest)
 
void UpdatePos (C4Object *pObj)
 
void UpdatePosResort (C4Object *pObj)
 
void FixObjectOrder ()
 
void ResortUnsorted ()
 
void DeleteObjects (bool fDeleteInactive)
 
bool ValidateOwners ()
 
bool AssignInfo ()
 
void AssignLightRange ()
 
void SyncClearance ()
 
void ResetAudibility ()
 
void OnSynchronized ()
 
void SetOCF ()
 
uint32_t GetNextMarker ()
 
iterator begin () const
 
const iterator end () const
 
const ReverseView reverse () const
 
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)
 
StdStrBuf GetNameList (C4DefList &rDefs) const
 
bool IsClear () const
 
bool DenumeratePointers ()
 
bool Write (char *szTarget)
 
void CompileFunc (StdCompiler *pComp, C4ValueNumbers *=0)
 
void CompileFunc (StdCompiler *pComp, bool fSkipPlayerObjects, 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 ()
 
bool CheckSort (C4ObjectList *pList)
 
void CheckCategorySort ()
 

Public Attributes

C4LSectors Sectors
 
C4ObjectList InactiveObjects
 
C4ObjectList ForeObjects
 
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
 

Detailed Description

Definition at line 26 of file C4GameObjects.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

C4GameObjects::C4GameObjects ( )

Definition at line 34 of file C4GameObjects.cpp.

References Default().

35 {
36  Default();
37 }

Here is the call graph for this function:

C4GameObjects::~C4GameObjects ( )

Definition at line 39 of file C4GameObjects.cpp.

References C4LSectors::Clear(), and Sectors.

40 {
41  Sectors.Clear();
42 }
void Clear()
Definition: C4Sector.cpp:76
C4LSectors Sectors
Definition: C4GameObjects.h:42

Here is the call graph for this function:

Member Function Documentation

bool C4GameObjects::Add ( C4Object nObj)

Definition at line 57 of file C4GameObjects.cpp.

References C4LSectors::Add(), C4ObjectList::Add(), C4D_Foreground, C4OS_INACTIVE, C4Object::Category, ForeObjects, InactiveObjects, Sectors, C4PropList::Status, and C4ObjectList::stMain.

Referenced by C4Object::AssignRemoval(), C4Game::NewObject(), ResortUnsorted(), and C4Object::StatusActivate().

58 {
59  // add inactive objects to the inactive list only
60  if (nObj->Status == C4OS_INACTIVE)
62  // if this is a foreground object, add it to the list
63  if (nObj->Category & C4D_Foreground)
65  // manipulate main list
67  return false;
68  // add to sectors
69  Sectors.Add(nObj, this);
70  return true;
71 }
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
void Add(C4Object *pObj, C4ObjectList *pMainList)
Definition: C4Sector.cpp:93
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
int32_t Status
Definition: C4PropList.h:169
int32_t Category
Definition: C4Object.h:113
C4LSectors Sectors
Definition: C4GameObjects.h:42
#define C4OS_INACTIVE
Definition: C4Object.h:36
C4ObjectList ForeObjects
Definition: C4GameObjects.h:44
const int32_t C4D_Foreground
Definition: C4Def.h:55

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 124 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 Add(), C4LSectors::Add(), C4ObjectList::CompileFunc(), C4ObjectList::Copy(), C4ObjectList::DenumeratePointers(), C4Object::Enter(), C4Player::MakeCrewMember(), C4Player::PlaceReadyCrew(), PostLoad(), C4Object::StatusDeactivate(), C4LSectors::Update(), and C4MouseControl::UpdateSingleSelection().

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

References C4ObjectList::FirstIter.

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

954 {
955  iterator * r = FirstIter;
956  FirstIter = iter;
957  return r;
958 }
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 C4GameObjects::AssignInfo ( )
virtual

Reimplemented from C4ObjectList.

Definition at line 476 of file C4GameObjects.cpp.

References C4ObjectList::AssignInfo(), and InactiveObjects.

Referenced by C4Game::InitGameFinal().

477 {
478  // assign in sublists
479  bool fSucc = true;
480  if (!C4ObjectList::AssignInfo()) fSucc = false;
481  if (!InactiveObjects.AssignInfo()) fSucc = false;
482  return fSucc;
483 }
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
virtual bool AssignInfo()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::AssignLightRange ( )

Definition at line 485 of file C4GameObjects.cpp.

References C4ObjectList::reverse().

Referenced by C4Game::InitGameFinal().

486 {
487  for (C4Object *obj : reverse())
488  if (obj->Status)
489  obj->AssignLightRange();
490 }
const ReverseView reverse() const
Definition: C4ObjectList.h:104

Here is the call graph for this function:

Here is the caller graph for this function:

C4Object * C4GameObjects::AtObject ( int  ctx,
int  cty,
DWORD ocf,
C4Object exclude = nullptr 
)

Definition at line 157 of file C4GameObjects.cpp.

References C4Object::Layer, ObjectsAt(), and OCF_Exclusive.

158 {
159  DWORD cocf;
160  for (C4Object *cObj : ObjectsAt(ctx,cty))
161  if (!exclude || (cObj!=exclude && exclude->Layer == cObj->Layer)) if (cObj->Status)
162  {
163  cocf=ocf | OCF_Exclusive;
164  if (cObj->At(ctx,cty,cocf))
165  {
166  // Search match
167  if (cocf & ocf) { ocf=cocf; return cObj; }
168  // EXCLUSIVE block
169  else return nullptr;
170  }
171  }
172  return nullptr;
173 }
C4ObjectPtr Layer
Definition: C4Object.h:136
const uint32_t OCF_Exclusive
Definition: C4Constants.h:89
uint32_t DWORD
C4ObjectList & ObjectsAt(int ix, int iy)

Here is the call graph for this function:

C4ObjectList::iterator C4ObjectList::begin ( ) const
inherited

Definition at line 945 of file C4ObjectList.cpp.

References C4ObjectList::First, and C4ObjectList::iterator.

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

946 {
947  return iterator(*this, First, false);
948 }
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 847 of file C4ObjectList.cpp.

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

Referenced by C4ObjectList::Add().

848 {
849  // debug: Check whether object list is sorted correctly
850  C4ObjectLink *cLnk, *cPrev=nullptr;
851  for (cLnk=First; cLnk; cLnk=cLnk->Next)
852  if (!cLnk->Obj->Unsorted && cLnk->Obj->Status)
853  {
854  if (cPrev) assert(cPrev->Obj->GetPlane() >= cLnk->Obj->GetPlane());
855  cPrev = cLnk;
856  }
857 }
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:169
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 821 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().

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

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::Clear ( bool  fClearInactive)

Definition at line 213 of file C4GameObjects.cpp.

References C4ObjectList::Clear(), C4ObjectList::DeleteObjects(), and InactiveObjects.

Referenced by C4Game::CompileRuntimeData().

214 {
215  DeleteObjects(fClearInactive);
216  if (fClearInactive)
218  LastUsedMarker = 0;
219 }
void DeleteObjects()
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
virtual void Clear()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::Clear ( )
inlinevirtual

Reimplemented from C4ObjectList.

Definition at line 36 of file C4GameObjects.h.

References Clear().

Referenced by Clear().

36 { Clear(false); }

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::ClearInfo ( C4ObjectInfo pInfo)
inherited

Definition at line 562 of file C4ObjectList.cpp.

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

Referenced by C4ObjectInfoList::DetachFromObjects().

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

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 367 of file C4ObjectList.cpp.

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

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

368 {
369  int rval=0;
370  // Clear all primary list pointers
371  while (Remove(pObj)) rval++;
372  // Clear all sub pointers
373  C4Object *cobj; C4ObjectLink *clnk;
374  for (clnk=First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
375  cobj->ClearPointers(pObj);
376  return rval;
377 }
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 698 of file C4ObjectList.cpp.

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

699 {
700  C4Object *cobj; C4ObjectLink *clnk;
701  for (clnk=First; clnk && (cobj=clnk->Obj); clnk=clnk->Next)
702  cobj->CloseMenu(true);
703 }
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 = 0 
)
inherited

Definition at line 508 of file C4ObjectList.cpp.

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

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

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

Here is the call graph for this function:

void C4ObjectList::Copy ( const C4ObjectList rList)
inherited

Definition at line 705 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 PostLoad().

706 {
707  Clear(); Default();
708  C4ObjectLink *cLnk;
709  for (cLnk=rList.First; cLnk; cLnk=cLnk->Next) Add(cLnk->Obj, C4ObjectList::stNone);
710 }
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 C4GameObjects::CrossCheck ( )

Definition at line 91 of file C4GameObjects.cpp.

References Abs(), C4Object::Area, C4D_Object, C4FxCall_EngObjHit, C4PropList::Call(), C4Object::Collect(), C4Def::Collection, C4Object::Contained, C4Object::Def, DFA_FLIGHT, C4Object::DoEnergy(), C4LArea::FirstObjects(), fixtoi(), C4Object::Fling(), Game, C4Object::GetAction(), GetNextMarker(), C4Object::GetX(), C4Object::GetY(), C4Rect::Hgt, HitSpeed2, C4Game::iTick3, C4Object::Layer, C4Object::Mass, C4LArea::NextObjects(), C4Object::OCF, OCF_Alive, OCF_Carryable, OCF_Collection, OCF_HitSpeed2, OCF_None, P_Procedure, PSF_CatchBlow, PSF_QueryCatchBlow, C4Object::Shape, C4PropList::Status, C4Rect::Wdt, C4Rect::x, C4Object::xdir, C4Rect::y, and C4Object::ydir.

Referenced by C4Game::ExecObjects().

92 {
93  DWORD focf,tocf;
94 
95  // Reverse area check: Checks for all obj2 at obj1
96 
97  focf = tocf = OCF_None;
98  // High level: Collection, Hit
99  if (!::Game.iTick3)
100  tocf |= OCF_Carryable;
101  focf |= OCF_Collection; focf |= OCF_Alive; tocf |= OCF_HitSpeed2;
102 
103  for (C4Object* obj1 : *this)
104  if (obj1->Status && !obj1->Contained && (obj1->OCF & focf))
105  {
106  uint32_t Marker = GetNextMarker();
107  C4LSector *pSct;
108  for (C4ObjectList *pLst = obj1->Area.FirstObjects(&pSct); pLst; pLst = obj1->Area.NextObjects(pLst, &pSct))
109  for (C4Object* obj2 : *pLst)
110  if ((obj2 != obj1) && obj2->Status && !obj2->Contained && (obj2->OCF & tocf) &&
111  Inside<int32_t>(obj2->GetX() - (obj1->GetX() + obj1->Shape.x), 0, obj1->Shape.Wdt - 1) &&
112  Inside<int32_t>(obj2->GetY() - (obj1->GetY() + obj1->Shape.y), 0, obj1->Shape.Hgt - 1) &&
113  obj1->Layer == obj2->Layer)
114  {
115  // handle collision only once
116  if (obj2->Marker == Marker) continue;
117  obj2->Marker = Marker;
118  // Only hit if target is alive and projectile is an object
119  if ((obj1->OCF & OCF_Alive) && (obj2->Category & C4D_Object))
120  {
121  C4Real dXDir = obj2->xdir - obj1->xdir, dYDir = obj2->ydir - obj1->ydir;
122  C4Real speed = dXDir * dXDir + dYDir * dYDir;
123  // Only hit if obj2's speed and relative speeds are larger than HitSpeed2
124  if ((obj2->OCF & OCF_HitSpeed2) && speed > HitSpeed2 &&
125  !obj1->Call(PSF_QueryCatchBlow, &C4AulParSet(obj2)))
126  {
127  int32_t iHitEnergy = fixtoi(speed * obj2->Mass / 5);
128  // Hit energy reduced to 1/3rd, but do not drop to zero because of this division
129  iHitEnergy = std::max<int32_t>(iHitEnergy/3, !!iHitEnergy);
130  obj1->DoEnergy(-iHitEnergy / 5, false, C4FxCall_EngObjHit, obj2->Controller);
131  int tmass = std::max<int32_t>(obj1->Mass, 50);
132  C4PropList* pActionDef = obj1->GetAction();
133  if (!::Game.iTick3 || (pActionDef && pActionDef->GetPropertyP(P_Procedure) != DFA_FLIGHT))
134  obj1->Fling(obj2->xdir * 50 / tmass, -Abs(obj2->ydir / 2) * 50 / tmass, false);
135  obj1->Call(PSF_CatchBlow, &C4AulParSet(-iHitEnergy / 5, obj2));
136  // obj1 might have been tampered with
137  if (!obj1->Status || obj1->Contained || !(obj1->OCF & focf))
138  goto out1;
139  continue;
140  }
141  }
142  // Collection
143  if ((obj1->OCF & OCF_Collection) && (obj2->OCF & OCF_Carryable) &&
144  Inside<int32_t>(obj2->GetX() - (obj1->GetX() + obj1->Def->Collection.x), 0, obj1->Def->Collection.Wdt - 1) &&
145  Inside<int32_t>(obj2->GetY() - (obj1->GetY() + obj1->Def->Collection.y), 0, obj1->Def->Collection.Hgt - 1))
146  {
147  obj1->Collect(obj2);
148  // obj1 might have been tampered with
149  if (!obj1->Status || obj1->Contained || !(obj1->OCF & focf))
150  goto out1;
151  }
152  }
153  out1: ;
154  }
155 }
int32_t GetY() const
Definition: C4Object.h:287
C4LArea Area
Definition: C4Object.h:114
const uint32_t OCF_Alive
Definition: C4Constants.h:104
const uint32_t OCF_Collection
Definition: C4Constants.h:93
C4Game Game
Definition: C4Globals.cpp:52
#define PSF_CatchBlow
Definition: C4GameScript.h:72
int32_t Mass
Definition: C4Object.h:115
C4PropList * GetAction() const
Definition: C4Object.cpp:2689
const C4Real HitSpeed2
Definition: C4Movement.cpp:38
C4ObjectPtr Layer
Definition: C4Object.h:136
Definition: C4Real.h:58
int32_t Wdt
Definition: C4Rect.h:32
const uint32_t OCF_HitSpeed2
Definition: C4Constants.h:91
const int32_t C4D_Object
Definition: C4Def.h:46
C4Def * Def
Definition: C4Object.h:143
int32_t y
Definition: C4Rect.h:32
C4Rect Collection
Definition: C4Def.h:108
int32_t GetX() const
Definition: C4Object.h:286
uint32_t GetNextMarker()
C4ObjectList * FirstObjects(C4LSector **ppSct)
Definition: C4Sector.h:118
int32_t iTick3
Definition: C4Game.h:131
int32_t Status
Definition: C4PropList.h:169
bool Collect(C4Object *pObj)
Definition: C4Object.cpp:4182
int32_t x
Definition: C4Rect.h:32
void DoEnergy(int32_t iChange, bool fExact, int32_t iCause, int32_t iCausedByPlr)
Definition: C4Object.cpp:1121
const uint32_t OCF_Carryable
Definition: C4Constants.h:82
#define PSF_QueryCatchBlow
Definition: C4GameScript.h:73
#define C4FxCall_EngObjHit
Definition: C4Effect.h:57
C4ObjectPtr Contained
Definition: C4Object.h:144
int32_t Hgt
Definition: C4Rect.h:32
T Abs(T val)
Definition: Standard.h:44
C4Shape Shape
Definition: C4Object.h:148
uint32_t OCF
Definition: C4Object.h:134
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112
void Fling(C4Real txdir, C4Real tydir, bool fAddSpeed)
Definition: C4Object.cpp:1351
uint32_t DWORD
int fixtoi(const C4Fixed &x)
Definition: C4Real.h:259
C4Real xdir
Definition: C4Object.h:126
const uint32_t OCF_None
Definition: C4Constants.h:77
C4ObjectList * NextObjects(C4ObjectList *pPrev, C4LSector **ppSct)
Definition: C4Sector.cpp:305
C4Real ydir
Definition: C4Object.h:126

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::Default ( )
virtual

Reimplemented from C4ObjectList.

Definition at line 44 of file C4GameObjects.cpp.

References C4LSectors::Clear(), C4ObjectList::Default(), ForeObjects, and Sectors.

Referenced by C4GameObjects(), and C4Game::Default().

45 {
46  Sectors.Clear();
47  LastUsedMarker = 0;
49 }
void Clear()
Definition: C4Sector.cpp:76
C4LSectors Sectors
Definition: C4GameObjects.h:42
C4ObjectList ForeObjects
Definition: C4GameObjects.h:44
virtual void Default()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::DeleteObjects ( bool  fDeleteInactive)

Definition at line 205 of file C4GameObjects.cpp.

References C4ObjectList::Clear(), C4LSectors::ClearObjects(), C4ObjectList::DeleteObjects(), ForeObjects, InactiveObjects, and Sectors.

Referenced by C4Game::DeleteObjects().

206 {
209  ForeObjects.Clear();
210  if (fDeleteInactive) InactiveObjects.DeleteObjects();
211 }
void DeleteObjects()
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
C4LSectors Sectors
Definition: C4GameObjects.h:42
void ClearObjects()
Definition: C4Sector.cpp:227
C4ObjectList ForeObjects
Definition: C4GameObjects.h:44
virtual void Clear()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::DeleteObjects ( )
inherited

Definition at line 738 of file C4ObjectList.cpp.

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

Referenced by Clear(), and DeleteObjects().

739 {
740  // delete links and objects
741  while (First)
742  {
743  C4Object *pObj = First->Obj;
744  if (pObj->Status) Game.ClearPointers(pObj); // clear pointers to removed objects that weren't deleted (game end or section change)
745  pObj->Status = C4OS_DELETED;
746  Remove(pObj);
747  delete pObj;
748  }
749  // reset mass
750  Mass=0;
751 }
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:169
void ClearPointers(C4Object *cobj)
Definition: C4Game.cpp:925
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 C4GameObjects::Denumerate ( C4ValueNumbers numbers)

Definition at line 339 of file C4GameObjects.cpp.

References C4ObjectList::Denumerate(), and InactiveObjects.

Referenced by PostLoad().

340 {
341  C4ObjectList::Denumerate(numbers);
342  InactiveObjects.Denumerate(numbers);
343 }
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
void Denumerate(C4ValueNumbers *)

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ObjectList::DenumeratePointers ( )
inherited

Definition at line 432 of file C4ObjectList.cpp.

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

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

433 {
434  if (!pEnumerated) return false;
435  // Denumerate all object pointers
436  for (std::list<int32_t>::const_iterator pNum = pEnumerated->begin(); pNum != pEnumerated->end(); ++pNum)
437  Add(::Objects.ObjectPointer(*pNum), stNone); // Add to tail, unsorted
438  // Delete old list
439  delete pEnumerated; pEnumerated = nullptr;
440  return true;
441 }
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 379 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().

380 {
381  C4ObjectLink * clnk, * first;
382  for (first=Last; first; first=first->Prev)
383  if (first->Obj->GetPlane() >= MinPlane)
384  break;
385  // Draw objects (base)
386  for (clnk=first; clnk; clnk=clnk->Prev)
387  {
388  if (clnk->Obj->GetPlane() > MaxPlane)
389  break;
390  if (clnk->Obj->Category & C4D_Foreground)
391  continue;
392  clnk->Obj->Draw(cgo, iPlayer);
393  }
394  // Draw objects (top face)
395  for (clnk=first; clnk; clnk=clnk->Prev)
396  {
397  if (clnk->Obj->GetPlane() > MaxPlane)
398  break;
399  if (clnk->Obj->Category & C4D_Foreground)
400  continue;
401  clnk->Obj->DrawTopFace(cgo, iPlayer);
402  }
403 }
void Draw(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:1800
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:2060
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:55

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 405 of file C4ObjectList.cpp.

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

Referenced by C4Viewport::Draw().

406 {
407  C4ObjectLink *clnk;
408  // Draw objects (base)
409  for (clnk=Last; clnk; clnk=clnk->Prev)
410  if (!(clnk->Obj->Category & dwCat) == fInvert)
411  clnk->Obj->Draw(cgo, iPlayer);
412  // Draw objects (top face)
413  for (clnk=Last; clnk; clnk=clnk->Prev)
414  if (!(clnk->Obj->Category & dwCat) == fInvert)
415  clnk->Obj->DrawTopFace(cgo, iPlayer);
416 }
void Draw(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:1800
void DrawTopFace(C4TargetFacet &cgo, int32_t iByPlayer=-1, DrawMode eDrawMode=ODM_Normal, float offX=0, float offY=0)
Definition: C4Object.cpp:2060
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 691 of file C4ObjectList.cpp.

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

Referenced by C4MouseControl::Draw().

692 {
693  C4ObjectLink *cLnk;
694  for (cLnk=Last; cLnk; cLnk=cLnk->Prev)
695  cLnk->Obj->DrawSelectMark(cgo);
696 }
void DrawSelectMark(C4TargetFacet &cgo) const
Definition: C4Object.cpp:2525
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 949 of file C4ObjectList.cpp.

References C4ObjectList::iterator.

Referenced by C4ObjectListIterator::GetNext().

950 {
951  return iterator(*this, nullptr, false);
952 }
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 297 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().

298 {
299  C4ObjectLink *cLnk;
300  // Find link and object
301  for (cLnk=First; cLnk; cLnk=cLnk->Next)
302  if (cLnk->Obj->Status)
303  if (cLnk->Obj->Def==def)
304  if ((owner==ANY_OWNER) || (cLnk->Obj->Owner==owner))
305  if (dwOCF & cLnk->Obj->OCF)
306  return cLnk->Obj;
307  return nullptr;
308 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
const int ANY_OWNER
Definition: C4Constants.h:139
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:169
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 310 of file C4ObjectList.cpp.

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

311 {
312  C4ObjectLink *cLnk;
313  // Find link and object
314  for (cLnk=First; cLnk; cLnk=cLnk->Next)
315  if (cLnk->Obj->Status)
316  if (cLnk->Obj->Def->id!=id)
317  if ((owner==ANY_OWNER) || (cLnk->Obj->Owner==owner))
318  return cLnk->Obj;
319  return nullptr;
320 }
C4ID id
Definition: C4Def.h:103
C4ObjectLink * First
Definition: C4ObjectList.h:51
const int ANY_OWNER
Definition: C4Constants.h:139
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:169
C4Object * Obj
Definition: C4ObjectList.h:28
void C4GameObjects::FixObjectOrder ( )

Definition at line 378 of file C4GameObjects.cpp.

References DebugLogF(), C4ObjectList::First, C4Object::GetPlane(), C4ObjectList::Last, C4ObjectLink::Next, C4PropListNumbered::Number, C4ObjectLink::Prev, C4Object::SetPlane(), C4PropList::Status, and C4Object::Unsorted.

Referenced by PostLoad().

379 {
380  // fixes the object order so it matches the global object order sorting constraints
381  C4ObjectLink *pLnk0=First, *pLnkL=Last;
382  while (pLnk0 != pLnkL)
383  {
384  C4ObjectLink *pLnk1stUnsorted=nullptr, *pLnkLastUnsorted=nullptr, *pLnkPrev=nullptr, *pLnk;
385  C4Object *pLastWarnObj = nullptr;
386  // forward fix
387  int lastPlane = 2147483647; //INT32_MAX;
388  for (pLnk = pLnk0; pLnk!=pLnkL->Next; pLnk=pLnk->Next)
389  {
390  C4Object *pObj = pLnk->Obj;
391  if (pObj->Unsorted || !pObj->Status) continue;
392  int currentPlane = pObj->GetPlane();
393  // must have nonzero Plane
394  if (!currentPlane)
395  {
396  DebugLogF("Objects.txt: Object #%d has zero Plane!", (int) pObj->Number);
397  pObj->SetPlane(lastPlane); currentPlane = lastPlane;
398  }
399  // fix order
400  if (currentPlane > lastPlane)
401  {
402  // SORT ERROR! (note that pLnkPrev can't be 0)
403  if (pLnkPrev->Obj != pLastWarnObj)
404  {
405  DebugLogF("Objects.txt: Wrong object order of #%d-#%d! (down)", (int) pObj->Number, (int) pLnkPrev->Obj->Number);
406  pLastWarnObj = pLnkPrev->Obj;
407  }
408  pLnk->Obj = pLnkPrev->Obj;
409  pLnkPrev->Obj = pObj;
410  pLnkLastUnsorted = pLnkPrev;
411  }
412  else
413  lastPlane = currentPlane;
414  pLnkPrev = pLnk;
415  }
416  if (!pLnkLastUnsorted) break; // done
417  pLnkL = pLnkLastUnsorted;
418  // backwards fix
419  lastPlane = -2147483647-1; //INT32_MIN;
420  for (pLnk = pLnkL; pLnk!=pLnk0->Prev; pLnk=pLnk->Prev)
421  {
422  C4Object *pObj = pLnk->Obj;
423  if (pObj->Unsorted || !pObj->Status) continue;
424  int currentPlane = pObj->GetPlane();
425  if (currentPlane < lastPlane)
426  {
427  // SORT ERROR! (note that pLnkPrev can't be 0)
428  if (pLnkPrev->Obj != pLastWarnObj)
429  {
430  DebugLogF("Objects.txt: Wrong object order of #%d-#%d! (up)", (int) pObj->Number, (int) pLnkPrev->Obj->Number);
431  pLastWarnObj = pLnkPrev->Obj;
432  }
433  pLnk->Obj = pLnkPrev->Obj;
434  pLnkPrev->Obj = pObj;
435  pLnk1stUnsorted = pLnkPrev;
436  }
437  else
438  lastPlane = currentPlane;
439  pLnkPrev = pLnk;
440  }
441  if (!pLnk1stUnsorted) break; // done
442  pLnk0 = pLnk1stUnsorted;
443  }
444  // objects fixed!
445 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
int32_t GetPlane() const
Definition: C4Object.h:180
void SetPlane(int32_t z)
Definition: C4Object.h:179
C4ObjectLink * Next
Definition: C4ObjectList.h:29
bool DebugLogF(const char *strMessage...)
Definition: C4Log.cpp:281
int32_t Status
Definition: C4PropList.h:169
C4ObjectLink * Prev
Definition: C4ObjectList.h:29
bool Unsorted
Definition: C4Object.h:129
C4ObjectLink * Last
Definition: C4ObjectList.h:51

Here is the call graph for this function:

Here is the caller graph for this function:

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 336 of file C4ObjectList.cpp.

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

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

337 {
338  if (!pObj) return nullptr;
339  C4ObjectLink *cLnk;
340  for (cLnk=First; cLnk; cLnk=cLnk->Next)
341  if (cLnk->Obj==pObj)
342  return cLnk;
343  return nullptr;
344 }
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 70 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().

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

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 525 of file C4ObjectList.cpp.

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

Referenced by C4Object::GetDataString().

526 {
527  int cpos,idcount;
528  C4ID c_id;
529  C4Def *cdef;
530  StdStrBuf Buf;
531  for (cpos=0; (c_id=GetListID(C4D_All,cpos)); cpos++)
532  if ((cdef=rDefs.ID2Def(c_id)))
533  {
534  idcount=ObjectCount(c_id);
535  if (cpos>0) Buf.Append(", ");
536  Buf.AppendFormat("%dx %s",idcount,cdef->GetName());
537  }
538  return Buf;
539 }
C4Def * ID2Def(C4ID id)
virtual const char * GetName() const
Definition: C4PropList.cpp:267
void AppendFormat(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
Definition: StdBuf.cpp:197
void Append(const char *pnData, size_t iChars)
Definition: StdBuf.h:527
const int32_t C4D_All
Definition: C4Def.h:41
Definition: C4Def.h:100
Definition: C4Id.h:28
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:

uint32_t C4GameObjects::GetNextMarker ( )

Definition at line 523 of file C4GameObjects.cpp.

References C4Object::Marker.

Referenced by C4FindObject::Count(), CrossCheck(), and C4FindObject::FindMany().

524 {
525  // Get a new marker.
526  uint32_t marker = ++LastUsedMarker;
527  // If all markers are exceeded, restart marker at 1 and reset all object markers to zero.
528  if (!marker)
529  {
530  for (C4Object *cobj : *this)
531  {
532  if (cobj)
533  cobj->Marker = 0;
534  }
535  marker = ++LastUsedMarker;
536  }
537  return marker;
538 }
uint32_t Marker
Definition: C4Object.h:135

Here is the caller graph for this function:

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

Definition at line 322 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().

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

Here is the caller graph for this function:

C4Value C4GameObjects::GRBroadcast ( const char *  szFunction,
C4AulParSet pPars,
bool  fPassError,
bool  fRejectTest 
)

Definition at line 352 of file C4GameObjects.cpp.

References C4D_Environment, C4D_Goal, C4D_Rule, C4PropList::Call(), C4Object::Category, and C4PropList::Status.

Referenced by C4Game::GRBroadcast().

353 {
354  // call objects first - scenario script might overwrite hostility, etc...
355  for (C4Object *pObj : *this)
356  if (pObj && (pObj->Category & (C4D_Goal | C4D_Rule | C4D_Environment)) && pObj->Status)
357  {
358  C4Value vResult = pObj->Call(szFunction, pPars, fPassError);
359  // rejection tests abort on first nonzero result
360  if (fRejectTest && !!vResult) return vResult;
361  }
362  return C4Value();
363 }
const int32_t C4D_Environment
Definition: C4Def.h:50
int32_t Status
Definition: C4PropList.h:169
const int32_t C4D_Rule
Definition: C4Def.h:49
int32_t Category
Definition: C4Object.h:113
const int32_t C4D_Goal
Definition: C4Def.h:48
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::Init ( int32_t  iWidth,
int32_t  iHeight 
)

Definition at line 51 of file C4GameObjects.cpp.

References C4LSectors::Init(), and Sectors.

Referenced by C4Game::InitGame().

52 {
53  // init sectors
54  Sectors.Init(iWidth, iHeight);
55 }
void Init(int Wdt, int Hgt)
Definition: C4Sector.cpp:60
C4LSectors Sectors
Definition: C4GameObjects.h:42

Here is the call graph for this function:

Here is the caller graph for this function:

void C4NotifyingObjectList::InsertLink ( C4ObjectLink pLink,
C4ObjectLink pAfter 
)
protectedvirtualinherited

Reimplemented from C4ObjectList.

Definition at line 663 of file C4ObjectList.cpp.

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

664 {
665  C4ObjectList::InsertLink(pLink, pAfter);
667 }
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 
)
protectedvirtualinherited

Reimplemented from C4ObjectList.

Definition at line 657 of file C4ObjectList.cpp.

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

658 {
659  C4ObjectList::InsertLinkBefore(pLink, pBefore);
661 }
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 427 of file C4ObjectList.cpp.

References C4ObjectList::ObjectCount().

428 {
429  return (ObjectCount()==0);
430 }
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 418 of file C4ObjectList.cpp.

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

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

419 {
420  C4ObjectLink *cLnk;
421  for (cLnk=First; cLnk; cLnk=cLnk->Next)
422  if (cLnk->Obj==pObj)
423  return true;
424  return false;
425 }
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 95 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.

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

Here is the call graph for this function:

int C4ObjectList::MassCount ( )
inherited

Definition at line 356 of file C4ObjectList.cpp.

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

Referenced by C4Object::UpdateMass().

357 {
358  C4ObjectLink *cLnk;
359  int iMass=0;
360  for (cLnk=First; cLnk; cLnk=cLnk->Next)
361  if (cLnk->Obj->Status)
362  iMass+=cLnk->Obj->Mass;
363  Mass=iMass;
364  return iMass;
365 }
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:169
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 346 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(), PostLoad(), C4ControlSyncCheck::Set(), and C4MouseControl::UpdateSingleSelection().

347 {
348  C4ObjectLink *cLnk;
349  int iCount=0;
350  for (cLnk=First; cLnk; cLnk=cLnk->Next)
351  if (cLnk->Obj->Status && (id==C4ID::None || cLnk->Obj->Def->id==id))
352  iCount++;
353  return iCount;
354 }
C4ID id
Definition: C4Def.h:103
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:42
int32_t Status
Definition: C4PropList.h:169
C4Object * Obj
Definition: C4ObjectList.h:28

Here is the caller graph for this function:

C4Object * C4GameObjects::ObjectPointer ( int32_t  iNumber)

Definition at line 183 of file C4GameObjects.cpp.

References C4PropListNumbered::GetByNumber(), and C4PropList::GetObject().

Referenced by C4ObjectPtr::DenumeratePointers(), C4ObjectList::DenumeratePointers(), and SafeObjectPointer().

184 {
185  // search own list
187  if (pObj) return pObj->GetObject();
188  return 0;
189 }
static C4PropList * GetByNumber(int32_t iNumber)
Definition: C4PropList.cpp:75
virtual C4Object * GetObject()
Definition: C4PropList.cpp:622

Here is the call graph for this function:

Here is the caller graph for this function:

C4ObjectList & C4GameObjects::ObjectsAt ( int  ix,
int  iy 
)

Definition at line 86 of file C4GameObjects.cpp.

References C4LSector::ObjectShapes, C4LSectors::SectorAt(), and Sectors.

Referenced by AtObject().

87 {
88  return Sectors.SectorAt(ix, iy)->ObjectShapes;
89 }
C4LSector * SectorAt(int ix, int iy)
Definition: C4Sector.cpp:84
C4ObjectList ObjectShapes
Definition: C4Sector.h:49
C4LSectors Sectors
Definition: C4GameObjects.h:42

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::OnSynchronized ( )

Definition at line 499 of file C4GameObjects.cpp.

References C4PropList::Call(), and PSF_OnSynchronized.

Referenced by C4TransferZones::Synchronize().

500 {
501  for (C4Object *obj : *this)
502  if (obj)
503  obj->Call(PSF_OnSynchronized);
504 }
#define PSF_OnSynchronized
Definition: C4GameScript.h:79
C4Value Call(C4PropertyName k, C4AulParSet *pPars=0, bool fPassErrors=false)
Definition: C4PropList.h:112

Here is the call graph for this function:

Here is the caller graph for this function:

int C4GameObjects::PostLoad ( bool  fKeepInactive,
C4ValueNumbers numbers 
)

Definition at line 221 of file C4GameObjects.cpp.

References C4ObjectList::Add(), C4ObjectList::begin(), C4D_Foreground, C4D_StaticBack, C4OS_INACTIVE, C4Object::Category, C4ObjectList::Clear(), C4Object::Contained, C4Object::Contents, C4ObjectList::Copy(), DebugLogF(), Denumerate(), FixObjectOrder(), ForeObjects, C4ObjectList::GetLink(), InactiveObjects, C4PropListNumbered::Number, C4ObjectList::ObjectCount(), Remove(), C4ObjectList::Remove(), C4ObjectList::reverse(), C4PropListNumbered::SetEnumerationIndex(), SetOCF(), C4Object::SetOCF(), C4PropList::Status, C4ObjectList::stContents, C4ObjectList::stMain, C4ObjectList::stNone, C4PropListNumbered::UnshelveNumberedPropLists(), C4ObjectList::UpdateFaces(), C4Object::UpdateFlipDir(), C4ObjectList::UpdateGraphics(), C4Object::UpdateLight(), C4Object::xdir, and C4Object::ydir.

Referenced by C4Game::InitGame().

222 {
223  // Process objects
224  int32_t iMaxObjectNumber = 0;
225  for (C4Object *pObj : reverse())
226  {
227  // keep track of numbers
228  iMaxObjectNumber = std::max(iMaxObjectNumber, pObj->Number);
229  // add to list of foreobjects
230  if (pObj->Category & C4D_Foreground)
231  ForeObjects.Add(pObj, C4ObjectList::stMain, this);
232  // Unterminate end
233  }
234 
235  // Denumerate pointers
236  // on section load, inactive object numbers will be adjusted afterwards
237  // so fake inactive object list empty meanwhile
238  // note this has to be done to prevent even if object numbers did not collide
239  // to prevent an assertion fail when denumerating non-enumerated inactive objects
240  C4ObjectList inactiveObjectsCopy;
241  if (fKeepInactive)
242  {
243  inactiveObjectsCopy.Copy(InactiveObjects);
245  }
246  // denumerate pointers
247  Denumerate(numbers);
248  // update object enumeration index now, because calls like OnSynchronized might create objects
249  C4PropListNumbered::SetEnumerationIndex(iMaxObjectNumber);
250  // end faking and adjust object numbers
251  if (fKeepInactive)
252  {
253  InactiveObjects.Copy(inactiveObjectsCopy);
254  inactiveObjectsCopy.Clear();
256  }
257 
258  // special checks:
259  // -contained/contents-consistency
260  // -StaticBack-objects zero speed
261  for (C4Object *pObj : *this)
262  if (pObj->Status)
263  {
264  // staticback must not have speed
265  if (pObj->Category & C4D_StaticBack)
266  {
267  pObj->xdir = pObj->ydir = 0;
268  }
269  // contained must be in contents list
270  if (pObj->Contained)
271  if (!pObj->Contained->Contents.GetLink(pObj))
272  {
273  DebugLogF("Error in Objects.txt: Container of #%d is #%d, but not found in contents list!", pObj->Number, pObj->Contained->Number);
275  }
276  // all contents must have contained set; otherwise, remove them!
277  auto contentsIt = pObj->Contents.begin();
278  while (!contentsIt.atEnd())
279  {
280  C4Object* pObj2 = *contentsIt;
281  // check double links
282  auto it2 = pObj->Contents.begin();
283  if (it2.find(pObj2) && it2 != contentsIt)
284  {
285  DebugLogF("Error in Objects.txt: Double containment of #%d by #%d!", pObj2->Number, pObj->Number);
286  // this remove-call will only remove the previous (dobuled) link, so cLnkCont should be save
287  pObj->Contents.Remove(pObj2);
288  // contents checked already
289  continue;
290  }
291  // check contents/contained-relation
292  if (pObj2->Status && pObj2->Contained != pObj)
293  {
294  DebugLogF("Error in Objects.txt: Object #%d not in container #%d as referenced!", pObj2->Number, pObj->Number);
295  pObj2->Contained = pObj;
296  }
297  contentsIt++;
298  }
299  }
300  // sort out inactive objects
301  for (C4Object *obj : *this)
302  {
303  if (obj->Status == C4OS_INACTIVE)
304  {
305  Remove(obj);
307  }
308  }
309 
310  {
311  C4DebugRecOff DBGRECOFF; // - script callbacks that would kill DebugRec-sync for runtime start
312  // update graphics
313  UpdateGraphics(false);
314  // Update faces
315  UpdateFaces(false);
316  // Update ocf
317  SetOCF();
318  }
319 
320  // make sure list is sorted by category - after sorting out inactives, because inactives aren't sorted into the main list
321  FixObjectOrder();
322 
323  // misc updates
324  for (C4Object *pObj : *this)
325  if (pObj->Status)
326  {
327  // add to plrview
328  pObj->UpdateLight();
329  // update flipdir (for old objects.txt with no flipdir defined)
330  // assigns Action.DrawDir as well
331  pObj->UpdateFlipDir();
332  // initial OCF update
333  pObj->SetOCF();
334  }
335  // Done
336  return ObjectCount();
337 }
virtual bool Add(C4Object *nObj, SortType eSort, C4ObjectList *pLstSorted=nullptr)
void UpdateFaces(bool bUpdateShape)
static void SetEnumerationIndex(int32_t iMaxObjectNumber)
Definition: C4PropList.cpp:93
void Copy(const C4ObjectList &rList)
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
const C4ObjectLink * GetLink(const C4Object *pObj) const
C4NotifyingObjectList Contents
Definition: C4Object.h:152
bool DebugLogF(const char *strMessage...)
Definition: C4Log.cpp:281
void UpdateFlipDir()
Definition: C4Object.cpp:444
void UpdateGraphics(bool fGraphicsChanged)
static void UnshelveNumberedPropLists()
Definition: C4PropList.cpp:123
int32_t Status
Definition: C4PropList.h:169
const int32_t C4D_StaticBack
Definition: C4Def.h:42
int32_t Category
Definition: C4Object.h:113
void Denumerate(C4ValueNumbers *)
const ReverseView reverse() const
Definition: C4ObjectList.h:104
#define C4OS_INACTIVE
Definition: C4Object.h:36
int ObjectCount(C4ID id=C4ID::None) const
iterator begin() const
C4ObjectList ForeObjects
Definition: C4GameObjects.h:44
void UpdateLight()
Definition: C4Object.cpp:4043
void SetOCF()
Definition: C4Object.cpp:670
C4ObjectPtr Contained
Definition: C4Object.h:144
virtual void Clear()
bool Remove(C4Object *pObj)
C4Real xdir
Definition: C4Object.h:126
C4Real ydir
Definition: C4Object.h:126
const int32_t C4D_Foreground
Definition: C4Def.h:55
virtual bool Remove(C4Object *pObj)

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4GameObjects::Remove ( C4Object pObj)
virtual

Reimplemented from C4ObjectList.

Definition at line 74 of file C4GameObjects.cpp.

References C4OS_INACTIVE, ForeObjects, InactiveObjects, C4LSectors::Remove(), C4ObjectList::Remove(), Sectors, and C4PropList::Status.

Referenced by PostLoad(), ResortUnsorted(), and C4Object::StatusDeactivate().

75 {
76  // if it's an inactive object, simply remove from the inactiv elist
77  if (pObj->Status == C4OS_INACTIVE) return InactiveObjects.Remove(pObj);
78  // remove from sectors
79  Sectors.Remove(pObj);
80  // remove from forelist
81  ForeObjects.Remove(pObj);
82  // manipulate main list
83  return C4ObjectList::Remove(pObj);
84 }
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
int32_t Status
Definition: C4PropList.h:169
C4LSectors Sectors
Definition: C4GameObjects.h:42
#define C4OS_INACTIVE
Definition: C4Object.h:36
C4ObjectList ForeObjects
Definition: C4GameObjects.h:44
void Remove(C4Object *pObj)
Definition: C4Sector.cpp:153
virtual bool Remove(C4Object *pObj)

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 959 of file C4ObjectList.cpp.

References C4ObjectList::FirstIter.

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

960 {
961  if (iter == FirstIter)
962  FirstIter = iter->Next;
963  else
964  {
965  iterator * i = FirstIter;
966  while (i->Next && i->Next != iter)
967  i = i->Next;
968  i->Next = iter->Next;
969  }
970 }
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)
protectedvirtualinherited

Reimplemented from C4ObjectList.

Definition at line 669 of file C4ObjectList.cpp.

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

670 {
673 }
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:

void C4GameObjects::ResetAudibility ( )

Definition at line 506 of file C4GameObjects.cpp.

References C4Object::Audible, C4Object::AudiblePan, C4Object::AudiblePlayer, and NO_OWNER.

Referenced by C4GraphicsSystem::Execute().

507 {
508  for (C4Object *obj : *this)
509  if (obj)
510  {
511  obj->Audible = obj->AudiblePan = 0;
512  obj->AudiblePlayer = NO_OWNER;
513  }
514 }
int32_t AudiblePlayer
Definition: C4Object.h:121
int32_t AudiblePan
Definition: C4Object.h:121
const int NO_OWNER
Definition: C4Constants.h:138
int32_t Audible
Definition: C4Object.h:121

Here is the caller graph for this function:

void C4GameObjects::ResortUnsorted ( )

Definition at line 447 of file C4GameObjects.cpp.

References Add(), C4Game::ClearPointers(), Game, Remove(), and C4Object::Unsorted.

Referenced by C4Game::ExecObjects(), and Synchronize().

448 {
449  for (C4Object *cObj : *this)
450  {
451  if (cObj->Unsorted)
452  {
453  // readd to main object list
454  Remove(cObj);
455  // reset flag so that Add correctly sorts this object
456  cObj->Unsorted=false;
457  if (!Add(cObj))
458  {
459  // readd failed: Better kill object to prevent leaking...
460  Game.ClearPointers(cObj);
461  delete cObj;
462  }
463  }
464  }
465 }
bool Add(C4Object *nObj)
C4Game Game
Definition: C4Globals.cpp:52
bool Unsorted
Definition: C4Object.h:129
void ClearPointers(C4Object *cobj)
Definition: C4Game.cpp:925
bool Remove(C4Object *pObj)

Here is the call graph for this function:

Here is the caller graph for this function:

const ReverseView C4ObjectList::reverse ( ) const
inlineinherited

Definition at line 104 of file C4ObjectList.h.

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

104 { return ReverseView(*this); }

Here is the caller graph for this function:

C4Object * C4GameObjects::SafeObjectPointer ( int32_t  iNumber)

Definition at line 191 of file C4GameObjects.cpp.

References ObjectPointer(), and C4PropList::Status.

Referenced by FnObject(), C4EditCursor::PerformDuplication(), and C4EditCursor::PerformDuplicationLegacy().

192 {
193  C4Object *pObj = ObjectPointer(iNumber);
194  if (pObj) if (!pObj->Status) return nullptr;
195  return pObj;
196 }
int32_t Status
Definition: C4PropList.h:169
C4Object * ObjectPointer(int32_t iNumber)

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::SetOCF ( )

Definition at line 516 of file C4GameObjects.cpp.

References C4Object::SetOCF(), and C4PropList::Status.

Referenced by PostLoad().

517 {
518  for (C4Object *obj : *this)
519  if (obj->Status)
520  obj->SetOCF();
521 }
int32_t Status
Definition: C4PropList.h:169
void SetOCF()
Definition: C4Object.cpp:670

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4ObjectList::ShiftContents ( C4Object pNewFirst)
inherited

Definition at line 719 of file C4ObjectList.cpp.

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

Referenced by C4Object::DirectComContents().

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

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

571 {
572  C4ObjectLink *cLnk;
573  bool fSorted;
574  // Sort by id
575  do
576  {
577  fSorted = true;
578  for (cLnk=First; cLnk && cLnk->Next; cLnk=cLnk->Next)
579  if (cLnk->Obj->id > cLnk->Next->Obj->id)
580  {
581  RemoveLink(cLnk);
582  InsertLink(cLnk,cLnk->Next);
583  fSorted = false;
584  break;
585  }
586  }
587  while (!fSorted);
588 }
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 C4GameObjects::SyncClearance ( )

Definition at line 492 of file C4GameObjects.cpp.

References C4Object::SyncClearance().

Referenced by C4Game::SyncClearance().

493 {
494  for (C4Object *obj : *this)
495  if (obj)
496  obj->SyncClearance();
497 }
void SyncClearance()
Definition: C4Object.cpp:2506

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::Synchronize ( )

Definition at line 175 of file C4GameObjects.cpp.

References ResortUnsorted(), and UpdateSolidMasks().

Referenced by C4Game::Synchronize().

176 {
177  // synchronize unsorted objects
178  ResortUnsorted();
179  // synchronize solidmasks
181 }
void UpdateSolidMasks()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4ObjectList::UpdateFaces ( bool  bUpdateShape)
inherited

Definition at line 683 of file C4ObjectList.cpp.

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

Referenced by PostLoad().

684 {
685  C4ObjectLink *cLnk;
686  for (cLnk=First; cLnk; cLnk=cLnk->Next)
687  if (cLnk->Obj->Status)
688  cLnk->Obj->UpdateFace(bUpdateShapes);
689 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.h:169
void UpdateFace(bool bUpdateShape, bool fTemp=false)
Definition: C4Object.cpp:381
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 675 of file C4ObjectList.cpp.

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

Referenced by PostLoad().

676 {
677  C4ObjectLink *cLnk;
678  for (cLnk=First; cLnk; cLnk=cLnk->Next)
679  if (cLnk->Obj->Status)
680  cLnk->Obj->UpdateGraphics(fGraphicsChanged);
681 }
C4ObjectLink * First
Definition: C4ObjectList.h:51
void UpdateGraphics(bool fGraphicsChanged, bool fTemp=false)
Definition: C4Object.cpp:407
C4ObjectLink * Next
Definition: C4ObjectList.h:29
int32_t Status
Definition: C4PropList.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 C4GameObjects::UpdatePos ( C4Object pObj)

Definition at line 365 of file C4GameObjects.cpp.

References Sectors, and C4LSectors::Update().

Referenced by C4Object::UpdatePos().

366 {
367  // Position might have changed. Update sector lists
368  Sectors.Update(pObj, this);
369 }
void Update(C4Object *pObj, C4ObjectList *pMainList)
Definition: C4Sector.cpp:111
C4LSectors Sectors
Definition: C4GameObjects.h:42

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::UpdatePosResort ( C4Object pObj)

Definition at line 371 of file C4GameObjects.cpp.

References C4LSectors::Add(), C4LSectors::Remove(), and Sectors.

372 {
373  // Object order for this object was changed. Readd object to sectors
374  Sectors.Remove(pObj);
375  Sectors.Add(pObj, this);
376 }
void Add(C4Object *pObj, C4ObjectList *pMainList)
Definition: C4Sector.cpp:93
C4LSectors Sectors
Definition: C4GameObjects.h:42
void Remove(C4Object *pObj)
Definition: C4Sector.cpp:153

Here is the call graph for this function:

void C4GameObjects::UpdateScriptPointers ( )

Definition at line 345 of file C4GameObjects.cpp.

References InactiveObjects, and C4ObjectList::UpdateScriptPointers().

Referenced by C4Game::ReLinkScriptEngine().

346 {
347  // call in sublists
350 }
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43
void UpdateScriptPointers()

Here is the call graph for this function:

Here is the caller graph for this function:

void C4GameObjects::UpdateSolidMasks ( )

Definition at line 198 of file C4GameObjects.cpp.

References C4PropList::Status, and C4Object::UpdateSolidMask().

Referenced by Synchronize().

199 {
200  for (C4Object *obj : *this)
201  if (obj->Status)
202  obj->UpdateSolidMask(false);
203 }
int32_t Status
Definition: C4PropList.h:169
void UpdateSolidMask(bool fRestoreAttachedObjects)
Definition: C4Object.cpp:4156

Here is the call graph for this function:

Here is the caller graph for this function:

bool C4GameObjects::ValidateOwners ( )
virtual

Reimplemented from C4ObjectList.

Definition at line 467 of file C4GameObjects.cpp.

References InactiveObjects, and C4ObjectList::ValidateOwners().

Referenced by C4Game::InitGameFinal(), and C4PlayerList::Remove().

468 {
469  // validate in sublists
470  bool fSucc = true;
471  if (!C4ObjectList::ValidateOwners()) fSucc = false;
472  if (!InactiveObjects.ValidateOwners()) fSucc = false;
473  return fSucc;
474 }
virtual bool ValidateOwners()
C4ObjectList InactiveObjects
Definition: C4GameObjects.h:43

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 443 of file C4ObjectList.cpp.

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

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

Here is the call graph for this function:

Member Data Documentation

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

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