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/mxomni.cpp b/LEGO1/mxomni.cpp index c4d6d471..39c2beb3 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" @@ -11,6 +11,7 @@ #include "mxticklemanager.h" #include "mxtimer.h" #include "mxvideomanager.h" +#include "mxautolocker.h" // 0x101015b8 char g_hdPath[1024]; @@ -172,7 +173,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()) { @@ -180,7 +196,7 @@ MxResult MxOmni::Create(MxOmniCreateParam &p) this->m_variableTable = variableTable; if (variableTable == NULL) - return FAILURE; + goto failure; } if (p.CreateFlags().CreateTimer()) @@ -192,7 +208,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 @@ -238,8 +334,24 @@ void MxOmni::Destroy() // OFFSET: LEGO1 0x100b07f0 MxLong MxOmni::Notify(MxParam &p) { - // FIXME: Stub - return 0; + MxAutoLocker lock(&this->m_criticalsection); + MxLong result; + if (p.GetType() == 2) + { + result = HandleNotificationType2(p); + } + else + { + result = 0; + } + return result; +} + +// OFFSET: LEGO1 0x100b0880 STUB +MxLong MxOmni::HandleNotificationType2(MxParam& p_param) +{ + // TODO STUB + return FAILURE; } // OFFSET: LEGO1 0x100acea0 diff --git a/LEGO1/mxomni.h b/LEGO1/mxomni.h index 585068ce..4475148f 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; } + MxLong 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/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index 466843e3..c858226b 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, undefined 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..4a6ba5f8 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -14,6 +14,9 @@ class MxSoundManager : public MxAudioManager MxSoundManager(); virtual ~MxSoundManager() override; // vtable+0x0 + virtual MxResult StartDirectSound(undefined4 p_unknown1, undefined p_unknown2); //vtable+0x30 + virtual void vtable0x34(); // vtable+0x34 + virtual void vtable0x38(); // vtable+0x38 private: void Init(); void Destroy(MxBool); 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/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..0fca2fd1 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -14,6 +14,8 @@ class MxVideoManager : public MxMediaManager virtual ~MxVideoManager(); virtual MxResult Tickle(); // 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