From dce08763b7a544b43ad90521efbc9937ecc48970 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 28 Jan 2024 16:06:02 -0500 Subject: [PATCH] Fixes/matches --- .../legoomni/include/legocontrolmanager.h | 11 ++--- .../include/legoeventnotificationparam.h | 4 +- .../lego/legoomni/include/legoinputmanager.h | 5 ++- .../legoomni/include/mxcontrolpresenter.h | 2 +- .../src/control/legocontrolmanager.cpp | 41 ++++++++++++------- .../src/control/mxcontrolpresenter.cpp | 6 +-- .../legoomni/src/input/legoinputmanager.cpp | 4 +- 7 files changed, 44 insertions(+), 29 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index 8c21637a..f2f04026 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -7,6 +7,7 @@ #include "mxpresenterlist.h" // VTABLE: LEGO1 0x100d6a98 +// SIZE 0x2c class LegoControlManagerEvent : public LegoEventNotificationParam { public: inline LegoControlManagerEvent() : LegoEventNotificationParam() @@ -16,17 +17,17 @@ class LegoControlManagerEvent : public LegoEventNotificationParam { } inline MxS32 GetClickedObjectId() const { return m_clickedObjectId; } - inline const MxAtomId* GetClickedAtom() const { return m_clickedAtom; } + inline const char* GetClickedAtom() const { return m_clickedAtom; } inline MxS16 GetUnknown0x28() const { return m_unk0x28; } inline void SetClickedObjectId(MxS32 p_clickedObjectId) { m_clickedObjectId = p_clickedObjectId; } - inline void SetClickedAtom(const MxAtomId* p_clickedAtom) { m_clickedAtom = p_clickedAtom; } + inline void SetClickedAtom(const char* p_clickedAtom) { m_clickedAtom = p_clickedAtom; } inline void SetUnknown0x28(MxS16 p_unk0x28) { m_unk0x28 = p_unk0x28; } private: - MxS32 m_clickedObjectId; // 0x20 - const MxAtomId* m_clickedAtom; // 0x24 - MxS16 m_unk0x28; // 0x28 + MxS32 m_clickedObjectId; // 0x20 + const char* m_clickedAtom; // 0x24 + MxS16 m_unk0x28; // 0x28 }; // SYNTHETIC: LEGO1 0x10028bf0 diff --git a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h index 04721a5c..731b53bb 100644 --- a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h +++ b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h @@ -41,8 +41,8 @@ class LegoEventNotificationParam : public MxNotificationParam { inline void SetROI(LegoROI* p_roi) { m_roi = p_roi; } inline void SetModifier(MxU8 p_modifier) { m_modifier = p_modifier; } inline void SetKey(MxU8 p_key) { m_key = p_key; } - inline void SetX(MxU8 p_x) { m_x = p_x; } - inline void SetY(MxU8 p_y) { m_y = p_y; } + inline void SetX(MxS32 p_x) { m_x = p_x; } + inline void SetY(MxS32 p_y) { m_y = p_y; } protected: MxU8 m_modifier; // 0x0c diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 800df31c..913df81c 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -13,7 +13,7 @@ class LegoControlManager; extern MxS32 g_unk0x100f31b0; -extern const MxAtomId* g_unk0x100f31b4; +extern const char* g_unk0x100f31b4; // VTABLE: LEGO1 0x100d87b8 // class MxCollection @@ -174,6 +174,9 @@ class LegoInputManager : public MxPresenter { // SYNTHETIC: LEGO1 0x10028b30 // MxPtrList::`scalar deleting destructor' +// FUNCTION: LEGO1 0x10028ba0 +// LegoNotifyList::~LegoNotifyList + // SYNTHETIC: LEGO1 0x10028fd0 // LegoNotifyListCursor::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h index a7777506..34b3082d 100644 --- a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h +++ b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h @@ -36,7 +36,7 @@ class MxControlPresenter : public MxCompositePresenter { virtual void Enable(MxBool p_enable) override; // vtable+0x54 virtual MxBool VTable0x64(undefined4 p_undefined) override; // vtable+0x64 virtual void VTable0x68(MxBool p_unk0x50); // vtable+0x68 - virtual void VTable0x6c(undefined4); // vtable+0x6c + virtual void VTable0x6c(undefined2); // vtable+0x6c MxBool FUN_10044480(LegoControlManagerEvent* p_event, MxPresenter* p_presenter); diff --git a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp index 86bfa48b..e296ad91 100644 --- a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp +++ b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp @@ -5,16 +5,16 @@ #include "mxpresenter.h" #include "mxticklemanager.h" -DECOMP_SIZE_ASSERT(LegoControlManager, 0x60); -DECOMP_SIZE_ASSERT(LegoControlManagerEvent, 0x2c); +DECOMP_SIZE_ASSERT(LegoControlManager, 0x60) +DECOMP_SIZE_ASSERT(LegoControlManagerEvent, 0x2c) // FUNCTION: LEGO1 0x10028520 LegoControlManager::LegoControlManager() { - m_presenterList = 0; + m_presenterList = NULL; m_unk0x08 = 0; m_unk0x0c = 0; - m_unk0x10 = 0; + m_unk0x10 = FALSE; m_unk0x14 = NULL; TickleManager()->RegisterClient(this, 10); } @@ -30,7 +30,7 @@ void LegoControlManager::FUN_10028df0(MxPresenterList* p_presenterList) { m_presenterList = p_presenterList; g_unk0x100f31b0 = -1; - g_unk0x100f31b4 = 0; + g_unk0x100f31b4 = NULL; } // FUNCTION: LEGO1 0x10028e10 @@ -51,7 +51,6 @@ void LegoControlManager::Unregister(MxCore* p_listener) MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter) { if (m_presenterList != NULL && m_presenterList->GetCount() != 0) { - m_unk0x14 = p_presenter; if (p_param.GetType() == c_notificationButtonUp || p_param.GetType() == c_notificationButtonDown) { @@ -68,7 +67,7 @@ MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxP return TRUE; } - if (g_unk0x100f31b0 != -1 && g_unk0x100f31b4 != 0) { + if (g_unk0x100f31b0 != -1 && g_unk0x100f31b4 != NULL) { if (m_unk0x08 == 2) { return FUN_10029750(); } @@ -81,28 +80,38 @@ MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxP else if (p_param.GetType() == c_notificationButtonDown) { if (m_unk0x0c == 1) { m_unk0x10 = TRUE; + return TRUE; } else { return FUN_10029630(); } } } + + return FALSE; } else { g_unk0x100f31b0 = -1; - g_unk0x100f31b4 = 0; - } + g_unk0x100f31b4 = NULL; - return FALSE; + return FALSE; + } } // FUNCTION: LEGO1 0x100292e0 void LegoControlManager::FUN_100292e0() { LegoNotifyListCursor cursor(&m_notifyList); - MxCore* object; - while (cursor.Next(object)) { - object->Notify(m_event); + MxCore* target; + + // The usual cursor.Next() loop doesn't match here, even though + // the logic is the same. It does match when "deconstructed" into + // the following Head(), Current() and NextFragment() calls, + // but this seems unlikely to be the original code. + cursor.Head(); + while (cursor.Current(target)) { + cursor.NextFragment(); + target->Notify(m_event); } } @@ -135,12 +144,13 @@ MxBool LegoControlManager::FUN_10029630() { MxPresenterListCursor cursor(m_presenterList); MxPresenter* presenter; + while (cursor.Next(presenter)) { if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) { g_unk0x100f31b0 = m_event.GetClickedObjectId(); g_unk0x100f31b4 = m_event.GetClickedAtom(); FUN_100292e0(); - m_unk0x08 = TRUE; + m_unk0x08 = 1; return TRUE; } } @@ -153,9 +163,10 @@ MxBool LegoControlManager::FUN_10029750() { MxPresenterListCursor cursor(m_presenterList); MxPresenter* presenter; + while (cursor.Next(presenter)) { if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_unk0x100f31b0 && - presenter->GetAction()->GetAtomId() == *g_unk0x100f31b4) { + presenter->GetAction()->GetAtomId().GetInternal() == g_unk0x100f31b4) { if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) { FUN_100292e0(); } diff --git a/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp b/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp index 138126d4..ad19bb94 100644 --- a/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp +++ b/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp @@ -114,7 +114,7 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres case c_notificationButtonUp: if (m_unk0x4c == 0 || m_unk0x4c == 2 || m_unk0x4c == 3) { p_event->SetClickedObjectId(m_action->GetObjectId()); - p_event->SetClickedAtom(&m_action->GetAtomId()); + p_event->SetClickedAtom(m_action->GetAtomId().GetInternal()); VTable0x6c(0); p_event->SetType(c_notificationType17); p_event->SetUnknown0x28(m_unk0x4e); @@ -124,7 +124,7 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres case c_notificationButtonDown: if (FUN_10044270(p_event->GetX(), p_event->GetY(), p_presenter)) { p_event->SetClickedObjectId(m_action->GetObjectId()); - p_event->SetClickedAtom(&m_action->GetAtomId()); + p_event->SetClickedAtom(m_action->GetAtomId().GetInternal()); VTable0x6c(m_unk0x56); p_event->SetType(c_notificationType17); p_event->SetUnknown0x28(m_unk0x4e); @@ -138,7 +138,7 @@ MxBool MxControlPresenter::FUN_10044480(LegoControlManagerEvent* p_event, MxPres } // STUB: LEGO1 0x10044540 -void MxControlPresenter::VTable0x6c(undefined4) +void MxControlPresenter::VTable0x6c(undefined2) { // TODO } diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index b698d4ef..783bbfe3 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -15,7 +15,7 @@ DECOMP_SIZE_ASSERT(LegoEventQueue, 0x18) MxS32 g_unk0x100f31b0 = -1; // GLOBAL: LEGO1 0x100f31b4 -const MxAtomId* g_unk0x100f31b4 = 0; +const char* g_unk0x100f31b4 = NULL; // FUNCTION: LEGO1 0x1005b790 LegoInputManager::LegoInputManager() @@ -424,5 +424,5 @@ void LegoInputManager::EnableInputProcessing() { m_unk0x88 = FALSE; g_unk0x100f31b0 = -1; - g_unk0x100f31b4 = 0; + g_unk0x100f31b4 = NULL; }