From 0eada87b93d2d5dedc9326825c6d880058a65e13 Mon Sep 17 00:00:00 2001
From: Joshua Peisach <itzswirlz2020@outlook.com>
Date: Fri, 15 Dec 2023 11:41:07 -0500
Subject: [PATCH] Bootstrap MxControlPresenter  (#332)

* Start MxControlPresenter vtable functions

* Add changes

---------

Co-authored-by: Christian Semmler <mail@csemmler.com>
---
 LEGO1/mxcontrolpresenter.cpp | 85 ++++++++++++++++++++++++++++++++++--
 LEGO1/mxcontrolpresenter.h   | 30 ++++++++++---
 2 files changed, 105 insertions(+), 10 deletions(-)

diff --git a/LEGO1/mxcontrolpresenter.cpp b/LEGO1/mxcontrolpresenter.cpp
index 07802a08..47e8a720 100644
--- a/LEGO1/mxcontrolpresenter.cpp
+++ b/LEGO1/mxcontrolpresenter.cpp
@@ -10,20 +10,80 @@ MxControlPresenter::MxControlPresenter()
 {
 	this->m_unk0x4c = 0;
 	this->m_unk0x4e = -1;
-	this->m_unk0x50 = 0;
+	this->m_unk0x50 = FALSE;
 	this->m_unk0x52 = 0;
 	this->m_unk0x58 = 0;
 	this->m_unk0x54 = 0;
 }
 
+// FUNCTION: LEGO1 0x10043fd0
+void MxControlPresenter::RepeatingTickle()
+{
+	// empty
+}
+
+// FUNCTION: LEGO1 0x10043fe0
+MxBool MxControlPresenter::VTable0x64(undefined4 p_undefined)
+{
+	return m_unk0x50;
+}
+
+// FUNCTION: LEGO1 0x10043ff0
+void MxControlPresenter::VTable0x68(MxBool p_undefined)
+{
+	m_unk0x50 = p_undefined;
+}
+
 // FUNCTION: LEGO1 0x10044110
 MxControlPresenter::~MxControlPresenter()
 {
-	if (this->m_unk0x58) {
-		delete this->m_unk0x58;
+	if (m_unk0x58)
+		delete m_unk0x58;
+}
+
+// FUNCTION: LEGO1 0x10044180
+MxResult MxControlPresenter::AddToManager()
+{
+	m_unk0x4e = 0;
+	return SUCCESS;
+}
+
+// STUB: LEGO1 0x10044190
+MxResult MxControlPresenter::StartAction(MxStreamController*, MxDSAction*)
+{
+	// TODO
+	return SUCCESS;
+}
+
+// FUNCTION: LEGO1 0x10044260
+void MxControlPresenter::EndAction()
+{
+	if (m_action) {
+		m_unk0x50 = TRUE;
+		MxCompositePresenter::EndAction();
 	}
 }
 
+// STUB: LEGO1 0x10044270
+MxBool MxControlPresenter::FUN_10044270(undefined4, undefined4, undefined4*)
+{
+	// TODO
+	return TRUE;
+}
+
+// STUB: LEGO1 0x10044480
+MxBool MxControlPresenter::FUN_10044480(undefined4, undefined4*)
+{
+	// TODO
+	return TRUE;
+}
+
+// STUB: LEGO1 0x10044540
+void MxControlPresenter::FUN_10044540(undefined2)
+{
+	// TODO
+}
+
 // FUNCTION: LEGO1 0x10044610
 void MxControlPresenter::ReadyTickle()
 {
@@ -33,3 +93,22 @@ void MxControlPresenter::ReadyTickle()
 	m_previousTickleStates |= 1 << (unsigned char) m_currentTickleState;
 	m_currentTickleState = TickleState_Repeating;
 }
+
+// STUB: LEGO1 0x10044640
+void MxControlPresenter::ParseExtra()
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x10044820
+void MxControlPresenter::Enable(MxBool p_enable)
+{
+	// TODO
+}
+
+// STUB: LEGO1 0x100448a0
+MxBool MxControlPresenter::HasTickleStatePassed(TickleState p_tickleState)
+{
+	// TODO
+	return TRUE;
+}
diff --git a/LEGO1/mxcontrolpresenter.h b/LEGO1/mxcontrolpresenter.h
index dfe104bf..d4ee347f 100644
--- a/LEGO1/mxcontrolpresenter.h
+++ b/LEGO1/mxcontrolpresenter.h
@@ -24,15 +24,31 @@ public:
 		return !strcmp(p_name, MxControlPresenter::ClassName()) || MxCompositePresenter::IsA(p_name);
 	}
 
-	virtual void ReadyTickle() override; // vtable+0x18
+	virtual void ReadyTickle() override;                                     // vtable+0x18
+	virtual void RepeatingTickle() override;                                 // vtable+0x24
+	virtual void ParseExtra() override;                                      // vtable+0x30
+	virtual MxResult AddToManager() override;                                // vtable+0x34
+	virtual MxResult StartAction(MxStreamController*, MxDSAction*) override; // vtable+0x3c
+	virtual void EndAction() override;                                       // vtable+0x40
+	virtual MxBool HasTickleStatePassed(TickleState p_tickleState) override; // vtable+0x48
+	virtual void Enable(MxBool p_enable) override;                           // vtable+0x54
+	virtual MxBool VTable0x64(undefined4 p_undefined) override;              // vtable+0x64
+	virtual void VTable0x68(MxBool p_undefined);                             // vtable+0x64
 
 private:
-	undefined2 m_unk0x4c;
-	MxS16 m_unk0x4e;
-	undefined m_unk0x50;
-	undefined2 m_unk0x52;
-	undefined2 m_unk0x54;
-	undefined4* m_unk0x58;
+	MxBool FUN_10044270(undefined4, undefined4, undefined4*);
+	MxBool FUN_10044480(undefined4, undefined4*);
+	void FUN_10044540(undefined2);
+
+	undefined2 m_unk0x4c;  // 0x4c
+	MxS16 m_unk0x4e;       // 0x4e
+	MxBool m_unk0x50;      // 0x50
+	undefined2 m_unk0x52;  // 0x52
+	undefined2 m_unk0x54;  // 0x54
+	undefined4* m_unk0x58; // 0x58
 };
 
+// SYNTHETIC: LEGO1 0x100440f0
+// MxControlPresenter::`scalar deleting destructor'
+
 #endif // MXCONTROLPRESENTER_H