diff --git a/CMakeLists.txt b/CMakeLists.txt index ce8774aa..da3e31a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -159,6 +159,7 @@ add_library(lego1 SHARED LEGO1/mxpresenterlist.cpp LEGO1/mxramstreamcontroller.cpp LEGO1/mxramstreamprovider.cpp + LEGO1/mxregion.cpp LEGO1/mxscheduler.cpp LEGO1/mxsemaphore.cpp LEGO1/mxsmkpresenter.cpp diff --git a/LEGO1/mxeventmanager.cpp b/LEGO1/mxeventmanager.cpp index e06f80af..9f9e8779 100644 --- a/LEGO1/mxeventmanager.cpp +++ b/LEGO1/mxeventmanager.cpp @@ -37,29 +37,28 @@ void MxEventManager::Destroy(MxBool p_fromDestructor) } // OFFSET: LEGO1 0x100c04a0 -MxResult MxEventManager::CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister) +MxResult MxEventManager::Create(MxU32 p_frequencyMS, MxBool p_createThread) { MxResult status = FAILURE; MxBool locked = FALSE; MxResult result = MxMediaManager::InitPresenters(); if (result == SUCCESS) { - if (p_noRegister) { + if (p_createThread) { 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; - } + if (!this->m_thread || this->m_thread->Start(0, 0) != SUCCESS) + goto done; } - else { + else TickleManager()->RegisterClient(this, p_frequencyMS); - status = SUCCESS; - } + + status = SUCCESS; } +done: if (status != SUCCESS) Destroy(); diff --git a/LEGO1/mxeventmanager.h b/LEGO1/mxeventmanager.h index 0dd18844..acf4d417 100644 --- a/LEGO1/mxeventmanager.h +++ b/LEGO1/mxeventmanager.h @@ -13,7 +13,7 @@ class MxEventManager : public MxMediaManager virtual ~MxEventManager() override; virtual void Destroy() override; // vtable+18 - virtual MxResult CreateEventThread(MxU32 p_frequencyMS, MxBool p_noRegister); // vtable+28 + virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); // vtable+28 private: void Init(); diff --git a/LEGO1/mxmusicmanager.cpp b/LEGO1/mxmusicmanager.cpp index c1488f43..e481ec8e 100644 --- a/LEGO1/mxmusicmanager.cpp +++ b/LEGO1/mxmusicmanager.cpp @@ -120,44 +120,32 @@ void MxMusicManager::SetVolume(MxS32 p_volume) } // OFFSET: LEGO1 0x100c0840 -MxResult MxMusicManager::StartMIDIThread(MxU32 p_frequencyMS, MxBool p_noRegister) +MxResult MxMusicManager::Create(MxU32 p_frequencyMS, MxBool p_createThread) { MxResult status = FAILURE; MxBool locked = FALSE; - MxResult result = MxAudioManager::InitPresenters(); - if (result == SUCCESS) - { - if (p_noRegister) - { + if (MxAudioManager::InitPresenters() == SUCCESS) { + if (p_createThread) { m_criticalSection.Enter(); locked = TRUE; m_thread = new MxTickleThread(this, p_frequencyMS); - if (m_thread) - { - if (m_thread->Start(0, 0) == SUCCESS) - { - status = SUCCESS; - } - } + if (!m_thread || m_thread->Start(0, 0) != SUCCESS) + goto done; } else - { TickleManager()->RegisterClient(this, p_frequencyMS); - status = SUCCESS; - } + + status = SUCCESS; } +done: if (status != SUCCESS) - { Destroy(); - } if (locked) - { m_criticalSection.Leave(); - } return status; } \ No newline at end of file diff --git a/LEGO1/mxmusicmanager.h b/LEGO1/mxmusicmanager.h index b46c8878..96031104 100644 --- a/LEGO1/mxmusicmanager.h +++ b/LEGO1/mxmusicmanager.h @@ -14,7 +14,7 @@ class MxMusicManager : public MxAudioManager 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 + virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); // vtable+30 inline MxBool GetMIDIInitialized() { return m_MIDIInitialized; } diff --git a/LEGO1/mxnotificationmanager.cpp b/LEGO1/mxnotificationmanager.cpp index 017df73d..e241789e 100644 --- a/LEGO1/mxnotificationmanager.cpp +++ b/LEGO1/mxnotificationmanager.cpp @@ -72,7 +72,7 @@ MxResult MxNotificationManager::Tickle() } // OFFSET: LEGO1 0x100ac600 -MxResult MxNotificationManager::Create(MxS32 p_unk1, MxS32 p_unk2) +MxResult MxNotificationManager::Create(MxU32 p_frequencyMS, MxBool p_createThread) { MxResult result = SUCCESS; m_queue = new MxNotificationPtrList(); diff --git a/LEGO1/mxnotificationmanager.h b/LEGO1/mxnotificationmanager.h index 89908871..adcd6876 100644 --- a/LEGO1/mxnotificationmanager.h +++ b/LEGO1/mxnotificationmanager.h @@ -45,7 +45,7 @@ class MxNotificationManager : public MxCore virtual MxResult Tickle(); // vtable+0x8 // TODO: Where does this method come from? - virtual MxResult Create(MxS32 p_unk1, MxS32 p_unk2); // vtable+0x14 + virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); // vtable+0x14 void Register(MxCore *p_listener); void Unregister(MxCore *p_listener); MxResult Send(MxCore *p_listener, MxNotificationParam *p_param); diff --git a/LEGO1/mxomni.cpp b/LEGO1/mxomni.cpp index 43b9578a..88e4bf02 100644 --- a/LEGO1/mxomni.cpp +++ b/LEGO1/mxomni.cpp @@ -189,119 +189,87 @@ void MxOmni::SetInstance(MxOmni *instance) MxResult MxOmni::Create(MxOmniCreateParam &p) { MxResult result = FAILURE; - m_atomIdCounterSet = new MxAtomIdCounterSet(); - if (m_atomIdCounterSet == NULL) - { - goto failure; - } + + if (!(m_atomIdCounterSet = new MxAtomIdCounterSet())) + goto done; + 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().CreateObjectFactory()) { + if (!(m_objectFactory = new MxObjectFactory())) + goto done; } - if (p.CreateFlags().CreateVariableTable()) - { - MxVariableTable *variableTable = new MxVariableTable(); - this->m_variableTable = variableTable; - - if (variableTable == NULL) - goto failure; + if (p.CreateFlags().CreateVariableTable()) { + if (!(m_variableTable = new MxVariableTable())) + goto done; } - if (p.CreateFlags().CreateTimer()) - { - MxTimer *timer = new MxTimer(); - this->m_timer = timer; - - if (timer == NULL) - return FAILURE; + if (p.CreateFlags().CreateTimer()) { + if (!(m_timer = new MxTimer())) + goto done; } - if (p.CreateFlags().CreateTickleManager()) - { - this->m_tickleManager = new MxTickleManager(); - - if (m_tickleManager == NULL) - goto failure; + if (p.CreateFlags().CreateTickleManager()) { + if (!(m_tickleManager = new MxTickleManager())) + goto done; } - 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().CreateNotificationManager()) { + if (m_notificationManager = new MxNotificationManager()) { + if (m_notificationManager->Create(100, 0) != SUCCESS) + goto done; + } + else + goto done; } - if (p.CreateFlags().CreateStreamer()) - { - MxStreamer *streamer = new MxStreamer(); - this->m_streamer = streamer; - - if (streamer == NULL || streamer->Init() != SUCCESS) - goto failure; + if (p.CreateFlags().CreateStreamer()) { + if (!(m_streamer = new MxStreamer()) || m_streamer->Create() != SUCCESS) + goto done; } - 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().CreateVideoManager()) { + if (m_videoManager = new MxVideoManager()) { + if (m_videoManager->Create(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().CreateSoundManager()) { + if (m_soundManager = new MxSoundManager()) { + if (m_soundManager->Create(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().CreateMusicManager()) { + if (m_musicManager = new MxMusicManager()) { + if (m_musicManager->Create(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->CreateEventThread(50, 0) != SUCCESS) - { - delete m_eventManager; - m_eventManager = NULL; + if (p.CreateFlags().CreateEventManager()) { + if (m_eventManager = new MxEventManager()) { + if (m_eventManager->Create(50, 0) != SUCCESS) { + delete m_eventManager; + m_eventManager = NULL; + } } } result = SUCCESS; - failure: +done: if (result != SUCCESS) - { Destroy(); - } return result; } diff --git a/LEGO1/mxomnicreateparam.h b/LEGO1/mxomnicreateparam.h index d4984b24..ec8a3de1 100644 --- a/LEGO1/mxomnicreateparam.h +++ b/LEGO1/mxomnicreateparam.h @@ -14,7 +14,7 @@ class MxOmniCreateParam : public MxParam __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 MxString& GetMediaPath() const { return m_mediaPath; } const HWND GetWindowHandle() const { return m_windowHandle; } MxVideoParam& GetVideoParam() { return m_videoParam; } diff --git a/LEGO1/mxregion.cpp b/LEGO1/mxregion.cpp new file mode 100644 index 00000000..8b275e24 --- /dev/null +++ b/LEGO1/mxregion.cpp @@ -0,0 +1,39 @@ +#include "mxregion.h" + +DECOMP_SIZE_ASSERT(MxRegion, 0x1c); + +// OFFSET: LEGO1 0x100c31c0 STUB +MxRegion::MxRegion() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c3690 STUB +MxRegion::~MxRegion() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c3700 STUB +void MxRegion::Reset() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c3750 STUB +void MxRegion::vtable18() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c3e20 STUB +void MxRegion::vtable1c() +{ + // TODO +} + +// OFFSET: LEGO1 0x100c3660 STUB +void MxRegion::vtable20() +{ + // TODO +} \ No newline at end of file diff --git a/LEGO1/mxregion.h b/LEGO1/mxregion.h index 717be924..92493c32 100644 --- a/LEGO1/mxregion.h +++ b/LEGO1/mxregion.h @@ -2,6 +2,7 @@ #define MXREGION_H #include "mxcore.h" +#include "decomp.h" // VTABLE 0x100dcae8 // SIZE 0x1c @@ -21,6 +22,7 @@ class MxRegion : public MxCore // MxList *m_rects; // 4 coordinates (could be MxRect32) // MxS32 left, top, right, bottom; + undefined pad[0x14]; }; #endif // MXREGION_H diff --git a/LEGO1/mxsoundmanager.cpp b/LEGO1/mxsoundmanager.cpp index b3a23e3b..51336843 100644 --- a/LEGO1/mxsoundmanager.cpp +++ b/LEGO1/mxsoundmanager.cpp @@ -49,9 +49,9 @@ void MxSoundManager::Destroy(MxBool p_fromDestructor) } // OFFSET: LEGO1 0x100ae8b0 STUB -MxResult MxSoundManager::StartDirectSound(undefined4 p_unknown1, MxBool p_unknown2) +MxResult MxSoundManager::Create(MxU32 p_frequencyMS, MxBool p_createThread) { - // TODO STUB + // TODO return FAILURE; } diff --git a/LEGO1/mxsoundmanager.h b/LEGO1/mxsoundmanager.h index 8cbe862c..3bd41085 100644 --- a/LEGO1/mxsoundmanager.h +++ b/LEGO1/mxsoundmanager.h @@ -14,7 +14,7 @@ class MxSoundManager : public MxAudioManager MxSoundManager(); virtual ~MxSoundManager() override; // vtable+0x0 - virtual MxResult StartDirectSound(undefined4 p_unknown1, MxBool p_unknown2); //vtable+0x30 + virtual MxResult Create(MxU32 p_frequencyMS, MxBool p_createThread); //vtable+0x30 virtual void vtable0x34(); // vtable+0x34 virtual void vtable0x38(); // vtable+0x38 diff --git a/LEGO1/mxstreamer.cpp b/LEGO1/mxstreamer.cpp index e95e4558..84d1b7b9 100644 --- a/LEGO1/mxstreamer.cpp +++ b/LEGO1/mxstreamer.cpp @@ -16,7 +16,7 @@ MxStreamer::MxStreamer() } // OFFSET: LEGO1 0x100b9190 -MxResult MxStreamer::Init() +MxResult MxStreamer::Create() { undefined *b = new undefined[m_subclass1.GetSize() * 0x5800]; m_subclass1.SetBuffer(b); diff --git a/LEGO1/mxstreamer.h b/LEGO1/mxstreamer.h index 529a564a..b5d86e4d 100644 --- a/LEGO1/mxstreamer.h +++ b/LEGO1/mxstreamer.h @@ -90,7 +90,7 @@ class MxStreamer : public MxCore return !strcmp(p_name, MxStreamer::ClassName()) || MxCore::IsA(p_name); } - virtual MxResult Init(); // vtable+0x14 + virtual MxResult Create(); // vtable+0x14 MxStreamController *GetOpenStream(const char *p_name); diff --git a/LEGO1/mxstring.cpp b/LEGO1/mxstring.cpp index fe221f94..e0c34a8a 100644 --- a/LEGO1/mxstring.cpp +++ b/LEGO1/mxstring.cpp @@ -56,7 +56,7 @@ void MxString::ToLowerCase() } // OFFSET: LEGO1 0x100ae4b0 -MxString &MxString::operator=(MxString ¶m) +MxString &MxString::operator=(const MxString ¶m) { if (this->m_data != param.m_data) { diff --git a/LEGO1/mxstring.h b/LEGO1/mxstring.h index ec20f879..c1f8498a 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=(const MxString &); MxString operator+(const char *); MxString& operator+=(const char *); diff --git a/LEGO1/mxticklemanager.h b/LEGO1/mxticklemanager.h index cc7b6282..f0aad4cb 100644 --- a/LEGO1/mxticklemanager.h +++ b/LEGO1/mxticklemanager.h @@ -53,14 +53,13 @@ class MxTickleClient MxU16 m_flags; // 0xc }; -class MxTickleClientPtrList : public list -{}; +typedef list MxTickleClientPtrList; // VTABLE 0x100d86d8 class MxTickleManager : public MxCore { public: - inline MxTickleManager() : MxCore(), m_clients() {} + inline MxTickleManager() {} virtual ~MxTickleManager(); // vtable+0x0 (scalar deleting destructor) virtual MxResult Tickle(); // vtable+0x8 diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index 9d3a7136..0b62039a 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -347,7 +347,6 @@ void MxTransitionManager::Transition_Pixelation() } - // OFFSET: LEGO1 0x1004c270 void MxTransitionManager::Transition_Windows() { @@ -395,10 +394,29 @@ void MxTransitionManager::Transition_Windows() } } -// OFFSET: LEGO1 0x1004c3e0 STUB +// OFFSET: LEGO1 0x1004c3e0 void MxTransitionManager::Transition_Broken() { - // TODO + // This function has no actual animation logic. + // It also never calls EndTransition to + // properly terminate the transition, so + // the game just hangs forever. + + DDSURFACEDESC ddsd; + ZeroMemory(&ddsd, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + HRESULT res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); + if (res == DDERR_SURFACELOST) { + m_ddSurface->Restore(); + res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); + } + + if (res == DD_OK) { + SubmitCopyRect(&ddsd); + SetupCopyRect(&ddsd); + m_ddSurface->Unlock(ddsd.lpSurface); + } } // OFFSET: LEGO1 0x1004c170 diff --git a/LEGO1/mxvideomanager.cpp b/LEGO1/mxvideomanager.cpp index 44a04169..73867e93 100644 --- a/LEGO1/mxvideomanager.cpp +++ b/LEGO1/mxvideomanager.cpp @@ -139,7 +139,7 @@ void MxVideoManager::InvalidateRect(MxRect32 &p_rect) } // OFFSET: LEGO1 0x100bebe0 -MxLong MxVideoManager::RealizePalette(MxPalette *p_palette) +MxResult MxVideoManager::RealizePalette(MxPalette *p_palette) { PALETTEENTRY paletteEntries[256]; @@ -152,17 +152,149 @@ MxLong MxVideoManager::RealizePalette(MxPalette *p_palette) } this->m_criticalSection.Leave(); - return 0; + return SUCCESS; } -// OFFSET: LEGO1 0x100be600 STUB -void MxVideoManager::vtable0x28() +// OFFSET: LEGO1 0x100be600 +MxResult MxVideoManager::vtable0x28( + MxVideoParam &p_videoParam, + LPDIRECTDRAW p_pDirectDraw, + LPDIRECTDRAWSURFACE p_pDDSurface, + LPDIRECTDRAWSURFACE p_ddSurface1, + LPDIRECTDRAWSURFACE p_ddSurface2, + LPDIRECTDRAWCLIPPER p_ddClipper, + MxU32 p_frequencyMS, + MxBool p_createThread) { + MxBool locked = FALSE; + MxResult status = FAILURE; + m_unk60 = FALSE; + + if (MxMediaManager::InitPresenters() != SUCCESS) + goto done; + + m_criticalSection.Enter(); + locked = TRUE; + + m_videoParam = p_videoParam; + m_region = new MxRegion(); + + if (!m_region) + goto done; + + m_pDirectDraw = p_pDirectDraw; + m_pDDSurface = p_pDDSurface; + + MxPalette *palette; + if (p_videoParam.GetPalette() == NULL) { + palette = new MxPalette(); + m_videoParam.SetPalette(palette); + + if (!palette) + goto done; + } + else { + palette = p_videoParam.GetPalette()->Clone(); + m_videoParam.SetPalette(palette); + + if (!palette) + goto done; + } + + m_displaySurface = new MxDisplaySurface(); + if (m_displaySurface && m_displaySurface->Init(m_videoParam, p_ddSurface1, p_ddSurface2, p_ddClipper) == SUCCESS) { + m_displaySurface->SetPalette(m_videoParam.GetPalette()); + + if (p_createThread) { + m_thread = new MxTickleThread(this, p_frequencyMS); + + if (!m_thread || m_thread->Start(0, 0) != SUCCESS) + goto done; + } + else + TickleManager()->RegisterClient(this, p_frequencyMS); + + status = SUCCESS; + } + +done: + if (status != SUCCESS) + Destroy(); + + if (locked) + m_criticalSection.Leave(); + + return status; } -// OFFSET: LEGO1 0x100bebe0 STUB -MxResult MxVideoManager::vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unknown1, MxU8 p_unknown2) +// OFFSET: LEGO1 0x100be820 +MxResult MxVideoManager::Create( + MxVideoParam &p_videoParam, + MxU32 p_frequencyMS, + MxBool p_createThread) { - return FAILURE; + MxBool locked = FALSE; + MxResult status = FAILURE; + + m_unk60 = TRUE; + + if (MxMediaManager::InitPresenters() != SUCCESS) + goto done; + + m_criticalSection.Enter(); + locked = TRUE; + + m_videoParam = p_videoParam; + m_region = new MxRegion(); + + if (!m_region) + goto done; + + if (DirectDrawCreate(NULL, &m_pDirectDraw, NULL) != DD_OK) + goto done; + + if (m_pDirectDraw->SetCooperativeLevel(MxOmni::GetInstance()->GetWindowHandle(), DDSCL_NORMAL) != DD_OK) + goto done; + + MxPalette *palette; + if (p_videoParam.GetPalette() == NULL) { + palette = new MxPalette(); + m_videoParam.SetPalette(palette); + + if (!palette) + goto done; + } + else { + palette = p_videoParam.GetPalette()->Clone(); + m_videoParam.SetPalette(palette); + + if (!palette) + goto done; + } + + m_displaySurface = new MxDisplaySurface(); + if (m_displaySurface && m_displaySurface->Create(m_videoParam) == SUCCESS) { + m_displaySurface->SetPalette(m_videoParam.GetPalette()); + + if (p_createThread) { + m_thread = new MxTickleThread(this, p_frequencyMS); + + if (!m_thread || m_thread->Start(0, 0) != SUCCESS) + goto done; + } + else + TickleManager()->RegisterClient(this, p_frequencyMS); + + status = SUCCESS; + } + +done: + if (status != SUCCESS) + Destroy(); + + if (locked) + m_criticalSection.Leave(); + + return status; } diff --git a/LEGO1/mxvideomanager.h b/LEGO1/mxvideomanager.h index ea97ab84..3cf815bb 100644 --- a/LEGO1/mxvideomanager.h +++ b/LEGO1/mxvideomanager.h @@ -15,11 +15,20 @@ class MxVideoManager : public MxMediaManager virtual MxResult Tickle() override; // vtable+0x8 virtual void Destroy() override; // vtable+0x18 - virtual void vtable0x28(); // vtable+0x28 (TODO ARGUMENTS) - virtual MxResult vtable0x2c(MxVideoParam& p_videoParam, undefined4 p_unknown1, MxU8 p_unknown2); // vtable+0x2c + virtual MxResult vtable0x28( + MxVideoParam& p_videoParam, + LPDIRECTDRAW p_pDirectDraw, + LPDIRECTDRAWSURFACE p_pDDSurface, + LPDIRECTDRAWSURFACE p_ddSurface1, + LPDIRECTDRAWSURFACE p_ddSurface2, + LPDIRECTDRAWCLIPPER p_ddClipper, + MxU32 p_frequencyMS, + MxBool p_createThread + ); // vtable+0x28 + virtual MxResult Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread); // vtable+0x2c __declspec(dllexport) void InvalidateRect(MxRect32 &); - __declspec(dllexport) virtual MxLong RealizePalette(MxPalette *); // vtable+0x30 + __declspec(dllexport) virtual MxResult RealizePalette(MxPalette *); // vtable+0x30 MxVideoManager();