From ea5f9b48863631df46039aa7c96c929e31c1a6eb Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 20 Jan 2024 14:31:07 -0500 Subject: [PATCH 01/34] Implement MxDisplaySurface::VTable0x44 (#467) * Update mxdisplaysurface.cpp * add arguments to header * Fix glitched bitmaps * WIP fixes * Match * Fix * Changes * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/omni/include/mxdisplaysurface.h | 13 +- LEGO1/omni/src/video/mxdisplaysurface.cpp | 163 ++++++++++++++++++---- 2 files changed, 145 insertions(+), 31 deletions(-) diff --git a/LEGO1/omni/include/mxdisplaysurface.h b/LEGO1/omni/include/mxdisplaysurface.h index c841fccc..dde3d086 100644 --- a/LEGO1/omni/include/mxdisplaysurface.h +++ b/LEGO1/omni/include/mxdisplaysurface.h @@ -80,10 +80,15 @@ class MxDisplaySurface : public MxCore { MxS32 p_top2, MxS32 p_width, MxS32 p_height - ); // vtable+0x38 - virtual void GetDC(HDC* p_hdc); // vtable+0x3c - virtual void ReleaseDC(HDC p_hdc); // vtable+0x40 - virtual LPDIRECTDRAWSURFACE VTable0x44(MxBitmap*, undefined4*, undefined4, undefined4); // vtable+0x44 + ); // vtable+0x38 + virtual void GetDC(HDC* p_hdc); // vtable+0x3c + virtual void ReleaseDC(HDC p_hdc); // vtable+0x40 + virtual LPDIRECTDRAWSURFACE VTable0x44( + MxBitmap* p_bitmap, + undefined4* p_ret, + undefined4 p_doNotWriteToSurface, + undefined4 p_transparent + ); // vtable+0x44 void ClearScreen(); static LPDIRECTDRAWSURFACE FUN_100bc070(); diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index c1b45963..fe67aebb 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -328,30 +328,7 @@ void MxDisplaySurface::VTable0x28( } if (hr == DD_OK) { - MxU8* data; - - switch (p_bitmap->GetBmiHeader()->biCompression) { - case BI_RGB: { - MxS32 rowsBeforeTop; - if (p_bitmap->GetBmiHeight() < 0) - rowsBeforeTop = p_top; - else - rowsBeforeTop = p_bitmap->GetBmiHeightAbs() - p_top - 1; - data = p_bitmap->GetBitmapData() + p_left + (p_bitmap->GetBmiStride() * rowsBeforeTop); - break; - } - case BI_RGB_TOPDOWN: - data = p_bitmap->GetBitmapData(); - break; - default: { - MxS32 rowsBeforeTop; - if (p_bitmap->GetBmiHeight() < 0) - rowsBeforeTop = 0; - else - rowsBeforeTop = p_bitmap->GetBmiHeightAbs() - 1; - data = p_bitmap->GetBitmapData() + (p_bitmap->GetBmiStride() * rowsBeforeTop); - } - } + MxU8* data = p_bitmap->GetStart(p_left, p_top); if (m_videoParam.Flags().GetF1bit3()) { p_bottom *= 2; @@ -564,10 +541,142 @@ void MxDisplaySurface::ReleaseDC(HDC p_hdc) this->m_ddSurface2->ReleaseDC(p_hdc); } -// STUB: LEGO1 0x100bbc60 -LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44(MxBitmap*, undefined4*, undefined4, undefined4) +// FUNCTION: LEGO1 0x100bbc60 +LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( + MxBitmap* p_bitmap, + undefined4* p_ret, + undefined4 p_doNotWriteToSurface, + undefined4 p_transparent +) { - return NULL; + LPDIRECTDRAWSURFACE surface = NULL; + LPDIRECTDRAW draw = MVideoManager()->GetDirectDraw(); + MVideoManager(); + + DDSURFACEDESC ddsd; + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + if (draw->GetDisplayMode(&ddsd)) + return NULL; + + ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + ddsd.dwWidth = p_bitmap->GetBmiWidth(); + ddsd.dwHeight = p_bitmap->GetBmiHeightAbs(); + + *p_ret = 0; + ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; + + if (draw->CreateSurface(&ddsd, &surface, NULL) != S_OK) { + if (*p_ret) { + *p_ret = 0; + + // Try creating bitmap surface in vram if system ram ran out + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + + if (draw->CreateSurface(&ddsd, &surface, NULL) != S_OK) { + surface = NULL; + } + } + else + surface = NULL; + } + + if (surface) { + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + if (surface->Lock(NULL, &ddsd, DDLOCK_WAIT, 0) != S_OK) { + surface->Release(); + surface = NULL; + goto done; + } + + if (p_doNotWriteToSurface) { + goto done; + } + + MxU8* bitmapSrcPtr = p_bitmap->GetStart(0, 0); + MxU16* surfaceData = (MxU16*) ddsd.lpSurface; + MxLong widthNormal = p_bitmap->GetBmiWidth(); + MxLong heightAbs = p_bitmap->GetBmiHeightAbs(); + + // TODO: Probably p_bitmap->GetAdjustedStride() + MxS32 rowSeek = p_bitmap->GetBmiStride(); + if (p_bitmap->GetBmiHeader()->biCompression != BI_RGB_TOPDOWN && p_bitmap->GetBmiHeight() >= 0) + rowSeek = -rowSeek; + + MxLong newPitch = ddsd.lPitch; + switch (ddsd.ddpfPixelFormat.dwRGBBitCount) { + case 8: { + for (MxS32 y = heightAbs; y > 0; y--) { + memcpy(surfaceData, bitmapSrcPtr, p_bitmap->GetBmiHeight()); + bitmapSrcPtr += rowSeek; + surfaceData = (MxU16*) ((MxU8*) surfaceData + newPitch); + } + + surface->Unlock(ddsd.lpSurface); + + if (p_transparent && surface) { + DDCOLORKEY key; + key.dwColorSpaceHighValue = 0; + key.dwColorSpaceLowValue = 0; + surface->SetColorKey(DDCKEY_SRCBLT, &key); + } + break; + } + case 16: + if (m_16bitPal == NULL) { + if (surface) { + surface->Release(); + } + return NULL; + } + else { + rowSeek -= p_bitmap->GetBmiWidth(); + newPitch -= 2 * p_bitmap->GetBmiWidth(); + + if (p_transparent) { + for (MxS32 y = heightAbs; y > 0; y--) { + for (MxS32 x = widthNormal; x > 0; x--) { + if (*bitmapSrcPtr) { + *surfaceData = m_16bitPal[*bitmapSrcPtr]; + } + else { + *surfaceData = 31775; + } + bitmapSrcPtr++; + surfaceData++; + } + + bitmapSrcPtr += rowSeek; + surfaceData = (MxU16*) ((MxU8*) surfaceData + newPitch); + } + + DDCOLORKEY key; + key.dwColorSpaceHighValue = 31775; + key.dwColorSpaceLowValue = 31775; + surface->SetColorKey(DDCKEY_SRCBLT, &key); + } + else { + for (MxS32 y = heightAbs; y > 0; y--) { + for (MxS32 x = widthNormal; x > 0; x--) { + *surfaceData++ = m_16bitPal[*bitmapSrcPtr++]; + } + + bitmapSrcPtr += rowSeek; + surfaceData = (MxU16*) ((MxU8*) surfaceData + newPitch); + } + } + + surface->Unlock(ddsd.lpSurface); + } + } + } + +done: + return surface; } // STUB: LEGO1 0x100bc070 From 46ad56776030805802d3e8fc1845085fac04781f Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 20 Jan 2024 15:40:00 -0500 Subject: [PATCH 02/34] Implmement PoliceState::VTable0x1c (#468) * Implmement PoliceState::VTable0x1c * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/policestate.h | 2 + .../lego/legoomni/src/police/policestate.cpp | 18 ++++++++ .../src/towtrack/towtrackmissionstate.cpp | 43 +++++++++++++------ 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/LEGO1/lego/legoomni/include/policestate.h b/LEGO1/lego/legoomni/include/policestate.h index be55ecae..517710ab 100644 --- a/LEGO1/lego/legoomni/include/policestate.h +++ b/LEGO1/lego/legoomni/include/policestate.h @@ -26,6 +26,8 @@ class PoliceState : public LegoState { // SYNTHETIC: LEGO1 0x1005e920 // PoliceState::`scalar deleting destructor' + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1C + private: undefined4 m_unk0x8; // 0x8 undefined4 m_unk0xc; // 0xc diff --git a/LEGO1/lego/legoomni/src/police/policestate.cpp b/LEGO1/lego/legoomni/src/police/policestate.cpp index 4965a36f..b0011ccb 100644 --- a/LEGO1/lego/legoomni/src/police/policestate.cpp +++ b/LEGO1/lego/legoomni/src/police/policestate.cpp @@ -10,3 +10,21 @@ PoliceState::PoliceState() m_unk0xc = 0; m_unk0x8 = (rand() % 2 == 0) ? 501 : 500; } + +// FUNCTION: LEGO1 0x1005e990 +MxResult PoliceState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + if (p_legoFileStream->IsWriteMode()) { + p_legoFileStream->FUN_10006030(ClassName()); + } + + if (p_legoFileStream->IsReadMode()) { + p_legoFileStream->Read(&m_unk0x8, sizeof(m_unk0x8)); + } + else { + undefined4 unk0x8 = m_unk0x8; + p_legoFileStream->Write(&unk0x8, sizeof(m_unk0x8)); + } + + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp index 8d3d56b9..a5719da5 100644 --- a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp +++ b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp @@ -28,18 +28,6 @@ MxResult TowTrackMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) } if (p_legoFileStream->IsReadMode()) { - p_legoFileStream->Write(&m_unk0x12, sizeof(MxU16)); - p_legoFileStream->Write(&m_unk0x14, sizeof(MxU16)); - p_legoFileStream->Write(&m_unk0x16, sizeof(MxU16)); - p_legoFileStream->Write(&m_unk0x18, sizeof(MxU16)); - p_legoFileStream->Write(&m_unk0x1a, sizeof(MxU16)); - p_legoFileStream->Write(&m_unk0x1c, sizeof(MxU16)); - p_legoFileStream->Write(&m_color1, sizeof(MxU16)); - p_legoFileStream->Write(&m_color2, sizeof(MxU16)); - p_legoFileStream->Write(&m_color3, sizeof(MxU16)); - p_legoFileStream->Write(&m_color4, sizeof(MxU16)); - } - else if (p_legoFileStream->IsWriteMode()) { p_legoFileStream->Read(&m_unk0x12, sizeof(MxU16)); p_legoFileStream->Read(&m_unk0x14, sizeof(MxU16)); p_legoFileStream->Read(&m_unk0x16, sizeof(MxU16)); @@ -51,6 +39,37 @@ MxResult TowTrackMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) p_legoFileStream->Read(&m_color3, sizeof(MxU16)); p_legoFileStream->Read(&m_color4, sizeof(MxU16)); } + else if (p_legoFileStream->IsWriteMode()) { + MxU16 write = m_unk0x12; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_unk0x14; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_unk0x16; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_unk0x18; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_unk0x1a; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_unk0x1c; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_color1; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_color2; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_color3; + p_legoFileStream->Write(&write, sizeof(MxU16)); + + write = m_color4; + p_legoFileStream->Write(&write, sizeof(MxU16)); + } return SUCCESS; } From 1c612a2d2596733159394abaab025974c1d34383 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:43:53 -0500 Subject: [PATCH 03/34] Implement Lego3DView::Render (#470) * Implement Lego3DView::Render * use MxDouble * Revert "use MxDouble" This reverts commit a006b60e2066b79ded3e15e143a302d8fd707deb. --- LEGO1/lego/sources/3dmanager/lego3dview.cpp | 11 ++++------- LEGO1/viewmanager/viewmanager.cpp | 5 +++++ LEGO1/viewmanager/viewmanager.h | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/LEGO1/lego/sources/3dmanager/lego3dview.cpp b/LEGO1/lego/sources/3dmanager/lego3dview.cpp index 37b8215e..cfa274f6 100644 --- a/LEGO1/lego/sources/3dmanager/lego3dview.cpp +++ b/LEGO1/lego/sources/3dmanager/lego3dview.cpp @@ -138,15 +138,12 @@ BOOL Lego3DView::Moved(ViewROI& rROI) return TRUE; } -// STUB: LEGO1 0x100ab270 +// FUNCTION: LEGO1 0x100ab270 double Lego3DView::Render(double p_und) { - // assert(m_pViewManager); - - // m_pViewManager->Update(m_previousRenderTime); - - // m_previousRenderTime = LegoView1::Render(); - + assert(m_pViewManager); + m_pViewManager->Update(m_previousRenderTime, p_und); + m_previousRenderTime = TglSurface::Render(); return m_previousRenderTime; } diff --git a/LEGO1/viewmanager/viewmanager.cpp b/LEGO1/viewmanager/viewmanager.cpp index 7d412641..3e7344d2 100644 --- a/LEGO1/viewmanager/viewmanager.cpp +++ b/LEGO1/viewmanager/viewmanager.cpp @@ -16,6 +16,11 @@ void ViewManager::RemoveAll(ViewROI*) // TODO } +// STUB: LEGO1 0x100a6930 +void ViewManager::Update(float p_previousRenderTime, float p_und2) +{ +} + // STUB: LEGO1 0x100a6d50 void ViewManager::SetResolution(int width, int height) { diff --git a/LEGO1/viewmanager/viewmanager.h b/LEGO1/viewmanager/viewmanager.h index f2ccc6c6..8185c572 100644 --- a/LEGO1/viewmanager/viewmanager.h +++ b/LEGO1/viewmanager/viewmanager.h @@ -15,6 +15,7 @@ class ViewManager { void SetPOVSource(const OrientableROI* point_of_view); void SetResolution(int width, int height); void SetFrustrum(float fov, float front, float back); + void Update(float p_previousRenderTime, float p_und2); // SYNTHETIC: LEGO1 0x100a6000 // ViewManager::`scalar deleting destructor' From 67fa5e7cca43277bab5613030921902f185fcf38 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sat, 20 Jan 2024 15:49:56 -0500 Subject: [PATCH 04/34] Begin work on Police class (#469) * Begin work on Police class * Use JukeBox::e_policeStation value * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/police.h | 12 +++++ LEGO1/lego/legoomni/src/police/police.cpp | 57 +++++++++++++++++++++-- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 9d6bc1c7..92e19b42 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -1,7 +1,11 @@ #ifndef POLICE_H #define POLICE_H +#include "decomp.h" #include "legoworld.h" +#include "mxdsaction.h" +#include "policestate.h" +#include "radio.h" // VTABLE: LEGO1 0x100d8a80 // SIZE 0x110 @@ -28,6 +32,14 @@ class Police : public LegoWorld { // SYNTHETIC: LEGO1 0x1005e300 // Police::`scalar deleting destructor' + + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + +private: + Radio m_radio; // 0xf8 + PoliceState* m_policeState; // 0x108 + undefined4 m_unk0x10c; // 0x10c }; #endif // POLICE_H diff --git a/LEGO1/lego/legoomni/src/police/police.cpp b/LEGO1/lego/legoomni/src/police/police.cpp index 67577ecc..89874e00 100644 --- a/LEGO1/lego/legoomni/src/police/police.cpp +++ b/LEGO1/lego/legoomni/src/police/police.cpp @@ -1,15 +1,56 @@ #include "police.h" -// STUB: LEGO1 0x1005e130 +#include "jukebox.h" +#include "legocontrolmanager.h" +#include "legogamestate.h" +#include "legoinputmanager.h" +#include "legoomni.h" +#include "mxnotificationmanager.h" + +DECOMP_SIZE_ASSERT(Police, 0x110) + +// FUNCTION: LEGO1 0x1005e130 Police::Police() { - // TODO + m_policeState = NULL; + m_unk0x10c = 0; + NotificationManager()->Register(this); } -// STUB: LEGO1 0x1005e320 +// FUNCTION: LEGO1 0x1005e320 Police::~Police() { - // TODO + if (InputManager()->GetWorld() == this) { + InputManager()->ClearWorld(); + } + + ControlManager()->Unregister(this); + InputManager()->UnRegister(this); + NotificationManager()->Unregister(this); +} + +// FUNCTION: LEGO1 0x1005e3e0 +MxResult Police::Create(MxDSAction& p_dsAction) +{ + MxResult ret = LegoWorld::Create(p_dsAction); + if (ret == SUCCESS) { + InputManager()->SetWorld(this); + ControlManager()->Register(this); + } + + SetIsWorldActive(FALSE); + InputManager()->Register(this); + + LegoGameState* gameState = GameState(); + PoliceState* policeState = (PoliceState*) gameState->GetState("PoliceState"); + if (!policeState) { + policeState = (PoliceState*) gameState->CreateState("PoliceState"); + } + + m_policeState = policeState; + GameState()->SetUnknown424(0x22); + GameState()->FUN_1003a720(0); + return ret; } // STUB: LEGO1 0x1005e480 @@ -19,3 +60,11 @@ MxLong Police::Notify(MxParam& p_param) return 0; } + +// FUNCTION: LEGO1 0x1005e530 +void Police::VTable0x50() +{ + LegoWorld::VTable0x50(); + PlayMusic(JukeBox::e_policeStation); + FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); +} From 93012b62f491c322891976ccf60c4a5500cc32b5 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 20 Jan 2024 16:12:35 -0500 Subject: [PATCH 05/34] Implement MxDisplaySurface::CreateCursorSurface (#471) * Update mxdisplaysurface.cpp * Fixes * Update legovideomanager.cpp * Match to 100% --------- Co-authored-by: Christian Semmler --- .../lego/legoomni/include/legovideomanager.h | 4 +- .../legoomni/src/video/legovideomanager.cpp | 19 ++--- LEGO1/omni/include/mxdisplaysurface.h | 2 +- LEGO1/omni/src/video/mxdisplaysurface.cpp | 74 ++++++++++++++++++- 4 files changed, 85 insertions(+), 14 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index a9532e87..67a7805c 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -72,8 +72,8 @@ class LegoVideoManager : public MxVideoManager { MxS32 m_cursorYCopy; // 0x508 MxS32 m_cursorX; // 0x50c MxS32 m_cursorY; // 0x510 - LPDIRECTDRAWSURFACE m_unk0x514; // 0x514 - RECT m_unk0x518; // 0x518 + LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514 + RECT m_cursorRect; // 0x518 undefined4 m_unk0x528; // 0x528 MxBool m_drawFPS; // 0x52c RECT m_fpsRect; // 0x530 diff --git a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp index 2a5d1643..f31879b3 100644 --- a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp +++ b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp @@ -30,7 +30,7 @@ LegoVideoManager::LegoVideoManager() m_cursorX = m_cursorY; m_cursorYCopy = m_cursorY; m_cursorXCopy = m_cursorY; - m_unk0x514 = NULL; + m_cursorSurface = NULL; m_fullScreenMovie = FALSE; m_drawFPS = FALSE; m_unk0x528 = 0; @@ -309,18 +309,19 @@ inline void LegoVideoManager::DrawCursor() LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2(); - if (!m_unk0x514) { - m_unk0x518.top = 0; - m_unk0x518.left = 0; - m_unk0x518.bottom = 16; - m_unk0x518.right = 16; - m_unk0x514 = MxDisplaySurface::FUN_100bc070(); + if (!m_cursorSurface) { + m_cursorRect.top = 0; + m_cursorRect.left = 0; + m_cursorRect.bottom = 16; + m_cursorRect.right = 16; + m_cursorSurface = MxDisplaySurface::CreateCursorSurface(); - if (!m_unk0x514) + if (!m_cursorSurface) m_drawCursor = FALSE; } - ddSurface2->BltFast(m_cursorXCopy, m_cursorYCopy, m_unk0x514, &m_unk0x518, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY); + ddSurface2 + ->BltFast(m_cursorXCopy, m_cursorYCopy, m_cursorSurface, &m_cursorRect, DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY); } // STUB: LEGO1 0x1007bbc0 diff --git a/LEGO1/omni/include/mxdisplaysurface.h b/LEGO1/omni/include/mxdisplaysurface.h index dde3d086..1d26264c 100644 --- a/LEGO1/omni/include/mxdisplaysurface.h +++ b/LEGO1/omni/include/mxdisplaysurface.h @@ -91,7 +91,7 @@ class MxDisplaySurface : public MxCore { ); // vtable+0x44 void ClearScreen(); - static LPDIRECTDRAWSURFACE FUN_100bc070(); + static LPDIRECTDRAWSURFACE CreateCursorSurface(); inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; } diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index fe67aebb..a9dc2608 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -679,9 +679,79 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( return surface; } -// STUB: LEGO1 0x100bc070 -LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() +// FUNCTION: LEGO1 0x100bc070 +LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface() { + LPDIRECTDRAWSURFACE newSurface = NULL; + IDirectDraw* draw = MVideoManager()->GetDirectDraw(); + MVideoManager(); + + DDSURFACEDESC ddsd; + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + if (draw->GetDisplayMode(&ddsd) != S_OK) { + return NULL; + } + + if (ddsd.ddpfPixelFormat.dwRGBBitCount != 16) { + return NULL; + } + + ddsd.dwWidth = 16; + ddsd.dwHeight = 16; + ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN; + + if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK) { + ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; + ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + + if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK) + goto done; + } + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != S_OK) + goto done; + else { + MxU16* surface = (MxU16*) ddsd.lpSurface; + MxLong pitch = ddsd.lPitch; + + // draw a simple cursor to the surface + for (MxS32 x = 0; x < 16; x++) { + MxU16* surface2 = surface; + for (MxS32 y = 0; y < 16; y++) { + if ((y > 10 || x) && (x > 10 || y) && x + y != 10) { + if (x + y > 10) + *surface2 = 31775; + else + *surface2 = -1; + } + else { + *surface2 = 0; + } + surface2++; + } + surface = (MxU16*) ((MxU8*) surface + pitch); + } + + newSurface->Unlock(ddsd.lpSurface); + DDCOLORKEY colorkey; + colorkey.dwColorSpaceHighValue = 31775; + colorkey.dwColorSpaceLowValue = 31775; + newSurface->SetColorKey(DDCKEY_SRCBLT, &colorkey); + + return newSurface; + } + +done: + if (newSurface) { + newSurface->Release(); + } + return NULL; } From b5a3c5feea0a7ab2c7d42c32dc985e9485851975 Mon Sep 17 00:00:00 2001 From: MS Date: Sat, 20 Jan 2024 18:04:46 -0500 Subject: [PATCH 06/34] Enforce vtable match (#464) * vtable enforce * Vtable progress * IslePathActor subclasses * LegoState subclasses * LegoWorld subclasses * Presenter progress * Remaining presenters * All but two that need new files * Merge into vtable branch (#3) * Implement MxDisplaySurface::VTable0x44 (#467) * Update mxdisplaysurface.cpp * add arguments to header * Fix glitched bitmaps * WIP fixes * Match * Fix * Changes * Fixes --------- Co-authored-by: Christian Semmler * Implmement PoliceState::VTable0x1c (#468) * Implmement PoliceState::VTable0x1c * Fixes --------- Co-authored-by: Christian Semmler * Implement Lego3DView::Render (#470) * Implement Lego3DView::Render * use MxDouble * Revert "use MxDouble" This reverts commit a006b60e2066b79ded3e15e143a302d8fd707deb. * Begin work on Police class (#469) * Begin work on Police class * Use JukeBox::e_policeStation value * Fixes --------- Co-authored-by: Christian Semmler * Implement MxDisplaySurface::CreateCursorSurface (#471) * Update mxdisplaysurface.cpp * Fixes * Update legovideomanager.cpp * Match to 100% --------- Co-authored-by: Christian Semmler --------- Co-authored-by: Misha <106913236+MishaProductions@users.noreply.github.com> Co-authored-by: Christian Semmler Co-authored-by: Joshua Peisach * Police fix * Finish * motocycle lower case * Update historybook.h * Update hospitalstate.h * Update jetski.h * Update legoinputmanager.h * Update legolocomotionanimpresenter.h * Update pizza.h * Update act3shark.h * Update ambulancemissionstate.h * Update bumpbouy.h * Update doors.h --------- Co-authored-by: Misha <106913236+MishaProductions@users.noreply.github.com> Co-authored-by: Christian Semmler Co-authored-by: Joshua Peisach --- .github/workflows/build.yml | 6 ++ CMakeLists.txt | 8 ++ LEGO1/lego/legoomni/include/act1state.h | 3 + LEGO1/lego/legoomni/include/act2brick.h | 2 + LEGO1/lego/legoomni/include/act3.h | 11 +++ LEGO1/lego/legoomni/include/act3shark.h | 13 ++- LEGO1/lego/legoomni/include/ambulance.h | 11 +++ .../legoomni/include/ambulancemissionstate.h | 2 + LEGO1/lego/legoomni/include/bike.h | 5 + LEGO1/lego/legoomni/include/bumpbouy.h | 7 ++ LEGO1/lego/legoomni/include/carrace.h | 8 ++ LEGO1/lego/legoomni/include/doors.h | 4 + LEGO1/lego/legoomni/include/dunebuggy.h | 7 ++ LEGO1/lego/legoomni/include/gasstation.h | 6 ++ LEGO1/lego/legoomni/include/gasstationstate.h | 2 + LEGO1/lego/legoomni/include/helicopter.h | 4 +- LEGO1/lego/legoomni/include/helicopterstate.h | 3 + LEGO1/lego/legoomni/include/historybook.h | 4 + LEGO1/lego/legoomni/include/hospital.h | 7 ++ LEGO1/lego/legoomni/include/hospitalstate.h | 2 + LEGO1/lego/legoomni/include/isleactor.h | 4 + LEGO1/lego/legoomni/include/islepathactor.h | 2 + LEGO1/lego/legoomni/include/jetski.h | 7 ++ LEGO1/lego/legoomni/include/jukebox.h | 9 ++ LEGO1/lego/legoomni/include/jukeboxentity.h | 2 + .../legoomni/include/lego3dwavepresenter.h | 5 + LEGO1/lego/legoomni/include/legoact2.h | 11 +++ LEGO1/lego/legoomni/include/legoact2state.h | 2 + LEGO1/lego/legoomni/include/legoactor.h | 3 + .../legoomni/include/legoanimmmpresenter.h | 12 +++ .../lego/legoomni/include/legoanimpresenter.h | 2 + .../legoomni/include/legobuildingmanager.h | 2 + LEGO1/lego/legoomni/include/legocarbuild.h | 6 ++ .../include/legocarbuildanimpresenter.h | 6 ++ .../lego/legoomni/include/legocarraceactor.h | 8 ++ .../include/legoeventnotificationparam.h | 2 + .../include/legoflctexturepresenter.h | 4 + .../legoomni/include/legohideanimpresenter.h | 7 +- .../lego/legoomni/include/legoinputmanager.h | 3 + LEGO1/lego/legoomni/include/legojetski.h | 10 ++ .../legoomni/include/legojetskiraceactor.h | 5 + .../include/legoloadcachesoundpresenter.h | 5 + .../include/legolocomotionanimpresenter.h | 9 ++ .../include/legoloopinganimpresenter.h | 3 + .../lego/legoomni/include/legonavcontroller.h | 3 +- .../lego/legoomni/include/legopartpresenter.h | 4 + LEGO1/lego/legoomni/include/legopathactor.h | 1 + .../legoomni/include/legophonemepresenter.h | 5 + LEGO1/lego/legoomni/include/legoraceactor.h | 9 ++ LEGO1/lego/legoomni/include/legoracecar.h | 10 ++ .../legoomni/include/legovehiclebuildstate.h | 2 + .../lego/legoomni/include/legovideomanager.h | 2 +- LEGO1/lego/legoomni/include/motocycle.h | 7 ++ LEGO1/lego/legoomni/include/pizza.h | 8 +- .../lego/legoomni/include/pizzamissionstate.h | 2 + LEGO1/lego/legoomni/include/pizzeria.h | 2 + LEGO1/lego/legoomni/include/pizzeriastate.h | 2 + LEGO1/lego/legoomni/include/police.h | 9 +- LEGO1/lego/legoomni/include/policestate.h | 4 +- LEGO1/lego/legoomni/include/racecar.h | 3 + .../lego/legoomni/include/racestandsentity.h | 13 +++ LEGO1/lego/legoomni/include/racestate.h | 2 + LEGO1/lego/legoomni/include/radio.h | 2 + LEGO1/lego/legoomni/include/radiostate.h | 2 + LEGO1/lego/legoomni/include/skateboard.h | 6 ++ LEGO1/lego/legoomni/include/towtrack.h | 9 ++ LEGO1/lego/legoomni/src/act1/act1state.cpp | 14 +++ LEGO1/lego/legoomni/src/act2/act2brick.cpp | 7 ++ LEGO1/lego/legoomni/src/act2/legoact2.cpp | 54 ++++++++++ .../lego/legoomni/src/act2/legoact2state.cpp | 7 ++ LEGO1/lego/legoomni/src/act3/act3.cpp | 59 +++++++++++ LEGO1/lego/legoomni/src/act3/act3shark.cpp | 24 +++++ .../src/audio/lego3dwavepresenter.cpp | 26 +++++ .../src/audio/legoloadcachesoundpresenter.cpp | 25 +++++ LEGO1/lego/legoomni/src/build/dunebuggy.cpp | 40 ++++++++ .../legoomni/src/build/helicopterstate.cpp | 14 +++ LEGO1/lego/legoomni/src/build/jetski.cpp | 33 +++++++ .../src/build/legobuildingmanager.cpp | 7 ++ .../lego/legoomni/src/build/legocarbuild.cpp | 33 +++++++ .../src/build/legovehiclebuildstate.cpp | 7 ++ LEGO1/lego/legoomni/src/build/racecar.cpp | 14 +++ LEGO1/lego/legoomni/src/entity/legoactor.cpp | 12 +++ .../legoomni/src/entity/legocarraceactor.cpp | 45 +++++++++ LEGO1/lego/legoomni/src/entity/legojetski.cpp | 50 ++++++++++ .../src/entity/legojetskiraceactor.cpp | 25 +++++ .../legoomni/src/entity/legonavcontroller.cpp | 7 ++ .../legoomni/src/entity/legopathactor.cpp | 6 ++ .../legoomni/src/entity/legoraceactor.cpp | 45 +++++++++ .../lego/legoomni/src/entity/legoracecar.cpp | 51 ++++++++++ .../legoomni/src/gasstation/gasstation.cpp | 33 +++++++ .../src/gasstation/gasstationstate.cpp | 7 ++ .../lego/legoomni/src/hospital/ambulance.cpp | 60 +++++++++++ .../src/hospital/ambulancemissionstate.cpp | 7 ++ LEGO1/lego/legoomni/src/hospital/hospital.cpp | 40 ++++++++ .../legoomni/src/hospital/hospitalstate.cpp | 7 ++ LEGO1/lego/legoomni/src/isle/bike.cpp | 27 +++++ LEGO1/lego/legoomni/src/isle/bumpbouy.cpp | 31 ++++++ LEGO1/lego/legoomni/src/isle/doors.cpp | 20 ++++ LEGO1/lego/legoomni/src/isle/historybook.cpp | 20 ++++ LEGO1/lego/legoomni/src/isle/isleactor.cpp | 14 +++ .../lego/legoomni/src/isle/islepathactor.cpp | 7 ++ LEGO1/lego/legoomni/src/isle/jukebox.cpp | 47 +++++++++ .../lego/legoomni/src/isle/jukeboxentity.cpp | 7 ++ LEGO1/lego/legoomni/src/isle/motocycle.cpp | 40 ++++++++ LEGO1/lego/legoomni/src/isle/radio.cpp | 7 ++ LEGO1/lego/legoomni/src/isle/radiostate.cpp | 7 ++ LEGO1/lego/legoomni/src/isle/skateboard.cpp | 36 ++++++- .../src/notify/legoeventnotificationparam.cpp | 7 ++ LEGO1/lego/legoomni/src/pizzeria/pizza.cpp | 7 ++ .../src/pizzeria/pizzamissionstate.cpp | 7 ++ LEGO1/lego/legoomni/src/pizzeria/pizzeria.cpp | 7 ++ .../legoomni/src/pizzeria/pizzeriastate.cpp | 7 ++ LEGO1/lego/legoomni/src/police/police.cpp | 20 ++++ LEGO1/lego/legoomni/src/race/carrace.cpp | 48 +++++++++ LEGO1/lego/legoomni/src/race/racestate.cpp | 7 ++ LEGO1/lego/legoomni/src/towtrack/towtrack.cpp | 54 ++++++++++ .../src/video/legoanimmmpresenter.cpp | 62 ++++++++++++ .../legoomni/src/video/legoanimpresenter.cpp | 13 +++ .../src/video/legocarbuildanimpresenter.cpp | 30 ++++++ .../src/video/legoflctexturepresenter.cpp | 18 ++++ .../src/video/legohideanimpresenter.cpp | 31 ++++++ .../src/video/legolocomotionanimpresenter.cpp | 50 ++++++++++ .../src/video/legoloopinganimpresenter.cpp | 13 +++ .../legoomni/src/video/legopartpresenter.cpp | 19 ++++ .../src/video/legophonemepresenter.cpp | 24 +++++ LEGO1/lego/sources/roi/legoroi.cpp | 6 ++ LEGO1/lego/sources/roi/legoroi.h | 1 + LEGO1/mxgeometry/mxmatrix.h | 3 + LEGO1/tgl/d3drm/group.cpp | 2 +- LEGO1/tgl/d3drm/impl.h | 9 +- LEGO1/tgl/d3drm/renderer.cpp | 2 +- LEGO1/tgl/d3drm/texture.cpp | 2 +- LEGO1/tgl/tgl.h | 6 +- LEGO1/viewmanager/viewroi.cpp | 18 ++++ LEGO1/viewmanager/viewroi.h | 9 +- tools/vtable/vtable.py | 99 +++++++++++++++++++ 136 files changed, 1926 insertions(+), 28 deletions(-) create mode 100644 LEGO1/lego/legoomni/src/act2/legoact2.cpp create mode 100644 LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp create mode 100644 LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp create mode 100644 LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp create mode 100644 LEGO1/lego/legoomni/src/entity/legoraceactor.cpp create mode 100644 LEGO1/lego/legoomni/src/entity/legoracecar.cpp create mode 100644 LEGO1/lego/legoomni/src/isle/doors.cpp create mode 100644 LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp create mode 100644 tools/vtable/vtable.py diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 419033cc..51b0759f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -145,6 +145,12 @@ jobs: run: | python3 tools/verexp/verexp.py legobin/LEGO1.DLL build/LEGO1.DLL + - name: Check Vtables + shell: bash + run: | + python3 tools/vtable/vtable.py legobin/ISLE.EXE build/ISLE.EXE build/ISLE.PDB . + python3 tools/vtable/vtable.py legobin/LEGO1.DLL build/LEGO1.DLL build/LEGO1.PDB . + - name: Upload Artifact uses: actions/upload-artifact@master with: diff --git a/CMakeLists.txt b/CMakeLists.txt index 34b67e0c..04ca97a9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,10 +27,12 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/act1/act1state.cpp LEGO1/lego/legoomni/src/act2/act2brick.cpp LEGO1/lego/legoomni/src/act2/act2policestation.cpp + LEGO1/lego/legoomni/src/act2/legoact2.cpp LEGO1/lego/legoomni/src/act2/legoact2state.cpp LEGO1/lego/legoomni/src/act3/act3.cpp LEGO1/lego/legoomni/src/act3/act3shark.cpp LEGO1/lego/legoomni/src/act3/act3state.cpp + LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp LEGO1/lego/legoomni/src/audio/legocachesound.cpp LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp @@ -63,13 +65,17 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/entity/legoactorpresenter.cpp LEGO1/lego/legoomni/src/entity/legoanimactor.cpp LEGO1/lego/legoomni/src/entity/legocameracontroller.cpp + LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp LEGO1/lego/legoomni/src/entity/legoentity.cpp LEGO1/lego/legoomni/src/entity/legoentitypresenter.cpp LEGO1/lego/legoomni/src/entity/legojetski.cpp + LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp LEGO1/lego/legoomni/src/entity/legopathactor.cpp LEGO1/lego/legoomni/src/entity/legopovcontroller.cpp LEGO1/lego/legoomni/src/entity/legorace.cpp + LEGO1/lego/legoomni/src/entity/legoraceactor.cpp + LEGO1/lego/legoomni/src/entity/legoracecar.cpp LEGO1/lego/legoomni/src/entity/legoworld.cpp LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp LEGO1/lego/legoomni/src/gasstation/gasstation.cpp @@ -92,6 +98,7 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/isle/beachhouseentity.cpp LEGO1/lego/legoomni/src/isle/bike.cpp LEGO1/lego/legoomni/src/isle/bumpbouy.cpp + LEGO1/lego/legoomni/src/isle/doors.cpp LEGO1/lego/legoomni/src/isle/historybook.cpp LEGO1/lego/legoomni/src/isle/isleactor.cpp LEGO1/lego/legoomni/src/isle/isle.cpp @@ -128,6 +135,7 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp + LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp LEGO1/lego/legoomni/src/video/legometerpresenter.cpp LEGO1/lego/legoomni/src/video/legomodelpresenter.cpp LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp diff --git a/LEGO1/lego/legoomni/include/act1state.h b/LEGO1/lego/legoomni/include/act1state.h index 82e95f63..4babf08a 100644 --- a/LEGO1/lego/legoomni/include/act1state.h +++ b/LEGO1/lego/legoomni/include/act1state.h @@ -22,6 +22,9 @@ class Act1State : public LegoState { return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name); }; + virtual MxBool SetFlag() override; // vtable+0x18 + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x18 = p_unk0x18; } inline MxU32 GetUnknown18() { return m_unk0x18; } inline void SetUnknown21(MxS16 p_unk0x21) { m_unk0x21 = p_unk0x21; } diff --git a/LEGO1/lego/legoomni/include/act2brick.h b/LEGO1/lego/legoomni/include/act2brick.h index 5eb697ed..e9f771ad 100644 --- a/LEGO1/lego/legoomni/include/act2brick.h +++ b/LEGO1/lego/legoomni/include/act2brick.h @@ -26,6 +26,8 @@ class Act2Brick : public LegoPathActor { return !strcmp(p_name, Act2Brick::ClassName()) || LegoEntity::IsA(p_name); } + virtual MxS32 VTable0x94() override; // vtable+0x94 + // SYNTHETIC: LEGO1 0x1007a450 // Act2Brick::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 053bde82..b693663f 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -11,6 +11,9 @@ class Act3 : public LegoWorld { virtual ~Act3() override; // vtable+00 + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + virtual MxResult Tickle() override; // vtable+0x8 + // FUNCTION: LEGO1 0x10072510 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -24,6 +27,14 @@ class Act3 : public LegoWorld { return !strcmp(p_name, Act3::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual void VTable0x60() override; // vtable+0x60 + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + inline void SetUnkown420c(MxEntity* p_entity) { m_unk0x420c = p_entity; } inline void SetUnkown4270(MxU32 p_unk0x4270) { m_unk0x4270 = p_unk0x4270; } diff --git a/LEGO1/lego/legoomni/include/act3shark.h b/LEGO1/lego/legoomni/include/act3shark.h index e6910cdb..5ba5a6f2 100644 --- a/LEGO1/lego/legoomni/include/act3shark.h +++ b/LEGO1/lego/legoomni/include/act3shark.h @@ -7,12 +7,23 @@ class Act3Shark : public LegoAnimActor { public: // FUNCTION: LEGO1 0x100430c0 - inline virtual const char* ClassName() const override + inline virtual const char* ClassName() const override // vtable+0x0c { // STRING: LEGO1 0x100f03a0 return "Act3Shark"; } + // FUNCTION: LEGO1 0x1001a130 + inline virtual MxBool IsA(const char* p_name) const override // vtable+0x10 + { + return !strcmp(p_name, Act3Shark::ClassName()) || LegoAnimActor::IsA(p_name); + } + + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + // SYNTHETIC: LEGO1 0x10043020 // Act3Shark::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/ambulance.h b/LEGO1/lego/legoomni/include/ambulance.h index 7c54561a..88fd57d8 100644 --- a/LEGO1/lego/legoomni/include/ambulance.h +++ b/LEGO1/lego/legoomni/include/ambulance.h @@ -9,6 +9,9 @@ class Ambulance : public IslePathActor { public: Ambulance(); + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + virtual MxResult Tickle() override; // vtable+0x08 + // FUNCTION: LEGO1 0x10035fa0 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -22,6 +25,14 @@ class Ambulance : public IslePathActor { return !strcmp(p_name, Ambulance::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x10036130 // Ambulance::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/ambulancemissionstate.h b/LEGO1/lego/legoomni/include/ambulancemissionstate.h index cdfa608b..ea5cfb3e 100644 --- a/LEGO1/lego/legoomni/include/ambulancemissionstate.h +++ b/LEGO1/lego/legoomni/include/ambulancemissionstate.h @@ -22,6 +22,8 @@ class AmbulanceMissionState : public LegoState { return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + inline MxU16 GetColor(MxU8 p_id) { switch (p_id) { diff --git a/LEGO1/lego/legoomni/include/bike.h b/LEGO1/lego/legoomni/include/bike.h index 29aa6063..02265604 100644 --- a/LEGO1/lego/legoomni/include/bike.h +++ b/LEGO1/lego/legoomni/include/bike.h @@ -23,6 +23,11 @@ class Bike : public IslePathActor { return !strcmp(p_name, Bike::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x10076880 // Bike::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/bumpbouy.h b/LEGO1/lego/legoomni/include/bumpbouy.h index a423ca3e..112801b2 100644 --- a/LEGO1/lego/legoomni/include/bumpbouy.h +++ b/LEGO1/lego/legoomni/include/bumpbouy.h @@ -7,6 +7,8 @@ // VTABLE: LEGO1 0x100d6790 class BumpBouy : public LegoAnimActor { public: + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + // FUNCTION: LEGO1 0x100274e0 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -20,6 +22,11 @@ class BumpBouy : public LegoAnimActor { return !strcmp(p_name, BumpBouy::ClassName()) || LegoAnimActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + // SYNTHETIC: LEGO1 0x10027490 // BumpBouy::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/carrace.h b/LEGO1/lego/legoomni/include/carrace.h index 3a3b238a..776662db 100644 --- a/LEGO1/lego/legoomni/include/carrace.h +++ b/LEGO1/lego/legoomni/include/carrace.h @@ -23,6 +23,14 @@ class CarRace : public LegoRace { return !strcmp(p_name, CarRace::ClassName()) || LegoRace::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual undefined4 VTable0x6c(undefined4) override; // vtable+0x6c + virtual undefined4 VTable0x70(undefined4) override; // vtable+0x70 + virtual undefined4 VTable0x74(undefined4) override; // vtable+0x74 + virtual undefined4 VTable0x78(undefined4) override; // vtable+0x78 + // SYNTHETIC: LEGO1 0x10016c70 // CarRace::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/doors.h b/LEGO1/lego/legoomni/include/doors.h index 321fdf61..dc98a866 100644 --- a/LEGO1/lego/legoomni/include/doors.h +++ b/LEGO1/lego/legoomni/include/doors.h @@ -20,6 +20,10 @@ class Doors : public LegoPathActor { return !strcmp(p_name, Doors::ClassName()) || LegoPathActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxS32 VTable0x94() override; // vtable+0x94 + // SYNTHETIC: LEGO1 0x1000e580 // Doors::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/dunebuggy.h b/LEGO1/lego/legoomni/include/dunebuggy.h index 918a8b1a..ca671955 100644 --- a/LEGO1/lego/legoomni/include/dunebuggy.h +++ b/LEGO1/lego/legoomni/include/dunebuggy.h @@ -23,6 +23,13 @@ class DuneBuggy : public IslePathActor { return !strcmp(p_name, DuneBuggy::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x10067dc0 // DuneBuggy::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h index 2c979d72..5f6c64f1 100644 --- a/LEGO1/lego/legoomni/include/gasstation.h +++ b/LEGO1/lego/legoomni/include/gasstation.h @@ -29,6 +29,12 @@ class GasStation : public LegoWorld { return !strcmp(p_name, GasStation::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x100048a0 // GasStation::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/gasstationstate.h b/LEGO1/lego/legoomni/include/gasstationstate.h index 0cdf7bf1..4f77e307 100644 --- a/LEGO1/lego/legoomni/include/gasstationstate.h +++ b/LEGO1/lego/legoomni/include/gasstationstate.h @@ -22,6 +22,8 @@ class GasStationState : public LegoState { return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + // SYNTHETIC: LEGO1 0x10006290 // GasStationState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/helicopter.h b/LEGO1/lego/legoomni/include/helicopter.h index ec4faa59..e730fee4 100644 --- a/LEGO1/lego/legoomni/include/helicopter.h +++ b/LEGO1/lego/legoomni/include/helicopter.h @@ -38,8 +38,8 @@ class Helicopter : public IslePathActor { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - void VTable0x70(float p_float) override; // vtable+0x70 - void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 virtual MxU32 VTable0xcc() override; // vtable+0xcc virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 virtual MxU32 VTable0xd8(MxType18NotificationParam& p_param) override; // vtable+0xd8 diff --git a/LEGO1/lego/legoomni/include/helicopterstate.h b/LEGO1/lego/legoomni/include/helicopterstate.h index 41dcf84b..eb104c93 100644 --- a/LEGO1/lego/legoomni/include/helicopterstate.h +++ b/LEGO1/lego/legoomni/include/helicopterstate.h @@ -21,6 +21,9 @@ class HelicopterState : public LegoState { return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name); } + virtual MxBool VTable0x14() override; // vtable+0x14 + virtual MxBool SetFlag() override; // vtable+0x18 + inline void SetUnknown8(MxU32 p_unk0x8) { m_unk0x8 = p_unk0x8; } inline MxU32 GetUnkown8() { return m_unk0x8; } diff --git a/LEGO1/lego/legoomni/include/historybook.h b/LEGO1/lego/legoomni/include/historybook.h index 101e45a6..172dde98 100644 --- a/LEGO1/lego/legoomni/include/historybook.h +++ b/LEGO1/lego/legoomni/include/historybook.h @@ -25,6 +25,10 @@ class HistoryBook : public LegoWorld { return !strcmp(p_name, HistoryBook::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x64() override; // vtable+0x64 + // SYNTHETIC: LEGO1 0x100824b0 // HistoryBook::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h index bbaa3e74..3e88a58a 100644 --- a/LEGO1/lego/legoomni/include/hospital.h +++ b/LEGO1/lego/legoomni/include/hospital.h @@ -12,6 +12,7 @@ class Hospital : public LegoWorld { virtual ~Hospital() override; // vtable+0x0 virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + virtual MxResult Tickle() override; // vtable+0x08 // FUNCTION: LEGO1 0x100746b0 inline virtual const char* ClassName() const override // vtable+0x0c @@ -26,6 +27,12 @@ class Hospital : public LegoWorld { return !strcmp(p_name, Hospital::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x100747d0 // Hospital::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/hospitalstate.h b/LEGO1/lego/legoomni/include/hospitalstate.h index 7fabe10a..af876f89 100644 --- a/LEGO1/lego/legoomni/include/hospitalstate.h +++ b/LEGO1/lego/legoomni/include/hospitalstate.h @@ -23,6 +23,8 @@ class HospitalState : public LegoState { return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + // SYNTHETIC: LEGO1 0x100764c0 // HospitalState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/isleactor.h b/LEGO1/lego/legoomni/include/isleactor.h index 1c2ddc5c..f9092363 100644 --- a/LEGO1/lego/legoomni/include/isleactor.h +++ b/LEGO1/lego/legoomni/include/isleactor.h @@ -6,6 +6,8 @@ // VTABLE: LEGO1 0x100d5178 class IsleActor : public LegoActor { public: + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + // FUNCTION: LEGO1 0x1000e660 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -18,6 +20,8 @@ class IsleActor : public LegoActor { { return !strcmp(p_name, IsleActor::ClassName()) || LegoActor::IsA(p_name); } + + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 }; // SYNTHETIC: LEGO1 0x1000e940 diff --git a/LEGO1/lego/legoomni/include/islepathactor.h b/LEGO1/lego/legoomni/include/islepathactor.h index 96a3dce7..e2944876 100644 --- a/LEGO1/lego/legoomni/include/islepathactor.h +++ b/LEGO1/lego/legoomni/include/islepathactor.h @@ -17,6 +17,8 @@ class IslePathActor : public LegoPathActor { // FUNCTION: LEGO1 0x10002e10 inline virtual ~IslePathActor() override { IslePathActor::Destroy(TRUE); } // vtable+0x0 + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + // FUNCTION: LEGO1 0x10002ea0 inline virtual const char* ClassName() const override // vtable+0x0c { diff --git a/LEGO1/lego/legoomni/include/jetski.h b/LEGO1/lego/legoomni/include/jetski.h index c0129dbd..c3136d80 100644 --- a/LEGO1/lego/legoomni/include/jetski.h +++ b/LEGO1/lego/legoomni/include/jetski.h @@ -3,6 +3,7 @@ #include "decomp.h" #include "islepathactor.h" +#include "mxtype17notificationparam.h" // VTABLE: LEGO1 0x100d9ec8 // SIZE 0x164 @@ -23,6 +24,12 @@ class Jetski : public IslePathActor { return !strcmp(p_name, Jetski::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam&) override; // vtable+0xd4 + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x1007e5c0 // Jetski::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h index 0bef74fa..7ee46589 100644 --- a/LEGO1/lego/legoomni/include/jukebox.h +++ b/LEGO1/lego/legoomni/include/jukebox.h @@ -10,6 +10,9 @@ class JukeBox : public LegoWorld { public: JukeBox(); + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + virtual MxResult Tickle() override; // vtable+0x8 + // FUNCTION: LEGO1 0x1005d6f0 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -23,6 +26,12 @@ class JukeBox : public LegoWorld { return !strcmp(p_name, JukeBox::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x1005d810 // JukeBox::`scalar deleting destructor' enum JukeBoxScript { diff --git a/LEGO1/lego/legoomni/include/jukeboxentity.h b/LEGO1/lego/legoomni/include/jukeboxentity.h index 81a47ef9..a0121eed 100644 --- a/LEGO1/lego/legoomni/include/jukeboxentity.h +++ b/LEGO1/lego/legoomni/include/jukeboxentity.h @@ -10,6 +10,8 @@ class JukeBoxEntity : public LegoEntity { JukeBoxEntity(); virtual ~JukeBoxEntity() override; // vtable+0x0 + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 + // FUNCTION: LEGO1 0x10085cc0 inline virtual const char* ClassName() const override // vtable+0x0c { diff --git a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h index c08e777f..bf771d45 100644 --- a/LEGO1/lego/legoomni/include/lego3dwavepresenter.h +++ b/LEGO1/lego/legoomni/include/lego3dwavepresenter.h @@ -20,6 +20,11 @@ class Lego3DWavePresenter : public MxWavePresenter { return !strcmp(p_name, Lego3DWavePresenter::ClassName()) || MxWavePresenter::IsA(p_name); } + virtual void StartingTickle() override; // vtable+0x1c + virtual void StreamingTickle() override; // vtable+0x20 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy() override; // vtable+0x38 + // SYNTHETIC: LEGO1 0x1000f4b0 // Lego3DWavePresenter::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h index 1f0138ce..4918fa76 100644 --- a/LEGO1/lego/legoomni/include/legoact2.h +++ b/LEGO1/lego/legoomni/include/legoact2.h @@ -3,10 +3,21 @@ #include "legocarraceactor.h" #include "legopathactor.h" +#include "legoworld.h" // VTABLE: LEGO1 0x100d82e0 // SIZE 0x1154 class LegoAct2 : public LegoWorld { + + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + virtual MxResult Tickle() override; // vtable+0x08 + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual void VTable0x60() override; // vtable+0x60 + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x1004fe20 // LegoAct2::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoact2state.h b/LEGO1/lego/legoomni/include/legoact2state.h index 2f8a2e79..b2ae4b7e 100644 --- a/LEGO1/lego/legoomni/include/legoact2state.h +++ b/LEGO1/lego/legoomni/include/legoact2state.h @@ -20,6 +20,8 @@ class LegoAct2State : public LegoState { return !strcmp(p_name, LegoAct2State::ClassName()) || LegoState::IsA(p_name); } + virtual MxBool VTable0x14() override; // vtable+0x14 + // SYNTHETIC: LEGO1 0x1000e040 // LegoAct2State::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoactor.h b/LEGO1/lego/legoomni/include/legoactor.h index a183a249..76beb249 100644 --- a/LEGO1/lego/legoomni/include/legoactor.h +++ b/LEGO1/lego/legoomni/include/legoactor.h @@ -24,6 +24,9 @@ class LegoActor : public LegoEntity { return !strcmp(p_name, LegoActor::ClassName()) || LegoEntity::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) override; // vtable+0x24 + // FUNCTION: LEGO1 0x10002cc0 virtual MxFloat VTable0x50() { return m_unk0x68; } // vtable+0x50 // FUNCTION: LEGO1 0x10002cd0 diff --git a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h index 520f3c09..790ee92c 100644 --- a/LEGO1/lego/legoomni/include/legoanimmmpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimmmpresenter.h @@ -9,6 +9,8 @@ class LegoAnimMMPresenter : public MxCompositePresenter { public: LegoAnimMMPresenter(); + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + // FUNCTION: LEGO1 0x1004a950 inline virtual const char* ClassName() const override // vtable+0x0c { @@ -22,6 +24,16 @@ class LegoAnimMMPresenter : public MxCompositePresenter { return !strcmp(p_name, LegoAnimMMPresenter::ClassName()) || MxCompositePresenter::IsA(p_name); } + virtual void ReadyTickle() override; // vtable+0x18 + virtual void StartingTickle() override; // vtable+0x1c + virtual void StreamingTickle() override; // vtable+0x20 + virtual void RepeatingTickle() override; // vtable+0x24 + virtual void DoneTickle() override; // vtable+0x2c + virtual void ParseExtra() override; // vtable+0x30 + virtual MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c + virtual void EndAction() override; // vtable+0x40 + virtual void VTable0x60(MxPresenter* p_presenter) override; // vtable+0x60 + // SYNTHETIC: LEGO1 0x1004aa40 // LegoAnimMMPresenter::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 5ff2f0c3..a5aa2df3 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -31,7 +31,9 @@ class LegoAnimPresenter : public MxVideoPresenter { virtual void ReadyTickle() override; // vtable+0x18 virtual void StartingTickle() override; // vtable+0x1c virtual void StreamingTickle() override; // vtable+0x20 + virtual void DoneTickle() override; // vtable+0x2c virtual void ParseExtra() override; // vtable+0x30 + virtual MxResult AddToManager() override; // vtable+0x34 virtual void Destroy() override; // vtable+0x38 virtual MxResult StartAction(MxStreamController* p_controller, MxDSAction* p_action) override; // vtable+0x3c virtual void EndAction() override; // vtable+0x40 diff --git a/LEGO1/lego/legoomni/include/legobuildingmanager.h b/LEGO1/lego/legoomni/include/legobuildingmanager.h index 5c0061d3..969657ca 100644 --- a/LEGO1/lego/legoomni/include/legobuildingmanager.h +++ b/LEGO1/lego/legoomni/include/legobuildingmanager.h @@ -10,6 +10,8 @@ class LegoBuildingManager : public MxCore { LegoBuildingManager(); virtual ~LegoBuildingManager() override; + virtual MxResult Tickle() override; // vtable+0x08 + // FUNCTION: LEGO1 0x1002f930 inline virtual const char* ClassName() const override // vtable+0x0c { diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h index c3b1b1f6..70db5856 100644 --- a/LEGO1/lego/legoomni/include/legocarbuild.h +++ b/LEGO1/lego/legoomni/include/legocarbuild.h @@ -26,6 +26,12 @@ class LegoCarBuild : public LegoWorld { return !strcmp(p_name, LegoCarBuild::ClassName()) || LegoWorld::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + // SYNTHETIC: LEGO1 0x10022a60 // LegoCarBuild::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h index 8bd5ba75..fb2d254d 100644 --- a/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legocarbuildanimpresenter.h @@ -23,6 +23,12 @@ class LegoCarBuildAnimPresenter : public LegoAnimPresenter { return !strcmp(p_name, LegoCarBuildAnimPresenter::ClassName()) || LegoAnimPresenter::IsA(p_name); } + virtual void ReadyTickle() override; // vtable+0x18 + virtual void StreamingTickle() override; // vtable+0x20 + virtual void RepeatingTickle() override; // vtable+0x24 + virtual void EndAction() override; // vtable+0x40 + virtual void PutFrame() override; // vtable+0x6c + // SYNTHETIC: LEGO1 0x10078660 // LegoCarBuildAnimPresenter::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legocarraceactor.h b/LEGO1/lego/legoomni/include/legocarraceactor.h index d88da3f7..5f2756a3 100644 --- a/LEGO1/lego/legoomni/include/legocarraceactor.h +++ b/LEGO1/lego/legoomni/include/legocarraceactor.h @@ -19,6 +19,14 @@ class LegoCarRaceActor : public LegoRaceActor { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoRaceActor::IsA(p_name); } + virtual void VTable0x68() override; // vtable+0x68 + virtual void VTable0x6c() override; // vtable+0x6c + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxS32 VTable0x90() override; // vtable+0x90 + virtual MxS32 VTable0x94() override; // vtable+0x94 + virtual void VTable0x98() override; // vtable+0x98 + virtual void VTable0x9c() override; // vtable+0x9c + // SYNTHETIC: LEGO1 0x10081610 // LegoCarRaceActor::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h index 8805d9cd..f5ec9205 100644 --- a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h +++ b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h @@ -10,6 +10,8 @@ // SIZE 0x20 class LegoEventNotificationParam : public MxNotificationParam { public: + virtual MxNotificationParam* Clone() override; // vtable+0x4 + inline LegoEventNotificationParam() : MxNotificationParam(c_notificationType0, NULL) {} inline LegoEventNotificationParam( NotificationId p_type, diff --git a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h index f5ea7420..9b136074 100644 --- a/LEGO1/lego/legoomni/include/legoflctexturepresenter.h +++ b/LEGO1/lego/legoomni/include/legoflctexturepresenter.h @@ -17,6 +17,10 @@ class LegoFlcTexturePresenter : public MxFlcPresenter { return "LegoFlcTexturePresenter"; } + virtual void StartingTickle() override; // vtable+0x1c + virtual void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68 + virtual void PutFrame() override; // vtable+0x6c + // SYNTHETIC: LEGO1 0x1005df00 // LegoFlcTexturePresenter::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legohideanimpresenter.h b/LEGO1/lego/legoomni/include/legohideanimpresenter.h index 59449283..06e8af33 100644 --- a/LEGO1/lego/legoomni/include/legohideanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legohideanimpresenter.h @@ -24,7 +24,12 @@ class LegoHideAnimPresenter : public LegoLoopingAnimPresenter { return !strcmp(p_name, ClassName()) || LegoAnimPresenter::IsA(p_name); } - virtual void Destroy() override; // vtable+0x38 + virtual void ReadyTickle() override; // vtable+0x18 + virtual void StartingTickle() override; // vtable+0x18 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy() override; // vtable+0x38 + virtual void EndAction() override; // vtable+0x40 + virtual void PutFrame() override; // vtable+0x6c private: void Init(); diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 0f068a90..5198f71e 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -38,6 +38,9 @@ class LegoInputManager : public MxPresenter { virtual MxResult Tickle() override; // vtable+0x8 + // FUNCTION: LEGO1 0x1005b8c0 + virtual MxResult PutData() override { return SUCCESS; }; // vtable+0x4c + MxResult Create(HWND p_hwnd); void Destroy(); void CreateAndAcquireKeyboard(HWND p_hwnd); diff --git a/LEGO1/lego/legoomni/include/legojetski.h b/LEGO1/lego/legoomni/include/legojetski.h index e4f876a3..ac376ab1 100644 --- a/LEGO1/lego/legoomni/include/legojetski.h +++ b/LEGO1/lego/legoomni/include/legojetski.h @@ -6,6 +6,8 @@ // VTABLE: LEGO1 0x100d5a40 class LegoJetski : public LegoJetskiRaceActor { public: + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + // FUNCTION: LEGO1 0x10013e80 inline const char* ClassName() const override // vtable+0xc { @@ -19,6 +21,14 @@ class LegoJetski : public LegoJetskiRaceActor { return !strcmp(p_name, LegoJetski::ClassName()) || LegoJetskiRaceActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + virtual void VTable0x6c() override; // vtable+0x6c + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxS32 VTable0x94() override; // vtable+0x94 + virtual void VTable0x98() override; // vtable+0x98 + virtual void VTable0x9c() override; // vtable+0x9c + // SYNTHETIC: LEGO1 0x10013e20 // LegoJetski::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legojetskiraceactor.h b/LEGO1/lego/legoomni/include/legojetskiraceactor.h index cd497525..8b3a38c7 100644 --- a/LEGO1/lego/legoomni/include/legojetskiraceactor.h +++ b/LEGO1/lego/legoomni/include/legojetskiraceactor.h @@ -19,6 +19,11 @@ class LegoJetskiRaceActor : public LegoCarRaceActor { return !strcmp(p_name, LegoJetskiRaceActor::ClassName()) || LegoCarRaceActor::IsA(p_name); } + virtual void VTable0x6c() override; // vtable+0x6c + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual void VTable0x98() override; // vtable+0x98 + virtual void VTable0x9c() override; // vtable+0x9c + // SYNTHETIC: LEGO1 0x10081d40 // LegoJetskiRaceActor::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h index 1c26cdec..dbfd478e 100644 --- a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h +++ b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h @@ -18,6 +18,11 @@ class LegoLoadCacheSoundPresenter : public MxWavePresenter { return "LegoLoadCacheSoundPresenter"; } + virtual void ReadyTickle() override; // vtable+0x18 + virtual void StreamingTickle() override; // vtable+0x20 + virtual void DoneTickle() override; // vtable+0x2c + virtual MxResult PutData() override; // vtable+0x4c + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h index 09370d0f..d6785fa2 100644 --- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h @@ -21,6 +21,15 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { return !strcmp(p_name, ClassName()) || LegoLoopingAnimPresenter::IsA(p_name); } + virtual void ReadyTickle() override; // vtable+0x18 + virtual void StartingTickle() override; // vtable+0x1c + virtual void StreamingTickle() override; // vtable+0x20 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy() override; // vtable+0x38 + virtual void EndAction() override; // vtable+0x40 + virtual void PutFrame() override; // vtable+0x6c + virtual MxResult VTable0x88(MxStreamChunk* p_chunk) override; // vtable+0x88 + // SYNTHETIC: LEGO1 0x1006cfe0 // LegoLocomotionAnimPresenter::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h b/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h index 844d1586..d4f47d7e 100644 --- a/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoloopinganimpresenter.h @@ -19,6 +19,9 @@ class LegoLoopingAnimPresenter : public LegoAnimPresenter { { return !strcmp(p_name, ClassName()) || LegoAnimPresenter::IsA(p_name); } + + virtual void StreamingTickle() override; // vtable+0x20 + virtual void PutFrame() override; // vtable+0x6c }; // SYNTHETIC: LEGO1 0x1006d000 diff --git a/LEGO1/lego/legoomni/include/legonavcontroller.h b/LEGO1/lego/legoomni/include/legonavcontroller.h index 2ae35245..dd2a46ad 100644 --- a/LEGO1/lego/legoomni/include/legonavcontroller.h +++ b/LEGO1/lego/legoomni/include/legonavcontroller.h @@ -37,7 +37,8 @@ class LegoNavController : public MxCore { ); LegoNavController(); - virtual ~LegoNavController() override; // vtable+0x0 + virtual ~LegoNavController() override; // vtable+0x0 + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 // FUNCTION: LEGO1 0x10054b80 inline const char* ClassName() const override // vtable+0xc diff --git a/LEGO1/lego/legoomni/include/legopartpresenter.h b/LEGO1/lego/legoomni/include/legopartpresenter.h index e847d39b..5a422684 100644 --- a/LEGO1/lego/legoomni/include/legopartpresenter.h +++ b/LEGO1/lego/legoomni/include/legopartpresenter.h @@ -20,6 +20,10 @@ class LegoPartPresenter : public MxMediaPresenter { return !strcmp(p_name, LegoPartPresenter::ClassName()) || MxMediaPresenter::IsA(p_name); } + virtual void ReadyTickle() override; // vtable+0x18 + virtual MxResult AddToManager() override; // vtable+0x34 + virtual void Destroy() override; // vtable+0x38 + __declspec(dllexport) static void configureLegoPartPresenter(MxS32, MxS32); // SYNTHETIC: LEGO1 0x1000d060 diff --git a/LEGO1/lego/legoomni/include/legopathactor.h b/LEGO1/lego/legoomni/include/legopathactor.h index be2c87e3..2f0ce280 100644 --- a/LEGO1/lego/legoomni/include/legopathactor.h +++ b/LEGO1/lego/legoomni/include/legopathactor.h @@ -25,6 +25,7 @@ class LegoPathActor : public LegoActor { return !strcmp(p_name, LegoPathActor::ClassName()) || LegoActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 virtual void VTable0x68(); // vtable+0x68 virtual void VTable0x6c(); // vtable+0x6c virtual void VTable0x70(float p_float); // vtable+0x70 diff --git a/LEGO1/lego/legoomni/include/legophonemepresenter.h b/LEGO1/lego/legoomni/include/legophonemepresenter.h index c643f261..b5aa3616 100644 --- a/LEGO1/lego/legoomni/include/legophonemepresenter.h +++ b/LEGO1/lego/legoomni/include/legophonemepresenter.h @@ -20,6 +20,11 @@ class LegoPhonemePresenter : public MxFlcPresenter { return "LegoPhonemePresenter"; } + virtual void StartingTickle() override; // vtable+0x1c + virtual void EndAction() override; // vtable+0x40 + virtual void LoadFrame(MxStreamChunk* p_chunk) override; // vtable+0x68 + virtual void PutFrame() override; // vtable+0x6c + // SYNTHETIC: LEGO1 0x1004e320 // LegoPhonemePresenter::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoraceactor.h b/LEGO1/lego/legoomni/include/legoraceactor.h index 6df40e43..fc6c6a2d 100644 --- a/LEGO1/lego/legoomni/include/legoraceactor.h +++ b/LEGO1/lego/legoomni/include/legoraceactor.h @@ -2,6 +2,7 @@ #define LEGORACEACTOR_H #include "legoanimactor.h" +#include "realtime/matrix.h" // VTABLE: LEGO1 0x100d5b88 class LegoRaceActor : public LegoAnimActor { @@ -19,6 +20,14 @@ class LegoRaceActor : public LegoAnimActor { return !strcmp(p_name, LegoRaceActor::ClassName()) || LegoAnimActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + virtual void VTable0x68() override; // vtable+0x68 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual void VTable0x74(Matrix4& p_transform) override; // vtable+0x74 + virtual MxS32 VTable0x90() override; // vtable+0x90 + virtual MxS32 VTable0x94() override; // vtable+0x94 + // SYNTHETIC: LEGO1 0x10014ab0 // LegoRaceActor::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legoracecar.h b/LEGO1/lego/legoomni/include/legoracecar.h index 7e200ff6..f080ba46 100644 --- a/LEGO1/lego/legoomni/include/legoracecar.h +++ b/LEGO1/lego/legoomni/include/legoracecar.h @@ -8,6 +8,8 @@ // SIZE 0x200 class LegoRaceCar : public LegoCarRaceActor { public: + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + // FUNCTION: LEGO1 0x10014290 inline const char* ClassName() const override // vtable+0xc { @@ -21,6 +23,14 @@ class LegoRaceCar : public LegoCarRaceActor { return !strcmp(p_name, LegoCarRaceActor::ClassName()) || LegoCarRaceActor::IsA(p_name); } + virtual void ParseAction(char*) override; // vtable+0x20 + virtual void SetWorldSpeed(MxFloat p_worldSpeed) override; // vtable+0x30 + virtual void VTable0x6c() override; // vtable+0x6c + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxS32 VTable0x94() override; // vtable+0x94 + virtual void VTable0x98() override; // vtable+0x98 + virtual void VTable0x9c() override; // vtable+0x9c + // SYNTHETIC: LEGO1 0x10014230 // LegoRaceCar::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h index f441dfad..8deed7a5 100644 --- a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h +++ b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h @@ -23,6 +23,8 @@ class LegoVehicleBuildState : public LegoState { return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + // SYNTHETIC: LEGO1 0x100260a0 // LegoVehicleBuildState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index 67a7805c..2fe7d7a4 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -32,7 +32,7 @@ class LegoVideoManager : public MxVideoManager { virtual MxResult RealizePalette(MxPalette*) override; // vtable+0x30 virtual void UpdateView(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height) override; // vtable+0x34 virtual void VTable0x38(undefined4, undefined4); // vtable+0x38 - // FUNCTION: LGEO1 0x1007ab10 + // FUNCTION: LEGO1 0x1007ab10 virtual LegoUnknown100d9d00* VTable0x3c() { return m_unk0x100d9d00; } // vtable+0x3c void SetSkyColor(float p_red, float p_green, float p_blue); diff --git a/LEGO1/lego/legoomni/include/motocycle.h b/LEGO1/lego/legoomni/include/motocycle.h index b4ccafd3..e7716a33 100644 --- a/LEGO1/lego/legoomni/include/motocycle.h +++ b/LEGO1/lego/legoomni/include/motocycle.h @@ -23,6 +23,13 @@ class Motocycle : public IslePathActor { return !strcmp(p_name, Motocycle::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual MxU32 VTable0xdc(MxType19NotificationParam&) override; // vtable+0xdc + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x100359d0 // Motocycle::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/pizza.h b/LEGO1/lego/legoomni/include/pizza.h index 835a5b2e..78eb4f75 100644 --- a/LEGO1/lego/legoomni/include/pizza.h +++ b/LEGO1/lego/legoomni/include/pizza.h @@ -15,21 +15,23 @@ class Pizza : public IsleActor { Pizza(); virtual ~Pizza() override; - virtual MxResult Tickle() override; // vtable+08 + virtual MxResult Tickle() override; // vtable+0x8 // FUNCTION: LEGO1 0x10037f90 - inline const char* ClassName() const // vtable+0c + inline const char* ClassName() const // vtable+0xc { // STRING: LEGO1 0x100f038c return "Pizza"; } // FUNCTION: LEGO1 0x10037fa0 - inline MxBool IsA(const char* p_name) const override // vtable+10 + inline MxBool IsA(const char* p_name) const override // vtable+0x10 { return !strcmp(p_name, Pizza::ClassName()) || IsleActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + // SYNTHETIC: LEGO1 0x100380e0 // Pizza::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h index 76690a99..e3867728 100644 --- a/LEGO1/lego/legoomni/include/pizzamissionstate.h +++ b/LEGO1/lego/legoomni/include/pizzamissionstate.h @@ -28,6 +28,8 @@ class PizzaMissionState : public LegoState { return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } // SYNTHETIC: LEGO1 0x10039350 diff --git a/LEGO1/lego/legoomni/include/pizzeria.h b/LEGO1/lego/legoomni/include/pizzeria.h index 1c73ca58..f75cf0a7 100644 --- a/LEGO1/lego/legoomni/include/pizzeria.h +++ b/LEGO1/lego/legoomni/include/pizzeria.h @@ -20,6 +20,8 @@ class Pizzeria : public IsleActor { return !strcmp(p_name, Pizzeria::ClassName()) || IsleActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + // SYNTHETIC: LEGO1 0x1000e8d0 // Pizzeria::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/pizzeriastate.h b/LEGO1/lego/legoomni/include/pizzeriastate.h index 188ee624..402981ff 100644 --- a/LEGO1/lego/legoomni/include/pizzeriastate.h +++ b/LEGO1/lego/legoomni/include/pizzeriastate.h @@ -22,6 +22,8 @@ class PizzeriaState : public LegoState { return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + // SYNTHETIC: LEGO1 0x10017ce0 // PizzeriaState::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 92e19b42..999ae4aa 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -30,11 +30,14 @@ class Police : public LegoWorld { return !strcmp(p_name, Police::ClassName()) || LegoWorld::IsA(p_name); } - // SYNTHETIC: LEGO1 0x1005e300 - // Police::`scalar deleting destructor' - virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 virtual void VTable0x50() override; // vtable+0x50 + virtual MxBool VTable0x5c() override; // vtable+0x5c + virtual MxBool VTable0x64() override; // vtable+0x64 + virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 + + // SYNTHETIC: LEGO1 0x1005e300 + // Police::`scalar deleting destructor' private: Radio m_radio; // 0xf8 diff --git a/LEGO1/lego/legoomni/include/policestate.h b/LEGO1/lego/legoomni/include/policestate.h index 517710ab..976588a3 100644 --- a/LEGO1/lego/legoomni/include/policestate.h +++ b/LEGO1/lego/legoomni/include/policestate.h @@ -23,11 +23,11 @@ class PoliceState : public LegoState { return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + // SYNTHETIC: LEGO1 0x1005e920 // PoliceState::`scalar deleting destructor' - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1C - private: undefined4 m_unk0x8; // 0x8 undefined4 m_unk0xc; // 0xc diff --git a/LEGO1/lego/legoomni/include/racecar.h b/LEGO1/lego/legoomni/include/racecar.h index 39005831..ddd4a9ac 100644 --- a/LEGO1/lego/legoomni/include/racecar.h +++ b/LEGO1/lego/legoomni/include/racecar.h @@ -24,6 +24,9 @@ class RaceCar : public IslePathActor { return !strcmp(p_name, RaceCar::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + // SYNTHETIC: LEGO1 0x10028400 // RaceCar::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/racestandsentity.h b/LEGO1/lego/legoomni/include/racestandsentity.h index 20b1b4a6..b2ca8ef3 100644 --- a/LEGO1/lego/legoomni/include/racestandsentity.h +++ b/LEGO1/lego/legoomni/include/racestandsentity.h @@ -6,6 +6,19 @@ // VTABLE: LEGO1 0x100d48a8 // SIZE 0x68 class RaceStandsEntity : public BuildingEntity { + // FUNCTION: LEGO1 0x1000efa0 + inline virtual const char* ClassName() const override // vtable+0x0c + { + // STRING: LEGO1 0x100f0300 + return "RaceStandsEntity"; + } + + // FUNCTION: LEGO1 0x1000efb0 + inline virtual MxBool IsA(const char* p_name) const override // vtable+0x10 + { + return !strcmp(p_name, RaceStandsEntity::ClassName()) || BuildingEntity::IsA(p_name); + } + // SYNTHETIC: LEGO1 0x1000f9e0 // RaceStandsEntity::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/racestate.h b/LEGO1/lego/legoomni/include/racestate.h index 05760e32..bfae3525 100644 --- a/LEGO1/lego/legoomni/include/racestate.h +++ b/LEGO1/lego/legoomni/include/racestate.h @@ -30,6 +30,8 @@ class RaceState : public LegoState { return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name); } + virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } // SYNTHETIC: LEGO1 0x100160d0 diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h index 3d8da44b..3afb44cb 100644 --- a/LEGO1/lego/legoomni/include/radio.h +++ b/LEGO1/lego/legoomni/include/radio.h @@ -10,6 +10,8 @@ class Radio : public MxCore { Radio(); virtual ~Radio() override; + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + // FUNCTION: LEGO1 0x1002c8e0 inline virtual const char* ClassName() const override // vtable+0x0c { diff --git a/LEGO1/lego/legoomni/include/radiostate.h b/LEGO1/lego/legoomni/include/radiostate.h index 1035a659..68dc154a 100644 --- a/LEGO1/lego/legoomni/include/radiostate.h +++ b/LEGO1/lego/legoomni/include/radiostate.h @@ -22,6 +22,8 @@ class RadioState : public LegoState { return !strcmp(p_name, RadioState::ClassName()) || LegoState::IsA(p_name); } + virtual MxBool VTable0x14() override; // vtable+0x14 + // SYNTHETIC: LEGO1 0x1002d020 // RadioState::`scalar deleting destructor' }; diff --git a/LEGO1/lego/legoomni/include/skateboard.h b/LEGO1/lego/legoomni/include/skateboard.h index 06adc8cb..f4154b8d 100644 --- a/LEGO1/lego/legoomni/include/skateboard.h +++ b/LEGO1/lego/legoomni/include/skateboard.h @@ -23,6 +23,12 @@ class SkateBoard : public IslePathActor { return !strcmp(p_name, SkateBoard::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd0() override; // vtable+0xd0 + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x1000ff60 // SkateBoard::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/towtrack.h b/LEGO1/lego/legoomni/include/towtrack.h index 39c4f630..8fb6b818 100644 --- a/LEGO1/lego/legoomni/include/towtrack.h +++ b/LEGO1/lego/legoomni/include/towtrack.h @@ -23,6 +23,15 @@ class TowTrack : public IslePathActor { return !strcmp(p_name, TowTrack::ClassName()) || IslePathActor::IsA(p_name); } + virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 + virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 + virtual void VTable0x70(float p_float) override; // vtable+0x70 + virtual MxU32 VTable0xcc() override; // vtable+0xcc + virtual MxU32 VTable0xd4(MxType17NotificationParam& p_param) override; // vtable+0xd4 + virtual MxU32 VTable0xd8(MxType18NotificationParam& p_param) override; // vtable+0xd8 + virtual MxU32 VTable0xdc(MxType19NotificationParam& p_param) override; // vtable+0xdc + virtual void VTable0xe4() override; // vtable+0xe4 + // SYNTHETIC: LEGO1 0x1004c950 // TowTrack::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/act1/act1state.cpp b/LEGO1/lego/legoomni/src/act1/act1state.cpp index 17f09277..6a36e3c3 100644 --- a/LEGO1/lego/legoomni/src/act1/act1state.cpp +++ b/LEGO1/lego/legoomni/src/act1/act1state.cpp @@ -13,6 +13,20 @@ Act1State::Act1State() m_unk0x1c = 1; } +// STUB: LEGO1 0x10033ac0 +MxResult Act1State::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x100346d0 +MxBool Act1State::SetFlag() +{ + // TODO + return FALSE; +} + // STUB: LEGO1 0x10034d00 void Act1State::FUN_10034d00() { diff --git a/LEGO1/lego/legoomni/src/act2/act2brick.cpp b/LEGO1/lego/legoomni/src/act2/act2brick.cpp index 77e46622..338d2ae9 100644 --- a/LEGO1/lego/legoomni/src/act2/act2brick.cpp +++ b/LEGO1/lego/legoomni/src/act2/act2brick.cpp @@ -12,6 +12,13 @@ Act2Brick::~Act2Brick() // TODO } +// STUB: LEGO1 0x1007a750 +MxS32 Act2Brick::VTable0x94() +{ + // TODO + return 0; +} + // STUB: LEGO1 0x1007a7f0 MxResult Act2Brick::Tickle() { diff --git a/LEGO1/lego/legoomni/src/act2/legoact2.cpp b/LEGO1/lego/legoomni/src/act2/legoact2.cpp new file mode 100644 index 00000000..c487e9a4 --- /dev/null +++ b/LEGO1/lego/legoomni/src/act2/legoact2.cpp @@ -0,0 +1,54 @@ +#include "legoact2.h" + +// STUB: LEGO1 0x1004fe10 +MxBool LegoAct2::VTable0x5c() +{ + // TODO + return FALSE; +} + +// STUB: LEGO1 0x1004ff20 +MxResult LegoAct2::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10050040 +MxResult LegoAct2::Tickle() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10050380 +MxLong LegoAct2::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10050a80 +void LegoAct2::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10050cf0 +void LegoAct2::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x100519c0 +void LegoAct2::VTable0x60() +{ + // TODO +} + +// STUB: LEGO1 0x100519d0 +MxBool LegoAct2::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/act2/legoact2state.cpp b/LEGO1/lego/legoomni/src/act2/legoact2state.cpp index 1ca6a144..46b09a93 100644 --- a/LEGO1/lego/legoomni/src/act2/legoact2state.cpp +++ b/LEGO1/lego/legoomni/src/act2/legoact2state.cpp @@ -1 +1,8 @@ #include "legoact2state.h" + +// STUB: LEGO1 0x1000df70 +MxBool LegoAct2State::VTable0x14() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/act3/act3.cpp b/LEGO1/lego/legoomni/src/act3/act3.cpp index 149e19a7..e17db3dc 100644 --- a/LEGO1/lego/legoomni/src/act3/act3.cpp +++ b/LEGO1/lego/legoomni/src/act3/act3.cpp @@ -8,8 +8,67 @@ Act3::Act3() // TODO } +// STUB: LEGO1 0x10072500 +MxBool Act3::VTable0x5c() +{ + // TODO + return FALSE; +} + // STUB: LEGO1 0x100726a0 Act3::~Act3() { // TODO } + +// STUB: LEGO1 0x10072c30 +MxResult Act3::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10072d50 +void Act3::Destroy(MxBool p_fromDestructor) +{ + // TODO +} + +// STUB: LEGO1 0x10072de0 +MxLong Act3::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10073270 +void Act3::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10073300 +MxResult Act3::Tickle() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10073a90 +void Act3::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x10073e40 +void Act3::VTable0x60() +{ + // TODO +} + +// STUB: LEGO1 0x10073e50 +MxBool Act3::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/act3/act3shark.cpp b/LEGO1/lego/legoomni/src/act3/act3shark.cpp index 95e5a0e0..f695234d 100644 --- a/LEGO1/lego/legoomni/src/act3/act3shark.cpp +++ b/LEGO1/lego/legoomni/src/act3/act3shark.cpp @@ -1 +1,25 @@ #include "act3shark.h" + +// STUB: LEGO1 0x1001a1c0 +void Act3Shark::VTable0x74(Matrix4& p_transform) +{ + // TODO +} + +// STUB: LEGO1 0x100430e0 +void Act3Shark::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x100430f0 +void Act3Shark::SetWorldSpeed(MxFloat p_worldSpeed) +{ + // TODO +} + +// STUB: LEGO1 0x10043100 +void Act3Shark::VTable0x70(float p_float) +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp new file mode 100644 index 00000000..580f3405 --- /dev/null +++ b/LEGO1/lego/legoomni/src/audio/lego3dwavepresenter.cpp @@ -0,0 +1,26 @@ +#include "lego3dwavepresenter.h" + +// STUB: LEGO1 0x1004a7c0 +MxResult Lego3DWavePresenter::AddToManager() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1004a7f0 +void Lego3DWavePresenter::Destroy() +{ + // TODO +} + +// STUB: LEGO1 0x1004a810 +void Lego3DWavePresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004a8b0 +void Lego3DWavePresenter::StreamingTickle() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp index 41445182..9aeac8ba 100644 --- a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp +++ b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp @@ -28,3 +28,28 @@ void LegoLoadCacheSoundPresenter::Destroy(MxBool p_fromDestructor) delete this->m_unk0x70; MxWavePresenter::Destroy(p_fromDestructor); } + +// STUB: LEGO1 0x10018510 +void LegoLoadCacheSoundPresenter::ReadyTickle() +{ + // TODO +} + +// STUB: LEGO1 0x100185f0 +void LegoLoadCacheSoundPresenter::StreamingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x100186f0 +void LegoLoadCacheSoundPresenter::DoneTickle() +{ + // TODO +} + +// STUB: LEGO1 0x10018700 +MxResult LegoLoadCacheSoundPresenter::PutData() +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/build/dunebuggy.cpp b/LEGO1/lego/legoomni/src/build/dunebuggy.cpp index a32b612d..857a316c 100644 --- a/LEGO1/lego/legoomni/src/build/dunebuggy.cpp +++ b/LEGO1/lego/legoomni/src/build/dunebuggy.cpp @@ -10,3 +10,43 @@ DuneBuggy::DuneBuggy() this->m_unk0x13c = 25.0; this->m_unk0x164 = 1.0; } + +// STUB: LEGO1 0x10067e30 +MxResult DuneBuggy::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10067ec0 +void DuneBuggy::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10067fa0 +void DuneBuggy::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x10068060 +MxU32 DuneBuggy::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100681b0 +MxU32 DuneBuggy::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10068270 +MxU32 DuneBuggy::VTable0xdc(MxType19NotificationParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp b/LEGO1/lego/legoomni/src/build/helicopterstate.cpp index 70d71a0c..368edfad 100644 --- a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopterstate.cpp @@ -1 +1,15 @@ #include "helicopterstate.h" + +// STUB: LEGO1 0x1000e0b0 +MxBool HelicopterState::VTable0x14() +{ + // TODO + return FALSE; +} + +// STUB: LEGO1 0x1000e0c0 +MxBool HelicopterState::SetFlag() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/build/jetski.cpp b/LEGO1/lego/legoomni/src/build/jetski.cpp index 8bdf3fff..4676ea91 100644 --- a/LEGO1/lego/legoomni/src/build/jetski.cpp +++ b/LEGO1/lego/legoomni/src/build/jetski.cpp @@ -9,3 +9,36 @@ Jetski::Jetski() this->m_unk0x150 = 2.0; this->m_unk0x148 = 1; } + +// STUB: LEGO1 0x1007e630 +MxResult Jetski::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1007e680 +void Jetski::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x1007e6f0 +void Jetski::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x1007e750 +MxU32 Jetski::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1007e8e0 +MxU32 Jetski::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp b/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp index 3e6c4d7b..ed890166 100644 --- a/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp +++ b/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp @@ -32,3 +32,10 @@ void LegoBuildingManager::FUN_1002fa00() { // TODO } + +// STUB: LEGO1 0x10030220 +MxResult LegoBuildingManager::Tickle() +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp index f75e4653..61576ece 100644 --- a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp +++ b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp @@ -6,12 +6,26 @@ LegoCarBuild::LegoCarBuild() // TODO } +// STUB: LEGO1 0x10022930 +MxBool LegoCarBuild::VTable0x5c() +{ + // TODO + return FALSE; +} + // STUB: LEGO1 0x10022a80 LegoCarBuild::~LegoCarBuild() { // TODO } +// STUB: LEGO1 0x10022b70 +MxResult LegoCarBuild::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + // STUB: LEGO1 0x100238b0 MxResult LegoCarBuild::Tickle() { @@ -27,3 +41,22 @@ MxLong LegoCarBuild::Notify(MxParam& p_param) return 0; } + +// STUB: LEGO1 0x100242c0 +void LegoCarBuild::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x100256c0 +void LegoCarBuild::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x10025e70 +MxBool LegoCarBuild::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp b/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp index b0dccde2..df9a0de6 100644 --- a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp +++ b/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp @@ -23,3 +23,10 @@ LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType) this->m_unk0x4e = 0; this->m_placedPartCount = 0; } + +// STUB: LEGO1 0x10026120 +MxResult LegoVehicleBuildState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/build/racecar.cpp b/LEGO1/lego/legoomni/src/build/racecar.cpp index 0fbc97b9..02f3a09d 100644 --- a/LEGO1/lego/legoomni/src/build/racecar.cpp +++ b/LEGO1/lego/legoomni/src/build/racecar.cpp @@ -13,3 +13,17 @@ RaceCar::~RaceCar() { // TODO } + +// STUB: LEGO1 0x10028490 +MxResult RaceCar::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x100284d0 +MxU32 RaceCar::VTable0xcc() +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/entity/legoactor.cpp b/LEGO1/lego/legoomni/src/entity/legoactor.cpp index e9010ef4..5c18b9d3 100644 --- a/LEGO1/lego/legoomni/src/entity/legoactor.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoactor.cpp @@ -17,3 +17,15 @@ LegoActor::~LegoActor() { // TODO } + +// STUB: LEGO1 0x1002d390 +void LegoActor::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x1002d670 +void LegoActor::SetROI(LegoROI* p_roi, MxBool p_bool1, MxBool p_bool2) +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp new file mode 100644 index 00000000..6e967472 --- /dev/null +++ b/LEGO1/lego/legoomni/src/entity/legocarraceactor.cpp @@ -0,0 +1,45 @@ +#include "legocarraceactor.h" + +// STUB: LEGO1 0x10014130 +void LegoCarRaceActor::VTable0x68() +{ + // TODO +} + +// STUB: LEGO1 0x100141a0 +MxS32 LegoCarRaceActor::VTable0x90() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1005d650 +MxS32 LegoCarRaceActor::VTable0x94() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10081830 +void LegoCarRaceActor::VTable0x6c() +{ + // TODO +} + +// STUB: LEGO1 0x10081d10 +void LegoCarRaceActor::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10081d20 +void LegoCarRaceActor::VTable0x98() +{ + // TODO +} + +// STUB: LEGO1 0x10081d30 +void LegoCarRaceActor::VTable0x9c() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/entity/legojetski.cpp b/LEGO1/lego/legoomni/src/entity/legojetski.cpp index d0fffd85..828b4f5b 100644 --- a/LEGO1/lego/legoomni/src/entity/legojetski.cpp +++ b/LEGO1/lego/legoomni/src/entity/legojetski.cpp @@ -1 +1,51 @@ #include "legojetski.h" + +// STUB: LEGO1 0x10013e70 +MxLong LegoJetski::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10014110 +void LegoJetski::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x10014120 +void LegoJetski::SetWorldSpeed(MxFloat p_worldSpeed) +{ + // TODO +} + +// STUB: LEGO1 0x10014140 +void LegoJetski::VTable0x6c() +{ + // TODO +} + +// STUB: LEGO1 0x10014180 +void LegoJetski::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x100141b0 +MxS32 LegoJetski::VTable0x94() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100141c0 +void LegoJetski::VTable0x98() +{ + // TODO +} + +// STUB: LEGO1 0x10014200 +void LegoJetski::VTable0x9c() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp b/LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp new file mode 100644 index 00000000..e8c7801f --- /dev/null +++ b/LEGO1/lego/legoomni/src/entity/legojetskiraceactor.cpp @@ -0,0 +1,25 @@ +#include "legojetskiraceactor.h" + +// STUB: LEGO1 0x10081fc0 +void LegoJetskiRaceActor::VTable0x6c() +{ + // TODO +} + +// STUB: LEGO1 0x100822c0 +void LegoJetskiRaceActor::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x100822d0 +void LegoJetskiRaceActor::VTable0x98() +{ + // TODO +} + +// STUB: LEGO1 0x100822e0 +void LegoJetskiRaceActor::VTable0x9c() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp index a806edd0..6a6a035c 100644 --- a/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp +++ b/LEGO1/lego/legoomni/src/entity/legonavcontroller.cpp @@ -222,3 +222,10 @@ float LegoNavController::CalculateNewVel(float p_targetVel, float p_currentVel, return newVel; } + +// STUB: LEGO1 0x10055a60 +MxLong LegoNavController::Notify(MxParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/entity/legopathactor.cpp b/LEGO1/lego/legoomni/src/entity/legopathactor.cpp index 472f2e4b..b3174f83 100644 --- a/LEGO1/lego/legoomni/src/entity/legopathactor.cpp +++ b/LEGO1/lego/legoomni/src/entity/legopathactor.cpp @@ -68,6 +68,12 @@ void LegoPathActor::VTable0x68() // TODO } +// STUB: LEGO1 0x1002f020 +void LegoPathActor::ParseAction(char*) +{ + // TODO +} + // STUB: LEGO1 0x1002f1b0 void LegoPathActor::VTable0x9c() { diff --git a/LEGO1/lego/legoomni/src/entity/legoraceactor.cpp b/LEGO1/lego/legoomni/src/entity/legoraceactor.cpp new file mode 100644 index 00000000..84022005 --- /dev/null +++ b/LEGO1/lego/legoomni/src/entity/legoraceactor.cpp @@ -0,0 +1,45 @@ +#include "legoraceactor.h" + +// STUB: LEGO1 0x10014190 +void LegoRaceActor::VTable0x74(Matrix4& p_transform) +{ + // TODO +} + +// STUB: LEGO1 0x10014ca0 +void LegoRaceActor::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x10014cb0 +void LegoRaceActor::SetWorldSpeed(MxFloat p_worldSpeed) +{ + // TODO +} + +// STUB: LEGO1 0x10014cc0 +void LegoRaceActor::VTable0x68() +{ + // TODO +} + +// STUB: LEGO1 0x10014cd0 +void LegoRaceActor::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10014ce0 +MxS32 LegoRaceActor::VTable0x90() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10014cf0 +MxS32 LegoRaceActor::VTable0x94() +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/entity/legoracecar.cpp b/LEGO1/lego/legoomni/src/entity/legoracecar.cpp new file mode 100644 index 00000000..8728783a --- /dev/null +++ b/LEGO1/lego/legoomni/src/entity/legoracecar.cpp @@ -0,0 +1,51 @@ +#include "legoracecar.h" + +// STUB: LEGO1 0x10014280 +MxLong LegoRaceCar::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100144d0 +void LegoRaceCar::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x100144e0 +void LegoRaceCar::SetWorldSpeed(MxFloat p_worldSpeed) +{ + // TODO +} + +// STUB: LEGO1 0x100144f0 +void LegoRaceCar::VTable0x6c() +{ + // TODO +} + +// STUB: LEGO1 0x10014530 +void LegoRaceCar::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10014540 +MxS32 LegoRaceCar::VTable0x94() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10014550 +void LegoRaceCar::VTable0x98() +{ + // TODO +} + +// STUB: LEGO1 0x10014580 +void LegoRaceCar::VTable0x9c() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp index 7f7aff11..8bedf0cf 100644 --- a/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp +++ b/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp @@ -19,12 +19,26 @@ GasStation::GasStation() NotificationManager()->Register(this); } +// STUB: LEGO1 0x10004770 +MxBool GasStation::VTable0x5c() +{ + // TODO + return FALSE; +} + // STUB: LEGO1 0x100048c0 GasStation::~GasStation() { // TODO } +// STUB: LEGO1 0x10004990 +MxResult GasStation::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + // STUB: LEGO1 0x10004a60 MxLong GasStation::Notify(MxParam& p_param) { @@ -33,6 +47,18 @@ MxLong GasStation::Notify(MxParam& p_param) return 0; } +// STUB: LEGO1 0x10004b30 +void GasStation::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10005c40 +void GasStation::VTable0x68(MxBool p_add) +{ + // TODO +} + // STUB: LEGO1 0x10005c90 MxResult GasStation::Tickle() { @@ -40,3 +66,10 @@ MxResult GasStation::Tickle() return 0; } + +// STUB: LEGO1 0x10005e70 +MxBool GasStation::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp index b4ec4dfd..5bbcdde6 100644 --- a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp +++ b/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp @@ -16,3 +16,10 @@ GasStationState::GasStationState() unk0x08[1] = -1; unk0x08[2] = -1; } + +// STUB: LEGO1 0x10006300 +MxResult GasStationState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/hospital/ambulance.cpp b/LEGO1/lego/legoomni/src/hospital/ambulance.cpp index 1d9ca918..a7bd2689 100644 --- a/LEGO1/lego/legoomni/src/hospital/ambulance.cpp +++ b/LEGO1/lego/legoomni/src/hospital/ambulance.cpp @@ -19,3 +19,63 @@ Ambulance::Ambulance() this->m_unk0x13c = 40.0; this->m_unk0x17c = 1.0; } + +// STUB: LEGO1 0x10035f90 +void Ambulance::Destroy(MxBool p_fromDestructor) +{ + // TODO +} + +// STUB: LEGO1 0x100361d0 +MxResult Ambulance::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10036300 +void Ambulance::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10036420 +MxLong Ambulance::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10036860 +MxU32 Ambulance::VTable0xdc(MxType19NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10036ce0 +MxU32 Ambulance::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10036e90 +void Ambulance::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x10036f90 +MxU32 Ambulance::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10037160 +MxResult Ambulance::Tickle() +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp b/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp index 4213a587..601f1ccd 100644 --- a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp +++ b/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp @@ -18,3 +18,10 @@ AmbulanceMissionState::AmbulanceMissionState() m_color4 = 0; m_color5 = 0; } + +// STUB: LEGO1 0x10037440 +MxResult AmbulanceMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/hospital/hospital.cpp b/LEGO1/lego/legoomni/src/hospital/hospital.cpp index e8de5495..8ede37e2 100644 --- a/LEGO1/lego/legoomni/src/hospital/hospital.cpp +++ b/LEGO1/lego/legoomni/src/hospital/hospital.cpp @@ -23,12 +23,26 @@ Hospital::Hospital() NotificationManager()->Register(this); } +// STUB: LEGO1 0x100746a0 +MxBool Hospital::VTable0x5c() +{ + // TODO + return FALSE; +} + // STUB: LEGO1 0x100747f0 Hospital::~Hospital() { // TODO } +// STUB: LEGO1 0x100748c0 +MxResult Hospital::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + // STUB: LEGO1 0x10074990 MxLong Hospital::Notify(MxParam& p_param) { @@ -36,3 +50,29 @@ MxLong Hospital::Notify(MxParam& p_param) return 0; } + +// STUB: LEGO1 0x10074a60 +void Hospital::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10076220 +void Hospital::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x10076270 +MxResult Hospital::Tickle() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10076330 +MxBool Hospital::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp b/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp index 4f865128..5921cd0c 100644 --- a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp +++ b/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp @@ -12,3 +12,10 @@ HospitalState::HospitalState() this->m_unk0x14 = 0; this->m_unk0x16 = 0; } + +// STUB: LEGO1 0x10076530 +MxResult HospitalState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/bike.cpp b/LEGO1/lego/legoomni/src/isle/bike.cpp index 3c27ebc5..1c71b299 100644 --- a/LEGO1/lego/legoomni/src/isle/bike.cpp +++ b/LEGO1/lego/legoomni/src/isle/bike.cpp @@ -9,3 +9,30 @@ Bike::Bike() this->m_unk0x150 = 3.0; this->m_unk0x148 = 1; } + +// STUB: LEGO1 0x100768f0 +MxResult Bike::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10076920 +void Bike::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x100769a0 +MxU32 Bike::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10076aa0 +MxU32 Bike::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/bumpbouy.cpp b/LEGO1/lego/legoomni/src/isle/bumpbouy.cpp index c4c8069d..6ae105ff 100644 --- a/LEGO1/lego/legoomni/src/isle/bumpbouy.cpp +++ b/LEGO1/lego/legoomni/src/isle/bumpbouy.cpp @@ -1 +1,32 @@ #include "bumpbouy.h" + +// STUB: LEGO1 0x1000fd00 +void BumpBouy::ParseAction(char*) +{ + // TODO +} + +// STUB: LEGO1 0x1000fd10 +void BumpBouy::SetWorldSpeed(MxFloat p_worldSpeed) +{ + // TODO +} + +// STUB: LEGO1 0x1000fd20 +void BumpBouy::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x1000fd30 +void BumpBouy::VTable0x74(Matrix4& p_transform) +{ + // TODO +} + +// STUB: LEGO1 0x100274d0 +MxLong BumpBouy::Notify(MxParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/doors.cpp b/LEGO1/lego/legoomni/src/isle/doors.cpp new file mode 100644 index 00000000..aa7e2031 --- /dev/null +++ b/LEGO1/lego/legoomni/src/isle/doors.cpp @@ -0,0 +1,20 @@ +#include "doors.h" + +// STUB: LEGO1 0x10066100 +MxS32 Doors::VTable0x94() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10066250 +void Doors::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x100664e0 +void Doors::ParseAction(char*) +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/isle/historybook.cpp b/LEGO1/lego/legoomni/src/isle/historybook.cpp index d00e8acd..f5a970b3 100644 --- a/LEGO1/lego/legoomni/src/isle/historybook.cpp +++ b/LEGO1/lego/legoomni/src/isle/historybook.cpp @@ -12,6 +12,13 @@ HistoryBook::~HistoryBook() // TODO } +// STUB: LEGO1 0x10082610 +MxResult HistoryBook::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + // STUB: LEGO1 0x10082680 MxLong HistoryBook::Notify(MxParam& p_param) { @@ -19,3 +26,16 @@ MxLong HistoryBook::Notify(MxParam& p_param) return 0; } + +// STUB: LEGO1 0x100826f0 +void HistoryBook::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10082a10 +MxBool HistoryBook::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/isle/isleactor.cpp b/LEGO1/lego/legoomni/src/isle/isleactor.cpp index a28afc6b..b6ac3556 100644 --- a/LEGO1/lego/legoomni/src/isle/isleactor.cpp +++ b/LEGO1/lego/legoomni/src/isle/isleactor.cpp @@ -2,3 +2,17 @@ // NOTE: This is copied from base class LegoActor. IsleActor may in fact be larger but we don't know yet. DECOMP_SIZE_ASSERT(IsleActor, 0x78) + +// STUB: LEGO1 0x1002c780 +MxResult IsleActor::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1002c7b0 +MxLong IsleActor::Notify(MxParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/islepathactor.cpp b/LEGO1/lego/legoomni/src/isle/islepathactor.cpp index 76ec41bd..b93535f6 100644 --- a/LEGO1/lego/legoomni/src/isle/islepathactor.cpp +++ b/LEGO1/lego/legoomni/src/isle/islepathactor.cpp @@ -24,6 +24,13 @@ void IslePathActor::Destroy(MxBool p_fromDestructor) LegoPathActor::Destroy(FALSE); } +// STUB: LEGO1 0x1001a2c0 +MxLong IslePathActor::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + // STUB: LEGO1 0x1001a350 void IslePathActor::VTable0xe0() { diff --git a/LEGO1/lego/legoomni/src/isle/jukebox.cpp b/LEGO1/lego/legoomni/src/isle/jukebox.cpp index d5ded948..687c0a79 100644 --- a/LEGO1/lego/legoomni/src/isle/jukebox.cpp +++ b/LEGO1/lego/legoomni/src/isle/jukebox.cpp @@ -12,3 +12,50 @@ JukeBox::JukeBox() m_unk0xfc = 0; NotificationManager()->Register(this); } + +// STUB: LEGO1 0x1005d6e0 +MxBool JukeBox::VTable0x5c() +{ + // TODO + return FALSE; +} + +// STUB: LEGO1 0x1005d8d0 +MxResult JukeBox::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1005d980 +MxLong JukeBox::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1005d9f0 +void JukeBox::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x1005dde0 +void JukeBox::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x1005de30 +MxResult JukeBox::Tickle() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1005de70 +MxBool JukeBox::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/isle/jukeboxentity.cpp b/LEGO1/lego/legoomni/src/isle/jukeboxentity.cpp index 73071896..026772c0 100644 --- a/LEGO1/lego/legoomni/src/isle/jukeboxentity.cpp +++ b/LEGO1/lego/legoomni/src/isle/jukeboxentity.cpp @@ -11,3 +11,10 @@ JukeBoxEntity::~JukeBoxEntity() { // TODO } + +// STUB: LEGO1 0x10085e40 +MxLong JukeBoxEntity::Notify(MxParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/motocycle.cpp b/LEGO1/lego/legoomni/src/isle/motocycle.cpp index 2628d7ce..c54bd841 100644 --- a/LEGO1/lego/legoomni/src/isle/motocycle.cpp +++ b/LEGO1/lego/legoomni/src/isle/motocycle.cpp @@ -10,3 +10,43 @@ Motocycle::Motocycle() this->m_unk0x148 = 1; this->m_unk0x164 = 1.0; } + +// STUB: LEGO1 0x10035a40 +MxResult Motocycle::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10035ad0 +void Motocycle::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x10035bc0 +void Motocycle::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x10035c50 +MxU32 Motocycle::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10035d70 +MxU32 Motocycle::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10035df0 +MxU32 Motocycle::VTable0xdc(MxType19NotificationParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/isle/radio.cpp b/LEGO1/lego/legoomni/src/isle/radio.cpp index f1befefd..c87ac04e 100644 --- a/LEGO1/lego/legoomni/src/isle/radio.cpp +++ b/LEGO1/lego/legoomni/src/isle/radio.cpp @@ -23,6 +23,13 @@ Radio::~Radio() // TODO } +// STUB: LEGO1 0x1002ca30 +MxLong Radio::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + // FUNCTION: LEGO1 0x1002cde0 void Radio::CreateRadioState() { diff --git a/LEGO1/lego/legoomni/src/isle/radiostate.cpp b/LEGO1/lego/legoomni/src/isle/radiostate.cpp index 012eea68..08aa91fa 100644 --- a/LEGO1/lego/legoomni/src/isle/radiostate.cpp +++ b/LEGO1/lego/legoomni/src/isle/radiostate.cpp @@ -5,3 +5,10 @@ RadioState::RadioState() { // TODO } + +// STUB: LEGO1 0x1002cf50 +MxBool RadioState::VTable0x14() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/isle/skateboard.cpp b/LEGO1/lego/legoomni/src/isle/skateboard.cpp index 96a26bcd..2863ec40 100644 --- a/LEGO1/lego/legoomni/src/isle/skateboard.cpp +++ b/LEGO1/lego/legoomni/src/isle/skateboard.cpp @@ -1,4 +1,4 @@ -#include "skateboard.h" +#include "SkateBoard.h" #include "decomp.h" #include "mxnotificationmanager.h" @@ -16,3 +16,37 @@ SkateBoard::SkateBoard() NotificationManager()->Register(this); } + +// STUB: LEGO1 0x10010000 +MxResult SkateBoard::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10010050 +void SkateBoard::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x100100e0 +MxU32 SkateBoard::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10010230 +MxU32 SkateBoard::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100104f0 +MxU32 SkateBoard::VTable0xd0() +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp b/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp index b6abd2c4..299bbe33 100644 --- a/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp +++ b/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp @@ -3,3 +3,10 @@ #include "decomp.h" DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20); + +// STUB: LEGO1 0x10028690 +MxNotificationParam* LegoEventNotificationParam::Clone() +{ + // TODO + return NULL; +} diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizza.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizza.cpp index 3b0201f6..8b7efe78 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizza.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizza.cpp @@ -20,6 +20,13 @@ Pizza::~Pizza() TickleManager()->UnregisterClient(this); } +// STUB: LEGO1 0x10038170 +MxResult Pizza::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + // STUB: LEGO1 0x100388a0 MxResult Pizza::Tickle() { diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp index a7aa59b4..6fb460a1 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp @@ -3,6 +3,13 @@ DECOMP_SIZE_ASSERT(PizzaMissionStateEntry, 0x20) DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0) +// STUB: LEGO1 0x100393c0 +MxResult PizzaMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} + // FUNCTION: LEGO1 0x10039510 PizzaMissionStateEntry* PizzaMissionState::GetState(MxU8 p_id) { diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzeria.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzeria.cpp index 3b6e8d41..84404f01 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzeria.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzeria.cpp @@ -1 +1,8 @@ #include "pizzeria.h" + +// STUB: LEGO1 0x100179c0 +MxResult Pizzeria::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp index ea54a028..3422c68d 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp @@ -5,3 +5,10 @@ PizzeriaState::PizzeriaState() { // TODO } + +// STUB: LEGO1 0x10017da0 +MxResult PizzeriaState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} diff --git a/LEGO1/lego/legoomni/src/police/police.cpp b/LEGO1/lego/legoomni/src/police/police.cpp index 89874e00..42456814 100644 --- a/LEGO1/lego/legoomni/src/police/police.cpp +++ b/LEGO1/lego/legoomni/src/police/police.cpp @@ -17,6 +17,13 @@ Police::Police() NotificationManager()->Register(this); } +// STUB: LEGO1 0x1005e1d0 +MxBool Police::VTable0x5c() +{ + // TODO + return FALSE; +} + // FUNCTION: LEGO1 0x1005e320 Police::~Police() { @@ -68,3 +75,16 @@ void Police::VTable0x50() PlayMusic(JukeBox::e_policeStation); FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); } + +// STUB: LEGO1 0x1005e740 +void Police::VTable0x68(MxBool p_add) +{ + // TODO +} + +// STUB: LEGO1 0x1005e790 +MxBool Police::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/race/carrace.cpp b/LEGO1/lego/legoomni/src/race/carrace.cpp index 9fdb353f..2e5c3b11 100644 --- a/LEGO1/lego/legoomni/src/race/carrace.cpp +++ b/LEGO1/lego/legoomni/src/race/carrace.cpp @@ -8,3 +8,51 @@ CarRace::CarRace() this->m_unk0x150 = 0; this->m_unk0x130 = MxRect32(0x16c, 0x154, 0x1ec, 0x15e); } + +// STUB: LEGO1 0x10016ce0 +MxResult CarRace::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x10016dd0 +void CarRace::VTable0x50() +{ + // TODO +} + +// STUB: LEGO1 0x10016f60 +undefined4 CarRace::VTable0x74(undefined4) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100170e0 +undefined4 CarRace::VTable0x70(undefined4) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10017650 +undefined4 CarRace::VTable0x6c(undefined4) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x100177e0 +undefined4 CarRace::VTable0x78(undefined4) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x10017900 +MxBool CarRace::VTable0x64() +{ + // TODO + return FALSE; +} diff --git a/LEGO1/lego/legoomni/src/race/racestate.cpp b/LEGO1/lego/legoomni/src/race/racestate.cpp index 4776f97c..bdc003f0 100644 --- a/LEGO1/lego/legoomni/src/race/racestate.cpp +++ b/LEGO1/lego/legoomni/src/race/racestate.cpp @@ -11,6 +11,13 @@ RaceState::RaceState() // TODO } +// STUB: LEGO1 0x10016140 +MxResult RaceState::VTable0x1c(LegoFileStream* p_legoFileStream) +{ + // TODO + return SUCCESS; +} + // FUNCTION: LEGO1 0x10016280 RaceStateEntry* RaceState::GetState(MxU8 p_id) { diff --git a/LEGO1/lego/legoomni/src/towtrack/towtrack.cpp b/LEGO1/lego/legoomni/src/towtrack/towtrack.cpp index 3fd0d84d..eb05e57b 100644 --- a/LEGO1/lego/legoomni/src/towtrack/towtrack.cpp +++ b/LEGO1/lego/legoomni/src/towtrack/towtrack.cpp @@ -15,3 +15,57 @@ TowTrack::TowTrack() this->m_unk0x13c = 40.0; this->m_unk0x178 = 1.0; } + +// STUB: LEGO1 0x1004c9e0 +MxResult TowTrack::Create(MxDSAction& p_dsAction) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1004cb10 +void TowTrack::VTable0x70(float p_float) +{ + // TODO +} + +// STUB: LEGO1 0x1004cc80 +MxLong TowTrack::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1004cd30 +MxU32 TowTrack::VTable0xd8(MxType18NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1004d330 +MxU32 TowTrack::VTable0xdc(MxType19NotificationParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1004d690 +MxU32 TowTrack::VTable0xcc() +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1004d8f0 +void TowTrack::VTable0xe4() +{ + // TODO +} + +// STUB: LEGO1 0x1004d9e0 +MxU32 TowTrack::VTable0xd4(MxType17NotificationParam& p_param) +{ + // TODO + return 0; +} diff --git a/LEGO1/lego/legoomni/src/video/legoanimmmpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimmmpresenter.cpp index a6e20919..6b5a6040 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimmmpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimmmpresenter.cpp @@ -5,3 +5,65 @@ LegoAnimMMPresenter::LegoAnimMMPresenter() { // TODO } + +// STUB: LEGO1 0x1004aaf0 +MxResult LegoAnimMMPresenter::StartAction(MxStreamController* p_controller, MxDSAction* p_action) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1004aec0 +void LegoAnimMMPresenter::EndAction() +{ + // TODO +} + +// STUB: LEGO1 0x1004b140 +void LegoAnimMMPresenter::ReadyTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004b1c0 +void LegoAnimMMPresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004b220 +void LegoAnimMMPresenter::StreamingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004b250 +void LegoAnimMMPresenter::RepeatingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004b2c0 +void LegoAnimMMPresenter::DoneTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004b2d0 +MxLong LegoAnimMMPresenter::Notify(MxParam& p_param) +{ + // TODO + return 0; +} + +// STUB: LEGO1 0x1004b360 +void LegoAnimMMPresenter::VTable0x60(MxPresenter* p_presenter) +{ + // TODO +} + +// STUB: LEGO1 0x1004b390 +void LegoAnimMMPresenter::ParseExtra() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 31fe68b3..d5f50654 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -155,6 +155,19 @@ void LegoAnimPresenter::StreamingTickle() } } +// STUB: LEGO1 0x1006b8c0 +void LegoAnimPresenter::DoneTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006b8d0 +MxResult LegoAnimPresenter::AddToManager() +{ + // TODO + return SUCCESS; +} + // FUNCTION: LEGO1 0x1006b8e0 void LegoAnimPresenter::Destroy() { diff --git a/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp index 0b5ba549..24bb175b 100644 --- a/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legocarbuildanimpresenter.cpp @@ -6,8 +6,38 @@ LegoCarBuildAnimPresenter::LegoCarBuildAnimPresenter() // TODO } +// STUB: LEGO1 0x10078500 +void LegoCarBuildAnimPresenter::RepeatingTickle() +{ + // TODO +} + // STUB: LEGO1 0x10078680 LegoCarBuildAnimPresenter::~LegoCarBuildAnimPresenter() { // TODO } + +// STUB: LEGO1 0x10078790 +void LegoCarBuildAnimPresenter::PutFrame() +{ + // TODO +} + +// STUB: LEGO1 0x100788c0 +void LegoCarBuildAnimPresenter::ReadyTickle() +{ + // TODO +} + +// STUB: LEGO1 0x100789e0 +void LegoCarBuildAnimPresenter::StreamingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x10078db0 +void LegoCarBuildAnimPresenter::EndAction() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp b/LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp index f96d2b47..8d77a1eb 100644 --- a/LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoflctexturepresenter.cpp @@ -14,3 +14,21 @@ void LegoFlcTexturePresenter::Init() this->m_unk0x68 = 0; this->m_unk0x6c = 0; } + +// STUB: LEGO1 0x1005df80 +void LegoFlcTexturePresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1005e0c0 +void LegoFlcTexturePresenter::LoadFrame(MxStreamChunk* p_chunk) +{ + // TODO +} + +// STUB: LEGO1 0x1005e100 +void LegoFlcTexturePresenter::PutFrame() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp index 00718629..07035332 100644 --- a/LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legohideanimpresenter.cpp @@ -36,8 +36,39 @@ void LegoHideAnimPresenter::Destroy(MxBool p_fromDestructor) LegoHideAnimPresenter::Destroy(); } +// STUB: LEGO1 0x1006dab0 +MxResult LegoHideAnimPresenter::AddToManager() +{ + // TODO + return SUCCESS; +} + // FUNCTION: LEGO1 0x1006dac0 void LegoHideAnimPresenter::Destroy() { Destroy(FALSE); } + +// STUB: LEGO1 0x1006dad0 +void LegoHideAnimPresenter::PutFrame() +{ + // TODO +} + +// STUB: LEGO1 0x1006dae0 +void LegoHideAnimPresenter::ReadyTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006db20 +void LegoHideAnimPresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006e9e0 +void LegoHideAnimPresenter::EndAction() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp index 27d6e421..debe6659 100644 --- a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp @@ -11,3 +11,53 @@ void LegoLocomotionAnimPresenter::Init() { // TODO } + +// STUB: LEGO1 0x1006d140 +MxResult LegoLocomotionAnimPresenter::VTable0x88(MxStreamChunk* p_chunk) +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1006d160 +MxResult LegoLocomotionAnimPresenter::AddToManager() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1006d5b0 +void LegoLocomotionAnimPresenter::Destroy() +{ + // TODO +} + +// STUB: LEGO1 0x1006d5c0 +void LegoLocomotionAnimPresenter::PutFrame() +{ + // TODO +} + +// STUB: LEGO1 0x1006d5d0 +void LegoLocomotionAnimPresenter::ReadyTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006d610 +void LegoLocomotionAnimPresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006d660 +void LegoLocomotionAnimPresenter::StreamingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006d670 +void LegoLocomotionAnimPresenter::EndAction() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp new file mode 100644 index 00000000..8cfb3499 --- /dev/null +++ b/LEGO1/lego/legoomni/src/video/legoloopinganimpresenter.cpp @@ -0,0 +1,13 @@ +#include "legoloopinganimpresenter.h" + +// STUB: LEGO1 0x1006caa0 +void LegoLoopingAnimPresenter::StreamingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1006cb40 +void LegoLoopingAnimPresenter::PutFrame() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp b/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp index 1ae834f9..545d2f65 100644 --- a/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legopartpresenter.cpp @@ -6,9 +6,28 @@ int g_partPresenterConfig1 = 1; // GLOBAL: LEGO1 0x100f7aa4 int g_partPresenterConfig2 = 100; +// STUB: LEGO1 0x1000cf60 +void LegoPartPresenter::Destroy() +{ + // TODO +} + // FUNCTION: LEGO1 0x1007c990 void LegoPartPresenter::configureLegoPartPresenter(MxS32 p_partPresenterConfig1, MxS32 p_partPresenterConfig2) { g_partPresenterConfig1 = p_partPresenterConfig1; g_partPresenterConfig2 = p_partPresenterConfig2; } + +// STUB: LEGO1 0x1007c9b0 +MxResult LegoPartPresenter::AddToManager() +{ + // TODO + return SUCCESS; +} + +// STUB: LEGO1 0x1007deb0 +void LegoPartPresenter::ReadyTickle() +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp b/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp index 31948367..4d128531 100644 --- a/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legophonemepresenter.cpp @@ -21,3 +21,27 @@ void LegoPhonemePresenter::Init() m_unk0x70 = 0; m_unk0x84 = 0; } + +// STUB: LEGO1 0x1004e3d0 +void LegoPhonemePresenter::StartingTickle() +{ + // TODO +} + +// STUB: LEGO1 0x1004e800 +void LegoPhonemePresenter::LoadFrame(MxStreamChunk* p_chunk) +{ + // TODO +} + +// STUB: LEGO1 0x1004e840 +void LegoPhonemePresenter::PutFrame() +{ + // TODO +} + +// STUB: LEGO1 0x1004e870 +void LegoPhonemePresenter::EndAction() +{ + // TODO +} diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp index 9d530b16..0f262a51 100644 --- a/LEGO1/lego/sources/roi/legoroi.cpp +++ b/LEGO1/lego/sources/roi/legoroi.cpp @@ -119,6 +119,12 @@ void LegoROI::SetDisplayBB(MxS32 p_displayBB) // Intentionally empty function } +// FUNCTION: LEGO1 0x100aa340 +float LegoROI::IntrinsicImportance() const +{ + return .5; +} + // Note: Actually part of parent class (doesn't exist yet) // STUB: LEGO1 0x100aa350 void LegoROI::UpdateWorldBoundingVolumes() diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 302a0bd8..5dfac62f 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -17,6 +17,7 @@ class LegoROI : public ViewROI { public: LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList, MxTime p_time); + virtual float IntrinsicImportance() const override; // vtable+0x4 // Note: Actually part of parent class (doesn't exist yet) virtual void UpdateWorldBoundingVolumes() override; // vtable+0x18 diff --git a/LEGO1/mxgeometry/mxmatrix.h b/LEGO1/mxgeometry/mxmatrix.h index 2db07671..3ae03404 100644 --- a/LEGO1/mxgeometry/mxmatrix.h +++ b/LEGO1/mxgeometry/mxmatrix.h @@ -10,6 +10,9 @@ class MxMatrix : public Matrix4 { inline MxMatrix() : Matrix4(m_elements) {} inline MxMatrix(const MxMatrix& p_matrix) : Matrix4(m_elements) { Equals(p_matrix); } + // FUNCTION: LEGO1 0x10002850 + virtual void operator=(const Matrix4& p_matrix) { Equals(p_matrix); } // vtable+0x28 + // No idea why there's another equals. Maybe to some other type like the // DirectX Retained Mode Matrix type which is also a float* alias? // FUNCTION: LEGO1 0x10002860 diff --git a/LEGO1/tgl/d3drm/group.cpp b/LEGO1/tgl/d3drm/group.cpp index 4b966cd2..bc7da727 100644 --- a/LEGO1/tgl/d3drm/group.cpp +++ b/LEGO1/tgl/d3drm/group.cpp @@ -112,7 +112,7 @@ Result GroupImpl::RemoveAll() return Error; } -// STUB: LEGO1 0x100a34c0 +// STUB: LEGO1 0x100a3540 Result GroupImpl::Unknown() { return Error; diff --git a/LEGO1/tgl/d3drm/impl.h b/LEGO1/tgl/d3drm/impl.h index 1e017cf2..614b5f60 100644 --- a/LEGO1/tgl/d3drm/impl.h +++ b/LEGO1/tgl/d3drm/impl.h @@ -63,7 +63,6 @@ class RendererImpl : public Renderer { // vtable+0x20 virtual Unk* CreateUnk() override; - virtual Texture* CreateTexture() override; virtual Texture* CreateTexture( int width, int height, @@ -73,6 +72,8 @@ class RendererImpl : public Renderer { int paletteEntryCount, const PaletteEntry* pEntries ) override; + virtual Texture* CreateTexture() override; + virtual Result SetTextureDefaultShadeCount(unsigned long) override; // vtable+0x30 @@ -307,12 +308,12 @@ class GroupImpl : public Group { virtual Result SetTexture(const Texture*); virtual Result GetTexture(Texture*&); virtual Result SetMaterialMode(MaterialMode); - virtual Result Add(const Group*); + virtual Result Add(const Mesh*); // vtable+0x20 - virtual Result Add(const Mesh*); - virtual Result Remove(const Group*); + virtual Result Add(const Group*); virtual Result Remove(const Mesh*); + virtual Result Remove(const Group*); virtual Result RemoveAll(); // vtable+0x30 diff --git a/LEGO1/tgl/d3drm/renderer.cpp b/LEGO1/tgl/d3drm/renderer.cpp index 4a8ca6c7..c3669e05 100644 --- a/LEGO1/tgl/d3drm/renderer.cpp +++ b/LEGO1/tgl/d3drm/renderer.cpp @@ -34,7 +34,7 @@ Result RendererImpl::Create() return (m_data != NULL) ? Success : Error; } -// FUNCTION: LEGO1 0x100a1894 +// FUNCTION: LEGO1 0x100a1830 Device* RendererImpl::CreateDevice(const DeviceDirect3DCreateData& data) { DeviceImpl* device = new DeviceImpl(); diff --git a/LEGO1/tgl/d3drm/texture.cpp b/LEGO1/tgl/d3drm/texture.cpp index 2b2c3eb0..b0ee3813 100644 --- a/LEGO1/tgl/d3drm/texture.cpp +++ b/LEGO1/tgl/d3drm/texture.cpp @@ -150,7 +150,7 @@ Result TextureImpl::Changed(int texelsChanged, int paletteChanged) return ResultVal(m_data->Changed(texelsChanged, paletteChanged)); } -// FUNCTION: LEGO1 0x100a3d00 +// FUNCTION: LEGO1 0x100a3cc0 Result TextureImpl::GetBufferAndPalette( int* width, int* height, diff --git a/LEGO1/tgl/tgl.h b/LEGO1/tgl/tgl.h index b8a09c3e..630510b9 100644 --- a/LEGO1/tgl/tgl.h +++ b/LEGO1/tgl/tgl.h @@ -131,7 +131,6 @@ class Renderer : public Object { // vtable+0x20 virtual Unk* CreateUnk() = 0; - virtual Texture* CreateTexture() = 0; virtual Texture* CreateTexture( int width, int height, @@ -141,6 +140,7 @@ class Renderer : public Object { int paletteEntryCount, const PaletteEntry* pEntries ) = 0; + virtual Texture* CreateTexture() = 0; virtual Result SetTextureDefaultShadeCount(unsigned long) = 0; // vtable+0x30 @@ -278,10 +278,10 @@ class Group : public Object { virtual Result SetTexture(const Texture*) = 0; virtual Result GetTexture(Texture*&) = 0; virtual Result SetMaterialMode(MaterialMode) = 0; - virtual Result Add(const Group*) = 0; virtual Result Add(const Mesh*) = 0; - virtual Result Remove(const Group*) = 0; + virtual Result Add(const Group*) = 0; virtual Result Remove(const Mesh*) = 0; + virtual Result Remove(const Group*) = 0; virtual Result RemoveAll() = 0; // This is TransformLocalToWorld in the leak, however it seems diff --git a/LEGO1/viewmanager/viewroi.cpp b/LEGO1/viewmanager/viewroi.cpp index ff846394..37b299b5 100644 --- a/LEGO1/viewmanager/viewroi.cpp +++ b/LEGO1/viewmanager/viewroi.cpp @@ -41,6 +41,24 @@ void ViewROI::UpdateWorldData(const MxMatrix& parent2world) } } +// STUB: LEGO1 0x100a9fc0 +void ViewROI::VTable0x24(const MxMatrix& p_transform) +{ + // TODO +} + +// STUB: LEGO1 0x100aa0a0 +void ViewROI::SetLocalTransform(const Matrix4& p_transform) +{ + // TODO +} + +// STUB: LEGO1 0x100aa180 +void ViewROI::VTable0x1c() +{ + // TODO +} + // FUNCTION: LEGO1 0x100aa500 undefined ViewROI::SetUnk101013d8(undefined p_flag) { diff --git a/LEGO1/viewmanager/viewroi.h b/LEGO1/viewmanager/viewroi.h index 7157033a..8e6d78a9 100644 --- a/LEGO1/viewmanager/viewroi.h +++ b/LEGO1/viewmanager/viewroi.h @@ -44,9 +44,12 @@ class ViewROI : public OrientableROI { reinterpret_cast(m_lods)->AddRef(); } } - virtual float IntrinsicImportance() const; - virtual Tgl::Group* GetGeometry(); - virtual const Tgl::Group* GetGeometry() const; + virtual float IntrinsicImportance() const override; // vtable+0x04 + virtual void VTable0x1c() override; // vtable+0x1c + virtual void SetLocalTransform(const Matrix4& p_transform) override; // vtable+0x20 + virtual void VTable0x24(const MxMatrix& p_transform) override; // vtable+0x24 + virtual const Tgl::Group* GetGeometry() const; // vtable+0x34 + virtual Tgl::Group* GetGeometry(); // vtable+0x30 static undefined SetUnk101013d8(undefined p_flag); diff --git a/tools/vtable/vtable.py b/tools/vtable/vtable.py new file mode 100644 index 00000000..bdee080b --- /dev/null +++ b/tools/vtable/vtable.py @@ -0,0 +1,99 @@ +import os +import argparse +import logging +from typing import List +import colorama +from isledecomp.bin import Bin as IsleBin +from isledecomp.compare import Compare as IsleCompare +from isledecomp.utils import print_diff + +# Ignore all compare-db messages. +logging.getLogger("isledecomp.compare").addHandler(logging.NullHandler()) + +colorama.init() + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser(description="Comparing vtables.") + parser.add_argument( + "original", metavar="original-binary", help="The original binary" + ) + parser.add_argument( + "recompiled", metavar="recompiled-binary", help="The recompiled binary" + ) + parser.add_argument( + "pdb", metavar="recompiled-pdb", help="The PDB of the recompiled binary" + ) + parser.add_argument( + "decomp_dir", metavar="decomp-dir", help="The decompiled source tree" + ) + parser.add_argument( + "--verbose", "-v", action="store_true", help="Show more detailed information" + ) + parser.add_argument( + "--no-color", "-n", action="store_true", help="Do not color the output" + ) + + (args, _) = parser.parse_known_args() + + if not os.path.isfile(args.original): + parser.error(f"Original binary {args.original} does not exist") + + if not os.path.isfile(args.recompiled): + parser.error(f"Recompiled binary {args.recompiled} does not exist") + + if not os.path.isfile(args.pdb): + parser.error(f"Symbols PDB {args.pdb} does not exist") + + if not os.path.isdir(args.decomp_dir): + parser.error(f"Source directory {args.decomp_dir} does not exist") + + return args + + +def show_vtable_diff(udiff: List[str], verbose: bool = False, plain: bool = False): + lines = [ + line + for line in udiff + if verbose or line.startswith("+") or line.startswith("-") + ] + print_diff(lines, plain) + + +def print_summary(vtable_count: int, problem_count: int): + if problem_count == 0: + print(f"Vtables found: {vtable_count}.\n100% match.") + return + + print(f"Vtables found: {vtable_count}.\nVtables not matching: {problem_count}.") + + +def main(): + args = parse_args() + vtable_count = 0 + problem_count = 0 + + with IsleBin(args.original) as orig_bin, IsleBin(args.recompiled) as recomp_bin: + engine = IsleCompare(orig_bin, recomp_bin, args.pdb, args.decomp_dir) + + for tbl_match in engine.compare_vtables(): + vtable_count += 1 + if tbl_match.ratio < 1: + problem_count += 1 + + udiff = list(tbl_match.udiff) + + print( + tbl_match.name, + f": orig 0x{tbl_match.orig_addr:x}, recomp 0x{tbl_match.recomp_addr:x}", + ) + show_vtable_diff(udiff, args.verbose, args.no_color) + print() + + print_summary(vtable_count, problem_count) + + return 1 if problem_count > 0 else 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 6ed3e89ed25092c84a51a6f789fbe131328cb42c Mon Sep 17 00:00:00 2001 From: MS Date: Sat, 20 Jan 2024 20:19:49 -0500 Subject: [PATCH 07/34] reccmp: Show float constants (#473) --- .../isledecomp/compare/asm/parse.py | 49 +++++++++++++-- tools/isledecomp/isledecomp/compare/core.py | 60 ++++++++++++++----- tools/isledecomp/tests/test_sanitize.py | 34 +++++++++++ 3 files changed, 124 insertions(+), 19 deletions(-) diff --git a/tools/isledecomp/isledecomp/compare/asm/parse.py b/tools/isledecomp/isledecomp/compare/asm/parse.py index ee9c9154..ef1ad2c2 100644 --- a/tools/isledecomp/isledecomp/compare/asm/parse.py +++ b/tools/isledecomp/isledecomp/compare/asm/parse.py @@ -13,7 +13,7 @@ disassembler = Cs(CS_ARCH_X86, CS_MODE_32) -ptr_replace_regex = re.compile(r"ptr \[(0x[0-9a-fA-F]+)\]") +ptr_replace_regex = re.compile(r"(?P\w+) ptr \[(?P0x[0-9a-fA-F]+)\]") DisasmLiteInst = namedtuple("DisasmLiteInst", "address, size, mnemonic, op_str") @@ -27,14 +27,20 @@ def from_hex(string: str) -> Optional[int]: return None +def get_float_size(size_str: str) -> int: + return 8 if size_str == "qword" else 4 + + class ParseAsm: def __init__( self, relocate_lookup: Optional[Callable[[int], bool]] = None, name_lookup: Optional[Callable[[int], str]] = None, + float_lookup: Optional[Callable[[int, int], Optional[str]]] = None, ) -> None: self.relocate_lookup = relocate_lookup self.name_lookup = name_lookup + self.float_lookup = float_lookup self.replacements = {} self.number_placeholders = True @@ -47,6 +53,14 @@ def is_relocated(self, addr: int) -> bool: return False + def float_replace(self, addr: int, data_size: int) -> Optional[str]: + if callable(self.float_lookup): + float_str = self.float_lookup(addr, data_size) + if float_str is not None: + return f"{float_str} (FLOAT)" + + return None + def lookup(self, addr: int) -> Optional[str]: """Return a replacement name for this address if we find one.""" if (cached := self.replacements.get(addr, None)) is not None: @@ -108,18 +122,45 @@ def sanitize(self, inst: DisasmLiteInst) -> Tuple[str, str]: def filter_out_ptr(match): """Helper for re.sub, see below""" - offset = from_hex(match.group(1)) + offset = from_hex(match.group("addr")) if offset is not None: # We assume this is always an address to replace placeholder = self.replace(offset) - return f"ptr [{placeholder}]" + return f'{match.group("data_size")} ptr [{placeholder}]' # Strict regex should ensure we can read the hex number. # But just in case: return the string with no changes return match.group(0) - op_str = ptr_replace_regex.sub(filter_out_ptr, inst.op_str) + def float_ptr_replace(match): + offset = from_hex(match.group("addr")) + + if offset is not None: + # If we can find a variable name for this pointer, use it. + placeholder = self.lookup(offset) + + # Read what's under the pointer and show the decimal value. + if placeholder is None: + placeholder = self.float_replace( + offset, get_float_size(match.group("data_size")) + ) + + # If we can't read the float, use a regular placeholder. + if placeholder is None: + placeholder = self.replace(offset) + + return f'{match.group("data_size")} ptr [{placeholder}]' + + # Strict regex should ensure we can read the hex number. + # But just in case: return the string with no changes + return match.group(0) + + if inst.mnemonic.startswith("f"): + # If floating point instruction + op_str = ptr_replace_regex.sub(float_ptr_replace, inst.op_str) + else: + op_str = ptr_replace_regex.sub(filter_out_ptr, inst.op_str) # Performance hack: # Skip this step if there is nothing left to consider replacing. diff --git a/tools/isledecomp/isledecomp/compare/core.py b/tools/isledecomp/isledecomp/compare/core.py index 58f99d32..84f9131f 100644 --- a/tools/isledecomp/isledecomp/compare/core.py +++ b/tools/isledecomp/isledecomp/compare/core.py @@ -3,7 +3,8 @@ import difflib import struct from dataclasses import dataclass -from typing import Iterable, List, Optional +from typing import Callable, Iterable, List, Optional +from isledecomp.bin import Bin as IsleBin from isledecomp.cvdump.demangler import demangle_string_const from isledecomp.cvdump import Cvdump, CvdumpAnalysis from isledecomp.parser import DecompCodebase @@ -36,9 +37,39 @@ def __str__(self) -> str: return f"{self.name} (0x{self.orig_addr:x}) {self.ratio*100:.02f}%{'*' if self.is_effective_match else ''}" +def create_reloc_lookup(bin_file: IsleBin) -> Callable[[int], bool]: + """Function generator for relocation table lookup""" + + def lookup(addr: int) -> bool: + return addr > bin_file.imagebase and bin_file.is_relocated_addr(addr) + + return lookup + + +def create_float_lookup(bin_file: IsleBin) -> Callable[[int, int], Optional[str]]: + """Function generator for floating point lookup""" + + def lookup(addr: int, size: int) -> Optional[str]: + data = bin_file.read(addr, size) + # If this is a float constant, it should be initialized data. + if data is None: + return None + + struct_str = " DiffReport: orig_raw = self.orig_bin.read(match.orig_addr, match.size) recomp_raw = self.recomp_bin.read(match.recomp_addr, match.size) - def orig_should_replace(addr: int) -> bool: - return addr > self.orig_bin.imagebase and self.orig_bin.is_relocated_addr( - addr - ) - - def recomp_should_replace(addr: int) -> bool: - return ( - addr > self.recomp_bin.imagebase - and self.recomp_bin.is_relocated_addr(addr) - ) - def orig_lookup(addr: int) -> Optional[str]: m = self._db.get_by_orig(addr) if m is None: @@ -254,11 +274,21 @@ def recomp_lookup(addr: int) -> Optional[str]: return m.match_name() + orig_should_replace = create_reloc_lookup(self.orig_bin) + recomp_should_replace = create_reloc_lookup(self.recomp_bin) + + orig_float = create_float_lookup(self.orig_bin) + recomp_float = create_float_lookup(self.recomp_bin) + orig_parse = ParseAsm( - relocate_lookup=orig_should_replace, name_lookup=orig_lookup + relocate_lookup=orig_should_replace, + name_lookup=orig_lookup, + float_lookup=orig_float, ) recomp_parse = ParseAsm( - relocate_lookup=recomp_should_replace, name_lookup=recomp_lookup + relocate_lookup=recomp_should_replace, + name_lookup=recomp_lookup, + float_lookup=recomp_float, ) orig_asm = orig_parse.parse_asm(orig_raw, match.orig_addr) diff --git a/tools/isledecomp/tests/test_sanitize.py b/tools/isledecomp/tests/test_sanitize.py index 67d95b4f..be0da30f 100644 --- a/tools/isledecomp/tests/test_sanitize.py +++ b/tools/isledecomp/tests/test_sanitize.py @@ -177,3 +177,37 @@ def substitute_1234(addr: int) -> Optional[str]: inst = DisasmLiteInst(0x1000, 2, "jmp", "0x6557") (_, op_str) = p.sanitize(inst) assert op_str == "0x5555" + + +def test_float_replacement(): + """Floating point constants often appear as pointers to data. + A good example is ViewROI::IntrinsicImportance and the subclass override + LegoROI::IntrinsicImportance. Both return 0.5, but this is done via the + FLD instruction and a dword value at 0x100dbdec. In this case it is more + valuable to just read the constant value rather than use a placeholder. + The float constants don't appear to be deduplicated (like strings are) + because there is another 0.5 at 0x100d40b0.""" + + def substitute_float(addr: int, _: int) -> str: + return "zero-point-five" if addr == 0x1234 else None + + p = ParseAsm(float_lookup=substitute_float) + inst = DisasmLiteInst(0x1000, 6, "fld", "dword ptr [0x1234]") + (_, op_str) = p.sanitize(inst) + assert op_str == "dword ptr [zero-point-five (FLOAT)]" + + +def test_float_variable(): + """If there is a variable at the address referenced by a float instruction, + use the name instead of calling into the float replacement handler.""" + + def name_lookup(addr: int) -> Optional[str]: + return "g_myFloatVariable" if addr == 0x1234 else None + + def substitute_float(_: int, __: int) -> str: + return "" + + p = ParseAsm(name_lookup=name_lookup, float_lookup=substitute_float) + inst = DisasmLiteInst(0x1000, 6, "fld", "dword ptr [0x1234]") + (_, op_str) = p.sanitize(inst) + assert op_str == "dword ptr [g_myFloatVariable]" From b4bc0e51c90fdb1112972c9b45e693c7ad2e93af Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 20 Jan 2024 20:23:23 -0500 Subject: [PATCH 08/34] Make all functions public symbols in FLIC library (#472) --- 3rdparty/flic/flic.asm | 89 ++++++++++++++++++++++++----------------- 3rdparty/flic/flic.lib | Bin 2940 -> 3930 bytes LEGO1/library_flic.h | 45 +++++++++++++++++++++ 3 files changed, 97 insertions(+), 37 deletions(-) diff --git a/3rdparty/flic/flic.asm b/3rdparty/flic/flic.asm index 44f42086..e7a5f028 100644 --- a/3rdparty/flic/flic.asm +++ b/3rdparty/flic/flic.asm @@ -4,6 +4,21 @@ option dotname .model flat, c assume fs:nothing +public FUN_100bd530 +public FUN_100bd580 +public FUN_100bd600 +public FUN_100bd680 +public FUN_100bd6e0 +public FUN_100bd760 +public FUN_100bd880 +public FUN_100bd8a0 +public FUN_100bd8f0 +public FUN_100bd940 +public FUN_100bd960 +public FUN_100bda10 +public FUN_100bdac0 +public FUN_100bdc00 +public FUN_100bdc90 public DecodeFLCFrame ; This is so reccmp can detect the end of DecodeFLCFrame @@ -11,7 +26,7 @@ public EndOfSection .text SEGMENT BYTE PUBLIC 'CODE' -?_25162 LABEL NEAR +FUN_100bd530 LABEL NEAR mov ax, word ptr [esp+0CH] ; 100BD530 _ 66: 8B. 44 24, 0C push esi ; 100BD535 _ 56 test ax, ax ; 100BD536 _ 66: 85. C0 @@ -43,7 +58,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH -?_25164 LABEL NEAR +FUN_100bd580 LABEL NEAR lea eax, [esp+18H] ; 100BD580 _ 8D. 44 24, 18 push esi ; 100BD584 _ 56 mov si, word ptr [esp+10H] ; 100BD585 _ 66: 8B. 74 24, 10 @@ -55,7 +70,7 @@ public EndOfSection mov edi, dword ptr [esp+14H] ; 100BD595 _ 8B. 7C 24, 14 push edx ; 100BD599 _ 52 push edi ; 100BD59A _ 57 - call ?_25168 ; 100BD59B _ E8, 00000060 + call FUN_100bd600 ; 100BD59B _ E8, 00000060 add esp, 16 ; 100BD5A0 _ 83. C4, 10 test eax, eax ; 100BD5A3 _ 85. C0 jz ?_25167 ; 100BD5A5 _ 74, 4A @@ -93,7 +108,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH -?_25168 LABEL NEAR +FUN_100bd600 LABEL NEAR mov ecx, dword ptr [esp+8H] ; 100BD600 _ 8B. 4C 24, 08 push ebx ; 100BD604 _ 53 mov bx, word ptr [ecx] ; 100BD605 _ 66: 8B. 19 @@ -150,7 +165,7 @@ public EndOfSection ; Filler type: INT 3 Debug breakpoint db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH -?_25173 LABEL NEAR +FUN_100bd680 LABEL NEAR lea eax, [esp+18H] ; 100BD680 _ 8D. 44 24, 18 push esi ; 100BD684 _ 56 lea ecx, [esp+14H] ; 100BD685 _ 8D. 4C 24, 14 @@ -160,7 +175,7 @@ public EndOfSection mov esi, dword ptr [esp+10H] ; 100BD68F _ 8B. 74 24, 10 push edx ; 100BD693 _ 52 push esi ; 100BD694 _ 56 - call ?_25168 ; 100BD695 _ E8, FFFFFF66 + call FUN_100bd600 ; 100BD695 _ E8, FFFFFF66 add esp, 16 ; 100BD69A _ 83. C4, 10 test eax, eax ; 100BD69D _ 85. C0 jz ?_25175 ; 100BD69F _ 74, 33 @@ -188,7 +203,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH -?_25176 LABEL NEAR +FUN_100bd6e0 LABEL NEAR lea eax, [esp+18H] ; 100BD6E0 _ 8D. 44 24, 18 push ebx ; 100BD6E4 _ 53 lea ecx, [esp+14H] ; 100BD6E5 _ 8D. 4C 24, 14 @@ -200,7 +215,7 @@ public EndOfSection shl word ptr [esp+28H], 1 ; 100BD6F4 _ 66: C1. 64 24, 28, 01 push edx ; 100BD6FA _ 52 push esi ; 100BD6FB _ 56 - call ?_25168 ; 100BD6FC _ E8, FFFFFEFF + call FUN_100bd600 ; 100BD6FC _ E8, FFFFFEFF add esp, 16 ; 100BD701 _ 83. C4, 10 test eax, eax ; 100BD704 _ 85. C0 jz ?_25179 ; 100BD706 _ 74, 52 @@ -235,7 +250,7 @@ public EndOfSection ; Filler type: INT 3 Debug breakpoint db 0CCH, 0CCH, 0CCH -?_25180 LABEL NEAR +FUN_100bd760 LABEL NEAR mov eax, dword ptr [esp+18H] ; 100BD760 _ 8B. 44 24, 18 sub esp, 4 ; 100BD764 _ 83. EC, 04 ; Note: Length-changing prefix causes delay on Intel processors @@ -267,7 +282,7 @@ public EndOfSection add ecx, 6 ; 100BD7BA _ 83. C1, 06 push ecx ; 100BD7BD _ 51 push esi ; 100BD7BE _ 56 - call ?_25194 ; 100BD7BF _ E8, 000000BC + call FUN_100bd880 ; 100BD7BF _ E8, 000000BC mov eax, dword ptr [esp+34H] ; 100BD7C4 _ 8B. 44 24, 34 add esp, 8 ; 100BD7C8 _ 83. C4, 08 mov byte ptr [eax], 1 ; 100BD7CB _ C6. 00, 01 @@ -279,14 +294,14 @@ public EndOfSection push ecx ; 100BD7D4 _ 51 push edi ; 100BD7D5 _ 57 push esi ; 100BD7D6 _ 56 - call ?_25220 ; 100BD7D7 _ E8, 000002E4 + call FUN_100bdac0 ; 100BD7D7 _ E8, 000002E4 jmp ?_25189 ; 100BD7DC _ EB, 4C ?_25184 LABEL NEAR add ecx, 6 ; 100BD7DE _ 83. C1, 06 push ecx ; 100BD7E1 _ 51 push esi ; 100BD7E2 _ 56 - call ?_25202 ; 100BD7E3 _ E8, 00000158 + call FUN_100bd940 ; 100BD7E3 _ E8, 00000158 mov eax, dword ptr [esp+34H] ; 100BD7E8 _ 8B. 44 24, 34 add esp, 8 ; 100BD7EC _ 83. C4, 08 mov byte ptr [eax], 1 ; 100BD7EF _ C6. 00, 01 @@ -298,7 +313,7 @@ public EndOfSection push ecx ; 100BD7F8 _ 51 push edi ; 100BD7F9 _ 57 push esi ; 100BD7FA _ 56 - call ?_25213 ; 100BD7FB _ E8, 00000210 + call FUN_100bda10 ; 100BD7FB _ E8, 00000210 jmp ?_25189 ; 100BD800 _ EB, 28 ?_25186 LABEL NEAR @@ -307,7 +322,7 @@ public EndOfSection push ecx ; 100BD806 _ 51 push edi ; 100BD807 _ 57 push esi ; 100BD808 _ 56 - call ?_25227 ; 100BD809 _ E8, 000003F2 + call FUN_100bdc00 ; 100BD809 _ E8, 000003F2 jmp ?_25189 ; 100BD80E _ EB, 1A ?_25187 LABEL NEAR @@ -316,7 +331,7 @@ public EndOfSection push ecx ; 100BD814 _ 51 push edi ; 100BD815 _ 57 push esi ; 100BD816 _ 56 - call ?_25203 ; 100BD817 _ E8, 00000144 + call FUN_100bd960 ; 100BD817 _ E8, 00000144 jmp ?_25189 ; 100BD81C _ EB, 0C ?_25188 LABEL NEAR @@ -325,7 +340,7 @@ public EndOfSection push ecx ; 100BD822 _ 51 push edi ; 100BD823 _ 57 push esi ; 100BD824 _ 56 - call ?_25231 ; 100BD825 _ E8, 00000466 + call FUN_100bdc90 ; 100BD825 _ E8, 00000466 ?_25189:add esp, 16 ; 100BD82A _ 83. C4, 10 ?_25190 LABEL NEAR @@ -355,12 +370,12 @@ public EndOfSection ?_25193 db 00H, 07H, 07H, 01H, 07H, 07H, 07H, 02H ; 100BD870 _ ........ db 03H, 04H, 07H, 05H, 06H, 0CCH, 0CCH, 0CCH ; 100BD878 _ ........ -?_25194 LABEL NEAR +FUN_100bd880 LABEL NEAR mov eax, dword ptr [esp+8H] ; 100BD880 _ 8B. 44 24, 08 mov ecx, dword ptr [esp+4H] ; 100BD884 _ 8B. 4C 24, 04 push eax ; 100BD888 _ 50 push ecx ; 100BD889 _ 51 - call ?_25195 ; 100BD88A _ E8, 00000011 + call FUN_100bd8a0 ; 100BD88A _ E8, 00000011 add esp, 8 ; 100BD88F _ 83. C4, 08 ret ; 100BD892 _ C3 @@ -369,7 +384,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH -?_25195 LABEL NEAR +FUN_100bd8a0 LABEL NEAR mov eax, dword ptr [esp+8H] ; 100BD8A0 _ 8B. 44 24, 08 push ebx ; 100BD8A4 _ 53 mov bx, word ptr [eax] ; 100BD8A5 _ 66: 8B. 18 @@ -395,7 +410,7 @@ public EndOfSection push edi ; 100BD8D2 _ 57 add si, bp ; 100BD8D3 _ 66: 03. F5 push eax ; 100BD8D6 _ 50 - call ?_25199 ; 100BD8D7 _ E8, 00000014 + call FUN_100bd8f0 ; 100BD8D7 _ E8, 00000014 movsx eax, bp ; 100BD8DC _ 0F BF. C5 add esp, 16 ; 100BD8DF _ 83. C4, 10 lea ecx, [eax+eax*2] ; 100BD8E2 _ 8D. 0C 40 @@ -408,7 +423,7 @@ public EndOfSection pop ebx ; 100BD8EE _ 5B ret ; 100BD8EF _ C3 -?_25199 LABEL NEAR +FUN_100bd8f0 LABEL NEAR mov dx, word ptr [esp+10H] ; 100BD8F0 _ 66: 8B. 54 24, 10 push esi ; 100BD8F5 _ 56 movsx ecx, word ptr [esp+10H] ; 100BD8F6 _ 0F BF. 4C 24, 10 @@ -440,12 +455,12 @@ public EndOfSection ; Filler type: INT 3 Debug breakpoint db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH -?_25202 LABEL NEAR +FUN_100bd940 LABEL NEAR mov eax, dword ptr [esp+8H] ; 100BD940 _ 8B. 44 24, 08 mov ecx, dword ptr [esp+4H] ; 100BD944 _ 8B. 4C 24, 04 push eax ; 100BD948 _ 50 push ecx ; 100BD949 _ 51 - call ?_25195 ; 100BD94A _ E8, FFFFFF51 + call FUN_100bd8a0 ; 100BD94A _ E8, FFFFFF51 add esp, 8 ; 100BD94F _ 83. C4, 08 ret ; 100BD952 _ C3 @@ -454,7 +469,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH -?_25203 LABEL NEAR +FUN_100bd960 LABEL NEAR mov eax, dword ptr [esp+10H] ; 100BD960 _ 8B. 44 24, 10 sub esp, 8 ; 100BD964 _ 83. EC, 08 mov dx, word ptr [eax+8H] ; 100BD967 _ 66: 8B. 50, 08 @@ -529,7 +544,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH -?_25213 LABEL NEAR +FUN_100bda10 LABEL NEAR mov ecx, dword ptr [esp+0CH] ; 100BDA10 _ 8B. 4C 24, 0C sub esp, 4 ; 100BDA14 _ 83. EC, 04 mov eax, dword ptr [esp+14H] ; 100BDA17 _ 8B. 44 24, 14 @@ -572,7 +587,7 @@ public EndOfSection push edi ; 100BDA70 _ 57 push edx ; 100BDA71 _ 52 push eax ; 100BDA72 _ 50 - call ?_25173 ; 100BDA73 _ E8, FFFFFC08 + call FUN_100bd680 ; 100BDA73 _ E8, FFFFFC08 add esp, 24 ; 100BDA78 _ 83. C4, 18 jmp ?_25217 ; 100BDA7B _ EB, 23 @@ -586,7 +601,7 @@ public EndOfSection push edi ; 100BDA90 _ 57 push ecx ; 100BDA91 _ 51 push edx ; 100BDA92 _ 52 - call ?_25164 ; 100BDA93 _ E8, FFFFFAE8 + call FUN_100bd580 ; 100BDA93 _ E8, FFFFFAE8 movsx ecx, bp ; 100BDA98 _ 0F BF. CD add esp, 24 ; 100BDA9B _ 83. C4, 18 add esi, ecx ; 100BDA9E _ 03. F1 @@ -608,7 +623,7 @@ public EndOfSection ; Filler type: INT 3 Debug breakpoint db 0CCH, 0CCH, 0CCH -?_25220 LABEL NEAR +FUN_100bdac0 LABEL NEAR mov edx, dword ptr [esp+10H] ; 100BDAC0 _ 8B. 54 24, 10 sub esp, 8 ; 100BDAC4 _ 83. EC, 08 mov ax, word ptr [edx+8H] ; 100BDAC7 _ 66: 8B. 42, 08 @@ -643,7 +658,7 @@ public EndOfSection push eax ; 100BDB18 _ 50 push ecx ; 100BDB19 _ 51 push edx ; 100BDB1A _ 52 - call ?_25162 ; 100BDB1B _ E8, FFFFFA10 + call FUN_100bd530 ; 100BDB1B _ E8, FFFFFA10 mov ecx, dword ptr [esp+28H] ; 100BDB20 _ 8B. 4C 24, 28 add esp, 20 ; 100BDB24 _ 83. C4, 14 mov bx, word ptr [ecx] ; 100BDB27 _ 66: 8B. 19 @@ -677,7 +692,7 @@ public EndOfSection push ecx ; 100BDB7F _ 51 add di, bp ; 100BDB80 _ 66: 03. FD push edx ; 100BDB83 _ 52 - call ?_25164 ; 100BDB84 _ E8, FFFFF9F7 + call FUN_100bd580 ; 100BDB84 _ E8, FFFFF9F7 movsx ecx, bp ; 100BDB89 _ 0F BF. CD add dword ptr [esp+2CH], ecx ; 100BDB8C _ 01. 4C 24, 2C add esp, 24 ; 100BDB90 _ 83. C4, 18 @@ -704,7 +719,7 @@ public EndOfSection add di, bp ; 100BDBCD _ 66: 03. FD push edx ; 100BDBD0 _ 52 push ecx ; 100BDBD1 _ 51 - call ?_25176 ; 100BDBD2 _ E8, FFFFFB09 + call FUN_100bd6e0 ; 100BDBD2 _ E8, FFFFFB09 add esp, 24 ; 100BDBD7 _ 83. C4, 18 dec bx ; 100BDBDA _ 66: 4B jne ?_25224 ; 100BDBDC _ 0F 85, FFFFFF6A @@ -723,7 +738,7 @@ public EndOfSection ; Filler type: INT 3 Debug breakpoint db 0CCH, 0CCH, 0CCH -?_25227 LABEL NEAR +FUN_100bdc00 LABEL NEAR mov eax, dword ptr [esp+10H] ; 100BDC00 _ 8B. 44 24, 10 sub esp, 8 ; 100BDC04 _ 83. EC, 08 mov cx, word ptr [eax+8H] ; 100BDC07 _ 66: 8B. 48, 08 @@ -755,7 +770,7 @@ public EndOfSection push 0 ; 100BDC52 _ 6A, 00 push ebx ; 100BDC54 _ 53 push edi ; 100BDC55 _ 57 - call ?_25176 ; 100BDC56 _ E8, FFFFFA85 + call FUN_100bd6e0 ; 100BDC56 _ E8, FFFFFA85 add esp, 24 ; 100BDC5B _ 83. C4, 18 test si, si ; 100BDC5E _ 66: 85. F6 jz ?_25229 ; 100BDC61 _ 74, 15 @@ -766,7 +781,7 @@ public EndOfSection push eax ; 100BDC6D _ 50 push ebx ; 100BDC6E _ 53 push edi ; 100BDC6F _ 57 - call ?_25162 ; 100BDC70 _ E8, FFFFF8BB + call FUN_100bd530 ; 100BDC70 _ E8, FFFFF8BB add esp, 20 ; 100BDC75 _ 83. C4, 14 ?_25229:dec bp ; 100BDC78 _ 66: 4D jns ?_25228 ; 100BDC7A _ 79, CB @@ -782,7 +797,7 @@ public EndOfSection db 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH, 0CCH db 0CCH, 0CCH, 0CCH, 0CCH -?_25231 LABEL NEAR +FUN_100bdc90 LABEL NEAR mov eax, dword ptr [esp+10H] ; 100BDC90 _ 8B. 44 24, 10 sub esp, 4 ; 100BDC94 _ 83. EC, 04 push ebx ; 100BDC97 _ 53 @@ -804,7 +819,7 @@ public EndOfSection push 0 ; 100BDCBD _ 6A, 00 push eax ; 100BDCBF _ 50 push esi ; 100BDCC0 _ 56 - call ?_25164 ; 100BDCC1 _ E8, FFFFF8BA + call FUN_100bd580 ; 100BDCC1 _ E8, FFFFF8BA add ebp, dword ptr [esp+28H] ; 100BDCC6 _ 03. 6C 24, 28 add esp, 24 ; 100BDCCA _ 83. C4, 18 dec bx ; 100BDCCD _ 66: 4B @@ -836,7 +851,7 @@ DecodeFLCFrame LABEL NEAR push ecx ; 100BDD02 _ 51 push eax ; 100BDD03 _ 50 push edx ; 100BDD04 _ 52 - call ?_25180 ; 100BDD05 _ E8, FFFFFA56 + call FUN_100bd760 ; 100BDD05 _ E8, FFFFFA56 add esp, 24 ; 100BDD0A _ 83. C4, 18 ?_25235:ret ; 100BDD0D _ C3 diff --git a/3rdparty/flic/flic.lib b/3rdparty/flic/flic.lib index fea46a2524205492607347c02caac50e1c15f37b..8c27655057c43651eb3323934565af93e68347af 100644 GIT binary patch delta 1376 zcmds1Jxjw-6ut4=4vG$fqBT`byR;gM>X8~+ z3lLEkQA6dgk3Hi$#jKm0pH6OPw%jAT)3cLHDO=aH^=vGvk;E*SnHpof=E}9WDKm?$ zv@)!g1M|MxCk(lmV8>*1xt4Kc=CD_D5*m#&KUGzaYq5GxPgU1OEc4511zuMggx{q6 zcps&M|IxwRX5I-G*Ec?$tmh#9H|Br|^P;+8d|0>^m{%G}ojG-H+lWRkLWKAATXh5J*prAlwK!XB>fmDGaKp}xlpdo=KfQHMD?Pp#Z98C!gaCM7c zSy7?fSs2dj+o-YaaO@Lq1!`F60(n hr<5-iq%*%oo`-ygPk?IX{m8SB^8xU?$bTDb^bU+@2+RNg delta 343 zcmca5_eX4kjER}0fw`%X0tzsI@=W0330w>e3`{_L1B55`$hqsI=ul8FG&eBCYnB;I zLjo5g)F7aNlOHlFOQq#xChO%VWx>oum^JwWlbEEDnVAVha{`wSBQrz8u~n&OI2ag2 zH_J1}b3}6kO=Dwd0U8E!BpZVqGXn!Jn56_{@qt-tKo&okr3GXOfLVG#mLQmA1Y`+; zS!O_%FqmZpWQk0^$-SQO&gAL5hKxd!Px8)HQUc1wyXK|%rv;}bmt^MWF~qy1Cg-Q5 Oy7@S}6(#1TG5`Q<^ExvC diff --git a/LEGO1/library_flic.h b/LEGO1/library_flic.h index 1c6a6d8b..ece2d6f9 100644 --- a/LEGO1/library_flic.h +++ b/LEGO1/library_flic.h @@ -1,5 +1,50 @@ #ifdef 0 +// LIBRARY: LEGO1 0x100bd530 +// _FUN_100bd530 + +// LIBRARY: LEGO1 0x100bd580 +// _FUN_100bd580 + +// LIBRARY: LEGO1 0x100bd600 +// _FUN_100bd600 + +// LIBRARY: LEGO1 0x100bd680 +// _FUN_100bd680 + +// LIBRARY: LEGO1 0x100bd6e0 +// _FUN_100bd6e0 + +// LIBRARY: LEGO1 0x100bd760 +// _FUN_100bd760 + +// LIBRARY: LEGO1 0x100bd880 +// _FUN_100bd880 + +// LIBRARY: LEGO1 0x100bd8a0 +// _FUN_100bd8a0 + +// LIBRARY: LEGO1 0x100bd8f0 +// _FUN_100bd8f0 + +// LIBRARY: LEGO1 0x100bd940 +// _FUN_100bd940 + +// LIBRARY: LEGO1 0x100bd960 +// _FUN_100bd960 + +// LIBRARY: LEGO1 0x100bda10 +// _FUN_100bda10 + +// LIBRARY: LEGO1 0x100bdac0 +// _FUN_100bdac0 + +// LIBRARY: LEGO1 0x100bdc00 +// _FUN_100bdc00 + +// LIBRARY: LEGO1 0x100bdc90 +// _FUN_100bdc90 + // LIBRARY: LEGO1 0x100bdce0 // _DecodeFLCFrame From 3f35302e7654d3d0b0e17c8c61b6e028f73373e8 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 21 Jan 2024 09:58:15 -0500 Subject: [PATCH 09/34] begin LegoLocomotionAnimPresenter (#474) * LegoLocomotionAnimPresenter * Fix game startup * Fixes * Add size assert --------- Co-authored-by: Christian Semmler --- .../lego/legoomni/include/legoanimpresenter.h | 2 +- .../include/legolocomotionanimpresenter.h | 10 +++ .../legoomni/src/video/legoanimpresenter.cpp | 6 +- .../src/video/legolocomotionanimpresenter.cpp | 88 +++++++++++++++---- 4 files changed, 84 insertions(+), 22 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index a5aa2df3..3eeea936 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -42,7 +42,7 @@ class LegoAnimPresenter : public MxVideoPresenter { // 6 more virtual functions here -private: +protected: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h index d6785fa2..cb7e3334 100644 --- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h @@ -4,9 +4,11 @@ #include "legoloopinganimpresenter.h" // VTABLE: LEGO1 0x100d9170 +// SIZE 0xd8 class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { public: LegoLocomotionAnimPresenter(); + virtual ~LegoLocomotionAnimPresenter() override; // FUNCTION: LEGO1 0x1006ce50 inline const char* ClassName() const override // vtable+0xc @@ -35,6 +37,14 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { private: void Init(); + void Destroy(MxBool p_fromDestructor); + + undefined4 m_unk0xc0; // 0xc0 + undefined4* m_unk0xc4; // 0xc4 + MxCore* m_unk0xc8; // 0xc8 + MxS32 m_unk0xcc; // 0xcc + MxS32 m_unk0xd0; // 0xd0 + undefined2 m_unk0xd4; // 0xd4 }; #endif // LEGOLOCOMOTIONANIMPRESENTER_H diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index d5f50654..027a3b83 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -6,6 +6,7 @@ #include "mxcompositepresenter.h" #include "mxdsanim.h" #include "mxstreamchunk.h" +#include "mxvideomanager.h" DECOMP_SIZE_ASSERT(LegoAnimPresenter, 0xc0) DECOMP_SIZE_ASSERT(LegoAnimClassBase, 0x08) @@ -161,11 +162,10 @@ void LegoAnimPresenter::DoneTickle() // TODO } -// STUB: LEGO1 0x1006b8d0 +// FUNCTION: LEGO1 0x1006b8d0 MxResult LegoAnimPresenter::AddToManager() { - // TODO - return SUCCESS; + return MxVideoPresenter::AddToManager(); } // FUNCTION: LEGO1 0x1006b8e0 diff --git a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp index debe6659..db6e6a79 100644 --- a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp @@ -1,63 +1,115 @@ #include "legolocomotionanimpresenter.h" +#include "legoomni.h" +#include "legoworld.h" + +DECOMP_SIZE_ASSERT(LegoLocomotionAnimPresenter, 0xd8) + // FUNCTION: LEGO1 0x1006cdd0 LegoLocomotionAnimPresenter::LegoLocomotionAnimPresenter() { Init(); } -// STUB: LEGO1 0x1006d0b0 -void LegoLocomotionAnimPresenter::Init() +// FUNCTION: LEGO1 0x1006d050 +LegoLocomotionAnimPresenter::~LegoLocomotionAnimPresenter() { - // TODO + Destroy(TRUE); } -// STUB: LEGO1 0x1006d140 +// FUNCTION: LEGO1 0x1006d0b0 +void LegoLocomotionAnimPresenter::Init() +{ + m_unk0xc0 = 0; + m_unk0xc4 = 0; + m_unk0xcc = -1; + m_unk0xd0 = -1; + m_unk0xc8 = 0; + m_unk0xd4 = 0; +} + +// FUNCTION: LEGO1 0x1006d0e0 +void LegoLocomotionAnimPresenter::Destroy(MxBool p_fromDestructor) +{ + m_criticalSection.Enter(); + + if (m_unk0xc4) { + delete[] m_unk0xc4; + } + + if (m_unk0xc8) { + delete m_unk0xc8; + } + + m_unk0x68 = 0; + Init(); + + m_criticalSection.Leave(); + + if (!p_fromDestructor) { + LegoAnimPresenter::Destroy(); + } +} + +// FUNCTION: LEGO1 0x1006d140 MxResult LegoLocomotionAnimPresenter::VTable0x88(MxStreamChunk* p_chunk) { - // TODO - return SUCCESS; + MxResult result = LegoAnimPresenter::VTable0x88(p_chunk); + return result == SUCCESS ? SUCCESS : result; } // STUB: LEGO1 0x1006d160 MxResult LegoLocomotionAnimPresenter::AddToManager() { - // TODO - return SUCCESS; + return MxVideoPresenter::AddToManager(); } -// STUB: LEGO1 0x1006d5b0 +// FUNCTION: LEGO1 0x1006d5b0 void LegoLocomotionAnimPresenter::Destroy() { - // TODO + Destroy(FALSE); } -// STUB: LEGO1 0x1006d5c0 +// FUNCTION: LEGO1 0x1006d5c0 void LegoLocomotionAnimPresenter::PutFrame() { - // TODO + // Empty } -// STUB: LEGO1 0x1006d5d0 +// FUNCTION: LEGO1 0x1006d5d0 void LegoLocomotionAnimPresenter::ReadyTickle() { - // TODO + LegoAnimPresenter::ReadyTickle(); + + if (m_currentWorld != NULL && m_currentTickleState == e_starting) { + m_currentWorld->VTable0x58(this); + if (m_compositePresenter != NULL) { + SendToCompositePresenter(Lego()); + } + + m_unk0xd4++; + } } // STUB: LEGO1 0x1006d610 void LegoLocomotionAnimPresenter::StartingTickle() { // TODO + EndAction(); } -// STUB: LEGO1 0x1006d660 +// FUNCTION: LEGO1 0x1006d660 void LegoLocomotionAnimPresenter::StreamingTickle() { - // TODO + if (m_unk0xd4 == 0) { + EndAction(); + } } -// STUB: LEGO1 0x1006d670 +// FUNCTION: LEGO1 0x1006d670 void LegoLocomotionAnimPresenter::EndAction() { - // TODO + if (m_action) { + MxVideoPresenter::EndAction(); + } } From 8e1197d14ce921b0c936b2a9d77dbd3610594565 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 21 Jan 2024 10:30:19 -0500 Subject: [PATCH 10/34] implement LegoLoadCacheSoundPresenter (#475) * fix * fixes * Fix WaveFormat, match LegoLoadCacheSoundPresenter --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/legocachesound.h | 3 ++ .../include/legoloadcachesoundpresenter.h | 14 ++++---- .../legoomni/src/audio/legocachesound.cpp | 2 ++ .../src/audio/legoloadcachesoundpresenter.cpp | 32 ++++++++++++++++--- LEGO1/omni/include/mxwavepresenter.h | 9 +++--- LEGO1/omni/src/audio/mxwavepresenter.cpp | 16 +++++----- 6 files changed, 52 insertions(+), 24 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocachesound.h b/LEGO1/lego/legoomni/include/legocachesound.h index 5d587835..1c3dfcc4 100644 --- a/LEGO1/lego/legoomni/include/legocachesound.h +++ b/LEGO1/lego/legoomni/include/legocachesound.h @@ -1,6 +1,7 @@ #ifndef LEGOCACHESOUND_H #define LEGOCACHESOUND_H +#include "decomp.h" #include "mxcore.h" // VTABLE: LEGO1 0x100d4718 @@ -28,6 +29,8 @@ class LegoCacheSound : public MxCore { private: void Init(); + + undefined m_padding0x08[0x80]; // 0x08 }; #endif // LEGOCACHESOUND_H diff --git a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h index dbfd478e..47dc4e1f 100644 --- a/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h +++ b/LEGO1/lego/legoomni/include/legoloadcachesoundpresenter.h @@ -4,6 +4,8 @@ #include "decomp.h" #include "mxwavepresenter.h" +class LegoCacheSound; + // VTABLE: LEGO1 0x100d5fa8 // SIZE 0x90 class LegoLoadCacheSoundPresenter : public MxWavePresenter { @@ -27,12 +29,12 @@ class LegoLoadCacheSoundPresenter : public MxWavePresenter { void Init(); void Destroy(MxBool p_fromDestructor); - undefined4* m_unk0x6c; // 0x6c - undefined4* m_unk0x70; // 0x70 - undefined4 m_unk0x74; // 0x74 - undefined4 m_unk0x78; // 0x78 - undefined m_unk0x7c; // 0x7c - undefined4 m_unk0x80[4]; // 0x80 + LegoCacheSound* m_cacheSound; // 0x6c + undefined* m_unk0x70; // 0x70 + undefined* m_unk0x74; // 0x74 + undefined4 m_unk0x78; // 0x78 + undefined m_unk0x7c; // 0x7c + PCMWAVEFORMAT m_pcmWaveFormat; // 0x7d }; // SYNTHETIC: LEGO1 0x10018460 diff --git a/LEGO1/lego/legoomni/src/audio/legocachesound.cpp b/LEGO1/lego/legoomni/src/audio/legocachesound.cpp index eb58278c..a3855e88 100644 --- a/LEGO1/lego/legoomni/src/audio/legocachesound.cpp +++ b/LEGO1/lego/legoomni/src/audio/legocachesound.cpp @@ -1,5 +1,7 @@ #include "legocachesound.h" +DECOMP_SIZE_ASSERT(LegoCacheSound, 0x88) + // FUNCTION: LEGO1 0x100064d0 LegoCacheSound::LegoCacheSound() { diff --git a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp index 9aeac8ba..753bf234 100644 --- a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp +++ b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp @@ -1,5 +1,9 @@ #include "legoloadcachesoundpresenter.h" +#include "legocachesound.h" +#include "mxstreamchunk.h" +#include "mxwavepresenter.h" + DECOMP_SIZE_ASSERT(LegoLoadCacheSoundPresenter, 0x90) // FUNCTION: LEGO1 0x10018340 @@ -25,26 +29,44 @@ void LegoLoadCacheSoundPresenter::Init() // FUNCTION: LEGO1 0x100184f0 void LegoLoadCacheSoundPresenter::Destroy(MxBool p_fromDestructor) { - delete this->m_unk0x70; + delete[] this->m_unk0x70; MxWavePresenter::Destroy(p_fromDestructor); } -// STUB: LEGO1 0x10018510 +// FUNCTION: LEGO1 0x10018510 void LegoLoadCacheSoundPresenter::ReadyTickle() { - // TODO + MxStreamChunk* chunk = NextChunk(); + + if (chunk) { + WaveFormat* header = (WaveFormat*) chunk->GetData(); + m_unk0x78 = 0; + + MxU8* data = new MxU8[header->m_dataSize]; + m_unk0x70 = data; + m_unk0x74 = data; + + m_cacheSound = new LegoCacheSound; + memcpy(&m_pcmWaveFormat, &header->m_pcmWaveFormat.wf, sizeof(m_pcmWaveFormat)); + + m_subscriber->DestroyChunk(chunk); + ProgressTickleState(e_streaming); + } } // STUB: LEGO1 0x100185f0 void LegoLoadCacheSoundPresenter::StreamingTickle() { // TODO + EndAction(); } -// STUB: LEGO1 0x100186f0 +// FUNCTION: LEGO1 0x100186f0 void LegoLoadCacheSoundPresenter::DoneTickle() { - // TODO + if (m_unk0x7c != 0) { + EndAction(); + } } // STUB: LEGO1 0x10018700 diff --git a/LEGO1/omni/include/mxwavepresenter.h b/LEGO1/omni/include/mxwavepresenter.h index bffefe15..289fa879 100644 --- a/LEGO1/omni/include/mxwavepresenter.h +++ b/LEGO1/omni/include/mxwavepresenter.h @@ -49,12 +49,11 @@ class MxWavePresenter : public MxSoundPresenter { // FUNCTION: LEGO1 0x1000d6b0 virtual MxBool IsPaused() { return m_paused; }; // vtable+0x6c - // Reference: https://github.com/itsmattkc/SIEdit/blob/master/lib/othertypes.h - // SIZE 0x1c + // SIZE 0x18 struct WaveFormat { - WAVEFORMATEX m_waveFormatEx; - MxU32 m_dataSize; - MxU32 m_flags; + PCMWAVEFORMAT m_pcmWaveFormat; // 0x00 + MxU32 m_dataSize; // 0x10 + MxU32 m_flags; // 0x14 }; // SYNTHETIC: LEGO1 0x1000d810 diff --git a/LEGO1/omni/src/audio/mxwavepresenter.cpp b/LEGO1/omni/src/audio/mxwavepresenter.cpp index 831e0043..c0aaca7c 100644 --- a/LEGO1/omni/src/audio/mxwavepresenter.cpp +++ b/LEGO1/omni/src/audio/mxwavepresenter.cpp @@ -9,7 +9,7 @@ #include "mxutil.h" DECOMP_SIZE_ASSERT(MxWavePresenter, 0x6c); -DECOMP_SIZE_ASSERT(MxWavePresenter::WaveFormat, 0x1c); +DECOMP_SIZE_ASSERT(MxWavePresenter::WaveFormat, 0x18); // FUNCTION: LEGO1 0x100b1ad0 void MxWavePresenter::Init() @@ -134,12 +134,12 @@ void MxWavePresenter::StartingTickle() m_chunkLength = length; memset(&waveFormatEx, 0, sizeof(waveFormatEx)); - waveFormatEx.wFormatTag = m_waveFormat->m_waveFormatEx.wFormatTag; - waveFormatEx.nChannels = m_waveFormat->m_waveFormatEx.nChannels; - waveFormatEx.nSamplesPerSec = m_waveFormat->m_waveFormatEx.nSamplesPerSec; - waveFormatEx.nAvgBytesPerSec = m_waveFormat->m_waveFormatEx.nAvgBytesPerSec; - waveFormatEx.nBlockAlign = m_waveFormat->m_waveFormatEx.nBlockAlign; - waveFormatEx.wBitsPerSample = m_waveFormat->m_waveFormatEx.wBitsPerSample; + waveFormatEx.wFormatTag = m_waveFormat->m_pcmWaveFormat.wf.wFormatTag; + waveFormatEx.nChannels = m_waveFormat->m_pcmWaveFormat.wf.nChannels; + waveFormatEx.nSamplesPerSec = m_waveFormat->m_pcmWaveFormat.wf.nSamplesPerSec; + waveFormatEx.nAvgBytesPerSec = m_waveFormat->m_pcmWaveFormat.wf.nAvgBytesPerSec; + waveFormatEx.nBlockAlign = m_waveFormat->m_pcmWaveFormat.wf.nBlockAlign; + waveFormatEx.wBitsPerSample = m_waveFormat->m_pcmWaveFormat.wBitsPerSample; if (waveFormatEx.wBitsPerSample == 8) m_silenceData = 0x7F; @@ -157,7 +157,7 @@ void MxWavePresenter::StartingTickle() desc.dwFlags = DSBCAPS_CTRLFREQUENCY | DSBCAPS_CTRLPAN | DSBCAPS_CTRLVOLUME; if (m_action->GetFlags() & MxDSAction::c_looping) - desc.dwBufferBytes = m_waveFormat->m_waveFormatEx.nAvgBytesPerSec * + desc.dwBufferBytes = m_waveFormat->m_pcmWaveFormat.wf.nAvgBytesPerSec * (m_action->GetDuration() / m_action->GetLoopCount()) / 1000; else desc.dwBufferBytes = 2 * length; From 43c692c9d732b7ef0d3d29182016bcad7f8dab73 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 20 Jan 2024 10:46:49 -0500 Subject: [PATCH 11/34] Minor fixes --- .../src/audio/legoloadcachesoundpresenter.cpp | 2 +- LEGO1/omni/src/video/mxdisplaysurface.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp index 753bf234..e9dec128 100644 --- a/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp +++ b/LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp @@ -47,7 +47,7 @@ void LegoLoadCacheSoundPresenter::ReadyTickle() m_unk0x74 = data; m_cacheSound = new LegoCacheSound; - memcpy(&m_pcmWaveFormat, &header->m_pcmWaveFormat.wf, sizeof(m_pcmWaveFormat)); + memcpy(&m_pcmWaveFormat, &header->m_pcmWaveFormat, sizeof(m_pcmWaveFormat)); m_subscriber->DestroyChunk(chunk); ProgressTickleState(e_streaming); diff --git a/LEGO1/omni/src/video/mxdisplaysurface.cpp b/LEGO1/omni/src/video/mxdisplaysurface.cpp index a9dc2608..3a43ff3f 100644 --- a/LEGO1/omni/src/video/mxdisplaysurface.cpp +++ b/LEGO1/omni/src/video/mxdisplaysurface.cpp @@ -238,7 +238,7 @@ void MxDisplaySurface::Destroy() } if (this->m_16bitPal) - delete this->m_16bitPal; + delete[] this->m_16bitPal; this->Init(); } @@ -567,7 +567,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( *p_ret = 0; ddsd.ddsCaps.dwCaps = DDSCAPS_SYSTEMMEMORY | DDSCAPS_OFFSCREENPLAIN; - if (draw->CreateSurface(&ddsd, &surface, NULL) != S_OK) { + if (draw->CreateSurface(&ddsd, &surface, NULL) != DD_OK) { if (*p_ret) { *p_ret = 0; @@ -575,7 +575,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - if (draw->CreateSurface(&ddsd, &surface, NULL) != S_OK) { + if (draw->CreateSurface(&ddsd, &surface, NULL) != DD_OK) { surface = NULL; } } @@ -587,7 +587,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44( memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); - if (surface->Lock(NULL, &ddsd, DDLOCK_WAIT, 0) != S_OK) { + if (surface->Lock(NULL, &ddsd, DDLOCK_WAIT, 0) != DD_OK) { surface->Release(); surface = NULL; goto done; @@ -690,7 +690,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface() memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); - if (draw->GetDisplayMode(&ddsd) != S_OK) { + if (draw->GetDisplayMode(&ddsd) != DD_OK) { return NULL; } @@ -703,18 +703,18 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface() ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN; - if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK) { + if (draw->CreateSurface(&ddsd, &newSurface, NULL) != DD_OK) { ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; - if (draw->CreateSurface(&ddsd, &newSurface, NULL) != S_OK) + if (draw->CreateSurface(&ddsd, &newSurface, NULL) != DD_OK) goto done; } memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); - if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != S_OK) + if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != DD_OK) goto done; else { MxU16* surface = (MxU16*) ddsd.lpSurface; From e61530d5a08c95bf7fc313c944f3e5a605baf5fe Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sun, 21 Jan 2024 11:02:17 -0500 Subject: [PATCH 12/34] Remove unused functions from ISLE.EXE (#476) --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 04ca97a9..de976bde 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -358,7 +358,9 @@ if (MSVC_FOR_DECOMP) # They ensure a recompilation that can be byte/instruction accurate to the original binaries. if (ISLE_BUILD_APP) target_compile_options(isle PRIVATE "/MT$<$:d>") + target_link_options(isle PRIVATE "/OPT:REF") endif() + target_compile_options(lego1 PRIVATE "/MT$<$:d>") set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"") From 7b0d4dd502e527d07f807b10ed4b33feb8ea6cc7 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:38:22 -0500 Subject: [PATCH 13/34] Implement Infocenter::InitializeBitmaps (#478) --- LEGO1/lego/legoomni/include/infocenter.h | 32 ++++++-- LEGO1/lego/legoomni/include/legoworld.h | 1 + LEGO1/lego/legoomni/include/radio.h | 2 + LEGO1/lego/legoomni/src/entity/legoworld.cpp | 6 ++ .../legoomni/src/infocenter/infocenter.cpp | 82 +++++++++++++++++-- LEGO1/lego/legoomni/src/isle/radio.cpp | 9 ++ 6 files changed, 121 insertions(+), 11 deletions(-) diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index 7de6ec45..5de2f745 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -5,13 +5,19 @@ #include "radio.h" class InfocenterState; +class MxStillPresenter; // SIZE 0x18 -struct InfocenterUnkDataEntry { +struct InfocenterMapEntry { // FUNCTION: LEGO1 0x1006ec80 - InfocenterUnkDataEntry() {} + InfocenterMapEntry() {} - undefined m_pad[0x18]; + MxStillPresenter* m_presenter; // 0x00 + undefined4 m_unk0x04; // 0x04 + undefined4 m_unk0x08; // 0x08 + undefined4 m_unk0x0c; // 0x0c + undefined4 m_unk0x10; // 0x10 + undefined4 m_unk0x14; // 0x14 }; // VTABLE: LEGO1 0x100d9338 @@ -31,6 +37,22 @@ class Infocenter : public LegoWorld { enum InfomainScript { c_noInfomain = -1, + c_leftArrowCtl = 1, + c_rightArrowCtl = 2, + c_infoCtl = 3, + c_boatCtl = 10, + c_raceCtl = 11, + c_pizzaCtl = 12, + c_gasCtl = 13, + c_medCtl = 14, + c_copCtl = 15, + c_radioCtl = 18, + c_mamaCtl = 21, + c_papaCtl = 22, + c_pepperCtl = 23, + c_nickCtl = 24, + c_lauraCtl = 25, + c_welcomeDialogue = 500, c_goodJobDialogue = 501, @@ -167,9 +189,9 @@ class Infocenter : public LegoWorld { Cutscene m_currentCutscene; // 0x108 Radio m_radio; // 0x10c undefined4 m_unk0x11c; // 0x11c - InfocenterUnkDataEntry m_entries[7]; // 0x120 + InfocenterMapEntry m_mapAreas[7]; // 0x120 MxS16 m_unk0x1c8; // 0x1c8 - undefined4 m_unk0x1cc; // 0x1cc + MxStillPresenter* m_frameHotBitmap; // 0x1cc MxS16 m_infoManDialogueTimer; // 0x1d0 MxS16 m_bookAnimationTimer; // 0x1d2 MxU16 m_unk0x1d4; // 0x1d4 diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 31b60f84..382edd9a 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -60,6 +60,7 @@ class LegoWorld : public LegoEntity { void FUN_10073430(); MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); MxPresenter* FindPresenter(const char* p_presenter, const char* p_name); + MxPresenter* FUN_10021790(MxAtomId& p_atom, MxS32 p_entityId); // SYNTHETIC: LEGO1 0x1001dee0 // LegoWorld::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/radio.h b/LEGO1/lego/legoomni/include/radio.h index 3afb44cb..536b9a7b 100644 --- a/LEGO1/lego/legoomni/include/radio.h +++ b/LEGO1/lego/legoomni/include/radio.h @@ -25,6 +25,8 @@ class Radio : public MxCore { return !strcmp(p_name, Radio::ClassName()) || MxCore::IsA(p_name); } + void Initialize(MxBool p_und); + // SYNTHETIC: LEGO1 0x1002c970 // Radio::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 8e5c7465..3fc3e277 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -163,6 +163,12 @@ MxPresenter* LegoWorld::FindPresenter(const char* p_presenter, const char* p_nam return NULL; } +// STUB: LEGO1 0x10021790 +MxPresenter* LegoWorld::FUN_10021790(MxAtomId& p_atom, MxS32 p_entityId) +{ + return NULL; +} + // STUB: LEGO1 0x10021a70 void LegoWorld::VTable0x68(MxBool p_add) { diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp index 170147d0..5d3722c1 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp @@ -16,7 +16,7 @@ #include "mxtransitionmanager.h" DECOMP_SIZE_ASSERT(Infocenter, 0x1d8) -DECOMP_SIZE_ASSERT(InfocenterUnkDataEntry, 0x18) +DECOMP_SIZE_ASSERT(InfocenterMapEntry, 0x18) // GLOBAL: LEGO1 0x100f76a0 const char* g_object2x4red = "2x4red"; @@ -30,13 +30,13 @@ Infocenter::Infocenter() m_unk0xfc = 0; m_unk0x11c = 0; m_infocenterState = NULL; - m_unk0x1cc = 0; + m_frameHotBitmap = 0; m_unk0x11c = 0; m_unk0x104 = 0; m_currentInfomainScript = c_noInfomain; m_currentCutscene = e_noIntro; - memset(&m_entries, 0, sizeof(m_entries)); + memset(&m_mapAreas, 0, sizeof(m_mapAreas)); m_unk0x1c8 = -1; SetAppCursor(1); @@ -310,7 +310,7 @@ void Infocenter::VTable0x50() switch (GameState()->GetUnknown10()) { case 0: - // bg->Enable(1); // TODO: Uncomment once LegoWorld::FindPresenter and LegoWorld::VTable0x58 are implemented. + bg->Enable(1); InitializeBitmaps(); switch (m_infocenterState->GetUnknown0x74()) { case 3: @@ -360,10 +360,80 @@ void Infocenter::VTable0x50() } } -// STUB: LEGO1 0x1006f9a0 +// FUNCTION: LEGO1 0x1006f9a0 void Infocenter::InitializeBitmaps() { - // TODO: Infocenter class size is wrong + m_radio.Initialize(TRUE); + + FUN_10021790(m_atom, c_leftArrowCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_rightArrowCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_infoCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_boatCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_raceCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_pizzaCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_gasCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_medCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_copCtl)->Enable(TRUE); + + FUN_10021790(m_atom, c_mamaCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_papaCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_pepperCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_nickCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_lauraCtl)->Enable(TRUE); + FUN_10021790(m_atom, c_radioCtl)->Enable(TRUE); + + m_mapAreas[0].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Info_A_Bitmap"); + m_mapAreas[0].m_unk0x08 = 391; + m_mapAreas[0].m_unk0x0c = 182; + m_mapAreas[0].m_unk0x10 = 427; + m_mapAreas[0].m_unk0x14 = 230; + m_mapAreas[0].m_unk0x04 = 3; + + m_mapAreas[1].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Boat_A_Bitmap"); + m_mapAreas[1].m_unk0x08 = 304; + m_mapAreas[1].m_unk0x0c = 225; + m_mapAreas[1].m_unk0x10 = 350; + m_mapAreas[1].m_unk0x14 = 268; + m_mapAreas[1].m_unk0x04 = 10; + + m_mapAreas[2].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Race_A_Bitmap"); + m_mapAreas[2].m_unk0x08 = 301; + m_mapAreas[2].m_unk0x0c = 133; + m_mapAreas[2].m_unk0x10 = 347; + m_mapAreas[2].m_unk0x14 = 181; + m_mapAreas[2].m_unk0x04 = 11; + + m_mapAreas[3].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Pizza_A_Bitmap"); + m_mapAreas[3].m_unk0x08 = 289; + m_mapAreas[3].m_unk0x0c = 182; + m_mapAreas[3].m_unk0x10 = 335; + m_mapAreas[3].m_unk0x14 = 225; + m_mapAreas[3].m_unk0x04 = 12; + + m_mapAreas[4].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Gas_A_Bitmap"); + m_mapAreas[4].m_unk0x10 = 391; + m_mapAreas[4].m_unk0x08 = 350; + m_mapAreas[4].m_unk0x0c = 161; + m_mapAreas[4].m_unk0x14 = 209; + m_mapAreas[4].m_unk0x04 = 13; + + m_mapAreas[5].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Med_A_Bitmap"); + m_mapAreas[5].m_unk0x08 = 392; + m_mapAreas[5].m_unk0x0c = 130; + m_mapAreas[5].m_unk0x10 = 438; + m_mapAreas[5].m_unk0x14 = 176; + m_mapAreas[5].m_unk0x04 = 14; + + m_mapAreas[6].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Cop_A_Bitmap"); + m_mapAreas[6].m_unk0x08 = 396; + m_mapAreas[6].m_unk0x0c = 229; + m_mapAreas[6].m_unk0x10 = 442; + m_mapAreas[6].m_unk0x14 = 272; + m_mapAreas[6].m_unk0x04 = 15; + + m_frameHotBitmap = (MxStillPresenter*) FindPresenter("MxStillPresenter", "FrameHot_Bitmap"); + + FUN_10070dc0(TRUE); } // STUB: LEGO1 0x1006fd00 diff --git a/LEGO1/lego/legoomni/src/isle/radio.cpp b/LEGO1/lego/legoomni/src/isle/radio.cpp index c87ac04e..993a12f0 100644 --- a/LEGO1/lego/legoomni/src/isle/radio.cpp +++ b/LEGO1/lego/legoomni/src/isle/radio.cpp @@ -30,6 +30,15 @@ MxLong Radio::Notify(MxParam& p_param) return 0; } +// FUNCTION: LEGO1 0x1002cdc0 +void Radio::Initialize(MxBool p_und) +{ + if (m_unk0xc != p_und) { + m_unk0xc = p_und; + CreateRadioState(); + } +} + // FUNCTION: LEGO1 0x1002cde0 void Radio::CreateRadioState() { From 05bc94f0307401c2e46f5190c75049b50d110517 Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 21 Jan 2024 12:45:40 -0500 Subject: [PATCH 14/34] implement MxControlPresenter::ParseExtra (#477) * MxControlPresenter::ParseExtra * Update mxcontrolpresenter.h * fix loop --------- Co-authored-by: Christian Semmler --- .../legoomni/include/mxcontrolpresenter.h | 12 ++-- .../src/control/mxcontrolpresenter.cpp | 60 ++++++++++++++++++- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h index 2db0a2e4..b4c8950e 100644 --- a/LEGO1/lego/legoomni/include/mxcontrolpresenter.h +++ b/LEGO1/lego/legoomni/include/mxcontrolpresenter.h @@ -41,12 +41,12 @@ class MxControlPresenter : public MxCompositePresenter { MxBool FUN_10044480(undefined4, undefined4*); void FUN_10044540(undefined2); - undefined2 m_unk0x4c; // 0x4c - MxS16 m_unk0x4e; // 0x4e - MxBool m_unk0x50; // 0x50 - undefined2 m_unk0x52; // 0x52 - undefined2 m_unk0x54; // 0x54 - undefined4* m_unk0x58; // 0x58 + undefined2 m_unk0x4c; // 0x4c + MxS16 m_unk0x4e; // 0x4e + MxBool m_unk0x50; // 0x50 + undefined2 m_unk0x52; // 0x52 + undefined2 m_unk0x54; // 0x54 + MxS16* m_unk0x58; // 0x58 }; // SYNTHETIC: LEGO1 0x100440f0 diff --git a/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp b/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp index 7a204a78..b578f107 100644 --- a/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp +++ b/LEGO1/lego/legoomni/src/control/mxcontrolpresenter.cpp @@ -1,10 +1,27 @@ #include "mxcontrolpresenter.h" +#include "define.h" #include "mxticklemanager.h" #include "mxutil.h" DECOMP_SIZE_ASSERT(MxControlPresenter, 0x5c) +// GLOBAL: LEGO1 0x10102064 +// STRING: LEGO1 0x10101fec +const char* g_style = "STYLE"; + +// GLOBAL: LEGO1 0x10102068 +// STRING: LEGO1 0x10101fe4 +const char* g_grid = "GRID"; + +// GLOBAL: LEGO1 0x1010206c +// STRING: LEGO1 0x10101fe0 +const char* g_map = "MAP"; + +// GLOBAL: LEGO1 0x10102074 +// STRING: LEGO1 0x10101fd0 +const char* g_toggle = "TOGGLE"; + // FUNCTION: LEGO1 0x10043f50 MxControlPresenter::MxControlPresenter() { @@ -109,10 +126,49 @@ void MxControlPresenter::ReadyTickle() ProgressTickleState(e_repeating); } -// STUB: LEGO1 0x10044640 +// FUNCTION: LEGO1 0x10044640 void MxControlPresenter::ParseExtra() { - // TODO + char result[256]; + MxU16 len = m_action->GetExtraLength(); + if (len) { + char buffer[256]; + memcpy(buffer, m_action->GetExtraData(), m_action->GetExtraLength()); + buffer[len] = 0; + + if (KeyValueStringParse(result, g_style, buffer)) { + char* str = strtok(result, g_parseExtraTokens); + if (!strcmpi(str, g_toggle)) { + m_unk0x4c = 1; + } + else if (!strcmpi(str, g_grid)) { + m_unk0x4c = 2; + m_unk0x52 = atoi(strtok(NULL, g_parseExtraTokens)); + m_unk0x54 = atoi(strtok(NULL, g_parseExtraTokens)); + } + else if (!strcmpi(str, g_map)) { + m_unk0x4c = 3; + str = strtok(NULL, g_parseExtraTokens); + if (str) { + MxS16 count = atoi(str); + m_unk0x58 = new MxS16[count + 1]; + *m_unk0x58 = count; + for (MxS16 i = 1; i <= count; i++) { + m_unk0x58[i] = atoi(strtok(NULL, g_parseExtraTokens)); + } + } + } + else { + m_unk0x4c = 0; + } + } + + if (KeyValueStringParse(result, g_strVISIBILITY, buffer)) { + if (!strcmpi(result, "FALSE")) { + Enable(FALSE); + } + } + } } // FUNCTION: LEGO1 0x10044820 From a65eb9a4e056e99082a869b34c790997af65b86d Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 22 Jan 2024 10:15:12 -0500 Subject: [PATCH 15/34] Roadmap tool to compare binary structure (#479) --- CMakeLists.txt | 2 +- tools/isledecomp/isledecomp/bin.py | 10 +- tools/isledecomp/isledecomp/compare/core.py | 3 + tools/isledecomp/isledecomp/compare/db.py | 11 + tools/isledecomp/isledecomp/cvdump/parser.py | 26 +- tools/isledecomp/isledecomp/cvdump/runner.py | 6 + tools/roadmap/roadmap.py | 265 +++++++++++++++++++ 7 files changed, 320 insertions(+), 3 deletions(-) create mode 100644 tools/roadmap/roadmap.py diff --git a/CMakeLists.txt b/CMakeLists.txt index de976bde..b7c93768 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -299,8 +299,8 @@ set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") if (ISLE_BUILD_APP) add_executable(isle WIN32 ISLE/res/isle.rc - ISLE/isleapp.cpp ISLE/define.cpp + ISLE/isleapp.cpp ) target_compile_definitions(isle PRIVATE ISLE_APP) diff --git a/tools/isledecomp/isledecomp/bin.py b/tools/isledecomp/isledecomp/bin.py index 3b600af6..dc04bb53 100644 --- a/tools/isledecomp/isledecomp/bin.py +++ b/tools/isledecomp/isledecomp/bin.py @@ -1,6 +1,6 @@ import logging import struct -from typing import List, Optional +from typing import List, Optional, Tuple from dataclasses import dataclass from collections import namedtuple @@ -365,6 +365,14 @@ def get_abs_addr(self, section: int, offset: int) -> int: into an absolute vaddr.""" return self.get_section_offset_by_index(section) + offset + def get_relative_addr(self, addr: int) -> Tuple[int, int]: + """Convert an absolute address back into a (section, offset) pair.""" + for i, section in enumerate(self.sections): + if section.contains_vaddr(addr): + return (i + 1, addr - section.virtual_address) + + return (0, 0) + def get_raw_addr(self, vaddr: int) -> int: """Returns the raw offset in the PE binary for the given virtual address.""" self._set_section_for_vaddr(vaddr) diff --git a/tools/isledecomp/isledecomp/compare/core.py b/tools/isledecomp/isledecomp/compare/core.py index 84f9131f..4e1a1f70 100644 --- a/tools/isledecomp/isledecomp/compare/core.py +++ b/tools/isledecomp/isledecomp/compare/core.py @@ -409,6 +409,9 @@ def _compare_match(self, match: MatchInfo) -> Optional[DiffReport]: ## Public API + def get_all(self) -> List[MatchInfo]: + return self._db.get_all() + def get_functions(self) -> List[MatchInfo]: return self._db.get_matches_by_type(SymbolType.FUNCTION) diff --git a/tools/isledecomp/isledecomp/compare/db.py b/tools/isledecomp/isledecomp/compare/db.py index 43d6811b..96ab3e10 100644 --- a/tools/isledecomp/isledecomp/compare/db.py +++ b/tools/isledecomp/isledecomp/compare/db.py @@ -82,6 +82,17 @@ def get_unmatched_strings(self) -> List[str]: return [string for (string,) in cur.fetchall()] + def get_all(self) -> List[MatchInfo]: + cur = self._db.execute( + """SELECT compare_type, orig_addr, recomp_addr, name, size + FROM `symbols` + ORDER BY orig_addr NULLS LAST + """, + ) + cur.row_factory = matchinfo_factory + + return cur.fetchall() + def get_matches(self) -> Optional[MatchInfo]: cur = self._db.execute( """SELECT compare_type, orig_addr, recomp_addr, name, size diff --git a/tools/isledecomp/isledecomp/cvdump/parser.py b/tools/isledecomp/isledecomp/cvdump/parser.py index d14abe88..8d1c71bb 100644 --- a/tools/isledecomp/isledecomp/cvdump/parser.py +++ b/tools/isledecomp/isledecomp/cvdump/parser.py @@ -39,6 +39,9 @@ r"S_GDATA32: \[(?P
\w{4}):(?P\w{8})\], Type:\s*(?P\S+), (?P.+)" ) +# e.g. 0003 "CMakeFiles/isle.dir/ISLE/res/isle.rc.res" +# e.g. 0004 "C:\work\lego-island\isle\3rdparty\smartheap\SHLW32MT.LIB" "check.obj" +_module_regex = re.compile(r"(?P\w{4})(?: \"(?P.+?)\")?(?: \"(?P.+?)\")") # User functions only LinesEntry = namedtuple("LinesEntry", "filename line_no section offset") @@ -52,13 +55,16 @@ SymbolsEntry = namedtuple("SymbolsEntry", "type section offset size name") # (Estimated) size of any symbol -SizeRefEntry = namedtuple("SizeRefEntry", "section offset size") +SizeRefEntry = namedtuple("SizeRefEntry", "module section offset size") # global variables GdataEntry = namedtuple("GdataEntry", "section offset type name") +ModuleEntry = namedtuple("ModuleEntry", "id lib obj") + class CvdumpParser: + # pylint: disable=too-many-instance-attributes def __init__(self) -> None: self._section: str = "" self._lines_function: Tuple[str, int] = ("", 0) @@ -68,6 +74,7 @@ def __init__(self) -> None: self.symbols = [] self.sizerefs = [] self.globals = [] + self.modules = [] def _lines_section(self, line: str): """Parsing entries from the LINES section. We only care about the pairs of @@ -144,12 +151,26 @@ def _section_contributions(self, line: str): if (match := _section_contrib_regex.match(line)) is not None: self.sizerefs.append( SizeRefEntry( + module=int(match.group("module"), 16), section=int(match.group("section"), 16), offset=int(match.group("offset"), 16), size=int(match.group("size"), 16), ) ) + def _modules_section(self, line: str): + """Record the object file (and lib file, if used) linked into the binary. + The auto-incrementing id is cross-referenced in SECTION CONTRIBUTIONS + (and perhaps other locations)""" + if (match := _module_regex.match(line)) is not None: + self.modules.append( + ModuleEntry( + id=int(match.group("id"), 16), + lib=match.group("lib"), + obj=match.group("obj"), + ) + ) + def read_line(self, line: str): # Blank lines are there to help the reader; they have no context significance if line.strip() == "": @@ -174,6 +195,9 @@ def read_line(self, line: str): elif self._section == "GLOBALS": self._globals_section(line) + elif self._section == "MODULES": + self._modules_section(line) + def read_lines(self, lines: Iterable[str]): for line in lines: self.read_line(line) diff --git a/tools/isledecomp/isledecomp/cvdump/runner.py b/tools/isledecomp/isledecomp/cvdump/runner.py index f1c163b5..6b2c2ff4 100644 --- a/tools/isledecomp/isledecomp/cvdump/runner.py +++ b/tools/isledecomp/isledecomp/cvdump/runner.py @@ -13,6 +13,7 @@ class DumpOpt(Enum): GLOBALS = 2 PUBLICS = 3 SECTION_CONTRIB = 4 + MODULES = 5 cvdump_opt_map = { @@ -21,6 +22,7 @@ class DumpOpt(Enum): DumpOpt.GLOBALS: "-g", DumpOpt.PUBLICS: "-p", DumpOpt.SECTION_CONTRIB: "-seccontrib", + DumpOpt.MODULES: "-m", } @@ -49,6 +51,10 @@ def section_contributions(self): self._options.add(DumpOpt.SECTION_CONTRIB) return self + def modules(self): + self._options.add(DumpOpt.MODULES) + return self + def cmd_line(self) -> List[str]: cvdump_exe = lib_path_join("cvdump.exe") flags = [cvdump_opt_map[opt] for opt in self._options] diff --git a/tools/roadmap/roadmap.py b/tools/roadmap/roadmap.py new file mode 100644 index 00000000..e8023c1d --- /dev/null +++ b/tools/roadmap/roadmap.py @@ -0,0 +1,265 @@ +"""For all addresses matched by code annotations or recomp pdb, +report how "far off" the recomp symbol is from its proper place +in the original binary.""" + +import os +import argparse +import logging +from typing import List, Optional +from collections import namedtuple +from isledecomp import Bin as IsleBin +from isledecomp.cvdump import Cvdump +from isledecomp.compare import Compare as IsleCompare +from isledecomp.types import SymbolType + +# Ignore all compare-db messages. +logging.getLogger("isledecomp.compare").addHandler(logging.NullHandler()) + + +def or_blank(value) -> str: + """Helper for dealing with potential None values in text output.""" + return "" if value is None else str(value) + + +class ModuleMap: + """Load a subset of sections from the pdb to allow you to look up the + module number based on the recomp address.""" + + def __init__(self, pdb, binfile) -> None: + cvdump = Cvdump(pdb).section_contributions().modules().run() + self.module_lookup = {m.id: (m.lib, m.obj) for m in cvdump.modules} + self.section_contrib = [ + ( + binfile.get_abs_addr(sizeref.section, sizeref.offset), + sizeref.size, + sizeref.module, + ) + for sizeref in cvdump.sizerefs + if binfile.is_valid_section(sizeref.section) + ] + + def get_module(self, addr: int) -> Optional[str]: + for start, size, module_id in self.section_contrib: + if start <= addr < start + size: + if (module := self.module_lookup.get(module_id)) is not None: + return module + + return None + + +def print_sections(sections): + print(" name | start | v.size | raw size") + print("---------|----------|----------|----------") + for sect in sections: + name = sect.name.decode("ascii").rstrip("\x00") + print( + f"{name:>8} | {sect.virtual_address:8x} | {sect.virtual_size:8x} | {sect.size_of_raw_data:8x}" + ) + print() + + +def match_type_abbreviation(mtype: Optional[SymbolType]) -> str: + """Return abbreviation of the given SymbolType name""" + if mtype is None: + return "" + + return mtype.name.lower()[:3] + + +RoadmapRow = namedtuple( + "RoadmapRow", + [ + "orig_sect_ofs", + "recomp_sect_ofs", + "orig_addr", + "recomp_addr", + "displacement", + "sym_type", + "size", + "name", + "module", + ], +) + + +def print_text_report(results: List[RoadmapRow]): + """Print the result with original and recomp addresses.""" + for row in results: + print( + " ".join( + [ + f"{or_blank(row.orig_sect_ofs):14}", + f"{or_blank(row.recomp_sect_ofs):14}", + f"{or_blank(row.displacement):>8}", + f"{row.sym_type:3}", + f"{or_blank(row.size):6}", + or_blank(row.name), + ] + ) + ) + + +def print_diff_report(results: List[RoadmapRow]): + """Print only entries where we have the recomp address. + This is intended for generating a file to diff against. + The recomp addresses are always changing so we hide those.""" + for row in results: + if row.orig_addr is None or row.recomp_addr is None: + continue + + print( + " ".join( + [ + f"{or_blank(row.orig_sect_ofs):14}", + f"{or_blank(row.displacement):>8}", + f"{row.sym_type:3}", + f"{or_blank(row.size):6}", + or_blank(row.name), + ] + ) + ) + + +def export_to_csv(csv_file: str, results: List[RoadmapRow]): + with open(csv_file, "w+", encoding="utf-8") as f: + f.write( + "orig_sect_ofs,recomp_sect_ofs,orig_addr,recomp_addr,displacement,row_type,size,name,module\n" + ) + for row in results: + f.write(",".join(map(or_blank, row))) + f.write("\n") + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser( + description="Show all addresses from original and recomp." + ) + parser.add_argument( + "original", metavar="original-binary", help="The original binary" + ) + parser.add_argument( + "recompiled", metavar="recompiled-binary", help="The recompiled binary" + ) + parser.add_argument( + "pdb", metavar="recompiled-pdb", help="The PDB of the recompiled binary" + ) + parser.add_argument( + "decomp_dir", metavar="decomp-dir", help="The decompiled source tree" + ) + parser.add_argument("--csv", metavar="", help="If set, export to CSV") + parser.add_argument( + "--verbose", "-v", action="store_true", help="Show recomp addresses in output" + ) + + (args, _) = parser.parse_known_args() + + if not os.path.isfile(args.original): + parser.error(f"Original binary {args.original} does not exist") + + if not os.path.isfile(args.recompiled): + parser.error(f"Recompiled binary {args.recompiled} does not exist") + + if not os.path.isfile(args.pdb): + parser.error(f"Symbols PDB {args.pdb} does not exist") + + if not os.path.isdir(args.decomp_dir): + parser.error(f"Source directory {args.decomp_dir} does not exist") + + return args + + +def main(): + args = parse_args() + + with IsleBin(args.original, find_str=True) as orig_bin, IsleBin( + args.recompiled + ) as recomp_bin: + engine = IsleCompare(orig_bin, recomp_bin, args.pdb, args.decomp_dir) + + module_map = ModuleMap(args.pdb, recomp_bin) + + def is_same_section(orig: int, recomp: int) -> bool: + """Compare the section name instead of the index. + LEGO1.dll adds extra sections for some reason. (Smacker library?)""" + + try: + orig_name = orig_bin.sections[orig - 1].name + recomp_name = recomp_bin.sections[recomp - 1].name + return orig_name == recomp_name + except IndexError: + return False + + def to_roadmap_row(match): + orig_sect = None + orig_ofs = None + orig_sect_ofs = None + recomp_sect = None + recomp_ofs = None + recomp_sect_ofs = None + orig_addr = None + recomp_addr = None + displacement = None + module_name = None + + if match.recomp_addr is not None: + if (module_ref := module_map.get_module(match.recomp_addr)) is not None: + (_, module_name) = module_ref + + row_type = match_type_abbreviation(match.compare_type) + name = ( + repr(match.name) + if match.compare_type == SymbolType.STRING + else match.name + ) + + if match.orig_addr is not None: + orig_addr = match.orig_addr + (orig_sect, orig_ofs) = orig_bin.get_relative_addr(match.orig_addr) + orig_sect_ofs = f"{orig_sect:04}:{orig_ofs:08x}" + + if match.recomp_addr is not None: + recomp_addr = match.recomp_addr + (recomp_sect, recomp_ofs) = recomp_bin.get_relative_addr( + match.recomp_addr + ) + recomp_sect_ofs = f"{recomp_sect:04}:{recomp_ofs:08x}" + + if ( + orig_sect is not None + and recomp_sect is not None + and is_same_section(orig_sect, recomp_sect) + ): + displacement = recomp_ofs - orig_ofs + + return RoadmapRow( + orig_sect_ofs, + recomp_sect_ofs, + orig_addr, + recomp_addr, + displacement, + row_type, + match.size, + name, + module_name, + ) + + results = list(map(to_roadmap_row, engine.get_all())) + + if args.csv is None: + if args.verbose: + print("ORIG sections:") + print_sections(orig_bin.sections) + + print("RECOMP sections:") + print_sections(recomp_bin.sections) + + print_text_report(results) + else: + print_diff_report(results) + + if args.csv is not None: + export_to_csv(args.csv, results) + + +if __name__ == "__main__": + main() From a19165a749b4404bf97227a8568b93443063059a Mon Sep 17 00:00:00 2001 From: MS Date: Mon, 22 Jan 2024 10:18:46 -0500 Subject: [PATCH 16/34] LegoWorld::LegoWorld to 100% (#480) --- .../legoomni/include/legomodelpresenter.h | 4 +- .../legoomni/include/legopathcontrollerlist.h | 6 +++ .../legoomni/include/legounksavedatawriter.h | 2 + LEGO1/lego/legoomni/include/legoworld.h | 47 ++++++++++++++++++- .../src/common/legounksavedatawriter.cpp | 10 +++- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 11 +++-- LEGO1/lego/sources/roi/legoroi.h | 3 ++ LEGO1/mxgeometry/mxgeometry3d.h | 3 ++ LEGO1/omni/include/mxpresenterlist.h | 3 ++ 9 files changed, 82 insertions(+), 7 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index 7803187a..393ea818 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -3,6 +3,8 @@ #include "mxvideopresenter.h" +class AutoROI; + // VTABLE: LEGO1 0x100d4e50 // SIZE 0x6c (discovered through inline constructor at 0x10009ae6) class LegoModelPresenter : public MxVideoPresenter { @@ -33,7 +35,7 @@ class LegoModelPresenter : public MxVideoPresenter { void Destroy(MxBool p_fromDestructor); private: - undefined4 m_unk0x64; // 0x64 + AutoROI* m_unk0x64; // 0x64 MxBool m_addedToView; // 0x68 }; diff --git a/LEGO1/lego/legoomni/include/legopathcontrollerlist.h b/LEGO1/lego/legoomni/include/legopathcontrollerlist.h index ead40f48..a13557b8 100644 --- a/LEGO1/lego/legoomni/include/legopathcontrollerlist.h +++ b/LEGO1/lego/legoomni/include/legopathcontrollerlist.h @@ -48,6 +48,9 @@ class LegoPathControllerList : public MxPtrList { // TEMPLATE: LEGO1 0x1001d3c0 // MxPtrList::Destroy +// TEMPLATE: LEGO1 0x1001d440 +// MxPtrList::~MxPtrList + // SYNTHETIC: LEGO1 0x1001d490 // MxCollection::`scalar deleting destructor' @@ -57,4 +60,7 @@ class LegoPathControllerList : public MxPtrList { // SYNTHETIC: LEGO1 0x1001d5b0 // MxPtrList::`scalar deleting destructor' +// SYNTHETIC: LEGO1 0x1001d620 +// LegoPathControllerList::~LegoPathControllerList + #endif // LEGOPATHCONTROLLERLIST_H diff --git a/LEGO1/lego/legoomni/include/legounksavedatawriter.h b/LEGO1/lego/legoomni/include/legounksavedatawriter.h index 240bef11..4623ec7a 100644 --- a/LEGO1/lego/legoomni/include/legounksavedatawriter.h +++ b/LEGO1/lego/legoomni/include/legounksavedatawriter.h @@ -4,6 +4,7 @@ #include "decomp.h" #include "mxtypes.h" +class AutoROI; class LegoROI; class LegoStream; @@ -35,6 +36,7 @@ struct LegoSaveDataEntry3 { class LegoUnkSaveDataWriter { public: MxResult WriteSaveData3(LegoStream* p_stream); + AutoROI* FUN_10083500(undefined4, undefined4); void FUN_10083db0(LegoROI* p_roi); }; diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 382edd9a..13ca9737 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -12,6 +12,12 @@ class IslePathActor; class LegoPathBoundary; +struct PresenterSetCompare { + int operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; } +}; + +typedef set MxPresenterSet; + // VTABLE: LEGO1 0x100d6280 // SIZE 0xf8 class LegoWorld : public LegoEntity { @@ -71,9 +77,11 @@ class LegoWorld : public LegoEntity { LegoCameraController* m_cameraController; // 0x98 LegoEntityList* m_entityList; // 0x9c MxCoreList* m_coreList; // 0xa0 - undefined m_unk0xa4[0x14]; // 0xa4 + undefined m_unk0xa4; // 0xa4 + MxPresenterSet m_set0xa8; // 0xa8 MxPresenterList m_list0xb8; // 0xb8 - undefined m_unk0xd0[0x1c]; // 0xd0 + MxPresenterSet m_set0xd0; // 0xd0 + list m_list0xe0; // 0xe0 undefined4 m_unk0xec; // 0xec undefined4 m_unk0xf0; // 0xf0 MxS16 m_unk0xf4; // 0xf4 @@ -81,6 +89,38 @@ class LegoWorld : public LegoEntity { undefined m_unk0xf7; // 0xf7 }; +// clang-format off +// TEMPLATE: LEGO1 0x1001d780 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::~_Tree >::_Kfn,PresenterSetCompare,allocator > + +// TEMPLATE: LEGO1 0x1001d850 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::iterator::_Inc + +// TEMPLATE: LEGO1 0x1001d890 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::erase + +// TEMPLATE: LEGO1 0x1001dcf0 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Erase + +// TEMPLATE: LEGO1 0x1001dd30 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Init + +// TEMPLATE: LEGO1 0x1001ddf0 +// list >::~list > + +// TEMPLATE: LEGO1 0x1001df50 +// List::~List + +// TEMPLATE: LEGO1 0x1001de60 +// list >::_Buynode + +// TEMPLATE: LEGO1 0x1001de90 +// set >::~set > + +// TEMPLATE: LEGO1 0x1001df00 +// Set::~Set +// clang-format om + // SYNTHETIC: LEGO1 0x1001eed0 // MxPresenterListCursor::`scalar deleting destructor' @@ -102,4 +142,7 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x10020760 // MxListCursor::MxListCursor +// GLOBAL: LEGO1 0x100f11a0 +// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Nil + #endif // LEGOWORLD_H diff --git a/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp b/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp index a6e7e135..c06ebb7e 100644 --- a/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp +++ b/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp @@ -1,8 +1,8 @@ - #include "legounksavedatawriter.h" #include "legogamestate.h" #include "legostream.h" +#include "roi/legoroi.h" DECOMP_SIZE_ASSERT(LegoSaveDataEntry3, 0x108); @@ -48,6 +48,14 @@ MxResult LegoUnkSaveDataWriter::WriteSaveData3(LegoStream* p_stream) return result; } +// STUB: LEGO1 0x10083500 +AutoROI* LegoUnkSaveDataWriter::FUN_10083500(undefined4, undefined4) +{ + // TODO + // involves an STL map with a _Nil node at 0x100fc508 + return NULL; +} + // STUB: LEGO1 0x10083db0 void LegoUnkSaveDataWriter::FUN_10083db0(LegoROI* p_roi) { diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 3fc3e277..60cb941d 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -17,12 +17,17 @@ DECOMP_SIZE_ASSERT(LegoEntityListCursor, 0x10) DECOMP_SIZE_ASSERT(MxCoreList, 0x18) DECOMP_SIZE_ASSERT(MxCoreListCursor, 0x10) -// STUB: LEGO1 0x1001ca40 +// FUNCTION: LEGO1 0x1001ca40 LegoWorld::LegoWorld() : m_list0x68(TRUE) { - // TODO - m_worldStarted = FALSE; m_unk0xf4 = 4; + m_cameraController = NULL; + m_entityList = NULL; + m_coreList = NULL; + m_unk0xa4 = 0; // MxBool? + m_unk0xf0 = 0; + m_worldStarted = FALSE; + NotificationManager()->Register(this); } diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 5dfac62f..4bf0ff18 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -11,6 +11,9 @@ class LegoEntity; // Note: There is an extra class between LegoROI and ViewROI, // maybe called "AutoROI". VTABLE 0x100dbe38 +// TODO: Set as superclass of LegoROI +class AutoROI : public ViewROI {}; + // VTABLE: LEGO1 0x100dbea8 // SIZE 0x10c class LegoROI : public ViewROI { diff --git a/LEGO1/mxgeometry/mxgeometry3d.h b/LEGO1/mxgeometry/mxgeometry3d.h index 13781722..d96d302a 100644 --- a/LEGO1/mxgeometry/mxgeometry3d.h +++ b/LEGO1/mxgeometry/mxgeometry3d.h @@ -15,6 +15,9 @@ class Mx3DPointFloat : public Vector3 { m_elements[2] = p_z; } + // SYNTHETIC: LEGO1 0x1001d170 + // Mx3DPointFloat::Mx3DPointFloat + // FUNCTION: LEGO1 0x10003c10 virtual void operator=(const Vector3& p_impl) { EqualsImpl(p_impl.m_data); } // vtable+0x88 diff --git a/LEGO1/omni/include/mxpresenterlist.h b/LEGO1/omni/include/mxpresenterlist.h index 257d0996..a029a4cf 100644 --- a/LEGO1/omni/include/mxpresenterlist.h +++ b/LEGO1/omni/include/mxpresenterlist.h @@ -68,4 +68,7 @@ class MxPresenterListCursor : public MxPtrListCursor { // SYNTHETIC: LEGO1 0x1001d090 // MxPtrList::`scalar deleting destructor' +// SYNTHETIC: LEGO1 0x1001d100 +// MxPresenterList::~MxPresenterList + #endif // MXPRESENTERLIST_H From 2bebc09da3ac73733b3b12c0a6654fdded9e46b4 Mon Sep 17 00:00:00 2001 From: Nathan M Gilbert Date: Wed, 24 Jan 2024 12:12:57 -0500 Subject: [PATCH 17/34] Implement misc.lib (#483) * Implement misc.lib * Lowercase files * Minor changes * Fix file cases * Fixes * Fix missing dtor * Add override * Match LegoImage::Read * Fix delete call --------- Co-authored-by: Christian Semmler --- CMakeLists.txt | 4 +- LEGO1/lego/legoomni/include/act1state.h | 4 +- .../legoomni/include/ambulancemissionstate.h | 2 +- LEGO1/lego/legoomni/include/animstate.h | 4 +- LEGO1/lego/legoomni/include/gasstationstate.h | 2 +- LEGO1/lego/legoomni/include/hospitalstate.h | 2 +- .../lego/legoomni/include/legoanimpresenter.h | 8 +- LEGO1/lego/legoomni/include/legogamestate.h | 9 +- LEGO1/lego/legoomni/include/legostate.h | 8 +- LEGO1/lego/legoomni/include/legostream.h | 91 -------- .../legoomni/include/legounksavedatawriter.h | 4 +- .../legoomni/include/legovehiclebuildstate.h | 2 +- LEGO1/lego/legoomni/include/legoworld.h | 8 +- .../lego/legoomni/include/pizzamissionstate.h | 2 +- LEGO1/lego/legoomni/include/pizzeriastate.h | 2 +- LEGO1/lego/legoomni/include/policestate.h | 2 +- LEGO1/lego/legoomni/include/racestate.h | 2 +- .../legoomni/include/towtrackmissionstate.h | 2 +- LEGO1/lego/legoomni/src/act1/act1state.cpp | 2 +- .../src/build/legovehiclebuildstate.cpp | 2 +- LEGO1/lego/legoomni/src/common/animstate.cpp | 2 +- .../legoomni/src/common/legogamestate.cpp | 77 ++++++- LEGO1/lego/legoomni/src/common/legostate.cpp | 19 +- LEGO1/lego/legoomni/src/common/legostream.cpp | 201 ------------------ .../src/common/legounksavedatawriter.cpp | 3 +- .../src/gasstation/gasstationstate.cpp | 2 +- .../src/hospital/ambulancemissionstate.cpp | 2 +- .../legoomni/src/hospital/hospitalstate.cpp | 2 +- .../src/pizzeria/pizzamissionstate.cpp | 2 +- .../legoomni/src/pizzeria/pizzeriastate.cpp | 2 +- .../lego/legoomni/src/police/policestate.cpp | 12 +- LEGO1/lego/legoomni/src/race/racestate.cpp | 2 +- .../src/towtrack/towtrackmissionstate.cpp | 50 ++--- .../legoomni/src/video/legoanimpresenter.cpp | 5 +- .../src/video/legopalettepresenter.cpp | 4 +- LEGO1/lego/sources/misc/legoimage.cpp | 176 +++++++++++++++ LEGO1/lego/sources/misc/legoimage.h | 54 +++++ LEGO1/lego/sources/misc/legostorage.cpp | 139 ++++++++++++ LEGO1/lego/sources/misc/legostorage.h | 95 +++++++++ LEGO1/lego/sources/misc/legotexture.cpp | 31 +++ LEGO1/lego/sources/misc/legotexture.h | 23 ++ LEGO1/lego/sources/misc/legotypes.h | 44 ++++ LEGO1/lego/sources/misc/legoutil.h | 54 +++++ LEGO1/lego/sources/misc/version.h | 6 + 44 files changed, 772 insertions(+), 397 deletions(-) delete mode 100644 LEGO1/lego/legoomni/include/legostream.h delete mode 100644 LEGO1/lego/legoomni/src/common/legostream.cpp create mode 100644 LEGO1/lego/sources/misc/legoimage.cpp create mode 100644 LEGO1/lego/sources/misc/legoimage.h create mode 100644 LEGO1/lego/sources/misc/legostorage.cpp create mode 100644 LEGO1/lego/sources/misc/legostorage.h create mode 100644 LEGO1/lego/sources/misc/legotexture.cpp create mode 100644 LEGO1/lego/sources/misc/legotexture.h create mode 100644 LEGO1/lego/sources/misc/legotypes.h create mode 100644 LEGO1/lego/sources/misc/legoutil.h create mode 100644 LEGO1/lego/sources/misc/version.h diff --git a/CMakeLists.txt b/CMakeLists.txt index b7c93768..9192c542 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -55,7 +55,6 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/common/legoobjectfactory.cpp LEGO1/lego/legoomni/src/common/legoplantmanager.cpp LEGO1/lego/legoomni/src/common/legostate.cpp - LEGO1/lego/legoomni/src/common/legostream.cpp LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp LEGO1/lego/legoomni/src/common/legoutil.cpp LEGO1/lego/legoomni/src/common/mxcompositemediapresenter.cpp @@ -148,6 +147,9 @@ add_library(lego1 SHARED LEGO1/lego/sources/3dmanager/lego3dview.cpp LEGO1/lego/sources/3dmanager/legoview1.cpp LEGO1/lego/sources/3dmanager/tglsurface.cpp + LEGO1/lego/sources/misc/legoimage.cpp + LEGO1/lego/sources/misc/legostorage.cpp + LEGO1/lego/sources/misc/legotexture.cpp LEGO1/lego/sources/roi/legoroi.cpp LEGO1/main.cpp LEGO1/mxdirectx/mxdirect3d.cpp diff --git a/LEGO1/lego/legoomni/include/act1state.h b/LEGO1/lego/legoomni/include/act1state.h index 4babf08a..3bc28a0d 100644 --- a/LEGO1/lego/legoomni/include/act1state.h +++ b/LEGO1/lego/legoomni/include/act1state.h @@ -22,8 +22,8 @@ class Act1State : public LegoState { return !strcmp(p_name, Act1State::ClassName()) || LegoState::IsA(p_name); }; - virtual MxBool SetFlag() override; // vtable+0x18 - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxBool SetFlag() override; // vtable+0x18 + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c inline void SetUnknown18(MxU32 p_unk0x18) { m_unk0x18 = p_unk0x18; } inline MxU32 GetUnknown18() { return m_unk0x18; } diff --git a/LEGO1/lego/legoomni/include/ambulancemissionstate.h b/LEGO1/lego/legoomni/include/ambulancemissionstate.h index ea5cfb3e..923a0cc3 100644 --- a/LEGO1/lego/legoomni/include/ambulancemissionstate.h +++ b/LEGO1/lego/legoomni/include/ambulancemissionstate.h @@ -22,7 +22,7 @@ class AmbulanceMissionState : public LegoState { return !strcmp(p_name, AmbulanceMissionState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c inline MxU16 GetColor(MxU8 p_id) { diff --git a/LEGO1/lego/legoomni/include/animstate.h b/LEGO1/lego/legoomni/include/animstate.h index fe39ccc7..9ac03a4c 100644 --- a/LEGO1/lego/legoomni/include/animstate.h +++ b/LEGO1/lego/legoomni/include/animstate.h @@ -23,8 +23,8 @@ class AnimState : public LegoState { return !strcmp(p_name, AnimState::ClassName()) || LegoState::IsA(p_name); } - virtual MxBool SetFlag() override; // vtable+0x18 - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1C + virtual MxBool SetFlag() override; // vtable+0x18 + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1C // SYNTHETIC: LEGO1 0x10065130 // AnimState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/gasstationstate.h b/LEGO1/lego/legoomni/include/gasstationstate.h index 4f77e307..57fd0d39 100644 --- a/LEGO1/lego/legoomni/include/gasstationstate.h +++ b/LEGO1/lego/legoomni/include/gasstationstate.h @@ -22,7 +22,7 @@ class GasStationState : public LegoState { return !strcmp(p_name, GasStationState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c // SYNTHETIC: LEGO1 0x10006290 // GasStationState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/hospitalstate.h b/LEGO1/lego/legoomni/include/hospitalstate.h index af876f89..a38cfd2e 100644 --- a/LEGO1/lego/legoomni/include/hospitalstate.h +++ b/LEGO1/lego/legoomni/include/hospitalstate.h @@ -23,7 +23,7 @@ class HospitalState : public LegoState { return !strcmp(p_name, HospitalState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c // SYNTHETIC: LEGO1 0x100764c0 // HospitalState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 3eeea936..94832a61 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -1,11 +1,11 @@ #ifndef LEGOANIMPRESENTER_H #define LEGOANIMPRESENTER_H +#include "lego/sources/misc/legostorage.h" #include "mxgeometry/mxgeometry3d.h" #include "mxvideopresenter.h" class LegoWorld; -class LegoMemoryStream; class LegoAnimClass; // VTABLE: LEGO1 0x100d90c8 @@ -97,9 +97,9 @@ class LegoAnimClass : public LegoAnimClassBase { LegoAnimClass(); virtual ~LegoAnimClass() override; - virtual void VTable0x8() override; // vtable+0x08 - virtual void VTable0xc() override; // vtable+0x0c - virtual MxResult VTable0x10(LegoMemoryStream* p_stream, MxS32); // vtable+0x10 + virtual void VTable0x8() override; // vtable+0x08 + virtual void VTable0xc() override; // vtable+0x0c + virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10 MxLong m_unk0x8; // 0x08 undefined4 m_unk0xc; // 0x0c diff --git a/LEGO1/lego/legoomni/include/legogamestate.h b/LEGO1/lego/legoomni/include/legogamestate.h index ae39654c..534ac5b9 100644 --- a/LEGO1/lego/legoomni/include/legogamestate.h +++ b/LEGO1/lego/legoomni/include/legogamestate.h @@ -2,10 +2,11 @@ #define LEGOGAMESTATE_H #include "decomp.h" +#include "lego/sources/misc/legostorage.h" #include "legobackgroundcolor.h" #include "legofullscreenmovie.h" -#include "legostream.h" #include "mxtypes.h" +#include "mxvariabletable.h" class LegoState; class MxVariable; @@ -47,7 +48,7 @@ class LegoGameState { struct ScoreStruct { void WriteScoreHistory(); - void FUN_1003ccf0(LegoFileStream&); + void FUN_1003ccf0(LegoFile&); MxU16 m_unk0x00; undefined m_unk0x02[0x2c][20]; @@ -55,7 +56,9 @@ class LegoGameState { private: void RegisterState(LegoState* p_state); - MxResult WriteEndOfVariables(LegoStream* p_stream); + MxResult WriteVariable(LegoStorage* p_stream, MxVariableTable* p_from, const char* p_variableName); + MxResult WriteEndOfVariables(LegoStorage* p_stream); + MxS32 ReadVariable(LegoStorage* p_stream, MxVariableTable* p_to); void SetROIHandlerFunction(); char* m_savePath; // 0x0 diff --git a/LEGO1/lego/legoomni/include/legostate.h b/LEGO1/lego/legoomni/include/legostate.h index 215d64d4..e6d11bd1 100644 --- a/LEGO1/lego/legoomni/include/legostate.h +++ b/LEGO1/lego/legoomni/include/legostate.h @@ -2,7 +2,7 @@ #define LEGOSTATE_H #include "decomp.h" -#include "legostream.h" +#include "lego/sources/misc/legostorage.h" #include "mxcore.h" #include "mxstring.h" @@ -24,9 +24,9 @@ class LegoState : public MxCore { return !strcmp(p_name, LegoState::ClassName()) || MxCore::IsA(p_name); } - virtual MxBool VTable0x14(); // vtable+0x14 - virtual MxBool SetFlag(); // vtable+0x18 - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream); // vtable+0x1C + virtual MxBool VTable0x14(); // vtable+0x14 + virtual MxBool SetFlag(); // vtable+0x18 + virtual MxResult VTable0x1c(LegoFile* p_legoFile); // vtable+0x1C // SYNTHETIC: LEGO1 0x10006160 // LegoState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legostream.h b/LEGO1/lego/legoomni/include/legostream.h deleted file mode 100644 index 601e94e2..00000000 --- a/LEGO1/lego/legoomni/include/legostream.h +++ /dev/null @@ -1,91 +0,0 @@ -#ifndef LEGOSTREAM_H -#define LEGOSTREAM_H - -#include "compat.h" -#include "decomp.h" -#include "mxstring.h" -#include "mxtypes.h" - -#pragma warning(disable : 4237) -#include - -#define LEGOSTREAM_MODE_READ 1 -#define LEGOSTREAM_MODE_WRITE 2 - -class MxVariableTable; - -// VTABLE: LEGO1 0x100d7d80 -class LegoStream { -public: - LegoStream() : m_mode(0) {} - // FUNCTION: LEGO1 0x10045ad0 - inline virtual ~LegoStream() {} - - virtual MxResult Read(void* p_buffer, MxU32 p_size) = 0; - virtual MxResult Write(const void* p_buffer, MxU32 p_size) = 0; - virtual MxResult Tell(MxU32* p_offset) = 0; - virtual MxResult Seek(MxU32 p_offset) = 0; - - virtual MxBool IsWriteMode(); - virtual MxBool IsReadMode(); - - enum OpenFlags { - c_readBit = 1, - c_writeBit = 2, - c_binaryBit = 4, - }; - - static MxResult __stdcall WriteVariable(LegoStream* p_stream, MxVariableTable* p_from, const char* p_variableName); - static MxS32 __stdcall ReadVariable(LegoStream* p_stream, MxVariableTable* p_to); - -protected: - MxU8 m_mode; -}; - -// SYNTHETIC: LEGO1 0x10045b00 -// LegoStream::`scalar deleting destructor' - -// VTABLE: LEGO1 0x100db730 -class LegoFileStream : public LegoStream { -public: - LegoFileStream(); - virtual ~LegoFileStream() override; - - MxResult Read(void* p_buffer, MxU32 p_size) override; - MxResult Write(const void* p_buffer, MxU32 p_size) override; - MxResult Tell(MxU32* p_offset) override; - MxResult Seek(MxU32 p_offset) override; - - MxResult Open(const char* p_filename, OpenFlags p_mode); - - LegoFileStream* FUN_10006030(MxString p_str); - -private: - FILE* m_hFile; -}; - -// SYNTHETIC: LEGO1 0x10099230 -// LegoFileStream::`scalar deleting destructor' - -// VTABLE: LEGO1 0x100db710 -class LegoMemoryStream : public LegoStream { -public: - LegoMemoryStream(char* p_buffer); - - MxResult Read(void* p_buffer, MxU32 p_size) override; - MxResult Write(const void* p_buffer, MxU32 p_size) override; - MxResult Tell(MxU32* p_offset) override; - MxResult Seek(MxU32 p_offset) override; - -private: - char* m_buffer; - MxU32 m_offset; -}; - -// SYNTHETIC: LEGO1 0x10045a80 -// LegoMemoryStream::~LegoMemoryStream - -// SYNTHETIC: LEGO1 0x100990f0 -// LegoMemoryStream::`scalar deleting destructor' - -#endif // LEGOSTREAM_H diff --git a/LEGO1/lego/legoomni/include/legounksavedatawriter.h b/LEGO1/lego/legoomni/include/legounksavedatawriter.h index 4623ec7a..d33cfc56 100644 --- a/LEGO1/lego/legoomni/include/legounksavedatawriter.h +++ b/LEGO1/lego/legoomni/include/legounksavedatawriter.h @@ -2,11 +2,11 @@ #define LEGOUNKSAVEDATAWRITER_H #include "decomp.h" +#include "lego/sources/misc/legostorage.h" #include "mxtypes.h" class AutoROI; class LegoROI; -class LegoStream; struct LegoSaveDataEntry3 { char* m_name; @@ -35,7 +35,7 @@ struct LegoSaveDataEntry3 { class LegoUnkSaveDataWriter { public: - MxResult WriteSaveData3(LegoStream* p_stream); + MxResult WriteSaveData3(LegoStorage* p_stream); AutoROI* FUN_10083500(undefined4, undefined4); void FUN_10083db0(LegoROI* p_roi); }; diff --git a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h index 8deed7a5..a155595e 100644 --- a/LEGO1/lego/legoomni/include/legovehiclebuildstate.h +++ b/LEGO1/lego/legoomni/include/legovehiclebuildstate.h @@ -23,7 +23,7 @@ class LegoVehicleBuildState : public LegoState { return !strcmp(p_name, this->m_className.GetData()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c // SYNTHETIC: LEGO1 0x100260a0 // LegoVehicleBuildState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 13ca9737..4fea4672 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -13,7 +13,7 @@ class IslePathActor; class LegoPathBoundary; struct PresenterSetCompare { - int operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; } + MxS32 operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; } }; typedef set MxPresenterSet; @@ -23,7 +23,7 @@ typedef set MxPresenterSet; class LegoWorld : public LegoEntity { public: __declspec(dllexport) LegoWorld(); - __declspec(dllexport) virtual ~LegoWorld(); // vtable+0x0 + __declspec(dllexport) virtual ~LegoWorld() override; // vtable+0x0 virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 virtual MxResult Tickle() override; // vtable+0x8 @@ -119,7 +119,6 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x1001df00 // Set::~Set -// clang-format om // SYNTHETIC: LEGO1 0x1001eed0 // MxPresenterListCursor::`scalar deleting destructor' @@ -143,6 +142,7 @@ class LegoWorld : public LegoEntity { // MxListCursor::MxListCursor // GLOBAL: LEGO1 0x100f11a0 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Nil +// _Tree>::_Kfn,PresenterSetCompare,allocator >::_Nil +// clang-format on #endif // LEGOWORLD_H diff --git a/LEGO1/lego/legoomni/include/pizzamissionstate.h b/LEGO1/lego/legoomni/include/pizzamissionstate.h index e3867728..7c792ed4 100644 --- a/LEGO1/lego/legoomni/include/pizzamissionstate.h +++ b/LEGO1/lego/legoomni/include/pizzamissionstate.h @@ -28,7 +28,7 @@ class PizzaMissionState : public LegoState { return !strcmp(p_name, PizzaMissionState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } diff --git a/LEGO1/lego/legoomni/include/pizzeriastate.h b/LEGO1/lego/legoomni/include/pizzeriastate.h index 402981ff..1e9da6d3 100644 --- a/LEGO1/lego/legoomni/include/pizzeriastate.h +++ b/LEGO1/lego/legoomni/include/pizzeriastate.h @@ -22,7 +22,7 @@ class PizzeriaState : public LegoState { return !strcmp(p_name, PizzeriaState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c // SYNTHETIC: LEGO1 0x10017ce0 // PizzeriaState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/policestate.h b/LEGO1/lego/legoomni/include/policestate.h index 976588a3..77005cef 100644 --- a/LEGO1/lego/legoomni/include/policestate.h +++ b/LEGO1/lego/legoomni/include/policestate.h @@ -23,7 +23,7 @@ class PoliceState : public LegoState { return !strcmp(p_name, PoliceState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c // SYNTHETIC: LEGO1 0x1005e920 // PoliceState::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/racestate.h b/LEGO1/lego/legoomni/include/racestate.h index bfae3525..7d2de4f6 100644 --- a/LEGO1/lego/legoomni/include/racestate.h +++ b/LEGO1/lego/legoomni/include/racestate.h @@ -30,7 +30,7 @@ class RaceState : public LegoState { return !strcmp(p_name, RaceState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1c + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1c inline MxU16 GetColor(MxU8 p_id) { return GetState(p_id)->m_color; } diff --git a/LEGO1/lego/legoomni/include/towtrackmissionstate.h b/LEGO1/lego/legoomni/include/towtrackmissionstate.h index be2e2689..ef5bacda 100644 --- a/LEGO1/lego/legoomni/include/towtrackmissionstate.h +++ b/LEGO1/lego/legoomni/include/towtrackmissionstate.h @@ -21,7 +21,7 @@ class TowTrackMissionState : public LegoState { { return !strcmp(p_name, TowTrackMissionState::ClassName()) || LegoState::IsA(p_name); } - virtual MxResult VTable0x1c(LegoFileStream* p_legoFileStream) override; // vtable+0x1C + virtual MxResult VTable0x1c(LegoFile* p_legoFile) override; // vtable+0x1C inline MxU16 GetColor(MxU8 p_id) { diff --git a/LEGO1/lego/legoomni/src/act1/act1state.cpp b/LEGO1/lego/legoomni/src/act1/act1state.cpp index 6a36e3c3..cd39f1e2 100644 --- a/LEGO1/lego/legoomni/src/act1/act1state.cpp +++ b/LEGO1/lego/legoomni/src/act1/act1state.cpp @@ -14,7 +14,7 @@ Act1State::Act1State() } // STUB: LEGO1 0x10033ac0 -MxResult Act1State::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult Act1State::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp b/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp index df9a0de6..a7b68529 100644 --- a/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp +++ b/LEGO1/lego/legoomni/src/build/legovehiclebuildstate.cpp @@ -25,7 +25,7 @@ LegoVehicleBuildState::LegoVehicleBuildState(char* p_classType) } // STUB: LEGO1 0x10026120 -MxResult LegoVehicleBuildState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult LegoVehicleBuildState::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/common/animstate.cpp b/LEGO1/lego/legoomni/src/common/animstate.cpp index 1a08890b..c20841b7 100644 --- a/LEGO1/lego/legoomni/src/common/animstate.cpp +++ b/LEGO1/lego/legoomni/src/common/animstate.cpp @@ -18,7 +18,7 @@ AnimState::~AnimState() } // STUB: LEGO1 0x100652d0 -MxResult AnimState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult AnimState::VTable0x1c(LegoFile* p_legoFile) { // TODO return FAILURE; diff --git a/LEGO1/lego/legoomni/src/common/legogamestate.cpp b/LEGO1/lego/legoomni/src/common/legogamestate.cpp index 0bb0b066..93a9544b 100644 --- a/LEGO1/lego/legoomni/src/common/legogamestate.cpp +++ b/LEGO1/lego/legoomni/src/common/legogamestate.cpp @@ -4,7 +4,6 @@ #include "legoanimationmanager.h" #include "legoomni.h" #include "legostate.h" -#include "legostream.h" #include "legoutil.h" #include "legovideomanager.h" #include "mxbackgroundaudiomanager.h" @@ -31,6 +30,13 @@ const char* g_playersGSI = "Players.gsi"; // STRING: LEGO1 0x100f3e24 const char* g_historyGSI = "History.gsi"; +// This is a pointer to the end of the global variable name table, which has +// the text "END_OF_VARIABLES" in it. +// TODO: make g_endOfVariables reference the actual end of the variable array. +// GLOBAL: LEGO1 0x100f3e50 +// STRING: LEGO1 0x100f3e00 +const char* g_endOfVariables = "END_OF_VARIABLES"; + // GLOBAL: LEGO1 0x100f3e58 ColorStringStruct g_colorSaveData[43] = { {"c_dbbkfny0", "lego red"}, {"c_dbbkxly0", "lego white"}, {"c_chbasey0", "lego black"}, @@ -119,8 +125,8 @@ MxResult LegoGameState::Save(MxULong p_slot) MxVariableTable* variableTable = VariableTable(); MxString savePath; GetFileSavePath(&savePath, p_slot); - LegoFileStream fileStream; - if (fileStream.Open(savePath.GetData(), LegoStream::c_writeBit) != FAILURE) { + LegoFile fileStream; + if (fileStream.Open(savePath.GetData(), LegoFile::c_write) != FAILURE) { MxU32 maybeVersion = 0x1000C; fileStream.Write(&maybeVersion, 4); fileStream.Write(&m_unk0x24, 2); @@ -128,12 +134,12 @@ MxResult LegoGameState::Save(MxULong p_slot) fileStream.Write(&m_unk0xc, 1); for (MxS32 i = 0; i < sizeof(g_colorSaveData) / sizeof(g_colorSaveData[0]); ++i) { - if (LegoStream::WriteVariable(&fileStream, variableTable, g_colorSaveData[i].m_targetName) == FAILURE) + if (WriteVariable(&fileStream, variableTable, g_colorSaveData[i].m_targetName) == FAILURE) return result; } - if (LegoStream::WriteVariable(&fileStream, variableTable, "backgroundcolor") != FAILURE) { - if (LegoStream::WriteVariable(&fileStream, variableTable, "lightposition") != FAILURE) { + if (WriteVariable(&fileStream, variableTable, "backgroundcolor") != FAILURE) { + if (WriteVariable(&fileStream, variableTable, "lightposition") != FAILURE) { WriteEndOfVariables(&fileStream); // TODO: Calls down to more aggregate writing functions @@ -166,8 +172,27 @@ void LegoGameState::SetSavePath(char* p_savePath) m_savePath = NULL; } +// FUNCTION: LEGO1 0x10039f70 +MxResult LegoGameState::WriteVariable(LegoStorage* p_stream, MxVariableTable* p_from, const char* p_variableName) +{ + MxResult result = FAILURE; + const char* variableValue = p_from->GetVariable(p_variableName); + + if (variableValue) { + MxU8 length = strlen(p_variableName); + if (p_stream->Write((char*) &length, 1) == SUCCESS) { + if (p_stream->Write(p_variableName, length) == SUCCESS) { + length = strlen(variableValue); + if (p_stream->Write((char*) &length, 1) == SUCCESS) + result = p_stream->Write((char*) variableValue, length); + } + } + } + return result; +} + // FUNCTION: LEGO1 0x1003a020 -MxResult LegoGameState::WriteEndOfVariables(LegoStream* p_stream) +MxResult LegoGameState::WriteEndOfVariables(LegoStorage* p_stream) { MxU8 len = strlen(g_endOfVariables); if (p_stream->Write(&len, 1) == SUCCESS) @@ -175,6 +200,36 @@ MxResult LegoGameState::WriteEndOfVariables(LegoStream* p_stream) return FAILURE; } +// 95% match, just some instruction ordering differences on the call to +// MxVariableTable::SetVariable at the end. +// FUNCTION: LEGO1 0x1003a080 +MxS32 LegoGameState::ReadVariable(LegoStorage* p_stream, MxVariableTable* p_to) +{ + MxS32 result = 1; + MxU8 length; + + if (p_stream->Read((char*) &length, 1) == SUCCESS) { + char nameBuffer[256]; + if (p_stream->Read(nameBuffer, length) == SUCCESS) { + nameBuffer[length] = '\0'; + if (strcmp(nameBuffer, g_endOfVariables) == 0) + // 2 -> "This was the last entry, done reading." + result = 2; + else { + if (p_stream->Read((char*) &length, 1) == SUCCESS) { + char valueBuffer[256]; + if (p_stream->Read(valueBuffer, length) == SUCCESS) { + result = 0; + valueBuffer[length] = '\0'; + p_to->SetVariable(nameBuffer, valueBuffer); + } + } + } + } + } + return result; +} + // FUNCTION: LEGO1 0x1003a170 void LegoGameState::GetFileSavePath(MxString* p_outPath, MxULong p_slotn) { @@ -312,7 +367,7 @@ void LegoGameState::ScoreStruct::WriteScoreHistory() } // STUB: LEGO1 0x1003ccf0 -void LegoGameState::ScoreStruct::FUN_1003ccf0(LegoFileStream&) +void LegoGameState::ScoreStruct::FUN_1003ccf0(LegoFile&) { // TODO } @@ -320,16 +375,16 @@ void LegoGameState::ScoreStruct::FUN_1003ccf0(LegoFileStream&) // FUNCTION: LEGO1 0x1003cdd0 void LegoGameState::SerializeScoreHistory(MxS16 p_flags) { - LegoFileStream stream; + LegoFile stream; MxString savePath(m_savePath); savePath += "\\"; savePath += g_historyGSI; - if (p_flags == LegoStream::c_writeBit) { + if (p_flags == LegoFile::c_write) { m_unk0xa6.WriteScoreHistory(); } - if (stream.Open(savePath.GetData(), (LegoStream::OpenFlags) p_flags) == SUCCESS) { + if (stream.Open(savePath.GetData(), p_flags) == SUCCESS) { m_unk0xa6.FUN_1003ccf0(stream); } } diff --git a/LEGO1/lego/legoomni/src/common/legostate.cpp b/LEGO1/lego/legoomni/src/common/legostate.cpp index c99fb708..16beb159 100644 --- a/LEGO1/lego/legoomni/src/common/legostate.cpp +++ b/LEGO1/lego/legoomni/src/common/legostate.cpp @@ -20,23 +20,10 @@ MxBool LegoState::SetFlag() } // FUNCTION: LEGO1 0x10005fb0 -MxResult LegoState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult LegoState::VTable0x1c(LegoFile* p_legoFile) { - if (p_legoFileStream->IsWriteMode()) { - p_legoFileStream->FUN_10006030(this->ClassName()); + if (p_legoFile->IsWriteMode()) { + p_legoFile->FUN_10006030(this->ClassName()); } return SUCCESS; } - -// FUNCTION: LEGO1 0x10006030 -LegoFileStream* LegoFileStream::FUN_10006030(MxString p_str) -{ - const char* data = p_str.GetData(); - MxU32 fullLength = strlen(data); - - MxU16 limitedLength = fullLength; - Write(&limitedLength, sizeof(limitedLength)); - Write(data, (MxS16) fullLength); - - return this; -} diff --git a/LEGO1/lego/legoomni/src/common/legostream.cpp b/LEGO1/lego/legoomni/src/common/legostream.cpp deleted file mode 100644 index f54d5982..00000000 --- a/LEGO1/lego/legoomni/src/common/legostream.cpp +++ /dev/null @@ -1,201 +0,0 @@ - -#include "legostream.h" - -#include "mxvariabletable.h" - -#include -#include - -// This is a pointer to the end of the global variable name table, which has -// the text "END_OF_VARIABLES" in it. -// TODO: make g_endOfVariables reference the actual end of the variable array. -// GLOBAL: LEGO1 0x100f3e50 -// STRING: LEGO1 0x100f3e00 -const char* g_endOfVariables = "END_OF_VARIABLES"; - -// Very likely but not certain sizes. -// The classes are only used on the stack in functions we have not 100% matched -// yet, we can confirm the size once we have. -DECOMP_SIZE_ASSERT(LegoStream, 0x8); -DECOMP_SIZE_ASSERT(LegoFileStream, 0xC); -DECOMP_SIZE_ASSERT(LegoMemoryStream, 0x10); - -// FUNCTION: LEGO1 0x10039f70 -MxResult LegoStream::WriteVariable(LegoStream* p_stream, MxVariableTable* p_from, const char* p_variableName) -{ - MxResult result = FAILURE; - const char* variableValue = p_from->GetVariable(p_variableName); - - if (variableValue) { - MxU8 length = strlen(p_variableName); - if (p_stream->Write((char*) &length, 1) == SUCCESS) { - if (p_stream->Write(p_variableName, length) == SUCCESS) { - length = strlen(variableValue); - if (p_stream->Write((char*) &length, 1) == SUCCESS) - result = p_stream->Write((char*) variableValue, length); - } - } - } - return result; -} - -// 95% match, just some instruction ordering differences on the call to -// MxVariableTable::SetVariable at the end. -// FUNCTION: LEGO1 0x1003a080 -MxS32 LegoStream::ReadVariable(LegoStream* p_stream, MxVariableTable* p_to) -{ - MxS32 result = 1; - MxU8 length; - - if (p_stream->Read((char*) &length, 1) == SUCCESS) { - char nameBuffer[256]; - if (p_stream->Read(nameBuffer, length) == SUCCESS) { - nameBuffer[length] = '\0'; - if (strcmp(nameBuffer, g_endOfVariables) == 0) - // 2 -> "This was the last entry, done reading." - result = 2; - else { - if (p_stream->Read((char*) &length, 1) == SUCCESS) { - char valueBuffer[256]; - if (p_stream->Read(valueBuffer, length) == SUCCESS) { - result = 0; - valueBuffer[length] = '\0'; - p_to->SetVariable(nameBuffer, valueBuffer); - } - } - } - } - } - return result; -} - -// FUNCTION: LEGO1 0x10045ae0 -MxBool LegoStream::IsWriteMode() -{ - return m_mode == LEGOSTREAM_MODE_WRITE; -} - -// FUNCTION: LEGO1 0x10045af0 -MxBool LegoStream::IsReadMode() -{ - return m_mode == LEGOSTREAM_MODE_READ; -} - -// FUNCTION: LEGO1 0x10099080 -LegoMemoryStream::LegoMemoryStream(char* p_buffer) : LegoStream() -{ - m_buffer = p_buffer; - m_offset = 0; -} - -// FUNCTION: LEGO1 0x10099160 -MxResult LegoMemoryStream::Read(void* p_buffer, MxU32 p_size) -{ - memcpy(p_buffer, m_buffer + m_offset, p_size); - m_offset += p_size; - return SUCCESS; -} - -// FUNCTION: LEGO1 0x10099190 -MxResult LegoMemoryStream::Write(const void* p_buffer, MxU32 p_size) -{ - memcpy(m_buffer + m_offset, p_buffer, p_size); - m_offset += p_size; - return SUCCESS; -} - -// FUNCTION: LEGO1 0x100991c0 -LegoFileStream::LegoFileStream() : LegoStream() -{ - m_hFile = NULL; -} - -// FUNCTION: LEGO1 0x10099250 -LegoFileStream::~LegoFileStream() -{ - if (m_hFile != NULL) - fclose(m_hFile); -} - -// FUNCTION: LEGO1 0x100992c0 -MxResult LegoFileStream::Read(void* p_buffer, MxU32 p_size) -{ - if (m_hFile == NULL) - return FAILURE; - - return (fread(p_buffer, 1, p_size, m_hFile) == p_size) ? SUCCESS : FAILURE; -} - -// FUNCTION: LEGO1 0x10099300 -MxResult LegoFileStream::Write(const void* p_buffer, MxU32 p_size) -{ - if (m_hFile == NULL) - return FAILURE; - - return (fwrite(p_buffer, 1, p_size, m_hFile) == p_size) ? SUCCESS : FAILURE; -} - -// FUNCTION: LEGO1 0x10099340 -MxResult LegoFileStream::Tell(MxU32* p_offset) -{ - if (m_hFile == NULL) - return FAILURE; - - int got = ftell(m_hFile); - if (got == -1) - return FAILURE; - - *p_offset = got; - return SUCCESS; -} - -// FUNCTION: LEGO1 0x10099370 -MxResult LegoFileStream::Seek(MxU32 p_offset) -{ - if (m_hFile == NULL) - return FAILURE; - - return (fseek(m_hFile, p_offset, 0) == 0) ? SUCCESS : FAILURE; -} - -// FUNCTION: LEGO1 0x100993a0 -MxResult LegoFileStream::Open(const char* p_filename, OpenFlags p_mode) -{ - char modeString[4]; - - if (m_hFile != NULL) - fclose(m_hFile); - - modeString[0] = '\0'; - if (p_mode & c_readBit) { - m_mode = LEGOSTREAM_MODE_READ; - strcat(modeString, "r"); - } - - if (p_mode & c_writeBit) { - if (m_mode != LEGOSTREAM_MODE_READ) - m_mode = LEGOSTREAM_MODE_WRITE; - strcat(modeString, "w"); - } - - if ((p_mode & c_binaryBit) != 0) - strcat(modeString, "b"); - else - strcat(modeString, "t"); - - return (m_hFile = fopen(p_filename, modeString)) ? SUCCESS : FAILURE; -} - -// FUNCTION: LEGO1 0x100994a0 -MxResult LegoMemoryStream::Tell(MxU32* p_offset) -{ - *p_offset = m_offset; - return SUCCESS; -} - -// FUNCTION: LEGO1 0x100994b0 -MxResult LegoMemoryStream::Seek(MxU32 p_offset) -{ - m_offset = p_offset; - return SUCCESS; -} diff --git a/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp b/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp index c06ebb7e..551dea32 100644 --- a/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp +++ b/LEGO1/lego/legoomni/src/common/legounksavedatawriter.cpp @@ -1,7 +1,6 @@ #include "legounksavedatawriter.h" #include "legogamestate.h" -#include "legostream.h" #include "roi/legoroi.h" DECOMP_SIZE_ASSERT(LegoSaveDataEntry3, 0x108); @@ -10,7 +9,7 @@ DECOMP_SIZE_ASSERT(LegoSaveDataEntry3, 0x108); LegoSaveDataEntry3 g_saveData3[66]; // FUNCTION: LEGO1 0x10083310 -MxResult LegoUnkSaveDataWriter::WriteSaveData3(LegoStream* p_stream) +MxResult LegoUnkSaveDataWriter::WriteSaveData3(LegoStorage* p_stream) { MxResult result = FAILURE; diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp index 5bbcdde6..b4b242ac 100644 --- a/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp +++ b/LEGO1/lego/legoomni/src/gasstation/gasstationstate.cpp @@ -18,7 +18,7 @@ GasStationState::GasStationState() } // STUB: LEGO1 0x10006300 -MxResult GasStationState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult GasStationState::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp b/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp index 601f1ccd..eb74f64c 100644 --- a/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp +++ b/LEGO1/lego/legoomni/src/hospital/ambulancemissionstate.cpp @@ -20,7 +20,7 @@ AmbulanceMissionState::AmbulanceMissionState() } // STUB: LEGO1 0x10037440 -MxResult AmbulanceMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult AmbulanceMissionState::VTable0x1c(LegoFile* p_legoFile) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp b/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp index 5921cd0c..012d9c4a 100644 --- a/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp +++ b/LEGO1/lego/legoomni/src/hospital/hospitalstate.cpp @@ -14,7 +14,7 @@ HospitalState::HospitalState() } // STUB: LEGO1 0x10076530 -MxResult HospitalState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult HospitalState::VTable0x1c(LegoFile* p_legoFile) { // TODO return 0; diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp index 6fb460a1..6d1cac49 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzamissionstate.cpp @@ -4,7 +4,7 @@ DECOMP_SIZE_ASSERT(PizzaMissionStateEntry, 0x20) DECOMP_SIZE_ASSERT(PizzaMissionState, 0xb0) // STUB: LEGO1 0x100393c0 -MxResult PizzaMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult PizzaMissionState::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp index 3422c68d..6694e4d8 100644 --- a/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp +++ b/LEGO1/lego/legoomni/src/pizzeria/pizzeriastate.cpp @@ -7,7 +7,7 @@ PizzeriaState::PizzeriaState() } // STUB: LEGO1 0x10017da0 -MxResult PizzeriaState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult PizzeriaState::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/police/policestate.cpp b/LEGO1/lego/legoomni/src/police/policestate.cpp index b0011ccb..6e026c79 100644 --- a/LEGO1/lego/legoomni/src/police/policestate.cpp +++ b/LEGO1/lego/legoomni/src/police/policestate.cpp @@ -12,18 +12,18 @@ PoliceState::PoliceState() } // FUNCTION: LEGO1 0x1005e990 -MxResult PoliceState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult PoliceState::VTable0x1c(LegoFile* p_legoFile) { - if (p_legoFileStream->IsWriteMode()) { - p_legoFileStream->FUN_10006030(ClassName()); + if (p_legoFile->IsWriteMode()) { + p_legoFile->FUN_10006030(ClassName()); } - if (p_legoFileStream->IsReadMode()) { - p_legoFileStream->Read(&m_unk0x8, sizeof(m_unk0x8)); + if (p_legoFile->IsReadMode()) { + p_legoFile->Read(&m_unk0x8, sizeof(m_unk0x8)); } else { undefined4 unk0x8 = m_unk0x8; - p_legoFileStream->Write(&unk0x8, sizeof(m_unk0x8)); + p_legoFile->Write(&unk0x8, sizeof(m_unk0x8)); } return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/race/racestate.cpp b/LEGO1/lego/legoomni/src/race/racestate.cpp index bdc003f0..db6d96dc 100644 --- a/LEGO1/lego/legoomni/src/race/racestate.cpp +++ b/LEGO1/lego/legoomni/src/race/racestate.cpp @@ -12,7 +12,7 @@ RaceState::RaceState() } // STUB: LEGO1 0x10016140 -MxResult RaceState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult RaceState::VTable0x1c(LegoFile* p_legoFile) { // TODO return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp index a5719da5..9a85e0b6 100644 --- a/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp +++ b/LEGO1/lego/legoomni/src/towtrack/towtrackmissionstate.cpp @@ -21,54 +21,54 @@ TowTrackMissionState::TowTrackMissionState() } // FUNCTION: LEGO1 0x1004dde0 -MxResult TowTrackMissionState::VTable0x1c(LegoFileStream* p_legoFileStream) +MxResult TowTrackMissionState::VTable0x1c(LegoFile* p_legoFile) { - if (p_legoFileStream->IsWriteMode()) { - p_legoFileStream->FUN_10006030(this->ClassName()); + if (p_legoFile->IsWriteMode()) { + p_legoFile->FUN_10006030(this->ClassName()); } - if (p_legoFileStream->IsReadMode()) { - p_legoFileStream->Read(&m_unk0x12, sizeof(MxU16)); - p_legoFileStream->Read(&m_unk0x14, sizeof(MxU16)); - p_legoFileStream->Read(&m_unk0x16, sizeof(MxU16)); - p_legoFileStream->Read(&m_unk0x18, sizeof(MxU16)); - p_legoFileStream->Read(&m_unk0x1a, sizeof(MxU16)); - p_legoFileStream->Read(&m_unk0x1c, sizeof(MxU16)); - p_legoFileStream->Read(&m_color1, sizeof(MxU16)); - p_legoFileStream->Read(&m_color2, sizeof(MxU16)); - p_legoFileStream->Read(&m_color3, sizeof(MxU16)); - p_legoFileStream->Read(&m_color4, sizeof(MxU16)); + if (p_legoFile->IsReadMode()) { + p_legoFile->Read(&m_unk0x12, sizeof(MxU16)); + p_legoFile->Read(&m_unk0x14, sizeof(MxU16)); + p_legoFile->Read(&m_unk0x16, sizeof(MxU16)); + p_legoFile->Read(&m_unk0x18, sizeof(MxU16)); + p_legoFile->Read(&m_unk0x1a, sizeof(MxU16)); + p_legoFile->Read(&m_unk0x1c, sizeof(MxU16)); + p_legoFile->Read(&m_color1, sizeof(MxU16)); + p_legoFile->Read(&m_color2, sizeof(MxU16)); + p_legoFile->Read(&m_color3, sizeof(MxU16)); + p_legoFile->Read(&m_color4, sizeof(MxU16)); } - else if (p_legoFileStream->IsWriteMode()) { + else if (p_legoFile->IsWriteMode()) { MxU16 write = m_unk0x12; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_unk0x14; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_unk0x16; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_unk0x18; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_unk0x1a; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_unk0x1c; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_color1; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_color2; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_color3; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); write = m_color4; - p_legoFileStream->Write(&write, sizeof(MxU16)); + p_legoFile->Write(&write, sizeof(MxU16)); } return SUCCESS; diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 027a3b83..0167833d 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -1,7 +1,6 @@ #include "legoanimpresenter.h" #include "legoomni.h" -#include "legostream.h" #include "legoworld.h" #include "mxcompositepresenter.h" #include "mxdsanim.h" @@ -60,7 +59,7 @@ void LegoAnimPresenter::Destroy(MxBool p_fromDestructor) MxResult LegoAnimPresenter::VTable0x88(MxStreamChunk* p_chunk) { MxResult result = FAILURE; - LegoMemoryStream stream((char*) p_chunk->GetData()); + LegoMemory stream((char*) p_chunk->GetData()); MxS32 magicSig; MxS32 val2 = 0; @@ -238,7 +237,7 @@ LegoAnimClass::~LegoAnimClass() } // STUB: LEGO1 0x100a0c70 -MxResult LegoAnimClass::VTable0x10(LegoMemoryStream* p_stream, MxS32) +MxResult LegoAnimClass::VTable0x10(LegoMemory* p_stream, MxS32) { return SUCCESS; } diff --git a/LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp b/LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp index ce352f7e..7fff790f 100644 --- a/LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legopalettepresenter.cpp @@ -1,7 +1,7 @@ #include "legopalettepresenter.h" +#include "lego/sources/misc/legostorage.h" #include "legoomni.h" -#include "legostream.h" #include "legovideomanager.h" #include "mxstreamchunk.h" @@ -52,7 +52,7 @@ MxResult LegoPalettePresenter::ParsePalette(MxStreamChunk* p_chunk) RGBQUAD palette[256]; MxResult result = FAILURE; - LegoMemoryStream stream((char*) p_chunk->GetData()); + LegoMemory stream((char*) p_chunk->GetData()); if (stream.Read(buffer, sizeof(buffer)) == SUCCESS) { if (stream.Read(palette, sizeof(palette)) == SUCCESS) { m_palette = new MxPalette(palette); diff --git a/LEGO1/lego/sources/misc/legoimage.cpp b/LEGO1/lego/sources/misc/legoimage.cpp new file mode 100644 index 00000000..34d4978f --- /dev/null +++ b/LEGO1/lego/sources/misc/legoimage.cpp @@ -0,0 +1,176 @@ +#include "legoimage.h" + +#include "decomp.h" +#include "legostorage.h" +#include "memory.h" + +DECOMP_SIZE_ASSERT(LegoPaletteEntry, 0x3); +DECOMP_SIZE_ASSERT(LegoImage, 0x310); + +// FUNCTION: LEGO1 0x100994c0 +LegoPaletteEntry::LegoPaletteEntry() +{ + m_red = 0; + m_green = 0; + m_blue = 0; +} + +// FUNCTION: LEGO1 0x100994d0 +LegoResult LegoPaletteEntry::Read(LegoStorage* p_storage) +{ + LegoResult result; + if ((result = p_storage->Read(&m_red, sizeof(m_red))) != SUCCESS) { + return result; + } + if ((result = p_storage->Read(&m_green, sizeof(m_green))) != SUCCESS) { + return result; + } + if ((result = p_storage->Read(&m_blue, sizeof(m_blue))) != SUCCESS) { + return result; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099520 +LegoResult LegoPaletteEntry::Write(LegoStorage* p_storage) +{ + LegoResult result; + if ((result = p_storage->Write(&m_red, sizeof(m_red))) != SUCCESS) { + return result; + } + if ((result = p_storage->Write(&m_green, sizeof(m_green))) != SUCCESS) { + return result; + } + if ((result = p_storage->Write(&m_blue, sizeof(m_blue))) != SUCCESS) { + return result; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099570 +LegoImage::LegoImage() +{ + m_width = 0; + m_height = 0; + m_count = 0; + m_bits = NULL; +} + +// FUNCTION: LEGO1 0x100995a0 +LegoImage::LegoImage(LegoU32 p_width, LegoU32 p_height) +{ + m_width = p_width; + m_height = p_height; + m_count = 0; + m_bits = new LegoU8[m_width * m_height]; +} + +// FUNCTION: LEGO1 0x100995f0 +LegoImage::~LegoImage() +{ + if (m_bits) { + delete[] m_bits; + } +} + +// FUNCTION: LEGO1 0x10099610 +LegoResult LegoImage::Read(LegoStorage* p_storage, LegoU32 p_square) +{ + LegoResult result; + if ((result = p_storage->Read(&m_width, sizeof(m_width))) != SUCCESS) { + return result; + } + if ((result = p_storage->Read(&m_height, sizeof(m_height))) != SUCCESS) { + return result; + } + if ((result = p_storage->Read(&m_count, sizeof(m_height))) != SUCCESS) { + return result; + } + for (LegoU32 i = 0; i < m_count; i++) { + if ((result = m_palette[i].Read(p_storage)) != SUCCESS) { + return result; + } + } + if (m_bits) { + delete[] m_bits; + } + m_bits = new LegoU8[m_width * m_height]; + if ((result = p_storage->Read(m_bits, m_width * m_height)) != SUCCESS) { + return result; + } + + if (p_square && m_width != m_height) { + LegoU8* newBits; + + if (m_height < m_width) { + LegoU32 aspect = m_width / m_height; + newBits = new LegoU8[m_width * m_width]; + LegoU8* src = m_bits; + LegoU8* dst = newBits; + + for (LegoU32 row = 0; row < m_height; row++) { + if (aspect) { + for (LegoU32 dup = aspect; dup; dup--) { + memcpy(dst, src, m_width); + dst += m_width; + } + } + src += m_width; + } + + m_height = m_width; + } + else { + LegoU32 aspect = m_height / m_width; + newBits = new LegoU8[m_height * m_height]; + LegoU8* src = m_bits; + LegoU8* dst = newBits; + + for (LegoU32 row = 0; row < m_height; row++) { + for (LegoU32 col = 0; col < m_width; col++) { + if (aspect) { + for (LegoU32 dup = aspect; dup; dup--) { + *dst = *src; + dst++; + } + } + + src++; + } + } + + m_width = m_height; + } + + delete[] m_bits; + m_bits = newBits; + } + + return SUCCESS; +} + +// FUNCTION: LEGO1 0x100997e0 +LegoResult LegoImage::Write(LegoStorage* p_storage) +{ + LegoResult result; + if ((result = p_storage->Write(&m_width, sizeof(m_width))) != SUCCESS) { + return result; + } + if ((result = p_storage->Write(&m_height, sizeof(m_height))) != SUCCESS) { + return result; + } + if ((result = p_storage->Write(&m_count, sizeof(m_height))) != SUCCESS) { + return result; + } + for (LegoU32 i = 0; i < m_count; i++) { + if ((result = m_palette[i].Write(p_storage)) != SUCCESS) { + return result; + } + } + if (m_bits) { + if ((result = p_storage->Write(m_bits, m_width * m_height)) != SUCCESS) { + return result; + } + } + return SUCCESS; +} diff --git a/LEGO1/lego/sources/misc/legoimage.h b/LEGO1/lego/sources/misc/legoimage.h new file mode 100644 index 00000000..7990277e --- /dev/null +++ b/LEGO1/lego/sources/misc/legoimage.h @@ -0,0 +1,54 @@ +#ifndef __LEGOIMAGE_H +#define __LEGOIMAGE_H + +#include "legotypes.h" + +class LegoStorage; + +// SIZE 0x3 +class LegoPaletteEntry { +public: + LegoPaletteEntry(); + // LegoPaletteEntry(LegoU8 p_red, LegoU8 p_green, LegoU8 p_blue); + LegoU8 GetRed() { return m_red; } + void SetRed(LegoU8 p_red) { m_red = p_red; } + LegoU8 GetGreen() { return m_green; } + void SetGreen(LegoU8 p_green) { m_green = p_green; } + LegoU8 GetBlue() { return m_blue; } + void SetBlue(LegoU8 p_blue) { m_blue = p_blue; } + LegoResult Read(LegoStorage* p_storage); + LegoResult Write(LegoStorage* p_storage); + +protected: + LegoU8 m_red; // 0x00 + LegoU8 m_green; // 0x01 + LegoU8 m_blue; // 0x02 +}; + +// 0x310 +class LegoImage { +public: + LegoImage(); + LegoImage(LegoU32 p_width, LegoU32 p_height); + ~LegoImage(); + LegoU32 GetWidth() { return m_width; } + void SetWidth(LegoU32 p_width) { m_width = p_width; } + LegoU32 GetHeight() { return m_height; } + void SetHeight(LegoU32 p_height) { m_height = p_height; } + LegoPaletteEntry* GetPalette() { return m_palette; } + LegoPaletteEntry& GetPaletteEntry(LegoU32 p_i) { return m_palette[p_i]; } + void SetPaletteEntry(LegoU32 p_i, LegoPaletteEntry& p_paletteEntry) { m_palette[p_i] = p_paletteEntry; } + LegoU8* GetBits() { return m_bits; } + void SetBits(LegoU8* p_bits) { m_bits = p_bits; } + LegoResult Read(LegoStorage* p_storage, LegoU32 p_square); + LegoResult Write(LegoStorage* p_storage); + +protected: + LegoU32 m_width; // 0x00 + LegoU32 m_height; // 0x04 + LegoU32 m_count; // 0x08 + LegoPaletteEntry m_palette[256]; // 0x0c + LegoU8* m_bits; // 0x30c +}; + +#endif // __LEGOIMAGE_H diff --git a/LEGO1/lego/sources/misc/legostorage.cpp b/LEGO1/lego/sources/misc/legostorage.cpp new file mode 100644 index 00000000..50621f73 --- /dev/null +++ b/LEGO1/lego/sources/misc/legostorage.cpp @@ -0,0 +1,139 @@ +#include "legostorage.h" + +#include "decomp.h" + +#include +#include + +DECOMP_SIZE_ASSERT(LegoStorage, 0x8); +DECOMP_SIZE_ASSERT(LegoMemory, 0x10); +DECOMP_SIZE_ASSERT(LegoFile, 0xc); + +// FUNCTION: LEGO1 0x10099080 +LegoMemory::LegoMemory(void* p_buffer) : LegoStorage() +{ + m_buffer = (LegoU8*) p_buffer; + m_position = 0; +} + +// FUNCTION: LEGO1 0x10099160 +LegoResult LegoMemory::Read(void* p_buffer, LegoU32 p_size) +{ + memcpy(p_buffer, m_buffer + m_position, p_size); + m_position += p_size; + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099190 +LegoResult LegoMemory::Write(const void* p_buffer, LegoU32 p_size) +{ + memcpy(m_buffer + m_position, p_buffer, p_size); + m_position += p_size; + return SUCCESS; +} + +// FUNCTION: LEGO1 0x100991c0 +LegoFile::LegoFile() +{ + m_file = NULL; +} + +// FUNCTION: LEGO1 0x10099250 +LegoFile::~LegoFile() +{ + if (m_file) { + fclose(m_file); + } +} + +// FUNCTION: LEGO1 0x100992c0 +LegoResult LegoFile::Read(void* p_buffer, LegoU32 p_size) +{ + if (!m_file) { + return FAILURE; + } + if (fread(p_buffer, 1, p_size, m_file) != p_size) { + return FAILURE; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099300 +LegoResult LegoFile::Write(const void* p_buffer, LegoU32 p_size) +{ + if (!m_file) { + return FAILURE; + } + if (fwrite(p_buffer, 1, p_size, m_file) != p_size) { + return FAILURE; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099340 +LegoResult LegoFile::GetPosition(LegoU32& p_position) +{ + if (!m_file) { + return FAILURE; + } + LegoU32 position = ftell(m_file); + if (position == -1) { + return FAILURE; + } + p_position = position; + return SUCCESS; +} + +// FUNCTION: LEGO1 0x10099370 +LegoResult LegoFile::SetPosition(LegoU32 p_position) +{ + if (!m_file) { + return FAILURE; + } + if (fseek(m_file, p_position, SEEK_SET) != 0) { + return FAILURE; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x100993a0 +LegoResult LegoFile::Open(const char* p_name, LegoU32 p_mode) +{ + if (m_file) { + fclose(m_file); + } + char mode[4]; + mode[0] = '\0'; + if (p_mode & c_read) { + m_mode = c_read; + strcat(mode, "r"); + } + if (p_mode & c_write) { + if (m_mode != c_read) + m_mode = c_write; + strcat(mode, "w"); + } + if ((p_mode & c_text) != 0) + strcat(mode, "t"); + else + strcat(mode, "b"); + + if (!(m_file = fopen(p_name, mode))) { + return FAILURE; + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x100994a0 +LegoResult LegoMemory::GetPosition(LegoU32& p_position) +{ + p_position = m_position; + return SUCCESS; +} + +// FUNCTION: LEGO1 0x100994b0 +LegoResult LegoMemory::SetPosition(LegoU32 p_position) +{ + m_position = p_position; + return SUCCESS; +} diff --git a/LEGO1/lego/sources/misc/legostorage.h b/LEGO1/lego/sources/misc/legostorage.h new file mode 100644 index 00000000..5bd6ea67 --- /dev/null +++ b/LEGO1/lego/sources/misc/legostorage.h @@ -0,0 +1,95 @@ +#ifndef __LEGOSTORAGE_H +#define __LEGOSTORAGE_H + +#include "legotypes.h" +#include "mxstring.h" + +#include + +// VTABLE: LEGO1 0x100d7d80 +// SIZE 0x08 +class LegoStorage { +public: + enum OpenFlags { + c_read = 1, + c_write = 2, + c_text = 4 + }; + + LegoStorage() : m_mode(0) {} + + // FUNCTION: LEGO1 0x10045ad0 + virtual ~LegoStorage(){}; + + virtual LegoResult Read(void* p_buffer, LegoU32 p_size) = 0; + virtual LegoResult Write(const void* p_buffer, LegoU32 p_size) = 0; + virtual LegoResult GetPosition(LegoU32& p_position) = 0; + virtual LegoResult SetPosition(LegoU32 p_position) = 0; + + // FUNCTION: LEGO1 0x10045ae0 + virtual LegoBool IsWriteMode() { return m_mode == c_write; } + + // FUNCTION: LEGO1 0x10045af0 + virtual LegoBool IsReadMode() { return m_mode == c_read; } + + // SYNTHETIC: LEGO1 0x10045b00 + // LegoStorage::`scalar deleting destructor' + +protected: + LegoU8 m_mode; // 0x04 +}; + +// VTABLE: LEGO1 0x100db710 +// SIZE 0x10 +class LegoMemory : public LegoStorage { +public: + LegoMemory(void* p_buffer); + virtual LegoResult Read(void* p_buffer, LegoU32 p_size); + virtual LegoResult Write(const void* p_buffer, LegoU32 p_size); + virtual LegoResult GetPosition(LegoU32& p_position); + virtual LegoResult SetPosition(LegoU32 p_position); + + // SYNTHETIC: LEGO1 0x10045a80 + // LegoMemory::~LegoMemory + + // SYNTHETIC: LEGO1 0x100990f0 + // LegoMemory::`scalar deleting destructor' + +protected: + LegoU8* m_buffer; // 0x04 + LegoU32 m_position; // 0x08 +}; + +// VTABLE: LEGO1 0x100db730 +// SIZE 0x0c +class LegoFile : public LegoStorage { +public: + LegoFile(); + virtual ~LegoFile() override; + virtual LegoResult Read(void* p_buffer, LegoU32 p_size); + virtual LegoResult Write(const void* p_buffer, LegoU32 p_size); + virtual LegoResult GetPosition(LegoU32& p_position); + virtual LegoResult SetPosition(LegoU32 p_position); + LegoResult Open(const char* p_name, LegoU32 p_mode); + + // FUNCTION: LEGO1 0x10006030 + LegoStorage* FUN_10006030(MxString p_str) + { + const char* data = p_str.GetData(); + LegoU32 fullLength = strlen(data); + + LegoU16 limitedLength = fullLength; + Write(&limitedLength, sizeof(limitedLength)); + Write((char*) data, (LegoS16) fullLength); + + return this; + } + + // SYNTHETIC: LEGO1 0x10099230 + // LegoFile::`scalar deleting destructor' + +protected: + FILE* m_file; // 0x08 +}; + +#endif // __LEGOSTORAGE_H diff --git a/LEGO1/lego/sources/misc/legotexture.cpp b/LEGO1/lego/sources/misc/legotexture.cpp new file mode 100644 index 00000000..8eb74bfe --- /dev/null +++ b/LEGO1/lego/sources/misc/legotexture.cpp @@ -0,0 +1,31 @@ +#include "legotexture.h" + +#include "decomp.h" +#include "legoimage.h" +#include "legostorage.h" + +DECOMP_SIZE_ASSERT(LegoTexture, 0x4); + +// FUNCTION: LEGO1 0x10098fb0 +LegoTexture::LegoTexture() +{ + m_image = new LegoImage(); +} + +// FUNCTION: LEGO1 0x10099030 +LegoTexture::~LegoTexture() +{ + delete m_image; +} + +// FUNCTION: LEGO1 0x10099050 +LegoResult LegoTexture::Read(LegoStorage* p_storage, LegoU32 p_square) +{ + return m_image->Read(p_storage, p_square); +} + +// FUNCTION: LEGO1 0x10099070 +LegoResult LegoTexture::Write(LegoStorage* p_storage) +{ + return m_image->Write(p_storage); +} diff --git a/LEGO1/lego/sources/misc/legotexture.h b/LEGO1/lego/sources/misc/legotexture.h new file mode 100644 index 00000000..1e279660 --- /dev/null +++ b/LEGO1/lego/sources/misc/legotexture.h @@ -0,0 +1,23 @@ +#ifndef __LEGOTEXTURE_H +#define __LEGOTEXTURE_H + +#include "legotypes.h" + +class LegoImage; +class LegoStorage; + +// SIZE 0x04 +class LegoTexture { +public: + LegoTexture(); + ~LegoTexture(); + LegoImage* GetImage() { return m_image; } + void SetImage(LegoImage* p_image) { m_image = p_image; } + LegoResult Read(LegoStorage* p_storage, LegoU32 p_square); + LegoResult Write(LegoStorage* p_storage); + +protected: + LegoImage* m_image; // 0x00 +}; + +#endif // __LEGOTEXTURE_H diff --git a/LEGO1/lego/sources/misc/legotypes.h b/LEGO1/lego/sources/misc/legotypes.h new file mode 100644 index 00000000..7ba6ada1 --- /dev/null +++ b/LEGO1/lego/sources/misc/legotypes.h @@ -0,0 +1,44 @@ +/* + This unpublished source code contains trade secrets and + copyrighted materials which are the property of Mindscape, Inc. + Unauthorized use, copying or distribution is a violation of U.S. + and international laws and is strictly prohibited. +*/ + +#ifndef __LEGOTYPES_H +#define __LEGOTYPES_H + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE -1 +#endif + +typedef char LegoS8; +typedef unsigned char LegoU8; +typedef short LegoS16; +typedef unsigned short LegoU16; +typedef long LegoS32; +typedef unsigned long LegoU32; +typedef float LegoFloat; +typedef char LegoChar; + +typedef LegoU8 LegoBool; +typedef LegoS32 LegoTime; +typedef LegoS32 LegoResult; + +#endif // __LEGOTYPES_H diff --git a/LEGO1/lego/sources/misc/legoutil.h b/LEGO1/lego/sources/misc/legoutil.h new file mode 100644 index 00000000..92bb84c2 --- /dev/null +++ b/LEGO1/lego/sources/misc/legoutil.h @@ -0,0 +1,54 @@ +#ifndef __LEGOUTIL_H +#define __LEGOUTIL_H + +template +inline T Min(T p_t1, T p_t2) +{ + return p_t1 < p_t2 ? p_t1 : p_t2; +} + +template +inline T Min(T p_t1, T p_t2, T p_t3) +{ + return Min(p_t1, Min(p_t2, p_t3)); +} + +template +inline T Max(T p_t1, T p_t2) +{ + return p_t1 > p_t2 ? p_t1 : p_t2; +} + +template +inline T Max(T p_t1, T p_t2, T p_t3) +{ + return Max(p_t1, Max(p_t2, p_t3)); +} + +template +inline T Abs(T p_t) +{ + return p_t < 0 ? -p_t : p_t; +} + +template +inline void Swap(T& p_t1, T& p_t2) +{ + T t = p_t1; + p_t1 = p_t2; + p_t2 = t; +} + +template +inline T DToR(T p_d) +{ + return p_d * 3.1416F / 180.0F; +} + +template +inline T RToD(T p_r) +{ + return p_r * 180.0F / 3.1416F; +} + +#endif // __LEGOUTIL_H diff --git a/LEGO1/lego/sources/misc/version.h b/LEGO1/lego/sources/misc/version.h new file mode 100644 index 00000000..1eaa84af --- /dev/null +++ b/LEGO1/lego/sources/misc/version.h @@ -0,0 +1,6 @@ +#ifndef __VERSION_H +#define __VERSION_H + +#define MODEL_VERSION 3 + +#endif // __VERSION_H From 5f413165ccbcb2b8148e2c2c5a2f34dc043c69a8 Mon Sep 17 00:00:00 2001 From: Anonymous Maarten Date: Thu, 25 Jan 2024 03:16:29 +0100 Subject: [PATCH 18/34] Spinoff some sources to static libraries (#484) * cmake: use imported targets for 3rd party libs * Fix casing of skateboard.h include * cmake: tglrl realtime viewmanager mxgeometry * cmake: spin off some source in static libraries * dx5 for everyone * ci: bump actions/checkout to v4 * move LEGO1/realtime/realtimeview.cpp to lego1 because it exports symbols * add misc library * Add omni library * Return of the .def's * Remove COMPAT_CONST in MxVideoParam::MxVideoParam * Run clang-format * move LEGO1/realtime/realtimeview.cpp to realtime lib * Add 3dmanager library * Rename .def files * Remove incorrect deps to Omni * Remove DLL expor decls * Remove unnecessary library dep from ROI * Remove COMPAT_CONST * Move 3dmanager lib before Omni * Remove mxgeometry lib (`geom` is actually `lego/sources/geom`, which we don't have in our decomp yet) * viewmanager has a dependency on realtime + fix mingw's def * Remove Smacker::Smacker from lego1 link libraries --------- Co-authored-by: Christian Semmler --- .github/workflows/analyze.yml | 4 +- .github/workflows/build.yml | 8 +- .github/workflows/format.yml | 4 +- .github/workflows/naming.yml | 2 +- .github/workflows/unittest.yml | 4 +- CMakeLists.txt | 396 +++++++++++------- ISLE/isleapp.cpp | 8 + LEGO1/LegoOmni.def | 138 ++++++ LEGO1/LegoOmni.mingw.def | 170 ++++++++ .../legoomni/include/legoanimationmanager.h | 2 +- .../legoomni/include/legobackgroundcolor.h | 2 +- .../legoomni/include/legobuildingmanager.h | 2 +- LEGO1/lego/legoomni/include/legoentity.h | 6 +- LEGO1/lego/legoomni/include/legogamestate.h | 14 +- .../lego/legoomni/include/legoinputmanager.h | 6 +- .../legoomni/include/legomodelpresenter.h | 2 +- .../lego/legoomni/include/legonavcontroller.h | 4 +- LEGO1/lego/legoomni/include/legoomni.h | 30 +- .../lego/legoomni/include/legopartpresenter.h | 2 +- .../lego/legoomni/include/legovideomanager.h | 8 +- LEGO1/lego/legoomni/include/legoworld.h | 4 +- .../legoomni/include/legoworldpresenter.h | 2 +- .../include/mxbackgroundaudiomanager.h | 2 +- .../legoomni/include/mxtransitionmanager.h | 2 +- LEGO1/lego/legoomni/src/build/helicopter.cpp | 3 + LEGO1/lego/legoomni/src/isle/skateboard.cpp | 2 +- LEGO1/lego/sources/roi/legoroi.cpp | 32 +- LEGO1/lego/sources/roi/legoroi.h | 23 +- LEGO1/main.cpp | 2 +- LEGO1/mxdirectx/mxdirectdraw.h | 6 +- LEGO1/mxgeometry/mxgeometry3d.cpp | 6 - LEGO1/mxgeometry/mxmatrix.cpp | 5 - LEGO1/omni/include/mxatomid.h | 6 +- LEGO1/omni/include/mxbitmap.h | 14 +- LEGO1/omni/include/mxcore.h | 6 +- LEGO1/omni/include/mxcriticalsection.h | 6 +- LEGO1/omni/include/mxdsaction.h | 4 +- LEGO1/omni/include/mxdsfile.h | 16 +- LEGO1/omni/include/mxdsobject.h | 2 +- LEGO1/omni/include/mxioinfo.h | 2 +- LEGO1/omni/include/mxomni.h | 34 +- LEGO1/omni/include/mxomnicreateflags.h | 2 +- LEGO1/omni/include/mxomnicreateparam.h | 2 +- LEGO1/omni/include/mxpalette.h | 4 +- LEGO1/omni/include/mxpresenter.h | 24 +- LEGO1/omni/include/mxscheduler.h | 4 +- LEGO1/omni/include/mxstreamer.h | 4 +- LEGO1/omni/include/mxstring.h | 6 +- LEGO1/omni/include/mxtimer.h | 2 +- LEGO1/omni/include/mxutil.h | 6 +- LEGO1/omni/include/mxvariabletable.h | 6 +- LEGO1/omni/include/mxvideomanager.h | 4 +- LEGO1/omni/include/mxvideoparam.h | 18 +- LEGO1/omni/include/mxvideoparamflags.h | 2 +- LEGO1/omni/src/system/mxthread.cpp | 1 - LEGO1/omni/src/video/mxvideoparam.cpp | 7 +- LEGO1/realtime/realtimeview.h | 8 +- LEGO1/viewmanager/viewmanager.h | 2 +- tools/README.md | 6 +- tools/ncc/skip.yml | 2 +- util/compat.h | 8 - 61 files changed, 730 insertions(+), 379 deletions(-) create mode 100644 LEGO1/LegoOmni.def create mode 100644 LEGO1/LegoOmni.mingw.def delete mode 100644 LEGO1/mxgeometry/mxgeometry3d.cpp delete mode 100644 LEGO1/mxgeometry/mxmatrix.cpp diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index 01b85f47..dec8b191 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install python libraries run: | @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install python libraries run: | diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 51b0759f..a3f81642 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,7 +41,7 @@ jobs: with: arch: amd64_x86 # Use the 64-bit x64-native cross tools to build 32-bit x86 code - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Build run: | @@ -53,9 +53,9 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: 'itsmattkc/msvc420' path: msvc420 @@ -165,7 +165,7 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'isledecomp/isle' }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: repository: 'probonopd/uploadtool' diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index ccec2b50..6e4e724e 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Run clang-format run: | @@ -24,7 +24,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install python libraries shell: bash diff --git a/.github/workflows/naming.yml b/.github/workflows/naming.yml index a23275e1..b010e69f 100644 --- a/.github/workflows/naming.yml +++ b/.github/workflows/naming.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install LLVM and Clang uses: KyleMayes/install-llvm-action@v1 diff --git a/.github/workflows/unittest.yml b/.github/workflows/unittest.yml index 612ae3ae..3e1b12d8 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unittest.yml @@ -8,7 +8,7 @@ jobs: runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install python libraries shell: bash @@ -25,7 +25,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install python libraries shell: bash diff --git a/CMakeLists.txt b/CMakeLists.txt index 9192c542..da1c41f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,12 +16,201 @@ if (MSVC) endif() endif() +set(lego1_targets) +macro(register_lego1_target __target) + list(APPEND lego1_targets ${__target}) +endmacro() + message(STATUS "MSVC for decompilation: ${MSVC_FOR_DECOMP}") option(ISLE_BUILD_APP "Build ISLE.EXE application" ON) option(ISLE_USE_SMARTHEAP "Build with SmartHeap" ${MSVC_FOR_DECOMP}) option(ISLE_USE_DX5 "Build with internal DirectX 5 SDK" ON) +add_library(DirectX5::DirectX5 INTERFACE IMPORTED) +target_include_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/inc") +target_link_directories(DirectX5::DirectX5 INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/lib") + +add_library(Smacker::Smacker STATIC IMPORTED) +set_property(TARGET Smacker::Smacker PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/3rdparty/smacker/smack.lib") +set_property(TARGET Smacker::Smacker PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/3rdparty/smacker") + +add_library(FLIC::FLIC STATIC IMPORTED) +set_property(TARGET FLIC::FLIC PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/3rdparty/flic/flic.lib") +set_property(TARGET FLIC::FLIC PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/3rdparty/flic") + +add_library(Vec::Vec INTERFACE IMPORTED) +target_include_directories(Vec::Vec INTERFACE "${CMAKE_SOURCE_DIR}/3rdparty/vec") + +add_library(SmartHeap::SmartHeap STATIC IMPORTED) +set_property(TARGET SmartHeap::SmartHeap PROPERTY IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/3rdparty/smartheap/SHLW32MT.LIB") +set_property(TARGET SmartHeap::SmartHeap PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/3rdparty/smartheap") +set_property(TARGET SmartHeap::SmartHeap PROPERTY INTERFACE_COMPILE_OPTIONS "/FI${CMAKE_SOURCE_DIR}/3rdparty/smartheap/SMRTHEAP.HPP") + +add_library(tglrl STATIC + LEGO1/tgl/d3drm/camera.cpp + LEGO1/tgl/d3drm/device.cpp + LEGO1/tgl/d3drm/group.cpp + LEGO1/tgl/d3drm/light.cpp + LEGO1/tgl/d3drm/mesh.cpp + LEGO1/tgl/d3drm/renderer.cpp + LEGO1/tgl/d3drm/texture.cpp + LEGO1/tgl/d3drm/unk.cpp + LEGO1/tgl/d3drm/view.cpp +) +register_lego1_target(tglrl) +set_property(TARGET tglrl PROPERTY ARCHIVE_OUTPUT_NAME "tglrl40$<$:d>") +target_include_directories(tglrl PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(tglrl PRIVATE d3drm) + +add_library(realtime STATIC + LEGO1/realtime/matrix.cpp + LEGO1/realtime/orientableroi.cpp + LEGO1/realtime/realtime.cpp + LEGO1/realtime/realtimeview.cpp + LEGO1/realtime/vector.cpp +) +register_lego1_target(realtime) +set_property(TARGET realtime PROPERTY ARCHIVE_OUTPUT_NAME "realtime$<$:d>") +target_include_directories(realtime PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(realtime PRIVATE Vec::Vec) + +add_library(viewmanager STATIC + LEGO1/viewmanager/viewlodlist.cpp + LEGO1/viewmanager/viewmanager.cpp + LEGO1/viewmanager/viewroi.cpp +) +register_lego1_target(viewmanager) +set_property(TARGET viewmanager PROPERTY ARCHIVE_OUTPUT_NAME "viewmanager$<$:d>") +target_include_directories(viewmanager PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(viewmanager PRIVATE Vec::Vec) + +add_library(mxdirectx STATIC + LEGO1/mxdirectx/mxdirect3d.cpp + LEGO1/mxdirectx/mxdirectdraw.cpp +) +register_lego1_target(mxdirectx) +set_property(TARGET mxdirectx PROPERTY ARCHIVE_OUTPUT_NAME "MxDirectX$<$:d>") +target_include_directories(mxdirectx PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(mxdirectx PRIVATE ddraw) + +add_library(roi STATIC + LEGO1/lego/sources/roi/legoroi.cpp +) +register_lego1_target(roi) +set_property(TARGET roi PROPERTY ARCHIVE_OUTPUT_NAME "roi$<$:d>") +target_include_directories(roi PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(roi PRIVATE) + +add_library(misc STATIC + LEGO1/lego/sources/misc/legoimage.cpp + LEGO1/lego/sources/misc/legostorage.cpp + LEGO1/lego/sources/misc/legotexture.cpp +) +register_lego1_target(misc) +set_property(TARGET misc PROPERTY ARCHIVE_OUTPUT_NAME "misc$<$:d>") +target_include_directories(misc PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/omni/include" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(misc PRIVATE) + +add_library(3dmanager STATIC + LEGO1/lego/sources/3dmanager/lego3dmanager.cpp + LEGO1/lego/sources/3dmanager/lego3dview.cpp + LEGO1/lego/sources/3dmanager/legoview1.cpp + LEGO1/lego/sources/3dmanager/tglsurface.cpp +) +register_lego1_target(3dmanager) +set_property(TARGET 3dmanager PROPERTY ARCHIVE_OUTPUT_NAME "3dmanager$<$:d>") +target_include_directories(3dmanager PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(3dmanager PRIVATE Vec::Vec) + +add_library(omni STATIC + LEGO1/omni/src/action/mxdsaction.cpp + LEGO1/omni/src/action/mxdsanim.cpp + LEGO1/omni/src/action/mxdsevent.cpp + LEGO1/omni/src/action/mxdsmediaaction.cpp + LEGO1/omni/src/action/mxdsmultiaction.cpp + LEGO1/omni/src/action/mxdsobjectaction.cpp + LEGO1/omni/src/action/mxdsobject.cpp + LEGO1/omni/src/action/mxdsparallelaction.cpp + LEGO1/omni/src/action/mxdsselectaction.cpp + LEGO1/omni/src/action/mxdsserialaction.cpp + LEGO1/omni/src/action/mxdssound.cpp + LEGO1/omni/src/action/mxdsstill.cpp + LEGO1/omni/src/action/mxdsstreamingaction.cpp + LEGO1/omni/src/audio/mxaudiomanager.cpp + LEGO1/omni/src/audio/mxaudiopresenter.cpp + LEGO1/omni/src/audio/mxloopingmidipresenter.cpp + LEGO1/omni/src/audio/mxmidipresenter.cpp + LEGO1/omni/src/audio/mxmusicmanager.cpp + LEGO1/omni/src/audio/mxmusicpresenter.cpp + LEGO1/omni/src/audio/mxsoundmanager.cpp + LEGO1/omni/src/audio/mxsoundpresenter.cpp + LEGO1/omni/src/audio/mxwavepresenter.cpp + LEGO1/omni/src/common/mxatomidcounter.cpp + LEGO1/omni/src/common/mxatomid.cpp + LEGO1/omni/src/common/mxcompositepresenter.cpp + LEGO1/omni/src/common/mxcore.cpp + LEGO1/omni/src/common/mxmediamanager.cpp + LEGO1/omni/src/common/mxmediapresenter.cpp + LEGO1/omni/src/common/mxobjectfactory.cpp + LEGO1/omni/src/common/mxpresenter.cpp + LEGO1/omni/src/common/mxstring.cpp + LEGO1/omni/src/common/mxticklemanager.cpp + LEGO1/omni/src/common/mxtimer.cpp + LEGO1/omni/src/common/mxutil.cpp + LEGO1/omni/src/common/mxvariable.cpp + LEGO1/omni/src/common/mxvariabletable.cpp + LEGO1/omni/src/entity/mxentity.cpp + LEGO1/omni/src/event/mxeventmanager.cpp + LEGO1/omni/src/event/mxeventpresenter.cpp + LEGO1/omni/src/main/mxomni.cpp + LEGO1/omni/src/main/mxomnicreateflags.cpp + LEGO1/omni/src/main/mxomnicreateparam.cpp + LEGO1/omni/src/notify/mxactionnotificationparam.cpp + LEGO1/omni/src/notify/mxnotificationmanager.cpp + LEGO1/omni/src/notify/mxnotificationparam.cpp + LEGO1/omni/src/notify/mxtype17notificationparam.cpp + LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp + LEGO1/omni/src/stream/mxdiskstreamprovider.cpp + LEGO1/omni/src/stream/mxdsbuffer.cpp + LEGO1/omni/src/stream/mxdschunk.cpp + LEGO1/omni/src/stream/mxdsfile.cpp + LEGO1/omni/src/stream/mxdssource.cpp + LEGO1/omni/src/stream/mxdssubscriber.cpp + LEGO1/omni/src/stream/mxioinfo.cpp + LEGO1/omni/src/stream/mxramstreamcontroller.cpp + LEGO1/omni/src/stream/mxramstreamprovider.cpp + LEGO1/omni/src/stream/mxstreamchunk.cpp + LEGO1/omni/src/stream/mxstreamcontroller.cpp + LEGO1/omni/src/stream/mxstreamer.cpp + LEGO1/omni/src/stream/mxstreamlist.cpp + LEGO1/omni/src/stream/mxstreamprovider.cpp + LEGO1/omni/src/system/mxautolocker.cpp + LEGO1/omni/src/system/mxcriticalsection.cpp + LEGO1/omni/src/system/mxscheduler.cpp + LEGO1/omni/src/system/mxsemaphore.cpp + LEGO1/omni/src/system/mxthread.cpp + LEGO1/omni/src/video/mxbitmap.cpp + LEGO1/omni/src/video/mxdisplaysurface.cpp + LEGO1/omni/src/video/mxflcpresenter.cpp + LEGO1/omni/src/video/mxloopingflcpresenter.cpp + LEGO1/omni/src/video/mxloopingsmkpresenter.cpp + LEGO1/omni/src/video/mxpalette.cpp + LEGO1/omni/src/video/mxregion.cpp + LEGO1/omni/src/video/mxregioncursor.cpp + LEGO1/omni/src/video/mxsmack.cpp + LEGO1/omni/src/video/mxsmkpresenter.cpp + LEGO1/omni/src/video/mxstillpresenter.cpp + LEGO1/omni/src/video/mxvideomanager.cpp + LEGO1/omni/src/video/mxvideoparam.cpp + LEGO1/omni/src/video/mxvideoparamflags.cpp + LEGO1/omni/src/video/mxvideopresenter.cpp +) +register_lego1_target(omni) +set_property(TARGET omni PROPERTY ARCHIVE_OUTPUT_NAME "omni$<$:d>") +target_include_directories(omni PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/omni/include" "${CMAKE_SOURCE_DIR}/LEGO1" "${CMAKE_SOURCE_DIR}/util") +target_link_libraries(omni PRIVATE dsound winmm FLIC::FLIC Smacker::Smacker) + add_library(lego1 SHARED LEGO1/define.cpp LEGO1/lego/legoomni/src/act1/act1state.cpp @@ -143,155 +332,37 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/video/legotexturepresenter.cpp LEGO1/lego/legoomni/src/video/legovideomanager.cpp LEGO1/lego/legoomni/src/video/mxtransitionmanager.cpp - LEGO1/lego/sources/3dmanager/lego3dmanager.cpp - LEGO1/lego/sources/3dmanager/lego3dview.cpp - LEGO1/lego/sources/3dmanager/legoview1.cpp - LEGO1/lego/sources/3dmanager/tglsurface.cpp - LEGO1/lego/sources/misc/legoimage.cpp - LEGO1/lego/sources/misc/legostorage.cpp - LEGO1/lego/sources/misc/legotexture.cpp - LEGO1/lego/sources/roi/legoroi.cpp LEGO1/main.cpp - LEGO1/mxdirectx/mxdirect3d.cpp - LEGO1/mxdirectx/mxdirectdraw.cpp - LEGO1/mxgeometry/mxgeometry3d.cpp - LEGO1/mxgeometry/mxmatrix.cpp - LEGO1/omni/src/action/mxdsaction.cpp - LEGO1/omni/src/action/mxdsanim.cpp - LEGO1/omni/src/action/mxdsevent.cpp - LEGO1/omni/src/action/mxdsmediaaction.cpp - LEGO1/omni/src/action/mxdsmultiaction.cpp - LEGO1/omni/src/action/mxdsobjectaction.cpp - LEGO1/omni/src/action/mxdsobject.cpp - LEGO1/omni/src/action/mxdsparallelaction.cpp - LEGO1/omni/src/action/mxdsselectaction.cpp - LEGO1/omni/src/action/mxdsserialaction.cpp - LEGO1/omni/src/action/mxdssound.cpp - LEGO1/omni/src/action/mxdsstill.cpp - LEGO1/omni/src/action/mxdsstreamingaction.cpp - LEGO1/omni/src/audio/mxaudiomanager.cpp - LEGO1/omni/src/audio/mxaudiopresenter.cpp - LEGO1/omni/src/audio/mxloopingmidipresenter.cpp - LEGO1/omni/src/audio/mxmidipresenter.cpp - LEGO1/omni/src/audio/mxmusicmanager.cpp - LEGO1/omni/src/audio/mxmusicpresenter.cpp - LEGO1/omni/src/audio/mxsoundmanager.cpp - LEGO1/omni/src/audio/mxsoundpresenter.cpp - LEGO1/omni/src/audio/mxwavepresenter.cpp - LEGO1/omni/src/common/mxatomidcounter.cpp - LEGO1/omni/src/common/mxatomid.cpp - LEGO1/omni/src/common/mxcompositepresenter.cpp - LEGO1/omni/src/common/mxcore.cpp - LEGO1/omni/src/common/mxmediamanager.cpp - LEGO1/omni/src/common/mxmediapresenter.cpp - LEGO1/omni/src/common/mxobjectfactory.cpp - LEGO1/omni/src/common/mxpresenter.cpp - LEGO1/omni/src/common/mxstring.cpp - LEGO1/omni/src/common/mxticklemanager.cpp - LEGO1/omni/src/common/mxtimer.cpp - LEGO1/omni/src/common/mxutil.cpp - LEGO1/omni/src/common/mxvariable.cpp - LEGO1/omni/src/common/mxvariabletable.cpp - LEGO1/omni/src/entity/mxentity.cpp - LEGO1/omni/src/event/mxeventmanager.cpp - LEGO1/omni/src/event/mxeventpresenter.cpp - LEGO1/omni/src/main/mxomni.cpp - LEGO1/omni/src/main/mxomnicreateflags.cpp - LEGO1/omni/src/main/mxomnicreateparam.cpp - LEGO1/omni/src/notify/mxactionnotificationparam.cpp - LEGO1/omni/src/notify/mxnotificationmanager.cpp - LEGO1/omni/src/notify/mxnotificationparam.cpp - LEGO1/omni/src/notify/mxtype17notificationparam.cpp - LEGO1/omni/src/stream/mxdiskstreamcontroller.cpp - LEGO1/omni/src/stream/mxdiskstreamprovider.cpp - LEGO1/omni/src/stream/mxdsbuffer.cpp - LEGO1/omni/src/stream/mxdschunk.cpp - LEGO1/omni/src/stream/mxdsfile.cpp - LEGO1/omni/src/stream/mxdssource.cpp - LEGO1/omni/src/stream/mxdssubscriber.cpp - LEGO1/omni/src/stream/mxioinfo.cpp - LEGO1/omni/src/stream/mxramstreamcontroller.cpp - LEGO1/omni/src/stream/mxramstreamprovider.cpp - LEGO1/omni/src/stream/mxstreamchunk.cpp - LEGO1/omni/src/stream/mxstreamcontroller.cpp - LEGO1/omni/src/stream/mxstreamer.cpp - LEGO1/omni/src/stream/mxstreamlist.cpp - LEGO1/omni/src/stream/mxstreamprovider.cpp - LEGO1/omni/src/system/mxautolocker.cpp - LEGO1/omni/src/system/mxcriticalsection.cpp - LEGO1/omni/src/system/mxscheduler.cpp - LEGO1/omni/src/system/mxsemaphore.cpp - LEGO1/omni/src/system/mxthread.cpp - LEGO1/omni/src/video/mxbitmap.cpp - LEGO1/omni/src/video/mxdisplaysurface.cpp - LEGO1/omni/src/video/mxflcpresenter.cpp - LEGO1/omni/src/video/mxloopingflcpresenter.cpp - LEGO1/omni/src/video/mxloopingsmkpresenter.cpp - LEGO1/omni/src/video/mxpalette.cpp - LEGO1/omni/src/video/mxregion.cpp - LEGO1/omni/src/video/mxregioncursor.cpp - LEGO1/omni/src/video/mxsmack.cpp - LEGO1/omni/src/video/mxsmkpresenter.cpp - LEGO1/omni/src/video/mxstillpresenter.cpp - LEGO1/omni/src/video/mxvideomanager.cpp - LEGO1/omni/src/video/mxvideoparam.cpp - LEGO1/omni/src/video/mxvideoparamflags.cpp - LEGO1/omni/src/video/mxvideopresenter.cpp - LEGO1/realtime/matrix.cpp - LEGO1/realtime/orientableroi.cpp - LEGO1/realtime/realtime.cpp - LEGO1/realtime/realtimeview.cpp - LEGO1/realtime/vector.cpp - LEGO1/tgl/d3drm/camera.cpp - LEGO1/tgl/d3drm/device.cpp - LEGO1/tgl/d3drm/group.cpp - LEGO1/tgl/d3drm/light.cpp - LEGO1/tgl/d3drm/mesh.cpp - LEGO1/tgl/d3drm/renderer.cpp - LEGO1/tgl/d3drm/texture.cpp - LEGO1/tgl/d3drm/unk.cpp - LEGO1/tgl/d3drm/view.cpp - LEGO1/viewmanager/viewlodlist.cpp - LEGO1/viewmanager/viewmanager.cpp - LEGO1/viewmanager/viewroi.cpp ) +register_lego1_target(lego1) if (MINGW) target_compile_definitions(lego1 PRIVATE DIRECTINPUT_VERSION=0x0500) endif() -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/util") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/omni/include") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/lego/sources") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/lego/legoomni/include") - -# Additional include directories -target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/3rdparty/vec") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/flic") -target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smacker") - -if (ISLE_USE_SMARTHEAP) - add_library(SmartHeap::SmartHeap STATIC IMPORTED) - set_target_properties(SmartHeap::SmartHeap PROPERTIES - IMPORTED_LOCATION "${CMAKE_SOURCE_DIR}/3rdparty/smartheap/SHLW32MT.LIB" - INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_SOURCE_DIR}/3rdparty/smartheap" - INTERFACE_COMPILE_OPTIONS "/FI${CMAKE_SOURCE_DIR}/3rdparty/smartheap/SMRTHEAP.HPP") - - target_link_libraries(lego1 PRIVATE SmartHeap::SmartHeap) +if (MSVC) + target_sources(lego1 PRIVATE LEGO1/LegoOmni.def) +else() + target_sources(lego1 PRIVATE LEGO1/LegoOmni.mingw.def) endif() -# Use internal DirectX 5 if required -if (ISLE_USE_DX5) - target_include_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/inc") - target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/lib") -endif() - -target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/smacker") -target_link_directories(lego1 PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/flic") +target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/util") +target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1") +target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1/omni/include") +target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1/lego/sources") +target_include_directories(lego1 PUBLIC "${CMAKE_SOURCE_DIR}/LEGO1/lego/legoomni/include") # Link libraries -target_link_libraries(lego1 PRIVATE ddraw dsound dinput dxguid winmm d3drm smack flic) +target_link_libraries(lego1 PRIVATE tglrl viewmanager realtime mxdirectx roi FLIC::FLIC Vec::Vec dinput dxguid misc 3dmanager omni) + +if (ISLE_USE_SMARTHEAP) + foreach(tgt IN LISTS lego1_targets) + target_link_libraries(${tgt} PRIVATE SmartHeap::SmartHeap) + endforeach() +endif() +foreach(tgt IN LISTS lego1_targets) + target_link_libraries(${tgt} PRIVATE $<$:DirectX5::DirectX5>) +endforeach() # Make sure filenames are ALL CAPS set_property(TARGET lego1 PROPERTY OUTPUT_NAME LEGO1) @@ -301,23 +372,12 @@ set_property(TARGET lego1 PROPERTY SUFFIX ".DLL") if (ISLE_BUILD_APP) add_executable(isle WIN32 ISLE/res/isle.rc - ISLE/define.cpp ISLE/isleapp.cpp + ISLE/define.cpp ) - target_compile_definitions(isle PRIVATE ISLE_APP) - - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/util") - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1") - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/omni/include") - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/lego/sources") - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/LEGO1/lego/legoomni/include") - # Use internal DirectX 5 if required - if (ISLE_USE_DX5) - target_include_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/inc") - target_link_directories(isle PRIVATE "${CMAKE_SOURCE_DIR}/3rdparty/dx5/lib") - endif() + target_link_libraries(isle PRIVATE $<$:DirectX5::DirectX5>) if (ISLE_USE_SMARTHEAP) target_link_libraries(isle PRIVATE SmartHeap::SmartHeap) @@ -333,15 +393,19 @@ endif() if (MSVC) if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15") - target_compile_definitions(lego1 PRIVATE _CRT_SECURE_NO_WARNINGS) - if (ISLE_BUILD_APP) + foreach(tgt IN LISTS lego1_targets) + target_compile_definitions(${tgt} PRIVATE _CRT_SECURE_NO_WARNINGS) + endforeach() + if (TARGET isle) target_compile_definitions(isle PRIVATE "_CRT_SECURE_NO_WARNINGS") endif() endif() # Visual Studio 2017 version 15.7 needs "/Zc:__cplusplus" for __cplusplus if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "19.14.26428") - target_compile_options(lego1 PRIVATE "-Zc:__cplusplus") - if (ISLE_BUILD_APP) + foreach(tgt IN LISTS lego1_targets) + target_compile_options(${tgt} PRIVATE "-Zc:__cplusplus") + endforeach() + if (TARGET isle) target_compile_options(isle PRIVATE "-Zc:__cplusplus") endif() endif() @@ -364,6 +428,9 @@ if (MSVC_FOR_DECOMP) endif() target_compile_options(lego1 PRIVATE "/MT$<$:d>") + foreach(tgt IN LISTS lego1_targets) + target_compile_options(${tgt} PRIVATE "/MT$<$:d>") + endforeach() set(CMAKE_CXX_FLAGS "/W3 /GX /D \"WIN32\" /D \"_WINDOWS\"") set(CMAKE_CXX_FLAGS_DEBUG "/Gm /Zi /Od /D \"_DEBUG\"") @@ -377,6 +444,8 @@ if (MSVC_FOR_DECOMP) set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "/incremental:no /debug") set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "/incremental:no") + set(CMAKE_STATIC_LINKER_FLAGS "/machine:I386") + set(CMAKE_SHARED_LINKER_FLAGS "/machine:I386") set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "/incremental:yes /debug") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "/incremental:no") @@ -385,12 +454,17 @@ if (MSVC_FOR_DECOMP) # Older MSVC versions don't support building in parallel. # Force non-parallel builds of isle and lego1 by putting them in a pool with 1 available job. - if(CMAKE_CXX_COMPILER_ID VERSION_LESS 12) - set_property(GLOBAL PROPERTY JOB_POOLS "msvc_lego=1;msvc_lego1=1") - set_property(TARGET isle PROPERTY JOB_POOL_COMPILE msvc_lego) - set_property(TARGET isle PROPERTY JOB_POOL_LINK msvc_lego) - set_property(TARGET lego1 PROPERTY JOB_POOL_COMPILE msvc_lego1) - set_property(TARGET lego1 PROPERTY JOB_POOL_LINK msvc_lego1) + if (CMAKE_CXX_COMPILER_ID VERSION_LESS 12) + foreach(tgt IN LISTS lego1_taregets) + set_property(GLOBAL APPEND PROPERTY JOB_POOLS "msvc_${tgt}=1;msvc_lego1=1") + set_property(TARGET ${tgt} PROPERTY JOB_POOL_COMPILE msvc_${tgt}) + set_property(TARGET ${tgt} PROPERTY JOB_POOL_LINK msvc_${tgt}) + endforeach() + if (TARGET isle) + set_property(GLOBAL APPEND PROPERTY JOB_POOLS "msvc_isle=1") + set_property(TARGET isle PROPERTY JOB_POOL_COMPILE msvc_isle) + set_property(TARGET isle PROPERTY JOB_POOL_LINK msvc_isle) + endif() endif() endif() diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index 4a2a840b..32b19164 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -52,7 +52,15 @@ IsleApp::IsleApp() m_frameDelta = 10; m_windowActive = 1; +#ifdef COMPAT_MODE + { + MxRect32 r(0, 0, 639, 479); + MxVideoParamFlags flags; + m_videoParam = MxVideoParam(r, NULL, 1, flags); + } +#else m_videoParam = MxVideoParam(MxRect32(0, 0, 639, 479), NULL, 1, MxVideoParamFlags()); +#endif m_videoParam.Flags().Set16Bit(MxDirectDraw::GetPrimaryBitDepth() == 16); m_windowHandle = NULL; diff --git a/LEGO1/LegoOmni.def b/LEGO1/LegoOmni.def new file mode 100644 index 00000000..a3bbfe66 --- /dev/null +++ b/LEGO1/LegoOmni.def @@ -0,0 +1,138 @@ +; LegoOmni.def : Declares the module paarameters for the LEGO1.DLL. + +DESCRIPTION "Lego OMNI Windows Dynamic Link Library" + +EXPORTS + +; EXPORTs really required only. + +??0LegoBackgroundColor@@QAE@PBD0@Z +??0LegoGameState@@QAE@XZ +??0LegoWorld@@QAE@XZ +??0MxAtomId@@QAE@PBDW4LookupMode@@@Z +??0MxBitmap@@QAE@XZ +??0MxCore@@QAE@XZ +??0MxCriticalSection@@QAE@XZ +??0MxDSAction@@QAE@XZ +??0MxDSFile@@QAE@PBDK@Z +??0MxOmniCreateFlags@@QAE@XZ +??0MxOmniCreateParam@@QAE@PBDPAUHWND__@@AAVMxVideoParam@@VMxOmniCreateFlags@@@Z +??0MxString@@QAE@ABV0@@Z +??0MxVideoParam@@QAE@AAV0@@Z +??0MxVideoParam@@QAE@AAVMxRect32@@PAVMxPalette@@KAAVMxVideoParamFlags@@@Z +??0MxVideoParam@@QAE@XZ +??0MxVideoParamFlags@@QAE@XZ +??1LegoEntity@@UAE@XZ +??1LegoGameState@@QAE@XZ +??1LegoWorld@@UAE@XZ +??1MXIOINFO@@QAE@XZ +??1MxAtomId@@QAE@XZ +??1MxBitmap@@UAE@XZ +??1MxCore@@UAE@XZ +??1MxCriticalSection@@QAE@XZ +??1MxDSAction@@UAE@XZ +??1MxDSFile@@UAE@XZ +??1MxPresenter@@UAE@XZ +??1MxString@@UAE@XZ +??1MxVideoParam@@QAE@XZ +??4MxAtomId@@QAEAAV0@ABV0@@Z +??4MxString@@QAEABV0@PBD@Z +??4MxVideoParam@@QAEAAV0@ABV0@@Z +??8MxPalette@@QAEEAAV0@@Z +?BackgroundAudioManager@@YAPAVMxBackgroundAudioManager@@XZ +?Close@MxDSFile@@UAEJXZ +?Close@MxStreamer@@QAEJPBD@Z +?CreateBackgroundAudio@LegoOmni@@QAEXXZ +?CreateInstance@LegoOmni@@SAXXZ +?CreatePalette@MxBitmap@@UAEPAVMxPalette@@XZ +?CreateStreamObject@@YAPAVMxDSObject@@PAVMxDSFile@@F@Z +?DestroyInstance@MxOmni@@SAXXZ +?Detach@MxPalette@@QAEXXZ +?DisableRMDevice@LegoVideoManager@@QAEHXZ +?DoneTickle@MxPresenter@@MAEXXZ +?Enable@MxBackgroundAudioManager@@QAEXE@Z +?Enable@MxPresenter@@UAEXE@Z +?EnableFullScreenMovie@LegoVideoManager@@QAEXEE@Z +?EnableRMDevice@LegoVideoManager@@QAEHXZ +?EndAction@MxPresenter@@UAEXXZ +?EventManager@@YAPAVMxEventManager@@XZ +?FlipToGDISurface@MxDirectDraw@@QAEHXZ +?GameState@@YAPAVLegoGameState@@XZ +?GetBufferSize@MxDSFile@@UAEKXZ +?GetCD@MxOmni@@SAPBDXZ +?GetCurrPathInfo@LegoOmni@@SAHPAPAVLegoPathBoundary@@AAH@Z +?GetDefaults@LegoNavController@@SAXPAHPAM11111111PAE@Z +?GetHD@MxOmni@@SAPBDXZ +?GetInstance@LegoOmni@@SAPAV1@XZ +?GetInstance@MxOmni@@SAPAV1@XZ +?GetInstance@MxScheduler@@SAPAV1@XZ +?GetNoCD_SourceName@@YAPBDXZ +?GetPartsThreshold@RealtimeView@@SAMXZ +?GetPrimaryBitDepth@MxDirectDraw@@SAHXZ +?GetRealTime@MxTimer@@QAEJXZ +?GetStreamBuffersNum@MxDSFile@@UAEKXZ +?GetUserMaxLOD@RealtimeView@@SAMXZ +?GetVariable@MxVariableTable@@QAEPBDPBD@Z +?Init@MxPresenter@@IAEXXZ +?InputManager@@YAPAVLegoInputManager@@XZ +?InvalidateRect@MxVideoManager@@QAEXAAVMxRect32@@@Z +?IsSound3D@MxOmni@@SAEXZ +?Lego@@YAPAVLegoOmni@@XZ +?Load@LegoGameState@@QAEJK@Z +?MSoundManager@@YAPAVMxSoundManager@@XZ +?MakeSourceName@@YAXPADPBD@Z +?MoveCursor@LegoVideoManager@@QAEXHH@Z +?MusicManager@@YAPAVMxMusicManager@@XZ +?NotificationManager@@YAPAVMxNotificationManager@@XZ +?Notify@MxCore@@UAEJAAVMxParam@@@Z +?Open@MxDSFile@@UAEJK@Z +?Open@MxStreamer@@QAEPAVMxStreamController@@PBDG@Z +?ParseExtra@MxPresenter@@MAEXXZ +?Pause@MxDirectDraw@@QAEHH@Z +?PickEntity@@YAPAVLegoEntity@@JJ@Z +?PickROI@@YAPAVLegoROI@@JJ@Z +?QueueEvent@LegoInputManager@@QAEXW4NotificationId@@EJJE@Z +?Read@MxBitmap@@UAEJPBD@Z +?Read@MxDSFile@@UAEJPAEK@Z +?RealizePalette@MxVideoManager@@UAEJPAVMxPalette@@@Z +?Register@LegoInputManager@@QAEXPAVMxCore@@@Z +?RemoveAll@ViewManager@@QAEXPAVViewROI@@@Z +?RemoveWorld@LegoOmni@@QAEXABVMxAtomId@@J@Z +?Save@LegoGameState@@QAEJK@Z +?Seek@MxDSFile@@UAEJJH@Z +?SerializePlayersInfo@LegoGameState@@QAEXF@Z +?SerializeScoreHistory@LegoGameState@@QAEXF@Z +?SetCD@MxOmni@@SAXPBD@Z +?SetDefaults@LegoNavController@@SAXHMMMMMMMMME@Z +?SetDeviceName@MxVideoParam@@QAEXPAD@Z +?SetDisplayBB@LegoROI@@QAEXH@Z +?SetDoMutex@MxCriticalSection@@SAXXZ +?SetHD@MxOmni@@SAXPBD@Z +?SetObjectName@MxDSObject@@QAEXPBD@Z +?SetOmniUserMessage@@YAXP6AXPBDH@Z@Z +?SetPartsThreshold@RealtimeView@@SAXM@Z +?SetSavePath@LegoGameState@@QAEXPAD@Z +?SetSound3D@MxOmni@@SAXE@Z +?SetUserMaxLOD@RealtimeView@@SAXM@Z +?SetVariable@MxVariableTable@@QAEXPAVMxVariable@@@Z +?SetVariable@MxVariableTable@@QAEXPBD0@Z +?SetWaitIndicator@MxTransitionManager@@QAEXPAVMxVideoPresenter@@@Z +?SoundManager@@YAPAVLegoSoundManager@@XZ +?Start@@YAJPAVMxDSAction@@@Z +?StartAction@MxPresenter@@UAEJPAVMxStreamController@@PAVMxDSAction@@@Z +?StartMultiTasking@MxScheduler@@QAEXK@Z +?Streamer@@YAPAVMxStreamer@@XZ +?Tickle@MxPresenter@@UAEJXZ +?TickleManager@@YAPAVMxTickleManager@@XZ +?Timer@@YAPAVMxTimer@@XZ +?TransitionManager@@YAPAVMxTransitionManager@@XZ +?UnRegister@LegoInputManager@@QAEXPAVMxCore@@@Z +?VariableTable@@YAPAVMxVariableTable@@XZ +?VideoManager@@YAPAVLegoVideoManager@@XZ +?configureLegoAnimationManager@LegoAnimationManager@@SAXH@Z +?configureLegoBuildingManager@LegoBuildingManager@@SAXH@Z +?configureLegoModelPresenter@LegoModelPresenter@@SAXH@Z +?configureLegoPartPresenter@LegoPartPresenter@@SAXHH@Z +?configureLegoROI@LegoROI@@SAXH@Z +?configureLegoWorldPresenter@LegoWorldPresenter@@SAXH@Z +_DllMain@12 diff --git a/LEGO1/LegoOmni.mingw.def b/LEGO1/LegoOmni.mingw.def new file mode 100644 index 00000000..d5d9e052 --- /dev/null +++ b/LEGO1/LegoOmni.mingw.def @@ -0,0 +1,170 @@ +; LegoOmni.def : Declares the module paarameters for the LEGO1.DLL. + +DESCRIPTION " Lego OMNI Windows Dynamic Link Library" + +EXPORTS + +; EXPORTs really required only. + +_ZN13LegoGameState11SetSavePathEPc +_ZN13LegoGameState20SerializePlayersInfoEs +_ZN13LegoGameState21SerializeScoreHistoryEs +_ZN13LegoGameState4SaveEj +_ZN13LegoGameStateC1Ev +_ZN13LegoGameStateC2Ev +_ZN13LegoGameStateD1Ev +_ZN13LegoGameStateD2Ev +_ZN9LegoWorldC1Ev +_ZN9LegoWorldC2Ev +_ZN9LegoWorldD0Ev +_ZN9LegoWorldD1Ev +_ZN9LegoWorldD2Ev +DllMain@12 +_Z10PickEntityii +_Z12EventManagerv +_Z12InputManagerv +_Z12MusicManagerv +_Z12SoundManagerv +_Z12VideoManagerv +_Z13MSoundManagerv +_Z13TickleManagerv +_Z13VariableTablev +_Z14MakeSourceNamePcPKc +_Z17TransitionManagerv +_Z18CreateStreamObjectP8MxDSFiles +_Z18GetNoCD_SourceNamev +_Z18SetOmniUserMessagePFvPKciE +_Z19NotificationManagerv +_Z22BackgroundAudioManagerv +_Z4Legov +_Z5StartP10MxDSAction +_Z5Timerv +_Z7PickROIii +_Z8Streamerv +_Z9GameStatev +_ZN10LegoEntityD0Ev +_ZN10LegoEntityD1Ev +_ZN10LegoEntityD2Ev +_ZN10MxDSActionC1Ev +_ZN10MxDSActionC2Ev +_ZN10MxDSActionD0Ev +_ZN10MxDSActionD1Ev +_ZN10MxDSActionD2Ev +_ZN10MxDSObject13SetObjectNameEPKc +_ZN10MxStreamer4OpenEPKct +_ZN10MxStreamer5CloseEPKc +_ZN11MxPresenter10DoneTickleEv +_ZN11MxPresenter10ParseExtraEv +_ZN11MxPresenter11StartActionEP18MxStreamControllerP10MxDSAction +_ZN11MxPresenter4InitEv +_ZN11MxPresenter6EnableEh +_ZN11MxPresenter6TickleEv +_ZN11MxPresenter9EndActionEv +_ZN11MxPresenterD0Ev +_ZN11MxPresenterD1Ev +_ZN11MxPresenterD2Ev +_ZN11MxScheduler11GetInstanceEv +_ZN11MxScheduler17StartMultiTaskingEj +_ZN11ViewManager9RemoveAllEP7ViewROI +_ZN12MxDirectDraw16FlipToGDISurfaceEv +_ZN12MxDirectDraw18GetPrimaryBitDepthEv +_ZN12MxDirectDraw5PauseEi +_ZN12MxVideoParam13SetDeviceNameEPc +_ZN12MxVideoParamC1ERS_ +_ZN12MxVideoParamC1Ev +_ZN12MxVideoParamC2ERS_ +_ZN12MxVideoParamC2Ev +_ZN12MxVideoParamD1Ev +_ZN12MxVideoParamD2Ev +_ZN12MxVideoParamaSERKS_ +_ZN12RealtimeView13GetUserMaxLODEv +_ZN12RealtimeView13SetUserMaxLODEf +_ZN12RealtimeView17GetPartsThresholdEv +_ZN12RealtimeView17SetPartsThresholdEf +_ZN14MxVideoManager14InvalidateRectER8MxRect32 +_ZN14MxVideoManager14RealizePaletteEP9MxPalette +_ZN15MxVariableTable11GetVariableEPKc +_ZN15MxVariableTable11SetVariableEP10MxVariable +_ZN15MxVariableTable11SetVariableEPKcS1_ = _ZN15MxVariableTable11SetVariableEPKcS1_ +;_ZN16LegoInputManager10QueueEventE14NotificationIdhiih +_ZN16LegoInputManager10QueueEventE14NotificationIdhiih +_ZN16LegoInputManager10UnRegisterEP6MxCore +_ZN16LegoInputManager8RegisterEP6MxCore +_ZN16LegoVideoManager10MoveCursorEii +_ZN16LegoVideoManager14EnableRMDeviceEv +_ZN16LegoVideoManager15DisableRMDeviceEv +_ZN16LegoVideoManager21EnableFullScreenMovieEhh +_ZN17LegoNavController11GetDefaultsEPiPfS1_S1_S1_S1_S1_S1_S1_S1_Ph +_ZN17LegoNavController11SetDefaultsEifffffffffh +_ZN17LegoPartPresenter26configureLegoPartPresenterEii +_ZN17MxCriticalSection10SetDoMutexEv +_ZN17MxCriticalSectionC1Ev +_ZN17MxCriticalSectionC2Ev +_ZN17MxCriticalSectionD1Ev +_ZN17MxCriticalSectionD2Ev +_ZN17MxOmniCreateFlagsC1Ev +_ZN17MxOmniCreateFlagsC2Ev +_ZN17MxOmniCreateParamC1EPKcP6HWND__R12MxVideoParam17MxOmniCreateFlags +_ZN17MxVideoParamFlagsC1Ev +_ZN17MxVideoParamFlagsC2Ev +_ZN18LegoModelPresenter27configureLegoModelPresenterEi +_ZN18LegoWorldPresenter27configureLegoWorldPresenterEi +_ZN19LegoBuildingManager28configureLegoBuildingManagerEi +_ZN19MxTransitionManager16SetWaitIndicatorEP16MxVideoPresenter +_ZN20LegoAnimationManager29configureLegoAnimationManagerEi +_ZN24MxBackgroundAudioManager6EnableEh +_ZN6MxCore6NotifyER7MxParam +_ZN6MxCoreC1Ev +_ZN6MxCoreC2Ev +_ZN6MxCoreD0Ev +_ZN6MxCoreD1Ev +_ZN6MxCoreD2Ev +_ZN6MxOmni10SetSound3DEh +_ZN6MxOmni11GetInstanceEv +_ZN6MxOmni15DestroyInstanceEv +_ZN6MxOmni5GetCDEv +_ZN6MxOmni5GetHDEv +_ZN6MxOmni5SetCDEPKc +_ZN6MxOmni5SetHDEPKc +_ZN6MxOmni9IsSound3DEv +_ZN7LegoROI12SetDisplayBBEi +_ZN7LegoROI16configureLegoROIEi +_ZN7MxTimer11GetRealTimeEv +_ZN8LegoOmni11GetInstanceEv +_ZN8LegoOmni11RemoveWorldERK8MxAtomIdi +_ZN8LegoOmni14CreateInstanceEv +_ZN8LegoOmni15GetCurrPathInfoEPP16LegoPathBoundaryRi +_ZN8LegoOmni21CreateBackgroundAudioEv +_ZN8MXIOINFOD1Ev +_ZN8MXIOINFOD2Ev +_ZN8MxAtomIdC1EPKc10LookupMode +_ZN8MxAtomIdC2EPKc10LookupMode +_ZN8MxAtomIdD1Ev +_ZN8MxAtomIdD2Ev +_ZN8MxAtomIdaSERKS_ +_ZN8MxBitmap13CreatePaletteEv +_ZN8MxBitmap4ReadEPKc +_ZN8MxBitmapC1Ev +_ZN8MxBitmapC2Ev +_ZN8MxBitmapD0Ev +_ZN8MxBitmapD1Ev +_ZN8MxBitmapD2Ev +_ZN8MxDSFile13GetBufferSizeEv +_ZN8MxDSFile19GetStreamBuffersNumEv +_ZN8MxDSFile4OpenEj +_ZN8MxDSFile4ReadEPhj +_ZN8MxDSFile4SeekEii +_ZN8MxDSFile5CloseEv +_ZN8MxDSFileC1EPKcj +_ZN8MxDSFileC2EPKcj +_ZN8MxDSFileD0Ev +_ZN8MxDSFileD1Ev +_ZN8MxDSFileD2Ev +_ZN8MxStringC1ERKS_ +_ZN8MxStringC2ERKS_ +_ZN8MxStringD0Ev +_ZN8MxStringD1Ev +_ZN8MxStringD2Ev +_ZN8MxStringaSEPKc +_ZN9MxPalette6DetachEv +_ZN9MxPaletteeqERS_ diff --git a/LEGO1/lego/legoomni/include/legoanimationmanager.h b/LEGO1/lego/legoomni/include/legoanimationmanager.h index b81f2c72..82dc429d 100644 --- a/LEGO1/lego/legoomni/include/legoanimationmanager.h +++ b/LEGO1/lego/legoomni/include/legoanimationmanager.h @@ -32,7 +32,7 @@ class LegoAnimationManager : public MxCore { void FUN_1005f720(undefined4); void FUN_10064670(MxBool); - __declspec(dllexport) static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig); + static void configureLegoAnimationManager(MxS32 p_legoAnimationManagerConfig); // SYNTHETIC: LEGO1 0x1005ed10 // LegoAnimationManager::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legobackgroundcolor.h b/LEGO1/lego/legoomni/include/legobackgroundcolor.h index c11508bc..5d05618b 100644 --- a/LEGO1/lego/legoomni/include/legobackgroundcolor.h +++ b/LEGO1/lego/legoomni/include/legobackgroundcolor.h @@ -7,7 +7,7 @@ // SIZE 0x30 class LegoBackgroundColor : public MxVariable { public: - __declspec(dllexport) LegoBackgroundColor(const char* p_key, const char* p_value); + LegoBackgroundColor(const char* p_key, const char* p_value); virtual void SetValue(const char* p_colorString) override; private: diff --git a/LEGO1/lego/legoomni/include/legobuildingmanager.h b/LEGO1/lego/legoomni/include/legobuildingmanager.h index 969657ca..d96d9583 100644 --- a/LEGO1/lego/legoomni/include/legobuildingmanager.h +++ b/LEGO1/lego/legoomni/include/legobuildingmanager.h @@ -19,7 +19,7 @@ class LegoBuildingManager : public MxCore { return "LegoBuildingManager"; } - __declspec(dllexport) static void configureLegoBuildingManager(MxS32); + static void configureLegoBuildingManager(MxS32); void FUN_1002fa00(); diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index b775f840..12b1ecf1 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -19,12 +19,8 @@ class LegoEntity : public MxEntity { // Inlined at 0x100853f7 inline LegoEntity() { Init(); } -#ifdef ISLE_APP - __declspec(dllexport) virtual ~LegoEntity() override; -#else // FUNCTION: LEGO1 0x1000c290 - __declspec(dllexport) virtual ~LegoEntity() override { Destroy(TRUE); } -#endif + virtual ~LegoEntity() override { Destroy(TRUE); } virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 diff --git a/LEGO1/lego/legoomni/include/legogamestate.h b/LEGO1/lego/legoomni/include/legogamestate.h index 534ac5b9..51d7b888 100644 --- a/LEGO1/lego/legoomni/include/legogamestate.h +++ b/LEGO1/lego/legoomni/include/legogamestate.h @@ -20,13 +20,13 @@ struct ColorStringStruct { // SIZE 0x430 class LegoGameState { public: - __declspec(dllexport) LegoGameState(); - __declspec(dllexport) ~LegoGameState(); - __declspec(dllexport) MxResult Load(MxULong); - __declspec(dllexport) MxResult Save(MxULong); - __declspec(dllexport) void SerializePlayersInfo(MxS16); - __declspec(dllexport) void SerializeScoreHistory(MxS16 p_flags); - __declspec(dllexport) void SetSavePath(char*); + LegoGameState(); + ~LegoGameState(); + MxResult Load(MxULong); + MxResult Save(MxULong); + void SerializePlayersInfo(MxS16); + void SerializeScoreHistory(MxS16 p_flags); + void SetSavePath(char*); LegoState* GetState(const char* p_stateName); LegoState* CreateState(const char* p_stateName); diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 5198f71e..b2b677b7 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -32,9 +32,9 @@ class LegoInputManager : public MxPresenter { LegoInputManager(); virtual ~LegoInputManager() override; - __declspec(dllexport) void QueueEvent(NotificationId p_id, MxU8 p_modifier, MxLong p_x, MxLong p_y, MxU8 p_key); - __declspec(dllexport) void Register(MxCore*); - __declspec(dllexport) void UnRegister(MxCore*); + void QueueEvent(NotificationId p_id, MxU8 p_modifier, MxLong p_x, MxLong p_y, MxU8 p_key); + void Register(MxCore*); + void UnRegister(MxCore*); virtual MxResult Tickle() override; // vtable+0x8 diff --git a/LEGO1/lego/legoomni/include/legomodelpresenter.h b/LEGO1/lego/legoomni/include/legomodelpresenter.h index 393ea818..8ba2ec8d 100644 --- a/LEGO1/lego/legoomni/include/legomodelpresenter.h +++ b/LEGO1/lego/legoomni/include/legomodelpresenter.h @@ -9,7 +9,7 @@ class AutoROI; // SIZE 0x6c (discovered through inline constructor at 0x10009ae6) class LegoModelPresenter : public MxVideoPresenter { public: - __declspec(dllexport) static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig); + static void configureLegoModelPresenter(MxS32 p_modelPresenterConfig); // FUNCTION: LEGO1 0x1000ccb0 inline const char* ClassName() const override // vtable+0xc diff --git a/LEGO1/lego/legoomni/include/legonavcontroller.h b/LEGO1/lego/legoomni/include/legonavcontroller.h index dd2a46ad..5219c61a 100644 --- a/LEGO1/lego/legoomni/include/legonavcontroller.h +++ b/LEGO1/lego/legoomni/include/legonavcontroller.h @@ -9,7 +9,7 @@ // SIZE 0x70 class LegoNavController : public MxCore { public: - __declspec(dllexport) static void GetDefaults( + static void GetDefaults( int* p_mouseDeadzone, float* p_movementMaxSpeed, float* p_turnMaxSpeed, @@ -22,7 +22,7 @@ class LegoNavController : public MxCore { float* p_rotationSensitivity, MxBool* p_turnUseVelocity ); - __declspec(dllexport) static void SetDefaults( + static void SetDefaults( int p_mouseDeadzone, float p_movementMaxSpeed, float p_turnMaxSpeed, diff --git a/LEGO1/lego/legoomni/include/legoomni.h b/LEGO1/lego/legoomni/include/legoomni.h index d7d9a2d4..4265c7d2 100644 --- a/LEGO1/lego/legoomni/include/legoomni.h +++ b/LEGO1/lego/legoomni/include/legoomni.h @@ -68,11 +68,11 @@ class LegoOmni : public MxOmni { c_clearScreen = 0x04 }; - __declspec(dllexport) void CreateBackgroundAudio(); - __declspec(dllexport) void RemoveWorld(const MxAtomId&, MxLong); - __declspec(dllexport) static int GetCurrPathInfo(LegoPathBoundary**, MxS32&); - __declspec(dllexport) static void CreateInstance(); - __declspec(dllexport) static LegoOmni* GetInstance(); + void CreateBackgroundAudio(); + void RemoveWorld(const MxAtomId&, MxLong); + static int GetCurrPathInfo(LegoPathBoundary**, MxS32&); + static void CreateInstance(); + static LegoOmni* GetInstance(); LegoOmni(); virtual ~LegoOmni(); // vtable+00 @@ -153,16 +153,16 @@ class LegoOmni : public MxOmni { MxBool m_unk0x13c; // 0x13c }; -__declspec(dllexport) MxBackgroundAudioManager* BackgroundAudioManager(); -__declspec(dllexport) LegoGameState* GameState(); -__declspec(dllexport) const char* GetNoCD_SourceName(); -__declspec(dllexport) LegoInputManager* InputManager(); -__declspec(dllexport) LegoOmni* Lego(); -__declspec(dllexport) LegoEntity* PickEntity(MxLong, MxLong); -__declspec(dllexport) LegoROI* PickROI(MxLong, MxLong); -__declspec(dllexport) LegoSoundManager* SoundManager(); -__declspec(dllexport) MxTransitionManager* TransitionManager(); -__declspec(dllexport) LegoVideoManager* VideoManager(); +MxBackgroundAudioManager* BackgroundAudioManager(); +LegoGameState* GameState(); +const char* GetNoCD_SourceName(); +LegoInputManager* InputManager(); +LegoOmni* Lego(); +LegoEntity* PickEntity(MxLong, MxLong); +LegoROI* PickROI(MxLong, MxLong); +LegoSoundManager* SoundManager(); +MxTransitionManager* TransitionManager(); +LegoVideoManager* VideoManager(); LegoAnimationManager* AnimationManager(); LegoBuildingManager* BuildingManager(); diff --git a/LEGO1/lego/legoomni/include/legopartpresenter.h b/LEGO1/lego/legoomni/include/legopartpresenter.h index 5a422684..69d34e47 100644 --- a/LEGO1/lego/legoomni/include/legopartpresenter.h +++ b/LEGO1/lego/legoomni/include/legopartpresenter.h @@ -24,7 +24,7 @@ class LegoPartPresenter : public MxMediaPresenter { virtual MxResult AddToManager() override; // vtable+0x34 virtual void Destroy() override; // vtable+0x38 - __declspec(dllexport) static void configureLegoPartPresenter(MxS32, MxS32); + static void configureLegoPartPresenter(MxS32, MxS32); // SYNTHETIC: LEGO1 0x1000d060 // LegoPartPresenter::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index 2fe7d7a4..72cb2148 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -19,11 +19,11 @@ class LegoVideoManager : public MxVideoManager { LegoVideoManager(); virtual ~LegoVideoManager() override; - __declspec(dllexport) int EnableRMDevice(); - __declspec(dllexport) int DisableRMDevice(); + int EnableRMDevice(); + int DisableRMDevice(); void EnableFullScreenMovie(MxBool p_enable); - __declspec(dllexport) void EnableFullScreenMovie(MxBool p_enable, MxBool p_scale); - __declspec(dllexport) void MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY); + void EnableFullScreenMovie(MxBool p_enable, MxBool p_scale); + void MoveCursor(MxS32 p_cursorX, MxS32 p_cursorY); virtual MxResult Tickle() override; // vtable+0x8 virtual void Destroy() override; // vtable+0x18 diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 4fea4672..115aeef4 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -22,8 +22,8 @@ typedef set MxPresenterSet; // SIZE 0xf8 class LegoWorld : public LegoEntity { public: - __declspec(dllexport) LegoWorld(); - __declspec(dllexport) virtual ~LegoWorld() override; // vtable+0x0 + LegoWorld(); + virtual ~LegoWorld() override; // vtable+0x0 virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 virtual MxResult Tickle() override; // vtable+0x8 diff --git a/LEGO1/lego/legoomni/include/legoworldpresenter.h b/LEGO1/lego/legoomni/include/legoworldpresenter.h index f3dbba30..b1fcf90a 100644 --- a/LEGO1/lego/legoomni/include/legoworldpresenter.h +++ b/LEGO1/lego/legoomni/include/legoworldpresenter.h @@ -10,7 +10,7 @@ class LegoWorldPresenter : public LegoEntityPresenter { LegoWorldPresenter(); virtual ~LegoWorldPresenter() override; // vtable+0x0 - __declspec(dllexport) static void configureLegoWorldPresenter(MxS32 p_legoWorldPresenterQuality); + static void configureLegoWorldPresenter(MxS32 p_legoWorldPresenterQuality); // FUNCTION: LEGO1 0x10066630 inline virtual const char* ClassName() const override // vtable+0x0c diff --git a/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h b/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h index e0e64ae9..bb75af8d 100644 --- a/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h +++ b/LEGO1/lego/legoomni/include/mxbackgroundaudiomanager.h @@ -39,7 +39,7 @@ class MxBackgroundAudioManager : public MxCore { void FUN_1007ef40(); void FadeInOrFadeOut(); - __declspec(dllexport) void Enable(MxBool p_enable); + void Enable(MxBool p_enable); virtual MxResult Create(MxAtomId& p_script, MxU32 p_frequencyMS); void Stop(); diff --git a/LEGO1/lego/legoomni/include/mxtransitionmanager.h b/LEGO1/lego/legoomni/include/mxtransitionmanager.h index fdfbf674..31c6f8f7 100644 --- a/LEGO1/lego/legoomni/include/mxtransitionmanager.h +++ b/LEGO1/lego/legoomni/include/mxtransitionmanager.h @@ -13,7 +13,7 @@ class MxTransitionManager : public MxCore { MxTransitionManager(); virtual ~MxTransitionManager() override; // vtable+0x0 - __declspec(dllexport) void SetWaitIndicator(MxVideoPresenter* p_waitIndicator); + void SetWaitIndicator(MxVideoPresenter* p_waitIndicator); virtual MxResult Tickle(); // vtable+0x8 diff --git a/LEGO1/lego/legoomni/src/build/helicopter.cpp b/LEGO1/lego/legoomni/src/build/helicopter.cpp index 9f5cc843..adfb1692 100644 --- a/LEGO1/lego/legoomni/src/build/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopter.cpp @@ -13,6 +13,9 @@ #include "mxtransitionmanager.h" DECOMP_SIZE_ASSERT(Helicopter, 0x230) +DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14) +DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18) +DECOMP_SIZE_ASSERT(MxMatrix, 0x48) // FUNCTION: LEGO1 0x10001e60 Helicopter::Helicopter() diff --git a/LEGO1/lego/legoomni/src/isle/skateboard.cpp b/LEGO1/lego/legoomni/src/isle/skateboard.cpp index 2863ec40..037dff9a 100644 --- a/LEGO1/lego/legoomni/src/isle/skateboard.cpp +++ b/LEGO1/lego/legoomni/src/isle/skateboard.cpp @@ -1,4 +1,4 @@ -#include "SkateBoard.h" +#include "skateboard.h" #include "decomp.h" #include "mxnotificationmanager.h" diff --git a/LEGO1/lego/sources/roi/legoroi.cpp b/LEGO1/lego/sources/roi/legoroi.cpp index 0f262a51..8dab4657 100644 --- a/LEGO1/lego/sources/roi/legoroi.cpp +++ b/LEGO1/lego/sources/roi/legoroi.cpp @@ -7,10 +7,10 @@ DECOMP_SIZE_ASSERT(LegoROI, 0x10c); // SIZE 0x14 typedef struct { const char* m_name; - MxS32 m_red; - MxS32 m_green; - MxS32 m_blue; - MxS32 m_unk0x10; + int m_red; + int m_green; + int m_blue; + int m_unk0x10; } ROIColorAlias; // GLOBAL: LEGO1 0x100dbe28 @@ -32,7 +32,7 @@ ROIColorAlias g_roiColorAliases[22] = { }; // GLOBAL: LEGO1 0x10101368 -MxS32 g_roiConfig = 100; +int g_roiConfig = 100; // GLOBAL: LEGO1 0x101013ac ROIHandler g_someHandlerFunction = NULL; @@ -54,24 +54,24 @@ void LegoROI::FUN_100a58f0(Matrix4& p_transform) } // FUNCTION: LEGO1 0x100a81c0 -void LegoROI::configureLegoROI(MxS32 p_roiConfig) +void LegoROI::configureLegoROI(int p_roiConfig) { g_roiConfig = p_roiConfig; } // STUB: LEGO1 0x100a9a50 -LegoROI::LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList, MxTime p_time) : ViewROI(p_renderer, p_lodList) +LegoROI::LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList, int p_time) : ViewROI(p_renderer, p_lodList) { m_time = p_time; } // FUNCTION: LEGO1 0x100a9bf0 -MxBool LegoROI::CallTheHandlerFunction( +unsigned char LegoROI::CallTheHandlerFunction( char* p_param, - MxFloat& p_red, - MxFloat& p_green, - MxFloat& p_blue, - MxFloat& p_other + float& p_red, + float& p_green, + float& p_blue, + float& p_other ) { // TODO @@ -88,11 +88,11 @@ MxBool LegoROI::CallTheHandlerFunction( } // FUNCTION: LEGO1 0x100a9c50 -MxBool LegoROI::ColorAliasLookup(char* p_param, MxFloat& p_red, MxFloat& p_green, MxFloat& p_blue, MxFloat& p_other) +unsigned char LegoROI::ColorAliasLookup(char* p_param, float& p_red, float& p_green, float& p_blue, float& p_other) { // TODO: this seems awfully hacky for these devs. is there a dynamic way // to represent `the end of this array` that would improve this? - MxU32 i = 0; + unsigned int i = 0; do { if (strcmpi(g_roiColorAliases[i].m_name, p_param) == 0) { p_red = g_roiColorAliases[i].m_red * g_normalizeByteToFloat; @@ -102,7 +102,7 @@ MxBool LegoROI::ColorAliasLookup(char* p_param, MxFloat& p_red, MxFloat& p_green return TRUE; } i++; - } while ((MxS32*) &g_roiColorAliases[i] < &g_roiConfig); + } while ((int*) &g_roiColorAliases[i] < &g_roiConfig); return FALSE; } @@ -114,7 +114,7 @@ void LegoROI::SetSomeHandlerFunction(ROIHandler p_func) } // FUNCTION: LEGO1 0x100a9e10 -void LegoROI::SetDisplayBB(MxS32 p_displayBB) +void LegoROI::SetDisplayBB(int p_displayBB) { // Intentionally empty function } diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 4bf0ff18..2fb03c63 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -1,10 +1,9 @@ #ifndef LEGOROI_H #define LEGOROI_H -#include "mxtypes.h" #include "viewmanager/viewroi.h" -typedef MxBool (*ROIHandler)(char*, char*, MxU32); +typedef unsigned char (*ROIHandler)(char*, char*, unsigned int); class LegoEntity; @@ -18,24 +17,24 @@ class AutoROI : public ViewROI {}; // SIZE 0x10c class LegoROI : public ViewROI { public: - LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList, MxTime p_time); + LegoROI(Tgl::Renderer* p_renderer, ViewLODList* p_lodList, int p_time); virtual float IntrinsicImportance() const override; // vtable+0x4 // Note: Actually part of parent class (doesn't exist yet) virtual void UpdateWorldBoundingVolumes() override; // vtable+0x18 - __declspec(dllexport) void SetDisplayBB(MxS32 p_displayBB); - __declspec(dllexport) static void configureLegoROI(MxS32 p_roi); + void SetDisplayBB(int p_displayBB); + static void configureLegoROI(int p_roi); static void SetSomeHandlerFunction(ROIHandler p_func); - static MxBool CallTheHandlerFunction( + static unsigned char CallTheHandlerFunction( char* p_param, - MxFloat& p_red, - MxFloat& p_green, - MxFloat& p_blue, - MxFloat& p_other + float& p_red, + float& p_green, + float& p_blue, + float& p_other ); - static MxBool ColorAliasLookup(char* p_param, MxFloat& p_red, MxFloat& p_green, MxFloat& p_blue, MxFloat& p_other); + static unsigned char ColorAliasLookup(char* p_param, float& p_red, float& p_green, float& p_blue, float& p_other); void WrappedSetLocalTransform(Matrix4& p_transform); void FUN_100a46b0(Matrix4& p_transform); @@ -50,7 +49,7 @@ class LegoROI : public ViewROI { private: undefined m_pad[0x24]; // 0xe0 LegoEntity* m_unk0x104; // 0x104 - MxTime m_time; // 0x108 + int m_time; // 0x108 }; #endif // LEGOROI_H diff --git a/LEGO1/main.cpp b/LEGO1/main.cpp index f760aeae..260afb24 100644 --- a/LEGO1/main.cpp +++ b/LEGO1/main.cpp @@ -1,7 +1,7 @@ #include // FUNCTION: LEGO1 0x10091ee0 -__declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return TRUE; } diff --git a/LEGO1/mxdirectx/mxdirectdraw.h b/LEGO1/mxdirectx/mxdirectdraw.h index b8f5f551..e082c2d4 100644 --- a/LEGO1/mxdirectx/mxdirectdraw.h +++ b/LEGO1/mxdirectx/mxdirectdraw.h @@ -34,9 +34,9 @@ class MxDirectDraw { void* m_unk0x178; // 0x178 }; - __declspec(dllexport) int FlipToGDISurface(); - __declspec(dllexport) static int GetPrimaryBitDepth(); - __declspec(dllexport) int Pause(int); + int FlipToGDISurface(); + static int GetPrimaryBitDepth(); + int Pause(int); MxDirectDraw(); virtual ~MxDirectDraw(); diff --git a/LEGO1/mxgeometry/mxgeometry3d.cpp b/LEGO1/mxgeometry/mxgeometry3d.cpp deleted file mode 100644 index 03ce60eb..00000000 --- a/LEGO1/mxgeometry/mxgeometry3d.cpp +++ /dev/null @@ -1,6 +0,0 @@ -#include "mxgeometry3d.h" - -#include "decomp.h" - -DECOMP_SIZE_ASSERT(Mx3DPointFloat, 0x14); -DECOMP_SIZE_ASSERT(Mx4DPointFloat, 0x18); diff --git a/LEGO1/mxgeometry/mxmatrix.cpp b/LEGO1/mxgeometry/mxmatrix.cpp deleted file mode 100644 index fc768f38..00000000 --- a/LEGO1/mxgeometry/mxmatrix.cpp +++ /dev/null @@ -1,5 +0,0 @@ -#include "mxmatrix.h" - -#include "decomp.h" - -DECOMP_SIZE_ASSERT(MxMatrix, 0x48); diff --git a/LEGO1/omni/include/mxatomid.h b/LEGO1/omni/include/mxatomid.h index 388ffce3..337f0b76 100644 --- a/LEGO1/omni/include/mxatomid.h +++ b/LEGO1/omni/include/mxatomid.h @@ -14,9 +14,9 @@ enum LookupMode { // SIZE 0x04 class MxAtomId { public: - __declspec(dllexport) MxAtomId(const char*, LookupMode); - __declspec(dllexport) MxAtomId& operator=(const MxAtomId& p_atomId); - __declspec(dllexport) ~MxAtomId(); + MxAtomId(const char*, LookupMode); + MxAtomId& operator=(const MxAtomId& p_atomId); + ~MxAtomId(); MxAtomId() { this->m_internal = 0; } diff --git a/LEGO1/omni/include/mxbitmap.h b/LEGO1/omni/include/mxbitmap.h index f17ddb4b..fe3e6682 100644 --- a/LEGO1/omni/include/mxbitmap.h +++ b/LEGO1/omni/include/mxbitmap.h @@ -34,14 +34,14 @@ struct MxBITMAPINFO { // VTABLE: LEGO1 0x100dc7b0 class MxBitmap : public MxCore { public: - __declspec(dllexport) MxBitmap(); - __declspec(dllexport) virtual ~MxBitmap(); // vtable+00 + MxBitmap(); + virtual ~MxBitmap(); // vtable+00 virtual MxResult ImportBitmap(MxBitmap* p_bitmap); // vtable+14 virtual MxResult ImportBitmapInfo(MxBITMAPINFO* p_info); // vtable+18 virtual MxResult SetSize(MxS32 p_width, MxS32 p_height, MxPalette* p_palette, MxBool); // vtable+1c virtual MxResult LoadFile(HANDLE p_handle); // vtable+20 - __declspec(dllexport) virtual MxLong Read(const char* p_filename); // vtable+24 + virtual MxLong Read(const char* p_filename); // vtable+24 // FUNCTION: LEGO1 0x1004e0d0 virtual int VTable0x28(int) { return -1; }; // vtable+28 @@ -63,10 +63,10 @@ class MxBitmap : public MxCore { MxS32 p_bottom, MxS32 p_width, MxS32 p_height - ); // vtable+30 - __declspec(dllexport) virtual MxPalette* CreatePalette(); // vtable+34 - virtual void ImportPalette(MxPalette* p_palette); // vtable+38 - virtual MxResult SetBitDepth(MxBool); // vtable+3c + ); // vtable+30 + virtual MxPalette* CreatePalette(); // vtable+34 + virtual void ImportPalette(MxPalette* p_palette); // vtable+38 + virtual MxResult SetBitDepth(MxBool); // vtable+3c virtual MxResult StretchBits( HDC p_hdc, MxS32 p_xSrc, diff --git a/LEGO1/omni/include/mxcore.h b/LEGO1/omni/include/mxcore.h index cae7020e..632391bc 100644 --- a/LEGO1/omni/include/mxcore.h +++ b/LEGO1/omni/include/mxcore.h @@ -12,9 +12,9 @@ class MxParam; // SIZE 0x8 class MxCore { public: - __declspec(dllexport) MxCore(); - __declspec(dllexport) virtual ~MxCore(); // vtable+00 - __declspec(dllexport) virtual MxLong Notify(MxParam& p_param); // vtable+04 + MxCore(); + virtual ~MxCore(); // vtable+00 + virtual MxLong Notify(MxParam& p_param); // vtable+04 // FUNCTION: LEGO1 0x10001f70 virtual MxResult Tickle() { return SUCCESS; }; // vtable+08 diff --git a/LEGO1/omni/include/mxcriticalsection.h b/LEGO1/omni/include/mxcriticalsection.h index 8c5f77d6..011ac680 100644 --- a/LEGO1/omni/include/mxcriticalsection.h +++ b/LEGO1/omni/include/mxcriticalsection.h @@ -6,9 +6,9 @@ // SIZE 0x1c class MxCriticalSection { public: - __declspec(dllexport) MxCriticalSection(); - __declspec(dllexport) ~MxCriticalSection(); - __declspec(dllexport) static void SetDoMutex(); + MxCriticalSection(); + ~MxCriticalSection(); + static void SetDoMutex(); void Enter(); void Leave(); diff --git a/LEGO1/omni/include/mxdsaction.h b/LEGO1/omni/include/mxdsaction.h index 67449868..75b3cc2c 100644 --- a/LEGO1/omni/include/mxdsaction.h +++ b/LEGO1/omni/include/mxdsaction.h @@ -24,8 +24,8 @@ class MxDSAction : public MxDSObject { c_bit11 = 0x400, }; - __declspec(dllexport) MxDSAction(); - __declspec(dllexport) virtual ~MxDSAction(); + MxDSAction(); + virtual ~MxDSAction(); void CopyFrom(MxDSAction& p_dsAction); MxDSAction& operator=(MxDSAction& p_dsAction); diff --git a/LEGO1/omni/include/mxdsfile.h b/LEGO1/omni/include/mxdsfile.h index 473b9741..c4de4820 100644 --- a/LEGO1/omni/include/mxdsfile.h +++ b/LEGO1/omni/include/mxdsfile.h @@ -11,8 +11,8 @@ // VTABLE: LEGO1 0x100dc890 class MxDSFile : public MxDSSource { public: - __declspec(dllexport) MxDSFile(const char* p_filename, MxULong p_skipReadingChunks); - __declspec(dllexport) virtual ~MxDSFile(); // vtable+0x0 + MxDSFile(const char* p_filename, MxULong p_skipReadingChunks); + virtual ~MxDSFile(); // vtable+0x0 // FUNCTION: LEGO1 0x100c0120 inline virtual const char* ClassName() const override // vtable+0x0c @@ -27,12 +27,12 @@ class MxDSFile : public MxDSSource { return !strcmp(p_name, MxDSFile::ClassName()) || MxDSSource::IsA(p_name); } - __declspec(dllexport) virtual MxLong Open(MxULong); // vtable+0x14 - __declspec(dllexport) virtual MxLong Close(); // vtable+0x18 - __declspec(dllexport) virtual MxResult Read(unsigned char*, MxULong); // vtable+0x20 - __declspec(dllexport) virtual MxLong Seek(MxLong, int); // vtable+0x24 - __declspec(dllexport) virtual MxULong GetBufferSize(); // vtable+0x28 - __declspec(dllexport) virtual MxULong GetStreamBuffersNum(); // vtable+0x2c + virtual MxLong Open(MxULong); // vtable+0x14 + virtual MxLong Close(); // vtable+0x18 + virtual MxResult Read(unsigned char*, MxULong); // vtable+0x20 + virtual MxLong Seek(MxLong, int); // vtable+0x24 + virtual MxULong GetBufferSize(); // vtable+0x28 + virtual MxULong GetStreamBuffersNum(); // vtable+0x2c inline void SetFileName(const char* p_filename) { m_filename = p_filename; } diff --git a/LEGO1/omni/include/mxdsobject.h b/LEGO1/omni/include/mxdsobject.h index ad1cae40..45a3b360 100644 --- a/LEGO1/omni/include/mxdsobject.h +++ b/LEGO1/omni/include/mxdsobject.h @@ -32,7 +32,7 @@ class MxDSObject : public MxCore { void CopyFrom(MxDSObject& p_dsObject); MxDSObject& operator=(MxDSObject& p_dsObject); - __declspec(dllexport) void SetObjectName(const char* p_objectName); + void SetObjectName(const char* p_objectName); void SetSourceName(const char* p_sourceName); // FUNCTION: LEGO1 0x100bf730 diff --git a/LEGO1/omni/include/mxioinfo.h b/LEGO1/omni/include/mxioinfo.h index 2a978b63..94901c4a 100644 --- a/LEGO1/omni/include/mxioinfo.h +++ b/LEGO1/omni/include/mxioinfo.h @@ -12,7 +12,7 @@ class MXIOINFO { public: MXIOINFO(); - __declspec(dllexport) ~MXIOINFO(); + ~MXIOINFO(); MxU16 Open(const char*, MxULong); MxU16 Close(MxLong); diff --git a/LEGO1/omni/include/mxomni.h b/LEGO1/omni/include/mxomni.h index 9ade97b3..d92f2b38 100644 --- a/LEGO1/omni/include/mxomni.h +++ b/LEGO1/omni/include/mxomni.h @@ -28,14 +28,14 @@ class MxStreamController; // SIZE 0x68 class MxOmni : public MxCore { public: - __declspec(dllexport) static void DestroyInstance(); - __declspec(dllexport) static const char* GetCD(); - __declspec(dllexport) static const char* GetHD(); - __declspec(dllexport) static MxOmni* GetInstance(); - __declspec(dllexport) static MxBool IsSound3D(); - __declspec(dllexport) static void SetCD(const char* p_cd); - __declspec(dllexport) static void SetHD(const char* p_hd); - __declspec(dllexport) static void SetSound3D(MxBool p_use3dSound); + static void DestroyInstance(); + static const char* GetCD(); + static const char* GetHD(); + static MxOmni* GetInstance(); + static MxBool IsSound3D(); + static void SetCD(const char* p_cd); + static void SetHD(const char* p_hd); + static void SetSound3D(MxBool p_use3dSound); MxOmni(); virtual ~MxOmni() override; @@ -96,15 +96,15 @@ class MxOmni : public MxCore { MxBool m_timerRunning; // 0x64 }; -__declspec(dllexport) MxTickleManager* TickleManager(); -__declspec(dllexport) MxTimer* Timer(); -__declspec(dllexport) MxStreamer* Streamer(); -__declspec(dllexport) MxSoundManager* MSoundManager(); -__declspec(dllexport) MxVariableTable* VariableTable(); -__declspec(dllexport) MxMusicManager* MusicManager(); -__declspec(dllexport) MxEventManager* EventManager(); -__declspec(dllexport) MxResult Start(MxDSAction*); -__declspec(dllexport) MxNotificationManager* NotificationManager(); +MxTickleManager* TickleManager(); +MxTimer* Timer(); +MxStreamer* Streamer(); +MxSoundManager* MSoundManager(); +MxVariableTable* VariableTable(); +MxMusicManager* MusicManager(); +MxEventManager* EventManager(); +MxResult Start(MxDSAction*); +MxNotificationManager* NotificationManager(); MxVideoManager* MVideoManager(); MxAtomIdCounterSet* AtomIdCounterSet(); diff --git a/LEGO1/omni/include/mxomnicreateflags.h b/LEGO1/omni/include/mxomnicreateflags.h index 24b1e942..1e9f334d 100644 --- a/LEGO1/omni/include/mxomnicreateflags.h +++ b/LEGO1/omni/include/mxomnicreateflags.h @@ -21,7 +21,7 @@ class MxOmniCreateFlags { c_createStreamer = 0x04 }; - __declspec(dllexport) MxOmniCreateFlags(); + MxOmniCreateFlags(); inline const MxBool CreateObjectFactory() const { return this->m_flags1 & c_createObjectFactory; } inline const MxBool CreateVariableTable() const { return this->m_flags1 & c_createVariableTable; } diff --git a/LEGO1/omni/include/mxomnicreateparam.h b/LEGO1/omni/include/mxomnicreateparam.h index 53539bc6..8d04ed18 100644 --- a/LEGO1/omni/include/mxomnicreateparam.h +++ b/LEGO1/omni/include/mxomnicreateparam.h @@ -11,7 +11,7 @@ // VTABLE: LEGO1 0x100dc218 class MxOmniCreateParam : public MxParam { public: - __declspec(dllexport) MxOmniCreateParam( + MxOmniCreateParam( const char* p_mediaPath, struct HWND__* p_windowHandle, MxVideoParam& p_vparam, diff --git a/LEGO1/omni/include/mxpalette.h b/LEGO1/omni/include/mxpalette.h index 5ed5e80f..9352950f 100644 --- a/LEGO1/omni/include/mxpalette.h +++ b/LEGO1/omni/include/mxpalette.h @@ -10,8 +10,8 @@ // SIZE 0x414 class MxPalette : public MxCore { public: - __declspec(dllexport) MxBool operator==(MxPalette& p_other); - __declspec(dllexport) void Detach(); + MxBool operator==(MxPalette& p_other); + void Detach(); MxPalette(); MxPalette(const RGBQUAD*); diff --git a/LEGO1/omni/include/mxpresenter.h b/LEGO1/omni/include/mxpresenter.h index a6b3eca8..35a28eda 100644 --- a/LEGO1/omni/include/mxpresenter.h +++ b/LEGO1/omni/include/mxpresenter.h @@ -28,14 +28,10 @@ class MxPresenter : public MxCore { MxPresenter() { Init(); } -#ifdef ISLE_APP - __declspec(dllexport) virtual ~MxPresenter() override; // vtable+0x00 -#else // FUNCTION: LEGO1 0x1000bf00 - __declspec(dllexport) virtual ~MxPresenter() override{}; // vtable+0x00 -#endif + virtual ~MxPresenter() override{}; // vtable+0x00 - __declspec(dllexport) virtual MxResult Tickle() override; // vtable+0x08 + virtual MxResult Tickle() override; // vtable+0x08 // FUNCTION: LEGO1 0x1000bfe0 inline virtual const char* ClassName() const override // vtable+0xc @@ -73,14 +69,10 @@ class MxPresenter : public MxCore { virtual void Unk5Tickle() { ProgressTickleState(e_done); }; // vtable+0x28 protected: -#ifdef ISLE_APP - __declspec(dllexport) virtual void DoneTickle(); // vtable+0x2c -#else // FUNCTION: LEGO1 0x1000bee0 - __declspec(dllexport) virtual void DoneTickle() { ProgressTickleState(e_idle); }; // vtable+0x2c -#endif + virtual void DoneTickle() { ProgressTickleState(e_idle); }; // vtable+0x2c - __declspec(dllexport) virtual void ParseExtra(); // vtable+0x30 + virtual void ParseExtra(); // vtable+0x30 inline void ProgressTickleState(TickleState p_tickleState) { @@ -95,8 +87,8 @@ class MxPresenter : public MxCore { // FUNCTION: LEGO1 0x1000bf80 virtual void Destroy() { Init(); }; // vtable+0x38 - __declspec(dllexport) virtual MxResult StartAction(MxStreamController*, MxDSAction*); // vtable+0x3c - __declspec(dllexport) virtual void EndAction(); // vtable+0x40 + virtual MxResult StartAction(MxStreamController*, MxDSAction*); // vtable+0x3c + virtual void EndAction(); // vtable+0x40 // FUNCTION: LEGO1 0x1000bf90 virtual void SetTickleState(TickleState p_tickleState) { ProgressTickleState(p_tickleState); } // vtable+0x44 @@ -113,7 +105,7 @@ class MxPresenter : public MxCore { // FUNCTION: LEGO1 0x1000bfd0 virtual MxBool IsHit(MxS32 p_x, MxS32 p_y) { return FALSE; }; // vtable+0x50 - __declspec(dllexport) virtual void Enable(MxBool p_enable); // vtable+0x54 + virtual void Enable(MxBool p_enable); // vtable+0x54 MxEntity* CreateEntity(const char* p_name); void SendToCompositePresenter(MxOmni*); @@ -133,7 +125,7 @@ class MxPresenter : public MxCore { // MxPresenter::`scalar deleting destructor' protected: - __declspec(dllexport) void Init(); + void Init(); TickleState m_currentTickleState; // 0x8 MxU32 m_previousTickleStates; // 0x0c diff --git a/LEGO1/omni/include/mxscheduler.h b/LEGO1/omni/include/mxscheduler.h index 17b7ecb8..1f60029d 100644 --- a/LEGO1/omni/include/mxscheduler.h +++ b/LEGO1/omni/include/mxscheduler.h @@ -5,8 +5,8 @@ class MxScheduler { public: - __declspec(dllexport) static MxScheduler* GetInstance(); - __declspec(dllexport) void StartMultiTasking(MxULong); + static MxScheduler* GetInstance(); + void StartMultiTasking(MxULong); }; #endif // MXSCHEDULER_H diff --git a/LEGO1/omni/include/mxstreamer.h b/LEGO1/omni/include/mxstreamer.h index f22e343f..e0d07b19 100644 --- a/LEGO1/omni/include/mxstreamer.h +++ b/LEGO1/omni/include/mxstreamer.h @@ -78,8 +78,8 @@ class MxStreamer : public MxCore { MxStreamer(); virtual ~MxStreamer() override; // vtable+0x0 - __declspec(dllexport) MxStreamController* Open(const char* p_name, MxU16 p_openMode); - __declspec(dllexport) MxLong Close(const char* p_name); + MxStreamController* Open(const char* p_name, MxU16 p_openMode); + MxLong Close(const char* p_name); virtual MxLong Notify(MxParam& p_param) override; // vtable+0x4 diff --git a/LEGO1/omni/include/mxstring.h b/LEGO1/omni/include/mxstring.h index 65c15d3e..1c745845 100644 --- a/LEGO1/omni/include/mxstring.h +++ b/LEGO1/omni/include/mxstring.h @@ -7,9 +7,9 @@ // SIZE 0x10 class MxString : public MxCore { public: - __declspec(dllexport) MxString(const MxString& p_str); - __declspec(dllexport) virtual ~MxString(); - __declspec(dllexport) const MxString& operator=(const char* p_data); + MxString(const MxString& p_str); + virtual ~MxString(); + const MxString& operator=(const char* p_data); MxString(); MxString(const char*); diff --git a/LEGO1/omni/include/mxtimer.h b/LEGO1/omni/include/mxtimer.h index 63b597ac..f9851c44 100644 --- a/LEGO1/omni/include/mxtimer.h +++ b/LEGO1/omni/include/mxtimer.h @@ -12,7 +12,7 @@ class MxTimer : public MxCore { void Start(); void Stop(); - __declspec(dllexport) MxLong GetRealTime(); + MxLong GetRealTime(); inline MxLong GetTime() { diff --git a/LEGO1/omni/include/mxutil.h b/LEGO1/omni/include/mxutil.h index 5eb0a984..e043ebd4 100644 --- a/LEGO1/omni/include/mxutil.h +++ b/LEGO1/omni/include/mxutil.h @@ -69,10 +69,10 @@ MxBool GetRectIntersection( MxS32* p_height ); -__declspec(dllexport) void MakeSourceName(char*, const char*); -__declspec(dllexport) void SetOmniUserMessage(void (*)(const char*, int)); +void MakeSourceName(char*, const char*); +void SetOmniUserMessage(void (*)(const char*, int)); void FUN_100b7220(MxDSAction* p_action, MxU32 p_newFlags, MxBool p_setFlags); -__declspec(dllexport) MxDSObject* CreateStreamObject(MxDSFile*, MxS16); +MxDSObject* CreateStreamObject(MxDSFile*, MxS16); MxBool KeyValueStringParse(char*, const char*, const char*); diff --git a/LEGO1/omni/include/mxvariabletable.h b/LEGO1/omni/include/mxvariabletable.h index fd5cdea2..1eec195f 100644 --- a/LEGO1/omni/include/mxvariabletable.h +++ b/LEGO1/omni/include/mxvariabletable.h @@ -10,9 +10,9 @@ class MxVariableTable : public MxHashTable { public: MxVariableTable() { m_customDestructor = Destroy; } - __declspec(dllexport) void SetVariable(const char* p_key, const char* p_value); - __declspec(dllexport) void SetVariable(MxVariable* p_var); - __declspec(dllexport) const char* GetVariable(const char* p_key); + void SetVariable(const char* p_key, const char* p_value); + void SetVariable(MxVariable* p_var); + const char* GetVariable(const char* p_key); static void Destroy(MxVariable* p_obj) { p_obj->Destroy(); } diff --git a/LEGO1/omni/include/mxvideomanager.h b/LEGO1/omni/include/mxvideomanager.h index 57919da3..c4e26aa2 100644 --- a/LEGO1/omni/include/mxvideomanager.h +++ b/LEGO1/omni/include/mxvideomanager.h @@ -30,8 +30,8 @@ class MxVideoManager : public MxMediaManager { ); // vtable+0x28 virtual MxResult Create(MxVideoParam& p_videoParam, MxU32 p_frequencyMS, MxBool p_createThread); // vtable+0x2c - __declspec(dllexport) void InvalidateRect(MxRect32&); - __declspec(dllexport) virtual MxResult RealizePalette(MxPalette*); // vtable+0x30 + void InvalidateRect(MxRect32&); + virtual MxResult RealizePalette(MxPalette*); // vtable+0x30 virtual void UpdateView(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height); // vtable+0x34 MxResult Init(); diff --git a/LEGO1/omni/include/mxvideoparam.h b/LEGO1/omni/include/mxvideoparam.h index 33aecb32..b9ae10ba 100644 --- a/LEGO1/omni/include/mxvideoparam.h +++ b/LEGO1/omni/include/mxvideoparam.h @@ -13,17 +13,13 @@ // SIZE 0x24 class MxVideoParam { public: - __declspec(dllexport) MxVideoParam(); - __declspec(dllexport) MxVideoParam(MxVideoParam& p_videoParam); - __declspec(dllexport) MxVideoParam( - COMPAT_CONST MxRect32& p_rect, - MxPalette* p_palette, - MxULong p_backBuffers, - COMPAT_CONST MxVideoParamFlags& p_flags - ); - __declspec(dllexport) MxVideoParam& operator=(const MxVideoParam& p_videoParam); - __declspec(dllexport) ~MxVideoParam(); - __declspec(dllexport) void SetDeviceName(char* p_deviceId); + MxVideoParam(); + MxVideoParam(MxVideoParam& p_videoParam); + __declspec(dllexport) + MxVideoParam(MxRect32& p_rect, MxPalette* p_palette, MxULong p_backBuffers, MxVideoParamFlags& p_flags); + MxVideoParam& operator=(const MxVideoParam& p_videoParam); + ~MxVideoParam(); + void SetDeviceName(char* p_deviceId); inline MxVideoParamFlags& Flags() { return m_flags; } diff --git a/LEGO1/omni/include/mxvideoparamflags.h b/LEGO1/omni/include/mxvideoparamflags.h index 551a6c0a..8b937d38 100644 --- a/LEGO1/omni/include/mxvideoparamflags.h +++ b/LEGO1/omni/include/mxvideoparamflags.h @@ -7,7 +7,7 @@ class MxVideoParamFlags { public: - __declspec(dllexport) MxVideoParamFlags(); + MxVideoParamFlags(); inline void SetFullScreen(BOOL p_e) { m_flags1.m_bit0 = p_e; } inline void SetFlipSurfaces(BOOL p_e) { m_flags1.m_bit1 = p_e; } diff --git a/LEGO1/omni/src/system/mxthread.cpp b/LEGO1/omni/src/system/mxthread.cpp index 401860a1..158c0cf6 100644 --- a/LEGO1/omni/src/system/mxthread.cpp +++ b/LEGO1/omni/src/system/mxthread.cpp @@ -1,4 +1,3 @@ - #include "mxthread.h" #include "decomp.h" diff --git a/LEGO1/omni/src/video/mxvideoparam.cpp b/LEGO1/omni/src/video/mxvideoparam.cpp index c34e832c..cc833727 100644 --- a/LEGO1/omni/src/video/mxvideoparam.cpp +++ b/LEGO1/omni/src/video/mxvideoparam.cpp @@ -21,12 +21,7 @@ MxVideoParam::MxVideoParam() } // FUNCTION: LEGO1 0x100beca0 -MxVideoParam::MxVideoParam( - COMPAT_CONST MxRect32& p_rect, - MxPalette* p_palette, - MxULong p_backBuffers, - COMPAT_CONST MxVideoParamFlags& p_flags -) +MxVideoParam::MxVideoParam(MxRect32& p_rect, MxPalette* p_palette, MxULong p_backBuffers, MxVideoParamFlags& p_flags) { this->m_rect = p_rect; this->m_palette = p_palette; diff --git a/LEGO1/realtime/realtimeview.h b/LEGO1/realtime/realtimeview.h index 22183ced..f732c480 100644 --- a/LEGO1/realtime/realtimeview.h +++ b/LEGO1/realtime/realtimeview.h @@ -3,11 +3,11 @@ class RealtimeView { public: - __declspec(dllexport) static float GetPartsThreshold(); - __declspec(dllexport) static float GetUserMaxLOD(); - __declspec(dllexport) static void SetPartsThreshold(float); + static float GetPartsThreshold(); + static float GetUserMaxLOD(); + static void SetPartsThreshold(float); static void UpdateMaxLOD(); - __declspec(dllexport) static void SetUserMaxLOD(float); + static void SetUserMaxLOD(float); }; #endif // REALTIMEVIEW_H diff --git a/LEGO1/viewmanager/viewmanager.h b/LEGO1/viewmanager/viewmanager.h index 8185c572..d89b7cef 100644 --- a/LEGO1/viewmanager/viewmanager.h +++ b/LEGO1/viewmanager/viewmanager.h @@ -10,7 +10,7 @@ class ViewManager { ViewManager(Tgl::Renderer* pRenderer, Tgl::Group* scene, const OrientableROI* point_of_view); virtual ~ViewManager(); - __declspec(dllexport) void RemoveAll(ViewROI*); + void RemoveAll(ViewROI*); void SetPOVSource(const OrientableROI* point_of_view); void SetResolution(int width, int height); diff --git a/tools/README.md b/tools/README.md index b24a8f50..6e6b046f 100644 --- a/tools/README.md +++ b/tools/README.md @@ -109,9 +109,9 @@ Classes should be annotated using the `SIZE` marker to indicate their size. If y // SIZE 0x1c class MxCriticalSection { public: - __declspec(dllexport) MxCriticalSection(); - __declspec(dllexport) ~MxCriticalSection(); - __declspec(dllexport) static void SetDoMutex(); + MxCriticalSection(); + ~MxCriticalSection(); + static void SetDoMutex(); ``` ## Member variables (**WIP**) diff --git a/tools/ncc/skip.yml b/tools/ncc/skip.yml index ec7f46a0..f6d2de8e 100644 --- a/tools/ncc/skip.yml +++ b/tools/ncc/skip.yml @@ -2,7 +2,7 @@ configureLegoAnimationManager(MxS32): 'DLL exported function' configureLegoBuildingManager(MxS32): 'DLL exported function' configureLegoModelPresenter(MxS32): 'DLL exported function' configureLegoPartPresenter(MxS32, MxS32): 'DLL exported function' -configureLegoROI(MxS32): 'DLL exported function' +configureLegoROI(int): 'DLL exported function' configureLegoWorldPresenter(MxS32): 'DLL exported function' GetNoCD_SourceName(): 'DLL exported function' m_3dView: 'Allow this variable name' diff --git a/util/compat.h b/util/compat.h index b38a1c7c..ea2a6507 100644 --- a/util/compat.h +++ b/util/compat.h @@ -7,14 +7,6 @@ #define COMPAT_MODE #endif -// Use `COMPAT_CONST` where something ought to be 'const', and a newer compiler would complain if it -// wasn't, but we know it isn't 'const' in the original code. -#if defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER >= 1100) -#define COMPAT_CONST const -#else -#define COMPAT_CONST -#endif - // Disable "identifier was truncated to '255' characters" warning. // Impossible to avoid this if using STL map or set. // This removes most (but not all) occurrences of the warning. From a3868e3808dbe3e74636578ef6d207bf953f49cd Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 26 Jan 2024 12:03:29 -0500 Subject: [PATCH 19/34] Implement/match LegoWorld::FUN_10021790 (#486) * Implement/match LegoWorld::FUN_10021790 * Improve match * Match * Specify python package versions * Use wildcard version * Use const atom * Use const atom --- .github/workflows/format.yml | 2 +- LEGO1/lego/legoomni/include/legoentitylist.h | 5 ++- LEGO1/lego/legoomni/include/legoworld.h | 2 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 43 ++++++++++++++++++- .../legoomni/src/infocenter/infocenter.cpp | 30 ++++++------- 5 files changed, 62 insertions(+), 20 deletions(-) diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml index 6e4e724e..10e85e0d 100644 --- a/.github/workflows/format.yml +++ b/.github/workflows/format.yml @@ -29,7 +29,7 @@ jobs: - name: Install python libraries shell: bash run: | - pip install black pylint pytest -r tools/requirements.txt + pip install black==23.* pylint==3.* pytest==7.* -r tools/requirements.txt - name: Run pylint and black shell: bash diff --git a/LEGO1/lego/legoomni/include/legoentitylist.h b/LEGO1/lego/legoomni/include/legoentitylist.h index 1d29e65d..04935769 100644 --- a/LEGO1/lego/legoomni/include/legoentitylist.h +++ b/LEGO1/lego/legoomni/include/legoentitylist.h @@ -86,7 +86,10 @@ class LegoEntityListCursor : public MxPtrListCursor { // FUNCTION: LEGO1 0x1001f2b0 // MxListCursor::~MxListCursor -// FUNCTION: LEGO1 0x1001edc6 +// FUNCTION: LEGO1 0x1001f300 // LegoEntityListCursor::~LegoEntityListCursor +// TEMPLATE: LEGO1 0x100207d0 +// MxListCursor::MxListCursor + #endif // LEGOENTITYLIST_H diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 115aeef4..72fc69b6 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -66,7 +66,7 @@ class LegoWorld : public LegoEntity { void FUN_10073430(); MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); MxPresenter* FindPresenter(const char* p_presenter, const char* p_name); - MxPresenter* FUN_10021790(MxAtomId& p_atom, MxS32 p_entityId); + MxCore* FUN_10021790(const MxAtomId& p_atom, MxS32 p_entityId); // SYNTHETIC: LEGO1 0x1001dee0 // LegoWorld::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 60cb941d..6cc2363a 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -168,9 +168,48 @@ MxPresenter* LegoWorld::FindPresenter(const char* p_presenter, const char* p_nam return NULL; } -// STUB: LEGO1 0x10021790 -MxPresenter* LegoWorld::FUN_10021790(MxAtomId& p_atom, MxS32 p_entityId) +// FUNCTION: LEGO1 0x10021790 +MxCore* LegoWorld::FUN_10021790(const MxAtomId& p_atom, MxS32 p_entityId) { + LegoEntityListCursor entityCursor(m_entityList); + LegoEntity* entity; + + while (entityCursor.Next(entity)) { + if (entity->GetAtom() == p_atom && entity->GetEntityId() == p_entityId) + return entity; + } + + MxPresenterListCursor presenterCursor0xb8(&m_list0xb8); + MxPresenter* presenter; + + while (presenterCursor0xb8.Next(presenter)) { + MxDSAction* action = presenter->GetAction(); + + if (action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId) + return presenter; + } + + MxPresenterListCursor presenterCursor0x80(&m_list0x80); + + while (presenterCursor0x80.Next(presenter)) { + MxDSAction* action = presenter->GetAction(); + + if (action && action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId) + return presenter; + } + + for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { + MxCore* core = *it; + + if (core->IsA("MxPresenter")) { + MxPresenter* presenter = (MxPresenter*) *it; + MxDSAction* action = presenter->GetAction(); + + if (action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId) + return *it; + } + } + return NULL; } diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp index 5d3722c1..6b14b8af 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp @@ -365,22 +365,22 @@ void Infocenter::InitializeBitmaps() { m_radio.Initialize(TRUE); - FUN_10021790(m_atom, c_leftArrowCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_rightArrowCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_infoCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_boatCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_raceCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_pizzaCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_gasCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_medCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_copCtl)->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_leftArrowCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_rightArrowCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_infoCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_boatCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_raceCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_pizzaCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_gasCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_medCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_copCtl))->Enable(TRUE); - FUN_10021790(m_atom, c_mamaCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_papaCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_pepperCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_nickCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_lauraCtl)->Enable(TRUE); - FUN_10021790(m_atom, c_radioCtl)->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_mamaCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_papaCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_pepperCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_nickCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_lauraCtl))->Enable(TRUE); + ((MxPresenter*) FUN_10021790(m_atom, c_radioCtl))->Enable(TRUE); m_mapAreas[0].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Info_A_Bitmap"); m_mapAreas[0].m_unk0x08 = 391; From 88fd1e658d3d680e57468e482d66bf8c221cbfad Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 26 Jan 2024 12:09:59 -0500 Subject: [PATCH 20/34] HelicopterState vtable (#487) * HelicopterState vtable * Move functions --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/include/helicopterstate.h | 11 +++++++++-- LEGO1/lego/legoomni/src/build/helicopterstate.cpp | 14 -------------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/LEGO1/lego/legoomni/include/helicopterstate.h b/LEGO1/lego/legoomni/include/helicopterstate.h index eb104c93..52a92192 100644 --- a/LEGO1/lego/legoomni/include/helicopterstate.h +++ b/LEGO1/lego/legoomni/include/helicopterstate.h @@ -21,8 +21,15 @@ class HelicopterState : public LegoState { return !strcmp(p_name, HelicopterState::ClassName()) || LegoState::IsA(p_name); } - virtual MxBool VTable0x14() override; // vtable+0x14 - virtual MxBool SetFlag() override; // vtable+0x18 + // FUNCTION: LEGO1 0x1000e0b0 + virtual MxBool VTable0x14() override { return FALSE; }; // vtable+0x14 + + // FUNCTION: LEGO1 0x1000e0c0 + virtual MxBool SetFlag() override + { + m_unk0x8 = 0; + return TRUE; + }; // vtable+0x18 inline void SetUnknown8(MxU32 p_unk0x8) { m_unk0x8 = p_unk0x8; } inline MxU32 GetUnkown8() { return m_unk0x8; } diff --git a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp b/LEGO1/lego/legoomni/src/build/helicopterstate.cpp index 368edfad..70d71a0c 100644 --- a/LEGO1/lego/legoomni/src/build/helicopterstate.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopterstate.cpp @@ -1,15 +1 @@ #include "helicopterstate.h" - -// STUB: LEGO1 0x1000e0b0 -MxBool HelicopterState::VTable0x14() -{ - // TODO - return FALSE; -} - -// STUB: LEGO1 0x1000e0c0 -MxBool HelicopterState::SetFlag() -{ - // TODO - return FALSE; -} From 0a672d21468086cc72f0057195bfce263280f6a8 Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Fri, 26 Jan 2024 12:13:09 -0500 Subject: [PATCH 21/34] RaceCar destructor (#488) * RaceCar destructor * Fixes --------- Co-authored-by: Christian Semmler --- LEGO1/lego/legoomni/src/build/racecar.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/LEGO1/lego/legoomni/src/build/racecar.cpp b/LEGO1/lego/legoomni/src/build/racecar.cpp index 02f3a09d..a057b8a4 100644 --- a/LEGO1/lego/legoomni/src/build/racecar.cpp +++ b/LEGO1/lego/legoomni/src/build/racecar.cpp @@ -1,17 +1,21 @@ #include "racecar.h" +#include "legocontrolmanager.h" +#include "legoomni.h" + DECOMP_SIZE_ASSERT(RaceCar, 0x164); // FUNCTION: LEGO1 0x10028200 RaceCar::RaceCar() { - this->m_unk0x13c = 40.0; + m_unk0x13c = 40.0; } -// STUB: LEGO1 0x10028420 +// FUNCTION: LEGO1 0x10028420 RaceCar::~RaceCar() { - // TODO + ControlManager()->Unregister(this); + VTable0xe4(); } // STUB: LEGO1 0x10028490 From b6aac26269f91d53ccf79ff5ce9ff9cd0e205ddf Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 26 Jan 2024 16:00:02 -0500 Subject: [PATCH 22/34] Implement LegoWorld::Find (#489) * Implement LegoWorld::FUN_100213a0 * Rename lists * Rename cursors * Rename cursor * Rename functions * Remove a comment * Rename more functions * Fix return type --- LEGO1/lego/legoomni/include/isle.h | 3 +- .../lego/legoomni/include/legoanimpresenter.h | 2 +- LEGO1/lego/legoomni/include/legoomni.h | 26 +++---- LEGO1/lego/legoomni/include/legoworld.h | 12 +-- LEGO1/lego/legoomni/src/build/helicopter.cpp | 2 +- .../legoomni/src/common/legogamestate.cpp | 6 +- LEGO1/lego/legoomni/src/common/legoutil.cpp | 3 +- LEGO1/lego/legoomni/src/entity/legoentity.cpp | 2 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 76 ++++++++++++++++--- .../src/entity/legoworldpresenter.cpp | 2 +- .../legoomni/src/infocenter/infocenter.cpp | 50 ++++++------ LEGO1/lego/legoomni/src/isle/isle.cpp | 6 +- LEGO1/lego/legoomni/src/main/legoomni.cpp | 31 ++++---- .../legoomni/src/video/legoanimpresenter.cpp | 6 ++ .../src/video/legolocomotionanimpresenter.cpp | 2 +- LEGO1/lego/sources/roi/legoroi.h | 9 ++- LEGO1/omni/include/mxdsobject.h | 1 + LEGO1/omni/include/mxomni.h | 2 +- LEGO1/omni/src/common/mxpresenter.cpp | 2 +- LEGO1/omni/src/main/mxomni.cpp | 2 +- 20 files changed, 154 insertions(+), 91 deletions(-) diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index 681e0337..e91982ee 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -20,7 +20,6 @@ class Act1State; // VTABLE: LEGO1 0x100d6fb8 // SIZE 0x140 -// Radio at 0x12c class Isle : public LegoWorld { public: Isle(); @@ -42,7 +41,7 @@ class Isle : public LegoWorld { virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 virtual void VTable0x50() override; // vtable+50 - virtual void VTable0x58(MxCore* p_object) override; // vtable+58 + virtual void Add(MxCore* p_object) override; // vtable+58 // FUNCTION: LEGO1 0x10030900 virtual MxBool VTable0x5c() override { return TRUE; } // vtable+5c // FUNCTION: LEGO1 0x10033170 diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 94832a61..394147e5 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -40,7 +40,7 @@ class LegoAnimPresenter : public MxVideoPresenter { virtual void PutFrame() override; // vtable+0x6c virtual MxResult VTable0x88(MxStreamChunk* p_chunk); // vtable+0x88 - // 6 more virtual functions here + const char* GetActionObjectName(); protected: void Init(); diff --git a/LEGO1/lego/legoomni/include/legoomni.h b/LEGO1/lego/legoomni/include/legoomni.h index 4265c7d2..2f2622c7 100644 --- a/LEGO1/lego/legoomni/include/legoomni.h +++ b/LEGO1/lego/legoomni/include/legoomni.h @@ -92,18 +92,18 @@ class LegoOmni : public MxOmni { return !strcmp(p_name, LegoOmni::ClassName()) || MxOmni::IsA(p_name); } - virtual void Init() override; // vtable+14 - virtual MxResult Create(MxOmniCreateParam& p_param) override; // vtable+18 - virtual void Destroy() override; // vtable+1c - virtual MxResult Start(MxDSAction* p_dsAction) override; // vtable+20 - virtual void DeleteObject(MxDSAction& p_dsAction) override; // vtable+24 - virtual MxBool DoesEntityExist(MxDSAction& p_dsAction) override; // vtable+28 - virtual MxEntity* FindWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter) override; // vtable+30 - virtual void NotifyCurrentEntity(MxNotificationParam* p_param) override; // vtable+34 - virtual void StartTimer() override; // vtable+38 - virtual void StopTimer() override; // vtable+3c + virtual void Init() override; // vtable+14 + virtual MxResult Create(MxOmniCreateParam& p_param) override; // vtable+18 + virtual void Destroy() override; // vtable+1c + virtual MxResult Start(MxDSAction* p_dsAction) override; // vtable+20 + virtual void DeleteObject(MxDSAction& p_dsAction) override; // vtable+24 + virtual MxBool DoesEntityExist(MxDSAction& p_dsAction) override; // vtable+28 + virtual MxEntity* AddToWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter) override; // vtable+30 + virtual void NotifyCurrentEntity(MxNotificationParam* p_param) override; // vtable+34 + virtual void StartTimer() override; // vtable+38 + virtual void StopTimer() override; // vtable+3c - LegoEntity* FindByEntityIdOrAtomId(const MxAtomId& p_atom, MxS32 p_entityid); + LegoWorld* FindWorld(const MxAtomId& p_atom, MxS32 p_entityid); void AddWorld(LegoWorld* p_world); void FUN_1005b4f0(MxBool p_disable, MxU16 p_flags); @@ -111,7 +111,7 @@ class LegoOmni : public MxOmni { LegoSoundManager* GetSoundManager() { return (LegoSoundManager*) m_soundManager; } LegoInputManager* GetInputManager() { return m_inputMgr; } GifManager* GetGifManager() { return m_gifManager; } - LegoWorld* GetCurrentOmniWorld() { return m_currentWorld; } + LegoWorld* GetCurrentWorld() { return m_currentWorld; } LegoNavController* GetNavController() { return m_navController; } IslePathActor* GetCurrentVehicle() { return m_currentVehicle; } LegoPlantManager* GetLegoPlantManager() { return m_plantManager; } @@ -174,7 +174,7 @@ LegoUnkSaveDataWriter* GetUnkSaveDataWriter(); GifManager* GetGifManager(); void FUN_10015820(MxBool p_disable, MxU16 p_flags); void FUN_10015860(const char*, MxU8); -LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid); +LegoWorld* FindWorld(const MxAtomId& p_atom, MxS32 p_entityid); MxDSAction& GetCurrentAction(); void PlayMusic(MxU32 p_index); diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 72fc69b6..4bc7ab70 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -45,7 +45,7 @@ class LegoWorld : public LegoEntity { virtual void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c virtual void VTable0x50(); // vtable+0x50 virtual LegoCameraController* VTable0x54(); // vtable+0x54 - virtual void VTable0x58(MxCore* p_object); // vtable+0x58 + virtual void Add(MxCore* p_object); // vtable+0x58 virtual MxBool VTable0x5c(); // vtable+0x5c // FUNCTION: LEGO1 0x100010a0 @@ -58,28 +58,28 @@ class LegoWorld : public LegoEntity { inline undefined4 GetUnknown0xec() { return m_unk0xec; } undefined FUN_100220e0(); - void EndAction(MxCore* p_object); + void Remove(MxCore* p_object); void FUN_1001fc80(IslePathActor* p_actor); MxBool FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); MxBool FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); void FUN_10073400(); void FUN_10073430(); MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); - MxPresenter* FindPresenter(const char* p_presenter, const char* p_name); - MxCore* FUN_10021790(const MxAtomId& p_atom, MxS32 p_entityId); + MxCore* Find(const char* p_class, const char* p_name); + MxCore* Find(const MxAtomId& p_atom, MxS32 p_entityId); // SYNTHETIC: LEGO1 0x1001dee0 // LegoWorld::`scalar deleting destructor' protected: LegoPathControllerList m_list0x68; // 0x68 - MxPresenterList m_list0x80; // 0x80 + MxPresenterList m_animPresenters; // 0x80 LegoCameraController* m_cameraController; // 0x98 LegoEntityList* m_entityList; // 0x9c MxCoreList* m_coreList; // 0xa0 undefined m_unk0xa4; // 0xa4 MxPresenterSet m_set0xa8; // 0xa8 - MxPresenterList m_list0xb8; // 0xb8 + MxPresenterList m_controlPresenters; // 0xb8 MxPresenterSet m_set0xd0; // 0xd0 list m_list0xe0; // 0xe0 undefined4 m_unk0xec; // 0xec diff --git a/LEGO1/lego/legoomni/src/build/helicopter.cpp b/LEGO1/lego/legoomni/src/build/helicopter.cpp index adfb1692..3bf55354 100644 --- a/LEGO1/lego/legoomni/src/build/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopter.cpp @@ -41,7 +41,7 @@ MxResult Helicopter::Create(MxDSAction& p_dsAction) } world = GetWorld(); if (world) - world->VTable0x58(this); + world->Add(this); GetState(); return result; } diff --git a/LEGO1/lego/legoomni/src/common/legogamestate.cpp b/LEGO1/lego/legoomni/src/common/legogamestate.cpp index 93a9544b..87466e2b 100644 --- a/LEGO1/lego/legoomni/src/common/legogamestate.cpp +++ b/LEGO1/lego/legoomni/src/common/legogamestate.cpp @@ -398,13 +398,13 @@ void LegoGameState::SetSomeEnumState(undefined4 p_state) // FUNCTION: LEGO1 0x1003ceb0 void LegoGameState::FUN_1003ceb0() { - if (FindEntityByAtomIdOrEntityId(*g_isleScript, 0)) { + if (FindWorld(*g_isleScript, 0)) { m_currentAct = 0; } - else if (FindEntityByAtomIdOrEntityId(*g_act2mainScript, 0)) { + else if (FindWorld(*g_act2mainScript, 0)) { m_currentAct = 1; } - else if (FindEntityByAtomIdOrEntityId(*g_act3Script, 0)) { + else if (FindWorld(*g_act3Script, 0)) { m_currentAct = 2; } else { diff --git a/LEGO1/lego/legoomni/src/common/legoutil.cpp b/LEGO1/lego/legoomni/src/common/legoutil.cpp index fb207f50..843f4abb 100644 --- a/LEGO1/lego/legoomni/src/common/legoutil.cpp +++ b/LEGO1/lego/legoomni/src/common/legoutil.cpp @@ -99,7 +99,8 @@ void InvokeAction(Extra::ActionType p_actionId, MxAtomId& p_pAtom, int p_targetE // FUNCTION: LEGO1 0x1003e670 MxBool CheckIfEntityExists(MxBool p_enable, const char* p_filename, MxS32 p_entityId) { - LegoWorld* world = (LegoWorld*) FindEntityByAtomIdOrEntityId(MxAtomId(p_filename, e_lowerCase2), p_entityId); + LegoWorld* world = FindWorld(MxAtomId(p_filename, e_lowerCase2), p_entityId); + if (world) { world->VTable0x68(p_enable); return TRUE; diff --git a/LEGO1/lego/legoomni/src/entity/legoentity.cpp b/LEGO1/lego/legoomni/src/entity/legoentity.cpp index 2c482715..8ad66afb 100644 --- a/LEGO1/lego/legoomni/src/entity/legoentity.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoentity.cpp @@ -71,7 +71,7 @@ void LegoEntity::SetWorld() { LegoWorld* world = GetCurrentWorld(); if (world != NULL && world != (LegoWorld*) this) { - world->VTable0x58(this); + world->Add(this); } } diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 6cc2363a..c9381197 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -1,5 +1,6 @@ #include "legoworld.h" +#include "legoanimpresenter.h" #include "legocontrolmanager.h" #include "legoinputmanager.h" #include "legoomni.h" @@ -73,7 +74,7 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction) } SetCurrentWorld(this); - ControlManager()->FUN_10028df0(&m_list0xb8); + ControlManager()->FUN_10028df0(&m_controlPresenters); } SetIsWorldActive(TRUE); @@ -95,7 +96,7 @@ MxLong LegoWorld::Notify(MxParam& p_param) switch (((MxNotificationParam&) p_param).GetNotification()) { case c_notificationEndAction: { MxPresenter* presenter = (MxPresenter*) ((MxEndActionNotificationParam&) p_param).GetSender(); - EndAction(presenter); + Remove(presenter); ret = 1; break; } @@ -152,24 +153,75 @@ MxS32 LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value) } // STUB: LEGO1 0x10020220 -void LegoWorld::VTable0x58(MxCore* p_object) +void LegoWorld::Add(MxCore* p_object) { // TODO } // STUB: LEGO1 0x10020f10 -void LegoWorld::EndAction(MxCore* p_object) +void LegoWorld::Remove(MxCore* p_object) { + // TODO } -// STUB: LEGO1 0x100213a0 -MxPresenter* LegoWorld::FindPresenter(const char* p_presenter, const char* p_name) +// FUNCTION: LEGO1 0x100213a0 +MxCore* LegoWorld::Find(const char* p_class, const char* p_name) { - return NULL; + if (!strcmp(p_class, "MxControlPresenter")) { + MxPresenterListCursor cursor(&m_controlPresenters); + MxPresenter* presenter; + + while (cursor.Next(presenter)) { + MxDSAction* action = presenter->GetAction(); + if (!strcmp(action->GetObjectName(), p_name)) + return presenter; + } + + return NULL; + } + else if (!strcmp(p_class, "MxEntity")) { + LegoEntityListCursor cursor(m_entityList); + LegoEntity* entity; + + while (cursor.Next(entity)) { + if (!p_name) + return entity; + + LegoROI* roi = entity->GetROI(); + if (roi && !strcmpi(roi->GetUnknown0xe4(), p_name)) + return entity; + } + + return NULL; + } + else if (!strcmp(p_class, "LegoAnimPresenter")) { + MxPresenterListCursor cursor(&m_animPresenters); + MxPresenter* presenter; + + while (cursor.Next(presenter)) { + if (!strcmpi(((LegoAnimPresenter*) presenter)->GetActionObjectName(), p_name)) + return presenter; + } + + return NULL; + } + else { + for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { + if ((*it)->IsA(p_class) && (*it)->IsA("MxPresenter")) { + MxPresenter* presenter = (MxPresenter*) *it; + MxDSAction* action = presenter->GetAction(); + + if (!strcmp(action->GetObjectName(), p_name)) + return *it; + } + } + + return NULL; + } } // FUNCTION: LEGO1 0x10021790 -MxCore* LegoWorld::FUN_10021790(const MxAtomId& p_atom, MxS32 p_entityId) +MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId) { LegoEntityListCursor entityCursor(m_entityList); LegoEntity* entity; @@ -179,19 +231,19 @@ MxCore* LegoWorld::FUN_10021790(const MxAtomId& p_atom, MxS32 p_entityId) return entity; } - MxPresenterListCursor presenterCursor0xb8(&m_list0xb8); + MxPresenterListCursor controlPresenterCursor(&m_controlPresenters); MxPresenter* presenter; - while (presenterCursor0xb8.Next(presenter)) { + while (controlPresenterCursor.Next(presenter)) { MxDSAction* action = presenter->GetAction(); if (action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId) return presenter; } - MxPresenterListCursor presenterCursor0x80(&m_list0x80); + MxPresenterListCursor animPresenterCursor(&m_animPresenters); - while (presenterCursor0x80.Next(presenter)) { + while (animPresenterCursor.Next(presenter)) { MxDSAction* action = presenter->GetAction(); if (action && action->GetAtomId() == p_atom && action->GetObjectId() == p_entityId) diff --git a/LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp b/LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp index 55f908bd..072da137 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworldpresenter.cpp @@ -165,7 +165,7 @@ void LegoWorldPresenter::VTable0x60(MxPresenter* p_presenter) if (!p_presenter->IsA("LegoAnimPresenter") && !p_presenter->IsA("MxControlPresenter") && !p_presenter->IsA("MxCompositePresenter")) { p_presenter->SendToCompositePresenter(Lego()); - ((LegoWorld*) m_entity)->VTable0x58(p_presenter); + ((LegoWorld*) m_entity)->Add(p_presenter); } } diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp index 6b14b8af..38b95622 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp @@ -305,8 +305,8 @@ void Infocenter::VTable0x50() m_unk0x1d4 = 0; m_unk0x1d6 = 0; - MxStillPresenter* bg = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Background_Bitmap"); - MxStillPresenter* bgRed = (MxStillPresenter*) FindPresenter("MxStillPresenter", "BackgroundRed_Bitmap"); + MxStillPresenter* bg = (MxStillPresenter*) Find("MxStillPresenter", "Background_Bitmap"); + MxStillPresenter* bgRed = (MxStillPresenter*) Find("MxStillPresenter", "BackgroundRed_Bitmap"); switch (GameState()->GetUnknown10()) { case 0: @@ -365,73 +365,73 @@ void Infocenter::InitializeBitmaps() { m_radio.Initialize(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_leftArrowCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_rightArrowCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_infoCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_boatCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_raceCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_pizzaCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_gasCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_medCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_copCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_leftArrowCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_rightArrowCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_infoCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_boatCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_raceCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_pizzaCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_gasCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_medCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_copCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_mamaCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_papaCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_pepperCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_nickCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_lauraCtl))->Enable(TRUE); - ((MxPresenter*) FUN_10021790(m_atom, c_radioCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_mamaCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_papaCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_pepperCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_nickCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_lauraCtl))->Enable(TRUE); + ((MxPresenter*) Find(m_atom, c_radioCtl))->Enable(TRUE); - m_mapAreas[0].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Info_A_Bitmap"); + m_mapAreas[0].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Info_A_Bitmap"); m_mapAreas[0].m_unk0x08 = 391; m_mapAreas[0].m_unk0x0c = 182; m_mapAreas[0].m_unk0x10 = 427; m_mapAreas[0].m_unk0x14 = 230; m_mapAreas[0].m_unk0x04 = 3; - m_mapAreas[1].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Boat_A_Bitmap"); + m_mapAreas[1].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Boat_A_Bitmap"); m_mapAreas[1].m_unk0x08 = 304; m_mapAreas[1].m_unk0x0c = 225; m_mapAreas[1].m_unk0x10 = 350; m_mapAreas[1].m_unk0x14 = 268; m_mapAreas[1].m_unk0x04 = 10; - m_mapAreas[2].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Race_A_Bitmap"); + m_mapAreas[2].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Race_A_Bitmap"); m_mapAreas[2].m_unk0x08 = 301; m_mapAreas[2].m_unk0x0c = 133; m_mapAreas[2].m_unk0x10 = 347; m_mapAreas[2].m_unk0x14 = 181; m_mapAreas[2].m_unk0x04 = 11; - m_mapAreas[3].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Pizza_A_Bitmap"); + m_mapAreas[3].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Pizza_A_Bitmap"); m_mapAreas[3].m_unk0x08 = 289; m_mapAreas[3].m_unk0x0c = 182; m_mapAreas[3].m_unk0x10 = 335; m_mapAreas[3].m_unk0x14 = 225; m_mapAreas[3].m_unk0x04 = 12; - m_mapAreas[4].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Gas_A_Bitmap"); + m_mapAreas[4].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Gas_A_Bitmap"); m_mapAreas[4].m_unk0x10 = 391; m_mapAreas[4].m_unk0x08 = 350; m_mapAreas[4].m_unk0x0c = 161; m_mapAreas[4].m_unk0x14 = 209; m_mapAreas[4].m_unk0x04 = 13; - m_mapAreas[5].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Med_A_Bitmap"); + m_mapAreas[5].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Med_A_Bitmap"); m_mapAreas[5].m_unk0x08 = 392; m_mapAreas[5].m_unk0x0c = 130; m_mapAreas[5].m_unk0x10 = 438; m_mapAreas[5].m_unk0x14 = 176; m_mapAreas[5].m_unk0x04 = 14; - m_mapAreas[6].m_presenter = (MxStillPresenter*) FindPresenter("MxStillPresenter", "Cop_A_Bitmap"); + m_mapAreas[6].m_presenter = (MxStillPresenter*) Find("MxStillPresenter", "Cop_A_Bitmap"); m_mapAreas[6].m_unk0x08 = 396; m_mapAreas[6].m_unk0x0c = 229; m_mapAreas[6].m_unk0x10 = 442; m_mapAreas[6].m_unk0x14 = 272; m_mapAreas[6].m_unk0x04 = 15; - m_frameHotBitmap = (MxStillPresenter*) FindPresenter("MxStillPresenter", "FrameHot_Bitmap"); + m_frameHotBitmap = (MxStillPresenter*) Find("MxStillPresenter", "FrameHot_Bitmap"); FUN_10070dc0(TRUE); } diff --git a/LEGO1/lego/legoomni/src/isle/isle.cpp b/LEGO1/lego/legoomni/src/isle/isle.cpp index 7172a7a6..e26e0797 100644 --- a/LEGO1/lego/legoomni/src/isle/isle.cpp +++ b/LEGO1/lego/legoomni/src/isle/isle.cpp @@ -201,9 +201,9 @@ MxLong Isle::HandleTransitionEnd() } // FUNCTION: LEGO1 0x10032f10 -void Isle::VTable0x58(MxCore* p_object) +void Isle::Add(MxCore* p_object) { - LegoWorld::VTable0x58(p_object); + LegoWorld::Add(p_object); if (p_object->IsA("Pizza")) { m_pizza = (Pizza*) p_object; @@ -246,7 +246,7 @@ void Isle::VTable0x58(MxCore* p_object) // FUNCTION: LEGO1 0x10033050 void Isle::VTable0x6c(IslePathActor* p_actor) { - LegoWorld::EndAction(p_actor); + LegoWorld::Remove(p_actor); if (p_actor->IsA("Helicopter")) { m_helicopter = NULL; diff --git a/LEGO1/lego/legoomni/src/main/legoomni.cpp b/LEGO1/lego/legoomni/src/main/legoomni.cpp index a8d06b89..bd28f071 100644 --- a/LEGO1/lego/legoomni/src/main/legoomni.cpp +++ b/LEGO1/lego/legoomni/src/main/legoomni.cpp @@ -179,7 +179,7 @@ IslePathActor* GetCurrentVehicle() // FUNCTION: LEGO1 0x100157a0 LegoWorld* GetCurrentWorld() { - return LegoOmni::GetInstance()->GetCurrentOmniWorld(); + return LegoOmni::GetInstance()->GetCurrentWorld(); } // FUNCTION: LEGO1 0x100157b0 @@ -219,9 +219,9 @@ void FUN_10015860(const char*, MxU8) } // FUNCTION: LEGO1 0x100158c0 -LegoEntity* FindEntityByAtomIdOrEntityId(const MxAtomId& p_atom, MxS32 p_entityid) +LegoWorld* FindWorld(const MxAtomId& p_atom, MxS32 p_entityid) { - return LegoOmni::GetInstance()->FindByEntityIdOrAtomId(p_atom, p_entityid); + return LegoOmni::GetInstance()->FindWorld(p_atom, p_entityid); } // FUNCTION: LEGO1 0x100158e0 @@ -612,11 +612,11 @@ void LegoOmni::RemoveWorld(const MxAtomId&, MxLong) } // FUNCTION: LEGO1 0x1005b0c0 -LegoEntity* LegoOmni::FindByEntityIdOrAtomId(const MxAtomId& p_atom, MxS32 p_entityid) +LegoWorld* LegoOmni::FindWorld(const MxAtomId& p_atom, MxS32 p_entityid) { if (m_worldList) { - LegoWorld* world; LegoWorldListCursor cursor(m_worldList); + LegoWorld* world; while (cursor.Next(world)) { if ((p_entityid == -1 || world->GetEntityId() == p_entityid) && @@ -635,21 +635,22 @@ void LegoOmni::DeleteObject(MxDSAction& p_dsAction) } // FUNCTION: LEGO1 0x1005b2f0 -MxEntity* LegoOmni::FindWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter) +MxEntity* LegoOmni::AddToWorld(const char* p_id, MxS32 p_entityId, MxPresenter* p_presenter) { - LegoWorld* foundEntity = NULL; + LegoWorld* world = NULL; + if (strcmpi(p_id, g_current)) { - foundEntity = (LegoWorld*) FindByEntityIdOrAtomId(MxAtomId(p_id, e_lowerCase2), p_entityId); + world = FindWorld(MxAtomId(p_id, e_lowerCase2), p_entityId); } else { - foundEntity = this->m_currentWorld; + world = this->m_currentWorld; } - if (foundEntity != NULL) { - foundEntity->VTable0x58(p_presenter); + if (world != NULL) { + world->Add(p_presenter); } - return foundEntity; + return world; } // FUNCTION: LEGO1 0x1005b3a0 @@ -663,7 +664,7 @@ void LegoOmni::NotifyCurrentEntity(MxNotificationParam* p_param) MxBool LegoOmni::DoesEntityExist(MxDSAction& p_dsAction) { if (MxOmni::DoesEntityExist(p_dsAction)) { - if (FindByEntityIdOrAtomId(p_dsAction.GetAtomId(), p_dsAction.GetObjectId()) == NULL) { + if (FindWorld(p_dsAction.GetAtomId(), p_dsAction.GetObjectId()) == NULL) { return TRUE; } } @@ -673,11 +674,11 @@ MxBool LegoOmni::DoesEntityExist(MxDSAction& p_dsAction) // FUNCTION: LEGO1 0x1005b400 MxS32 LegoOmni::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value) { - if (GetCurrentWorld() == NULL) { + if (::GetCurrentWorld() == NULL) { return -1; } - return GetCurrentWorld()->GetCurrPathInfo(p_path, p_value); + return ::GetCurrentWorld()->GetCurrPathInfo(p_path, p_value); } // FUNCTION: LEGO1 0x1005b4f0 diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 0167833d..6da994ec 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -173,6 +173,12 @@ void LegoAnimPresenter::Destroy() Destroy(FALSE); } +// FUNCTION: LEGO1 0x1006b8f0 +const char* LegoAnimPresenter::GetActionObjectName() +{ + return m_action->GetObjectName(); +} + // STUB: LEGO1 0x1006bac0 void LegoAnimPresenter::ParseExtra() { diff --git a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp index db6e6a79..45098aac 100644 --- a/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legolocomotionanimpresenter.cpp @@ -82,7 +82,7 @@ void LegoLocomotionAnimPresenter::ReadyTickle() LegoAnimPresenter::ReadyTickle(); if (m_currentWorld != NULL && m_currentTickleState == e_starting) { - m_currentWorld->VTable0x58(this); + m_currentWorld->Add(this); if (m_compositePresenter != NULL) { SendToCompositePresenter(Lego()); } diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 2fb03c63..9b586353 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -40,6 +40,7 @@ class LegoROI : public ViewROI { void FUN_100a46b0(Matrix4& p_transform); void FUN_100a58f0(Matrix4& p_transform); + inline const char* GetUnknown0xe4() { return m_unk0xe4; } inline LegoEntity* GetUnknown0x104() { return m_unk0x104; } inline void SetUnknown0x104(LegoEntity* p_unk0x104) { m_unk0x104 = p_unk0x104; } @@ -47,9 +48,11 @@ class LegoROI : public ViewROI { // LegoROI::`scalar deleting destructor' private: - undefined m_pad[0x24]; // 0xe0 - LegoEntity* m_unk0x104; // 0x104 - int m_time; // 0x108 + undefined4 m_unk0xe0; // 0xe0 + const char* m_unk0xe4; // 0xe4 + undefined m_unk0xe8[0x1c]; // 0xe8 + LegoEntity* m_unk0x104; // 0x104 + int m_time; // 0x108 }; #endif // LEGOROI_H diff --git a/LEGO1/omni/include/mxdsobject.h b/LEGO1/omni/include/mxdsobject.h index 45a3b360..5fa1d4fb 100644 --- a/LEGO1/omni/include/mxdsobject.h +++ b/LEGO1/omni/include/mxdsobject.h @@ -51,6 +51,7 @@ class MxDSObject : public MxCore { inline Type GetType() const { return (Type) this->m_type; } inline const char* GetSourceName() const { return this->m_sourceName; } + inline const char* GetObjectName() const { return this->m_objectName; } inline MxU32 GetObjectId() { return this->m_objectId; } inline const MxAtomId& GetAtomId() { return this->m_atomId; } inline MxS16 GetUnknown24() { return this->m_unk0x24; } diff --git a/LEGO1/omni/include/mxomni.h b/LEGO1/omni/include/mxomni.h index d92f2b38..9ba344b7 100644 --- a/LEGO1/omni/include/mxomni.h +++ b/LEGO1/omni/include/mxomni.h @@ -48,7 +48,7 @@ class MxOmni : public MxCore { virtual void DeleteObject(MxDSAction& p_dsAction); // vtable+24 virtual MxBool DoesEntityExist(MxDSAction& p_dsAction); // vtable+28 virtual MxResult CreatePresenter(MxStreamController* p_controller, MxDSAction& p_action); // vtable+2c - virtual MxEntity* FindWorld(const char*, MxS32, MxPresenter*); // vtable+30 + virtual MxEntity* AddToWorld(const char*, MxS32, MxPresenter*); // vtable+30 virtual void NotifyCurrentEntity(MxNotificationParam* p_param); // vtable+34 virtual void StartTimer(); // vtable+38 virtual void StopTimer(); // vtable+3c diff --git a/LEGO1/omni/src/common/mxpresenter.cpp b/LEGO1/omni/src/common/mxpresenter.cpp index 9d074278..ab803493 100644 --- a/LEGO1/omni/src/common/mxpresenter.cpp +++ b/LEGO1/omni/src/common/mxpresenter.cpp @@ -94,7 +94,7 @@ void MxPresenter::ParseExtra() token = strtok(NULL, g_parseExtraTokens); MxS32 val = token ? atoi(token) : 0; - MxEntity* result = MxOmni::GetInstance()->FindWorld(buf, val, this); + MxEntity* result = MxOmni::GetInstance()->AddToWorld(buf, val, this); m_action->SetFlags(m_action->GetFlags() | MxDSAction::c_world); diff --git a/LEGO1/omni/src/main/mxomni.cpp b/LEGO1/omni/src/main/mxomni.cpp index f9fa5733..2b266b3b 100644 --- a/LEGO1/omni/src/main/mxomni.cpp +++ b/LEGO1/omni/src/main/mxomni.cpp @@ -113,7 +113,7 @@ MxOmni::MxOmni() } // FUNCTION: LEGO1 0x100aefb0 -MxEntity* MxOmni::FindWorld(const char*, MxS32, MxPresenter*) +MxEntity* MxOmni::AddToWorld(const char*, MxS32, MxPresenter*) { return NULL; } From 7b6ec235d8ad97c461c8ed46c4a058776d2be352 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 26 Jan 2024 17:52:03 -0500 Subject: [PATCH 23/34] Implement LegoWorld::Add (#490) * LegoWorld::Add * Add annotations * Fix include guard * Make stub * Change MxPresenterSet to MxCoreSet * Improve match * Match * Fix annotation --- .../lego/legoomni/include/legoanimpresenter.h | 5 + .../legoomni/include/legocachesoundlist.h | 98 +++++++++++++++++++ LEGO1/lego/legoomni/include/legoentitylist.h | 3 + LEGO1/lego/legoomni/include/legoutil.h | 2 + LEGO1/lego/legoomni/include/legoworld.h | 79 ++++++++++----- LEGO1/lego/legoomni/src/common/legoutil.cpp | 6 ++ LEGO1/lego/legoomni/src/entity/legoworld.cpp | 77 +++++++++++++-- LEGO1/omni/include/mxcorelist.h | 95 ------------------ LEGO1/omni/include/mxpresenterlist.h | 3 + 9 files changed, 236 insertions(+), 132 deletions(-) create mode 100644 LEGO1/lego/legoomni/include/legocachesoundlist.h delete mode 100644 LEGO1/omni/include/mxcorelist.h diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 394147e5..2ca9c910 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -40,6 +40,8 @@ class LegoAnimPresenter : public MxVideoPresenter { virtual void PutFrame() override; // vtable+0x6c virtual MxResult VTable0x88(MxStreamChunk* p_chunk); // vtable+0x88 + inline LegoAnimClass* GetUnknown0x64() { return m_unk0x64; } + const char* GetActionObjectName(); protected: @@ -101,6 +103,9 @@ class LegoAnimClass : public LegoAnimClassBase { virtual void VTable0xc() override; // vtable+0x0c virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10 + inline MxLong GetUnknown0x8() { return m_unk0x8; } + + // private: MxLong m_unk0x8; // 0x08 undefined4 m_unk0xc; // 0x0c undefined4 m_unk0x10; // 0x10 diff --git a/LEGO1/lego/legoomni/include/legocachesoundlist.h b/LEGO1/lego/legoomni/include/legocachesoundlist.h new file mode 100644 index 00000000..13d8f96c --- /dev/null +++ b/LEGO1/lego/legoomni/include/legocachesoundlist.h @@ -0,0 +1,98 @@ +#ifndef LEGOCACHESOUNDLIST_H +#define LEGOCACHESOUNDLIST_H + +#include "mxlist.h" +#include "mxtypes.h" + +class LegoCacheSound; + +// VTABLE: LEGO1 0x100d63b0 +// class MxCollection + +// VTABLE: LEGO1 0x100d63c8 +// class MxList + +// VTABLE: LEGO1 0x100d63e0 +// class MxPtrList + +// VTABLE: LEGO1 0x100d63f8 +// SIZE 0x18 +class LegoCacheSoundList : public MxPtrList { +public: + LegoCacheSoundList(MxBool p_ownership = FALSE) : MxPtrList(p_ownership) {} + + // FUNCTION: LEGO1 0x1001e650 + virtual MxS8 Compare(LegoCacheSound* p_a, LegoCacheSound* p_b) override + { + return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; + }; // vtable+0x14 +}; + +// VTABLE: LEGO1 0x100d64a0 +// class MxListCursor + +// VTABLE: LEGO1 0x100d6500 +// class MxPtrListCursor + +// VTABLE: LEGO1 0x100d6518 +// SIZE 0x10 +class LegoCacheSoundListCursor : public MxPtrListCursor { +public: + LegoCacheSoundListCursor(LegoCacheSoundList* p_list) : MxPtrListCursor(p_list){}; +}; + +// TEMPLATE: LEGO1 0x1001e670 +// MxCollection::Compare + +// TEMPLATE: LEGO1 0x1001e680 +// MxCollection::~MxCollection + +// TEMPLATE: LEGO1 0x1001e6d0 +// MxCollection::Destroy + +// TEMPLATE: LEGO1 0x1001e6e0 +// MxList::~MxList + +// TEMPLATE: LEGO1 0x1001e770 +// MxPtrList::Destroy + +// SYNTHETIC: LEGO1 0x1001e780 +// LegoCacheSoundList::`scalar deleting destructor' + +// TEMPLATE: LEGO1 0x1001e7f0 +// MxPtrList::~MxPtrList + +// SYNTHETIC: LEGO1 0x1001e840 +// MxCollection::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1001e8b0 +// MxList::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1001e960 +// MxPtrList::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1001f350 +// LegoCacheSoundListCursor::`scalar deleting destructor' + +// FUNCTION: LEGO1 0x1001f3c0 +// MxPtrListCursor::~MxPtrListCursor + +// SYNTHETIC: LEGO1 0x1001f410 +// MxListCursor::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1001f480 +// MxPtrListCursor::`scalar deleting destructor' + +// FUNCTION: LEGO1 0x1001f4f0 +// MxListCursor::~MxListCursor + +// FUNCTION: LEGO1 0x1001f540 +// LegoCacheSoundListCursor::~LegoCacheSoundListCursor + +// TEMPLATE: LEGO1 0x10020840 +// MxListCursor::MxListCursor + +// TEMPLATE: LEGO1 0x100224e0 +// MxList::InsertEntry + +#endif // LEGOCACHESOUNDLIST_H diff --git a/LEGO1/lego/legoomni/include/legoentitylist.h b/LEGO1/lego/legoomni/include/legoentitylist.h index 04935769..4f212279 100644 --- a/LEGO1/lego/legoomni/include/legoentitylist.h +++ b/LEGO1/lego/legoomni/include/legoentitylist.h @@ -92,4 +92,7 @@ class LegoEntityListCursor : public MxPtrListCursor { // TEMPLATE: LEGO1 0x100207d0 // MxListCursor::MxListCursor +// TEMPLATE: LEGO1 0x10022430 +// MxList::InsertEntry + #endif // LEGOENTITYLIST_H diff --git a/LEGO1/lego/legoomni/include/legoutil.h b/LEGO1/lego/legoomni/include/legoutil.h index 6e9bb5ee..75e51c20 100644 --- a/LEGO1/lego/legoomni/include/legoutil.h +++ b/LEGO1/lego/legoomni/include/legoutil.h @@ -9,7 +9,9 @@ class MxAtomId; class LegoEntity; +class LegoAnimPresenter; +void FUN_1003e050(LegoAnimPresenter* p_presenter); Extra::ActionType MatchActionString(const char*); void InvokeAction(Extra::ActionType p_actionId, MxAtomId& p_pAtom, int p_targetEntityId, LegoEntity* p_sender); void ConvertHSVToRGB(float p_h, float p_s, float p_v, float* p_rOut, float* p_bOut, float* p_gOut); diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 4bc7ab70..074728e3 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -1,22 +1,24 @@ #ifndef LEGOWORLD_H #define LEGOWORLD_H +#include "legocachesound.h" +#include "legocachesoundlist.h" #include "legocameracontroller.h" #include "legoentity.h" #include "legoentitylist.h" #include "legopathcontrollerlist.h" -#include "mxcorelist.h" #include "mxpresenter.h" #include "mxpresenterlist.h" class IslePathActor; class LegoPathBoundary; +class LegoHideAnimPresenter; -struct PresenterSetCompare { - MxS32 operator()(MxPresenter* const& p_a, MxPresenter* const& p_b) const { return p_a > p_b; } +struct CoreSetCompare { + MxS32 operator()(MxCore* const& p_a, MxCore* const& p_b) const { return p_a > p_b; } }; -typedef set MxPresenterSet; +typedef set MxCoreSet; // VTABLE: LEGO1 0x100d6280 // SIZE 0xf8 @@ -72,38 +74,38 @@ class LegoWorld : public LegoEntity { // LegoWorld::`scalar deleting destructor' protected: - LegoPathControllerList m_list0x68; // 0x68 - MxPresenterList m_animPresenters; // 0x80 - LegoCameraController* m_cameraController; // 0x98 - LegoEntityList* m_entityList; // 0x9c - MxCoreList* m_coreList; // 0xa0 - undefined m_unk0xa4; // 0xa4 - MxPresenterSet m_set0xa8; // 0xa8 - MxPresenterList m_controlPresenters; // 0xb8 - MxPresenterSet m_set0xd0; // 0xd0 - list m_list0xe0; // 0xe0 - undefined4 m_unk0xec; // 0xec - undefined4 m_unk0xf0; // 0xf0 - MxS16 m_unk0xf4; // 0xf4 - MxBool m_worldStarted; // 0xf6 - undefined m_unk0xf7; // 0xf7 + LegoPathControllerList m_list0x68; // 0x68 + MxPresenterList m_animPresenters; // 0x80 + LegoCameraController* m_cameraController; // 0x98 + LegoEntityList* m_entityList; // 0x9c + LegoCacheSoundList* m_cacheSoundList; // 0xa0 + undefined m_unk0xa4; // 0xa4 + MxCoreSet m_set0xa8; // 0xa8 + MxPresenterList m_controlPresenters; // 0xb8 + MxCoreSet m_set0xd0; // 0xd0 + list m_list0xe0; // 0xe0 + undefined4 m_unk0xec; // 0xec + LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0 + MxS16 m_unk0xf4; // 0xf4 + MxBool m_worldStarted; // 0xf6 + undefined m_unk0xf7; // 0xf7 }; // clang-format off // TEMPLATE: LEGO1 0x1001d780 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::~_Tree >::_Kfn,PresenterSetCompare,allocator > +// _Tree >::_Kfn,CoreSetCompare,allocator >::~_Tree >::_Kfn,CoreSetCompare,allocator > // TEMPLATE: LEGO1 0x1001d850 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::iterator::_Inc +// _Tree >::_Kfn,CoreSetCompare,allocator >::iterator::_Inc // TEMPLATE: LEGO1 0x1001d890 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::erase +// _Tree >::_Kfn,CoreSetCompare,allocator >::erase // TEMPLATE: LEGO1 0x1001dcf0 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Erase +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Erase // TEMPLATE: LEGO1 0x1001dd30 -// _Tree >::_Kfn,PresenterSetCompare,allocator >::_Init +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Init // TEMPLATE: LEGO1 0x1001ddf0 // list >::~list > @@ -115,10 +117,10 @@ class LegoWorld : public LegoEntity { // list >::_Buynode // TEMPLATE: LEGO1 0x1001de90 -// set >::~set > +// set >::~set > // TEMPLATE: LEGO1 0x1001df00 -// Set::~Set +// Set::~Set // SYNTHETIC: LEGO1 0x1001eed0 // MxPresenterListCursor::`scalar deleting destructor' @@ -141,8 +143,31 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x10020760 // MxListCursor::MxListCursor +// TEMPLATE: LEGO1 0x100208b0 +// _Tree >::_Kfn,CoreSetCompare,allocator >::insert + +// TEMPLATE: LEGO1 0x10020b20 +// _Tree >::_Kfn,CoreSetCompare,allocator >::iterator::_Dec + +// XTEMPLATE LEGO1 0x10020b70 + +// TEMPLATE: LEGO1 0x10020bb0 +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Buynode + +// TEMPLATE: LEGO1 0x10020bd0 +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Insert + +// TEMPLATE: LEGO1 0x10020e50 +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Lrotate + +// TEMPLATE: LEGO1 0x10020eb0 +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Rrotate + +// TEMPLATE: LEGO1 0x10022360 +// _Construct + // GLOBAL: LEGO1 0x100f11a0 -// _Tree>::_Kfn,PresenterSetCompare,allocator >::_Nil +// _Tree >::_Kfn,CoreSetCompare,allocator >::_Nil // clang-format on #endif // LEGOWORLD_H diff --git a/LEGO1/lego/legoomni/src/common/legoutil.cpp b/LEGO1/lego/legoomni/src/common/legoutil.cpp index 843f4abb..dfb4b740 100644 --- a/LEGO1/lego/legoomni/src/common/legoutil.cpp +++ b/LEGO1/lego/legoomni/src/common/legoutil.cpp @@ -10,6 +10,12 @@ #include #include +// STUB: LEGO1 0x1003e050 +void FUN_1003e050(LegoAnimPresenter* p_presenter) +{ + // TODO +} + // FUNCTION: LEGO1 0x1003e300 Extra::ActionType MatchActionString(const char* p_str) { diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index c9381197..a39a957e 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -15,8 +15,8 @@ DECOMP_SIZE_ASSERT(LegoWorld, 0xf8) DECOMP_SIZE_ASSERT(LegoEntityList, 0x18) DECOMP_SIZE_ASSERT(LegoEntityListCursor, 0x10) -DECOMP_SIZE_ASSERT(MxCoreList, 0x18) -DECOMP_SIZE_ASSERT(MxCoreListCursor, 0x10) +DECOMP_SIZE_ASSERT(LegoCacheSoundList, 0x18) +DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10) // FUNCTION: LEGO1 0x1001ca40 LegoWorld::LegoWorld() : m_list0x68(TRUE) @@ -24,9 +24,9 @@ LegoWorld::LegoWorld() : m_list0x68(TRUE) m_unk0xf4 = 4; m_cameraController = NULL; m_entityList = NULL; - m_coreList = NULL; + m_cacheSoundList = NULL; m_unk0xa4 = 0; // MxBool? - m_unk0xf0 = 0; + m_hideAnimPresenter = NULL; m_worldStarted = FALSE; NotificationManager()->Register(this); @@ -60,9 +60,9 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction) if (!m_entityList) return FAILURE; - m_coreList = new MxCoreList(TRUE); + m_cacheSoundList = new LegoCacheSoundList(TRUE); - if (!m_coreList) + if (!m_cacheSoundList) return FAILURE; if (!VTable0x54()) @@ -152,10 +152,67 @@ MxS32 LegoWorld::GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value) return 0; } -// STUB: LEGO1 0x10020220 +// FUNCTION: LEGO1 0x10020220 void LegoWorld::Add(MxCore* p_object) { - // TODO + if (p_object && !p_object->IsA("LegoWorld") && !p_object->IsA("LegoWorldPresenter")) { + if (p_object->IsA("LegoAnimPresenter")) { + LegoAnimPresenter* animPresenter = (LegoAnimPresenter*) p_object; + + if (!strcmpi(animPresenter->GetAction()->GetObjectName(), "ConfigAnimation")) { + FUN_1003e050(animPresenter); + animPresenter->GetAction()->SetDuration(animPresenter->GetUnknown0x64()->GetUnknown0x8()); + } + } + + if (p_object->IsA("MxControlPresenter")) { + MxPresenterListCursor cursor(&m_controlPresenters); + + if (cursor.Find((MxPresenter*) p_object)) + return; + + m_controlPresenters.Append((MxPresenter*) p_object); + } + else if (p_object->IsA("MxEntity")) { + LegoEntityListCursor cursor(m_entityList); + + if (cursor.Find((LegoEntity*) p_object)) + return; + + m_entityList->Append((LegoEntity*) p_object); + } + else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) { + MxPresenterListCursor cursor(&m_animPresenters); + + if (cursor.Find((MxPresenter*) p_object)) + return; + + ((MxPresenter*) p_object)->SendToCompositePresenter(Lego()); + m_animPresenters.Append(((MxPresenter*) p_object)); + + if (p_object->IsA("LegoHideAnimPresenter")) + m_hideAnimPresenter = (LegoHideAnimPresenter*) p_object; + } + else if (p_object->IsA("LegoCacheSound")) { + LegoCacheSoundListCursor cursor(m_cacheSoundList); + + if (cursor.Find((LegoCacheSound*) p_object)) + return; + + m_cacheSoundList->Append((LegoCacheSound*) p_object); + } + else { + if (m_set0xa8.find(p_object) == m_set0xa8.end()) + m_set0xa8.insert(p_object); + } + + if (!m_set0xd0.empty() && p_object->IsA("MxPresenter")) { + if (((MxPresenter*) p_object)->IsEnabled()) { + ((MxPresenter*) p_object)->Enable(FALSE); + m_set0xd0.insert(p_object); + } + } + } } // STUB: LEGO1 0x10020f10 @@ -206,7 +263,7 @@ MxCore* LegoWorld::Find(const char* p_class, const char* p_name) return NULL; } else { - for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { + for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { if ((*it)->IsA(p_class) && (*it)->IsA("MxPresenter")) { MxPresenter* presenter = (MxPresenter*) *it; MxDSAction* action = presenter->GetAction(); @@ -250,7 +307,7 @@ MxCore* LegoWorld::Find(const MxAtomId& p_atom, MxS32 p_entityId) return presenter; } - for (MxPresenterSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { + for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { MxCore* core = *it; if (core->IsA("MxPresenter")) { diff --git a/LEGO1/omni/include/mxcorelist.h b/LEGO1/omni/include/mxcorelist.h deleted file mode 100644 index 15ae7c9b..00000000 --- a/LEGO1/omni/include/mxcorelist.h +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef MXCORELIST_H -#define MXCORELIST_H - -#include "mxlist.h" -#include "mxtypes.h" - -class MxCore; - -// VTABLE: LEGO1 0x100d63b0 -// class MxCollection - -// VTABLE: LEGO1 0x100d63c8 -// class MxList - -// VTABLE: LEGO1 0x100d63e0 -// class MxPtrList - -// VTABLE: LEGO1 0x100d63f8 -// SIZE 0x18 -class MxCoreList : public MxPtrList { -public: - MxCoreList(MxBool p_ownership = FALSE) : MxPtrList(p_ownership) {} - - // FUNCTION: LEGO1 0x1001e650 - virtual MxS8 Compare(MxCore* p_a, MxCore* p_b) override - { - return p_a == p_b ? 0 : p_a < p_b ? -1 : 1; - }; // vtable+0x14 -}; - -// VTABLE: LEGO1 0x100d64a0 -// class MxListCursor - -// VTABLE: LEGO1 0x100d6500 -// class MxPtrListCursor - -// VTABLE: LEGO1 0x100d6518 -// SIZE 0x10 -class MxCoreListCursor : public MxPtrListCursor { -public: - MxCoreListCursor(MxCoreList* p_list) : MxPtrListCursor(p_list){}; -}; - -// TEMPLATE: LEGO1 0x1001e670 -// MxCollection::Compare - -// TEMPLATE: LEGO1 0x1001e680 -// MxCollection::~MxCollection - -// TEMPLATE: LEGO1 0x1001e6d0 -// MxCollection::Destroy - -// TEMPLATE: LEGO1 0x1001e6e0 -// MxList::~MxList - -// TEMPLATE: LEGO1 0x1001e770 -// MxPtrList::Destroy - -// SYNTHETIC: LEGO1 0x1001e780 -// MxCoreList::`scalar deleting destructor' - -// TEMPLATE: LEGO1 0x1001e7f0 -// MxPtrList::~MxPtrList - -// SYNTHETIC: LEGO1 0x1001e840 -// MxCollection::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1001e8b0 -// MxList::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1001e960 -// MxPtrList::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1001f350 -// MxCoreListCursor::`scalar deleting destructor' - -// FUNCTION: LEGO1 0x1001f3c0 -// MxPtrListCursor::~MxPtrListCursor - -// SYNTHETIC: LEGO1 0x1001f410 -// MxListCursor::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1001f480 -// MxPtrListCursor::`scalar deleting destructor' - -// FUNCTION: LEGO1 0x1001f4f0 -// MxListCursor::~MxListCursor - -// FUNCTION: LEGO1 0x1001f540 -// MxCoreListCursor::~MxCoreListCursor - -// TEMPLATE: LEGO1 0x10020840 -// MxListCursor::MxListCursor - -#endif // MXCORELIST_H diff --git a/LEGO1/omni/include/mxpresenterlist.h b/LEGO1/omni/include/mxpresenterlist.h index a029a4cf..238dedfb 100644 --- a/LEGO1/omni/include/mxpresenterlist.h +++ b/LEGO1/omni/include/mxpresenterlist.h @@ -71,4 +71,7 @@ class MxPresenterListCursor : public MxPtrListCursor { // SYNTHETIC: LEGO1 0x1001d100 // MxPresenterList::~MxPresenterList +// TEMPLATE: LEGO1 0x10022380 +// MxList::InsertEntry + #endif // MXPRESENTERLIST_H From 4df7dee037771e6641e9e6e5eafd4f804d3240ad Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 27 Jan 2024 10:10:09 -0500 Subject: [PATCH 24/34] Implement/match LegoWorld::Remove (#491) * Implement/match LegoWorld::Remove * Fix comparison * Match 100% --- .../legoomni/include/legocachesoundlist.h | 10 +++- LEGO1/lego/legoomni/include/legoentitylist.h | 3 ++ LEGO1/lego/legoomni/include/legoworld.h | 26 ++-------- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 52 ++++++++++++++++++- LEGO1/omni/include/mxpresenterlist.h | 24 +++++++++ 5 files changed, 89 insertions(+), 26 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocachesoundlist.h b/LEGO1/lego/legoomni/include/legocachesoundlist.h index 13d8f96c..c97d578f 100644 --- a/LEGO1/lego/legoomni/include/legocachesoundlist.h +++ b/LEGO1/lego/legoomni/include/legocachesoundlist.h @@ -74,7 +74,7 @@ class LegoCacheSoundListCursor : public MxPtrListCursor { // SYNTHETIC: LEGO1 0x1001f350 // LegoCacheSoundListCursor::`scalar deleting destructor' -// FUNCTION: LEGO1 0x1001f3c0 +// TEMPLATE: LEGO1 0x1001f3c0 // MxPtrListCursor::~MxPtrListCursor // SYNTHETIC: LEGO1 0x1001f410 @@ -83,7 +83,7 @@ class LegoCacheSoundListCursor : public MxPtrListCursor { // SYNTHETIC: LEGO1 0x1001f480 // MxPtrListCursor::`scalar deleting destructor' -// FUNCTION: LEGO1 0x1001f4f0 +// TEMPLATE: LEGO1 0x1001f4f0 // MxListCursor::~MxListCursor // FUNCTION: LEGO1 0x1001f540 @@ -95,4 +95,10 @@ class LegoCacheSoundListCursor : public MxPtrListCursor { // TEMPLATE: LEGO1 0x100224e0 // MxList::InsertEntry +// TEMPLATE: LEGO1 0x10022590 +// MxListCursor::Find + +// TEMPLATE: LEGO1 0x10022680 +// MxList::DeleteEntry + #endif // LEGOCACHESOUNDLIST_H diff --git a/LEGO1/lego/legoomni/include/legoentitylist.h b/LEGO1/lego/legoomni/include/legoentitylist.h index 4f212279..aa691da8 100644 --- a/LEGO1/lego/legoomni/include/legoentitylist.h +++ b/LEGO1/lego/legoomni/include/legoentitylist.h @@ -95,4 +95,7 @@ class LegoEntityListCursor : public MxPtrListCursor { // TEMPLATE: LEGO1 0x10022430 // MxList::InsertEntry +// TEMPLATE: LEGO1 0x10022630 +// MxList::DeleteEntry + #endif // LEGOENTITYLIST_H diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 074728e3..51b47fbf 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -15,7 +15,7 @@ class LegoPathBoundary; class LegoHideAnimPresenter; struct CoreSetCompare { - MxS32 operator()(MxCore* const& p_a, MxCore* const& p_b) const { return p_a > p_b; } + MxS32 operator()(MxCore* const& p_a, MxCore* const& p_b) const { return (MxS32) p_a < (MxS32) p_b; } }; typedef set MxCoreSet; @@ -122,27 +122,6 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x1001df00 // Set::~Set -// SYNTHETIC: LEGO1 0x1001eed0 -// MxPresenterListCursor::`scalar deleting destructor' - -// TEMPLATE: LEGO1 0x1001ef40 -// MxPtrListCursor::~MxPtrListCursor - -// SYNTHETIC: LEGO1 0x1001ef90 -// MxListCursor::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1001f000 -// MxPtrListCursor::`scalar deleting destructor' - -// TEMPLATE: LEGO1 0x1001f070 -// MxListCursor::~MxListCursor - -// FUNCTION: LEGO1 0x1001f0c0 -// MxPresenterListCursor::~MxPresenterListCursor - -// TEMPLATE: LEGO1 0x10020760 -// MxListCursor::MxListCursor - // TEMPLATE: LEGO1 0x100208b0 // _Tree >::_Kfn,CoreSetCompare,allocator >::insert @@ -163,6 +142,9 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x10020eb0 // _Tree >::_Kfn,CoreSetCompare,allocator >::_Rrotate +// TEMPLATE: LEGO1 0x10021340 +// _Tree >::_Kfn,CoreSetCompare,allocator >::find + // TEMPLATE: LEGO1 0x10022360 // _Construct diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index a39a957e..7454e5cd 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -7,6 +7,7 @@ #include "legoutil.h" #include "legovideomanager.h" #include "mxactionnotificationparam.h" +#include "mxcontrolpresenter.h" #include "mxnotificationmanager.h" #include "mxnotificationparam.h" #include "mxomni.h" @@ -215,10 +216,57 @@ void LegoWorld::Add(MxCore* p_object) } } -// STUB: LEGO1 0x10020f10 +// FUNCTION: LEGO1 0x10020f10 void LegoWorld::Remove(MxCore* p_object) { - // TODO + if (p_object) { + MxCoreSet::iterator it; + + if (p_object->IsA("MxControlPresenter")) { + MxPresenterListCursor cursor(&m_controlPresenters); + + if (cursor.Find((MxControlPresenter*) p_object)) { + cursor.Detach(); + ((MxControlPresenter*) p_object)->GetAction()->SetOrigin(Lego()); + ((MxControlPresenter*) p_object)->VTable0x68(TRUE); + } + } + else if (p_object->IsA("LegoLocomotionAnimPresenter") || p_object->IsA("LegoHideAnimPresenter") || p_object->IsA("LegoLoopingAnimPresenter")) { + MxPresenterListCursor cursor(&m_animPresenters); + + if (cursor.Find((MxPresenter*) p_object)) + cursor.Detach(); + + if (p_object->IsA("LegoHideAnimPresenter")) + m_hideAnimPresenter = NULL; + } + else if (p_object->IsA("MxEntity")) { + if (p_object->IsA("LegoPathActor")) + FUN_1001fc80((IslePathActor*) p_object); + + if (m_entityList) { + LegoEntityListCursor cursor(m_entityList); + + if (cursor.Find((LegoEntity*) p_object)) + cursor.Detach(); + } + } + else if (p_object->IsA("LegoCacheSound")) { + LegoCacheSoundListCursor cursor(m_cacheSoundList); + + if (cursor.Find((LegoCacheSound*) p_object)) + cursor.Detach(); + } + else { + it = m_set0xa8.find(p_object); + if (it != m_set0xa8.end()) + m_set0xa8.erase(it); + } + + it = m_set0xd0.find(p_object); + if (it != m_set0xd0.end()) + m_set0xd0.erase(it); + } } // FUNCTION: LEGO1 0x100213a0 diff --git a/LEGO1/omni/include/mxpresenterlist.h b/LEGO1/omni/include/mxpresenterlist.h index 238dedfb..8b22a18b 100644 --- a/LEGO1/omni/include/mxpresenterlist.h +++ b/LEGO1/omni/include/mxpresenterlist.h @@ -71,7 +71,31 @@ class MxPresenterListCursor : public MxPtrListCursor { // SYNTHETIC: LEGO1 0x1001d100 // MxPresenterList::~MxPresenterList +// SYNTHETIC: LEGO1 0x1001eed0 +// MxPresenterListCursor::`scalar deleting destructor' + +// TEMPLATE: LEGO1 0x1001ef40 +// MxPtrListCursor::~MxPtrListCursor + +// SYNTHETIC: LEGO1 0x1001ef90 +// MxListCursor::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1001f000 +// MxPtrListCursor::`scalar deleting destructor' + +// TEMPLATE: LEGO1 0x1001f070 +// MxListCursor::~MxListCursor + +// FUNCTION: LEGO1 0x1001f0c0 +// MxPresenterListCursor::~MxPresenterListCursor + +// TEMPLATE: LEGO1 0x10020760 +// MxListCursor::MxListCursor + // TEMPLATE: LEGO1 0x10022380 // MxList::InsertEntry +// TEMPLATE: LEGO1 0x100225e0 +// MxList::DeleteEntry + #endif // MXPRESENTERLIST_H From 883f3429a73dd79a0902478c5897ff55f2a7c685 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 27 Jan 2024 11:48:50 -0500 Subject: [PATCH 25/34] Implement/match LegoWorld::Destroy (and destructor) (#492) * Implement/match LegoWorld::Destroy * Match * Match --- CMakeLists.txt | 1 + .../legoomni/include/legobuildingmanager.h | 1 + LEGO1/lego/legoomni/include/legoentity.h | 4 +- .../include/legolocomotionanimpresenter.h | 8 ++ .../lego/legoomni/include/legoplantmanager.h | 1 + .../lego/legoomni/include/legosoundmanager.h | 7 +- .../legoomni/include/legounknown100d6b4c.h | 15 +++ LEGO1/lego/legoomni/include/legoworld.h | 5 +- .../src/audio/legounknown100d6b4c.cpp | 7 + .../src/build/legobuildingmanager.cpp | 6 + .../legoomni/src/common/legoplantmanager.cpp | 6 + LEGO1/lego/legoomni/src/entity/legoworld.cpp | 125 +++++++++++++++++- 12 files changed, 177 insertions(+), 9 deletions(-) create mode 100644 LEGO1/lego/legoomni/include/legounknown100d6b4c.h create mode 100644 LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index da1c41f6..388c4777 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -225,6 +225,7 @@ add_library(lego1 SHARED LEGO1/lego/legoomni/src/audio/legocachesound.cpp LEGO1/lego/legoomni/src/audio/legoloadcachesoundpresenter.cpp LEGO1/lego/legoomni/src/audio/legosoundmanager.cpp + LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp LEGO1/lego/legoomni/src/audio/mxbackgroundaudiomanager.cpp LEGO1/lego/legoomni/src/build/buildingentity.cpp LEGO1/lego/legoomni/src/build/dunebuggy.cpp diff --git a/LEGO1/lego/legoomni/include/legobuildingmanager.h b/LEGO1/lego/legoomni/include/legobuildingmanager.h index d96d9583..7bde7ad9 100644 --- a/LEGO1/lego/legoomni/include/legobuildingmanager.h +++ b/LEGO1/lego/legoomni/include/legobuildingmanager.h @@ -22,6 +22,7 @@ class LegoBuildingManager : public MxCore { static void configureLegoBuildingManager(MxS32); void FUN_1002fa00(); + void FUN_1002fb30(); // SYNTHETIC: LEGO1 0x1002f940 // LegoBuildingManager::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legoentity.h b/LEGO1/lego/legoomni/include/legoentity.h index 12b1ecf1..99813972 100644 --- a/LEGO1/lego/legoomni/include/legoentity.h +++ b/LEGO1/lego/legoomni/include/legoentity.h @@ -13,7 +13,8 @@ class LegoEntity : public MxEntity { public: enum { - c_bit1 = 0x01 + c_bit1 = 0x01, + c_bit2 = 0x02 }; // Inlined at 0x100853f7 @@ -58,6 +59,7 @@ class LegoEntity : public MxEntity { void SetLocation(Mx3DPointFloat& p_location, Mx3DPointFloat& p_direction, Mx3DPointFloat& p_up, MxBool); inline LegoROI* GetROI() { return m_roi; } + inline MxU8 GetFlags() { return m_flags; } protected: void Init(); diff --git a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h index cb7e3334..ab3da3eb 100644 --- a/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legolocomotionanimpresenter.h @@ -35,6 +35,14 @@ class LegoLocomotionAnimPresenter : public LegoLoopingAnimPresenter { // SYNTHETIC: LEGO1 0x1006cfe0 // LegoLocomotionAnimPresenter::`scalar deleting destructor' + inline void DecrementUnknown0xd4() + { + if (m_unk0xd4) + --m_unk0xd4; + } + + inline undefined2 GetUnknown0xd4() { return m_unk0xd4; } + private: void Init(); void Destroy(MxBool p_fromDestructor); diff --git a/LEGO1/lego/legoomni/include/legoplantmanager.h b/LEGO1/lego/legoomni/include/legoplantmanager.h index e199f11b..a47825f3 100644 --- a/LEGO1/lego/legoomni/include/legoplantmanager.h +++ b/LEGO1/lego/legoomni/include/legoplantmanager.h @@ -21,6 +21,7 @@ class LegoPlantManager : public MxCore { } void FUN_10026360(undefined4 p_world); + void FUN_100263a0(undefined4 p_und); // SYNTHETIC: LEGO1 0x100262a0 // LegoPlantManager::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/include/legosoundmanager.h b/LEGO1/lego/legoomni/include/legosoundmanager.h index 0e4bbbbd..b1afffe3 100644 --- a/LEGO1/lego/legoomni/include/legosoundmanager.h +++ b/LEGO1/lego/legoomni/include/legosoundmanager.h @@ -1,6 +1,7 @@ #ifndef LEGOSOUNDMANAGER_H #define LEGOSOUNDMANAGER_H +#include "legounknown100d6b4c.h" #include "mxsoundmanager.h" // VTABLE: LEGO1 0x100d6b10 @@ -17,12 +18,14 @@ class LegoSoundManager : public MxSoundManager { // SYNTHETIC: LEGO1 0x10029920 // LegoSoundManager::`scalar deleting destructor' + inline LegoUnknown100d6b4c* GetUnknown0x40() { return m_unk0x40; } + private: void Init(); void Destroy(MxBool p_fromDestructor); - undefined4 m_unk0x3c; - undefined4 m_unk0x40; + undefined4 m_unk0x3c; // 0x3c + LegoUnknown100d6b4c* m_unk0x40; // 0x40 }; #endif // LEGOSOUNDMANAGER_H diff --git a/LEGO1/lego/legoomni/include/legounknown100d6b4c.h b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h new file mode 100644 index 00000000..9b10bd50 --- /dev/null +++ b/LEGO1/lego/legoomni/include/legounknown100d6b4c.h @@ -0,0 +1,15 @@ +#ifndef LEGOUNKNOWN100D6B4C_H +#define LEGOUNKNOWN100D6B4C_H + +#include "decomp.h" + +class LegoCacheSound; + +// VTABLE: LEGO1 0x100d6b4c +// SIZE 0x20 +class LegoUnknown100d6b4c { +public: + void FUN_1003dc40(LegoCacheSound** p_und); +}; + +#endif // LEGOUNKNOWN100D6B4C_H diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 51b47fbf..2e0fcee6 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -79,7 +79,7 @@ class LegoWorld : public LegoEntity { LegoCameraController* m_cameraController; // 0x98 LegoEntityList* m_entityList; // 0x9c LegoCacheSoundList* m_cacheSoundList; // 0xa0 - undefined m_unk0xa4; // 0xa4 + MxBool m_destroyed; // 0xa4 MxCoreSet m_set0xa8; // 0xa8 MxPresenterList m_controlPresenters; // 0xb8 MxCoreSet m_set0xd0; // 0xd0 @@ -122,6 +122,9 @@ class LegoWorld : public LegoEntity { // TEMPLATE: LEGO1 0x1001df00 // Set::~Set +// TEMPLATE: LEGO1 0x1001f590 +// list >::erase + // TEMPLATE: LEGO1 0x100208b0 // _Tree >::_Kfn,CoreSetCompare,allocator >::insert diff --git a/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp new file mode 100644 index 00000000..2ed5f178 --- /dev/null +++ b/LEGO1/lego/legoomni/src/audio/legounknown100d6b4c.cpp @@ -0,0 +1,7 @@ +#include "legounknown100d6b4c.h" + +// STUB: LEGO1 0x1003dc40 +void LegoUnknown100d6b4c::FUN_1003dc40(LegoCacheSound** p_und) +{ + // TODO +} diff --git a/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp b/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp index ed890166..cb5fad99 100644 --- a/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp +++ b/LEGO1/lego/legoomni/src/build/legobuildingmanager.cpp @@ -33,6 +33,12 @@ void LegoBuildingManager::FUN_1002fa00() // TODO } +// STUB: LEGO1 0x1002fb30 +void LegoBuildingManager::FUN_1002fb30() +{ + // TODO +} + // STUB: LEGO1 0x10030220 MxResult LegoBuildingManager::Tickle() { diff --git a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp index 193f5c8a..ec04cf6a 100644 --- a/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp +++ b/LEGO1/lego/legoomni/src/common/legoplantmanager.cpp @@ -24,6 +24,12 @@ void LegoPlantManager::FUN_10026360(undefined4 p_world) // TODO } +// STUB: LEGO1 0x100263a0 +void LegoPlantManager::FUN_100263a0(undefined4 p_und) +{ + // TODO +} + // STUB: LEGO1 0x10026e00 MxResult LegoPlantManager::Tickle() { diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 7454e5cd..e2a912ef 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -1,9 +1,13 @@ #include "legoworld.h" #include "legoanimpresenter.h" +#include "legobuildingmanager.h" #include "legocontrolmanager.h" #include "legoinputmanager.h" +#include "legolocomotionanimpresenter.h" #include "legoomni.h" +#include "legoplantmanager.h" +#include "legosoundmanager.h" #include "legoutil.h" #include "legovideomanager.h" #include "mxactionnotificationparam.h" @@ -26,7 +30,7 @@ LegoWorld::LegoWorld() : m_list0x68(TRUE) m_cameraController = NULL; m_entityList = NULL; m_cacheSoundList = NULL; - m_unk0xa4 = 0; // MxBool? + m_destroyed = FALSE; m_hideAnimPresenter = NULL; m_worldStarted = FALSE; @@ -45,10 +49,13 @@ MxBool LegoWorld::VTable0x64() return FALSE; } -// STUB: LEGO1 0x1001dfa0 +// FUNCTION: LEGO1 0x1001dfa0 LegoWorld::~LegoWorld() { - // TODO + Destroy(TRUE); + + TickleManager()->UnregisterClient(this); + NotificationManager()->Unregister(this); } // FUNCTION: LEGO1 0x1001e0b0 @@ -84,10 +91,118 @@ MxResult LegoWorld::Create(MxDSAction& p_dsAction) return SUCCESS; } -// STUB: LEGO1 0x1001e9d0 +// FUNCTION: LEGO1 0x1001e9d0 void LegoWorld::Destroy(MxBool p_fromDestructor) { - // TODO + m_destroyed = TRUE; + + if (GetCurrentWorld() == this) { + ControlManager()->FUN_10028df0(NULL); + SetCurrentWorld(NULL); + } + + m_list0x68.DeleteAll(); + + if (m_cameraController) { + delete m_cameraController; + m_cameraController = NULL; + } + + MxPresenterListCursor animPresenterCursor(&m_animPresenters); + MxPresenter* presenter; + + while (animPresenterCursor.First(presenter)) { + animPresenterCursor.Detach(); + + MxDSAction* action = presenter->GetAction(); + if (action) { + if (presenter->IsA("LegoLocomotionAnimPresenter")) { + LegoLocomotionAnimPresenter* animPresenter = (LegoLocomotionAnimPresenter*) presenter; + + animPresenter->DecrementUnknown0xd4(); + if (animPresenter->GetUnknown0xd4() == 0) { + FUN_100b7220(action, MxDSAction::c_world, FALSE); + presenter->EndAction(); + } + } + else { + FUN_100b7220(action, MxDSAction::c_world, FALSE); + presenter->EndAction(); + } + } + } + + while (!m_set0xa8.empty()) { + MxCoreSet::iterator it = m_set0xa8.begin(); + MxCore* object = *it; + m_set0xa8.erase(it); + + if (object->IsA("MxPresenter")) { + MxPresenter* presenter = (MxPresenter*) object; + MxDSAction* action = presenter->GetAction(); + + if (action) { + FUN_100b7220(action, MxDSAction::c_world, FALSE); + presenter->EndAction(); + } + } + else + delete object; + } + + MxPresenterListCursor controlPresenterCursor(&m_controlPresenters); + + while (controlPresenterCursor.First(presenter)) { + controlPresenterCursor.Detach(); + + MxDSAction* action = presenter->GetAction(); + if (action) { + FUN_100b7220(action, MxDSAction::c_world, FALSE); + presenter->EndAction(); + } + } + + if (m_unk0xec != -1 && m_set0xd0.empty()) { + PlantManager()->FUN_100263a0(m_unk0xec); + BuildingManager()->FUN_1002fb30(); + } + + if (m_entityList) { + LegoEntityListCursor cursor(m_entityList); + LegoEntity* entity; + + while (cursor.First(entity)) { + cursor.Detach(); + + if (!(entity->GetFlags() & LegoEntity::c_bit2)) + delete entity; + } + + delete m_entityList; + m_entityList = NULL; + } + + if (m_cacheSoundList) { + LegoCacheSoundListCursor cursor(m_cacheSoundList); + LegoCacheSound* sound; + + while (cursor.First(sound)) { + cursor.Detach(); + SoundManager()->GetUnknown0x40()->FUN_1003dc40(&sound); + } + + delete m_cacheSoundList; + m_cacheSoundList = NULL; + } + + while (!m_list0xe0.empty()) { + AutoROI* roi = m_list0xe0.front(); + m_list0xe0.pop_front(); + delete roi; + } + + if (!p_fromDestructor) + LegoEntity::Destroy(FALSE); } // FUNCTION: LEGO1 0x1001f5e0 From fadf8e7fd5e22b655169e1584f0e4894915b0917 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 27 Jan 2024 12:15:14 -0500 Subject: [PATCH 26/34] Move some functions from LegoWorld to Act3 (#493) --- LEGO1/lego/legoomni/include/act3.h | 5 +++++ LEGO1/lego/legoomni/include/legoworld.h | 4 ---- LEGO1/lego/legoomni/src/act3/act3.cpp | 22 ++++++++++++++++++++ LEGO1/lego/legoomni/src/build/helicopter.cpp | 8 +++---- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 22 -------------------- 5 files changed, 31 insertions(+), 30 deletions(-) diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index b693663f..9153ae05 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -41,6 +41,11 @@ class Act3 : public LegoWorld { // SYNTHETIC: LEGO1 0x10072630 // Act3::`scalar deleting destructor' + MxBool FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); + MxBool FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); + void FUN_10073400(); + void FUN_10073430(); + protected: undefined m_unk0xf8[0x4114]; // 0xf8 MxEntity* m_unk0x420c; // 0x420c diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index 2e0fcee6..a57bf110 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -62,10 +62,6 @@ class LegoWorld : public LegoEntity { undefined FUN_100220e0(); void Remove(MxCore* p_object); void FUN_1001fc80(IslePathActor* p_actor); - MxBool FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); - MxBool FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up); - void FUN_10073400(); - void FUN_10073430(); MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); MxCore* Find(const char* p_class, const char* p_name); MxCore* Find(const MxAtomId& p_atom, MxS32 p_entityId); diff --git a/LEGO1/lego/legoomni/src/act3/act3.cpp b/LEGO1/lego/legoomni/src/act3/act3.cpp index e17db3dc..f23202f2 100644 --- a/LEGO1/lego/legoomni/src/act3/act3.cpp +++ b/LEGO1/lego/legoomni/src/act3/act3.cpp @@ -21,6 +21,18 @@ Act3::~Act3() // TODO } +// STUB: LEGO1 0x100727e0 +MxBool Act3::FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up) +{ + return FALSE; +} + +// STUB: LEGO1 0x10072980 +MxBool Act3::FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up) +{ + return FALSE; +} + // STUB: LEGO1 0x10072c30 MxResult Act3::Create(MxDSAction& p_dsAction) { @@ -54,6 +66,16 @@ MxResult Act3::Tickle() return SUCCESS; } +// STUB: LEGO1 0x10073400 +void Act3::FUN_10073400() +{ +} + +// STUB: LEGO1 0x10073430 +void Act3::FUN_10073430() +{ +} + // STUB: LEGO1 0x10073a90 void Act3::VTable0x68(MxBool p_add) { diff --git a/LEGO1/lego/legoomni/src/build/helicopter.cpp b/LEGO1/lego/legoomni/src/build/helicopter.cpp index 3bf55354..2a1d1e06 100644 --- a/LEGO1/lego/legoomni/src/build/helicopter.cpp +++ b/LEGO1/lego/legoomni/src/build/helicopter.cpp @@ -197,9 +197,9 @@ MxU32 Helicopter::VTable0xd4(MxType17NotificationParam& p_param) va4.EqualsCross(v68, dir); v7c.EqualsCross(va4, v90); if (ret) - if (m_world->FUN_100727e0(m_unk0x138, loc, dir, v7c)) + if (((Act3*) m_world)->FUN_100727e0(m_unk0x138, loc, dir, v7c)) break; - else if (m_world->FUN_10072980(m_unk0x138, loc, dir, v7c)) + else if (((Act3*) m_world)->FUN_10072980(m_unk0x138, loc, dir, v7c)) break; } ret = 1; @@ -329,9 +329,9 @@ void Helicopter::VTable0x70(float p_float) } else { if (state == 4) - m_world->FUN_10073400(); + ((Act3*) m_world)->FUN_10073400(); else - m_world->FUN_10073430(); + ((Act3*) m_world)->FUN_10073430(); m_unk0xdc = 4; } } diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index e2a912ef..002b6f5d 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -522,25 +522,3 @@ void LegoWorld::VTable0x50() { TickleManager()->UnregisterClient(this); } - -// STUB: LEGO1 0x100727e0 -MxBool LegoWorld::FUN_100727e0(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up) -{ - return FALSE; -} - -// STUB: LEGO1 0x10072980 -MxBool LegoWorld::FUN_10072980(MxU32, Mx3DPointFloat& p_loc, Mx3DPointFloat& p_dir, Mx3DPointFloat& p_up) -{ - return FALSE; -} - -// STUB: LEGO1 0x10073400 -void LegoWorld::FUN_10073400() -{ -} - -// STUB: LEGO1 0x10073430 -void LegoWorld::FUN_10073430() -{ -} From 19c771b85dd4c754adc53d48eed07e22af06c060 Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 27 Jan 2024 15:18:35 -0500 Subject: [PATCH 27/34] Implement/match LegoWorld::PresentersPending (#494) * Implement/match LegoWorld::PresentersPending * Rename functions --- LEGO1/lego/legoomni/include/act3.h | 2 +- LEGO1/lego/legoomni/include/carrace.h | 2 +- LEGO1/lego/legoomni/include/elevatorbottom.h | 2 +- LEGO1/lego/legoomni/include/gasstation.h | 2 +- LEGO1/lego/legoomni/include/historybook.h | 2 +- LEGO1/lego/legoomni/include/hospital.h | 2 +- LEGO1/lego/legoomni/include/infocenter.h | 2 +- LEGO1/lego/legoomni/include/infocenterdoor.h | 2 +- LEGO1/lego/legoomni/include/isle.h | 2 +- LEGO1/lego/legoomni/include/jukebox.h | 2 +- LEGO1/lego/legoomni/include/legoact2.h | 2 +- LEGO1/lego/legoomni/include/legocarbuild.h | 2 +- LEGO1/lego/legoomni/include/legoworld.h | 14 ++++- LEGO1/lego/legoomni/include/police.h | 2 +- .../lego/legoomni/include/registrationbook.h | 2 +- LEGO1/lego/legoomni/include/score.h | 2 +- LEGO1/lego/legoomni/src/act2/legoact2.cpp | 2 +- LEGO1/lego/legoomni/src/act3/act3.cpp | 2 +- .../lego/legoomni/src/build/legocarbuild.cpp | 2 +- LEGO1/lego/legoomni/src/entity/legoworld.cpp | 55 +++++++++++++++---- .../legoomni/src/gasstation/gasstation.cpp | 2 +- LEGO1/lego/legoomni/src/hospital/hospital.cpp | 2 +- .../src/infocenter/elevatorbottom.cpp | 4 +- .../legoomni/src/infocenter/infocenter.cpp | 2 +- .../src/infocenter/infocenterdoor.cpp | 4 +- .../src/infocenter/registrationbook.cpp | 2 +- LEGO1/lego/legoomni/src/infocenter/score.cpp | 4 +- LEGO1/lego/legoomni/src/isle/historybook.cpp | 2 +- LEGO1/lego/legoomni/src/isle/isle.cpp | 4 +- LEGO1/lego/legoomni/src/isle/jukebox.cpp | 2 +- LEGO1/lego/legoomni/src/police/police.cpp | 4 +- LEGO1/lego/legoomni/src/race/carrace.cpp | 2 +- 32 files changed, 90 insertions(+), 49 deletions(-) diff --git a/LEGO1/lego/legoomni/include/act3.h b/LEGO1/lego/legoomni/include/act3.h index 9153ae05..f9794f7c 100644 --- a/LEGO1/lego/legoomni/include/act3.h +++ b/LEGO1/lego/legoomni/include/act3.h @@ -29,7 +29,7 @@ class Act3 : public LegoWorld { virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 virtual void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual void VTable0x60() override; // vtable+0x60 virtual MxBool VTable0x64() override; // vtable+0x64 diff --git a/LEGO1/lego/legoomni/include/carrace.h b/LEGO1/lego/legoomni/include/carrace.h index 776662db..42a981bc 100644 --- a/LEGO1/lego/legoomni/include/carrace.h +++ b/LEGO1/lego/legoomni/include/carrace.h @@ -24,7 +24,7 @@ class CarRace : public LegoRace { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x64() override; // vtable+0x64 virtual undefined4 VTable0x6c(undefined4) override; // vtable+0x6c virtual undefined4 VTable0x70(undefined4) override; // vtable+0x70 diff --git a/LEGO1/lego/legoomni/include/elevatorbottom.h b/LEGO1/lego/legoomni/include/elevatorbottom.h index 1f02d28f..5bf8bced 100644 --- a/LEGO1/lego/legoomni/include/elevatorbottom.h +++ b/LEGO1/lego/legoomni/include/elevatorbottom.h @@ -27,7 +27,7 @@ class ElevatorBottom : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 // FUNCTION: LEGO1 0x10017f10 virtual MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c diff --git a/LEGO1/lego/legoomni/include/gasstation.h b/LEGO1/lego/legoomni/include/gasstation.h index 5f6c64f1..9efb8886 100644 --- a/LEGO1/lego/legoomni/include/gasstation.h +++ b/LEGO1/lego/legoomni/include/gasstation.h @@ -30,7 +30,7 @@ class GasStation : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/historybook.h b/LEGO1/lego/legoomni/include/historybook.h index 172dde98..a5299f63 100644 --- a/LEGO1/lego/legoomni/include/historybook.h +++ b/LEGO1/lego/legoomni/include/historybook.h @@ -26,7 +26,7 @@ class HistoryBook : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x64() override; // vtable+0x64 // SYNTHETIC: LEGO1 0x100824b0 diff --git a/LEGO1/lego/legoomni/include/hospital.h b/LEGO1/lego/legoomni/include/hospital.h index 3e88a58a..194cb690 100644 --- a/LEGO1/lego/legoomni/include/hospital.h +++ b/LEGO1/lego/legoomni/include/hospital.h @@ -28,7 +28,7 @@ class Hospital : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/infocenter.h b/LEGO1/lego/legoomni/include/infocenter.h index 5de2f745..fe6efff8 100644 --- a/LEGO1/lego/legoomni/include/infocenter.h +++ b/LEGO1/lego/legoomni/include/infocenter.h @@ -149,7 +149,7 @@ class Infocenter : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/infocenterdoor.h b/LEGO1/lego/legoomni/include/infocenterdoor.h index 1890f0b1..de3159f6 100644 --- a/LEGO1/lego/legoomni/include/infocenterdoor.h +++ b/LEGO1/lego/legoomni/include/infocenterdoor.h @@ -26,7 +26,7 @@ class InfocenterDoor : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 // FUNCTION: LEGO1 0x100377a0 virtual MxBool VTable0x5c() override { return TRUE; } // vtable+0x5c diff --git a/LEGO1/lego/legoomni/include/isle.h b/LEGO1/lego/legoomni/include/isle.h index e91982ee..148e099f 100644 --- a/LEGO1/lego/legoomni/include/isle.h +++ b/LEGO1/lego/legoomni/include/isle.h @@ -40,7 +40,7 @@ class Isle : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+50 + virtual void ReadyWorld() override; // vtable+50 virtual void Add(MxCore* p_object) override; // vtable+58 // FUNCTION: LEGO1 0x10030900 virtual MxBool VTable0x5c() override { return TRUE; } // vtable+5c diff --git a/LEGO1/lego/legoomni/include/jukebox.h b/LEGO1/lego/legoomni/include/jukebox.h index 7ee46589..9710a841 100644 --- a/LEGO1/lego/legoomni/include/jukebox.h +++ b/LEGO1/lego/legoomni/include/jukebox.h @@ -27,7 +27,7 @@ class JukeBox : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/legoact2.h b/LEGO1/lego/legoomni/include/legoact2.h index 4918fa76..0ac22875 100644 --- a/LEGO1/lego/legoomni/include/legoact2.h +++ b/LEGO1/lego/legoomni/include/legoact2.h @@ -12,7 +12,7 @@ class LegoAct2 : public LegoWorld { virtual MxLong Notify(MxParam& p_param) override; // vtable+0x04 virtual MxResult Tickle() override; // vtable+0x08 virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual void VTable0x60() override; // vtable+0x60 virtual MxBool VTable0x64() override; // vtable+0x64 diff --git a/LEGO1/lego/legoomni/include/legocarbuild.h b/LEGO1/lego/legoomni/include/legocarbuild.h index 70db5856..cfe4990d 100644 --- a/LEGO1/lego/legoomni/include/legocarbuild.h +++ b/LEGO1/lego/legoomni/include/legocarbuild.h @@ -27,7 +27,7 @@ class LegoCarBuild : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/legoworld.h b/LEGO1/lego/legoomni/include/legoworld.h index a57bf110..b6176067 100644 --- a/LEGO1/lego/legoomni/include/legoworld.h +++ b/LEGO1/lego/legoomni/include/legoworld.h @@ -24,6 +24,14 @@ typedef set MxCoreSet; // SIZE 0xf8 class LegoWorld : public LegoEntity { public: + enum StartupTicks { + e_start = 0, + e_one, + e_two, + e_three, + e_four + }; + LegoWorld(); virtual ~LegoWorld() override; // vtable+0x0 @@ -45,7 +53,7 @@ class LegoWorld : public LegoEntity { virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 virtual void Destroy(MxBool p_fromDestructor) override; // vtable+0x1c - virtual void VTable0x50(); // vtable+0x50 + virtual void ReadyWorld(); // vtable+0x50 virtual LegoCameraController* VTable0x54(); // vtable+0x54 virtual void Add(MxCore* p_object); // vtable+0x58 virtual MxBool VTable0x5c(); // vtable+0x5c @@ -59,7 +67,7 @@ class LegoWorld : public LegoEntity { inline LegoCameraController* GetCamera() { return m_cameraController; } inline undefined4 GetUnknown0xec() { return m_unk0xec; } - undefined FUN_100220e0(); + MxBool PresentersPending(); void Remove(MxCore* p_object); void FUN_1001fc80(IslePathActor* p_actor); MxS32 GetCurrPathInfo(LegoPathBoundary** p_path, MxS32& p_value); @@ -82,7 +90,7 @@ class LegoWorld : public LegoEntity { list m_list0xe0; // 0xe0 undefined4 m_unk0xec; // 0xec LegoHideAnimPresenter* m_hideAnimPresenter; // 0xf0 - MxS16 m_unk0xf4; // 0xf4 + MxS16 m_startupTicks; // 0xf4 MxBool m_worldStarted; // 0xf6 undefined m_unk0xf7; // 0xf7 }; diff --git a/LEGO1/lego/legoomni/include/police.h b/LEGO1/lego/legoomni/include/police.h index 999ae4aa..0261cd49 100644 --- a/LEGO1/lego/legoomni/include/police.h +++ b/LEGO1/lego/legoomni/include/police.h @@ -31,7 +31,7 @@ class Police : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x5c() override; // vtable+0x5c virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/registrationbook.h b/LEGO1/lego/legoomni/include/registrationbook.h index 25e4b2d8..53baeae9 100644 --- a/LEGO1/lego/legoomni/include/registrationbook.h +++ b/LEGO1/lego/legoomni/include/registrationbook.h @@ -27,7 +27,7 @@ class RegistrationBook : public LegoWorld { } virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+0x18 - virtual void VTable0x50() override; // vtable+0x50 + virtual void ReadyWorld() override; // vtable+0x50 virtual MxBool VTable0x64() override; // vtable+0x64 virtual void VTable0x68(MxBool p_add) override; // vtable+0x68 diff --git a/LEGO1/lego/legoomni/include/score.h b/LEGO1/lego/legoomni/include/score.h index 1e801aa3..08d4b595 100644 --- a/LEGO1/lego/legoomni/include/score.h +++ b/LEGO1/lego/legoomni/include/score.h @@ -32,7 +32,7 @@ class Score : public LegoWorld { // Score::`scalar deleting destructor' virtual MxResult Create(MxDSAction& p_dsAction) override; // vtable+18 - virtual void VTable0x50() override; // vtable+50 + virtual void ReadyWorld() override; // vtable+50 virtual MxBool VTable0x5c() override; // vtable+5c virtual MxBool VTable0x64() override; // vtable+64 virtual void VTable0x68(MxBool p_add) override; // vtable+68 diff --git a/LEGO1/lego/legoomni/src/act2/legoact2.cpp b/LEGO1/lego/legoomni/src/act2/legoact2.cpp index c487e9a4..3aafe018 100644 --- a/LEGO1/lego/legoomni/src/act2/legoact2.cpp +++ b/LEGO1/lego/legoomni/src/act2/legoact2.cpp @@ -29,7 +29,7 @@ MxLong LegoAct2::Notify(MxParam& p_param) } // STUB: LEGO1 0x10050a80 -void LegoAct2::VTable0x50() +void LegoAct2::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/act3/act3.cpp b/LEGO1/lego/legoomni/src/act3/act3.cpp index f23202f2..02a13c60 100644 --- a/LEGO1/lego/legoomni/src/act3/act3.cpp +++ b/LEGO1/lego/legoomni/src/act3/act3.cpp @@ -54,7 +54,7 @@ MxLong Act3::Notify(MxParam& p_param) } // STUB: LEGO1 0x10073270 -void Act3::VTable0x50() +void Act3::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp index 61576ece..9aba409b 100644 --- a/LEGO1/lego/legoomni/src/build/legocarbuild.cpp +++ b/LEGO1/lego/legoomni/src/build/legocarbuild.cpp @@ -43,7 +43,7 @@ MxLong LegoCarBuild::Notify(MxParam& p_param) } // STUB: LEGO1 0x100242c0 -void LegoCarBuild::VTable0x50() +void LegoCarBuild::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/entity/legoworld.cpp b/LEGO1/lego/legoomni/src/entity/legoworld.cpp index 002b6f5d..deaf0ce7 100644 --- a/LEGO1/lego/legoomni/src/entity/legoworld.cpp +++ b/LEGO1/lego/legoomni/src/entity/legoworld.cpp @@ -26,7 +26,7 @@ DECOMP_SIZE_ASSERT(LegoCacheSoundListCursor, 0x10) // FUNCTION: LEGO1 0x1001ca40 LegoWorld::LegoWorld() : m_list0x68(TRUE) { - m_unk0xf4 = 4; + m_startupTicks = e_four; m_cameraController = NULL; m_entityList = NULL; m_cacheSoundList = NULL; @@ -495,30 +495,63 @@ void LegoWorld::VTable0x68(MxBool p_add) MxResult LegoWorld::Tickle() { if (!m_worldStarted) { - switch (m_unk0xf4) { - case 0: + switch (m_startupTicks) { + case e_start: m_worldStarted = TRUE; SetAppCursor(0); - VTable0x50(); + ReadyWorld(); return TRUE; - case 2: - if (FUN_100220e0() == 1) + case e_two: + if (PresentersPending()) break; default: - m_unk0xf4--; + m_startupTicks--; } } + return TRUE; } -// STUB: LEGO1 0x100220e0 -undefined LegoWorld::FUN_100220e0() +// FUNCTION: LEGO1 0x100220e0 +MxBool LegoWorld::PresentersPending() { - return 0; + MxPresenterListCursor controlPresenterCursor(&m_controlPresenters); + MxPresenter* presenter; + + while (controlPresenterCursor.Next(presenter)) { + if (presenter->IsEnabled() && !presenter->HasTickleStatePassed(MxPresenter::e_starting)) + return TRUE; + } + + MxPresenterListCursor animPresenterCursor(&m_animPresenters); + + while (animPresenterCursor.Next(presenter)) { + if (presenter->IsEnabled()) { + if (presenter->IsA("LegoLocomotionAnimPresenter")) { + if (!presenter->HasTickleStatePassed(MxPresenter::e_ready)) + return TRUE; + } + else { + if (!presenter->HasTickleStatePassed(MxPresenter::e_starting)) + return TRUE; + } + } + } + + for (MxCoreSet::iterator it = m_set0xa8.begin(); it != m_set0xa8.end(); it++) { + if ((*it)->IsA("MxPresenter")) { + presenter = (MxPresenter*) *it; + + if (presenter->IsEnabled() && !presenter->HasTickleStatePassed(MxPresenter::e_starting)) + return TRUE; + } + } + + return FALSE; } // FUNCTION: LEGO1 0x10022340 -void LegoWorld::VTable0x50() +void LegoWorld::ReadyWorld() { TickleManager()->UnregisterClient(this); } diff --git a/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp b/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp index 8bedf0cf..c7a695a8 100644 --- a/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp +++ b/LEGO1/lego/legoomni/src/gasstation/gasstation.cpp @@ -48,7 +48,7 @@ MxLong GasStation::Notify(MxParam& p_param) } // STUB: LEGO1 0x10004b30 -void GasStation::VTable0x50() +void GasStation::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/hospital/hospital.cpp b/LEGO1/lego/legoomni/src/hospital/hospital.cpp index 8ede37e2..b141956d 100644 --- a/LEGO1/lego/legoomni/src/hospital/hospital.cpp +++ b/LEGO1/lego/legoomni/src/hospital/hospital.cpp @@ -52,7 +52,7 @@ MxLong Hospital::Notify(MxParam& p_param) } // STUB: LEGO1 0x10074a60 -void Hospital::VTable0x50() +void Hospital::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/infocenter/elevatorbottom.cpp b/LEGO1/lego/legoomni/src/infocenter/elevatorbottom.cpp index ab4d3cff..697ce5f1 100644 --- a/LEGO1/lego/legoomni/src/infocenter/elevatorbottom.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/elevatorbottom.cpp @@ -65,9 +65,9 @@ MxLong ElevatorBottom::Notify(MxParam& p_param) } // FUNCTION: LEGO1 0x100181b0 -void ElevatorBottom::VTable0x50() +void ElevatorBottom::ReadyWorld() { - LegoWorld::VTable0x50(); + LegoWorld::ReadyWorld(); PlayMusic(JukeBox::e_informationCenter); FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); } diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp index 38b95622..4ca6dd79 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenter.cpp @@ -298,7 +298,7 @@ MxLong Infocenter::HandleEndAction(MxParam& p_param) } // STUB: LEGO1 0x1006f4e0 -void Infocenter::VTable0x50() +void Infocenter::ReadyWorld() { m_infoManDialogueTimer = 0; m_bookAnimationTimer = 0; diff --git a/LEGO1/lego/legoomni/src/infocenter/infocenterdoor.cpp b/LEGO1/lego/legoomni/src/infocenter/infocenterdoor.cpp index 79e88a99..599096b2 100644 --- a/LEGO1/lego/legoomni/src/infocenter/infocenterdoor.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/infocenterdoor.cpp @@ -53,9 +53,9 @@ MxLong InfocenterDoor::Notify(MxParam& p_param) } // FUNCTION: LEGO1 0x10037a70 -void InfocenterDoor::VTable0x50() +void InfocenterDoor::ReadyWorld() { - LegoWorld::VTable0x50(); + LegoWorld::ReadyWorld(); PlayMusic(JukeBox::e_informationCenter); FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); } diff --git a/LEGO1/lego/legoomni/src/infocenter/registrationbook.cpp b/LEGO1/lego/legoomni/src/infocenter/registrationbook.cpp index f68bc29e..a2ee09b3 100644 --- a/LEGO1/lego/legoomni/src/infocenter/registrationbook.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/registrationbook.cpp @@ -29,7 +29,7 @@ MxLong RegistrationBook::Notify(MxParam& p_param) } // STUB: LEGO1 0x10077cc0 -void RegistrationBook::VTable0x50() +void RegistrationBook::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/infocenter/score.cpp b/LEGO1/lego/legoomni/src/infocenter/score.cpp index 2d7d8c05..a7c1ee14 100644 --- a/LEGO1/lego/legoomni/src/infocenter/score.cpp +++ b/LEGO1/lego/legoomni/src/infocenter/score.cpp @@ -129,9 +129,9 @@ MxLong Score::FUN_10001510(MxEndActionNotificationParam& p_param) } // FUNCTION: LEGO1 0x10001580 -void Score::VTable0x50() +void Score::ReadyWorld() { - LegoWorld::VTable0x50(); + LegoWorld::ReadyWorld(); MxDSAction action; action.SetObjectId(0x1f4); diff --git a/LEGO1/lego/legoomni/src/isle/historybook.cpp b/LEGO1/lego/legoomni/src/isle/historybook.cpp index f5a970b3..4681ce1c 100644 --- a/LEGO1/lego/legoomni/src/isle/historybook.cpp +++ b/LEGO1/lego/legoomni/src/isle/historybook.cpp @@ -28,7 +28,7 @@ MxLong HistoryBook::Notify(MxParam& p_param) } // STUB: LEGO1 0x100826f0 -void HistoryBook::VTable0x50() +void HistoryBook::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/isle/isle.cpp b/LEGO1/lego/legoomni/src/isle/isle.cpp index e26e0797..40e07fa1 100644 --- a/LEGO1/lego/legoomni/src/isle/isle.cpp +++ b/LEGO1/lego/legoomni/src/isle/isle.cpp @@ -153,9 +153,9 @@ MxLong Isle::StopAction(MxParam& p_param) } // FUNCTION: LEGO1 0x10030fc0 -void Isle::VTable0x50() +void Isle::ReadyWorld() { - LegoWorld::VTable0x50(); + LegoWorld::ReadyWorld(); if (m_act1state->GetUnknown21()) { GameState()->HandleAction(2); diff --git a/LEGO1/lego/legoomni/src/isle/jukebox.cpp b/LEGO1/lego/legoomni/src/isle/jukebox.cpp index 687c0a79..c969754f 100644 --- a/LEGO1/lego/legoomni/src/isle/jukebox.cpp +++ b/LEGO1/lego/legoomni/src/isle/jukebox.cpp @@ -35,7 +35,7 @@ MxLong JukeBox::Notify(MxParam& p_param) } // STUB: LEGO1 0x1005d9f0 -void JukeBox::VTable0x50() +void JukeBox::ReadyWorld() { // TODO } diff --git a/LEGO1/lego/legoomni/src/police/police.cpp b/LEGO1/lego/legoomni/src/police/police.cpp index 42456814..aac86238 100644 --- a/LEGO1/lego/legoomni/src/police/police.cpp +++ b/LEGO1/lego/legoomni/src/police/police.cpp @@ -69,9 +69,9 @@ MxLong Police::Notify(MxParam& p_param) } // FUNCTION: LEGO1 0x1005e530 -void Police::VTable0x50() +void Police::ReadyWorld() { - LegoWorld::VTable0x50(); + LegoWorld::ReadyWorld(); PlayMusic(JukeBox::e_policeStation); FUN_10015820(FALSE, LegoOmni::c_disableInput | LegoOmni::c_disable3d | LegoOmni::c_clearScreen); } diff --git a/LEGO1/lego/legoomni/src/race/carrace.cpp b/LEGO1/lego/legoomni/src/race/carrace.cpp index 2e5c3b11..6230ed78 100644 --- a/LEGO1/lego/legoomni/src/race/carrace.cpp +++ b/LEGO1/lego/legoomni/src/race/carrace.cpp @@ -17,7 +17,7 @@ MxResult CarRace::Create(MxDSAction& p_dsAction) } // STUB: LEGO1 0x10016dd0 -void CarRace::VTable0x50() +void CarRace::ReadyWorld() { // TODO } From f706f804836a5d7122daee4c5e5bb7eaf4cd1c0b Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 27 Jan 2024 16:55:59 -0500 Subject: [PATCH 28/34] implement LegoInputManager::Create (#495) * implement LegoInputManager::Create * Fixes * Add annotation * Add size assert --------- Co-authored-by: Christian Semmler --- .../legoomni/include/legocontrolmanager.h | 3 + .../lego/legoomni/include/legoinputmanager.h | 104 +++++++++++++----- .../src/control/legocontrolmanager.cpp | 2 + .../legoomni/src/input/legoinputmanager.cpp | 38 +++++-- 4 files changed, 109 insertions(+), 38 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index 385ee92b..e2861885 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -32,6 +32,9 @@ class LegoControlManager : public MxCore { // SYNTHETIC: LEGO1 0x10028d40 // LegoControlManager::`scalar deleting destructor' + +private: + undefined m_padding0x08[0x58]; // 0x08 }; #endif // LEGOCONTROLMANAGER_H diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index b2b677b7..4d3d0f76 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -25,6 +25,29 @@ class LegoControlManager; // SIZE 0x18 class LegoEventQueue : public MxQueue {}; +// VTABLE: LEGO1 0x100d6a20 +// class MxCollection + +// VTABLE: LEGO1 0x100d6a38 +// class MxList + +// VTABLE: LEGO1 0x100d6a50 +// class MxPtrList + +// VTABLE: LEGO1 0x100d6a68 +// SIZE 0x18 +class LegoNotifyList : public MxPtrList { +protected: + // FUNCTION: LEGO1 0x10028830 + virtual MxS8 Compare(MxCore* p_element1, MxCore* p_element2) override + { + return p_element1 == p_element2 ? 0 : p_element1 < p_element2 ? -1 : 1; + } // vtable+0x14 + +public: + LegoNotifyList(MxBool p_ownership = FALSE) : MxPtrList(p_ownership) {} +}; + // VTABLE: LEGO1 0x100d8760 // SIZE 0x338 class LegoInputManager : public MxPresenter { @@ -78,47 +101,59 @@ class LegoInputManager : public MxPresenter { // LegoInputManager::`scalar deleting destructor' private: - MxCriticalSection m_criticalSection; - MxList* m_unk0x5c; // list or hash table - LegoCameraController* m_camera; - LegoWorld* m_world; - LegoEventQueue* m_eventQueue; // +0x68 - undefined4 m_unk0x6c; - undefined4 m_unk0x70; - undefined4 m_unk0x74; - UINT m_timer; - UINT m_timeout; - undefined m_unk0x80; - undefined m_unk0x81; - LegoControlManager* m_controlManager; - MxBool m_unk0x88; - IDirectInput* m_directInput; - IDirectInputDevice* m_directInputDevice; - undefined m_unk0x94; - undefined4 m_unk0x98; - undefined m_unk0x9c[0xF8]; - undefined m_unk0x194; - MxBool m_unk0x195; - MxS32 m_joyid; - MxS32 m_joystickIndex; - JOYCAPS m_joyCaps; - MxBool m_useJoystick; - MxBool m_unk0x335; - MxBool m_unk0x336; + MxCriticalSection m_criticalSection; // 0x58 + LegoNotifyList* m_keyboardNotifyList; // 0x5c + LegoCameraController* m_camera; // 0x60 + LegoWorld* m_world; // 0x64 + LegoEventQueue* m_eventQueue; // 0x68 + undefined4 m_unk0x6c; // 0x6c + undefined4 m_unk0x70; // 0x70 + undefined4 m_unk0x74; // 0x74 + UINT m_timer; // 0x78 + UINT m_timeout; // 0x7c + undefined m_unk0x80; // 0x80 + undefined m_unk0x81; // 0x81 + LegoControlManager* m_controlManager; // 0x84 + MxBool m_unk0x88; // 0x88 + IDirectInput* m_directInput; // 0x8c + IDirectInputDevice* m_directInputDevice; // 0x90 + undefined m_unk0x94; // 0x94 + undefined4 m_unk0x98; // 0x98 + undefined m_unk0x9c[0xf8]; // 0x9c + undefined m_unk0x194; // 0x194 + MxBool m_unk0x195; // 0x195 + MxS32 m_joyid; // 0x198 + MxS32 m_joystickIndex; // 0x19c + JOYCAPS m_joyCaps; // 0x200 + MxBool m_useJoystick; // 0x334 + MxBool m_unk0x335; // 0x335 + MxBool m_unk0x336; // 0x336 }; // TEMPLATE: LEGO1 0x1005bb80 // MxCollection::Compare +// TEMPLATE: LEGO1 0x100288b0 +// MxCollection::Destroy + +// TEMPLATE: LEGO1 0x10028850 +// MxCollection::Compare + // TEMPLATE: LEGO1 0x1005bbe0 // MxCollection::~MxCollection +// TEMPLATE: LEGO1 0x10028860 +// MxCollection::~MxCollection + // TEMPLATE: LEGO1 0x1005bc30 // MxCollection::Destroy // TEMPLATE: LEGO1 0x1005bc80 // MxList::~MxList +// TEMPLATE: LEGO1 0x100288c0 +// MxList::~MxList + // SYNTHETIC: LEGO1 0x1005bd50 // MxCollection::`scalar deleting destructor' @@ -128,9 +163,24 @@ class LegoInputManager : public MxPresenter { // SYNTHETIC: LEGO1 0x1005beb0 // LegoEventQueue::`scalar deleting destructor' +// SYNTHETIC: LEGO1 0x10028a10 +// MxCollection::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x10028a80 +// MxList::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x10028b30 +// MxPtrList::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x10028950 +// LegoNotifyList::`scalar deleting destructor' + // TEMPLATE: LEGO1 0x1005bf20 // MxQueue::~MxQueue +// TEMPLATE: LEGO1 0x100289c0 +// MxPtrList::~MxPtrList + // SYNTHETIC: LEGO1 0x1005bf70 // MxQueue::`scalar deleting destructor' diff --git a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp index 481bd9c5..5b51b8ec 100644 --- a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp +++ b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp @@ -1,5 +1,7 @@ #include "legocontrolmanager.h" +DECOMP_SIZE_ASSERT(LegoControlManager, 0x60); + // STUB: LEGO1 0x10028520 LegoControlManager::LegoControlManager() { diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index 87c72a63..ec871b47 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -4,8 +4,9 @@ #include "legoomni.h" #include "mxautolocker.h" -DECOMP_SIZE_ASSERT(LegoInputManager, 0x338); -DECOMP_SIZE_ASSERT(LegoEventQueue, 0x18); +DECOMP_SIZE_ASSERT(LegoInputManager, 0x338) +DECOMP_SIZE_ASSERT(LegoNotifyList, 0x18) +DECOMP_SIZE_ASSERT(LegoEventQueue, 0x18) // GLOBAL: LEGO1 0x100f31b0 MxS32 g_unk0x100f31b0 = -1; @@ -16,7 +17,7 @@ MxS32 g_unk0x100f31b4 = 0; // FUNCTION: LEGO1 0x1005b790 LegoInputManager::LegoInputManager() { - m_unk0x5c = NULL; + m_keyboardNotifyList = NULL; m_world = NULL; m_camera = NULL; m_eventQueue = NULL; @@ -40,7 +41,7 @@ LegoInputManager::LegoInputManager() m_timeout = 1000; } -// STUB: LEGO1 0x1005b8b0 +// FUNCTION: LEGO1 0x1005b8b0 MxResult LegoInputManager::Tickle() { ProcessEvents(); @@ -56,10 +57,25 @@ LegoInputManager::~LegoInputManager() // FUNCTION: LEGO1 0x1005b960 MxResult LegoInputManager::Create(HWND p_hwnd) { - // TODO - if (m_eventQueue == NULL) - m_eventQueue = new LegoEventQueue(); - return SUCCESS; + MxResult result = SUCCESS; + + m_controlManager = new LegoControlManager; + + if (!m_keyboardNotifyList) + m_keyboardNotifyList = new LegoNotifyList; + + if (!m_eventQueue) + m_eventQueue = new LegoEventQueue; + + CreateAndAcquireKeyboard(p_hwnd); + GetJoystickId(); + + if (!m_keyboardNotifyList || !m_eventQueue || !m_directInputDevice) { + Destroy(); + result = FAILURE; + } + + return result; } // FUNCTION: LEGO1 0x1005bfe0 @@ -67,9 +83,9 @@ void LegoInputManager::Destroy() { ReleaseDX(); - if (m_unk0x5c) - delete m_unk0x5c; - m_unk0x5c = NULL; + if (m_keyboardNotifyList) + delete m_keyboardNotifyList; + m_keyboardNotifyList = NULL; if (m_eventQueue) delete m_eventQueue; From 159e27baba4254e01d7d18c091905198a23dd0db Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Fri, 26 Jan 2024 05:37:50 -0500 Subject: [PATCH 29/34] Sort annotations --- .../lego/legoomni/include/legoinputmanager.h | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 4d3d0f76..5f596a3d 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -130,38 +130,23 @@ class LegoInputManager : public MxPresenter { MxBool m_unk0x336; // 0x336 }; -// TEMPLATE: LEGO1 0x1005bb80 -// MxCollection::Compare - -// TEMPLATE: LEGO1 0x100288b0 -// MxCollection::Destroy - // TEMPLATE: LEGO1 0x10028850 // MxCollection::Compare -// TEMPLATE: LEGO1 0x1005bbe0 -// MxCollection::~MxCollection - // TEMPLATE: LEGO1 0x10028860 // MxCollection::~MxCollection -// TEMPLATE: LEGO1 0x1005bc30 -// MxCollection::Destroy - -// TEMPLATE: LEGO1 0x1005bc80 -// MxList::~MxList +// TEMPLATE: LEGO1 0x100288b0 +// MxCollection::Destroy // TEMPLATE: LEGO1 0x100288c0 // MxList::~MxList -// SYNTHETIC: LEGO1 0x1005bd50 -// MxCollection::`scalar deleting destructor' +// SYNTHETIC: LEGO1 0x10028950 +// LegoNotifyList::`scalar deleting destructor' -// SYNTHETIC: LEGO1 0x1005bdc0 -// MxList::`scalar deleting destructor' - -// SYNTHETIC: LEGO1 0x1005beb0 -// LegoEventQueue::`scalar deleting destructor' +// TEMPLATE: LEGO1 0x100289c0 +// MxPtrList::~MxPtrList // SYNTHETIC: LEGO1 0x10028a10 // MxCollection::`scalar deleting destructor' @@ -172,15 +157,30 @@ class LegoInputManager : public MxPresenter { // SYNTHETIC: LEGO1 0x10028b30 // MxPtrList::`scalar deleting destructor' -// SYNTHETIC: LEGO1 0x10028950 -// LegoNotifyList::`scalar deleting destructor' +// TEMPLATE: LEGO1 0x1005bb80 +// MxCollection::Compare + +// TEMPLATE: LEGO1 0x1005bbe0 +// MxCollection::~MxCollection + +// TEMPLATE: LEGO1 0x1005bc30 +// MxCollection::Destroy + +// TEMPLATE: LEGO1 0x1005bc80 +// MxList::~MxList + +// SYNTHETIC: LEGO1 0x1005bd50 +// MxCollection::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1005bdc0 +// MxList::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x1005beb0 +// LegoEventQueue::`scalar deleting destructor' // TEMPLATE: LEGO1 0x1005bf20 // MxQueue::~MxQueue -// TEMPLATE: LEGO1 0x100289c0 -// MxPtrList::~MxPtrList - // SYNTHETIC: LEGO1 0x1005bf70 // MxQueue::`scalar deleting destructor' From d4cb8677b81456689378b25b6ea4b83019e0f40e Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sat, 27 Jan 2024 17:15:12 -0500 Subject: [PATCH 30/34] implement LegoInputManager register and unregister (#496) * implement LegoInputManager::Create * Fixes * Add annotation * Add size assert * push changes * Add size assert * Order annotations --------- Co-authored-by: Christian Semmler --- .../lego/legoomni/include/legoinputmanager.h | 31 +++++++++++++++++++ .../legoomni/src/input/legoinputmanager.cpp | 21 +++++++++---- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 5f596a3d..89e30dc7 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -48,6 +48,19 @@ class LegoNotifyList : public MxPtrList { LegoNotifyList(MxBool p_ownership = FALSE) : MxPtrList(p_ownership) {} }; +// VTABLE: LEGO1 0x100d6ac0 +// class MxListCursor + +// VTABLE: LEGO1 0x100d6ad8 +// class MxPtrListCursor + +// VTABLE: LEGO1 0x100d6aa8 +// SIZE 0x10 +class LegoNotifyListCursor : public MxPtrListCursor { +public: + LegoNotifyListCursor(LegoNotifyList* p_list) : MxPtrListCursor(p_list) {} +}; + // VTABLE: LEGO1 0x100d8760 // SIZE 0x338 class LegoInputManager : public MxPresenter { @@ -157,6 +170,24 @@ class LegoInputManager : public MxPresenter { // SYNTHETIC: LEGO1 0x10028b30 // MxPtrList::`scalar deleting destructor' +// SYNTHETIC: LEGO1 0x10028fd0 +// LegoNotifyListCursor::`scalar deleting destructor' + +// TEMPLATE: LEGO1 0x10029040 +// MxPtrListCursor::~MxPtrListCursor + +// SYNTHETIC: LEGO1 0x10029090 +// MxListCursor::`scalar deleting destructor' + +// SYNTHETIC: LEGO1 0x10029100 +// MxPtrListCursor::`scalar deleting destructor' + +// TEMPLATE: LEGO1 0x10029170 +// MxListCursor::~MxListCursor + +// TEMPLATE: LEGO1 0x100291c0 +// LegoNotifyListCursor::~LegoNotifyListCursor + // TEMPLATE: LEGO1 0x1005bb80 // MxCollection::Compare diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index ec871b47..2a551c71 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -6,6 +6,7 @@ DECOMP_SIZE_ASSERT(LegoInputManager, 0x338) DECOMP_SIZE_ASSERT(LegoNotifyList, 0x18) +DECOMP_SIZE_ASSERT(LegoNotifyListCursor, 0x10) DECOMP_SIZE_ASSERT(LegoEventQueue, 0x18) // GLOBAL: LEGO1 0x100f31b0 @@ -211,16 +212,24 @@ MxResult LegoInputManager::GetJoystickState( return FAILURE; } -// STUB: LEGO1 0x1005c470 -void LegoInputManager::Register(MxCore*) +// FUNCTION: LEGO1 0x1005c470 +void LegoInputManager::Register(MxCore* p_notify) { - // TODO + MxAutoLocker lock(&m_criticalSection); + + LegoNotifyListCursor cursor(m_keyboardNotifyList); + if (!cursor.Find(p_notify)) + m_keyboardNotifyList->Append(p_notify); } -// STUB: LEGO1 0x1005c5c0 -void LegoInputManager::UnRegister(MxCore*) +// FUNCTION: LEGO1 0x1005c5c0 +void LegoInputManager::UnRegister(MxCore* p_notify) { - // TODO + MxAutoLocker lock(&m_criticalSection); + + LegoNotifyListCursor cursor(m_keyboardNotifyList); + if (cursor.Find(p_notify)) + cursor.Detach(); } // FUNCTION: LEGO1 0x1005c700 From f1fc5e1d0d45376302584e23dd338be8bd82f7ac Mon Sep 17 00:00:00 2001 From: Christian Semmler Date: Sat, 27 Jan 2024 17:57:42 -0500 Subject: [PATCH 31/34] Implement/match LegoEventNotifcationParam::Clone (#497) --- .../lego/legoomni/include/legoeventnotificationparam.h | 10 +++++++++- .../legoomni/src/notify/legoeventnotificationparam.cpp | 7 ------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h index f5ec9205..a27ee9df 100644 --- a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h +++ b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h @@ -10,7 +10,14 @@ // SIZE 0x20 class LegoEventNotificationParam : public MxNotificationParam { public: - virtual MxNotificationParam* Clone() override; // vtable+0x4 + // FUNCTION: LEGO1 0x10028690 + virtual MxNotificationParam* Clone() override + { + LegoEventNotificationParam* clone = + new LegoEventNotificationParam(m_type, m_sender, m_modifier, m_x, m_y, m_key); + clone->m_unk0x1c = m_unk0x1c; + return clone; + }; // vtable+0x4 inline LegoEventNotificationParam() : MxNotificationParam(c_notificationType0, NULL) {} inline LegoEventNotificationParam( @@ -25,6 +32,7 @@ class LegoEventNotificationParam : public MxNotificationParam { { } + inline MxU8 GetModifier() { return m_modifier; } inline MxU8 GetKey() const { return m_key; } inline MxS32 GetX() const { return m_x; } inline MxS32 GetY() const { return m_y; } diff --git a/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp b/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp index 299bbe33..b6abd2c4 100644 --- a/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp +++ b/LEGO1/lego/legoomni/src/notify/legoeventnotificationparam.cpp @@ -3,10 +3,3 @@ #include "decomp.h" DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20); - -// STUB: LEGO1 0x10028690 -MxNotificationParam* LegoEventNotificationParam::Clone() -{ - // TODO - return NULL; -} From d9c4151bb86368f38ff5576a633189672718e50f Mon Sep 17 00:00:00 2001 From: Misha <106913236+MishaProductions@users.noreply.github.com> Date: Sun, 28 Jan 2024 09:20:21 -0500 Subject: [PATCH 32/34] implement LegoInputManager::ProcessOneEvent (#498) * push changes * fix * Match * Rename functions * Space * Fix GetPresenterAt --------- Co-authored-by: Christian Semmler --- .../legoomni/include/legocontrolmanager.h | 10 +- .../include/legoeventnotificationparam.h | 9 +- .../lego/legoomni/include/legoinputmanager.h | 9 +- .../lego/legoomni/include/legovideomanager.h | 3 +- .../src/control/legocontrolmanager.cpp | 9 ++ .../legoomni/src/input/legoinputmanager.cpp | 140 ++++++++++++++++-- .../legoomni/src/video/legovideomanager.cpp | 15 +- LEGO1/lego/sources/roi/legoroi.h | 1 + LEGO1/omni/include/mxnotificationparam.h | 2 + LEGO1/realtime/orientableroi.h | 3 +- LEGO1/realtime/roi.h | 2 + 11 files changed, 178 insertions(+), 25 deletions(-) diff --git a/LEGO1/lego/legoomni/include/legocontrolmanager.h b/LEGO1/lego/legoomni/include/legocontrolmanager.h index e2861885..5b83a715 100644 --- a/LEGO1/lego/legoomni/include/legocontrolmanager.h +++ b/LEGO1/lego/legoomni/include/legocontrolmanager.h @@ -1,6 +1,7 @@ #ifndef LEGOCONTROLMANAGER_H #define LEGOCONTROLMANAGER_H +#include "legoeventnotificationparam.h" #include "mxcore.h" #include "mxpresenterlist.h" @@ -28,13 +29,20 @@ class LegoControlManager : public MxCore { void FUN_10028df0(MxPresenterList* p_presenterList); void Register(MxCore* p_listener); void Unregister(MxCore* p_listener); + MxBool FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter); void FUN_100293c0(undefined4, const char*, undefined2); + inline undefined4 GetUnknown0x0c() { return m_unk0x0c; } + inline undefined GetUnknown0x10() { return m_unk0x10; } + // SYNTHETIC: LEGO1 0x10028d40 // LegoControlManager::`scalar deleting destructor' private: - undefined m_padding0x08[0x58]; // 0x08 + undefined4 m_unk0x08; // 0x08 + undefined4 m_unk0x0c; // 0x0c + undefined m_unk0x10; // 0x10 + undefined m_padding0x14[0x4c]; // 0x14 }; #endif // LEGOCONTROLMANAGER_H diff --git a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h index a27ee9df..9eb6c7b5 100644 --- a/LEGO1/lego/legoomni/include/legoeventnotificationparam.h +++ b/LEGO1/lego/legoomni/include/legoeventnotificationparam.h @@ -3,6 +3,7 @@ #include "mxnotificationparam.h" #include "mxtypes.h" +#include "roi/legoroi.h" #include @@ -15,7 +16,7 @@ class LegoEventNotificationParam : public MxNotificationParam { { LegoEventNotificationParam* clone = new LegoEventNotificationParam(m_type, m_sender, m_modifier, m_x, m_y, m_key); - clone->m_unk0x1c = m_unk0x1c; + clone->m_roi = m_roi; return clone; }; // vtable+0x4 @@ -28,7 +29,7 @@ class LegoEventNotificationParam : public MxNotificationParam { MxS32 p_y, MxU8 p_key ) - : MxNotificationParam(p_type, p_sender), m_modifier(p_modifier), m_x(p_x), m_y(p_y), m_key(p_key), m_unk0x1c(0) + : MxNotificationParam(p_type, p_sender), m_modifier(p_modifier), m_x(p_x), m_y(p_y), m_key(p_key), m_roi(NULL) { } @@ -37,12 +38,14 @@ class LegoEventNotificationParam : public MxNotificationParam { inline MxS32 GetX() const { return m_x; } inline MxS32 GetY() const { return m_y; } + inline void SetROI(LegoROI* p_roi) { m_roi = p_roi; } + protected: MxU8 m_modifier; // 0x0c MxS32 m_x; // 0x10 MxS32 m_y; // 0x14 MxU8 m_key; // 0x18 - MxU32 m_unk0x1c; // 0x1c + LegoROI* m_roi; // 0x1c }; // SYNTHETIC: LEGO1 0x10028770 diff --git a/LEGO1/lego/legoomni/include/legoinputmanager.h b/LEGO1/lego/legoomni/include/legoinputmanager.h index 89e30dc7..eada8f70 100644 --- a/LEGO1/lego/legoomni/include/legoinputmanager.h +++ b/LEGO1/lego/legoomni/include/legoinputmanager.h @@ -83,8 +83,8 @@ class LegoInputManager : public MxPresenter { void ReleaseDX(); MxResult GetJoystickId(); MxResult GetJoystickState(MxU32* p_joystickX, MxU32* p_joystickY, DWORD* p_buttonsState, MxU32* p_povPosition); - void SetTimer(); - void KillTimer(); + void StartAutoDragTimer(); + void StopAutoDragTimer(); void EnableInputProcessing(); void SetCamera(LegoCameraController* p_camera); void ClearCamera(); @@ -109,6 +109,7 @@ class LegoInputManager : public MxPresenter { void ProcessEvents(); MxBool ProcessOneEvent(LegoEventNotificationParam& p_param); + MxBool FUN_1005cdf0(LegoEventNotificationParam& p_param); // SYNTHETIC: LEGO1 0x1005b8d0 // LegoInputManager::`scalar deleting destructor' @@ -122,8 +123,8 @@ class LegoInputManager : public MxPresenter { undefined4 m_unk0x6c; // 0x6c undefined4 m_unk0x70; // 0x70 undefined4 m_unk0x74; // 0x74 - UINT m_timer; // 0x78 - UINT m_timeout; // 0x7c + UINT m_autoDragTimerID; // 0x78 + UINT m_autoDragTime; // 0x7c undefined m_unk0x80; // 0x80 undefined m_unk0x81; // 0x81 LegoControlManager* m_controlManager; // 0x84 diff --git a/LEGO1/lego/legoomni/include/legovideomanager.h b/LEGO1/lego/legoomni/include/legovideomanager.h index 72cb2148..ce9963e4 100644 --- a/LEGO1/lego/legoomni/include/legovideomanager.h +++ b/LEGO1/lego/legoomni/include/legovideomanager.h @@ -31,7 +31,8 @@ class LegoVideoManager : public MxVideoManager { override; // vtable+0x2c virtual MxResult RealizePalette(MxPalette*) override; // vtable+0x30 virtual void UpdateView(MxU32 p_x, MxU32 p_y, MxU32 p_width, MxU32 p_height) override; // vtable+0x34 - virtual void VTable0x38(undefined4, undefined4); // vtable+0x38 + virtual MxPresenter* GetPresenterAt(MxS32 p_x, MxS32 p_y); // vtable+0x38 + // FUNCTION: LEGO1 0x1007ab10 virtual LegoUnknown100d9d00* VTable0x3c() { return m_unk0x100d9d00; } // vtable+0x3c diff --git a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp index 5b51b8ec..465ccf9f 100644 --- a/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp +++ b/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp @@ -1,5 +1,8 @@ #include "legocontrolmanager.h" +#include "legoeventnotificationparam.h" +#include "mxpresenter.h" + DECOMP_SIZE_ASSERT(LegoControlManager, 0x60); // STUB: LEGO1 0x10028520 @@ -32,6 +35,12 @@ void LegoControlManager::Unregister(MxCore* p_listener) // TODO } +// STUB: LEGO1 0x10029210 +MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter) +{ + return TRUE; +} + // STUB: LEGO1 0x100293c0 void LegoControlManager::FUN_100293c0(undefined4, const char*, undefined2) { diff --git a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp index 2a551c71..05f09061 100644 --- a/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp +++ b/LEGO1/lego/legoomni/src/input/legoinputmanager.cpp @@ -2,7 +2,9 @@ #include "legocontrolmanager.h" #include "legoomni.h" +#include "legovideomanager.h" #include "mxautolocker.h" +#include "roi/legoroi.h" DECOMP_SIZE_ASSERT(LegoInputManager, 0x338) DECOMP_SIZE_ASSERT(LegoNotifyList, 0x18) @@ -23,7 +25,7 @@ LegoInputManager::LegoInputManager() m_camera = NULL; m_eventQueue = NULL; m_unk0x80 = 0; - m_timer = 0; + m_autoDragTimerID = 0; m_unk0x6c = 0; m_unk0x70 = 0; m_controlManager = NULL; @@ -39,7 +41,7 @@ LegoInputManager::LegoInputManager() m_unk0x335 = FALSE; m_unk0x336 = FALSE; m_unk0x74 = 0x19; - m_timeout = 1000; + m_autoDragTime = 1000; } // FUNCTION: LEGO1 0x1005b8b0 @@ -279,28 +281,142 @@ void LegoInputManager::ProcessEvents() } } -// STUB: LEGO1 0x1005c9c0 +// FUNCTION: LEGO1 0x1005c9c0 MxBool LegoInputManager::ProcessOneEvent(LegoEventNotificationParam& p_param) +{ + MxBool processRoi; + + if (p_param.GetType() == c_notificationKeyPress) { + if (!Lego()->IsTimerRunning() || p_param.GetKey() == 0x13) { + if (p_param.GetKey() == 0x10) { + if (m_unk0x195) { + m_unk0x80 = 0; + p_param.SetType(c_notificationDrag); + + if (m_camera) { + m_camera->Notify(p_param); + } + } + + m_unk0x195 = !m_unk0x195; + return TRUE; + } + + LegoNotifyListCursor cursor(m_keyboardNotifyList); + MxCore* target; + + while (cursor.Next(target)) { + if (target->Notify(p_param) != 0) { + return TRUE; + } + } + } + } + else { + if (!Lego()->IsTimerRunning()) { + processRoi = TRUE; + + if (m_unk0x335 != 0) { + if (p_param.GetType() == c_notificationButtonDown) { + LegoEventNotificationParam notification(c_notificationKeyPress, NULL, 0, 0, 0, ' '); + LegoNotifyListCursor cursor(m_keyboardNotifyList); + MxCore* target; + + while (cursor.Next(target)) { + if (target->Notify(notification) != 0) { + return TRUE; + } + } + } + + return TRUE; + } + + if (m_unk0x195 && p_param.GetType() == c_notificationButtonDown) { + m_unk0x195 = 0; + return TRUE; + } + + if (m_world != NULL && m_world->Notify(p_param) != 0) { + return TRUE; + } + + if (p_param.GetType() == c_notificationButtonDown) { + MxPresenter* presenter = VideoManager()->GetPresenterAt(p_param.GetX(), p_param.GetY()); + + if (presenter) { + if (presenter->GetDisplayZ() < 0) { + processRoi = FALSE; + + if (m_controlManager->FUN_10029210(p_param, presenter)) { + return TRUE; + } + } + else { + LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY()); + + if (roi == NULL && m_controlManager->FUN_10029210(p_param, presenter)) { + return TRUE; + } + } + } + } + else if (p_param.GetType() == c_notificationButtonUp) { + if (g_unk0x100f31b0 != -1 || m_controlManager->GetUnknown0x10() || + m_controlManager->GetUnknown0x0c() == 1) { + MxBool result = m_controlManager->FUN_10029210(p_param, NULL); + StopAutoDragTimer(); + + m_unk0x80 = 0; + m_unk0x81 = 0; + return result; + } + } + + if (FUN_1005cdf0(p_param)) { + if (processRoi && p_param.GetType() == c_notificationType11) { + LegoROI* roi = PickROI(p_param.GetX(), p_param.GetY()); + p_param.SetROI(roi); + + if (roi && roi->GetUnk0x0c() == 1) { + for (OrientableROI* oroi = roi->GetUnknown0xd4(); oroi; oroi = oroi->GetUnknown0xd4()) + roi = (LegoROI*) oroi; + + LegoEntity* entity = roi->GetUnknown0x104(); + if (entity && entity->Notify(p_param) != 0) { + return TRUE; + } + } + } + + if (m_camera && m_camera->Notify(p_param) != 0) { + return TRUE; + } + } + } + } + + return FALSE; +} + +// STUB: LEGO1 0x1005cdf0 +MxBool LegoInputManager::FUN_1005cdf0(LegoEventNotificationParam& p_param) { // TODO return FALSE; } // FUNCTION: LEGO1 0x1005cfb0 -void LegoInputManager::SetTimer() +void LegoInputManager::StartAutoDragTimer() { - LegoOmni* omni = LegoOmni::GetInstance(); - UINT timer = ::SetTimer(omni->GetWindowHandle(), 1, m_timeout, NULL); - m_timer = timer; + m_autoDragTimerID = ::SetTimer(LegoOmni::GetInstance()->GetWindowHandle(), 1, m_autoDragTime, NULL); } // FUNCTION: LEGO1 0x1005cfd0 -void LegoInputManager::KillTimer() +void LegoInputManager::StopAutoDragTimer() { - if (m_timer != 0) { - LegoOmni* omni = LegoOmni::GetInstance(); - ::KillTimer(omni->GetWindowHandle(), m_timer); - } + if (m_autoDragTimerID) + ::KillTimer(LegoOmni::GetInstance()->GetWindowHandle(), m_autoDragTimerID); } // FUNCTION: LEGO1 0x1005cff0 diff --git a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp index f31879b3..cbb68b79 100644 --- a/LEGO1/lego/legoomni/src/video/legovideomanager.cpp +++ b/LEGO1/lego/legoomni/src/video/legovideomanager.cpp @@ -330,10 +330,19 @@ void LegoVideoManager::DrawFPS() // TODO } -// STUB: LEGO1 0x1007c080 -void LegoVideoManager::VTable0x38(undefined4, undefined4) +// FUNCTION: LEGO1 0x1007c080 +MxPresenter* LegoVideoManager::GetPresenterAt(MxS32 p_x, MxS32 p_y) { - // TODO + MxPresenterListCursor cursor(m_presenters); + MxPresenter* presenter; + + while (cursor.Prev(presenter)) { + if (presenter->IsHit(p_x, p_y)) { + return presenter; + } + } + + return NULL; } // FUNCTION: LEGO1 0x1007c290 diff --git a/LEGO1/lego/sources/roi/legoroi.h b/LEGO1/lego/sources/roi/legoroi.h index 9b586353..6ac30b45 100644 --- a/LEGO1/lego/sources/roi/legoroi.h +++ b/LEGO1/lego/sources/roi/legoroi.h @@ -42,6 +42,7 @@ class LegoROI : public ViewROI { inline const char* GetUnknown0xe4() { return m_unk0xe4; } inline LegoEntity* GetUnknown0x104() { return m_unk0x104; } + inline void SetUnknown0x104(LegoEntity* p_unk0x104) { m_unk0x104 = p_unk0x104; } // SYNTHETIC: LEGO1 0x100a9ad0 diff --git a/LEGO1/omni/include/mxnotificationparam.h b/LEGO1/omni/include/mxnotificationparam.h index e990abe6..a6055fa2 100644 --- a/LEGO1/omni/include/mxnotificationparam.h +++ b/LEGO1/omni/include/mxnotificationparam.h @@ -48,6 +48,8 @@ class MxNotificationParam : public MxParam { inline MxCore* GetSender() const { return m_sender; } inline NotificationId GetType() const { return m_type; } + inline void SetType(NotificationId p_type) { m_type = p_type; } + protected: NotificationId m_type; // 0x04 MxCore* m_sender; // 0x08 diff --git a/LEGO1/realtime/orientableroi.h b/LEGO1/realtime/orientableroi.h index 36b8ae50..adbd493d 100644 --- a/LEGO1/realtime/orientableroi.h +++ b/LEGO1/realtime/orientableroi.h @@ -32,6 +32,7 @@ class OrientableROI : public ROI { const float* GetWorldPosition() const { return m_local2world[3]; } const float* GetWorldDirection() const { return m_local2world[2]; } const float* GetWorldUp() const { return m_local2world[1]; } + OrientableROI* GetUnknown0xd4() const { return m_unk0xd4; } protected: MxMatrix m_local2world; // 0x10 @@ -46,7 +47,7 @@ class OrientableROI : public ROI { Mx3DPointFloat m_unk0x94; // 0x94 BoundingSphere m_world_bounding_sphere; // 0xa8 Mx3DPointFloat m_world_velocity; // 0xc0 - undefined4 m_unk0xd4; // 0xd4 + OrientableROI* m_unk0xd4; // 0xd4 undefined4 m_unk0xd8; // 0xd8 }; diff --git a/LEGO1/realtime/roi.h b/LEGO1/realtime/roi.h index 08db5080..b5cbefa5 100644 --- a/LEGO1/realtime/roi.h +++ b/LEGO1/realtime/roi.h @@ -103,6 +103,8 @@ class ROI { int GetLODCount() const { return m_lods ? m_lods->Size() : 0; } const CompoundObject* GetComp() const { return m_comp; } + inline undefined GetUnk0x0c() { return m_unk0xc; } + // SYNTHETIC: LEGO1 0x100a5d60 // ROI::`scalar deleting destructor' From 4137cd75e605a6699ea04eca8046d6baffe47be5 Mon Sep 17 00:00:00 2001 From: MS Date: Sun, 28 Jan 2024 09:25:45 -0500 Subject: [PATCH 33/34] parser: Identify namespaces (#499) --- .../isledecomp/isledecomp/cvdump/demangler.py | 5 + tools/isledecomp/isledecomp/parser/parser.py | 70 +++++++++++- tools/isledecomp/isledecomp/parser/util.py | 30 ++++- tools/isledecomp/tests/test_curly.py | 73 ++++++++++++ tools/isledecomp/tests/test_demangler.py | 1 + tools/isledecomp/tests/test_parser.py | 108 ++++++++++++++++++ 6 files changed, 280 insertions(+), 7 deletions(-) create mode 100644 tools/isledecomp/tests/test_curly.py diff --git a/tools/isledecomp/isledecomp/cvdump/demangler.py b/tools/isledecomp/isledecomp/cvdump/demangler.py index 07fca42f..10984bff 100644 --- a/tools/isledecomp/isledecomp/cvdump/demangler.py +++ b/tools/isledecomp/isledecomp/cvdump/demangler.py @@ -68,4 +68,9 @@ def demangle_vtable(symbol: str) -> str: return f"{class_name}<{generic}>" + # If we have two classes listed, it is a namespace hierarchy. + # @@6B@ is a common generic suffix for these vtable symbols. + if t[1] != "" and t[1] != "6B": + return t[1] + "::" + t[0] + return t[0] diff --git a/tools/isledecomp/isledecomp/parser/parser.py b/tools/isledecomp/isledecomp/parser/parser.py index 3c955fc3..4d8beace 100644 --- a/tools/isledecomp/isledecomp/parser/parser.py +++ b/tools/isledecomp/isledecomp/parser/parser.py @@ -8,6 +8,8 @@ get_synthetic_name, remove_trailing_comment, get_string_contents, + sanitize_code_line, + scopeDetectRegex, ) from .marker import ( DecompMarker, @@ -59,6 +61,57 @@ def empty(self): self.markers = {} +class CurlyManager: + """Overly simplified scope manager""" + + def __init__(self): + self._stack = [] + + def reset(self): + self._stack = [] + + def _pop(self): + """Pop stack safely""" + try: + self._stack.pop() + except IndexError: + pass + + def get_prefix(self, name: Optional[str] = None) -> str: + """Return the prefix for where we are.""" + + scopes = [t for t in self._stack if t != "{"] + if len(scopes) == 0: + return name if name is not None else "" + + if name is not None and name not in scopes: + scopes.append(name) + + return "::".join(scopes) + + def read_line(self, raw_line: str): + """Read a line of code and update the stack.""" + line = sanitize_code_line(raw_line) + if (match := scopeDetectRegex.match(line)) is not None: + if not line.endswith(";"): + self._stack.append(match.group("name")) + + change = line.count("{") - line.count("}") + if change > 0: + for _ in range(change): + self._stack.append("{") + elif change < 0: + for _ in range(-change): + self._pop() + + if len(self._stack) == 0: + return + + last = self._stack[-1] + if last != "{": + self._pop() + + class DecompParser: # pylint: disable=too-many-instance-attributes # Could combine output lists into a single list to get under the limit, @@ -73,6 +126,8 @@ def __init__(self) -> None: self.last_line: str = "" + self.curly = CurlyManager() + # To allow for multiple markers where code is shared across different # modules, save lists of compatible markers that appear in sequence self.fun_markers = MarkerDict() @@ -110,6 +165,8 @@ def reset(self): self.function_start = 0 self.function_sig = "" + self.curly.reset() + @property def functions(self) -> List[ParserFunction]: return [s for s in self._symbols if isinstance(s, ParserFunction)] @@ -213,7 +270,7 @@ def _vtable_done(self, class_name: str = None): line_number=self.line_number, module=marker.module, offset=marker.offset, - name=class_name, + name=self.curly.get_prefix(class_name), ) ) @@ -254,7 +311,7 @@ def _variable_done( line_number=self.line_number, module=marker.module, offset=marker.offset, - name=variable_name, + name=self.curly.get_prefix(variable_name), is_static=self.state == ReaderState.IN_FUNC_GLOBAL, ) ) @@ -353,6 +410,8 @@ def read_line(self, line: str): self._handle_marker(marker) return + self.curly.read_line(line) + line_strip = line.strip() if self.state in ( ReaderState.IN_SYNTHETIC, @@ -451,8 +510,11 @@ def read_line(self, line: str): variable_name = get_variable_name(line) # This is out of our control for library variables, but all of our # variables should start with "g_". - if variable_name is not None and not variable_name.startswith("g_"): - self._syntax_warning(ParserError.GLOBAL_MISSING_PREFIX) + if variable_name is not None: + # Before checking for the prefix, remove the + # namespace chain if there is one. + if not variable_name.split("::")[-1].startswith("g_"): + self._syntax_warning(ParserError.GLOBAL_MISSING_PREFIX) string_name = get_string_contents(line) diff --git a/tools/isledecomp/isledecomp/parser/util.py b/tools/isledecomp/isledecomp/parser/util.py index dd90fd03..bfe3803c 100644 --- a/tools/isledecomp/isledecomp/parser/util.py +++ b/tools/isledecomp/isledecomp/parser/util.py @@ -7,15 +7,25 @@ # flexibility in the formatting seems OK templateCommentRegex = re.compile(r"\s*//\s+(.*)") - # To remove any comment (//) or block comment (/*) and its leading spaces # from the end of a code line trailingCommentRegex = re.compile(r"(\s*(?://|/\*).*)$") +# Get char contents, ignore escape characters +singleQuoteRegex = re.compile(r"('(?:[^\'\\]|\\.)')") + +# Match contents of block comment on one line +blockCommentRegex = re.compile(r"(/\*.*?\*/)") + +# Match contents of single comment on one line +regularCommentRegex = re.compile(r"(//.*)") # Get string contents, ignore escape characters that might interfere doubleQuoteRegex = re.compile(r"(\"(?:[^\"\\]|\\.)*\")") +# Detect a line that would cause us to enter a new scope +scopeDetectRegex = re.compile(r"(?:class|struct|namespace) (?P\w+).*(?:{)?") + def get_synthetic_name(line: str) -> Optional[str]: """Synthetic names appear on a single line comment on the line after the marker. @@ -28,6 +38,20 @@ def get_synthetic_name(line: str) -> Optional[str]: return None +def sanitize_code_line(line: str) -> str: + """Helper for scope manager. Removes sections from a code line + that would cause us to incorrectly detect curly brackets. + This is a very naive implementation and fails entirely on multi-line + strings or comments.""" + + line = singleQuoteRegex.sub("''", line) + line = doubleQuoteRegex.sub('""', line) + line = blockCommentRegex.sub("", line) + line = regularCommentRegex.sub("", line) + + return line.strip() + + def remove_trailing_comment(line: str) -> str: return trailingCommentRegex.sub("", line) @@ -75,8 +99,8 @@ def get_class_name(line: str) -> Optional[str]: return None -global_regex = re.compile(r"(?Pg_\w+)") -less_strict_global_regex = re.compile(r"(?P\w+)(?:\)\(|\[.*|\s*=.*|;)") +global_regex = re.compile(r"(?P(?:\w+::)*g_\w+)") +less_strict_global_regex = re.compile(r"(?P(?:\w+::)*\w+)(?:\)\(|\[.*|\s*=.*|;)") def get_variable_name(line: str) -> Optional[str]: diff --git a/tools/isledecomp/tests/test_curly.py b/tools/isledecomp/tests/test_curly.py new file mode 100644 index 00000000..8328f5e9 --- /dev/null +++ b/tools/isledecomp/tests/test_curly.py @@ -0,0 +1,73 @@ +# nyuk nyuk nyuk +import pytest +from isledecomp.parser.parser import CurlyManager +from isledecomp.parser.util import sanitize_code_line + + +@pytest.fixture(name="curly") +def fixture_curly(): + return CurlyManager() + + +def test_simple(curly): + curly.read_line("namespace Test {") + assert curly.get_prefix() == "Test" + curly.read_line("}") + assert curly.get_prefix() == "" + + +def test_oneliner(curly): + """Should not go down into a scope for a class forward reference""" + curly.read_line("class LegoEntity;") + assert curly.get_prefix() == "" + # Now make sure that we still would not consider that class name + # even after reading the opening curly brace + curly.read_line("if (true) {") + assert curly.get_prefix() == "" + + +def test_ignore_comments(curly): + curly.read_line("namespace Test {") + curly.read_line("// }") + assert curly.get_prefix() == "Test" + + +@pytest.mark.xfail(reason="todo: need a real lexer") +def test_ignore_multiline_comments(curly): + curly.read_line("namespace Test {") + curly.read_line("/*") + curly.read_line("}") + curly.read_line("*/") + assert curly.get_prefix() == "Test" + curly.read_line("}") + assert curly.get_prefix() == "" + + +def test_nested(curly): + curly.read_line("namespace Test {") + curly.read_line("namespace Foo {") + assert curly.get_prefix() == "Test::Foo" + curly.read_line("}") + assert curly.get_prefix() == "Test" + + +sanitize_cases = [ + ("", ""), + (" ", ""), + ("{", "{"), + ("// comments {", ""), + ("{ // why comment here", "{"), + ("/* comments */ {", "{"), + ('"curly in a string {"', '""'), + ('if (!strcmp("hello { there }", g_test)) {', 'if (!strcmp("", g_test)) {'), + ("'{'", "''"), + ("weird_function('\"', hello, '\"')", "weird_function('', hello, '')"), +] + + +@pytest.mark.parametrize("start, end", sanitize_cases) +def test_sanitize(start: str, end: str): + """Make sure that we can remove curly braces in places where they should + not be considered as part of the semantic structure of the file. + i.e. inside strings or chars, and inside comments""" + assert sanitize_code_line(start) == end diff --git a/tools/isledecomp/tests/test_demangler.py b/tools/isledecomp/tests/test_demangler.py index 32cac502..9d0b5203 100644 --- a/tools/isledecomp/tests/test_demangler.py +++ b/tools/isledecomp/tests/test_demangler.py @@ -48,6 +48,7 @@ def test_invalid_encoded_number(): ("??_7LegoCarBuildAnimPresenter@@6B@", "LegoCarBuildAnimPresenter"), ("??_7?$MxCollection@PAVLegoWorld@@@@6B@", "MxCollection"), ("??_7?$MxPtrList@VLegoPathController@@@@6B@", "MxPtrList"), + ("??_7Renderer@Tgl@@6B@", "Tgl::Renderer"), ] diff --git a/tools/isledecomp/tests/test_parser.py b/tools/isledecomp/tests/test_parser.py index 6d8b72b1..7dcc24b1 100644 --- a/tools/isledecomp/tests/test_parser.py +++ b/tools/isledecomp/tests/test_parser.py @@ -521,3 +521,111 @@ def test_string_ignore_g_prefix(parser): ) assert len(parser.strings) == 1 assert len(parser.alerts) == 0 + + +def test_class_variable(parser): + """We should accurately name static variables that are class members.""" + + parser.read_lines( + [ + "class Test {", + "protected:", + " // GLOBAL: TEST 0x1234", + " static int g_test;", + "};", + ] + ) + + assert len(parser.variables) == 1 + assert parser.variables[0].name == "Test::g_test" + + +def test_namespace_variable(parser): + """We should identify a namespace surrounding any global variables""" + + parser.read_lines( + [ + "namespace Test {", + "// GLOBAL: TEST 0x1234", + "int g_test = 1234;", + "}", + "// GLOBAL: TEST 0x5555", + "int g_second = 2;", + ] + ) + + assert len(parser.variables) == 2 + assert parser.variables[0].name == "Test::g_test" + assert parser.variables[1].name == "g_second" + + +def test_namespace_vtable(parser): + parser.read_lines( + [ + "namespace Tgl {", + "// VTABLE: TEST 0x1234", + "class Renderer {", + "};", + "}", + "// VTABLE: TEST 0x5555", + "class Hello { };", + ] + ) + + assert len(parser.vtables) == 2 + assert parser.vtables[0].name == "Tgl::Renderer" + assert parser.vtables[1].name == "Hello" + + +def test_global_prefix_namespace(parser): + """Should correctly identify namespaces before checking for the g_ prefix""" + + parser.read_lines( + [ + "class Test {", + " // GLOBAL: TEST 0x1234", + " static int g_count = 0;", + " // GLOBAL: TEST 0x5555", + " static int count = 0;", + "};", + ] + ) + + assert len(parser.variables) == 2 + assert parser.variables[0].name == "Test::g_count" + assert parser.variables[1].name == "Test::count" + + assert len(parser.alerts) == 1 + assert parser.alerts[0].code == ParserError.GLOBAL_MISSING_PREFIX + + +def test_nested_namespace(parser): + parser.read_lines( + [ + "namespace Tgl {", + "class Renderer {", + " // GLOBAL: TEST 0x1234", + " static int g_count = 0;", + "};", + "};", + ] + ) + + assert len(parser.variables) == 1 + assert parser.variables[0].name == "Tgl::Renderer::g_count" + + +def test_match_qualified_variable(parser): + """If a variable belongs to a scope and we use a fully qualified reference + below a GLOBAL marker, make sure we capture the full name.""" + + parser.read_lines( + [ + "// GLOBAL: TEST 0x1234", + "int MxTest::g_count = 0;", + ] + ) + + assert len(parser.variables) == 1 + assert parser.variables[0].name == "MxTest::g_count" + assert len(parser.alerts) == 0 From c0acf11f9bc0da5c8adf3e0f6eb1d5412e7c4072 Mon Sep 17 00:00:00 2001 From: Nathan M Gilbert Date: Sun, 28 Jan 2024 11:45:49 -0500 Subject: [PATCH 34/34] Implement/Match LegoTree (#485) * Implement/Match LegoTree * Fix vtable * Fixes --------- Co-authored-by: Christian Semmler --- CMakeLists.txt | 1 + .../lego/legoomni/include/legoanimpresenter.h | 28 +---- .../legoomni/src/video/legoanimpresenter.cpp | 46 ++------ LEGO1/lego/sources/misc/legotree.cpp | 110 ++++++++++++++++++ LEGO1/lego/sources/misc/legotree.h | 77 ++++++++++++ 5 files changed, 204 insertions(+), 58 deletions(-) create mode 100644 LEGO1/lego/sources/misc/legotree.cpp create mode 100644 LEGO1/lego/sources/misc/legotree.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 388c4777..03353834 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -106,6 +106,7 @@ add_library(misc STATIC LEGO1/lego/sources/misc/legoimage.cpp LEGO1/lego/sources/misc/legostorage.cpp LEGO1/lego/sources/misc/legotexture.cpp + LEGO1/lego/sources/misc/legotree.cpp ) register_lego1_target(misc) set_property(TARGET misc PROPERTY ARCHIVE_OUTPUT_NAME "misc$<$:d>") diff --git a/LEGO1/lego/legoomni/include/legoanimpresenter.h b/LEGO1/lego/legoomni/include/legoanimpresenter.h index 2ca9c910..594c13ca 100644 --- a/LEGO1/lego/legoomni/include/legoanimpresenter.h +++ b/LEGO1/lego/legoomni/include/legoanimpresenter.h @@ -2,6 +2,7 @@ #define LEGOANIMPRESENTER_H #include "lego/sources/misc/legostorage.h" +#include "lego/sources/misc/legotree.h" #include "mxgeometry/mxgeometry3d.h" #include "mxvideopresenter.h" @@ -75,37 +76,20 @@ class LegoAnimPresenter : public MxVideoPresenter { // SYNTHETIC: LEGO1 0x10068650 // LegoAnimPresenter::`scalar deleting destructor' -// VTABLE: LEGO1 0x100db768 -// SIZE 0x08 -class LegoAnimClassBase { -public: - LegoAnimClassBase(); - virtual ~LegoAnimClassBase(); - - virtual void VTable0x4(); // vtable+0x04 - virtual void VTable0x8(); // vtable+0x08 - virtual void VTable0xc(); // vtable+0x0c - - undefined4 m_unk0x4; // 0x04 -}; - -// SYNTHETIC: LEGO1 0x10099de0 -// LegoAnimClassBase::`scalar deleting destructor' - // VTABLE: LEGO1 0x100db8d8 // SIZE 0x18 -class LegoAnimClass : public LegoAnimClassBase { +class LegoAnimClass : public LegoTree { public: LegoAnimClass(); virtual ~LegoAnimClass() override; - virtual void VTable0x8() override; // vtable+0x08 - virtual void VTable0xc() override; // vtable+0x0c - virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10 + virtual LegoResult Write(LegoStorage* p_storage) override; // vtable+0x08 + virtual LegoTreeNodeData* CreateData() override; // vtable+0x0c + virtual MxResult VTable0x10(LegoMemory* p_stream, MxS32); // vtable+0x10 inline MxLong GetUnknown0x8() { return m_unk0x8; } - // private: +private: MxLong m_unk0x8; // 0x08 undefined4 m_unk0xc; // 0x0c undefined4 m_unk0x10; // 0x10 diff --git a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp index 6da994ec..be04b444 100644 --- a/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp +++ b/LEGO1/lego/legoomni/src/video/legoanimpresenter.cpp @@ -8,7 +8,6 @@ #include "mxvideomanager.h" DECOMP_SIZE_ASSERT(LegoAnimPresenter, 0xc0) -DECOMP_SIZE_ASSERT(LegoAnimClassBase, 0x08) DECOMP_SIZE_ASSERT(LegoAnimClass, 0x18) // FUNCTION: LEGO1 0x10068420 @@ -140,12 +139,7 @@ void LegoAnimPresenter::StreamingTickle() m_subscriber->DestroyChunk(chunk); } - if (m_unk0x95 == 0) { - if (m_unk0x64->m_unk0x8 + m_action->GetStartTime() < m_action->GetElapsedTime()) { - m_unk0x95 = 1; - } - } - else { + if (m_unk0x95) { ProgressTickleState(e_done); if (m_compositePresenter) { if (m_compositePresenter->IsA("LegoAnimMMPresenter")) { @@ -153,6 +147,11 @@ void LegoAnimPresenter::StreamingTickle() } } } + else { + if (m_action->GetElapsedTime() > m_unk0x64->GetUnknown0x8() + m_action->GetStartTime()) { + m_unk0x95 = 1; + } + } } // STUB: LEGO1 0x1006b8c0 @@ -200,33 +199,6 @@ void LegoAnimPresenter::EndAction() MxVideoPresenter::EndAction(); } -// FUNCTION: LEGO1 0x10099dd0 -LegoAnimClassBase::LegoAnimClassBase() -{ - m_unk0x4 = 0; -} - -// STUB: LEGO1 0x10099e00 -LegoAnimClassBase::~LegoAnimClassBase() -{ - // TODO -} - -// STUB: LEGO1 0x10099e20 -void LegoAnimClassBase::VTable0x4() -{ -} - -// STUB: LEGO1 0x10099e40 -void LegoAnimClassBase::VTable0x8() -{ -} - -// STUB: LEGO1 0x10099f70 -void LegoAnimClassBase::VTable0xc() -{ -} - // FUNCTION: LEGO1 0x100a0b30 LegoAnimClass::LegoAnimClass() { @@ -249,13 +221,15 @@ MxResult LegoAnimClass::VTable0x10(LegoMemory* p_stream, MxS32) } // STUB: LEGO1 0x100a0e30 -void LegoAnimClass::VTable0x8() +LegoResult LegoAnimClass::Write(LegoStorage* p_storage) { // TODO + return SUCCESS; } // STUB: LEGO1 0x100a1040 -void LegoAnimClass::VTable0xc() +LegoTreeNodeData* LegoAnimClass::CreateData() { // TODO + return NULL; } diff --git a/LEGO1/lego/sources/misc/legotree.cpp b/LEGO1/lego/sources/misc/legotree.cpp new file mode 100644 index 00000000..e7f24513 --- /dev/null +++ b/LEGO1/lego/sources/misc/legotree.cpp @@ -0,0 +1,110 @@ +#include "legotree.h" + +#include "decomp.h" +#include "legostorage.h" + +DECOMP_SIZE_ASSERT(LegoTreeNodeData, 0x04) +DECOMP_SIZE_ASSERT(LegoTreeNode, 0x010) +DECOMP_SIZE_ASSERT(LegoTree, 0x08) + +// FUNCTION: LEGO1 0x10099d60 +LegoTreeNode::LegoTreeNode() +{ + m_data = NULL; + m_numChildren = 0; + m_children = NULL; +} + +// FUNCTION: LEGO1 0x10099da0 +LegoTreeNode::~LegoTreeNode() +{ + if (m_data) { + delete m_data; + } + if (m_children) { + delete[] m_children; + } +} + +// FUNCTION: LEGO1 0x10099dd0 +LegoTree::LegoTree() +{ + m_root = NULL; +} + +// FUNCTION: LEGO1 0x10099e00 +LegoTree::~LegoTree() +{ + if (m_root) { + Delete(m_root); + } +} + +// FUNCTION: LEGO1 0x10099e20 +LegoResult LegoTree::Read(LegoStorage* p_storage) +{ + return Read(p_storage, m_root); +} + +// FUNCTION: LEGO1 0x10099e40 +LegoResult LegoTree::Write(LegoStorage* p_storage) +{ + return Write(p_storage, m_root); +} + +// FUNCTION: LEGO1 0x10099e60 +LegoResult LegoTree::Read(LegoStorage* p_storage, LegoTreeNode*& p_node) +{ + LegoResult result; + p_node = new LegoTreeNode(); + p_node->SetData(CreateData()); + if ((result = p_node->GetData()->Read(p_storage)) != SUCCESS) { + return result; + } + LegoU32 numChildren; + if ((result = p_storage->Read(&numChildren, sizeof(numChildren))) != SUCCESS) { + return result; + } + if (numChildren) { + p_node->SetChildren(new LegoTreeNode*[numChildren]); + for (LegoU32 i = 0; i < numChildren; i++) { + LegoTreeNode* node; + if ((result = Read(p_storage, node)) != SUCCESS) { + return result; + } + p_node->SetNumChildren(p_node->GetNumChildren() + 1); + p_node->SetChild(i, node); + } + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x1009a020 +LegoResult LegoTree::Write(LegoStorage* p_storage, LegoTreeNode* p_node) +{ + LegoResult result; + if (p_node->GetData()) { + if ((result = p_node->GetData()->Write(p_storage)) != SUCCESS) { + return result; + } + } + LegoU32 numChildren = p_node->GetNumChildren(); + if ((result = p_storage->Write(&numChildren, sizeof(numChildren))) != SUCCESS) { + return result; + } + for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) { + if ((result = Write(p_storage, p_node->GetChild(i))) != SUCCESS) { + return result; + } + } + return SUCCESS; +} + +// FUNCTION: LEGO1 0x1009a0a0 +void LegoTree::Delete(LegoTreeNode* p_node) +{ + for (LegoU32 i = 0; i < p_node->GetNumChildren(); i++) { + Delete(p_node->GetChild(i)); + } + delete p_node; +} diff --git a/LEGO1/lego/sources/misc/legotree.h b/LEGO1/lego/sources/misc/legotree.h new file mode 100644 index 00000000..185c178f --- /dev/null +++ b/LEGO1/lego/sources/misc/legotree.h @@ -0,0 +1,77 @@ +#ifndef __LEGOTREE_H +#define __LEGOTREE_H + +#ifdef _DEBUG +#include +#endif +#include "legotypes.h" + +class LegoStorage; + +// VTABLE: LEGO1 0x100db778 +// SIZE 0x4 +class LegoTreeNodeData { +public: + LegoTreeNodeData() {} + virtual ~LegoTreeNodeData() {} + + // FUNCTION: LEGO1 0x10099fe0 + virtual LegoResult Read(LegoStorage* p_storage) { return SUCCESS; } // vtable+0x4 + + // FUNCTION: LEGO1 0x10099ff0 + virtual LegoResult Write(LegoStorage* p_storage) { return SUCCESS; } // vtable+0x8 + + // SYNTHETIC: LEGO1 0x1009a000 + // LegoTreeNodeData::`scalar deleting destructor' +}; + +// VTABLE: LEGO1 0x100db764 +// SIZE 0x10 +class LegoTreeNode { +public: + LegoTreeNode(); + virtual ~LegoTreeNode(); + LegoTreeNodeData* GetData() { return m_data; } + void SetData(LegoTreeNodeData* p_data) { m_data = p_data; } + LegoU32 GetNumChildren() { return m_numChildren; } + void SetNumChildren(LegoU32 p_numChildren) { m_numChildren = p_numChildren; } + LegoTreeNode* GetChild(LegoU32 p_i) { return m_children[p_i]; } + void SetChild(LegoU32 p_i, LegoTreeNode* p_child) { m_children[p_i] = p_child; } + LegoTreeNode** GetChildren() { return m_children; } + void SetChildren(LegoTreeNode** p_children) { m_children = p_children; } + + // SYNTHETIC: LEGO1 0x10099d80 + // LegoTreeNode::`scalar deleting destructor' + +protected: + LegoTreeNodeData* m_data; // 0x4 + LegoU32 m_numChildren; // 0x8 + LegoTreeNode** m_children; // 0xc +}; + +// VTABLE: LEGO1 0x100db768 +// SIZE 0x8 +class LegoTree { +public: + LegoTree(); + virtual ~LegoTree(); + LegoTreeNode* GetRoot() { return m_root; } + void SetRoot(LegoTreeNode* p_root) { m_root = p_root; } + virtual LegoResult Read(LegoStorage* p_storage); // vtable+0x4 + virtual LegoResult Write(LegoStorage* p_storage); // vtable+0x8 + + // SYNTHETIC: LEGO1 0x10099de0 + // LegoTree::`scalar deleting destructor' + +protected: + LegoResult Read(LegoStorage* p_storage, LegoTreeNode*& p_node); + LegoResult Write(LegoStorage* p_storage, LegoTreeNode* p_node); + void Delete(LegoTreeNode* p_node); + + // FUNCTION: LEGO1 0x10099f70 + virtual LegoTreeNodeData* CreateData() { return new LegoTreeNodeData(); } // vtable+0xc + + LegoTreeNode* m_root; // 0x4 +}; + +#endif // __LEGOTREE_H