From 0c8705a9df651ba6618b77f42dfe38ae844f2381 Mon Sep 17 00:00:00 2001 From: Ramen2X <64166386+Ramen2X@users.noreply.github.com> Date: Sat, 14 Oct 2023 15:54:49 -0400 Subject: [PATCH] implement/match MxTransitionManager::Transition_Broken() (#210) --- LEGO1/mxtransitionmanager.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/LEGO1/mxtransitionmanager.cpp b/LEGO1/mxtransitionmanager.cpp index a7b1ba3d..c2645292 100644 --- a/LEGO1/mxtransitionmanager.cpp +++ b/LEGO1/mxtransitionmanager.cpp @@ -347,17 +347,35 @@ void MxTransitionManager::Transition_Pixelation() } - // OFFSET: LEGO1 0x1004c270 STUB void MxTransitionManager::Transition_Windows() { // TODO } -// OFFSET: LEGO1 0x1004c3e0 STUB +// OFFSET: LEGO1 0x1004c3e0 void MxTransitionManager::Transition_Broken() { - // TODO + // This function has no actual animation logic. + // It also never calls EndTransition to + // properly terminate the transition, so + // the game just hangs forever. + + DDSURFACEDESC ddsd; + ZeroMemory(&ddsd, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + HRESULT res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); + if (res == DDERR_SURFACELOST) { + m_ddSurface->Restore(); + res = m_ddSurface->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL); + } + + if (res == DD_OK) { + SubmitCopyRect(&ddsd); + SetupCopyRect(&ddsd); + m_ddSurface->Unlock(ddsd.lpSurface); + } } // OFFSET: LEGO1 0x1004c170