From 7b6ec235d8ad97c461c8ed46c4a058776d2be352 Mon Sep 17 00:00:00 2001
From: Christian Semmler <mail@csemmler.com>
Date: Fri, 26 Jan 2024 17:52:03 -0500
Subject: [PATCH] Implement LegoWorld::Add (#490)

* LegoWorld::Add

* Add annotations

* Fix include guard

* Make stub

* Change MxPresenterSet to MxCoreSet

* Improve match

* Match

* Fix annotation
---
 .../lego/legoomni/include/legoanimpresenter.h |  5 +
 .../legoomni/include/legocachesoundlist.h     | 98 +++++++++++++++++++
 LEGO1/lego/legoomni/include/legoentitylist.h  |  3 +
 LEGO1/lego/legoomni/include/legoutil.h        |  2 +
 LEGO1/lego/legoomni/include/legoworld.h       | 79 ++++++++++-----
 LEGO1/lego/legoomni/src/common/legoutil.cpp   |  6 ++
 LEGO1/lego/legoomni/src/entity/legoworld.cpp  | 77 +++++++++++++--
 LEGO1/omni/include/mxcorelist.h               | 95 ------------------
 LEGO1/omni/include/mxpresenterlist.h          |  3 +
 9 files changed, 236 insertions(+), 132 deletions(-)
 create mode 100644 LEGO1/lego/legoomni/include/legocachesoundlist.h
 delete mode 100644 LEGO1/omni/include/mxcorelist.h

diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h
index 394147e5..2ca9c910 100644
--- a/LEGO1/lego/legoomni/include/legoanimpresenter.h
+++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h
@@ -40,6 +40,8 @@ public:
 	virtual void PutFrame() override;                                                              // vtable+0x6c
 	virtual MxResult VTable0x88(MxStreamChunk* p_chunk);                                           // vtable+0x88
 
+	inline LegoAnimClass* GetUnknown0x64() { return m_unk0x64; }
+
 	const char* GetActionObjectName();
 
 protected:
@@ -101,6 +103,9 @@ public:
 	virtual void VTable0xc() override;                        // vtable+0x0c
 	virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10
 
+	inline MxLong GetUnknown0x8() { return m_unk0x8; }
+
+	// private:
 	MxLong m_unk0x8;      // 0x08
 	undefined4 m_unk0xc;  // 0x0c
 	undefined4 m_unk0x10; // 0x10
diff --git a/LEGO1/lego/legoomni/include/legocachesoundlist.h b/LEGO1/lego/legoomni/include/legocachesoundlist.h
new file mode 100644
index 00000000..13d8f96c
--- /dev/null
+++ b/LEGO1/lego/legoomni/include/legocachesoundlist.h
@@ -0,0 +1,98 @@
+#ifndef LEGOCACHESOUNDLIST_H
+#define LEGOCACHESOUNDLIST_H
+
+#include "mxlist.h"
+#include "mxtypes.h"
+
+class LegoCacheSound;
+
+// VTABLE: LEGO1 0x100d63b0
+// class MxCollection<LegoCacheSound *>
+
+// VTABLE: LEGO1 0x100d63c8
+// class MxList<LegoCacheSound *>
+
+// VTABLE: LEGO1 0x100d63e0
+// class MxPtrList<LegoCacheSound>
+
+// VTABLE: LEGO1 0x100d63f8
+// SIZE 0x18
+class LegoCacheSoundList : public MxPtrList<LegoCacheSound> {
+public:
+	LegoCacheSoundList(MxBool p_ownership = FALSE) : MxPtrList<LegoCacheSound>(p_ownership) {}
+
+	// FUNCTION: LEGO1 0x1001e650
+	virtual MxS8 Compare(LegoCacheSound* p_a, LegoCacheSound* p_b) override
+	{
+		return p_a == p_b ? 0 : p_a < p_b ? -1 : 1;
+	}; // vtable+0x14
+};
+
+// VTABLE: LEGO1 0x100d64a0
+// class MxListCursor<LegoCacheSound *>
+
+// VTABLE: LEGO1 0x100d6500
+// class MxPtrListCursor<LegoCacheSound>
+
+// VTABLE: LEGO1 0x100d6518
+// SIZE 0x10
+class LegoCacheSoundListCursor : public MxPtrListCursor<LegoCacheSound> {
+public:
+	LegoCacheSoundListCursor(LegoCacheSoundList* p_list) : MxPtrListCursor<LegoCacheSound>(p_list){};
+};
+
+// TEMPLATE: LEGO1 0x1001e670
+// MxCollection<LegoCacheSound *>::Compare
+
+// TEMPLATE: LEGO1 0x1001e680
+// MxCollection<LegoCacheSound *>::~MxCollection<LegoCacheSound *>
+
+// TEMPLATE: LEGO1 0x1001e6d0
+// MxCollection<LegoCacheSound *>::Destroy
+
+// TEMPLATE: LEGO1 0x1001e6e0
+// MxList<LegoCacheSound *>::~MxList<LegoCacheSound *>
+
+// TEMPLATE: LEGO1 0x1001e770
+// MxPtrList<LegoCacheSound>::Destroy
+
+// SYNTHETIC: LEGO1 0x1001e780
+// LegoCacheSoundList::`scalar deleting destructor'
+
+// TEMPLATE: LEGO1 0x1001e7f0
+// MxPtrList<LegoCacheSound>::~MxPtrList<LegoCacheSound>
+
+// SYNTHETIC: LEGO1 0x1001e840
+// MxCollection<LegoCacheSound *>::`scalar deleting destructor'
+
+// SYNTHETIC: LEGO1 0x1001e8b0
+// MxList<LegoCacheSound *>::`scalar deleting destructor'
+
+// SYNTHETIC: LEGO1 0x1001e960
+// MxPtrList<LegoCacheSound>::`scalar deleting destructor'
+
+// SYNTHETIC: LEGO1 0x1001f350
+// LegoCacheSoundListCursor::`scalar deleting destructor'
+
+// FUNCTION: LEGO1 0x1001f3c0
+// MxPtrListCursor<LegoCacheSound>::~MxPtrListCursor<LegoCacheSound>
+
+// SYNTHETIC: LEGO1 0x1001f410
+// MxListCursor<LegoCacheSound *>::`scalar deleting destructor'
+
+// SYNTHETIC: LEGO1 0x1001f480
+// MxPtrListCursor<LegoCacheSound>::`scalar deleting destructor'
+
+// FUNCTION: LEGO1 0x1001f4f0
+// MxListCursor<LegoCacheSound *>::~MxListCursor<LegoCacheSound *>
+
+// FUNCTION: LEGO1 0x1001f540
+// LegoCacheSoundListCursor::~LegoCacheSoundListCursor
+
+// TEMPLATE: LEGO1 0x10020840
+// MxListCursor<LegoCacheSound *>::MxListCursor<LegoCacheSound *>
+
+// TEMPLATE: LEGO1 0x100224e0
+// MxList<LegoCacheSound *>::InsertEntry
+
+#endif // LEGOCACHESOUNDLIST_H
diff --git a/LEGO1/lego/legoomni/include/legoentitylist.h b/LEGO1/lego/legoomni/include/legoentitylist.h
index 04935769..4f212279 100644
--- a/LEGO1/lego/legoomni/include/legoentitylist.h
+++ b/LEGO1/lego/legoomni/include/legoentitylist.h
@@ -92,4 +92,7 @@ public:
 // TEMPLATE: LEGO1 0x100207d0
 // MxListCursor<LegoEntity *>::MxListCursor<LegoEntity *>
 
+// TEMPLATE: LEGO1 0x10022430
+// MxList<LegoEntity *>::InsertEntry
+
 #endif // LEGOENTITYLIST_H
diff --git a/LEGO1/lego/legoomni/include/legoutil.h b/LEGO1/lego/legoomni/include/legoutil.h
index 6e9bb5ee..75e51c20 100644
--- a/LEGO1/lego/legoomni/include/legoutil.h
+++ b/LEGO1/lego/legoomni/include/legoutil.h
@@ -9,7 +9,9 @@
 
 class MxAtomId;
 class LegoEntity;
+class LegoAnimPresenter;
 
+void FUN_1003e050(LegoAnimPresenter* p_presenter);
 Extra::ActionType MatchActionString(const char*);
 void InvokeAction(Extra::ActionType p_actionId, MxAtomId& p_pAtom, int p_targetEntityId, LegoEntity* p_sender);
 void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut);
diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h
index 4bc7ab70..074728e3 100644
--- a/LEGO1/lego/legoomni/include/legoworld.h
+++ b/LEGO1/lego/legoomni/include/legoworld.h
@@ -1,22 +1,24 @@
 #ifndef LEGOWORLD_H
 #define LEGOWORLD_H
 
+#include "legocachesound.h"
+#include "legocachesoundlist.h"
 #include "legocameracontroller.h"
 #include "legoentity.h"
 #include "legoentitylist.h"
 #include "legopathcontrollerlist.h"
-#include "mxcorelist.h"
 #include "mxpresenter.h"
 #include "mxpresenterlist.h"
 
 class IslePathActor;
 class LegoPathBoundary;
+class LegoHideAnimPresenter;
 
-struct PresenterSetCompare {
-	MxS32 operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; }
+struct CoreSetCompare {
+	MxS32 operator()(MxCore* const& p_a, MxCore* const& p_b) const { return p_a > p_b; }
 };
 
-typedef set<MxPresenter*, PresenterSetCompare> MxPresenterSet;
+typedef set<MxCore*, CoreSetCompare> MxCoreSet;
 
 // VTABLE: LEGO1 0x100d6280
 // SIZE 0xf8
@@ -72,38 +74,38 @@ public:
 	// LegoWorld::`scalar deleting destructor'
 
 protected:
-	LegoPathControllerList m_list0x68;        // 0x68
-	MxPresenterList m_animPresenters;         // 0x80
-	LegoCameraController* m_cameraController; // 0x98
-	LegoEntityList* m_entityList;             // 0x9c
-	MxCoreList* m_coreList;                   // 0xa0
-	undefined m_unk0xa4;                      // 0xa4
-	MxPresenterSet m_set0xa8;                 // 0xa8
-	MxPresenterList m_controlPresenters;      // 0xb8
-	MxPresenterSet m_set0xd0;                 // 0xd0
-	list<AutoROI*> m_list0xe0;                // 0xe0
-	undefined4 m_unk0xec;                     // 0xec
-	undefined4 m_unk0xf0;                     // 0xf0
-	MxS16 m_unk0xf4;                          // 0xf4
-	MxBool m_worldStarted;                    // 0xf6
-	undefined m_unk0xf7;                      // 0xf7
+	LegoPathControllerList m_list0x68;          // 0x68
+	MxPresenterList m_animPresenters;           // 0x80
+	LegoCameraController* m_cameraController;   // 0x98
+	LegoEntityList* m_entityList;               // 0x9c
+	LegoCacheSoundList* m_cacheSoundList;       // 0xa0
+	undefined m_unk0xa4;                        // 0xa4
+	MxCoreSet m_set0xa8;                        // 0xa8
+	MxPresenterList m_controlPresenters;        // 0xb8
+	MxCoreSet m_set0xd0;                        // 0xd0
+	list<AutoROI*> m_list0xe0;                  // 0xe0
+	undefined4 m_unk0xec;                       // 0xec
+	LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0
+	MxS16 m_unk0xf4;                            // 0xf4
+	MxBool m_worldStarted;                      // 0xf6
+	undefined m_unk0xf7;                        // 0xf7
 };
 
 // clang-format off
 // TEMPLATE: LEGO1 0x1001d780
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::~_Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::~_Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >
 
 // TEMPLATE: LEGO1 0x1001d850
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::iterator::_Inc
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::iterator::_Inc
 
 // TEMPLATE: LEGO1 0x1001d890
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::erase
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::erase
 
 // TEMPLATE: LEGO1 0x1001dcf0
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::_Erase
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Erase
 
 // TEMPLATE: LEGO1 0x1001dd30
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::_Init
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Init
 
 // TEMPLATE: LEGO1 0x1001ddf0
 // list<AutoROI *,allocator<AutoROI *> >::~list<AutoROI *,allocator<AutoROI *> >
@@ -115,10 +117,10 @@ protected:
 // list<AutoROI *,allocator<AutoROI *> >::_Buynode
 
 // TEMPLATE: LEGO1 0x1001de90
-// set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >::~set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *> >
+// set<MxCore *,CoreSetCompare,allocator<MxCore *> >::~set<MxCore *,CoreSetCompare,allocator<MxCore *> >
 
 // TEMPLATE: LEGO1 0x1001df00
-// Set<MxPresenter *,PresenterSetCompare>::~Set<MxPresenter *,PresenterSetCompare>
+// Set<MxCore *,CoreSetCompare>::~Set<MxCore *,CoreSetCompare>
 
 // SYNTHETIC: LEGO1 0x1001eed0
 // MxPresenterListCursor::`scalar deleting destructor'
@@ -141,8 +143,31 @@ protected:
 // TEMPLATE: LEGO1 0x10020760
 // MxListCursor<MxPresenter *>::MxListCursor<MxPresenter *>
 
+// TEMPLATE: LEGO1 0x100208b0
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::insert
+
+// TEMPLATE: LEGO1 0x10020b20
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::iterator::_Dec
+
+// XTEMPLATE LEGO1 0x10020b70
+
+// TEMPLATE: LEGO1 0x10020bb0
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Buynode
+
+// TEMPLATE: LEGO1 0x10020bd0
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Insert
+
+// TEMPLATE: LEGO1 0x10020e50
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Lrotate
+
+// TEMPLATE: LEGO1 0x10020eb0
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Rrotate
+
+// TEMPLATE: LEGO1 0x10022360
+// _Construct
+
 // GLOBAL: LEGO1 0x100f11a0
-// _Tree<MxPresenter *,MxPresenter *,set<MxPresenter *,PresenterSetCompare,allocator<MxPresenter *>>::_Kfn,PresenterSetCompare,allocator<MxPresenter *> >::_Nil
+// _Tree<MxCore *,MxCore *,set<MxCore *,CoreSetCompare,allocator<MxCore *> >::_Kfn,CoreSetCompare,allocator<MxCore *> >::_Nil
 // clang-format on
 
 #endif // LEGOWORLD_H
diff --git a/LEGO1/lego/legoomni/src/common/legoutil.cpp b/LEGO1/lego/legoomni/src/common/legoutil.cpp
index 843f4abb..dfb4b740 100644
--- a/LEGO1/lego/legoomni/src/common/legoutil.cpp
+++ b/LEGO1/lego/legoomni/src/common/legoutil.cpp
@@ -10,6 +10,12 @@
 #include <process.h>
 #include <string.h>
 
+// STUB: LEGO1 0x1003e050
+void FUN_1003e050(LegoAnimPresenter* p_presenter)
+{
+	// TODO
+}
+
 // FUNCTION: LEGO1 0x1003e300
 Extra::ActionType MatchActionString(const char* p_str)
 {
diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp
index c9381197..a39a957e 100644
--- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp
+++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp
@@ -15,8 +15,8 @@
 DECOMP_SIZE_ASSERT(LegoWorld, 0xf8)
 DECOMP_SIZE_ASSERT(LegoEntityList, 0x18)
 DECOMP_SIZE_ASSERT(LegoEntityListCursor, 0x10)
-DECOMP_SIZE_ASSERT(MxCoreList, 0x18)
-DECOMP_SIZE_ASSERT(MxCoreListCursor, 0x10)
+DECOMP_SIZE_ASSERT(LegoCacheSoundList, 0x18)
+DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10)
 
 // FUNCTION: LEGO1 0x1001ca40
 LegoWorld::LegoWorld() : m_list0x68(TRUE)
@@ -24,9 +24,9 @@ LegoWorld::LegoWorld() : m_list0x68(TRUE)
 	m_unk0xf4 = 4;
 	m_cameraController = NULL;
 	m_entityList = NULL;
-	m_coreList = NULL;
+	m_cacheSoundList = NULL;
 	m_unk0xa4 = 0; // MxBool?
-	m_unk0xf0 = 0;
+	m_hideAnimPresenter = NULL;
 	m_worldStarted = FALSE;
 
 	NotificationManager()->Register(this);
@@ -60,9 +60,9 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction)
 	if (!m_entityList)
 		return FAILURE;
 
-	m_coreList = new MxCoreList(TRUE);
+	m_cacheSoundList = new LegoCacheSoundList(TRUE);
 
-	if (!m_coreList)
+	if (!m_cacheSoundList)
 		return FAILURE;
 
 	if (!VTable0x54())
@@ -152,10 +152,67 @@ MxS32 LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value)
 	return 0;
 }
 
-// STUB: LEGO1 0x10020220
+// FUNCTION: LEGO1 0x10020220
 void LegoWorld::Add(MxCore* p_object)
 {
-	// TODO
+	if (p_object && !p_object->IsA("LegoWorld") && !p_object->IsA("LegoWorldPresenter")) {
+		if (p_object->IsA("LegoAnimPresenter")) {
+			LegoAnimPresenter* animPresenter = (LegoAnimPresenter*) p_object;
+
+			if (!strcmpi(animPresenter->GetAction()->GetObjectName(), "ConfigAnimation")) {
+				FUN_1003e050(animPresenter);
+				animPresenter->GetAction()->SetDuration(animPresenter->GetUnknown0x64()->GetUnknown0x8());
+			}
+		}
+
+		if (p_object->IsA("MxControlPresenter")) {
+			MxPresenterListCursor cursor(&m_controlPresenters);
+
+			if (cursor.Find((MxPresenter*) p_object))
+				return;
+
+			m_controlPresenters.Append((MxPresenter*) p_object);
+		}
+		else if (p_object->IsA("MxEntity")) {
+			LegoEntityListCursor cursor(m_entityList);
+
+			if (cursor.Find((LegoEntity*) p_object))
+				return;
+
+			m_entityList->Append((LegoEntity*) p_object);
+		}
+		else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) {
+			MxPresenterListCursor cursor(&m_animPresenters);
+
+			if (cursor.Find((MxPresenter*) p_object))
+				return;
+
+			((MxPresenter*) p_object)->SendToCompositePresenter(Lego());
+			m_animPresenters.Append(((MxPresenter*) p_object));
+
+			if (p_object->IsA("LegoHideAnimPresenter"))
+				m_hideAnimPresenter = (LegoHideAnimPresenter*) p_object;
+		}
+		else if (p_object->IsA("LegoCacheSound")) {
+			LegoCacheSoundListCursor cursor(m_cacheSoundList);
+
+			if (cursor.Find((LegoCacheSound*) p_object))
+				return;
+
+			m_cacheSoundList->Append((LegoCacheSound*) p_object);
+		}
+		else {
+			if (m_set0xa8.find(p_object) == m_set0xa8.end())
+				m_set0xa8.insert(p_object);
+		}
+
+		if (!m_set0xd0.empty() && p_object->IsA("MxPresenter")) {
+			if (((MxPresenter*) p_object)->IsEnabled()) {
+				((MxPresenter*) p_object)->Enable(FALSE);
+				m_set0xd0.insert(p_object);
+			}
+		}
+	}
 }
 
 // STUB: LEGO1 0x10020f10
@@ -206,7 +263,7 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name)
 		return NULL;
 	}
 	else {
-		for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
+		for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
 			if ((*it)->IsA(p_class) && (*it)->IsA("MxPresenter")) {
 				MxPresenter* presenter = (MxPresenter*) *it;
 				MxDSAction* action = presenter->GetAction();
@@ -250,7 +307,7 @@ MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId)
 			return presenter;
 	}
 
-	for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
+	for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) {
 		MxCore* core = *it;
 
 		if (core->IsA("MxPresenter")) {
diff --git a/LEGO1/omni/include/mxcorelist.h b/LEGO1/omni/include/mxcorelist.h
deleted file mode 100644
index 15ae7c9b..00000000
--- a/LEGO1/omni/include/mxcorelist.h
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifndef MXCORELIST_H
-#define MXCORELIST_H
-
-#include "mxlist.h"
-#include "mxtypes.h"
-
-class MxCore;
-
-// VTABLE: LEGO1 0x100d63b0
-// class MxCollection<MxCore *>
-
-// VTABLE: LEGO1 0x100d63c8
-// class MxList<MxCore *>
-
-// VTABLE: LEGO1 0x100d63e0
-// class MxPtrList<MxCore>
-
-// VTABLE: LEGO1 0x100d63f8
-// SIZE 0x18
-class MxCoreList : public MxPtrList<MxCore> {
-public:
-	MxCoreList(MxBool p_ownership = FALSE) : MxPtrList<MxCore>(p_ownership) {}
-
-	// FUNCTION: LEGO1 0x1001e650
-	virtual MxS8 Compare(MxCore* p_a, MxCore* p_b) override
-	{
-		return p_a == p_b ? 0 : p_a < p_b ? -1 : 1;
-	}; // vtable+0x14
-};
-
-// VTABLE: LEGO1 0x100d64a0
-// class MxListCursor<MxCore *>
-
-// VTABLE: LEGO1 0x100d6500
-// class MxPtrListCursor<MxCore>
-
-// VTABLE: LEGO1 0x100d6518
-// SIZE 0x10
-class MxCoreListCursor : public MxPtrListCursor<MxCore> {
-public:
-	MxCoreListCursor(MxCoreList* p_list) : MxPtrListCursor<MxCore>(p_list){};
-};
-
-// TEMPLATE: LEGO1 0x1001e670
-// MxCollection<MxCore *>::Compare
-
-// TEMPLATE: LEGO1 0x1001e680
-// MxCollection<MxCore *>::~MxCollection<MxCore *>
-
-// TEMPLATE: LEGO1 0x1001e6d0
-// MxCollection<MxCore *>::Destroy
-
-// TEMPLATE: LEGO1 0x1001e6e0
-// MxList<MxCore *>::~MxList<MxCore *>
-
-// TEMPLATE: LEGO1 0x1001e770
-// MxPtrList<MxCore>::Destroy
-
-// SYNTHETIC: LEGO1 0x1001e780
-// MxCoreList::`scalar deleting destructor'
-
-// TEMPLATE: LEGO1 0x1001e7f0
-// MxPtrList<MxCore>::~MxPtrList<MxCore>
-
-// SYNTHETIC: LEGO1 0x1001e840
-// MxCollection<MxCore *>::`scalar deleting destructor'
-
-// SYNTHETIC: LEGO1 0x1001e8b0
-// MxList<MxCore *>::`scalar deleting destructor'
-
-// SYNTHETIC: LEGO1 0x1001e960
-// MxPtrList<MxCore>::`scalar deleting destructor'
-
-// SYNTHETIC: LEGO1 0x1001f350
-// MxCoreListCursor::`scalar deleting destructor'
-
-// FUNCTION: LEGO1 0x1001f3c0
-// MxPtrListCursor<MxCore>::~MxPtrListCursor<MxCore>
-
-// SYNTHETIC: LEGO1 0x1001f410
-// MxListCursor<MxCore *>::`scalar deleting destructor'
-
-// SYNTHETIC: LEGO1 0x1001f480
-// MxPtrListCursor<MxCore>::`scalar deleting destructor'
-
-// FUNCTION: LEGO1 0x1001f4f0
-// MxListCursor<MxCore *>::~MxListCursor<MxCore *>
-
-// FUNCTION: LEGO1 0x1001f540
-// MxCoreListCursor::~MxCoreListCursor
-
-// TEMPLATE: LEGO1 0x10020840
-// MxListCursor<MxCore *>::MxListCursor<MxCore *>
-
-#endif // MXCORELIST_H
diff --git a/LEGO1/omni/include/mxpresenterlist.h b/LEGO1/omni/include/mxpresenterlist.h
index a029a4cf..238dedfb 100644
--- a/LEGO1/omni/include/mxpresenterlist.h
+++ b/LEGO1/omni/include/mxpresenterlist.h
@@ -71,4 +71,7 @@ public:
 // SYNTHETIC: LEGO1 0x1001d100
 // MxPresenterList::~MxPresenterList
 
+// TEMPLATE: LEGO1 0x10022380
+// MxList<MxPresenter *>::InsertEntry
+
 #endif // MXPRESENTERLIST_H