From 5617e0e0445b6a52ab887c9105811befae554a0b Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Tue, 19 Sep 2023 10:42:39 -0400 Subject: [PATCH 1/2] MxAudioManager: Destructor, LockedReinitialize, Reinitialize (#125) * MxAudioManager: Destructor, LockedReinitialize * MxAudioManager::Reinitialize, fix LockedReinitialize logic * MxAudioManager cleanup - fix param in LockedReinitialize, mark that function as private/give it a better param name * Match LockedReinitialize, fix function declarations, add/match InitPresenters --------- Co-authored-by: Christian Semmler --- CMakeLists.txt | 2 +- LEGO1/mxaudiomanager.cpp | 64 +++++++++++++++++++++++++++++++++++++ LEGO1/mxaudiomanager.h | 28 ++++++++++++++++ LEGO1/mxsoundmanager.h | 6 ++-- LEGO1/mxunknown100dc6e0.cpp | 19 ----------- LEGO1/mxunknown100dc6e0.h | 19 ----------- 6 files changed, 96 insertions(+), 42 deletions(-) create mode 100644 LEGO1/mxaudiomanager.cpp create mode 100644 LEGO1/mxaudiomanager.h delete mode 100644 LEGO1/mxunknown100dc6e0.cpp delete mode 100644 LEGO1/mxunknown100dc6e0.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 202e2b7d..3a47fc78 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -93,6 +93,7 @@ add_library(lego1 SHARED LEGO1/motorcycle.cpp LEGO1/mxatomid.cpp LEGO1/mxatomidcounter.cpp + LEGO1/mxaudiomanager.cpp LEGO1/mxaudiopresenter.cpp LEGO1/mxautolocker.cpp LEGO1/mxbackgroundaudiomanager.cpp @@ -159,7 +160,6 @@ add_library(lego1 SHARED LEGO1/mxticklemanager.cpp LEGO1/mxtimer.cpp LEGO1/mxtransitionmanager.cpp - LEGO1/mxunknown100dc6e0.cpp LEGO1/mxvariable.cpp LEGO1/mxvariabletable.cpp LEGO1/mxvector.cpp diff --git a/LEGO1/mxaudiomanager.cpp b/LEGO1/mxaudiomanager.cpp new file mode 100644 index 00000000..c7ecdc12 --- /dev/null +++ b/LEGO1/mxaudiomanager.cpp @@ -0,0 +1,64 @@ +#include "mxaudiomanager.h" + +DECOMP_SIZE_ASSERT(MxAudioManager, 0x30); + +// GLOBAL: LEGO1 0x10102108 +MxS32 MxAudioManager::g_unkCount = 0; + +// OFFSET: LEGO1 0x100b8d00 +MxAudioManager::MxAudioManager() +{ + Init(); +} + +// OFFSET: LEGO1 0x100b8d90 +MxAudioManager::~MxAudioManager() +{ + LockedReinitialize(TRUE); +} + +// OFFSET: LEGO1 0x100b8df0 +void MxAudioManager::Init() +{ + this->m_unk2c = 100; +} + +// OFFSET: LEGO1 0x100b8e00 +void MxAudioManager::LockedReinitialize(MxBool p_skipDestroy) +{ + this->m_criticalSection.Enter(); + g_unkCount--; + Init(); + this->m_criticalSection.Leave(); + + if (!p_skipDestroy) + MxMediaManager::Destroy(); +} + +// OFFSET: LEGO1 0x100b8e40 +MxResult MxAudioManager::InitPresenters() +{ + MxResult result = FAILURE; + MxBool success = FALSE; + + if (MxMediaManager::InitPresenters() == SUCCESS) { + this->m_criticalSection.Enter(); + success = TRUE; + result = SUCCESS; + g_unkCount++; + } + + if (result) + Destroy(); + + if (success) + this->m_criticalSection.Leave(); + + return result; +} + +// OFFSET: LEGO1 0x100b8e90 +void MxAudioManager::Destroy() +{ + LockedReinitialize(FALSE); +} \ No newline at end of file diff --git a/LEGO1/mxaudiomanager.h b/LEGO1/mxaudiomanager.h new file mode 100644 index 00000000..1403f36d --- /dev/null +++ b/LEGO1/mxaudiomanager.h @@ -0,0 +1,28 @@ +#ifndef MXAUDIOMANAGER_H +#define MXAUDIOMANAGER_H + +#include "decomp.h" +#include "mxmediamanager.h" + +// VTABLE 0x100dc6e0 +class MxAudioManager : public MxMediaManager +{ +public: + MxAudioManager(); + virtual ~MxAudioManager() override; + + virtual MxResult InitPresenters(); // vtable+14 + virtual void Destroy(); // vtable+18 + +private: + void LockedReinitialize(MxBool); + + static MxS32 g_unkCount; + +protected: + void Init(); + + undefined4 m_unk2c; +}; + +#endif // MXAUDIOMANAGER_H diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index 4d74fa95..06dc9d5f 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -1,12 +1,12 @@ #ifndef MXSOUNDMANAGER_H #define MXSOUNDMANAGER_H -#include "mxunknown100dc6e0.h" +#include "mxaudiomanager.h" // VTABLE 0x100dc128 // SIZE 0x3c -// Base vtables are: MxCore -> 0x100dc6b0 -> 0x100dc6e0 -> MxSoundManager -class MxSoundManager : public MxUnknown100dc6e0 +// Base vtables are: MxCore -> 0x100dc6b0 -> MxAudioManager -> MxSoundManager +class MxSoundManager : public MxAudioManager { public: MxSoundManager(); diff --git a/LEGO1/mxunknown100dc6e0.cpp b/LEGO1/mxunknown100dc6e0.cpp deleted file mode 100644 index b896e89b..00000000 --- a/LEGO1/mxunknown100dc6e0.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "mxunknown100dc6e0.h" - -// OFFSET: LEGO1 0x100b8d00 -MxUnknown100dc6e0::MxUnknown100dc6e0() -{ - Init(); -} - -// OFFSET: LEGO1 0x100b8d90 STUB -MxUnknown100dc6e0::~MxUnknown100dc6e0() -{ - // TODO -} - -// OFFSET: LEGO1 0x100b8df0 -void MxUnknown100dc6e0::Init() -{ - this->m_unk2c = 100; -} diff --git a/LEGO1/mxunknown100dc6e0.h b/LEGO1/mxunknown100dc6e0.h deleted file mode 100644 index 056e1fcd..00000000 --- a/LEGO1/mxunknown100dc6e0.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef MXUNKNOWN100DC6E0_H -#define MXUNKNOWN100DC6E0_H - -#include "mxmediamanager.h" - -// VTABLE 0x100dc6e0 -class MxUnknown100dc6e0 : public MxMediaManager -{ -public: - MxUnknown100dc6e0(); - virtual ~MxUnknown100dc6e0() override; - -protected: - void Init(); - - int m_unk2c; -}; - -#endif // MXUNKNOWN100DC6E0_H From 4bd67e4ae14b9ad3a188e643bcf48fe71d2cf4b9 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Tue, 19 Sep 2023 17:45:16 -0400 Subject: [PATCH 2/2] Implement/match MxPresenter::StartAction (#126) * Implement/match MxPresenter::StartAction * Update mxpoint32.h --- LEGO1/mxdsaction.h | 1 + LEGO1/mxpoint32.h | 20 ++++++++++++++++++++ LEGO1/mxpresenter.cpp | 25 +++++++++++++++++-------- LEGO1/mxpresenter.h | 6 +++--- 4 files changed, 41 insertions(+), 11 deletions(-) create mode 100755 LEGO1/mxpoint32.h diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 11388c0f..3028a43d 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -52,6 +52,7 @@ class MxDSAction : public MxDSObject inline void SetFlags(MxU32 m_flags) { this->m_flags = m_flags; } inline char *GetExtraData() { return m_extraData; } inline MxU16 GetExtraLength() const { return m_extraLength; } + inline const MxVector3Data &GetLocation() const { return m_location; } inline void SetOmni(MxOmni *p_omni) { m_omni = p_omni; } private: diff --git a/LEGO1/mxpoint32.h b/LEGO1/mxpoint32.h new file mode 100755 index 00000000..cc0f6327 --- /dev/null +++ b/LEGO1/mxpoint32.h @@ -0,0 +1,20 @@ +#ifndef MXPOINT32_H +#define MXPOINT32_H + +#include "mxtypes.h" + +class MxPoint32 +{ +public: + MxPoint32() { } + MxPoint32(MxS32 p_x, MxS32 p_y) + { + this->m_x = p_x; + this->m_y = p_y; + } + + MxS32 m_x; + MxS32 m_y; +}; + +#endif // MXPOINT32_H diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 56688233..cf934fe7 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -19,11 +19,10 @@ void MxPresenter::Init() { m_currentTickleState = TickleState_Idle; m_action = NULL; - m_unk0x18 = 0; + m_location = MxPoint32(0, 0); + m_locationZ = 0; m_unkPresenter = NULL; m_previousTickleStates = 0; - m_unk0x10 = 0; - m_unk0x14 = 0; } // OFFSET: LEGO1 0x100b4fc0 @@ -116,15 +115,25 @@ MxLong MxPresenter::Tickle() break; } - return 0; + return SUCCESS; } -// OFFSET: LEGO1 0x100b4d80 STUB -MxLong MxPresenter::StartAction(MxStreamController *, MxDSAction *) +// OFFSET: LEGO1 0x100b4d80 +MxLong MxPresenter::StartAction(MxStreamController *, MxDSAction *p_action) { - // TODO + MxAutoLocker lock(&this->m_criticalSection); - return 0; + this->m_action = p_action; + + const MxVector3Data& location = this->m_action->GetLocation(); + MxS32 previousTickleState = this->m_currentTickleState; + + this->m_location = MxPoint32(location[0], location[1]); + this->m_locationZ = location[2]; + this->m_previousTickleStates |= 1 << (unsigned char)previousTickleState; + this->m_currentTickleState = TickleState_Ready; + + return SUCCESS; } // OFFSET: LEGO1 0x100b4e40 STUB diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index 87ef9645..f20ac647 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -2,6 +2,7 @@ #define MXPRESENTER_H #include "mxcore.h" +#include "mxpoint32.h" #include "mxdsaction.h" #include "mxcriticalsection.h" #include "mxomni.h" @@ -74,9 +75,8 @@ class MxPresenter : public MxCore private: MxS32 m_currentTickleState; // 0x8 MxU32 m_previousTickleStates; - undefined4 m_unk0x10; - undefined4 m_unk0x14; - undefined4 m_unk0x18; + MxPoint32 m_location; + MxS32 m_locationZ; MxDSAction *m_action; // 0 MxCriticalSection m_criticalSection; MxPresenter *m_unkPresenter; // 0x3c