This commit is contained in:
Misha 2024-01-20 15:23:54 -05:00
parent dc87da71e7
commit aa85b61af7
No known key found for this signature in database
GPG Key ID: 8441D12AEF33FED8
4 changed files with 28 additions and 26 deletions

View File

@ -72,8 +72,8 @@ class LegoVideoManager : public MxVideoManager {
MxS32 m_cursorYCopy; // 0x508 MxS32 m_cursorYCopy; // 0x508
MxS32 m_cursorX; // 0x50c MxS32 m_cursorX; // 0x50c
MxS32 m_cursorY; // 0x510 MxS32 m_cursorY; // 0x510
LPDIRECTDRAWSURFACE m_unk0x514; // 0x514 LPDIRECTDRAWSURFACE m_cursorSurface; // 0x514
RECT m_unk0x518; // 0x518 RECT m_cursorRect; // 0x518
undefined4 m_unk0x528; // 0x528 undefined4 m_unk0x528; // 0x528
MxBool m_drawFPS; // 0x52c MxBool m_drawFPS; // 0x52c
RECT m_fpsRect; // 0x530 RECT m_fpsRect; // 0x530

View File

@ -309,18 +309,19 @@ inline void LegoVideoManager::DrawCursor()
LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2(); LPDIRECTDRAWSURFACE ddSurface2 = m_displaySurface->GetDirectDrawSurface2();
if (!m_unk0x514) { if (!m_cursorSurface) {
m_unk0x518.top = 0; m_cursorRect.top = 0;
m_unk0x518.left = 0; m_cursorRect.left = 0;
m_unk0x518.bottom = 16; m_cursorRect.bottom = 16;
m_unk0x518.right = 16; m_cursorRect.right = 16;
m_unk0x514 = MxDisplaySurface::FUN_100bc070(); m_cursorSurface = MxDisplaySurface::CreateCursorSurface();
if (!m_unk0x514) if (!m_cursorSurface)
m_drawCursor = FALSE; 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 // STUB: LEGO1 0x1007bbc0

View File

@ -91,7 +91,7 @@ class MxDisplaySurface : public MxCore {
); // vtable+0x44 ); // vtable+0x44
void ClearScreen(); void ClearScreen();
static LPDIRECTDRAWSURFACE FUN_100bc070(); static LPDIRECTDRAWSURFACE CreateCursorSurface();
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface1() { return this->m_ddSurface1; }
inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; } inline LPDIRECTDRAWSURFACE GetDirectDrawSurface2() { return this->m_ddSurface2; }

View File

@ -680,7 +680,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::VTable0x44(
} }
// FUNCTION: LEGO1 0x100bc070 // FUNCTION: LEGO1 0x100bc070
LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070() LPDIRECTDRAWSURFACE MxDisplaySurface::CreateCursorSurface()
{ {
LPDIRECTDRAWSURFACE newSurface = NULL; LPDIRECTDRAWSURFACE newSurface = NULL;
IDirectDraw* draw = MVideoManager()->GetDirectDraw(); IDirectDraw* draw = MVideoManager()->GetDirectDraw();
@ -700,17 +700,18 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070()
ddsd.dwWidth = 16; ddsd.dwWidth = 16;
ddsd.dwHeight = 16; ddsd.dwHeight = 16;
ddsd.dwFlags = 4103; ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
ddsd.ddsCaps.dwCaps = 16448; ddsd.ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_OFFSCREENPLAIN;
if (draw->CreateSurface(&ddsd, &newSurface, NULL) == S_OK) { if (draw->CreateSurface(&ddsd, &newSurface, NULL) == S_OK) {
ddsd.ddsCaps.dwCaps &= ~0x4000; ddsd.ddsCaps.dwCaps &= ~DDSCAPS_VIDEOMEMORY;
ddsd.ddsCaps.dwCaps |= 0x800; ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
if (draw->CreateSurface(&ddsd, &newSurface, NULL) == S_OK) { if (draw->CreateSurface(&ddsd, &newSurface, NULL) == S_OK) {
memset(&ddsd, 0, sizeof(ddsd)); memset(&ddsd, 0, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd); ddsd.dwSize = sizeof(ddsd);
if (newSurface->Lock(NULL, &ddsd, 1, NULL) != S_OK) { if (newSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL) != S_OK) {
if (newSurface) { if (newSurface) {
newSurface->Release(); newSurface->Release();
} }
@ -718,18 +719,18 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070()
return NULL; return NULL;
} }
else { else {
MxU8* surface = (MxU8*) ddsd.lpSurface; MxU16* surface = (MxU16*) ddsd.lpSurface;
for (MxU32 x = 0; x < 16; x++) { // draw a simple cursor to the surface
for (MxS32 x = 0; x < 16; x++) {
MxU8* surface2 = surface; MxU16* surface2 = surface;
for (MxU32 y = 0; y < 16; y++) { for (MxS32 y = 0; y < 16; y++) {
for (y = 0; y < 16; ++y) { for (y = 0; y < 16; ++y) {
if ((y > 10 || x) && (x > 10 || y) && x + y != 10) { if ((y > 10 || x) && (x > 10 || y) && x + y != 10) {
if (x + y <= 10) if (x + y > 10)
*surface2 = -1;
else
*surface2 = 31775; *surface2 = 31775;
else
*surface2 = -1;
} }
else { else {
*surface2 = 0; *surface2 = 0;
@ -737,7 +738,7 @@ LPDIRECTDRAWSURFACE MxDisplaySurface::FUN_100bc070()
surface2++; surface2++;
} }
} }
surface += ddsd.lPitch; surface = (MxU16*) ((MxU8*) surface + ddsd.lPitch);
} }
newSurface->Unlock(ddsd.lpSurface); newSurface->Unlock(ddsd.lpSurface);