From 5ac6cf55a9920265e96efd5074763578354c352b Mon Sep 17 00:00:00 2001 From: Angel <67720650+AngelTomkins@users.noreply.github.com> Date: Fri, 6 Oct 2023 01:26:48 -0400 Subject: [PATCH 01/22] Corrected typo in reccmp.py (#169) --- tools/reccmp/reccmp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/reccmp/reccmp.py b/tools/reccmp/reccmp.py index e0962534..f26ab764 100755 --- a/tools/reccmp/reccmp.py +++ b/tools/reccmp/reccmp.py @@ -114,7 +114,7 @@ def __init__(self, unix_cwd): def get_wine_path(self, unix_fn: str) -> str: if unix_fn.startswith('./'): - return self.win_cmd + '\\' + unix_fn[2:].replace('/', '\\') + return self.win_cwd + '\\' + unix_fn[2:].replace('/', '\\') if unix_fn.startswith(self.unix_cwd): return self.win_cwd + '\\' + unix_fn.removeprefix(self.unix_cwd).replace('/', '\\').lstrip('\\') return self._call_winepath_unix2win(unix_fn) From 1da1d291a8c14a8f594d26b1f2ae37c745819ced Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 6 Oct 2023 09:00:00 -0400 Subject: [PATCH 02/22] Fix line endings --- LEGO1/mxmidimanager.cpp | 320 ++++++++++++++++++++-------------------- LEGO1/mxmidimanager.h | 82 +++++----- 2 files changed, 201 insertions(+), 201 deletions(-) diff --git a/LEGO1/mxmidimanager.cpp b/LEGO1/mxmidimanager.cpp index 62bcb6d2..26b977df 100644 --- a/LEGO1/mxmidimanager.cpp +++ b/LEGO1/mxmidimanager.cpp @@ -1,161 +1,161 @@ -#include "mxmidimanager.h" -#include "mxomni.h" -#include - -DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); - -// OFFSET: LEGO1 0x100c05a0 -MxMIDIManager::MxMIDIManager() -{ - Init(); -} - -// OFFSET: LEGO1 0x100c0630 -MxMIDIManager::~MxMIDIManager() -{ - LockedReinitialize(TRUE); -} - -// OFFSET: LEGO1 0x100c0b20 -void MxMIDIManager::DeinitializeMIDI() -{ - m_criticalSection.Enter(); - - if (this->m_MIDIInitialized) - { - this->m_MIDIInitialized = FALSE; - midiStreamStop(this->m_MIDIStreamH); - midiOutUnprepareHeader(this->m_MIDIStreamH, this->m_MIDIHdrP, sizeof(MIDIHDR)); - midiOutSetVolume(this->m_MIDIStreamH, this->m_MIDIVolume); - midiStreamClose(this->m_MIDIStreamH); - delete this->m_MIDIHdrP; - this->InitData(); - } - - this->m_criticalSection.Leave(); -} - -// OFFSET: LEGO1 0x100c0690 -void MxMIDIManager::Init() -{ - this->m_multiplier = 100; - InitData(); -} - -// OFFSET: LEGO1 0x100c06a0 -void MxMIDIManager::InitData() -{ - this->m_MIDIStreamH = 0; - this->m_MIDIInitialized = FALSE; - this->m_unk38 = 0; - this->m_unk3c = 0; - this->m_unk40 = 0; - this->m_unk44 = 0; - this->m_unk48 = 0; - this->m_MIDIHdrP = NULL; -} - -// OFFSET: LEGO1 0x100c06c0 -void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) -{ - if (this->m_thread) - { - this->m_thread->Terminate(); - if (this->m_thread) - { - delete m_thread; - } - } - else - { - TickleManager()->UnregisterClient(this); - } - - this->m_criticalSection.Enter(); - DeinitializeMIDI(); - Init(); - this->m_criticalSection.Leave(); - - if (!p_skipDestroy) - { - MxAudioManager::Destroy(); - } -} - -// OFFSET: LEGO1 0x100c0930 -void MxMIDIManager::Destroy() -{ - LockedReinitialize(FALSE); -} - -// OFFSET: LEGO1 0x100c09a0 -MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) -{ - MxS32 result = (p_volume * 0xffff) / 100; - return (result << 0x10) | result; -} - -// OFFSET: LEGO1 0x100c07f0 -void MxMIDIManager::SetMIDIVolume() -{ - MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; - HMIDISTRM streamHandle = this->m_MIDIStreamH; - - if (streamHandle) - { - MxS32 volume = CalculateVolume(result); - midiOutSetVolume(streamHandle, volume); - } -} - -// OFFSET: LEGO1 0x100c0940 -void MxMIDIManager::SetVolume(MxS32 p_volume) -{ - MxAudioManager::SetVolume(p_volume); - this->m_criticalSection.Enter(); - SetMIDIVolume(); - this->m_criticalSection.Leave(); -} - -// OFFSET: LEGO1 0x100c0840 -MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) -{ - MxResult status = FAILURE; - MxBool locked = FALSE; - - MxResult result = MxAudioManager::InitPresenters(); - if (result == SUCCESS) - { - if (p_noRegister) - { - this->m_criticalSection.Enter(); - locked = TRUE; - this->m_thread = new MxTickleThread(this, p_frequencyMS); - - if (this->m_thread) - { - if (this->m_thread->Start(0, 0) == SUCCESS) - { - status = SUCCESS; - } - } - } - else - { - TickleManager()->RegisterClient(this, p_frequencyMS); - status = SUCCESS; - } - } - - if (status != SUCCESS) - { - Destroy(); - } - - if (locked) - { - this->m_criticalSection.Leave(); - } - - return status; +#include "mxmidimanager.h" +#include "mxomni.h" +#include + +DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); + +// OFFSET: LEGO1 0x100c05a0 +MxMIDIManager::MxMIDIManager() +{ + Init(); +} + +// OFFSET: LEGO1 0x100c0630 +MxMIDIManager::~MxMIDIManager() +{ + LockedReinitialize(TRUE); +} + +// OFFSET: LEGO1 0x100c0b20 +void MxMIDIManager::DeinitializeMIDI() +{ + m_criticalSection.Enter(); + + if (this->m_MIDIInitialized) + { + this->m_MIDIInitialized = FALSE; + midiStreamStop(this->m_MIDIStreamH); + midiOutUnprepareHeader(this->m_MIDIStreamH, this->m_MIDIHdrP, sizeof(MIDIHDR)); + midiOutSetVolume(this->m_MIDIStreamH, this->m_MIDIVolume); + midiStreamClose(this->m_MIDIStreamH); + delete this->m_MIDIHdrP; + this->InitData(); + } + + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0690 +void MxMIDIManager::Init() +{ + this->m_multiplier = 100; + InitData(); +} + +// OFFSET: LEGO1 0x100c06a0 +void MxMIDIManager::InitData() +{ + this->m_MIDIStreamH = 0; + this->m_MIDIInitialized = FALSE; + this->m_unk38 = 0; + this->m_unk3c = 0; + this->m_unk40 = 0; + this->m_unk44 = 0; + this->m_unk48 = 0; + this->m_MIDIHdrP = NULL; +} + +// OFFSET: LEGO1 0x100c06c0 +void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) +{ + if (this->m_thread) + { + this->m_thread->Terminate(); + if (this->m_thread) + { + delete m_thread; + } + } + else + { + TickleManager()->UnregisterClient(this); + } + + this->m_criticalSection.Enter(); + DeinitializeMIDI(); + Init(); + this->m_criticalSection.Leave(); + + if (!p_skipDestroy) + { + MxAudioManager::Destroy(); + } +} + +// OFFSET: LEGO1 0x100c0930 +void MxMIDIManager::Destroy() +{ + LockedReinitialize(FALSE); +} + +// OFFSET: LEGO1 0x100c09a0 +MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) +{ + MxS32 result = (p_volume * 0xffff) / 100; + return (result << 0x10) | result; +} + +// OFFSET: LEGO1 0x100c07f0 +void MxMIDIManager::SetMIDIVolume() +{ + MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; + HMIDISTRM streamHandle = this->m_MIDIStreamH; + + if (streamHandle) + { + MxS32 volume = CalculateVolume(result); + midiOutSetVolume(streamHandle, volume); + } +} + +// OFFSET: LEGO1 0x100c0940 +void MxMIDIManager::SetVolume(MxS32 p_volume) +{ + MxAudioManager::SetVolume(p_volume); + this->m_criticalSection.Enter(); + SetMIDIVolume(); + this->m_criticalSection.Leave(); +} + +// OFFSET: LEGO1 0x100c0840 +MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +{ + MxResult status = FAILURE; + MxBool locked = FALSE; + + MxResult result = MxAudioManager::InitPresenters(); + if (result == SUCCESS) + { + if (p_noRegister) + { + this->m_criticalSection.Enter(); + locked = TRUE; + this->m_thread = new MxTickleThread(this, p_frequencyMS); + + if (this->m_thread) + { + if (this->m_thread->Start(0, 0) == SUCCESS) + { + status = SUCCESS; + } + } + } + else + { + TickleManager()->RegisterClient(this, p_frequencyMS); + status = SUCCESS; + } + } + + if (status != SUCCESS) + { + Destroy(); + } + + if (locked) + { + this->m_criticalSection.Leave(); + } + + return status; } \ No newline at end of file diff --git a/LEGO1/mxmidimanager.h b/LEGO1/mxmidimanager.h index f944d67d..dd362594 100644 --- a/LEGO1/mxmidimanager.h +++ b/LEGO1/mxmidimanager.h @@ -1,42 +1,42 @@ -#ifndef MXMIDIMANAGER_H -#define MXMIDIMANAGER_H - -#include "decomp.h" -#include "mxaudiomanager.h" - -// VTABLE 0x100dc930 -// SIZE 0x58 -class MxMIDIManager : public MxAudioManager -{ -public: - MxMIDIManager(); - virtual ~MxMIDIManager() override; - - virtual void Destroy() override; // vtable+18 - virtual void SetVolume(MxS32 p_volume) override; // vtable+2c - virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 - -private: - void LockedReinitialize(MxBool p_skipDestroy); - void DeinitializeMIDI(); - - MxS32 CalculateVolume(MxS32 p_volume); - void SetMIDIVolume(); - - HMIDISTRM m_MIDIStreamH; // 0x30 - MxBool m_MIDIInitialized; // 0x34 - undefined4 m_unk38; // 0x38 - undefined4 m_unk3c; // 0x3c - undefined4 m_unk40; // 0x40 - undefined4 m_unk44; // 0x44 - undefined4 m_unk48; // 0x48 - MIDIHDR *m_MIDIHdrP; // 0x4c - MxS32 m_multiplier; // 0x50 - DWORD m_MIDIVolume; // 0x54 - -protected: - void Init(); - void InitData(); -}; - +#ifndef MXMIDIMANAGER_H +#define MXMIDIMANAGER_H + +#include "decomp.h" +#include "mxaudiomanager.h" + +// VTABLE 0x100dc930 +// SIZE 0x58 +class MxMIDIManager : public MxAudioManager +{ +public: + MxMIDIManager(); + virtual ~MxMIDIManager() override; + + virtual void Destroy() override; // vtable+18 + virtual void SetVolume(MxS32 p_volume) override; // vtable+2c + virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 + +private: + void LockedReinitialize(MxBool p_skipDestroy); + void DeinitializeMIDI(); + + MxS32 CalculateVolume(MxS32 p_volume); + void SetMIDIVolume(); + + HMIDISTRM m_MIDIStreamH; // 0x30 + MxBool m_MIDIInitialized; // 0x34 + undefined4 m_unk38; // 0x38 + undefined4 m_unk3c; // 0x3c + undefined4 m_unk40; // 0x40 + undefined4 m_unk44; // 0x44 + undefined4 m_unk48; // 0x48 + MIDIHDR *m_MIDIHdrP; // 0x4c + MxS32 m_multiplier; // 0x50 + DWORD m_MIDIVolume; // 0x54 + +protected: + void Init(); + void InitData(); +}; + #endif // MXMIDIMANAGER_H \ No newline at end of file From 7f5198220c6aef7eda3f675f0b4a774b5d03037e Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 12:54:58 -0400 Subject: [PATCH 03/22] Unstub MxLoopingFlcPresenter destructor (#173) sorry guys --- LEGO1/mxloopingflcpresenter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LEGO1/mxloopingflcpresenter.cpp b/LEGO1/mxloopingflcpresenter.cpp index 54002246..58b066f6 100644 --- a/LEGO1/mxloopingflcpresenter.cpp +++ b/LEGO1/mxloopingflcpresenter.cpp @@ -10,7 +10,7 @@ MxLoopingFlcPresenter::MxLoopingFlcPresenter() Init(); } -// OFFSET: LEGO1 0x100b43b0 STUB +// OFFSET: LEGO1 0x100b43b0 MxLoopingFlcPresenter::~MxLoopingFlcPresenter() { Destroy(TRUE); From 1217e4aa58996df88b29a0239761d7dda35b90f7 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 13:00:49 -0400 Subject: [PATCH 04/22] MxMusicPresenter dtor, stub destroy (#174) * MxMusicPresenter dtor, stub destroy * Fix destructor declaration --------- Co-authored-by: Christian Semmler --- LEGO1/mxmusicpresenter.cpp | 12 ++++++++++++ LEGO1/mxmusicpresenter.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/LEGO1/mxmusicpresenter.cpp b/LEGO1/mxmusicpresenter.cpp index d33627ad..72ae273a 100644 --- a/LEGO1/mxmusicpresenter.cpp +++ b/LEGO1/mxmusicpresenter.cpp @@ -6,7 +6,19 @@ MxMusicPresenter::MxMusicPresenter() Init(); } +// OFFSET: LEGO1 0x100c24e0 +MxMusicPresenter::~MxMusicPresenter() +{ + Destroy(TRUE); +} + // OFFSET: LEGO1 0x100c2540 void MxMusicPresenter::Init() { +} + +// OFFSET: LEGO1 0x100c2550 STUB +void MxMusicPresenter::Destroy(MxBool) +{ + // TODO } \ No newline at end of file diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h index c8e88604..a000c2b9 100644 --- a/LEGO1/mxmusicpresenter.h +++ b/LEGO1/mxmusicpresenter.h @@ -21,9 +21,11 @@ class MxMusicPresenter : public MxAudioPresenter } MxMusicPresenter(); + virtual ~MxMusicPresenter() override; private: void Init(); + void Destroy(MxBool); }; #endif // MXMUSICPRESENTER_H From 85fe4ad07aa7fb13c928673e078e4da82d174cdf Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 6 Oct 2023 18:17:49 -0400 Subject: [PATCH 05/22] MxAudioPresenter - vtable functions (#175) * MxAudioPresenter - vtable functions * Rename parameter --------- Co-authored-by: Christian Semmler --- LEGO1/mxaudiopresenter.cpp | 12 ++++++++++++ LEGO1/mxaudiopresenter.h | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/LEGO1/mxaudiopresenter.cpp b/LEGO1/mxaudiopresenter.cpp index ac634362..48a02377 100644 --- a/LEGO1/mxaudiopresenter.cpp +++ b/LEGO1/mxaudiopresenter.cpp @@ -3,3 +3,15 @@ #include "decomp.h" DECOMP_SIZE_ASSERT(MxAudioPresenter, 0x54); + +// OFFSET: LEGO1 0x1000d260 +undefined4 MxAudioPresenter::vtable5c() +{ + return this->m_unk50; +} + +// OFFSET: LEGO1 0x1000d270 +void MxAudioPresenter::vtable60(undefined4 p_unk50) +{ + this->m_unk50 = p_unk50; +} diff --git a/LEGO1/mxaudiopresenter.h b/LEGO1/mxaudiopresenter.h index c1001a13..fb2e75a8 100644 --- a/LEGO1/mxaudiopresenter.h +++ b/LEGO1/mxaudiopresenter.h @@ -1,6 +1,7 @@ #ifndef MXAUDIOPRESENTER_H #define MXAUDIOPRESENTER_H +#include "decomp.h" #include "mxmediapresenter.h" // VTABLE 0x100d4c70 @@ -24,7 +25,10 @@ class MxAudioPresenter : public MxMediaPresenter return !strcmp(name, MxAudioPresenter::ClassName()) || MxMediaPresenter::IsA(name); } - int m_unk50; + virtual undefined4 vtable5c(); + virtual void vtable60(undefined4); + + undefined4 m_unk50; }; #endif // MXAUDIOPRESENTER_H From 50b9a6dea5631042b956cf5996008fe226fa688e Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 7 Oct 2023 09:05:44 -0400 Subject: [PATCH 06/22] Implement Start() (#176) * Implement Start() * Undo isleapp changes * Implement LegoOmni::Start * fix vtable0x20 * Address review * fix build --- LEGO1/legoomni.cpp | 20 ++++++++++++++------ LEGO1/legoomni.h | 5 ++--- LEGO1/mxdsobject.h | 1 + LEGO1/mxomni.cpp | 16 +++++++++++----- LEGO1/mxomni.h | 2 +- LEGO1/mxstreamcontroller.cpp | 19 +++++++++++++++++++ LEGO1/mxstreamcontroller.h | 4 ++++ LEGO1/mxstreamer.cpp | 16 ++++++++++++++++ LEGO1/mxstreamer.h | 2 ++ 9 files changed, 70 insertions(+), 15 deletions(-) diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 929ba556..58eed5c1 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -99,11 +99,10 @@ void SetOmniUserMessage(void (*p_userMsg)(const char *,int)) g_omniUserMessage = p_userMsg; } -// OFFSET: LEGO1 0x100acf50 STUB -MxLong Start(MxDSAction *) +// OFFSET: LEGO1 0x100acf50 +MxResult Start(MxDSAction* p_dsAction) { - // TODO - return 0; + return MxOmni::GetInstance()->Start(p_dsAction); } // OFFSET: LEGO1 0x1005ad10 @@ -257,6 +256,10 @@ void LegoOmni::Init() MxResult LegoOmni::Create(COMPAT_CONST MxOmniCreateParam &p) { // FIXME: Stub + MxOmni::Create(p); + m_gameState = new LegoGameState(); + m_bkgAudioManager = new MxBackgroundAudioManager(); + return SUCCESS; } @@ -265,9 +268,14 @@ void LegoOmni::Destroy() // FIXME: Stub } -void LegoOmni::vtable0x20() +// OFFSET: LEGO1 0x1005b580 +MxResult LegoOmni::Start(MxDSAction* action) { - // FIXME: Stub + MxResult result = MxOmni::Start(action); + this->m_action.SetAtomId(action->GetAtomId()); + this->m_action.SetObjectId(action->GetObjectId()); + this->m_action.SetUnknown24(action->GetUnknown24()); + return result; } void LegoOmni::DeleteObject(MxDSAction &ds) diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 4a5fe6e4..044275b4 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -55,7 +55,7 @@ class LegoOmni : public MxOmni virtual void Init() override; // vtable+14 virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p) override; // vtable+18 virtual void Destroy() override; // vtable+1c - virtual void vtable0x20() override; + virtual MxResult Start(MxDSAction* action) override; virtual void DeleteObject(MxDSAction &ds) override; virtual MxBool DoesEntityExist(MxDSAction &ds) override; virtual void vtable0x2c() override; @@ -110,10 +110,9 @@ __declspec(dllexport) LegoEntity * PickEntity(MxLong,MxLong); __declspec(dllexport) LegoROI * PickROI(MxLong,MxLong); __declspec(dllexport) void SetOmniUserMessage(void (*)(const char *,int)); __declspec(dllexport) LegoSoundManager * SoundManager(); -__declspec(dllexport) MxLong Start(MxDSAction *); +__declspec(dllexport) MxResult Start(MxDSAction*); __declspec(dllexport) MxTransitionManager * TransitionManager(); __declspec(dllexport) LegoVideoManager * VideoManager(); -__declspec(dllexport) MxLong Start(MxDSAction *a); LegoBuildingManager* BuildingManager(); Isle* GetIsle(); diff --git a/LEGO1/mxdsobject.h b/LEGO1/mxdsobject.h index 1ca3d98a..e340789a 100644 --- a/LEGO1/mxdsobject.h +++ b/LEGO1/mxdsobject.h @@ -36,6 +36,7 @@ class MxDSObject : public MxCore inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline MxU32 GetObjectId() { return this->m_objectId; } + inline MxS16 GetUnknown24() { return this->m_unk24; } inline void SetObjectId(MxU32 p_objectId) { this->m_objectId = p_objectId; } inline void SetUnknown24(MxS16 p_unk24) { this->m_unk24 = p_unk24; } diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 200e5bdf..ed870b34 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -42,10 +42,16 @@ void MxOmni::Init() m_unk64 = NULL; } -// OFFSET: LEGO1 0x100b0090 STUB -void MxOmni::vtable0x20() +// OFFSET: LEGO1 0x100b0090 +MxResult MxOmni::Start(MxDSAction* p_dsAction) { - // TODO + MxResult result = FAILURE; + if(p_dsAction->GetAtomId().GetInternal() != NULL && p_dsAction->GetObjectId() != -1 && m_streamer != NULL) + { + result = m_streamer->Unknown100b99b0(p_dsAction); + } + + return result; } // OFFSET: LEGO1 0x100b00c0 STUB @@ -258,7 +264,7 @@ MxAtomIdCounterSet *AtomIdCounterSet() MxStreamer* Streamer() { return MxOmni::GetInstance()->GetStreamer(); -} +} // OFFSET: LEGO1 0x100acf00 MxSoundManager* MSoundManager() @@ -288,4 +294,4 @@ MxMusicManager* MusicManager() MxEventManager* EventManager() { return MxOmni::GetInstance()->GetEventManager(); -} \ No newline at end of file +} diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index a8fa9db8..9c7d6b0a 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -38,7 +38,7 @@ class MxOmni : public MxCore virtual void Init(); // vtable+14 virtual MxResult Create(COMPAT_CONST MxOmniCreateParam &p); // vtable+18 virtual void Destroy(); // vtable+1c - virtual void vtable0x20(); // vtable+20 + virtual MxResult Start(MxDSAction* p_dsAction); // vtable+20 virtual void DeleteObject(MxDSAction &ds); // vtable+24 virtual MxBool DoesEntityExist(MxDSAction &ds); // vtable+28 virtual void vtable0x2c(); // vtable+2c diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index 09f2d95c..e219f357 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -30,3 +30,22 @@ MxResult MxStreamController::Open(const char *p_filename) return SUCCESS; } + +// OFFSET: LEGO1 0x100b9400 +MxResult MxStreamController::vtable0x18(undefined4 p_unknown, undefined4 p_unknown2) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100b9410 +MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unknown2) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100c1690 STUB +MxResult MxStreamController::vtable0x20(MxDSAction* action) +{ + // TODO STUB + return FAILURE; +} diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index c7e4309e..0f459ed0 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -6,6 +6,7 @@ #include "mxcriticalsection.h" #include "mxcore.h" #include "mxdsobject.h" +#include "mxdsaction.h" // VTABLE 0x100dc968 // SIZE 0x64 @@ -30,6 +31,9 @@ class MxStreamController : public MxCore } virtual MxResult Open(const char *p_filename); // vtable+0x14 + virtual MxResult vtable0x18(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x18 + virtual MxResult vtable0x1C(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x1c + virtual MxResult vtable0x20(MxDSAction* action); //vtable+0x20 MxBool FUN_100c20d0(MxDSObject &p_obj); diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index 2121773e..53d7303f 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -133,6 +133,22 @@ MxResult MxStreamer::AddStreamControllerToOpenList(MxStreamController *stream) return FAILURE; } +// OFFSET: LEGO1 0x100b99b0 +MxResult MxStreamer::Unknown100b99b0(MxDSAction* p_action) +{ + MxStreamController* controller; + if (p_action != NULL && p_action->GetAtomId().GetInternal() != NULL && p_action->GetObjectId() != -1) + { + controller = GetOpenStream(p_action->GetAtomId().GetInternal()); + if (controller == NULL) + { + return FAILURE; + } + return controller->vtable0x20(p_action); + } + return FAILURE; +} + // OFFSET: LEGO1 0x100b9b60 MxLong MxStreamer::Notify(MxParam &p) { diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 5ab02cbb..c900feb9 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -96,6 +96,8 @@ class MxStreamer : public MxCore MxResult AddStreamControllerToOpenList(MxStreamController *p_stream); + MxResult MxStreamer::Unknown100b99b0(MxDSAction* p_action); + private: list m_openStreams; // 0x8 MxStreamerSubClass2 m_subclass1; // 0x14 From 775ee9f05fee0c02e2f66cb672670d83f23f23d7 Mon Sep 17 00:00:00 2001 From: DmitriLeon2000 Date: Sun, 8 Oct 2023 00:02:12 +0900 Subject: [PATCH 07/22] Move MxMIDIManager to MxMusicManager (#178) --- CMakeLists.txt | 2 +- LEGO1/mxmidimanager.h | 42 ------------------- .../{mxmidimanager.cpp => mxmusicmanager.cpp} | 26 ++++++------ LEGO1/mxmusicmanager.h | 37 ++++++++++++++-- 4 files changed, 48 insertions(+), 59 deletions(-) delete mode 100644 LEGO1/mxmidimanager.h rename LEGO1/{mxmidimanager.cpp => mxmusicmanager.cpp} (82%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 818d3773..0e2135c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -140,8 +140,8 @@ add_library(lego1 SHARED LEGO1/mxmatrix.cpp LEGO1/mxmediamanager.cpp LEGO1/mxmediapresenter.cpp - LEGO1/mxmidimanager.cpp LEGO1/mxmidipresenter.cpp + LEGO1/mxmusicmanager.cpp LEGO1/mxmusicpresenter.cpp LEGO1/mxnotificationmanager.cpp LEGO1/mxobjectfactory.cpp diff --git a/LEGO1/mxmidimanager.h b/LEGO1/mxmidimanager.h deleted file mode 100644 index dd362594..00000000 --- a/LEGO1/mxmidimanager.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef MXMIDIMANAGER_H -#define MXMIDIMANAGER_H - -#include "decomp.h" -#include "mxaudiomanager.h" - -// VTABLE 0x100dc930 -// SIZE 0x58 -class MxMIDIManager : public MxAudioManager -{ -public: - MxMIDIManager(); - virtual ~MxMIDIManager() override; - - virtual void Destroy() override; // vtable+18 - virtual void SetVolume(MxS32 p_volume) override; // vtable+2c - virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 - -private: - void LockedReinitialize(MxBool p_skipDestroy); - void DeinitializeMIDI(); - - MxS32 CalculateVolume(MxS32 p_volume); - void SetMIDIVolume(); - - HMIDISTRM m_MIDIStreamH; // 0x30 - MxBool m_MIDIInitialized; // 0x34 - undefined4 m_unk38; // 0x38 - undefined4 m_unk3c; // 0x3c - undefined4 m_unk40; // 0x40 - undefined4 m_unk44; // 0x44 - undefined4 m_unk48; // 0x48 - MIDIHDR *m_MIDIHdrP; // 0x4c - MxS32 m_multiplier; // 0x50 - DWORD m_MIDIVolume; // 0x54 - -protected: - void Init(); - void InitData(); -}; - -#endif // MXMIDIMANAGER_H \ No newline at end of file diff --git a/LEGO1/mxmidimanager.cpp b/LEGO1/mxmusicmanager.cpp similarity index 82% rename from LEGO1/mxmidimanager.cpp rename to LEGO1/mxmusicmanager.cpp index 26b977df..247b6596 100644 --- a/LEGO1/mxmidimanager.cpp +++ b/LEGO1/mxmusicmanager.cpp @@ -1,23 +1,23 @@ -#include "mxmidimanager.h" +#include "mxmusicmanager.h" #include "mxomni.h" #include -DECOMP_SIZE_ASSERT(MxMIDIManager, 0x58); +DECOMP_SIZE_ASSERT(MxMusicManager, 0x58); // OFFSET: LEGO1 0x100c05a0 -MxMIDIManager::MxMIDIManager() +MxMusicManager::MxMusicManager() { Init(); } // OFFSET: LEGO1 0x100c0630 -MxMIDIManager::~MxMIDIManager() +MxMusicManager::~MxMusicManager() { LockedReinitialize(TRUE); } // OFFSET: LEGO1 0x100c0b20 -void MxMIDIManager::DeinitializeMIDI() +void MxMusicManager::DeinitializeMIDI() { m_criticalSection.Enter(); @@ -36,14 +36,14 @@ void MxMIDIManager::DeinitializeMIDI() } // OFFSET: LEGO1 0x100c0690 -void MxMIDIManager::Init() +void MxMusicManager::Init() { this->m_multiplier = 100; InitData(); } // OFFSET: LEGO1 0x100c06a0 -void MxMIDIManager::InitData() +void MxMusicManager::InitData() { this->m_MIDIStreamH = 0; this->m_MIDIInitialized = FALSE; @@ -56,7 +56,7 @@ void MxMIDIManager::InitData() } // OFFSET: LEGO1 0x100c06c0 -void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) +void MxMusicManager::LockedReinitialize(MxBool p_skipDestroy) { if (this->m_thread) { @@ -83,20 +83,20 @@ void MxMIDIManager::LockedReinitialize(MxBool p_skipDestroy) } // OFFSET: LEGO1 0x100c0930 -void MxMIDIManager::Destroy() +void MxMusicManager::Destroy() { LockedReinitialize(FALSE); } // OFFSET: LEGO1 0x100c09a0 -MxS32 MxMIDIManager::CalculateVolume(MxS32 p_volume) +MxS32 MxMusicManager::CalculateVolume(MxS32 p_volume) { MxS32 result = (p_volume * 0xffff) / 100; return (result << 0x10) | result; } // OFFSET: LEGO1 0x100c07f0 -void MxMIDIManager::SetMIDIVolume() +void MxMusicManager::SetMIDIVolume() { MxS32 result = (this->m_volume * this->m_multiplier) / 0x64; HMIDISTRM streamHandle = this->m_MIDIStreamH; @@ -109,7 +109,7 @@ void MxMIDIManager::SetMIDIVolume() } // OFFSET: LEGO1 0x100c0940 -void MxMIDIManager::SetVolume(MxS32 p_volume) +void MxMusicManager::SetVolume(MxS32 p_volume) { MxAudioManager::SetVolume(p_volume); this->m_criticalSection.Enter(); @@ -118,7 +118,7 @@ void MxMIDIManager::SetVolume(MxS32 p_volume) } // OFFSET: LEGO1 0x100c0840 -MxResult MxMIDIManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +MxResult MxMusicManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) { MxResult status = FAILURE; MxBool locked = FALSE; diff --git a/LEGO1/mxmusicmanager.h b/LEGO1/mxmusicmanager.h index 4288ed1e..1a828c84 100644 --- a/LEGO1/mxmusicmanager.h +++ b/LEGO1/mxmusicmanager.h @@ -1,11 +1,42 @@ #ifndef MXMUSICMANAGER_H #define MXMUSICMANAGER_H -#include "mxcore.h" +#include "decomp.h" +#include "mxaudiomanager.h" // VTABLE 0x100dc930 -class MxMusicManager : public MxCore +// SIZE 0x58 +class MxMusicManager : public MxAudioManager { +public: + MxMusicManager(); + virtual ~MxMusicManager() override; + + virtual void Destroy() override; // vtable+18 + virtual void SetVolume(MxS32 p_volume) override; // vtable+2c + virtual MxResult StartMIDIThread(MxU32 p_frequencyMS, MxU8 p_noRegister); // vtable+30 + +private: + void LockedReinitialize(MxBool p_skipDestroy); + void DeinitializeMIDI(); + + MxS32 CalculateVolume(MxS32 p_volume); + void SetMIDIVolume(); + + HMIDISTRM m_MIDIStreamH; // 0x30 + MxBool m_MIDIInitialized; // 0x34 + undefined4 m_unk38; // 0x38 + undefined4 m_unk3c; // 0x3c + undefined4 m_unk40; // 0x40 + undefined4 m_unk44; // 0x44 + undefined4 m_unk48; // 0x48 + MIDIHDR *m_MIDIHdrP; // 0x4c + MxS32 m_multiplier; // 0x50 + DWORD m_MIDIVolume; // 0x54 + +protected: + void Init(); + void InitData(); }; -#endif // MXMUSICMANAGER_H +#endif // MXMUSICMANAGER_H \ No newline at end of file From 5164ef1a546d4bbb4e997380d6e53d6c91e836a8 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Oct 2023 11:30:04 -0400 Subject: [PATCH 08/22] Refactor MxOmni/LegoOmni headers to use forward declarations (#148) * Refactor MxOmni/LegoOmni headers to use forward declarations * Fixes * Fix build * Fix deps --- ISLE/isleapp.cpp | 13 ++++++++++++- LEGO1/legofullscreenmovie.cpp | 4 +++- LEGO1/legogamestate.cpp | 2 ++ LEGO1/legonavcontroller.cpp | 1 + LEGO1/legoomni.cpp | 4 +++- LEGO1/legoomni.h | 31 +++++++++++++++---------------- LEGO1/mxdisplaysurface.cpp | 2 ++ LEGO1/mxdsaction.cpp | 5 +++-- LEGO1/mxmusicmanager.cpp | 2 ++ LEGO1/mxnotificationmanager.cpp | 5 +++-- LEGO1/mxomni.cpp | 12 ++++++++++++ LEGO1/mxomni.h | 30 ++++++++++++++++-------------- LEGO1/mxpalette.cpp | 2 ++ LEGO1/mxpresenter.cpp | 7 +++++-- LEGO1/mxsoundmanager.cpp | 2 +- LEGO1/mxstreamer.cpp | 5 +++-- LEGO1/mxthread.cpp | 5 +++-- LEGO1/mxtransitionmanager.cpp | 8 +++++++- LEGO1/mxtransitionmanager.h | 2 ++ LEGO1/skateboard.cpp | 2 ++ 20 files changed, 99 insertions(+), 45 deletions(-) diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index c20f1652..87f3ebe2 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -3,14 +3,25 @@ #include -#include "legoomni.h" #include "legoanimationmanager.h" #include "legobuildingmanager.h" +#include "legogamestate.h" +#include "legoinputmanager.h" #include "legomodelpresenter.h" +#include "legoomni.h" #include "legopartpresenter.h" +#include "legoroi.h" +#include "legovideomanager.h" #include "legoworldpresenter.h" +#include "mxbackgroundaudiomanager.h" #include "mxdirectdraw.h" #include "mxdsaction.h" +#include "mxomnicreateflags.h" +#include "mxomnicreateparam.h" +#include "mxstreamer.h" +#include "mxticklemanager.h" +#include "mxtimer.h" +#include "mxtransitionmanager.h" #include "res/resource.h" diff --git a/LEGO1/legofullscreenmovie.cpp b/LEGO1/legofullscreenmovie.cpp index f2a287f3..cb803133 100644 --- a/LEGO1/legofullscreenmovie.cpp +++ b/LEGO1/legofullscreenmovie.cpp @@ -1,6 +1,8 @@ #include "legofullscreenmovie.h" -#include "mxtypes.h" + #include "legoomni.h" +#include "legovideomanager.h" +#include "mxtypes.h" #include "decomp.h" DECOMP_SIZE_ASSERT(LegoFullScreenMovie, 0x24) diff --git a/LEGO1/legogamestate.cpp b/LEGO1/legogamestate.cpp index 0f444f95..a08ce8e2 100644 --- a/LEGO1/legogamestate.cpp +++ b/LEGO1/legogamestate.cpp @@ -1,5 +1,7 @@ #include "legogamestate.h" + #include "legoomni.h" +#include "mxvariabletable.h" #include "decomp.h" // Based on the highest dword offset (0x42c) referenced in the constructor. diff --git a/LEGO1/legonavcontroller.cpp b/LEGO1/legonavcontroller.cpp index 90c0a485..1f056f59 100644 --- a/LEGO1/legonavcontroller.cpp +++ b/LEGO1/legonavcontroller.cpp @@ -1,6 +1,7 @@ #include "legonavcontroller.h" #include "legoomni.h" +#include "legovideomanager.h" #include "legoutil.h" // 0x100f4c28 diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 58eed5c1..2bff73af 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -1,6 +1,8 @@ #include "legoomni.h" -#include "mxdsobject.h" +#include "mxbackgroundaudiomanager.h" +#include "mxdsfile.h" +#include "legogamestate.h" // 0x100f4588 char *g_nocdSourceName = NULL; diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 044275b4..122c77de 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -2,25 +2,24 @@ #define LEGOOMNI_H #include "compat.h" -#include "legoentity.h" -#include "legoinputmanager.h" -#include "legogamestate.h" -#include "legonavcontroller.h" -#include "legopathboundary.h" -#include "legoroi.h" -#include "legovideomanager.h" -#include "mxatomid.h" -#include "mxbackgroundaudiomanager.h" -#include "mxdsaction.h" -#include "mxdsfile.h" -#include "mxdsobject.h" #include "mxomni.h" -#include "mxtransitionmanager.h" -#include "isle.h" -#include "legobuildingmanager.h" -#include "legoplantmanager.h" +#include "mxdsaction.h" +class Isle; +class LegoBuildingManager; +class LegoEntity; +class LegoGameState; +class LegoInputManager; +class LegoNavController; +class LegoPathBoundary; +class LegoPlantManager; +class LegoROI; class LegoSoundManager; +class LegoVideoManager; +class LegoWorld; +class MxAtomId; +class MxBackgroundAudioManager; +class MxDSFile; class MxTransitionManager; // VTABLE 0x100d8638 diff --git a/LEGO1/mxdisplaysurface.cpp b/LEGO1/mxdisplaysurface.cpp index e22244c5..05a50475 100644 --- a/LEGO1/mxdisplaysurface.cpp +++ b/LEGO1/mxdisplaysurface.cpp @@ -1,5 +1,7 @@ #include "mxdisplaysurface.h" + #include "mxomni.h" +#include "mxvideomanager.h" DECOMP_SIZE_ASSERT(MxDisplaySurface, 0xac); diff --git a/LEGO1/mxdsaction.cpp b/LEGO1/mxdsaction.cpp index 3411a460..0ac01543 100644 --- a/LEGO1/mxdsaction.cpp +++ b/LEGO1/mxdsaction.cpp @@ -1,10 +1,11 @@ #include "mxdsaction.h" +#include "mxomni.h" +#include "mxtimer.h" + #include #include -#include "mxomni.h" - DECOMP_SIZE_ASSERT(MxDSAction, 0x94) // GLOBAL OFFSET: LEGO1 0x10101410 diff --git a/LEGO1/mxmusicmanager.cpp b/LEGO1/mxmusicmanager.cpp index 247b6596..6f49adcc 100644 --- a/LEGO1/mxmusicmanager.cpp +++ b/LEGO1/mxmusicmanager.cpp @@ -1,5 +1,7 @@ #include "mxmusicmanager.h" +#include "mxticklemanager.h" #include "mxomni.h" + #include DECOMP_SIZE_ASSERT(MxMusicManager, 0x58); diff --git a/LEGO1/mxnotificationmanager.cpp b/LEGO1/mxnotificationmanager.cpp index 1b097067..cb653ba4 100644 --- a/LEGO1/mxnotificationmanager.cpp +++ b/LEGO1/mxnotificationmanager.cpp @@ -1,7 +1,8 @@ +#include "mxnotificationmanager.h" + #include "legoomni.h" #include "mxautolocker.h" -#include "mxcore.h" -#include "mxnotificationmanager.h" +#include "mxticklemanager.h" #include "mxparam.h" #include "mxtypes.h" diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index ed870b34..c4d6d471 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -1,5 +1,17 @@ #include "mxomni.h" +#include "mxatomidcounter.h" +#include "mxeventmanager.h" +#include "mxmusicmanager.h" +#include "mxnotificationmanager.h" +#include "mxobjectfactory.h" +#include "mxomnicreateparam.h" +#include "mxsoundmanager.h" +#include "mxstreamer.h" +#include "mxticklemanager.h" +#include "mxtimer.h" +#include "mxvideomanager.h" + // 0x101015b8 char g_hdPath[1024]; diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 9c7d6b0a..585068ce 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -1,21 +1,23 @@ #ifndef MXOMNI_H #define MXOMNI_H +#include "mxcore.h" +#include "mxstring.h" #include "mxcriticalsection.h" -#include "mxdsaction.h" -#include "mxeventmanager.h" -#include "mxmusicmanager.h" -#include "mxnotificationmanager.h" -#include "mxobjectfactory.h" -#include "mxomnicreateflags.h" -#include "mxomnicreateparam.h" -#include "mxsoundmanager.h" -#include "mxstreamer.h" -#include "mxticklemanager.h" -#include "mxtimer.h" -#include "mxvariabletable.h" -#include "mxvideomanager.h" -#include "mxatomidcounter.h" + +class MxAtomIdCounterSet; +class MxDSAction; +class MxEventManager; +class MxMusicManager; +class MxNotificationManager; +class MxObjectFactory; +class MxOmniCreateParam; +class MxSoundManager; +class MxStreamer; +class MxTickleManager; +class MxTimer; +class MxVariableTable; +class MxVideoManager; // VTABLE 0x100dc168 // SIZE 0x68 diff --git a/LEGO1/mxpalette.cpp b/LEGO1/mxpalette.cpp index 7fb02f4f..cdd1597f 100644 --- a/LEGO1/mxpalette.cpp +++ b/LEGO1/mxpalette.cpp @@ -1,5 +1,7 @@ #include "mxpalette.h" + #include "mxomni.h" +#include "mxvideomanager.h" // GLOBAL: LEGO1 0x10102188 0x400 PALETTEENTRY g_defaultPaletteEntries[256] = diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index b57af821..5afafc79 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -1,14 +1,17 @@ #include "mxpresenter.h" + +#include "legoomni.h" #include "mxautolocker.h" #include "mxparam.h" -#include "legoomni.h" #include "mxdsanim.h" #include "mxdssound.h" -#include +#include "mxnotificationmanager.h" #include "decomp.h" #include "define.h" +#include + DECOMP_SIZE_ASSERT(MxPresenter, 0x40); // OFFSET: LEGO1 0x100b4d50 diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index 16d504ce..466843e3 100644 --- a/LEGO1/mxsoundmanager.cpp +++ b/LEGO1/mxsoundmanager.cpp @@ -1,5 +1,5 @@ #include "mxsoundmanager.h" - +#include "mxticklemanager.h" #include "mxomni.h" DECOMP_SIZE_ASSERT(MxSoundManager, 0x3c); diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index 53d7303f..eef989bc 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -1,10 +1,11 @@ #include "mxstreamer.h" -#include - #include "legoomni.h" #include "mxdiskstreamcontroller.h" #include "mxramstreamcontroller.h" +#include "mxnotificationmanager.h" + +#include DECOMP_SIZE_ASSERT(MxStreamer, 0x2c); diff --git a/LEGO1/mxthread.cpp b/LEGO1/mxthread.cpp index b63019ed..fed82eca 100644 --- a/LEGO1/mxthread.cpp +++ b/LEGO1/mxthread.cpp @@ -1,9 +1,10 @@ #include "mxthread.h" -#include - #include "mxomni.h" +#include "mxtimer.h" + +#include // OFFSET: LEGO1 0x100bf690 MxResult MxThread::Run() diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index d34df54f..8d52266c 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -1,6 +1,12 @@ #include "mxtransitionmanager.h" -#include "legoutil.h" + #include "legovideomanager.h" +#include "legoinputmanager.h" +#include "legoutil.h" +#include "legoworld.h" +#include "mxbackgroundaudiomanager.h" +#include "mxparam.h" +#include "mxticklemanager.h" DECOMP_SIZE_ASSERT(MxTransitionManager, 0x900); diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index 7f1d4ead..b4a9ba30 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -5,6 +5,8 @@ #include "mxvideopresenter.h" #include "legoomni.h" +#include + // VTABLE 0x100d7ea0 class MxTransitionManager : public MxCore { diff --git a/LEGO1/skateboard.cpp b/LEGO1/skateboard.cpp index 5c5cbf38..b67e127e 100644 --- a/LEGO1/skateboard.cpp +++ b/LEGO1/skateboard.cpp @@ -1,5 +1,7 @@ #include "skateboard.h" + #include "mxomni.h" +#include "mxnotificationmanager.h" #include "decomp.h" From 907c85616b1a551379c13d67be641a4da69815b4 Mon Sep 17 00:00:00 2001 From: MS Date: Sat, 7 Oct 2023 12:48:36 -0400 Subject: [PATCH 09/22] Supporting items for SetupCopyRect() (#177) * Minor improvements all related to SetupCopyRect * Rename inline getters. malloc/free -> new/delete * MxTypes in TransitionManager. Remove stub marker (oops) --- LEGO1/mxbitmap.h | 4 ++++ LEGO1/mxdisplaysurface.cpp | 4 ++-- LEGO1/mxdisplaysurface.h | 5 +++-- LEGO1/mxpresenter.h | 12 +++++++----- LEGO1/mxsmkpresenter.cpp | 11 +++++++++++ LEGO1/mxsmkpresenter.h | 7 ++++++- LEGO1/mxtransitionmanager.cpp | 34 +++++++++++++++++----------------- LEGO1/mxtransitionmanager.h | 2 +- LEGO1/mxvideopresenter.cpp | 22 +++++++++++----------- LEGO1/mxvideopresenter.h | 16 +++++++++++++--- 10 files changed, 75 insertions(+), 42 deletions(-) diff --git a/LEGO1/mxbitmap.h b/LEGO1/mxbitmap.h index ba90b7da..791581c6 100644 --- a/LEGO1/mxbitmap.h +++ b/LEGO1/mxbitmap.h @@ -25,6 +25,8 @@ struct MxBITMAPINFO { #define LOWCOLOR 0 // 256 color #define HIGHCOLOR 1 // High Color (16-bit) +// SIZE 0x20 +// VTABLE 0x100dc7b0 class MxBitmap : public MxCore { public: @@ -44,6 +46,8 @@ class MxBitmap : public MxCore virtual MxResult SetBitDepth(MxBool); // vtable+3c virtual MxResult StretchBits(HDC p_hdc, int p_xSrc, int p_ySrc, int p_xDest, int p_yDest, int p_destWidth, int p_destHeight); // vtable+40 + inline BITMAPINFOHEADER *GetBmiHeader() const { return m_bmiHeader; } + private: MxResult ImportColorsToPalette(RGBQUAD*, MxPalette*); diff --git a/LEGO1/mxdisplaysurface.cpp b/LEGO1/mxdisplaysurface.cpp index 05a50475..af7e57db 100644 --- a/LEGO1/mxdisplaysurface.cpp +++ b/LEGO1/mxdisplaysurface.cpp @@ -176,7 +176,7 @@ void MxDisplaySurface::SetPalette(MxPalette *p_palette) } // OFFSET: LEGO1 0x100bc200 STUB -void MxDisplaySurface::vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4) +void MxDisplaySurface::vtable24(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4) { } @@ -188,7 +188,7 @@ MxBool MxDisplaySurface::vtable28(undefined4, undefined4, undefined4, undefined4 } // OFFSET: LEGO1 0x100bc630 STUB -MxBool MxDisplaySurface::vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool) +MxBool MxDisplaySurface::vtable2c(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool) { return 0; } diff --git a/LEGO1/mxdisplaysurface.h b/LEGO1/mxdisplaysurface.h index 8e79f6e8..8a80a0f4 100644 --- a/LEGO1/mxdisplaysurface.h +++ b/LEGO1/mxdisplaysurface.h @@ -3,6 +3,7 @@ #include +#include "mxbitmap.h" #include "mxcore.h" #include "mxpalette.h" #include "mxvideoparam.h" @@ -25,9 +26,9 @@ class MxDisplaySurface : public MxCore virtual MxResult Create(MxVideoParam &p_videoParam); virtual void Clear(); virtual void SetPalette(MxPalette *p_palette); - virtual void vtable24(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); + virtual void vtable24(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); virtual MxBool vtable28(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); - virtual MxBool vtable2c(LPDDSURFACEDESC, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); + virtual MxBool vtable2c(LPDDSURFACEDESC, MxBitmap*, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); virtual MxBool vtable30(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, undefined4, MxBool); virtual undefined4 vtable34(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); virtual void Display(undefined4, undefined4, undefined4, undefined4, undefined4, undefined4); diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index 81ea14ad..156065f4 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -68,17 +68,19 @@ class MxPresenter : public MxCore MxBool IsEnabled(); - inline MxS32 GetCurrentTickleState() { return this->m_currentTickleState; } - inline MxPoint32 GetLocation() { return this->m_location; } - inline MxS32 GetDisplayZ() { return this->m_displayZ; } - inline MxDSAction *GetAction() { return this->m_action; } + inline MxS32 GetCurrentTickleState() const { return this->m_currentTickleState; } + inline MxPoint32 GetLocation() const { return this->m_location; } + inline MxS32 GetLocationX() const { return this->m_location.m_x; } + inline MxS32 GetLocationY() const { return this->m_location.m_y; } + inline MxS32 GetDisplayZ() const { return this->m_displayZ; } + inline MxDSAction *GetAction() const { return this->m_action; } protected: __declspec(dllexport) void Init(); void SendTo_unkPresenter(MxOmni *); private: - MxS32 m_currentTickleState; // 0x8 + TickleState m_currentTickleState; // 0x8 MxU32 m_previousTickleStates; MxPoint32 m_location; MxS32 m_displayZ; diff --git a/LEGO1/mxsmkpresenter.cpp b/LEGO1/mxsmkpresenter.cpp index cc7efec1..99faae22 100644 --- a/LEGO1/mxsmkpresenter.cpp +++ b/LEGO1/mxsmkpresenter.cpp @@ -15,3 +15,14 @@ void MxSmkPresenter::Init() { // TODO } + +// OFFSET: LEGO1 0x100b3960 +void MxSmkPresenter::VTable0x60() +{ + if (m_bitmap) { + delete m_bitmap; + } + + m_bitmap = new MxBitmap(); + m_bitmap->SetSize(m_smkWidth, m_smkHeight, NULL, NULL); +} diff --git a/LEGO1/mxsmkpresenter.h b/LEGO1/mxsmkpresenter.h index 325091bb..34a78dab 100644 --- a/LEGO1/mxsmkpresenter.h +++ b/LEGO1/mxsmkpresenter.h @@ -12,7 +12,12 @@ class MxSmkPresenter : public MxVideoPresenter public: MxSmkPresenter(); - undefined4 m_unk64[430]; + virtual void VTable0x60() override; + + undefined4 m_unk64; + MxS32 m_smkWidth; // 0x68 + MxS32 m_smkHeight; // 0x6c + undefined4 m_unk70[427]; undefined4 m_unk71c; private: void Init(); diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index 8d52266c..d7d16544 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -29,7 +29,7 @@ MxTransitionManager::MxTransitionManager() // OFFSET: LEGO1 0x1004ba00 MxTransitionManager::~MxTransitionManager() { - free(m_copyBuffer); + delete[] m_copyBuffer; if (m_waitIndicator != NULL) { delete m_waitIndicator->GetAction(); @@ -324,17 +324,17 @@ void MxTransitionManager::SubmitCopyRect(LPDDSURFACEDESC ddsc) } // Copy the copy rect onto the surface - char *dst; + MxU8 *dst; - DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; + MxU32 bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; - const char *src = (const char *)m_copyBuffer; + const MxU8 *src = (const MxU8 *)m_copyBuffer; - LONG copyPitch; + MxS32 copyPitch; copyPitch = ((m_copyRect.right - m_copyRect.left) + 1) * bytesPerPixel; - LONG y; - dst = (char *)ddsc->lpSurface + (ddsc->lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left); + MxS32 y; + dst = (MxU8 *)ddsc->lpSurface + (ddsc->lPitch * m_copyRect.top) + (bytesPerPixel * m_copyRect.left); for (y = 0; y < m_copyRect.bottom - m_copyRect.top + 1; ++y) { memcpy(dst, src, copyPitch); @@ -343,7 +343,7 @@ void MxTransitionManager::SubmitCopyRect(LPDDSURFACEDESC ddsc) } // Free the copy buffer - free(m_copyBuffer); + delete[] m_copyBuffer; m_copyBuffer = NULL; } @@ -361,11 +361,11 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc) // Check if wait indicator has started if (m_waitIndicator->GetCurrentTickleState() >= MxPresenter::TickleState_Streaming) { // Setup the copy rect - DWORD copyPitch = (ddsc->ddpfPixelFormat.dwRGBBitCount / 8) * (m_copyRect.right - m_copyRect.left + 1); // This uses m_copyRect, seemingly erroneously - DWORD bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; + MxU32 copyPitch = (ddsc->ddpfPixelFormat.dwRGBBitCount / 8) * (m_copyRect.right - m_copyRect.left + 1); // This uses m_copyRect, seemingly erroneously + MxU32 bytesPerPixel = ddsc->ddpfPixelFormat.dwRGBBitCount / 8; - m_copyRect.left = m_waitIndicator->GetLocation().m_x; - m_copyRect.top = m_waitIndicator->GetLocation().m_y; + m_copyRect.left = m_waitIndicator->GetLocationX(); + m_copyRect.top = m_waitIndicator->GetLocationY(); MxS32 height = m_waitIndicator->GetHeight(); MxS32 width = m_waitIndicator->GetWidth(); @@ -374,14 +374,14 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc) m_copyRect.bottom = m_copyRect.top + height - 1; // Allocate the copy buffer - const char *src = (const char*)ddsc->lpSurface + m_copyRect.top * ddsc->lPitch + bytesPerPixel * m_copyRect.left; + const MxU8 *src = (const MxU8*)ddsc->lpSurface + m_copyRect.top * ddsc->lPitch + bytesPerPixel * m_copyRect.left; - m_copyBuffer = malloc(bytesPerPixel * width * height); + m_copyBuffer = new MxU8[bytesPerPixel * width * height]; if (!m_copyBuffer) return; // Copy into the copy buffer - char *dst = (char*)m_copyBuffer; + MxU8 *dst = m_copyBuffer; for (MxS32 i = 0; i < (m_copyRect.bottom - m_copyRect.top + 1); i++) { @@ -396,11 +396,11 @@ void MxTransitionManager::SetupCopyRect(LPDDSURFACEDESC ddsc) { MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface(); MxBool unkbool = FALSE; - displaySurface->vtable2c(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight(), unkbool); + displaySurface->vtable2c(ddsc, m_waitIndicator->m_bitmap, 0, 0, m_waitIndicator->GetLocationX(), m_waitIndicator->GetLocationY(), m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight(), unkbool); } else { MxDisplaySurface *displaySurface = VideoManager()->GetDisplaySurface(); - displaySurface->vtable24(ddsc, m_waitIndicator->m_unk50, 0, 0, m_waitIndicator->GetLocation().m_x, m_waitIndicator->GetLocation().m_y, m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight()); + displaySurface->vtable24(ddsc, m_waitIndicator->m_bitmap, 0, 0, m_waitIndicator->GetLocationX(), m_waitIndicator->GetLocationY(), m_waitIndicator->GetWidth(), m_waitIndicator->GetHeight()); } } diff --git a/LEGO1/mxtransitionmanager.h b/LEGO1/mxtransitionmanager.h index b4a9ba30..58a8079e 100644 --- a/LEGO1/mxtransitionmanager.h +++ b/LEGO1/mxtransitionmanager.h @@ -59,7 +59,7 @@ class MxTransitionManager : public MxCore MxVideoPresenter *m_waitIndicator; RECT m_copyRect; - void *m_copyBuffer; + MxU8 *m_copyBuffer; flag_bitfield m_copyFlags; undefined4 m_unk24; diff --git a/LEGO1/mxvideopresenter.cpp b/LEGO1/mxvideopresenter.cpp index fe83a2dc..42dc34f3 100644 --- a/LEGO1/mxvideopresenter.cpp +++ b/LEGO1/mxvideopresenter.cpp @@ -8,10 +8,10 @@ void MxVideoPresenter::VTable0x5c() // TODO } -// OFFSET: LEGO1 0x1000c710 STUB +// OFFSET: LEGO1 0x1000c710 void MxVideoPresenter::VTable0x60() { - // TODO + // Empty } // OFFSET: LEGO1 0x1000c720 STUB @@ -44,24 +44,24 @@ void MxVideoPresenter::VTable0x78() // TODO } -// OFFSET: LEGO1 0x1000c7c0 STUB -void MxVideoPresenter::VTable0x7c() +// OFFSET: LEGO1 0x1000c7c0 +MxBool MxVideoPresenter::VTable0x7c() { - // TODO + return (m_bitmap != NULL) || (m_unk54 != NULL); } -// OFFSET: LEGO1 0x1000c7e0 STUB +// OFFSET: LEGO1 0x1000c7e0 MxS32 MxVideoPresenter::GetWidth() { - // TODO - return 0; + return m_unk54 ? m_unk54->width + : m_bitmap->GetBmiHeader()->biWidth; } -// OFFSET: LEGO1 0x1000c800 STUB +// OFFSET: LEGO1 0x1000c800 MxS32 MxVideoPresenter::GetHeight() { - // TODO - return 0; + return m_unk54 ? m_unk54->height + : m_bitmap->GetBmiHeader()->biHeight; } // OFFSET: LEGO1 0x100b2760 STUB diff --git a/LEGO1/mxvideopresenter.h b/LEGO1/mxvideopresenter.h index 84822f71..9c9a21a3 100644 --- a/LEGO1/mxvideopresenter.h +++ b/LEGO1/mxvideopresenter.h @@ -2,9 +2,11 @@ #define MXVIDEOPRESENTER_H #include "mxmediapresenter.h" +#include "mxbitmap.h" #include "decomp.h" +// VTABLE 0x100d4be8 class MxVideoPresenter : public MxMediaPresenter { public: @@ -41,12 +43,20 @@ class MxVideoPresenter : public MxMediaPresenter virtual void VTable0x70(); // vtable+0x70 virtual void VTable0x74(); // vtable+0x74 virtual void VTable0x78(); // vtable+0x78 - virtual void VTable0x7c(); // vtable+0x7c + virtual MxBool VTable0x7c(); // vtable+0x7c virtual MxS32 GetWidth(); // vtable+0x80 virtual MxS32 GetHeight(); // vtable+0x84 - undefined4 m_unk50; - undefined4 m_unk54; + // TODO: Not sure what this is. Seems to have size of 12 bytes + // based on 0x100b9e9a. Values are copied from the bitmap header. + typedef struct { + undefined unk0[8]; + MxU16 width; + MxU16 height; + } unknown_meta_struct; + + MxBitmap *m_bitmap; + unknown_meta_struct *m_unk54; undefined4 m_unk58; undefined2 m_unk5c; unsigned char m_flags; // 0x5e From 8281e195f708d6e3d36176d9ec471929619c6c5a Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 7 Oct 2023 13:12:59 -0400 Subject: [PATCH 10/22] Implement MxOmni Start/stop timer (#181) * Implement start/stop timer * Mark StartDirectSound as stub * remove accidently committed files --- ISLE/isleapp.cpp | 4 ++-- LEGO1/legoomni.cpp | 11 ++++++++--- LEGO1/legoomni.h | 2 +- LEGO1/mxomni.cpp | 24 +++++++++++++++++------- LEGO1/mxomni.h | 4 ++-- LEGO1/mxsoundmanager.cpp | 21 ++++++++++++++++++++- LEGO1/mxsoundmanager.h | 4 ++++ 7 files changed, 54 insertions(+), 16 deletions(-) diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 87f3ebe2..9aefae60 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -104,7 +104,7 @@ void IsleApp::Close() Lego()->RemoveWorld(ds.GetAtomId(), ds.GetObjectId()); Lego()->DeleteObject(ds); TransitionManager()->SetWaitIndicator(NULL); - Lego()->vtable0x3c(); + Lego()->StopTimer(); MxLong lVar8; do { @@ -243,7 +243,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine g_reqEnableRMDevice = 0; VideoManager()->EnableRMDevice(); g_rmDisabled = 0; - Lego()->vtable0x3c(); + Lego()->StopTimer(); } if (g_closed) { diff --git a/LEGO1/legoomni.cpp b/LEGO1/legoomni.cpp index 2bff73af..f4480bb8 100644 --- a/LEGO1/legoomni.cpp +++ b/LEGO1/legoomni.cpp @@ -3,6 +3,7 @@ #include "mxbackgroundaudiomanager.h" #include "mxdsfile.h" #include "legogamestate.h" +#include "legoutil.h" // 0x100f4588 char *g_nocdSourceName = NULL; @@ -307,14 +308,18 @@ void LegoOmni::NotifyCurrentEntity() // FIXME: Stub } +// OFFSET: LEGO1 0x1005b640 void LegoOmni::StartTimer() { - // FIXME: Stub + MxOmni::StartTimer(); + SetAppCursor(2); } -void LegoOmni::vtable0x3c() +// OFFSET: LEGO1 0x1005b650 +void LegoOmni::StopTimer() { - // FIXME: Stub + MxOmni::StopTimer(); + SetAppCursor(0); } MxBool LegoOmni::vtable40() diff --git a/LEGO1/legoomni.h b/LEGO1/legoomni.h index 122c77de..4de0d1b5 100644 --- a/LEGO1/legoomni.h +++ b/LEGO1/legoomni.h @@ -61,7 +61,7 @@ class LegoOmni : public MxOmni virtual int vtable0x30(char*, int, MxCore*) override; virtual void NotifyCurrentEntity() override; virtual void StartTimer() override; - virtual void vtable0x3c() override; + virtual void StopTimer() override; virtual MxBool vtable40(); LegoVideoManager *GetVideoManager() { return (LegoVideoManager *) m_videoManager; } diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index c4d6d471..d1db1398 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -2,7 +2,7 @@ #include "mxatomidcounter.h" #include "mxeventmanager.h" -#include "mxmusicmanager.h" +#include "mxmusicmanager.h" #include "mxnotificationmanager.h" #include "mxobjectfactory.h" #include "mxomnicreateparam.h" @@ -51,7 +51,7 @@ void MxOmni::Init() m_timer = NULL; m_streamer = NULL; m_atomIdCounterSet = NULL; - m_unk64 = NULL; + m_timerRunning = NULL; } // OFFSET: LEGO1 0x100b0090 @@ -98,16 +98,26 @@ void MxOmni::NotifyCurrentEntity() // TODO } -// OFFSET: LEGO1 0x100b09d0 STUB +// OFFSET: LEGO1 0x100b09d0 void MxOmni::StartTimer() { - // TODO + if (m_timerRunning == FALSE && m_timer != NULL && m_soundManager != NULL) + { + m_timer->Start(); + m_soundManager->vtable0x34(); + m_timerRunning = TRUE; + } } -// OFFSET: LEGO1 0x100b0a00 STUB -void MxOmni::vtable0x3c() +// OFFSET: LEGO1 0x100b0a00 +void MxOmni::StopTimer() { - // TODO + if (m_timerRunning != FALSE && m_timer != NULL && m_soundManager != NULL) + { + m_timer->Stop(); + m_soundManager->vtable0x38(); + m_timerRunning = FALSE; + } } // OFFSET: LEGO1 0x100b0690 diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 585068ce..66682842 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -47,7 +47,7 @@ class MxOmni : public MxCore virtual int vtable0x30(char*, int, MxCore*); // vtable+30 virtual void NotifyCurrentEntity(); // vtable+34 virtual void StartTimer(); // vtable+38 - virtual void vtable0x3c(); // vtable+3c + virtual void StopTimer(); // vtable+3c static void SetInstance(MxOmni* instance); HWND GetWindowHandle() const { return this->m_windowHandle; } MxObjectFactory* GetObjectFactory() const { return this->m_objectFactory; } @@ -81,7 +81,7 @@ class MxOmni : public MxCore MxCriticalSection m_criticalsection; // 0x48 - unsigned char m_unk64; // 0x64 + MxBool m_timerRunning; // 0x64 }; __declspec(dllexport) MxTickleManager * TickleManager(); __declspec(dllexport) MxTimer * Timer(); diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index 466843e3..e34534f9 100644 --- a/LEGO1/mxsoundmanager.cpp +++ b/LEGO1/mxsoundmanager.cpp @@ -46,4 +46,23 @@ void MxSoundManager::Destroy(MxBool p_param) if (!p_param) { MxAudioManager::Destroy(); } -} \ No newline at end of file +} + +// OFFSET: LEGO1 0x100ae8b0 STUB +MxResult MxSoundManager::StartDirectSound(undefined4 p_unknown1, MxBool p_unknown2) +{ + // TODO STUB + return FAILURE; +} + +// OFFSET: LEGO1 0x100aed10 STUB +void MxSoundManager::vtable0x34() +{ + // TODO STUB +} + +// OFFSET: LEGO1 0x100aee10 STUB +void MxSoundManager::vtable0x38() +{ + // TODO STUB +} diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index d41c6fdb..46eef2e7 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -14,6 +14,10 @@ class MxSoundManager : public MxAudioManager MxSoundManager(); virtual ~MxSoundManager() override; // vtable+0x0 + virtual MxResult StartDirectSound(undefined4 p_unknown1, MxBool p_unknown2); //vtable+0x30 + virtual void vtable0x34(); // vtable+0x34 + virtual void vtable0x38(); // vtable+0x38 + private: void Init(); void Destroy(MxBool); From 201125d2099d244e556cec4d1d02e837dbdd9a23 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Oct 2023 13:28:52 -0400 Subject: [PATCH 11/22] Silence all C4786 warnings (#180) --- LEGO1/compat.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/LEGO1/compat.h b/LEGO1/compat.h index 33b97d5a..ba0b9d34 100644 --- a/LEGO1/compat.h +++ b/LEGO1/compat.h @@ -18,6 +18,9 @@ // Impossible to avoid this if using STL map or set. // This removes most (but not all) occurrences of the warning. #pragma warning( disable : 4786 ) +// To really remove *all* of the warnings, we have to employ the following, +// obscure workaround from https://www.earthli.com/news/view_article.php?id=376 +static class msVC6_4786WorkAround { public: msVC6_4786WorkAround() {} } msVC6_4786WorkAround; #define MSVC420_VERSION 1020 From e6507b874a477e64e5796bbfb6d147be5a08da5e Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Oct 2023 14:00:20 -0400 Subject: [PATCH 12/22] Refactor vector EqualsScalar (#171) * Refactor vector EqualsScalar * Fix param name --- LEGO1/legoentity.cpp | 8 ++------ LEGO1/mxdsaction.cpp | 19 +++---------------- LEGO1/mxvector.h | 2 ++ 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/LEGO1/legoentity.cpp b/LEGO1/legoentity.cpp index 105b4b5f..e7601cc2 100644 --- a/LEGO1/legoentity.cpp +++ b/LEGO1/legoentity.cpp @@ -23,12 +23,8 @@ MxLong LegoEntity::Notify(MxParam &p) // OFFSET: LEGO1 0x100105f0 void LegoEntity::Reset() { - float value = 0.0f; - m_vec1.EqualsScalar(&value); - - value = 0.0f; - m_vec2.EqualsScalar(&value); - + m_vec1.Fill(0); + m_vec2.Fill(0); m_unk50 = 0; m_unk54 = 0; m_unk58 = 0; diff --git a/LEGO1/mxdsaction.cpp b/LEGO1/mxdsaction.cpp index 0ac01543..1f26c7c9 100644 --- a/LEGO1/mxdsaction.cpp +++ b/LEGO1/mxdsaction.cpp @@ -22,22 +22,9 @@ MxDSAction::MxDSAction() this->m_loopCount = -1; this->SetType(MxDSType_Action); - - { - float value = FLT_MAX; - this->m_location.EqualsScalar(&value); - } - - { - float value = FLT_MAX; - this->m_direction.EqualsScalar(&value); - } - - { - float value = FLT_MAX; - this->m_up.EqualsScalar(&value); - } - + this->m_location.Fill(FLT_MAX); + this->m_direction.Fill(FLT_MAX); + this->m_up.Fill(FLT_MAX); this->m_unk84 = 0; this->m_unk88 = 0; this->m_omni = NULL; diff --git a/LEGO1/mxvector.h b/LEGO1/mxvector.h index ae58abd9..eef1d927 100644 --- a/LEGO1/mxvector.h +++ b/LEGO1/mxvector.h @@ -95,6 +95,8 @@ class MxVector3 : public MxVector2 virtual void EqualsCross(MxVector3 *p_a, float *p_b); virtual void EqualsCross(MxVector3 *p_a, MxVector3 *p_b); virtual void EqualsScalar(float *p_value); + + inline void Fill(float p_value) { EqualsScalar(&p_value); } }; // VTABLE 0x100d45a0 From 4a674d823b18817dd35182fcaefef27209429266 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Oct 2023 14:03:15 -0400 Subject: [PATCH 13/22] Implement MxDSSelectAction Clone/operator=/CopyFrom (#154) --- CMakeLists.txt | 1 + LEGO1/mxdsaction.h | 4 ++-- LEGO1/mxdsanim.h | 2 +- LEGO1/mxdschunk.h | 1 - LEGO1/mxdsevent.h | 2 +- LEGO1/mxdsmediaaction.h | 4 ++-- LEGO1/mxdsmultiaction.h | 16 ++++++++-------- LEGO1/mxdsobjectaction.h | 2 +- LEGO1/mxdsparallelaction.h | 4 ++-- LEGO1/mxdsselectaction.cpp | 34 ++++++++++++++++++++++++++++++++++ LEGO1/mxdsselectaction.h | 8 ++++++++ LEGO1/mxdsserialaction.h | 6 +++--- LEGO1/mxdssound.h | 6 +++--- LEGO1/mxdsstill.h | 2 +- LEGO1/mxdsstreamingaction.h | 2 +- LEGO1/mxlist.h | 33 ++++++++++++++++++++++++++------- LEGO1/mxstring.cpp | 8 ++++---- LEGO1/mxstring.h | 2 +- LEGO1/mxstringlist.cpp | 5 +++++ LEGO1/mxstringlist.h | 12 ++++++++++++ 20 files changed, 116 insertions(+), 38 deletions(-) create mode 100644 LEGO1/mxstringlist.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e2135c9..a3573874 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,6 +163,7 @@ add_library(lego1 SHARED LEGO1/mxstreamcontroller.cpp LEGO1/mxstreamer.cpp LEGO1/mxstring.cpp + LEGO1/mxstringlist.cpp LEGO1/mxthread.cpp LEGO1/mxticklemanager.cpp LEGO1/mxtimer.cpp diff --git a/LEGO1/mxdsaction.h b/LEGO1/mxdsaction.h index 9881f3e2..57d1f200 100644 --- a/LEGO1/mxdsaction.h +++ b/LEGO1/mxdsaction.h @@ -41,8 +41,8 @@ class MxDSAction : public MxDSObject return !strcmp(name, MxDSAction::ClassName()) || MxDSObject::IsA(name); } - virtual MxU32 GetSizeOnDisk(); // vtable+18; - virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; + virtual MxU32 GetSizeOnDisk() override; // vtable+18; + virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c; virtual MxLong GetDuration(); // vtable+24; virtual void SetDuration(MxLong p_duration); // vtable+28; virtual MxDSAction *Clone(); // vtable+2c; diff --git a/LEGO1/mxdsanim.h b/LEGO1/mxdsanim.h index 92890e8e..1bc77558 100644 --- a/LEGO1/mxdsanim.h +++ b/LEGO1/mxdsanim.h @@ -27,7 +27,7 @@ class MxDSAnim : public MxDSMediaAction return !strcmp(name, MxDSAnim::ClassName()) || MxDSMediaAction::IsA(name); } - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxDSAction *Clone() override; // vtable+2c; }; #endif // MXDSANIM_H diff --git a/LEGO1/mxdschunk.h b/LEGO1/mxdschunk.h index f9b1d9d0..367dcb4d 100644 --- a/LEGO1/mxdschunk.h +++ b/LEGO1/mxdschunk.h @@ -1,7 +1,6 @@ #ifndef MXDSCHUNK_H #define MXDSCHUNK_H - #include "mxcore.h" #include "mxtypes.h" diff --git a/LEGO1/mxdsevent.h b/LEGO1/mxdsevent.h index b8fedace..576c8b14 100644 --- a/LEGO1/mxdsevent.h +++ b/LEGO1/mxdsevent.h @@ -25,7 +25,7 @@ class MxDSEvent : public MxDSMediaAction return !strcmp(name, MxDSEvent::ClassName()) || MxDSMediaAction::IsA(name); } - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxDSAction *Clone() override; // vtable+2c; }; #endif // MXDSEVENT_H diff --git a/LEGO1/mxdsmediaaction.h b/LEGO1/mxdsmediaaction.h index cc710425..34b6695e 100644 --- a/LEGO1/mxdsmediaaction.h +++ b/LEGO1/mxdsmediaaction.h @@ -28,8 +28,8 @@ class MxDSMediaAction : public MxDSAction return !strcmp(name, MxDSMediaAction::ClassName()) || MxDSAction::IsA(name); } - virtual MxU32 GetSizeOnDisk(); // vtable+18; - virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; + virtual MxU32 GetSizeOnDisk() override; // vtable+18; + virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c; void CopyMediaSrcPath(const char *p_mediaSrcPath); diff --git a/LEGO1/mxdsmultiaction.h b/LEGO1/mxdsmultiaction.h index 4063343c..1689cc2d 100644 --- a/LEGO1/mxdsmultiaction.h +++ b/LEGO1/mxdsmultiaction.h @@ -28,14 +28,14 @@ class MxDSMultiAction : public MxDSAction return !strcmp(name, MxDSMultiAction::ClassName()) || MxDSAction::IsA(name); } - virtual undefined4 unk14(); // vtable+14; - virtual MxU32 GetSizeOnDisk(); // vtable+18; - virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; - virtual void SetAtomId(MxAtomId p_atomId); // vtable+20; - virtual MxDSAction *Clone(); // vtable+2c; - virtual void MergeFrom(MxDSAction &p_dsAction); // vtable+30; - virtual MxBool HasId(MxU32 p_objectId); // vtable+34; - virtual void SetSomeTimingField(MxLong p_someTimingField); // vtable+38; + virtual undefined4 unk14() override; // vtable+14; + virtual MxU32 GetSizeOnDisk() override; // vtable+18; + virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c; + virtual void SetAtomId(MxAtomId p_atomId) override; // vtable+20; + virtual MxDSAction *Clone() override; // vtable+2c; + virtual void MergeFrom(MxDSAction &p_dsAction) override; // vtable+30; + virtual MxBool HasId(MxU32 p_objectId) override; // vtable+34; + virtual void SetSomeTimingField(MxLong p_someTimingField) override; // vtable+38; private: MxU32 m_sizeOnDisk; diff --git a/LEGO1/mxdsobjectaction.h b/LEGO1/mxdsobjectaction.h index 4a1b68bb..07f35758 100644 --- a/LEGO1/mxdsobjectaction.h +++ b/LEGO1/mxdsobjectaction.h @@ -26,7 +26,7 @@ class MxDSObjectAction : public MxDSMediaAction return !strcmp(name, MxDSObjectAction::ClassName()) || MxDSMediaAction::IsA(name); } - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxDSAction *Clone() override; // vtable+2c; virtual void CopyFrom(MxDSObjectAction &p_dsObjectAction); // vtable+44; }; diff --git a/LEGO1/mxdsparallelaction.h b/LEGO1/mxdsparallelaction.h index 962ba34b..e28bfe58 100644 --- a/LEGO1/mxdsparallelaction.h +++ b/LEGO1/mxdsparallelaction.h @@ -27,8 +27,8 @@ class MxDSParallelAction : public MxDSMultiAction return !strcmp(name, MxDSParallelAction::ClassName()) || MxDSMultiAction::IsA(name); } - virtual MxLong GetDuration(); // vtable+24; - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxLong GetDuration() override; // vtable+24; + virtual MxDSAction *Clone() override; // vtable+2c; }; #endif // MXDSPARALLELACTION_H diff --git a/LEGO1/mxdsselectaction.cpp b/LEGO1/mxdsselectaction.cpp index 29f69022..58af9543 100644 --- a/LEGO1/mxdsselectaction.cpp +++ b/LEGO1/mxdsselectaction.cpp @@ -15,3 +15,37 @@ MxDSSelectAction::~MxDSSelectAction() if (this->m_unk0xac) delete this->m_unk0xac; } + +// OFFSET: LEGO1 0x100cb950 +void MxDSSelectAction::CopyFrom(MxDSSelectAction &p_dsSelectAction) +{ + this->m_unk0x9c = p_dsSelectAction.m_unk0x9c; + + this->m_unk0xac->DeleteAll(); + + MxStringListCursor cursor(p_dsSelectAction.m_unk0xac); + MxString string; + while (cursor.Next(string)) + this->m_unk0xac->OtherAppend(string); +} + +// OFFSET: LEGO1 0x100cbd50 +MxDSSelectAction &MxDSSelectAction::operator=(MxDSSelectAction &p_dsSelectAction) +{ + if (this != &p_dsSelectAction) { + MxDSParallelAction::operator=(p_dsSelectAction); + this->CopyFrom(p_dsSelectAction); + } + return *this; +} + +// OFFSET: LEGO1 0x100cbd80 +MxDSAction *MxDSSelectAction::Clone() +{ + MxDSSelectAction *clone = new MxDSSelectAction(); + + if (clone) + *clone = *this; + + return clone; +} \ No newline at end of file diff --git a/LEGO1/mxdsselectaction.h b/LEGO1/mxdsselectaction.h index d513efd0..746afc87 100644 --- a/LEGO1/mxdsselectaction.h +++ b/LEGO1/mxdsselectaction.h @@ -13,6 +13,9 @@ class MxDSSelectAction : public MxDSParallelAction MxDSSelectAction(); virtual ~MxDSSelectAction() override; + void CopyFrom(MxDSSelectAction &p_dsSelectAction); + MxDSSelectAction &operator=(MxDSSelectAction &p_dsSelectAction); + // OFFSET: LEGO1 0x100cb6f0 inline virtual const char *ClassName() const override // vtable+0x0c { @@ -26,6 +29,11 @@ class MxDSSelectAction : public MxDSParallelAction return !strcmp(name, MxDSSelectAction::ClassName()) || MxDSParallelAction::IsA(name); } + //virtual MxU32 GetSizeOnDisk() override; // vtable+18; + //virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c; + //virtual MxLong GetDuration() override; // vtable+24; + virtual MxDSAction *Clone() override; // vtable+2c; + private: MxString m_unk0x9c; MxStringList *m_unk0xac; diff --git a/LEGO1/mxdsserialaction.h b/LEGO1/mxdsserialaction.h index e2f6cd72..4e383681 100644 --- a/LEGO1/mxdsserialaction.h +++ b/LEGO1/mxdsserialaction.h @@ -28,9 +28,9 @@ class MxDSSerialAction : public MxDSMultiAction return !strcmp(name, MxDSSerialAction::ClassName()) || MxDSMultiAction::IsA(name); } - virtual MxLong GetDuration(); // vtable+24; - virtual void SetDuration(MxLong p_duration); // vtable+28; - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxLong GetDuration() override; // vtable+24; + virtual void SetDuration(MxLong p_duration) override; // vtable+28; + virtual MxDSAction *Clone() override; // vtable+2c; private: MxDSActionListCursor *m_cursor; diff --git a/LEGO1/mxdssound.h b/LEGO1/mxdssound.h index de345e51..514ef1ec 100644 --- a/LEGO1/mxdssound.h +++ b/LEGO1/mxdssound.h @@ -27,9 +27,9 @@ class MxDSSound : public MxDSMediaAction return !strcmp(name, MxDSSound::ClassName()) || MxDSMediaAction::IsA(name); } - virtual MxU32 GetSizeOnDisk(); // vtable+18; - virtual void Deserialize(char **p_source, MxS16 p_unk24); // vtable+1c; - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxU32 GetSizeOnDisk() override; // vtable+18; + virtual void Deserialize(char **p_source, MxS16 p_unk24) override; // vtable+1c; + virtual MxDSAction *Clone() override; // vtable+2c; private: MxU32 m_sizeOnDisk; diff --git a/LEGO1/mxdsstill.h b/LEGO1/mxdsstill.h index 084fe931..3b29c287 100644 --- a/LEGO1/mxdsstill.h +++ b/LEGO1/mxdsstill.h @@ -27,7 +27,7 @@ class MxDSStill : public MxDSMediaAction return !strcmp(name, MxDSStill::ClassName()) || MxDSMediaAction::IsA(name); } - virtual MxDSAction *Clone(); // vtable+2c; + virtual MxDSAction *Clone() override; // vtable+2c; }; #endif // MXDSSTILL_H diff --git a/LEGO1/mxdsstreamingaction.h b/LEGO1/mxdsstreamingaction.h index d50dbed8..f95621eb 100644 --- a/LEGO1/mxdsstreamingaction.h +++ b/LEGO1/mxdsstreamingaction.h @@ -24,7 +24,7 @@ class MxDSStreamingAction : public MxDSAction return *this; } - virtual MxBool HasId(MxU32 p_objectId); // vtable+34; + virtual MxBool HasId(MxU32 p_objectId) override; // vtable+34; MxResult Init(); void SetInternalAction(MxDSAction *p_dsAction); diff --git a/LEGO1/mxlist.h b/LEGO1/mxlist.h index 12695f82..94798b33 100644 --- a/LEGO1/mxlist.h +++ b/LEGO1/mxlist.h @@ -4,7 +4,6 @@ #include "mxtypes.h" #include "mxcore.h" -// SIZE 0xc template class MxListEntry { @@ -15,6 +14,11 @@ class MxListEntry m_prev = p_prev; m_next = NULL; } + MxListEntry(T p_obj, MxListEntry *p_prev, MxListEntry *p_next) { + m_obj = p_obj; + m_prev = p_prev; + m_next = p_next; + } T GetValue() { return this->m_obj; } @@ -26,7 +30,6 @@ class MxListEntry MxListEntry *m_next; }; -// VTABLE 0x100d6350 // SIZE 0x10 template class MxListParent : public MxCore @@ -46,7 +49,6 @@ class MxListParent : public MxCore void (*m_customDestructor)(T); // +0xc }; -// VTABLE 0x100d6368 // SIZE 0x18 template class MxList : protected MxListParent @@ -60,6 +62,7 @@ class MxList : protected MxListParent virtual ~MxList(); void Append(T); + void OtherAppend(T p_obj) { _InsertEntry(p_obj, this->m_last, NULL); }; void DeleteAll(); MxU32 GetCount() { return m_count; } void SetDestroy(void (*p_customDestructor)(T)) { this->m_customDestructor = p_customDestructor; } @@ -71,9 +74,9 @@ class MxList : protected MxListParent private: void _DeleteEntry(MxListEntry *match); + void _InsertEntry(T, MxListEntry *, MxListEntry *); }; -// VTABLE 0x100d6488 template class MxListCursor : public MxCore { @@ -96,7 +99,6 @@ class MxListCursor : public MxCore }; // Unclear purpose -// VTABLE 0x100d6530 template class MxListCursorChild : public MxListCursor { @@ -105,7 +107,6 @@ class MxListCursorChild : public MxListCursor }; // Unclear purpose -// VTABLE 0x100d6470 template class MxListCursorChildChild : public MxListCursorChild { @@ -152,6 +153,24 @@ inline void MxList::Append(T p_newobj) this->m_count++; } +template +inline void MxList::_InsertEntry(T p_newobj, MxListEntry *p_prev, MxListEntry *p_next) +{ + MxListEntry *newEntry = new MxListEntry(p_newobj, p_prev, p_next); + + if (p_prev) + p_prev->m_next = newEntry; + else + this->m_first = newEntry; + + if (p_next) + p_next->m_prev = newEntry; + else + this->m_last = newEntry; + + this->m_count++; +} + template inline void MxList::_DeleteEntry(MxListEntry *match) { @@ -198,7 +217,7 @@ inline MxBool MxListCursor::Next(T& p_obj) m_match = m_match->m_next; if (m_match) - p_obj = m_match->m_obj; + p_obj = m_match->GetValue(); return m_match != NULL; } diff --git a/LEGO1/mxstring.cpp b/LEGO1/mxstring.cpp index e82d431a..fe221f94 100644 --- a/LEGO1/mxstring.cpp +++ b/LEGO1/mxstring.cpp @@ -56,14 +56,14 @@ void MxString::ToLowerCase() } // OFFSET: LEGO1 0x100ae4b0 -MxString &MxString::operator=(MxString *param) +MxString &MxString::operator=(MxString ¶m) { - if (this->m_data != param->m_data) + if (this->m_data != param.m_data) { delete[] this->m_data; - this->m_length = param->m_length; + this->m_length = param.m_length; this->m_data = new char[this->m_length + 1]; - strcpy(this->m_data, param->m_data); + strcpy(this->m_data, param.m_data); } return *this; diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index a24a0df1..ec20f879 100644 --- a/LEGO1/mxstring.h +++ b/LEGO1/mxstring.h @@ -15,7 +15,7 @@ class MxString : public MxCore MxString(const char *); void ToUpperCase(); void ToLowerCase(); - MxString& operator=(MxString *); + MxString& operator=(MxString &); MxString operator+(const char *); MxString& operator+=(const char *); diff --git a/LEGO1/mxstringlist.cpp b/LEGO1/mxstringlist.cpp new file mode 100644 index 00000000..8a0a2ddc --- /dev/null +++ b/LEGO1/mxstringlist.cpp @@ -0,0 +1,5 @@ +#include "mxstringlist.h" + +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxListEntry, 0x18) diff --git a/LEGO1/mxstringlist.h b/LEGO1/mxstringlist.h index dbf063f6..f92d2b7d 100644 --- a/LEGO1/mxstringlist.h +++ b/LEGO1/mxstringlist.h @@ -8,6 +8,9 @@ // SIZE 0x18 class MxStringList : public MxList {}; +// VTABLE 0x100dd058 +typedef MxListCursorChild MxStringListCursor; + // OFFSET: LEGO1 0x100cb3c0 TEMPLATE // MxListParent::Compare @@ -17,6 +20,15 @@ class MxStringList : public MxList {}; // OFFSET: LEGO1 0x100cb4c0 TEMPLATE // MxList::~MxList +// OFFSET: LEGO1 0x100cbb40 TEMPLATE +// MxList::OtherAppend + +// OFFSET: LEGO1 0x100cc2d0 TEMPLATE +// MxList::_InsertEntry + +// OFFSET: LEGO1 0x100cc3c0 TEMPLATE +// MxListEntry::MxListEntry + // OFFSET: LEGO1 0x100cc450 TEMPLATE // MxListEntry::GetValue From 62b97b8f1f4078da83eabad6a4aa4f0dc8cae139 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 7 Oct 2023 14:05:45 -0400 Subject: [PATCH 14/22] Implement MxOmni::Create (#182) * implement mxomni::create, and match MxStreamController::Open * Use enum for mxparam type * Fix return type * Match MxOmni::Notify * Remove unused variable * Added override keywords --------- Co-authored-by: Christian Semmler --- LEGO1/mxeventmanager.cpp | 9 ++- LEGO1/mxeventmanager.h | 3 +- LEGO1/mxmediamanager.h | 2 +- LEGO1/mxomni.cpp | 115 ++++++++++++++++++++++++++++++++-- LEGO1/mxomni.h | 1 + LEGO1/mxomnicreateparam.h | 3 + LEGO1/mxparam.h | 14 ++++- LEGO1/mxpresenter.cpp | 7 +-- LEGO1/mxstreamcontroller.cpp | 6 +- LEGO1/mxstreamer.cpp | 2 - LEGO1/mxstreamer.h | 2 +- LEGO1/mxtransitionmanager.cpp | 2 +- LEGO1/mxvideomanager.cpp | 18 +++++- LEGO1/mxvideomanager.h | 4 +- 14 files changed, 164 insertions(+), 24 deletions(-) diff --git a/LEGO1/mxeventmanager.cpp b/LEGO1/mxeventmanager.cpp index 5383c25a..54cc2905 100644 --- a/LEGO1/mxeventmanager.cpp +++ b/LEGO1/mxeventmanager.cpp @@ -15,4 +15,11 @@ MxEventManager::~MxEventManager() // OFFSET: LEGO1 0x100c0450 void MxEventManager::Init() { -} \ No newline at end of file +} + +// OFFSET: LEGO1 0x100c04a0 STUB +MxResult MxEventManager::vtable0x28(undefined4 p_unknown1, undefined p_unknown2) +{ + //TODO + return FAILURE; +} diff --git a/LEGO1/mxeventmanager.h b/LEGO1/mxeventmanager.h index cb89f637..59a1c8ea 100644 --- a/LEGO1/mxeventmanager.h +++ b/LEGO1/mxeventmanager.h @@ -2,6 +2,7 @@ #define MXEVENTMANAGER_H #include "mxmediamanager.h" +#include "decomp.h" // VTABLE 0x100dc900 // SIZE 0x2c @@ -10,7 +11,7 @@ class MxEventManager : public MxMediaManager public: MxEventManager(); virtual ~MxEventManager() override; - + virtual MxResult vtable0x28(undefined4 p_unknown1, MxU8 p_unknown2); // vtable+28 private: void Init(); }; diff --git a/LEGO1/mxmediamanager.h b/LEGO1/mxmediamanager.h index ccc3ec42..db8d9056 100644 --- a/LEGO1/mxmediamanager.h +++ b/LEGO1/mxmediamanager.h @@ -15,7 +15,7 @@ class MxMediaManager : public MxCore MxMediaManager(); virtual ~MxMediaManager() override; - virtual MxResult Tickle(); // vtable+08 + virtual MxResult Tickle() override; // vtable+08 virtual MxResult InitPresenters(); // vtable+14 virtual void Destroy(); // vtable+18 virtual void AddPresenter(MxPresenter &p_presenter); // vtable+1c diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index d1db1398..b5c0dcb3 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -11,6 +11,7 @@ #include "mxticklemanager.h" #include "mxtimer.h" #include "mxvideomanager.h" +#include "mxautolocker.h" // 0x101015b8 char g_hdPath[1024]; @@ -182,7 +183,22 @@ void MxOmni::SetInstance(MxOmni *instance) // OFFSET: LEGO1 0x100af0c0 MxResult MxOmni::Create(MxOmniCreateParam &p) { + MxResult result = FAILURE; m_atomIdCounterSet = new MxAtomIdCounterSet(); + if (m_atomIdCounterSet == NULL) + { + goto failure; + } + m_mediaPath = p.GetMediaPath(); + m_windowHandle = p.GetWindowHandle(); + if (p.CreateFlags().CreateObjectFactory()) + { + MxObjectFactory *objectFactory = new MxObjectFactory(); + this->m_objectFactory = objectFactory; + + if (objectFactory == NULL) + goto failure; + } if (p.CreateFlags().CreateVariableTable()) { @@ -190,7 +206,7 @@ MxResult MxOmni::Create(MxOmniCreateParam &p) this->m_variableTable = variableTable; if (variableTable == NULL) - return FAILURE; + goto failure; } if (p.CreateFlags().CreateTimer()) @@ -202,7 +218,87 @@ MxResult MxOmni::Create(MxOmniCreateParam &p) return FAILURE; } - return SUCCESS; + if (p.CreateFlags().CreateTickleManager()) + { + this->m_tickleManager = new MxTickleManager(); + + if (m_tickleManager == NULL) + goto failure; + } + + if (p.CreateFlags().CreateNotificationManager()) + { + MxNotificationManager *notificationManager = new MxNotificationManager(); + this->m_notificationManager = notificationManager; + + if (notificationManager == NULL || notificationManager->Create(100, 0) != SUCCESS) + goto failure; + } + + if (p.CreateFlags().CreateStreamer()) + { + MxStreamer *streamer = new MxStreamer(); + this->m_streamer = streamer; + + if (streamer == NULL || streamer->Init() != SUCCESS) + goto failure; + } + + if (p.CreateFlags().CreateVideoManager()) + { + MxVideoManager *videoManager = new MxVideoManager(); + this->m_videoManager = videoManager; + + if (videoManager != NULL && videoManager->vtable0x2c(p.GetVideoParam(), 100, 0) != SUCCESS) + { + delete m_videoManager; + m_videoManager = NULL; + } + } + + if (p.CreateFlags().CreateSoundManager()) + { + MxSoundManager *soundManager = new MxSoundManager(); + this->m_soundManager = soundManager; + + //TODO + if (soundManager != NULL && soundManager->StartDirectSound(10, 0) != SUCCESS) + { + delete m_soundManager; + m_soundManager = NULL; + } + } + + if (p.CreateFlags().CreateMusicManager()) + { + MxMusicManager *musicManager = new MxMusicManager(); + this->m_musicManager = musicManager; + if (musicManager != NULL && musicManager->StartMIDIThread(50, 0) != SUCCESS) + { + delete m_musicManager; + m_musicManager = NULL; + } + } + + if (p.CreateFlags().CreateEventManager()) + { + MxEventManager *eventManager = new MxEventManager(); + this->m_eventManager = eventManager; + if (m_eventManager != NULL && m_eventManager->vtable0x28(50, 0) != SUCCESS) + { + delete m_eventManager; + m_eventManager = NULL; + } + } + + result = SUCCESS; + failure: + if (result != SUCCESS) + { + Destroy(); + } + + return result; } // OFFSET: LEGO1 0x100afe90 @@ -248,8 +344,19 @@ void MxOmni::Destroy() // OFFSET: LEGO1 0x100b07f0 MxLong MxOmni::Notify(MxParam &p) { - // FIXME: Stub - return 0; + MxAutoLocker lock(&this->m_criticalsection); + + if (p.GetType() != MXSTREAMER_UNKNOWN) + return 0; + + return HandleNotificationType2(p); +} + +// OFFSET: LEGO1 0x100b0880 STUB +MxResult MxOmni::HandleNotificationType2(MxParam& p_param) +{ + // TODO STUB + return FAILURE; } // OFFSET: LEGO1 0x100acea0 diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 66682842..5290c6ed 100644 --- a/LEGO1/mxomni.h +++ b/LEGO1/mxomni.h @@ -61,6 +61,7 @@ class MxOmni : public MxCore MxMusicManager* GetMusicManager() const { return this->m_musicManager; } MxEventManager* GetEventManager() const { return this->m_eventManager; } MxAtomIdCounterSet* GetAtomIdCounterSet() const { return this->m_atomIdCounterSet; } + MxResult HandleNotificationType2(MxParam& p_param); protected: static MxOmni* g_instance; diff --git a/LEGO1/mxomnicreateparam.h b/LEGO1/mxomnicreateparam.h index 31dcd447..3c1059dd 100644 --- a/LEGO1/mxomnicreateparam.h +++ b/LEGO1/mxomnicreateparam.h @@ -14,6 +14,9 @@ class MxOmniCreateParam : public MxOmniCreateParamBase __declspec(dllexport) MxOmniCreateParam(const char *mediaPath, struct HWND__ *windowHandle, MxVideoParam &vparam, MxOmniCreateFlags flags); const MxOmniCreateFlags& CreateFlags() const { return this->m_createFlags; } + const MxString GetMediaPath() const { return m_mediaPath; } + const HWND GetWindowHandle() const { return m_windowHandle; } + MxVideoParam& GetVideoParam() { return m_videoParam; } private: MxString m_mediaPath; diff --git a/LEGO1/mxparam.h b/LEGO1/mxparam.h index ffbf1530..d76ecdb0 100644 --- a/LEGO1/mxparam.h +++ b/LEGO1/mxparam.h @@ -7,16 +7,24 @@ class MxCore; +enum MxParamType +{ + MXSTREAMER_UNKNOWN = 2, + MXPRESENTER_NOTIFICATION = 5, + MXSTREAMER_DELETE_NOTIFY = 6, + MXTRANSITIONMANAGER_TRANSITIONENDED = 24 +}; + // VTABLE 0x100d56e0 class MxParam : public MxOmniCreateParamBase { public: - inline MxParam(MxS32 p_type, MxCore *p_sender) : MxOmniCreateParamBase(), m_type(p_type), m_sender(p_sender){} + inline MxParam(MxParamType p_type, MxCore *p_sender) : MxOmniCreateParamBase(), m_type(p_type), m_sender(p_sender){} virtual ~MxParam() override {} // vtable+0x0 (scalar deleting destructor) virtual MxParam *Clone(); // vtable+0x4 - inline MxS32 GetType() const + inline MxParamType GetType() const { return m_type; } @@ -27,7 +35,7 @@ class MxParam : public MxOmniCreateParamBase } protected: - MxS32 m_type; // 0x4 + MxParamType m_type; // 0x4 MxCore *m_sender; // 0x8 }; diff --git a/LEGO1/mxpresenter.cpp b/LEGO1/mxpresenter.cpp index 5afafc79..f8f60386 100644 --- a/LEGO1/mxpresenter.cpp +++ b/LEGO1/mxpresenter.cpp @@ -49,9 +49,9 @@ void MxPresenter::ParseExtra() int val = token ? atoi(token) : 0; int result = MxOmni::GetInstance()->vtable0x30(t_token, val, this); - + m_action->SetFlags(m_action->GetFlags() | MxDSAction::Flag_Parsed); - + if (result) SendTo_unkPresenter(MxOmni::GetInstance()); @@ -65,8 +65,7 @@ void MxPresenter::SendTo_unkPresenter(MxOmni *p_omni) if (m_unkPresenter) { MxAutoLocker lock(&m_criticalSection); - // TOOD: magic number used for notification type. replace with enum - NotificationManager()->Send(m_unkPresenter, &MxParam(5, this)); + NotificationManager()->Send(m_unkPresenter, &MxParam(MXPRESENTER_NOTIFICATION, this)); m_action->SetOmni(p_omni ? p_omni : MxOmni::GetInstance()); m_unkPresenter = NULL; diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index e219f357..83917cd4 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -1,6 +1,7 @@ #include "mxstreamcontroller.h" #include "mxautolocker.h" +#include "legoomni.h" // OFFSET: LEGO1 0x100c0b90 STUB MxStreamController::MxStreamController() @@ -24,10 +25,11 @@ MxBool MxStreamController::FUN_100c20d0(MxDSObject &p_obj) // OFFSET: LEGO1 0x100c1520 MxResult MxStreamController::Open(const char *p_filename) { + char sourceName [256]; MxAutoLocker locker(&m_criticalSection); - // TODO - + MakeSourceName(sourceName, p_filename); + this->atom = MxAtomId(sourceName, LookupMode_LowerCase2); return SUCCESS; } diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index eef989bc..c6ef85bd 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -9,8 +9,6 @@ DECOMP_SIZE_ASSERT(MxStreamer, 0x2c); -#define MXSTREAMER_DELETE_NOTIFY 6 - // OFFSET: LEGO1 0x100b8f00 MxStreamer::MxStreamer() { diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index c900feb9..515be51b 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -43,7 +43,7 @@ class MxStreamerSubClass3 : public MxStreamerSubClass1 class MxStreamerNotification : public MxParam { public: - inline MxStreamerNotification(MxS32 p_type, MxCore *p_sender, MxStreamController *p_ctrlr) : MxParam(p_type, p_sender) + inline MxStreamerNotification(MxParamType p_type, MxCore *p_sender, MxStreamController *p_ctrlr) : MxParam(p_type, p_sender) { m_controller = p_ctrlr; } diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index d7d16544..66c99532 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -85,7 +85,7 @@ void MxTransitionManager::EndTransition(MxBool p_notifyWorld) LegoWorld *world = GetCurrentWorld(); if (world) { - world->Notify(MxParam(0x18, this)); + world->Notify(MxParam(MXTRANSITIONMANAGER_TRANSITIONENDED, this)); } } } diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 8f64dbd4..bab495fd 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -34,7 +34,7 @@ MxResult MxVideoManager::Tickle() UpdateRegion(); m_region->Reset(); - + return SUCCESS; } @@ -54,13 +54,13 @@ MxResult MxVideoManager::Init() void MxVideoManager::SortPresenterList() { if (this->m_presenters->GetCount() <= 1) - return; + return; MxPresenterListCursor a(this->m_presenters); MxPresenterListCursor b(this->m_presenters); MxU32 count = this->m_presenters->GetCount() - 1; MxBool finished; - + if (count != 0) { do { a.Reset(); @@ -111,3 +111,15 @@ MxLong MxVideoManager::RealizePalette(MxPalette *p_palette) this->m_criticalSection.Leave(); return 0; } + +// OFFSET: LEGO1 0x100be600 STUB +void MxVideoManager::vtable0x28() +{ + +} + +// OFFSET: LEGO1 0x100bebe0 STUB +MxResult MxVideoManager::vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unknown1, MxU8 p_unknown2) +{ + return FAILURE; +} diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index 7888f7e7..d72c1d10 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -13,7 +13,9 @@ class MxVideoManager : public MxMediaManager public: virtual ~MxVideoManager(); - virtual MxResult Tickle(); // vtable+0x8 + virtual MxResult Tickle() override; // vtable+0x8 + virtual void vtable0x28(); // vtable+0x28 (TODO ARGUMENTS) + virtual MxResult vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unknown1, MxU8 p_unknown2); // vtable+0x2c __declspec(dllexport) void InvalidateRect(MxRect32 &); __declspec(dllexport) virtual MxLong RealizePalette(MxPalette *); // vtable+0x30 From a9fa734844d1fb9ea58832439c38564d5d2c2dcb Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 7 Oct 2023 14:07:26 -0400 Subject: [PATCH 15/22] Refactor deserialization of objects (#170) * Use template helpers for deserialization * Remove space * Fix naming --- LEGO1/legoutil.h | 29 +++++++++++++++++++++++ LEGO1/mxdsaction.cpp | 49 ++++++++++++++------------------------- LEGO1/mxdsmediaaction.cpp | 24 +++++++------------ LEGO1/mxdsobject.cpp | 15 ++++-------- LEGO1/mxdssound.cpp | 4 ++-- 5 files changed, 63 insertions(+), 58 deletions(-) diff --git a/LEGO1/legoutil.h b/LEGO1/legoutil.h index e912991d..cc54da74 100644 --- a/LEGO1/legoutil.h +++ b/LEGO1/legoutil.h @@ -23,6 +23,35 @@ inline T Max(T p_t1, T p_t2) return p_t1 > p_t2 ? p_t1 : p_t2; } +template +inline void GetScalar(char **p_source, T& p_dest) +{ + p_dest = *(T*) *p_source; + *p_source += sizeof(T); +} + +template +inline T GetScalar(T **p_source) +{ + T val = **p_source; + *p_source += 1; + return val; +} + +template +inline void GetDouble(char **p_source, T& p_dest) +{ + p_dest = *(double*) *p_source; + *p_source += sizeof(double); +} + +template +inline void GetString(char **p_source, const char *&p_dest, T *p_obj, void (T::*p_setter)(const char*)) +{ + (p_obj->*p_setter)(*p_source); + *p_source += strlen(p_dest) + 1; +} + ExtraActionType MatchActionString(const char *); void ConvertHSVToRGB(float r, float g, float b, float* out_r, float* out_g, float* out_b); void SetAppCursor(WPARAM p_wparam); diff --git a/LEGO1/mxdsaction.cpp b/LEGO1/mxdsaction.cpp index 1f26c7c9..153a6498 100644 --- a/LEGO1/mxdsaction.cpp +++ b/LEGO1/mxdsaction.cpp @@ -2,6 +2,7 @@ #include "mxomni.h" #include "mxtimer.h" +#include "legoutil.h" #include #include @@ -84,38 +85,24 @@ void MxDSAction::Deserialize(char **p_source, MxS16 p_unk24) { MxDSObject::Deserialize(p_source, p_unk24); - this->m_flags = *(MxU32*) *p_source; - *p_source += sizeof(MxU32); - this->m_startTime = *(MxLong*) *p_source; - *p_source += sizeof(MxLong); - this->m_duration = *(MxLong*) *p_source; - *p_source += sizeof(MxLong); - this->m_loopCount = *(MxS32*) *p_source; - *p_source += sizeof(MxS32); - this->m_location[0] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_location[1] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_location[2] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_direction[0] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_direction[1] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_direction[2] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_up[0] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_up[1] = *(double*) *p_source; - *p_source += sizeof(double); - this->m_up[2] = *(double*) *p_source; - *p_source += sizeof(double); + GetScalar(p_source, this->m_flags); + GetScalar(p_source, this->m_startTime); + GetScalar(p_source, this->m_duration); + GetScalar(p_source, this->m_loopCount); + GetDouble(p_source, this->m_location[0]); + GetDouble(p_source, this->m_location[1]); + GetDouble(p_source, this->m_location[2]); + GetDouble(p_source, this->m_direction[0]); + GetDouble(p_source, this->m_direction[1]); + GetDouble(p_source, this->m_direction[2]); + GetDouble(p_source, this->m_up[0]); + GetDouble(p_source, this->m_up[1]); + GetDouble(p_source, this->m_up[2]); - MxU16 unkLength = *(MxU16*) *p_source; - *p_source += sizeof(MxU16); - if (unkLength) { - AppendData(unkLength, *p_source); - *p_source += unkLength; + MxU16 extraLength = GetScalar((MxU16**) p_source); + if (extraLength) { + AppendData(extraLength, *p_source); + *p_source += extraLength; } } diff --git a/LEGO1/mxdsmediaaction.cpp b/LEGO1/mxdsmediaaction.cpp index d368aa3d..19f3bde2 100644 --- a/LEGO1/mxdsmediaaction.cpp +++ b/LEGO1/mxdsmediaaction.cpp @@ -1,5 +1,7 @@ #include "mxdsmediaaction.h" +#include "legoutil.h" + DECOMP_SIZE_ASSERT(MxDSMediaAction, 0xb8) // OFFSET: LEGO1 0x100c8b40 @@ -68,21 +70,13 @@ void MxDSMediaAction::Deserialize(char **p_source, MxS16 p_unk24) { MxDSAction::Deserialize(p_source, p_unk24); - CopyMediaSrcPath(*p_source); - *p_source += strlen(this->m_mediaSrcPath) + 1; - - this->m_unk9c = *(undefined4*) *p_source; - *p_source += sizeof(undefined4); - this->m_unka0 = *(undefined4*) *p_source; - *p_source += sizeof(undefined4); - this->m_framesPerSecond = *(MxS32*) *p_source; - *p_source += sizeof(MxS32); - this->m_mediaFormat = *(MxS32*) *p_source; - *p_source += sizeof(MxS32); - this->m_paletteManagement = *(MxS32*) *p_source; - *p_source += sizeof(MxS32); - this->m_sustainTime = *(MxLong*) *p_source; - *p_source += sizeof(MxLong); + GetString(p_source, this->m_mediaSrcPath, this, &MxDSMediaAction::CopyMediaSrcPath); + GetScalar(p_source, this->m_unk9c); + GetScalar(p_source, this->m_unka0); + GetScalar(p_source, this->m_framesPerSecond); + GetScalar(p_source, this->m_mediaFormat); + GetScalar(p_source, this->m_paletteManagement); + GetScalar(p_source, this->m_sustainTime); } // OFFSET: LEGO1 0x100c8e80 diff --git a/LEGO1/mxdsobject.cpp b/LEGO1/mxdsobject.cpp index 2b7d8437..f508c53b 100644 --- a/LEGO1/mxdsobject.cpp +++ b/LEGO1/mxdsobject.cpp @@ -15,6 +15,7 @@ #include "mxdsselectaction.h" #include "mxdsstill.h" #include "mxdsobjectaction.h" +#include "legoutil.h" DECOMP_SIZE_ASSERT(MxDSObject, 0x2c); @@ -128,20 +129,14 @@ MxU32 MxDSObject::GetSizeOnDisk() // OFFSET: LEGO1 0x100bfa20 void MxDSObject::Deserialize(char **p_source, MxS16 p_unk24) { - this->SetSourceName(*p_source); - *p_source += strlen(this->m_sourceName) + 1; - this->m_unk14 = *(undefined4*) *p_source; - *p_source += sizeof(undefined4); - - this->SetObjectName(*p_source); - *p_source += strlen(this->m_objectName) + 1; - this->m_objectId = *(MxU32*) *p_source; - *p_source += sizeof(MxU32); + GetString(p_source, this->m_sourceName, this, &MxDSObject::SetSourceName); + GetScalar(p_source, this->m_unk14); + GetString(p_source, this->m_objectName, this, &MxDSObject::SetObjectName); + GetScalar(p_source, this->m_objectId); this->m_unk24 = p_unk24; } - // OFFSET: LEGO1 0x100bfb30 MxDSObject *DeserializeDSObjectDispatch(char **p_source, MxS16 p_flags) { diff --git a/LEGO1/mxdssound.cpp b/LEGO1/mxdssound.cpp index cbb1c057..ca69ef34 100644 --- a/LEGO1/mxdssound.cpp +++ b/LEGO1/mxdssound.cpp @@ -1,4 +1,5 @@ #include "mxdssound.h" +#include "legoutil.h" DECOMP_SIZE_ASSERT(MxDSSound, 0xc0) @@ -46,8 +47,7 @@ void MxDSSound::Deserialize(char **p_source, MxS16 p_unk24) { MxDSMediaAction::Deserialize(p_source, p_unk24); - this->m_volume = *(MxS32*) *p_source; - *p_source += sizeof(MxS32); + GetScalar(p_source, this->m_volume); } // OFFSET: LEGO1 0x100c9510 From 472a82f22016cb32488b1a0f2fd8f0855e15f5bb Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 7 Oct 2023 16:36:05 -0400 Subject: [PATCH 16/22] MxMusicPresenter vtable (#184) * MxMusicPresenter vtable vtable+0x34 adds the current presenter to the music manager vtable+0x38 calls destroy with the param as "FALSE" * Update mxmusicpresenter.cpp * Update mxmusicpresenter.cpp --------- Co-authored-by: Christian Semmler --- LEGO1/mxmusicpresenter.cpp | 26 +++++++++++++++++++++++++- LEGO1/mxmusicpresenter.h | 4 ++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/LEGO1/mxmusicpresenter.cpp b/LEGO1/mxmusicpresenter.cpp index 72ae273a..45a56679 100644 --- a/LEGO1/mxmusicpresenter.cpp +++ b/LEGO1/mxmusicpresenter.cpp @@ -1,5 +1,11 @@ #include "mxmusicpresenter.h" +#include "decomp.h" +#include "mxmusicmanager.h" +#include "mxomni.h" + +DECOMP_SIZE_ASSERT(MxMusicPresenter, 0x54); + // OFFSET: LEGO1 0x100c22c0 MxMusicPresenter::MxMusicPresenter() { @@ -21,4 +27,22 @@ void MxMusicPresenter::Init() void MxMusicPresenter::Destroy(MxBool) { // TODO -} \ No newline at end of file +} + +// OFFSET: LEGO1 0x100c25a0 +MxResult MxMusicPresenter::AddToMusicManager() +{ + MxResult result = FAILURE; + if (MusicManager()) { + result = SUCCESS; + MusicManager()->AddPresenter(*this); + } + return result; +} + +// OFFSET: LEGO1 0x100c25d0 +void MxMusicPresenter::vtable38() +{ + // TODO: Name this function when we know what the argument to Destroy does + Destroy(FALSE); +} diff --git a/LEGO1/mxmusicpresenter.h b/LEGO1/mxmusicpresenter.h index a000c2b9..2e55aa6c 100644 --- a/LEGO1/mxmusicpresenter.h +++ b/LEGO1/mxmusicpresenter.h @@ -4,6 +4,7 @@ #include "mxaudiopresenter.h" // VTABLE 0x100dc9b8 +// SIZE 0x54 class MxMusicPresenter : public MxAudioPresenter { public: @@ -23,6 +24,9 @@ class MxMusicPresenter : public MxAudioPresenter MxMusicPresenter(); virtual ~MxMusicPresenter() override; + virtual MxResult AddToMusicManager(); // vtable+0x34 + virtual void vtable38(); // vtable+0x38 + private: void Init(); void Destroy(MxBool); From 5f8bde9e48797bb9bd29416e8857bb66abdfe390 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 7 Oct 2023 17:30:05 -0400 Subject: [PATCH 17/22] Finish MxMediaManager and MxEventManager (#185) * Finish MxMediaManager and MxEventManager * Update mxomni.cpp * fixes --- LEGO1/mxeventmanager.cpp | 51 ++++++++++++++++++++++++++++++++++++---- LEGO1/mxeventmanager.h | 2 +- LEGO1/mxmediamanager.cpp | 23 +++++++++++++++++- LEGO1/mxmediamanager.h | 1 + LEGO1/mxomni.cpp | 4 ++-- 5 files changed, 72 insertions(+), 9 deletions(-) diff --git a/LEGO1/mxeventmanager.cpp b/LEGO1/mxeventmanager.cpp index 54cc2905..0861af77 100644 --- a/LEGO1/mxeventmanager.cpp +++ b/LEGO1/mxeventmanager.cpp @@ -1,4 +1,8 @@ #include "mxeventmanager.h" +#include "mxcriticalsection.h" +#include "mxthread.h" +#include "mxticklemanager.h" +#include "mxomni.h" // OFFSET: LEGO1 0x100c0360 MxEventManager::MxEventManager() @@ -9,17 +13,54 @@ MxEventManager::MxEventManager() // OFFSET: LEGO1 0x100c03f0 MxEventManager::~MxEventManager() { - // TODO: MxMediaManager::TerminateThread call + TerminateThread(TRUE); } // OFFSET: LEGO1 0x100c0450 void MxEventManager::Init() { + // This is intentionally left blank } -// OFFSET: LEGO1 0x100c04a0 STUB -MxResult MxEventManager::vtable0x28(undefined4 p_unknown1, undefined p_unknown2) +// OFFSET: LEGO1 0x100c04a0 +MxResult MxEventManager::CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister) { - //TODO - return FAILURE; + MxResult status = FAILURE; + MxBool locked = FALSE; + + MxResult result = MxMediaManager::InitPresenters(); + if (result == SUCCESS) + { + if (p_noRegister) + { + this->m_criticalSection.Enter(); + locked = TRUE; + this->m_thread = new MxTickleThread(this, p_frequencyMS); + + if (this->m_thread) + { + if (this->m_thread->Start(0, 0) == SUCCESS) + { + status = SUCCESS; + } + } + } + else + { + TickleManager()->RegisterClient(this, p_frequencyMS); + status = SUCCESS; + } + } + + if (status != SUCCESS) + { + Destroy(); + } + + if (locked) + { + this->m_criticalSection.Leave(); + } + + return status; } diff --git a/LEGO1/mxeventmanager.h b/LEGO1/mxeventmanager.h index 59a1c8ea..1ef43748 100644 --- a/LEGO1/mxeventmanager.h +++ b/LEGO1/mxeventmanager.h @@ -11,7 +11,7 @@ class MxEventManager : public MxMediaManager public: MxEventManager(); virtual ~MxEventManager() override; - virtual MxResult vtable0x28(undefined4 p_unknown1, MxU8 p_unknown2); // vtable+28 + virtual MxResult CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister); // vtable+28 private: void Init(); }; diff --git a/LEGO1/mxmediamanager.cpp b/LEGO1/mxmediamanager.cpp index 3fb28d37..c992cd42 100644 --- a/LEGO1/mxmediamanager.cpp +++ b/LEGO1/mxmediamanager.cpp @@ -2,6 +2,8 @@ #include "mxautolocker.h" #include "mxpresenter.h" #include "decomp.h" +#include "mxticklemanager.h" +#include "mxomni.h" DECOMP_SIZE_ASSERT(MxMediaManager, 0x2c); @@ -65,7 +67,7 @@ void MxMediaManager::Destroy() if (this->m_presenters) delete this->m_presenters; - + Init(); } @@ -97,3 +99,22 @@ void MxMediaManager::StopPresenters() while (cursor.Next(presenter)) presenter->EndAction(); } + +// OFFSET: LEGO1 0x100c0460 +void MxMediaManager::TerminateThread(MxBool p_reinit) +{ + if(m_thread != NULL) + { + m_thread->Terminate(); + delete m_thread; + } + else + { + TickleManager()->UnregisterClient(this); + } + + if(!p_reinit) + { + MxMediaManager::Destroy(); + } +} diff --git a/LEGO1/mxmediamanager.h b/LEGO1/mxmediamanager.h index db8d9056..c17ab300 100644 --- a/LEGO1/mxmediamanager.h +++ b/LEGO1/mxmediamanager.h @@ -23,6 +23,7 @@ class MxMediaManager : public MxCore virtual void StopPresenters(); // vtable+24 MxResult Init(); + void TerminateThread(MxBool p_reinit); protected: MxPresenterList *m_presenters; diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index b5c0dcb3..fb3251da 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -284,7 +284,7 @@ MxResult MxOmni::Create(MxOmniCreateParam &p) { MxEventManager *eventManager = new MxEventManager(); this->m_eventManager = eventManager; - if (m_eventManager != NULL && m_eventManager->vtable0x28(50, 0) != SUCCESS) + if (m_eventManager != NULL && m_eventManager->CreateEventThread(50, 0) != SUCCESS) { delete m_eventManager; m_eventManager = NULL; @@ -345,7 +345,7 @@ void MxOmni::Destroy() MxLong MxOmni::Notify(MxParam &p) { MxAutoLocker lock(&this->m_criticalsection); - + if (p.GetType() != MXSTREAMER_UNKNOWN) return 0; From 3afbf808d186fee463385ce0067fc8774b2871c4 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 8 Oct 2023 09:46:09 -0400 Subject: [PATCH 18/22] MxMediaPresenter vtable (#189) * Add vtables for MxMediaPresenter * remove comments and fix override --- LEGO1/mxmediapresenter.cpp | 56 ++++++++++++++++++++++++++++++++++++++ LEGO1/mxmediapresenter.h | 13 +++++++-- LEGO1/mxpresenter.h | 4 +-- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/LEGO1/mxmediapresenter.cpp b/LEGO1/mxmediapresenter.cpp index f36ecbdc..00a2b851 100644 --- a/LEGO1/mxmediapresenter.cpp +++ b/LEGO1/mxmediapresenter.cpp @@ -2,6 +2,12 @@ DECOMP_SIZE_ASSERT(MxMediaPresenter, 0x50); +// OFFSET: LEGO1 0x1000c550 +MxMediaPresenter::~MxMediaPresenter() +{ + Destroy(TRUE); +} + // OFFSET: LEGO1 0x100b5d10 STUB MxResult MxMediaPresenter::Tickle() { @@ -18,6 +24,56 @@ void MxMediaPresenter::Init() this->m_unk4c = NULL; } +// OFFSET: LEGO1 0x100b54f0 STUB +void MxMediaPresenter::Destroy(MxBool p_destroy) +{ + // TODO +} + +// OFFSET: LEGO1 0x100b5d90 STUB +void MxMediaPresenter::StreamingTickle() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b5e10 STUB +void MxMediaPresenter::RepeatingTickle() +{ + // TODO +} + +// OFFSET: LEGO1 0x100b5ef0 +void MxMediaPresenter::DoneTickle() +{ + m_previousTickleStates |= 1 << m_currentTickleState; + m_currentTickleState = TickleState_Idle; + EndAction(); +} + +// OFFSET: LEGO1 0x100b6030 STUB +void MxMediaPresenter::Enable(MxBool p_enable) +{ + // TODO +} + +// OFFSET: LEGO1 0x1000c5b0 +void MxMediaPresenter::InitVirtual() +{ + Destroy(FALSE); +} + +// OFFSET: LEGO1 0x100b5700 STUB +MxLong MxMediaPresenter::StartAction(MxStreamController * p_controller, MxDSAction * p_action) +{ + return 0; +} + +// OFFSET: LEGO1 0x100b5bc0 STUB +void MxMediaPresenter::EndAction() +{ + // TODO +} + // OFFSET: LEGO1 0x100b5f10 STUB void MxMediaPresenter::VTable0x58() { diff --git a/LEGO1/mxmediapresenter.h b/LEGO1/mxmediapresenter.h index 824dd399..167b10c1 100644 --- a/LEGO1/mxmediapresenter.h +++ b/LEGO1/mxmediapresenter.h @@ -13,8 +13,9 @@ class MxMediaPresenter : public MxPresenter { Init(); } + virtual ~MxMediaPresenter() override; - virtual MxResult Tickle() override; // vtable+0x8, override MxCore + virtual MxResult Tickle() override; // OFFSET: LEGO1 0x1000c5c0 inline virtual const char *ClassName() const override // vtable+0xc @@ -29,7 +30,14 @@ class MxMediaPresenter : public MxPresenter return !strcmp(name, MxMediaPresenter::ClassName()) || MxPresenter::IsA(name); } - virtual void VTable0x58(); // vtable+0x58 + virtual void StreamingTickle() override; + virtual void RepeatingTickle() override; + virtual void DoneTickle() override; + virtual void InitVirtual() override; + virtual MxLong StartAction(MxStreamController *, MxDSAction *) override; + virtual void EndAction() override; + virtual void Enable(MxBool p_enable) override; + virtual void VTable0x58(); undefined4 m_unk40; undefined4 m_unk44; @@ -37,6 +45,7 @@ class MxMediaPresenter : public MxPresenter undefined4 m_unk4c; private: void Init(); + void Destroy(MxBool); }; diff --git a/LEGO1/mxpresenter.h b/LEGO1/mxpresenter.h index 156065f4..959533c5 100644 --- a/LEGO1/mxpresenter.h +++ b/LEGO1/mxpresenter.h @@ -15,7 +15,7 @@ class MxStreamController; class MxPresenter : public MxCore { public: - enum TickleState + enum TickleState { TickleState_Idle = 0, TickleState_Ready, @@ -78,8 +78,6 @@ class MxPresenter : public MxCore protected: __declspec(dllexport) void Init(); void SendTo_unkPresenter(MxOmni *); - -private: TickleState m_currentTickleState; // 0x8 MxU32 m_previousTickleStates; MxPoint32 m_location; From aa516af4349e3f48eaa8ca1af09a0129b583a165 Mon Sep 17 00:00:00 2001 From: ChrisMiuchiz Date: Sun, 8 Oct 2023 10:10:16 -0400 Subject: [PATCH 19/22] Remove goto from isleapp.cpp (#188) * Remove goto from isleapp.cpp * Simplify if statement and make indent consistent --- ISLE/isleapp.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 9aefae60..503a7128 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -250,16 +250,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine break; } - if (g_mousedown == 0) { -LAB_00401bc7: - if (g_mousemoved) { - g_mousemoved = FALSE; - } - } else if (g_mousemoved) { - if (g_isle) { - g_isle->Tick(0); - } - goto LAB_00401bc7; + if (g_mousedown && g_mousemoved && g_isle) { + g_isle->Tick(0); + } + + if (g_mousemoved) { + g_mousemoved = FALSE; } } } From 7c674cbb4734c687f86c72a89bc0e096a9a7c002 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sun, 8 Oct 2023 11:25:38 -0400 Subject: [PATCH 20/22] Start MxCompositePresenter ctor/dtor (#186) * Start MxCompositePresenter ctor/dtor * Add MxUnkList --------- Co-authored-by: Christian Semmler --- LEGO1/mxcompositepresenter.cpp | 9 +++++---- LEGO1/mxcompositepresenter.h | 5 ++--- LEGO1/mxdiskstreamprovider.h | 29 ++------------------------ LEGO1/mxunklist.h | 37 ++++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 LEGO1/mxunklist.h diff --git a/LEGO1/mxcompositepresenter.cpp b/LEGO1/mxcompositepresenter.cpp index 342f3d96..06477c94 100644 --- a/LEGO1/mxcompositepresenter.cpp +++ b/LEGO1/mxcompositepresenter.cpp @@ -1,17 +1,18 @@ #include "mxcompositepresenter.h" #include "decomp.h" +#include "mxnotificationmanager.h" DECOMP_SIZE_ASSERT(MxCompositePresenter, 0x4c); -// OFFSET: LEGO1 0x100b60b0 STUB +// OFFSET: LEGO1 0x100b60b0 MxCompositePresenter::MxCompositePresenter() { - // TODO + NotificationManager()->Register(this); } -// OFFSET: LEGO1 0x100b6390 STUB +// OFFSET: LEGO1 0x100b6390 MxCompositePresenter::~MxCompositePresenter() { - // TODO + NotificationManager()->Unregister(this); } diff --git a/LEGO1/mxcompositepresenter.h b/LEGO1/mxcompositepresenter.h index 9f517652..0be080f0 100644 --- a/LEGO1/mxcompositepresenter.h +++ b/LEGO1/mxcompositepresenter.h @@ -2,6 +2,7 @@ #define MXCOMPOSITEPRESENTER_H #include "mxpresenter.h" +#include "mxunklist.h" // VTABLE 0x100dc618 // SIZE 0x4c @@ -24,9 +25,7 @@ class MxCompositePresenter : public MxPresenter return !strcmp(name, MxCompositePresenter::ClassName()) || MxPresenter::IsA(name); } - undefined m_unk40; - undefined4 *m_unk44; - undefined4 m_unk48; + MxUnkList m_list; }; #endif // MXCOMPOSITEPRESENTER_H diff --git a/LEGO1/mxdiskstreamprovider.h b/LEGO1/mxdiskstreamprovider.h index b6ff8c18..c797a0de 100644 --- a/LEGO1/mxdiskstreamprovider.h +++ b/LEGO1/mxdiskstreamprovider.h @@ -5,6 +5,7 @@ #include "mxstreamprovider.h" #include "mxthread.h" #include "mxcriticalsection.h" +#include "mxunklist.h" class MxDiskStreamProvider; @@ -23,32 +24,6 @@ class MxDiskStreamProviderThread : public MxThread MxDiskStreamProvider *m_target; }; -// TODO -struct MxDiskStreamListNode { - MxDiskStreamListNode *m_unk00; - MxDiskStreamListNode *m_unk04; - undefined4 m_unk08; -}; - -// TODO -struct MxDiskStreamList { - inline MxDiskStreamList() { - undefined unk; - this->m_unk00 = unk; - - MxDiskStreamListNode *node = new MxDiskStreamListNode(); - node->m_unk00 = node; - node->m_unk04 = node; - - this->m_head = node; - this->m_count = 0; - } - - undefined m_unk00; - MxDiskStreamListNode *m_head; - MxU32 m_count; -}; - // VTABLE 0x100dd138 class MxDiskStreamProvider : public MxStreamProvider { @@ -80,7 +55,7 @@ class MxDiskStreamProvider : public MxStreamProvider undefined m_remainingWork; // 0x34 undefined m_unk35; // 0x35 MxCriticalSection m_criticalSection; // 0x38 - MxDiskStreamList m_list; + MxUnkList m_list; }; #endif // MXDISKSTREAMPROVIDER_H diff --git a/LEGO1/mxunklist.h b/LEGO1/mxunklist.h new file mode 100644 index 00000000..af59f47b --- /dev/null +++ b/LEGO1/mxunklist.h @@ -0,0 +1,37 @@ +#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 \ No newline at end of file From 3ac0c5d86c9c87e52119522451c44e3b0ff9cd28 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 8 Oct 2023 16:00:59 -0400 Subject: [PATCH 21/22] Implement LegoVideoManager::MoveCursor and improve SetSkyColor (#190) * improved SetSkyColor match * LegoVideoManager::MoveCursor * rename parameters * Minor improvements --------- Co-authored-by: Christian Semmler --- LEGO1/legovideomanager.cpp | 33 +++++++++++++++++++++++---------- LEGO1/legovideomanager.h | 17 ++++++++++++++--- LEGO1/mxpalette.h | 1 + LEGO1/mxvideomanager.h | 2 +- 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/LEGO1/legovideomanager.cpp b/LEGO1/legovideomanager.cpp index 4105ef2a..ca7926b9 100644 --- a/LEGO1/legovideomanager.cpp +++ b/LEGO1/legovideomanager.cpp @@ -1,5 +1,6 @@ #include "legovideomanager.h" -#include + +DECOMP_SIZE_ASSERT(LegoVideoManager, 0x590); // OFFSET: LEGO1 0x1007aa20 STUB LegoVideoManager::LegoVideoManager() @@ -39,20 +40,32 @@ void LegoVideoManager::EnableFullScreenMovie(MxBool p_enable, MxBool p_scale) // TODO } -// OFFSET: LEGO1 0x1007b6a0 STUB -void LegoVideoManager::MoveCursor(int x, int y) +// OFFSET: LEGO1 0x1007b6a0 +void LegoVideoManager::MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY) { - // TODO + m_cursorX = p_cursorX; + m_cursorY = p_cursorY; + m_cursorMoved = TRUE; + + if (623 < p_cursorX) + m_cursorX = 623; + + if (463 < p_cursorY) + m_cursorY = 463; } // OFFSET: LEGO1 0x1007c440 -void LegoVideoManager::SetSkyColor(float red, float green, float blue) +void LegoVideoManager::SetSkyColor(float p_red, float p_green, float p_blue) { - PALETTEENTRY colorStrucure; // [esp+0h] [ebp-4h] BYREF + PALETTEENTRY colorStrucure; - colorStrucure.peRed = (red* 255.0); - colorStrucure.peGreen = (green * 255.0); - colorStrucure.peBlue = (blue * 255.0); + colorStrucure.peRed = (p_red * 255.0f); + colorStrucure.peGreen = (p_green * 255.0f); + colorStrucure.peBlue = (p_blue * 255.0f); colorStrucure.peFlags = -124; - // TODO + m_videoParam.GetPalette()->SetSkyColor(&colorStrucure); + m_videoParam.GetPalette()->SetOverrideSkyColor(TRUE); + + // TODO 3d manager + //m_3dManager->m_pViewport->vtable1c(red, green, blue) } diff --git a/LEGO1/legovideomanager.h b/LEGO1/legovideomanager.h index 4ff8491b..cc051f16 100644 --- a/LEGO1/legovideomanager.h +++ b/LEGO1/legovideomanager.h @@ -6,6 +6,8 @@ #include "lego3dmanager.h" #include "decomp.h" +#include + // VTABLE 0x100d9c88 // SIZE 0x590 class LegoVideoManager : public MxVideoManager @@ -24,7 +26,10 @@ class LegoVideoManager : public MxVideoManager inline MxDirect3D *GetDirect3D() { return this->m_direct3d; } void SetSkyColor(float r, float g, float b); - inline void SetUnkE4(MxBool p_value) { this->m_unke4 = p_value; } + inline void SetUnkE4(MxBool p_unk0xe4) { this->m_unk0xe4 = p_unk0xe4; } + + // OFFSET: LEGO1 0x1007c4c0 + void OverrideSkyColor(MxBool p_shouldOverride) { this->m_videoParam.GetPalette()->SetOverrideSkyColor(p_shouldOverride);} private: undefined4 m_unk64; @@ -32,8 +37,14 @@ class LegoVideoManager : public MxVideoManager undefined4 m_unk6c; undefined4 m_unk70; MxDirect3D *m_direct3d; - undefined m_pad78[0x6c]; - MxBool m_unke4; + undefined m_pad0x78[0x6c]; + MxBool m_unk0xe4; + undefined m_pad0xe8[0x41c]; + MxBool m_cursorMoved; // 0x501 + undefined m_pad0x502[0x8]; + MxS32 m_cursorX; // 0x50c + MxS32 m_cursorY; // 0x510 + undefined m_pad0x514[0x7c]; }; #endif // LEGOVIDEOMANAGER_H diff --git a/LEGO1/mxpalette.h b/LEGO1/mxpalette.h index b024330a..7c9568b1 100644 --- a/LEGO1/mxpalette.h +++ b/LEGO1/mxpalette.h @@ -26,6 +26,7 @@ class MxPalette : public MxCore MxResult SetSkyColor(LPPALETTEENTRY p_sky_color); void Reset(MxBool p_ignoreSkyColor); LPDIRECTDRAWPALETTE CreateNativePalette(); + inline void SetOverrideSkyColor(MxBool p_value) { this->m_overrideSkyColor = p_value; } private: LPDIRECTDRAWPALETTE m_palette; PALETTEENTRY m_entries[256]; // 0xc diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index d72c1d10..f6e1a726 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -29,7 +29,7 @@ class MxVideoManager : public MxMediaManager inline MxVideoParam& GetVideoParam() { return this->m_videoParam; } inline LPDIRECTDRAW GetDirectDraw() { return this->m_pDirectDraw; } inline MxDisplaySurface *GetDisplaySurface() { return this->m_displaySurface; } -private: +protected: MxVideoParam m_videoParam; LPDIRECTDRAW m_pDirectDraw; LPDIRECTDRAWSURFACE m_pDDSurface; From d82649c6f06817f01098ef0c93a9adbbca519149 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 8 Oct 2023 16:41:34 -0400 Subject: [PATCH 22/22] MxStream provider and controller vtables (#191) * MxStreamProvider and MxRamStreamProvider vtable * Update mxramstreamprovider.h * Match IsA * Fixes, improvements --------- Co-authored-by: Christian Semmler --- CMakeLists.txt | 2 ++ ISLE/isleapp.cpp | 4 +-- LEGO1/mxramstreamcontroller.cpp | 22 ++++++++++++ LEGO1/mxramstreamcontroller.h | 17 ++++++++++ LEGO1/mxramstreamprovider.cpp | 59 +++++++++++++++++++++++++++++++++ LEGO1/mxramstreamprovider.h | 15 +++++++++ LEGO1/mxstreamcontroller.cpp | 27 ++++++++++++++- LEGO1/mxstreamcontroller.h | 12 +++++-- LEGO1/mxstreamer.cpp | 4 +-- LEGO1/mxstreamprovider.cpp | 17 ++++++++++ LEGO1/mxstreamprovider.h | 14 +++++--- 11 files changed, 181 insertions(+), 12 deletions(-) create mode 100644 LEGO1/mxramstreamprovider.cpp create mode 100644 LEGO1/mxstreamprovider.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a3573874..2e0fed5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -154,6 +154,7 @@ add_library(lego1 SHARED LEGO1/mxpresenter.cpp LEGO1/mxpresenterlist.cpp LEGO1/mxramstreamcontroller.cpp + LEGO1/mxramstreamprovider.cpp LEGO1/mxscheduler.cpp LEGO1/mxsemaphore.cpp LEGO1/mxsmkpresenter.cpp @@ -162,6 +163,7 @@ add_library(lego1 SHARED LEGO1/mxstillpresenter.cpp LEGO1/mxstreamcontroller.cpp LEGO1/mxstreamer.cpp + LEGO1/mxstreamprovider.cpp LEGO1/mxstring.cpp LEGO1/mxstringlist.cpp LEGO1/mxthread.cpp diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 503a7128..803ef45e 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -734,7 +734,7 @@ inline void IsleApp::Tick(BOOL sleepIfNotNextFrame) return; } - ds.SetAtomId(stream->atom); + ds.SetAtomId(stream->GetAtom()); ds.SetUnknown24(-1); ds.SetObjectId(0); VideoManager()->EnableFullScreenMovie(TRUE, TRUE); @@ -743,7 +743,7 @@ inline void IsleApp::Tick(BOOL sleepIfNotNextFrame) return; } } else { - ds.SetAtomId(stream->atom); + ds.SetAtomId(stream->GetAtom()); ds.SetUnknown24(-1); ds.SetObjectId(0); if (Start(&ds) != SUCCESS) { diff --git a/LEGO1/mxramstreamcontroller.cpp b/LEGO1/mxramstreamcontroller.cpp index a96046a0..9796b05a 100644 --- a/LEGO1/mxramstreamcontroller.cpp +++ b/LEGO1/mxramstreamcontroller.cpp @@ -1,3 +1,25 @@ #include "mxramstreamcontroller.h" +#include "mxramstreamprovider.h" DECOMP_SIZE_ASSERT(MxRAMStreamController, 0x98); + +// OFFSET: LEGO1 0x100c6110 STUB +MxResult MxRAMStreamController::Open(const char *p_filename) +{ + // TODO STUB + return FAILURE; +} + +// OFFSET: LEGO1 0x100c6210 STUB +MxResult MxRAMStreamController::vtable0x20(MxDSAction* p_action) +{ + // TODO STUB + return FAILURE; +} + +// OFFSET: LEGO1 0x100c6320 STUB +MxResult MxRAMStreamController::vtable0x24(undefined4 p_unknown) +{ + // TODO STUB + return FAILURE; +} diff --git a/LEGO1/mxramstreamcontroller.h b/LEGO1/mxramstreamcontroller.h index 563d9cb6..62587bca 100644 --- a/LEGO1/mxramstreamcontroller.h +++ b/LEGO1/mxramstreamcontroller.h @@ -11,6 +11,23 @@ class MxRAMStreamController : public MxStreamController public: inline MxRAMStreamController() {} + // OFFSET: LEGO1 0x100b9430 + inline virtual const char *ClassName() const override // vtable+0xc + { + // 0x10102130 + return "MxRAMStreamController"; + } + + // OFFSET: LEGO1 0x100b9440 + inline virtual MxBool IsA(const char *name) const override // vtable+0x10 + { + return !strcmp(name, MxRAMStreamController::ClassName()) || !strcmp(name, MxStreamController::ClassName()) || MxCore::IsA(name); + } + + virtual MxResult Open(const char *p_filename) override; + virtual MxResult vtable0x20(MxDSAction* p_action) override; + virtual MxResult vtable0x24(undefined4 p_unknown) override; + private: MxDSBuffer m_buffer; diff --git a/LEGO1/mxramstreamprovider.cpp b/LEGO1/mxramstreamprovider.cpp new file mode 100644 index 00000000..9b052699 --- /dev/null +++ b/LEGO1/mxramstreamprovider.cpp @@ -0,0 +1,59 @@ +#include "mxramstreamprovider.h" +#include "decomp.h" + +DECOMP_SIZE_ASSERT(MxRAMStreamProvider, 0x24); + +// OFFSET: LEGO1 0x100d0730 +MxRAMStreamProvider::MxRAMStreamProvider() +{ + m_bufferSize = 0; + m_fileSize = 0; + m_pBufferOfFileSize = NULL; + m_lengthInDWords = 0; + m_bufferForDWords = NULL; +} + +// OFFSET: LEGO1 0x100d0a50 +MxRAMStreamProvider::~MxRAMStreamProvider() +{ + m_bufferSize = 0; + m_fileSize = 0; + + free(m_pBufferOfFileSize); + m_pBufferOfFileSize = NULL; + + m_lengthInDWords = 0; + + free(m_bufferForDWords); + m_bufferForDWords = NULL; +} + +// OFFSET: LEGO1 0x100d0ae0 STUB +MxResult MxRAMStreamProvider::SetResourceToGet(void* p_resource) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100d0930 +MxU32 MxRAMStreamProvider::GetFileSize() +{ + return m_fileSize; +} + +// OFFSET: LEGO1 0x100d0940 +MxU32 MxRAMStreamProvider::vtable0x1C() +{ + return 1; +} + +// OFFSET: LEGO1 0x100d0950 +MxU32 MxRAMStreamProvider::GetLengthInDWords() +{ + return m_lengthInDWords; +} + +// OFFSET: LEGO1 0x100d0960 +void* MxRAMStreamProvider::GetBufferForDWords() +{ + return m_bufferForDWords; +} diff --git a/LEGO1/mxramstreamprovider.h b/LEGO1/mxramstreamprovider.h index 5422d3b3..4a22b013 100644 --- a/LEGO1/mxramstreamprovider.h +++ b/LEGO1/mxramstreamprovider.h @@ -6,7 +6,22 @@ // VTABLE 0x100dd0d0 class MxRAMStreamProvider : public MxStreamProvider { +public: + MxRAMStreamProvider(); + virtual ~MxRAMStreamProvider() override; + + virtual MxResult SetResourceToGet(void* p_resource) override; //vtable+0x14 + virtual MxU32 GetFileSize() override; //vtable+0x18 + virtual MxU32 vtable0x1C() override; //vtable+0x1c + virtual MxU32 GetLengthInDWords() override; //vtable+0x24 + virtual void* GetBufferForDWords() override; //vtable+0x28 +protected: + MxU32 m_bufferSize; + MxU32 m_fileSize; + void* m_pBufferOfFileSize; + MxU32 m_lengthInDWords; + void* m_bufferForDWords; }; #endif // MXRAMSTREAMPROVIDER_H diff --git a/LEGO1/mxstreamcontroller.cpp b/LEGO1/mxstreamcontroller.cpp index 83917cd4..36b85ebc 100644 --- a/LEGO1/mxstreamcontroller.cpp +++ b/LEGO1/mxstreamcontroller.cpp @@ -46,8 +46,33 @@ MxResult MxStreamController::vtable0x1C(undefined4 p_unknown, undefined4 p_unkno } // OFFSET: LEGO1 0x100c1690 STUB -MxResult MxStreamController::vtable0x20(MxDSAction* action) +MxResult MxStreamController::vtable0x20(MxDSAction* p_action) { // TODO STUB return FAILURE; } + +// OFFSET: LEGO1 0x100c1740 STUB +MxResult MxStreamController::vtable0x24(undefined4 p_unknown) +{ + // TODO STUB + return FAILURE; +} + +// OFFSET: LEGO1 0x100b9420 +MxResult MxStreamController::vtable0x28() +{ + return SUCCESS; +} + +// OFFSET: LEGO1 0x100c1c10 STUB +MxResult MxStreamController::vtable0x2c(undefined4 p_unknown1, undefined4 p_unknow2) +{ + return FAILURE; +} + +// OFFSET: LEGO1 0x100c1ce0 STUB +MxResult MxStreamController::vtable0x30(undefined4 p_unknown) +{ + return FAILURE; +} diff --git a/LEGO1/mxstreamcontroller.h b/LEGO1/mxstreamcontroller.h index 0f459ed0..59490d2c 100644 --- a/LEGO1/mxstreamcontroller.h +++ b/LEGO1/mxstreamcontroller.h @@ -33,14 +33,20 @@ class MxStreamController : public MxCore virtual MxResult Open(const char *p_filename); // vtable+0x14 virtual MxResult vtable0x18(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x18 virtual MxResult vtable0x1C(undefined4 p_unknown, undefined4 p_unknown2); //vtable+0x1c - virtual MxResult vtable0x20(MxDSAction* action); //vtable+0x20 + virtual MxResult vtable0x20(MxDSAction* p_action); //vtable+0x20 + virtual MxResult vtable0x24(undefined4 p_unknown); //vtable+0x24 + virtual MxResult vtable0x28(); //vtable+0x28 + virtual MxResult vtable0x2c(undefined4 p_unknown1, undefined4 p_unknow2); //vtable+0x2c + virtual MxResult vtable0x30(undefined4 p_unknown); //vtable+0x30 MxBool FUN_100c20d0(MxDSObject &p_obj); + inline MxAtomId &GetAtom() { return atom; }; +protected: MxCriticalSection m_criticalSection; MxAtomId atom; - int m_unk28; - int m_unk2c; + undefined4 m_unk28; // MxStreamProvider* + undefined4 m_unk2c; undefined m_unk30[0x34]; }; diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index c6ef85bd..8e7cc231 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -80,7 +80,7 @@ MxLong MxStreamer::Close(const char *p) for (list::iterator it = m_openStreams.begin(); it != m_openStreams.end(); it++) { MxStreamController *c = *it; - if (!p || !strcmp(p, c->atom.GetInternal())) { + if (!p || !strcmp(p, c->GetAtom().GetInternal())) { m_openStreams.erase(it); if (!c->FUN_100c20d0(ds)) { @@ -109,7 +109,7 @@ MxStreamController *MxStreamer::GetOpenStream(const char *p_name) { for (list::iterator it = m_openStreams.begin(); it != m_openStreams.end(); it++) { MxStreamController *c = *it; - MxAtomId &atom = c->atom; + MxAtomId &atom = c->GetAtom(); if (p_name) { if (!strcmp(atom.GetInternal(), p_name)) { return *it; diff --git a/LEGO1/mxstreamprovider.cpp b/LEGO1/mxstreamprovider.cpp new file mode 100644 index 00000000..c9dab949 --- /dev/null +++ b/LEGO1/mxstreamprovider.cpp @@ -0,0 +1,17 @@ +#include "decomp.h" +#include "mxstreamprovider.h" + +DECOMP_SIZE_ASSERT(MxStreamProvider, 0x10); + +// OFFSET: LEGO1 0x100d07c0 +MxResult MxStreamProvider::SetResourceToGet(void* p_resource) +{ + m_pLookup = p_resource; + return SUCCESS; +} + +// OFFSET: LEGO1 0x100d07d0 +void MxStreamProvider::vtable0x20(undefined4 p_unknown1) +{ + +} diff --git a/LEGO1/mxstreamprovider.h b/LEGO1/mxstreamprovider.h index 2daf75ab..3cb11144 100644 --- a/LEGO1/mxstreamprovider.h +++ b/LEGO1/mxstreamprovider.h @@ -1,17 +1,16 @@ #ifndef MXSTREAMPROVIDER_H #define MXSTREAMPROVIDER_H +#include "decomp.h" #include "mxcore.h" #include "mxdsfile.h" // VTABLE 0x100dd100 +// SIZE 0x10 class MxStreamProvider : public MxCore { public: - inline MxStreamProvider() { - this->m_pLookup = NULL; - this->m_pFile = NULL; - } + inline MxStreamProvider() : m_pLookup(NULL), m_pFile(NULL) {} // OFFSET: LEGO1 0x100d07e0 inline virtual const char *ClassName() const override // vtable+0x0c @@ -25,6 +24,13 @@ class MxStreamProvider : public MxCore return !strcmp(name, MxStreamProvider::ClassName()) || MxCore::IsA(name); } + virtual MxResult SetResourceToGet(void* p_resource); //vtable+0x14 + virtual MxU32 GetFileSize() = 0; //vtable+0x18 + virtual MxU32 vtable0x1C() = 0; //vtable+0x1c + virtual void vtable0x20(undefined4 p_unknown1); //vtable+0x20 + virtual MxU32 GetLengthInDWords() = 0; //vtable+0x24 + virtual void* GetBufferForDWords() = 0; //vtable+0x28 + protected: void *m_pLookup; MxDSFile* m_pFile;