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