From 8b4f94dcd8c83a2ed12b3d9d817171e94c4c53f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:24:49 +0200 Subject: [PATCH 001/557] reduce delay for new zoom feature --- src/render_d3d9.c | 2 +- src/render_ogl.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c8e911e..9109f96 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -540,7 +540,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) DWORD WINAPI d3d9_render_main(void) { - Sleep(250); + //Sleep(250); fpsl_init(); diff --git a/src/render_ogl.c b/src/render_ogl.c index a348ed6..d1c7df2 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -52,7 +52,7 @@ BOOL ogl_create() DWORD WINAPI ogl_render_main(void) { - Sleep(250); + //Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; GLenum err = GL_NO_ERROR; BOOL made_current = FALSE; @@ -91,8 +91,8 @@ DWORD WINAPI ogl_render_main(void) GL_CHECK(ogl_init_shader1_program()); GL_CHECK(ogl_init_shader2_program()); - GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test()); - GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test()); + //GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test()); + //GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test()); g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; From 72549b96103af9dbe2706dfef5715eab04b7f439 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:25:36 +0200 Subject: [PATCH 002/557] disable some hooks to avoid conflicts with voobly patches --- src/hook.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hook.c b/src/hook.c index c9641f4..416125c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -96,8 +96,8 @@ HOOKLIST g_hook_hooklist[] = { "ShowWindow", (PROC)fake_ShowWindow, (PROC*)&real_ShowWindow, 0 }, { "GetTopWindow", (PROC)fake_GetTopWindow, (PROC*)&real_GetTopWindow, 0 }, { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, - { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, - { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, + //{ "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, + //{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, @@ -161,7 +161,7 @@ HOOKLIST g_hook_hooklist[] = { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 }, + //{ "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, HOOK_SKIP_2 }, { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, HOOK_SKIP_2 }, { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, From fa14a8b60a21b334263718dfb0c89188021db477 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:26:08 +0200 Subject: [PATCH 003/557] fix downscaling with GDI renderer --- src/render_gdi.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render_gdi.c b/src/render_gdi.c index 390fc56..3501bbd 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -37,6 +37,7 @@ DWORD WINAPI gdi_render_main(void) Sleep(500); fpsl_init(); + SetStretchBltMode(g_ddraw.render.hdc, COLORONCOLOR); DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; From 918037dd3e613e722cfb473c9821022409a028f6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:27:42 +0200 Subject: [PATCH 004/557] fix jumping cursor while zooming --- src/dd.c | 4 ++-- src/mouse.c | 31 +++++++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 819a0fd..42921db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -642,8 +642,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.height = dwHeight; g_ddraw.bpp = dwBPP; - InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2); + //InterlockedExchange((LONG*)&g_ddraw.cursor.x, dwWidth / 2); + //InterlockedExchange((LONG*)&g_ddraw.cursor.y, dwHeight / 2); BOOL border = g_config.border; BOOL nonexclusive = FALSE; diff --git a/src/mouse.c b/src/mouse.c index c5b25eb..391e985 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -38,12 +38,35 @@ void mouse_lock() real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); OffsetRect(&rc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + POINT pt; + real_GetCursorPos(&pt); + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)) + { + if (pt.x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + pt.x < g_ddraw.render.viewport.x || + pt.y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + pt.y < g_ddraw.render.viewport.y) + { + pt.x = g_ddraw.width / 2; + pt.y = g_ddraw.height / 2; + } + else + { + pt.x = (DWORD)((pt.x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + pt.y = (DWORD)((pt.y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + pt.x = min(pt.x, g_ddraw.width - 1); + pt.y = min(pt.y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, pt.y); + } real_SetCursorPos( - g_config.adjmouse ? (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)) : rc.left + cur_x, - g_config.adjmouse ? (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y)) : rc.top + cur_y); + g_config.adjmouse ? (int)(rc.left + (pt.x * g_ddraw.mouse.scale_x)) : rc.left + pt.x, + g_config.adjmouse ? (int)(rc.top + (pt.y * g_ddraw.mouse.scale_y)) : rc.top + pt.y); CopyRect(&rc, &g_ddraw.mouse.rc); real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); From ec0dbeca6bac5252a717a811c46c049f98290cfe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:29:43 +0200 Subject: [PATCH 005/557] add workaround for flickering (black frames) during zoom --- inc/dd.h | 1 + src/ddsurface.c | 3 +++ src/dllmain.c | 1 + src/render_d3d9.c | 3 +++ src/render_ogl.c | 3 +++ 5 files changed, 11 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index bce317a..31708ff 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -168,6 +168,7 @@ typedef struct CNCDDRAW struct { + LONG frame_skip; BOOL enabled; } zoom; } CNCDDRAW; diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f6a873..83e05b6 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -418,6 +418,9 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { + if (!(dwFlags & DDBLT_COLORFILL)) + InterlockedExchange(&g_ddraw.zoom.frame_skip, 0); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) diff --git a/src/dllmain.c b/src/dllmain.c index b75c335..3dee497 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -152,6 +152,7 @@ void DDEnableZoom() TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); g_ddraw.zoom.enabled = TRUE; + InterlockedExchange(&g_ddraw.zoom.frame_skip, 20); } BOOL DDIsWindowed() diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 9109f96..876618d 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -552,6 +552,9 @@ DWORD WINAPI d3d9_render_main(void) (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && g_ddraw.render.run) { + if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0) + continue; + #if _DEBUG dbg_draw_frame_info_start(); #endif diff --git a/src/render_ogl.c b/src/render_ogl.c index d1c7df2..fa4c9d1 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -887,6 +887,9 @@ static void ogl_render() (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && g_ddraw.render.run) { + if (InterlockedDecrement(&g_ddraw.zoom.frame_skip) > 0) + continue; + #if _DEBUG dbg_draw_frame_info_start(); #endif From 889cfd92fafd28064a7355cdbe6308a5e764d37d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Jul 2024 09:42:18 +0200 Subject: [PATCH 006/557] hook ValidateRect and InvalidateRect --- inc/hook.h | 5 +++++ inc/winapi_hooks.h | 2 ++ src/hook.c | 4 ++++ src/winapi_hooks.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index cd1dab8..f6d175f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -58,6 +58,9 @@ typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); + +typedef BOOL(WINAPI* VALIDATERECTPROC)(HWND, const RECT*); +typedef BOOL(WINAPI* INVALIDATERECTPROC)(HWND, const RECT*, BOOL); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -109,6 +112,8 @@ extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; +extern VALIDATERECTPROC real_ValidateRect; +extern INVALIDATERECTPROC real_InvalidateRect; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6e2965d..4ec75c9 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -34,6 +34,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); +BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect); +BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 416125c..bab3648 100644 --- a/src/hook.c +++ b/src/hook.c @@ -51,6 +51,8 @@ PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; +VALIDATERECTPROC real_ValidateRect = ValidateRect; +INVALIDATERECTPROC real_InvalidateRect = InvalidateRect; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -100,6 +102,8 @@ HOOKLIST g_hook_hooklist[] = //{ "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, + { "ValidateRect", (PROC)fake_ValidateRect, (PROC*)&real_ValidateRect, 0 }, + { "InvalidateRect", (PROC)fake_InvalidateRect, (PROC*)&real_InvalidateRect, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b856f0e..f6bd9e8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -822,6 +822,46 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV return result; } +BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect) +{ + if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect) + return real_ValidateRect(hWnd, lpRect); + + RECT dst_rc; + + dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w)); + + OffsetRect( + &dst_rc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + return real_ValidateRect(hWnd, lpRect); +} + +BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase) +{ + if (!g_ddraw.ref || !g_ddraw.width || !g_ddraw.hwnd || hWnd != g_ddraw.hwnd || !lpRect) + return real_InvalidateRect(hWnd, lpRect, bErase); + + RECT dst_rc; + + dst_rc.left = (LONG)(roundf(lpRect->left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(lpRect->top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(lpRect->bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(lpRect->right * g_ddraw.render.scale_w)); + + OffsetRect( + &dst_rc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + return real_InvalidateRect(hWnd, &dst_rc, bErase); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 5919c0e1506cdfdc078d0e4daf5e72598725748b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 27 Jul 2024 09:52:08 +0200 Subject: [PATCH 007/557] fix ValidateRect hook --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f6bd9e8..7e5a688 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -839,7 +839,7 @@ BOOL WINAPI fake_ValidateRect(HWND hWnd, const RECT* lpRect) g_ddraw.render.viewport.x, g_ddraw.render.viewport.y); - return real_ValidateRect(hWnd, lpRect); + return real_ValidateRect(hWnd, &dst_rc); } BOOL WINAPI fake_InvalidateRect(HWND hWnd, const RECT* lpRect, BOOL bErase) From bb08a08af0825498dc87211f3e91261a0e1a9153 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 04:39:22 +0200 Subject: [PATCH 008/557] adjust preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 4d030de..0ca96a5 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,7 @@ static void cfg_create_ini() "; Emperor: Rise of the Middle Kingdom\n" "[Emperor]\n" "nonexclusive=true\n" + "adjmouse=true\n" "\n" "; Enemy Infestation\n" "[EI]\n" From 50b68a63bbe8a182e1b6f2b695e3b44a3ba72528 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 04:39:22 +0200 Subject: [PATCH 009/557] adjust preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 4d030de..0ca96a5 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,7 @@ static void cfg_create_ini() "; Emperor: Rise of the Middle Kingdom\n" "[Emperor]\n" "nonexclusive=true\n" + "adjmouse=true\n" "\n" "; Enemy Infestation\n" "[EI]\n" From 80356f76edd68a7967c4f292438ad209c70f352f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:37:14 +0200 Subject: [PATCH 010/557] =?UTF-8?q?add=20new=20limiter=20type=20"LIMIT=5FU?= =?UTF-8?q?NL=C3=96CK"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/dd.h | 1 + src/ddsurface.c | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index bce317a..a0bd368 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -49,6 +49,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_AUTO 0 #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 +#define LIMIT_UNLCK 3 #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f6a873..d20215b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1199,8 +1199,11 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) + if (g_ddraw.ticks_limiter.tick_length > 0 && + (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLCK)) + { util_limit_game_ticks(); + } } } From bc1a69330bb73b9461220e94882f9295366e69f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:38:03 +0200 Subject: [PATCH 011/557] add note about new limiter type --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0ca96a5..06f6ca4 100644 --- a/src/config.c +++ b/src/config.c @@ -265,7 +265,7 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast\n" + "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock\n" "limiter_type=0\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" From ca133861ebb30c5d2b05576c5a26496703bc745e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:39:39 +0200 Subject: [PATCH 012/557] add preset for Real War --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 1659ea2..50bcddc 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Reader Rabbit Thinking Ages 4-6 (US) - Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) +- Real War - Red Baron 3D - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) - Reksio and the UFO (Reksio i Ufo) diff --git a/src/config.c b/src/config.c index 06f6ca4..70a1b45 100644 --- a/src/config.c +++ b/src/config.c @@ -1260,6 +1260,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Real War\n" + "[RealWar]\n" + "limiter_type=3\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From cd0cfe5d5cc19928395f95c183691a0626a372e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 10:49:52 +0200 Subject: [PATCH 013/557] update Real War preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 70a1b45..26dc4c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,6 +1262,7 @@ static void cfg_create_ini() "\n" "; Real War\n" "[RealWar]\n" + "maxgameticks=60\n" "limiter_type=3\n" "\n" "; ROAD RASH\n" From d8b6395423d3b792bac9a5cca31bcffd4616531d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 23:17:16 +0200 Subject: [PATCH 014/557] enable "nonexclusive" by default --- src/config.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 26dc4c7..bd71fb7 100644 --- a/src/config.c +++ b/src/config.c @@ -62,7 +62,7 @@ void cfg_load() GET_INT(g_config.maxgameticks, "maxgameticks", 0); GET_INT(g_config.limiter_type, "limiter_type", LIMIT_AUTO); GET_INT(g_config.minfps, "minfps", 0); - GET_BOOL(g_config.nonexclusive, "nonexclusive", FALSE); + GET_BOOL(g_config.nonexclusive, "nonexclusive", TRUE); GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); @@ -274,7 +274,7 @@ static void cfg_create_ini() "\n" "; Disable fullscreen-exclusive mode for the direct3d9*/opengl* renderers\n" "; Note: Can be used in case some GUI elements like buttons/textboxes/videos/etc.. are invisible\n" - "nonexclusive=false\n" + "nonexclusive=true\n" "\n" "; Force CPU0 affinity, avoids crashes/freezing, *might* have a performance impact\n" "; Note: Disable this if the game is not running smooth or there are sound issues\n" @@ -589,6 +589,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun / Command & Conquer: Red Alert 2\n" "[game]\n" + "nonexclusive=false\n" "checkfile=.\\blowfish.dll\n" "tshack=true\n" "noactivateapp=true\n" @@ -600,6 +601,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun Demo\n" "[SUN]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -610,6 +612,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Tiberian Sun - CnCNet\n" "[ts-spawn]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "adjmouse=true\n" @@ -620,6 +623,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[ra2]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -629,6 +633,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2 - XWIS\n" "[Red Alert 2]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -638,6 +643,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge\n" "[gamemd]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -647,6 +653,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - ?ModExe?\n" "[ra2md]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -656,6 +663,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - CnCNet\n" "[gamemd-spawn]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" @@ -665,6 +673,7 @@ static void cfg_create_ini() "\n" "; Command & Conquer: Red Alert 2: Yuri's Revenge - XWIS\n" "[Yuri's Revenge]\n" + "nonexclusive=false\n" "noactivateapp=true\n" "tshack=true\n" "maxfps=60\n" From 46f0fa29d4ef5d9301a7183ef872ed8b8ac0c1b5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 1 Aug 2024 09:27:01 +0200 Subject: [PATCH 015/557] #102 add -vietnamese - translation made by TheBuck338 @ github --- config/ConfigFormUnit.cpp | 87 +++++++++++++++++++++++++++ config/Resources/VN.png | Bin 0 -> 474 bytes config/cnc-ddraw config.cbproj | 64 ++++++++++++++++++++ config/cnc-ddraw config.cpp | 1 - config/cnc-ddraw config_resources.rc | 1 + src/config.c | 2 +- 6 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 config/Resources/VN.png diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 9da37ad..749c7e0 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -691,6 +691,87 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Hint = upscaleHint + enableUpscaleHint; BoxingChk->Hint = upscaleHint + enableUpscaleHint; } + else if (lang == "vietnamese" || (lang == "auto" && priID == LANG_VIETNAMESE)) { + LanguageImg->Visible = true; + + /* -vietnamese - made by TheBuck338 @ github */ + + ConfigForm->Caption = L"Thiết lập cnc-ddraw"; + DisplayBtn->Caption = L"Cài Đặt Hình Ảnh"; + AdvancedBtn->Caption = L"Cài Đặt Nâng Cao"; + HotkeyBtn->Caption = L"Cài Đặt Phím Tắt"; + CompatibilityBtn->Caption = L"Cài Đặt Tương Thích"; + RestoreDefaultsBtn->Caption = L"Khôi phục cài đặt gốc"; + PresentationLbl->Caption = L"Chế Độ Hiển Thị"; + MaintasLbl->Caption = L"Giữ nguyên tỉ lệ khung hình"; + VsyncLbl->Caption = L"Bật VSync"; + AdjmouseLbl->Caption = L"Điều chỉnh độ nhạy của chuột"; + DevmodeLbl->Caption = L"Khóa con trỏ vào cửa sổ / màn hình"; + RendererLbl->Caption = L"Trình kết xuất"; + BorderLbl->Caption = L"Hiển thị thanh tiêu đề trong chế độ cửa sổ"; + SavesettingsLbl->Caption = L"Ghi nhớ vị trí kích thước và cửa sổ"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Giới hạn tốc độ khung hình"; + BoxingLbl->Caption = L"Bật windowboxing / chia tỷ lệ theo số nguyên"; + ToggleWindowedLbl->Caption = L"Bật/tắt chế độ cửa sổ"; + MaximizeWindowLbl->Caption = L"Phóng to cửa sổ"; + UnlockCursor1Lbl->Caption = L"Mở khóa con trỏ 1"; + UnlockCursor2Lbl->Caption = L"Mở khóa con trỏ 2"; + ScreenshotLbl->Caption = L"Chụp màn hình"; + MaxgameticksLbl->Caption = L"Giới hạn tốc độ trò chơi"; + NoactivateappLbl->Caption = L"Sửa lỗi Alt+Tab"; + ResolutionsLbl->Caption = L"Mở khóa thêm độ phân giải màn hình"; + MinfpsLbl->Caption = L"Khắc phục hiện tượng giật hình khi sử dụng Freesync/G-Sync"; + SinglecpuLbl->Caption = L"Khắc phục các vấn đề về hiệu năng và âm thanh kém"; + NonexclusiveLbl->Caption = L"Sửa lỗi các video / phần tử UI không hiển thị"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Tự Động", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Toàn Màn Hình", NULL); + PresentationCbx->AddItem(L"Toàn Màn Hình Nâng Cao Độ Phân Giải", NULL); + PresentationCbx->AddItem(L"Toàn Màn Hình Không Viền", NULL); + PresentationCbx->AddItem(L"Cửa Sổ", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Không giới hạn", NULL); + MaxgameticksCbx->AddItem(L"Đồng bộ hóa với tần số quét màn hình", NULL); + MaxgameticksCbx->AddItem(L"Mô phỏng màn hình với tần số quét 60Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"500 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"250 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"125 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"60 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"30 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"25 ticks mỗi giây", NULL); + MaxgameticksCbx->AddItem(L"15 ticks mỗi giây", NULL); + + System::UnicodeString shaderHint = + L"Một số shader chỉ hoạt động khi bật chế độ nâng cao độ phân giải. \n\n"; + + System::UnicodeString upscaleHint = + L"Phải bật chế độ nâng cao độ phân giải để cài đặt này hoạt động. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Để bật chế độ nâng cao độ phân giải, hãy đặt chế độ hiển thị của bạn\n" + "thành 'Toàn Màn Hình Không Viền' hoặc 'Toàn Màn Hình Nâng Cao Độ Phân Giải'.\n" + "Đối với chế độ 'Cửa Sổ', bạn phải thay đổi kích thước hoặc phóng to cửa sổ."; + + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; + } else { IsEnglish = true; @@ -737,6 +818,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_VIETNAMESE) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_VN"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } diff --git a/config/Resources/VN.png b/config/Resources/VN.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7cd48a3468a511e27c49a69194b0ef5564e615 GIT binary patch literal 474 zcmV<00VV#4P)@|4`Xj5kLT%B_22*h{r-RE_y1qN|Ns8=|JN^|IHRmA&<212VgZ}|A4N4# z+WpUe-rxU^{Q|504bi~x`!`SnKmf4-F(Xhl(8fQ1fG+vp^85d{-~aW0|NsB{f9tRR zg1`PJA~XO^2M8drlm7gLxRT-bpa1p0|1bLmQVm3Azy5pw{{IQ;B%q-{(*XjA3FM@| zf53hMJK)W)|CK-uK=ku}!>|93eu7kk5yVLV0R(o^Z;+)RSAk6exg_KF|98LtFaPy_ z#c#OrKtum9FaQJ)NCPuC$bbfbRI>n`@$3IHusZAC|2cmD|MKhqAD{+Mr~sV<5I`Ue zOuzpyNJ@f@0s0=KlTj9AB*>SXe;D}wK*A7+fQkVEi190GMB<5K2mlB$03I1qT8uIj Q5C8xG07*qoM6N<$f}XY6qW}N^ literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index dbd448c..155df07 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -203,6 +203,10 @@ RCDATA PngImage_US + + RCDATA + PngImage_VN + Base @@ -296,14 +300,74 @@ + + + cnc-ddraw_config.exe + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + + + + .\ + true + + 1 diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 4c3dd33..a69e541 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -11,7 +11,6 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- - #define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index a2ed1e5..9d29fa1 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -6,3 +6,4 @@ PngImage_HU RCDATA "Resources\\hu.png" PngImage_IT RCDATA "Resources\\IT.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" +PngImage_VN RCDATA "Resources\\VN.png" diff --git a/src/config.c b/src/config.c index bd71fb7..afcca44 100644 --- a/src/config.c +++ b/src/config.c @@ -347,7 +347,7 @@ static void cfg_create_ini() "; The following settings are for cnc-ddraw config.exe\n" "\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese\n" "configlang=auto\n" "\n" "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" From 5abd9452570e5fd3b437e58a6f70b43e125f39a9 Mon Sep 17 00:00:00 2001 From: Kappa971 <62349018+Kappa971@users.noreply.github.com> Date: Thu, 1 Aug 2024 16:31:27 +0200 Subject: [PATCH 016/557] Update Italian translation --- config/ConfigFormUnit.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 749c7e0..f2b5aca 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -670,15 +670,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); System::UnicodeString shaderHint = - L"Alcuni shader funzionano solo quando l'upscaling è abilitato. \n\n"; + L"Alcuni shader funzionano solo quando il ridimensionamento dell'immagine è abilitato. \n\n"; System::UnicodeString upscaleHint = - L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; + L"Affinché questa impostazione funzioni, è necessario abilitare il ridimensionamento dell'immagine. \n\n"; System::UnicodeString enableUpscaleHint = - L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" - "o 'Schermo Intero Ridimensionato'. Per la presentazione 'In Finestra', \n" - "è necessario ridimensionare o ingrandire la finestra."; + L"Per abilitare il ridimensionamento dell'immagine, imposta la modalità di presentazione \n" + "su 'Senza Bordi o 'Schermo Intero Ridimensionato'. Per la modalità 'In Finestra', \n" + "è necessario ridimensionare o ingrandire la finestra manualmente."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From d0ba1de8b63c958fb7033ce915b5b45735c06b06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 05:35:36 +0200 Subject: [PATCH 017/557] update to c++ builder 12 --- config/cnc-ddraw config.cbproj | 207 ++++++++++++++++++++++++++++++++- 1 file changed, 206 insertions(+), 1 deletion(-) diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index 155df07..b2de346 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -1,7 +1,7 @@  {E020D5C7-AE07-4DB9-9688-6D289E9FFF1A} - 19.5 + 20.1 VCL Application cnc-ddraw config.cpp @@ -10,6 +10,7 @@ Win32 1 c + cnc-ddraw config true @@ -24,6 +25,11 @@ Base true + + true + Base + true + true Base @@ -41,6 +47,12 @@ true true + + true + Cfg_1 + true + true + true Base @@ -58,6 +70,12 @@ true true + + true + Cfg_2 + true + true + JPHNE true @@ -101,6 +119,14 @@ 1033 $(BDS)\bin\default_app.manifest + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + $(BDS)\bin\default_app.manifest + false true @@ -141,6 +167,9 @@ PerMonitorV2 + + PerMonitorV2 + NDEBUG;$(Defines) None @@ -161,6 +190,9 @@ PerMonitorV2 + + PerMonitorV2 + 0 @@ -269,6 +301,16 @@ true + + + true + + + + + true + + true @@ -286,6 +328,16 @@ true + + + true + + + + + true + + @@ -298,6 +350,16 @@ true + + + true + + + + + true + + @@ -458,6 +520,16 @@ 1 + + + res\drawable-anydpi-v21 + 1 + + + res\drawable-anydpi-v21 + 1 + + res\values @@ -478,6 +550,66 @@ 1 + + + res\values-v31 + 1 + + + res\values-v31 + 1 + + + + + res\drawable-anydpi-v26 + 1 + + + res\drawable-anydpi-v26 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-anydpi-v33 + 1 + + + res\drawable-anydpi-v33 + 1 + + res\values @@ -488,6 +620,16 @@ 1 + + + res\values-night-v21 + 1 + + + res\values-night-v21 + 1 + + res\drawable @@ -658,6 +800,56 @@ 1 + + + res\drawable-anydpi-v24 + 1 + + + res\drawable-anydpi-v24 + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-night-anydpi-v21 + 1 + + + res\drawable-night-anydpi-v21 + 1 + + + + + res\drawable-anydpi-v31 + 1 + + + res\drawable-anydpi-v31 + 1 + + + + + res\drawable-night-anydpi-v31 + 1 + + + res\drawable-night-anydpi-v31 + 1 + + 1 @@ -898,6 +1090,9 @@ 1 + + 1 + @@ -968,6 +1163,10 @@ Assets 1 + + Assets + 1 + @@ -978,6 +1177,10 @@ Assets 1 + + Assets + 1 + @@ -1191,10 +1394,12 @@ + True False + False 12 From 4fd2f9830194a84653ed5a78235c8fdd31db8a6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:22:50 +0200 Subject: [PATCH 018/557] only create opengl core context once --- src/render_ogl.c | 55 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index a348ed6..fa58df3 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -41,6 +41,44 @@ BOOL ogl_create() g_ogl.hwnd = g_ddraw.hwnd; g_ogl.hdc = g_ddraw.render.hdc; + GLenum err = GL_NO_ERROR; + BOOL made_current = FALSE; + + for (int i = 0; i < 5; i++) + { + if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) + break; + + Sleep(50); + } + + if (made_current && (err = glGetError()) == GL_NO_ERROR) + { + GL_CHECK(oglu_init()); + + TRACE("+--OpenGL-----------------------------------------\n"); + TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); + TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + TRACE("+------------------------------------------------\n"); + + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); + } + else + { + TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); + ogl_check_error("xwglMakeCurrent()"); + } + + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } + return TRUE; } @@ -69,15 +107,6 @@ DWORD WINAPI ogl_render_main(void) { GL_CHECK(oglu_init()); - TRACE("+--OpenGL-----------------------------------------\n"); - TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); - TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - TRACE("+------------------------------------------------\n"); - - GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); - BOOL got_swap_ctrl; GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); @@ -108,7 +137,13 @@ DWORD WINAPI ogl_render_main(void) ogl_check_error("xwglMakeCurrent()"); } - xwglMakeCurrent(NULL, NULL); + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } if (!g_ogl.use_opengl) { From 798c281453e0b954a0880a399c2b2872209739c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:22:50 +0200 Subject: [PATCH 019/557] only create opengl core context once --- src/render_ogl.c | 55 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index fa4c9d1..e5befb2 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -41,6 +41,44 @@ BOOL ogl_create() g_ogl.hwnd = g_ddraw.hwnd; g_ogl.hdc = g_ddraw.render.hdc; + GLenum err = GL_NO_ERROR; + BOOL made_current = FALSE; + + for (int i = 0; i < 5; i++) + { + if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) + break; + + Sleep(50); + } + + if (made_current && (err = glGetError()) == GL_NO_ERROR) + { + GL_CHECK(oglu_init()); + + TRACE("+--OpenGL-----------------------------------------\n"); + TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); + TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); + TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); + TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); + TRACE("+------------------------------------------------\n"); + + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); + } + else + { + TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); + ogl_check_error("xwglMakeCurrent()"); + } + + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } + return TRUE; } @@ -69,15 +107,6 @@ DWORD WINAPI ogl_render_main(void) { GL_CHECK(oglu_init()); - TRACE("+--OpenGL-----------------------------------------\n"); - TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); - TRACE("| GL_VENDOR: %s\n", glGetString(GL_VENDOR)); - TRACE("| GL_RENDERER: %s\n", glGetString(GL_RENDERER)); - TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); - TRACE("+------------------------------------------------\n"); - - GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); - BOOL got_swap_ctrl; GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); @@ -108,7 +137,13 @@ DWORD WINAPI ogl_render_main(void) ogl_check_error("xwglMakeCurrent()"); } - xwglMakeCurrent(NULL, NULL); + for (int i = 0; i < 5; i++) + { + if (xwglMakeCurrent(NULL, NULL)) + break; + + Sleep(50); + } if (!g_ogl.use_opengl) { From 663743b49ffd69d3333731af0e9f18649cc4dc3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:55:05 +0200 Subject: [PATCH 020/557] make sure we don't get a random GL_INVALID_FRAMEBUFFER_OPERATION during test --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index fa58df3..4220a00 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1567,6 +1567,8 @@ static BOOL ogl_shader_test() glBindFramebuffer(GL_FRAMEBUFFER, 0); } + while (glGetError() != GL_NO_ERROR); + HeapFree(GetProcessHeap(), 0, surface_tex); return result; } From b50ff36ffc95c888b7acbeaa21c5e8a9f6d6a76a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:57:38 +0200 Subject: [PATCH 021/557] only check texture if no error --- src/render_ogl.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4220a00..5f47428 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -120,9 +120,11 @@ DWORD WINAPI ogl_render_main(void) GL_CHECK(ogl_init_shader1_program()); GL_CHECK(ogl_init_shader2_program()); + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test()); GL_CHECK(g_ogl.got_error = g_ogl.got_error || !ogl_shader_test()); g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; GL_CHECK(ogl_render()); @@ -1546,13 +1548,16 @@ static BOOL ogl_shader_test() glBindTexture(GL_TEXTURE_2D, fbo_tex_id); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); - int i; - for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) + if (glGetError() == GL_NO_ERROR) { - if (surface_tex[i] != 0x80808080) + int i; + for (i = 0; i < g_ogl.surface_tex_height * g_ogl.surface_tex_width; i++) { - result = FALSE; - break; + if (surface_tex[i] != 0x80808080) + { + result = FALSE; + break; + } } } } From ec63d7fbe0c99d9a33dca55f670a1b8644d62ac5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 04:25:01 +0200 Subject: [PATCH 022/557] create experimental releases --- .github/workflows/build.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f553ba7..648427b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -69,6 +69,8 @@ jobs: - name: Prepare artifact run: | : + + mkdir -p cnc-ddraw-experimental if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then mkdir -p cnc-ddraw-release @@ -80,6 +82,8 @@ jobs: mkdir -p cnc-ddraw-releasexp cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/*" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then @@ -94,6 +98,8 @@ jobs: cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-debuglog.zip" "./cnc-ddraw-debuglogxp/*" fi if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then @@ -139,3 +145,13 @@ jobs: name: cnc-ddraw-debuglogminixp path: cnc-ddraw-debuglogminixp retention-days: 14 + + - name: Release experimental + uses: softprops/action-gh-release@v1 + with: + prerelease: true + name: experimental + tag_name: experimental + files: cnc-ddraw-experimental/* + fail_on_unmatched_files: true + draft: true \ No newline at end of file From d19d9aac23763ee63683539d5c8384546ff5f371 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 04:30:30 +0200 Subject: [PATCH 023/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index a9eb822..e087ffd 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 4 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 64f01ec06ea1a808ee4ae78a6da53bc2c5d3579a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 05:56:08 +0200 Subject: [PATCH 024/557] #342 add preset for WarCraft 2000: Nuclear Epidemic --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index afcca44..30a959d 100644 --- a/src/config.c +++ b/src/config.c @@ -1476,6 +1476,12 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; WarCraft 2000: Nuclear Epidemic\n" + "[war2000]\n" + "resolutions=2\n" + "guard_lines=300\n" + "minfps=-2\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" From 94ed631c6e76c6f8d779a923d0ab9f947559d569 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 05:56:43 +0200 Subject: [PATCH 025/557] fix for last commit --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 30a959d..b183d56 100644 --- a/src/config.c +++ b/src/config.c @@ -1479,7 +1479,7 @@ static void cfg_create_ini() "; WarCraft 2000: Nuclear Epidemic\n" "[war2000]\n" "resolutions=2\n" - "guard_lines=300\n" + "guard_lines=600\n" "minfps=-2\n" "\n" "; Wizardry 8\n" From adc7934c67a2a5e79700729b4e47527d05a4e2ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 5 Aug 2024 06:35:42 +0200 Subject: [PATCH 026/557] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 50bcddc..b50befa 100644 --- a/README.md +++ b/README.md @@ -346,6 +346,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Virtua Fighter PC - War Wind - War Wind II - Human Onslaught +- WarCraft 2000: Nuclear Epidemic - Warcraft 2 - Warlords 3: Darklords Rising - Warlords Battlecry From d71118454eef8d7a4a268579515059cc18585568 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 7 Aug 2024 04:20:21 +0200 Subject: [PATCH 027/557] improve logs --- src/directinput.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 4c29144..358374b 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -75,7 +75,16 @@ static HRESULT WINAPI fake_did_GetDeviceData( LPDWORD pdwInOut, DWORD dwFlags) { - //TRACE("DirectInput GetDeviceData [%p]\n", _ReturnAddress()); + /* + TRACE( + "DirectInput GetDeviceData(This=%p, cbObjectData=%lu, rgdod=%p, pdwInOut=%p, dwFlags=%lu) [%p]\n", + This, + cbObjectData, + rgdod, + pdwInOut, + dwFlags, + _ReturnAddress()); + */ HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); @@ -97,7 +106,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) { - //TRACE("DirectInput GetDeviceState [%p]\n", _ReturnAddress()); + //TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress()); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); From 30ae9630fba0a3532a1135959980e345dc3088be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Aug 2024 02:19:24 +0200 Subject: [PATCH 028/557] save pdb file for experimental release --- .github/workflows/build.yml | 3 ++- action.yml | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 648427b..0738790 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,7 +83,8 @@ jobs: cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/*" + cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.dll" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then diff --git a/action.yml b/action.yml index 86b657c..ca39872 100644 --- a/action.yml +++ b/action.yml @@ -46,10 +46,16 @@ outputs: release: description: 'Full path to ddraw.dll built with Release configuration' value: ${{ steps.build-release.outputs.ddraw-dll }} + release-pdb: + description: 'Full path to ddraw.pdb built with Release configuration' + value: ${{ steps.build-release.outputs.ddraw-pdb }} releasexp: description: 'Full path to ddraw.dll built with ReleaseXP configuration' value: ${{ steps.build-releasexp.outputs.ddraw-dll }} + releasexp-pdb: + description: 'Full path to ddraw.pdb built with ReleaseXP configuration' + value: ${{ steps.build-releasexp.outputs.ddraw-pdb }} debug: description: 'Full path to ddraw.dll built with Debug configuration' @@ -119,6 +125,7 @@ runs: "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v142 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi @@ -137,6 +144,7 @@ runs: "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseXP -p:Platform=x86 -p:PlatformToolset=v141_xp # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi From 423ca1d5a3666c3d13a66cefdce06b738e688488 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Aug 2024 09:24:21 +0200 Subject: [PATCH 029/557] add IsAndroid function to versionhelpers header --- inc/versionhelpers.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 3aa5742..490f8fd 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -220,4 +220,12 @@ VERSIONHELPERAPI IsLinux(void) { return sysname && _strcmpi(sysname, "Linux") == 0; } +VERSIONHELPERAPI IsAndroid(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return release && strstr(release, "android") == 0; +} + #endif From d7d12e520feadc4f053990368b6f19c3e58b7eb0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 9 Aug 2024 09:26:38 +0200 Subject: [PATCH 030/557] fix for last commit --- inc/versionhelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 490f8fd..0746d39 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -225,7 +225,7 @@ VERSIONHELPERAPI IsAndroid(void) { const char* release = NULL; verhelp_wine_get_host_version(&sysname, &release); - return release && strstr(release, "android") == 0; + return release && strstr(release, "android") != NULL; } #endif From b1c74f1628e6e7b7b7405ed653552342ae2b1f87 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 03:28:12 +0200 Subject: [PATCH 031/557] remove allow_wmactivate setting --- inc/config.h | 1 - src/config.c | 8 -------- src/wndproc.c | 19 +++++++++++++++---- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/inc/config.h b/inc/config.h index 3a33eaf..c111c6b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -65,7 +65,6 @@ typedef struct CNCDDRAWCONFIG int guard_lines; int max_resolutions; BOOL lock_surfaces; - BOOL allow_wmactivate; BOOL flipclear; BOOL fixmousehook; BOOL rgb555; diff --git a/src/config.c b/src/config.c index b183d56..6223d28 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); - GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -302,7 +301,6 @@ static void cfg_create_ini() "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" - "allow_wmactivate=false\n" "flipclear=false\n" "fixmousehook=false\n" "rgb555=false\n" @@ -368,7 +366,6 @@ static void cfg_create_ini() "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" - "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" "[BM]\n" @@ -473,10 +470,6 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" - "; Barbie(R) Photo Designer\n" - "[pdcam]\n" - "allow_wmactivate=true\n" - "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" @@ -535,7 +528,6 @@ static void cfg_create_ini() "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" - "allow_wmactivate=true\n" "renderer=gdi\n" "adjmouse=false\n" "width=0\n" diff --git a/src/wndproc.c b/src/wndproc.c index ebde744..d0e32ee 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -557,13 +557,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_ACTIVATE: { - if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE) + if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) { if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - if (wParam == WA_INACTIVE) + if (LOWORD(wParam) == WA_INACTIVE) { if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) { @@ -600,10 +600,21 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - //if (g_ddraw.windowed || g_ddraw.noactivateapp) + if (g_config.windowed || g_config.noactivateapp) + { + /* let it pass through once (Atrox) */ + static BOOL one_time; + + if (!one_time) + { + one_time = TRUE; + + if (LOWORD(wParam)) + break; + } - if (!g_config.allow_wmactivate) return 0; + } break; } From 6f540a960339d81fb40dfcda2779c6fbf9a8a7fb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:07:15 +0200 Subject: [PATCH 032/557] disable Vsync checkbox in case we are in borderelss or windowed mode to avoid unnecessary input lag --- config/ConfigFormUnit.cpp | 34 ++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 10 ---------- config/ConfigFormUnit.h | 1 + 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f2b5aca..1d49427 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -1197,6 +1198,11 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) delete ini; + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + Initialized = true; } @@ -1618,8 +1624,31 @@ bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValu return s == "true" || s == "yes" || s == "1"; } +bool TConfigForm::VsyncAllowed() +{ + if (GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) { + return true; + } + + if (!IsWindows8OrGreater()) { + return true; + } + + if (NonexclusiveChk->State == tssOff && + (PresentationCbx->ItemIndex == 0 || PresentationCbx->ItemIndex == 1)) { + return true; + } + + return false; +} + void __fastcall TConfigForm::PresentationCbxChange(TObject *Sender) { + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + SaveSettings(); } @@ -1728,6 +1757,11 @@ void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) { + VsyncChk->Enabled = VsyncAllowed(); + if (!VsyncChk->Enabled) { + VsyncChk->State = tssOff; + } + SaveSettings(); } diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 6ed9761..a34dc9f 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2696,8 +2696,6 @@ object ConfigForm: TConfigForm ShowCaption = False TabOrder = 1 StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 DesignSize = ( 499 465) @@ -2885,7 +2883,6 @@ object ConfigForm: TConfigForm TabOrder = 5 StyleElements = [seFont, seBorder] OnClick = ThemePnlClick - ExplicitLeft = 471 end end object CompatibilityPnl: TPanel @@ -2901,8 +2898,6 @@ object ConfigForm: TConfigForm TabOrder = 3 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object MaxgameticksLbl: TLabel Left = 40 Top = 28 @@ -3083,8 +3078,6 @@ object ConfigForm: TConfigForm TabOrder = 2 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object RendererLbl: TLabel Left = 40 Top = 28 @@ -3309,8 +3302,6 @@ object ConfigForm: TConfigForm TabOrder = 4 Visible = False StyleElements = [seFont, seBorder] - ExplicitWidth = 495 - ExplicitHeight = 464 object ToggleWindowedLbl: TLabel Left = 40 Top = 27 @@ -3538,7 +3529,6 @@ object ConfigForm: TConfigForm Color = clMenu ParentBackground = False TabOrder = 0 - ExplicitHeight = 467 DesignSize = ( 233 468) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8a8a14c..7eda35e 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,6 +118,7 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); + bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From 7454684654d0472f7c376e5d591c075cd80befc9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:08:55 +0200 Subject: [PATCH 033/557] align --- config/ConfigFormUnit.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 7eda35e..8a46bf8 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,7 +118,7 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); - bool VsyncAllowed(); + bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From afb0fe75208ed6fc0ea7c1333395b4828d59a08c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 10 Aug 2024 08:15:30 +0200 Subject: [PATCH 034/557] fix translation --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1d49427..4a0f97d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -306,7 +306,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"Fensterposition und Größe merken"; ShaderLbl->Caption = L"OpenGL Shader"; MaxfpsLbl->Caption = L"Limitiere Aktualisierungsrate"; - BoxingLbl->Caption = L"Fensterboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. + BoxingLbl->Caption = L"Windowboxing / Integer Skalierung aktivieren"; //Not 100% sure if "windowboxing" can be translated better. ToggleWindowedLbl->Caption = L"Fenstermodus umschalten"; MaximizeWindowLbl->Caption = L"Fenster maximieren"; UnlockCursor1Lbl->Caption = L"Cursor entsperren 1"; From 5df1b00c6db5f8c6cfa5083e67d63b9ab9b75ebc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 06:14:05 +0200 Subject: [PATCH 035/557] add workaround for stretch blt's --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d20215b..7679807 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -239,7 +239,7 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - if (This->bpp != src_surface->bpp) + if (This->bpp != src_surface->bpp || (is_stretch_blt && This == src_surface)) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); From 555cf5de28d477fff70184e81962eb6efca3d9ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 08:33:08 +0200 Subject: [PATCH 036/557] fix typo --- inc/dd.h | 2 +- src/ddsurface.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index a0bd368..9ba1bf5 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -49,7 +49,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_AUTO 0 #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 -#define LIMIT_UNLCK 3 +#define LIMIT_UNLOCK 3 #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 diff --git a/src/ddsurface.c b/src/ddsurface.c index 7679807..9dfe0c7 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1200,7 +1200,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (g_ddraw.ticks_limiter.tick_length > 0 && - (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLCK)) + (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK)) { util_limit_game_ticks(); } From 2aada45a6cf5c2470a694b0adfed990aa4f99465 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 08:58:00 +0200 Subject: [PATCH 037/557] adjust makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3371861..7a238b2 100644 --- a/Makefile +++ b/Makefile @@ -12,8 +12,8 @@ ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif -SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) -OBJS := $(SRCS:c=o) res.o +SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc +OBJS := $(addsuffix .o, $(basename $(SRCS))) .PHONY: clean all all: $(TARGET) From f15cac18242860eebba86f60e65884f393b6d547 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 11 Aug 2024 10:44:06 +0200 Subject: [PATCH 038/557] testing ddraw.ini gen --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0738790..cf74fdd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -83,8 +83,10 @@ jobs: cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + rundll32.exe ./cnc-ddraw-releasexp/ddraw.dll, DDIsWindowed + cp "${{ steps.build-releasexp.outputs.releasexp-pdb }}" cnc-ddraw-experimental - 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.dll" + 7z a -tzip -mm=Deflate -mfb=258 -mpass=15 "./cnc-ddraw-experimental/cnc-ddraw-experimental-release.zip" "./cnc-ddraw-releasexp/ddraw.*" fi if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then From e0b7d26856e009427411c675a8f6a6244b04af20 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:45:05 +0200 Subject: [PATCH 039/557] add option to allow upscaling via shader2 must insert "-noscale" into filename to activate --- src/render_ogl.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 5f47428..c618a33 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -259,7 +259,9 @@ static void ogl_build_programs() { g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); - if (g_ogl.shader1_program && strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL) + if (g_ogl.shader1_program && + (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || + strstr(g_config.shader, "-noscale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From 04c59441656a62e56104c4a1a4d6c57bedd73ca0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:48:10 +0200 Subject: [PATCH 040/557] use -shader2scale instead of -noscale in filenames --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index c618a33..e23d589 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -261,7 +261,7 @@ static void ogl_build_programs() if (g_ogl.shader1_program && (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "-noscale") != NULL)) + strstr(g_config.shader, "-shader2scale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From e23a0ce1d5cc93a35237ea6884bbcf1f10f5df14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 13 Aug 2024 04:57:26 +0200 Subject: [PATCH 041/557] rename once more --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index e23d589..8be7c55 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -261,7 +261,7 @@ static void ogl_build_programs() if (g_ogl.shader1_program && (strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || - strstr(g_config.shader, "-shader2scale") != NULL)) + strstr(g_config.shader, "-pass1scale") != NULL)) { g_ogl.shader2_upscale = TRUE; } From c7e4b81ad71562a4f3f91bdcf4b414a6afa89829 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 10:16:20 +0200 Subject: [PATCH 042/557] add experimental aspect_ratio setting (hidden for now) --- inc/config.h | 1 + src/config.c | 4 ++++ src/dd.c | 20 ++++++++++++++++++-- src/utils.c | 16 +++++++++++++++- src/wndproc.c | 26 +++++++++++++++++++++----- 5 files changed, 59 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index c111c6b..5f132d7 100644 --- a/inc/config.h +++ b/inc/config.h @@ -29,6 +29,7 @@ typedef struct CNCDDRAWCONFIG BOOL windowed; BOOL maintas; BOOL boxing; + char aspect_ratio[16]; int maxfps; BOOL vsync; BOOL adjmouse; diff --git a/src/config.c b/src/config.c index 6223d28..3a28766 100644 --- a/src/config.c +++ b/src/config.c @@ -39,6 +39,7 @@ void cfg_load() GET_BOOL(g_config.windowed, "windowed", FALSE); GET_BOOL(g_config.maintas, "maintas", FALSE); GET_BOOL(g_config.boxing, "boxing", FALSE); + GET_STRING("aspect_ratio", "", g_config.aspect_ratio, sizeof(g_config.aspect_ratio)); GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); @@ -120,6 +121,9 @@ void cfg_load() if (g_config.lock_mouse_top_left) g_config.adjmouse = FALSE; + if (g_config.aspect_ratio[0]) + g_config.maintas = TRUE; + ini_free(&g_config.ini); } diff --git a/src/dd.c b/src/dd.c index 819a0fd..7d25dd0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -581,6 +581,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!dwHeight) dwHeight = g_ddraw.height ? g_ddraw.height : 600; + //if (dwHeight == 400) dwHeight = 480; + if (!dwBPP) dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; @@ -859,8 +861,22 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - double dst_ar = (double)g_ddraw.height / g_ddraw.width; - double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width; + double dst_ar; + double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width;; + + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + dst_ar = (double)cy / cx; + } + else + { + dst_ar = (double)g_ddraw.height / g_ddraw.width; + } g_ddraw.render.viewport.width = g_ddraw.render.width; g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); diff --git a/src/utils.c b/src/utils.c index 16bdd37..a24da1a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -622,9 +622,23 @@ void util_toggle_maximize() int w = dst_rc.right - dst_rc.left; int h = dst_rc.bottom - dst_rc.top; - double dst_ar = (double)g_ddraw.height / g_ddraw.width; + double dst_ar; double src_ar = (double)h / w; + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + dst_ar = (double)cy / cx; + } + else + { + dst_ar = (double)g_ddraw.height / g_ddraw.width; + } + dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; diff --git a/src/wndproc.c b/src/wndproc.c index d0e32ee..9fa4e4a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -317,8 +317,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_GetWindowLongA(hWnd, GWL_EXSTYLE)) && SetRect(&clientrc, 0, 0, clientrc.right - clientrc.left, clientrc.bottom - clientrc.top)) { - double scaleH = (double)g_ddraw.height / g_ddraw.width; - double scaleW = (double)g_ddraw.width / g_ddraw.height; + double scale_h; + double scale_w; + + if (g_config.aspect_ratio[0]) + { + char* e = &g_config.aspect_ratio[0]; + + DWORD cx = strtoul(e, &e, 0); + DWORD cy = strtoul(e + 1, &e, 0); + + scale_h = (double)cy / cx; + scale_w = (double)cx / cy; + } + else + { + scale_h = (double)g_ddraw.height / g_ddraw.width; + scale_w = (double)g_ddraw.width / g_ddraw.height; + } switch (wParam) { @@ -327,19 +343,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)round(scale_h * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)round(scale_w * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)round(scale_h * clientrc.right - clientrc.bottom); break; } } From 79feefac26cc5517144e86ef59ac1c58ee8c80c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 10:19:28 +0200 Subject: [PATCH 043/557] remove test code --- src/dd.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 7d25dd0..0da10a2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -581,8 +581,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!dwHeight) dwHeight = g_ddraw.height ? g_ddraw.height : 600; - //if (dwHeight == 400) dwHeight = 480; - if (!dwBPP) dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; From f49f09895b5e4e55bb8f8b1cd107086315e923f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:06:02 +0200 Subject: [PATCH 044/557] save and restore dc state --- inc/IDirectDrawSurface.h | 1 + src/dd.c | 2 +- src/ddsurface.c | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index e339450..f04e03a 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -38,6 +38,7 @@ typedef struct IDirectDrawSurfaceImpl PBITMAPINFO bmi; HBITMAP bitmap; HDC hdc; + int dc_state; DDCOLORKEY color_key; DWORD last_flip_tick; DWORD last_blt_tick; diff --git a/src/dd.c b/src/dd.c index 0da10a2..24625b1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1283,7 +1283,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { hook_init(); - g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + //g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); if (!g_ddraw.render.hdc) diff --git a/src/ddsurface.c b/src/ddsurface.c index 9dfe0c7..29df8a4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -914,6 +914,8 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; + InterlockedExchange(&This->dc_state, SaveDC(dc)); + return DD_OK; } @@ -1024,6 +1026,8 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) } } + RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); + return DD_OK; } From 35bc19f7313413f546fadb458ab542c474323eff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:10:34 +0200 Subject: [PATCH 045/557] add preset for Lapis --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index b50befa..7c033a6 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures diff --git a/src/config.c b/src/config.c index 3a28766..3be22d4 100644 --- a/src/config.c +++ b/src/config.c @@ -1024,6 +1024,10 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Lapis (lapis.mgame.com)\n" + "[Lapis]\n" + "hook_peekmessage=true\n" + "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" From b40fcdd14ed5117b3cec8c62fa18931fab333a14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:30:52 +0200 Subject: [PATCH 046/557] update lapis preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 3be22d4..fba9b20 100644 --- a/src/config.c +++ b/src/config.c @@ -1027,6 +1027,8 @@ static void cfg_create_ini() "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" "hook_peekmessage=true\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" From 9f12b35dc84531b58138cfdffd2e57c4f761c7a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:55:54 +0200 Subject: [PATCH 047/557] revert debug change --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 24625b1..0da10a2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1283,7 +1283,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { hook_init(); - //g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); + g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); if (!g_ddraw.render.hdc) From 1ce5acd05d3c93966531016b7e2f1773df958c60 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 12:58:52 +0200 Subject: [PATCH 048/557] update lapis preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index fba9b20..f6baa6b 100644 --- a/src/config.c +++ b/src/config.c @@ -1026,7 +1026,6 @@ static void cfg_create_ini() "\n" "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" - "hook_peekmessage=true\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From aa357c044d616b5cef7cef0192fbc87f49ebfb15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 14:20:13 +0200 Subject: [PATCH 049/557] set default size of primary surface to 1024x768 --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 29df8a4..bd28605 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1420,8 +1420,8 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_VISIBLE; - dst_surface->width = g_ddraw.width; - dst_surface->height = g_ddraw.height; + dst_surface->width = g_ddraw.width == 0 ? 1024 : g_ddraw.width; + dst_surface->height = g_ddraw.height == 0 ? 768 : g_ddraw.height; } else { From 33666bbd19e0e1444a3a90fb8d4544b1fc79f2b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 15 Aug 2024 16:50:28 +0200 Subject: [PATCH 050/557] try to get at least some windowed games working with zero config --- inc/dd.h | 1 - src/dd.c | 31 +++++++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 9ba1bf5..116d661 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -166,7 +166,6 @@ typedef struct CNCDDRAW int y; } textbox; /* Age Of Empires 2 textbox align */ - struct { BOOL enabled; diff --git a/src/dd.c b/src/dd.c index 0da10a2..444c4db 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1427,6 +1427,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) dd_SetDisplayMode(width, height, bpp, 0); } + else if (!g_ddraw.width) + { + RECT rc = { 0 }; + real_GetClientRect(hwnd, &rc); + + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + } } return DD_OK; @@ -1579,10 +1586,30 @@ ULONG dd_Release() DeleteCriticalSection(&g_ddraw.cs); - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - if (g_ddraw.hwnd) + if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); + + /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ + if (g_ddraw.width) + { + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + AdjustWindowRectEx(&rc, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); + + real_SetWindowPos( + g_ddraw.hwnd, + 0, + 0, + 0, + (rc.right - rc.left), + (rc.bottom - rc.top), + SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); + } } memset(&g_ddraw, 0, sizeof(g_ddraw)); From 164365efd33ec4443e05d77b61219c7bdbc677fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Aug 2024 07:51:05 +0200 Subject: [PATCH 051/557] add new aspect_ratio to ddraw.ini --- inc/config.h | 2 +- src/config.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 5f132d7..1140fe0 100644 --- a/inc/config.h +++ b/inc/config.h @@ -28,8 +28,8 @@ typedef struct CNCDDRAWCONFIG BOOL fullscreen; BOOL windowed; BOOL maintas; - BOOL boxing; char aspect_ratio[16]; + BOOL boxing; int maxfps; BOOL vsync; BOOL adjmouse; diff --git a/src/config.c b/src/config.c index f6baa6b..e6d4c75 100644 --- a/src/config.c +++ b/src/config.c @@ -38,8 +38,8 @@ void cfg_load() GET_BOOL(g_config.fullscreen, "fullscreen", FALSE); GET_BOOL(g_config.windowed, "windowed", FALSE); GET_BOOL(g_config.maintas, "maintas", FALSE); - GET_BOOL(g_config.boxing, "boxing", FALSE); GET_STRING("aspect_ratio", "", g_config.aspect_ratio, sizeof(g_config.aspect_ratio)); + GET_BOOL(g_config.boxing, "boxing", FALSE); GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); @@ -197,6 +197,9 @@ static void cfg_create_ini() "; Maintain aspect ratio\n" "maintas=false\n" "\n" + "; Use custom aspect ratio - Example values: 4:3, 16:10, 16:9, 21:9\n" + "aspect_ratio=\n" + "\n" "; Windowboxing / Integer Scaling\n" "boxing=false\n" "\n" From 5ca3319e7a6a1adfc69d38502379ef232a78bef8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Aug 2024 15:30:07 +0200 Subject: [PATCH 052/557] update some older presets --- src/config.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/config.c b/src/config.c index e6d4c75..ba2992b 100644 --- a/src/config.c +++ b/src/config.c @@ -519,20 +519,14 @@ static void cfg_create_ini() "\n" "; Carmageddon\n" "[CARMA95]\n" - "noactivateapp=true\n" "flipclear=true\n" "carma95_hack=true\n" "\n" "; Carmageddon\n" "[CARM95]\n" - "noactivateapp=true\n" "flipclear=true\n" "carma95_hack=true\n" "\n" - "; Carmageddon 2\n" - "[Carma2_SW]\n" - "noactivateapp=true\n" - "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" "renderer=gdi\n" @@ -962,35 +956,30 @@ static void cfg_create_ini() "[ja2]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2: Unfinished Business\n" "[JA2UB]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" "singlecpu=false\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Jedi Knight Dark Forces 2\n" @@ -1489,7 +1478,6 @@ static void cfg_create_ini() "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" - "noactivateapp=true\n" "releasealt=true\n" "\n" "; Worms 2\n" From af8a81b61821cdba2bfaed6473b8bc755ddc9735 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 06:03:41 +0200 Subject: [PATCH 053/557] Force redraw for GDI games --- src/render_d3d9.c | 8 ++++++++ src/render_ogl.c | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c8e911e..4a0d22f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -682,6 +682,14 @@ DWORD WINAPI d3d9_render_main(void) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); Sleep(50); } + else + { + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + } if (!g_ddraw.render.run) break; diff --git a/src/render_ogl.c b/src/render_ogl.c index 8be7c55..2975428 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1293,6 +1293,12 @@ static void ogl_render() SwapBuffers(g_ogl.hdc); + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + if (!g_ddraw.render.run) break; From 79b1812e5a3441ab2db250f40ee467c798cb21c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 07:34:54 +0200 Subject: [PATCH 054/557] hide msctls_statusbar32 --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index a24da1a..cdd64ba 100644 --- a/src/utils.c +++ b/src/utils.c @@ -861,6 +861,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || From 52b63d3d47f57f2c1f7eee5e0933b7b9188abf3e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 07:37:43 +0200 Subject: [PATCH 055/557] add preset for Callus 95 --- README.md | 1 + src/config.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 7c033a6..55c3326 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Blue's 123 Time Activities - Blue's Treasure Hunt - Caesar III (Sierra - 1998) +- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Call To Power 2 - Capitalism II - Capitalism Lab diff --git a/src/config.c b/src/config.c index ba2992b..3c3caf9 100644 --- a/src/config.c +++ b/src/config.c @@ -517,6 +517,16 @@ static void cfg_create_ini() "[ArtTime]\n" "renderer=gdi\n" "\n" + "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" + "[CALLUS95]\n" + "nonexclusive=true\n" + "devmode=true\n" + "\n" + "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" + "[CALLUS95p]\n" + "nonexclusive=true\n" + "devmode=true\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "flipclear=true\n" From 3efd6fc6ba91afda7af71d2bc1d47b39e562687e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 13:09:31 +0200 Subject: [PATCH 056/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index e087ffd..58d6edb 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#define VERSION_REVISION 5 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From a6adda6ace74e920fb99ddcdf9ab137335167204 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 13:13:25 +0200 Subject: [PATCH 057/557] add commented out test code --- src/winapi_hooks.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b856f0e..cc40985 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -819,6 +819,11 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV lpDevMode->dmDisplayFrequency = 60; } + if (result && !lpszDeviceName && lpDevMode && iModeNum != ENUM_CURRENT_SETTINGS) + { + //lpDevMode->dmBitsPerPel = 16; + } + return result; } From efb524ee4d3a63eda27541fbe0d48a7ee19fd02d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 14:23:29 +0200 Subject: [PATCH 058/557] add new optionm to fixchild= ini setting --- inc/dd.h | 2 +- src/config.c | 2 +- src/render_d3d9.c | 1 - src/render_gdi.c | 1 - src/render_ogl.c | 1 - src/utils.c | 5 +++-- src/wndproc.c | 21 --------------------- 7 files changed, 5 insertions(+), 28 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 116d661..750825d 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -32,6 +32,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define FIX_CHILDS_DETECT 1 #define FIX_CHILDS_DETECT_PAINT 2 #define FIX_CHILDS_DETECT_HIDE 3 +#define FIX_CHILDS_DETECT_HIDE_NOSCALE 4 #define RESLIST_NORMAL 0 #define RESLIST_MINI 1 @@ -150,7 +151,6 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; - HWND video_window_hwnd; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; diff --git a/src/config.c b/src/config.c index 3c3caf9..85f9dac 100644 --- a/src/config.c +++ b/src/config.c @@ -291,7 +291,7 @@ static void cfg_create_ini() "; Note: Set this to 1 if the game is crashing on startup\n" "resolutions=0\n" "\n" - "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide\n" + "; Child window handling, possible values: 0 = Disabled, 1 = Display top left, 2 = Display top left + repaint, 3 = Hide, 4 = Display top left + hide\n" "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 4a0d22f..5c5bdeb 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -634,7 +634,6 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) diff --git a/src/render_gdi.c b/src/render_gdi.c index 390fc56..f4e5746 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -85,7 +85,6 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); } diff --git a/src/render_ogl.c b/src/render_ogl.c index 2975428..6584f80 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -1034,7 +1034,6 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw.child_window_exists = FALSE; - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, NULL); EnumChildWindows(g_ddraw.hwnd, util_enum_child_proc, (LPARAM)g_ddraw.primary); if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) diff --git a/src/utils.c b/src/utils.c index cdd64ba..110e55a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -861,6 +861,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE || strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || @@ -869,9 +870,9 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "MCIWndClass") == 0 || strcmp(class_name, "AVI Window") == 0) { - if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) + if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE) { - InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); + g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; } if (!(exstyle & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 9fa4e4a..a12c2c5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -830,13 +830,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } case WM_KEYUP: @@ -847,13 +840,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw.primary); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } /* button up messages reactivate cursor lock */ @@ -945,13 +931,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam lParam = MAKELPARAM(x, y); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); - if (video_hwnd) - { - //PostMessageA(video_hwnd, uMsg, wParam, lParam); - //return 0; - } - break; } case WM_PARENTNOTIFY: From d1802eb4c51605ce6fa7b6d033d70590abde1e89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Aug 2024 14:26:26 +0200 Subject: [PATCH 059/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 58d6edb..4451471 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#define VERSION_REVISION 6 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 815e9f045b9d02cd065957f1d73eec1b684fcd9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 18 Aug 2024 11:40:17 +0200 Subject: [PATCH 060/557] fix warning --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bd28605..25d8693 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -914,7 +914,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; - InterlockedExchange(&This->dc_state, SaveDC(dc)); + InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); return DD_OK; } From 2faed7325bf5b4af557a7c5042b9e19fcd0793ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 09:55:27 +0200 Subject: [PATCH 061/557] update HoMM 4 preset --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 85f9dac..3c8edab 100644 --- a/src/config.c +++ b/src/config.c @@ -94,6 +94,7 @@ void cfg_load() GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); /* Hotkeys */ @@ -104,8 +105,6 @@ void cfg_load() GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); /* Game specific settings */ - - GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); /* Added for HoMM4 */ GET_BOOL(g_config.armadahack, "armadahack", FALSE); GET_BOOL(g_config.tshack, "tshack", FALSE); @@ -925,6 +924,7 @@ static void cfg_create_ini() "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" + "remove_menu=true\n" "homm_hack=true\n" "\n" "; Hard Truck: Road to Victory\n" From 35f27746d1358f6e8c420d0ece1ef3c8af95bd1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 09:56:07 +0200 Subject: [PATCH 062/557] add remove_menu setting to ini template --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 3c8edab..bab62eb 100644 --- a/src/config.c +++ b/src/config.c @@ -322,6 +322,7 @@ static void cfg_create_ini() "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" "no_compat_warning=false\n" + "remove_menu=false\n" "\n" "\n" "\n" From 4078fdf9194d60425ca9e44f41c749138af19b3b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 10:44:54 +0200 Subject: [PATCH 063/557] use Alt+Backspace hokey combo for windowed toggle in Moorhuhn --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index bab62eb..db0a8c8 100644 --- a/src/config.c +++ b/src/config.c @@ -1112,6 +1112,10 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" + "; Moorhuhn\n" + "[Moorhuhn]\n" + "keytogglefullscreen=0x08\n" + "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "releasealt=true\n" From c838496b203335495aa3a7853e7b0a0775943888 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 11:01:48 +0200 Subject: [PATCH 064/557] update age of wonders presets --- src/config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index db0a8c8..ca7630c 100644 --- a/src/config.c +++ b/src/config.c @@ -420,13 +420,13 @@ static void cfg_create_ini() "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders 2\n" "[AoW2Compat]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders 2 Config Tool\n" @@ -436,13 +436,13 @@ static void cfg_create_ini() "; Age of Wonders: Shadow Magic\n" "[AoWSM]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders: Shadow Magic\n" "[AoWSMCompat]\n" "resolutions=2\n" - "renderer=opengl\n" + "nonexclusive=false\n" "singlecpu=false\n" "\n" "; Age of Wonders: Shadow Magic Config Tool\n" From 05685bffaec9ab4749dbff920f9cddfd8f3f807b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 11:09:49 +0200 Subject: [PATCH 065/557] always disable menu in fullscreen mode (keep it for borderelss only) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 444c4db..3449703 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1069,7 +1069,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (GetMenu(g_ddraw.hwnd)) { - if (g_config.remove_menu || !g_config.nonexclusive) + if (1) // g_config.remove_menu || !g_config.nonexclusive) { SetMenu(g_ddraw.hwnd, NULL); } From 5259dc153b167f1cb4e17952659c9eb3a6c17a02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 12:14:20 +0200 Subject: [PATCH 066/557] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 4451471..ba3bff4 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 6 -#define VERSION_MINOR 7 +#define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 36d1cf31aba45ccf2884a1f9d89d1ad5733795ca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 20 Aug 2024 16:13:11 +0200 Subject: [PATCH 067/557] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 55c3326..5ee1859 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Commandos - Commandos - Beyond The Call Of Duty - Commandos 2 +- Constructor - Corsairs Gold - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland From aa381cae814be095e3b26a1af65d51165945a43e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:52:17 +0200 Subject: [PATCH 068/557] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5ee1859..9015bd5 100644 --- a/README.md +++ b/README.md @@ -222,6 +222,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Mech Warrior 3 - Megaman X4 - Metal Gear Solid +- Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon From d0618c60a38d8c96c5d35f292d5502a9d6e4e815 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:52:32 +0200 Subject: [PATCH 069/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ba3bff4..33a42f0 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From f903230ed5ebbe95f416166fdf795511ea928e94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:54:06 +0200 Subject: [PATCH 070/557] update callus 95 preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index ca7630c..862734d 100644 --- a/src/config.c +++ b/src/config.c @@ -519,11 +519,13 @@ static void cfg_create_ini() "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" + "windowed=true\n" "nonexclusive=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" + "windowed=true\n" "nonexclusive=true\n" "devmode=true\n" "\n" From 848b084655339df1161f56d0b89c19097d0ae0fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 04:56:49 +0200 Subject: [PATCH 071/557] update callus 95 preset --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 862734d..e090326 100644 --- a/src/config.c +++ b/src/config.c @@ -520,13 +520,13 @@ static void cfg_create_ini() "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" "windowed=true\n" - "nonexclusive=true\n" + "toggle_borderless=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" "windowed=true\n" - "nonexclusive=true\n" + "toggle_borderless=true\n" "devmode=true\n" "\n" "; Carmageddon\n" From 826cb5c4d5601331f9a029ada35abe8899dbf115 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 08:37:13 +0200 Subject: [PATCH 072/557] fix bmp screenshots --- src/ddsurface.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 25d8693..ae7be83 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1463,10 +1463,8 @@ HRESULT dd_CreateSurface( WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - if (clr_bits < 24) - { - dst_surface->bmi->bmiHeader.biClrUsed = (1 << clr_bits); - } + dst_surface->bmi->bmiHeader.biClrUsed = + dst_surface->bmi->bmiHeader.biCompression == BI_BITFIELDS ? 3 : (1 << clr_bits); dst_surface->bmi->bmiHeader.biSizeImage = ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; From 073709dc3a9a06eafa51ef3a24022ccc7890f2cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 08:53:08 +0200 Subject: [PATCH 073/557] update presets --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index e090326..8ff034e 100644 --- a/src/config.c +++ b/src/config.c @@ -519,12 +519,14 @@ static void cfg_create_ini() "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95]\n" + "game_handles_close=true\n" "windowed=true\n" "toggle_borderless=true\n" "devmode=true\n" "\n" "; Callus 95 - CPS-1 (Capcom Play System 1) emulator\n" "[CALLUS95p]\n" + "game_handles_close=true\n" "windowed=true\n" "toggle_borderless=true\n" "devmode=true\n" From 57d5a9cda3de0c8be579067e23afbccb8bcd6240 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:07:57 +0200 Subject: [PATCH 074/557] add fallout 2 workaround for window not showing up in taskbar sometimes --- src/winapi_hooks.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cc40985..02da8dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1602,6 +1602,14 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } + /* Fallout 2 */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && + _strcmpi(lpWindowName, "FALLOUT II") == 0) + { + /* Workaround for window not showing up in taskbar sometimes */ + dwExStyle |= WS_EX_APPWINDOW; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From cde053f218866a510761db9da7844e161b5b3a2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:16:56 +0200 Subject: [PATCH 075/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 33a42f0..d2250e3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 2 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From ab3aac113e57e089369475c680be00b430959dd5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 21 Aug 2024 10:22:59 +0200 Subject: [PATCH 076/557] add comment --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 02da8dd..3bd5f3d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1646,6 +1646,7 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_VISIBLE; } + /* Battle.net */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd) { if (!g_ddraw.bnet_active) From 40ed99631129a0d26b3e602666892c2217fbd812 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 14:42:33 +0200 Subject: [PATCH 077/557] disable wayland detection for SteamDeck Not needed because the deck does automatically enabled gamescope and therefore games will not glitch --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3449703..080bbea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,7 +1163,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (IsWine() && + if (IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0) && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { From 136b5b30c596ed1374226e464203da448bd02782 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 14:50:03 +0200 Subject: [PATCH 078/557] add new IsSteamDeck function to versionhelpers --- inc/versionhelpers.h | 4 ++++ src/dd.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 0746d39..e8359ae 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -228,4 +228,8 @@ VERSIONHELPERAPI IsAndroid(void) { return release && strstr(release, "android") != NULL; } +VERSIONHELPERAPI IsSteamDeck(void) { + return IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0); +} + #endif diff --git a/src/dd.c b/src/dd.c index 080bbea..a875f92 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,7 +1163,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl Fix wayland bug: ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ - if (IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0) && + if (IsWine() && !IsSteamDeck() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { From a1d8559322ad317b0e9ff8c454cb352b85b0674a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 24 Aug 2024 17:31:43 +0200 Subject: [PATCH 079/557] fix for last commit --- inc/versionhelpers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index e8359ae..8a59f74 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -229,7 +229,7 @@ VERSIONHELPERAPI IsAndroid(void) { } VERSIONHELPERAPI IsSteamDeck(void) { - return IsWine() && !GetEnvironmentVariable("STEAMDECK", NULL, 0); + return IsWine() && GetEnvironmentVariable("STEAMDECK", NULL, 0); } #endif From a0ec16ba4d16222aec03a3e8579343a5aeb9b3f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 09:07:50 +0200 Subject: [PATCH 080/557] add preset for constructor --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 8ff034e..30c6dae 100644 --- a/src/config.c +++ b/src/config.c @@ -696,6 +696,10 @@ static void cfg_create_ini() "[comandos_w10]\n" "maxgameticks=-1\n" "\n" + "; Constructor\n" + "[Game_W95]\n" + "noactivateapp=true\n" + "\n" "; Caesar III\n" "[c3]\n" "nonexclusive=true\n" From e6c5c4ede2f5e77d15d23fa2c64d41bd7a1023b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 12:26:12 +0200 Subject: [PATCH 081/557] enable workaround for fallout 1 as well --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3bd5f3d..40a4c96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1602,9 +1602,9 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } - /* Fallout 2 */ + /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && - _strcmpi(lpWindowName, "FALLOUT II") == 0) + strstr(lpWindowName, "FALLOUT")) { /* Workaround for window not showing up in taskbar sometimes */ dwExStyle |= WS_EX_APPWINDOW; From 283295a5c960e741cd4fbcb72b8fc0816deb0adb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Aug 2024 19:12:15 +0200 Subject: [PATCH 082/557] add DDSCL_FULLSCREEN check --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index a875f92..199d833 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1415,7 +1415,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } - if (dwFlags & DDSCL_NORMAL) + if ((dwFlags & DDSCL_NORMAL) && !(dwFlags & DDSCL_FULLSCREEN)) { if (g_config.fake_mode[0]) { From bdb249058a4a9dc92546c36dc9ccf4ae1ceb462a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 26 Aug 2024 08:57:11 +0200 Subject: [PATCH 083/557] fix ddsCaps --- src/dd.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 199d833..36fc77d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -448,7 +448,18 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) lpDDDriverCaps->dwVidMemTotal = 16777216; lpDDDriverCaps->dwVidMemFree = 16777216; - lpDDDriverCaps->ddsCaps.dwCaps = DDSCAPS_FLIP; + + lpDDDriverCaps->ddsCaps.dwCaps = + DDSCAPS_BACKBUFFER | + DDSCAPS_COMPLEX | + DDSCAPS_FLIP | + DDSCAPS_FRONTBUFFER | + DDSCAPS_OFFSCREENPLAIN | + DDSCAPS_PRIMARYSURFACE | + DDSCAPS_VIDEOMEMORY | + DDSCAPS_OWNDC | + DDSCAPS_LOCALVIDMEM | + DDSCAPS_NONLOCALVIDMEM; } if (lpDDEmulCaps) From dffed469478a8af89d784ced4766f2de5462270e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 08:36:46 +0200 Subject: [PATCH 084/557] Ignore errors from glGetString --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 6584f80..61d9d3f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -63,6 +63,8 @@ BOOL ogl_create() TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); + while (glGetError() != GL_NO_ERROR); /* Ignore errors from glGetString */ + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); } else From efd5bc6c323a39cbf9605c00edfc2d0082bd40c4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 09:19:32 +0200 Subject: [PATCH 085/557] use glGetStringi if available (fixes errors on core profile) --- inc/opengl_utils.h | 2 ++ src/opengl_utils.c | 25 +++++++++++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index 63d2a73..4449951 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -108,6 +108,8 @@ extern PFNGLDRAWBUFFERSPROC glDrawBuffers; extern PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; extern PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; extern PFNGLTEXBUFFERPROC glTexBuffer; +extern PFNGLGETINTEGERVPROC glGetIntegerv; +extern PFNGLGETSTRINGIPROC glGetStringi; extern HMODULE g_oglu_hmodule; extern BOOL g_oglu_got_version2; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 9e63d8a..8222f10 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -88,6 +88,8 @@ PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT; PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB; PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB; PFNGLTEXBUFFERPROC glTexBuffer; +PFNGLGETINTEGERVPROC glGetIntegerv; +PFNGLGETSTRINGIPROC glGetStringi; HMODULE g_oglu_hmodule; BOOL g_oglu_got_version2; @@ -192,6 +194,8 @@ void oglu_init() wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)xwglGetProcAddress("wglGetExtensionsStringARB"); glTexBuffer = (PFNGLTEXBUFFERPROC)xwglGetProcAddress("glTexBuffer"); + glGetIntegerv = (PFNGLGETINTEGERVPROC)xwglGetProcAddress("glGetIntegerv"); + glGetStringi = (PFNGLGETSTRINGIPROC)xwglGetProcAddress("glGetStringi"); char* glversion = (char*)glGetString(GL_VERSION); if (glversion) @@ -227,11 +231,24 @@ void oglu_init() BOOL oglu_ext_exists(char* ext, HDC hdc) { - char* glext = (char*)glGetString(GL_EXTENSIONS); - - if (glext) + if (glGetIntegerv && glGetStringi) { - if (strstr(glext, ext)) + GLint n = 0; + glGetIntegerv(GL_NUM_EXTENSIONS, &n); + + for (GLint i = 0; i < n; i++) + { + char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + + if (glext && strcmp(glext, ext) == 0) + return TRUE; + } + } + else + { + char* glext = (char*)glGetString(GL_EXTENSIONS); + + if (glext && strstr(glext, ext)) return TRUE; } From e79e076f0aca69d5717e50249c9992b55f6f1628 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 09:25:15 +0200 Subject: [PATCH 086/557] only ignore errors in debug build --- src/render_ogl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 61d9d3f..be0793e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -63,7 +63,9 @@ BOOL ogl_create() TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); +#ifdef _DEBUG while (glGetError() != GL_NO_ERROR); /* Ignore errors from glGetString */ +#endif GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); } From 0884be514d6ff40876df9ffdae862d56ea082ad4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 10:24:00 +0200 Subject: [PATCH 087/557] handle cases where DDSD_WIDTH and DDSD_HEIGHT passed to dd_EnumDisplayModes --- src/dd.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 36fc77d..b64c320 100644 --- a/src/dd.c +++ b/src/dd.c @@ -27,6 +27,7 @@ HRESULT dd_EnumDisplayModes( { dbg_dump_edm_flags(dwFlags); + DDSURFACEDESC2 s = { 0 }; DWORD bpp_filter = 0; if (lpDDSurfaceDesc) @@ -46,12 +47,48 @@ HRESULT dd_EnumDisplayModes( bpp_filter = lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount; break; } + + if ((lpDDSurfaceDesc->dwFlags & DDSD_WIDTH) && (lpDDSurfaceDesc->dwFlags & DDSD_HEIGHT)) + { + TRACE(" dwWidth=%u, dwHeight=%u\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight); + + s.dwSize = sizeof(DDSURFACEDESC); + s.dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; + s.dwRefreshRate = 60; + s.dwHeight = lpDDSurfaceDesc->dwHeight; + s.dwWidth = lpDDSurfaceDesc->dwWidth; + + s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); + s.ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 8; + + if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 16) + { + s.ddpfPixelFormat.dwFlags = DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 16; + s.ddpfPixelFormat.dwRBitMask = 0xF800; + s.ddpfPixelFormat.dwGBitMask = 0x07E0; + s.ddpfPixelFormat.dwBBitMask = 0x001F; + } + else if (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount == 32) + { + s.ddpfPixelFormat.dwFlags = DDPF_RGB; + s.ddpfPixelFormat.dwRGBBitCount = 32; + s.ddpfPixelFormat.dwRBitMask = 0xFF0000; + s.ddpfPixelFormat.dwGBitMask = 0x00FF00; + s.ddpfPixelFormat.dwBBitMask = 0x0000FF; + } + + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; + + lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext); + return DD_OK; + } } } DWORD i = 0; DWORD res_count = 0; - DDSURFACEDESC2 s; /* Some games crash when you feed them with too many resolutions so we have to keep the list short */ From 996e051edaf7968d5172999e98371068cc434064 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 15:27:23 +0200 Subject: [PATCH 088/557] update supported games --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9015bd5..cc6f69c 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https   ### Supported Games +- Addiction Pinball - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors From a8dfbff1f2b69641aa9acc4feda0552812a20d4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 28 Aug 2024 15:27:42 +0200 Subject: [PATCH 089/557] add preset for Jeopardy! --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 30c6dae..2b449e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,10 @@ static void cfg_create_ini() "[JK]\n" "direct3d_passthrough=true\n" "\n" + "; Jeopardy! - NOT WORKING YET\n" + "[jeoppc]\n" + "singlecpu=false\n" + "\n" "; Kings Quest 8\n" "[Mask]\n" "renderer=opengl\n" From 8fe9a9370caca7e93e935795032b22d1b76ef434 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Aug 2024 11:41:31 +0200 Subject: [PATCH 090/557] tweak fake output of GetVerticalBlankStatus --- inc/dd.h | 10 +++++----- src/dd.c | 29 +++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 750825d..9ee8049 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -15,15 +15,15 @@ typedef HRESULT(WINAPI* DIRECTDRAWCREATEPROC)(GUID FAR*, LPDIRECTDRAW FAR*, IUnk ULONG dd_AddRef(); ULONG dd_Release(); HRESULT dd_EnumDisplayModes(DWORD dwFlags, LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext, LPDDENUMMODESCALLBACK lpEnumModesCallback); -HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); -HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); -HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); -HRESULT dd_RestoreDisplayMode(); HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps); HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc); HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq); -HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB); +HRESULT dd_RestoreDisplayMode(); +HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags); +HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags); +HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent); +HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree); HRESULT dd_TestCooperativeLevel(); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); diff --git a/src/dd.c b/src/dd.c index b64c320..1be2ec9 100644 --- a/src/dd.c +++ b/src/dd.c @@ -587,6 +587,27 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) return DD_OK; } +HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) +{ + if (!lpbIsInVB) + return DDERR_INVALIDPARAMS; + + static DWORD last_vb; + DWORD tick = GetTickCount(); + + if (last_vb + 16 > tick) + { + *lpbIsInVB = FALSE; + } + else + { + last_vb = tick; + *lpbIsInVB = TRUE; + } + + return DD_OK; +} + HRESULT dd_RestoreDisplayMode() { if (!g_ddraw.render.run) @@ -1685,14 +1706,6 @@ HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpd return DD_OK; } -HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) -{ - if (lpbIsInVB) - *lpbIsInVB = TRUE; - - return DD_OK; -} - HRESULT dd_TestCooperativeLevel() { if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) From 9d31f76d3e0f4e631b2603933380dd030d4dd827 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 29 Aug 2024 17:24:21 +0200 Subject: [PATCH 091/557] add presets --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 2b449e5..aa7b8fc 100644 --- a/src/config.c +++ b/src/config.c @@ -910,6 +910,10 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Hades Challenge\n" + "[HADESCH]\n" + "no_compat_warning=true\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" @@ -1167,6 +1171,10 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Paddle Bash Hotshot\n" + "[SPAGHSPaddle]\n" + "no_compat_warning=true\n" + "\n" "; Pajama Sam's Games to Play on Any Day\n" "[PJGAMES]\n" "renderer=gdi\n" From c7fe0b614bd4f263681522076af28d0ff095c4bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 08:28:59 +0200 Subject: [PATCH 092/557] fix STATUS_INVALID_CRUNTIME_PARAMETER crash with debug build --- src/debug.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index c9b5d1f..764bb50 100644 --- a/src/debug.c +++ b/src/debug.c @@ -104,7 +104,10 @@ void dbg_init() remove("cnc-ddraw-3.log"); g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); - setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); + if (g_dbg_log_file) + { + setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); + } TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); From 25ef20e7113c8a9826d48aacea8789855fe81dda Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 09:04:22 +0200 Subject: [PATCH 093/557] always create log files next to game exe --- src/debug.c | 49 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/src/debug.c b/src/debug.c index 764bb50..9c53e72 100644 --- a/src/debug.c +++ b/src/debug.c @@ -18,6 +18,11 @@ LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; static FILE* g_dbg_log_file; +static char g_dbg_log_path1[MAX_PATH] = "cnc-ddraw-1.log"; +static char g_dbg_log_path2[MAX_PATH] = "cnc-ddraw-2.log"; +static char g_dbg_log_path3[MAX_PATH] = "cnc-ddraw-3.log"; +static char g_dbg_dmp_path1[MAX_PATH] = "cnc-ddraw-1.dmp"; +static char g_dbg_dmp_path2[MAX_PATH] = "cnc-ddraw-2.dmp"; static BOOL g_dbg_log_rotate; #ifdef _DEBUG @@ -27,12 +32,9 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; - char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.dmp", g_dbg_crash_count == 1 ? 1 : 2); - HANDLE dmp = CreateFile( - filename, + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, @@ -96,14 +98,32 @@ void dbg_init() { once = TRUE; - remove("cnc-ddraw-1.dmp"); - remove("cnc-ddraw-2.dmp"); + char exe_path[MAX_PATH] = { 0 }; + if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) + { + char drive[MAX_PATH] = { 0 }; + char dir[MAX_PATH] = { 0 }; + _splitpath(exe_path, drive, dir, NULL, NULL); - remove("cnc-ddraw-1.log"); - remove("cnc-ddraw-2.log"); - remove("cnc-ddraw-3.log"); + char game_path[MAX_PATH] = { 0 }; + _makepath(game_path, drive, dir, NULL, NULL); - g_dbg_log_file = fopen("cnc-ddraw-1.log", "w"); + _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.dmp"); + _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.dmp"); + + _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.log"); + _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.log"); + _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%s%s", game_path, "cnc-ddraw-3.log"); + } + + remove(g_dbg_dmp_path1); + remove(g_dbg_dmp_path2); + + remove(g_dbg_log_path1); + remove(g_dbg_log_path2); + remove(g_dbg_log_path3); + + g_dbg_log_file = fopen(g_dbg_log_path1, "w"); if (g_dbg_log_file) { setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); @@ -187,12 +207,15 @@ void dbg_printf(const char* fmt, ...) if (g_dbg_log_file && ftell(g_dbg_log_file) >= 1024 * 1024 * 100) /* rotate every 100MB */ { - char filename[MAX_PATH] = { 0 }; - _snprintf(filename, sizeof(filename) - 1, "cnc-ddraw-%d.log", g_dbg_log_rotate ? 3 : 2); + g_dbg_log_file = + freopen( + g_dbg_log_rotate ? g_dbg_log_path3 : g_dbg_log_path2, + "w", + g_dbg_log_file); g_dbg_log_rotate = !g_dbg_log_rotate; - if ((g_dbg_log_file = freopen(filename, "w", g_dbg_log_file))) + if (g_dbg_log_file) { setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } From fc99383f2149ee3d446c2d015a5ad02cde337165 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 10:25:38 +0200 Subject: [PATCH 094/557] lie about SIZEPALETTE and NUMCOLORS in GetDeviceCaps --- src/winapi_hooks.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 40a4c96..86e95b2 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -856,13 +856,18 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { return g_ddraw.bpp; } - - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - index == RASTERCAPS && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + + if (g_ddraw.ref && g_ddraw.bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - return RC_PALETTE | real_GetDeviceCaps(hdc, index); + if (index == RASTERCAPS) + { + return RC_PALETTE | real_GetDeviceCaps(hdc, index); + } + + if (index == SIZEPALETTE || index == NUMCOLORS) + { + return 256; + } } return real_GetDeviceCaps(hdc, index); From 9565b2b50f326a8351808d83ea3919529200105f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 11:55:43 +0200 Subject: [PATCH 095/557] make sure we return proper resolution list when using windowed hack --- inc/dd.h | 1 + src/dd.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 9ee8049..fe8a902 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -158,6 +158,7 @@ typedef struct CNCDDRAW DWORD minfps_tick_len; DWORD gui_thread_id; BOOL show_driver_warning; + BOOL windowed_hack; struct { diff --git a/src/dd.c b/src/dd.c index 1be2ec9..fb3adf0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -161,7 +161,8 @@ HRESULT dd_EnumDisplayModes( } } - if ((g_ddraw.bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) + if (((g_ddraw.bpp && !g_ddraw.windowed_hack) && g_config.resolutions == RESLIST_NORMAL) || + g_config.resolutions == RESLIST_FULL) { TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); @@ -1498,12 +1499,18 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (!g_ddraw.width) { + g_ddraw.windowed_hack = TRUE; + RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } + else + { + g_ddraw.windowed_hack = FALSE; + } return DD_OK; } From e44b04956fae966391042fcb93d7f0c58d2019e1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:06:21 +0200 Subject: [PATCH 096/557] add preset for Axis & Allies --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index aa7b8fc..5ca4e59 100644 --- a/src/config.c +++ b/src/config.c @@ -477,6 +477,11 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" + "; Axis & Allies\n" + "[AxisAllies]\n" + "hook_peekmessage=true\n" + "maxgameticks=60\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" From 18f6b1e5ea2806fccf1f57a2b308c8f63c6c4af9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:10:50 +0200 Subject: [PATCH 097/557] add preset for Play with the Teletubbies --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 5ca4e59..2a6053c 100644 --- a/src/config.c +++ b/src/config.c @@ -1269,6 +1269,10 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" + "; Play with the Teletubbies\n" + "[PlayWTT]\n" + "hook=3\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From f64913b5e650f520a900713b929a1ae018a5e1e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:37:06 +0200 Subject: [PATCH 098/557] fix for windowed_hack --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index fb3adf0..a4a3e3a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -339,7 +339,7 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL) + if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL || g_ddraw.windowed_hack) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { From 1b0c518759e127838503eabbdb7dd934f80c9be6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 12:44:55 +0200 Subject: [PATCH 099/557] add preset for Girl Talk --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 2a6053c..a9e854b 100644 --- a/src/config.c +++ b/src/config.c @@ -903,6 +903,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Girl Talk\n" + "[GirlTalk]\n" + "resolutions=2\n" + "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" From 6ad443cfb19d799969f8c30c45dea424a443bad2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 30 Aug 2024 16:02:32 +0200 Subject: [PATCH 100/557] uncomment ReleaseCapture call to prevent cursor issues in windowed mode --- src/dd.c | 5 +---- src/mouse.c | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index a4a3e3a..7887f07 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1378,10 +1378,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_config.devmode) { - HCURSOR cursor = real_SetCursor(LoadCursor(NULL, IDC_ARROW)); - - if (cursor != LoadCursor(NULL, IDC_WAIT)) - InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)cursor); + InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)real_SetCursor(LoadCursor(NULL, IDC_ARROW))); } int cursor_count = real_ShowCursor(TRUE) - 1; diff --git a/src/mouse.c b/src/mouse.c index c5b25eb..46aca13 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -63,7 +63,7 @@ void mouse_unlock() g_mouse_locked = FALSE; real_ClipCursor(NULL); - //ReleaseCapture(); + ReleaseCapture(); RECT rc = { 0 }; real_GetClientRect(g_ddraw.hwnd, &rc); From 00bb6254a0d5b0ad61817210b3b744d8d4c7be8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 07:35:31 +0200 Subject: [PATCH 101/557] Force access violation in debug build to produce a dmp file for debugging (disables watson) --- src/hook.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/hook.c b/src/hook.c index c9641f4..2889fdd 100644 --- a/src/hook.c +++ b/src/hook.c @@ -8,6 +8,7 @@ #include "dllmain.h" #include "config.h" #include "utils.h" +#include "patch.h" #include "versionhelpers.h" #ifdef _MSC_VER @@ -655,6 +656,12 @@ void hook_init() DetourUpdateThread(GetCurrentThread()); DetourAttach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); + + if (!IsDebuggerPresent()) + { + /* Force access violation to produce a dmp file for debugging (disables watson) */ + PATCH_SET((void*)_invoke_watson, "\xC6\x05\x00\x00\x00\x00\x00"); + } } #endif From 1bdc2dc2b2b9490190d38be9c383fb3cd8bc6103 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 08:09:51 +0200 Subject: [PATCH 102/557] hook _invoke_watson --- inc/debug.h | 7 +++++++ src/debug.c | 22 ++++++++++++++++++++++ src/hook.c | 3 +-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 72efcf1..058e27a 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,6 +28,13 @@ void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_mes_to_str(int id); +__declspec(noreturn) void __cdecl dbg_invoke_watson( + _In_opt_z_ wchar_t const*, + _In_opt_z_ wchar_t const*, + _In_opt_z_ wchar_t const*, + _In_ unsigned int, + _In_ uintptr_t); + extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; diff --git a/src/debug.c b/src/debug.c index 9c53e72..0e2c90e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -88,6 +88,28 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) return EXCEPTION_EXECUTE_HANDLER; } + +__declspec(noreturn) void __cdecl dbg_invoke_watson( + wchar_t const* const expression, + wchar_t const* const function_name, + wchar_t const* const file_name, + unsigned int const line_number, + uintptr_t const reserved +) +{ + UNREFERENCED_PARAMETER(expression); + UNREFERENCED_PARAMETER(function_name); + UNREFERENCED_PARAMETER(file_name); + UNREFERENCED_PARAMETER(line_number); + UNREFERENCED_PARAMETER(reserved); + + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + /* Force access violation to produce a dmp file for debugging */ + *(int*)0 = 0; + + TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); +} #endif void dbg_init() diff --git a/src/hook.c b/src/hook.c index 2889fdd..378b4a0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -659,8 +659,7 @@ void hook_init() if (!IsDebuggerPresent()) { - /* Force access violation to produce a dmp file for debugging (disables watson) */ - PATCH_SET((void*)_invoke_watson, "\xC6\x05\x00\x00\x00\x00\x00"); + patch_ljmp((void*)_invoke_watson, (void*)dbg_invoke_watson); } } #endif From cbcbad0be4ae7bf31060d4998d603b2b2fc0b97d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 09:36:51 +0200 Subject: [PATCH 103/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d2250e3..eeeaa0a 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 8 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#define VERSION_REVISION 3 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 004951a9409d64862309be351e085c613ec4a2a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 10:11:37 +0200 Subject: [PATCH 104/557] ignore 0 GUID --- src/IDirectDraw/IDirectDraw.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index ee6c653..c104800 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -128,6 +128,12 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; */ } + else if (((GUID*)riid)->Data1 == 0 && ((GUID*)riid)->Data2 == 0 && ((GUID*)riid)->Data3 == 0) + { + TRACE("NOT_IMPLEMENTED GUID = 0 0 0\n"); + + ret = E_NOINTERFACE; + } else { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); From 248b62a3320742724599081a785b3502634d5fb5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 11:12:39 +0200 Subject: [PATCH 105/557] add NULL checks to QueryInterface --- src/IDirectDraw/IDirectDraw.c | 6 +++++- src/IDirectDraw/IDirectDrawClipper.c | 6 ++++++ src/IDirectDraw/IDirectDrawGammaControl.c | 6 ++++++ src/IDirectDraw/IDirectDrawPalette.c | 6 ++++++ src/IDirectDraw/IDirectDrawSurface.c | 6 +++++- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index c104800..7bff5f0 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -18,7 +18,11 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid HRESULT ret = E_NOINTERFACE; - if (riid) + if (!ppvObj) + { + ret = E_INVALIDARG; + } + else if (riid) { if (IsEqualGUID(&IID_IDirectDraw2, riid) || IsEqualGUID(&IID_IDirectDraw4, riid) || diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 86b8a2f..6270c09 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -14,6 +14,12 @@ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* Thi _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 65f61fa..d0bd36a 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -13,6 +13,12 @@ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaContro _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index a5429ea..0a6334a 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -15,6 +15,12 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* Thi _ReturnAddress()); HRESULT ret = E_NOINTERFACE; + + if (!ppvObj) + { + ret = E_INVALIDARG; + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 8984571..3eec3e6 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -11,7 +11,11 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = S_OK; - if (riid) + if (!ppvObj) + { + ret = E_INVALIDARG; + } + else if (riid) { if (IsEqualGUID(&IID_IDirectDrawSurface, riid) || IsEqualGUID(&IID_IDirectDrawSurface2, riid) || From 7a8db6c18994244b6bb681e5adc5bc6fd1890add Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 11:23:48 +0200 Subject: [PATCH 106/557] keep artifact's for 90 days --- .github/workflows/build.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf74fdd..ed50b00 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -119,35 +119,30 @@ jobs: with: name: cnc-ddraw-release path: cnc-ddraw-release - retention-days: 14 - name: Upload artifacts cnc-ddraw-releasexp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-releasexp path: cnc-ddraw-releasexp - retention-days: 14 - name: Upload artifacts cnc-ddraw-debug uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debug path: cnc-ddraw-debug - retention-days: 14 - name: Upload artifacts cnc-ddraw-debuglogxp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debuglogxp path: cnc-ddraw-debuglogxp - retention-days: 14 - name: Upload artifacts cnc-ddraw-debuglogminixp uses: actions/upload-artifact@v4 with: name: cnc-ddraw-debuglogminixp path: cnc-ddraw-debuglogminixp - retention-days: 14 - name: Release experimental uses: softprops/action-gh-release@v1 From b5eea287d561f2c576e4a3dad36a16e6930b3792 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 13:22:29 +0200 Subject: [PATCH 107/557] add git commit hash to file version and log --- .gitignore | 2 ++ cnc-ddraw.vcxproj | 30 ++++++++++++++++++++++++++++++ inc/version.h | 1 + res.rc | 12 ++++++++++-- src/debug.c | 16 +++++++++++++++- 5 files changed, 58 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 158b71e..1bffb6b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +inc/version_tmp.h + # C++ Builder __astcache/ diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index fda7e42..498532a 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -230,6 +230,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -257,6 +263,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -284,6 +296,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -311,6 +329,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + @@ -338,6 +362,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe ) + + echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +SET ERRORLEVEL = 0 + diff --git a/inc/version.h b/inc/version.h index eeeaa0a..9fef507 100644 --- a/inc/version.h +++ b/inc/version.h @@ -3,6 +3,7 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) +#define git_str(a) str(a) #define VERSION_MAJOR 6 #define VERSION_MINOR 8 diff --git a/res.rc b/res.rc index 69ba76c..9c361ce 100644 --- a/res.rc +++ b/res.rc @@ -1,5 +1,13 @@ #include "inc/version.h" +#ifndef __GNUC__ +#include "inc/version_tmp.h" +#endif + +#ifndef GIT_COMMIT +#define GIT_COMMIT UNKNOWN +#endif + 1 VERSIONINFO FILEVERSION VERSION PRODUCTVERSION VERSION @@ -10,13 +18,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING + VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING + VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index 0e2c90e..b21bf11 100644 --- a/src/debug.c +++ b/src/debug.c @@ -10,6 +10,14 @@ #include "version.h" #include "versionhelpers.h" +#ifndef __GNUC__ +#include "version_tmp.h" +#endif + +#ifndef GIT_COMMIT +#define GIT_COMMIT UNKNOWN +#endif + double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; @@ -151,7 +159,13 @@ void dbg_init() setvbuf(g_dbg_log_file, NULL, _IOLBF, 1024); } - TRACE("cnc-ddraw version = %d.%d.%d.%d\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION); + TRACE( + "cnc-ddraw version = %d.%d.%d.%d (git~%s)\n", + VERSION_MAJOR, + VERSION_MINOR, + VERSION_BUILD, + VERSION_REVISION, + git_str(GIT_COMMIT)); HKEY hkey; LONG status = From 67e4c664f6e99d8d6ae9486ccc7d9465507ee4dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 13:27:09 +0200 Subject: [PATCH 108/557] fix for last commit --- cnc-ddraw.vcxproj | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 498532a..bd3ef90 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -231,10 +231,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -264,10 +266,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -297,10 +301,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -330,10 +336,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + @@ -363,10 +371,12 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --verify HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h + +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h -SET ERRORLEVEL = 0 +SET ERRORLEVEL = 0 + From f3ba703444278a30c8cec495e2ff7cf7691fb553 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 14:09:35 +0200 Subject: [PATCH 109/557] add git commit hash to mingw build as well --- Makefile | 2 ++ build.cmd | 2 +- res.rc | 6 ------ src/debug.c | 9 +-------- 4 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Makefile b/Makefile index 7a238b2..626761a 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,8 @@ -include config.mk TARGET = ddraw.dll +GIT_REV := $(shell git rev-parse --short @{0} || echo "UNKNOWN") +GIT_FILE := $(shell echo "#define GIT_COMMIT" $(GIT_REV) > inc/version_tmp.h) LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 diff --git a/build.cmd b/build.cmd index c9d3564..7613fd2 100644 --- a/build.cmd +++ b/build.cmd @@ -2,7 +2,7 @@ REM REM patch environment config REM -set PATH=C:\w64devkit\bin +set PATH=C:\w64devkit\bin;C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ make clean make REM make DEBUG=1 diff --git a/res.rc b/res.rc index 9c361ce..9bf5f3d 100644 --- a/res.rc +++ b/res.rc @@ -1,12 +1,6 @@ #include "inc/version.h" - -#ifndef __GNUC__ #include "inc/version_tmp.h" -#endif -#ifndef GIT_COMMIT -#define GIT_COMMIT UNKNOWN -#endif 1 VERSIONINFO FILEVERSION VERSION diff --git a/src/debug.c b/src/debug.c index b21bf11..27304cb 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,15 +8,8 @@ #include "debug.h" #include "hook.h" #include "version.h" -#include "versionhelpers.h" - -#ifndef __GNUC__ #include "version_tmp.h" -#endif - -#ifndef GIT_COMMIT -#define GIT_COMMIT UNKNOWN -#endif +#include "versionhelpers.h" double g_dbg_frame_time = 0; From 8e01f4e8851ebac5fe6cbcd0fd23311b334923ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 15:23:45 +0200 Subject: [PATCH 110/557] fix git path on VS 2019 --- cnc-ddraw.vcxproj | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index bd3ef90..36a4677 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,8 +232,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -267,8 +267,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -302,8 +302,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -337,8 +337,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 @@ -372,8 +372,8 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h +"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h SET ERRORLEVEL = 0 From 7c85e9c494cb2bdb4acb7db0d7503c919b714421 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 31 Aug 2024 17:00:53 +0200 Subject: [PATCH 111/557] add preset for Thomas & Friends --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index a9e854b..79d6e62 100644 --- a/src/config.c +++ b/src/config.c @@ -1476,6 +1476,11 @@ static void cfg_create_ini() "noactivateapp=true\n" "limiter_type=2\n" "\n" + "; Thomas & Friends - The Great Festival Adventure\n" + "[Thomas]\n" + "no_compat_warning=true\n" + "noactivateapp=true\n" + "\n" "; RollerCoaster Tycoon\n" "[rct]\n" "no_dinput_hook=true\n" From 0f2a367c3641750512f78eb31123ec81a09d5e2a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 09:40:46 +0200 Subject: [PATCH 112/557] add git branch to logs --- Makefile | 7 +++-- cnc-ddraw.vcxproj | 65 +++++++++++++++++++++++++++++++++++++++-------- res.rc | 4 +-- src/debug.c | 5 ++-- 4 files changed, 65 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index 626761a..35ef6e3 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,15 @@ -include config.mk TARGET = ddraw.dll -GIT_REV := $(shell git rev-parse --short @{0} || echo "UNKNOWN") -GIT_FILE := $(shell echo "#define GIT_COMMIT" $(GIT_REV) > inc/version_tmp.h) LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 +REV := $(shell git rev-parse --short HEAD || echo "UNKNOWN") +BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") +EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) +EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) + CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 36a4677..0658bb2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,8 +232,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -267,8 +276,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -302,8 +320,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -337,8 +364,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 @@ -372,8 +408,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -echo | set /p dummyName=#define GIT_COMMIT > inc/version_tmp.h -"$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || "$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git" rev-parse --short HEAD >> inc/version_tmp.h || git rev-parse --short HEAD >> inc/version_tmp.h || echo UNKNOWN >> inc/version_tmp.h +SET DST_FILE="inc/version_tmp.h" +SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" + +if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% SET GIT_PATH="git.exe" + +echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% +%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% + +echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% +%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% SET ERRORLEVEL = 0 diff --git a/res.rc b/res.rc index 9bf5f3d..aefa936 100644 --- a/res.rc +++ b/res.rc @@ -12,13 +12,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" + VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ")" + VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index 27304cb..ac0990e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -153,12 +153,13 @@ void dbg_init() } TRACE( - "cnc-ddraw version = %d.%d.%d.%d (git~%s)\n", + "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, - git_str(GIT_COMMIT)); + git_str(GIT_COMMIT), + git_str(GIT_BRANCH)); HKEY hkey; LONG status = From c28e1d98dcd90fed76f3ebd90116562677a5185b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 09:47:19 +0200 Subject: [PATCH 113/557] make sure we got git dirty status logged as well --- Makefile | 2 +- cnc-ddraw.vcxproj | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 35ef6e3..f6a087c 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -REV := $(shell git rev-parse --short HEAD || echo "UNKNOWN") +REV := $(shell git describe --match=NeVeRmAtCh --always --abbrev=7 --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 0658bb2..21126c2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -239,7 +239,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -283,7 +283,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -327,7 +327,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -371,7 +371,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -415,7 +415,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% rev-parse --short HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% From 094d020e05379d1503b0b55f1805cabf6d7bfdb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 12:16:19 +0200 Subject: [PATCH 114/557] allow to override bpp via fake_mode --- src/winapi_hooks.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 86e95b2..da7a99c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -849,15 +849,27 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { - if (g_ddraw.ref && - g_ddraw.bpp && - index == BITSPIXEL && - (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + DWORD bpp = 0; + + if (g_ddraw.ref && g_ddraw.bpp) { - return g_ddraw.bpp; + bpp = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + strtoul(e, &e, 0); + strtoul(e + 1, &e, 0); + bpp = strtoul(e + 1, &e, 0); } - if (g_ddraw.ref && g_ddraw.bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp && index == BITSPIXEL && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + { + return bpp; + } + + if (bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { if (index == RASTERCAPS) { From ccbf60698a8ed50257e62779cb2a057d8bbf5306 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 12:34:36 +0200 Subject: [PATCH 115/557] allow to override SM_CXSCREEN and SM_CYSCREEN via fake_mode --- src/winapi_hooks.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index da7a99c..12e6056 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -307,13 +307,29 @@ BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) int WINAPI fake_GetSystemMetrics(int nIndex) { + DWORD width = 0; + DWORD height = 0; + if (g_ddraw.ref && g_ddraw.width) + { + width = g_ddraw.width; + height = g_ddraw.height; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); + } + + if (width) { if (nIndex == SM_CXSCREEN) - return g_ddraw.width; + return width; if (nIndex == SM_CYSCREEN) - return g_ddraw.height; + return height; } return real_GetSystemMetrics(nIndex); From 0e173ef6a859d1b3715a5ed4c0c437a87054aec2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 13:32:03 +0200 Subject: [PATCH 116/557] add preset for lego loco --- src/config.c | 12 +++++++++++- src/winapi_hooks.c | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 79d6e62..efe3bd2 100644 --- a/src/config.c +++ b/src/config.c @@ -711,7 +711,8 @@ static void cfg_create_ini() "adjmouse=true\n" "\n" "; Chris Sawyer's Locomotion\n" - "[LOCO]\n" + "[LOCO/2]\n" + "checkfile=.\\LOCO.EXE\n" "adjmouse=true\n" "\n" "; Cultures 2\n" @@ -1057,6 +1058,15 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; LEGO LOCO - NOT WORKING YET\n" + "[LOCO]\n" + "checkfile=.\\LEGO.INI\n" + "fake_mode=1024x768x16\n" + "posX=0\n" + "posY=0\n" + "border=false\n" + "fullscreen=false\n" + "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 12e6056..78e18ff 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1664,6 +1664,26 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Center Lego Loco overlays */ + if (_strcmpi(lpWindowName, "LEGO LOCO") == 0 && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_ddraw.width && + (dwStyle & WS_POPUP)) + { + /* not working currently, game probably moves it with SetWindowPos or MoveWindow afterwards + POINT pt = { 0, 0 }; + real_ClientToScreen(g_ddraw.hwnd, &pt); + + int added_height = g_ddraw.render.height - g_ddraw.height; + int added_width = g_ddraw.render.width - g_ddraw.width; + int align_y = added_height > 0 ? added_height / 2 : 0; + int align_x = added_width > 0 ? added_width / 2 : 0; + + X = pt.x + align_x; + Y = pt.y + align_y; + */ + } + /* Road Rash movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && From d6b2249c78a2e4d80a6585997a55d7252ed5e680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 1 Sep 2024 13:52:36 +0200 Subject: [PATCH 117/557] add missing NULL checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78e18ff..1228626 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1637,7 +1637,7 @@ HWND WINAPI fake_CreateWindowExA( /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && - strstr(lpWindowName, "FALLOUT")) + lpWindowName && strstr(lpWindowName, "FALLOUT")) { /* Workaround for window not showing up in taskbar sometimes */ dwExStyle |= WS_EX_APPWINDOW; @@ -1665,7 +1665,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Center Lego Loco overlays */ - if (_strcmpi(lpWindowName, "LEGO LOCO") == 0 && + if (lpWindowName && _strcmpi(lpWindowName, "LEGO LOCO") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && g_ddraw.width && (dwStyle & WS_POPUP)) From 4d5882414c248884d4aeb8d285e2979060443e88 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 07:46:25 +0200 Subject: [PATCH 118/557] add batch file for debug builds + some git related tweaks --- Makefile | 4 ++-- build.cmd | 16 +++++++++++----- build_debug.cmd | 15 +++++++++++++++ cnc-ddraw.vcxproj | 10 +++++----- 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 build_debug.cmd diff --git a/Makefile b/Makefile index f6a087c..f87824e 100644 --- a/Makefile +++ b/Makefile @@ -5,9 +5,9 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -REV := $(shell git describe --match=NeVeRmAtCh --always --abbrev=7 --dirty || echo "UNKNOWN") +COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -EREV := $(shell echo "#define GIT_COMMIT" $(REV) > inc/version_tmp.h) +ECOMMIT := $(shell echo "#define GIT_COMMIT" $(COMMIT) > inc/version_tmp.h) EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) CC = i686-w64-mingw32-gcc diff --git a/build.cmd b/build.cmd index 7613fd2..34bb56c 100644 --- a/build.cmd +++ b/build.cmd @@ -1,9 +1,15 @@ @echo off -REM -REM patch environment config -REM -set PATH=C:\w64devkit\bin;C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ + +set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ + +set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% + make clean make -REM make DEBUG=1 + pause diff --git a/build_debug.cmd b/build_debug.cmd new file mode 100644 index 0000000..755ec1f --- /dev/null +++ b/build_debug.cmd @@ -0,0 +1,15 @@ +@echo off + +set GIT1=C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT2=C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\ +set GIT3=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT4=C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT5=C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ +set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\ + +set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% + +make clean +make DEBUG=1 + +pause diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 21126c2..003f82c 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -239,7 +239,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -283,7 +283,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -327,7 +327,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -371,7 +371,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% @@ -415,7 +415,7 @@ if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\Te if not exist %GIT_PATH% SET GIT_PATH="git.exe" echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --abbrev=7 --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% %GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% From 40e30163d18caa5a69c12d33a9fc5ee95a2750a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 10:44:09 +0200 Subject: [PATCH 119/557] simplify git code --- .gitignore | 2 +- Makefile | 4 +-- cnc-ddraw.vcxproj | 80 +++++++++++++++++++++++------------------------ res.rc | 6 ++-- src/debug.c | 6 ++-- 5 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.gitignore b/.gitignore index 1bffb6b..46accfc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -inc/version_tmp.h +inc/git.h # C++ Builder diff --git a/Makefile b/Makefile index f87824e..52c5804 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,8 @@ LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -ECOMMIT := $(shell echo "#define GIT_COMMIT" $(COMMIT) > inc/version_tmp.h) -EBRANCH := $(shell echo "#define GIT_BRANCH" $(BRANCH) >> inc/version_tmp.h) +ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) +EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 003f82c..e5c5955 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -232,17 +232,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -276,17 +276,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -320,17 +320,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -364,17 +364,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 @@ -408,17 +408,17 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe -SET DST_FILE="inc/version_tmp.h" -SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" +set DST_FILE="inc/git.h" +set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" -if not exist %GIT_PATH% SET GIT_PATH="git.exe" +if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" +if not exist %GIT_PATH% set GIT_PATH=git.exe -echo | set /p dummyName=#define GIT_COMMIT > %DST_FILE% -%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" -echo | set /p dummyName=#define GIT_BRANCH >> %DST_FILE% -%GIT_PATH% rev-parse --abbrev-ref HEAD >> %DST_FILE% || echo UNKNOWN >> %DST_FILE% +echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% +echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% SET ERRORLEVEL = 0 diff --git a/res.rc b/res.rc index aefa936..46f3908 100644 --- a/res.rc +++ b/res.rc @@ -1,5 +1,5 @@ #include "inc/version.h" -#include "inc/version_tmp.h" +#include "inc/git.h" 1 VERSIONINFO @@ -12,13 +12,13 @@ PRODUCTVERSION VERSION { VALUE "CompanyName", "github.com/FunkyFr3sh" VALUE "FileDescription", "DirectDraw replacement" - VALUE "FileVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" + VALUE "FileVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" - VALUE "ProductVersion", VERSION_STRING " (git~" git_str(GIT_COMMIT) ", " git_str(GIT_BRANCH) ")" + VALUE "ProductVersion", VERSION_STRING " (git~" GIT_COMMIT ", " GIT_BRANCH ")" VALUE "Comments", "https://github.com/FunkyFr3sh/cnc-ddraw" } } diff --git a/src/debug.c b/src/debug.c index ac0990e..52f81ad 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,7 +8,7 @@ #include "debug.h" #include "hook.h" #include "version.h" -#include "version_tmp.h" +#include "git.h" #include "versionhelpers.h" @@ -158,8 +158,8 @@ void dbg_init() VERSION_MINOR, VERSION_BUILD, VERSION_REVISION, - git_str(GIT_COMMIT), - git_str(GIT_BRANCH)); + GIT_COMMIT, + GIT_BRANCH); HKEY hkey; LONG status = From e54d1cd4c30003dba737935da930435924f22625 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 10:46:56 +0200 Subject: [PATCH 120/557] fix for last commit --- cnc-ddraw.vcxproj | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index e5c5955..8a3f84d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -238,11 +238,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -282,11 +282,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -326,11 +326,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -370,11 +370,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 @@ -414,11 +414,11 @@ set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explor if not exist %GIT_PATH% set GIT_PATH="$(DevEnvDir)\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32\bin\git.exe" if not exist %GIT_PATH% set GIT_PATH=git.exe -for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT="%%I" -for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH="%%I" +for /f "tokens=*" %%I in ('%GIT_PATH% describe --match=NeVeRmAtCh --always --dirty ^|^| echo UNKNOWN') do set GIT_COMMIT=%%I +for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKNOWN') do set GIT_BRANCH=%%I -echo #define GIT_COMMIT %GIT_COMMIT% > %DST_FILE% -echo #define GIT_BRANCH %GIT_BRANCH% >> %DST_FILE% +echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% +echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% SET ERRORLEVEL = 0 From 50da3c6a240d1608d0a9ed7b53e61b35f6607ca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:03:39 +0200 Subject: [PATCH 121/557] add preset for glover --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index efe3bd2..f6c2c10 100644 --- a/src/config.c +++ b/src/config.c @@ -877,6 +877,10 @@ static void cfg_create_ini() "[Maze]\n" "renderer=gdi\n" "\n" + "; Glover\n" + "[glover]\n" + "singlecpu=false\n" + "\n" "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" From 6620708f6a7945537b3fcff11e14aefb8157ccc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:15:00 +0200 Subject: [PATCH 122/557] update glover preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f6c2c10..6e28963 100644 --- a/src/config.c +++ b/src/config.c @@ -879,7 +879,7 @@ static void cfg_create_ini() "\n" "; Glover\n" "[glover]\n" - "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; G-Police\n" "[GPOLICE]\n" From ca7084725043e8d9bf0e88825b893ec44727daba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:25:46 +0200 Subject: [PATCH 123/557] add preset for Jungle Storm --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 6e28963..b920c9a 100644 --- a/src/config.c +++ b/src/config.c @@ -924,6 +924,10 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Jungle Storm\n" + "[Jstorm]\n" + "no_compat_warning=true\n" + "\n" "; Hades Challenge\n" "[HADESCH]\n" "no_compat_warning=true\n" From ca8bb5319581c907b8fd0ab66619ceb55bc34226 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:40:39 +0200 Subject: [PATCH 124/557] add fixnotresponding to blt as well --- src/ddsurface.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index ae7be83..352a5d2 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,6 +50,12 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); + if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + { + MSG msg; /* workaround for "Not Responding" window problem */ + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + } + if (g_ddraw.ref && g_ddraw.iskkndx && (dwFlags & DDBLT_COLORFILL) && From 4e8253e873930dade8189ea873a5c2c7eabfa3d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 12:51:57 +0200 Subject: [PATCH 125/557] add preset for The Jungle Book Groove Party --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index b920c9a..ac423db 100644 --- a/src/config.c +++ b/src/config.c @@ -1488,6 +1488,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; The Jungle Book Groove Party\n" + "[Jungle_vr]\n" + "fixnotresponding=true\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From aac405031e17f960f0619717058fefcd84d2b04b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 13:09:47 +0200 Subject: [PATCH 126/557] add some more checks to fixnotresponding patch --- inc/dd.h | 1 + src/dd.c | 8 ++++++-- src/ddsurface.c | 20 ++++++++++++++++---- src/winapi_hooks.c | 6 ++++++ 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index fe8a902..e5904bb 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -153,6 +153,7 @@ typedef struct CNCDDRAW BOOL child_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ + DWORD last_msg_pull_tick; SPEEDLIMITER ticks_limiter; SPEEDLIMITER flip_limiter; DWORD minfps_tick_len; diff --git a/src/dd.c b/src/dd.c index 7887f07..33e8800 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1021,9 +1021,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (!IsWine()) + if (g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem in cnc games */ + /* workaround for "Not Responding" window problem in cnc games */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } diff --git a/src/ddsurface.c b/src/ddsurface.c index 352a5d2..056c158 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,9 +50,15 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } @@ -988,9 +994,15 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !IsWine()) + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) { - MSG msg; /* workaround for "Not Responding" window problem */ + /* workaround for "Not Responding" window problem */ + g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1228626..9b713cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -710,6 +710,9 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) @@ -745,6 +748,9 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + g_ddraw.last_msg_pull_tick = timeGetTime(); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) From 649ba3050a67b35b5599c6d24a7036140617b30c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 14:49:11 +0200 Subject: [PATCH 127/557] make sure we always got a cliplist --- src/ddclipper.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ddclipper.c b/src/ddclipper.c index eeec712..d1d6ceb 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -3,6 +3,7 @@ #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" +#include "dd.h" HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) @@ -168,6 +169,12 @@ HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) */ This->hwnd = hWnd; + if (hWnd && !This->region && g_ddraw.width) + { + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; + ddc_SetClipRect(This, &rc); + } + LeaveCriticalSection(&This->cs); return DD_OK; } From a221c678425f7af8d32448e3bcca629e98e6f8a3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:30:24 +0200 Subject: [PATCH 128/557] add preset for Disney Trivia Challenge --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ac423db..d58f30e 100644 --- a/src/config.c +++ b/src/config.c @@ -805,6 +805,10 @@ static void cfg_create_ini() "[hellfire]\n" "devmode=true\n" "\n" + "; Disney Trivia Challenge\n" + "[DisneyTr]\n" + "noactivateapp=true\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" From 66a31e22820d927e9dd857ab1573eb3f2844005a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:45:10 +0200 Subject: [PATCH 129/557] update bitblt hook --- src/winapi_hooks.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9b713cf..2c3e874 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1027,7 +1027,22 @@ BOOL WINAPI fake_BitBlt( { HWND hwnd = WindowFromDC(hdc); - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "AVI Window") == 0 || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1036,11 +1051,14 @@ BOOL WINAPI fake_BitBlt( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_BitBlt( primary_dc, - x, - y, + x + pt.x, + y + pt.y, cx, cy, hdcSrc, From 056c0750b22b4ca3299fafe229d2d940b4ff67b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 17:48:18 +0200 Subject: [PATCH 130/557] update SetDIBitsToDevice hook --- src/winapi_hooks.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2c3e874..d66c5ce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1120,7 +1120,22 @@ int WINAPI fake_SetDIBitsToDevice( { HWND hwnd = WindowFromDC(hdc); - if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw.ref && g_ddraw.hwnd && + (hwnd == g_ddraw.hwnd || + (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && + (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "AVI Window") == 0 || + strcmp(class_name, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1129,19 +1144,22 @@ int WINAPI fake_SetDIBitsToDevice( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_SetDIBitsToDevice( - primary_dc, - xDest, - yDest, - w, - h, - xSrc, - ySrc, - StartScan, - cLines, - lpvBits, - lpbmi, + primary_dc, + xDest + pt.x, + yDest + pt.y, + w, + h, + xSrc, + ySrc, + StartScan, + cLines, + lpvBits, + lpbmi, ColorUse); dds_ReleaseDC(g_ddraw.primary, primary_dc); From b14b3e1dd80a858ad20c494cb9236eb6badaf904 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:00:57 +0200 Subject: [PATCH 131/557] force redraw in GDI renderer too --- src/render_gdi.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/render_gdi.c b/src/render_gdi.c index f4e5746..5ad3586 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -162,6 +162,12 @@ DWORD WINAPI gdi_render_main(void) LeaveCriticalSection(&g_ddraw.cs); + /* Force redraw for GDI games (ClueFinders) */ + if (!g_ddraw.primary) + { + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); + } + if (!g_ddraw.render.run) break; From de86f913cb0b10c27498e3c1167c8d5fcc707f6e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:01:17 +0200 Subject: [PATCH 132/557] make Trivia windows transparent --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d66c5ce..cd93961 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1706,6 +1706,13 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Disney Trivia Challenge */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Disney Trivia Challenge") == 0 && + hWndParent && (dwStyle & WS_CHILD)) + { + dwExStyle = WS_EX_TRANSPARENT; + } + /* Center Lego Loco overlays */ if (lpWindowName && _strcmpi(lpWindowName, "LEGO LOCO") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From ac910cd4e928899194b83afb71192f919c0f3edd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:01:25 +0200 Subject: [PATCH 133/557] update trivia preset --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index d58f30e..375a533 100644 --- a/src/config.c +++ b/src/config.c @@ -807,7 +807,10 @@ static void cfg_create_ini() "\n" "; Disney Trivia Challenge\n" "[DisneyTr]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" "noactivateapp=true\n" + "renderer=gdi\n" "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" From 5194543aca271336408aa9965a3f3ce7b94696af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:52:19 +0200 Subject: [PATCH 134/557] minimize window on RestoreDisplayMode --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index 33e8800..bb28d7f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -640,6 +640,8 @@ HRESULT dd_RestoreDisplayMode() } } + real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + return DD_OK; } From 5d6b78b23d58a42ee85cd1a015b96a7f12c6aeff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Sep 2024 18:53:24 +0200 Subject: [PATCH 135/557] update Trivia preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 375a533..62c1938 100644 --- a/src/config.c +++ b/src/config.c @@ -809,7 +809,6 @@ static void cfg_create_ini() "[DisneyTr]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" - "noactivateapp=true\n" "renderer=gdi\n" "\n" "; Escape Velocity Nova\n" From a462be533956974e86fe9046f4c1cdf5e90e760a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:48:12 +0200 Subject: [PATCH 136/557] remove redundant code --- cnc-ddraw.vcxproj | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 8a3f84d..c9500e9 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -243,8 +243,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -287,8 +285,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -331,8 +327,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -375,8 +369,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 @@ -419,8 +411,6 @@ for /f "tokens=*" %%I in ('%GIT_PATH% rev-parse --abbrev-ref HEAD ^|^| echo UNKN echo #define GIT_COMMIT "%GIT_COMMIT%" > %DST_FILE% echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% - -SET ERRORLEVEL = 0 From d6a59407e4ecb4198bb316141358c8443405c243 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:48:51 +0200 Subject: [PATCH 137/557] add dummy git.h --- inc/git.h | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 inc/git.h diff --git a/inc/git.h b/inc/git.h new file mode 100644 index 0000000..9ee47b4 --- /dev/null +++ b/inc/git.h @@ -0,0 +1,2 @@ +#define GIT_COMMIT "UNKNOWN" +#define GIT_BRANCH "UNKNOWN" From f4ca7973eb372e083a2ee6bc5e4510d2ca2173dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 09:55:14 +0200 Subject: [PATCH 138/557] Revert "add dummy git.h" This reverts commit d6a59407e4ecb4198bb316141358c8443405c243. --- inc/git.h | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 inc/git.h diff --git a/inc/git.h b/inc/git.h deleted file mode 100644 index 9ee47b4..0000000 --- a/inc/git.h +++ /dev/null @@ -1,2 +0,0 @@ -#define GIT_COMMIT "UNKNOWN" -#define GIT_BRANCH "UNKNOWN" From b88857386e202cff1db5d6000b0d632b8ed9d422 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:07:16 +0200 Subject: [PATCH 139/557] add new "win_version" setting to fake the reported windows version --- inc/config.h | 1 + inc/hook.h | 4 ++ inc/winapi_hooks.h | 3 ++ src/config.c | 2 + src/hook.c | 4 ++ src/winapi_hooks.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+) diff --git a/inc/config.h b/inc/config.h index 1140fe0..09c7e20 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,6 +57,7 @@ typedef struct CNCDDRAWCONFIG int fixchilds; BOOL hook_peekmessage; BOOL hook_getmessage; + char win_version[32]; /* Undocumented settings */ diff --git a/inc/hook.h b/inc/hook.h index cd1dab8..92301d4 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -70,6 +70,8 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); +typedef DWORD(WINAPI* GETVERSIONPROC)(void); +typedef BOOL(WINAPI* GETVERSIONEXAPROC)(LPOSVERSIONINFOA); typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID*); typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); @@ -120,6 +122,8 @@ extern LOADLIBRARYEXAPROC real_LoadLibraryExA; extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; +extern GETVERSIONPROC real_GetVersion; +extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6e2965d..fa5c635 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -72,6 +72,9 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters); +DWORD WINAPI fake_GetVersion(void); +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA lpVersionInformation); + HWND WINAPI fake_CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam); diff --git a/src/config.c b/src/config.c index 62c1938..9284f1d 100644 --- a/src/config.c +++ b/src/config.c @@ -69,6 +69,7 @@ void cfg_load() GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); + GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -323,6 +324,7 @@ static void cfg_create_ini() "lock_mouse_top_left=false\n" "no_compat_warning=false\n" "remove_menu=false\n" + ";win_version=95\n" "\n" "\n" "\n" diff --git a/src/hook.c b/src/hook.c index 378b4a0..c07f58a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -63,6 +63,8 @@ LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; +GETVERSIONPROC real_GetVersion = GetVersion; +GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; @@ -168,6 +170,8 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, + { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, HOOK_SKIP_2 }, + { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, HOOK_SKIP_2 }, #if defined(_DEBUG) && defined(__GNUC__) { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, #endif diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index cd93961..76b4728 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1548,6 +1548,98 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( return result; } +DWORD WINAPI fake_GetVersion() +{ + if (_strcmpi(g_config.win_version, "95") == 0) + return 0xC3B60004; + + if (_strcmpi(g_config.win_version, "98") == 0) + return 0xC0000A04; + + if (_strcmpi(g_config.win_version, "nt4") == 0) + return 0x05650004; + + if (_strcmpi(g_config.win_version, "2000") == 0) + return 0x08930005; + + if (_strcmpi(g_config.win_version, "xp") == 0) + return 0x0A280105; + + return real_GetVersion(); +} + +BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) +{ + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) + { + if (_strcmpi(g_config.win_version, "95") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 950, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 10, 67766446, 1, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 4, 0, 1381, 2, "Service Pack 5" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 0, 2195, 2, "" }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *info = (OSVERSIONINFOA){ sizeof(OSVERSIONINFOA), 5, 1, 2600, 2, "Service Pack 3" }; + return TRUE; + } + } + + if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) + { + LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; + if (_strcmpi(g_config.win_version, "95") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 950, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "98") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 10, 67766446, 1, "", 1, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "nt4") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 4, 0, 1381, 2, "Service Pack 5", 5, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "2000") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 0, 2195, 2, "", 0, 0, 256, 1, 30 }; + return TRUE; + } + + if (_strcmpi(g_config.win_version, "xp") == 0) + { + *ex = (OSVERSIONINFOEXA){ sizeof(OSVERSIONINFOEXA), 5, 1, 2600, 2, "Service Pack 3", 3, 0, 256, 1, 30 }; + return TRUE; + } + } + + return real_GetVersionExA(info); +} + BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); From e3993518c717f67579493f78029e0949d6fd7993 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:20:20 +0200 Subject: [PATCH 140/557] sort config.h --- inc/config.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index 09c7e20..5fd03b3 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,7 +57,6 @@ typedef struct CNCDDRAWCONFIG int fixchilds; BOOL hook_peekmessage; BOOL hook_getmessage; - char win_version[32]; /* Undocumented settings */ @@ -82,6 +81,8 @@ typedef struct CNCDDRAWCONFIG BOOL wine_allow_resize; BOOL lock_mouse_top_left; BOOL no_compat_warning; + BOOL remove_menu; + char win_version[32]; /* Hotkeys */ @@ -96,8 +97,6 @@ typedef struct CNCDDRAWCONFIG /* Game specific settings */ - BOOL remove_menu; - BOOL armadahack; BOOL tshack; BOOL infantryhack; From 560a7e6a209a6e52a2adb79ad7f96745aa4b8cc6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 3 Sep 2024 18:22:38 +0200 Subject: [PATCH 141/557] add check to GetVersion functions --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 76b4728..23cd25e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1570,7 +1570,7 @@ DWORD WINAPI fake_GetVersion() BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) { - if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) + if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOA)) { if (_strcmpi(g_config.win_version, "95") == 0) { @@ -1603,7 +1603,7 @@ BOOL WINAPI fake_GetVersionExA(LPOSVERSIONINFOA info) } } - if (info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) + if (g_config.win_version[0] && info && info->dwOSVersionInfoSize == sizeof(OSVERSIONINFOEXA)) { LPOSVERSIONINFOEXA ex = (LPOSVERSIONINFOEXA)info; if (_strcmpi(g_config.win_version, "95") == 0) From f3d1ba8cf4b9e9917b31e7b1c092e5be8b4e59e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Sep 2024 09:19:13 +0200 Subject: [PATCH 142/557] append filename to log files --- src/debug.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/debug.c b/src/debug.c index 52f81ad..af2f4ef 100644 --- a/src/debug.c +++ b/src/debug.c @@ -124,19 +124,20 @@ void dbg_init() char exe_path[MAX_PATH] = { 0 }; if (GetModuleFileNameA(NULL, exe_path, sizeof(exe_path) - 1) > 0) { + char filename[MAX_PATH] = { 0 }; char drive[MAX_PATH] = { 0 }; char dir[MAX_PATH] = { 0 }; - _splitpath(exe_path, drive, dir, NULL, NULL); + _splitpath(exe_path, drive, dir, filename, NULL); char game_path[MAX_PATH] = { 0 }; _makepath(game_path, drive, dir, NULL, NULL); - _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.dmp"); - _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.dmp"); + _snprintf(g_dbg_dmp_path1, sizeof(g_dbg_dmp_path1) - 1, "%scnc-ddraw-%s-1.dmp", game_path, filename); + _snprintf(g_dbg_dmp_path2, sizeof(g_dbg_dmp_path2) - 1, "%scnc-ddraw-%s-2.dmp", game_path, filename); - _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%s%s", game_path, "cnc-ddraw-1.log"); - _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%s%s", game_path, "cnc-ddraw-2.log"); - _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%s%s", game_path, "cnc-ddraw-3.log"); + _snprintf(g_dbg_log_path1, sizeof(g_dbg_log_path1) - 1, "%scnc-ddraw-%s-1.log", game_path, filename); + _snprintf(g_dbg_log_path2, sizeof(g_dbg_log_path2) - 1, "%scnc-ddraw-%s-2.log", game_path, filename); + _snprintf(g_dbg_log_path3, sizeof(g_dbg_log_path3) - 1, "%scnc-ddraw-%s-3.log", game_path, filename); } remove(g_dbg_dmp_path1); From a063e2582510a18cb8f83f1bb52d94f28574c7b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 16:34:52 +0200 Subject: [PATCH 143/557] fix last_msg_pull_tick update --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 23cd25e..6768a9b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -710,7 +710,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); @@ -748,7 +748,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { - if (g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); From 9c18999a1162e956c6baca07e4c7b1993ecbf4bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:10:22 +0200 Subject: [PATCH 144/557] fix hotkey for Fallout2, jagged alliance 2, trivia and a probably a few other games --- cnc-ddraw.vcxproj | 2 + cnc-ddraw.vcxproj.filters | 6 +++ inc/keyboard.h | 11 ++++ src/dd.c | 3 ++ src/dllmain.c | 1 + src/keyboard.c | 102 ++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 10 +++- src/wndproc.c | 57 +-------------------- 8 files changed, 135 insertions(+), 57 deletions(-) create mode 100644 inc/keyboard.h create mode 100644 src/keyboard.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index c9500e9..992cb3e 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -51,6 +51,7 @@ + @@ -87,6 +88,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 7de9def..e1e9a15 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -165,6 +165,9 @@ Source Files + + Source Files + @@ -287,6 +290,9 @@ Header Files + + Header Files + diff --git a/inc/keyboard.h b/inc/keyboard.h new file mode 100644 index 0000000..8962198 --- /dev/null +++ b/inc/keyboard.h @@ -0,0 +1,11 @@ +#ifndef KEYBOARD_H +#define KEYBOARD_H + + +void keyboard_hook_init(); +void keyboard_hook_exit(); +LRESULT CALLBACK keyboard_hook_proc(int Code, WPARAM wParam, LPARAM lParam); + +extern HHOOK g_keyboard_hook; + +#endif diff --git a/src/dd.c b/src/dd.c index bb28d7f..bff1ec8 100644 --- a/src/dd.c +++ b/src/dd.c @@ -6,6 +6,7 @@ #include "hook.h" #include "config.h" #include "mouse.h" +#include "keyboard.h" #include "wndproc.h" #include "render_d3d9.h" #include "render_gdi.h" @@ -1362,6 +1363,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); + keyboard_hook_init(); + if (!g_ddraw.render.hdc) { g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); diff --git a/src/dllmain.c b/src/dllmain.c index b75c335..cfb3013 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -138,6 +138,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); + keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/keyboard.c b/src/keyboard.c new file mode 100644 index 0000000..e4145cf --- /dev/null +++ b/src/keyboard.c @@ -0,0 +1,102 @@ +#include +#include "debug.h" +#include "hook.h" +#include "dd.h" +#include "utils.h" +#include "config.h" +#include "keyboard.h" +#include "mouse.h" + + +HHOOK g_keyboard_hook; + +void keyboard_hook_init() +{ + if (g_keyboard_hook && UnhookWindowsHookEx(g_keyboard_hook)) + { + g_keyboard_hook = NULL; + } + + if (!g_ddraw.gui_thread_id) + return; + + g_keyboard_hook = + real_SetWindowsHookExA( + WH_KEYBOARD, + keyboard_hook_proc, + NULL, + g_ddraw.gui_thread_id); +} + +void keyboard_hook_exit() +{ + if (g_keyboard_hook) + { + UnhookWindowsHookEx(g_keyboard_hook); + } +} + +LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code < 0 || !wParam) // code != HC_ACTION || + return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); + + BOOL alt_down = (lParam & (1 << 29)); + BOOL key_down = !(lParam & (1 << 30)); + BOOL key_up = !!(lParam & (1 << 31)); + + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + { + if (key_up) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == g_config.hotkeys.toggle_maximize && + g_config.resizable && + g_config.windowed && + !g_config.fullscreen && + alt_down) + { + if (key_up) + util_toggle_maximize(); + + return 1; + } + + if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + { + if (key_up) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) + { + if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && + (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) + { + mouse_unlock(); + return 1; + } + } + + if (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL) + { + if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && + (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)) + { + mouse_unlock(); + return 1; + } + } + + if (key_up && wParam == g_config.hotkeys.screenshot) + { + ss_take_screenshot(g_ddraw.primary); + } + + return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); +} diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6768a9b..68dc9dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -9,6 +9,7 @@ #include "config.h" #include "utils.h" #include "mouse.h" +#include "keyboard.h" #include "wndproc.h" #include "render_gdi.h" #include "render_d3d9.h" @@ -601,7 +602,14 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); } - return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); + HHOOK result = real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); + + if (idHook == WH_KEYBOARD) + { + keyboard_hook_init(); + } + + return result; } BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) diff --git a/src/wndproc.c b/src/wndproc.c index a12c2c5..2da7daf 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -758,29 +758,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { - BOOL context_code = (lParam & (1 << 29)) != 0; - BOOL key_state = (lParam & (1 << 30)) != 0; - - if (g_config.hotkeys.toggle_fullscreen && - wParam == g_config.hotkeys.toggle_fullscreen && - (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) && - context_code && - !key_state) - { - util_toggle_fullscreen(); - return 0; - } - - if (g_config.hotkeys.toggle_maximize && - wParam == g_config.hotkeys.toggle_maximize && - g_config.resizable && - g_config.windowed && - !g_config.fullscreen) - { - util_toggle_maximize(); - return 0; - } - if (wParam == VK_MENU) { g_ddraw.alt_key_down = TRUE; @@ -795,7 +772,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_ddraw.alt_key_down = FALSE; } - if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen)) + if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); } @@ -804,42 +781,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ - { - util_toggle_fullscreen(); - return 0; - } - - if (g_config.hotkeys.unlock_cursor1 && - (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) - { - if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) - { - mouse_unlock(); - return 0; - } - } - - if (g_config.hotkeys.unlock_cursor2 && - (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) - { - if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) - { - mouse_unlock(); - return 0; - } - } - break; } case WM_KEYUP: { - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ - return 0; - - if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) - ss_take_screenshot(g_ddraw.primary); - break; } /* button up messages reactivate cursor lock */ From fc143416ad0c96708a6ce1409c706801eeb9d976 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:17:19 +0200 Subject: [PATCH 145/557] fix crash on exit in fallout2 --- src/dd.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index bff1ec8..3f2ea71 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1670,9 +1670,6 @@ ULONG dd_Release() if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); - /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ if (g_ddraw.width) { @@ -1692,6 +1689,9 @@ ULONG dd_Release() (rc.bottom - rc.top), SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); } + + /* restore old wndproc, subsequent ddraw creation will otherwise fail */ + real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } memset(&g_ddraw, 0, sizeof(g_ddraw)); From 8f9534812b7179246ddc52bc87e46ac1b28e38e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:17:48 +0200 Subject: [PATCH 146/557] remove moorhuhn preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 9284f1d..5c6b1d1 100644 --- a/src/config.c +++ b/src/config.c @@ -1163,10 +1163,6 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" - "; Moorhuhn\n" - "[Moorhuhn]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "releasealt=true\n" From a87a2d7191d0607356e37502eb37cdecb7208a5f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 18:46:21 +0200 Subject: [PATCH 147/557] use key_down rather than key_up for hotkeys --- src/keyboard.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index e4145cf..984695f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { - if (key_up) + if (key_down) util_toggle_fullscreen(); return 1; @@ -59,7 +59,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) !g_config.fullscreen && alt_down) { - if (key_up) + if (key_down) util_toggle_maximize(); return 1; @@ -67,7 +67,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ { - if (key_up) + if (key_down) util_toggle_fullscreen(); return 1; From 4b46c48a361ddeb0c7d2617bd046f8c39eb6bde9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 19:07:01 +0200 Subject: [PATCH 148/557] fix warnings --- src/dllmain.c | 1 + src/keyboard.c | 1 + 2 files changed, 2 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index cfb3013..76090f9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -12,6 +12,7 @@ #include "indeo.h" #include "utils.h" #include "versionhelpers.h" +#include "keyboard.h" /* export for cncnet cnc games */ diff --git a/src/keyboard.c b/src/keyboard.c index 984695f..5298ce5 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -6,6 +6,7 @@ #include "config.h" #include "keyboard.h" #include "mouse.h" +#include "screenshot.h" HHOOK g_keyboard_hook; From b1e7cfe5b4c77e49cd83343cfa98a7257d991423 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 20:54:42 +0200 Subject: [PATCH 149/557] do not minimize on RestoreDisplayMode (needs more testing) --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3f2ea71..ae82e47 100644 --- a/src/dd.c +++ b/src/dd.c @@ -641,7 +641,7 @@ HRESULT dd_RestoreDisplayMode() } } - real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + //real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); return DD_OK; } From eb5957008f92e3062bf1a8633ea460a05be74281 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Sep 2024 22:29:25 +0200 Subject: [PATCH 150/557] disable workaround for cases where PeekMessage was not hooked --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index ae82e47..c61f1cc 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1024,7 +1024,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + if (g_ddraw.last_msg_pull_tick && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) { From 60a66776a67f42f715997320c78d70809984e158 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 12:52:35 +0200 Subject: [PATCH 151/557] port alt-key-stuck fix to new keyboard hook --- src/keyboard.c | 11 +++++++++-- src/wndproc.c | 13 +++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 5298ce5..feab45c 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -39,13 +39,20 @@ void keyboard_hook_exit() LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { - if (code < 0 || !wParam) // code != HC_ACTION || + if (code < 0 || !wParam) return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); - BOOL alt_down = (lParam & (1 << 29)); + BOOL alt_down = !!(lParam & (1 << 29)); BOOL key_down = !(lParam & (1 << 30)); BOOL key_up = !!(lParam & (1 << 31)); + //TRACE("VK_MENU - wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + + if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ + { + g_ddraw.alt_key_down = alt_down; + } + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { if (key_down) diff --git a/src/wndproc.c b/src/wndproc.c index 2da7daf..0d65fce 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -707,7 +707,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + { PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); + g_ddraw.alt_key_down = FALSE; + } return 0; } @@ -758,20 +761,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { - if (wParam == VK_MENU) - { - g_ddraw.alt_key_down = TRUE; - } - break; } case WM_SYSKEYUP: { - if (wParam == VK_MENU) - { - g_ddraw.alt_key_down = FALSE; - } - if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { return DefWindowProc(hWnd, uMsg, wParam, lParam); From 2a269f19b6fa828f8593744feae3a043fce2a786 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 14:27:56 +0200 Subject: [PATCH 152/557] log direct3d9 errors --- inc/debug.h | 1 + src/debug.c | 34 +++++++++++++++++ src/render_d3d9.c | 96 ++++++++++++++++++++++++++++++----------------- 3 files changed, 97 insertions(+), 34 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 058e27a..329c7cf 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -26,6 +26,7 @@ void dbg_dump_dds_caps(DWORD caps); void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); +char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); __declspec(noreturn) void __cdecl dbg_invoke_watson( diff --git a/src/debug.c b/src/debug.c index af2f4ef..14ffcc9 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -1005,6 +1006,39 @@ void dbg_dump_dds_lock_flags(DWORD flags) #endif } +char* dbg_d3d9_hr_to_str(HRESULT hr) +{ +#define HR_TO_STR(x) if (x == hr) return #x + + HR_TO_STR(D3D_OK); + + HR_TO_STR(D3DERR_WRONGTEXTUREFORMAT); + HR_TO_STR(D3DERR_UNSUPPORTEDCOLOROPERATION); + HR_TO_STR(D3DERR_UNSUPPORTEDCOLORARG); + HR_TO_STR(D3DERR_UNSUPPORTEDALPHAOPERATION); + HR_TO_STR(D3DERR_UNSUPPORTEDALPHAARG); + HR_TO_STR(D3DERR_TOOMANYOPERATIONS); + HR_TO_STR(D3DERR_CONFLICTINGTEXTUREFILTER); + HR_TO_STR(D3DERR_UNSUPPORTEDFACTORVALUE); + HR_TO_STR(D3DERR_CONFLICTINGRENDERSTATE); + HR_TO_STR(D3DERR_UNSUPPORTEDTEXTUREFILTER); + HR_TO_STR(D3DERR_CONFLICTINGTEXTUREPALETTE); + HR_TO_STR(D3DERR_DRIVERINTERNALERROR); + + HR_TO_STR(D3DERR_NOTFOUND); + HR_TO_STR(D3DERR_MOREDATA); + HR_TO_STR(D3DERR_DEVICELOST); + HR_TO_STR(D3DERR_DEVICENOTRESET); + HR_TO_STR(D3DERR_NOTAVAILABLE); + HR_TO_STR(D3DERR_OUTOFVIDEOMEMORY); + HR_TO_STR(D3DERR_INVALIDDEVICE); + HR_TO_STR(D3DERR_INVALIDCALL); + HR_TO_STR(D3DERR_DRIVERINVALIDCALL); + HR_TO_STR(D3DERR_WASSTILLDRAWING); + + return "UNKNOWN"; +} + char* dbg_mes_to_str(int id) { switch (id) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5c5bdeb..5178068 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -15,6 +15,11 @@ #include "config.h" +#define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) +#define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) + +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); static BOOL d3d9_create_resources(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -86,10 +91,10 @@ BOOL d3d9_create() #if _DEBUG D3DADAPTER_IDENTIFIER9 ai = {0}; D3DCAPS9 caps = { 0 }; - HRESULT hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); - HRESULT hr2 = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); + HRESULT adapter_hr = IDirect3D9_GetAdapterIdentifier(g_d3d9.instance, D3DADAPTER_DEFAULT, 0, &ai); + HRESULT devcaps_hr = IDirect3D9_GetDeviceCaps(g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); - if (SUCCEEDED(hr)) + if (SUCCEEDEDX(adapter_hr)) { TRACE("+--Direct3D9-------------------------------------\n"); TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); @@ -106,7 +111,7 @@ BOOL d3d9_create() TRACE("| Driver: %s\n", ai.Driver); TRACE("| Description: %s\n", ai.Description); - if (SUCCEEDED(hr2)) + if (SUCCEEDEDX(devcaps_hr)) { TRACE("| MaxTextureWidth: %d\n", caps.MaxTextureWidth); TRACE("| MaxTextureHeight: %d\n", caps.MaxTextureHeight); @@ -146,7 +151,7 @@ BOOL d3d9_create() for (int i = 0; i < sizeof(behavior_flags) / sizeof(behavior_flags[0]); i++) { - if (SUCCEEDED( + if (SUCCEEDEDX( IDirect3D9_CreateDevice( g_d3d9.instance, D3DADAPTER_DEFAULT, @@ -163,6 +168,29 @@ BOOL d3d9_create() return FALSE; } +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt) +{ + if (FAILED(hr)) + { + TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); + return TRUE; + } + + return FALSE; +} + +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt) +{ + if (!SUCCEEDED(hr)) + { + TRACE("Direct3D9 error %s [%08x] (%s)\n", dbg_d3d9_hr_to_str(hr), hr, stmt); + + return FALSE; + } + + return TRUE; +} + BOOL d3d9_on_device_lost() { if (g_d3d9.device && IDirect3DDevice9_TestCooperativeLevel(g_d3d9.device) == D3DERR_DEVICENOTRESET) @@ -181,7 +209,7 @@ BOOL d3d9_reset(BOOL windowed) g_d3d9.params.FullScreen_RefreshRateInHz = g_d3d9.params.Windowed ? 0 : g_config.refresh_rate; g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; - if (g_d3d9.device && SUCCEEDED(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) + if (g_d3d9.device && SUCCEEDEDX(IDirect3DDevice9_Reset(g_d3d9.device, &g_d3d9.params))) { BOOL result = d3d9_set_states(); @@ -278,7 +306,7 @@ static BOOL d3d9_create_resources() g_d3d9.scale_w = (float)width / g_d3d9.tex_width;; g_d3d9.scale_h = (float)height / g_d3d9.tex_height; - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateVertexBuffer( g_d3d9.device, sizeof(CUSTOMVERTEX) * 4, 0, @@ -293,7 +321,7 @@ static BOOL d3d9_create_resources() { if (g_ddraw.bpp == 16 && g_config.rgb555) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -307,7 +335,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -322,7 +350,7 @@ static BOOL d3d9_create_resources() } else if (g_ddraw.bpp == 32) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -336,7 +364,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -351,7 +379,7 @@ static BOOL d3d9_create_resources() } else { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, g_d3d9.tex_width, @@ -368,7 +396,7 @@ static BOOL d3d9_create_resources() if (g_ddraw.bpp == 8) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -382,7 +410,7 @@ static BOOL d3d9_create_resources() if (error) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -401,7 +429,7 @@ static BOOL d3d9_create_resources() if (g_ddraw.bpp == 8) { - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); IDirect3DDevice9_CreatePixelShader( @@ -413,7 +441,7 @@ static BOOL d3d9_create_resources() { if (g_config.d3d9_filter == FILTER_LANCZOS) { - BOOL error = FAILED( + BOOL error = FAILEDX( IDirect3DDevice9_CreatePixelShader( g_d3d9.device, (DWORD*)D3D9_LANCZOS2_SHADER, @@ -441,20 +469,20 @@ static BOOL d3d9_set_states() { BOOL err = FALSE; - err = err || FAILED(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); - err = err || FAILED(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); - err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); + err = err || FAILEDX(IDirect3DDevice9_SetFVF(g_d3d9.device, D3DFVF_XYZRHW | D3DFVF_TEX1)); + err = err || FAILEDX(IDirect3DDevice9_SetStreamSource(g_d3d9.device, 0, g_d3d9.vertex_buf, 0, sizeof(CUSTOMVERTEX))); + err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[0])); if (g_ddraw.bpp == 8) { - err = err || FAILED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); + err = err || FAILEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[0])); BOOL bilinear = g_config.d3d9_filter && g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack); - err = err || FAILED( + err = err || FAILEDX( IDirect3DDevice9_SetPixelShader( g_d3d9.device, bilinear ? g_d3d9.pixel_shader_upscale : g_d3d9.pixel_shader)); @@ -462,7 +490,7 @@ static BOOL d3d9_set_states() if (bilinear) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } } else @@ -473,22 +501,22 @@ static BOOL d3d9_set_states() g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } else if ( - SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && - SUCCEEDED(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && + SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR)) && + SUCCEEDEDX(IDirect3DDevice9_SetSamplerState(g_d3d9.device, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR)) && g_config.d3d9_filter == FILTER_CUBIC && g_d3d9.pixel_shader_upscale && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height) && - SUCCEEDED(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) + SUCCEEDEDX(IDirect3DDevice9_SetPixelShader(g_d3d9.device, g_d3d9.pixel_shader_upscale))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; - err = err || FAILED(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); + err = err || FAILEDX(IDirect3DDevice9_SetPixelShaderConstantF(g_d3d9.device, 0, texture_size, 1)); } } } @@ -502,7 +530,7 @@ static BOOL d3d9_set_states() 0.0f, 1.0f }; - err = err || FAILED(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); + err = err || FAILEDX(IDirect3DDevice9_SetViewport(g_d3d9.device, &view_data)); */ return !err; } @@ -527,7 +555,7 @@ static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) }; void* data; - if (g_d3d9.vertex_buf && SUCCEEDED(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) + if (g_d3d9.vertex_buf && SUCCEEDEDX(IDirect3DVertexBuffer9_Lock(g_d3d9.vertex_buf, 0, 0, (void**)&data, 0))) { memcpy(data, vertices, sizeof(vertices)); @@ -594,8 +622,8 @@ DWORD WINAPI d3d9_render_main(void) RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; - if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && - SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 0, (IDirect3DBaseTexture9*)g_d3d9.surface_tex[tex_index])) && + SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.surface_tex[tex_index], 0, &lock_rc, &rc, 0))) { blt_clean( lock_rc.pBits, @@ -622,8 +650,8 @@ DWORD WINAPI d3d9_render_main(void) RECT rc = { 0,0,256,1 }; - if (SUCCEEDED(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && - SUCCEEDED(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) + if (SUCCEEDEDX(IDirect3DDevice9_SetTexture(g_d3d9.device, 1, (IDirect3DBaseTexture9*)g_d3d9.palette_tex[pal_index])) && + SUCCEEDEDX(IDirect3DTexture9_LockRect(g_d3d9.palette_tex[pal_index], 0, &lock_rc, &rc, 0))) { memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); From 02c8080910141e96a6757354c12f167abda8b6d1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 15:23:46 +0200 Subject: [PATCH 153/557] use regular macros with release builds --- src/render_d3d9.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 5178068..a1a1815 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -15,8 +15,13 @@ #include "config.h" +#ifdef _DEBUG #define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) #define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) +#else +#define FAILEDX(stmt) FAILED(stmt) +#define SUCCEEDEDX(stmt) SUCCEEDED(stmt) +#endif static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); From 614e340f15dff3424160e0ba58b79ec7eb3978ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 15:32:55 +0200 Subject: [PATCH 154/557] fix warnings --- inc/debug.h | 2 +- src/debug.c | 8 +------- src/render_d3d9.c | 6 ++++-- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 329c7cf..6ac7f7b 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -29,7 +29,7 @@ void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); -__declspec(noreturn) void __cdecl dbg_invoke_watson( +void __cdecl dbg_invoke_watson( _In_opt_z_ wchar_t const*, _In_opt_z_ wchar_t const*, _In_opt_z_ wchar_t const*, diff --git a/src/debug.c b/src/debug.c index 14ffcc9..c590dc6 100644 --- a/src/debug.c +++ b/src/debug.c @@ -91,7 +91,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) return EXCEPTION_EXECUTE_HANDLER; } -__declspec(noreturn) void __cdecl dbg_invoke_watson( +void __cdecl dbg_invoke_watson( wchar_t const* const expression, wchar_t const* const function_name, wchar_t const* const file_name, @@ -99,12 +99,6 @@ __declspec(noreturn) void __cdecl dbg_invoke_watson( uintptr_t const reserved ) { - UNREFERENCED_PARAMETER(expression); - UNREFERENCED_PARAMETER(function_name); - UNREFERENCED_PARAMETER(file_name); - UNREFERENCED_PARAMETER(line_number); - UNREFERENCED_PARAMETER(reserved); - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); /* Force access violation to produce a dmp file for debugging */ diff --git a/src/render_d3d9.c b/src/render_d3d9.c index a1a1815..dde4b2c 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -18,13 +18,13 @@ #ifdef _DEBUG #define FAILEDX(stmt) d3d9_check_failed(stmt, #stmt) #define SUCCEEDEDX(stmt) d3d9_check_succeeded(stmt, #stmt) +static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); +static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); #else #define FAILEDX(stmt) FAILED(stmt) #define SUCCEEDEDX(stmt) SUCCEEDED(stmt) #endif -static BOOL d3d9_check_failed(HRESULT hr, const char* stmt); -static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt); static BOOL d3d9_create_resources(); static BOOL d3d9_set_states(); static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch); @@ -173,6 +173,7 @@ BOOL d3d9_create() return FALSE; } +#ifdef _DEBUG static BOOL d3d9_check_failed(HRESULT hr, const char* stmt) { if (FAILED(hr)) @@ -195,6 +196,7 @@ static BOOL d3d9_check_succeeded(HRESULT hr, const char* stmt) return TRUE; } +#endif BOOL d3d9_on_device_lost() { From 0a65317d96e2d872846c7ca4e1cd96690bfa8108 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 16:44:35 +0200 Subject: [PATCH 155/557] move checks into function + cleanup --- src/keyboard.c | 21 +++++++++------------ src/utils.c | 3 +++ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index feab45c..f6f7993 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -46,7 +46,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_down = !(lParam & (1 << 30)); BOOL key_up = !!(lParam & (1 << 31)); - //TRACE("VK_MENU - wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + //TRACE("kbhook wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ { @@ -61,11 +61,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && - g_config.resizable && - g_config.windowed && - !g_config.fullscreen && - alt_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down) { if (key_down) util_toggle_maximize(); @@ -73,7 +69,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (g_config.homm_hack && wParam == VK_F4) /* Heroes of Might and Magic 3 and 4 */ + if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ { if (key_down) util_toggle_fullscreen(); @@ -81,6 +77,12 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } + if (wParam == g_config.hotkeys.screenshot) + { + if (key_up) + ss_take_screenshot(g_ddraw.primary); + } + if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) { if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && @@ -101,10 +103,5 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) } } - if (key_up && wParam == g_config.hotkeys.screenshot) - { - ss_take_screenshot(g_ddraw.primary); - } - return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); } diff --git a/src/utils.c b/src/utils.c index 110e55a..a68b659 100644 --- a/src/utils.c +++ b/src/utils.c @@ -573,6 +573,9 @@ BOOL util_get_lowest_resolution( void util_toggle_maximize() { + if (!g_config.resizable || !g_config.windowed || g_config.fullscreen) + return; + RECT client_rc; RECT dst_rc; From d0de68bf4250b84b13cd48b5dec07891b0d16afc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 16:50:51 +0200 Subject: [PATCH 156/557] some more cosmetic changes --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index f6f7993..7bf9263 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -83,7 +83,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) ss_take_screenshot(g_ddraw.primary); } - if (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1) + if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) { if ((real_GetAsyncKeyState(VK_CONTROL) & 0x8000) && (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) From 3b4fcb09e2634533a62f60e96952bf5a3536e825 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 17:22:30 +0200 Subject: [PATCH 157/557] make sure we always get the key_up message so keys don't get stuck --- src/keyboard.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 7bf9263..8d45db6 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -53,20 +53,20 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) { - if (key_down) - util_toggle_fullscreen(); + util_toggle_fullscreen(); - return 1; + if (!key_up) + return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && alt_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { - if (key_down) - util_toggle_maximize(); + util_toggle_maximize(); - return 1; + if (!key_up) + return 1; } if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ @@ -89,7 +89,9 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000)) { mouse_unlock(); - return 1; + + if (!key_up) + return 1; } } @@ -99,7 +101,9 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) (real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000)) { mouse_unlock(); - return 1; + + if (!key_up) + return 1; } } From d3139c67fb9fe7c07cc1316ce638291dd6ef5c95 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 17:37:16 +0200 Subject: [PATCH 158/557] keep the mingw debug build win2000 compatible --- src/debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/debug.c b/src/debug.c index c590dc6..c5f0507 100644 --- a/src/debug.c +++ b/src/debug.c @@ -68,6 +68,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; +#if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ if (GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, @@ -75,6 +76,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { GetModuleFileNameA(mod, filename, sizeof(filename) - 1); } +#endif TRACE( "Exception at %p (%p+%p), Code=%08X - %s\n", From b92b2deafaf2744704418cdcf5d8b4195105b42f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Sep 2024 20:43:58 +0200 Subject: [PATCH 159/557] ignore all key down messages --- src/keyboard.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 8d45db6..e1583d1 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -53,17 +53,19 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) { - util_toggle_fullscreen(); + if (key_down) + util_toggle_fullscreen(); if (!key_up) return 1; } - if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down) { - util_toggle_maximize(); + if (key_down) + util_toggle_maximize(); if (!key_up) return 1; From 1bcdf92d10d673b77734a081f73a0fb5af96f16a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:08:18 +0200 Subject: [PATCH 160/557] add some more error checks --- src/utils.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index a68b659..ee7b8cd 100644 --- a/src/utils.c +++ b/src/utils.c @@ -573,7 +573,7 @@ BOOL util_get_lowest_resolution( void util_toggle_maximize() { - if (!g_config.resizable || !g_config.windowed || g_config.fullscreen) + if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; RECT client_rc; @@ -677,7 +677,7 @@ void util_toggle_maximize() void util_toggle_fullscreen() { /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ - if (g_ddraw.bnet_active || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) + if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From 1bc96a658f085202877e881aa7d9e5f2e08fd5c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:21:05 +0200 Subject: [PATCH 161/557] add preset for Barney - Secret of the Rainbow --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index 5c6b1d1..d1f01df 100644 --- a/src/config.c +++ b/src/config.c @@ -484,6 +484,15 @@ static void cfg_create_ini() "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" + "; Barney - Secret of the Rainbow\n" + "[Barney]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Baldur's Gate II\n" "; Note: 'Use 3D Acceleration' must be disabled and 'Full Screen' must be enabled in BGConfig.exe\n" "[BGMain]\n" From 7165d27d71d6154dc732e2bbd1b412954b974c8b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 08:53:11 +0200 Subject: [PATCH 162/557] don't hook SH33W32 --- src/hook.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hook.c b/src/hook.c index c07f58a..d71bf72 100644 --- a/src/hook.c +++ b/src/hook.c @@ -547,6 +547,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || _strcmpi(mod_filename, "mdraw") == 0 || + _strcmpi(mod_filename, "SH33W32") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From 563473b83571b909266aeb19bbf743a77e1d892d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 09:38:16 +0200 Subject: [PATCH 163/557] fix naming of key bools --- src/keyboard.c | 56 ++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index e1583d1..7bc5369 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -43,46 +43,44 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return CallNextHookEx(g_keyboard_hook, code, wParam, lParam); BOOL alt_down = !!(lParam & (1 << 29)); - BOOL key_down = !(lParam & (1 << 30)); - BOOL key_up = !!(lParam & (1 << 31)); + BOOL key_down = !(lParam & (1 << 31)); + BOOL key_released = !!(lParam & (1 << 31)); + BOOL key_triggered = !(lParam & (1 << 30)); - //TRACE("kbhook wParam=%u, key_down=%u, key_up=%u, alt_down=%u\n", wParam, key_down, key_up, alt_down); + TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); - if (wParam == VK_MENU && (key_up || key_down)) /* Fix for alt key being stuck on alt+tab in some games */ + if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { g_ddraw.alt_key_down = alt_down; } - if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down) + if (wParam == g_config.hotkeys.toggle_fullscreen && alt_down && key_down) { - if (key_down) - util_toggle_fullscreen(); - - if (!key_up) - return 1; - } - - if (wParam == g_config.hotkeys.toggle_maximize && alt_down) - { - if (key_down) - util_toggle_maximize(); - - if (!key_up) - return 1; - } - - if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ - { - if (key_down) + if (key_triggered) util_toggle_fullscreen(); return 1; } - if (wParam == g_config.hotkeys.screenshot) + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { - if (key_up) - ss_take_screenshot(g_ddraw.primary); + if (key_triggered) + util_toggle_maximize(); + + return 1; + } + + if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ + { + if (key_triggered) + util_toggle_fullscreen(); + + return 1; + } + + if (wParam == g_config.hotkeys.screenshot && key_released) + { + ss_take_screenshot(g_ddraw.primary); } if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) @@ -92,7 +90,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { mouse_unlock(); - if (!key_up) + if (key_down) return 1; } } @@ -104,7 +102,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) { mouse_unlock(); - if (!key_up) + if (key_down) return 1; } } From 426490043fc1fbc2139f9dac7778fc7dc5f068bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 09:38:51 +0200 Subject: [PATCH 164/557] comment out testng code --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index 7bc5369..ca5109e 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_released = !!(lParam & (1 << 31)); BOOL key_triggered = !(lParam & (1 << 30)); - TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); + //TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { From dcc76a154dec7dd35e4299c0e77a58efdfbf3d8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Sep 2024 19:14:58 +0200 Subject: [PATCH 165/557] add experimental WH_GETMESSAGE hook --- inc/mouse.h | 5 +- src/dd.c | 3 + src/dllmain.c | 2 + src/mouse.c | 171 +++++++++++++++++++++++++++++++++++++++++++-- src/winapi_hooks.c | 168 +------------------------------------------- src/wndproc.c | 94 +------------------------ 6 files changed, 179 insertions(+), 264 deletions(-) diff --git a/inc/mouse.h b/inc/mouse.h index 1181ac2..65ef0da 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -1,9 +1,12 @@ #ifndef MOUSE_H #define MOUSE_H +void mouse_hook_init(); +void mouse_hook_exit(); void mouse_lock(); void mouse_unlock(); -LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam); extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; diff --git a/src/dd.c b/src/dd.c index c61f1cc..b7d535b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -988,6 +988,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } + TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; @@ -1365,6 +1367,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); keyboard_hook_init(); + mouse_hook_init(); if (!g_ddraw.render.hdc) { diff --git a/src/dllmain.c b/src/dllmain.c index 76090f9..fa8e2d1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -13,6 +13,7 @@ #include "utils.h" #include "versionhelpers.h" #include "keyboard.h" +#include "mouse.h" /* export for cncnet cnc games */ @@ -140,6 +141,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); keyboard_hook_exit(); + mouse_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/mouse.c b/src/mouse.c index 46aca13..cbb976b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -1,15 +1,45 @@ #include +#include +#include #include "debug.h" #include "winapi_hooks.h" #include "dd.h" #include "hook.h" #include "utils.h" #include "config.h" +#include "mouse.h" BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; +static HHOOK g_mouse_gm_hook; + +void mouse_hook_init() +{ + if (g_mouse_gm_hook && UnhookWindowsHookEx(g_mouse_gm_hook)) + { + g_mouse_gm_hook = NULL; + } + + if (!g_ddraw.gui_thread_id) + return; + + g_mouse_gm_hook = + real_SetWindowsHookExA( + WH_GETMESSAGE, + mouse_gm_hook_proc, + NULL, + g_ddraw.gui_thread_id); +} + +void mouse_hook_exit() +{ + if (g_mouse_gm_hook) + { + UnhookWindowsHookEx(g_mouse_gm_hook); + } +} void mouse_lock() { @@ -83,15 +113,146 @@ void mouse_unlock() } } -LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) +{ + if (code < 0 || !lParam || !g_ddraw.width) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + + MSG* msg = (MSG*)lParam; + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) + { + int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + msg->pt.x = min(x, g_ddraw.width - 1); + msg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (msg->hwnd != g_ddraw.hwnd) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + + switch (LOWORD(msg->message)) + { + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(msg->lParam); + int y = GET_Y_LPARAM(msg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + + if (LOWORD(msg->message) == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + msg->lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(msg->lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(msg->lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + msg->lParam = MAKELPARAM(x, y); + + break; + } + } + + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); +} + +LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam) { if (!g_ddraw.ref) - return g_mouse_proc(Code, wParam, lParam); + return g_mouse_proc(code, wParam, lParam); - if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) - return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); + if (code < 0 || (!g_config.devmode && !g_mouse_locked)) + return CallNextHookEx(g_mouse_hook, code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); - return g_mouse_proc(Code, wParam, lParam); + return g_mouse_proc(code, wParam, lParam); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 68dc9dd..b51731b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,146 +612,12 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) -{ - if (g_ddraw.ref && g_ddraw.width) - { - switch (lpMsg->message) - { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(lpMsg->lParam); - int y = GET_Y_LPARAM(lpMsg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - //return FALSE; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - // Does not work with 'New Robinson' - //return FALSE; - } - - if (lpMsg->message == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lpMsg->lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - lpMsg->lParam = MAKELPARAM(x, y); - - lpMsg->pt.x = x; - lpMsg->pt.y = y; - - break; - } - - } - } - - return TRUE; -} - BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - } - - return result; + return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -759,37 +625,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - } - - return result; + return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 0d65fce..030751e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST) + uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,6 +42,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { + case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -780,97 +781,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - return 0; - } - - if (uMsg == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - lParam = MAKELPARAM(x, y); - - break; - } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 04d7f2060e900c66c3c8a5e285a078c1d8d20509 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:12:25 +0200 Subject: [PATCH 166/557] fix window resize/move issues --- src/mouse.c | 66 +------------------------------- src/winapi_hooks.c | 94 +++++++++++++++++++++++++++++++++++++++++++++- src/wndproc.c | 37 ++++++++++++++++++ 3 files changed, 130 insertions(+), 67 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index cbb976b..df05989 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -115,74 +115,16 @@ void mouse_unlock() LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) { - if (code < 0 || !lParam || !g_ddraw.width) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - MSG* msg = (MSG*)lParam; - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) - { - int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - msg->pt.x = min(x, g_ddraw.width - 1); - msg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (msg->hwnd != g_ddraw.hwnd) + if (code < 0 || !g_ddraw.width || !msg || msg->hwnd != g_ddraw.hwnd) return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); switch (LOWORD(msg->message)) { - /* button up messages reactivate cursor lock */ case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(msg->lParam); - int y = GET_Y_LPARAM(msg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ case WM_XBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: @@ -196,12 +138,6 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (!g_config.devmode && !g_mouse_locked) - { - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - if (LOWORD(msg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b51731b..33ee191 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,12 +612,96 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) +{ + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (lpMsg->hwnd != g_ddraw.hwnd) + return TRUE; + + switch (LOWORD(lpMsg->message)) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + + mouse_lock(); + + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; + } + + break; + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + // Does not work with 'New Robinson' + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; + } + + break; + } + + } + } + + return TRUE; +} + BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result) + { + HandleMessage(lpMsg, hWnd); + } + + return result; } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -625,7 +709,13 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + if (result) + { + return HandleMessage(lpMsg, hWnd); + } + + return result; } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 030751e..cc87bd2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -781,6 +781,43 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); + + mouse_lock(); + return 0; + } + + break; + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + return 0; + } + + break; + } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 75ed1595c6288a55e0d7ba4410c169a7e1c3b445 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:21:09 +0200 Subject: [PATCH 167/557] remove debug code --- src/dd.c | 2 -- src/winapi_hooks.c | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index b7d535b..e98983d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -988,8 +988,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33ee191..2dc5fe4 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,8 +647,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (!g_config.devmode && !g_mouse_locked) { - TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -683,7 +681,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) break; } - } } From 97718b9a19be15990cdad4d0d9e8f94eb34e08b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 14:37:20 +0200 Subject: [PATCH 168/557] remove obsolete settings --- inc/config.h | 2 -- src/config.c | 25 ------------------------- 2 files changed, 27 deletions(-) diff --git a/inc/config.h b/inc/config.h index 5fd03b3..c725c36 100644 --- a/inc/config.h +++ b/inc/config.h @@ -55,8 +55,6 @@ typedef struct CNCDDRAWCONFIG BOOL singlecpu; int resolutions; int fixchilds; - BOOL hook_peekmessage; - BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index d1f01df..4e425f2 100644 --- a/src/config.c +++ b/src/config.c @@ -67,8 +67,6 @@ void cfg_load() GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); - GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -295,10 +293,6 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" - "hook_peekmessage=false\n" - "hook_getmessage=false\n" - "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" "releasealt=false\n" @@ -481,7 +475,6 @@ static void cfg_create_ini() "\n" "; Axis & Allies\n" "[AxisAllies]\n" - "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" "; Barney - Secret of the Rainbow\n" @@ -825,7 +818,6 @@ static void cfg_create_ini() "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" - "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" "adjmouse=true\n" @@ -840,18 +832,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; Enemy Infestation\n" - "[EI]\n" - "hook_getmessage=true\n" - "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" "\n" - "; Final Liberation: Warhammer Epic 40000\n" - "[Epic40k]\n" - "hook_peekmessage=true\n" - "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "nonexclusive=true\n" @@ -1119,10 +1103,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Lionheart\n" - "[Lionheart]\n" - "hook_peekmessage=true\n" - "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1179,7 +1159,6 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" - "hook_peekmessage=true\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" @@ -1400,10 +1379,6 @@ static void cfg_create_ini() "[StarCraft]\n" "game_handles_close=true\n" "\n" - "; Space Rangers\n" - "[Rangers]\n" - "hook_peekmessage=true\n" - "\n" "; SPYFox: Hold the Mustard\n" "[mustard]\n" "renderer=gdi\n" From 48151e4d78489cd947c689bb6a2838bad48f03b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:05:28 +0200 Subject: [PATCH 169/557] fix ja2 cursor lock --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2dc5fe4..8d8d8b5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { From 89d38454733b115f743c98a94922bb5f2527830f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:15:08 +0200 Subject: [PATCH 170/557] never return FALSE from peekmessage to avoid issues --- src/winapi_hooks.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8d8d8b5..a7e22cc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) +void HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { @@ -637,7 +637,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) } if (lpMsg->hwnd != g_ddraw.hwnd) - return TRUE; + return; switch (LOWORD(lpMsg->message)) { @@ -653,7 +653,6 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; } break; @@ -676,15 +675,12 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; } break; } } } - - return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -709,7 +705,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - return HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd); } return result; From c1a5a3895b53462bb5fa8feac57a1b240538e780 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:23:31 +0200 Subject: [PATCH 171/557] don't update cursor pos in mouse hook --- src/mouse.c | 3 --- src/winapi_hooks.c | 4 ++++ src/wndproc.c | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index df05989..3e0d0ac 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -168,9 +168,6 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) x = min(x, g_ddraw.width - 1); y = min(y, g_ddraw.height - 1); - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - msg->lParam = MAKELPARAM(x, y); break; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a7e22cc..f931f96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -675,8 +675,12 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + break; } + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + break; } } diff --git a/src/wndproc.c b/src/wndproc.c index cc87bd2..c0993b1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -816,6 +816,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); + break; } case WM_PARENTNOTIFY: From a42bdae84d2129a0d91eaa225b3e2b46f419b392 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 15:31:18 +0200 Subject: [PATCH 172/557] do not return WM_NULL for now (needs more testing) --- src/winapi_hooks.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f931f96..1083f4a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { @@ -652,7 +652,8 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + break; } break; @@ -674,13 +675,12 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - break; } } From df91a4308f380b45938dfd2e190fe17b55823c9d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 16:01:45 +0200 Subject: [PATCH 173/557] remove old diablo 2 hack --- src/winapi_hooks.c | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1083f4a..45076a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -414,20 +414,6 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); - if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) - { - int x = GET_X_LPARAM(lParam); - int y = GET_Y_LPARAM(lParam); - - if (g_config.adjmouse) - { - x = (int)(roundf(x * g_ddraw.mouse.scale_x)); - y = (int)(roundf(y * g_ddraw.mouse.scale_y)); - } - - lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); - } - if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; From e4eafef6526426f99c185b0d138fc8f031a8426c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 16:58:22 +0200 Subject: [PATCH 174/557] return WM_NULL if there are no filters --- src/winapi_hooks.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 45076a3..7bb85c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,7 +598,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd) +void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { @@ -638,7 +638,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + } + break; } @@ -661,7 +667,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + } + break; } @@ -681,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); } return result; @@ -695,7 +707,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } return result; From f83baafcf664a4153bf398de7d22acc07f0a44ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:09:40 +0200 Subject: [PATCH 175/557] move font settings to the top --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 4e425f2..7416ad7 100644 --- a/src/config.c +++ b/src/config.c @@ -243,6 +243,12 @@ static void cfg_create_ini() "; Possible values: 0 = nearest-neighbor, 1 = bilinear, 2 = bicubic, 3 = lanczos (bicubic/lanczos only support 16/32bit color depth games)\n" "d3d9_filter=2\n" "\n" + "; Disable font smoothing for fonts that are smaller than size X\n" + "anti_aliased_fonts_min_size=13\n" + "\n" + "; Raise the size of small fonts to X\n" + "min_font_size=0\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" @@ -307,10 +313,8 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" - "anti_aliased_fonts_min_size=13\n" "custom_width=0\n" "custom_height=0\n" - "min_font_size=0\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" From e435bf65e13ed723f94051dadb5e66546d98693a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:17:00 +0200 Subject: [PATCH 176/557] rename custom_width/height setting to inject_resolution --- inc/config.h | 3 +-- src/config.c | 15 +++++---------- src/dd.c | 15 ++++++++++----- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/inc/config.h b/inc/config.h index c725c36..15afbe5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -70,8 +70,7 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; int refresh_rate; int anti_aliased_fonts_min_size; - int custom_width; - int custom_height; + char inject_resolution[128]; int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; diff --git a/src/config.c b/src/config.c index 7416ad7..a5e5d3a 100644 --- a/src/config.c +++ b/src/config.c @@ -84,8 +84,7 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); - GET_INT(g_config.custom_width, "custom_width", 0); - GET_INT(g_config.custom_height, "custom_height", 0); + GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); @@ -313,8 +312,7 @@ static void cfg_create_ini() "rgb555=false\n" "no_dinput_hook=false\n" "refresh_rate=0\n" - "custom_width=0\n" - "custom_height=0\n" + ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" @@ -920,14 +918,12 @@ static void cfg_create_ini() "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" - "custom_width=800\n" - "custom_height=450\n" + "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" "keytogglefullscreen=0x08\n" - "custom_width=800\n" - "custom_height=450\n" + "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" "[Jstorm]\n" @@ -974,8 +970,7 @@ static void cfg_create_ini() "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" "[iwd2]\n" "resolutions=2\n" - "custom_width=1070\n" - "custom_height=602\n" + "inject_resolution=1070x602\n" "\n" "; Invictus\n" "[Invictus]\n" diff --git a/src/dd.c b/src/dd.c index e98983d..1ec2bef 100644 --- a/src/dd.c +++ b/src/dd.c @@ -113,6 +113,11 @@ HRESULT dd_EnumDisplayModes( while (--max_w % 8); } + char* ires = &g_config.inject_resolution[0]; + + unsigned long custom_width = strtoul(ires, &ires, 0); + unsigned long custom_height = strtoul(ires + 1, &ires, 0); + BOOL rlf = g_config.resolutions == RESLIST_FULL; BOOL rlm = g_config.resolutions == RESLIST_MINI; @@ -149,7 +154,7 @@ HRESULT dd_EnumDisplayModes( { rlf ? 1720 : 0, rlf ? 720 : 0 }, { rlf ? 2560 : 0, rlf ? 1080 : 0 }, /* Inject custom resolution */ - { g_config.custom_width, g_config.custom_height }, + { custom_width, custom_height }, { max_w, max_h }, }; @@ -228,10 +233,10 @@ HRESULT dd_EnumDisplayModes( while (--m.dmPelsWidth % 8); } - if (!custom_res_injected && g_config.custom_width && g_config.custom_height) + if (!custom_res_injected && custom_width && custom_height) { - m.dmPelsWidth = g_config.custom_width; - m.dmPelsHeight = g_config.custom_height; + m.dmPelsWidth = custom_width; + m.dmPelsHeight = custom_height; custom_res_injected = TRUE; } @@ -347,7 +352,7 @@ HRESULT dd_EnumDisplayModes( if (!resolutions[i].cx || !resolutions[i].cy) continue; - if (!(resolutions[i].cx == g_config.custom_width && resolutions[i].cy == g_config.custom_height) && + if (!(resolutions[i].cx == custom_width && resolutions[i].cy == custom_height) && ((max_w && resolutions[i].cx > max_w) || (max_h && resolutions[i].cy > max_h))) { DEVMODE m; From 43ccc87e82d05d69e117a582b621d16dbf5e1af5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 19:41:46 +0200 Subject: [PATCH 177/557] sort header --- inc/config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 15afbe5..7dd8a23 100644 --- a/inc/config.h +++ b/inc/config.h @@ -40,6 +40,8 @@ typedef struct CNCDDRAWCONFIG int save_settings; BOOL resizable; int d3d9_filter; + int anti_aliased_fonts_min_size; + int min_font_size; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; @@ -69,9 +71,7 @@ typedef struct CNCDDRAWCONFIG BOOL rgb555; BOOL no_dinput_hook; int refresh_rate; - int anti_aliased_fonts_min_size; char inject_resolution[128]; - int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; From 8a6f94ae95b2b91d8b3b249bca32beaabb5d5719 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 20:31:49 +0200 Subject: [PATCH 178/557] only lock cursor if message was removed --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7bb85c0..019f2da 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -631,7 +631,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) { InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -693,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } return result; From 9d5d71c9993916251f0224d4a056274cc1a3303a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:14:37 +0200 Subject: [PATCH 179/557] use PM_QS_INPUT for not responding patch --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 056c158..121f8fb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -59,7 +59,7 @@ HRESULT dds_Blt( /* workaround for "Not Responding" window problem */ g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } if (g_ddraw.ref && @@ -1003,7 +1003,7 @@ HRESULT dds_Lock( /* workaround for "Not Responding" window problem */ g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); From ac9d183a596dde6fb478251427c7ca667eab3b62 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:32:53 +0200 Subject: [PATCH 180/557] adjust logs --- src/keyboard.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/keyboard.c b/src/keyboard.c index ca5109e..109269b 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -47,7 +47,7 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) BOOL key_released = !!(lParam & (1 << 31)); BOOL key_triggered = !(lParam & (1 << 30)); - //TRACE("kbhook wParam=%u, triggered=%u, released=%u, alt_down=%u\n", wParam, key_triggered, key_released, alt_down); + //TRACE("kbhook code=%u, wParam=%u, triggered=%u, released=%u, alt_down=%u\n", code, wParam, key_triggered, key_released, alt_down); if (wParam == VK_MENU && (key_released || key_triggered)) /* Fix for alt key being stuck on alt+tab in some games */ { From ed0b829bc6ea4ff959c93418684238b6c884beb1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Sep 2024 21:33:04 +0200 Subject: [PATCH 181/557] only create screenshot if file doesn't exist --- src/screenshot.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/screenshot.c b/src/screenshot.c index d76105e..063955b 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -153,6 +153,9 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) strftime(str_time, sizeof(str_time), "%Y-%m-%d_%H-%M-%S", localtime(&t)); _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time); + if (FILE_EXISTS(filename)) + return FALSE; + if (src->bpp == 8 && src->palette) { if (!ss_screenshot_8bit(filename, src)) From d2db12f2af1347be19e8d38318f523d7512615ea Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:39:53 +0200 Subject: [PATCH 182/557] Revert "only lock cursor if message was removed" This reverts commit 8a6f94ae95b2b91d8b3b249bca32beaabb5d5719. --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 019f2da..7bb85c0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -631,7 +631,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) + if (!g_config.devmode && !g_mouse_locked) { InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -693,7 +693,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); } return result; From 691b5196d564ec007d9a08495e446883ca5420ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:05 +0200 Subject: [PATCH 183/557] Revert "return WM_NULL if there are no filters" This reverts commit e4eafef6526426f99c185b0d138fc8f031a8426c. --- src/winapi_hooks.c | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7bb85c0..45076a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -598,7 +598,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +void HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { @@ -638,13 +638,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa mouse_lock(); - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - } - + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } @@ -667,13 +661,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - if (!wMsgFilterMin && - !wMsgFilterMax && - !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) - { - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - } - + //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } @@ -693,7 +681,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, 0); + HandleMessage(lpMsg, hWnd); } return result; @@ -707,7 +695,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + HandleMessage(lpMsg, hWnd); } return result; From 4df4766736411417b58acdd218d6a29e28b28380 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:13 +0200 Subject: [PATCH 184/557] Revert "remove old diablo 2 hack" This reverts commit df91a4308f380b45938dfd2e190fe17b55823c9d. --- src/winapi_hooks.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 45076a3..1083f4a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -414,6 +414,20 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); + if (g_ddraw.hwnd == hWnd && Msg == WM_MOUSEMOVE) + { + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + if (g_config.adjmouse) + { + x = (int)(roundf(x * g_ddraw.mouse.scale_x)); + y = (int)(roundf(y * g_ddraw.mouse.scale_y)); + } + + lParam = MAKELPARAM(x + g_ddraw.mouse.x_adjust, y + g_ddraw.mouse.y_adjust); + } + if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; From cdb68e9dd1ee641750cb60d3dc553ca67c526aa3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:27 +0200 Subject: [PATCH 185/557] Revert "do not return WM_NULL for now (needs more testing)" This reverts commit a42bdae84d2129a0d91eaa225b3e2b46f419b392. --- src/winapi_hooks.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 1083f4a..f931f96 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { @@ -652,8 +652,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - break; + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); } break; @@ -675,12 +674,13 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); break; } InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); + break; } } From 801d31f68e3e618fa2a4845fd53e554134a77fa8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:35 +0200 Subject: [PATCH 186/557] Revert "don't update cursor pos in mouse hook" This reverts commit c1a5a3895b53462bb5fa8feac57a1b240538e780. --- src/mouse.c | 3 +++ src/winapi_hooks.c | 4 ---- src/wndproc.c | 3 --- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index 3e0d0ac..df05989 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -168,6 +168,9 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) x = min(x, g_ddraw.width - 1); y = min(y, g_ddraw.height - 1); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + msg->lParam = MAKELPARAM(x, y); break; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f931f96..a7e22cc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -675,12 +675,8 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - break; } - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - break; } } diff --git a/src/wndproc.c b/src/wndproc.c index c0993b1..cc87bd2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -816,9 +816,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); - break; } case WM_PARENTNOTIFY: From 7de3efd050310e802a1a676474d6b18ff1c84652 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:44 +0200 Subject: [PATCH 187/557] Revert "never return FALSE from peekmessage to avoid issues" This reverts commit 89d38454733b115f743c98a94922bb5f2527830f. --- src/winapi_hooks.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a7e22cc..8d8d8b5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -void HandleMessage(LPMSG lpMsg, HWND hWnd) +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) { @@ -637,7 +637,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) } if (lpMsg->hwnd != g_ddraw.hwnd) - return; + return TRUE; switch (LOWORD(lpMsg->message)) { @@ -653,6 +653,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) mouse_lock(); lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; } break; @@ -675,12 +676,15 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd) { // Does not work with 'New Robinson' lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); + return FALSE; } break; } } } + + return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -705,7 +709,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); if (result) { - HandleMessage(lpMsg, hWnd); + return HandleMessage(lpMsg, hWnd); } return result; From 8b96d0d34b2b57df996c01ee80be14dc75af65d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:40:52 +0200 Subject: [PATCH 188/557] Revert "fix ja2 cursor lock" This reverts commit 48151e4d78489cd947c689bb6a2838bad48f03b4. --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8d8d8b5..2dc5fe4 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,7 +614,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) { From 8425f81597b6ec480bf4a041f9152f71e0fb0060 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:41:04 +0200 Subject: [PATCH 189/557] Revert "remove obsolete settings" This reverts commit 97718b9a19be15990cdad4d0d9e8f94eb34e08b1. --- inc/config.h | 2 ++ src/config.c | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/inc/config.h b/inc/config.h index 7dd8a23..593130a 100644 --- a/inc/config.h +++ b/inc/config.h @@ -57,6 +57,8 @@ typedef struct CNCDDRAWCONFIG BOOL singlecpu; int resolutions; int fixchilds; + BOOL hook_peekmessage; + BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index a5e5d3a..ad395fa 100644 --- a/src/config.c +++ b/src/config.c @@ -67,6 +67,8 @@ void cfg_load() GET_BOOL(g_config.singlecpu, "singlecpu", TRUE); GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); + GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); + GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -298,6 +300,10 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" + "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" + "hook_peekmessage=false\n" + "hook_getmessage=false\n" + "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" "releasealt=false\n" @@ -477,6 +483,7 @@ static void cfg_create_ini() "\n" "; Axis & Allies\n" "[AxisAllies]\n" + "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" "; Barney - Secret of the Rainbow\n" @@ -820,6 +827,7 @@ static void cfg_create_ini() "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" + "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" "adjmouse=true\n" @@ -834,10 +842,18 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Enemy Infestation\n" + "[EI]\n" + "hook_getmessage=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" "\n" + "; Final Liberation: Warhammer Epic 40000\n" + "[Epic40k]\n" + "hook_peekmessage=true\n" + "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" "nonexclusive=true\n" @@ -1102,6 +1118,10 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Lionheart\n" + "[Lionheart]\n" + "hook_peekmessage=true\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1158,6 +1178,7 @@ static void cfg_create_ini() "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" + "hook_peekmessage=true\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" @@ -1378,6 +1399,10 @@ static void cfg_create_ini() "[StarCraft]\n" "game_handles_close=true\n" "\n" + "; Space Rangers\n" + "[Rangers]\n" + "hook_peekmessage=true\n" + "\n" "; SPYFox: Hold the Mustard\n" "[mustard]\n" "renderer=gdi\n" From efbf7e7b30794d74bd6606dc6dd49a193b87a951 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:41:29 +0200 Subject: [PATCH 190/557] Revert "remove debug code" This reverts commit 75ed1595c6288a55e0d7ba4410c169a7e1c3b445. --- src/dd.c | 2 ++ src/winapi_hooks.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 1ec2bef..fee3a21 100644 --- a/src/dd.c +++ b/src/dd.c @@ -993,6 +993,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } + TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2dc5fe4..33ee191 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -647,6 +647,8 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) { if (!g_config.devmode && !g_mouse_locked) { + TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); @@ -681,6 +683,7 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) break; } + } } From c13aece3f6b00a7d83d2a2c88d0c2e83f0c5e7ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:42:00 +0200 Subject: [PATCH 191/557] Revert "fix window resize/move issues" This reverts commit 04d7f2060e900c66c3c8a5e285a078c1d8d20509. --- src/mouse.c | 66 +++++++++++++++++++++++++++++++- src/winapi_hooks.c | 94 +--------------------------------------------- src/wndproc.c | 37 ------------------ 3 files changed, 67 insertions(+), 130 deletions(-) diff --git a/src/mouse.c b/src/mouse.c index df05989..cbb976b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -115,16 +115,74 @@ void mouse_unlock() LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) { + if (code < 0 || !lParam || !g_ddraw.width) + return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); + MSG* msg = (MSG*)lParam; - if (code < 0 || !g_ddraw.width || !msg || msg->hwnd != g_ddraw.hwnd) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) + { + int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + msg->pt.x = min(x, g_ddraw.width - 1); + msg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (msg->hwnd != g_ddraw.hwnd) return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); switch (LOWORD(msg->message)) { + /* button up messages reactivate cursor lock */ case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(msg->lParam); + int y = GET_Y_LPARAM(msg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ case WM_XBUTTONDBLCLK: case WM_XBUTTONDOWN: case WM_XBUTTONUP: @@ -138,6 +196,12 @@ LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { + if (!g_config.devmode && !g_mouse_locked) + { + msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); + return 0; + } + if (LOWORD(msg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33ee191..b51731b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,96 +612,12 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd) -{ - if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) - { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (lpMsg->hwnd != g_ddraw.hwnd) - return TRUE; - - switch (LOWORD(lpMsg->message)) - { - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - TRACE("HandleMessage %s hWnd=%p, lpMsg->hWnd=%p\n", dbg_mes_to_str(lpMsg->message), hWnd, lpMsg->hwnd); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lpMsg->lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lpMsg->lParam)); - - mouse_lock(); - - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; - } - - break; - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - // Does not work with 'New Robinson' - lpMsg->message = (UINT)MAKELONG(WM_NULL, HIWORD(lpMsg->message)); - return FALSE; - } - - break; - } - - } - } - - return TRUE; -} - BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result) - { - HandleMessage(lpMsg, hWnd); - } - - return result; + return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -709,13 +625,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result) - { - return HandleMessage(lpMsg, hWnd); - } - - return result; + return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index cc87bd2..030751e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -781,43 +781,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - InterlockedExchange((LONG*)&g_ddraw.cursor.x, GET_X_LPARAM(lParam)); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, GET_Y_LPARAM(lParam)); - - mouse_lock(); - return 0; - } - - break; - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - return 0; - } - - break; - } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From 5af1d683d8d4becb3e5cdc7bd3a43ad0af8cf0ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 15:42:14 +0200 Subject: [PATCH 192/557] Revert "add experimental WH_GETMESSAGE hook" This reverts commit dcc76a154dec7dd35e4299c0e77a58efdfbf3d8a. --- inc/mouse.h | 5 +- src/dd.c | 3 - src/dllmain.c | 2 - src/mouse.c | 171 ++------------------------------------------- src/winapi_hooks.c | 168 +++++++++++++++++++++++++++++++++++++++++++- src/wndproc.c | 94 ++++++++++++++++++++++++- 6 files changed, 264 insertions(+), 179 deletions(-) diff --git a/inc/mouse.h b/inc/mouse.h index 65ef0da..1181ac2 100644 --- a/inc/mouse.h +++ b/inc/mouse.h @@ -1,12 +1,9 @@ #ifndef MOUSE_H #define MOUSE_H -void mouse_hook_init(); -void mouse_hook_exit(); void mouse_lock(); void mouse_unlock(); -LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam); -LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam); +LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam); extern BOOL g_mouse_locked; extern HHOOK g_mouse_hook; diff --git a/src/dd.c b/src/dd.c index fee3a21..e9ae3d7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -993,8 +993,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); } - TRACE("sdm unscale_x %.6f, y=%.6f\n", g_ddraw.mouse.unscale_x, g_ddraw.mouse.unscale_y); - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; @@ -1372,7 +1370,6 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); keyboard_hook_init(); - mouse_hook_init(); if (!g_ddraw.render.hdc) { diff --git a/src/dllmain.c b/src/dllmain.c index fa8e2d1..76090f9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -13,7 +13,6 @@ #include "utils.h" #include "versionhelpers.h" #include "keyboard.h" -#include "mouse.h" /* export for cncnet cnc games */ @@ -141,7 +140,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) indeo_disable(); timeEndPeriod(1); keyboard_hook_exit(); - mouse_hook_exit(); dinput_hook_exit(); hook_exit(); break; diff --git a/src/mouse.c b/src/mouse.c index cbb976b..46aca13 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -1,45 +1,15 @@ #include -#include -#include #include "debug.h" #include "winapi_hooks.h" #include "dd.h" #include "hook.h" #include "utils.h" #include "config.h" -#include "mouse.h" BOOL g_mouse_locked; HHOOK g_mouse_hook; HOOKPROC g_mouse_proc; -static HHOOK g_mouse_gm_hook; - -void mouse_hook_init() -{ - if (g_mouse_gm_hook && UnhookWindowsHookEx(g_mouse_gm_hook)) - { - g_mouse_gm_hook = NULL; - } - - if (!g_ddraw.gui_thread_id) - return; - - g_mouse_gm_hook = - real_SetWindowsHookExA( - WH_GETMESSAGE, - mouse_gm_hook_proc, - NULL, - g_ddraw.gui_thread_id); -} - -void mouse_hook_exit() -{ - if (g_mouse_gm_hook) - { - UnhookWindowsHookEx(g_mouse_gm_hook); - } -} void mouse_lock() { @@ -113,146 +83,15 @@ void mouse_unlock() } } -LRESULT CALLBACK mouse_gm_hook_proc(int code, WPARAM wParam, LPARAM lParam) -{ - if (code < 0 || !lParam || !g_ddraw.width) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - - MSG* msg = (MSG*)lParam; - - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &msg->pt)) - { - int x = max(msg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(msg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - msg->pt.x = min(x, g_ddraw.width - 1); - msg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - msg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - msg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (msg->hwnd != g_ddraw.hwnd) - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); - - switch (LOWORD(msg->message)) - { - /* button up messages reactivate cursor lock */ - case WM_LBUTTONUP: - case WM_RBUTTONUP: - case WM_MBUTTONUP: - { - if (!g_config.devmode && !g_mouse_locked) - { - int x = GET_X_LPARAM(msg->lParam); - int y = GET_Y_LPARAM(msg->lParam); - - if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || - x < g_ddraw.render.viewport.x || - y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || - y < g_ddraw.render.viewport.y) - { - x = g_ddraw.width / 2; - y = g_ddraw.height / 2; - } - else - { - x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - mouse_lock(); - - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - /* fall through for lParam */ - } - /* down messages are ignored if we have no cursor lock */ - case WM_XBUTTONDBLCLK: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - case WM_MOUSEWHEEL: - case WM_MOUSEHOVER: - case WM_LBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_LBUTTONDOWN: - case WM_RBUTTONDOWN: - case WM_MBUTTONDOWN: - case WM_MOUSEMOVE: - { - if (!g_config.devmode && !g_mouse_locked) - { - msg->message = MAKELONG(WM_NULL, HIWORD(msg->message)); - return 0; - } - - if (LOWORD(msg->message) == WM_MOUSEWHEEL) - { - POINT pt = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) }; - real_ScreenToClient(g_ddraw.hwnd, &pt); - msg->lParam = MAKELPARAM(pt.x, pt.y); - } - - int x = max(GET_X_LPARAM(msg->lParam) - g_ddraw.mouse.x_adjust, 0); - int y = max(GET_Y_LPARAM(msg->lParam) - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - if (g_config.vhack && !g_config.devmode) - { - POINT pt = { 0, 0 }; - fake_GetCursorPos(&pt); - - x = pt.x; - y = pt.y; - } - else - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - } - - x = min(x, g_ddraw.width - 1); - y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); - - msg->lParam = MAKELPARAM(x, y); - - break; - } - } - - return CallNextHookEx(g_mouse_gm_hook, code, wParam, lParam); -} - -LRESULT CALLBACK mouse_hook_proc(int code, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) { if (!g_ddraw.ref) - return g_mouse_proc(code, wParam, lParam); + return g_mouse_proc(Code, wParam, lParam); - if (code < 0 || (!g_config.devmode && !g_mouse_locked)) - return CallNextHookEx(g_mouse_hook, code, wParam, lParam); + if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) + return CallNextHookEx(g_mouse_hook, Code, wParam, lParam); fake_GetCursorPos(&((MOUSEHOOKSTRUCT*)lParam)->pt); - return g_mouse_proc(code, wParam, lParam); + return g_mouse_proc(Code, wParam, lParam); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b51731b..68dc9dd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,12 +612,146 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +{ + if (g_ddraw.ref && g_ddraw.width) + { + switch (lpMsg->message) + { + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(lpMsg->lParam); + int y = GET_Y_LPARAM(lpMsg->lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + //return FALSE; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + // Does not work with 'New Robinson' + //return FALSE; + } + + if (lpMsg->message == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + lpMsg->lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(lpMsg->lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lpMsg->lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + lpMsg->lParam = MAKELPARAM(x, y); + + lpMsg->pt.x = x; + lpMsg->pt.y = y; + + break; + } + + } + } + + return TRUE; +} + BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (g_config.hook_getmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + } + + return result; } BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) @@ -625,7 +759,37 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); - return real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + { + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (g_config.hook_peekmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + } + + return result; } BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) diff --git a/src/wndproc.c b/src/wndproc.c index 030751e..0d65fce 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) + uMsg != WM_D3D9DEVICELOST) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,7 +42,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { - case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: @@ -781,6 +780,97 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { break; } + /* button up messages reactivate cursor lock */ + case WM_LBUTTONUP: + case WM_RBUTTONUP: + case WM_MBUTTONUP: + { + if (!g_config.devmode && !g_mouse_locked) + { + int x = GET_X_LPARAM(lParam); + int y = GET_Y_LPARAM(lParam); + + if (x > g_ddraw.render.viewport.x + g_ddraw.render.viewport.width || + x < g_ddraw.render.viewport.x || + y > g_ddraw.render.viewport.y + g_ddraw.render.viewport.height || + y < g_ddraw.render.viewport.y) + { + x = g_ddraw.width / 2; + y = g_ddraw.height / 2; + } + else + { + x = (DWORD)((x - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + y = (DWORD)((y - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + mouse_lock(); + return 0; + } + /* fall through for lParam */ + } + /* down messages are ignored if we have no cursor lock */ + case WM_XBUTTONDBLCLK: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + case WM_MOUSEWHEEL: + case WM_MOUSEHOVER: + case WM_LBUTTONDBLCLK: + case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: + case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_MOUSEMOVE: + { + if (!g_config.devmode && !g_mouse_locked) + { + return 0; + } + + if (uMsg == WM_MOUSEWHEEL) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + real_ScreenToClient(g_ddraw.hwnd, &pt); + lParam = MAKELPARAM(pt.x, pt.y); + } + + int x = max(GET_X_LPARAM(lParam) - g_ddraw.mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lParam) - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + if (g_config.vhack && !g_config.devmode) + { + POINT pt = { 0, 0 }; + fake_GetCursorPos(&pt); + + x = pt.x; + y = pt.y; + } + else + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + } + + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); + + lParam = MAKELPARAM(x, y); + + break; + } case WM_PARENTNOTIFY: { switch (LOWORD(wParam)) From ae66bebb318137137042b837c1ae871e52a3a950 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 17:15:02 +0200 Subject: [PATCH 193/557] enable a few more hooks for hook=2 --- src/hook.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index d71bf72..c10430d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -156,8 +156,8 @@ HOOKLIST g_hook_hooklist[] = { "WING32.DLL", { - { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, HOOK_SKIP_2 }, - { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, HOOK_SKIP_2 }, + { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, 0 }, + { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, 0 }, { "", NULL, NULL, 0 } } }, @@ -169,9 +169,9 @@ HOOKLIST g_hook_hooklist[] = { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, HOOK_SKIP_2 }, { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, HOOK_SKIP_2 }, { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, - { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, HOOK_SKIP_2 }, - { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, HOOK_SKIP_2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, 0 }, + { "GetVersion", (PROC)fake_GetVersion, (PROC*)&real_GetVersion, 0 }, + { "GetVersionExA", (PROC)fake_GetVersionExA, (PROC*)&real_GetVersionExA, 0 }, #if defined(_DEBUG) && defined(__GNUC__) { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, #endif From 7d3a07b2e7d3bc0142d8c441006f8d130266cc5b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Sep 2024 17:54:26 +0200 Subject: [PATCH 194/557] update compat warning text --- src/dllmain.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 76090f9..ba25edc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -66,13 +66,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) { - char mes[128] = { 0 }; + char mes[280] = { 0 }; _snprintf( mes, sizeof(mes) - 1, - "Please disable the '%s' compatibility mode for all game executables and " - "then try to start the game again.", + "Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " + "disable the '%s' compatibility mode for all game executables and then start the game again.\n\n" + "Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'", s); if (!g_config.no_compat_warning) From 2353363e6d7ae201d08f85d5daf15aa64575a429 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 14:38:56 +0200 Subject: [PATCH 195/557] update madeline presets --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index ad395fa..f20e8cb 100644 --- a/src/config.c +++ b/src/config.c @@ -1132,6 +1132,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Madeline 1st Grade Math: Progress Report\n" "[madpr]\n" @@ -1143,6 +1146,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Madeline 2nd Grade Math\n" "[madmath2]\n" @@ -1154,6 +1160,9 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" + "renderer=gdi\n" + "hook=2\n" + "win_version=nt4\n" "\n" "; Majesty Gold\n" "[Majesty]\n" From a9f0b8f8f53530136e62dc9c868138129752eeb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 15:47:31 +0200 Subject: [PATCH 196/557] don't let messages pass through with peek/getmessage hooks --- src/winapi_hooks.c | 26 ++++++++++++++++++-------- src/wndproc.c | 3 ++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 68dc9dd..c6efbf5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -612,7 +612,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return result; } -BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { if (g_ddraw.ref && g_ddraw.width) { @@ -645,7 +645,14 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); - //return FALSE; + + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = WM_NULL; + break; + } } /* fall through for lParam */ } @@ -666,7 +673,13 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (!g_config.devmode && !g_mouse_locked) { // Does not work with 'New Robinson' - //return FALSE; + if (!wMsgFilterMin && + !wMsgFilterMax && + !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) + { + lpMsg->message = WM_NULL; + break; + } } if (lpMsg->message == WM_MOUSEWHEEL) @@ -709,11 +722,8 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa break; } - } } - - return TRUE; } BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) @@ -747,7 +757,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (g_config.hook_getmessage) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } } @@ -785,7 +795,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (g_config.hook_peekmessage) { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } } diff --git a/src/wndproc.c b/src/wndproc.c index 0d65fce..811bef3 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -22,7 +22,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg != WM_MOUSEMOVE && uMsg != WM_NCMOUSEMOVE && uMsg != WM_NCHITTEST && uMsg != WM_SETCURSOR && uMsg != WM_KEYUP && uMsg != WM_KEYDOWN && uMsg != WM_CHAR && uMsg != WM_DEADCHAR && uMsg != WM_INPUT && uMsg != WM_UNICHAR && uMsg != WM_IME_CHAR && uMsg != WM_IME_KEYDOWN && uMsg != WM_IME_KEYUP && uMsg != WM_TIMER && - uMsg != WM_D3D9DEVICELOST) + uMsg != WM_D3D9DEVICELOST && uMsg != WM_NULL) { TRACE( " uMsg = %s (%d), wParam = %08X (%d), lParam = %08X (%d, LO=%d HI=%d)\n", @@ -42,6 +42,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam switch (uMsg) { + case WM_NULL: case WM_MOVING: case WM_NCLBUTTONDOWN: case WM_NCLBUTTONUP: From cd021dc090380effcd0fd5a82fff570a101b59e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 16:16:59 +0200 Subject: [PATCH 197/557] merge PeekMessage and GetMessage hooks --- inc/config.h | 1 - src/config.c | 6 ++-- src/winapi_hooks.c | 88 ++++++++++++++++------------------------------ 3 files changed, 33 insertions(+), 62 deletions(-) diff --git a/inc/config.h b/inc/config.h index 593130a..8660c49 100644 --- a/inc/config.h +++ b/inc/config.h @@ -58,7 +58,6 @@ typedef struct CNCDDRAWCONFIG int resolutions; int fixchilds; BOOL hook_peekmessage; - BOOL hook_getmessage; /* Undocumented settings */ diff --git a/src/config.c b/src/config.c index f20e8cb..950d18f 100644 --- a/src/config.c +++ b/src/config.c @@ -68,7 +68,6 @@ void cfg_load() GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_BOOL(g_config.hook_getmessage, "hook_getmessage", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ @@ -300,9 +299,8 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable one of the following settings if your cursor doesn't work properly when upscaling is enabled\n" + "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" "hook_peekmessage=false\n" - "hook_getmessage=false\n" "\n" "\n" "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" @@ -844,7 +842,7 @@ static void cfg_create_ini() "\n" "; Enemy Infestation\n" "[EI]\n" - "hook_getmessage=true\n" + "hook_peekmessage=true\n" "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c6efbf5..ed4648c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -614,15 +614,38 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { - if (g_ddraw.ref && g_ddraw.width) + if (lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - switch (lpMsg->message) + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) + { + int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + lpMsg->pt.x = min(x, g_ddraw.width - 1); + lpMsg->pt.y = min(y, g_ddraw.height - 1); + } + else + { + lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + if (lpMsg->hwnd != g_ddraw.hwnd || !g_config.hook_peekmessage) + return; + + switch (LOWORD(lpMsg->message)) { case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (!g_config.devmode && !g_mouse_locked) + if (!g_config.devmode && !g_mouse_locked && (wRemoveMsg & PM_REMOVE)) { int x = GET_X_LPARAM(lpMsg->lParam); int y = GET_Y_LPARAM(lpMsg->lParam); @@ -672,7 +695,6 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa { if (!g_config.devmode && !g_mouse_locked) { - // Does not work with 'New Robinson' if (!wMsgFilterMin && !wMsgFilterMax && !(wRemoveMsg & (PM_QS_INPUT | PM_QS_PAINT | PM_QS_POSTMESSAGE | PM_QS_SENDMESSAGE))) @@ -682,7 +704,7 @@ void HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa } } - if (lpMsg->message == WM_MOUSEWHEEL) + if (LOWORD(lpMsg->message) == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; real_ScreenToClient(g_ddraw.hwnd, &pt); @@ -732,33 +754,9 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (result) { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); - } + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, PM_REMOVE); } return result; @@ -770,33 +768,9 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w g_ddraw.last_msg_pull_tick = timeGetTime(); BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && !g_config.fixmousehook) + if (result) { - if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt)) - { - int x = max(lpMsg->pt.x - g_ddraw.mouse.x_adjust, 0); - int y = max(lpMsg->pt.y - g_ddraw.mouse.y_adjust, 0); - - if (g_config.adjmouse) - { - x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); - } - - lpMsg->pt.x = min(x, g_ddraw.width - 1); - lpMsg->pt.y = min(y, g_ddraw.height - 1); - } - else - { - lpMsg->pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); - lpMsg->pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); - } - - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - } + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); } return result; From cbecc7e2cf61e080bcb352fec8b8fec725059abc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 16:59:21 +0200 Subject: [PATCH 198/557] improve "fixnotresponding" patch --- src/ddsurface.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 121f8fb..38a5d48 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -57,9 +57,13 @@ HRESULT dds_Blt( !IsWine()) { /* workaround for "Not Responding" window problem */ - g_ddraw.last_msg_pull_tick = timeGetTime(); + //g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } } if (g_ddraw.ref && @@ -1001,9 +1005,13 @@ HRESULT dds_Lock( !IsWine()) { /* workaround for "Not Responding" window problem */ - g_ddraw.last_msg_pull_tick = timeGetTime(); + //g_ddraw.last_msg_pull_tick = timeGetTime(); MSG msg; - real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); From e0292792c0ef0701165bc85be0d9c7d8888b7390 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 17:05:00 +0200 Subject: [PATCH 199/557] update robin hood presets --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index 950d18f..c0d0a05 100644 --- a/src/config.c +++ b/src/config.c @@ -1361,14 +1361,17 @@ static void cfg_create_ini() "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" + "fixnotresponding=true\n" "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" From 8ff40f986cf5fa0ee31129949627be7125e467d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 18:01:21 +0200 Subject: [PATCH 200/557] remove duplicate code --- inc/utils.h | 1 + src/ddsurface.c | 33 +++------------------------------ src/utils.c | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index beb1c57..7f7b670 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,6 +6,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +void util_pull_messages(); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_is_bad_read_ptr(void* p); diff --git a/src/ddsurface.c b/src/ddsurface.c index 38a5d48..2f87cf0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -12,6 +12,7 @@ #include "blt.h" #include "config.h" #include "ddclipper.h" +#include "utils.h" #include "versionhelpers.h" @@ -50,21 +51,7 @@ HRESULT dds_Blt( dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); - if (g_config.fixnotresponding && - g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && - GetCurrentThreadId() == g_ddraw.gui_thread_id && - !IsWine()) - { - /* workaround for "Not Responding" window problem */ - //g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } - } + util_pull_messages(); if (g_ddraw.ref && g_ddraw.iskkndx && @@ -998,21 +985,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_config.fixnotresponding && - g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && - GetCurrentThreadId() == g_ddraw.gui_thread_id && - !IsWine()) - { - /* workaround for "Not Responding" window problem */ - //g_ddraw.last_msg_pull_tick = timeGetTime(); - MSG msg; - if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } - } + util_pull_messages(); HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); diff --git a/src/utils.c b/src/utils.c index ee7b8cd..6856ee0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -10,6 +10,7 @@ #include "render_d3d9.h" #include "utils.h" #include "config.h" +#include "versionhelpers.h" /* @@ -69,6 +70,26 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +void util_pull_messages() +{ + if (g_config.fixnotresponding && + g_ddraw.hwnd && + g_ddraw.last_msg_pull_tick && + g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && + GetCurrentThreadId() == g_ddraw.gui_thread_id && + !IsWine()) + { + /* workaround for "Not Responding" window problem */ + //g_ddraw.last_msg_pull_tick = timeGetTime(); + MSG msg; + if (real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessageA(&msg); + } + } +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From 52c536d5c37ddd96a29602741f3e9c404704eacf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 19:49:04 +0200 Subject: [PATCH 201/557] log lpbIsInVB bool --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index e9ae3d7..fb2fa5b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -612,6 +612,8 @@ HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) *lpbIsInVB = TRUE; } + TRACE(" lpbIsInVB = %s\n", *lpbIsInVB ? "TRUE" : "FALSE"); + return DD_OK; } From a7df3a86ea31b8f40b91797efd0993ad67b77e6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Sep 2024 20:06:12 +0200 Subject: [PATCH 202/557] revert change --- src/utils.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 6856ee0..af90a1c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -74,7 +74,6 @@ void util_pull_messages() { if (g_config.fixnotresponding && g_ddraw.hwnd && - g_ddraw.last_msg_pull_tick && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) From 12c23d494e03765d03dacbd13dc68e18ef5dda12 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 17:02:11 +0200 Subject: [PATCH 203/557] sort config.c --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index c0d0a05..0bc89d8 100644 --- a/src/config.c +++ b/src/config.c @@ -52,6 +52,8 @@ void cfg_load() GET_INT(g_config.save_settings, "savesettings", 1); GET_BOOL(g_config.resizable, "resizable", TRUE); GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); + GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); + GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -84,9 +86,7 @@ void cfg_load() GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); - GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); - GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); From 43eadc53b0cf5ae6036d0bf9774010412b97b06f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 17:48:51 +0200 Subject: [PATCH 204/557] update comment --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0bc89d8..a352afa 100644 --- a/src/config.c +++ b/src/config.c @@ -299,7 +299,7 @@ static void cfg_create_ini() "; Note: Disables upscaling if a child window was detected (to ensure the game is fully playable, may look weird though)\n" "fixchilds=2\n" "\n" - "; Enable the following setting if your cursor doesn't work properly when upscaling is enabled\n" + "; Enable the following setting if your cursor doesn't lock to the window or it doesn't work properly when upscaling is enabled\n" "hook_peekmessage=false\n" "\n" "\n" From f690749ca917887d0561bac0e61e879b499802a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 18:11:08 +0200 Subject: [PATCH 205/557] cleanup settings names/order --- inc/config.h | 16 +++++------ src/config.c | 71 +++++++++++++++++++++++----------------------- src/utils.c | 2 +- src/winapi_hooks.c | 2 +- src/wndproc.c | 4 +-- 5 files changed, 47 insertions(+), 48 deletions(-) diff --git a/inc/config.h b/inc/config.h index 8660c49..ecb96aa 100644 --- a/inc/config.h +++ b/inc/config.h @@ -61,26 +61,25 @@ typedef struct CNCDDRAWCONFIG /* Undocumented settings */ - BOOL releasealt; - BOOL fixnotresponding; - int hook; + BOOL fix_alt_key_stuck; + BOOL fix_not_responding; + BOOL no_compat_warning; + BOOL wine_allow_resize; int guard_lines; int max_resolutions; BOOL lock_surfaces; BOOL flipclear; - BOOL fixmousehook; BOOL rgb555; BOOL no_dinput_hook; - int refresh_rate; char inject_resolution[128]; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; - BOOL wine_allow_resize; BOOL lock_mouse_top_left; - BOOL no_compat_warning; - BOOL remove_menu; char win_version[32]; + int hook; + BOOL remove_menu; + int refresh_rate; /* Hotkeys */ @@ -103,6 +102,7 @@ typedef struct CNCDDRAWCONFIG BOOL tlc_hack; BOOL homm_hack; BOOL carma95_hack; + BOOL sirtech_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a352afa..10dd700 100644 --- a/src/config.c +++ b/src/config.c @@ -70,30 +70,29 @@ void cfg_load() GET_INT(g_config.resolutions, "resolutions", RESLIST_NORMAL); GET_INT(g_config.fixchilds, "fixchilds", FIX_CHILDS_DETECT_PAINT); GET_BOOL(g_config.hook_peekmessage, "hook_peekmessage", FALSE); - GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); /* Undocumented settings */ - GET_BOOL(g_config.releasealt, "releasealt", FALSE); + GET_BOOL(g_config.fix_alt_key_stuck, "fix_alt_key_stuck", FALSE); GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); - GET_BOOL(g_config.fixnotresponding, "fixnotresponding", FALSE); - GET_INT(g_config.hook, "hook", 4); + GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); + GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.flipclear, "flipclear", FALSE); - GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_INT(g_config.refresh_rate, "refresh_rate", 0); GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); - GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); - GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); + GET_INT(g_config.hook, "hook", 4); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); + GET_INT(g_config.refresh_rate, "refresh_rate", 0); /* Hotkeys */ @@ -113,6 +112,7 @@ void cfg_load() GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); + GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -303,28 +303,27 @@ static void cfg_create_ini() "hook_peekmessage=false\n" "\n" "\n" - "; Undocumented settings - You may or may not change these (You should rather focus on the settings above)\n" - "releasealt=false\n" + "; Undocumented compatibility settings - These will probably not solve your problem, you should rather focus on the settings above\n" + "fix_alt_key_stuck=false\n" "game_handles_close=false\n" - "fixnotresponding=false\n" - "hook=4\n" + "fix_not_responding=false\n" + "no_compat_warning=false\n" + "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" "flipclear=false\n" - "fixmousehook=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - "refresh_rate=0\n" ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" - "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" - "no_compat_warning=false\n" - "remove_menu=false\n" ";win_version=95\n" + "hook=4\n" + "remove_menu=false\n" + "refresh_rate=0\n" "\n" "\n" "\n" @@ -833,7 +832,7 @@ static void cfg_create_ini() "; Economic War\n" "[EcoW]\n" "maxgameticks=60\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Emperor: Rise of the Middle Kingdom\n" "[Emperor]\n" @@ -896,7 +895,7 @@ static void cfg_create_ini() "\n" "; Glover\n" "[glover]\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; G-Police\n" "[GPOLICE]\n" @@ -1010,32 +1009,32 @@ static void cfg_create_ini() "; Jagged Alliance 2\n" "[ja2]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2: Unfinished Business\n" "[JA2UB]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2: Wildfire\n" "[WF6]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2 - UC mod\n" "[JA2_UC]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jagged Alliance 2 - Vengeance Reloaded mod\n" "[JA2_Vengeance]\n" "singlecpu=false\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Jedi Knight Dark Forces 2\n" "[JK]\n" @@ -1180,7 +1179,7 @@ static void cfg_create_ini() "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" - "releasealt=true\n" + "fix_alt_key_stuck=true\n" "\n" "; New Robinson\n" "[ROBY]\n" @@ -1361,17 +1360,17 @@ static void cfg_create_ini() "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" @@ -1512,7 +1511,7 @@ static void cfg_create_ini() "\n" "; The Jungle Book Groove Party\n" "[Jungle_vr]\n" - "fixnotresponding=true\n" + "fix_not_responding=true\n" "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" @@ -1574,8 +1573,8 @@ static void cfg_create_ini() "\n" "; Wizardry 8\n" "[Wiz8]\n" - "fixmousehook=true\n" - "releasealt=true\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" "\n" "; Worms 2\n" "[worms2]\n" diff --git a/src/utils.c b/src/utils.c index af90a1c..e363c72 100644 --- a/src/utils.c +++ b/src/utils.c @@ -72,7 +72,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) void util_pull_messages() { - if (g_config.fixnotresponding && + if (g_config.fix_not_responding && g_ddraw.hwnd && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ed4648c..75e6e73 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -596,7 +596,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return NULL; } - if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.fixmousehook) + if (idHook == WH_MOUSE && lpfn && !hmod && !g_mouse_hook && g_config.sirtech_hack) { g_mouse_proc = lpfn; return g_mouse_hook = real_SetWindowsHookExA(idHook, mouse_hook_proc, hmod, dwThreadId); diff --git a/src/wndproc.c b/src/wndproc.c index 811bef3..eecba37 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -675,7 +675,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam && g_config.releasealt) + if (wParam && g_config.fix_alt_key_stuck) { INPUT ip; memset(&ip, 0, sizeof(ip)); @@ -707,7 +707,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; } - if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + if (wParam && g_ddraw.alt_key_down && !g_config.fix_alt_key_stuck) { PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); g_ddraw.alt_key_down = FALSE; From 9dbafc1660db770473e208cb06fc4ac67d49ae84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 19:45:25 +0200 Subject: [PATCH 206/557] adjust warning message --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index ba25edc..90f408b 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -72,7 +72,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) mes, sizeof(mes) - 1, "Warning: Compatibility modes detected. \n\nIf there are issues with the game then try to " - "disable the '%s' compatibility mode for all game executables and then start the game again.\n\n" + "disable the '%s' compatibility mode for all game executables.\n\n" "Note: You can disable this warning via ddraw.ini -> 'no_compat_warning=true'", s); From a690a9233ed1f39291a236ca7d23a3a9f07884e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Sep 2024 20:08:53 +0200 Subject: [PATCH 207/557] update Jungle Storm preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 10dd700..1656c95 100644 --- a/src/config.c +++ b/src/config.c @@ -941,6 +941,7 @@ static void cfg_create_ini() "; Jungle Storm\n" "[Jstorm]\n" "no_compat_warning=true\n" + "win_version=98\n" "\n" "; Hades Challenge\n" "[HADESCH]\n" From da2672e231f2319d9bceded04d767741908de3e4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 12:34:22 +0200 Subject: [PATCH 208/557] fix build on windows --- Makefile | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 52c5804..2ac97d8 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,18 @@ LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo "UNKNOWN") -BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo "UNKNOWN") -ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) -EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) +COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) +BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) + +CMDTEST := $(shell echo \"\") +ifeq ($(CMDTEST),\"\") +# Windows +ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) +EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) +else +ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) +EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) +endif CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres @@ -30,4 +38,4 @@ $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) clean: - $(RM) $(TARGET) $(OBJS) + $(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS)) From 128a4b95f119e724bdbf821a79fca1ac3a8740d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:01:14 +0200 Subject: [PATCH 209/557] add comment --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 2ac97d8..38ab41c 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ ifeq ($(CMDTEST),\"\") ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else +# Either *nix or Windows with sh.exe (e.g. w64devkit) ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) endif From 01b1ff62e5ac225ddda08e100834014ea34b96ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:54:45 +0200 Subject: [PATCH 210/557] fix build with gmake and old win-builds --- Makefile | 21 ++++++++++++++------- inc/debug.h | 8 +------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index 38ab41c..3abf9f9 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ TARGET = ddraw.dll LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared -CFLAGS = -Iinc -O2 -march=i486 -Wall +CFLAGS = -Iinc -O2 -march=i486 -Wall -std=c99 LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) @@ -10,13 +10,20 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) CMDTEST := $(shell echo \"\") ifeq ($(CMDTEST),\"\") -# Windows -ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) -EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + # Windows + CMDTEST := $(shell echo "\#") + ifeq ($(CMDTEST),"\#") + # gmake + ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + else + ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) + endif else -# Either *nix or Windows with sh.exe (e.g. w64devkit) -ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) -EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) + # Either *nix or Windows with BusyBox (e.g. w64devkit) + ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) endif CC = i686-w64-mingw32-gcc diff --git a/inc/debug.h b/inc/debug.h index 6ac7f7b..be19a05 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,13 +28,7 @@ void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); - -void __cdecl dbg_invoke_watson( - _In_opt_z_ wchar_t const*, - _In_opt_z_ wchar_t const*, - _In_opt_z_ wchar_t const*, - _In_ unsigned int, - _In_ uintptr_t); +void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; From a157e1210fd9345718bbe98240d73dc32c352205 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:55:24 +0200 Subject: [PATCH 211/557] align with tab --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 3abf9f9..8a4e566 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ ifeq ($(CMDTEST),\"\") # gmake ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - else + else ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) endif From 1b017c05178fbf36a711da893a2ff0598727782d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 13:56:00 +0200 Subject: [PATCH 212/557] align with tab --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 8a4e566..1531e3a 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,7 @@ ifeq ($(CMDTEST),\"\") # Windows CMDTEST := $(shell echo "\#") ifeq ($(CMDTEST),"\#") - # gmake + # gmake ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else From 0a4f8a7c7c9908679638225f69c212a3d3174288 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 15:35:27 +0200 Subject: [PATCH 213/557] use quotes --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 1531e3a..92c2d0e 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ ifeq ($(CMDTEST),\"\") endif else # Either *nix or Windows with BusyBox (e.g. w64devkit) - ECOMMIT := $(shell echo \#define GIT_COMMIT \"$(COMMIT)\" > inc/git.h) - EBRANCH := $(shell echo \#define GIT_BRANCH \"$(BRANCH)\" >> inc/git.h) + ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif CC = i686-w64-mingw32-gcc From 19ad4bb2353ba473e887426e0c096c309940e6eb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Sep 2024 15:42:29 +0200 Subject: [PATCH 214/557] simplify makefile --- Makefile | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 92c2d0e..f485e13 100644 --- a/Makefile +++ b/Makefile @@ -11,15 +11,9 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) CMDTEST := $(shell echo \"\") ifeq ($(CMDTEST),\"\") # Windows - CMDTEST := $(shell echo "\#") - ifeq ($(CMDTEST),"\#") - # gmake - ECOMMIT := $(shell echo \#define GIT_COMMIT "$(COMMIT)" > inc/git.h) - EBRANCH := $(shell echo \#define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - else - ECOMMIT := $(shell echo #define GIT_COMMIT "$(COMMIT)" > inc/git.h) - EBRANCH := $(shell echo #define GIT_BRANCH "$(BRANCH)" >> inc/git.h) - endif + HASH := \# + ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) + EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else # Either *nix or Windows with BusyBox (e.g. w64devkit) ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) From 5901d125977d979f650e67b16d1ae0d9a3666408 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Sep 2024 19:30:42 +0200 Subject: [PATCH 215/557] log DI GUID --- src/directinput.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 358374b..d3f08f6 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -133,9 +133,14 @@ static HRESULT WINAPI fake_di_CreateDevice( if (SUCCEEDED(result)) { - if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) + if (rguid) { - g_mouse_device = *lplpDIDevice; + TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); + + if (IsEqualGUID(&GUID_SysMouse, rguid)) + { + g_mouse_device = *lplpDIDevice; + } } if (!real_did_SetCooperativeLevel) @@ -173,9 +178,14 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (SUCCEEDED(result)) { - if (rguid && IsEqualGUID(&GUID_SysMouse, rguid)) + if (rguid) { - g_mouse_device = *lplpDIDevice; + TRACE(" GUID = %08X\n", ((GUID*)rguid)->Data1); + + if (IsEqualGUID(&GUID_SysMouse, rguid)) + { + g_mouse_device = *lplpDIDevice; + } } if (!real_did_SetCooperativeLevel) From e142d0694662ef0aa176466015eb1a1b3ff6faf9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 17:59:34 +0200 Subject: [PATCH 216/557] remove invalid ExStyle --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 75e6e73..96f6d0f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1826,6 +1826,13 @@ HWND WINAPI fake_CreateWindowExA( hWndParent = g_ddraw.hwnd; } + /* A Bug's Life Action Game */ + //HIWORD(lpClassName) && _strcmpi(lpClassName, "Bugs") == 0 && + if (dwExStyle == 0x01000008) + { + dwExStyle = WS_EX_TOPMOST; + } + /* Fix for SMACKW32.DLL creating another window that steals the focus */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) { From 3a3f11afc86e5661adfcdd97043d963f74c9cd1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 18:02:15 +0200 Subject: [PATCH 217/557] return S_OK in IDirect3DX__EnumDevices --- src/IDirect3D/IDirect3D.c | 2 +- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/IDirect3D/IDirect3D7.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 0aaa1e8..f6b075e 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -54,7 +54,7 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 50ae5ec..c387d2a 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 9cc65bd..72429c8 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 5d64fc6..35aa353 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -46,7 +46,7 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); - HRESULT ret = E_FAIL; + HRESULT ret = S_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From a8aeee1bc3b66fbac9b7006ee4d6500a904cc30f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 18:06:53 +0200 Subject: [PATCH 218/557] add preset for A Bug's Life Action Game --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 1656c95..7aebc2d 100644 --- a/src/config.c +++ b/src/config.c @@ -483,6 +483,10 @@ static void cfg_create_ini() "hook_peekmessage=true\n" "maxgameticks=60\n" "\n" + "; A Bug's Life Action Game\n" + "[bugs]\n" + "fix_not_responding=true\n" + "\n" "; Barney - Secret of the Rainbow\n" "[Barney]\n" "adjmouse=false\n" From 5d527ca8e060e8c23b0c318119b0f9fd1f3bb7de Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:33:01 +0200 Subject: [PATCH 219/557] make sure the close button is enabled --- src/dd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index fb2fa5b..3d160e6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1025,7 +1025,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } - //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) @@ -1057,6 +1057,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.hwnd, GWL_STYLE, (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); + + DWORD class_sytle = GetClassLongA(g_ddraw.hwnd, GCL_STYLE); + if (class_sytle & CS_NOCLOSE) + { + SetClassLongA(g_ddraw.hwnd, GCL_STYLE, class_sytle & ~CS_NOCLOSE); + } } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From 7fe9f3f2fa5807108b2a6b2c0c4d5f0f33355810 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:37:24 +0200 Subject: [PATCH 220/557] disable debug code --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3d160e6..9aa286f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1025,7 +1025,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.opengl_y_align = 0; } - dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) From 66e8d1676ffa7a2e274b81db677b4a852b157c9f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Sep 2024 21:52:06 +0200 Subject: [PATCH 221/557] make sure we don't reset last_msg_pull_tick --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 9aa286f..b6d94a6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1031,7 +1031,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) SetMenu(g_ddraw.hwnd, NULL); - if (g_ddraw.last_msg_pull_tick && + if (!g_config.fix_not_responding && + g_ddraw.last_msg_pull_tick && g_ddraw.last_msg_pull_tick + 1000 < timeGetTime() && GetCurrentThreadId() == g_ddraw.gui_thread_id && !IsWine()) From 6977fccdbef94c1942015f88fd446b1c6c9b6a56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 17:58:35 +0200 Subject: [PATCH 222/557] add hack for Flight Simulator 98 --- inc/config.h | 1 + src/config.c | 11 ++++++++++- src/dllmain.c | 4 ++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index ecb96aa..bdb7d9b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -103,6 +103,7 @@ typedef struct CNCDDRAWCONFIG BOOL homm_hack; BOOL carma95_hack; BOOL sirtech_hack; + BOOL flightsim98_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 7aebc2d..b8eaa73 100644 --- a/src/config.c +++ b/src/config.c @@ -113,7 +113,8 @@ void cfg_load() GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); - + GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GameHandlesClose = GameHandlesClose || g_config.infantryhack; if (g_config.lock_mouse_top_left) @@ -847,6 +848,14 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; Flight Simulator 98\n" + "[FLTSIM95]\n" + "flightsim98_hack=true\n" + "\n" + "; Flight Simulator 98\n" + "[FLTSIM98]\n" + "flightsim98_hack=true\n" + "\n" "; Fairy Tale About Father Frost, Ivan and Nastya\n" "[mrazik]\n" "guard_lines=0\n" diff --git a/src/dllmain.c b/src/dllmain.c index 90f408b..d025eaf 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -177,7 +177,7 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk HRESULT ret; - if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) { if (lplpDD) *lplpDD = NULL; @@ -222,7 +222,7 @@ HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnk HRESULT ret; - if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + if (util_caller_is_ddraw_wrapper(_ReturnAddress()) || g_config.flightsim98_hack) { if (lplpDD) *lplpDD = NULL; From 892494718a83abdfcd6f3a89ba7c887d5d10fbc7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 19:16:37 +0200 Subject: [PATCH 223/557] log BuildLabEx if available --- src/debug.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index c5f0507..5ee790e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -175,7 +175,11 @@ void dbg_init() char build[256] = { 0 }; DWORD build_size = sizeof(build); - RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) + { + build_size = sizeof(build); + RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + } TRACE("%s %s (%s)\n", name, dversion, build); From 9a308dcf1b89653c865f0c7fbce8d52acc046035 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 19:42:27 +0200 Subject: [PATCH 224/557] add timestamp to logs --- inc/utils.h | 1 + src/debug.c | 11 +++++++++++ src/dllmain.c | 1 - src/utils.c | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/inc/utils.h b/inc/utils.h index 7f7b670..c710966 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -7,6 +7,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); void util_pull_messages(); +DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); BOOL util_is_bad_read_ptr(void* p); diff --git a/src/debug.c b/src/debug.c index 5ee790e..a2f2213 100644 --- a/src/debug.c +++ b/src/debug.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -11,6 +12,8 @@ #include "version.h" #include "git.h" #include "versionhelpers.h" +#include "utils.h" +#include "dllmain.h" double g_dbg_frame_time = 0; @@ -159,6 +162,8 @@ void dbg_init() GIT_COMMIT, GIT_BRANCH); + TRACE("cnc-ddraw = %p\n", g_ddraw_module); + HKEY hkey; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); @@ -196,6 +201,12 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } + + DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); + if (timestamp) + { + TRACE("timestamp = %s", _ctime32((const long*)×tamp)); + } } } diff --git a/src/dllmain.c b/src/dllmain.c index d025eaf..3956081 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -42,7 +42,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); - TRACE("cnc-ddraw = %p\n", hDll); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif diff --git a/src/utils.c b/src/utils.c index e363c72..3f22bb7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -89,6 +89,22 @@ void util_pull_messages() } } +DWORD util_get_timestamp(HMODULE mod) +{ + if (!mod || mod == INVALID_HANDLE_VALUE) + return 0; + + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; + if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) + return 0; + + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + if (nt_headers->Signature != IMAGE_NT_SIGNATURE) + return 0; + + return nt_headers->FileHeader.TimeDateStamp; +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From ee013edd32230e7d7255df131a717751c0213de4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Sep 2024 20:11:22 +0200 Subject: [PATCH 225/557] upate GirlTalk preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index b8eaa73..deabcf0 100644 --- a/src/config.c +++ b/src/config.c @@ -940,6 +940,7 @@ static void cfg_create_ini() "; Girl Talk\n" "[GirlTalk]\n" "resolutions=2\n" + "game_handles_close=true\n" "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" From a902db06e9830a9feafda69da05c766a81722b9b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 20:45:21 +0200 Subject: [PATCH 226/557] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 9fef507..9fc7cbf 100644 --- a/inc/version.h +++ b/inc/version.h @@ -6,9 +6,9 @@ #define git_str(a) str(a) #define VERSION_MAJOR 6 -#define VERSION_MINOR 8 +#define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 3 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 3c27c903ebdaa934d6b1ed625c6c8efe26892fcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 22:16:23 +0200 Subject: [PATCH 227/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 9fc7cbf..8168d91 100644 --- a/inc/version.h +++ b/inc/version.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From c0eee0938bf51af6bc555983e903e103560db7fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Sep 2024 22:22:22 +0200 Subject: [PATCH 228/557] Update build.yml --- .github/workflows/build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ed50b00..34c8dce 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,6 @@ on: push: branches: - 'master' - - 'develop' - 'github-action' jobs: @@ -152,4 +151,4 @@ jobs: tag_name: experimental files: cnc-ddraw-experimental/* fail_on_unmatched_files: true - draft: true \ No newline at end of file + draft: true From 631e64f17af94ee3b71184c82a824a2be080ab01 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 12:45:50 +0200 Subject: [PATCH 229/557] remove obsolete code --- src/dd.c | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/src/dd.c b/src/dd.c index b6d94a6..0a89649 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1685,26 +1685,6 @@ ULONG dd_Release() if (g_ddraw.hwnd && IsWindow(g_ddraw.hwnd)) { - /* restore old window size, required for games that can switch between windowed and fullscreen during runtime */ - if (g_ddraw.width) - { - RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; - - LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - - AdjustWindowRectEx(&rc, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); - - real_SetWindowPos( - g_ddraw.hwnd, - 0, - 0, - 0, - (rc.right - rc.left), - (rc.bottom - rc.top), - SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); - } - /* restore old wndproc, subsequent ddraw creation will otherwise fail */ real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } From dc5b1c7304dbd229a4e0e4d8b89584ed0c5d57db Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 13:34:43 +0200 Subject: [PATCH 230/557] Update action.yml --- action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/action.yml b/action.yml index ca39872..f2a0b38 100644 --- a/action.yml +++ b/action.yml @@ -11,7 +11,7 @@ # uses: phobos2077/sfall@develop # with: # release-xp: true -# +# # - name: Copy sfall to mod directory # run: copy "${{ steps.sfall.outputs.release-xp }}" "my/mod/directory/ddraw.dll" # From 4d11fc38c6d95605411e73c5b31fc86c31e38c75 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Sep 2024 23:31:24 +0200 Subject: [PATCH 231/557] log timestamp in UTC --- src/debug.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index a2f2213..23afadd 100644 --- a/src/debug.c +++ b/src/debug.c @@ -205,7 +205,8 @@ void dbg_init() DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { - TRACE("timestamp = %s", _ctime32((const long*)×tamp)); + struct tm* timeinfo = _gmtime32((const long*)×tamp); + TRACE("timestamp = %s", asctime(timeinfo)); } } } From 4d0b1734dc65e8f6ec10a40c0d910d838ab55d47 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 13:27:49 +0200 Subject: [PATCH 232/557] add fallback for wndres --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f485e13..3406068 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ OBJS := $(addsuffix .o, $(basename $(SRCS))) all: $(TARGET) %.o: %.rc - $(WINDRES) -J rc $< $@ + $(WINDRES) -J rc $< $@ || windres -J rc $< $@ $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) From 9fb97bf1ca6aee1028801c4033bc7fc01a34b4ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 13:28:46 +0200 Subject: [PATCH 233/557] fix warning --- src/debug.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/debug.c b/src/debug.c index 23afadd..f89b924 100644 --- a/src/debug.c +++ b/src/debug.c @@ -205,8 +205,7 @@ void dbg_init() DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { - struct tm* timeinfo = _gmtime32((const long*)×tamp); - TRACE("timestamp = %s", asctime(timeinfo)); + TRACE("timestamp = %s", asctime(_gmtime32((const long*)×tamp))); } } } From db9cfb8e29e56b5e3f8cab687b228597e17d8460 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 15:21:32 +0200 Subject: [PATCH 234/557] add crc32 to logs --- inc/utils.h | 1 + src/debug.c | 2 ++ src/utils.c | 30 ++++++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/inc/utils.h b/inc/utils.h index c710966..9f7f0ee 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -7,6 +7,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); void util_pull_messages(); +unsigned long util_get_crc32(char* filename); DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); diff --git a/src/debug.c b/src/debug.c index f89b924..96b1b25 100644 --- a/src/debug.c +++ b/src/debug.c @@ -202,6 +202,8 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } + TRACE("crc32 = %08X\n", util_get_crc32(exe_path)); + DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) { diff --git a/src/utils.c b/src/utils.c index 3f22bb7..fd8a524 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,5 +1,6 @@ #include #include +#include #include #include "ddraw.h" #include "debug.h" @@ -11,6 +12,7 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" +#include "crc32.h" /* @@ -105,6 +107,34 @@ DWORD util_get_timestamp(HMODULE mod) return nt_headers->FileHeader.TimeDateStamp; } +unsigned long util_get_crc32(char* filename) +{ + if (!filename) + return 0; + + unsigned long crc32 = 0; + + FILE* fp = fopen(filename, "rb"); + if (fp) + { + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp));) + { + if (ferror(fp)) + { + crc32 = 0; + break; + } + + crc32 = Crc32_ComputeBuf(crc32, buf, s); + } + + fclose(fp); + } + + return crc32; +} + FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From 7febf01343b17507c815f78aa5f33d3725a09c42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Sep 2024 15:35:13 +0200 Subject: [PATCH 235/557] tweak get_crc32 function --- src/utils.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index fd8a524..f057a4e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -118,17 +118,14 @@ unsigned long util_get_crc32(char* filename) if (fp) { char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp));) + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) { - if (ferror(fp)) - { - crc32 = 0; - break; - } - crc32 = Crc32_ComputeBuf(crc32, buf, s); } + if (ferror(fp)) + crc32 = 0; + fclose(fp); } From e0e59cd9fa90d59ea1308d2eae321b394750ec0d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Sep 2024 20:17:53 +0200 Subject: [PATCH 236/557] add testing code for privileged instructions --- inc/config.h | 1 + src/config.c | 2 + src/debug.c | 169 +++++++++++++++++++++++++++++++++++++------------- src/dllmain.c | 9 ++- 4 files changed, 135 insertions(+), 46 deletions(-) diff --git a/inc/config.h b/inc/config.h index bdb7d9b..966d4fd 100644 --- a/inc/config.h +++ b/inc/config.h @@ -64,6 +64,7 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; + BOOL ignore_exceptions; BOOL wine_allow_resize; int guard_lines; int max_resolutions; diff --git a/src/config.c b/src/config.c index deabcf0..05b19ef 100644 --- a/src/config.c +++ b/src/config.c @@ -77,6 +77,7 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); + GET_BOOL(g_config.ignore_exceptions, "ignore_exceptions", FALSE); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); @@ -309,6 +310,7 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" + "ignore_exceptions=false\n" "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" diff --git a/src/debug.c b/src/debug.c index 96b1b25..47229cd 100644 --- a/src/debug.c +++ b/src/debug.c @@ -14,6 +14,8 @@ #include "versionhelpers.h" #include "utils.h" #include "dllmain.h" +#include "config.h" +#include "patch.h" double g_dbg_frame_time = 0; @@ -35,59 +37,98 @@ static int g_dbg_crash_count = 0; LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { - g_dbg_crash_count++; - - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); - - if (dmp != INVALID_HANDLE_VALUE) + if (!exception || !exception->ExceptionRecord) { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + if (g_dbg_exception_filter) + return g_dbg_exception_filter(exception); - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); - - CloseHandle(dmp); + return EXCEPTION_EXECUTE_HANDLER; } - if (exception && exception->ExceptionRecord) + if (exception->ExceptionRecord->ExceptionCode != STATUS_PRIVILEGED_INSTRUCTION || !g_config.ignore_exceptions) { - HMODULE mod = NULL; - char filename[MAX_PATH] = { 0 }; + g_dbg_crash_count++; + + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); + + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); + } + } + + HMODULE mod = NULL; + char filename[MAX_PATH] = { 0 }; #if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ - if (GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - exception->ExceptionRecord->ExceptionAddress, - &mod)) - { - GetModuleFileNameA(mod, filename, sizeof(filename) - 1); - } + if (GetModuleHandleExA( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + exception->ExceptionRecord->ExceptionAddress, + &mod)) + { + GetModuleFileNameA(mod, filename, sizeof(filename) - 1); + } #endif - TRACE( - "Exception at %p (%p+%p), Code=%08X - %s\n", - exception->ExceptionRecord->ExceptionAddress, - mod, - (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, - exception->ExceptionRecord->ExceptionCode, - filename); + TRACE( + "Exception at %p (%p+%p), Code=%08X - %s\n", + exception->ExceptionRecord->ExceptionAddress, + mod, + (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, + exception->ExceptionRecord->ExceptionCode, + filename); + + if (g_config.ignore_exceptions && + exception->ContextRecord && + exception->ExceptionRecord->ExceptionAddress && + exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) + { + size_t size = 0; + BYTE* addr = exception->ExceptionRecord->ExceptionAddress; + switch (*addr) + { + case 0xE4: // IN ib + case 0xE5: // IN id + case 0xE6: // OUT ib + case 0xE7: // OUT ib + size = 2; + break; + case 0xEC: // IN ib + case 0xED: // IN id + case 0xEE: // OUT + case 0xEF: // OUT + size = 1; + break; + } + + if (size) + { + exception->ContextRecord->Eip += size; + patch_clear((void*)addr, 0x90, (char*)addr + size); + return EXCEPTION_CONTINUE_EXECUTION; + } } if (g_dbg_exception_filter) @@ -111,6 +152,46 @@ void __cdecl dbg_invoke_watson( TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); } +#else +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) +{ + if (exception && + exception->ContextRecord && + exception->ExceptionRecord && + exception->ExceptionRecord->ExceptionAddress && + exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) + { + size_t size = 0; + BYTE* addr = exception->ExceptionRecord->ExceptionAddress; + switch (*addr) + { + case 0xE4: // IN ib + case 0xE5: // IN id + case 0xE6: // OUT ib + case 0xE7: // OUT ib + size = 2; + break; + case 0xEC: // IN ib + case 0xED: // IN id + case 0xEE: // OUT + case 0xEF: // OUT + size = 1; + break; + } + + if (size) + { + exception->ContextRecord->Eip += size; + patch_clear((void*)addr, 0x90, (char*)addr + size); + return EXCEPTION_CONTINUE_EXECUTION; + } + } + + if (g_dbg_exception_filter) + return g_dbg_exception_filter(exception); + + return EXCEPTION_EXECUTE_HANDLER; +} #endif void dbg_init() diff --git a/src/dllmain.c b/src/dllmain.c index 3956081..691db28 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -43,9 +43,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); -#endif - cfg_load(); +#else + cfg_load(); + if (g_config.ignore_exceptions) + { + g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + } +#endif char buf[1024]; From 80b8a996a74b61c4fc82f0e519ae0cbeb3218761 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Sep 2024 23:36:11 +0200 Subject: [PATCH 237/557] tweak exception handler --- inc/debug.h | 2 + src/debug.c | 143 ++++++++++++++++++-------------------------------- src/dllmain.c | 13 +++-- 3 files changed, 61 insertions(+), 97 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index be19a05..c0372f1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -6,6 +6,7 @@ #include LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); +LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); @@ -33,6 +34,7 @@ void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, u extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +extern PVOID g_dbg_exception_handle; #if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ #undef _ReturnAddress diff --git a/src/debug.c b/src/debug.c index 47229cd..cff87d3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -15,12 +15,12 @@ #include "utils.h" #include "dllmain.h" #include "config.h" -#include "patch.h" double g_dbg_frame_time = 0; DWORD g_dbg_frame_count = 0; LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +PVOID g_dbg_exception_handle; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; @@ -37,98 +37,59 @@ static int g_dbg_crash_count = 0; LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { - if (!exception || !exception->ExceptionRecord) - { - if (g_dbg_exception_filter) - return g_dbg_exception_filter(exception); + g_dbg_crash_count++; - return EXCEPTION_EXECUTE_HANDLER; + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); + + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); } - if (exception->ExceptionRecord->ExceptionCode != STATUS_PRIVILEGED_INSTRUCTION || !g_config.ignore_exceptions) + if (exception && exception->ExceptionRecord) { - g_dbg_crash_count++; - - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); - - if (dmp != INVALID_HANDLE_VALUE) - { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; - - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); - - CloseHandle(dmp); - } - } - - HMODULE mod = NULL; - char filename[MAX_PATH] = { 0 }; + HMODULE mod = NULL; + char filename[MAX_PATH] = { 0 }; #if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ - if (GetModuleHandleExA( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, - exception->ExceptionRecord->ExceptionAddress, - &mod)) - { - GetModuleFileNameA(mod, filename, sizeof(filename) - 1); - } + if (GetModuleHandleExA( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, + exception->ExceptionRecord->ExceptionAddress, + &mod)) + { + GetModuleFileNameA(mod, filename, sizeof(filename) - 1); + } #endif - TRACE( - "Exception at %p (%p+%p), Code=%08X - %s\n", - exception->ExceptionRecord->ExceptionAddress, - mod, - (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, - exception->ExceptionRecord->ExceptionCode, - filename); - - if (g_config.ignore_exceptions && - exception->ContextRecord && - exception->ExceptionRecord->ExceptionAddress && - exception->ExceptionRecord->ExceptionCode == STATUS_PRIVILEGED_INSTRUCTION) - { - size_t size = 0; - BYTE* addr = exception->ExceptionRecord->ExceptionAddress; - switch (*addr) - { - case 0xE4: // IN ib - case 0xE5: // IN id - case 0xE6: // OUT ib - case 0xE7: // OUT ib - size = 2; - break; - case 0xEC: // IN ib - case 0xED: // IN id - case 0xEE: // OUT - case 0xEF: // OUT - size = 1; - break; - } - - if (size) - { - exception->ContextRecord->Eip += size; - patch_clear((void*)addr, 0x90, (char*)addr + size); - return EXCEPTION_CONTINUE_EXECUTION; - } + TRACE( + "Exception at %p (%p+%p), Code=%08X - %s\n", + exception->ExceptionRecord->ExceptionAddress, + mod, + (int)exception->ExceptionRecord->ExceptionAddress - (int)mod, + exception->ExceptionRecord->ExceptionCode, + filename); } if (g_dbg_exception_filter) @@ -152,8 +113,9 @@ void __cdecl dbg_invoke_watson( TerminateProcess(GetCurrentProcess(), STATUS_INVALID_CRUNTIME_PARAMETER); } -#else -LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) +#endif + +LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception) { if (exception && exception->ContextRecord && @@ -182,17 +144,12 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) if (size) { exception->ContextRecord->Eip += size; - patch_clear((void*)addr, 0x90, (char*)addr + size); return EXCEPTION_CONTINUE_EXECUTION; } } - if (g_dbg_exception_filter) - return g_dbg_exception_filter(exception); - - return EXCEPTION_EXECUTE_HANDLER; + return EXCEPTION_CONTINUE_SEARCH; } -#endif void dbg_init() { diff --git a/src/dllmain.c b/src/dllmain.c index 691db28..6898e6c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -43,14 +43,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #ifdef _DEBUG dbg_init(); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); +#endif + cfg_load(); -#else - cfg_load(); + if (g_config.ignore_exceptions) { - g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); + g_dbg_exception_handle = + AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } -#endif char buf[1024]; @@ -147,6 +148,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); + + if (g_dbg_exception_handle) + RemoveVectoredExceptionHandler(g_dbg_exception_handle); + break; } } From 577f47332788e30e16a02fba2f3db02ef939ff3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:47:12 +0200 Subject: [PATCH 238/557] remove ignore_exceptions setting --- inc/config.h | 1 - src/config.c | 2 -- src/dllmain.c | 7 +------ 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/inc/config.h b/inc/config.h index 966d4fd..bdb7d9b 100644 --- a/inc/config.h +++ b/inc/config.h @@ -64,7 +64,6 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; - BOOL ignore_exceptions; BOOL wine_allow_resize; int guard_lines; int max_resolutions; diff --git a/src/config.c b/src/config.c index 05b19ef..deabcf0 100644 --- a/src/config.c +++ b/src/config.c @@ -77,7 +77,6 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); - GET_BOOL(g_config.ignore_exceptions, "ignore_exceptions", FALSE); GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); @@ -310,7 +309,6 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" - "ignore_exceptions=false\n" "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" diff --git a/src/dllmain.c b/src/dllmain.c index 6898e6c..429fbf3 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,12 +46,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); - - if (g_config.ignore_exceptions) - { - g_dbg_exception_handle = - AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); - } + g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); char buf[1024]; From 8d3baea228e935ca24055a46054c4009b0c22738 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:48:53 +0200 Subject: [PATCH 239/557] fix long line --- src/dllmain.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 429fbf3..fd1846c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,7 +46,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); - g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + g_dbg_exception_handle = + AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); char buf[1024]; From 6eeef95998777ab3c8727ac44ae252e9dc9aa71b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:49:06 +0200 Subject: [PATCH 240/557] add space --- src/dllmain.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dllmain.c b/src/dllmain.c index fd1846c..ed3e705 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -46,6 +46,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif cfg_load(); + g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); From f6b92bb80feff2173992fcabb3a041d127c993e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Sep 2024 16:55:34 +0200 Subject: [PATCH 241/557] add preset for Balls of Steel v1.2 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index cc6f69c..679daad 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Atlantis: The Lost Tales - Atomic Bomberman - Atrox +- Balls of Steel v1.2 - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 diff --git a/src/config.c b/src/config.c index deabcf0..8ec4c85 100644 --- a/src/config.c +++ b/src/config.c @@ -502,6 +502,10 @@ static void cfg_create_ini() "[BGMain]\n" "resolutions=2\n" "\n" + "; Balls of Steel v1.2\n" + "[bos]\n" + "win_version=95\n" + "\n" "; BALDR FORCE EXE\n" "[BaldrForce]\n" "noactivateapp=true\n" From 57287686dbf782c431a5da309d4d70be7a5428ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Sep 2024 19:55:06 +0200 Subject: [PATCH 242/557] add new "center_window" setting --- inc/config.h | 1 + inc/dd.h | 4 ++++ src/config.c | 5 +++++ src/dd.c | 9 +++++++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index bdb7d9b..168c54d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -42,6 +42,7 @@ typedef struct CNCDDRAWCONFIG int d3d9_filter; int anti_aliased_fonts_min_size; int min_font_size; + int center_window; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; diff --git a/inc/dd.h b/inc/dd.h index e5904bb..36f1ca6 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -52,6 +52,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_BLTFAST 2 #define LIMIT_UNLOCK 3 +#define CENTER_WINDOW_NEVER 0 +#define CENTER_WINDOW_AUTO 1 +#define CENTER_WINDOW_ALWAYS 2 + #ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 #endif diff --git a/src/config.c b/src/config.c index 8ec4c85..0ea4a2f 100644 --- a/src/config.c +++ b/src/config.c @@ -54,6 +54,7 @@ void cfg_load() GET_INT(g_config.d3d9_filter, "d3d9_filter", FILTER_CUBIC); GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_INT(g_config.min_font_size, "min_font_size", 0); + GET_INT(g_config.center_window, "center_window", CENTER_WINDOW_AUTO); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -250,6 +251,10 @@ static void cfg_create_ini() "; Raise the size of small fonts to X\n" "min_font_size=0\n" "\n" + "; Center window to screen when game changes the display resolution\n" + "; Possible values: 0 = never center, 1 = automatic, 2 = always center\n" + "center_window=1\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" diff --git a/src/dd.c b/src/dd.c index 0a89649..4ff0789 100644 --- a/src/dd.c +++ b/src/dd.c @@ -710,9 +710,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.height = g_config.window_rect.bottom; /* temporary fix: center window for games that keep changing their resolution */ - if ((g_ddraw.width || g_config.infantryhack) && + if (g_config.center_window && + (g_ddraw.width || g_config.infantryhack || g_config.center_window == CENTER_WINDOW_ALWAYS) && (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && - (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) + ( + dwWidth > g_config.window_rect.right || + dwHeight > g_config.window_rect.bottom || + g_config.center_window == CENTER_WINDOW_ALWAYS) + ) { g_config.window_rect.left = -32000; g_config.window_rect.top = -32000; From b57ec635fcb93f6ac2eef9d920da093b1f9c39a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Sep 2024 18:11:07 +0200 Subject: [PATCH 243/557] fix opengl renderer on older hardware --- src/opengl_utils.c | 18 +++++++++++++----- src/render_ogl.c | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 8222f10..8062fdd 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -231,20 +231,28 @@ void oglu_init() BOOL oglu_ext_exists(char* ext, HDC hdc) { + BOOL got_num_extensions = FALSE; + if (glGetIntegerv && glGetStringi) { GLint n = 0; glGetIntegerv(GL_NUM_EXTENSIONS, &n); - for (GLint i = 0; i < n; i++) + if (glGetError() == GL_NO_ERROR) { - char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + got_num_extensions = TRUE; - if (glext && strcmp(glext, ext) == 0) - return TRUE; + for (GLint i = 0; i < n; i++) + { + char* glext = (char*)glGetStringi(GL_EXTENSIONS, i); + + if (glext && strcmp(glext, ext) == 0) + return TRUE; + } } } - else + + if (!got_num_extensions) { char* glext = (char*)glGetString(GL_EXTENSIONS); diff --git a/src/render_ogl.c b/src/render_ogl.c index be0793e..efde47f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -111,6 +111,8 @@ DWORD WINAPI ogl_render_main(void) { GL_CHECK(oglu_init()); + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + BOOL got_swap_ctrl; GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); From 40464b18fc0df0a47cf2fb3eab3d6e68d38a296f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 17:04:54 +0200 Subject: [PATCH 244/557] remove outdated presets --- src/config.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/config.c b/src/config.c index 0ea4a2f..6b25434 100644 --- a/src/config.c +++ b/src/config.c @@ -1260,10 +1260,6 @@ static void cfg_create_ini() "[Pajama3]\n" "renderer=gdi\n" "\n" - "; Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm)\n" - "[PajamaLRS]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Pajama Sam's One-Stop Fun Shop\n" "[SamsFunShop]\n" "renderer=gdi\n" @@ -1317,10 +1313,6 @@ static void cfg_create_ini() "[puttputtjtc]\n" "renderer=gdi\n" "\n" - "; Putt-Putt: Pep's Birthday Surprise\n" - "[PuttsFunShop]\n" - "keytogglefullscreen=0x08\n" - "\n" "; Pizza Syndicate\n" "[Pizza2]\n" "renderer=opengl\n" From 7175939854e1d84030d7d7efb004b784aaa2b9d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 18:22:08 +0200 Subject: [PATCH 245/557] don't use W functions --- src/dllmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ed3e705..6ab24f4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -34,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) verhelp_init(); - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { cfg_load(); return TRUE; @@ -133,7 +133,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_PROCESS_DETACH: { - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) return TRUE; TRACE("cnc-ddraw DLL_PROCESS_DETACH\n"); From beae3c5fb796f50164cd83082cb27fff899bf43b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 19:20:50 +0200 Subject: [PATCH 246/557] properly target windows 2000 in mingw build + allows to build for windows ME now as well --- Makefile | 23 ++++++++++++++--------- build.cmd | 2 +- build_debug.cmd | 2 +- inc/dd.h | 12 ++++++++++++ inc/versionhelpers.h | 5 +++++ src/debug.c | 2 +- 6 files changed, 34 insertions(+), 12 deletions(-) diff --git a/Makefile b/Makefile index 3406068..6ce2b4c 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,16 @@ -include config.mk -TARGET = ddraw.dll -LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared -CFLAGS = -Iinc -O2 -march=i486 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 +TARGET ?= ddraw.dll + +LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared +CFLAGS ?= -Iinc -O2 -Wall -std=c99 +LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -lMsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) -CMDTEST := $(shell echo \"\") -ifeq ($(CMDTEST),\"\") +ECHOTEST := $(shell echo \"\") +ifeq ($(ECHOTEST),\"\") # Windows HASH := \# ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) @@ -20,13 +21,17 @@ else EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif -CC = i686-w64-mingw32-gcc -WINDRES ?= i686-w64-mingw32-windres - ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif +ifdef _WIN32_WINNT + CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT) +endif + +CC = i686-w64-mingw32-gcc +WINDRES ?= i686-w64-mingw32-windres + SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) res.rc OBJS := $(addsuffix .o, $(basename $(SRCS))) diff --git a/build.cmd b/build.cmd index 34bb56c..0348c73 100644 --- a/build.cmd +++ b/build.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make +make _WIN32_WINNT=0x0500 pause diff --git a/build_debug.cmd b/build_debug.cmd index 755ec1f..154ceb2 100644 --- a/build_debug.cmd +++ b/build_debug.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make DEBUG=1 +make DEBUG=1 _WIN32_WINNT=0x0500 pause diff --git a/inc/dd.h b/inc/dd.h index 36f1ca6..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -64,6 +64,18 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 #endif +#ifndef GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT +#define GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 0x00000002 +#endif + +#ifndef GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS +#define GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 0x00000004 +#endif + +#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) +#define GdiTransparentBlt TransparentBlt +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 8a59f74..bf622e6 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -28,6 +28,11 @@ #define _WIN32_WINNT_WIN11 0x0A00 #endif +#if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) +#define RtlVerifyVersionInfo(a,b,c) 1 +#define VerifyVersionInfoW(a,b,c) 0 +#define VerSetConditionMask(a,b,c) 0 +#endif void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); diff --git a/src/debug.c b/src/debug.c index cff87d3..8d4ba5b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -73,7 +73,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; -#if defined(_MSC_VER) /* comment this out just to keep the mingw build win2000 compatible */ +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) if (GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, From 8b211a73d77a0bcf34241101fac90f0525ab407c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 19:57:11 +0200 Subject: [PATCH 247/557] add checks for windows ME build --- src/dllmain.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index 6ab24f4..04b4ea9 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,8 +47,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); +#endif char buf[1024]; @@ -146,8 +148,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) if (g_dbg_exception_handle) RemoveVectoredExceptionHandler(g_dbg_exception_handle); +#endif break; } From 9bea18d0387e05914f603c3bb51ce7f52a7abcf0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:04:36 +0200 Subject: [PATCH 248/557] fix debug build for win2000 --- inc/wndproc.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 43a1e8e..4d36cb3 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -16,6 +16,10 @@ #define CNC_DDRAW_SET_FULLSCREEN 1 #define CNC_DDRAW_SET_WINDOWED 2 +#ifndef WM_UNICHAR +#define WM_UNICHAR 0x0109 +#endif + LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif From 14020a3d319450a216a15e37b212211b7be1d7cd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:28:33 +0200 Subject: [PATCH 249/557] don't create dmp file on windows ME builds --- src/debug.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/debug.c b/src/debug.c index 8d4ba5b..5c0c9f4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,6 +39,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) HANDLE dmp = CreateFile( g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, @@ -67,6 +68,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) CloseHandle(dmp); } +#endif if (exception && exception->ExceptionRecord) { From 401c9f0e378de6ed74164ef307bd7485562ed29e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:29:09 +0200 Subject: [PATCH 250/557] fix CreateThread bug on windows ME --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 4ff0789..981f986 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1338,7 +1338,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, NULL); + DWORD tid; + g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, &tid); SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } From 1821c3a15dc74289037d3260a4566262a41d9c47 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:30:27 +0200 Subject: [PATCH 251/557] use AddVectoredExceptionHandler only on XP and above --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 04b4ea9..111fae4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,7 +47,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) g_dbg_exception_handle = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); #endif From 9d43cc31f23011bf05a875afc2cb657cae9b3337 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 20:30:50 +0200 Subject: [PATCH 252/557] fix for last commit --- src/dllmain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index 111fae4..f9784b2 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -148,7 +148,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) if (g_dbg_exception_handle) RemoveVectoredExceptionHandler(g_dbg_exception_handle); #endif From 561f2ba614204a224cf36c3cdcd370bffe1e71d0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 21:22:45 +0200 Subject: [PATCH 253/557] improve legacy build --- src/dllmain.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index f9784b2..49595b8 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -47,10 +47,14 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - g_dbg_exception_handle = - AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); -#endif + PVOID(WINAPI * add_handler)(ULONG, PVECTORED_EXCEPTION_HANDLER) = + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "AddVectoredExceptionHandler"); + + if (add_handler) + { + g_dbg_exception_handle = + add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + } char buf[1024]; @@ -148,10 +152,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - if (g_dbg_exception_handle) - RemoveVectoredExceptionHandler(g_dbg_exception_handle); -#endif + ULONG(WINAPI* remove_handler)(PVOID) = + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); + + if (g_dbg_exception_handle && remove_handler) + remove_handler(g_dbg_exception_handle); break; } From 1017b235a41b843fef4a936c966babe9812f1c8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 21:29:12 +0200 Subject: [PATCH 254/557] align --- src/dllmain.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 49595b8..701a79e 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -52,8 +52,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (add_handler) { - g_dbg_exception_handle = - add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); + g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } char buf[1024]; From 6f4339f16aff49bb327ad6d8ba49da1db704f938 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 22:07:33 +0200 Subject: [PATCH 255/557] fix versionhelpers for legacy build --- inc/versionhelpers.h | 11 +++++------ src/versionhelpers.c | 13 +++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index bf622e6..7191349 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -29,13 +29,12 @@ #endif #if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) -#define RtlVerifyVersionInfo(a,b,c) 1 #define VerifyVersionInfoW(a,b,c) 0 -#define VerSetConditionMask(a,b,c) 0 #endif void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); +ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); const char* verhelp_wine_get_version(); void verhelp_wine_get_host_version(const char** sysname, const char** release); @@ -43,7 +42,7 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -54,7 +53,7 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -65,7 +64,7 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -134,7 +133,7 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } VERSIONHELPERAPI IsWindowsXP(void) { diff --git a/src/versionhelpers.c b/src/versionhelpers.c index e422e90..7c19528 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -2,10 +2,12 @@ #include "versionhelpers.h" typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +static VERSETCONDITIONMASKPROC VerSetConditionMaskProc; static WINE_GET_VERSIONPROC wine_get_version; static WINE_GET_HOST_VERSIONPROC wine_get_host_version; @@ -19,6 +21,12 @@ void verhelp_init() wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); } + + mod = GetModuleHandleA("Kernel32.dll"); + if (mod) + { + VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + } } BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) @@ -28,6 +36,11 @@ BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, U VerifyVersionInfoW(versionInfo, typeMask, conditionMask); } +ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition) +{ + return VerSetConditionMaskProc ? VerSetConditionMaskProc(ConditionMask, TypeMask, Condition) : 0; +} + const char* verhelp_wine_get_version() { return wine_get_version ? wine_get_version() : NULL; From da99931f8cb82cb19e33aac184f2aaa2a896eca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Sep 2024 22:14:27 +0200 Subject: [PATCH 256/557] target windows 9X by default --- build.cmd | 2 +- build_debug.cmd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 0348c73..801abe4 100644 --- a/build.cmd +++ b/build.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make _WIN32_WINNT=0x0500 +make _WIN32_WINNT=0x0400 pause diff --git a/build_debug.cmd b/build_debug.cmd index 154ceb2..4e43145 100644 --- a/build_debug.cmd +++ b/build_debug.cmd @@ -10,6 +10,6 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% make clean -make DEBUG=1 _WIN32_WINNT=0x0500 +make DEBUG=1 _WIN32_WINNT=0x0400 pause From 5336f7d1ece2b4e3685272bc83ddb3ab8ef80593 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 02:27:14 +0200 Subject: [PATCH 257/557] make sure we don't get a blackscreen if device doesn't support StretchDIBits --- src/render_gdi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 5ad3586..c7292ed 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -99,14 +99,17 @@ DWORD WINAPI gdi_render_main(void) FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } + int lines_copied = 0; + if (g_ddraw.bnet_active) { RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + lines_copied = 1; } else if (upscale_hack) { - real_StretchDIBits( + lines_copied = real_StretchDIBits( g_ddraw.render.hdc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y, @@ -124,7 +127,7 @@ DWORD WINAPI gdi_render_main(void) else if (!g_ddraw.child_window_exists && (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) { - real_StretchDIBits( + lines_copied = real_StretchDIBits( g_ddraw.render.hdc, g_ddraw.render.viewport.x, g_ddraw.render.viewport.y, @@ -139,7 +142,8 @@ DWORD WINAPI gdi_render_main(void) DIB_RGB_COLORS, SRCCOPY); } - else + + if (lines_copied == 0 || lines_copied == GDI_ERROR) { real_SetDIBitsToDevice( g_ddraw.render.hdc, From d680af0a4a36aab511acf35db5b217a7dbf67d4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 17:09:24 +0200 Subject: [PATCH 258/557] dynamically load Dbghelp.dll --- Makefile | 2 +- cnc-ddraw.vcxproj | 6 ++--- src/debug.c | 69 ++++++++++++++++++++++++++++------------------- 3 files changed, 45 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 6ce2b4c..08d74da 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 -lMsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 992cb3e..70bd817 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -222,7 +222,7 @@ Windows - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -348,7 +348,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -390,7 +390,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def diff --git a/src/debug.c b/src/debug.c index 5c0c9f4..a8202f8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -39,51 +39,64 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; -#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) - HANDLE dmp = - CreateFile( - g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_WRITE | FILE_SHARE_READ, - 0, - CREATE_ALWAYS, - 0, - 0); + BOOL(WINAPI * MiniDumpWriteDumpProc)( + HANDLE, + DWORD, + HANDLE, + MINIDUMP_TYPE, + PMINIDUMP_EXCEPTION_INFORMATION, + PMINIDUMP_USER_STREAM_INFORMATION, + PMINIDUMP_CALLBACK_INFORMATION + ); - if (dmp != INVALID_HANDLE_VALUE) + MiniDumpWriteDumpProc = (void*)real_GetProcAddress(real_LoadLibraryA("Dbghelp.dll"), "MiniDumpWriteDump"); + if (MiniDumpWriteDumpProc) { - MINIDUMP_EXCEPTION_INFORMATION info; - info.ThreadId = GetCurrentThreadId(); - info.ExceptionPointers = exception; - info.ClientPointers = TRUE; + HANDLE dmp = + CreateFile( + g_dbg_crash_count == 1 ? g_dbg_dmp_path1 : g_dbg_dmp_path2, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); - MiniDumpWriteDump( - GetCurrentProcess(), - GetCurrentProcessId(), - dmp, - 0, - &info, - NULL, - NULL); + if (dmp != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; - CloseHandle(dmp); + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + CloseHandle(dmp); + } } -#endif if (exception && exception->ExceptionRecord) { HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; -#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) - if (GetModuleHandleExA( + BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = + (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); + + if (getModuleHandleExA && getModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, &mod)) { GetModuleFileNameA(mod, filename, sizeof(filename) - 1); } -#endif TRACE( "Exception at %p (%p+%p), Code=%08X - %s\n", From d3dbab102f9278f29be86abddc6a2424ce1a2f74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 17:28:34 +0200 Subject: [PATCH 259/557] fix for last commit --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index a8202f8..5f972c5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -69,7 +69,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) info.ExceptionPointers = exception; info.ClientPointers = TRUE; - MiniDumpWriteDump( + MiniDumpWriteDumpProc( GetCurrentProcess(), GetCurrentProcessId(), dmp, From cd3a52363b683f6d5824a23e92f8745c306e9554 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 21:03:12 +0200 Subject: [PATCH 260/557] improve win version logging --- src/debug.c | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/debug.c b/src/debug.c index 5f972c5..4b31a9b 100644 --- a/src/debug.c +++ b/src/debug.c @@ -217,33 +217,45 @@ void dbg_init() TRACE("cnc-ddraw = %p\n", g_ddraw_module); - HKEY hkey; + HKEY hkey = NULL; LONG status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0L, KEY_READ, &hkey); + HKEY hkey9x = NULL; + LONG status9x = + RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x); + if (status == ERROR_SUCCESS) { char name[256] = { 0 }; DWORD name_size = sizeof(name); - RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size); + if (RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS && hkey9x) + { + RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size); + } - char dversion[256] = { 0 }; - DWORD dversion_size = sizeof(dversion); - RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&dversion, &dversion_size); + char vers[256] = { 0 }; + DWORD vers_size = sizeof(vers); + if (RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS && hkey9x) + { + RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); + } char build[256] = { 0 }; DWORD build_size = sizeof(build); if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) { - build_size = sizeof(build); RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); } - TRACE("%s %s (%s)\n", name, dversion, build); + TRACE("%s %s (%s)\n", name, vers, build); RegCloseKey(hkey); } + if (status9x == ERROR_SUCCESS) + RegCloseKey(hkey9x); + if (IsWine()) { TRACE("Wine version = %s\n", verhelp_wine_get_version()); From c479cc20a5f66b862e2088826e8c90baa004a855 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 21:27:55 +0200 Subject: [PATCH 261/557] some more tweaks to logs --- src/debug.c | 59 +++++++++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/src/debug.c b/src/debug.c index 4b31a9b..67ef352 100644 --- a/src/debug.c +++ b/src/debug.c @@ -207,11 +207,11 @@ void dbg_init() } TRACE( - "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", - VERSION_MAJOR, - VERSION_MINOR, - VERSION_BUILD, - VERSION_REVISION, + "cnc-ddraw version = %d.%d.%d.%d (git~%s, %s)\n", + VERSION_MAJOR, + VERSION_MINOR, + VERSION_BUILD, + VERSION_REVISION, GIT_COMMIT, GIT_BRANCH); @@ -225,34 +225,35 @@ void dbg_init() LONG status9x = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion", 0L, KEY_READ, &hkey9x); - if (status == ERROR_SUCCESS) + char name[256] = { 0 }; + DWORD name_size = sizeof(name); + if (status || RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS) { - char name[256] = { 0 }; - DWORD name_size = sizeof(name); - if (RegQueryValueExA(hkey, "ProductName", NULL, NULL, (PVOID)&name, &name_size) != ERROR_SUCCESS && hkey9x) - { + if (status9x == ERROR_SUCCESS) RegQueryValueExA(hkey9x, "ProductName", NULL, NULL, (PVOID)&name, &name_size); - } - - char vers[256] = { 0 }; - DWORD vers_size = sizeof(vers); - if (RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS && hkey9x) - { - RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); - } - - char build[256] = { 0 }; - DWORD build_size = sizeof(build); - if (RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) - { - RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); - } - - TRACE("%s %s (%s)\n", name, vers, build); - - RegCloseKey(hkey); } + char vers[256] = { 0 }; + DWORD vers_size = sizeof(vers); + if (status || RegQueryValueExA(hkey, "DisplayVersion", NULL, NULL, (PVOID)&vers, &vers_size) != ERROR_SUCCESS) + { + if (status9x == ERROR_SUCCESS) + RegQueryValueExA(hkey9x, "VersionNumber", NULL, NULL, (PVOID)&vers, &vers_size); + } + + char build[256] = { 0 }; + DWORD build_size = sizeof(build); + if (status || RegQueryValueExA(hkey, "BuildLabEx", NULL, NULL, (PVOID)&build, &build_size) != ERROR_SUCCESS) + { + if (status == ERROR_SUCCESS) + RegQueryValueExA(hkey, "BuildLab", NULL, NULL, (PVOID)&build, &build_size); + } + + TRACE("%s %s (%s)\n", name, vers, build); + + if (status == ERROR_SUCCESS) + RegCloseKey(hkey); + if (status9x == ERROR_SUCCESS) RegCloseKey(hkey9x); From 158b49e460ded007b3aa674a45f47d097b3727ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Sep 2024 22:53:38 +0200 Subject: [PATCH 262/557] add IsWindows2000OrGreater function --- inc/versionhelpers.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 7191349..e564c95 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -71,6 +71,10 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } +VERSIONHELPERAPI IsWindows2000OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0, 0); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -136,6 +140,10 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWindows2000(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN2K), LOBYTE(_WIN32_WINNT_WIN2K), 0); +} + VERSIONHELPERAPI IsWindowsXP(void) { return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); } From cee28b7abf0fd87ca259c5f812aea52467c94239 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 16:43:01 +0200 Subject: [PATCH 263/557] Update README.md --- README.md | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 679daad..9f6b7c9 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ # cnc-ddraw -cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. +cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, bad performance, crashes or defective Alt+Tab. It does also add new features such as borderless mode, windowed mode and upscaling via shaders.   ### Features - - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines + - Supports Windows ME, 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS/Android) and Virtual Machines - GDI / OpenGL / Direct3D 9 renderer (With automatic renderer selection) - Upscaling via glsl shaders - https://imgur.com/a/kxsM1oY | https://imgur.com/a/wjrhpFV - Windowed Mode / Fullscreen Exclusive Mode / Borderless Mode @@ -24,27 +24,17 @@ cnc-ddraw can fix compatibility issues in older 2D games, such as black screen, 1. Download [cnc-ddraw.zip](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) and extract it into your game folder 2. Start the game -Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once. +Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run `cnc-ddraw config.exe` once.   -If you use cnc-ddraw with a game that got its own windowed mode built in then **make sure you disable the games own windowed mode** first. You can enable windowed mode via cnc-ddraw config.exe instead. +**Important** -  - -**If the game starts but it doesn't work perfectly** then open the config program and check the **Compatibility settings**. - -  - -**cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer. Usually you can tell by the look of the game if it's a 3D game or not, but you can also let cnc-ddraw generate a debug log and search for "IDirect3D" - Link: https://github.com/FunkyFr3sh/cnc-ddraw/issues/44 - -  - -Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. - -  - -**If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44) +- **Game must be set to fullscreen** for cnc-ddraw to work. To enable windowed mode, use `cnc-ddraw config.exe` instead +- If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` +- **cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer +- Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. +- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From df73d585c0703bb18ea5ad9e03ee5c504a2642f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 16:50:48 +0200 Subject: [PATCH 264/557] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9f6b7c9..481a60c 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine **Important** -- **Game must be set to fullscreen** for cnc-ddraw to work. To enable windowed mode, use `cnc-ddraw config.exe` instead +- **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead - If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` -- **cnc-ddraw does not support Direct3D/Glide**, it will only work with games that use a **DirectDraw (Software)** renderer -- Some games may require additional steps before they can be used with cnc-ddraw, please check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for more details. +- **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer +- Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details - **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From e80499a30e63f110afcda178b009beba6a679036 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 21:54:25 +0200 Subject: [PATCH 265/557] add dummy functions to avoid Wtsapi32.dll imports (Keeps it win2000 compatible) --- config/cnc-ddraw config.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index a69e541..cef38b4 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -67,4 +67,15 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) } return 0; } + +// dummy functions to avoid Wtsapi32.dll imports +EXTERN_C BOOL WINAPI WTSRegisterSessionNotification(HWND hWnd, DWORD dwFlags) +{ + return TRUE; +} + +EXTERN_C BOOL WINAPI WTSUnRegisterSessionNotification(HWND hWnd) +{ + return TRUE; +} //--------------------------------------------------------------------------- From 107897a29f3e02f57d92248ece686948d9a98da0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 22:14:49 +0200 Subject: [PATCH 266/557] fix default settings --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4a0f97d..02723d7 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -1187,7 +1187,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) MinfpsChk->State = Minfps != 0 ? tssOn : tssOff; SinglecpuChk->State = GetBool(ini, "singlecpu", true) ? tssOff : tssOn; - NonexclusiveChk->State = GetBool(ini, "nonexclusive", false) ? tssOn : tssOff; + NonexclusiveChk->State = GetBool(ini, "nonexclusive", true) ? tssOn : tssOff; CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); From a7b8e2e80fdd42a4f24f4543608eff02deb99b04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 23:46:04 +0200 Subject: [PATCH 267/557] move crc32 function --- inc/crc32.h | 1 + src/crc32.c | 25 +++++++++++++++++++++++++ src/debug.c | 3 ++- src/utils.c | 26 -------------------------- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/inc/crc32.h b/inc/crc32.h index d842810..f2ddf4b 100644 --- a/inc/crc32.h +++ b/inc/crc32.h @@ -6,5 +6,6 @@ unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); +unsigned long Crc32_FromFile(char* filename); #endif diff --git a/src/crc32.c b/src/crc32.c index 826842f..0befe8e 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -77,6 +77,31 @@ unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, return( crc32 ^ 0xFFFFFFFF ); } +unsigned long Crc32_FromFile(char* filename) +{ + if (!filename) + return 0; + + unsigned long crc32 = 0; + + FILE* fp = fopen(filename, "rb"); + if (fp) + { + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) + { + crc32 = Crc32_ComputeBuf(crc32, buf, s); + } + + if (ferror(fp)) + crc32 = 0; + + fclose(fp); + } + + return crc32; +} + /*----------------------------------------------------------------------------*\ * END OF MODULE: crc32.c \*----------------------------------------------------------------------------*/ diff --git a/src/debug.c b/src/debug.c index 67ef352..ce8fe85 100644 --- a/src/debug.c +++ b/src/debug.c @@ -13,6 +13,7 @@ #include "git.h" #include "versionhelpers.h" #include "utils.h" +#include "crc32.h" #include "dllmain.h" #include "config.h" @@ -268,7 +269,7 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } - TRACE("crc32 = %08X\n", util_get_crc32(exe_path)); + TRACE("crc32 = %08X\n", Crc32_FromFile(exe_path)); DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) diff --git a/src/utils.c b/src/utils.c index f057a4e..5db8159 100644 --- a/src/utils.c +++ b/src/utils.c @@ -12,7 +12,6 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" -#include "crc32.h" /* @@ -107,31 +106,6 @@ DWORD util_get_timestamp(HMODULE mod) return nt_headers->FileHeader.TimeDateStamp; } -unsigned long util_get_crc32(char* filename) -{ - if (!filename) - return 0; - - unsigned long crc32 = 0; - - FILE* fp = fopen(filename, "rb"); - if (fp) - { - char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) - { - crc32 = Crc32_ComputeBuf(crc32, buf, s); - } - - if (ferror(fp)) - crc32 = 0; - - fclose(fp); - } - - return crc32; -} - FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { if (!mod || mod == INVALID_HANDLE_VALUE) From f9fa3b0fa2482f94eb8cc1deb259b8d1104e4f1d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Sep 2024 23:53:41 +0200 Subject: [PATCH 268/557] add missing arg to Crc32_FromFile function --- inc/crc32.h | 2 +- src/crc32.c | 26 ++++++++++++-------------- src/debug.c | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/inc/crc32.h b/inc/crc32.h index f2ddf4b..9b0728d 100644 --- a/inc/crc32.h +++ b/inc/crc32.h @@ -6,6 +6,6 @@ unsigned long Crc32_ComputeBuf(unsigned long inCrc32, const void* buf, size_t bufLen); -unsigned long Crc32_FromFile(char* filename); +unsigned long Crc32_FromFile(unsigned long crc32, char* filename); #endif diff --git a/src/crc32.c b/src/crc32.c index 0befe8e..e7ff75d 100644 --- a/src/crc32.c +++ b/src/crc32.c @@ -77,28 +77,26 @@ unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, return( crc32 ^ 0xFFFFFFFF ); } -unsigned long Crc32_FromFile(char* filename) +unsigned long Crc32_FromFile(unsigned long crc32, char* filename) { if (!filename) return 0; - unsigned long crc32 = 0; - FILE* fp = fopen(filename, "rb"); - if (fp) + if (!fp) + return 0; + + char buf[1024]; + for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) { - char buf[1024]; - for (size_t s = 0; (s = fread(buf, 1, sizeof(buf), fp)) && !ferror(fp);) - { - crc32 = Crc32_ComputeBuf(crc32, buf, s); - } - - if (ferror(fp)) - crc32 = 0; - - fclose(fp); + crc32 = Crc32_ComputeBuf(crc32, buf, s); } + if (ferror(fp)) + crc32 = 0; + + fclose(fp); + return crc32; } diff --git a/src/debug.c b/src/debug.c index ce8fe85..52382c1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -269,7 +269,7 @@ void dbg_init() TRACE("Wine sysname = %s, release = %s\n", sysname, release); } - TRACE("crc32 = %08X\n", Crc32_FromFile(exe_path)); + TRACE("crc32 = %08X\n", Crc32_FromFile(0, exe_path)); DWORD timestamp = util_get_timestamp(GetModuleHandleA(NULL)); if (timestamp) From 95a5f7231e8298d73302a02982631fe3a9401e84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Oct 2024 16:47:17 +0200 Subject: [PATCH 269/557] don't emulate 60hz vblank on 60hz monitor --- inc/dd.h | 1 + src/dd.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..cb82a6e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,6 +176,7 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; + BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index 981f986..b6c3382 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,6 +701,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } + else if (g_config.maxgameticks == 0) + { + // no need to emulate 60hz vblank if we got a 60hz monitor + if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) + { + g_ddraw.wait_for_real_vblank = TRUE; + } + } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1544,7 +1552,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2) + if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From ca6c447ae615ca1d7168af836b5e84c152e4977e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 03:57:10 +0200 Subject: [PATCH 270/557] fix window resize and maximize for macOS + fix resize on linux --- inc/config.h | 1 - src/config.c | 2 -- src/dd.c | 4 ++-- src/wndproc.c | 13 ++++++++++++- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/inc/config.h b/inc/config.h index 168c54d..fef71bb 100644 --- a/inc/config.h +++ b/inc/config.h @@ -65,7 +65,6 @@ typedef struct CNCDDRAWCONFIG BOOL fix_alt_key_stuck; BOOL fix_not_responding; BOOL no_compat_warning; - BOOL wine_allow_resize; int guard_lines; int max_resolutions; BOOL lock_surfaces; diff --git a/src/config.c b/src/config.c index 6b25434..9472523 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_BOOL(GameHandlesClose, "game_handles_close", FALSE); GET_BOOL(g_config.fix_not_responding, "fix_not_responding", FALSE); GET_BOOL(g_config.no_compat_warning, "no_compat_warning", FALSE); - GET_BOOL(g_config.wine_allow_resize, "wine_allow_resize", FALSE); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); @@ -314,7 +313,6 @@ static void cfg_create_ini() "game_handles_close=false\n" "fix_not_responding=false\n" "no_compat_warning=false\n" - "wine_allow_resize=false\n" "guard_lines=200\n" "max_resolutions=0\n" "lock_surfaces=false\n" diff --git a/src/dd.c b/src/dd.c index b6c3382..94b7adf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,12 +1093,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (!g_config.wine_allow_resize && IsWine()) + if (IsLinux()) { real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX)); } /* center the window with correct dimensions */ diff --git a/src/wndproc.c b/src/wndproc.c index eecba37..a76e126 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -443,12 +443,23 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { + if (in_size_move && g_ddraw.render.thread && IsMacOS()) + { + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } + if (in_size_move && !g_ddraw.render.thread) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) + else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); From 116297d2b4662dcfce52b389b66a9a18d2ec824c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:13:40 +0200 Subject: [PATCH 271/557] do not save settings after maxmize on macOS --- src/wndproc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index a76e126..ed17114 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -443,6 +443,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { + /* macOS maximize hack */ if (in_size_move && g_ddraw.render.thread && IsMacOS()) { EnterCriticalSection(&g_ddraw.cs); @@ -452,6 +453,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam WaitForSingleObject(g_ddraw.render.thread, INFINITE); g_ddraw.render.thread = NULL; + + g_config.save_settings = 0; } if (in_size_move && !g_ddraw.render.thread) From 07e088faaabe1a247b78a37611e4a03472d8e351 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:27:04 +0200 Subject: [PATCH 272/557] Do not save settings while window is maxmized in macOS --- src/config.c | 4 ++++ src/wndproc.c | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 9472523..36bdee6 100644 --- a/src/config.c +++ b/src/config.c @@ -131,6 +131,10 @@ void cfg_save() if (!g_config.save_settings) return; + /* Do not save settings while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + char buf[16]; char* section = g_config.save_settings == 1 ? "ddraw" : g_config.process_file_name; diff --git a/src/wndproc.c b/src/wndproc.c index ed17114..a2ffa7e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -453,8 +453,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam WaitForSingleObject(g_ddraw.render.thread, INFINITE); g_ddraw.render.thread = NULL; - - g_config.save_settings = 0; } if (in_size_move && !g_ddraw.render.thread) From dce598afcf889ef512d0b079d66533d31ad819fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:50:49 +0200 Subject: [PATCH 273/557] disable maximize and windowed toggle while maximized on macOS --- src/config.c | 2 +- src/utils.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 36bdee6..99a23f0 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while window is maxmized */ + /* Do not save settings while window is maximized */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 5db8159..68f314e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,6 +613,10 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; + /* Do not allow maximize while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + RECT client_rc; RECT dst_rc; @@ -717,6 +721,10 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; + /* Do not allow ALT+ENTER while window is maxmized */ + if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) + return; + if (g_config.toggle_borderless && g_config.windowed) { if (!g_config.fullscreen) From bb43a486d96d2a33deb73e827bb74f2a411f113f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:51:51 +0200 Subject: [PATCH 274/557] fix comments --- src/config.c | 2 +- src/utils.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 99a23f0..cd48c17 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while window is maximized */ + /* Do not save settings while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 68f314e..68454bb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,7 +613,7 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; - /* Do not allow maximize while window is maxmized */ + /* Do not allow cnc-ddraw maximize while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; @@ -721,7 +721,7 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; - /* Do not allow ALT+ENTER while window is maxmized */ + /* Do not allow ALT+ENTER while macOS maxmize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; From 5c853ca48783bb8ad7bb1d6e0cc08498ef88c547 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 04:52:23 +0200 Subject: [PATCH 275/557] fix typo --- src/config.c | 2 +- src/utils.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index cd48c17..02426ff 100644 --- a/src/config.c +++ b/src/config.c @@ -131,7 +131,7 @@ void cfg_save() if (!g_config.save_settings) return; - /* Do not save settings while macOS maxmize is active */ + /* Do not save settings while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; diff --git a/src/utils.c b/src/utils.c index 68454bb..15a52ea 100644 --- a/src/utils.c +++ b/src/utils.c @@ -613,7 +613,7 @@ void util_toggle_maximize() if (!g_config.resizable || !g_config.windowed || g_config.fullscreen || !g_ddraw.width) return; - /* Do not allow cnc-ddraw maximize while macOS maxmize is active */ + /* Do not allow cnc-ddraw maximize while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; @@ -721,7 +721,7 @@ void util_toggle_fullscreen() if (g_ddraw.bnet_active || !g_ddraw.width || (g_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; - /* Do not allow ALT+ENTER while macOS maxmize is active */ + /* Do not allow ALT+ENTER while macOS maximize is active */ if (IsMacOS() && !g_config.window_rect.left && !g_config.window_rect.top) return; From f1316407d1f6312044534bedcd26ed9dbc4d72bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 13:49:57 +0200 Subject: [PATCH 276/557] fix maximize button on linux --- src/dd.c | 8 -------- src/wndproc.c | 30 ++++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/dd.c b/src/dd.c index 94b7adf..30fa884 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,14 +1093,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (IsLinux()) - { - real_SetWindowLongA( - g_ddraw.hwnd, - GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX)); - } - /* center the window with correct dimensions */ int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; diff --git a/src/wndproc.c b/src/wndproc.c index a2ffa7e..890bc01 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -441,6 +441,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_config.windowed) { + WORD width = LOWORD(lParam); + WORD height = HIWORD(lParam); + if (wParam == SIZE_RESTORED) { /* macOS maximize hack */ @@ -457,16 +460,31 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (in_size_move && !g_ddraw.render.thread) { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; } else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) { - g_config.window_rect.right = LOWORD(lParam); - g_config.window_rect.bottom = HIWORD(lParam); + if (width != g_ddraw.render.width || height != g_ddraw.render.height) + { + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; - if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) dd_SetDisplayMode(0, 0, 0, 0); + } + } + } + else if (wParam == SIZE_MAXIMIZED) + { + if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && IsLinux()) + { + if (width != g_ddraw.render.width || height != g_ddraw.render.height) + { + g_config.window_rect.right = width; + g_config.window_rect.bottom = height; + + dd_SetDisplayMode(0, 0, 0, 0); + } } } } @@ -532,7 +550,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam == SC_MAXIMIZE) + if (wParam == SC_MAXIMIZE && !IsWine()) { if (g_config.resizable) { From a93d004f1b7dee00b364a6ea42370c5551ebb85f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 3 Oct 2024 14:13:59 +0200 Subject: [PATCH 277/557] move inject_resolution up and add notes --- inc/config.h | 2 +- src/config.c | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index fef71bb..ad6ce54 100644 --- a/inc/config.h +++ b/inc/config.h @@ -43,6 +43,7 @@ typedef struct CNCDDRAWCONFIG int anti_aliased_fonts_min_size; int min_font_size; int center_window; + char inject_resolution[128]; BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; @@ -71,7 +72,6 @@ typedef struct CNCDDRAWCONFIG BOOL flipclear; BOOL rgb555; BOOL no_dinput_hook; - char inject_resolution[128]; BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; diff --git a/src/config.c b/src/config.c index 02426ff..c2ba7ca 100644 --- a/src/config.c +++ b/src/config.c @@ -55,6 +55,7 @@ void cfg_load() GET_INT(g_config.anti_aliased_fonts_min_size, "anti_aliased_fonts_min_size", 13); GET_INT(g_config.min_font_size, "min_font_size", 0); GET_INT(g_config.center_window, "center_window", CENTER_WINDOW_AUTO); + GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.vhack, "vhack", FALSE); GET_STRING("screenshotdir", ".\\Screenshots\\", g_config.screenshot_dir, sizeof(g_config.screenshot_dir)); GET_BOOL(g_config.toggle_borderless, "toggle_borderless", FALSE); @@ -84,7 +85,6 @@ void cfg_load() GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_STRING("inject_resolution", "", g_config.inject_resolution, sizeof(g_config.inject_resolution)); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); @@ -258,6 +258,10 @@ static void cfg_create_ini() "; Possible values: 0 = never center, 1 = automatic, 2 = always center\n" "center_window=1\n" "\n" + "; Inject a custom display resolution into the in-game resolution list - Example values: 960x540, 3840x2160\n" + "; Note: This setting can used for downscaling as well, you can insert resolutions higher than your monitor supports\n" + "inject_resolution=\n" + "\n" "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" @@ -299,7 +303,7 @@ static void cfg_create_ini() "; Note: Disable this if the game is not running smooth or there are sound issues\n" "singlecpu=true\n" "\n" - "; Available resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" + "; Available display resolutions, possible values: 0 = Small list, 1 = Very small list, 2 = Full list\n" "; Note: Set this to 2 if your chosen resolution is not working or does not show up in the list\n" "; Note: Set this to 1 if the game is crashing on startup\n" "resolutions=0\n" @@ -323,7 +327,6 @@ static void cfg_create_ini() "flipclear=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - ";inject_resolution=960x540\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" From 747f1df81cf051bd5e5f0680d4a8420b98eaf8a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:39:49 +0200 Subject: [PATCH 278/557] add hack for linux to enforce minimum window size --- inc/wndproc.h | 1 + src/wndproc.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 4d36cb3..4af4f7e 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -12,6 +12,7 @@ #define WM_RESTORE_STYLE WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 +#define IDT_TIMER_LINUX_FIX_WINDOW_SIZE 345267753 #define CNC_DDRAW_SET_FULLSCREEN 1 #define CNC_DDRAW_SET_WINDOWED 2 diff --git a/src/wndproc.c b/src/wndproc.c index 890bc01..cba872e 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -216,6 +216,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } + case IDT_TIMER_LINUX_FIX_WINDOW_SIZE: + { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + return 0; + } } break; } @@ -471,6 +477,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = height; dd_SetDisplayMode(0, 0, 0, 0); + + if (width < g_ddraw.width || height < g_ddraw.height) + { + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); + } } } } From c8980c5e349a559486afb88adb9b0768811c7d7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:43:04 +0200 Subject: [PATCH 279/557] kill timer on maximize (just to be sure...) --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index cba872e..7fc59fa 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -491,6 +491,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (width != g_ddraw.render.width || height != g_ddraw.render.height) { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + g_config.window_rect.right = width; g_config.window_rect.bottom = height; From 552c5809e01ce75637875e9609b2d6694f68f78e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 22:47:08 +0200 Subject: [PATCH 280/557] add comment --- src/wndproc.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 7fc59fa..56283f6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -480,6 +480,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (width < g_ddraw.width || height < g_ddraw.height) { + /* Can't enforce minimum window size in linux because there is no WM_SIZING and + WM_GETMINMAXINFO is ignored for whatever reasons */ + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); } } From 4af2daed14edcca078681886ad097183b383e783 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 23:00:13 +0200 Subject: [PATCH 281/557] enforce minimum window size on restore after maximize --- src/wndproc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 56283f6..52d4dbc 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -500,6 +500,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = height; dd_SetDisplayMode(0, 0, 0, 0); + + if (width < g_ddraw.width || height < g_ddraw.height) + { + /* Can't enforce minimum window size in linux because there is no WM_SIZING and + WM_GETMINMAXINFO is ignored for whatever reasons */ + + SetTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE, 1000, (TIMERPROC)NULL); + } } } } From 4fdc98ef28ec10673b6482dc5138dad7c541159f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 5 Oct 2024 23:03:00 +0200 Subject: [PATCH 282/557] add missing KillTimer call --- src/wndproc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 52d4dbc..fd8fc6b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -473,6 +473,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (width != g_ddraw.render.width || height != g_ddraw.render.height) { + KillTimer(g_ddraw.hwnd, IDT_TIMER_LINUX_FIX_WINDOW_SIZE); + g_config.window_rect.right = width; g_config.window_rect.bottom = height; From 92df1257bd31181b0a0ad12cc3d3fac40248a8d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 21:33:37 +0200 Subject: [PATCH 283/557] do not never forward SC_MAXIMIZE to the game in wine --- src/wndproc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index fd8fc6b..2d50d58 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -576,8 +576,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (wParam == SC_MAXIMIZE && !IsWine()) + if (wParam == SC_MAXIMIZE) { + if (IsWine()) + return DefWindowProc(hWnd, uMsg, wParam, lParam); + if (g_config.resizable) { util_toggle_maximize(); From fc9bb11e755b8e0436b138c250f6ae695b0c4945 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 21:38:07 +0200 Subject: [PATCH 284/557] fix resizable .ini setting in wine --- src/dd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/dd.c b/src/dd.c index 30fa884..053e030 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,6 +1093,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } + if (!g_config.resizable && IsWine()) + { + real_SetWindowLongA( + g_ddraw.hwnd, + GWL_STYLE, + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + } + /* center the window with correct dimensions */ int cy = g_ddraw.mode.dmPelsWidth ? g_ddraw.mode.dmPelsWidth : g_ddraw.render.width; int cx = g_ddraw.mode.dmPelsHeight ? g_ddraw.mode.dmPelsHeight : g_ddraw.render.height; From 6d61a423ee4c66d32afc9b3e78f06d78f255c556 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 23:43:43 +0200 Subject: [PATCH 285/557] only use workaround for linux and not for macOS --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 2d50d58..3d8823f 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -535,7 +535,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (IsWine() && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (IsLinux() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ From fc9243d71b416050e1b7dd712e79326fe2cb38f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 6 Oct 2024 23:55:16 +0200 Subject: [PATCH 286/557] keep old WS_MINIMIZEBOX hack --- src/dd.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 053e030..5c205c7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1093,12 +1093,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (!g_config.resizable && IsWine()) + if (IsWine()) { + LONG remove_flags = !g_config.resizable ? (WS_MAXIMIZEBOX | WS_THICKFRAME) : 0; + real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(WS_MAXIMIZEBOX | WS_THICKFRAME)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX) & ~(remove_flags)); } /* center the window with correct dimensions */ From a2c0dee5065e10c19ecb1f062f983517a45e8b34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 10 Oct 2024 16:58:21 +0200 Subject: [PATCH 287/557] improve logs --- src/dd.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dd.c b/src/dd.c index 5c205c7..280ce03 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1359,6 +1359,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } + TRACE( + " render res=%ux%u (viewport res=%ux%u, x=%d, y=%d)\n", + g_ddraw.render.width, + g_ddraw.render.height, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y); + + TRACE( + " windowed=%s, fullscreen=%s, adjmouse=%s\n", + g_config.windowed ? "true" : "false", + g_config.fullscreen ? "true" : "false", + g_config.adjmouse ? "true" : "false"); + return DD_OK; } From 01fe4f2f0faa7254f5beeee250dfa49ffd501209 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 11 Oct 2024 22:17:55 +0200 Subject: [PATCH 288/557] update worms armageddon preset --- src/config.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index c2ba7ca..f5a83c5 100644 --- a/src/config.c +++ b/src/config.c @@ -1606,10 +1606,7 @@ static void cfg_create_ini() "\n" "; Worms Armageddon\n" "[WA]\n" - "adjmouse=true\n" - "width=0\n" - "height=0\n" - "resizable=false\n" + "lock_mouse_top_left=true\n" "\n" "; War Wind\n" "[WW]\n" From 362d05367cf17c240aa876630287c42b09c45abc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:24:07 +0200 Subject: [PATCH 289/557] allow to toggle windowed/maximize with a single key press --- inc/config.h | 3 ++- src/config.c | 17 ++++++++++++----- src/keyboard.c | 12 ++++++++++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index ad6ce54..a736411 100644 --- a/inc/config.h +++ b/inc/config.h @@ -86,7 +86,9 @@ typedef struct CNCDDRAWCONFIG struct { int toggle_fullscreen; + int toggle_fullscreen2; int toggle_maximize; + int toggle_maximize2; int unlock_cursor1; int unlock_cursor2; int screenshot; @@ -100,7 +102,6 @@ typedef struct CNCDDRAWCONFIG BOOL stronghold_hack; BOOL mgs_hack; BOOL tlc_hack; - BOOL homm_hack; BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; diff --git a/src/config.c b/src/config.c index f5a83c5..2d052f5 100644 --- a/src/config.c +++ b/src/config.c @@ -97,7 +97,9 @@ void cfg_load() /* Hotkeys */ GET_INT(g_config.hotkeys.toggle_fullscreen, "keytogglefullscreen", VK_RETURN); + GET_INT(g_config.hotkeys.toggle_fullscreen2, "keytogglefullscreen2", 0); GET_INT(g_config.hotkeys.toggle_maximize, "keytogglemaximize", VK_NEXT); + GET_INT(g_config.hotkeys.toggle_maximize2, "keytogglemaximize2", 0); GET_INT(g_config.hotkeys.unlock_cursor1, "keyunlockcursor1", VK_TAB); GET_INT(g_config.hotkeys.unlock_cursor2, "keyunlockcursor2", VK_RCONTROL); GET_INT(g_config.hotkeys.screenshot, "keyscreenshot", VK_SNAPSHOT); @@ -110,7 +112,6 @@ void cfg_load() GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GET_BOOL(g_config.tlc_hack, "tlc_hack", FALSE); - GET_BOOL(g_config.homm_hack, "homm_hack", FALSE); GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); @@ -346,9 +347,15 @@ static void cfg_create_ini() "; Switch between windowed and fullscreen mode = [Alt] + ???\n" "keytogglefullscreen=0x0D\n" "\n" + "; Switch between windowed and fullscreen mode (single key) = ???\n" + "keytogglefullscreen2=0x00\n" + "\n" "; Maximize window = [Alt] + ???\n" "keytogglemaximize=0x22\n" "\n" + "; Maximize window (single key) = ???\n" + "keytogglemaximize2=0x00\n" + "\n" "; Unlock cursor 1 = [Ctrl] + ???\n" "keyunlockcursor1=0x09\n" "\n" @@ -983,23 +990,23 @@ static void cfg_create_ini() "[Heroes3]\n" "renderer=opengl\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III HD Mod\n" "[Heroes3 HD]\n" "renderer=opengl\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III - Master of Puppets mod\n" "[MoP]\n" "game_handles_close=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" "remove_menu=true\n" - "homm_hack=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" diff --git a/src/keyboard.c b/src/keyboard.c index 109269b..2ca9fbb 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -62,6 +62,14 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } + if (wParam == g_config.hotkeys.toggle_fullscreen2) + { + if (key_triggered) + util_toggle_fullscreen(); + + return 1; + } + if (wParam == g_config.hotkeys.toggle_maximize && alt_down && key_down) { if (key_triggered) @@ -70,10 +78,10 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == VK_F4 && g_config.homm_hack) /* Heroes of Might and Magic 3 and 4 */ + if (wParam == g_config.hotkeys.toggle_maximize2) { if (key_triggered) - util_toggle_fullscreen(); + util_toggle_maximize(); return 1; } From a6ef1bbfe714d71fd6cd93583176ae9e8de47b11 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:43:21 +0200 Subject: [PATCH 290/557] update Jazz Jackrabbit 2 presets --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 2d052f5..52f37a2 100644 --- a/src/config.c +++ b/src/config.c @@ -965,12 +965,12 @@ static void cfg_create_ini() "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" - "keytogglefullscreen=0x08\n" + "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" - "keytogglefullscreen=0x08\n" + "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" From 03d82b86a46a04940fcc60241534d8ef1722cbce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 12 Oct 2024 01:44:26 +0200 Subject: [PATCH 291/557] remoe devmode setting --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index 52f37a2..51cfdc7 100644 --- a/src/config.c +++ b/src/config.c @@ -965,12 +965,10 @@ static void cfg_create_ini() "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" - "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" - "devmode=true\n" "inject_resolution=800x450\n" "\n" "; Jungle Storm\n" From 9671d810af69ff11fde4a9e04a20a2e611e4e03d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 16 Oct 2024 16:48:19 +0200 Subject: [PATCH 292/557] #352 add preset for Age Of Wonders 1 --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index 51cfdc7..f323d29 100644 --- a/src/config.c +++ b/src/config.c @@ -436,6 +436,22 @@ static void cfg_create_ini() "fake_mode=640x480x32\n" "nonexclusive=true\n" "\n" + "; Age of Wonders\n" + "[AoW]\n" + "resolutions=2\n" + "nonexclusive=false\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders\n" + "[AoWCompat]\n" + "resolutions=2\n" + "nonexclusive=false\n" + "singlecpu=false\n" + "\n" + "; Age of Wonders Config Tool\n" + "[AoWSetup]\n" + "resolutions=2\n" + "\n" "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" From a4f927b09510407c6e3a1ce0f2e36b73fcadc162 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Oct 2024 18:02:30 +0200 Subject: [PATCH 293/557] add a check for DDSCAPS_OWNDC --- src/ddsurface.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 2f87cf0..20ddd4f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -917,7 +917,8 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) if (lpHDC) *lpHDC = dc; - InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); + if (!(This->caps & DDSCAPS_OWNDC)) + InterlockedExchange((LONG*)&This->dc_state, SaveDC(dc)); return DD_OK; } @@ -1025,7 +1026,8 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) } } - RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); + if (!(This->caps & DDSCAPS_OWNDC)) + RestoreDC(hDC, InterlockedExchangeAdd((LONG*)&This->dc_state, 0)); return DD_OK; } From 856ce8a3af14a11c77ee49f6450ecfde8b1381af Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 18 Oct 2024 18:42:46 +0200 Subject: [PATCH 294/557] add preset for Hooligans: Storm over Europe --- inc/config.h | 1 + src/config.c | 6 ++++++ src/ddsurface.c | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index a736411..60c6eea 100644 --- a/inc/config.h +++ b/inc/config.h @@ -78,6 +78,7 @@ typedef struct CNCDDRAWCONFIG BOOL lock_mouse_top_left; char win_version[32]; int hook; + BOOL limit_gdi_handles; BOOL remove_menu; int refresh_rate; diff --git a/src/config.c b/src/config.c index f323d29..63d04cf 100644 --- a/src/config.c +++ b/src/config.c @@ -91,6 +91,7 @@ void cfg_load() GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); GET_INT(g_config.hook, "hook", 4); + GET_BOOL(g_config.limit_gdi_handles, "limit_gdi_handles", FALSE); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); @@ -334,6 +335,7 @@ static void cfg_create_ini() "lock_mouse_top_left=false\n" ";win_version=95\n" "hook=4\n" + "limit_gdi_handles=false\n" "remove_menu=false\n" "refresh_rate=0\n" "\n" @@ -1028,6 +1030,10 @@ static void cfg_create_ini() "renderer=opengl\n" "noactivateapp=true\n" "\n" + "; Hooligans: Storm over Europe\n" + "[hooligans]\n" + "limit_gdi_handles=true\n" + "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 20ddd4f..b073f6d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1500,7 +1500,7 @@ HRESULT dd_CreateSurface( } /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ - if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || + if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) || (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || (dst_surface->width == 128 && dst_surface->height == 128)) { From 9545a58f0522e8437c0599fab4ac214514e12e8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 21 Oct 2024 00:10:54 +0200 Subject: [PATCH 295/557] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 481a60c..dbc1304 100644 --- a/README.md +++ b/README.md @@ -31,10 +31,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine **Important** - **The game must be set to fullscreen**. To enable windowed mode, use `cnc-ddraw config.exe` instead -- If the game does not work properly, check **Compatibility settings** in `cnc-ddraw config.exe` - **cnc-ddraw does not support Direct3D games**, the game must have a **DirectDraw (Software)** renderer +- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44) - Some games require additional steps before they can be used with cnc-ddraw, check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) for details -- **If the game doesn't start at all or it's crashing**, [then please generate a debug log file and upload it.](https://github.com/FunkyFr3sh/cnc-ddraw/issues/44)   From a851f93c0a65d9738ab54e0efdab3473f39ca863 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 23 Oct 2024 02:49:41 +0200 Subject: [PATCH 296/557] add Final Liberation: Warhammer Epic 40000 (GOG) to supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 481a60c..e4198a9 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 +- Final Liberation: Warhammer Epic 40000 (GOG) - Final fantasy VII - Final fantasy VIII - Freddi Fish From ce4860dc05aa4ab5b50cb05099a9edf81a240ce4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Oct 2024 16:28:39 +0200 Subject: [PATCH 297/557] fix downscaling with boxing=true --- src/dd.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 280ce03..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -934,15 +934,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.boxing) { - g_ddraw.render.viewport.width = g_ddraw.width; - g_ddraw.render.viewport.height = g_ddraw.height; - for (int i = 20; i-- > 1;) { if (g_ddraw.width * i <= g_ddraw.render.width && g_ddraw.height * i <= g_ddraw.render.height) { - g_ddraw.render.viewport.width *= i; - g_ddraw.render.viewport.height *= i; + g_ddraw.render.viewport.width = i * g_ddraw.width; + g_ddraw.render.viewport.height = i * g_ddraw.height; break; } } From 79cfe0f466d43ce0a5b766b70a9bde5235ee5598 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 25 Oct 2024 17:31:28 +0200 Subject: [PATCH 298/557] tweak legacy build --- inc/versionhelpers.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index e564c95..fa542ac 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -30,6 +30,7 @@ #if (_WIN32_WINNT < _WIN32_WINNT_WIN2K) #define VerifyVersionInfoW(a,b,c) 0 +#define VerSetConditionMask verhelp_set_mask #endif void verhelp_init(); @@ -42,7 +43,7 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL), VER_MINORVERSION, VER_GREATER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -53,7 +54,7 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -64,7 +65,7 @@ VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, - verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(verhelp_set_mask(0, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL), VER_MINORVERSION, VER_EQUAL), VER_BUILDNUMBER, VER_GREATER_EQUAL), @@ -137,7 +138,7 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, verhelp_set_mask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } VERSIONHELPERAPI IsWindows2000(void) { From e3e7dc22e1d268f8d6a0f9e0412f848a0a732d1e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 26 Oct 2024 21:40:28 +0200 Subject: [PATCH 299/557] improve debug logs --- inc/debug.h | 1 + src/debug.c | 22 ++++++++++++++++++++++ src/directinput.c | 2 ++ 3 files changed, 25 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index c0372f1..4eb5310 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -27,6 +27,7 @@ void dbg_dump_dds_caps(DWORD caps); void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); +void dbg_dump_di_scm_flags(DWORD flags); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); diff --git a/src/debug.c b/src/debug.c index 52382c1..650c2b4 100644 --- a/src/debug.c +++ b/src/debug.c @@ -3,6 +3,7 @@ #include #include #include +#include "directinput.h" #include "ddraw.h" #include "dd.h" #include "ddsurface.h" @@ -1086,6 +1087,27 @@ void dbg_dump_dds_lock_flags(DWORD flags) #endif } +void dbg_dump_di_scm_flags(DWORD flags) +{ +#ifdef _DEBUG + if (flags & DISCL_EXCLUSIVE) { + TRACE(" DISCL_EXCLUSIVE\n"); + } + if (flags & DISCL_NONEXCLUSIVE) { + TRACE(" DISCL_NONEXCLUSIVE\n"); + } + if (flags & DISCL_FOREGROUND) { + TRACE(" DISCL_FOREGROUND\n"); + } + if (flags & DISCL_BACKGROUND) { + TRACE(" DISCL_BACKGROUND\n"); + } + if (flags & DISCL_NOWINKEY) { + TRACE(" DISCL_NOWINKEY\n"); + } +#endif +} + char* dbg_d3d9_hr_to_str(HRESULT hr) { #define HR_TO_STR(x) if (x == hr) return #x diff --git a/src/directinput.c b/src/directinput.c index d3f08f6..80d58c6 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -54,6 +54,8 @@ static PROC hook_func(PROC* org_func, PROC new_func) static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HWND hwnd, DWORD dwFlags) { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress()); + TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE"); + dbg_dump_di_scm_flags(dwFlags); if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { From a1864d612a5e2d742206103ad1b70448509ce854 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 27 Oct 2024 03:35:12 +0100 Subject: [PATCH 300/557] ignore dinput keypresses if window not in foreground --- src/directinput.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 80d58c6..7db6d2d 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -6,6 +6,7 @@ #include "dd.h" #include "mouse.h" #include "config.h" +#include "utils.h" #ifdef _MSC_VER #include "detours.h" @@ -86,13 +87,16 @@ static HRESULT WINAPI fake_did_GetDeviceData( pdwInOut, dwFlags, _ReturnAddress()); - */ + */ + + BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; + BOOL in_background = FALSE;//g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) + if (SUCCEEDED(result)) { - if (pdwInOut) + if ((block_mouse || in_background) && pdwInOut) { if (rgdod && *pdwInOut > 0 && cbObjectData > 0) { @@ -110,11 +114,14 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c { //TRACE("DirectInput GetDeviceState(This=%p, cbData=%lu, lpvData=%p) [%p]\n", This, cbData, lpvData, _ReturnAddress()); + BOOL block_mouse = This == g_mouse_device && !g_mouse_locked && !g_config.devmode; + BOOL in_background = g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground(g_ddraw.hwnd); + HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) + if (SUCCEEDED(result)) { - if (cbData > 0 && lpvData) + if ((block_mouse || in_background) && cbData > 0 && lpvData) { memset(lpvData, 0, cbData); } From db43b5c65587a3c918dff6a4971de3722223f427 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 01:35:26 +0100 Subject: [PATCH 301/557] bump version --- inc/version.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/version.h b/inc/version.h index 8168d91..5c0c6b9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,10 +5,10 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define git_str(a) str(a) -#define VERSION_MAJOR 6 -#define VERSION_MINOR 9 +#define VERSION_MAJOR 7 +#define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From d3f78bad950b97110d43f5cd1934958b4dd28529 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 16:57:26 +0100 Subject: [PATCH 302/557] Revert "don't emulate 60hz vblank on 60hz monitor" This reverts commit 95a5f7231e8298d73302a02982631fe3a9401e84. --- inc/dd.h | 1 - src/dd.c | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index cb82a6e..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,7 +176,6 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; - BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index d7018e0..09e22bf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,14 +701,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } - else if (g_config.maxgameticks == 0) - { - // no need to emulate 60hz vblank if we got a 60hz monitor - if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) - { - g_ddraw.wait_for_real_vblank = TRUE; - } - } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1566,7 +1558,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) + if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 498e2f45e2f766e35357a9e185fd01e672f1de94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 16:59:39 +0100 Subject: [PATCH 303/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 5c0c6b9..a7ac8d9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -8,7 +8,7 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From b23700a9b7343bb3e0ddde94882116964ac788d9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 17:44:02 +0100 Subject: [PATCH 304/557] Reapply "don't emulate 60hz vblank on 60hz monitor" This reverts commit d3f78bad950b97110d43f5cd1934958b4dd28529. --- inc/dd.h | 1 + src/dd.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..cb82a6e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,6 +176,7 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; + BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index 09e22bf..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,6 +701,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } + else if (g_config.maxgameticks == 0) + { + // no need to emulate 60hz vblank if we got a 60hz monitor + if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) + { + g_ddraw.wait_for_real_vblank = TRUE; + } + } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1558,7 +1566,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2) + if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 27dbd0792582f060616f1c74e55678f9ed863484 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 17:53:01 +0100 Subject: [PATCH 305/557] Don't use DwmFlush --- inc/fps_limiter.h | 7 ------ src/dd.c | 13 ++--------- src/fps_limiter.c | 57 ++--------------------------------------------- 3 files changed, 4 insertions(+), 73 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index ec0f7bc..dcc413c 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -22,8 +22,6 @@ typedef struct _D3DKMT_CLOSEADAPTER { UINT hAdapter; } D3DKMT_CLOSEADAPTER; -typedef HRESULT(WINAPI* DWMFLUSHPROC)(VOID); -typedef HRESULT(WINAPI* DWMISCOMPOSITIONENABLEDPROC)(BOOL*); typedef NTSTATUS(WINAPI* D3DKMTWAITFORVERTICALBLANKEVENTPROC)(const D3DKMT_WAITFORVERTICALBLANKEVENT* Arg1); typedef NTSTATUS(WINAPI* D3DKMTOPENADAPTERFROMHDCPROC)(D3DKMT_OPENADAPTERFROMHDC* Arg1); typedef NTSTATUS(WINAPI* D3DKMTCLOSEADAPTERPROC)(D3DKMT_CLOSEADAPTER* Arg1); @@ -40,9 +38,6 @@ typedef struct FPSLIMITER D3DKMT_OPENADAPTERFROMHDC adapter; D3DKMT_CLOSEADAPTER close_adapter; HMODULE gdi32_dll; - HMODULE dwmapi_dll; - DWMFLUSHPROC DwmFlush; - DWMISCOMPOSITIONENABLEDPROC DwmIsCompositionEnabled; D3DKMTWAITFORVERTICALBLANKEVENTPROC D3DKMTWaitForVerticalBlankEvent; D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc; D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; @@ -56,8 +51,6 @@ extern FPSLIMITER g_fpsl; void fpsl_init(); BOOL fpsl_wait_for_vblank(); -BOOL fpsl_dwm_flush(); -BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); void fpsl_frame_end(); diff --git a/src/dd.c b/src/dd.c index d7018e0..65eed9b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1568,17 +1568,8 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return DD_OK; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return DD_OK; - } + if (fpsl_wait_for_vblank()) + return DD_OK; } if (!g_ddraw.flip_limiter.tick_length) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 14c4394..1300f8d 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -49,23 +49,6 @@ void fpsl_init() g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); } - if (!g_fpsl.dwmapi_dll) - { - g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); - } - - if (!g_fpsl.DwmFlush) - { - g_fpsl.DwmFlush = - (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); - } - - if (!g_fpsl.DwmIsCompositionEnabled) - { - g_fpsl.DwmIsCompositionEnabled = - (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); - } - if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = @@ -118,33 +101,6 @@ BOOL fpsl_wait_for_vblank() return FALSE; } -BOOL fpsl_dwm_flush() -{ - if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) - { - HRESULT x = g_fpsl.DwmFlush(); - - if (!SUCCEEDED(x)) - { - //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); - } - - return SUCCEEDED(x); - } - - return FALSE; -} - -BOOL fpsl_dwm_is_enabled() -{ - BOOL dwm_enabled = FALSE; - - if (g_fpsl.DwmIsCompositionEnabled) - g_fpsl.DwmIsCompositionEnabled(&dwm_enabled); - - return dwm_enabled; -} - void fpsl_frame_start() { if (g_fpsl.tick_length > 0) @@ -156,17 +112,8 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return; - } + if (fpsl_wait_for_vblank()) + return; } if (g_fpsl.tick_length > 0) From 9313a997dd95c4891ac8064eb3922f88b1cc0e90 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:11:29 +0100 Subject: [PATCH 306/557] Revert "Don't use DwmFlush" This reverts commit 27dbd0792582f060616f1c74e55678f9ed863484. --- inc/fps_limiter.h | 7 ++++++ src/dd.c | 13 +++++++++-- src/fps_limiter.c | 57 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index dcc413c..ec0f7bc 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -22,6 +22,8 @@ typedef struct _D3DKMT_CLOSEADAPTER { UINT hAdapter; } D3DKMT_CLOSEADAPTER; +typedef HRESULT(WINAPI* DWMFLUSHPROC)(VOID); +typedef HRESULT(WINAPI* DWMISCOMPOSITIONENABLEDPROC)(BOOL*); typedef NTSTATUS(WINAPI* D3DKMTWAITFORVERTICALBLANKEVENTPROC)(const D3DKMT_WAITFORVERTICALBLANKEVENT* Arg1); typedef NTSTATUS(WINAPI* D3DKMTOPENADAPTERFROMHDCPROC)(D3DKMT_OPENADAPTERFROMHDC* Arg1); typedef NTSTATUS(WINAPI* D3DKMTCLOSEADAPTERPROC)(D3DKMT_CLOSEADAPTER* Arg1); @@ -38,6 +40,9 @@ typedef struct FPSLIMITER D3DKMT_OPENADAPTERFROMHDC adapter; D3DKMT_CLOSEADAPTER close_adapter; HMODULE gdi32_dll; + HMODULE dwmapi_dll; + DWMFLUSHPROC DwmFlush; + DWMISCOMPOSITIONENABLEDPROC DwmIsCompositionEnabled; D3DKMTWAITFORVERTICALBLANKEVENTPROC D3DKMTWaitForVerticalBlankEvent; D3DKMTOPENADAPTERFROMHDCPROC D3DKMTOpenAdapterFromHdc; D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; @@ -51,6 +56,8 @@ extern FPSLIMITER g_fpsl; void fpsl_init(); BOOL fpsl_wait_for_vblank(); +BOOL fpsl_dwm_flush(); +BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); void fpsl_frame_end(); diff --git a/src/dd.c b/src/dd.c index 65eed9b..d7018e0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1568,8 +1568,17 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) { - if (fpsl_wait_for_vblank()) - return DD_OK; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return DD_OK; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return DD_OK; + } } if (!g_ddraw.flip_limiter.tick_length) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 1300f8d..14c4394 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -49,6 +49,23 @@ void fpsl_init() g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); } + if (!g_fpsl.dwmapi_dll) + { + g_fpsl.dwmapi_dll = real_LoadLibraryA("dwmapi.dll"); + } + + if (!g_fpsl.DwmFlush) + { + g_fpsl.DwmFlush = + (DWMFLUSHPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmFlush"); + } + + if (!g_fpsl.DwmIsCompositionEnabled) + { + g_fpsl.DwmIsCompositionEnabled = + (DWMISCOMPOSITIONENABLEDPROC)real_GetProcAddress(g_fpsl.dwmapi_dll, "DwmIsCompositionEnabled"); + } + if (!g_fpsl.D3DKMTWaitForVerticalBlankEvent) { g_fpsl.D3DKMTWaitForVerticalBlankEvent = @@ -101,6 +118,33 @@ BOOL fpsl_wait_for_vblank() return FALSE; } +BOOL fpsl_dwm_flush() +{ + if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) + { + HRESULT x = g_fpsl.DwmFlush(); + + if (!SUCCEEDED(x)) + { + //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); + } + + return SUCCEEDED(x); + } + + return FALSE; +} + +BOOL fpsl_dwm_is_enabled() +{ + BOOL dwm_enabled = FALSE; + + if (g_fpsl.DwmIsCompositionEnabled) + g_fpsl.DwmIsCompositionEnabled(&dwm_enabled); + + return dwm_enabled; +} + void fpsl_frame_start() { if (g_fpsl.tick_length > 0) @@ -112,8 +156,17 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { - if (fpsl_wait_for_vblank()) - return; + /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return; + } } if (g_fpsl.tick_length > 0) From ca08dd6006bb4a4e5d025c4215d5639b5a7c7fba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:11:42 +0100 Subject: [PATCH 307/557] Revert "don't emulate 60hz vblank on 60hz monitor" This reverts commit 95a5f7231e8298d73302a02982631fe3a9401e84. --- inc/dd.h | 1 - src/dd.c | 10 +--------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index cb82a6e..b9382b1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -176,7 +176,6 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; BOOL windowed_hack; - BOOL wait_for_real_vblank; struct { diff --git a/src/dd.c b/src/dd.c index d7018e0..09e22bf 100644 --- a/src/dd.c +++ b/src/dd.c @@ -701,14 +701,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } - else if (g_config.maxgameticks == 0) - { - // no need to emulate 60hz vblank if we got a 60hz monitor - if (g_ddraw.mode.dmDisplayFrequency == 60 || g_ddraw.mode.dmDisplayFrequency == 59) - { - g_ddraw.wait_for_real_vblank = TRUE; - } - } } BOOL zooming = g_ddraw.zoom.enabled; @@ -1566,7 +1558,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { - if (g_config.maxgameticks == -2 || g_ddraw.wait_for_real_vblank) + if (g_config.maxgameticks == -2) { /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) From 2c69e41b18cd7e426cf23c100a7af9e8f3bbef6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Nov 2024 18:16:22 +0100 Subject: [PATCH 308/557] don't use DwmFlush WaitForVerticalBlank --- src/dd.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 09e22bf..61eeb38 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1560,17 +1560,8 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - /* Workaround for DwmFlush() freeze (e.g. slow alt+tab) issue on windows 7 SP1 */ - if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) - { - if (fpsl_wait_for_vblank()) - return DD_OK; - } - else - { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) - return DD_OK; - } + if (fpsl_wait_for_vblank()) + return DD_OK; } if (!g_ddraw.flip_limiter.tick_length) From 4db1628431c7c244385ee2f4a4680aa5cd4393a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Nov 2024 02:32:00 +0100 Subject: [PATCH 309/557] only use windowed hack if window is smaller than screen size --- src/dd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 61eeb38..781a1ad 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1540,12 +1540,14 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (!g_ddraw.width) { - g_ddraw.windowed_hack = TRUE; - RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); - dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + if (rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) + { + g_ddraw.windowed_hack = TRUE; + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + } } } else From e3af5739165ea5adbdde82af4fc636e5e25b1c69 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Nov 2024 05:07:09 +0100 Subject: [PATCH 310/557] enable windowed hack for non-popup windows --- src/dd.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 781a1ad..0752a3f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1543,7 +1543,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) RECT rc = { 0 }; real_GetClientRect(hwnd, &rc); - if (rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) + BOOL popup = real_GetWindowLongA(hwnd, GWL_STYLE) & WS_POPUP; + + if ((rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) || !popup) { g_ddraw.windowed_hack = TRUE; dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); From d4c329f8bda6ad1ca65930e46d2380d90c5cf472 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 4 Nov 2024 02:27:34 +0100 Subject: [PATCH 311/557] add some debug code --- src/ddsurface.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index b073f6d..eee23ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -74,10 +74,16 @@ HRESULT dds_Blt( RECT dst_rect = { 0, 0, This->width, This->height }; if (lpSrcRect && src_surface) - memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); + { + //dbg_print_rect("lpSrcRect", lpSrcRect); + src_rect = *lpSrcRect; + } if (lpDestRect) - memcpy(&dst_rect, lpDestRect, sizeof(dst_rect)); + { + //dbg_print_rect("lpDestRect", lpDestRect); + dst_rect = *lpDestRect; + } int src_w = src_rect.right - src_rect.left; int src_h = src_rect.bottom - src_rect.top; @@ -456,7 +462,10 @@ HRESULT dds_BltFast( RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 }; if (lpSrcRect && src_surface) - memcpy(&src_rect, lpSrcRect, sizeof(src_rect)); + { + //dbg_print_rect("lpSrcRect", lpSrcRect); + src_rect = *lpSrcRect; + } int dst_x = dwX; int dst_y = dwY; From 3c1f7ea838a092789d8adafc0eeebb6563949546 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Nov 2024 18:31:04 +0100 Subject: [PATCH 312/557] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 960c634..a57f5c6 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Stronghold Crusader HD - Stronghold HD - Sudden Strike 2 +- Superbike 2000 - The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone @@ -330,6 +331,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness +- TianLong BaBu - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From 72a5982f48abfe2ed2b2777791205ce1b6e96297 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Nov 2024 21:25:37 +0100 Subject: [PATCH 313/557] add some more privileged instructions to the list --- src/debug.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/debug.c b/src/debug.c index 650c2b4..bc27843 100644 --- a/src/debug.c +++ b/src/debug.c @@ -150,6 +150,12 @@ LONG WINAPI dbg_vectored_exception_handler(EXCEPTION_POINTERS* exception) case 0xE7: // OUT ib size = 2; break; + case 0xF8: // CLC + case 0xF9: // STC + case 0xFA: // CLI + case 0xFB: // STI + case 0xFC: // CLD + case 0xFD: // STD case 0xEC: // IN ib case 0xED: // IN id case 0xEE: // OUT From e79654e620012b6c228e65f6611fe9be73999a53 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:06:44 +0100 Subject: [PATCH 314/557] add preset for Populous - The Beginning --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 63d04cf..9d12e9a 100644 --- a/src/config.c +++ b/src/config.c @@ -1361,6 +1361,10 @@ static void cfg_create_ini() "[PlayWTT]\n" "hook=3\n" "\n" + "; Populous - The Beginning\n" + "[popTB]\n" + "singlecpu=false\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From 957fe0bb028fe7c39121024801678ff69e8da18d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:10:58 +0100 Subject: [PATCH 315/557] add some presets --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index 9d12e9a..97e8808 100644 --- a/src/config.c +++ b/src/config.c @@ -499,6 +499,10 @@ static void cfg_create_ini() "[AN]\n" "adjmouse=true\n" "\n" + "; Another War\n" + "[AnotherWar]\n" + "singlecpu=false\n" + "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" @@ -616,6 +620,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Championship Manager 99-00\n" + "[cm9900]\n" + "singlecpu=false\n" + "\n" "; Command & Conquer: Sole Survivor\n" "[SOLE]\n" "maxgameticks=120\n" @@ -1623,6 +1631,10 @@ static void cfg_create_ini() "guard_lines=600\n" "minfps=-2\n" "\n" + "; Weird War\n" + "[WeirdWar]\n" + "singlecpu=false\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "sirtech_hack=true\n" From 2a0b4d58b26eafbfa24a0dc6165252079e64f69d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 00:15:27 +0100 Subject: [PATCH 316/557] sort readme --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index a57f5c6..410f212 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - American Girls Dress Designer - Amerzone - Anno 1602: Creation of a New World +- Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura - Arthur's Pet Chase @@ -74,12 +75,12 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Balls of Steel v1.2 - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 -- Barbie(tm) Beach Vacation(tm) +- Balls of Steel v1.2 - Barbie(R) Photo Designer +- Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill - Blade & Sword @@ -87,14 +88,15 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Blue's 123 Time Activities - Blue's Treasure Hunt - Caesar III (Sierra - 1998) -- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Call To Power 2 +- Callus 95 - CPS-1 (Capcom Play System 1) emulator - Capitalism II - Capitalism Lab - Captain Claw - Carmageddon - Carmageddon 2 - Casino Empire (AKA Hoyle Casino) +- Championship Manager 99-00 - Chaos Gate - Close Combat 2: A Bridge Too Far - Close Combat 3: The Russian Front @@ -153,9 +155,9 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 -- Final Liberation: Warhammer Epic 40000 (GOG) - Final fantasy VII - Final fantasy VIII +- Final Liberation: Warhammer Epic 40000 (GOG) - Freddi Fish - Freddi Fish 4 - Freddi Fish's One-Stop Fun Shop @@ -166,11 +168,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Freddi Water Worries - Future Cop L.A.P.D - G-Police +- Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz -- Gorasul: The Legacy of the Dragon - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 @@ -206,11 +208,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 +- M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD -- ​M.A.X. 2 Mechanized Assault & Exploration - Mech Warrior 3 - Megaman X4 - Metal Gear Solid @@ -239,11 +241,11 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Pacific General - Pajama Sam - Pajama Sam 3 +- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet - Pajama Sam's Games to Play on Any Day - Pajama Sam's One-Stop Fun Shop - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside -- Pajama Sam 3: You Are What You Eat From Your Head To Your Feet - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -277,12 +279,12 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D -- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) -- Reksio and the UFO (Reksio i Ufo) -- Reksio and the Wizards (Reksio i Czarodzieje) -- Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) +- Reksio and the Pirate Treasure (Reksio i Skarb Piratów) +- Reksio and the Time Machine (Reksio i Wehikuł Czasu) +- Reksio and the UFO (Reksio i Ufo) +- Reksio and the Wizards (Reksio i Czarodzieje) - Road Rash - Robin Hood - The Legend of Sherwood - RollerCoaster Tycoon @@ -344,8 +346,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Virtua Fighter PC - War Wind - War Wind II - Human Onslaught -- WarCraft 2000: Nuclear Epidemic - Warcraft 2 +- WarCraft 2000: Nuclear Epidemic - Warlords 3: Darklords Rising - Warlords Battlecry - Warlords Battlecry 2 @@ -359,7 +361,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Zoombinis Logical Journey - Zoombinis Mountain Rescue - Zuma Deluxe - - ... +- ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From b7c46047fb42f26b6f1c3c95048798f8d3d5b2a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 03:36:38 +0100 Subject: [PATCH 317/557] add preset for Lost Vikings 2 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 410f212..f1f38e6 100644 --- a/README.md +++ b/README.md @@ -208,6 +208,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 +- Lost Vikings 2 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math diff --git a/src/config.c b/src/config.c index 97e8808..e5f9f1c 100644 --- a/src/config.c +++ b/src/config.c @@ -1183,6 +1183,10 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Lost Vikings 2\n" + "[LOSTV95]\n" + "fake_mode=320x240x16\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" From ead0f2306e7608b1fd367508d55e7b6f89528bef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 04:13:50 +0100 Subject: [PATCH 318/557] add preset for Discoworld Noir --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index f1f38e6..1e99deb 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Disciples - Disciples 2 - Rise of the Elves - Divine Divinity +- Discoworld Noir - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice diff --git a/src/config.c b/src/config.c index e5f9f1c..9ff092f 100644 --- a/src/config.c +++ b/src/config.c @@ -873,6 +873,10 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "renderer=gdi\n" "\n" + "; Discoworld Noir\n" + "[dn]\n" + "fake_mode=640x480x16\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" From b4352232c8cfd99dd6cdf5e08aaea5ec5863e66b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 23 Nov 2024 17:07:51 +0100 Subject: [PATCH 319/557] improve logging --- src/IDirect3D/IDirect3D.c | 5 +++++ src/IDirect3D/IDirect3D2.c | 5 +++++ src/IDirect3D/IDirect3D3.c | 5 +++++ src/IDirect3D/IDirect3D7.c | 5 +++++ 4 files changed, 20 insertions(+) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index f6b075e..8c7c1c5 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, vo HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index c387d2a..2a83d47 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 72429c8..edc776b 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 35aa353..c058874 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -14,6 +14,11 @@ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, HRESULT ret = E_FAIL; + if (riid) + { + TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 6a22fcf142e83105d172cfc4832623f6ebefb3f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 19:29:50 +0100 Subject: [PATCH 320/557] improve logging --- src/dd.c | 2 ++ src/hook.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/dd.c b/src/dd.c index 0752a3f..f5df432 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1547,6 +1547,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if ((rc.right < real_GetSystemMetrics(SM_CXSCREEN) && rc.bottom < real_GetSystemMetrics(SM_CYSCREEN)) || !popup) { + TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); + g_ddraw.windowed_hack = TRUE; dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } diff --git a/src/hook.c b/src/hook.c index c10430d..d03f9ba 100644 --- a/src/hook.c +++ b/src/hook.c @@ -649,6 +649,8 @@ void hook_init() { /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; + + TRACE("g_config.hook = 3\n"); } } From e6c9eea47349344c212be6fabd59e4818ee34aa4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 21:20:29 +0100 Subject: [PATCH 321/557] log SetWindowsHookExA hook types --- inc/debug.h | 1 + src/debug.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 2 ++ 3 files changed, 54 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index 4eb5310..fa70c85 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -28,6 +28,7 @@ void dbg_dump_dds_flags(DWORD flags); void dbg_dump_dds_blt_fast_flags(DWORD flags); void dbg_dump_dds_lock_flags(DWORD flags); void dbg_dump_di_scm_flags(DWORD flags); +void dbg_dump_hook_type(int idHook); char* dbg_d3d9_hr_to_str(HRESULT hr); char* dbg_mes_to_str(int id); void __cdecl dbg_invoke_watson(wchar_t const*, wchar_t const*, wchar_t const*, unsigned int, uintptr_t); diff --git a/src/debug.c b/src/debug.c index bc27843..9d615b5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1114,6 +1114,57 @@ void dbg_dump_di_scm_flags(DWORD flags) #endif } +void dbg_dump_hook_type(int idHook) +{ +#ifdef _DEBUG + if (idHook == 0) { + TRACE(" WH_JOURNALRECORD\n"); + } + if (idHook == 1) { + TRACE(" WH_JOURNALPLAYBACK\n"); + } + if (idHook == 2) { + TRACE(" WH_KEYBOARD\n"); + } + if (idHook == 3) { + TRACE(" WH_GETMESSAGE\n"); + } + if (idHook == 4) { + TRACE(" WH_CALLWNDPROC\n"); + } + if (idHook == 5) { + TRACE(" WH_CBT\n"); + } + if (idHook == 6) { + TRACE(" WH_SYSMSGFILTER\n"); + } + if (idHook == 7) { + TRACE(" WH_MOUSE\n"); + } + if (idHook == 9) { + TRACE(" WH_DEBUG\n"); + } + if (idHook == 10) { + TRACE(" WH_SHELL\n"); + } + if (idHook == 11) { + TRACE(" WH_FOREGROUNDIDLE\n"); + } + if (idHook == 12) { + TRACE(" WH_CALLWNDPROCRET\n"); + } + if (idHook == 13) { + TRACE(" WH_KEYBOARD_LL\n"); + } + if (idHook == 14) { + TRACE(" WH_MOUSE_LL\n"); + } + if (idHook == -1) { + TRACE(" WH_MSGFILTER\n"); + } +#endif +} + char* dbg_d3d9_hr_to_str(HRESULT hr) { #define HR_TO_STR(x) if (x == hr) return #x diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 96f6d0f..eebc181 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -591,6 +591,8 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D dwThreadId, _ReturnAddress()); + dbg_dump_hook_type(idHook); + if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { return NULL; From 3332b8c90727b5b9c975f77fec9baa58ea438243 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Nov 2024 23:48:00 +0100 Subject: [PATCH 322/557] add preset for Pandora's Box Puzzle Game --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 1e99deb..2889333 100644 --- a/README.md +++ b/README.md @@ -241,6 +241,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Outlaws - Outlive - Pacific General +- Pandora's Box Puzzle Game - Pajama Sam - Pajama Sam 3 - Pajama Sam 3: You Are What You Eat From Your Head To Your Feet diff --git a/src/config.c b/src/config.c index 9ff092f..e0c07fd 100644 --- a/src/config.c +++ b/src/config.c @@ -1288,6 +1288,10 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Pandora's Box Puzzle Game\n" + "[Pandora's Box]\n" + "fixchilds=0\n" + "\n" "; Paddle Bash Hotshot\n" "[SPAGHSPaddle]\n" "no_compat_warning=true\n" From e0c00d3a362a43ba66a2bcfd4d6e00ab8a19a8be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 00:36:30 +0100 Subject: [PATCH 323/557] fix exe name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index e0c07fd..d0f9bda 100644 --- a/src/config.c +++ b/src/config.c @@ -1289,7 +1289,7 @@ static void cfg_create_ini() "renderer=gdi\n" "\n" "; Pandora's Box Puzzle Game\n" - "[Pandora's Box]\n" + "[Pandora]\n" "fixchilds=0\n" "\n" "; Paddle Bash Hotshot\n" From 7dc702800297cb476572d3c79ba3bf868cab0f8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 02:06:38 +0100 Subject: [PATCH 324/557] improve logging --- src/IDirectDraw/IDirectDraw.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 7bff5f0..443a592 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -328,8 +328,18 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", + __FUNCTION__, + This, + dwFlags, + lpDDSurfaceDesc, + lpContext, + lpEnumSurfacesCallback, + _ReturnAddress()); + HRESULT ret = DD_OK; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From a77c3c21dc75ad181f762c9528e61b0246ba6102 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 03:05:16 +0100 Subject: [PATCH 325/557] add preset for Star Wars Rebellion --- README.md | 1 + src/config.c | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 2889333..4a72a19 100644 --- a/README.md +++ b/README.md @@ -313,6 +313,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Star Wars Rebellion - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns diff --git a/src/config.c b/src/config.c index d0f9bda..eac85be 100644 --- a/src/config.c +++ b/src/config.c @@ -1466,6 +1466,16 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Star Wars Rebellion\n" + "[REBEXE]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "hook=2\n" + "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" "nonexclusive=true\n" From 3738213ab5c7f19eed4b9deefa4824f948a3a7a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 03:12:35 +0100 Subject: [PATCH 326/557] change debug string --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index d03f9ba..04ec2d3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -650,7 +650,7 @@ void hook_init() /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; - TRACE("g_config.hook = 3\n"); + TRACE("Switched to hook 3\n"); } } From f5ff8a19a90818565a21ef425e4498ce2c71aa76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Nov 2024 04:47:41 +0100 Subject: [PATCH 327/557] update supported games in readme --- README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4a72a19..8ee7f2f 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Army Men Air Tactics - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue @@ -83,6 +84,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill +- Birthright: The Gorgons Alliance - Blade & Sword - Blood II - The Chosen - Blue's 123 Time Activities @@ -128,6 +130,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Cultures 2 - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Dark Earth - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 @@ -138,8 +141,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Diablo: Hellfire - Disciples - Disciples 2 - Rise of the Elves -- Divine Divinity - Discoworld Noir +- Divine Divinity - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice @@ -221,6 +224,8 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 +- Moorhuhn Adventure: Fluch des Goldes +- Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 @@ -241,7 +246,6 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Outlaws - Outlive - Pacific General -- Pandora's Box Puzzle Game - Pajama Sam - Pajama Sam 3 - Pajama Sam 3: You Are What You Eat From Your Head To Your Feet @@ -249,6 +253,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Pajama Sam's One-Stop Fun Shop - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside +- Pandora's Box Puzzle Game - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -313,8 +318,9 @@ Need help and don't have a github account? Ask your questions on [Discord](https - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone -- Star Wars Rebellion +- Star Trek Generations - Star Wars Jedi Knight: Dark Forces II +- Star Wars Rebellion - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft From 48081e3f248b47e35a52bdc89a0a539a1cce48bf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 17:04:12 +0100 Subject: [PATCH 328/557] disable screensaver --- inc/config.h | 2 +- src/dllmain.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index 60c6eea..4e9731d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -22,7 +22,7 @@ typedef struct CNCDDRAWCONFIG INIFILE ini; BOOL d3d9on12; BOOL opengl_core; - + /* Optional settings */ BOOL fullscreen; diff --git a/src/dllmain.c b/src/dllmain.c index 701a79e..39d7dbb 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,6 +23,7 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; +static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -131,6 +132,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + BOOL screensaver_enabled = FALSE; + SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); + + if (screensaver_enabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); + g_screensaver_disabled = TRUE; + } + indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -151,6 +161,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); + if (g_screensaver_disabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); + } + ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From eafcdaf95dddc90febb94ee99fe2ebd0da56f103 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 19:33:23 +0100 Subject: [PATCH 329/557] use SetThreadExecutionState with ES_DISPLAY_REQUIRED --- src/dllmain.c | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 39d7dbb..37936a1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,7 +23,6 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; -static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -132,15 +131,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } - BOOL screensaver_enabled = FALSE; - SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); - - if (screensaver_enabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); - g_screensaver_disabled = TRUE; - } - + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -160,11 +151,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); - - if (g_screensaver_disabled) - { - SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); - } + SetThreadExecutionState(ES_CONTINUOUS); ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From 7505295e33e7a1932fe898be1e8c37c861e15227 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Nov 2024 20:12:46 +0100 Subject: [PATCH 330/557] Revert "use SetThreadExecutionState with ES_DISPLAY_REQUIRED" This reverts commit eafcdaf95dddc90febb94ee99fe2ebd0da56f103. --- src/dllmain.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 37936a1..39d7dbb 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -23,6 +23,7 @@ PVOID FakePrimarySurface; HMODULE g_ddraw_module; +static BOOL g_screensaver_disabled; BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { @@ -131,7 +132,15 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } - SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); + BOOL screensaver_enabled = FALSE; + SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); + + if (screensaver_enabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, FALSE, NULL, 0); + g_screensaver_disabled = TRUE; + } + indeo_enable(); timeBeginPeriod(1); hook_init(); @@ -151,7 +160,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) keyboard_hook_exit(); dinput_hook_exit(); hook_exit(); - SetThreadExecutionState(ES_CONTINUOUS); + + if (g_screensaver_disabled) + { + SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); + } ULONG(WINAPI* remove_handler)(PVOID) = (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "RemoveVectoredExceptionHandler"); From 895db5bf93afc6b50116dd86803261ad96888770 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 30 Nov 2024 23:39:11 +0100 Subject: [PATCH 331/557] SetThreadExecutionState for windows and SPI_SETSCREENSAVEACTIVE for WINE --- src/dllmain.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index 39d7dbb..97d675f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -132,6 +132,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + /* Make sure screensaver will stay off and monitors will stay on */ + SetThreadExecutionState(ES_CONTINUOUS | ES_DISPLAY_REQUIRED); + + /* WINE does not support SetThreadExecutionState so we'll have to use SPI_SETSCREENSAVEACTIVE instead */ BOOL screensaver_enabled = FALSE; SystemParametersInfoA(SPI_GETSCREENSAVEACTIVE, 0, &screensaver_enabled, 0); @@ -161,6 +165,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) dinput_hook_exit(); hook_exit(); + SetThreadExecutionState(ES_CONTINUOUS); + if (g_screensaver_disabled) { SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, TRUE, NULL, 0); From fd1bac4a38f8b152ce63e2837d614955df201f5a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 04:31:22 +0100 Subject: [PATCH 332/557] use SetThreadExecutionState only on XP and above --- inc/dllmain.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/dllmain.h b/inc/dllmain.h index 176d72a..f7e028b 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -29,4 +29,8 @@ typedef HRESULT(__stdcall* SETPROCESSDPIAWERENESSPROC)(PROCESS_DPI_AWARENESS); typedef BOOL(__stdcall* SETPROCESSDPIAWAREPROC)(); typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT); +#if (_WIN32_WINNT < _WIN32_WINNT_WINXP) +#define SetThreadExecutionState(a) +#endif + #endif From 14ff0a0d9ebce9bf7bd643a89e99d8d28fb8279c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Dec 2024 02:24:22 +0100 Subject: [PATCH 333/557] use ExitProcess instead of _exit to avoid issues --- src/wndproc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3d8823f..203f200 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -591,7 +591,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { - _exit(0); + ExitProcess(0); + //_exit(0); } if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) From a5aaf8cc9762c3e935f6a5f3cbea812415771a4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 01:12:09 +0100 Subject: [PATCH 334/557] fix build on macOS --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 08d74da..7c0dd2b 100644 --- a/Makefile +++ b/Makefile @@ -4,21 +4,21 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) +HASH := \# ECHOTEST := $(shell echo \"\") ifeq ($(ECHOTEST),\"\") # Windows - HASH := \# ECOMMIT := $(shell echo $(HASH)define GIT_COMMIT "$(COMMIT)" > inc/git.h) EBRANCH := $(shell echo $(HASH)define GIT_BRANCH "$(BRANCH)" >> inc/git.h) else # Either *nix or Windows with BusyBox (e.g. w64devkit) - ECOMMIT := $(shell echo "#define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) - EBRANCH := $(shell echo "#define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) + ECOMMIT := $(shell echo "$(HASH)define GIT_COMMIT" \"$(COMMIT)\" > inc/git.h) + EBRANCH := $(shell echo "$(HASH)define GIT_BRANCH" \"$(BRANCH)\" >> inc/git.h) endif ifdef DEBUG From 7e46fab834ad2bd08251576f65cac390820745ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 06:14:06 +0100 Subject: [PATCH 335/557] update supported games list --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 8ee7f2f..ef9d57c 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   -Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/afWXJNDDF5) (No registration required) - -  - ### Hotkeys * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor @@ -51,6 +47,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https ### Supported Games - Addiction Pinball +- Agharta the Hollow Earth - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors @@ -134,6 +131,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 +- Deadly Tide - Desperados: Wanted Dead or Alive - Diablo - Diablo 2 @@ -177,6 +175,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Hexen 95 - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 @@ -204,6 +203,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures From 31b8d0aff84c89b3da6d9a1b07204bab14a13b75 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:43:06 +0100 Subject: [PATCH 336/557] #364 add hack for Intel HD 4000 driver Build 10.18.10.4252 bug - disable multipass shader --- inc/opengl_utils.h | 1 + src/opengl_utils.c | 2 ++ src/render_ogl.c | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/inc/opengl_utils.h b/inc/opengl_utils.h index 4449951..d84dd20 100644 --- a/inc/opengl_utils.h +++ b/inc/opengl_utils.h @@ -115,5 +115,6 @@ extern HMODULE g_oglu_hmodule; extern BOOL g_oglu_got_version2; extern BOOL g_oglu_got_version3; extern char g_oglu_version[]; +extern char g_oglu_version_long[]; #endif diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 8062fdd..e315b15 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -95,6 +95,7 @@ HMODULE g_oglu_hmodule; BOOL g_oglu_got_version2; BOOL g_oglu_got_version3; char g_oglu_version[128]; +char g_oglu_version_long[128]; BOOL oglu_load_dll() { @@ -201,6 +202,7 @@ void oglu_init() if (glversion) { strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); + strncpy(g_oglu_version_long, glversion, sizeof(g_oglu_version_long) - 1); g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */ strtok(g_oglu_version, " "); } diff --git a/src/render_ogl.c b/src/render_ogl.c index efde47f..1630fc5 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,6 +248,26 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } + + /* Hack for Intel HD 4000 driver bug - disable multipass shader */ + + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) + { + char shader_path_tmp[MAX_PATH] = { 0 }; + strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); + + if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) + { + strcat(shader_path_tmp, ".pass1"); + + if (FILE_EXISTS(shader_path_tmp)) + { + shader_path[0] = 0; + g_config.shader[0] = 0; + } + } + } + /* detect common upscaling shaders and disable them if no upscaling is required */ BOOL is_upscaler = From 0843d5b9fcaea99b0e586a7a2b3a58d9e5df4ffe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:52:36 +0100 Subject: [PATCH 337/557] add strncpy fix --- src/render_ogl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index 1630fc5..7830f02 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,6 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); + shader_path[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From 4ff49faa89cc726688c59d83fab6591c0c91dfc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:52:48 +0100 Subject: [PATCH 338/557] fix for last commit --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 7830f02..4d8024a 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,7 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - shader_path[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ + strncpy fix[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From ca35888d877bd4008cd765841a55ddefcb8698f2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 20:53:01 +0100 Subject: [PATCH 339/557] fix for last commit --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4d8024a..7c5fd4c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -255,7 +255,7 @@ static void ogl_build_programs() { char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - strncpy fix[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ + shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { From 1bb1ffd8b814ab0512c74c44fc32e145743cefde Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 10 Dec 2024 22:01:55 +0100 Subject: [PATCH 340/557] align --- src/render_ogl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 7c5fd4c..77e7c95 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,12 +248,12 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } - /* Hack for Intel HD 4000 driver bug - disable multipass shader */ if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) { char shader_path_tmp[MAX_PATH] = { 0 }; + strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ From ebbdf370bed3e789244dd4d89cb74da18d602816 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 06:17:01 +0100 Subject: [PATCH 341/557] bump experimental build --- inc/version.h | 1 - 1 file changed, 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index a7ac8d9..c310b4b 100644 --- a/inc/version.h +++ b/inc/version.h @@ -3,7 +3,6 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) -#define git_str(a) str(a) #define VERSION_MAJOR 7 #define VERSION_MINOR 0 From f9f15f65e08d794d0a12f27c082445fff0171e37 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 18:52:35 +0100 Subject: [PATCH 342/557] #364 add hack for intel hd 4000 build 10.18.10.5161 --- src/render_ogl.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 77e7c95..728a5ea 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -250,7 +250,8 @@ static void ogl_build_programs() /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0) + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || + _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { char shader_path_tmp[MAX_PATH] = { 0 }; From 8a770092e1399c1c79753a675f281a2da429a378 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 19:14:54 +0100 Subject: [PATCH 343/557] add temp logs --- src/render_ogl.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 728a5ea..fd1dd6e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -249,10 +249,11 @@ static void ogl_build_programs() } /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - + TRACE(" OGL Version=%s\n", g_oglu_version_long); if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { + TRACE(" OGL 1\n"); char shader_path_tmp[MAX_PATH] = { 0 }; strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); @@ -260,10 +261,12 @@ static void ogl_build_programs() if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) { + TRACE(" OGL 2\n"); strcat(shader_path_tmp, ".pass1"); if (FILE_EXISTS(shader_path_tmp)) { + TRACE(" OGL 3\n"); shader_path[0] = 0; g_config.shader[0] = 0; } From 89d7b0f63d79b4176e9b365571d8a908619ff98c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 11 Dec 2024 20:29:04 +0100 Subject: [PATCH 344/557] always use default shader for HD 4000 --- src/render_ogl.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index fd1dd6e..4bb0969 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,29 +248,13 @@ static void ogl_build_programs() _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } - /* Hack for Intel HD 4000 driver bug - disable multipass shader */ - TRACE(" OGL Version=%s\n", g_oglu_version_long); + /* Hack for Intel HD 4000 driver bug - force default shader */ + if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - TRACE(" OGL 1\n"); - char shader_path_tmp[MAX_PATH] = { 0 }; - - strncpy(shader_path_tmp, shader_path, sizeof(shader_path_tmp)); - shader_path_tmp[sizeof(shader_path_tmp) - 1] = '\0'; /* strncpy fix */ - - if (strlen(shader_path_tmp) <= sizeof(shader_path_tmp) - 8) - { - TRACE(" OGL 2\n"); - strcat(shader_path_tmp, ".pass1"); - - if (FILE_EXISTS(shader_path_tmp)) - { - TRACE(" OGL 3\n"); - shader_path[0] = 0; - g_config.shader[0] = 0; - } - } + shader_path[0] = 0; + g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From ca8ba0d3bb60fcd2712b04c3de95a57c83a91af2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 06:59:07 +0100 Subject: [PATCH 345/557] update supported games list and add presets --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- src/config.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ef9d57c..96d4796 100644 --- a/README.md +++ b/README.md @@ -46,8 +46,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- Abomination - The Nemesis Project - Addiction Pinball -- Agharta the Hollow Earth - Age of Empires - Age of Empires II - Age of Empires II: The Conquerors @@ -55,11 +55,14 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic +- Agharta the Hollow Earth - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) - American Girls Dress Designer - Amerzone +- Ancient Conquest +- Ancient Evil - Anno 1602: Creation of a New World - Another War - Anstoss 3 @@ -83,6 +86,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Batman: Toxic Chill - Birthright: The Gorgons Alliance - Blade & Sword +- Blitzkrieg anthology +- Blitzkrieg anthology: Burning Horizon +- Blitzkrieg anthology: Rolling Thunder - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt @@ -97,6 +103,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Casino Empire (AKA Hoyle Casino) - Championship Manager 99-00 - Chaos Gate +- Clans - Close Combat 2: A Bridge Too Far - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge @@ -129,9 +136,12 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Castleblanca Quest - Dark Earth - Dark Reign: The Future of War +- Day Of The Tentacle +- Daytona - Daytona USA (Sega - 1996) - Deadlock 2 - Deadly Tide +- Delta Force - Desperados: Wanted Dead or Alive - Diablo - Diablo 2 @@ -141,6 +151,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Disciples 2 - Rise of the Elves - Discoworld Noir - Divine Divinity +- Doom 95 - Dragon Throne: Battle of Red Cliffs - DuelSavior - DuelSavior: Justice @@ -152,9 +163,12 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Emperor: Rise of the Middle Kingdom - Enemy Infestation - Escape Velocity Nova +- Excalibur 2555AD - F-16 Multirole Fighter - F-22 Raptor +- Fable - Fairy Tale About Father Frost, Ivan and Nastya +- Falcon 4.0 (Microprose version) - Fallout - Fallout 2 - Final fantasy VII @@ -168,25 +182,36 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Freddi Fish: The Case of the Haunted Schoolhouse - Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch - Freddi Water Worries +- Full Throttle - Future Cop L.A.P.D - G-Police +- Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz -- Hexen 95 - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory +- Heart of Darkness - Hearts of Iron 2 +- Heroes Chronicles: Clash of the Dragons +- Heroes Chronicles: Conquest of the Underworld +- Heroes Chronicles: Masters of the Elements +- Heroes Chronicles: Warlords of the Wasteland +- Heroes of Might and Magic - Heroes of Might and Magic II - Heroes of Might and Magic III - Heroes of Might and Magic IV +- Hexen 95 - Hooligans: Storm over Europe - Hugo Gold - Hugo Wild River - Icewind Dale - Icewind Dale 2 +- Ignition +- Indiana Jones and the Fate of Atlantis +- Indiana Jones and the Last Crusade - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus @@ -216,6 +241,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math +- Mageslayer - Majesty Gold - Majesty Gold HD - Mech Warrior 3 @@ -236,15 +262,18 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Nancy Drew: Stay Tuned For Danger - Nancy Drew: The Secret of Shadow Ranch - Nancy Drew: Treasure in the Royal Tower +- NBA Action '98 - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson - NexusTk +- Nightmare Creatures - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee - Outlaws - Outlive +- Outwars (software mode) - Pacific General - Pajama Sam - Pajama Sam 3 @@ -254,6 +283,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) - Pajama Sam: No Need to Hide When It's Dark Outside - Pandora's Box Puzzle Game +- Panzer Dragoon - Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) @@ -293,8 +323,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and the UFO (Reksio i Ufo) - Reksio and the Wizards (Reksio i Czarodzieje) +- Resurrection - The Return of the Black Dragon (software mode) +- Rising Lands (patched) - Road Rash - Robin Hood - The Legend of Sherwood +- Roland Garros 98 (software mode) - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon @@ -307,20 +340,29 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division +- Sid Meier's Simgolf - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc +- Simon the Sorcerer 1/2 (windows 95 version) - Sonic 3D Blast - Space Rangers +- Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Star Trek Away Team - Star Trek Generations +- Star Wars - Pit Droids +- Star Wars Anakin's Speedway +- Star Wars Early Learning Activity Center +- Star Wars Episode I: The Gungan Frontier - Star Wars Jedi Knight: Dark Forces II - Star Wars Rebellion +- Star Wars Yoda's Challenge - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft @@ -336,6 +378,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Stronghold HD - Sudden Strike 2 - Superbike 2000 +- The Curse Of Monkey Island +- The Dig - The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone @@ -344,9 +388,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Three Kingdoms: Fate of the Dragon - Throne of Darkness - TianLong BaBu +- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms +- Toy Story - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown @@ -362,6 +408,8 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Warlords Battlecry - Warlords Battlecry 2 - Warlords Battlecry 3 +- Weird War +- Wing Commander - The Kilrathi Saga - Wizardry 8 - Wizards and Warriors - Worms 2 diff --git a/src/config.c b/src/config.c index eac85be..f5e723e 100644 --- a/src/config.c +++ b/src/config.c @@ -427,6 +427,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Abomination - The Nemesis Project\n" + "[abomb]\n" + "singlecpu=false\n" + "\n" "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" @@ -877,6 +881,10 @@ static void cfg_create_ini() "[dn]\n" "fake_mode=640x480x16\n" "\n" + "; Excalibur 2555AD\n" + "[_FISH]\n" + "singlecpu=false\n" + "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" @@ -899,6 +907,14 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; Fable\n" + "[FABLE]\n" + "singlecpu=false\n" + "\n" + "; Falcon 4.0 (Microprose version)\n" + "[falcon4]\n" + "singlecpu=false\n" + "\n" "; Flight Simulator 98\n" "[FLTSIM95]\n" "flightsim98_hack=true\n" @@ -964,6 +980,7 @@ static void cfg_create_ini() "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" + "singlecpu=false\n" "\n" "; Gangsters: Organized Crime\n" "[gangsters]\n" @@ -1191,6 +1208,15 @@ static void cfg_create_ini() "[LOSTV95]\n" "fake_mode=320x240x16\n" "\n" + "; Nightmare Creatures\n" + "[NC]\n" + "maxgameticks=30\n" + "singlecpu=false\n" + "\n" + "; Moto Racer (software mode)\n" + "[moto]\n" + "maxgameticks=59\n" + "\n" "; Madeline 1st Grade Math\n" "[madmath1]\n" "nonexclusive=true\n" @@ -1377,6 +1403,10 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" + "; Panzer Dragoon\n" + "[PANZERDG]\n" + "singlecpu=false\n" + "\n" "; Play with the Teletubbies\n" "[PlayWTT]\n" "hook=3\n" @@ -1428,12 +1458,20 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Rising Lands (patched)\n" + "[Rising]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood (GOG)\n" "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "fix_not_responding=true\n" "\n" + "; Roland Garros 98 (software mode)\n" + "[rg98]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" @@ -1450,6 +1488,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "fake_mode=640x480x32\n" "\n" + "; Sid Meier's Simgolf\n" + "[golf]\n" + "fake_mode=640x480x16\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" @@ -1553,6 +1595,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; The Curse Of Monkey Island\n" + "[COMI]\n" + "singlecpu=false\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 40a9ff30360bed64f69d72032d034fb4a3a2905e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 19:10:34 +0100 Subject: [PATCH 346/557] #316 fix crash on opengl 1.1 --- src/render_ogl.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 4bb0969..b9d5028 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -934,6 +934,11 @@ static void ogl_render() { glEnable(GL_TEXTURE_2D); } + else // 8 bpp only works with a shader (opengl 2.0 or above) + { + g_ogl.use_opengl = FALSE; + return; + } DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; @@ -1155,7 +1160,9 @@ static void ogl_render() } } - glActiveTexture(GL_TEXTURE0); + if (glActiveTexture) + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); if (g_ddraw.bpp == 8) From 2dbebf8cef55b479f1cd17036fa25e06d888f8b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 12 Dec 2024 22:31:01 +0100 Subject: [PATCH 347/557] update supported games list and add presets --- README.md | 9 +++++++++ src/config.c | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/README.md b/README.md index 96d4796..92987e0 100644 --- a/README.md +++ b/README.md @@ -191,6 +191,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Gilbert Goodmate And The Mushroom Of Phungoria - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Heart of Darkness @@ -238,6 +239,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Locomotion - Lode Runner 2 - Lost Vikings 2 +- Links Extreme - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math @@ -317,6 +319,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D +- Rent-A-Hero - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) @@ -384,6 +387,11 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD +- The Last Express +- The Neverhood +- The Rocky Interactive Horror Show +- The Next Worlds +- The Sex Files - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness @@ -419,6 +427,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Zoombinis Logical Journey - Zoombinis Mountain Rescue - Zuma Deluxe +- Zork Nemesis - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. diff --git a/src/config.c b/src/config.c index f5e723e..e6b6738 100644 --- a/src/config.c +++ b/src/config.c @@ -1204,6 +1204,10 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Links Extreme\n" + "[EXTREME]\n" + "singlecpu=false\n" + "\n" "; Lost Vikings 2\n" "[LOSTV95]\n" "fake_mode=320x240x16\n" @@ -1453,6 +1457,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=3\n" "\n" + "; Rent-A-Hero\n" + "[Rent-A-Hero]\n" + "singlecpu=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" @@ -1621,6 +1629,10 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" + "; The Neverhood\n" + "[nhc]\n" + "singlecpu=false\n" + "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" @@ -1727,6 +1739,10 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" + "; Zork Nemesis\n" + "[znemesis]\n" + "singlecpu=false\n" + "\n" , fh); fclose(fh); From 7f8bc1bc560726825bacacac32e3f5fab8362926 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Dec 2024 06:50:12 +0100 Subject: [PATCH 348/557] don't set dds_unlock_limiter_disabled on colorfill --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index eee23ed..1acbc0d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -436,7 +436,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && !(dwFlags & DDBLT_COLORFILL)) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); From 02f706e3bb48aa330652f5d4e5879bb53e53483f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 13 Dec 2024 20:23:56 +0100 Subject: [PATCH 349/557] Revert "don't set dds_unlock_limiter_disabled on colorfill" This reverts commit 7f8bc1bc560726825bacacac32e3f5fab8362926. --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 1acbc0d..eee23ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -436,7 +436,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0 && !(dwFlags & DDBLT_COLORFILL)) + if (g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); From 6dcfe783985653f926e565fae26373c5c92dab39 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:01:38 +0100 Subject: [PATCH 350/557] add support for 7th Legion --- README.md | 1 + inc/config.h | 1 + src/config.c | 6 ++++++ src/wndproc.c | 3 +++ 4 files changed, 11 insertions(+) diff --git a/README.md b/README.md index 92987e0..e8c27d2 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cultures 2 - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle diff --git a/inc/config.h b/inc/config.h index 4e9731d..de782b5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -106,6 +106,7 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; + BOOL seventhlegion_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index e6b6738..09b6ea6 100644 --- a/src/config.c +++ b/src/config.c @@ -116,6 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", TRUE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -391,6 +392,11 @@ static void cfg_create_ini() "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" + "; 7th Legion\n" + "[legion]\n" + "maxgameticks=25\n" + "seventhlegion_hack=true\n" + "\n" "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" diff --git a/src/wndproc.c b/src/wndproc.c index 203f200..774e534 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,6 +101,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { + if (g_config.seventhlegion_hack) + break; + LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); if (!g_config.resizable) From 7c4abe5ef0f7c065c91b1196779e6f8bf8418407 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:02:24 +0100 Subject: [PATCH 351/557] do not enable setting by default --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 09b6ea6..6e6a9e6 100644 --- a/src/config.c +++ b/src/config.c @@ -116,7 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); - GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", TRUE); + GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From b0ec4851ae9a50f76816344a5b6be7583d3edd06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:03:24 +0100 Subject: [PATCH 352/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e8c27d2..a78f357 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- 7th Legion - Abomination - The Nemesis Project - Addiction Pinball - Age of Empires From 3a6075b928166d8d2aef61a86846430b9841d0f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:17:05 +0100 Subject: [PATCH 353/557] tweak IAT hooks --- src/hook.c | 38 ++++++++++++++++---------------------- src/utils.c | 16 +++++++--------- 2 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/hook.c b/src/hook.c index 04ec2d3..6533a4d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -210,17 +210,15 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); while (import_desc->FirstThunk) { @@ -232,13 +230,13 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); while (first_thunk->u1.Function) { @@ -332,17 +330,15 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)hmod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)hmod + import_desc_rva); while (import_desc->FirstThunk) { @@ -354,12 +350,12 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)hmod + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)hmod + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)hmod + import_desc->OriginalFirstThunk); while (first_thunk->u1.Function) { @@ -450,27 +446,25 @@ BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return FALSE; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return FALSE; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); while (import_desc->FirstThunk) { if (import_desc->Name) { - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); if (_stricmp(imp_module_name, "ddraw.dll") == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); if (first_thunk->u1.Function) return TRUE; diff --git a/src/utils.c b/src/utils.c index 15a52ea..91f41d9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -117,17 +117,15 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return NULL; - PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)dos_header + (DWORD)dos_header->e_lfanew); + PIMAGE_NT_HEADERS nt_headers = (PIMAGE_NT_HEADERS)((DWORD)mod + (DWORD)dos_header->e_lfanew); if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return NULL; DWORD import_desc_rva = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; - DWORD import_desc_size = nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; - - if (import_desc_rva == 0 || import_desc_size == 0) + if (!import_desc_rva) return NULL; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)mod + import_desc_rva); while (import_desc->FirstThunk) { @@ -137,12 +135,12 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) continue; } - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); + char* imp_module_name = (char*)((DWORD)mod + import_desc->Name); if (_stricmp(imp_module_name, module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); - PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)dos_header + import_desc->OriginalFirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)mod + import_desc->FirstThunk); + PIMAGE_THUNK_DATA o_first_thunk = (void*)((DWORD)mod + import_desc->OriginalFirstThunk); while (first_thunk->u1.Function) { @@ -153,7 +151,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) continue; } - PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)mod + o_first_thunk->u1.AddressOfData); if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { From 238d2f6ee5d3c806e47e3464ef307e4d51d1a97f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 02:32:55 +0100 Subject: [PATCH 354/557] add preset for F16 Agressor --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index a78f357..3672d86 100644 --- a/README.md +++ b/README.md @@ -166,6 +166,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Enemy Infestation - Escape Velocity Nova - Excalibur 2555AD +- F-16 Agressor - F-16 Multirole Fighter - F-22 Raptor - Fable diff --git a/src/config.c b/src/config.c index 6e6a9e6..7a5d7ce 100644 --- a/src/config.c +++ b/src/config.c @@ -913,6 +913,10 @@ static void cfg_create_ini() "[EI]\n" "hook_peekmessage=true\n" "\n" + "; F-16 Agressor\n" + "[f-16]\n" + "resolutions=1\n" + "\n" "; Fable\n" "[FABLE]\n" "singlecpu=false\n" From dab64437f149d87ac010338ebb7f113a0e393a6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 04:37:57 +0100 Subject: [PATCH 355/557] add preset for Dreams to Realty --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 3672d86..c765dbf 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Deadly Tide - Delta Force - Desperados: Wanted Dead or Alive +- Dreams to Realty - Diablo - Diablo 2 - Diablo 2: Lord of Destruction diff --git a/src/config.c b/src/config.c index 7a5d7ce..29e1b83 100644 --- a/src/config.c +++ b/src/config.c @@ -862,6 +862,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "noactivateapp=true\n" "\n" + "; Dreams to Realty\n" + "[windream]\n" + "maxgameticks=60\n" + "\n" "; Deadlock 2\n" "[DEADLOCK]\n" "fixchilds=0\n" From 8bae36ca0f1799ffd3111cfbdf0bf378dffeed6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 05:17:17 +0100 Subject: [PATCH 356/557] add preset for Return to Krondor --- README.md | 2 ++ src/config.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index c765dbf..1e5bbe8 100644 --- a/README.md +++ b/README.md @@ -324,6 +324,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Real War - Red Baron 3D - Rent-A-Hero +- Return to Krondor - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) @@ -353,6 +354,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) +- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sonic 3D Blast - Space Rangers - Spec Ops - Ranger Assault (software mode) diff --git a/src/config.c b/src/config.c index 29e1b83..6da6906 100644 --- a/src/config.c +++ b/src/config.c @@ -1471,6 +1471,11 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=3\n" "\n" + "; Return to Krondor\n" + "[RtK]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" "singlecpu=false\n" From 665e244ffe7ffb49d98f82b0e14ae8588bc3c29b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 19:11:31 +0100 Subject: [PATCH 357/557] update presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 6da6906..4839a05 100644 --- a/src/config.c +++ b/src/config.c @@ -396,6 +396,7 @@ static void cfg_create_ini() "[legion]\n" "maxgameticks=25\n" "seventhlegion_hack=true\n" + "singlecpu=false\n" "\n" "; Atrox\n" "[Atrox]\n" @@ -1475,6 +1476,8 @@ static void cfg_create_ini() "[RtK]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" + "singlecpu=false\n" + "limiter_type=2\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" @@ -1616,6 +1619,7 @@ static void cfg_create_ini() "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" + "maxgameticks=30" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From ac19dec2c49a2d9d69f959b867ad638602062ff6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Dec 2024 21:08:41 +0100 Subject: [PATCH 358/557] remove kings quest preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 4839a05..e26e71f 100644 --- a/src/config.c +++ b/src/config.c @@ -1144,10 +1144,6 @@ static void cfg_create_ini() "[jeoppc]\n" "singlecpu=false\n" "\n" - "; Kings Quest 8\n" - "[Mask]\n" - "renderer=opengl\n" - "\n" "; Konung\n" "[konung]\n" "fixchilds=0\n" From 806924f86ebab6d8b36a55244610675904547d6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:05:51 +0100 Subject: [PATCH 359/557] assign default palette to primary surface --- inc/ddpalette.h | 261 ++++++++++++++++++++++++++++++++++++++++++++++++ src/ddpalette.c | 2 +- src/ddsurface.c | 17 +++- 3 files changed, 277 insertions(+), 3 deletions(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index 7d264db..ebb4479 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -11,4 +11,265 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); +// Original palette copied from Windows ME +static PALETTEENTRY g_ddp_me_palette[] = +{ + { 0, 0, 0, 0 }, + { 128, 0, 0, 0 }, + { 0, 128, 0, 0 }, + { 128, 128, 0, 0 }, + { 0, 0, 128, 0 }, + { 128, 0, 128, 0 }, + { 0, 128, 128, 0 }, + { 192, 192, 192, 0 }, + { 192, 220, 192, 0 }, + { 166, 202, 240, 0 }, + { 95, 63, 63, 0 }, + { 127, 63, 63, 0 }, + { 159, 63, 63, 0 }, + { 191, 63, 63, 0 }, + { 223, 63, 63, 0 }, + { 255, 63, 63, 0 }, + { 63, 95, 63, 0 }, + { 95, 95, 63, 0 }, + { 127, 95, 63, 0 }, + { 159, 95, 63, 0 }, + { 191, 95, 63, 0 }, + { 223, 95, 63, 0 }, + { 255, 95, 63, 0 }, + { 63, 127, 63, 0 }, + { 95, 127, 63, 0 }, + { 127, 127, 63, 0 }, + { 159, 127, 63, 0 }, + { 191, 127, 63, 0 }, + { 223, 127, 63, 0 }, + { 255, 127, 63, 0 }, + { 63, 159, 63, 0 }, + { 95, 159, 63, 0 }, + { 127, 159, 63, 0 }, + { 159, 159, 63, 0 }, + { 191, 159, 63, 0 }, + { 223, 159, 63, 0 }, + { 255, 159, 63, 0 }, + { 63, 191, 63, 0 }, + { 95, 191, 63, 0 }, + { 127, 191, 63, 0 }, + { 159, 191, 63, 0 }, + { 191, 191, 63, 0 }, + { 223, 191, 63, 0 }, + { 255, 191, 63, 0 }, + { 63, 223, 63, 0 }, + { 95, 223, 63, 0 }, + { 127, 223, 63, 0 }, + { 159, 223, 63, 0 }, + { 191, 223, 63, 0 }, + { 223, 223, 63, 0 }, + { 255, 223, 63, 0 }, + { 63, 255, 63, 0 }, + { 95, 255, 63, 0 }, + { 127, 255, 63, 0 }, + { 159, 255, 63, 0 }, + { 191, 255, 63, 0 }, + { 223, 255, 63, 0 }, + { 255, 255, 63, 0 }, + { 63, 63, 95, 0 }, + { 95, 63, 95, 0 }, + { 127, 63, 95, 0 }, + { 159, 63, 95, 0 }, + { 191, 63, 95, 0 }, + { 223, 63, 95, 0 }, + { 255, 63, 95, 0 }, + { 63, 95, 95, 0 }, + { 95, 95, 95, 0 }, + { 127, 95, 95, 0 }, + { 159, 95, 95, 0 }, + { 191, 95, 95, 0 }, + { 223, 95, 95, 0 }, + { 255, 95, 95, 0 }, + { 63, 127, 95, 0 }, + { 95, 127, 95, 0 }, + { 127, 127, 95, 0 }, + { 159, 127, 95, 0 }, + { 191, 127, 95, 0 }, + { 223, 127, 95, 0 }, + { 255, 127, 95, 0 }, + { 63, 159, 95, 0 }, + { 95, 159, 95, 0 }, + { 127, 159, 95, 0 }, + { 159, 159, 95, 0 }, + { 191, 159, 95, 0 }, + { 223, 159, 95, 0 }, + { 255, 159, 95, 0 }, + { 63, 191, 95, 0 }, + { 95, 191, 95, 0 }, + { 127, 191, 95, 0 }, + { 159, 191, 95, 0 }, + { 191, 191, 95, 0 }, + { 223, 191, 95, 0 }, + { 255, 191, 95, 0 }, + { 63, 223, 95, 0 }, + { 95, 223, 95, 0 }, + { 127, 223, 95, 0 }, + { 159, 223, 95, 0 }, + { 191, 223, 95, 0 }, + { 223, 223, 95, 0 }, + { 255, 223, 95, 0 }, + { 63, 255, 95, 0 }, + { 95, 255, 95, 0 }, + { 127, 255, 95, 0 }, + { 159, 255, 95, 0 }, + { 191, 255, 95, 0 }, + { 223, 255, 95, 0 }, + { 255, 255, 95, 0 }, + { 63, 63, 127, 0 }, + { 95, 63, 127, 0 }, + { 127, 63, 127, 0 }, + { 159, 63, 127, 0 }, + { 191, 63, 127, 0 }, + { 223, 63, 127, 0 }, + { 255, 63, 127, 0 }, + { 63, 95, 127, 0 }, + { 95, 95, 127, 0 }, + { 127, 95, 127, 0 }, + { 159, 95, 127, 0 }, + { 191, 95, 127, 0 }, + { 223, 95, 127, 0 }, + { 255, 95, 127, 0 }, + { 63, 127, 127, 0 }, + { 95, 127, 127, 0 }, + { 127, 127, 127, 0 }, + { 159, 127, 127, 0 }, + { 191, 127, 127, 0 }, + { 223, 127, 127, 0 }, + { 255, 127, 127, 0 }, + { 63, 159, 127, 0 }, + { 95, 159, 127, 0 }, + { 127, 159, 127, 0 }, + { 159, 159, 127, 0 }, + { 191, 159, 127, 0 }, + { 223, 159, 127, 0 }, + { 255, 159, 127, 0 }, + { 63, 191, 127, 0 }, + { 95, 191, 127, 0 }, + { 127, 191, 127, 0 }, + { 159, 191, 127, 0 }, + { 191, 191, 127, 0 }, + { 223, 191, 127, 0 }, + { 255, 191, 127, 0 }, + { 63, 223, 127, 0 }, + { 95, 223, 127, 0 }, + { 127, 223, 127, 0 }, + { 159, 223, 127, 0 }, + { 191, 223, 127, 0 }, + { 223, 223, 127, 0 }, + { 255, 223, 127, 0 }, + { 63, 255, 127, 0 }, + { 95, 255, 127, 0 }, + { 127, 255, 127, 0 }, + { 159, 255, 127, 0 }, + { 191, 255, 127, 0 }, + { 223, 255, 127, 0 }, + { 255, 255, 127, 0 }, + { 63, 63, 159, 0 }, + { 95, 63, 159, 0 }, + { 127, 63, 159, 0 }, + { 159, 63, 159, 0 }, + { 191, 63, 159, 0 }, + { 223, 63, 159, 0 }, + { 255, 63, 159, 0 }, + { 63, 95, 159, 0 }, + { 95, 95, 159, 0 }, + { 127, 95, 159, 0 }, + { 159, 95, 159, 0 }, + { 191, 95, 159, 0 }, + { 223, 95, 159, 0 }, + { 255, 95, 159, 0 }, + { 63, 127, 159, 0 }, + { 95, 127, 159, 0 }, + { 127, 127, 159, 0 }, + { 159, 127, 159, 0 }, + { 191, 127, 159, 0 }, + { 223, 127, 159, 0 }, + { 255, 127, 159, 0 }, + { 63, 159, 159, 0 }, + { 95, 159, 159, 0 }, + { 127, 159, 159, 0 }, + { 159, 159, 159, 0 }, + { 191, 159, 159, 0 }, + { 223, 159, 159, 0 }, + { 255, 159, 159, 0 }, + { 63, 191, 159, 0 }, + { 95, 191, 159, 0 }, + { 127, 191, 159, 0 }, + { 159, 191, 159, 0 }, + { 191, 191, 159, 0 }, + { 223, 191, 159, 0 }, + { 255, 191, 159, 0 }, + { 63, 223, 159, 0 }, + { 95, 223, 159, 0 }, + { 127, 223, 159, 0 }, + { 159, 223, 159, 0 }, + { 191, 223, 159, 0 }, + { 223, 223, 159, 0 }, + { 255, 223, 159, 0 }, + { 63, 255, 159, 0 }, + { 95, 255, 159, 0 }, + { 127, 255, 159, 0 }, + { 159, 255, 159, 0 }, + { 191, 255, 159, 0 }, + { 223, 255, 159, 0 }, + { 255, 255, 159, 0 }, + { 63, 63, 191, 0 }, + { 95, 63, 191, 0 }, + { 127, 63, 191, 0 }, + { 159, 63, 191, 0 }, + { 191, 63, 191, 0 }, + { 223, 63, 191, 0 }, + { 255, 63, 191, 0 }, + { 63, 95, 191, 0 }, + { 95, 95, 191, 0 }, + { 127, 95, 191, 0 }, + { 159, 95, 191, 0 }, + { 191, 95, 191, 0 }, + { 223, 95, 191, 0 }, + { 255, 95, 191, 0 }, + { 63, 127, 191, 0 }, + { 95, 127, 191, 0 }, + { 127, 127, 191, 0 }, + { 159, 127, 191, 0 }, + { 191, 127, 191, 0 }, + { 223, 127, 191, 0 }, + { 255, 127, 191, 0 }, + { 63, 159, 191, 0 }, + { 95, 159, 191, 0 }, + { 127, 159, 191, 0 }, + { 159, 159, 191, 0 }, + { 191, 159, 191, 0 }, + { 223, 159, 191, 0 }, + { 255, 159, 191, 0 }, + { 63, 191, 191, 0 }, + { 95, 191, 191, 0 }, + { 127, 191, 191, 0 }, + { 159, 191, 191, 0 }, + { 191, 191, 191, 0 }, + { 223, 191, 191, 0 }, + { 255, 191, 191, 0 }, + { 63, 223, 191, 0 }, + { 95, 223, 191, 0 }, + { 127, 223, 191, 0 }, + { 159, 223, 191, 0 }, + { 191, 223, 191, 0 }, + { 223, 223, 191, 0 }, + { 255, 251, 240, 0 }, + { 58, 109, 165, 0 }, + { 128, 128, 128, 0 }, + { 255, 0, 0, 0 }, + { 0, 255, 0, 0 }, + { 255, 255, 0, 0 }, + { 0, 0, 255, 0 }, + { 255, 0, 255, 0 }, + { 0, 255, 255, 0 }, + { 255, 255, 255, 0 } +}; + #endif diff --git a/src/ddpalette.c b/src/ddpalette.c index ed2b858..e7bde4b 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -84,7 +84,7 @@ HRESULT dd_CreatePalette( p->lpVtbl = &g_ddp_vtbl; p->flags = dwFlags; - ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); + ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); IDirectDrawPalette_AddRef(p); *lpDDPalette = p; diff --git a/src/ddsurface.c b/src/ddsurface.c index eee23ed..b521eb4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -14,6 +14,7 @@ #include "ddclipper.h" #include "utils.h" #include "versionhelpers.h" +#include "ddpalette.h" LONG g_dds_gdi_handles; @@ -1093,8 +1094,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); - if (This->palette) - IDirectDrawPalette_Release(This->palette); + IDirectDrawPaletteImpl* old_palette = This->palette; if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) { @@ -1113,6 +1113,9 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD This->palette = lpDDPalette; } + if (old_palette) + IDirectDrawPalette_Release(old_palette); + return DD_OK; } @@ -1574,6 +1577,16 @@ HRESULT dd_CreateSurface( { g_ddraw.primary = dst_surface; FakePrimarySurface = dst_surface->surface; + + if (dst_surface->bpp == 8) + { + IDirectDrawPaletteImpl* lpDDPalette; + dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_me_palette, &lpDDPalette, NULL); + dds_SetPalette(dst_surface, lpDDPalette); + + // Make sure temp palette will be released once replaced + IDirectDrawPalette_Release(lpDDPalette); + } } } From 1c263ca573bdaae7c3c81cb1237a8f3868e1ddb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:46:44 +0100 Subject: [PATCH 360/557] hook GetSystemPaletteEntries --- inc/hook.h | 3 +++ inc/winapi_hooks.h | 1 + src/ddpalette.c | 11 +++++++++-- src/hook.c | 2 ++ src/winapi_hooks.c | 15 +++++++++++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 92301d4..299ac75 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -64,6 +64,8 @@ typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); +typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); + typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); typedef HMODULE(WINAPI* LOADLIBRARYEXAPROC)(LPCSTR, HANDLE, DWORD); @@ -116,6 +118,7 @@ extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; +extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index fa5c635..3569abb 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -58,6 +58,7 @@ int WINAPI fake_StretchDIBits( HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); +UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/ddpalette.c b/src/ddpalette.c index e7bde4b..af18231 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -14,11 +14,15 @@ HRESULT ddp_GetEntries( DWORD dwNumEntries, LPPALETTEENTRY lpEntries) { - for (int i = dwBase, x = 0; i < dwBase + dwNumEntries; i++, x++) + if (!lpEntries) + return DDERR_INVALIDPARAMS; + + for (int i = dwBase, x = 0; i < dwBase + dwNumEntries && i < 256; i++, x++) { lpEntries[x].peRed = This->data_rgb[i].rgbRed; lpEntries[x].peGreen = This->data_rgb[i].rgbGreen; lpEntries[x].peBlue = This->data_rgb[i].rgbBlue; + lpEntries[x].peFlags = 0; } return DD_OK; @@ -31,7 +35,10 @@ HRESULT ddp_SetEntries( DWORD dwCount, LPPALETTEENTRY lpEntries) { - for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount; i++, x++) + if (!lpEntries) + return DDERR_INVALIDPARAMS; + + for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) { This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; diff --git a/src/hook.c b/src/hook.c index 6533a4d..3229a3a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -57,6 +57,7 @@ GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; +GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -149,6 +150,7 @@ HOOKLIST g_hook_hooklist[] = { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, + { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index eebc181..b909e10 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -20,6 +20,7 @@ #include "dllmain.h" #include "hook.h" #include "directinput.h" +#include "ddpalette.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -1348,6 +1349,20 @@ HFONT WINAPI fake_CreateFontA( lpszFace); } +UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) +{ + if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); + return cEntries - iStart; + } + } + + return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From 82d3ec46a38c8905be42ef098f9b113811878634 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:06 +0100 Subject: [PATCH 361/557] copy from g_ddp_me_palette if there's no primary yet --- src/winapi_hooks.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b909e10..38cfbd1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,13 +1351,24 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) { + TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); return cEntries - iStart; } + else + { + for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) + { + pPalEntries[x].peRed = g_ddp_me_palette[i].peRed; + pPalEntries[x].peGreen = g_ddp_me_palette[i].peGreen; + pPalEntries[x].peBlue = g_ddp_me_palette[i].peBlue; + pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; + } + } } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 06aadb709f551f6ecfe4ff4be9bba53e1eadb877 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:37 +0100 Subject: [PATCH 362/557] fix for last commit --- src/winapi_hooks.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 38cfbd1..a805ae5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1357,7 +1357,6 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); - return cEntries - iStart; } else { @@ -1369,6 +1368,8 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; } } + + return cEntries - iStart; } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 58f8f89c66f6cca26376d375188c5005b47d0e67 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 00:56:47 +0100 Subject: [PATCH 363/557] remove debug code --- src/winapi_hooks.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a805ae5..d1a152e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1355,7 +1355,6 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("ddp_GetEntries test\n"); ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); } else From 0905cb80595119cfde0d592dedaf79fdab0021f6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:00:09 +0100 Subject: [PATCH 364/557] log function call --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d1a152e..5a6820f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,6 +1351,8 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) From 091a8c1d6e95461fd6800a0041f86b34a682620d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:17:53 +0100 Subject: [PATCH 365/557] add debug logging --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5a6820f..a35c1dc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1355,6 +1355,8 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { + TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { ddp_GetEntries(g_ddraw.primary->palette, 0, iStart, cEntries, pPalEntries); From 6c67db5db1ce741cba6a5ba81b12a9ef6a6bd2bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 01:20:12 +0100 Subject: [PATCH 366/557] log args as well --- src/winapi_hooks.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a35c1dc..efa2dac 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1351,7 +1351,14 @@ HFONT WINAPI fake_CreateFontA( UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LPPALETTEENTRY pPalEntries) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE( + "%s(hdc=%p, iStart=%u, cEntries=%u, pPalEntries=%p) [%p]\n", + __FUNCTION__, + hdc, + iStart, + cEntries, + pPalEntries, + _ReturnAddress()); if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) { From a5a4204f41d387949008d94fb89414e6637fe882 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:01:08 +0100 Subject: [PATCH 367/557] hook SelectPalette --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 18 ++++++++++++++++++ 4 files changed, 23 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 299ac75..235d579 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -65,6 +65,7 @@ typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); +typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -119,6 +120,7 @@ extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; +extern SELECTPALETTEPROC real_SelectPalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3569abb..ccbea4b 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -59,6 +59,7 @@ int WINAPI fake_StretchDIBits( HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); +HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index 3229a3a..f73f31c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -58,6 +58,7 @@ GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; +SELECTPALETTEPROC real_SelectPalette = SelectPalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -151,6 +152,7 @@ HOOKLIST g_hook_hooklist[] = { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, + { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index efa2dac..207cabb 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1385,6 +1385,24 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); } +HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) +{ + if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + PALETTEENTRY pal[256]; + GetPaletteEntries(hPal, 0, 256, pal); + + ddp_SetEntries(g_ddraw.primary->palette, 0, 0, 256, pal); + } + } + + return real_SelectPalette(hdc, hPal, bForceBkgd); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From 60735fc0d517731ce1abf4cac834dfea41ce0e3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:26:47 +0100 Subject: [PATCH 368/557] use return value from GetPaletteEntries --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 207cabb..ca9cbdc 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1394,9 +1394,9 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); PALETTEENTRY pal[256]; - GetPaletteEntries(hPal, 0, 256, pal); + UINT count = GetPaletteEntries(hPal, 0, 256, pal); - ddp_SetEntries(g_ddraw.primary->palette, 0, 0, 256, pal); + ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); } } From b15e579ea4a2f716da98893a7b05b81b9d92cb6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 02:32:06 +0100 Subject: [PATCH 369/557] add some checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ca9cbdc..78f7a23 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,7 +1360,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); @@ -1387,7 +1387,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && g_ddraw.bpp == 8 && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { if (g_ddraw.primary && g_ddraw.primary->palette) { From 308fefb6545a32672594f5915c6dff728337849e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 08:01:23 +0100 Subject: [PATCH 370/557] add GetDesktopWindow check --- src/winapi_hooks.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78f7a23..c53dec3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,7 +1360,10 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + pPalEntries && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); @@ -1387,7 +1390,9 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { - if (g_ddraw.ref && g_ddraw.bpp == 8 && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1397,6 +1402,8 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) UINT count = GetPaletteEntries(hPal, 0, 256, pal); ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); + + return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd); } } From 9a015c47cba21f03798e5620e3b3bdd43e4e46c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 08:02:00 +0100 Subject: [PATCH 371/557] rename palette --- inc/ddpalette.h | 2 +- src/ddsurface.c | 2 +- src/winapi_hooks.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index ebb4479..5f6d112 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -12,7 +12,7 @@ HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStar HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); // Original palette copied from Windows ME -static PALETTEENTRY g_ddp_me_palette[] = +static PALETTEENTRY g_ddp_default_palette[] = { { 0, 0, 0, 0 }, { 128, 0, 0, 0 }, diff --git a/src/ddsurface.c b/src/ddsurface.c index b521eb4..d8aafda 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1581,7 +1581,7 @@ HRESULT dd_CreateSurface( if (dst_surface->bpp == 8) { IDirectDrawPaletteImpl* lpDDPalette; - dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_me_palette, &lpDDPalette, NULL); + dd_CreatePalette(DDPCAPS_ALLOW256, g_ddp_default_palette, &lpDDPalette, NULL); dds_SetPalette(dst_surface, lpDDPalette); // Make sure temp palette will be released once replaced diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c53dec3..9a2366a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1375,10 +1375,10 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) { - pPalEntries[x].peRed = g_ddp_me_palette[i].peRed; - pPalEntries[x].peGreen = g_ddp_me_palette[i].peGreen; - pPalEntries[x].peBlue = g_ddp_me_palette[i].peBlue; - pPalEntries[x].peFlags = g_ddp_me_palette[i].peFlags; + pPalEntries[x].peRed = g_ddp_default_palette[i].peRed; + pPalEntries[x].peGreen = g_ddp_default_palette[i].peGreen; + pPalEntries[x].peBlue = g_ddp_default_palette[i].peBlue; + pPalEntries[x].peFlags = g_ddp_default_palette[i].peFlags; } } From 8be98755535f01d7d447dc5e97f22a910425e26d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:16:49 +0100 Subject: [PATCH 372/557] fix return value for NUMCOLORS on desktop window --- src/winapi_hooks.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9a2366a..081bdee 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -893,10 +893,22 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return RC_PALETTE | real_GetDeviceCaps(hdc, index); } - if (index == SIZEPALETTE || index == NUMCOLORS) + if (index == SIZEPALETTE) { return 256; } + + if (index == NUMCOLORS) + { + if (WindowFromDC(hdc) == GetDesktopWindow()) + { + return 20; + } + else + { + return 256; + } + } } return real_GetDeviceCaps(hdc, index); From 75ed1582d2b98552b268f8dd713985a7cfe4cc23 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:17:26 +0100 Subject: [PATCH 373/557] hook RealizePalette --- inc/IDirectDrawSurface.h | 2 ++ inc/hook.h | 2 ++ inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 37 +++++++++++++++++++++++++++++-------- 5 files changed, 36 insertions(+), 8 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index f04e03a..e20b506 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -28,6 +28,8 @@ typedef struct IDirectDrawSurfaceImpl CRITICAL_SECTION cs; IDirectDrawPaletteImpl* palette; + PALETTEENTRY selected_pal[256]; + UINT selected_pal_count; void* surface; HANDLE mapping; diff --git a/inc/hook.h b/inc/hook.h index 235d579..e17e1ec 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -66,6 +66,7 @@ typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); typedef HFONT(WINAPI* CREATEFONTAPROC)(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); typedef UINT(WINAPI* GETSYSTEMPALETTEENTRIESPROC)(HDC, UINT, UINT, LPPALETTEENTRY); typedef HPALETTE(WINAPI* SELECTPALETTEPROC)(HDC, HPALETTE, BOOL); +typedef UINT (WINAPI* REALIZEPALETTEPROC)(HDC); typedef HMODULE(WINAPI* LOADLIBRARYAPROC)(LPCSTR); typedef HMODULE(WINAPI* LOADLIBRARYWPROC)(LPCWSTR); @@ -121,6 +122,7 @@ extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; extern GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries; extern SELECTPALETTEPROC real_SelectPalette; +extern REALIZEPALETTEPROC real_RealizePalette; extern LOADLIBRARYAPROC real_LoadLibraryA; extern LOADLIBRARYWPROC real_LoadLibraryW; extern LOADLIBRARYEXAPROC real_LoadLibraryExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index ccbea4b..6bb5250 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -60,6 +60,7 @@ HFONT WINAPI fake_CreateFontIndirectA(CONST LOGFONTA*); HFONT WINAPI fake_CreateFontA(int, int, int, int, int, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, DWORD, LPCTSTR); UINT WINAPI fake_GetSystemPaletteEntries(HDC, UINT, UINT, LPPALETTEENTRY); HPALETTE WINAPI fake_SelectPalette(HDC, HPALETTE, BOOL); +UINT WINAPI fake_RealizePalette(HDC); HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName); HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName); diff --git a/src/hook.c b/src/hook.c index f73f31c..debebbf 100644 --- a/src/hook.c +++ b/src/hook.c @@ -59,6 +59,7 @@ CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; GETSYSTEMPALETTEENTRIESPROC real_GetSystemPaletteEntries = GetSystemPaletteEntries; SELECTPALETTEPROC real_SelectPalette = SelectPalette; +REALIZEPALETTEPROC real_RealizePalette = RealizePalette; LOADLIBRARYAPROC real_LoadLibraryA = LoadLibraryA; LOADLIBRARYWPROC real_LoadLibraryW = LoadLibraryW; LOADLIBRARYEXAPROC real_LoadLibraryExA = LoadLibraryExA; @@ -153,6 +154,7 @@ HOOKLIST g_hook_hooklist[] = { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, + { "RealizePalette", (PROC)fake_RealizePalette, (PROC*)&real_RealizePalette, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 081bdee..9cf2ad3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -905,11 +905,11 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return 20; } else - { - return 256; + { + return 256; + } } } - } return real_GetDeviceCaps(hdc, index); } @@ -1410,18 +1410,39 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); - PALETTEENTRY pal[256]; - UINT count = GetPaletteEntries(hPal, 0, 256, pal); - - ddp_SetEntries(g_ddraw.primary->palette, 0, 0, count, pal); + g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); - return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd); + return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; } } return real_SelectPalette(hdc, hPal, bForceBkgd); } +UINT WINAPI fake_RealizePalette(HDC hdc) +{ + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + { + if (g_ddraw.primary && g_ddraw.primary->palette) + { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + ddp_SetEntries( + g_ddraw.primary->palette, + 0, + 0, + g_ddraw.primary->selected_pal_count, + g_ddraw.primary->selected_pal); + + return g_ddraw.primary->selected_pal_count; + } + } + + return real_RealizePalette(hdc); +} + HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { HMODULE hmod_old = GetModuleHandleA(lpLibFileName); From bf62b84cb0b3014860f043e2987f9c3b93cbd8e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 20:26:21 +0100 Subject: [PATCH 374/557] keep logs clean in mini debug build --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9cf2ad3..e88d249 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1408,7 +1408,7 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); @@ -1427,7 +1427,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); ddp_SetEntries( g_ddraw.primary->palette, From 911c3bdfeb133a5393e19d80adc62c8bef0823cf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Dec 2024 23:40:41 +0100 Subject: [PATCH 375/557] #367 fix videos in Imperialism 2: The Age of Exploration --- src/winapi_hooks.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e88d249..c6907e3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -982,7 +982,10 @@ BOOL WINAPI fake_StretchBlt( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, @@ -1078,7 +1081,10 @@ BOOL WINAPI fake_BitBlt( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, @@ -1174,7 +1180,10 @@ int WINAPI fake_SetDIBitsToDevice( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchDIBits( @@ -1262,7 +1271,10 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + else if ( + g_ddraw.width > 0 && + g_ddraw.render.hdc && + (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) { return real_StretchDIBits( From 79548888d414d658b107c3318215bf322ce5fecd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:43:57 +0100 Subject: [PATCH 376/557] #367 hook SetWindowPlacement / Fix windowed mode --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 11 +++++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index e17e1ec..dac2704 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[35]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -57,6 +57,7 @@ typedef HHOOK(WINAPI* SETWINDOWSHOOKEXAPROC)(int, HOOKPROC, HINSTANCE, DWORD); typedef BOOL(WINAPI* PEEKMESSAGEAPROC)(LPMSG, HWND, UINT, UINT, UINT); typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); +typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -114,6 +115,7 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; +extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6bb5250..16a45bb 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg); BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); diff --git a/src/hook.c b/src/hook.c index debebbf..2d2b315 100644 --- a/src/hook.c +++ b/src/hook.c @@ -51,6 +51,7 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; +SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; @@ -105,6 +106,7 @@ HOOKLIST g_hook_hooklist[] = { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 0 }, { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, + { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c6907e3..748b848 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -806,6 +806,17 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) return result; } +BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl) +{ + if (lpwndpl && g_ddraw.ref && g_ddraw.hwnd && hWnd == g_ddraw.hwnd) + { + if (lpwndpl->showCmd == SW_SHOWMAXIMIZED || lpwndpl->showCmd == SW_MAXIMIZE) + return TRUE; + } + + return real_SetWindowPlacement(hWnd, lpwndpl); +} + BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) { BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode); From 67dceb236d2eafb171496f58f52300a78426af17 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:44:30 +0100 Subject: [PATCH 377/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1e5bbe8..cd0ec33 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Ignition - Indiana Jones and the Fate of Atlantis - Indiana Jones and the Last Crusade +- Imperialism 2: The Age of Exploration - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus From 1b0a839588dd96bbe4fa2e694f14bc583c366652 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 00:50:50 +0100 Subject: [PATCH 378/557] add preset for Imperialism II --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index e26e71f..5fc3c1f 100644 --- a/src/config.c +++ b/src/config.c @@ -1078,6 +1078,15 @@ static void cfg_create_ini() "[hooligans]\n" "limit_gdi_handles=true\n" "\n" + "; Imperialism 2: The Age of Exploration\n" + "[Imperialism II]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Icewind Dale 2\n" "; Note: 'Full Screen' must be enabled in Config.exe\n" "; Note: 1070x602 is the lowest possible 16:9 resolution for the Widescreen patch (600/601 height will crash)\n" From b38aeb30aeb263da247b2a1d153061b2c057bb34 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 01:56:02 +0100 Subject: [PATCH 379/557] fix GetWindowPlacement hook for child windows --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 748b848..af977fd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -797,7 +797,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) lpwndpl->rcNormalPosition.right = g_ddraw.width; lpwndpl->rcNormalPosition.top = 0; } - else + else if (!(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); } From 987b489a4c9c4cfac71c6b1e9ca68802ced2c516 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:03:10 +0100 Subject: [PATCH 380/557] copy code from SetWindowPos --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index af977fd..7d9bee7 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -797,7 +797,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) lpwndpl->rcNormalPosition.right = g_ddraw.width; lpwndpl->rcNormalPosition.top = 0; } - else if (!(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); } From c35ca6030751f7a6ebca529aabc4b31e9fdd9e3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:24:46 +0100 Subject: [PATCH 381/557] do not use DwmFlush in wine (it's only a stub) --- src/fps_limiter.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 14c4394..0996784 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -120,16 +120,9 @@ BOOL fpsl_wait_for_vblank() BOOL fpsl_dwm_flush() { - if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush) + if (g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && !IsWine()) { - HRESULT x = g_fpsl.DwmFlush(); - - if (!SUCCEEDED(x)) - { - //TRACE(" ERROR %s(result=%08X)\n", __FUNCTION__, x); - } - - return SUCCEEDED(x); + return SUCCEEDED(g_fpsl.DwmFlush()); } return FALSE; From 82386fbbc462770450651474f69baf743f317a42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 06:43:32 +0100 Subject: [PATCH 382/557] add preset for Nightlong - Union City Conspiracy --- inc/config.h | 2 +- src/config.c | 8 ++++++-- src/wndproc.c | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index de782b5..e03a8fd 100644 --- a/inc/config.h +++ b/inc/config.h @@ -74,6 +74,7 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; BOOL direct3d_passthrough; BOOL center_cursor_fix; + BOOL allow_wm_nchittest; char fake_mode[128]; BOOL lock_mouse_top_left; char win_version[32]; @@ -106,7 +107,6 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; - BOOL seventhlegion_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 5fc3c1f..73d33ea 100644 --- a/src/config.c +++ b/src/config.c @@ -87,6 +87,7 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); + GET_BOOL(g_config.allow_wm_nchittest, "allow_wm_nchittest", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); @@ -116,7 +117,6 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); - GET_BOOL(g_config.seventhlegion_hack, "seventhlegion_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -395,7 +395,7 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "seventhlegion_hack=true\n" + "allow_wm_nchittest=true\n" "singlecpu=false\n" "\n" "; Atrox\n" @@ -1331,6 +1331,10 @@ static void cfg_create_ini() "checkfile=.\\nox.cfg\n" "maxgameticks=125\n" "\n" + "; Nightlong - Union City Conspiracy\n" + "[NL]\n" + "allow_wm_nchittest=true\n" + "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" diff --git a/src/wndproc.c b/src/wndproc.c index 774e534..54a8831 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,7 +101,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { - if (g_config.seventhlegion_hack) + if (g_config.allow_wm_nchittest) break; LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); From 018d49ce36131b374e4e8d808916701b1d8a9943 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 07:18:10 +0100 Subject: [PATCH 383/557] don't allow to set palette to surface that isn't 8bpp --- src/ddsurface.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index d8aafda..18ebb27 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1091,6 +1091,9 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpDDPalette) { + if (This->bpp != 8) + return DDERR_INVALIDPIXELFORMAT; + if (lpDDPalette) IDirectDrawPalette_AddRef(lpDDPalette); From 9fde18eafd29a0a0bbbf3777cd27c0bc51850e02 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 18:41:05 +0100 Subject: [PATCH 384/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index cd0ec33..18e4d38 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine   ### Supported Games +- 101: The Airborne Invasion of Normandy - 7th Legion - Abomination - The Nemesis Project - Addiction Pinball From 363d54ece07597ff4474bfa941595ac63623d8f3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 18:57:27 +0100 Subject: [PATCH 385/557] fix WM_NCHITTEST message --- src/wndproc.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 54a8831..ee6c0f6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -101,8 +101,32 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCHITTEST: { - if (g_config.allow_wm_nchittest) - break; + if (g_config.allow_wm_nchittest && (g_mouse_locked || g_config.devmode)) + { + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + if (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt)) + { + int x = max(pt.x - g_ddraw.mouse.x_adjust, 0); + int y = max(pt.y - g_ddraw.mouse.y_adjust, 0); + + if (g_config.adjmouse) + { + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); + } + + pt.x = min(x, g_ddraw.width - 1); + pt.y = min(y, g_ddraw.height - 1); + } + else + { + pt.x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + pt.y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); + } + + CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y)); + } LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); From bbe8c4f8570614333baed45cf570ab2471410fd0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 20:45:24 +0100 Subject: [PATCH 386/557] log args --- src/winapi_hooks.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7d9bee7..e06e6f1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1400,7 +1400,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" WindowFromDC(hdc) == g_ddraw.hwnd\n"); + TRACE(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1431,7 +1431,13 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT( + "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", + __FUNCTION__, + hdc, + hPal, + bForceBkgd, + _ReturnAddress()); g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); @@ -1450,7 +1456,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); ddp_SetEntries( g_ddraw.primary->palette, From 39b2e69540046d669d6f9e72a3e9e72d0c99b36b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 21:33:05 +0100 Subject: [PATCH 387/557] make sure we don't update the palette twice --- inc/ddpalette.h | 2 ++ src/ddpalette.c | 14 ++++++++++++++ src/winapi_hooks.c | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/inc/ddpalette.h b/inc/ddpalette.h index 5f6d112..e780b5a 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -7,6 +7,8 @@ #include "IDirectDrawPalette.h" #include "dd.h" +#define DDPCAPS_REFRESH_CHANGED_ONLY (1 << 31) + HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase, DWORD dwNumEntries, LPPALETTEENTRY lpEntries); HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); diff --git a/src/ddpalette.c b/src/ddpalette.c index af18231..46af3a1 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -5,6 +5,7 @@ #include "ddsurface.h" #include "IDirectDrawPalette.h" #include "debug.h" +#include "crc32.h" HRESULT ddp_GetEntries( @@ -38,6 +39,13 @@ HRESULT ddp_SetEntries( if (!lpEntries) return DDERR_INVALIDPARAMS; + unsigned long crc32 = 0; + + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) + { + crc32 = Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb)); + } + for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) { This->data_bgr[i] = (lpEntries[x].peBlue << 16) | (lpEntries[x].peGreen << 8) | lpEntries[x].peRed; @@ -64,6 +72,12 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } + if (crc32 && crc32 == Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb))) + { + // do not set palette_updated BOOL if nothing changed + return DD_OK; + } + if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index e06e6f1..4bcfa3c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1460,7 +1460,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) ddp_SetEntries( g_ddraw.primary->palette, - 0, + DDPCAPS_REFRESH_CHANGED_ONLY, 0, g_ddraw.primary->selected_pal_count, g_ddraw.primary->selected_pal); From f58c4a49785e5f794fd9a89025ba09e17c791bcd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 21:48:45 +0100 Subject: [PATCH 388/557] log selected_pal_count --- src/winapi_hooks.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4bcfa3c..22be414 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1458,6 +1458,11 @@ UINT WINAPI fake_RealizePalette(HDC hdc) { TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); + if (g_ddraw.primary->selected_pal_count != 256) + { + TRACE_EXT(" selected_pal_count = %u\n", g_ddraw.primary->selected_pal_count); + } + ddp_SetEntries( g_ddraw.primary->palette, DDPCAPS_REFRESH_CHANGED_ONLY, From 4b0f0f2cf53ca712d1641fb05dc1f8a9742e279e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:03:23 +0100 Subject: [PATCH 389/557] use faster method to check for palette changes --- src/ddpalette.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 46af3a1..0ab17b1 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -5,7 +5,6 @@ #include "ddsurface.h" #include "IDirectDrawPalette.h" #include "debug.h" -#include "crc32.h" HRESULT ddp_GetEntries( @@ -39,11 +38,11 @@ HRESULT ddp_SetEntries( if (!lpEntries) return DDERR_INVALIDPARAMS; - unsigned long crc32 = 0; + RGBQUAD data_rgb[256]; if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) { - crc32 = Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb)); + memcpy(data_rgb, This->data_rgb, sizeof(This->data_rgb)); } for (int i = dwStartingEntry, x = 0; i < dwStartingEntry + dwCount && i < 256; i++, x++) @@ -72,7 +71,7 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if (crc32 && crc32 == Crc32_ComputeBuf(0, This->data_rgb, sizeof(This->data_rgb))) + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY) && memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) { // do not set palette_updated BOOL if nothing changed return DD_OK; From f9b47a9f0e5fe1256071266b0f6bf8f6c8cd0d1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:13:26 +0100 Subject: [PATCH 390/557] log when palette was changed --- src/ddpalette.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 0ab17b1..4288b89 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -71,10 +71,15 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY) && memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) + if ((dwFlags & DDPCAPS_REFRESH_CHANGED_ONLY)) { - // do not set palette_updated BOOL if nothing changed - return DD_OK; + if (memcmp(data_rgb, This->data_rgb, sizeof(This->data_rgb)) == 0) + { + // do not set palette_updated BOOL if nothing changed + return DD_OK; + } + + TRACE_EXT(" Palette changed\n"); } if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) From 747e1ec3a7a14ad51a143303f2499d8041700abd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 22:33:35 +0100 Subject: [PATCH 391/557] fix return value of GetSystemPaletteEntries --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 22be414..b05ac85 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1417,7 +1417,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP } } - return cEntries - iStart; + return cEntries; } return real_GetSystemPaletteEntries(hdc, iStart, cEntries, pPalEntries); From 30805c78cc02a21a945dfd27d2b78e5290f8cb93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Dec 2024 01:02:21 +0100 Subject: [PATCH 392/557] add support for dosbox staging shaders --- src/render_ogl.c | 121 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 89 insertions(+), 32 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index b9d5028..ecfb2e9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -605,8 +605,10 @@ static void ogl_init_shader1_program() glUseProgram(g_ogl.shader1_program); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); + if (vertex_coord_attr_loc == -1) // dosbox staging + vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "a_position"); + g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); - g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); glGenBuffers(3, g_ogl.shader1_vbos); @@ -663,10 +665,13 @@ static void ogl_init_shader1_program() glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]); static const GLushort indices[] = @@ -688,24 +693,44 @@ static void ogl_init_shader1_program() output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyOutputSize"); + if (loc != -1) glUniform2fv(loc, 1, output_size); + loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTextureSize"); + if (loc != -1) glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyInputSize"); + if (loc != -1) glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader1_program, "rubyTexture"); + + if (loc != -1) + glUniform1i(loc, 0); + + loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); - if (loc != -1) - glUniform1i(loc, 0); + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); + if (g_ogl.shader1_frame_count_uni_loc == -1) + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "rubyFrameCount"); const float mvp_matrix[16] = { 1,0,0,0, @@ -713,7 +738,10 @@ static void ogl_init_shader1_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + + loc = glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"); + if (loc != -1) + glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix); glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); @@ -819,8 +847,10 @@ static void ogl_init_shader2_program() glUseProgram(g_ogl.shader2_program); GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); + if (vertex_coord_attr_loc == -1) + vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "a_position"); + g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); - g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount"); glGenBuffers(3, g_ogl.shader2_vbos); @@ -855,10 +885,13 @@ static void ogl_init_shader2_program() glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); - glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader2_tex_coord_attr_loc != -1) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); static const GLushort indices[] = @@ -880,32 +913,44 @@ static void ogl_init_shader2_program() output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyOutputSize"); + if (loc != -1) glUniform2fv(loc, 1, output_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTextureSize"); + if (loc != -1) glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyInputSize"); + if (loc != -1) glUniform2fv(loc, 1, input_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); + if (loc == -1) + loc = glGetUniformLocation(g_ogl.shader2_program, "rubyTexture"); + + if (loc != -1) + glUniform1i(loc, 0); + + loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.shader2_program, "Texture"); - if (loc != -1) - glUniform1i(loc, 0); - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); - if (loc != -1) - glUniform1i(loc, 1); - - loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); - if (loc != -1) - glUniform2fv(loc, 1, texture_size); + g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "FrameCount"); + if (g_ogl.shader2_frame_count_uni_loc == -1) + g_ogl.shader2_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader2_program, "rubyFrameCount"); const float mvp_matrix[16] = { 1,0,0,0, @@ -913,7 +958,10 @@ static void ogl_init_shader2_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + + loc = glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"); + if (loc != -1) + glUniformMatrix4fv(loc, 1, GL_FALSE, mvp_matrix); } static void ogl_render() @@ -1105,8 +1153,11 @@ static void ogl_render() 0.0f, g_ogl.scale_h, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + if (g_ogl.shader2_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader2_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader2_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -1121,8 +1172,11 @@ static void ogl_render() g_ogl.scale_w, 0.0f, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -1137,8 +1191,11 @@ static void ogl_render() 0.0f, g_ogl.scale_h, }; glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + if (g_ogl.shader1_tex_coord_attr_loc != -1) + { + glVertexAttribPointer(g_ogl.shader1_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.shader1_tex_coord_attr_loc); + } glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } From 34250bf2245d1f760d402b1b965dab16131b8e30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Dec 2024 01:11:09 +0100 Subject: [PATCH 393/557] fix for last commit --- src/render_ogl.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index ecfb2e9..cf85022 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -944,6 +944,14 @@ static void ogl_init_shader2_program() glUniform1i(loc, 0); + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2Texture"); + if (loc != -1) + glUniform1i(loc, 1); + + loc = glGetUniformLocation(g_ogl.shader2_program, "PassPrev2TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + loc = glGetUniformLocation(g_ogl.shader2_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); From f70f67857eb349a4e6fe19bd77a49553a70e4a28 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 03:15:23 +0100 Subject: [PATCH 394/557] hook DefWindowProcA --- inc/config.h | 1 - inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/config.c | 6 ------ src/hook.c | 2 ++ src/winapi_hooks.c | 11 +++++++++++ src/wndproc.c | 22 +++++++++++----------- 7 files changed, 28 insertions(+), 19 deletions(-) diff --git a/inc/config.h b/inc/config.h index e03a8fd..4e9731d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -74,7 +74,6 @@ typedef struct CNCDDRAWCONFIG BOOL no_dinput_hook; BOOL direct3d_passthrough; BOOL center_cursor_fix; - BOOL allow_wm_nchittest; char fake_mode[128]; BOOL lock_mouse_top_left; char win_version[32]; diff --git a/inc/hook.h b/inc/hook.h index dac2704..a3e632a 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[35]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[36]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -59,6 +59,7 @@ typedef BOOL(WINAPI* GETMESSAGEAPROC)(LPMSG, HWND, UINT, UINT); typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); +typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -117,6 +118,7 @@ extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; +extern DEFWINDOWPROCAPROC real_DefWindowProcA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 16a45bb..1170ff0 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -35,6 +35,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); +LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/config.c b/src/config.c index 73d33ea..b21526a 100644 --- a/src/config.c +++ b/src/config.c @@ -87,7 +87,6 @@ void cfg_load() GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); - GET_BOOL(g_config.allow_wm_nchittest, "allow_wm_nchittest", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); GET_STRING("win_version", "", g_config.win_version, sizeof(g_config.win_version)); @@ -395,7 +394,6 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "allow_wm_nchittest=true\n" "singlecpu=false\n" "\n" "; Atrox\n" @@ -1331,10 +1329,6 @@ static void cfg_create_ini() "checkfile=.\\nox.cfg\n" "maxgameticks=125\n" "\n" - "; Nightlong - Union City Conspiracy\n" - "[NL]\n" - "allow_wm_nchittest=true\n" - "\n" "; Outlaws\n" "[olwin]\n" "noactivateapp=true\n" diff --git a/src/hook.c b/src/hook.c index 2d2b315..b6bab0a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -53,6 +53,7 @@ GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; +DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -108,6 +109,7 @@ HOOKLIST g_hook_hooklist[] = { "GetWindowPlacement", (PROC)fake_GetWindowPlacement, (PROC*)&real_GetWindowPlacement, 0 }, { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, + { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b05ac85..a2c5df9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -855,6 +855,17 @@ BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEV return result; } +LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) + { + if (Msg == WM_NCHITTEST) + return HTCLIENT; + } + + return real_DefWindowProcA(hWnd, Msg, wParam, lParam); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) diff --git a/src/wndproc.c b/src/wndproc.c index ee6c0f6..6043467 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -50,7 +50,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_CANCELMODE: case WM_DISPLAYCHANGE: { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } case WM_GETMINMAXINFO: { @@ -88,20 +88,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } case WM_NCACTIVATE: { if (g_config.noactivateapp) { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } break; } case WM_NCHITTEST: { - if (g_config.allow_wm_nchittest && (g_mouse_locked || g_config.devmode)) + if (g_mouse_locked || g_config.devmode) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; @@ -128,7 +128,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, MAKELPARAM(pt.x, pt.y)); } - LRESULT result = DefWindowProc(hWnd, uMsg, wParam, lParam); + LRESULT result = real_DefWindowProcA(hWnd, uMsg, wParam, lParam); if (!g_config.resizable) { @@ -173,7 +173,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case HTTOP: case HTTOPLEFT: case HTTOPRIGHT: - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); case HTCLIENT: if (!g_mouse_locked && !g_config.devmode) { @@ -548,7 +548,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } case WM_MOVE: { @@ -575,7 +575,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } case WM_RESTORE_STYLE: { @@ -606,7 +606,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_MAXIMIZE) { if (IsWine()) - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); if (g_config.resizable) { @@ -626,7 +626,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; if (!GameHandlesClose) - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); break; } @@ -855,7 +855,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == VK_TAB || (wParam && wParam == g_config.hotkeys.toggle_fullscreen)) { - return DefWindowProc(hWnd, uMsg, wParam, lParam); + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } break; From 02427d606bd309cd662864048db0a7cf223bf907 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 04:20:37 +0100 Subject: [PATCH 395/557] add preset for virtual springfield --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 18e4d38..c69c352 100644 --- a/README.md +++ b/README.md @@ -416,6 +416,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Uprising: Join or Die - Vermeer - Virtua Fighter PC +- Virtual Springfield - War Wind - War Wind II - Human Onslaught - Warcraft 2 diff --git a/src/config.c b/src/config.c index b21526a..a73335f 100644 --- a/src/config.c +++ b/src/config.c @@ -1645,6 +1645,11 @@ static void cfg_create_ini() "lock_surfaces=true\n" "singlecpu=false\n" "\n" + "; Virtual Springfield\n" + "[VIRTUAL]\n" + "game_handles_close=true\n" + "singlecpu=false\n" + "\n" "; Total Annihilation: Kingdoms\n" "[Kingdoms]\n" "game_handles_close=true\n" From 7af3be82e379e3a193061577778ef8e52f218345 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 04:20:58 +0100 Subject: [PATCH 396/557] update Return to Krondor preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index a73335f..ba89b87 100644 --- a/src/config.c +++ b/src/config.c @@ -1481,6 +1481,7 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "singlecpu=false\n" "limiter_type=2\n" + "game_handles_close=true\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From d1338fd92af511135a1ce4f6964ea6f41219fbd6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 07:34:36 +0100 Subject: [PATCH 397/557] add support for Die by the Sword --- src/config.c | 4 ++++ src/dd.c | 4 ++-- src/directinput.c | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index ba89b87..c2b7710 100644 --- a/src/config.c +++ b/src/config.c @@ -846,6 +846,10 @@ static void cfg_create_ini() "resolutions=2\n" "singlecpu=false\n" "\n" + "; Die by the Sword\n" + "[windie]\n" + "maxgameticks=30\n" + "\n" "; Dragon Throne: Battle of Red Cliffs\n" "[AdSanguo]\n" "maxgameticks=60\n" diff --git a/src/dd.c b/src/dd.c index f5df432..aa183ea 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1549,8 +1549,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); - g_ddraw.windowed_hack = TRUE; - dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + //g_ddraw.windowed_hack = TRUE; + //dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } } diff --git a/src/directinput.c b/src/directinput.c index 7db6d2d..a0d077d 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -58,9 +58,9 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW TRACE(" mouse_device = %s\n", This == g_mouse_device ? "TRUE" : "FALSE"); dbg_dump_di_scm_flags(dwFlags); - if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && (dwFlags & DISCL_EXCLUSIVE)) { - if (g_mouse_locked || g_config.devmode) + if (g_mouse_locked || g_config.devmode || !g_ddraw.ref) { while (real_ShowCursor(FALSE) >= 0); } From d563084a0ed19af76e6b6e1cf109e466928c3bbc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 07:34:48 +0100 Subject: [PATCH 398/557] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c69c352..50292cf 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Atlantis: The Lost Tales - Atomic Bomberman - Atrox +- Airline 69: Return to Casablanca - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 @@ -147,6 +148,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Delta Force - Desperados: Wanted Dead or Alive - Dreams to Realty +- Die by the Sword - Diablo - Diablo 2 - Diablo 2: Lord of Destruction From dc719ec59b9670a4082a832ee34b8fe55ca190ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:46:27 +0100 Subject: [PATCH 399/557] add presets for army men --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index c2b7710..33dcbdd 100644 --- a/src/config.c +++ b/src/config.c @@ -504,6 +504,18 @@ static void cfg_create_ini() "[1602]\n" "adjmouse=true\n" "\n" + "; Army Men: World War / Army Men: Operation Meltdown\n" + "[amww]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" + "; Army Men 2\n" + "[ArmyMen2]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" "; Alien Nations\n" "[AN]\n" "adjmouse=true\n" From 6be3407e67dd3868a46dc35e00692686f11c6784 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:53:08 +0100 Subject: [PATCH 400/557] add some more army men presets --- src/config.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/config.c b/src/config.c index 33dcbdd..cb5edce 100644 --- a/src/config.c +++ b/src/config.c @@ -510,6 +510,18 @@ static void cfg_create_ini() "maxgameticks=120\n" "minfps=-1\n" "\n" + "; Army Men: Air Tactics\n" + "[Amat]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" + "; Army Men: Toys in Space\n" + "[ARMYMENTIS]\n" + "maxfps=60\n" + "maxgameticks=120\n" + "minfps=-1\n" + "\n" "; Army Men 2\n" "[ArmyMen2]\n" "maxfps=60\n" From 7ac70bd8780f08b3d3d753dd0b24593ee1abeda1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Dec 2024 08:53:33 +0100 Subject: [PATCH 401/557] update supported games list --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 50292cf..280812d 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue +- Army Men: World War / Army Men: Operation Meltdown +- Army Men: Air Tactics +- Army Men: Toys in Space +- Army Men 2 - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -199,6 +203,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Grand Theft Auto: London 1969 - Gruntz - Gilbert Goodmate And The Mushroom Of Phungoria +- Handkerchief - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Heart of Darkness From 9cefca463a25ebed7a0eb8c60e7245201f8b69e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 06:58:42 +0100 Subject: [PATCH 402/557] add support for Seven Kingdoms II --- README.md | 1 + inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/config.c | 4 ++++ src/hook.c | 2 ++ src/winapi_hooks.c | 13 ++++++++++++- 6 files changed, 23 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 280812d..195d80d 100644 --- a/README.md +++ b/README.md @@ -354,6 +354,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sega Touring Car - Septerra Core - Settlers 3 +- Seven Kingdoms II - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division diff --git a/inc/hook.h b/inc/hook.h index a3e632a..f362562 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -16,7 +16,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[36]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[37]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -35,6 +35,7 @@ typedef BOOL(WINAPI* SETWINDOWPOSPROC)(HWND, HWND, int, int, int, int, UINT); typedef BOOL(WINAPI* MOVEWINDOWPROC)(HWND, int, int, int, int, BOOL); typedef LRESULT(WINAPI* SENDMESSAGEAPROC)(HWND, UINT, WPARAM, LPARAM); typedef LONG(WINAPI* SETWINDOWLONGAPROC)(HWND, int, LONG); +typedef LONG(WINAPI* SETWINDOWLONGWPROC)(HWND, int, LONG); typedef LONG(WINAPI* GETWINDOWLONGAPROC)(HWND, int); typedef BOOL(WINAPI* ENABLEWINDOWPROC)(HWND, BOOL); typedef HWND(WINAPI* CREATEWINDOWEXAPROC)(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID); @@ -99,6 +100,7 @@ extern SETWINDOWPOSPROC real_SetWindowPos; extern MOVEWINDOWPROC real_MoveWindow; extern SENDMESSAGEAPROC real_SendMessageA; extern SETWINDOWLONGAPROC real_SetWindowLongA; +extern SETWINDOWLONGWPROC real_SetWindowLongW; extern GETWINDOWLONGAPROC real_GetWindowLongA; extern ENABLEWINDOWPROC real_EnableWindow; extern CREATEWINDOWEXAPROC real_CreateWindowExA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 1170ff0..d9426fa 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -21,6 +21,7 @@ BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint); LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong); +LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong); LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex); BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable); BOOL WINAPI fake_DestroyWindow(HWND hWnd); diff --git a/src/config.c b/src/config.c index cb5edce..591f2ec 100644 --- a/src/config.c +++ b/src/config.c @@ -1550,6 +1550,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "fake_mode=640x480x32\n" "\n" + "; Seven Kingdoms II\n" + "[7k2]\n" + "fake_mode=352x240x32\n" + "\n" "; Sid Meier's Simgolf\n" "[golf]\n" "fake_mode=640x480x16\n" diff --git a/src/hook.c b/src/hook.c index b6bab0a..a7a9f56 100644 --- a/src/hook.c +++ b/src/hook.c @@ -34,6 +34,7 @@ SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos; MOVEWINDOWPROC real_MoveWindow = MoveWindow; SENDMESSAGEAPROC real_SendMessageA = SendMessageA; SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA; +SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; GETWINDOWLONGAPROC real_GetWindowLongA = GetWindowLongA; ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; @@ -96,6 +97,7 @@ HOOKLIST g_hook_hooklist[] = { "MoveWindow", (PROC)fake_MoveWindow, (PROC*)&real_MoveWindow, 0 }, { "SendMessageA", (PROC)fake_SendMessageA, (PROC*)&real_SendMessageA, 0 }, { "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC*)&real_SetWindowLongA, 0 }, + { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, { "GetWindowLongA", (PROC)fake_GetWindowLongA, (PROC*)&real_GetWindowLongA, 0 }, { "EnableWindow", (PROC)fake_EnableWindow, (PROC*)&real_EnableWindow, 0 }, { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a2c5df9..64b4e94 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -448,7 +448,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { - if (g_ddraw.ref && g_ddraw.hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_STYLE) return 0; @@ -465,6 +465,17 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) return real_SetWindowLongA(hWnd, nIndex, dwNewLong); } +LONG WINAPI fake_SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWnd) + { + if (nIndex == GWL_STYLE) + return 0; + } + + return real_SetWindowLongW(hWnd, nIndex, dwNewLong); +} + LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { if (g_ddraw.ref && g_ddraw.hwnd == hWnd) From 067dab35e24d749f549919f7f985a45bbc5b7ca1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 07:14:37 +0100 Subject: [PATCH 403/557] update Seven Kingdoms II preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 591f2ec..9dc50ae 100644 --- a/src/config.c +++ b/src/config.c @@ -1553,6 +1553,7 @@ static void cfg_create_ini() "; Seven Kingdoms II\n" "[7k2]\n" "fake_mode=352x240x32\n" + "fix_not_responding=true\n" "\n" "; Sid Meier's Simgolf\n" "[golf]\n" From 39ba7259b8bdce6b4c17bd6c9acf0be5da37ccfa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:33:55 +0100 Subject: [PATCH 404/557] #369 add support for Fallout Tactics --- src/config.c | 4 ++++ src/winapi_hooks.c | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/src/config.c b/src/config.c index 9dc50ae..1c542e4 100644 --- a/src/config.c +++ b/src/config.c @@ -952,6 +952,10 @@ static void cfg_create_ini() "[FABLE]\n" "singlecpu=false\n" "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[BOS]\n" + "hook_peekmessage=true\n" + "\n" "; Falcon 4.0 (Microprose version)\n" "[falcon4]\n" "singlecpu=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 64b4e94..d982b2a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1922,6 +1922,13 @@ HWND WINAPI fake_CreateWindowExA( dwExStyle |= WS_EX_APPWINDOW; } + /* Fallout Tactics */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "bosWin32Class") == 0 && + lpWindowName && _strcmpi(lpWindowName, "Fallout: Tactics (TM)") == 0) + { + dwStyle |= WS_VISIBLE; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && From cafbe8f6e1f9cf27bb3ed2df184dd2316e7b7edb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:41:01 +0100 Subject: [PATCH 405/557] fix conflicting presets --- src/config.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 1c542e4..2b7998d 100644 --- a/src/config.c +++ b/src/config.c @@ -576,6 +576,7 @@ static void cfg_create_ini() "\n" "; Balls of Steel v1.2\n" "[bos]\n" + "checkfile=.\\barbarin.ddp\n" "win_version=95\n" "\n" "; BALDR FORCE EXE\n" @@ -953,7 +954,12 @@ static void cfg_create_ini() "singlecpu=false\n" "\n" "; Fallout Tactics: Brotherhood of Steel\n" - "[BOS]\n" + "[BOS/2]\n" + "checkfile=.\\binkw32.dll\n" + "hook_peekmessage=true\n" + "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[BOS_HR]\n" "hook_peekmessage=true\n" "\n" "; Falcon 4.0 (Microprose version)\n" From 63d5d7edd95a6693e52ac0c7f3c5ece762f6c3c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 20:41:50 +0100 Subject: [PATCH 406/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 195d80d..41ed4e1 100644 --- a/README.md +++ b/README.md @@ -182,6 +182,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Falcon 4.0 (Microprose version) - Fallout - Fallout 2 +- Fallout Tactics: Brotherhood of Steel - Final fantasy VII - Final fantasy VIII - Final Liberation: Warhammer Epic 40000 (GOG) From 27738b9baf85fcbd8e2292476ef4701515b0cd96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:00:46 +0100 Subject: [PATCH 407/557] add preset for FT Tools.exe --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 2b7998d..23474a2 100644 --- a/src/config.c +++ b/src/config.c @@ -962,6 +962,10 @@ static void cfg_create_ini() "[BOS_HR]\n" "hook_peekmessage=true\n" "\n" + "; Fallout Tactics: Brotherhood of Steel\n" + "[FT Tools]\n" + "hook_peekmessage=true\n" + "\n" "; Falcon 4.0 (Microprose version)\n" "[falcon4]\n" "singlecpu=false\n" From ffb940b5614703887206dfdbad6050db2fdcc9db Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:28:43 +0100 Subject: [PATCH 408/557] fix warnings --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 + inc/ddpalette.h | 261 ------------------------------------- inc/palette.h | 265 ++++++++++++++++++++++++++++++++++++++ src/ddsurface.c | 1 + src/winapi_hooks.c | 1 + 6 files changed, 271 insertions(+), 261 deletions(-) create mode 100644 inc/palette.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 70bd817..85475c2 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -89,6 +89,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index e1e9a15..f673285 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -293,6 +293,9 @@ Header Files + + Header Files + diff --git a/inc/ddpalette.h b/inc/ddpalette.h index e780b5a..cfd46ff 100644 --- a/inc/ddpalette.h +++ b/inc/ddpalette.h @@ -13,265 +13,4 @@ HRESULT ddp_GetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwBase HRESULT ddp_SetEntries(IDirectDrawPaletteImpl* This, DWORD dwFlags, DWORD dwStartingEntry, DWORD dwCount, LPPALETTEENTRY lpEntries); HRESULT dd_CreatePalette(DWORD dwFlags, LPPALETTEENTRY lpDDColorArray, IDirectDrawPaletteImpl** lpDDPalette, IUnknown FAR* unkOuter); -// Original palette copied from Windows ME -static PALETTEENTRY g_ddp_default_palette[] = -{ - { 0, 0, 0, 0 }, - { 128, 0, 0, 0 }, - { 0, 128, 0, 0 }, - { 128, 128, 0, 0 }, - { 0, 0, 128, 0 }, - { 128, 0, 128, 0 }, - { 0, 128, 128, 0 }, - { 192, 192, 192, 0 }, - { 192, 220, 192, 0 }, - { 166, 202, 240, 0 }, - { 95, 63, 63, 0 }, - { 127, 63, 63, 0 }, - { 159, 63, 63, 0 }, - { 191, 63, 63, 0 }, - { 223, 63, 63, 0 }, - { 255, 63, 63, 0 }, - { 63, 95, 63, 0 }, - { 95, 95, 63, 0 }, - { 127, 95, 63, 0 }, - { 159, 95, 63, 0 }, - { 191, 95, 63, 0 }, - { 223, 95, 63, 0 }, - { 255, 95, 63, 0 }, - { 63, 127, 63, 0 }, - { 95, 127, 63, 0 }, - { 127, 127, 63, 0 }, - { 159, 127, 63, 0 }, - { 191, 127, 63, 0 }, - { 223, 127, 63, 0 }, - { 255, 127, 63, 0 }, - { 63, 159, 63, 0 }, - { 95, 159, 63, 0 }, - { 127, 159, 63, 0 }, - { 159, 159, 63, 0 }, - { 191, 159, 63, 0 }, - { 223, 159, 63, 0 }, - { 255, 159, 63, 0 }, - { 63, 191, 63, 0 }, - { 95, 191, 63, 0 }, - { 127, 191, 63, 0 }, - { 159, 191, 63, 0 }, - { 191, 191, 63, 0 }, - { 223, 191, 63, 0 }, - { 255, 191, 63, 0 }, - { 63, 223, 63, 0 }, - { 95, 223, 63, 0 }, - { 127, 223, 63, 0 }, - { 159, 223, 63, 0 }, - { 191, 223, 63, 0 }, - { 223, 223, 63, 0 }, - { 255, 223, 63, 0 }, - { 63, 255, 63, 0 }, - { 95, 255, 63, 0 }, - { 127, 255, 63, 0 }, - { 159, 255, 63, 0 }, - { 191, 255, 63, 0 }, - { 223, 255, 63, 0 }, - { 255, 255, 63, 0 }, - { 63, 63, 95, 0 }, - { 95, 63, 95, 0 }, - { 127, 63, 95, 0 }, - { 159, 63, 95, 0 }, - { 191, 63, 95, 0 }, - { 223, 63, 95, 0 }, - { 255, 63, 95, 0 }, - { 63, 95, 95, 0 }, - { 95, 95, 95, 0 }, - { 127, 95, 95, 0 }, - { 159, 95, 95, 0 }, - { 191, 95, 95, 0 }, - { 223, 95, 95, 0 }, - { 255, 95, 95, 0 }, - { 63, 127, 95, 0 }, - { 95, 127, 95, 0 }, - { 127, 127, 95, 0 }, - { 159, 127, 95, 0 }, - { 191, 127, 95, 0 }, - { 223, 127, 95, 0 }, - { 255, 127, 95, 0 }, - { 63, 159, 95, 0 }, - { 95, 159, 95, 0 }, - { 127, 159, 95, 0 }, - { 159, 159, 95, 0 }, - { 191, 159, 95, 0 }, - { 223, 159, 95, 0 }, - { 255, 159, 95, 0 }, - { 63, 191, 95, 0 }, - { 95, 191, 95, 0 }, - { 127, 191, 95, 0 }, - { 159, 191, 95, 0 }, - { 191, 191, 95, 0 }, - { 223, 191, 95, 0 }, - { 255, 191, 95, 0 }, - { 63, 223, 95, 0 }, - { 95, 223, 95, 0 }, - { 127, 223, 95, 0 }, - { 159, 223, 95, 0 }, - { 191, 223, 95, 0 }, - { 223, 223, 95, 0 }, - { 255, 223, 95, 0 }, - { 63, 255, 95, 0 }, - { 95, 255, 95, 0 }, - { 127, 255, 95, 0 }, - { 159, 255, 95, 0 }, - { 191, 255, 95, 0 }, - { 223, 255, 95, 0 }, - { 255, 255, 95, 0 }, - { 63, 63, 127, 0 }, - { 95, 63, 127, 0 }, - { 127, 63, 127, 0 }, - { 159, 63, 127, 0 }, - { 191, 63, 127, 0 }, - { 223, 63, 127, 0 }, - { 255, 63, 127, 0 }, - { 63, 95, 127, 0 }, - { 95, 95, 127, 0 }, - { 127, 95, 127, 0 }, - { 159, 95, 127, 0 }, - { 191, 95, 127, 0 }, - { 223, 95, 127, 0 }, - { 255, 95, 127, 0 }, - { 63, 127, 127, 0 }, - { 95, 127, 127, 0 }, - { 127, 127, 127, 0 }, - { 159, 127, 127, 0 }, - { 191, 127, 127, 0 }, - { 223, 127, 127, 0 }, - { 255, 127, 127, 0 }, - { 63, 159, 127, 0 }, - { 95, 159, 127, 0 }, - { 127, 159, 127, 0 }, - { 159, 159, 127, 0 }, - { 191, 159, 127, 0 }, - { 223, 159, 127, 0 }, - { 255, 159, 127, 0 }, - { 63, 191, 127, 0 }, - { 95, 191, 127, 0 }, - { 127, 191, 127, 0 }, - { 159, 191, 127, 0 }, - { 191, 191, 127, 0 }, - { 223, 191, 127, 0 }, - { 255, 191, 127, 0 }, - { 63, 223, 127, 0 }, - { 95, 223, 127, 0 }, - { 127, 223, 127, 0 }, - { 159, 223, 127, 0 }, - { 191, 223, 127, 0 }, - { 223, 223, 127, 0 }, - { 255, 223, 127, 0 }, - { 63, 255, 127, 0 }, - { 95, 255, 127, 0 }, - { 127, 255, 127, 0 }, - { 159, 255, 127, 0 }, - { 191, 255, 127, 0 }, - { 223, 255, 127, 0 }, - { 255, 255, 127, 0 }, - { 63, 63, 159, 0 }, - { 95, 63, 159, 0 }, - { 127, 63, 159, 0 }, - { 159, 63, 159, 0 }, - { 191, 63, 159, 0 }, - { 223, 63, 159, 0 }, - { 255, 63, 159, 0 }, - { 63, 95, 159, 0 }, - { 95, 95, 159, 0 }, - { 127, 95, 159, 0 }, - { 159, 95, 159, 0 }, - { 191, 95, 159, 0 }, - { 223, 95, 159, 0 }, - { 255, 95, 159, 0 }, - { 63, 127, 159, 0 }, - { 95, 127, 159, 0 }, - { 127, 127, 159, 0 }, - { 159, 127, 159, 0 }, - { 191, 127, 159, 0 }, - { 223, 127, 159, 0 }, - { 255, 127, 159, 0 }, - { 63, 159, 159, 0 }, - { 95, 159, 159, 0 }, - { 127, 159, 159, 0 }, - { 159, 159, 159, 0 }, - { 191, 159, 159, 0 }, - { 223, 159, 159, 0 }, - { 255, 159, 159, 0 }, - { 63, 191, 159, 0 }, - { 95, 191, 159, 0 }, - { 127, 191, 159, 0 }, - { 159, 191, 159, 0 }, - { 191, 191, 159, 0 }, - { 223, 191, 159, 0 }, - { 255, 191, 159, 0 }, - { 63, 223, 159, 0 }, - { 95, 223, 159, 0 }, - { 127, 223, 159, 0 }, - { 159, 223, 159, 0 }, - { 191, 223, 159, 0 }, - { 223, 223, 159, 0 }, - { 255, 223, 159, 0 }, - { 63, 255, 159, 0 }, - { 95, 255, 159, 0 }, - { 127, 255, 159, 0 }, - { 159, 255, 159, 0 }, - { 191, 255, 159, 0 }, - { 223, 255, 159, 0 }, - { 255, 255, 159, 0 }, - { 63, 63, 191, 0 }, - { 95, 63, 191, 0 }, - { 127, 63, 191, 0 }, - { 159, 63, 191, 0 }, - { 191, 63, 191, 0 }, - { 223, 63, 191, 0 }, - { 255, 63, 191, 0 }, - { 63, 95, 191, 0 }, - { 95, 95, 191, 0 }, - { 127, 95, 191, 0 }, - { 159, 95, 191, 0 }, - { 191, 95, 191, 0 }, - { 223, 95, 191, 0 }, - { 255, 95, 191, 0 }, - { 63, 127, 191, 0 }, - { 95, 127, 191, 0 }, - { 127, 127, 191, 0 }, - { 159, 127, 191, 0 }, - { 191, 127, 191, 0 }, - { 223, 127, 191, 0 }, - { 255, 127, 191, 0 }, - { 63, 159, 191, 0 }, - { 95, 159, 191, 0 }, - { 127, 159, 191, 0 }, - { 159, 159, 191, 0 }, - { 191, 159, 191, 0 }, - { 223, 159, 191, 0 }, - { 255, 159, 191, 0 }, - { 63, 191, 191, 0 }, - { 95, 191, 191, 0 }, - { 127, 191, 191, 0 }, - { 159, 191, 191, 0 }, - { 191, 191, 191, 0 }, - { 223, 191, 191, 0 }, - { 255, 191, 191, 0 }, - { 63, 223, 191, 0 }, - { 95, 223, 191, 0 }, - { 127, 223, 191, 0 }, - { 159, 223, 191, 0 }, - { 191, 223, 191, 0 }, - { 223, 223, 191, 0 }, - { 255, 251, 240, 0 }, - { 58, 109, 165, 0 }, - { 128, 128, 128, 0 }, - { 255, 0, 0, 0 }, - { 0, 255, 0, 0 }, - { 255, 255, 0, 0 }, - { 0, 0, 255, 0 }, - { 255, 0, 255, 0 }, - { 0, 255, 255, 0 }, - { 255, 255, 255, 0 } -}; - #endif diff --git a/inc/palette.h b/inc/palette.h new file mode 100644 index 0000000..8e38ec4 --- /dev/null +++ b/inc/palette.h @@ -0,0 +1,265 @@ +#ifndef PALETTE_H +#define PALETTE_H + +// Original palette copied from Windows ME +static PALETTEENTRY g_ddp_default_palette[] = +{ + { 0, 0, 0, 0 }, + { 128, 0, 0, 0 }, + { 0, 128, 0, 0 }, + { 128, 128, 0, 0 }, + { 0, 0, 128, 0 }, + { 128, 0, 128, 0 }, + { 0, 128, 128, 0 }, + { 192, 192, 192, 0 }, + { 192, 220, 192, 0 }, + { 166, 202, 240, 0 }, + { 95, 63, 63, 0 }, + { 127, 63, 63, 0 }, + { 159, 63, 63, 0 }, + { 191, 63, 63, 0 }, + { 223, 63, 63, 0 }, + { 255, 63, 63, 0 }, + { 63, 95, 63, 0 }, + { 95, 95, 63, 0 }, + { 127, 95, 63, 0 }, + { 159, 95, 63, 0 }, + { 191, 95, 63, 0 }, + { 223, 95, 63, 0 }, + { 255, 95, 63, 0 }, + { 63, 127, 63, 0 }, + { 95, 127, 63, 0 }, + { 127, 127, 63, 0 }, + { 159, 127, 63, 0 }, + { 191, 127, 63, 0 }, + { 223, 127, 63, 0 }, + { 255, 127, 63, 0 }, + { 63, 159, 63, 0 }, + { 95, 159, 63, 0 }, + { 127, 159, 63, 0 }, + { 159, 159, 63, 0 }, + { 191, 159, 63, 0 }, + { 223, 159, 63, 0 }, + { 255, 159, 63, 0 }, + { 63, 191, 63, 0 }, + { 95, 191, 63, 0 }, + { 127, 191, 63, 0 }, + { 159, 191, 63, 0 }, + { 191, 191, 63, 0 }, + { 223, 191, 63, 0 }, + { 255, 191, 63, 0 }, + { 63, 223, 63, 0 }, + { 95, 223, 63, 0 }, + { 127, 223, 63, 0 }, + { 159, 223, 63, 0 }, + { 191, 223, 63, 0 }, + { 223, 223, 63, 0 }, + { 255, 223, 63, 0 }, + { 63, 255, 63, 0 }, + { 95, 255, 63, 0 }, + { 127, 255, 63, 0 }, + { 159, 255, 63, 0 }, + { 191, 255, 63, 0 }, + { 223, 255, 63, 0 }, + { 255, 255, 63, 0 }, + { 63, 63, 95, 0 }, + { 95, 63, 95, 0 }, + { 127, 63, 95, 0 }, + { 159, 63, 95, 0 }, + { 191, 63, 95, 0 }, + { 223, 63, 95, 0 }, + { 255, 63, 95, 0 }, + { 63, 95, 95, 0 }, + { 95, 95, 95, 0 }, + { 127, 95, 95, 0 }, + { 159, 95, 95, 0 }, + { 191, 95, 95, 0 }, + { 223, 95, 95, 0 }, + { 255, 95, 95, 0 }, + { 63, 127, 95, 0 }, + { 95, 127, 95, 0 }, + { 127, 127, 95, 0 }, + { 159, 127, 95, 0 }, + { 191, 127, 95, 0 }, + { 223, 127, 95, 0 }, + { 255, 127, 95, 0 }, + { 63, 159, 95, 0 }, + { 95, 159, 95, 0 }, + { 127, 159, 95, 0 }, + { 159, 159, 95, 0 }, + { 191, 159, 95, 0 }, + { 223, 159, 95, 0 }, + { 255, 159, 95, 0 }, + { 63, 191, 95, 0 }, + { 95, 191, 95, 0 }, + { 127, 191, 95, 0 }, + { 159, 191, 95, 0 }, + { 191, 191, 95, 0 }, + { 223, 191, 95, 0 }, + { 255, 191, 95, 0 }, + { 63, 223, 95, 0 }, + { 95, 223, 95, 0 }, + { 127, 223, 95, 0 }, + { 159, 223, 95, 0 }, + { 191, 223, 95, 0 }, + { 223, 223, 95, 0 }, + { 255, 223, 95, 0 }, + { 63, 255, 95, 0 }, + { 95, 255, 95, 0 }, + { 127, 255, 95, 0 }, + { 159, 255, 95, 0 }, + { 191, 255, 95, 0 }, + { 223, 255, 95, 0 }, + { 255, 255, 95, 0 }, + { 63, 63, 127, 0 }, + { 95, 63, 127, 0 }, + { 127, 63, 127, 0 }, + { 159, 63, 127, 0 }, + { 191, 63, 127, 0 }, + { 223, 63, 127, 0 }, + { 255, 63, 127, 0 }, + { 63, 95, 127, 0 }, + { 95, 95, 127, 0 }, + { 127, 95, 127, 0 }, + { 159, 95, 127, 0 }, + { 191, 95, 127, 0 }, + { 223, 95, 127, 0 }, + { 255, 95, 127, 0 }, + { 63, 127, 127, 0 }, + { 95, 127, 127, 0 }, + { 127, 127, 127, 0 }, + { 159, 127, 127, 0 }, + { 191, 127, 127, 0 }, + { 223, 127, 127, 0 }, + { 255, 127, 127, 0 }, + { 63, 159, 127, 0 }, + { 95, 159, 127, 0 }, + { 127, 159, 127, 0 }, + { 159, 159, 127, 0 }, + { 191, 159, 127, 0 }, + { 223, 159, 127, 0 }, + { 255, 159, 127, 0 }, + { 63, 191, 127, 0 }, + { 95, 191, 127, 0 }, + { 127, 191, 127, 0 }, + { 159, 191, 127, 0 }, + { 191, 191, 127, 0 }, + { 223, 191, 127, 0 }, + { 255, 191, 127, 0 }, + { 63, 223, 127, 0 }, + { 95, 223, 127, 0 }, + { 127, 223, 127, 0 }, + { 159, 223, 127, 0 }, + { 191, 223, 127, 0 }, + { 223, 223, 127, 0 }, + { 255, 223, 127, 0 }, + { 63, 255, 127, 0 }, + { 95, 255, 127, 0 }, + { 127, 255, 127, 0 }, + { 159, 255, 127, 0 }, + { 191, 255, 127, 0 }, + { 223, 255, 127, 0 }, + { 255, 255, 127, 0 }, + { 63, 63, 159, 0 }, + { 95, 63, 159, 0 }, + { 127, 63, 159, 0 }, + { 159, 63, 159, 0 }, + { 191, 63, 159, 0 }, + { 223, 63, 159, 0 }, + { 255, 63, 159, 0 }, + { 63, 95, 159, 0 }, + { 95, 95, 159, 0 }, + { 127, 95, 159, 0 }, + { 159, 95, 159, 0 }, + { 191, 95, 159, 0 }, + { 223, 95, 159, 0 }, + { 255, 95, 159, 0 }, + { 63, 127, 159, 0 }, + { 95, 127, 159, 0 }, + { 127, 127, 159, 0 }, + { 159, 127, 159, 0 }, + { 191, 127, 159, 0 }, + { 223, 127, 159, 0 }, + { 255, 127, 159, 0 }, + { 63, 159, 159, 0 }, + { 95, 159, 159, 0 }, + { 127, 159, 159, 0 }, + { 159, 159, 159, 0 }, + { 191, 159, 159, 0 }, + { 223, 159, 159, 0 }, + { 255, 159, 159, 0 }, + { 63, 191, 159, 0 }, + { 95, 191, 159, 0 }, + { 127, 191, 159, 0 }, + { 159, 191, 159, 0 }, + { 191, 191, 159, 0 }, + { 223, 191, 159, 0 }, + { 255, 191, 159, 0 }, + { 63, 223, 159, 0 }, + { 95, 223, 159, 0 }, + { 127, 223, 159, 0 }, + { 159, 223, 159, 0 }, + { 191, 223, 159, 0 }, + { 223, 223, 159, 0 }, + { 255, 223, 159, 0 }, + { 63, 255, 159, 0 }, + { 95, 255, 159, 0 }, + { 127, 255, 159, 0 }, + { 159, 255, 159, 0 }, + { 191, 255, 159, 0 }, + { 223, 255, 159, 0 }, + { 255, 255, 159, 0 }, + { 63, 63, 191, 0 }, + { 95, 63, 191, 0 }, + { 127, 63, 191, 0 }, + { 159, 63, 191, 0 }, + { 191, 63, 191, 0 }, + { 223, 63, 191, 0 }, + { 255, 63, 191, 0 }, + { 63, 95, 191, 0 }, + { 95, 95, 191, 0 }, + { 127, 95, 191, 0 }, + { 159, 95, 191, 0 }, + { 191, 95, 191, 0 }, + { 223, 95, 191, 0 }, + { 255, 95, 191, 0 }, + { 63, 127, 191, 0 }, + { 95, 127, 191, 0 }, + { 127, 127, 191, 0 }, + { 159, 127, 191, 0 }, + { 191, 127, 191, 0 }, + { 223, 127, 191, 0 }, + { 255, 127, 191, 0 }, + { 63, 159, 191, 0 }, + { 95, 159, 191, 0 }, + { 127, 159, 191, 0 }, + { 159, 159, 191, 0 }, + { 191, 159, 191, 0 }, + { 223, 159, 191, 0 }, + { 255, 159, 191, 0 }, + { 63, 191, 191, 0 }, + { 95, 191, 191, 0 }, + { 127, 191, 191, 0 }, + { 159, 191, 191, 0 }, + { 191, 191, 191, 0 }, + { 223, 191, 191, 0 }, + { 255, 191, 191, 0 }, + { 63, 223, 191, 0 }, + { 95, 223, 191, 0 }, + { 127, 223, 191, 0 }, + { 159, 223, 191, 0 }, + { 191, 223, 191, 0 }, + { 223, 223, 191, 0 }, + { 255, 251, 240, 0 }, + { 58, 109, 165, 0 }, + { 128, 128, 128, 0 }, + { 255, 0, 0, 0 }, + { 0, 255, 0, 0 }, + { 255, 255, 0, 0 }, + { 0, 0, 255, 0 }, + { 255, 0, 255, 0 }, + { 0, 255, 255, 0 }, + { 255, 255, 255, 0 } +}; + +#endif diff --git a/src/ddsurface.c b/src/ddsurface.c index 18ebb27..c13480a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -15,6 +15,7 @@ #include "utils.h" #include "versionhelpers.h" #include "ddpalette.h" +#include "palette.h" LONG g_dds_gdi_handles; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d982b2a..7dff04d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -21,6 +21,7 @@ #include "hook.h" #include "directinput.h" #include "ddpalette.h" +#include "palette.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) From dcec176e15cd0e5747febadd9b4033168b51c37e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 21:58:41 +0100 Subject: [PATCH 409/557] make sure we don't break older version of windows --- src/hook.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index a7a9f56..3b7745f 100644 --- a/src/hook.c +++ b/src/hook.c @@ -34,7 +34,6 @@ SETWINDOWPOSPROC real_SetWindowPos = SetWindowPos; MOVEWINDOWPROC real_MoveWindow = MoveWindow; SENDMESSAGEAPROC real_SendMessageA = SendMessageA; SETWINDOWLONGAPROC real_SetWindowLongA = SetWindowLongA; -SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; GETWINDOWLONGAPROC real_GetWindowLongA = GetWindowLongA; ENABLEWINDOWPROC real_EnableWindow = EnableWindow; CREATEWINDOWEXAPROC real_CreateWindowExA = CreateWindowExA; @@ -75,6 +74,12 @@ COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) +SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; +#else +SETWINDOWLONGWPROC real_SetWindowLongW; +#endif + HOOKLIST g_hook_hooklist[] = { { @@ -97,7 +102,6 @@ HOOKLIST g_hook_hooklist[] = { "MoveWindow", (PROC)fake_MoveWindow, (PROC*)&real_MoveWindow, 0 }, { "SendMessageA", (PROC)fake_SendMessageA, (PROC*)&real_SendMessageA, 0 }, { "SetWindowLongA", (PROC)fake_SetWindowLongA, (PROC*)&real_SetWindowLongA, 0 }, - { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, { "GetWindowLongA", (PROC)fake_GetWindowLongA, (PROC*)&real_GetWindowLongA, 0 }, { "EnableWindow", (PROC)fake_EnableWindow, (PROC*)&real_EnableWindow, 0 }, { "CreateWindowExA", (PROC)fake_CreateWindowExA, (PROC*)&real_CreateWindowExA, 0 }, @@ -116,6 +120,11 @@ HOOKLIST g_hook_hooklist[] = { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, + +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) + { "SetWindowLongW", (PROC)fake_SetWindowLongW, (PROC*)&real_SetWindowLongW, 0 }, +#endif + { "", NULL, NULL, 0 } } }, From b4cb93d32b63bbbf9c8024201809d2b685903d3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Dec 2024 22:29:01 +0100 Subject: [PATCH 410/557] re-enable windowed hack --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index aa183ea..f5df432 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1549,8 +1549,8 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { TRACE(" client rect=%dx%d\n", rc.right, rc.bottom); - //g_ddraw.windowed_hack = TRUE; - //dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); + g_ddraw.windowed_hack = TRUE; + dd_SetDisplayMode(rc.right, rc.bottom, 16, 0); } } } From e44ade5d72bce9ddec868f32f14b0fb649245aba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 05:44:20 +0100 Subject: [PATCH 411/557] add preset for Swarog --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 23474a2..2fea835 100644 --- a/src/config.c +++ b/src/config.c @@ -1573,6 +1573,10 @@ static void cfg_create_ini() "[golf]\n" "fake_mode=640x480x16\n" "\n" + "; Swarog\n" + "[Swarog]\n" + "singlecpu=false\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" From 7025517c2fea1896588a2793fcbad4a1a52254b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 05:44:28 +0100 Subject: [PATCH 412/557] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 41ed4e1..5b9b24a 100644 --- a/README.md +++ b/README.md @@ -398,6 +398,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Stronghold HD - Sudden Strike 2 - Superbike 2000 +- Swarog - The Curse Of Monkey Island - The Dig - The Missing on Lost Island @@ -418,6 +419,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms - Toy Story +- Tone Rebellion - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown From d83e9e44018344de918a28b3c1ffe23b344ee742 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 08:45:51 +0100 Subject: [PATCH 413/557] hook AVIStreamGetFrameOpen --- Makefile | 2 +- cnc-ddraw.vcxproj | 10 +++++----- inc/IDirectDrawSurface.h | 5 +++++ inc/hook.h | 4 ++++ inc/winapi_hooks.h | 3 +++ src/ddsurface.c | 3 +-- src/hook.c | 8 ++++++++ src/winapi_hooks.c | 25 +++++++++++++++++++++++++ 8 files changed, 52 insertions(+), 8 deletions(-) diff --git a/Makefile b/Makefile index 7c0dd2b..812f29e 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 85475c2..94df66d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -223,7 +223,7 @@ Windows - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -265,7 +265,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -307,7 +307,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -349,7 +349,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def @@ -391,7 +391,7 @@ echo #define GIT_BRANCH "%GIT_BRANCH%" >> %DST_FILE% Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + avifil32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) exports.def diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index e20b506..d8eb99f 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -9,6 +9,11 @@ #include "IDirectDraw.h" +typedef struct DDBITMAPINFO{ + BITMAPINFOHEADER bmiHeader; + RGBQUAD bmiColors[256]; +} DDBITMAPINFO; + struct IDirectDrawSurfaceImpl; struct IDirectDrawSurfaceImplVtbl; diff --git a/inc/hook.h b/inc/hook.h index f362562..219361c 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -2,6 +2,7 @@ #define HOOK_H #include +#include #define HOOK_SKIP_2 0x00000001l @@ -83,6 +84,8 @@ typedef HRESULT(WINAPI* COCREATEINSTANCEPROC)(REFCLSID, LPUNKNOWN, DWORD, REFIID typedef MCIERROR(WINAPI* MCISENDCOMMANDAPROC)(MCIDEVICEID, UINT, DWORD_PTR, DWORD_PTR); typedef LPTOP_LEVEL_EXCEPTION_FILTER(WINAPI* SETUNHANDLEDEXCEPTIONFILTERPROC)(LPTOP_LEVEL_EXCEPTION_FILTER); +typedef PGETFRAME (WINAPI* AVISTREAMGETFRAMEOPENPROC)(PAVISTREAM, LPBITMAPINFOHEADER); + extern GETCURSORPOSPROC real_GetCursorPos; extern CLIPCURSORPROC real_ClipCursor; extern SHOWCURSORPROC real_ShowCursor; @@ -140,6 +143,7 @@ extern GETVERSIONEXAPROC real_GetVersionExA; extern COCREATEINSTANCEPROC real_CoCreateInstance; extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; +extern AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen; extern BOOL g_hook_active; extern HOOKLIST g_hook_hooklist[]; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index d9426fa..3d2cbae 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -2,6 +2,7 @@ #define WINAPI_HOOKS_H #include +#include BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint); @@ -93,4 +94,6 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); +PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted); + #endif diff --git a/src/ddsurface.c b/src/ddsurface.c index c13480a..ae4fcfd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1467,10 +1467,9 @@ HRESULT dd_CreateSurface( DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; - DWORD bmi_size = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * 256; DWORD bmp_size = dst_surface->pitch * (dst_surface->height + g_config.guard_lines); - dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, bmi_size); + dst_surface->bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DDBITMAPINFO)); dst_surface->bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); dst_surface->bmi->bmiHeader.biWidth = aligned_width; dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); diff --git a/src/hook.c b/src/hook.c index 3b7745f..7d90641 100644 --- a/src/hook.c +++ b/src/hook.c @@ -73,6 +73,7 @@ GETVERSIONEXAPROC real_GetVersionExA = GetVersionExA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; +AVISTREAMGETFRAMEOPENPROC real_AVIStreamGetFrameOpen = AVIStreamGetFrameOpen; #if (_WIN32_WINNT >= _WIN32_WINNT_WIN2K) SETWINDOWLONGWPROC real_SetWindowLongW = SetWindowLongW; @@ -142,6 +143,13 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + { + "Avifil32.dll", + { + { "AVIStreamGetFrameOpen", (PROC)fake_AVIStreamGetFrameOpen, (PROC*)&real_AVIStreamGetFrameOpen, 0 }, + { "", NULL, NULL, 0 } + } + }, { "dinput.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7dff04d..78cce33 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "debug.h" #include "config.h" #include "dd.h" @@ -2174,3 +2175,27 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( return old; //return real_SetUnhandledExceptionFilter(lpTopLevelExceptionFilter); } + +PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) +{ + if (g_ddraw.ref && g_ddraw.primary && (!lpbiWanted || (DWORD)lpbiWanted == 1)) + { + DDBITMAPINFO bmi; + memcpy(&bmi, g_ddraw.primary->bmi, sizeof(DDBITMAPINFO)); + + bmi.bmiHeader.biHeight = 0; + bmi.bmiHeader.biWidth = 0; + + if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) + { + memcpy(&bmi.bmiColors[0], g_ddraw.primary->palette->data_rgb, sizeof(bmi.bmiColors)); + } + + PGETFRAME result = real_AVIStreamGetFrameOpen(pavi, (LPBITMAPINFOHEADER)&bmi); + + if (result) + return result; + } + + return real_AVIStreamGetFrameOpen(pavi, lpbiWanted); +} From 9e50a4ba938405e361ed3e6a856bc48db9fc1501 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 08:48:20 +0100 Subject: [PATCH 414/557] use constant for AVIGETFRAMEF_BESTDISPLAYFMT --- src/winapi_hooks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 78cce33..a1c9787 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2178,7 +2178,7 @@ LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( PGETFRAME WINAPI fake_AVIStreamGetFrameOpen(PAVISTREAM pavi, LPBITMAPINFOHEADER lpbiWanted) { - if (g_ddraw.ref && g_ddraw.primary && (!lpbiWanted || (DWORD)lpbiWanted == 1)) + if (g_ddraw.ref && g_ddraw.primary && (DWORD)lpbiWanted == AVIGETFRAMEF_BESTDISPLAYFMT) { DDBITMAPINFO bmi; memcpy(&bmi, g_ddraw.primary->bmi, sizeof(DDBITMAPINFO)); From d311248fc98b41cf0636304b61ae63519d359be9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:17:59 +0100 Subject: [PATCH 415/557] update Swarog preset --- src/config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config.c b/src/config.c index 2fea835..82ec402 100644 --- a/src/config.c +++ b/src/config.c @@ -1576,6 +1576,9 @@ static void cfg_create_ini() "; Swarog\n" "[Swarog]\n" "singlecpu=false\n" + "maxfps=60\n" + "maxgameticks=60\n" + "minfps=-1\n" "\n" "; Sim Copter\n" "[SimCopter]\n" From 3a8baa4f379e225c37ef1fd0bc595f5abd6b3598 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:34:20 +0100 Subject: [PATCH 416/557] add preset for Wheel Of Fortune --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 82ec402..9ffd51f 100644 --- a/src/config.c +++ b/src/config.c @@ -1817,6 +1817,10 @@ static void cfg_create_ini() "[WA]\n" "lock_mouse_top_left=true\n" "\n" + "; Wheel Of Fortune\n" + "[WHEEL]\n" + "singlecpu=false\n" + "\n" "; War Wind\n" "[WW]\n" "minfps=-1\n" From 29079da6834ca8a40272976df60b87c31da57b94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Dec 2024 10:34:42 +0100 Subject: [PATCH 417/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5b9b24a..07c604d 100644 --- a/README.md +++ b/README.md @@ -442,6 +442,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Wizards and Warriors - Worms 2 - Worms Armageddon +- Wheel Of Fortune - Zeus: Master of Olympus - Zoombinis Island Odyssey - Zoombinis Logical Journey From 95c72d0b932bc4cf9dcb14d8a542a8f05e4e1ba9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 06:44:53 +0100 Subject: [PATCH 418/557] update supported games list --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 07c604d..002dac2 100644 --- a/README.md +++ b/README.md @@ -93,9 +93,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Batman: Toxic Chill - Birthright: The Gorgons Alliance - Blade & Sword -- Blitzkrieg anthology -- Blitzkrieg anthology: Burning Horizon -- Blitzkrieg anthology: Rolling Thunder - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt From ef3459d1fa2e29b2933e8dcb739fd52abe05b4da Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 07:15:12 +0100 Subject: [PATCH 419/557] add preset for Wall Street Trader 2000 --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 9ffd51f..a363cc8 100644 --- a/src/config.c +++ b/src/config.c @@ -1791,6 +1791,11 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; Wall Street Trader 2000 - NOT WORKING YET\n" + "[WSTrader]\n" + "nonexclusive=false\n" + "windowed=false\n" + "\n" "; WarCraft 2000: Nuclear Epidemic\n" "[war2000]\n" "resolutions=2\n" From e0aaba5e42e3bb167a503d7fede18592925ad1ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 08:01:29 +0100 Subject: [PATCH 420/557] add preset for NBA Full Court Press --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a363cc8..dee87c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1354,6 +1354,10 @@ static void cfg_create_ini() "limiter_type=1\n" "maxgameticks=120\n" "\n" + "; NBA Full Court Press\n" + "[NBA_FCP]\n" + "fake_mode=640x480x8\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From fb85d6ea03f6f6d180746af608776b481f53ec10 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Dec 2024 08:06:50 +0100 Subject: [PATCH 421/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 002dac2..0858f9a 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Nancy Drew: The Secret of Shadow Ranch - Nancy Drew: Treasure in the Royal Tower - NBA Action '98 +- NBA Full Court Press - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From 76743284105ffefe7e5528f4fc0eac5be5c5bb52 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:21:23 +0100 Subject: [PATCH 422/557] add new limiter_type type (PeekMessage) --- inc/dd.h | 2 ++ src/config.c | 2 +- src/ddsurface.c | 10 ++++++++-- src/winapi_hooks.c | 7 +++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index b9382b1..fe175f7 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -51,6 +51,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 #define LIMIT_UNLOCK 3 +#define LIMIT_PEEKMESSAGE 4 #define CENTER_WINDOW_NEVER 0 #define CENTER_WINDOW_AUTO 1 @@ -126,6 +127,7 @@ typedef struct CNCDDRAW LONG palette_updated; LONG surface_updated; LONG clear_screen; + LONG screen_updated; float scale_w; float scale_h; diff --git a/src/config.c b/src/config.c index dee87c7..87e34a7 100644 --- a/src/config.c +++ b/src/config.c @@ -290,7 +290,7 @@ static void cfg_create_ini() "; Note: Usually one of the following values will work: 60 / 30 / 25 / 20 / 15 (lower value = slower game speed)\n" "maxgameticks=0\n" "\n" - "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock\n" + "; Method that should be used to limit game ticks (maxgameticks=): 0 = Automatic, 1 = TestCooperativeLevel, 2 = BltFast, 3 = Unlock, 4 = PeekMessage\n" "limiter_type=0\n" "\n" "; Force minimum FPS, possible values: 0 = disabled, -1 = use 'maxfps=' value, -2 = same as -1 but force full redraw, 1-1000 = custom FPS\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index ae4fcfd..454ca24 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -430,6 +430,7 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { @@ -438,7 +439,7 @@ HRESULT dds_Blt( ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); @@ -666,6 +667,7 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -824,6 +826,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa This->last_flip_tick = timeGetTime(); InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); @@ -832,7 +835,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa dd_WaitForVerticalBlank(DDWAITVB_BLOCKEND, NULL); } - if (g_ddraw.ticks_limiter.tick_length > 0) + if (g_ddraw.ticks_limiter.tick_length > 0 && g_config.limiter_type != LIMIT_PEEKMESSAGE) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); @@ -1027,6 +1030,7 @@ HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -1212,6 +1216,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); DWORD time = timeGetTime(); @@ -1221,6 +1226,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (g_ddraw.ticks_limiter.tick_length > 0 && + g_config.limiter_type != LIMIT_PEEKMESSAGE && (!g_ddraw.ticks_limiter.dds_unlock_limiter_disabled || g_config.limiter_type == LIMIT_UNLOCK)) { util_limit_game_ticks(); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a1c9787..fa45f89 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -780,6 +780,13 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_config.limiter_type == LIMIT_PEEKMESSAGE && + g_ddraw.ticks_limiter.tick_length > 0 && + InterlockedExchange(&g_ddraw.render.screen_updated, FALSE)) + { + util_limit_game_ticks(); + } + if (g_ddraw.ref && (!hWnd || hWnd == g_ddraw.hwnd)) g_ddraw.last_msg_pull_tick = timeGetTime(); From eaded705722ab93551f2786ffcf717287569ae53 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:22:47 +0100 Subject: [PATCH 423/557] add preset for Rage of Mages --- README.md | 1 + src/config.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 0858f9a..075ca41 100644 --- a/README.md +++ b/README.md @@ -314,6 +314,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time - Quest for Glory 5 +- Rage of Mages - Rage of Mages 2 - Railroad Tycoon II - Reader Rabbit 1st Grade diff --git a/src/config.c b/src/config.c index 87e34a7..a4de90d 100644 --- a/src/config.c +++ b/src/config.c @@ -1483,6 +1483,12 @@ static void cfg_create_ini() "[popTB]\n" "singlecpu=false\n" "\n" + "; Rage of Mages\n" + "[rom]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "singlecpu=true\n" + "\n" "; Railroad Tycoon II\n" "[RT2]\n" "adjmouse=true\n" From 8a209659e4a60b0440fe4a7c2632dfcddd02af00 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 02:42:07 +0100 Subject: [PATCH 424/557] add preset for Squad Leader --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 075ca41..ccf9352 100644 --- a/README.md +++ b/README.md @@ -369,6 +369,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing +- Squad Leader - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard diff --git a/src/config.c b/src/config.c index a4de90d..22a6acc 100644 --- a/src/config.c +++ b/src/config.c @@ -1694,6 +1694,11 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Squad Leader\n" + "[SquadLeader]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; The Curse Of Monkey Island\n" "[COMI]\n" "singlecpu=false\n" From b986c04a0bcf9866583197c6786386efa6235ace Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 03:53:41 +0100 Subject: [PATCH 425/557] update Zork Nemesis preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 22a6acc..cdfe4c0 100644 --- a/src/config.c +++ b/src/config.c @@ -1852,6 +1852,8 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "singlecpu=false\n" + "maxgameticks=30\n" + "limiter_type=4\n" "\n" , fh); From 0f5cc8a46dacd78637d61c7a838ded48cb58bbb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 04:00:48 +0100 Subject: [PATCH 426/557] update preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index cdfe4c0..cc74048 100644 --- a/src/config.c +++ b/src/config.c @@ -1852,7 +1852,7 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "singlecpu=false\n" - "maxgameticks=30\n" + "maxgameticks=60\n" "limiter_type=4\n" "\n" From 27a1b4fc8d190f3dbac4c8c24e5691fefb030884 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 08:05:54 +0100 Subject: [PATCH 427/557] add preset for Karma Immortal Wrath --- README.md | 2 ++ src/config.c | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index ccf9352..d4c609d 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) +- Cydonia Mars - The First Manned Mission - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle @@ -231,6 +232,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 +- Karma Immortal Wrath - Killing Time - Kings Quest 8: Mask of Eternity - KKND Xtreme diff --git a/src/config.c b/src/config.c index cc74048..13ec82b 100644 --- a/src/config.c +++ b/src/config.c @@ -1193,6 +1193,11 @@ static void cfg_create_ini() "[jeoppc]\n" "singlecpu=false\n" "\n" + "; Karma Immortal Wrath\n" + "[karma]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "\n" "; Konung\n" "[konung]\n" "fixchilds=0\n" From 02a97cf9f7209a025deb827c6e9007cb8c04a3d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 21:20:58 +0100 Subject: [PATCH 428/557] add some more presets --- README.md | 4 ++++ src/config.c | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index d4c609d..c483e9b 100644 --- a/README.md +++ b/README.md @@ -242,6 +242,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Last Bronx - Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) - Lionheart - Legacy of the Crusader @@ -429,6 +430,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Uprising: Join or Die - Vermeer - Virtua Fighter PC +- Virtua Cop +- Virtua Cop 2 +- Virtua Fighter 2 - Virtual Springfield - War Wind - War Wind II - Human Onslaught diff --git a/src/config.c b/src/config.c index 13ec82b..b04d40c 100644 --- a/src/config.c +++ b/src/config.c @@ -1224,6 +1224,10 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Last Bronx\n" + "[LB]\n" + "maxgameticks=30\n" + "\n" "; Lapis (lapis.mgame.com)\n" "[Lapis]\n" "fixchilds=3\n" @@ -1811,6 +1815,10 @@ static void cfg_create_ini() "adjmouse=true\n" "fake_mode=640x480x32\n" "\n" + "; Virtua Fighter 2\n" + "[VF2]\n" + "fake_mode=640x480x8\n" + "\n" "; Wall Street Trader 2000 - NOT WORKING YET\n" "[WSTrader]\n" "nonexclusive=false\n" From d6a80273fc0e58f1af88055d57ddd1dfb14b15f7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 22:49:05 +0100 Subject: [PATCH 429/557] use GetSystemPaletteEntries hook for any display DC --- src/winapi_hooks.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fa45f89..4cc8399 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1426,10 +1426,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP pPalEntries, _ReturnAddress()); - if (g_ddraw.ref && - g_ddraw.bpp == 8 && - pPalEntries && - ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + if (g_ddraw.ref && g_ddraw.bpp == 8 && pPalEntries && GetObjectType(hdc) == OBJ_DC) { TRACE(" Display DC\n"); @@ -1441,10 +1438,7 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP { for (int i = iStart, x = 0; i < iStart + cEntries && i < 256; i++, x++) { - pPalEntries[x].peRed = g_ddp_default_palette[i].peRed; - pPalEntries[x].peGreen = g_ddp_default_palette[i].peGreen; - pPalEntries[x].peBlue = g_ddp_default_palette[i].peBlue; - pPalEntries[x].peFlags = g_ddp_default_palette[i].peFlags; + pPalEntries[x] = g_ddp_default_palette[i]; } } From 348a90b54535ea13120f9c4489b3ed6d96addc89 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 22:52:03 +0100 Subject: [PATCH 430/557] adjust logging --- src/winapi_hooks.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4cc8399..5ad4afe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1450,20 +1450,22 @@ UINT WINAPI fake_GetSystemPaletteEntries(HDC hdc, UINT iStart, UINT cEntries, LP HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) { + TRACE_EXT( + "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", + __FUNCTION__, + hdc, + hPal, + bForceBkgd, + _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { + TRACE(" Display DC\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT( - "%s(hdc=%p, hPal=%p, bForceBkgd=%d) [%p]\n", - __FUNCTION__, - hdc, - hPal, - bForceBkgd, - _ReturnAddress()); - g_ddraw.primary->selected_pal_count = GetPaletteEntries(hPal, 0, 256, g_ddraw.primary->selected_pal); return real_SelectPalette(g_ddraw.primary->hdc, hPal, bForceBkgd);; @@ -1475,14 +1477,16 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) UINT WINAPI fake_RealizePalette(HDC hdc) { + TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); + if (g_ddraw.ref && g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { + TRACE(" Display DC\n"); + if (g_ddraw.primary && g_ddraw.primary->palette) { - TRACE_EXT("%s(hdc=%p) [%p]\n", __FUNCTION__, hdc, _ReturnAddress()); - if (g_ddraw.primary->selected_pal_count != 256) { TRACE_EXT(" selected_pal_count = %u\n", g_ddraw.primary->selected_pal_count); From c5058f837188ab71f6c9c10474d25901dc7bc3b9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:00:05 +0100 Subject: [PATCH 431/557] use TRACE_EXT --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5ad4afe..fb27c02 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1462,7 +1462,7 @@ HPALETTE WINAPI fake_SelectPalette(HDC hdc, HPALETTE hPal, BOOL bForceBkgd) g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" Display DC\n"); + TRACE_EXT(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { @@ -1483,7 +1483,7 @@ UINT WINAPI fake_RealizePalette(HDC hdc) g_ddraw.bpp == 8 && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { - TRACE(" Display DC\n"); + TRACE_EXT(" Display DC\n"); if (g_ddraw.primary && g_ddraw.primary->palette) { From 07aab3b8d2e09147666b3c0060e09d239bdba59d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:41:09 +0100 Subject: [PATCH 432/557] add separate GetDeviceCaps hook for system dlls --- inc/hook.h | 1 + inc/winapi_hooks.h | 1 + src/hook.c | 7 +++++++ src/winapi_hooks.c | 15 +++++++++++++++ 4 files changed, 24 insertions(+) diff --git a/inc/hook.h b/inc/hook.h index 219361c..bbab6da 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -7,6 +7,7 @@ #define HOOK_SKIP_2 0x00000001l #define HOOK_LOCAL_ONLY 0x00000002l +#define HOOK_SYSTEM_ONLY 0x00000004l typedef struct HOOKLISTDATA { char function_name[32]; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3d2cbae..6c6cbb1 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -41,6 +41,7 @@ LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lP SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); +int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, DWORD rop); diff --git a/src/hook.c b/src/hook.c index 7d90641..1e4bf14 100644 --- a/src/hook.c +++ b/src/hook.c @@ -174,6 +174,7 @@ HOOKLIST g_hook_hooklist[] = { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, HOOK_LOCAL_ONLY }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps_system, NULL, HOOK_SYSTEM_ONLY }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "GetSystemPaletteEntries", (PROC)fake_GetSystemPaletteEntries, (PROC*)&real_GetSystemPaletteEntries, 0 }, { "SelectPalette", (PROC)fake_SelectPalette, (PROC*)&real_SelectPalette, 0 }, @@ -289,6 +290,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; + if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) + continue; + if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -407,6 +411,9 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) continue; + if (is_local && (hooks[i].data[x].flags & HOOK_SYSTEM_ONLY)) + continue; + #if defined(__GNUC__) if (util_is_bad_read_ptr((void*)import->Name)) continue; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fb27c02..50551a3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -956,6 +956,21 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) return real_GetDeviceCaps(hdc, index); } +int WINAPI fake_GetDeviceCaps_system(HDC hdc, int index) +{ + if (g_ddraw.ref && + g_ddraw.bpp == 8 && + ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) + { + if (index == RASTERCAPS) + { + return RC_PALETTE | real_GetDeviceCaps(hdc, index); + } + } + + return real_GetDeviceCaps(hdc, index); +} + BOOL WINAPI fake_StretchBlt( HDC hdcDest, int xDest, From 25bf452eb2699a60109190cfb00206b68580df80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Dec 2024 23:52:45 +0100 Subject: [PATCH 433/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c483e9b..d709fa2 100644 --- a/README.md +++ b/README.md @@ -455,6 +455,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Zoombinis Mountain Rescue - Zuma Deluxe - Zork Nemesis +- Z & Z Expansion Kit - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From a74af22970b8917375a552f53faf048d75cac102 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 02:47:43 +0100 Subject: [PATCH 434/557] remove simgold preset --- README.md | 1 - src/config.c | 4 ---- 2 files changed, 5 deletions(-) diff --git a/README.md b/README.md index d709fa2..f27ca15 100644 --- a/README.md +++ b/README.md @@ -361,7 +361,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division -- Sid Meier's Simgolf - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) diff --git a/src/config.c b/src/config.c index b04d40c..d5801ea 100644 --- a/src/config.c +++ b/src/config.c @@ -1588,10 +1588,6 @@ static void cfg_create_ini() "fake_mode=352x240x32\n" "fix_not_responding=true\n" "\n" - "; Sid Meier's Simgolf\n" - "[golf]\n" - "fake_mode=640x480x16\n" - "\n" "; Swarog\n" "[Swarog]\n" "singlecpu=false\n" From 4d3af7358310492e9ed89cf6f47a1447cff2262a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 02:57:05 +0100 Subject: [PATCH 435/557] update Star Wars Rebellion preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index d5801ea..b9d0a24 100644 --- a/src/config.c +++ b/src/config.c @@ -1619,7 +1619,6 @@ static void cfg_create_ini() "resizable=false\n" "maintas=false\n" "boxing=false\n" - "hook=2\n" "\n" "; Star Wars: Galactic Battlegrounds\n" "[battlegrounds]\n" From 85a0cbcf449f976e38d9cabad27f56fc181781d0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 04:55:15 +0100 Subject: [PATCH 436/557] add partial support for 24bit surfaces --- src/blt.c | 2 +- src/dd.c | 2 +- src/ddsurface.c | 42 +++++++++++++++++++++++++++--------------- 3 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/blt.c b/src/blt.c index 0c212aa..166e3dd 100644 --- a/src/blt.c +++ b/src/blt.c @@ -518,7 +518,7 @@ void blt_colorfill( if (bpp == 8 || (bpp == 16 && (color & 0xFF) == ((color >> 8) & 0xFF)) || - (bpp == 32 && + ((bpp == 32 || bpp == 24) && (color & 0xFF) == ((color >> 8) & 0xFF) && (color & 0xFF) == ((color >> 16) & 0xFF) && (color & 0xFF) == ((color >> 24) & 0xFF))) diff --git a/src/dd.c b/src/dd.c index f5df432..e69063a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -559,7 +559,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwWidth = width; lpDDSurfaceDesc->dwHeight = height; - if (bpp == 32) + if (bpp == 32 || bpp == 24) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; diff --git a/src/ddsurface.c b/src/ddsurface.c index 454ca24..efdb660 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -227,6 +227,11 @@ HRESULT dds_Blt( if (dst_buf && (dwFlags & DDBLT_COLORFILL) && lpDDBltFx && dst_w > 0 && dst_h > 0) { + if (This->bpp == 24) + { + TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%u\n", This->bpp, lpDDBltFx->dwFillColor); + } + blt_colorfill( dst_buf, dst_x, @@ -250,7 +255,10 @@ HRESULT dds_Blt( BOOL mirror_left_right = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT); BOOL mirror_up_down = got_fx && (lpDDBltFx->dwDDFX & DDBLTFX_MIRRORUPDOWN); - if (This->bpp != src_surface->bpp || (is_stretch_blt && This == src_surface)) + if (This->bpp != src_surface->bpp || + This->bpp == 24 || + src_surface->bpp == 24 || + (is_stretch_blt && This == src_surface)) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -266,7 +274,7 @@ HRESULT dds_Blt( (dwFlags & DDBLT_KEYSRCOVERRIDE) ? lpDDBltFx->ddckSrcColorkey.dwColorSpaceLowValue : src_surface->color_key.dwColorSpaceLowValue; - if (src_surface->bpp == 32) + if (src_surface->bpp == 32 || src_surface->bpp == 24) { color = color & 0xFFFFFF; } @@ -552,7 +560,9 @@ HRESULT dds_BltFast( if (src_surface && dst_w > 0 && dst_h > 0) { - if (This->bpp != src_surface->bpp) + if (This->bpp != src_surface->bpp || + This->bpp == 24 || + src_surface->bpp == 24) { TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, src_surface->bpp=%u\n", This->bpp, src_surface->bpp); @@ -566,7 +576,7 @@ HRESULT dds_BltFast( { UINT color = src_surface->color_key.dwColorSpaceLowValue; - if (src_surface->bpp == 32) + if (src_surface->bpp == 32 || src_surface->bpp == 24) { color = color & 0xFFFFFF; } @@ -749,7 +759,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; } - else if (This->bpp == 32) + else if (This->bpp == 32 || This->bpp == 24) { lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; @@ -975,7 +985,7 @@ HRESULT dds_GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPix ddpfPixelFormat->dwGBitMask = 0x07E0; ddpfPixelFormat->dwBBitMask = 0x001F; } - else if (This->bpp == 32) + else if (This->bpp == 32 || This->bpp == 24) { ddpfPixelFormat->dwRBitMask = 0xFF0000; ddpfPixelFormat->dwGBitMask = 0x00FF00; @@ -1306,7 +1316,9 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->bpp = 16; break; case 24: + This->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + break; case 32: This->bpp = 32; break; @@ -1419,7 +1431,9 @@ HRESULT dd_CreateSurface( dst_surface->bpp = 16; break; case 24: + dst_surface->bpp = 24; TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); + break; case 32: dst_surface->bpp = 32; break; @@ -1481,12 +1495,16 @@ HRESULT dd_CreateSurface( dst_surface->bmi->bmiHeader.biHeight = -((int)dst_surface->height + g_config.guard_lines); dst_surface->bmi->bmiHeader.biPlanes = 1; dst_surface->bmi->bmiHeader.biBitCount = dst_surface->bpp; - dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 8 ? BI_RGB : BI_BITFIELDS; + dst_surface->bmi->bmiHeader.biCompression = dst_surface->bpp == 16 ? BI_BITFIELDS : BI_RGB; WORD clr_bits = (WORD)(dst_surface->bmi->bmiHeader.biPlanes * dst_surface->bmi->bmiHeader.biBitCount); - dst_surface->bmi->bmiHeader.biClrUsed = - dst_surface->bmi->bmiHeader.biCompression == BI_BITFIELDS ? 3 : (1 << clr_bits); + dst_surface->bmi->bmiHeader.biClrUsed = + dst_surface->bpp == 8 ? 256 : + dst_surface->bpp == 16 ? 3 : + dst_surface->bpp == 24 ? 0 : + dst_surface->bpp == 32 ? 0 : + 0; dst_surface->bmi->bmiHeader.biSizeImage = ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; @@ -1513,12 +1531,6 @@ HRESULT dd_CreateSurface( ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x07E0; ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x001F; } - else if (dst_surface->bpp == 32) - { - ((DWORD*)dst_surface->bmi->bmiColors)[0] = 0xFF0000; - ((DWORD*)dst_surface->bmi->bmiColors)[1] = 0x00FF00; - ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; - } /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if ((!g_config.limit_gdi_handles && InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 9000) || From 658089cbf27deb3eade6382143937244e981608f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 05:32:02 +0100 Subject: [PATCH 437/557] tweak logging --- src/ddsurface.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index efdb660..f1b75f5 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -229,7 +229,7 @@ HRESULT dds_Blt( { if (This->bpp == 24) { - TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%u\n", This->bpp, lpDDBltFx->dwFillColor); + TRACE_EXT(" NOT_IMPLEMENTED This->bpp=%u, dwFillColor=%08X\n", This->bpp, lpDDBltFx->dwFillColor); } blt_colorfill( @@ -1317,7 +1317,6 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD break; case 24: This->bpp = 24; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); break; case 32: This->bpp = 32; @@ -1432,7 +1431,6 @@ HRESULT dd_CreateSurface( break; case 24: dst_surface->bpp = 24; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount); break; case 32: dst_surface->bpp = 32; From 48f1200e4af5bc8b84f8994a875a0fe86106e356 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:25:12 +0100 Subject: [PATCH 438/557] update Gangsters preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index b9d0a24..91ea60f 100644 --- a/src/config.c +++ b/src/config.c @@ -1041,6 +1041,8 @@ static void cfg_create_ini() "[gangsters]\n" "adjmouse=true\n" "nonexclusive=true\n" + "fixchilds=0\n" + "fake_mode=640x480x8\n" "\n" "; Grand Theft Auto\n" "[Grand Theft Auto]\n" From 8ea2c1db69dd63b59259dc199d0763965ac42d54 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:32:48 +0100 Subject: [PATCH 439/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f27ca15..4ac833c 100644 --- a/README.md +++ b/README.md @@ -195,6 +195,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police +- Gangsters - Organized Crime - Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto From a1bee06eb8326dc49874ad2e656fecf3acd6e32e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 07:41:21 +0100 Subject: [PATCH 440/557] remove gangsters from the list, it still got too many issues --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4ac833c..f27ca15 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police -- Gangsters - Organized Crime - Geneforge - Gorasul: The Legacy of the Dragon - Grand Theft Auto From 873f4e6bb8313a88b429a8d608db04097c8bb970 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:06:39 +0100 Subject: [PATCH 441/557] add preset for Neo Sonic Universe --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index f27ca15..f2aedeb 100644 --- a/README.md +++ b/README.md @@ -284,6 +284,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Need For Speed: High Stakes - New Robinson - NexusTk +- Neo Sonic Universe - Nightmare Creatures - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus diff --git a/src/config.c b/src/config.c index 91ea60f..e8441a2 100644 --- a/src/config.c +++ b/src/config.c @@ -1359,6 +1359,11 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" + "; Neo Sonic Universe\n" + "[nsu]\n" + "fixchilds=3\n" + "fake_mode=320x240x8\n" + "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" "checkfile=.\\Nancy.cid\n" From 1a3b6f1aab182e45e26dc780a9d325246e99d492 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:13:57 +0100 Subject: [PATCH 442/557] add preset for Neo Sonic Universe - battle mode --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index e8441a2..15defed 100644 --- a/src/config.c +++ b/src/config.c @@ -1364,6 +1364,11 @@ static void cfg_create_ini() "fixchilds=3\n" "fake_mode=320x240x8\n" "\n" + "; Neo Sonic Universe - battle mode\n" + "[nsu_battle]\n" + "fixchilds=3\n" + "fake_mode=320x240x8\n" + "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" "checkfile=.\\Nancy.cid\n" From ea51c3834f3db65e2ecdb790d1068b76c43133d7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 19:15:06 +0100 Subject: [PATCH 443/557] use 32bit fake mode --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 15defed..ca40c97 100644 --- a/src/config.c +++ b/src/config.c @@ -1362,12 +1362,12 @@ static void cfg_create_ini() "; Neo Sonic Universe\n" "[nsu]\n" "fixchilds=3\n" - "fake_mode=320x240x8\n" + "fake_mode=320x240x32\n" "\n" "; Neo Sonic Universe - battle mode\n" "[nsu_battle]\n" "fixchilds=3\n" - "fake_mode=320x240x8\n" + "fake_mode=320x240x32\n" "\n" "; Nancy Drew (All games)\n" "[Game/3]\n" From c315ec70cfefb519b955b3f6d66ad48dcf84ec25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Dec 2024 21:18:07 +0100 Subject: [PATCH 444/557] fix scroll speed issues in warhammer 40k games --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index ca40c97..f24a934 100644 --- a/src/config.c +++ b/src/config.c @@ -985,6 +985,7 @@ static void cfg_create_ini() "; Final Liberation: Warhammer Epic 40000\n" "[Epic40k]\n" "hook_peekmessage=true\n" + "maxgameticks=125\n" "\n" "; Future Cop - L.A.P.D.\n" "[FCopLAPD]\n" @@ -1837,6 +1838,10 @@ static void cfg_create_ini() "guard_lines=600\n" "minfps=-2\n" "\n" + "; Warhammer 40000: Chaos Gate\n" + "[WH40K]\n" + "maxgameticks=250\n" + "\n" "; Weird War\n" "[WeirdWar]\n" "singlecpu=false\n" From daa283350991c23a2f280d071d5652ffaef9d76d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 03:02:23 +0100 Subject: [PATCH 445/557] improve logging --- src/IDirectDraw/IDirectDrawSurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 3eec3e6..7916405 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -340,7 +340,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); + TRACE_EXT("-> %s(This=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwFlags, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; From cd60c29a9270a2b3c5dae1caefa984deeccd07dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 03:43:31 +0100 Subject: [PATCH 446/557] return fake value for HORZRES and VERTRES --- src/winapi_hooks.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 50551a3..bbb680b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -909,17 +909,21 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { DWORD bpp = 0; + DWORD width = 0; + DWORD height = 0; if (g_ddraw.ref && g_ddraw.bpp) { bpp = g_ddraw.bpp; + width = g_ddraw.width; + height = g_ddraw.height; } else if (g_config.fake_mode[0]) { char* e = &g_config.fake_mode[0]; - strtoul(e, &e, 0); - strtoul(e + 1, &e, 0); + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); bpp = strtoul(e + 1, &e, 0); } @@ -953,6 +957,19 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) } } + if (width && WindowFromDC(hdc) == GetDesktopWindow()) + { + if (index == HORZRES) + { + return width; + } + + if (index == VERTRES) + { + return height; + } + } + return real_GetDeviceCaps(hdc, index); } From 5a6f3430cd4a62393f86d7bcc229fb3d77d082be Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 06:30:15 +0100 Subject: [PATCH 447/557] add preset for lode runner 2 --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index f24a934..47698e4 100644 --- a/src/config.c +++ b/src/config.c @@ -1227,6 +1227,11 @@ static void cfg_create_ini() "limiter_type=2\n" "maxgameticks=60\n" "\n" + "; Lode Runner 2\n" + "[LR2]\n" + "no_dinput_hook=true\n" + "fake_mode=640x480x16\n" + "\n" "; Last Bronx\n" "[LB]\n" "maxgameticks=30\n" From 78b912b09c985532665f889a896f0dbaa65955f0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 07:48:15 +0100 Subject: [PATCH 448/557] hook SetParent --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index bbab6da..089f668 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -18,7 +18,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[37]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -63,6 +63,7 @@ typedef BOOL(WINAPI* GETWINDOWPLACEMENTPROC)(HWND, WINDOWPLACEMENT*); typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); +typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -125,6 +126,7 @@ extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern DEFWINDOWPROCAPROC real_DefWindowProcA; +extern SETPARENTPROC real_SetParent; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 6c6cbb1..cab3ab6 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -38,6 +38,7 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); +HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 1e4bf14..1e536fb 100644 --- a/src/hook.c +++ b/src/hook.c @@ -54,6 +54,7 @@ GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; +SETPARENTPROC real_SetParent = SetParent; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -117,6 +118,7 @@ HOOKLIST g_hook_hooklist[] = { "SetWindowPlacement", (PROC)fake_SetWindowPlacement, (PROC*)&real_SetWindowPlacement, 0 }, { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, + { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index bbb680b..0d2f981 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -886,6 +886,35 @@ LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lP return real_DefWindowProcA(hWnd, Msg, wParam, lParam); } +HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) +{ + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.hwnd == hWndNewParent) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hWndChild, class_name, sizeof(class_name) - 1); + + if (strcmp(class_name, "VideoRenderer") == 0) + { + RECT rc_org; + fake_GetWindowRect(hWndChild, &rc_org); + + HWND result = real_SetParent(hWndChild, hWndNewParent); + + real_MoveWindow( + hWndChild, + rc_org.left, + rc_org.top, + (rc_org.right - rc_org.left), + (rc_org.bottom - rc_org.top), + FALSE); + + return result; + } + } + + return real_SetParent(hWndChild, hWndNewParent); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 429ce2a3dfcac203e801b708d2b5cc92ac46f50d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:21:22 +0100 Subject: [PATCH 449/557] always hide Cc2EditClassTh class windows --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index 91f41d9..d96920b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -908,6 +908,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || g_config.fixchilds == FIX_CHILDS_DETECT_HIDE_NOSCALE || + strcmp(class_name, "Cc2EditClassTh") == 0 || strcmp(class_name, "msctls_statusbar32") == 0 || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIQTZ_Window") == 0 || From e6c5e1f9ba0368e3c04fab37c5a09a1389a0e1a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:43:03 +0100 Subject: [PATCH 450/557] update neo sonic preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index 47698e4..8fe2e41 100644 --- a/src/config.c +++ b/src/config.c @@ -1367,12 +1367,10 @@ static void cfg_create_ini() "\n" "; Neo Sonic Universe\n" "[nsu]\n" - "fixchilds=3\n" "fake_mode=320x240x32\n" "\n" "; Neo Sonic Universe - battle mode\n" "[nsu_battle]\n" - "fixchilds=3\n" "fake_mode=320x240x32\n" "\n" "; Nancy Drew (All games)\n" From 98ace77501b5d99c1b76c15a4a1af7076c98024c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 24 Dec 2024 22:43:17 +0100 Subject: [PATCH 451/557] update supported games list --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index f2aedeb..713e388 100644 --- a/README.md +++ b/README.md @@ -91,6 +91,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Barbie(tm) Beach Vacation(tm) - Batman: Justice Unbalanced - Batman: Toxic Chill +- Bejeweled 2 Deluxe - Birthright: The Gorgons Alliance - Blade & Sword - Blood II - The Chosen @@ -254,6 +255,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Lode Runner 2 - Lost Vikings 2 - Links Extreme +- Mario Sorb 3 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math @@ -286,6 +288,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - NexusTk - Neo Sonic Universe - Nightmare Creatures +- Ninja Jonder Deluxe - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee @@ -317,6 +320,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time +- Platypus - Quest for Glory 5 - Rage of Mages - Rage of Mages 2 From 4590ad0872813aa9a806b2cdccbd6ccf0614d192 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 02:19:33 +0100 Subject: [PATCH 452/557] add preset for Dominion - Storm Over Gift 3 --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 713e388..10ff9fa 100644 --- a/README.md +++ b/README.md @@ -167,6 +167,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 +- Dominion - Storm Over Gift 3 - Economic War - Eggsucker - Emperor: Rise of the Middle Kingdom diff --git a/src/config.c b/src/config.c index 8fe2e41..76dd487 100644 --- a/src/config.c +++ b/src/config.c @@ -919,6 +919,10 @@ static void cfg_create_ini() "[dn]\n" "fake_mode=640x480x16\n" "\n" + "; Dominion - Storm Over Gift 3\n" + "[dominion]\n" + "flipclear=true\n" + "\n" "; Excalibur 2555AD\n" "[_FISH]\n" "singlecpu=false\n" From f80fcb1e07d118685b49d1cf907c5b85915ad12d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:08:36 +0100 Subject: [PATCH 453/557] add Direct3D EnumDevices testing code --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 + inc/IDirect3D.h | 15 +- inc/d3dcaps.h | 607 +++++++++++++++++++++++++++++++++++++ src/IDirect3D/IDirect3D.c | 12 +- src/IDirect3D/IDirect3D2.c | 12 +- src/IDirect3D/IDirect3D3.c | 12 +- src/IDirect3D/IDirect3D7.c | 12 +- 8 files changed, 666 insertions(+), 8 deletions(-) create mode 100644 inc/d3dcaps.h diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 94df66d..a4d025d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -77,6 +77,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index f673285..0f07cb0 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -296,6 +296,9 @@ Header Files + + Header Files + diff --git a/inc/IDirect3D.h b/inc/IDirect3D.h index dd03465..b545a5c 100644 --- a/inc/IDirect3D.h +++ b/inc/IDirect3D.h @@ -3,6 +3,7 @@ #define WIN32_LEAN_AND_MEAN #include +#include "d3dcaps.h" DEFINE_GUID(IID_IDirect3D, 0x3BBA0080, 0x2421, 0x11CF, 0xA3, 0x1A, 0x00, 0xAA, 0x00, 0xB9, 0x33, 0x56); @@ -10,6 +11,12 @@ DEFINE_GUID(IID_IDirect3D2, 0x6aae1ec1, 0x662a, 0x11d0, 0x88, 0x9d, 0x00, 0xaa, DEFINE_GUID(IID_IDirect3D3, 0xbb223240, 0xe72b, 0x11d0, 0xa9, 0xb4, 0x00, 0xaa, 0x00, 0xc0, 0x99, 0x3e); DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); +DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); + +typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK)(GUID FAR* lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); +typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); + + #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \ struct iface##Vtbl FAR* lpVtbl; \ ULONG ref; \ @@ -27,7 +34,7 @@ DECLARE_D3D_INTERFACE(IDirect3DImpl) ULONG(__stdcall * Release) (IDirect3DImpl*); HRESULT(__stdcall * Initialize)(IDirect3DImpl*, int); - HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3DImpl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3DImpl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3DImpl*, int, int); @@ -44,7 +51,7 @@ DECLARE_D3D_INTERFACE(IDirect3D2Impl) ULONG(__stdcall * AddRef) (IDirect3D2Impl*); ULONG(__stdcall * Release) (IDirect3D2Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D2Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D2Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D2Impl*, int, int); @@ -62,7 +69,7 @@ DECLARE_D3D_INTERFACE(IDirect3D3Impl) ULONG(__stdcall * AddRef) (IDirect3D3Impl*); ULONG(__stdcall * Release) (IDirect3D3Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D3Impl*, LPD3DENUMDEVICESCALLBACK, LPVOID); HRESULT(__stdcall * CreateLight)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateMaterial)(IDirect3D3Impl*, int, int); HRESULT(__stdcall * CreateViewport)(IDirect3D3Impl*, int, int); @@ -83,7 +90,7 @@ DECLARE_D3D_INTERFACE(IDirect3D7Impl) ULONG(__stdcall * AddRef) (IDirect3D7Impl*); ULONG(__stdcall * Release) (IDirect3D7Impl*); - HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, int, int); + HRESULT(__stdcall * EnumDevices)(IDirect3D7Impl*, LPD3DENUMDEVICESCALLBACK7, LPVOID); HRESULT(__stdcall * CreateDevice)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * CreateVertexBuffer)(IDirect3D7Impl*, int, int, int); HRESULT(__stdcall * EnumZBufferFormats)(IDirect3D7Impl*, int, int, int); diff --git a/inc/d3dcaps.h b/inc/d3dcaps.h new file mode 100644 index 0000000..ddf7226 --- /dev/null +++ b/inc/d3dcaps.h @@ -0,0 +1,607 @@ +/*==========================================================================; + * + * Copyright (C) Microsoft Corporation. All Rights Reserved. + * + * File: d3dcaps.h + * Content: Direct3D capabilities include file + * + ***************************************************************************/ + + + +#ifndef _D3DCAPS_H +#define _D3DCAPS_H + +/* + * Pull in DirectDraw include file automatically: + */ +#include "ddraw.h" + +#ifndef DIRECT3D_VERSION +#define DIRECT3D_VERSION 0x0700 +#endif + +#if defined(_X86_) || defined(_IA64_) +#pragma pack(4) +#endif + +/* Description of capabilities of transform */ + +typedef struct _D3DTRANSFORMCAPS { + DWORD dwSize; + DWORD dwCaps; +} D3DTRANSFORMCAPS, *LPD3DTRANSFORMCAPS; + +#define D3DTRANSFORMCAPS_CLIP 0x00000001L /* Will clip whilst transforming */ + +/* Description of capabilities of lighting */ + +typedef struct _D3DLIGHTINGCAPS { + DWORD dwSize; + DWORD dwCaps; /* Lighting caps */ + DWORD dwLightingModel; /* Lighting model - RGB or mono */ + DWORD dwNumLights; /* Number of lights that can be handled */ +} D3DLIGHTINGCAPS, *LPD3DLIGHTINGCAPS; + +#define D3DLIGHTINGMODEL_RGB 0x00000001L +#define D3DLIGHTINGMODEL_MONO 0x00000002L + +#define D3DLIGHTCAPS_POINT 0x00000001L /* Point lights supported */ +#define D3DLIGHTCAPS_SPOT 0x00000002L /* Spot lights supported */ +#define D3DLIGHTCAPS_DIRECTIONAL 0x00000004L /* Directional lights supported */ +#if(DIRECT3D_VERSION < 0x700) +#define D3DLIGHTCAPS_PARALLELPOINT 0x00000008L /* Parallel point lights supported */ +#endif +#if(DIRECT3D_VERSION < 0x500) +#define D3DLIGHTCAPS_GLSPOT 0x00000010L /* GL syle spot lights supported */ +#endif + +/* Description of capabilities for each primitive type */ + +typedef struct _D3DPrimCaps { + DWORD dwSize; + DWORD dwMiscCaps; /* Capability flags */ + DWORD dwRasterCaps; + DWORD dwZCmpCaps; + DWORD dwSrcBlendCaps; + DWORD dwDestBlendCaps; + DWORD dwAlphaCmpCaps; + DWORD dwShadeCaps; + DWORD dwTextureCaps; + DWORD dwTextureFilterCaps; + DWORD dwTextureBlendCaps; + DWORD dwTextureAddressCaps; + DWORD dwStippleWidth; /* maximum width and height of */ + DWORD dwStippleHeight; /* of supported stipple (up to 32x32) */ +} D3DPRIMCAPS, *LPD3DPRIMCAPS; + +/* D3DPRIMCAPS dwMiscCaps */ + +#define D3DPMISCCAPS_MASKPLANES 0x00000001L +#define D3DPMISCCAPS_MASKZ 0x00000002L +#define D3DPMISCCAPS_LINEPATTERNREP 0x00000004L +#define D3DPMISCCAPS_CONFORMANT 0x00000008L +#define D3DPMISCCAPS_CULLNONE 0x00000010L +#define D3DPMISCCAPS_CULLCW 0x00000020L +#define D3DPMISCCAPS_CULLCCW 0x00000040L + +/* D3DPRIMCAPS dwRasterCaps */ + +#define D3DPRASTERCAPS_DITHER 0x00000001L +#define D3DPRASTERCAPS_ROP2 0x00000002L +#define D3DPRASTERCAPS_XOR 0x00000004L +#define D3DPRASTERCAPS_PAT 0x00000008L +#define D3DPRASTERCAPS_ZTEST 0x00000010L +#define D3DPRASTERCAPS_SUBPIXEL 0x00000020L +#define D3DPRASTERCAPS_SUBPIXELX 0x00000040L +#define D3DPRASTERCAPS_FOGVERTEX 0x00000080L +#define D3DPRASTERCAPS_FOGTABLE 0x00000100L +#define D3DPRASTERCAPS_STIPPLE 0x00000200L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPRASTERCAPS_ANTIALIASSORTDEPENDENT 0x00000400L +#define D3DPRASTERCAPS_ANTIALIASSORTINDEPENDENT 0x00000800L +#define D3DPRASTERCAPS_ANTIALIASEDGES 0x00001000L +#define D3DPRASTERCAPS_MIPMAPLODBIAS 0x00002000L +#define D3DPRASTERCAPS_ZBIAS 0x00004000L +#define D3DPRASTERCAPS_ZBUFFERLESSHSR 0x00008000L +#define D3DPRASTERCAPS_FOGRANGE 0x00010000L +#define D3DPRASTERCAPS_ANISOTROPY 0x00020000L +#endif /* DIRECT3D_VERSION >= 0x0500 */ +#if(DIRECT3D_VERSION >= 0x0600) +#define D3DPRASTERCAPS_WBUFFER 0x00040000L +#define D3DPRASTERCAPS_TRANSLUCENTSORTINDEPENDENT 0x00080000L +#define D3DPRASTERCAPS_WFOG 0x00100000L +#define D3DPRASTERCAPS_ZFOG 0x00200000L +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +/* D3DPRIMCAPS dwZCmpCaps, dwAlphaCmpCaps */ + +#define D3DPCMPCAPS_NEVER 0x00000001L +#define D3DPCMPCAPS_LESS 0x00000002L +#define D3DPCMPCAPS_EQUAL 0x00000004L +#define D3DPCMPCAPS_LESSEQUAL 0x00000008L +#define D3DPCMPCAPS_GREATER 0x00000010L +#define D3DPCMPCAPS_NOTEQUAL 0x00000020L +#define D3DPCMPCAPS_GREATEREQUAL 0x00000040L +#define D3DPCMPCAPS_ALWAYS 0x00000080L + +/* D3DPRIMCAPS dwSourceBlendCaps, dwDestBlendCaps */ + +#define D3DPBLENDCAPS_ZERO 0x00000001L +#define D3DPBLENDCAPS_ONE 0x00000002L +#define D3DPBLENDCAPS_SRCCOLOR 0x00000004L +#define D3DPBLENDCAPS_INVSRCCOLOR 0x00000008L +#define D3DPBLENDCAPS_SRCALPHA 0x00000010L +#define D3DPBLENDCAPS_INVSRCALPHA 0x00000020L +#define D3DPBLENDCAPS_DESTALPHA 0x00000040L +#define D3DPBLENDCAPS_INVDESTALPHA 0x00000080L +#define D3DPBLENDCAPS_DESTCOLOR 0x00000100L +#define D3DPBLENDCAPS_INVDESTCOLOR 0x00000200L +#define D3DPBLENDCAPS_SRCALPHASAT 0x00000400L +#define D3DPBLENDCAPS_BOTHSRCALPHA 0x00000800L +#define D3DPBLENDCAPS_BOTHINVSRCALPHA 0x00001000L + +/* D3DPRIMCAPS dwShadeCaps */ + +#define D3DPSHADECAPS_COLORFLATMONO 0x00000001L +#define D3DPSHADECAPS_COLORFLATRGB 0x00000002L +#define D3DPSHADECAPS_COLORGOURAUDMONO 0x00000004L +#define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L +#define D3DPSHADECAPS_COLORPHONGMONO 0x00000010L +#define D3DPSHADECAPS_COLORPHONGRGB 0x00000020L + +#define D3DPSHADECAPS_SPECULARFLATMONO 0x00000040L +#define D3DPSHADECAPS_SPECULARFLATRGB 0x00000080L +#define D3DPSHADECAPS_SPECULARGOURAUDMONO 0x00000100L +#define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L +#define D3DPSHADECAPS_SPECULARPHONGMONO 0x00000400L +#define D3DPSHADECAPS_SPECULARPHONGRGB 0x00000800L + +#define D3DPSHADECAPS_ALPHAFLATBLEND 0x00001000L +#define D3DPSHADECAPS_ALPHAFLATSTIPPLED 0x00002000L +#define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L +#define D3DPSHADECAPS_ALPHAGOURAUDSTIPPLED 0x00008000L +#define D3DPSHADECAPS_ALPHAPHONGBLEND 0x00010000L +#define D3DPSHADECAPS_ALPHAPHONGSTIPPLED 0x00020000L + +#define D3DPSHADECAPS_FOGFLAT 0x00040000L +#define D3DPSHADECAPS_FOGGOURAUD 0x00080000L +#define D3DPSHADECAPS_FOGPHONG 0x00100000L + +/* D3DPRIMCAPS dwTextureCaps */ + +/* + * Perspective-correct texturing is supported + */ +#define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L + +/* + * Power-of-2 texture dimensions are required + */ +#define D3DPTEXTURECAPS_POW2 0x00000002L + +/* + * Alpha in texture pixels is supported + */ +#define D3DPTEXTURECAPS_ALPHA 0x00000004L + +/* + * Color-keyed textures are supported + */ +#define D3DPTEXTURECAPS_TRANSPARENCY 0x00000008L + +/* + * obsolete, see D3DPTADDRESSCAPS_BORDER + */ +#define D3DPTEXTURECAPS_BORDER 0x00000010L + +/* + * Only square textures are supported + */ +#define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L + +#if(DIRECT3D_VERSION >= 0x0600) +/* + * Texture indices are not scaled by the texture size prior + * to interpolation. + */ +#define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L + +/* + * Device can draw alpha from texture palettes + */ +#define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L + +/* + * Device can use non-POW2 textures if: + * 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage + * 2) D3DRS_WRAP(N) is zero for this texture's coordinates + * 3) mip mapping is not enabled (use magnification filter only) + */ +#define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L + +#endif /* DIRECT3D_VERSION >= 0x0600 */ +#if(DIRECT3D_VERSION >= 0x0700) + +// 0x00000200L unused + +/* + * Device can divide transformed texture coordinates by the + * COUNTth texture coordinate (can do D3DTTFF_PROJECTED) + */ +#define D3DPTEXTURECAPS_PROJECTED 0x00000400L + +/* + * Device can do cubemap textures + */ +#define D3DPTEXTURECAPS_CUBEMAP 0x00000800L + +#define D3DPTEXTURECAPS_COLORKEYBLEND 0x00001000L +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +/* D3DPRIMCAPS dwTextureFilterCaps */ + +#define D3DPTFILTERCAPS_NEAREST 0x00000001L +#define D3DPTFILTERCAPS_LINEAR 0x00000002L +#define D3DPTFILTERCAPS_MIPNEAREST 0x00000004L +#define D3DPTFILTERCAPS_MIPLINEAR 0x00000008L +#define D3DPTFILTERCAPS_LINEARMIPNEAREST 0x00000010L +#define D3DPTFILTERCAPS_LINEARMIPLINEAR 0x00000020L + +#if(DIRECT3D_VERSION >= 0x0600) +/* Device3 Min Filter */ +#define D3DPTFILTERCAPS_MINFPOINT 0x00000100L +#define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L +#define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L + +/* Device3 Mip Filter */ +#define D3DPTFILTERCAPS_MIPFPOINT 0x00010000L +#define D3DPTFILTERCAPS_MIPFLINEAR 0x00020000L + +/* Device3 Mag Filter */ +#define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L +#define D3DPTFILTERCAPS_MAGFLINEAR 0x02000000L +#define D3DPTFILTERCAPS_MAGFANISOTROPIC 0x04000000L +#define D3DPTFILTERCAPS_MAGFAFLATCUBIC 0x08000000L +#define D3DPTFILTERCAPS_MAGFGAUSSIANCUBIC 0x10000000L +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +/* D3DPRIMCAPS dwTextureBlendCaps */ + +#define D3DPTBLENDCAPS_DECAL 0x00000001L +#define D3DPTBLENDCAPS_MODULATE 0x00000002L +#define D3DPTBLENDCAPS_DECALALPHA 0x00000004L +#define D3DPTBLENDCAPS_MODULATEALPHA 0x00000008L +#define D3DPTBLENDCAPS_DECALMASK 0x00000010L +#define D3DPTBLENDCAPS_MODULATEMASK 0x00000020L +#define D3DPTBLENDCAPS_COPY 0x00000040L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPTBLENDCAPS_ADD 0x00000080L +#endif /* DIRECT3D_VERSION >= 0x0500 */ + +/* D3DPRIMCAPS dwTextureAddressCaps */ +#define D3DPTADDRESSCAPS_WRAP 0x00000001L +#define D3DPTADDRESSCAPS_MIRROR 0x00000002L +#define D3DPTADDRESSCAPS_CLAMP 0x00000004L +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DPTADDRESSCAPS_BORDER 0x00000008L +#define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L +#endif /* DIRECT3D_VERSION >= 0x0500 */ + +#if(DIRECT3D_VERSION >= 0x0600) + +/* D3DDEVICEDESC dwStencilCaps */ + +#define D3DSTENCILCAPS_KEEP 0x00000001L +#define D3DSTENCILCAPS_ZERO 0x00000002L +#define D3DSTENCILCAPS_REPLACE 0x00000004L +#define D3DSTENCILCAPS_INCRSAT 0x00000008L +#define D3DSTENCILCAPS_DECRSAT 0x00000010L +#define D3DSTENCILCAPS_INVERT 0x00000020L +#define D3DSTENCILCAPS_INCR 0x00000040L +#define D3DSTENCILCAPS_DECR 0x00000080L + +/* D3DDEVICEDESC dwTextureOpCaps */ + +#define D3DTEXOPCAPS_DISABLE 0x00000001L +#define D3DTEXOPCAPS_SELECTARG1 0x00000002L +#define D3DTEXOPCAPS_SELECTARG2 0x00000004L +#define D3DTEXOPCAPS_MODULATE 0x00000008L +#define D3DTEXOPCAPS_MODULATE2X 0x00000010L +#define D3DTEXOPCAPS_MODULATE4X 0x00000020L +#define D3DTEXOPCAPS_ADD 0x00000040L +#define D3DTEXOPCAPS_ADDSIGNED 0x00000080L +#define D3DTEXOPCAPS_ADDSIGNED2X 0x00000100L +#define D3DTEXOPCAPS_SUBTRACT 0x00000200L +#define D3DTEXOPCAPS_ADDSMOOTH 0x00000400L +#define D3DTEXOPCAPS_BLENDDIFFUSEALPHA 0x00000800L +#define D3DTEXOPCAPS_BLENDTEXTUREALPHA 0x00001000L +#define D3DTEXOPCAPS_BLENDFACTORALPHA 0x00002000L +#define D3DTEXOPCAPS_BLENDTEXTUREALPHAPM 0x00004000L +#define D3DTEXOPCAPS_BLENDCURRENTALPHA 0x00008000L +#define D3DTEXOPCAPS_PREMODULATE 0x00010000L +#define D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR 0x00020000L +#define D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA 0x00040000L +#define D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR 0x00080000L +#define D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA 0x00100000L +#define D3DTEXOPCAPS_BUMPENVMAP 0x00200000L +#define D3DTEXOPCAPS_BUMPENVMAPLUMINANCE 0x00400000L +#define D3DTEXOPCAPS_DOTPRODUCT3 0x00800000L + +/* D3DDEVICEDESC dwFVFCaps flags */ + +#define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */ +#define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */ + +#endif /* DIRECT3D_VERSION >= 0x0600 */ + +typedef float D3DVALUE, *LPD3DVALUE; +typedef DWORD D3DCOLORMODEL; + +/* + * Description for a device. + * This is used to describe a device that is to be created or to query + * the current device. + */ +typedef struct _D3DDeviceDesc { + DWORD dwSize; /* Size of D3DDEVICEDESC structure */ + DWORD dwFlags; /* Indicates which fields have valid data */ + D3DCOLORMODEL dcmColorModel; /* Color model of device */ + DWORD dwDevCaps; /* Capabilities of device */ + D3DTRANSFORMCAPS dtcTransformCaps; /* Capabilities of transform */ + BOOL bClipping; /* Device can do 3D clipping */ + D3DLIGHTINGCAPS dlcLightingCaps; /* Capabilities of lighting */ + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ + DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ + DWORD dwMaxBufferSize; /* Maximum execute buffer size */ + DWORD dwMaxVertexCount; /* Maximum vertex count */ +//#if(DIRECT3D_VERSION >= 0x0500) + // *** New fields for DX5 *** // + + // Width and height caps are 0 for legacy HALs. + DWORD dwMinTextureWidth, dwMinTextureHeight; + DWORD dwMaxTextureWidth, dwMaxTextureHeight; + DWORD dwMinStippleWidth, dwMaxStippleWidth; + DWORD dwMinStippleHeight, dwMaxStippleHeight; +//#endif /* DIRECT3D_VERSION >= 0x0500 */ + +//#if(DIRECT3D_VERSION >= 0x0600) + // New fields for DX6 + DWORD dwMaxTextureRepeat; + DWORD dwMaxTextureAspectRatio; + DWORD dwMaxAnisotropy; + + // Guard band that the rasterizer can accommodate + // Screen-space vertices inside this space but outside the viewport + // will get clipped properly. + D3DVALUE dvGuardBandLeft; + D3DVALUE dvGuardBandTop; + D3DVALUE dvGuardBandRight; + D3DVALUE dvGuardBandBottom; + + D3DVALUE dvExtentsAdjust; + DWORD dwStencilCaps; + + DWORD dwFVFCaps; + DWORD dwTextureOpCaps; + WORD wMaxTextureBlendStages; + WORD wMaxSimultaneousTextures; +//#endif /* DIRECT3D_VERSION >= 0x0600 */ +} D3DDEVICEDESC, *LPD3DDEVICEDESC; + +#if(DIRECT3D_VERSION >= 0x0700) +typedef struct _D3DDeviceDesc7 { + DWORD dwDevCaps; /* Capabilities of device */ + D3DPRIMCAPS dpcLineCaps; + D3DPRIMCAPS dpcTriCaps; + DWORD dwDeviceRenderBitDepth; /* One of DDBB_8, 16, etc.. */ + DWORD dwDeviceZBufferBitDepth;/* One of DDBD_16, 32, etc.. */ + + DWORD dwMinTextureWidth, dwMinTextureHeight; + DWORD dwMaxTextureWidth, dwMaxTextureHeight; + + DWORD dwMaxTextureRepeat; + DWORD dwMaxTextureAspectRatio; + DWORD dwMaxAnisotropy; + + D3DVALUE dvGuardBandLeft; + D3DVALUE dvGuardBandTop; + D3DVALUE dvGuardBandRight; + D3DVALUE dvGuardBandBottom; + + D3DVALUE dvExtentsAdjust; + DWORD dwStencilCaps; + + DWORD dwFVFCaps; + DWORD dwTextureOpCaps; + WORD wMaxTextureBlendStages; + WORD wMaxSimultaneousTextures; + + DWORD dwMaxActiveLights; + D3DVALUE dvMaxVertexW; + GUID deviceGUID; + + WORD wMaxUserClipPlanes; + WORD wMaxVertexBlendMatrices; + + DWORD dwVertexProcessingCaps; + + DWORD dwReserved1; + DWORD dwReserved2; + DWORD dwReserved3; + DWORD dwReserved4; +} D3DDEVICEDESC7, *LPD3DDEVICEDESC7; +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#define D3DDEVICEDESCSIZE (sizeof(D3DDEVICEDESC)) +#define D3DDEVICEDESC7SIZE (sizeof(D3DDEVICEDESC7)) + +typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); + +#if(DIRECT3D_VERSION >= 0x0700) +typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +/* D3DDEVICEDESC dwFlags indicating valid fields */ + +#define D3DDD_COLORMODEL 0x00000001L /* dcmColorModel is valid */ +#define D3DDD_DEVCAPS 0x00000002L /* dwDevCaps is valid */ +#define D3DDD_TRANSFORMCAPS 0x00000004L /* dtcTransformCaps is valid */ +#define D3DDD_LIGHTINGCAPS 0x00000008L /* dlcLightingCaps is valid */ +#define D3DDD_BCLIPPING 0x00000010L /* bClipping is valid */ +#define D3DDD_LINECAPS 0x00000020L /* dpcLineCaps is valid */ +#define D3DDD_TRICAPS 0x00000040L /* dpcTriCaps is valid */ +#define D3DDD_DEVICERENDERBITDEPTH 0x00000080L /* dwDeviceRenderBitDepth is valid */ +#define D3DDD_DEVICEZBUFFERBITDEPTH 0x00000100L /* dwDeviceZBufferBitDepth is valid */ +#define D3DDD_MAXBUFFERSIZE 0x00000200L /* dwMaxBufferSize is valid */ +#define D3DDD_MAXVERTEXCOUNT 0x00000400L /* dwMaxVertexCount is valid */ + +/* D3DDEVICEDESC dwDevCaps flags */ + +#define D3DDEVCAPS_FLOATTLVERTEX 0x00000001L /* Device accepts floating point */ + /* for post-transform vertex data */ +#define D3DDEVCAPS_SORTINCREASINGZ 0x00000002L /* Device needs data sorted for increasing Z */ +#define D3DDEVCAPS_SORTDECREASINGZ 0X00000004L /* Device needs data sorted for decreasing Z */ +#define D3DDEVCAPS_SORTEXACT 0x00000008L /* Device needs data sorted exactly */ + +#define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */ +#define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */ +#define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */ +#define D3DDEVCAPS_TLVERTEXVIDEOMEMORY 0x00000080L /* Device can use TL buffers from video memory */ +#define D3DDEVCAPS_TEXTURESYSTEMMEMORY 0x00000100L /* Device can texture from system memory */ +#define D3DDEVCAPS_TEXTUREVIDEOMEMORY 0x00000200L /* Device can texture from device memory */ +#if(DIRECT3D_VERSION >= 0x0500) +#define D3DDEVCAPS_DRAWPRIMTLVERTEX 0x00000400L /* Device can draw TLVERTEX primitives */ +#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x00000800L /* Device can render without waiting for flip to complete */ +#define D3DDEVCAPS_TEXTURENONLOCALVIDMEM 0x00001000L /* Device can texture from nonlocal video memory */ +#endif /* DIRECT3D_VERSION >= 0x0500 */ +#if(DIRECT3D_VERSION >= 0x0600) +#define D3DDEVCAPS_DRAWPRIMITIVES2 0x00002000L /* Device can support DrawPrimitives2 */ +#define D3DDEVCAPS_SEPARATETEXTUREMEMORIES 0x00004000L /* Device is texturing from separate memory pools */ +#define D3DDEVCAPS_DRAWPRIMITIVES2EX 0x00008000L /* Device can support Extended DrawPrimitives2 i.e. DX7 compliant driver*/ +#endif /* DIRECT3D_VERSION >= 0x0600 */ +#if(DIRECT3D_VERSION >= 0x0700) +#define D3DDEVCAPS_HWTRANSFORMANDLIGHT 0x00010000L /* Device can support transformation and lighting in hardware and DRAWPRIMITIVES2EX must be also */ +#define D3DDEVCAPS_CANBLTSYSTONONLOCAL 0x00020000L /* Device supports a Tex Blt from system memory to non-local vidmem */ +#define D3DDEVCAPS_HWRASTERIZATION 0x00080000L /* Device has HW acceleration for rasterization */ + +/* + * These are the flags in the D3DDEVICEDESC7.dwVertexProcessingCaps field + */ + +/* device can do texgen */ +#define D3DVTXPCAPS_TEXGEN 0x00000001L +/* device can do IDirect3DDevice7 colormaterialsource ops */ +#define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L +/* device can do vertex fog */ +#define D3DVTXPCAPS_VERTEXFOG 0x00000004L +/* device can do directional lights */ +#define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L +/* device can do positional lights (includes point and spot) */ +#define D3DVTXPCAPS_POSITIONALLIGHTS 0x00000010L +/* device can do local viewer */ +#define D3DVTXPCAPS_LOCALVIEWER 0x00000020L + +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#define D3DFDS_COLORMODEL 0x00000001L /* Match color model */ +#define D3DFDS_GUID 0x00000002L /* Match guid */ +#define D3DFDS_HARDWARE 0x00000004L /* Match hardware/software */ +#define D3DFDS_TRIANGLES 0x00000008L /* Match in triCaps */ +#define D3DFDS_LINES 0x00000010L /* Match in lineCaps */ +#define D3DFDS_MISCCAPS 0x00000020L /* Match primCaps.dwMiscCaps */ +#define D3DFDS_RASTERCAPS 0x00000040L /* Match primCaps.dwRasterCaps */ +#define D3DFDS_ZCMPCAPS 0x00000080L /* Match primCaps.dwZCmpCaps */ +#define D3DFDS_ALPHACMPCAPS 0x00000100L /* Match primCaps.dwAlphaCmpCaps */ +#define D3DFDS_SRCBLENDCAPS 0x00000200L /* Match primCaps.dwSourceBlendCaps */ +#define D3DFDS_DSTBLENDCAPS 0x00000400L /* Match primCaps.dwDestBlendCaps */ +#define D3DFDS_SHADECAPS 0x00000800L /* Match primCaps.dwShadeCaps */ +#define D3DFDS_TEXTURECAPS 0x00001000L /* Match primCaps.dwTextureCaps */ +#define D3DFDS_TEXTUREFILTERCAPS 0x00002000L /* Match primCaps.dwTextureFilterCaps */ +#define D3DFDS_TEXTUREBLENDCAPS 0x00004000L /* Match primCaps.dwTextureBlendCaps */ +#define D3DFDS_TEXTUREADDRESSCAPS 0x00008000L /* Match primCaps.dwTextureBlendCaps */ + +/* + * FindDevice arguments + */ +typedef struct _D3DFINDDEVICESEARCH { + DWORD dwSize; + DWORD dwFlags; + BOOL bHardware; + D3DCOLORMODEL dcmColorModel; + GUID guid; + DWORD dwCaps; + D3DPRIMCAPS dpcPrimCaps; +} D3DFINDDEVICESEARCH, *LPD3DFINDDEVICESEARCH; + +typedef struct _D3DFINDDEVICERESULT { + DWORD dwSize; + GUID guid; /* guid which matched */ + D3DDEVICEDESC ddHwDesc; /* hardware D3DDEVICEDESC */ + D3DDEVICEDESC ddSwDesc; /* software D3DDEVICEDESC */ +} D3DFINDDEVICERESULT, *LPD3DFINDDEVICERESULT; + +/* + * Description of execute buffer. + */ +typedef struct _D3DExecuteBufferDesc { + DWORD dwSize; /* size of this structure */ + DWORD dwFlags; /* flags indicating which fields are valid */ + DWORD dwCaps; /* capabilities of execute buffer */ + DWORD dwBufferSize; /* size of execute buffer data */ + LPVOID lpData; /* pointer to actual data */ +} D3DEXECUTEBUFFERDESC, *LPD3DEXECUTEBUFFERDESC; + +/* D3DEXECUTEBUFFER dwFlags indicating valid fields */ + +#define D3DDEB_BUFSIZE 0x00000001l /* buffer size valid */ +#define D3DDEB_CAPS 0x00000002l /* caps valid */ +#define D3DDEB_LPDATA 0x00000004l /* lpData valid */ + +/* D3DEXECUTEBUFFER dwCaps */ + +#define D3DDEBCAPS_SYSTEMMEMORY 0x00000001l /* buffer in system memory */ +#define D3DDEBCAPS_VIDEOMEMORY 0x00000002l /* buffer in device memory */ +#define D3DDEBCAPS_MEM (D3DDEBCAPS_SYSTEMMEMORY|D3DDEBCAPS_VIDEOMEMORY) + +#if(DIRECT3D_VERSION < 0x0800) + +#if(DIRECT3D_VERSION >= 0x0700) +typedef struct _D3DDEVINFO_TEXTUREMANAGER { + BOOL bThrashing; /* indicates if thrashing */ + DWORD dwApproxBytesDownloaded; /* Approximate number of bytes downloaded by texture manager */ + DWORD dwNumEvicts; /* number of textures evicted */ + DWORD dwNumVidCreates; /* number of textures created in video memory */ + DWORD dwNumTexturesUsed; /* number of textures used */ + DWORD dwNumUsedTexInVid; /* number of used textures present in video memory */ + DWORD dwWorkingSet; /* number of textures in video memory */ + DWORD dwWorkingSetBytes; /* number of bytes in video memory */ + DWORD dwTotalManaged; /* total number of managed textures */ + DWORD dwTotalBytes; /* total number of bytes of managed textures */ + DWORD dwLastPri; /* priority of last texture evicted */ +} D3DDEVINFO_TEXTUREMANAGER, *LPD3DDEVINFO_TEXTUREMANAGER; + +typedef struct _D3DDEVINFO_TEXTURING { + DWORD dwNumLoads; /* counts Load() API calls */ + DWORD dwApproxBytesLoaded; /* Approximate number bytes loaded via Load() */ + DWORD dwNumPreLoads; /* counts PreLoad() API calls */ + DWORD dwNumSet; /* counts SetTexture() API calls */ + DWORD dwNumCreates; /* counts texture creates */ + DWORD dwNumDestroys; /* counts texture destroys */ + DWORD dwNumSetPriorities; /* counts SetPriority() API calls */ + DWORD dwNumSetLODs; /* counts SetLOD() API calls */ + DWORD dwNumLocks; /* counts number of texture locks */ + DWORD dwNumGetDCs; /* counts number of GetDCs to textures */ +} D3DDEVINFO_TEXTURING, *LPD3DDEVINFO_TEXTURING; +#endif /* DIRECT3D_VERSION >= 0x0700 */ + +#endif //(DIRECT3D_VERSION < 0x0800) + +#pragma pack() + + +#endif /* _D3DCAPS_H_ */ + + diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 8c7c1c5..02ba607 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -56,10 +56,20 @@ HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) return ret; } -HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) +HRESULT __stdcall IDirect3D__EnumDevices( + IDirect3DImpl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 2a83d47..9e20a93 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) return ret; } -HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) +HRESULT __stdcall IDirect3D2__EnumDevices( + IDirect3D2Impl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index edc776b..0820630 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) return ret; } -HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) +HRESULT __stdcall IDirect3D3__EnumDevices( + IDirect3D3Impl* This, + LPD3DENUMDEVICESCALLBACK lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC desc = { 0 }; + //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index c058874..6652e0f 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -48,10 +48,20 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) return ret; } -HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) +HRESULT __stdcall IDirect3D7__EnumDevices( + IDirect3D7Impl* This, + LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, + LPVOID lpUserArg) { TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = S_OK; + + if (lpEnumDevicesCallback) + { + D3DDEVICEDESC7 desc = { 0 }; + //lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg); + } + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } From 94b66b521a8f5b8adee918e09ffb15518cedf38f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:15:24 +0100 Subject: [PATCH 454/557] remove duplicate typdefs --- inc/IDirect3D.h | 4 ---- inc/d3dcaps.h | 4 ++-- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/inc/IDirect3D.h b/inc/IDirect3D.h index b545a5c..aed4b3d 100644 --- a/inc/IDirect3D.h +++ b/inc/IDirect3D.h @@ -13,9 +13,6 @@ DEFINE_GUID(IID_IDirect3D7, 0xf5049e77, 0x4861, 0x11d2, 0xa4, 0x7, 0x0, 0xa0, 0x DEFINE_GUID(IID_IDirect3DNullDevice, 0x8767df22, 0xbacc, 0x11d1, 0x89, 0x69, 0x0, 0xa0, 0xc9, 0x6, 0x29, 0xa8); -typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK)(GUID FAR* lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); -typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); - #define DECLARE_D3D_INTERFACE(iface) typedef struct iface { \ struct iface##Vtbl FAR* lpVtbl; \ @@ -24,7 +21,6 @@ typedef HRESULT(CALLBACK* LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, typedef struct iface##Vtbl iface##Vtbl; \ struct iface##Vtbl - /* IID_IDirect3D */ DECLARE_D3D_INTERFACE(IDirect3DImpl) diff --git a/inc/d3dcaps.h b/inc/d3dcaps.h index ddf7226..4f86f61 100644 --- a/inc/d3dcaps.h +++ b/inc/d3dcaps.h @@ -440,9 +440,9 @@ typedef struct _D3DDeviceDesc7 { typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK)(GUID FAR *lpGuid, LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC, LPD3DDEVICEDESC, LPVOID); -#if(DIRECT3D_VERSION >= 0x0700) +//#if(DIRECT3D_VERSION >= 0x0700) typedef HRESULT (CALLBACK * LPD3DENUMDEVICESCALLBACK7)(LPSTR lpDeviceDescription, LPSTR lpDeviceName, LPD3DDEVICEDESC7, LPVOID); -#endif /* DIRECT3D_VERSION >= 0x0700 */ +//#endif /* DIRECT3D_VERSION >= 0x0700 */ /* D3DDEVICEDESC dwFlags indicating valid fields */ From 2bec555fe8540f836fcd1efbac1cdb68bd0b69f5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:29:22 +0100 Subject: [PATCH 455/557] remove direct3d_passthrough setting --- inc/config.h | 1 - src/IDirect3D/IDirect3D.c | 2 +- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/config.c | 6 ------ 5 files changed, 3 insertions(+), 10 deletions(-) diff --git a/inc/config.h b/inc/config.h index 4e9731d..d1600d5 100644 --- a/inc/config.h +++ b/inc/config.h @@ -72,7 +72,6 @@ typedef struct CNCDDRAWCONFIG BOOL flipclear; BOOL rgb555; BOOL no_dinput_hook; - BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; BOOL lock_mouse_top_left; diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 02ba607..e4b0ee5 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -67,7 +67,7 @@ HRESULT __stdcall IDirect3D__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 9e20a93..3a9d493 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -59,7 +59,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 0820630..6302bf6 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -59,7 +59,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices( if (lpEnumDevicesCallback) { D3DDEVICEDESC desc = { 0 }; - //lpEnumDevicesCallback((GUID FAR*)&IID_IDirect3DNullDevice, "NULL", "NULL", &desc, &desc, lpUserArg); + //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); diff --git a/src/config.c b/src/config.c index 76dd487..48a967e 100644 --- a/src/config.c +++ b/src/config.c @@ -85,7 +85,6 @@ void cfg_load() GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); GET_BOOL(g_config.no_dinput_hook, "no_dinput_hook", FALSE); - GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); GET_BOOL(g_config.lock_mouse_top_left, "lock_mouse_top_left", FALSE); @@ -329,7 +328,6 @@ static void cfg_create_ini() "flipclear=false\n" "rgb555=false\n" "no_dinput_hook=false\n" - "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" "lock_mouse_top_left=false\n" @@ -1192,10 +1190,6 @@ static void cfg_create_ini() "sirtech_hack=true\n" "fix_alt_key_stuck=true\n" "\n" - "; Jedi Knight Dark Forces 2\n" - "[JK]\n" - "direct3d_passthrough=true\n" - "\n" "; Jeopardy! - NOT WORKING YET\n" "[jeoppc]\n" "singlecpu=false\n" From fceb26de0eddc893279c4e9fd9a9865ef1257165 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 04:33:52 +0100 Subject: [PATCH 456/557] fix for last commit --- src/IDirectDraw/IDirectDraw.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 443a592..9384714 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -56,7 +56,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D, riid)) { IDirect3DImpl* d3d = (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl)); @@ -70,7 +70,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D2, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D2, riid)) { IDirect3D2Impl* d3d = (IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl)); @@ -84,7 +84,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D3, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D3, riid)) { IDirect3D3Impl* d3d = (IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl)); @@ -98,7 +98,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D7, riid) && !g_config.direct3d_passthrough) + else if (IsEqualGUID(&IID_IDirect3D7, riid)) { IDirect3D7Impl* d3d = (IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl)); From 35831124677b203e43dbfdd210861c39e2486935 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 05:47:39 +0100 Subject: [PATCH 457/557] update supported games list --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 10ff9fa..91b0a59 100644 --- a/README.md +++ b/README.md @@ -384,7 +384,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - SPY Fox: Operation Ozone - Star Trek Away Team - Star Trek Generations -- Star Wars - Pit Droids +- Star Wars: Pit Droids - Star Wars Anakin's Speedway - Star Wars Early Learning Activity Center - Star Wars Episode I: The Gungan Frontier @@ -393,6 +393,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Star Wars Yoda's Challenge - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns +- Star Wars: Droid Works - StarCraft - StarCraft: Broodwars - StarFlyers Alien Space Chase From 1fc0062de161bbcb4b3eebf985da9a775dda777d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 06:06:55 +0100 Subject: [PATCH 458/557] update Return to Krondor preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 48a967e..bab83d7 100644 --- a/src/config.c +++ b/src/config.c @@ -1557,6 +1557,7 @@ static void cfg_create_ini() "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" + "maxgameticks=30\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From 6855e39464b7225f49a33034c3ba5f19da8e6d59 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 25 Dec 2024 19:45:35 +0100 Subject: [PATCH 459/557] update Return to Krondor preset --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index bab83d7..8db872a 100644 --- a/src/config.c +++ b/src/config.c @@ -1557,7 +1557,8 @@ static void cfg_create_ini() "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" - "maxgameticks=30\n" + "maxgameticks=59\n" + "anti_aliased_fonts_min_size=99\n" "\n" "; Rent-A-Hero\n" "[Rent-A-Hero]\n" From 3e02398e995852f1878a6de77d67fe4eb30929a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 01:34:52 +0100 Subject: [PATCH 460/557] add missing checks --- src/ddsurface.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index f1b75f5..be1af88 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -77,13 +77,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - //dbg_print_rect("lpSrcRect", lpSrcRect); + dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - //dbg_print_rect("lpDestRect", lpDestRect); + dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } @@ -268,7 +268,7 @@ HRESULT dds_Blt( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if ((dwFlags & DDBLT_KEYSRC) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) + if (((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE)) { UINT color = (dwFlags & DDBLT_KEYSRCOVERRIDE) ? @@ -326,7 +326,7 @@ HRESULT dds_Blt( */ } else if ( - (dwFlags & DDBLT_KEYSRC) || + ((dwFlags & DDBLT_KEYSRC) && (src_surface->flags & DDSD_CKSRCBLT)) || (dwFlags & DDBLT_KEYSRCOVERRIDE) || mirror_left_right || mirror_up_down) @@ -572,7 +572,7 @@ HRESULT dds_BltFast( HDC src_dc; dds_GetDC(src_surface, &src_dc); - if (dwFlags & DDBLTFAST_SRCCOLORKEY) + if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) { UINT color = src_surface->color_key.dwColorSpaceLowValue; @@ -625,7 +625,7 @@ HRESULT dds_BltFast( SRCCOPY); */ } - else if (dwFlags & DDBLTFAST_SRCCOLORKEY) + else if ((dwFlags & DDBLTFAST_SRCCOLORKEY) && (src_surface->flags & DDSD_CKSRCBLT)) { blt_colorkey( dst_buf, From 6e0ddb8474452514c7de74f6ee7ec8769b0e2ad4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 01:35:37 +0100 Subject: [PATCH 461/557] disable debug code --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index be1af88..ddb89f1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -77,13 +77,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - dbg_print_rect("lpSrcRect", lpSrcRect); + //dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - dbg_print_rect("lpDestRect", lpDestRect); + //dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From f6274bc16c410ee0ee06da8373de1ad1a67b3888 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:00:51 +0100 Subject: [PATCH 462/557] add preset for metal knight --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 8db872a..dbf37cc 100644 --- a/src/config.c +++ b/src/config.c @@ -1358,6 +1358,11 @@ static void cfg_create_ini() "[Moorhuhn2]\n" "fix_alt_key_stuck=true\n" "\n" + "; Metal Knight\n" + "[mk]\n" + "maxgameticks=60\n" + "limiter_type=4\n" + "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" From 75283cef2c9492de166a68b5130716399abfa411 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:03:43 +0100 Subject: [PATCH 463/557] update and sort presets --- README.md | 69 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 37 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 91b0a59..f1ace48 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Age of Wonders 2 - Age of Wonders: Shadow Magic - Agharta the Hollow Earth +- Airline 69: Return to Casablanca - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) @@ -69,20 +70,19 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Army Men 2 - Army Men Air Tactics +- Army Men: Air Tactics +- Army Men: Toys in Space +- Army Men: World War / Army Men: Operation Meltdown - Arthur's Pet Chase - Arthur's Sand Castle Contest - Arthur's Wilderness Rescue -- Army Men: World War / Army Men: Operation Meltdown -- Army Men: Air Tactics -- Army Men: Toys in Space -- Army Men 2 - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Airline 69: Return to Casablanca - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 @@ -137,9 +137,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 +- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest -- Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cydonia Mars - The First Manned Mission - Dark Earth - Dark Reign: The Future of War @@ -150,24 +150,24 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Deadly Tide - Delta Force - Desperados: Wanted Dead or Alive -- Dreams to Realty -- Die by the Sword - Diablo - Diablo 2 - Diablo 2: Lord of Destruction - Diablo: Hellfire +- Die by the Sword - Disciples - Disciples 2 - Rise of the Elves - Discoworld Noir - Divine Divinity +- Dominion - Storm Over Gift 3 - Doom 95 - Dragon Throne: Battle of Red Cliffs +- Dreams to Realty - DuelSavior - DuelSavior: Justice - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 -- Dominion - Storm Over Gift 3 - Economic War - Eggsucker - Emperor: Rise of the Middle Kingdom @@ -198,14 +198,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Future Cop L.A.P.D - G-Police - Geneforge +- Gilbert Goodmate And The Mushroom Of Phungoria - Gorasul: The Legacy of the Dragon - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 +- Gromada Revenge - Gruntz -- Gilbert Goodmate And The Mushroom Of Phungoria -- Handkerchief - Hamtaro: Wake Up Snoozer! +- Handkerchief - Hard Truck: Road to Victory - Heart of Darkness - Hearts of Iron 2 @@ -224,9 +225,9 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Icewind Dale - Icewind Dale 2 - Ignition +- Imperialism 2: The Age of Exploration - Indiana Jones and the Fate of Atlantis - Indiana Jones and the Last Crusade -- Imperialism 2: The Age of Exploration - Infantry Online - Interstate 76 - Invictus: In the Shadow of Olympus @@ -244,9 +245,10 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Kohan: Immortal Sovereigns - Konung - Konung 2 -- Last Bronx - Lands of Lore 2 Guardian of Destiny (Software mode only) - Lapis (lapis.mgame.com) +- Last Bronx +- Links Extreme - Lionheart - Legacy of the Crusader - Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures @@ -255,17 +257,17 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Locomotion - Lode Runner 2 - Lost Vikings 2 -- Links Extreme -- Mario Sorb 3 - M.A.X. 2 Mechanized Assault & Exploration - Madeline 1st Grade Math - Madeline 2nd Grade Math - Mageslayer - Majesty Gold - Majesty Gold HD +- Mario Sorb 3 - Mech Warrior 3 - Megaman X4 - Metal Gear Solid +- Metal Knight - Mob Rule (AKA Constructor: Street Wars / Street Wars: Constructor Underworld) - Moorhuhn - Moorhuhn 2 @@ -285,14 +287,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - NBA Full Court Press - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes +- Neo Sonic Universe - New Robinson - NexusTk -- Neo Sonic Universe - Nightmare Creatures - Ninja Jonder Deluxe - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee +- Original War - Outlaws - Outlive - Outwars (software mode) @@ -310,6 +313,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) +- Platypus - Populous: The Beginning - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA @@ -321,7 +325,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise - Putt-Putt: Travels Through Time -- Platypus - Quest for Glory 5 - Rage of Mages - Rage of Mages 2 @@ -341,15 +344,15 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Real War - Red Baron 3D -- Rent-A-Hero -- Return to Krondor - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Reksio and the Pirate Treasure (Reksio i Skarb Piratów) - Reksio and the Time Machine (Reksio i Wehikuł Czasu) - Reksio and the UFO (Reksio i Ufo) - Reksio and the Wizards (Reksio i Czarodzieje) +- Rent-A-Hero - Resurrection - The Return of the Black Dragon (software mode) +- Return to Krondor - Rising Lands (patched) - Road Rash - Robin Hood - The Legend of Sherwood @@ -367,33 +370,33 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Shadow Flare - Shadow Watch - Shogo - Mobile Armor Division +- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) -- Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sonic 3D Blast - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing -- Squad Leader - SPY Fox : Some Assembly Required - SPY Fox in Dry Cereal - SPY Fox: Hold the Mustard - SPY Fox: Operation Ozone +- Squad Leader - Star Trek Away Team - Star Trek Generations -- Star Wars: Pit Droids - Star Wars Anakin's Speedway - Star Wars Early Learning Activity Center - Star Wars Episode I: The Gungan Frontier - Star Wars Jedi Knight: Dark Forces II - Star Wars Rebellion - Star Wars Yoda's Challenge +- Star Wars: Droid Works - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns -- Star Wars: Droid Works +- Star Wars: Pit Droids - StarCraft - StarCraft: Broodwars - StarFlyers Alien Space Chase @@ -410,35 +413,37 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Swarog - The Curse Of Monkey Island - The Dig +- The Last Express - The Missing on Lost Island +- The Neverhood +- The Next Worlds - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone -- The X-Files DVD -- The Last Express -- The Neverhood - The Rocky Interactive Horror Show -- The Next Worlds - The Sex Files +- The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Throne of Darkness +- Thunder Brigade - TianLong BaBu - Tone Rebellion +- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms - Toy Story -- Tone Rebellion +- Tridonis - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown - Uprising 2: Lead and Destroy - Uprising: Join or Die - Vermeer -- Virtua Fighter PC - Virtua Cop - Virtua Cop 2 - Virtua Fighter 2 +- Virtua Fighter PC - Virtual Springfield - War Wind - War Wind II - Human Onslaught @@ -449,19 +454,19 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Warlords Battlecry 2 - Warlords Battlecry 3 - Weird War +- Wheel Of Fortune - Wing Commander - The Kilrathi Saga - Wizardry 8 - Wizards and Warriors - Worms 2 - Worms Armageddon -- Wheel Of Fortune +- Z & Z Expansion Kit - Zeus: Master of Olympus - Zoombinis Island Odyssey - Zoombinis Logical Journey - Zoombinis Mountain Rescue -- Zuma Deluxe - Zork Nemesis -- Z & Z Expansion Kit +- Zuma Deluxe - ... There are a lot more games supported but I don't usually update the list, just give it a try and if it doesn't work then check the [wiki](https://github.com/FunkyFr3sh/cnc-ddraw/wiki) and the instructions above. From 90fadd36dbbb6790a3855b4ec7d3cbed55ab64cb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:06:40 +0100 Subject: [PATCH 464/557] remove duplicate entry --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index f1ace48..667fbc5 100644 --- a/README.md +++ b/README.md @@ -428,7 +428,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Thunder Brigade - TianLong BaBu - Tone Rebellion -- Tone Rebellion - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From 93319d4c836dcd5f90bedb40184672d00bca21dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:24:05 +0100 Subject: [PATCH 465/557] add support for limiting game speed of GDI games --- src/winapi_hooks.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 0d2f981..7637d49 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1032,6 +1032,11 @@ BOOL WINAPI fake_StretchBlt( { HWND hwnd = WindowFromDC(hdcDest); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1140,6 +1145,11 @@ BOOL WINAPI fake_BitBlt( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1236,6 +1246,11 @@ int WINAPI fake_SetDIBitsToDevice( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) @@ -1326,6 +1341,11 @@ int WINAPI fake_StretchDIBits( { HWND hwnd = WindowFromDC(hdc); + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd && !g_ddraw.primary) + { + InterlockedExchange(&g_ddraw.render.screen_updated, TRUE); + } + char class_name[MAX_PATH] = { 0 }; if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) From 9ac0054f1ab1c1e5514aac5be710a5f7e8b0b058 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:37:54 +0100 Subject: [PATCH 466/557] add support for Soldiers At War --- README.md | 1 + src/config.c | 5 +++++ src/winapi_hooks.c | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 667fbc5..8d5e8ff 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) - Sonic 3D Blast +- Soldiers At War - Space Rangers - Spec Ops - Ranger Assault (software mode) - SpongeBob SquarePants: Typing diff --git a/src/config.c b/src/config.c index dbf37cc..68aa2ae 100644 --- a/src/config.c +++ b/src/config.c @@ -1724,6 +1724,11 @@ static void cfg_create_ini() "maxgameticks=30\n" "limiter_type=4\n" "\n" + "; Soldiers At War\n" + "[SAW_Game]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; The Curse Of Monkey Island\n" "[COMI]\n" "singlecpu=false\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7637d49..fc6fdbd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -986,7 +986,7 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) } } - if (width && WindowFromDC(hdc) == GetDesktopWindow()) + if (width && ((g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) || WindowFromDC(hdc) == GetDesktopWindow())) { if (index == HORZRES) { From 636b78d99db637b8b94d324e34fd43a4810ecde6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:41:10 +0100 Subject: [PATCH 467/557] limit Soldiers At War to 20 fps --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 68aa2ae..f99c7ba 100644 --- a/src/config.c +++ b/src/config.c @@ -1726,7 +1726,7 @@ static void cfg_create_ini() "\n" "; Soldiers At War\n" "[SAW_Game]\n" - "maxgameticks=30\n" + "maxgameticks=20\n" "limiter_type=4\n" "\n" "; The Curse Of Monkey Island\n" From 2f40bb7c8d1faae59cbb23c8788f1543785f423d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 02:58:09 +0100 Subject: [PATCH 468/557] update Zork Nemesis preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index f99c7ba..0b8e8fc 100644 --- a/src/config.c +++ b/src/config.c @@ -1889,6 +1889,7 @@ static void cfg_create_ini() "\n" "; Zork Nemesis\n" "[znemesis]\n" + "fix_not_responding=true\n" "singlecpu=false\n" "maxgameticks=60\n" "limiter_type=4\n" From ca195bcb3f402266f7708698e28c1f3c2a801706 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 07:42:40 +0100 Subject: [PATCH 469/557] update Soldiers At War preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 0b8e8fc..ea2a00d 100644 --- a/src/config.c +++ b/src/config.c @@ -1726,7 +1726,7 @@ static void cfg_create_ini() "\n" "; Soldiers At War\n" "[SAW_Game]\n" - "maxgameticks=20\n" + "maxgameticks=30\n" "limiter_type=4\n" "\n" "; The Curse Of Monkey Island\n" From 1e03e9cec686c818d17f4d36223c9675e38eb325 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 23:59:05 +0100 Subject: [PATCH 470/557] add bpp check to dds blt --- inc/IDirectDrawSurface.h | 2 +- src/ddsurface.c | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index d8eb99f..b96314a 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -23,9 +23,9 @@ typedef struct IDirectDrawSurfaceImpl ULONG ref; + DWORD bpp; DWORD width; DWORD height; - DWORD bpp; DWORD size; DWORD flags; DWORD caps; diff --git a/src/ddsurface.c b/src/ddsurface.c index ddb89f1..3a4c26a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -50,6 +50,15 @@ HRESULT dds_Blt( DWORD dwFlags, LPDDBLTFX lpDDBltFx) { + if (lpDDSrcSurface && + lpDDSrcSurface->bpp != 8 && + lpDDSrcSurface->bpp != 16 && + lpDDSrcSurface->bpp != 24 && + lpDDSrcSurface->bpp != 32) + { + return DDERR_INVALIDPARAMS; + } + dbg_dump_dds_blt_flags(dwFlags); dbg_dump_dds_blt_fx_flags((dwFlags & DDBLT_DDFX) && lpDDBltFx ? lpDDBltFx->dwDDFX : 0); @@ -77,13 +86,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - //dbg_print_rect("lpSrcRect", lpSrcRect); + dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - //dbg_print_rect("lpDestRect", lpDestRect); + dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From 1c5a5a20458b10c89da7db27e38fa018d077f2d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 26 Dec 2024 23:59:55 +0100 Subject: [PATCH 471/557] disable debug code --- src/ddsurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 3a4c26a..8166bb0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -86,13 +86,13 @@ HRESULT dds_Blt( if (lpSrcRect && src_surface) { - dbg_print_rect("lpSrcRect", lpSrcRect); + //dbg_print_rect("lpSrcRect", lpSrcRect); src_rect = *lpSrcRect; } if (lpDestRect) { - dbg_print_rect("lpDestRect", lpDestRect); + //dbg_print_rect("lpDestRect", lpDestRect); dst_rect = *lpDestRect; } From d58b38095c8c74055882c96e0444b842f89a3fc3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:15:01 +0100 Subject: [PATCH 472/557] remove DDSD_LPSURFACE flag --- src/ddsurface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8166bb0..4fd92c1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -733,8 +733,7 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur DDSD_WIDTH | DDSD_HEIGHT | DDSD_PITCH | - DDSD_PIXELFORMAT | - DDSD_LPSURFACE; + DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwWidth = This->width; lpDDSurfaceDesc->dwHeight = This->height; From 0edec22452556c64a8acb6f74585ef4bd05746d8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:34:38 +0100 Subject: [PATCH 473/557] don'T pass WM_KILLFOCUS messages to the game with noactivateapp --- src/wndproc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wndproc.c b/src/wndproc.c index 6043467..76f3387 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -90,6 +90,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } + case WM_KILLFOCUS: case WM_NCACTIVATE: { if (g_config.noactivateapp) From f1e1578276c8852141b05c692693b9cb880264aa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:34:48 +0100 Subject: [PATCH 474/557] add preset for unreal --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ea2a00d..dfa23fb 100644 --- a/src/config.c +++ b/src/config.c @@ -1733,6 +1733,10 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "noactivateapp=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 6cb005cbc1586c323502ad5055e54be4a239efe4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:35:04 +0100 Subject: [PATCH 475/557] update supported games list --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d5e8ff..5ed529e 100644 --- a/README.md +++ b/README.md @@ -71,7 +71,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura - Army Men 2 -- Army Men Air Tactics - Army Men: Air Tactics - Army Men: Toys in Space - Army Men: World War / Army Men: Operation Meltdown @@ -274,6 +273,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Moorhuhn Adventure: Fluch des Goldes - Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon +- MiG-29 Fulcrum - Moto Racer - Moto Racer 2 - Nancy Drew: Danger on Deception Island @@ -437,6 +437,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown +- Unreal - Uprising 2: Lead and Destroy - Uprising: Join or Die - Vermeer @@ -445,6 +446,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Virtua Fighter 2 - Virtua Fighter PC - Virtual Springfield +- WarGames - War Wind - War Wind II - Human Onslaught - Warcraft 2 From ca4aaf8bfc56a8d4c66af45ba75814c88325676a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 27 Dec 2024 02:44:37 +0100 Subject: [PATCH 476/557] sort ini --- src/config.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index dfa23fb..5c5f8dc 100644 --- a/src/config.c +++ b/src/config.c @@ -1733,10 +1733,6 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" - "; Unreal\n" - "[Unreal]\n" - "noactivateapp=true\n" - "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1835,6 +1831,10 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "noactivateapp=true\n" + "\n" "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" From 2090c390b9f86782514c82d6e53949503c5f5a56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 01:54:39 +0100 Subject: [PATCH 477/557] add preset for Jeff Wayne's The War of the Worlds --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 5ed529e..94b6d39 100644 --- a/README.md +++ b/README.md @@ -234,6 +234,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 +- Jeff Wayne's The War of the Worlds - Karma Immortal Wrath - Killing Time - Kings Quest 8: Mask of Eternity diff --git a/src/config.c b/src/config.c index 5c5f8dc..ecae4fd 100644 --- a/src/config.c +++ b/src/config.c @@ -1887,6 +1887,11 @@ static void cfg_create_ini() "[WW]\n" "minfps=-1\n" "\n" + "; Jeff Wayne's 'The War Of The Worlds'\n" + "[WoW]\n" + "singlecpu=false\n" + "minfps=-1\n" + "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From 7dc613e1402e5ba6ef5baa9e8acc09f210cfa7a2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 07:47:18 +0100 Subject: [PATCH 478/557] update presets --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index ecae4fd..2aea9dd 100644 --- a/src/config.c +++ b/src/config.c @@ -1196,6 +1196,7 @@ static void cfg_create_ini() "\n" "; Karma Immortal Wrath\n" "[karma]\n" + "fix_not_responding=true\n" "maxgameticks=60\n" "limiter_type=4\n" "\n" @@ -1519,6 +1520,7 @@ static void cfg_create_ini() "\n" "; Railroad Tycoon II\n" "[RT2]\n" + "maxgameticks=60" "adjmouse=true\n" "\n" "; Reader Rabbit Thinking Ages 4-6 (US)\n" @@ -1708,6 +1710,7 @@ static void cfg_create_ini() "; Sim City 3000\n" "[SC3]\n" "minfps=-2\n" + "maxgameticks=60" "\n" "; Shadow Watch\n" "[sw]\n" @@ -1733,6 +1736,10 @@ static void cfg_create_ini() "[COMI]\n" "singlecpu=false\n" "\n" + "; The Tone Rebellion\n" + "[Float]\n" + "hook_peekmessage=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" From 8e77275da0ccd0a4cab2fee2dcd82962da6a3f70 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:27:35 +0100 Subject: [PATCH 479/557] add preset for Unreal --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 2aea9dd..8f30eac 100644 --- a/src/config.c +++ b/src/config.c @@ -1829,6 +1829,12 @@ static void cfg_create_ini() "[Tzar]\n" "adjmouse=true\n" "\n" + "; Unreal\n" + "[Unreal]\n" + "adjmouse=false\n" + "lock_mouse_top_left=true\n" + "center_cursor_fix=true\n" + "\n" "; Uprising\n" "[uprising]\n" "adjmouse=true\n" From 3cf0eda68cfd75042021f6101e6f279586383534 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:31:02 +0100 Subject: [PATCH 480/557] fix warnings --- src/IDirect3D/IDirect3D2.c | 2 +- src/IDirect3D/IDirect3D3.c | 2 +- src/IDirect3D/IDirect3D7.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 3a9d493..c4f93ab 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC desc = { 0 }; + //D3DDEVICEDESC desc = { 0 }; //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 6302bf6..8b6ff43 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC desc = { 0 }; + //D3DDEVICEDESC desc = { 0 }; //lpEnumDevicesCallback((GUID FAR*)&GUID_NULL, "NULL", "NULL", &desc, &desc, lpUserArg); } diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 6652e0f..0102923 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -58,7 +58,7 @@ HRESULT __stdcall IDirect3D7__EnumDevices( if (lpEnumDevicesCallback) { - D3DDEVICEDESC7 desc = { 0 }; + //D3DDEVICEDESC7 desc = { 0 }; //lpEnumDevicesCallback("NULL", "NULL", &desc, lpUserArg); } From bfb98f9ee02cce1c53fd7b60ff18cde35d774974 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:37:38 +0100 Subject: [PATCH 481/557] fix makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 812f29e..c2f547b 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lavifil32 -luuid COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) From 541b5de218ec3fbd6ea91e606ebfadc07c1786b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 28 Dec 2024 08:37:44 +0100 Subject: [PATCH 482/557] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index c310b4b..045beec 100644 --- a/inc/version.h +++ b/inc/version.h @@ -5,9 +5,9 @@ #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) #define VERSION_MAJOR 7 -#define VERSION_MINOR 0 +#define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 1 +#define VERSION_REVISION 0 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From e7ae07a961ae948b1af03a698bda5dfd4443585a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 00:30:04 +0100 Subject: [PATCH 483/557] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 045beec..29e19fa 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 7 #define VERSION_MINOR 1 #define VERSION_BUILD 0 -#define VERSION_REVISION 0 +#define VERSION_REVISION 1 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 812b7599811b9583c5dd4586871f9d54e54a6008 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 00:30:13 +0100 Subject: [PATCH 484/557] align --- src/ddpalette.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddpalette.c b/src/ddpalette.c index 4288b89..e51df8e 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -109,7 +109,7 @@ HRESULT dd_CreatePalette( p->lpVtbl = &g_ddp_vtbl; p->flags = dwFlags; - ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); + ddp_SetEntries(p, dwFlags, 0, 256, lpDDColorArray); IDirectDrawPalette_AddRef(p); *lpDDPalette = p; From b7fdfa434b81929a6db5593998ea656f5839cd94 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 09:34:40 +0100 Subject: [PATCH 485/557] don't forward WM_NCCALCSIZE to the games --- src/wndproc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wndproc.c b/src/wndproc.c index 76f3387..eebace2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -49,6 +49,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_NCPAINT: case WM_CANCELMODE: case WM_DISPLAYCHANGE: + case WM_NCCALCSIZE: { return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); } From 82408006f33f113084f94d3325dec45dddc97f1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 19:50:58 +0100 Subject: [PATCH 486/557] add preset for Mission Deliver Kindness --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 94b6d39..6f9007a 100644 --- a/README.md +++ b/README.md @@ -275,6 +275,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Moorhuhn Adventure: Schatz des Pharao and Fluch des Goldes) - Moorhuhn Winter Editon - MiG-29 Fulcrum +- Mission Deliver Kindness - Moto Racer - Moto Racer 2 - Nancy Drew: Danger on Deception Island diff --git a/src/config.c b/src/config.c index 8f30eac..b8c7d10 100644 --- a/src/config.c +++ b/src/config.c @@ -1364,6 +1364,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=4\n" "\n" + "; Mission Deliver Kindness\n" + "[MDK95]\n" + "singlecpu=false\n" + "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" From d1af7faa32de50dc287b8b365f0c9cb63b50857f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 20:16:14 +0100 Subject: [PATCH 487/557] allways allow Alt+F4 --- src/wndproc.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index eebace2..cbc0c07 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -851,6 +851,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSKEYDOWN: { + if (wParam == VK_F4) + { + return real_DefWindowProcA(hWnd, uMsg, wParam, lParam); + } + break; } case WM_SYSKEYUP: From 743df36fcb77df9f2d320fe0c4fa4333e0909386 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:27:25 +0100 Subject: [PATCH 488/557] hook BeginPaint --- inc/hook.h | 4 +++- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 20 ++++++++++++++++++++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/inc/hook.h b/inc/hook.h index 089f668..23de636 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -18,7 +18,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[38]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[39]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -64,6 +64,7 @@ typedef BOOL(WINAPI* SETWINDOWPLACEMENTPROC)(HWND, const WINDOWPLACEMENT*); typedef BOOL(WINAPI* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef LRESULT(WINAPI* DEFWINDOWPROCAPROC)(HWND, UINT, WPARAM, LPARAM); typedef HWND(WINAPI* SETPARENTPROC)(HWND, HWND); +typedef HDC (WINAPI* BEGINPAINTPROC)(HWND, LPPAINTSTRUCT); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -127,6 +128,7 @@ extern SETWINDOWPLACEMENTPROC real_SetWindowPlacement; extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern DEFWINDOWPROCAPROC real_DefWindowProcA; extern SETPARENTPROC real_SetParent; +extern BEGINPAINTPROC real_BeginPaint; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index cab3ab6..ad44c7e 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -39,6 +39,7 @@ BOOL WINAPI fake_SetWindowPlacement(HWND hWnd, const WINDOWPLACEMENT* lpwndpl); BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); LRESULT WINAPI fake_DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent); +HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint); SHORT WINAPI fake_GetKeyState(int nVirtKey); SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); diff --git a/src/hook.c b/src/hook.c index 1e536fb..29846c7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -55,6 +55,7 @@ SETWINDOWPLACEMENTPROC real_SetWindowPlacement = SetWindowPlacement; ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; DEFWINDOWPROCAPROC real_DefWindowProcA = DefWindowProcA; SETPARENTPROC real_SetParent = SetParent; +BEGINPAINTPROC real_BeginPaint = BeginPaint; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -119,6 +120,7 @@ HOOKLIST g_hook_hooklist[] = { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 0 }, { "DefWindowProcA", (PROC)fake_DefWindowProcA, (PROC*)&real_DefWindowProcA, 0 }, { "SetParent", (PROC)fake_SetParent, (PROC*)&real_SetParent, 0 }, + { "BeginPaint", (PROC)fake_BeginPaint, (PROC*)&real_BeginPaint, 0 }, { "GetKeyState", (PROC)fake_GetKeyState, (PROC*)&real_GetKeyState, 0 }, { "GetAsyncKeyState", (PROC)fake_GetAsyncKeyState, (PROC*)&real_GetAsyncKeyState, 0 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index fc6fdbd..88c94fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -915,6 +915,26 @@ HWND WINAPI fake_SetParent(HWND hWndChild, HWND hWndNewParent) return real_SetParent(hWndChild, hWndNewParent); } +HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) +{ + if (g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && g_ddraw.hwnd == hWnd && lpPaint) + { + HDC result = real_BeginPaint(hWnd, lpPaint); + + if (result) + { + lpPaint->rcPaint.left = 0; + lpPaint->rcPaint.top = 0; + lpPaint->rcPaint.right = g_ddraw.width; + lpPaint->rcPaint.bottom = g_ddraw.height; + } + + return result; + } + + return real_BeginPaint(hWnd, lpPaint); +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 68d6ec1c6a525e42baf160b4b81ea7cf293dd14e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:36:45 +0100 Subject: [PATCH 489/557] tweak BeginPaint hook --- src/winapi_hooks.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 88c94fe..8f88179 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -921,7 +921,10 @@ HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) { HDC result = real_BeginPaint(hWnd, lpPaint); - if (result) + RECT size = { 0, 0, g_ddraw.width, g_ddraw.height }; + real_GetClientRect(hWnd, &size); + + if (result && (g_ddraw.width != size.right || g_ddraw.height != size.bottom)) { lpPaint->rcPaint.left = 0; lpPaint->rcPaint.top = 0; From da2430b7d03b81fa86268311af4823510e85e2fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 01:38:22 +0100 Subject: [PATCH 490/557] Revert "tweak BeginPaint hook" This reverts commit 68d6ec1c6a525e42baf160b4b81ea7cf293dd14e. --- src/winapi_hooks.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8f88179..88c94fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -921,10 +921,7 @@ HDC WINAPI fake_BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint) { HDC result = real_BeginPaint(hWnd, lpPaint); - RECT size = { 0, 0, g_ddraw.width, g_ddraw.height }; - real_GetClientRect(hWnd, &size); - - if (result && (g_ddraw.width != size.right || g_ddraw.height != size.bottom)) + if (result) { lpPaint->rcPaint.left = 0; lpPaint->rcPaint.top = 0; From 30e8b70f4d1a23969515e647db64523a5f0ddda4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 04:32:53 +0100 Subject: [PATCH 491/557] add workaround for windows 11 freeze issues --- inc/utils.h | 3 ++- src/dd.c | 9 ++++++++- src/dllmain.c | 7 +++++++ src/utils.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 2 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 9f7f0ee..3833ede 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,8 +6,9 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +void util_set_process_affinity(); +void util_set_thread_affinity(DWORD tid); void util_pull_messages(); -unsigned long util_get_crc32(char* filename); DWORD util_get_timestamp(HMODULE mod); FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name); BOOL util_caller_is_ddraw_wrapper(void* return_address); diff --git a/src/dd.c b/src/dd.c index e69063a..883c1e1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1824,7 +1824,14 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - SetProcessAffinityMask(proc, 1); + if (!IsWine() && IsWindows11OrGreater()) + { + util_set_process_affinity(); + } + else + { + SetProcessAffinityMask(proc, 1); + } } else if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) { diff --git a/src/dllmain.c b/src/dllmain.c index 97d675f..f3f98b1 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -180,6 +180,13 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) break; } + case DLL_THREAD_ATTACH: + { + if (g_config.singlecpu && !IsWine() && IsWindows11OrGreater()) + { + util_set_thread_affinity(GetCurrentThreadId()); + } + } } return TRUE; diff --git a/src/utils.c b/src/utils.c index d96920b..a6649c4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -71,6 +72,42 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +void util_set_process_affinity() +{ + HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); + if (snap == INVALID_HANDLE_VALUE) + return; + + THREADENTRY32 entry = { 0 }; + entry.dwSize = sizeof(THREADENTRY32); + + if (!Thread32First(snap, &entry)) + { + CloseHandle(snap); + return; + } + + do + { + if (entry.th32OwnerProcessID == GetCurrentProcessId()) + { + util_set_thread_affinity(entry.th32ThreadID); + } + } while (Thread32Next(snap, &entry)); + + CloseHandle(snap); +} + +void util_set_thread_affinity(DWORD tid) +{ + HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); + if (thread) + { + SetThreadAffinityMask(thread, 1); + CloseHandle(thread); + } +} + void util_pull_messages() { if (g_config.fix_not_responding && From 1bd4493fbe0347065c24f31a400cca96da43c3ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 05:37:27 +0100 Subject: [PATCH 492/557] make sure we set system_affinity before using SetThreadAffinityMask --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 883c1e1..fed3f2e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1826,6 +1826,9 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute { if (!IsWine() && IsWindows11OrGreater()) { + if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) + SetProcessAffinityMask(proc, system_affinity); + util_set_process_affinity(); } else From 2aa998f8525973162afd47f3908cb6593b7dac41 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 08:15:03 +0100 Subject: [PATCH 493/557] add presets for Cloud Kingdom 3 and Commando 2004 --- README.md | 2 ++ src/config.c | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index 6f9007a..7d2f021 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Commandos - Commandos - Beyond The Call Of Duty - Commandos 2 +- Commando 2004 (only with /ddraw command line parameter) - Constructor - Corsairs Gold - Cossacks (Steam+GOG) @@ -140,6 +141,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest - Cydonia Mars - The First Manned Mission +- Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth - Dark Reign: The Future of War - Day Of The Tentacle diff --git a/src/config.c b/src/config.c index b8c7d10..44b8cb1 100644 --- a/src/config.c +++ b/src/config.c @@ -804,6 +804,14 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Cloud Kingdom 3 (only with /ddraw command line parameter)\n" + "[Clouds Kingdom 3]\n" + "fake_mode=320x240x32\n" + "\n" + "; Commando 2004 (only with /ddraw command line parameter)\n" + "[commando]\n" + "fake_mode=320x240x32\n" + "\n" "; Chris Sawyer's Locomotion\n" "[LOCO/2]\n" "checkfile=.\\LOCO.EXE\n" From 883aadd449695d89b176d29e0df7550e28702bee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Dec 2024 08:43:11 +0100 Subject: [PATCH 494/557] remove singlecpu setting from a few presets --- src/config.c | 68 ---------------------------------------------------- 1 file changed, 68 deletions(-) diff --git a/src/config.c b/src/config.c index b8c7d10..b63adba 100644 --- a/src/config.c +++ b/src/config.c @@ -392,7 +392,6 @@ static void cfg_create_ini() "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" - "singlecpu=false\n" "\n" "; Atrox\n" "[Atrox]\n" @@ -430,10 +429,6 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" - "; Abomination - The Nemesis Project\n" - "[abomb]\n" - "singlecpu=false\n" - "\n" "; American Conquest / Cossacks\n" "[DMCR]\n" "resolutions=2\n" @@ -530,10 +525,6 @@ static void cfg_create_ini() "[AN]\n" "adjmouse=true\n" "\n" - "; Another War\n" - "[AnotherWar]\n" - "singlecpu=false\n" - "\n" "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" @@ -652,10 +643,6 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" - "; Championship Manager 99-00\n" - "[cm9900]\n" - "singlecpu=false\n" - "\n" "; Command & Conquer: Sole Survivor\n" "[SOLE]\n" "maxgameticks=120\n" @@ -921,10 +908,6 @@ static void cfg_create_ini() "[dominion]\n" "flipclear=true\n" "\n" - "; Excalibur 2555AD\n" - "[_FISH]\n" - "singlecpu=false\n" - "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" "nonexclusive=true\n" @@ -951,10 +934,6 @@ static void cfg_create_ini() "[f-16]\n" "resolutions=1\n" "\n" - "; Fable\n" - "[FABLE]\n" - "singlecpu=false\n" - "\n" "; Fallout Tactics: Brotherhood of Steel\n" "[BOS/2]\n" "checkfile=.\\binkw32.dll\n" @@ -968,10 +947,6 @@ static void cfg_create_ini() "[FT Tools]\n" "hook_peekmessage=true\n" "\n" - "; Falcon 4.0 (Microprose version)\n" - "[falcon4]\n" - "singlecpu=false\n" - "\n" "; Flight Simulator 98\n" "[FLTSIM95]\n" "flightsim98_hack=true\n" @@ -1038,7 +1013,6 @@ static void cfg_create_ini() "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" - "singlecpu=false\n" "\n" "; Gangsters: Organized Crime\n" "[gangsters]\n" @@ -1280,10 +1254,6 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" - "; Links Extreme\n" - "[EXTREME]\n" - "singlecpu=false\n" - "\n" "; Lost Vikings 2\n" "[LOSTV95]\n" "fake_mode=320x240x16\n" @@ -1291,7 +1261,6 @@ static void cfg_create_ini() "; Nightmare Creatures\n" "[NC]\n" "maxgameticks=30\n" - "singlecpu=false\n" "\n" "; Moto Racer (software mode)\n" "[moto]\n" @@ -1364,10 +1333,6 @@ static void cfg_create_ini() "maxgameticks=60\n" "limiter_type=4\n" "\n" - "; Mission Deliver Kindness\n" - "[MDK95]\n" - "singlecpu=false\n" - "\n" "; New Robinson\n" "[ROBY]\n" "adjmouse=true\n" @@ -1504,10 +1469,6 @@ static void cfg_create_ini() "[Pax Imperia]\n" "nonexclusive=true\n" "\n" - "; Panzer Dragoon\n" - "[PANZERDG]\n" - "singlecpu=false\n" - "\n" "; Play with the Teletubbies\n" "[PlayWTT]\n" "hook=3\n" @@ -1565,35 +1526,22 @@ static void cfg_create_ini() "[RtK]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" - "singlecpu=false\n" "limiter_type=2\n" "game_handles_close=true\n" "maxgameticks=59\n" "anti_aliased_fonts_min_size=99\n" "\n" - "; Rent-A-Hero\n" - "[Rent-A-Hero]\n" - "singlecpu=false\n" - "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" - "; Rising Lands (patched)\n" - "[Rising]\n" - "singlecpu=false\n" - "\n" "; Robin Hood - The Legend of Sherwood (GOG)\n" "[Game/4]\n" "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "fix_not_responding=true\n" "\n" - "; Roland Garros 98 (software mode)\n" - "[rg98]\n" - "singlecpu=false\n" - "\n" "; Robin Hood - The Legend of Sherwood (Steam)\n" "[_rh]\n" "singlecpu=false\n" @@ -1617,7 +1565,6 @@ static void cfg_create_ini() "\n" "; Swarog\n" "[Swarog]\n" - "singlecpu=false\n" "maxfps=60\n" "maxgameticks=60\n" "minfps=-1\n" @@ -1736,10 +1683,6 @@ static void cfg_create_ini() "maxgameticks=30\n" "limiter_type=4\n" "\n" - "; The Curse Of Monkey Island\n" - "[COMI]\n" - "singlecpu=false\n" - "\n" "; The Tone Rebellion\n" "[Float]\n" "hook_peekmessage=true\n" @@ -1759,7 +1702,6 @@ static void cfg_create_ini() "; Virtual Springfield\n" "[VIRTUAL]\n" "game_handles_close=true\n" - "singlecpu=false\n" "\n" "; Total Annihilation: Kingdoms\n" "[Kingdoms]\n" @@ -1771,10 +1713,6 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" - "; The Neverhood\n" - "[nhc]\n" - "singlecpu=false\n" - "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" @@ -1876,10 +1814,6 @@ static void cfg_create_ini() "[WH40K]\n" "maxgameticks=250\n" "\n" - "; Weird War\n" - "[WeirdWar]\n" - "singlecpu=false\n" - "\n" "; Wizardry 8\n" "[Wiz8]\n" "sirtech_hack=true\n" @@ -1906,7 +1840,6 @@ static void cfg_create_ini() "\n" "; Jeff Wayne's 'The War Of The Worlds'\n" "[WoW]\n" - "singlecpu=false\n" "minfps=-1\n" "\n" "; Zeus and Poseidon\n" @@ -1916,7 +1849,6 @@ static void cfg_create_ini() "; Zork Nemesis\n" "[znemesis]\n" "fix_not_responding=true\n" - "singlecpu=false\n" "maxgameticks=60\n" "limiter_type=4\n" "\n" From 8c587b21dd8612200c911917b9ff02722ae41ab3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 04:00:22 +0100 Subject: [PATCH 495/557] add separate file for delayed imports --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 ++++++ inc/delay_imports.h | 21 +++++++++++++++++++++ inc/versionhelpers.h | 1 - src/delay_imports.c | 33 +++++++++++++++++++++++++++++++++ src/dllmain.c | 3 ++- src/versionhelpers.c | 28 +--------------------------- 7 files changed, 65 insertions(+), 29 deletions(-) create mode 100644 inc/delay_imports.h create mode 100644 src/delay_imports.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index a4d025d..3f5d12d 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -27,6 +27,7 @@ + @@ -80,6 +81,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 0f07cb0..b15230e 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -168,6 +168,9 @@ Source Files + + Source Files + @@ -299,6 +302,9 @@ Header Files + + Header Files + diff --git a/inc/delay_imports.h b/inc/delay_imports.h new file mode 100644 index 0000000..19bbc23 --- /dev/null +++ b/inc/delay_imports.h @@ -0,0 +1,21 @@ +#ifndef DELAY_IMPORTS_H +#define DELAY_IMPORTS_H + +#define ThreadQuerySetWin32StartAddress 9 + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); +typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); + +extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; +extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +extern WINE_GET_VERSIONPROC wine_get_version; +extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; + +extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; + +void imports_init(); + +#endif diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index fa542ac..6c4076d 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -33,7 +33,6 @@ #define VerSetConditionMask verhelp_set_mask #endif -void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition); const char* verhelp_wine_get_version(); diff --git a/src/delay_imports.c b/src/delay_imports.c new file mode 100644 index 0000000..3d02969 --- /dev/null +++ b/src/delay_imports.c @@ -0,0 +1,33 @@ +#include +#include "versionhelpers.h" + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); +typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); + +NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; +RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +WINE_GET_VERSIONPROC wine_get_version; +WINE_GET_HOST_VERSIONPROC wine_get_host_version; + +VERSETCONDITIONMASKPROC VerSetConditionMaskProc; + +void imports_init() +{ + HMODULE mod = GetModuleHandleA("ntdll.dll"); + if (mod) + { + NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); + RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); + wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); + wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); + } + + mod = GetModuleHandleA("Kernel32.dll"); + if (mod) + { + VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + } +} diff --git a/src/dllmain.c b/src/dllmain.c index f3f98b1..03a6b5f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -12,6 +12,7 @@ #include "indeo.h" #include "utils.h" #include "versionhelpers.h" +#include "delay_imports.h" #include "keyboard.h" @@ -33,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; - verhelp_init(); + imports_init(); if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 7c19528..9888184 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -1,33 +1,7 @@ #include #include "versionhelpers.h" +#include "delay_imports.h" -typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); -typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); -typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); - -static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -static VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -static WINE_GET_VERSIONPROC wine_get_version; -static WINE_GET_HOST_VERSIONPROC wine_get_host_version; - -/* GetProcAddress is rather slow so we use a function to initialize it once on startup */ -void verhelp_init() -{ - HMODULE mod = GetModuleHandleA("ntdll.dll"); - if (mod) - { - RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); - wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); - wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); - } - - mod = GetModuleHandleA("Kernel32.dll"); - if (mod) - { - VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); - } -} BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) { From 78b2da620a88ae9e0c7214fd1246a58054579207 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 04:01:01 +0100 Subject: [PATCH 496/557] add header --- src/delay_imports.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/delay_imports.c b/src/delay_imports.c index 3d02969..f224784 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -1,11 +1,6 @@ #include #include "versionhelpers.h" - -typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); -typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); -typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); -typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); +#include "delay_imports.h" NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; From 354b688a2c3aea13af0b9888daec350474eb7983 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:20:01 +0100 Subject: [PATCH 497/557] only SetThreadAffinityMask for threads created by local modules --- inc/delay_imports.h | 6 +++++- src/delay_imports.c | 2 ++ src/utils.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/inc/delay_imports.h b/inc/delay_imports.h index 19bbc23..5221ec4 100644 --- a/inc/delay_imports.h +++ b/inc/delay_imports.h @@ -1,20 +1,24 @@ #ifndef DELAY_IMPORTS_H #define DELAY_IMPORTS_H +#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) #define ThreadQuerySetWin32StartAddress 9 typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); -typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULONG, PULONG); +typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); +typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*); + extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; extern WINE_GET_VERSIONPROC wine_get_version; extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; +extern GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; void imports_init(); diff --git a/src/delay_imports.c b/src/delay_imports.c index f224784..9becb1f 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -8,6 +8,7 @@ WINE_GET_VERSIONPROC wine_get_version; WINE_GET_HOST_VERSIONPROC wine_get_host_version; VERSETCONDITIONMASKPROC VerSetConditionMaskProc; +GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; void imports_init() { @@ -24,5 +25,6 @@ void imports_init() if (mod) { VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + GetModuleHandleExAProc = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); } } diff --git a/src/utils.c b/src/utils.c index a6649c4..47bd680 100644 --- a/src/utils.c +++ b/src/utils.c @@ -13,6 +13,7 @@ #include "utils.h" #include "config.h" #include "versionhelpers.h" +#include "delay_imports.h" /* @@ -103,7 +104,49 @@ void util_set_thread_affinity(DWORD tid) HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); if (thread) { - SetThreadAffinityMask(thread, 1); + void* start = NULL; + NTSTATUS status = STATUS_PENDING; + + if (NtQueryInformationThread) + { + status = NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); + } + + if (status == STATUS_SUCCESS && start && GetModuleHandleExAProc) + { + char game_exe_path[MAX_PATH] = { 0 }; + char game_dir[MAX_PATH] = { 0 }; + + if (GetModuleFileNameA(NULL, game_exe_path, sizeof(game_exe_path))) + { + _splitpath(game_exe_path, NULL, game_dir, NULL, NULL); + + char mod_path[MAX_PATH] = { 0 }; + char mod_dir[MAX_PATH] = { 0 }; + char mod_filename[MAX_PATH] = { 0 }; + HMODULE mod = NULL; + + if (GetModuleHandleExAProc( + GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod)) + { + if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path))) + { + _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); + + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + _strcmpi(mod_filename, "WINMM") == 0) + { + SetThreadAffinityMask(thread, 1); + } + } + } + } + } + else + { + SetThreadAffinityMask(thread, 1); + } + CloseHandle(thread); } } From 47a5f893270a58b386f2664a9cbc77f81f3ed52b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:30:03 +0100 Subject: [PATCH 498/557] add delay_ prefix for delayed imports --- inc/delay_imports.h | 14 +++++++------- src/delay_imports.c | 26 +++++++++++++------------- src/dllmain.c | 2 +- src/utils.c | 9 +++++---- src/versionhelpers.c | 12 ++++++------ 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/inc/delay_imports.h b/inc/delay_imports.h index 5221ec4..ba654ed 100644 --- a/inc/delay_imports.h +++ b/inc/delay_imports.h @@ -12,14 +12,14 @@ typedef NTSTATUS(WINAPI* NTQUERYINFORMATIONTHREADPROC)(HANDLE, LONG, PVOID, ULON typedef ULONGLONG(WINAPI* VERSETCONDITIONMASKPROC)(ULONGLONG, DWORD, BYTE); typedef BOOL(WINAPI* GETMODULEHANDLEEXAPROC)(DWORD, LPCSTR, HMODULE*); -extern NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; -extern RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -extern WINE_GET_VERSIONPROC wine_get_version; -extern WINE_GET_HOST_VERSIONPROC wine_get_host_version; +extern NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread; +extern RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo; +extern WINE_GET_VERSIONPROC delay_wine_get_version; +extern WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version; -extern VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -extern GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; +extern VERSETCONDITIONMASKPROC delay_VerSetConditionMask; +extern GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA; -void imports_init(); +void delay_imports_init(); #endif diff --git a/src/delay_imports.c b/src/delay_imports.c index 9becb1f..2b23dda 100644 --- a/src/delay_imports.c +++ b/src/delay_imports.c @@ -2,29 +2,29 @@ #include "versionhelpers.h" #include "delay_imports.h" -NTQUERYINFORMATIONTHREADPROC NtQueryInformationThread; -RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; -WINE_GET_VERSIONPROC wine_get_version; -WINE_GET_HOST_VERSIONPROC wine_get_host_version; +NTQUERYINFORMATIONTHREADPROC delay_NtQueryInformationThread; +RTLVERIFYVERSIONINFOPROC delay_RtlVerifyVersionInfo; +WINE_GET_VERSIONPROC delay_wine_get_version; +WINE_GET_HOST_VERSIONPROC delay_wine_get_host_version; -VERSETCONDITIONMASKPROC VerSetConditionMaskProc; -GETMODULEHANDLEEXAPROC GetModuleHandleExAProc; +VERSETCONDITIONMASKPROC delay_VerSetConditionMask; +GETMODULEHANDLEEXAPROC delay_GetModuleHandleExA; -void imports_init() +void delay_imports_init() { HMODULE mod = GetModuleHandleA("ntdll.dll"); if (mod) { - NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); - RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); - wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); - wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); + delay_NtQueryInformationThread = (NTQUERYINFORMATIONTHREADPROC)GetProcAddress(mod, "NtQueryInformationThread"); + delay_RtlVerifyVersionInfo = (RTLVERIFYVERSIONINFOPROC)GetProcAddress(mod, "RtlVerifyVersionInfo"); + delay_wine_get_version = (WINE_GET_VERSIONPROC)GetProcAddress(mod, "wine_get_version"); + delay_wine_get_host_version = (WINE_GET_HOST_VERSIONPROC)GetProcAddress(mod, "wine_get_host_version"); } mod = GetModuleHandleA("Kernel32.dll"); if (mod) { - VerSetConditionMaskProc = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); - GetModuleHandleExAProc = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); + delay_VerSetConditionMask = (VERSETCONDITIONMASKPROC)GetProcAddress(mod, "VerSetConditionMask"); + delay_GetModuleHandleExA = (GETMODULEHANDLEEXAPROC)GetProcAddress(mod, "GetModuleHandleExA"); } } diff --git a/src/dllmain.c b/src/dllmain.c index 03a6b5f..adbc8c0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -34,7 +34,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; - imports_init(); + delay_imports_init(); if (GetEnvironmentVariable("cnc_ddraw_config_init", NULL, 0)) { diff --git a/src/utils.c b/src/utils.c index 47bd680..8bc0c43 100644 --- a/src/utils.c +++ b/src/utils.c @@ -107,12 +107,13 @@ void util_set_thread_affinity(DWORD tid) void* start = NULL; NTSTATUS status = STATUS_PENDING; - if (NtQueryInformationThread) + if (delay_NtQueryInformationThread) { - status = NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); + status = + delay_NtQueryInformationThread(thread, ThreadQuerySetWin32StartAddress, &start, sizeof(start), NULL); } - if (status == STATUS_SUCCESS && start && GetModuleHandleExAProc) + if (status == STATUS_SUCCESS && start && delay_GetModuleHandleExA) { char game_exe_path[MAX_PATH] = { 0 }; char game_dir[MAX_PATH] = { 0 }; @@ -126,7 +127,7 @@ void util_set_thread_affinity(DWORD tid) char mod_filename[MAX_PATH] = { 0 }; HMODULE mod = NULL; - if (GetModuleHandleExAProc( + if (delay_GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, start, &mod)) { if (GetModuleFileNameA(mod, mod_path, sizeof(mod_path))) diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 9888184..f9f35c2 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -5,26 +5,26 @@ BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) { - return RtlVerifyVersionInfo ? - RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : + return delay_RtlVerifyVersionInfo ? + delay_RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : VerifyVersionInfoW(versionInfo, typeMask, conditionMask); } ULONGLONG verhelp_set_mask(ULONGLONG ConditionMask, DWORD TypeMask, BYTE Condition) { - return VerSetConditionMaskProc ? VerSetConditionMaskProc(ConditionMask, TypeMask, Condition) : 0; + return delay_VerSetConditionMask ? delay_VerSetConditionMask(ConditionMask, TypeMask, Condition) : 0; } const char* verhelp_wine_get_version() { - return wine_get_version ? wine_get_version() : NULL; + return delay_wine_get_version ? delay_wine_get_version() : NULL; } void verhelp_wine_get_host_version(const char** sysname, const char** release) { - if (wine_get_host_version) + if (delay_wine_get_host_version) { - wine_get_host_version(sysname, release); + delay_wine_get_host_version(sysname, release); return; } From e9168a6871dba6e3d38330602cee05e5be68ba2c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Dec 2024 05:38:20 +0100 Subject: [PATCH 499/557] always use delay function --- src/debug.c | 6 ++---- src/utils.c | 35 ++++++++++++++++------------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/debug.c b/src/debug.c index 9d615b5..b030114 100644 --- a/src/debug.c +++ b/src/debug.c @@ -17,6 +17,7 @@ #include "crc32.h" #include "dllmain.h" #include "config.h" +#include "delay_imports.h" double g_dbg_frame_time = 0; @@ -89,10 +90,7 @@ LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) HMODULE mod = NULL; char filename[MAX_PATH] = { 0 }; - BOOL(WINAPI * getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); - - if (getModuleHandleExA && getModuleHandleExA( + if (delay_GetModuleHandleExA && delay_GetModuleHandleExA( GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, exception->ExceptionRecord->ExceptionAddress, &mod)) diff --git a/src/utils.c b/src/utils.c index 8bc0c43..ff89aa6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -264,10 +264,7 @@ FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) BOOL util_caller_is_ddraw_wrapper(void* return_address) { - BOOL (WINAPI *getModuleHandleExA)(DWORD, LPCSTR, HMODULE*) = - (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); - - if (!getModuleHandleExA) + if (!delay_GetModuleHandleExA) return FALSE; void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); @@ -281,9 +278,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE D3dHook_dll = GetModuleHandleA("D3dHook.dll"); if (D3dHook_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == D3dHook_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == D3dHook_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == D3dHook_dll)) { MessageBoxA( NULL, @@ -299,9 +296,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) { MessageBoxA( NULL, @@ -317,9 +314,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); if (windmode_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) { MessageBoxA( NULL, @@ -335,9 +332,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); if (dxwnd_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) { MessageBoxA( NULL, @@ -353,9 +350,9 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE age_dll = GetModuleHandleA("age.dll"); if (age_dll) { - if ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || - (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || - (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) + if ((delay_GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (delay_GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { HKEY hkey; LONG status = From c4ece39e5a4b30830e8dbe8a2b995f588cffaa07 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:27:07 +0100 Subject: [PATCH 500/557] don't set thread affinity for winmm threads since it's causing side-effects --- src/utils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index ff89aa6..3d7651f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -134,8 +134,7 @@ void util_set_thread_affinity(DWORD tid) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || - _strcmpi(mod_filename, "WINMM") == 0) + if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0) // _strcmpi(mod_filename, "WINMM") == 0 { SetThreadAffinityMask(thread, 1); } From ee247794c554fcd8f00ba7d495e8243b2bc50a68 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:30:54 +0100 Subject: [PATCH 501/557] only enable workaround for win 11 24H2 --- inc/versionhelpers.h | 19 +++++++++++++++++++ src/dd.c | 2 +- src/dllmain.c | 2 +- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 6c4076d..36f2dd6 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -60,6 +60,17 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se VER_SERVICEPACKMAJOR, VER_EQUAL)); } +VERSIONHELPERAPI IsWindowsVersionExcactBuild(DWORD major, DWORD minor, DWORD build, WORD servpack) +{ + RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},servpack }; + return verhelp_verify_version(&vi, VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER | VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), + VER_BUILDNUMBER, VER_EQUAL), + VER_SERVICEPACKMAJOR, VER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsVersionAnySP(DWORD major, DWORD minor, DWORD build) { RTL_OSVERSIONINFOEXW vi = { sizeof(vi),major,minor,build,0,{0},0 }; @@ -135,6 +146,10 @@ VERSIONHELPERAPI IsWindows11OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } +VERSIONHELPERAPI IsWindows11Version24H2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); +} + VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); @@ -212,6 +227,10 @@ VERSIONHELPERAPI IsWindows11(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } +VERSIONHELPERAPI IsWindows11Version24H2(void) { + return IsWindowsVersionExcactBuild(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 26100, 0); +} + VERSIONHELPERAPI IsWine(void) { return verhelp_wine_get_version() != NULL; } diff --git a/src/dd.c b/src/dd.c index fed3f2e..1e90def 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1824,7 +1824,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - if (!IsWine() && IsWindows11OrGreater()) + if (!IsWine() && IsWindows11Version24H2()) { if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) SetProcessAffinityMask(proc, system_affinity); diff --git a/src/dllmain.c b/src/dllmain.c index adbc8c0..f4ede20 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -183,7 +183,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_THREAD_ATTACH: { - if (g_config.singlecpu && !IsWine() && IsWindows11OrGreater()) + if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2()) { util_set_thread_affinity(GetCurrentThreadId()); } From 2496cf4ddc0d25b7ee987189582dd6860f011948 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 03:41:45 +0100 Subject: [PATCH 502/557] add presets for Fable and Rising Lands --- src/config.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/config.c b/src/config.c index 7707178..d17035e 100644 --- a/src/config.c +++ b/src/config.c @@ -967,6 +967,11 @@ static void cfg_create_ini() "[mrazik]\n" "guard_lines=0\n" "\n" + "; Fable\n" + "[Fable]\n" + "maxgameticks=59\n" + "limiter_type=4\n" + "\n" "; Final Liberation: Warhammer Epic 40000\n" "[Epic40k]\n" "hook_peekmessage=true\n" @@ -1560,6 +1565,11 @@ static void cfg_create_ini() "singlecpu=false\n" "fix_not_responding=true\n" "\n" + "; Rising Lands\n" + "[Rising]\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" "windowed=true\n" From f014f9406deb14cc71fd09525fa2d77bd1ec1e14 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 05:05:04 +0100 Subject: [PATCH 503/557] center Metal Knight Movies --- src/winapi_hooks.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 88c94fe..2954121 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2058,6 +2058,28 @@ HWND WINAPI fake_CreateWindowExA( Y = pt.y + align_y; } + /* Metal Knight Movies */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3:0:1900011:0") == 0 && + lpWindowName && _strcmpi(lpWindowName, "AVI player") == 0 && + dwStyle == WS_POPUP && + dwExStyle == WS_EX_TOPMOST && + g_ddraw.ref && g_ddraw.hwnd && + g_ddraw.width) + { + dwExStyle = 0; + + POINT pt = { 0, 0 }; + real_ClientToScreen(g_ddraw.hwnd, &pt); + + int added_height = g_ddraw.render.height - g_ddraw.height; + int added_width = g_ddraw.render.width - g_ddraw.width; + int align_y = added_height > 0 ? added_height / 2 : 0; + int align_x = added_width > 0 ? added_width / 2 : 0; + + X += pt.x + align_x; + Y += pt.y + align_y; + } + /* Disney Trivia Challenge */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Disney Trivia Challenge") == 0 && hWndParent && (dwStyle & WS_CHILD)) From d106cf3c6070eae552367cc4a5a7a8035ce83bb1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 08:42:59 +0100 Subject: [PATCH 504/557] fix unreal preset --- src/config.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index d17035e..39bcfda 100644 --- a/src/config.c +++ b/src/config.c @@ -1794,6 +1794,7 @@ static void cfg_create_ini() "adjmouse=false\n" "lock_mouse_top_left=true\n" "center_cursor_fix=true\n" + "noactivateapp=true\n" "\n" "; Uprising\n" "[uprising]\n" @@ -1804,10 +1805,6 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" - "; Unreal\n" - "[Unreal]\n" - "noactivateapp=true\n" - "\n" "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" From b7b60aa908533f89d1a06058e897f33ec472f77c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Jan 2025 23:13:40 +0100 Subject: [PATCH 505/557] #373 fix double screenshot issue --- src/keyboard.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/keyboard.c b/src/keyboard.c index 2ca9fbb..f54ba63 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -86,9 +86,22 @@ LRESULT CALLBACK keyboard_hook_proc(int code, WPARAM wParam, LPARAM lParam) return 1; } - if (wParam == g_config.hotkeys.screenshot && key_released) + if (wParam == g_config.hotkeys.screenshot) { - ss_take_screenshot(g_ddraw.primary); + // VK_SNAPSHOT does not have a KEYDOWN event... + if (g_config.hotkeys.screenshot == VK_SNAPSHOT) + { + if (key_released) + { + ss_take_screenshot(g_ddraw.primary); + return 1; + } + } + else if (key_triggered) + { + ss_take_screenshot(g_ddraw.primary); + return 1; + } } if (wParam == g_config.hotkeys.unlock_cursor1 || wParam == VK_CONTROL) From 7df6a4e47b7fc90c03dcf81d57ec77e6ea98a204 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:04:50 +0100 Subject: [PATCH 506/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7d2f021..82e0727 100644 --- a/README.md +++ b/README.md @@ -377,6 +377,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Silver (needs "SilverUK GeForce2 And Radeon Patch") - Sim City 3000 - Sim Copter +- SimTunes - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc - Simon the Sorcerer 1/2 (windows 95 version) From ed8584129dccc1d7f50b35d123a5fc0b5295a6f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:22:03 +0100 Subject: [PATCH 507/557] add new .ini setting "terminate_process" --- inc/config.h | 1 + src/config.c | 2 ++ src/dllmain.c | 3 +++ src/wndproc.c | 3 +++ 4 files changed, 9 insertions(+) diff --git a/inc/config.h b/inc/config.h index d1600d5..a353aa8 100644 --- a/inc/config.h +++ b/inc/config.h @@ -80,6 +80,7 @@ typedef struct CNCDDRAWCONFIG BOOL limit_gdi_handles; BOOL remove_menu; int refresh_rate; + int terminate_process; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 39bcfda..f9cf3e2 100644 --- a/src/config.c +++ b/src/config.c @@ -93,6 +93,7 @@ void cfg_load() GET_BOOL(g_config.limit_gdi_handles, "limit_gdi_handles", FALSE); GET_BOOL(g_config.remove_menu, "remove_menu", FALSE); GET_INT(g_config.refresh_rate, "refresh_rate", 0); + GET_BOOL(g_config.terminate_process, "terminate_process", FALSE); /* Hotkeys */ @@ -336,6 +337,7 @@ static void cfg_create_ini() "limit_gdi_handles=false\n" "remove_menu=false\n" "refresh_rate=0\n" + "terminate_process=false\n" "\n" "\n" "\n" diff --git a/src/dllmain.c b/src/dllmain.c index f4ede20..5e71859 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -179,6 +179,9 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (g_dbg_exception_handle && remove_handler) remove_handler(g_dbg_exception_handle); + if (g_config.terminate_process == 2) + TerminateProcess(GetCurrentProcess(), 0); + break; } case DLL_THREAD_ATTACH: diff --git a/src/wndproc.c b/src/wndproc.c index cbc0c07..3555058 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -620,6 +620,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { + if (g_config.terminate_process) + g_config.terminate_process = 2; + ExitProcess(0); //_exit(0); } From 7edf2c35b31cd412e36ca7abdec009e9c51209a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:25:55 +0100 Subject: [PATCH 508/557] add preset for 101: The Airborne Invasion of Normandy and SimTunes --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index f9cf3e2..290b22b 100644 --- a/src/config.c +++ b/src/config.c @@ -391,6 +391,10 @@ static void cfg_create_ini() "; The following settings override all settings shown above, section name = executable name\n" "\n" "\n" + "; 101: The Airborne Invasion of Normandy\n" + "[101]\n" + "terminate_process=true" + "\n" "; 7th Legion\n" "[legion]\n" "maxgameticks=25\n" @@ -1683,6 +1687,10 @@ static void cfg_create_ini() "minfps=-2\n" "maxgameticks=60" "\n" + "; SimTunes\n" + "[SIMTUNES]\n" + "terminate_process=true" + "\n" "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" From ef440dfa24e4a1ecee676f3cd8258559576d809a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:39:36 +0100 Subject: [PATCH 509/557] update SimTunes preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 290b22b..f2265fe 100644 --- a/src/config.c +++ b/src/config.c @@ -1690,6 +1690,7 @@ static void cfg_create_ini() "; SimTunes\n" "[SIMTUNES]\n" "terminate_process=true" + "hook=3" "\n" "; Shadow Watch\n" "[sw]\n" From b1e34677c92234da3c96af49368a85d5deadd4d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:43:21 +0100 Subject: [PATCH 510/557] fix line breaks in .ini file --- src/config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index f2265fe..5c97ad6 100644 --- a/src/config.c +++ b/src/config.c @@ -393,7 +393,7 @@ static void cfg_create_ini() "\n" "; 101: The Airborne Invasion of Normandy\n" "[101]\n" - "terminate_process=true" + "terminate_process=true\n" "\n" "; 7th Legion\n" "[legion]\n" @@ -1689,8 +1689,8 @@ static void cfg_create_ini() "\n" "; SimTunes\n" "[SIMTUNES]\n" - "terminate_process=true" - "hook=3" + "terminate_process=true\n" + "hook=3\n" "\n" "; Shadow Watch\n" "[sw]\n" From ff0251a318d16bc87f717339e1c1043612684bc4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 01:46:17 +0100 Subject: [PATCH 511/557] fix some more line breaks --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 5c97ad6..bfb9183 100644 --- a/src/config.c +++ b/src/config.c @@ -1685,7 +1685,7 @@ static void cfg_create_ini() "; Sim City 3000\n" "[SC3]\n" "minfps=-2\n" - "maxgameticks=60" + "maxgameticks=60\n" "\n" "; SimTunes\n" "[SIMTUNES]\n" @@ -1695,7 +1695,7 @@ static void cfg_create_ini() "; Shadow Watch\n" "[sw]\n" "adjmouse=true\n" - "maxgameticks=30" + "maxgameticks=30\n" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From 5cfbf45e960d91c9cc9a7735edc59e9efe2bda8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 03:02:03 +0100 Subject: [PATCH 512/557] add preset for Virtual On: Cyber Troopers --- README.md | 1 + src/config.c | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/README.md b/README.md index 82e0727..ac52bf9 100644 --- a/README.md +++ b/README.md @@ -140,6 +140,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest +- Virtual On: Cyber Troopers - Cydonia Mars - The First Manned Mission - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth diff --git a/src/config.c b/src/config.c index bfb9183..135507c 100644 --- a/src/config.c +++ b/src/config.c @@ -1825,6 +1825,13 @@ static void cfg_create_ini() "[VF2]\n" "fake_mode=640x480x8\n" "\n" + "; Virtual On: Cyber Troopers\n" + "[V_ON]\n" + "devmode=true\n" + "windowed=true\n" + "fullscreen=true\n" + "toggle_borderless=true\n" + "\n" "; Wall Street Trader 2000 - NOT WORKING YET\n" "[WSTrader]\n" "nonexclusive=false\n" From 62603dc479547595c01c877751a47e64bf460202 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 03:11:15 +0100 Subject: [PATCH 513/557] update readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ac52bf9..e770d43 100644 --- a/README.md +++ b/README.md @@ -140,7 +140,6 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cyber Gladiators (needs CyberGladiators_Patch_Win_EN_WinXP.zip) - Cyberchase Carnival Chaos - Cyberchase Castleblanca Quest -- Virtual On: Cyber Troopers - Cydonia Mars - The First Manned Mission - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth @@ -452,6 +451,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Virtua Fighter 2 - Virtua Fighter PC - Virtual Springfield +- Virtual On: Cyber Troopers - WarGames - War Wind - War Wind II - Human Onslaught From aadd8496d1f6b3548362f891553eac07fe0a6f55 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 Jan 2025 23:57:16 +0100 Subject: [PATCH 514/557] update presets --- src/config.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 135507c..bd0c91b 100644 --- a/src/config.c +++ b/src/config.c @@ -1692,8 +1692,15 @@ static void cfg_create_ini() "terminate_process=true\n" "hook=3\n" "\n" + "; Street Wars: Constructor Underworld\n" + "[Sw]\n" + "checkfile=.\\smackw32.dll\n" + "maxgameticks=30\n" + "limiter_type=4\n" + "\n" "; Shadow Watch\n" - "[sw]\n" + "[sw/2]\n" + "checkfile=.\\Dx.dll\n" "adjmouse=true\n" "maxgameticks=30\n" "\n" From cbaa29ec7ea8206c4590a94c7d1e965964ec22fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 3 Jan 2025 00:07:31 +0100 Subject: [PATCH 515/557] update preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index bd0c91b..6fe6a73 100644 --- a/src/config.c +++ b/src/config.c @@ -1703,6 +1703,7 @@ static void cfg_create_ini() "checkfile=.\\Dx.dll\n" "adjmouse=true\n" "maxgameticks=30\n" + "hook_peekmessage=true\n" "\n" "; Shadow Flare\n" "[ShadowFlare]\n" From 47b2bee09a477af49475113afd317ae82926e7b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 08:57:13 +0100 Subject: [PATCH 516/557] update lpDDEmulCaps --- src/dd.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dd.c b/src/dd.c index 1e90def..23b58b6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -518,6 +518,7 @@ HRESULT dd_GetCaps(LPDDCAPS_DX1 lpDDDriverCaps, LPDDCAPS_DX1 lpDDEmulCaps) memset(lpDDEmulCaps, 0, size); lpDDEmulCaps->dwSize = size; + lpDDEmulCaps->dwCaps = DDCAPS_BLTSTRETCH; } return DD_OK; From 99a43a468c0996cc979837b2cf1d8eb26e7b3267 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 10:14:29 +0100 Subject: [PATCH 517/557] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e770d43..33875a4 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt +- Broken Sword 2: The Smoking Mirror - Caesar III (Sierra - 1998) - Call To Power 2 - Callus 95 - CPS-1 (Capcom Play System 1) emulator @@ -162,6 +163,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Divine Divinity - Dominion - Storm Over Gift 3 - Doom 95 +- Dracula - Dragon Throne: Battle of Red Cliffs - Dreams to Realty - DuelSavior From 825614fb548bc39801ea6a2f2a5ff378fc7b15a7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Jan 2025 10:14:40 +0100 Subject: [PATCH 518/557] update close combat presets --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 6fe6a73..8e470c2 100644 --- a/src/config.c +++ b/src/config.c @@ -820,21 +820,29 @@ static void cfg_create_ini() "\n" "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" + "maxgameticks=60\n" + "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" From 920e9c458aa435ed8f458cc5ac9a0e53e581a2e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Jan 2025 04:20:34 +0100 Subject: [PATCH 519/557] add testing code for AVIWnd32 --- src/winapi_hooks.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2954121..970c7e0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1113,12 +1113,36 @@ BOOL WINAPI fake_StretchBlt( else if ( g_ddraw.width > 0 && g_ddraw.render.hdc && - (hwnd == g_ddraw.hwnd || (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT))) + (hwnd == g_ddraw.hwnd || + (real_GetWindowLongA(hwnd, GWL_EXSTYLE) & WS_EX_TRANSPARENT) || + strcmp(class_name, "AVIWnd32") == 0)) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + + if (hwnd != g_ddraw.hwnd && strcmp(class_name, "AVIWnd32") == 0) + { + LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); + if (!(exstyle & WS_EX_TRANSPARENT)) + { + real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); + + real_SetWindowPos( + hwnd, + 0, + 0, + 0, + 0, + 0, + SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + ); + } + } + return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, - (int)(roundf(xDest * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, - (int)(roundf(yDest * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf((xDest + pt.x) * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf((yDest + pt.y) * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, (int)(roundf(wDest * g_ddraw.render.scale_w)), (int)(roundf(hDest * g_ddraw.render.scale_h)), hdcSrc, From bd0b628dd66f83df42eb969086a8b31cbb43bd3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Jan 2025 08:05:09 +0100 Subject: [PATCH 520/557] add test preset for Men In Black --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 8e470c2..11db305 100644 --- a/src/config.c +++ b/src/config.c @@ -1351,6 +1351,11 @@ static void cfg_create_ini() "[Mech3]\n" "nonexclusive=true\n" "\n" + "; Men In Black - NOT WORKING YET\n" + "[MIB]\n" + "renderer=gdi\n" + "hook=2\n" + "\n" "; Moorhuhn 2\n" "[Moorhuhn2]\n" "fix_alt_key_stuck=true\n" From d017b6860780233546629a94e933af1a98e5763f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Jan 2025 05:26:09 +0100 Subject: [PATCH 521/557] Update Close Combat presets --- src/config.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 11db305..950fa8c 100644 --- a/src/config.c +++ b/src/config.c @@ -820,28 +820,29 @@ static void cfg_create_ini() "\n" "; Close Combat 2: A Bridge Too Far\n" "[cc2]\n" - "maxgameticks=60\n" - "limiter_type=2\n" + "maxgameticks=20\n" + "limiter_type=4\n" + "minfps=15\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 3: The Russian Front\n" "[cc3]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 4: The Battle of the Bulge\n" "[cc4]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" "\n" "; Close Combat 5: Invasion: Normandy\n" "[cc5]\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "limiter_type=2\n" "adjmouse=true\n" "nonexclusive=true\n" From 45af838174fa69677b6b16617ad1383013280033 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 Jan 2025 13:45:11 +0100 Subject: [PATCH 522/557] center cnc-ddraw config to primary screen --- config/ConfigFormUnit.dfm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index a34dc9f..4f108df 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2677,7 +2677,7 @@ object ConfigForm: TConfigForm 61C0650530766087F0B9DE67A1EF3B173173597F3B695CC608E0B202F8FC22D7 BBBF4CD8CBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCBB88CCB B88CB18EFF1FA2974C1C31AF16A40000000049454E44AE426082} - Position = poDesktopCenter + Position = poScreenCenter OnActivate = FormActivate OnCreate = FormCreate DesignSize = ( From edae0183ae1fb1bbc1510459e71794e54ce0a09f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 02:42:21 +0100 Subject: [PATCH 523/557] add preset for Meat Puppet --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 950fa8c..228484c 100644 --- a/src/config.c +++ b/src/config.c @@ -1348,6 +1348,10 @@ static void cfg_create_ini() "[MajestyHD - Old]\n" "adjmouse=true\n" "\n" + "; Meat Puppet\n" + "[meat]\n" + "hook_peekmessage=true\n" + "\n" "; Mech Warrior 3\n" "[Mech3]\n" "nonexclusive=true\n" From af634df78ab4411dac209058ff0d3f321ac94070 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 02:42:30 +0100 Subject: [PATCH 524/557] update supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 33875a4..0b59da4 100644 --- a/README.md +++ b/README.md @@ -96,6 +96,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Blood II - The Chosen - Blue's 123 Time Activities - Blue's Treasure Hunt +- Broken Sword - Broken Sword 2: The Smoking Mirror - Caesar III (Sierra - 1998) - Call To Power 2 @@ -268,6 +269,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Majesty Gold - Majesty Gold HD - Mario Sorb 3 +- Meat Puppet - Mech Warrior 3 - Megaman X4 - Metal Gear Solid From 209703d9767a6bc12b9a2e642cba7f269c4ba349 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 04:34:42 +0100 Subject: [PATCH 525/557] remove old hook=2 checks --- src/winapi_hooks.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 970c7e0..c0705f7 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -976,12 +976,12 @@ int WINAPI fake_GetDeviceCaps(HDC hdc, int index) bpp = strtoul(e + 1, &e, 0); } - if (bpp && index == BITSPIXEL && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp && index == BITSPIXEL) { return bpp; } - if (bpp == 8 && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + if (bpp == 8) { if (index == RASTERCAPS) { From a1dcb4c04025158aae55c71b94c52cfeeb53716a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 7 Jan 2025 04:37:45 +0100 Subject: [PATCH 526/557] update Men In Black preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 228484c..95b73c7 100644 --- a/src/config.c +++ b/src/config.c @@ -1358,7 +1358,6 @@ static void cfg_create_ini() "\n" "; Men In Black - NOT WORKING YET\n" "[MIB]\n" - "renderer=gdi\n" "hook=2\n" "\n" "; Moorhuhn 2\n" From 870353254deb2f59d7cbfcfcbcdb446676df03d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 Jan 2025 04:43:24 +0100 Subject: [PATCH 527/557] update Heroes of Might and Magic II preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 95b73c7..01ba2e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1092,6 +1092,7 @@ static void cfg_create_ini() "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" + "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III\n" "[Heroes3]\n" From ac07df92409004e06986645eb63d26c96f8c1eb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 04:17:01 +0100 Subject: [PATCH 528/557] update chinese translation --- config/ConfigFormUnit.cpp | 61 ++++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 02723d7..f03d8c1 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -132,31 +132,31 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"cnc-ddraw 配置"; DisplayBtn->Caption = L"显示设置"; AdvancedBtn->Caption = L"高级设置"; - HotkeyBtn->Caption = L"热键设置"; + HotkeyBtn->Caption = L"快捷键设置"; CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; - PresentationLbl->Caption = L"显示方式"; - MaintasLbl->Caption = L"保持纵横比"; - VsyncLbl->Caption = L"打开垂直同步"; + PresentationLbl->Caption = L"演示"; + MaintasLbl->Caption = L"保持宽高比"; + VsyncLbl->Caption = L"启用垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; - DevmodeLbl->Caption = L"锁定光标到窗口/屏幕"; + DevmodeLbl->Caption = L"将光标锁定到窗口/屏幕"; RendererLbl->Caption = L"渲染器"; BorderLbl->Caption = L"在窗口模式下显示窗口边框"; SavesettingsLbl->Caption = L"记住窗口位置和大小"; - ShaderLbl->Caption = L"OpenGL着色器"; - MaxfpsLbl->Caption = L"限制帧率"; - BoxingLbl->Caption = L"打开窗盒显示/整数缩放"; + ShaderLbl->Caption = L"OpenGL 着色器"; + MaxfpsLbl->Caption = L"限制帧速率"; + BoxingLbl->Caption = L"启用窗口框/整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor2Lbl->Caption = L"解锁光标 2"; - ScreenshotLbl->Caption = L"截屏"; - MaxgameticksLbl->Caption = L"限制游戏速率"; - NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; - ResolutionsLbl->Caption = L"解锁其他屏幕分辨率"; - MinfpsLbl->Caption = L"强制高FPS / 修复使用Freesync/G-Sync的卡顿问题"; - SinglecpuLbl->Caption = L"修复性能不佳和声音问题"; - NonexclusiveLbl->Caption = L"修复不显示的视频/UI元素"; + ScreenshotLbl->Caption = L"截图"; + MaxgameticksLbl->Caption = L"限制游戏速度"; + NoactivateappLbl->Caption = L"修复 Alt+Tab 错误"; + ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; + MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; + SinglecpuLbl->Caption = L"修复性能和声音问题"; + NonexclusiveLbl->Caption = L"修复不可见的视频/UI 元素"; RendererCbx->Items->Clear(); RendererCbx->AddItem(L"自动", NULL); @@ -166,32 +166,33 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"全屏", NULL); - PresentationCbx->AddItem(L"拉伸至全屏", NULL); + PresentationCbx->AddItem(L"全屏放大", NULL); PresentationCbx->AddItem(L"无边框", NULL); - PresentationCbx->AddItem(L"窗口化", NULL); + PresentationCbx->AddItem(L"窗口", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"无限制", NULL); MaxgameticksCbx->AddItem(L"与显示器刷新率同步", NULL); - MaxgameticksCbx->AddItem(L"模拟60hz刷新率显示器", NULL); - MaxgameticksCbx->AddItem(L"1000tick每秒", NULL); - MaxgameticksCbx->AddItem(L"500tick每秒", NULL); - MaxgameticksCbx->AddItem(L"250tick每秒", NULL); - MaxgameticksCbx->AddItem(L"125tick每秒", NULL); - MaxgameticksCbx->AddItem(L"60tick每秒", NULL); - MaxgameticksCbx->AddItem(L"30tick每秒", NULL); - MaxgameticksCbx->AddItem(L"25tick每秒", NULL); - MaxgameticksCbx->AddItem(L"15tick每秒", NULL); + MaxgameticksCbx->AddItem(L"模拟 60hz 刷新率显示器", NULL); + MaxgameticksCbx->AddItem(L"1000 次每秒", NULL); + MaxgameticksCbx->AddItem(L"500 次每秒", NULL); + MaxgameticksCbx->AddItem(L"250 次每秒", NULL); + MaxgameticksCbx->AddItem(L"125 次每秒", NULL); + MaxgameticksCbx->AddItem(L"60 次每秒", NULL); + MaxgameticksCbx->AddItem(L"30 次每秒", NULL); + MaxgameticksCbx->AddItem(L"25 次每秒", NULL); + MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"某些着色器仅在打开放大功能时生效。\n\n"; + L"一些着色器只有在启用放大时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须打开放大功能才能使此设置生效。\n\n"; + L"必须启用放大才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要打开放大功能,请将显示方式设置为‘无边框’或‘拉伸至全屏’。\n" - "对于‘窗口化’显示方式,您必须调整窗口大小或最大化窗口。"; + L"要启用放大,请将演示设置为“无边框” \n" + "或“全屏放大”。对于“窗口”演示, \n" + "你必须调整或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From ce91df2bedb1e082bd85bc7364528349ddd0938c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 04:47:19 +0100 Subject: [PATCH 529/557] update chinese translation --- config/ConfigFormUnit.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f03d8c1..250c256 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -135,7 +135,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) HotkeyBtn->Caption = L"快捷键设置"; CompatibilityBtn->Caption = L"兼容性设置"; RestoreDefaultsBtn->Caption = L"恢复默认设置"; - PresentationLbl->Caption = L"演示"; + PresentationLbl->Caption = L"显示方式"; MaintasLbl->Caption = L"保持宽高比"; VsyncLbl->Caption = L"启用垂直同步"; AdjmouseLbl->Caption = L"调整鼠标灵敏度"; @@ -145,18 +145,18 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"记住窗口位置和大小"; ShaderLbl->Caption = L"OpenGL 着色器"; MaxfpsLbl->Caption = L"限制帧速率"; - BoxingLbl->Caption = L"启用窗口框/整数缩放"; + BoxingLbl->Caption = L"启用窗框显示/整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; UnlockCursor2Lbl->Caption = L"解锁光标 2"; ScreenshotLbl->Caption = L"截图"; MaxgameticksLbl->Caption = L"限制游戏速度"; - NoactivateappLbl->Caption = L"修复 Alt+Tab 错误"; + NoactivateappLbl->Caption = L"修复损坏的Alt+Tab功能"; ResolutionsLbl->Caption = L"解锁额外的屏幕分辨率"; MinfpsLbl->Caption = L"强制高 FPS / 修复 Freesync/G-Sync 卡顿"; - SinglecpuLbl->Caption = L"修复性能和声音问题"; - NonexclusiveLbl->Caption = L"修复不可见的视频/UI 元素"; + SinglecpuLbl->Caption = L"修复低性能和声音问题"; + NonexclusiveLbl->Caption = L"修复不显示的视频/UI 元素"; RendererCbx->Items->Clear(); RendererCbx->AddItem(L"自动", NULL); @@ -166,9 +166,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"全屏", NULL); - PresentationCbx->AddItem(L"全屏放大", NULL); + PresentationCbx->AddItem(L"拉伸至全屏", NULL); PresentationCbx->AddItem(L"无边框", NULL); - PresentationCbx->AddItem(L"窗口", NULL); + PresentationCbx->AddItem(L"窗口化", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"无限制", NULL); From a46da149de5a831796d0b91dc70117d264f7bbc1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 07:14:33 +0100 Subject: [PATCH 530/557] make sure build is still compatible with older versions of windows --- src/utils.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/utils.c b/src/utils.c index 3d7651f..fafd4ed 100644 --- a/src/utils.c +++ b/src/utils.c @@ -75,6 +75,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) void util_set_process_affinity() { +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); if (snap == INVALID_HANDLE_VALUE) return; @@ -97,10 +98,12 @@ void util_set_process_affinity() } while (Thread32Next(snap, &entry)); CloseHandle(snap); +#endif } void util_set_thread_affinity(DWORD tid) { +#if (_WIN32_WINNT >= _WIN32_WINNT_WINXP) HANDLE thread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, FALSE, tid); if (thread) { @@ -149,6 +152,7 @@ void util_set_thread_affinity(DWORD tid) CloseHandle(thread); } +#endif } void util_pull_messages() From 50ac66d06830a64d0ff0b4a733c58b2fcbf2b134 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Jan 2025 08:37:41 +0100 Subject: [PATCH 531/557] update chinese translation --- config/ConfigFormUnit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 250c256..18f267c 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -145,7 +145,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) SavesettingsLbl->Caption = L"记住窗口位置和大小"; ShaderLbl->Caption = L"OpenGL 着色器"; MaxfpsLbl->Caption = L"限制帧速率"; - BoxingLbl->Caption = L"启用窗框显示/整数缩放"; + BoxingLbl->Caption = L"启用整数缩放"; ToggleWindowedLbl->Caption = L"切换窗口模式"; MaximizeWindowLbl->Caption = L"最大化窗口"; UnlockCursor1Lbl->Caption = L"解锁光标 1"; @@ -184,15 +184,15 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"一些着色器只有在启用放大时才有效。\n\n"; + L"一些着色器只有在启用缩放时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须启用放大才能使此设置生效。\n\n"; + L"必须启用缩放才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用放大,请将演示设置为“无边框” \n" - "或“全屏放大”。对于“窗口”演示, \n" - "你必须调整或最大化窗口。"; + L"要启用缩放,请将显示方式设置为“无边框” \n" + "或“拉伸至全屏”。对于“窗口化”, \n" + "你必须调整窗口大小或将窗口开启最大化。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 6a7e862258af2a162dc59e73b4bf5d78ae52b0c9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 06:28:14 +0100 Subject: [PATCH 532/557] update HOMM2 preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 01ba2e5..d6b4c78 100644 --- a/src/config.c +++ b/src/config.c @@ -1092,6 +1092,7 @@ static void cfg_create_ini() "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" + "game_handles_close=true\n" "keytogglefullscreen2=0x73\n" "\n" "; Heroes of Might and Magic III\n" From 4fdbfa61e22395e85509ff09e297bdb47851eaee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 07:10:53 +0100 Subject: [PATCH 533/557] set g_config.toggle_borderless to TRUE on failure --- src/dd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dd.c b/src/dd.c index 23b58b6..0e58170 100644 --- a/src/dd.c +++ b/src/dd.c @@ -890,6 +890,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ @@ -1253,6 +1254,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } @@ -1269,6 +1271,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; + g_config.toggle_borderless = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } } From 03760a3570dd0cc827195d6080afa6da5f12b21a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 09:31:03 +0100 Subject: [PATCH 534/557] add preset for JA2 Vengeance Reloaded mod German exe --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index d6b4c78..864b10b 100644 --- a/src/config.c +++ b/src/config.c @@ -1194,6 +1194,12 @@ static void cfg_create_ini() "sirtech_hack=true\n" "fix_alt_key_stuck=true\n" "\n" + "; Jagged Alliance 2 - Vengeance Reloaded mod German exe\n" + "[JA2_Vengeance_DE]\n" + "singlecpu=false\n" + "sirtech_hack=true\n" + "fix_alt_key_stuck=true\n" + "\n" "; Jeopardy! - NOT WORKING YET\n" "[jeoppc]\n" "singlecpu=false\n" From 86b4ec05c4e2eec404c5b903b1af9c1a88528deb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Jan 2025 10:26:51 +0100 Subject: [PATCH 535/557] update chinese translation --- config/ConfigFormUnit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 18f267c..e203af5 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -184,13 +184,13 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 次每秒", NULL); System::UnicodeString shaderHint = - L"一些着色器只有在启用缩放时才有效。\n\n"; + L"一些着色器只有在启用放大时才有效。\n\n"; System::UnicodeString upscaleHint = - L"必须启用缩放才能使此设置生效。\n\n"; + L"必须启用放大才能使此设置生效。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用缩放,请将显示方式设置为“无边框” \n" + L"要启用放大,请将显示方式设置为“无边框” \n" "或“拉伸至全屏”。对于“窗口化”, \n" "你必须调整窗口大小或将窗口开启最大化。"; From a753a857879eb0c46c199e9bd60b195ba17bb5fe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:09:08 +0100 Subject: [PATCH 536/557] #364 allow to use custom shaders with HD 4000 for some games at least --- src/render_ogl.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index cf85022..d1ac27e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,8 +253,17 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - shader_path[0] = 0; - g_config.shader[0] = 0; + /* First time compiling the shader works, second time fails */ + static BOOL once; + if (!once) + { + once = TRUE; + } + else + { + shader_path[0] = 0; + g_config.shader[0] = 0; + } } /* detect common upscaling shaders and disable them if no upscaling is required */ From f4b97bac8f3f05fc03f521296241334a1e758dda Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:37:15 +0100 Subject: [PATCH 537/557] Revert "#364 allow to use custom shaders with HD 4000 for some games at least" This reverts commit a753a857879eb0c46c199e9bd60b195ba17bb5fe. --- src/render_ogl.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index d1ac27e..cf85022 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,17 +253,8 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - /* First time compiling the shader works, second time fails */ - static BOOL once; - if (!once) - { - once = TRUE; - } - else - { - shader_path[0] = 0; - g_config.shader[0] = 0; - } + shader_path[0] = 0; + g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From 1dc51c072c81367d640d22bec251fb474167ee74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 08:37:52 +0100 Subject: [PATCH 538/557] #380 disable Intel HD 4000 workaround for now --- src/render_ogl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index cf85022..aae1d34 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -253,8 +253,8 @@ static void ogl_build_programs() if (_stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.4252") == 0 || _stricmp(g_oglu_version_long, "4.0.0 - Build 10.18.10.5161") == 0) { - shader_path[0] = 0; - g_config.shader[0] = 0; + //shader_path[0] = 0; + //g_config.shader[0] = 0; } /* detect common upscaling shaders and disable them if no upscaling is required */ From e11cc2f0d33845f7c5b7420aed4565606ba85158 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Jan 2025 09:31:16 +0100 Subject: [PATCH 539/557] Enable low FPS fix for newer versions of windows as well --- src/dd.c | 2 +- src/dllmain.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 0e58170..b9e5b12 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1828,7 +1828,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.singlecpu) { - if (!IsWine() && IsWindows11Version24H2()) + if (!IsWine() && IsWindows11Version24H2OrGreater()) { if (GetProcessAffinityMask(proc, &proc_affinity, &system_affinity)) SetProcessAffinityMask(proc, system_affinity); diff --git a/src/dllmain.c b/src/dllmain.c index 5e71859..8832177 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -186,7 +186,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } case DLL_THREAD_ATTACH: { - if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2()) + if (g_config.singlecpu && !IsWine() && IsWindows11Version24H2OrGreater()) { util_set_thread_affinity(GetCurrentThreadId()); } From dd7602b1d35f0d48e9c0803361e0a91383bbaa8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 08:31:20 +0100 Subject: [PATCH 540/557] #102 add polish translation by WaRzillA --- config/ConfigFormUnit.cpp | 87 +++++++++++++++++++++++++++ config/Resources/pl.png | Bin 0 -> 374 bytes config/cnc-ddraw config.cbproj | 12 +++- config/cnc-ddraw config_resources.rc | 1 + src/config.c | 2 +- 5 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 config/Resources/pl.png diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index e203af5..97e9c2c 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -774,6 +774,87 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) BoxingLbl->Hint = upscaleHint + enableUpscaleHint; BoxingChk->Hint = upscaleHint + enableUpscaleHint; } + else if (lang == "polish" || (lang == "auto" && priID == LANG_POLISH)) { + LanguageImg->Visible = true; + + /* -polish - made by WaRzillA @ github */ + + ConfigForm->Caption = L"Konfiguracja cnc-ddraw"; + DisplayBtn->Caption = L"Ustawienia wyświetlania"; + AdvancedBtn->Caption = L"Zaawansowane ustawienia"; + HotkeyBtn->Caption = L"Ustawienia skrótów klawiszowych"; + CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; + RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; + PresentationLbl->Caption = L"Prezentacja"; + MaintasLbl->Caption = L"Zachowaj proporcje obrazu"; + VsyncLbl->Caption = L"Włącz VSync"; + AdjmouseLbl->Caption = L"Dostosuj czułość myszy"; + DevmodeLbl->Caption = L"Zablokuj kursor w oknie/na ekranie"; + RendererLbl->Caption = L"Silnik renderowania"; + BorderLbl->Caption = L"Pokaż ramki okna w trybie okienkowym"; + SavesettingsLbl->Caption = L"Zapamiętaj pozycję i rozmiar okna"; + ShaderLbl->Caption = L"Shader OpenGL"; + MaxfpsLbl->Caption = L"Ogranicz liczbę klatek na sekundę"; + BoxingLbl->Caption = L"Włącz windowboxing / integer scaling "; + ToggleWindowedLbl->Caption = L"Przełącz na tryb okienkowy"; + MaximizeWindowLbl->Caption = L"Maksymalizuj okno"; + UnlockCursor1Lbl->Caption = L"Odblokuj kursor 1"; + UnlockCursor2Lbl->Caption = L"Odblokuj kursor 2"; + ScreenshotLbl->Caption = L"Zrzut ekranu"; + MaxgameticksLbl->Caption = L"Ogranicz prędkość gry"; + NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab"; + ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu"; + MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie na Freesync/G-Sync"; + SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem"; + NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu"; + + RendererCbx->Items->Clear(); + RendererCbx->AddItem(L"Automatyczny", NULL); + RendererCbx->AddItem(L"Direct3D 9", NULL); + RendererCbx->AddItem(L"OpenGL", NULL); + RendererCbx->AddItem(L"GDI", NULL); + + PresentationCbx->Items->Clear(); + PresentationCbx->AddItem(L"Pełny ekran", NULL); + PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL); + PresentationCbx->AddItem(L"Bezramkowy", NULL); + PresentationCbx->AddItem(L"Okienkowy", NULL); + + MaxgameticksCbx->Items->Clear(); + MaxgameticksCbx->AddItem(L"Bez limitu", NULL); + MaxgameticksCbx->AddItem(L"Synchronizacja z odświeżaniem monitora", NULL); + MaxgameticksCbx->AddItem(L"Symulacja monitora 60 Hz", NULL); + MaxgameticksCbx->AddItem(L"1000 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"500 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"250 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"125 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"60 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"30 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"25 tików na sekundę", NULL); + MaxgameticksCbx->AddItem(L"15 tików na sekundę", NULL); + + System::UnicodeString shaderHint = + L"Niektóre shadery działają tylko wtedy, gdy włączone jest skalowanie. \n\n"; + + System::UnicodeString upscaleHint = + L"Skalowanie musi być włączone, aby ta opcja działała. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Aby włączyć skalowanie, ustaw prezentację na tryb 'Bezramkowy' \n" + "lub 'Pełny ekran z upscalingiem'. Dla prezentacji 'Okienkowy' \n" + "musisz zmienić rozmiar lub zmaksymalizować okno."; + + ShaderLbl->Hint = shaderHint + enableUpscaleHint; + ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; + ShaderCbx->Hint = shaderHint + enableUpscaleHint; + + MaintasLbl->Hint = upscaleHint + enableUpscaleHint; + MaintasChk->Hint = upscaleHint + enableUpscaleHint; + AdjmouseLbl->Hint = upscaleHint + enableUpscaleHint; + AdjmouseChk->Hint = upscaleHint + enableUpscaleHint; + BoxingLbl->Hint = upscaleHint + enableUpscaleHint; + BoxingChk->Hint = upscaleHint + enableUpscaleHint; + } else { IsEnglish = true; @@ -826,6 +907,12 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) LanguageImg->Picture->Graphic = png; LanguageImg->Visible = true; } + else if (priID == LANG_POLISH) { + TPngImage *png = new TPngImage(); + png->LoadFromResourceName((int)HInstance, "PngImage_PL"); + LanguageImg->Picture->Graphic = png; + LanguageImg->Visible = true; + } } catch (...) { } diff --git a/config/Resources/pl.png b/config/Resources/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d413d010b5b097c4e0a4604eba86dad79567ed16 GIT binary patch literal 374 zcmV-+0g3*JP)Ab?mv3iQ8Nu5A{|6C_|Nk>HFfjc`0biay0|+1% z2B@O{$c+Ek03##gzdwHf0*Hl3)etG5lK=vU1?W~rxN0!OqXDP`Ab?mH`1u+7`u;zA z_W#cxhChG)!_n{G|9=A+zrl>(AX#bYe+w4^1Q6Is4VEzI_51&? zUm!LT$@u9L&^Z7B1a=Zw2xL66B2?87%l|Mi00a<712fnG3~)u5+Wr7F{AKw27w8;- z00L=X`u&GNQW9*;Uxq&*os3{386YGO{rw9;K*az7#P}5)xp2gQ%0-g`0)PMm0MPYZ UsK>Njp#T5?07*qoM6N<$g4HXSwg3PC literal 0 HcmV?d00001 diff --git a/config/cnc-ddraw config.cbproj b/config/cnc-ddraw config.cbproj index b2de346..7792b8b 100644 --- a/config/cnc-ddraw config.cbproj +++ b/config/cnc-ddraw config.cbproj @@ -227,6 +227,10 @@ RCDATA PngImage_IT + + RCDATA + PngImage_PL + RCDATA PngImage_RU @@ -364,7 +368,7 @@ - cnc-ddraw_config.exe + cnc-ddraw config.exe true @@ -430,6 +434,12 @@ true + + + .\ + true + + 1 diff --git a/config/cnc-ddraw config_resources.rc b/config/cnc-ddraw config_resources.rc index 9d29fa1..b077d3a 100644 --- a/config/cnc-ddraw config_resources.rc +++ b/config/cnc-ddraw config_resources.rc @@ -4,6 +4,7 @@ PngImage_ES RCDATA "Resources\\ES.png" PngImage_FR RCDATA "Resources\\fr.png" PngImage_HU RCDATA "Resources\\hu.png" PngImage_IT RCDATA "Resources\\IT.png" +PngImage_PL RCDATA "Resources\\pl.png" PngImage_RU RCDATA "Resources\\RU.png" PngImage_US RCDATA "Resources\\US.png" PngImage_VN RCDATA "Resources\\VN.png" diff --git a/src/config.c b/src/config.c index 864b10b..d624aa9 100644 --- a/src/config.c +++ b/src/config.c @@ -373,7 +373,7 @@ static void cfg_create_ini() "; The following settings are for cnc-ddraw config.exe\n" "\n" "\n" - "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese\n" + "; cnc-ddraw config program language, possible values: auto, english, chinese, german, spanish, russian, hungarian, french, italian, vietnamese, polish\n" "configlang=auto\n" "\n" "; cnc-ddraw config program theme, possible values: Windows10, Cobalt XEMedia\n" From c37f5b42843e5611c9c820e8c58cd9c3f483d456 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 08:37:39 +0100 Subject: [PATCH 541/557] update polish translation --- config/ConfigFormUnit.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 97e9c2c..2dfee0d 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -781,8 +781,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) ConfigForm->Caption = L"Konfiguracja cnc-ddraw"; DisplayBtn->Caption = L"Ustawienia wyświetlania"; - AdvancedBtn->Caption = L"Zaawansowane ustawienia"; - HotkeyBtn->Caption = L"Ustawienia skrótów klawiszowych"; + AdvancedBtn->Caption = L"Ustawienia zaawansowane"; + HotkeyBtn->Caption = L"Skróty klawiaturowe"; CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; PresentationLbl->Caption = L"Prezentacja"; From 3115122074cbc4c0f43c24bba336b9c8f0729b58 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 Jan 2025 09:46:48 +0100 Subject: [PATCH 542/557] update polish translation --- config/ConfigFormUnit.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 2dfee0d..7cad46f 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -785,7 +785,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) HotkeyBtn->Caption = L"Skróty klawiaturowe"; CompatibilityBtn->Caption = L"Ustawienia kompatybilności"; RestoreDefaultsBtn->Caption = L"Przywróć ustawienia domyślne"; - PresentationLbl->Caption = L"Prezentacja"; + PresentationLbl->Caption = L"Tryb wyświetlania"; MaintasLbl->Caption = L"Zachowaj proporcje obrazu"; VsyncLbl->Caption = L"Włącz VSync"; AdjmouseLbl->Caption = L"Dostosuj czułość myszy"; @@ -804,7 +804,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksLbl->Caption = L"Ogranicz prędkość gry"; NoactivateappLbl->Caption = L"Napraw nieprawidłowe działanie Alt+Tab"; ResolutionsLbl->Caption = L"Odblokuj dodatkowe rozdzielczości ekranu"; - MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie na Freesync/G-Sync"; + MinfpsLbl->Caption = L"Wymuś wysokie FPS / Napraw zacinanie Freesync/G-Sync"; SinglecpuLbl->Caption = L"Napraw problemy z wydajnością i dźwiękiem"; NonexclusiveLbl->Caption = L"Napraw niewidoczne filmy / elementy interfejsu"; @@ -817,8 +817,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) PresentationCbx->Items->Clear(); PresentationCbx->AddItem(L"Pełny ekran", NULL); PresentationCbx->AddItem(L"Pełny ekran z upscalingiem", NULL); - PresentationCbx->AddItem(L"Bezramkowy", NULL); - PresentationCbx->AddItem(L"Okienkowy", NULL); + PresentationCbx->AddItem(L"Tryb bezramkowy", NULL); + PresentationCbx->AddItem(L"Tryb okienkowy", NULL); MaxgameticksCbx->Items->Clear(); MaxgameticksCbx->AddItem(L"Bez limitu", NULL); @@ -840,8 +840,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Skalowanie musi być włączone, aby ta opcja działała. \n\n"; System::UnicodeString enableUpscaleHint = - L"Aby włączyć skalowanie, ustaw prezentację na tryb 'Bezramkowy' \n" - "lub 'Pełny ekran z upscalingiem'. Dla prezentacji 'Okienkowy' \n" + L"Aby włączyć skalowanie, ustaw tryb wyświetlania na 'Tryb bezramkowy' \n" + "lub 'Pełny ekran z upscalingiem'. Dla 'Tryb okienkowy' \n" "musisz zmienić rozmiar lub zmaksymalizować okno."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; From d45f35ab57eed27174c4f755043a6485961c7eab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 04:47:38 +0100 Subject: [PATCH 543/557] #382 Fix colorkey issues in Sanitarium --- src/ddsurface.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 4fd92c1..8d68052 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -909,6 +909,11 @@ HRESULT dds_GetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl** lp HRESULT dds_GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { + if (!(This->flags & DDSD_CKSRCBLT)) + { + return DDERR_NOCOLORKEY; + } + if (dwFlags != DDCKEY_SRCBLT || !lpColorKey) { TRACE(" NOT_IMPLEMENTED dwFlags=%08X, lpColorKey=%p\n", dwFlags, lpColorKey); From f4325a73f52b731750a301e02a0ea13c5ac9fa05 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:44:12 +0100 Subject: [PATCH 544/557] #383 add support for Dark Colony --- build.cmd | 2 +- inc/config.h | 1 + inc/dllmain.h | 1 + src/config.c | 6 ++++++ src/dllmain.c | 5 +++++ src/winapi_hooks.c | 8 ++++++++ 6 files changed, 22 insertions(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 801abe4..8f1fdbb 100644 --- a/build.cmd +++ b/build.cmd @@ -9,7 +9,7 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% -make clean + make _WIN32_WINNT=0x0400 pause diff --git a/inc/config.h b/inc/config.h index a353aa8..e15bece 100644 --- a/inc/config.h +++ b/inc/config.h @@ -106,6 +106,7 @@ typedef struct CNCDDRAWCONFIG BOOL carma95_hack; BOOL sirtech_hack; BOOL flightsim98_hack; + BOOL darkcolony_hack; } CNCDDRAWCONFIG; diff --git a/inc/dllmain.h b/inc/dllmain.h index f7e028b..13039f8 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -31,6 +31,7 @@ typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) #define SetThreadExecutionState(a) +#define DisableProcessWindowsGhosting() #endif #endif diff --git a/src/config.c b/src/config.c index d624aa9..51e0814 100644 --- a/src/config.c +++ b/src/config.c @@ -116,6 +116,7 @@ void cfg_load() GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GET_BOOL(g_config.sirtech_hack, "sirtech_hack", FALSE); GET_BOOL(g_config.flightsim98_hack, "flightsim98_hack", FALSE); + GET_BOOL(g_config.darkcolony_hack, "darkcolony_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -874,6 +875,11 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; Dark Colony\n" + "[dc16]\n" + "maxgameticks=30\n" + "darkcolony_hack=true\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" diff --git a/src/dllmain.c b/src/dllmain.c index 8832177..e596372 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -57,6 +57,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } + if (g_config.darkcolony_hack) + { + DisableProcessWindowsGhosting(); + } + char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c0705f7..c44cd3a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -2046,6 +2046,14 @@ HWND WINAPI fake_CreateWindowExA( dwStyle &= ~WS_POPUP; } + /* Dark Colony */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Merc Direct Draw Driver") == 0 && + lpWindowName && _strcmpi(lpWindowName, "Direct Draw Driver") == 0 && + !dwExStyle) + { + dwExStyle |= WS_EX_APPWINDOW; + } + /* Fallout 1/2 */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "GNW95 Class") == 0 && lpWindowName && strstr(lpWindowName, "FALLOUT")) From 49a0758602016de1d347c41f9a6b1dcfc5d91cf3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:44:25 +0100 Subject: [PATCH 545/557] revert change --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 8f1fdbb..801abe4 100644 --- a/build.cmd +++ b/build.cmd @@ -9,7 +9,7 @@ set GIT6=C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\ set PATH=C:\w64devkit\bin;%GIT1%;%GIT2%;%GIT3%;%GIT4%;%GIT5%;%GIT6%;%PATH% - +make clean make _WIN32_WINNT=0x0400 pause From 8841285ba9eb188551824b00eb64f5d5f5a39df7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 05:49:54 +0100 Subject: [PATCH 546/557] update Dark Colony preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 51e0814..a34d0eb 100644 --- a/src/config.c +++ b/src/config.c @@ -879,6 +879,7 @@ static void cfg_create_ini() "[dc16]\n" "maxgameticks=30\n" "darkcolony_hack=true\n" + "hook_peekmessage=true\n" "\n" "; Divine Divinity\n" "[div]\n" From ab2d86f983ecd8f7d015b66ff51834250ace95ed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 Jan 2025 06:29:04 +0100 Subject: [PATCH 547/557] don't use DisableProcessWindowsGhosting, it got too bad side-effects --- inc/dllmain.h | 1 - src/dllmain.c | 5 ----- src/winapi_hooks.c | 8 ++++++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/inc/dllmain.h b/inc/dllmain.h index 13039f8..f7e028b 100644 --- a/inc/dllmain.h +++ b/inc/dllmain.h @@ -31,7 +31,6 @@ typedef BOOL(__stdcall* SETPROCESSDPIAWARENESSCONTEXTPROC)(DPI_AWARENESS_CONTEXT #if (_WIN32_WINNT < _WIN32_WINNT_WINXP) #define SetThreadExecutionState(a) -#define DisableProcessWindowsGhosting() #endif #endif diff --git a/src/dllmain.c b/src/dllmain.c index e596372..8832177 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -57,11 +57,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) g_dbg_exception_handle = add_handler(1, (PVECTORED_EXCEPTION_HANDLER)dbg_vectored_exception_handler); } - if (g_config.darkcolony_hack) - { - DisableProcessWindowsGhosting(); - } - char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c44cd3a..33655c1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -780,6 +780,14 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { + if (g_config.darkcolony_hack && !hWnd) + { + hWnd = g_ddraw.hwnd; + + MSG msg; + real_PeekMessageA(&msg, 0, 0, 0, PM_NOREMOVE); + } + if (g_config.limiter_type == LIMIT_PEEKMESSAGE && g_ddraw.ticks_limiter.tick_length > 0 && InterlockedExchange(&g_ddraw.render.screen_updated, FALSE)) From cd080f10c4691ea9cb70f3de5b316d335c2802ba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:39:46 +0100 Subject: [PATCH 548/557] add preset for Seven Games of the Soul --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a34d0eb..7a14730 100644 --- a/src/config.c +++ b/src/config.c @@ -1619,6 +1619,10 @@ static void cfg_create_ini() "fake_mode=352x240x32\n" "fix_not_responding=true\n" "\n" + "; Seven Games of the Soul\n" + "[faust]\n" + "maxgameticks=25\n" + "\n" "; Swarog\n" "[Swarog]\n" "maxfps=60\n" From dff8fc52f1db5b397c744ec977b89bd67296d083 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:41:08 +0100 Subject: [PATCH 549/557] update Atlantis preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 7a14730..21b3cfb 100644 --- a/src/config.c +++ b/src/config.c @@ -535,7 +535,7 @@ static void cfg_create_ini() "; Atlantis\n" "[ATLANTIS]\n" "renderer=opengl\n" - "maxgameticks=60\n" + "maxgameticks=30\n" "center_cursor_fix=true\n" "\n" "; Airline Tycoon Deluxe\n" From e4b0fc3f9dfc7a4a7280134cd51b2ca4a62d7a62 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Jan 2025 13:55:11 +0100 Subject: [PATCH 550/557] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0b59da4..5e6875b 100644 --- a/README.md +++ b/README.md @@ -201,6 +201,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Full Throttle - Future Cop L.A.P.D - G-Police +- Gateway (Remake) - Geneforge - Gilbert Goodmate And The Mushroom Of Phungoria - Gorasul: The Legacy of the Dragon From 30e6010a8875f7e1081733cb06ef27f68c9b0394 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 Jan 2025 08:53:59 +0100 Subject: [PATCH 551/557] revert "disable Vsync checkbox in case we are in borderelss or windowed mode to avoid unnecessary input lag" --- config/ConfigFormUnit.cpp | 34 ---------------------------------- config/ConfigFormUnit.h | 1 - 2 files changed, 35 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 7cad46f..7d40a88 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include "ConfigFormUnit.h" //--------------------------------------------------------------------------- #pragma package(smart_init) @@ -1286,11 +1285,6 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) delete ini; - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - Initialized = true; } @@ -1712,31 +1706,8 @@ bool TConfigForm::GetBool(TIniFile *ini, System::UnicodeString key, bool defValu return s == "true" || s == "yes" || s == "1"; } -bool TConfigForm::VsyncAllowed() -{ - if (GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "wine_get_version")) { - return true; - } - - if (!IsWindows8OrGreater()) { - return true; - } - - if (NonexclusiveChk->State == tssOff && - (PresentationCbx->ItemIndex == 0 || PresentationCbx->ItemIndex == 1)) { - return true; - } - - return false; -} - void __fastcall TConfigForm::PresentationCbxChange(TObject *Sender) { - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - SaveSettings(); } @@ -1845,11 +1816,6 @@ void __fastcall TConfigForm::SinglecpuChkClick(TObject *Sender) void __fastcall TConfigForm::NonexclusiveChkClick(TObject *Sender) { - VsyncChk->Enabled = VsyncAllowed(); - if (!VsyncChk->Enabled) { - VsyncChk->State = tssOff; - } - SaveSettings(); } diff --git a/config/ConfigFormUnit.h b/config/ConfigFormUnit.h index 8a46bf8..8a8a14c 100644 --- a/config/ConfigFormUnit.h +++ b/config/ConfigFormUnit.h @@ -118,7 +118,6 @@ private: // Benutzer-Deklarationen virtual void __fastcall CreateParams(TCreateParams & Params); void SaveSettings(); bool GetBool(TIniFile *ini, System::UnicodeString key, bool defValue); - bool VsyncAllowed(); void ApplyTranslation(TIniFile *ini); System::UnicodeString GetKeyText(WORD key); WORD GetKeyCode(System::UnicodeString text); From 14336e8d39a0361491bcfd50e3dc9d50d26bbacc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 05:32:07 +0100 Subject: [PATCH 552/557] add guard lines on both on top and bottom of the buffer --- src/ddsurface.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8d68052..c6d3350 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,17 +1553,17 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); + DWORD map_offset = dst_surface->pitch * g_config.guard_lines; + dst_surface->mapping = CreateFileMappingA( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, - bmp_size + 256, + bmp_size + 256 + map_offset, NULL); - DWORD map_offset = 0; - if (dst_surface->mapping) { LPVOID data = MapViewOfFile(dst_surface->mapping, FILE_MAP_ALL_ACCESS, 0, 0, 0); From 3467a05eaa145783feb513499665b3f591fadfa7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:23:29 +0100 Subject: [PATCH 553/557] add preset for Arcatera the Dark Brotherhood --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 21b3cfb..43e34c0 100644 --- a/src/config.c +++ b/src/config.c @@ -404,6 +404,12 @@ static void cfg_create_ini() "[Atrox]\n" "nonexclusive=true\n" "\n" + "; Arcatera the Dark Brotherhood\n" + "[darksun]\n" + "maxgameticks=60\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" "; Atomic Bomberman\n" "[BM]\n" "maxgameticks=60\n" From f6d105bb9ec4caa551522b7771cf3962805ff706 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:29:39 +0100 Subject: [PATCH 554/557] add preset for Dark Secret of Africa --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 43e34c0..36b756a 100644 --- a/src/config.c +++ b/src/config.c @@ -902,6 +902,12 @@ static void cfg_create_ini() "noactivateapp=true\n" "limiter_type=2\n" "\n" + "; Dark Secret of Africa\n" + "[Game/5]\n" + "checkfile=.\\CONFIG.CFG\n" + "maxfps=60\n" + "minfps=-1\n" + "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" "maxgameticks=60\n" From 2c2fd7feb687c8d0fd9b39411c08b829db6b3c46 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 06:29:50 +0100 Subject: [PATCH 555/557] update supported games list --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5e6875b..7485601 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Another War - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arcatera the Dark Brotherhood - Army Men 2 - Army Men: Air Tactics - Army Men: Toys in Space @@ -146,6 +147,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Cloud Kingdom 3 (only with /ddraw command line parameter) - Dark Earth - Dark Reign: The Future of War +- Dark Secret of Africa - Day Of The Tentacle - Daytona - Daytona USA (Sega - 1996) @@ -422,6 +424,7 @@ Wine (Linux/macOS/Android) only: override `ddraw` in [winecfg](https://wiki.wine - Sudden Strike 2 - Superbike 2000 - Swarog +- The Jungle Book Groove Party - The Curse Of Monkey Island - The Dig - The Last Express From 6ec7c0c701e17bd3737d976d86bdb39cf7192ed7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 08:03:09 +0100 Subject: [PATCH 556/557] add workaround for CreateDIBSection offset bug --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c6d3350..e52b3fb 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,7 +1553,7 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); - DWORD map_offset = dst_surface->pitch * g_config.guard_lines; + DWORD map_offset = 65280; // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); dst_surface->mapping = CreateFileMappingA( From 33f2b91c9915ae886f7c8847bfb907cf0fb5b649 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Jan 2025 09:27:26 +0100 Subject: [PATCH 557/557] tweak workaound for CreateDIBSection offset bug --- src/ddsurface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index e52b3fb..96d69de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1553,7 +1553,8 @@ HRESULT dd_CreateSurface( if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); - DWORD map_offset = 65280; // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); + // CreateDIBSection cannot handle values higher than a WORD - 0xFF00 (guard lines); + DWORD map_offset = min(65280, dst_surface->pitch * g_config.guard_lines); dst_surface->mapping = CreateFileMappingA(