From 8bf0bde6b988817cd80d7c38034aa0006b75e889 Mon Sep 17 00:00:00 2001
From: Christian Semmler <mail@csemmler.com>
Date: Thu, 7 Dec 2023 07:06:44 -0500
Subject: [PATCH] Bootstrap MxCompositePresenter (#310)

* Bootstrap MxCompositePresenter

* Remove MxUnkList

* Use TickleState_Idle

* Add all annotations

* Add vtable

* Add Notify

* Update mxcompositepresenter.h

* Remove extra TEMPLATE

* Update mxcompositepresenter.cpp
---
 LEGO1/mxcompositepresenter.cpp | 74 +++++++++++++++++++++++++++++++++-
 LEGO1/mxcompositepresenter.h   | 23 +++++++----
 LEGO1/mxunklist.h              | 38 -----------------
 3 files changed, 87 insertions(+), 48 deletions(-)
 delete mode 100644 LEGO1/mxunklist.h

diff --git a/LEGO1/mxcompositepresenter.cpp b/LEGO1/mxcompositepresenter.cpp
index acc4002e..d21013d4 100644
--- a/LEGO1/mxcompositepresenter.cpp
+++ b/LEGO1/mxcompositepresenter.cpp
@@ -19,12 +19,50 @@ MxCompositePresenter::MxCompositePresenter()
 	NotificationManager()->Register(this);
 }
 
+// TEMPLATE: LEGO1 0x100b61a0
+// list<MxPresenter *,allocator<MxPresenter *> >::~list<MxPresenter *,allocator<MxPresenter *> >
+
+// FUNCTION: LEGO1 0x100b6210
+// MxCompositePresenter::ClassName
+
+// FUNCTION: LEGO1 0x100b6220
+// MxCompositePresenter::IsA
+
+// SYNTHETIC: LEGO1 0x100b62d0
+// MxCompositePresenter::`scalar deleting destructor'
+
+// FUNCTION: LEGO1 0x100b62f0
+// MxCompositePresenterList::~MxCompositePresenterList
+
+// TEMPLATE: LEGO1 0x100b6340
+// List<MxPresenter *>::~List<MxPresenter *>
+
 // FUNCTION: LEGO1 0x100b6390
 MxCompositePresenter::~MxCompositePresenter()
 {
 	NotificationManager()->Unregister(this);
 }
 
+// STUB: LEGO1 0x100b6410
+MxResult MxCompositePresenter::StartAction(MxStreamController*, MxDSAction*)
+{
+	// TODO
+	return SUCCESS;
+}
+
+// STUB: LEGO1 0x100b65e0
+void MxCompositePresenter::EndAction()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x100b6760
+MxLong MxCompositePresenter::Notify(MxParam& p)
+{
+	// TODO
+	return 0;
+}
+
 // STUB: LEGO1 0x100b67f0
 void MxCompositePresenter::VTable0x58()
 {
@@ -37,8 +75,40 @@ void MxCompositePresenter::VTable0x5c()
 	// TODO
 }
 
-// STUB: LEGO1 0x100b6b40
-void MxCompositePresenter::VTable0x60(undefined4 p_unknown)
+// FUNCTION: LEGO1 0x100b6b40
+void MxCompositePresenter::VTable0x60(MxPresenter* p_presenter)
+{
+	for (MxCompositePresenterList::iterator it = m_list.begin(); it != m_list.end(); it++) {
+		if (*it == p_presenter) {
+			if (++it == m_list.end()) {
+				if (m_compositePresenter)
+					m_compositePresenter->VTable0x60(this);
+			}
+			else if (m_action->IsA("MxDSSerialAction")) {
+				MxPresenter* presenter = *it;
+				if (presenter->GetCurrentTickleState() == TickleState_Idle)
+					presenter->SetTickleState(TickleState_Ready);
+			}
+			return;
+		}
+	}
+}
+
+// STUB: LEGO1 0x100b6bc0
+void MxCompositePresenter::SetTickleState(TickleState p_tickleState)
 {
 	// TODO
 }
+
+// STUB: LEGO1 0x100b6c30
+void MxCompositePresenter::Enable(MxBool p_enable)
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x100b6c80
+MxBool MxCompositePresenter::HasTickleStatePassed(TickleState p_tickleState)
+{
+	// TODO
+	return TRUE;
+}
diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h
index 2aee103f..20b3c347 100644
--- a/LEGO1/mxcompositepresenter.h
+++ b/LEGO1/mxcompositepresenter.h
@@ -1,8 +1,10 @@
 #ifndef MXCOMPOSITEPRESENTER_H
 #define MXCOMPOSITEPRESENTER_H
 
+#include "compat.h" // STL
 #include "mxpresenter.h"
-#include "mxunklist.h"
+
+class MxCompositePresenterList : public list<MxPresenter*> {};
 
 // VTABLE: LEGO1 0x100dc618
 // SIZE 0x4c
@@ -11,26 +13,31 @@ public:
 	MxCompositePresenter();
 	virtual ~MxCompositePresenter() override; // vtable+0x0
 
-	// FUNCTION: LEGO1 0x100b6210
+	virtual MxLong Notify(MxParam& p) override; // vtable+0x04
+
 	inline virtual const char* ClassName() const override // vtable+0x0c
 	{
 		// GLOBAL: LEGO1 0x100f0774
 		return "MxCompositePresenter";
 	}
 
-	// FUNCTION: LEGO1 0x100b6220
 	inline virtual MxBool IsA(const char* name) const override // vtable+0x10
 	{
 		return !strcmp(name, MxCompositePresenter::ClassName()) || MxPresenter::IsA(name);
 	}
 
-	virtual void VTable0x58();
-	virtual void VTable0x5c();
-	virtual void VTable0x60(undefined4 p_unknown);
-	virtual MxBool VTable0x64(undefined4 p_unknown);
+	virtual MxResult StartAction(MxStreamController*, MxDSAction*) override; // vtable+0x3c
+	virtual void EndAction() override;                                       // vtable+0x40
+	virtual void SetTickleState(TickleState p_tickleState) override;         // vtable+0x44
+	virtual MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48
+	virtual void Enable(MxBool p_enable) override;                           // vtable+0x54
+	virtual void VTable0x58();                                               // vtable+0x58
+	virtual void VTable0x5c();                                               // vtable+0x5c
+	virtual void VTable0x60(MxPresenter* p_presenter);                       // vtable+0x60
+	virtual MxBool VTable0x64(undefined4 p_unknown);                         // vtable+0x64
 
 private:
-	MxUnkList m_list;
+	MxCompositePresenterList m_list; // 0x40
 };
 
 #endif // MXCOMPOSITEPRESENTER_H
diff --git a/LEGO1/mxunklist.h b/LEGO1/mxunklist.h
deleted file mode 100644
index cdbdeb13..00000000
--- a/LEGO1/mxunklist.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef MXUNKLIST_H
-#define MXUNKLIST_H
-
-#include "decomp.h"
-#include "mxtypes.h"
-
-/*
- * This is an as-of-yet unknown list-like data structure.
- * The class hierarchy/structure isn't quite correct yet.
- */
-
-struct MxUnkListNode {
-	MxUnkListNode* m_unk00;
-	MxUnkListNode* m_unk04;
-	undefined4 m_unk08;
-};
-
-class MxUnkList {
-public:
-	inline MxUnkList()
-	{
-		undefined unk;
-		this->m_unk00 = unk;
-
-		MxUnkListNode* node = new MxUnkListNode();
-		node->m_unk00 = node;
-		node->m_unk04 = node;
-
-		this->m_head = node;
-		this->m_count = 0;
-	}
-
-	undefined m_unk00;
-	MxUnkListNode* m_head;
-	MxU32 m_count;
-};
-
-#endif // MXUNKLIST_H