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; };