diff --git a/VCS PC/PtrList.h b/VCS PC/PtrList.h
new file mode 100644
index 0000000..3c640e4
--- /dev/null
+++ b/VCS PC/PtrList.h
@@ -0,0 +1,167 @@
+#ifndef __PTRLIST
+#define __PTRLIST
+
+class CPtrNode
+{
+public:
+ void* m_pPtr;
+ union
+ {
+ class CPtrNodeSingleLink* m_psNext;
+ class CPtrNodeDoubleLink* m_pdNext;
+
+ class CPtrNode* m_pNext; // for CPtrList methods
+ };
+
+public:
+ CPtrNode(void* pItem)
+ : m_pPtr(pItem)
+ {
+ }
+};
+
+class CPtrNodeSingleLink : public CPtrNode
+{
+public:
+ CPtrNodeSingleLink(void* pItem)
+ : CPtrNode(pItem)
+ {
+ }
+};
+
+class CPtrNodeDoubleLink : public CPtrNode
+{
+public:
+ CPtrNodeDoubleLink* m_pdPrev;
+
+public:
+ CPtrNodeDoubleLink(void* pItem)
+ : CPtrNode(pItem)
+ {
+ }
+};
+
+class CPtrList
+{
+public:
+ union
+ {
+ CPtrNodeSingleLink* m_psNodes;
+ CPtrNodeDoubleLink* m_pdNodes;
+
+ CPtrNode* m_pNodes; // for CPtrList methods
+ };
+
+ bool IsMemberOfList(void* pItem)
+ {
+ if ( CPtrNode* pCurNode = m_pNodes )
+ {
+ while ( pCurNode->m_pPtr != pItem )
+ {
+ pCurNode->m_pNext;
+ if ( !pCurNode )
+ return false;
+ }
+ return true;
+ }
+ return false;
+ };
+
+ int CountElements()
+ {
+ CPtrNode* pCurMode = m_pNodes;
+ int nCount = 0;
+
+ while ( pCurMode )
+ {
+ ++nCount;
+ pCurMode = pCurMode->m_pNext;
+ }
+ return nCount;
+ };
+};
+
+class CPtrListSingleLink : public CPtrList
+{
+public:
+ // TODO: NEEDS NEW/DELETE OVERLOADS & FLUSH METHOD
+ CPtrNodeSingleLink* AddItem(void* pItem)
+ {
+ CPtrNodeSingleLink* pNewLink = new CPtrNodeSingleLink(pItem);
+
+ pNewLink->m_psNext = m_psNodes;
+ m_psNodes = pNewLink;
+
+ return pNewLink;
+ }
+
+ void DeleteItem(void* pItem)
+ {
+ CPtrNodeSingleLink* pCurNode = m_psNodes;
+ CPtrNodeSingleLink* pPrevNode = nullptr;
+
+ if ( pCurNode )
+ {
+ while ( pCurNode->m_pPtr != pItem )
+ {
+ pPrevNode = pCurNode;
+ pCurNode = pCurNode->m_psNext;
+ if ( !pCurNode )
+ return;
+ }
+
+ if ( m_psNodes == pCurNode )
+ m_psNodes = pCurNode->m_psNext;
+ else if ( pPrevNode )
+ pPrevNode->m_psNext = pCurNode->m_psNext;
+
+ delete pCurNode;
+ }
+ }
+};
+
+class CPtrListDoubleLink : public CPtrList
+{
+public:
+ // TODO: NEEDS NEW/DELETE OVERLOADS & FLUSH METHOD
+ CPtrNodeDoubleLink* AddItem(void* pItem)
+ {
+ CPtrNodeDoubleLink* pNewLink = new CPtrNodeDoubleLink(pItem);
+
+ pNewLink->m_pdNext = m_pdNodes;
+ pNewLink->m_pdPrev = nullptr;
+
+ if ( m_pdNodes )
+ m_pdNodes->m_pdPrev = pNewLink;
+ m_pdNodes = pNewLink;
+
+ return pNewLink;
+ }
+
+ void DeleteItem(void* pItem)
+ {
+ CPtrNodeDoubleLink* pCurNode = m_pdNodes;
+
+ if ( pCurNode )
+ {
+ while ( pCurNode->m_pPtr != pItem )
+ {
+ pCurNode = pCurNode->m_pdNext;
+ if ( !pCurNode )
+ return;
+ }
+
+ if ( m_pdNodes == pCurNode )
+ m_pdNodes = pCurNode->m_pdNext;
+ if ( pCurNode->m_pdPrev )
+ pCurNode->m_pdPrev->m_pdNext = pCurNode->m_pdNext;
+ if ( pCurNode->m_pdNext )
+ pCurNode->m_pdNext->m_pdPrev = pCurNode->m_pdPrev;
+
+ delete pCurNode;
+ }
+ }
+};
+
+
+#endif
\ No newline at end of file
diff --git a/VCS PC/VCS PC.vcxproj b/VCS PC/VCS PC.vcxproj
index a2c2a20..a854f3a 100644
--- a/VCS PC/VCS PC.vcxproj
+++ b/VCS PC/VCS PC.vcxproj
@@ -452,6 +452,7 @@ popd
+
diff --git a/VCS PC/VCS PC.vcxproj.filters b/VCS PC/VCS PC.vcxproj.filters
index 7a42640..773b70d 100644
--- a/VCS PC/VCS PC.vcxproj.filters
+++ b/VCS PC/VCS PC.vcxproj.filters
@@ -494,6 +494,9 @@
Header Files
+
+ Header Files
+
diff --git a/VCS PC/World.cpp b/VCS PC/World.cpp
index 8f51fda..8a6bcf0 100644
--- a/VCS PC/World.cpp
+++ b/VCS PC/World.cpp
@@ -19,8 +19,8 @@ void CWorld::ClearForRestart()
// Clear shadows from CBuildings
for ( int i = 0; i < 14400; i++ )
{
- for ( auto it = ms_aSectors[i].building.sNode; it; it = it->next )
- static_cast(it->entity)->ClearForRestart();
+ for ( auto it = ms_aSectors[i].building.m_psNodes; it; it = it->m_psNext )
+ static_cast(it->m_pPtr)->ClearForRestart();
}
}
diff --git a/VCS PC/World.h b/VCS PC/World.h
index 4557a1a..c1bc11f 100644
--- a/VCS PC/World.h
+++ b/VCS PC/World.h
@@ -3,39 +3,15 @@
#include "General.h"
#include "PlayerInfo.h"
+#include "PtrList.h"
#define NUM_PLAYERS 2;
-class CPtrNodeSingle
-{
-public:
- CEntity* entity;
- CPtrNodeSingle* next;
-};
-
-class CPtrNodeDouble
-{
-public:
- CEntity* entity;
- CPtrNodeDouble* next;
- CPtrNodeDouble* prev;
-};
-
-class CPtrList
-{
-public:
- union
- {
- CPtrNodeSingle* sNode;
- CPtrNodeDouble* dNode;
- };
-};
-
class CSector
{
public:
- CPtrList building;
- CPtrList dummy;
+ CPtrListSingleLink building;
+ CPtrListSingleLink dummy;
};