From b4b3e95832b16ae7bfeff8c12170f29508ed6e85 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 00:51:53 +0200 Subject: [PATCH 0001/1053] dvd movie tests --- src/utils.c | 1 + src/winapi_hooks.c | 24 +++++++++--------------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8477297..596e0bf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -473,6 +473,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) { LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f795b27..28783e6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -738,9 +738,11 @@ BOOL WINAPI fake_StretchBlt( (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "Afx:400000:3") == 0 || + strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + if (0)//g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { HDC primary_dc; dds_GetDC(g_ddraw->primary, &primary_dc); @@ -1190,22 +1192,14 @@ 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) { - /* Center Claw DVD movies */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw && g_ddraw->hwnd && g_ddraw->width && + /* Claw DVD movies */ + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && + g_ddraw && g_ddraw->hwnd && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { - 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; + dwStyle &= ~WS_POPUP; + LoadLibraryA("quartz.dll"); + hook_init(FALSE); } /* Fix for SMACKW32.DLL creating another window that steals the focus */ From 453d266d7640444f619af09e0e357ed9c8f19aed Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 01:50:58 +0200 Subject: [PATCH 0002/1053] add temporary game patches for testing --- src/dllmain.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/dllmain.c b/src/dllmain.c index ff55417..945ee6b 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -9,6 +9,7 @@ #include "debug.h" #include "config.h" #include "hook.h" +#include "patch.h" /* export for cncnet cnc games */ @@ -38,6 +39,56 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #endif g_ddraw_module = hDll; + + + /* Claw DVD Movie experiments */ + + /* change file extension .vob to .avi */ + HMODULE game_exe = GetModuleHandleA(NULL); + + PIMAGE_DOS_HEADER dos_hdr = (void*)game_exe; + PIMAGE_NT_HEADERS nt_hdr = (void*)((char*)game_exe + dos_hdr->e_lfanew); + + for (int i = 0; i < nt_hdr->FileHeader.NumberOfSections; i++) + { + PIMAGE_SECTION_HEADER sct_hdr = IMAGE_FIRST_SECTION(nt_hdr) + i; + + if (strcmp(".data", (char*)sct_hdr->Name) == 0) + { + char* s = (char*)((char*)game_exe + sct_hdr->VirtualAddress); + int s_len = sct_hdr->Misc.VirtualSize; + + for (int i = 0; i < s_len; i++, s++) + { + if (*s == '.' && memcmp(s, "\x2E\x76\x6F\x62\x00", 5) == 0) /* .vob */ + { + memcpy(s, "\x2E\x61\x76\x69", 4); /* .avi */ + } + } + + break; + } + sct_hdr++; + } + + /* add registry key for x264vfw */ + + HKEY hkey; + LONG status = + RegOpenKeyExA( + HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0L, KEY_WRITE, &hkey); + + if (status == ERROR_SUCCESS) + { + LPCTSTR data = "x264vfw.dll"; + RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, data, strlen(data)+1); + RegCloseKey(hkey); + } + + + + + char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) From a119eddd5358119a2ee0375c952641527cdd12fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 02:27:00 +0200 Subject: [PATCH 0003/1053] adjust default settings for claw --- src/config.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index cb8b656..c736c97 100644 --- a/src/config.c +++ b/src/config.c @@ -167,10 +167,10 @@ static void cfg_create_ini() "\n" "; Override the width/height settings shown above and always stretch to fullscreen\n" "; Note: Can be combined with 'windowed=true' to get windowed-fullscreen aka borderless mode\n" - "fullscreen=false\n" + "fullscreen=true\n" "\n" "; Run in windowed mode rather than going fullscreen\n" - "windowed=false\n" + "windowed=true\n" "\n" "; Maintain aspect ratio\n" "maintas=false\n" @@ -201,7 +201,7 @@ static void cfg_create_ini() "posY=-32000\n" "\n" "; Renderer, possible values: auto, opengl, openglcore, gdi, direct3d9, direct3d9on12 (auto = try direct3d9/opengl, fallback = gdi)\n" - "renderer=auto\n" + "renderer=opengl\n" "\n" "; Developer mode (don't lock the cursor)\n" "devmode=false\n" @@ -227,7 +227,7 @@ static void cfg_create_ini() "screenshotdir=.\\Screenshots\\\n" "\n" "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" - "toggle_borderless=false\n" + "toggle_borderless=true\n" "\n" "\n" "\n" @@ -236,7 +236,7 @@ static void cfg_create_ini() "\n" "\n" "; Hide WM_ACTIVATEAPP and WM_NCACTIVATE messages to prevent problems on alt+tab\n" - "noactivateapp=false\n" + "noactivateapp=true\n" "\n" "; Max game ticks per second, possible values: -1 = disabled, -2 = refresh rate, 0 = emulate 60hz vblank, 1-1000 = custom game speed\n" "; Note: Can be used to slow down a too fast running game, fix flickering or too fast animations\n" @@ -249,11 +249,11 @@ 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" - "singlecpu=true\n" + "singlecpu=false\n" "\n" "; Available 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" From e5fb4a061a81c9c9493dae386a85cd818f97ab90 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 04:49:02 +0200 Subject: [PATCH 0004/1053] fix upscaling on win10 --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 28783e6..3f9da2c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1199,6 +1199,7 @@ HWND WINAPI fake_CreateWindowExA( { dwStyle &= ~WS_POPUP; LoadLibraryA("quartz.dll"); + LoadLibraryA("MSVFW32.dll"); hook_init(FALSE); } From e414568af49421252a37c572c1ff2ab1de8430a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 04:50:12 +0200 Subject: [PATCH 0005/1053] fix color issues --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index a1e3407..a73fa41 100644 --- a/src/hook.c +++ b/src/hook.c @@ -124,7 +124,7 @@ HOOKLIST g_hook_hooklist[] = { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + //{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } From 2cf14bf2eff52bdde9ac4af383d7adaad18fb25c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 06:16:45 +0200 Subject: [PATCH 0006/1053] fix random freezing --- src/utils.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/utils.c b/src/utils.c index 596e0bf..af11859 100644 --- a/src/utils.c +++ b/src/utils.c @@ -481,16 +481,6 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (!(style & WS_EX_TRANSPARENT)) { real_SetWindowLongA(hwnd, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); - - real_SetWindowPos( - hwnd, - 0, - 0, - 0, - 0, - 0, - SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER - ); } } else From 4d8181099cb4c1361637ddee6176361393bc50ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 06:50:48 +0200 Subject: [PATCH 0007/1053] don't lock on WM_PAINT --- src/wndproc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 96cf44e..961f33d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -854,9 +854,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - EnterCriticalSection(&g_ddraw->cs); ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); break; } case WM_ERASEBKGND: From b85ee1674fc7b62aa47c0e67b40806beb343f96e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 06:54:12 +0200 Subject: [PATCH 0008/1053] fix possible deadlock --- src/utils.c | 2 +- src/wndproc.c | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8477297..5aeadd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -488,7 +488,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) 0, 0, 0, - SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + SWP_ASYNCWINDOWPOS | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER ); } } diff --git a/src/wndproc.c b/src/wndproc.c index 96cf44e..961f33d 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -854,9 +854,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - EnterCriticalSection(&g_ddraw->cs); ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); break; } case WM_ERASEBKGND: From c8c7ead36ed4d8ed0ac7f0184da0433842e24f2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 07:18:41 +0200 Subject: [PATCH 0009/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 510cf80..5276877 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 7 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From 68bd087cf0e6b58084a365780a500e9f8819021b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 10:02:01 +0200 Subject: [PATCH 0010/1053] re-enable hook --- src/hook.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index a73fa41..a1e3407 100644 --- a/src/hook.c +++ b/src/hook.c @@ -124,7 +124,7 @@ HOOKLIST g_hook_hooklist[] = { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, - //{ "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } From 3ad8a5bd0e2bd8d8c1414dd34f23974787434782 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 10:41:20 +0200 Subject: [PATCH 0011/1053] add new hook flag for local hooks --- inc/hook.h | 5 +++-- src/hook.c | 64 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 908c832..1663f99 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -5,7 +5,8 @@ #include -#define SKIP_HOOK2 0x00000001l +#define HOOK_SKIP_2 0x00000001l +#define HOOK_LOCAL_ONLY 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; @@ -109,7 +110,7 @@ extern HOOKLIST g_hook_hooklist[]; void hook_init(BOOL initial_hook); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); void hook_create(HOOKLIST* hooks, BOOL initial_hook); void hook_revert(HOOKLIST* hooks); diff --git a/src/hook.c b/src/hook.c index a1e3407..4aa653d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -98,33 +98,33 @@ HOOKLIST g_hook_hooklist[] = { "ole32.dll", { - { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 }, + { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput.dll", { - { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 }, - //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, - { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 }, + { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, HOOK_SKIP_2 }, + //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, HOOK_SKIP_2 }, + { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput8.dll", { - { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 }, + { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "gdi32.dll", { - { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, - { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, - { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, + { "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 }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } @@ -133,12 +133,12 @@ HOOKLIST g_hook_hooklist[] = { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 }, - { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 }, - { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 }, - { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 }, - { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, SKIP_HOOK2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 }, + { "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 }, + { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, @@ -160,10 +160,10 @@ void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function strncpy(hooks[0].module_name, module_name, sizeof(hooks[0].module_name) - 1); strncpy(hooks[0].data[0].function_name, function_name, sizeof(hooks[0].data[0].function_name) - 1); - hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks); + hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks, FALSE); } -void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -212,6 +212,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!hooks[i].data[x].new_function || !org_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -268,9 +271,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) } } -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { - hook_patch_obfuscated_iat_list(hmod, unhook, hooks); + hook_patch_obfuscated_iat_list(hmod, unhook, hooks, is_local); if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -317,6 +320,9 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!unhook && !hooks[i].data[x].new_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -415,7 +421,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -470,12 +476,14 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "Shw32") == 0) continue; - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, FALSE, hooks); + hook_patch_iat_list(hmod, FALSE, hooks, is_local); } } } @@ -487,7 +495,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks, TRUE); } } @@ -500,7 +508,7 @@ void hook_revert(HOOKLIST* hooks) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -544,12 +552,14 @@ void hook_revert(HOOKLIST* hooks) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, TRUE, hooks); + hook_patch_iat_list(hmod, TRUE, hooks, is_local); } } } @@ -561,7 +571,7 @@ void hook_revert(HOOKLIST* hooks) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks, TRUE); } } From e7867e1cd375a8de798202d66d11242194e87271 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 10:41:20 +0200 Subject: [PATCH 0012/1053] add new hook flag for local hooks --- inc/hook.h | 5 +++-- src/hook.c | 64 +++++++++++++++++++++++++++++++----------------------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 908c832..1663f99 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -5,7 +5,8 @@ #include -#define SKIP_HOOK2 0x00000001l +#define HOOK_SKIP_2 0x00000001l +#define HOOK_LOCAL_ONLY 0x00000002l typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; @@ -109,7 +110,7 @@ extern HOOKLIST g_hook_hooklist[]; void hook_init(BOOL initial_hook); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks); +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); void hook_create(HOOKLIST* hooks, BOOL initial_hook); void hook_revert(HOOKLIST* hooks); diff --git a/src/hook.c b/src/hook.c index a1e3407..4aa653d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -98,33 +98,33 @@ HOOKLIST g_hook_hooklist[] = { "ole32.dll", { - { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, SKIP_HOOK2 }, + { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput.dll", { - { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, SKIP_HOOK2 }, - //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, SKIP_HOOK2 }, - { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, SKIP_HOOK2 }, + { "DirectInputCreateA", (PROC)fake_DirectInputCreateA, (PROC*)&real_DirectInputCreateA, HOOK_SKIP_2 }, + //{ "DirectInputCreateW", (PROC)fake_DirectInputCreateW, (PROC*)&real_DirectInputCreateW, HOOK_SKIP_2 }, + { "DirectInputCreateEx", (PROC)fake_DirectInputCreateEx, (PROC*)&real_DirectInputCreateEx, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "dinput8.dll", { - { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, SKIP_HOOK2 }, + { "DirectInput8Create", (PROC)fake_DirectInput8Create, (PROC*)&real_DirectInput8Create, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, { "gdi32.dll", { - { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, SKIP_HOOK2 }, - { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, SKIP_HOOK2 }, - { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, SKIP_HOOK2 }, - { "GetDeviceCaps", (PROC)fake_GetDeviceCaps, (PROC*)&real_GetDeviceCaps, 0 }, + { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, + { "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 }, { "CreateFontA", (PROC)fake_CreateFontA, (PROC*)&real_CreateFontA, 0 }, { "CreateFontIndirectA", (PROC)fake_CreateFontIndirectA, (PROC*)&real_CreateFontIndirectA, 0 }, { "", NULL, NULL, 0 } @@ -133,12 +133,12 @@ HOOKLIST g_hook_hooklist[] = { "kernel32.dll", { - { "LoadLibraryA", (PROC)fake_LoadLibraryA, (PROC*)&real_LoadLibraryA, SKIP_HOOK2 }, - { "LoadLibraryW", (PROC)fake_LoadLibraryW, (PROC*)&real_LoadLibraryW, SKIP_HOOK2 }, - { "LoadLibraryExA", (PROC)fake_LoadLibraryExA, (PROC*)&real_LoadLibraryExA, SKIP_HOOK2 }, - { "LoadLibraryExW", (PROC)fake_LoadLibraryExW, (PROC*)&real_LoadLibraryExW, SKIP_HOOK2 }, - { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, SKIP_HOOK2 }, - { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, SKIP_HOOK2 }, + { "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 }, + { "GetProcAddress", (PROC)fake_GetProcAddress, (PROC*)&real_GetProcAddress, HOOK_SKIP_2 }, + { "GetDiskFreeSpaceA", (PROC)fake_GetDiskFreeSpaceA, (PROC*)&real_GetDiskFreeSpaceA, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } }, @@ -160,10 +160,10 @@ void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function strncpy(hooks[0].module_name, module_name, sizeof(hooks[0].module_name) - 1); strncpy(hooks[0].data[0].function_name, function_name, sizeof(hooks[0].data[0].function_name) - 1); - hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks); + hook_patch_iat_list(hmod, unhook, (HOOKLIST*)&hooks, FALSE); } -void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -212,6 +212,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!hooks[i].data[x].new_function || !org_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (unhook) { if (first_thunk->u1.Function == (DWORD)hooks[i].data[x].new_function) @@ -268,9 +271,9 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) } } -void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) +void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local) { - hook_patch_obfuscated_iat_list(hmod, unhook, hooks); + hook_patch_obfuscated_iat_list(hmod, unhook, hooks, is_local); if (!hmod || hmod == INVALID_HANDLE_VALUE || !hooks) return; @@ -317,6 +320,9 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks) if (!unhook && !hooks[i].data[x].new_function) continue; + if (!is_local && (hooks[i].data[x].flags & HOOK_LOCAL_ONLY)) + continue; + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -415,7 +421,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -470,12 +476,14 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "Shw32") == 0) continue; - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, FALSE, hooks); + hook_patch_iat_list(hmod, FALSE, hooks, is_local); } } } @@ -487,7 +495,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), FALSE, hooks, TRUE); } } @@ -500,7 +508,7 @@ void hook_revert(HOOKLIST* hooks) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - if ((hooks[i].data[x].flags & SKIP_HOOK2)) + if ((hooks[i].data[x].flags & HOOK_SKIP_2)) continue; DetourTransactionBegin(); @@ -544,12 +552,14 @@ void hook_revert(HOOKLIST* hooks) { _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); - if (_strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0 || + BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + + if (is_local || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) { - hook_patch_iat_list(hmod, TRUE, hooks); + hook_patch_iat_list(hmod, TRUE, hooks, is_local); } } } @@ -561,7 +571,7 @@ void hook_revert(HOOKLIST* hooks) if (g_config.hook == 1) { - hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks); + hook_patch_iat_list(GetModuleHandle(NULL), TRUE, hooks, TRUE); } } From 7b7fefcad182fadbb47cf52533247ae97685dc4c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 19:35:12 +0200 Subject: [PATCH 0013/1053] create registry key if it doesn't exist --- src/dllmain.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 945ee6b..42e4f46 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -75,8 +75,16 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) HKEY hkey; LONG status = - RegOpenKeyExA( - HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0L, KEY_WRITE, &hkey); + RegCreateKeyExA( + HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE | KEY_QUERY_VALUE, + NULL, + &hkey, + NULL); if (status == ERROR_SUCCESS) { From e3142956dc8d030534450a963231ca06f3f5b8c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 26 Sep 2023 22:48:30 +0200 Subject: [PATCH 0014/1053] add support for xvid --- src/dllmain.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index 42e4f46..d2bbec2 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -88,8 +88,12 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (status == ERROR_SUCCESS) { - LPCTSTR data = "x264vfw.dll"; - RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, data, strlen(data)+1); + LPCTSTR x264 = "x264vfw.dll"; + RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, x264, strlen(x264) + 1); + + LPCTSTR xvid = "xvidvfw.dll"; + RegSetValueExA(hkey, "vidc.xvid", 0, REG_SZ, xvid, strlen(xvid) + 1); + RegCloseKey(hkey); } From d8982faae75e82a253e8f1c972b7bd0fc7007d93 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 27 Sep 2023 01:16:27 +0200 Subject: [PATCH 0015/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 510cf80..7f3cf32 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 5 -#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 e7a9c5b0957521d5c4d3f21dcfcf50be93f97264 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:10:29 +0200 Subject: [PATCH 0016/1053] #245 allow to limit FPS below refresh rate with vsync enabled --- src/dd.c | 4 +++- src/fps_limiter.c | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9027306..37ffb2a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1189,7 +1189,9 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_config.maxfps >= 0 && !g_config.vsync)) + BOOL open = !(g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + + if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; } diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 094f902..d157612 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,7 +14,7 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || g_config.vsync) + if (max_fps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) @@ -125,7 +125,7 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_config.maxfps < 0 || g_config.vsync) + if (g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -135,7 +135,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync) + if (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From 5060752adb98737d6bfafff9ba46cecb4f44daf8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:12:47 +0200 Subject: [PATCH 0017/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7f3cf32..7403f60 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #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 bbf529f6efc39c3929d6695371a8ee6efcf30232 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:19:21 +0200 Subject: [PATCH 0018/1053] limit fps also with maxfps=0 --- src/dd.c | 4 +++- src/fps_limiter.c | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 37ffb2a..9e2fb7a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1189,7 +1189,9 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - BOOL open = !(g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + BOOL open = + !(g_config.maxfps < 0 || + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index d157612..b8a8ac0 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,7 +14,7 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) max_fps = g_ddraw->mode.dmDisplayFrequency; if (max_fps > 1000) @@ -125,7 +125,8 @@ void fpsl_frame_start() void fpsl_frame_end() { - if (g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (g_config.maxfps < 0 || + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -135,7 +136,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From a95003fbc28ecd750b3505038529d6928c458216 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 2 Oct 2023 02:21:20 +0200 Subject: [PATCH 0019/1053] fix for last commit --- src/dd.c | 2 +- src/fps_limiter.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9e2fb7a..173c846 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1191,7 +1191,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { BOOL open = !(g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)); + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))); if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) return DD_OK; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index b8a8ac0..97c0ec1 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -126,7 +126,7 @@ void fpsl_frame_start() void fpsl_frame_end() { if (g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) return; @@ -136,7 +136,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; From c17db0349ae5d016d863cba534898569a54d2fd0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 19:51:53 +0200 Subject: [PATCH 0020/1053] #247 fix color key issues in Kohan: Immortal Sovereigns --- src/dd.c | 2 +- src/ddsurface.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 173c846..4075076 100644 --- a/src/dd.c +++ b/src/dd.c @@ -653,7 +653,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; g_ddraw->render.mode.dmDisplayFrequency = g_config.refresh_rate; - + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { g_config.refresh_rate = 0; diff --git a/src/ddsurface.c b/src/ddsurface.c index 3ca910d..254e09f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1296,7 +1296,7 @@ HRESULT dd_CreateSurface( if (lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_OVERLAY) return DDERR_UNSUPPORTED; - if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && + if (!(lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && (lpDDSurfaceDesc->dwWidth > 16384 || lpDDSurfaceDesc->dwHeight > 16384)) { return DDERR_INVALIDPARAMS; @@ -1328,6 +1328,12 @@ HRESULT dd_CreateSurface( dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; dst_surface->ddraw = This; + if (dst_surface->flags & DDSD_CKSRCBLT) + { + dst_surface->color_key.dwColorSpaceHighValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue; + dst_surface->color_key.dwColorSpaceLowValue = lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue; + } + if (dst_surface->flags & DDSD_PIXELFORMAT) { switch (lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount) From be8bf853d034ca88a8ddbc2f97dd3536f48b1e3a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 19:52:26 +0200 Subject: [PATCH 0021/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7403f60..0759210 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #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 b0e8acc03caf6331548c17b2de073792e75533d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 4 Oct 2023 23:21:21 +0200 Subject: [PATCH 0022/1053] #246 make sure we set resolution before checking if chosen refrresh_rate is supported --- src/dd.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 4075076..908fa88 100644 --- a/src/dd.c +++ b/src/dd.c @@ -649,6 +649,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); g_ddraw->render.mode.dmSize = sizeof(DEVMODE); + g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; + g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + if (g_config.refresh_rate) { g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; @@ -658,15 +662,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_config.refresh_rate = 0; - g_ddraw->render.mode.dmFields = 0; + g_ddraw->render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; g_ddraw->render.mode.dmDisplayFrequency = 0; } } - g_ddraw->render.mode.dmFields |= DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; - if (!g_config.windowed) { /* Making sure the chosen resolution is valid */ From cbeffa867f5d364e4c74c3afacc93a31f7ef4b4a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 01:47:43 +0200 Subject: [PATCH 0023/1053] avoid exceptions with obfuscated binaries in debug build --- src/hook.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/hook.c b/src/hook.c index 4aa653d..6ae412a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -323,6 +323,23 @@ 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; + /* avoid exceptions with obfuscated binaries in debug build */ +#if defined(_DEBUG) + MEMORY_BASIC_INFORMATION mbi = { 0 }; + if (VirtualQuery((void*)import->Name, & mbi, sizeof(mbi))) + { + DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY); + BOOL b = !(mbi.Protect & mask); + // check the page is not a guard page + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; + + if (b) + continue; + } + else + continue; +#endif + if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; From d04ada54d920431456bb5999986fa9748676b300 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 02:02:07 +0200 Subject: [PATCH 0024/1053] use _exit to avoid issues on close --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 961f33d..a64b2cb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -512,7 +512,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == SC_CLOSE && !GameHandlesClose) { - exit(0); + _exit(0); } if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL) From ce84abfac06fc929b59da162ed4f41caa7ecd0c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 02:17:01 +0200 Subject: [PATCH 0025/1053] fix TA megamap mouse wheel zoom in windowed mode --- src/winapi_hooks.c | 7 +++++++ src/wndproc.c | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f795b27..a31e14b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -652,6 +652,13 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w //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); diff --git a/src/wndproc.c b/src/wndproc.c index a64b2cb..5ff00c2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -789,6 +789,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 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); From 7e9be9709965afc5bffc0cd2c9e5f34aff4e626d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 5 Oct 2023 21:14:22 +0200 Subject: [PATCH 0026/1053] #249 fix improper colorspace handling --- src/ddsurface.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 254e09f..d5bb5de 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1034,8 +1034,16 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE if (lpColorKey) { - This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; + + if (dwFlags & DDCKEY_COLORSPACE) + { + This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceHighValue; + } + else + { + This->color_key.dwColorSpaceHighValue = lpColorKey->dwColorSpaceLowValue; + } } return DD_OK; From 77b969a33f2d0930fcf2771230fefcb56b715ada Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Oct 2023 00:15:44 +0200 Subject: [PATCH 0027/1053] fix debug log build --- src/dllmain.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ff55417..ed27aaa 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -26,16 +26,20 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { - cfg_load(); - if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) + { + cfg_load(); return TRUE; + } #ifdef _DEBUG dbg_init(); TRACE("cnc-ddraw = %p\n", hDll); g_dbg_exception_filter = real_SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif + + cfg_load(); + g_ddraw_module = hDll; char buf[1024]; From 43aa290d1e0ff00af825d5896314d2706f817793 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Oct 2023 02:11:45 +0200 Subject: [PATCH 0028/1053] add temporary workaround to fix issues in claw custom levels --- src/ddsurface.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d5bb5de..e50fb21 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1454,9 +1454,10 @@ HRESULT dd_CreateSurface( ((DWORD*)dst_surface->bmi->bmiColors)[2] = 0x0000FF; } - + /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height)) + (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) || + (dst_surface->width == 128 && dst_surface->height == 128)) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); From 24a73ccc6d3b94be99503d79cc0ac9c5daef0a04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:03:11 +0200 Subject: [PATCH 0029/1053] #251 hook GetMessage for Enemy Infestation --- inc/config.h | 1 + inc/hook.h | 3 ++- inc/winapi_hooks.h | 1 + src/config.c | 4 +++- src/hook.c | 2 ++ src/winapi_hooks.c | 28 +++++++++++++++++++++++----- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/inc/config.h b/inc/config.h index 97d9755..dc35419 100644 --- a/inc/config.h +++ b/inc/config.h @@ -45,6 +45,7 @@ typedef struct CNCDDRAWCONFIG int resolutions; int fixchilds; BOOL hook_peekmessage; + BOOL hook_getmessage; /* Undocumented settings */ diff --git a/inc/hook.h b/inc/hook.h index 1663f99..ed453fc 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -47,7 +47,7 @@ typedef int (WINAPI* STRETCHDIBITSPROC)( typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); 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 int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); @@ -92,6 +92,7 @@ extern STRETCHDIBITSPROC real_StretchDIBits; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; +extern GETMESSAGEAPROC real_GetMessageA; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index b2962da..a66f475 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -32,6 +32,7 @@ HWND WINAPI fake_GetForegroundWindow(void); BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); 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); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( diff --git a/src/config.c b/src/config.c index cb8b656..cad0772 100644 --- a/src/config.c +++ b/src/config.c @@ -62,6 +62,7 @@ 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); /* Undocumented settings */ @@ -264,8 +265,9 @@ 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 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" diff --git a/src/hook.c b/src/hook.c index 6ae412a..1b654d0 100644 --- a/src/hook.c +++ b/src/hook.c @@ -47,6 +47,7 @@ STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; +GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; @@ -90,6 +91,7 @@ HOOKLIST g_hook_hooklist[] = { "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 }, { "SetForegroundWindow", (PROC)fake_SetForegroundWindow, (PROC*)&real_SetForegroundWindow, 0 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, { "", NULL, NULL, 0 } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a31e14b..7efbb76 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -593,11 +593,9 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D return real_SetWindowsHookExA(idHook, lpfn, hmod, dwThreadId); } -BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) +BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - - if (result && g_ddraw && g_ddraw->width && g_config.hook_peekmessage) + if (g_ddraw && g_ddraw->width) { switch (lpMsg->message) { @@ -690,10 +688,30 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w break; } - + } } + return TRUE; +} + +BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +{ + BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + + if (result && 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) +{ + BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); + + if (result && g_config.hook_peekmessage) + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + return result; } From 620d413ab842ef4213ba96181039467e584d34b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:05:06 +0200 Subject: [PATCH 0030/1053] #251 add preset for Enemy Infestation --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index cad0772..46dd242 100644 --- a/src/config.c +++ b/src/config.c @@ -692,6 +692,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=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" From ba82f44562a32ab92722433f15caff6f4f628723 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Oct 2023 09:06:24 +0200 Subject: [PATCH 0031/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 0759210..6054b33 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #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 b63410c4449b24973f8d4b53992de5f1b0aeb48f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 8 Oct 2023 11:59:09 +0200 Subject: [PATCH 0032/1053] add fix for custom levels --- src/ddsurface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 3ca910d..5aa9fcc 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1442,7 +1442,8 @@ HRESULT dd_CreateSurface( if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height)) + (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) || + (dst_surface->width == 128 && dst_surface->height == 128)) { dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); From 351a0cf467f0bb9d0a79c9069bb6bb585765ff96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 9 Oct 2023 10:56:31 +0200 Subject: [PATCH 0033/1053] fix PostBuildEvent so it doesn't copy to ProjectDir when LocalDebuggerWorkingDirectory is not set --- cnc-ddraw.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 1627aef..3133efa 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -308,7 +308,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) @@ -335,7 +335,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) From 995d1f294bcf868c56ac675940bdd930e3dfb9b5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:00:27 +0200 Subject: [PATCH 0034/1053] #252 add presets for Nox --- inc/config.h | 1 + src/config.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index dc35419..e0d6a72 100644 --- a/inc/config.h +++ b/inc/config.h @@ -4,6 +4,7 @@ #define WIN32_LEAN_AND_MEAN #include +#define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) typedef struct CNCDDRAWCONFIG { diff --git a/src/config.c b/src/config.c index 46dd242..08508ae 100644 --- a/src/config.c +++ b/src/config.c @@ -858,6 +858,16 @@ static void cfg_create_ini() "renderer=direct3d9\n" "nonexclusive=false\n" "windowed=false\n" + "maxgameticks=-1\n" + "\n" + "; Nox Reloaded\n" + "[NoxReloaded]\n" + "maxgameticks=-1\n" + "\n" + "; Nox GOG\n" + "[Game/2]\n" + "checkfile=.\\nox.cfg\n" + "maxgameticks=-1\n" "\n" "; Outlaws\n" "[olwin]\n" @@ -1091,19 +1101,53 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD s = GetPrivateProfileStringA( g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + char buf[MAX_PATH] = { 0 }; + if (s > 0) { - char buf[MAX_PATH] = { 0 }; - if (GetPrivateProfileStringA( g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) { - if (GetFileAttributes(buf) != INVALID_FILE_ATTRIBUTES) + if (FILE_EXISTS(buf)) + { return s; + } + else + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section), "%s?%d", g_config.process_file_name, 2); + + s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) + { + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + } + } } else return s; } + else + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section), "%s/%d", g_config.process_file_name, 2); + + s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) + { + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + } + } return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); } From dfae3361a04309143f1b3e181d64627a4dae908d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:04:36 +0200 Subject: [PATCH 0035/1053] fix _snprintf calls --- src/config.c | 8 ++++---- src/dllmain.c | 2 +- src/render_gdi.c | 2 +- src/screenshot.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 08508ae..d71259d 100644 --- a/src/config.c +++ b/src/config.c @@ -1115,7 +1115,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section), "%s?%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s?%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); @@ -1135,7 +1135,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section), "%s/%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); @@ -1162,8 +1162,8 @@ static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) static int cfg_get_int(LPCSTR key, int default_value) { - char def_value[20]; - _snprintf(def_value, sizeof(def_value), "%d", default_value); + char def_value[24]; + _snprintf(def_value, sizeof(def_value) - 1, "%d", default_value); char value[20]; cfg_get_string(key, def_value, value, sizeof(value)); diff --git a/src/dllmain.c b/src/dllmain.c index ed27aaa..bf6c556 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -58,7 +58,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) _snprintf( mes, - sizeof(mes), + sizeof(mes) - 1, "Please disable the '%s' compatibility mode for all game executables and " "then try to start the game again.", s); diff --git a/src/render_gdi.c b/src/render_gdi.c index c3f339f..bd88fb6 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -29,7 +29,7 @@ DWORD WINAPI gdi_render_main(void) _snprintf( warning_text, - sizeof(warning_text), + sizeof(warning_text) - 1, "-WARNING- Using slow software rendering, please update your graphics card driver (%s)", strlen(g_oglu_version) > 10 ? "" : g_oglu_version); } diff --git a/src/screenshot.c b/src/screenshot.c index 4ad3cfc..d559101 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -150,7 +150,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); - _snprintf(filename, sizeof(filename), "%s%s-%s.png", g_config.screenshot_dir, title, str_time); + _snprintf(filename, sizeof(filename) - 1, "%s%s-%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { From 4c07a8defa48565d05b3d6351e653a41488881c6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 05:05:53 +0200 Subject: [PATCH 0036/1053] replace questionmark --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index d71259d..e15355e 100644 --- a/src/config.c +++ b/src/config.c @@ -1115,7 +1115,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, else { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s?%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); From 75176119927942861bbe20fb50b6a68180fc7d5d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 11:00:58 +0200 Subject: [PATCH 0037/1053] remove duplicate code --- src/config.c | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/config.c b/src/config.c index e15355e..ba23739 100644 --- a/src/config.c +++ b/src/config.c @@ -1109,33 +1109,17 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) { if (FILE_EXISTS(buf)) - { return s; - } - else - { - char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); - - s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); - - if (s > 0) - { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } - } - } } else return s; } - else + + /* Only checking 1 additional section for now (it may be too slow otherwise) */ + for (int i = 2; i < 3; i++) { char section[MAX_PATH] = { 0 }; - _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, 2); + _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); From 9256899b204fe4209bce0ae72e5807e3a7dc9563 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 14 Oct 2023 12:41:52 +0200 Subject: [PATCH 0038/1053] improve ini performance --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 +++++ inc/ini.h | 6 +++++ src/config.c | 40 ++++++++++++++++++-------------- src/ini.c | 49 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 86 insertions(+), 17 deletions(-) create mode 100644 inc/ini.h create mode 100644 src/ini.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 3133efa..924f32f 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -49,6 +49,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 11979b2..5a253f1 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -156,6 +156,9 @@ Source Files + + Source Files + @@ -269,6 +272,9 @@ Header Files + + Header Files + diff --git a/inc/ini.h b/inc/ini.h new file mode 100644 index 0000000..9b73604 --- /dev/null +++ b/inc/ini.h @@ -0,0 +1,6 @@ +#ifndef INI_H +#define INI_H + +BOOL ini_section_exists(char* section); + +#endif diff --git a/src/config.c b/src/config.c index ba23739..1e89be9 100644 --- a/src/config.c +++ b/src/config.c @@ -10,6 +10,7 @@ #include "hook.h" #include "debug.h" #include "dllmain.h" +#include "ini.h" static void cfg_init(); static void cfg_create_ini(); @@ -1098,37 +1099,42 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, if (!g_config.ini_path[0]) cfg_init(); - DWORD s = GetPrivateProfileStringA( - g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); - char buf[MAX_PATH] = { 0 }; - if (s > 0) + if (ini_section_exists(g_config.process_file_name)) { - if (GetPrivateProfileStringA( - g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + DWORD s = GetPrivateProfileStringA( + g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) { - if (FILE_EXISTS(buf)) + if (GetPrivateProfileStringA( + g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } + else return s; } - else - return s; } - /* Only checking 1 additional section for now (it may be too slow otherwise) */ - for (int i = 2; i < 3; i++) + for (int i = 2; i < 10; i++) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); - - if (s > 0) + if (ini_section_exists(section)) { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + DWORD s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + + if (s > 0) { - if (FILE_EXISTS(buf)) - return s; + if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) + { + if (FILE_EXISTS(buf)) + return s; + } } } } diff --git a/src/ini.c b/src/ini.c new file mode 100644 index 0000000..38c42bc --- /dev/null +++ b/src/ini.c @@ -0,0 +1,49 @@ +#include +#include "debug.h" +#include "config.h" +#include "crc32.h" + +static unsigned long g_ini_section_hashes[1024]; + +BOOL ini_section_exists(char* section) +{ + if (!g_ini_section_hashes[0]) + { + char* buf = calloc(8192, 1); + if (buf) + { + if (GetPrivateProfileSectionNamesA(buf, 8192, g_config.ini_path) > 0) + { + for (int i = 0; *buf && i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]); i++) + { + size_t len = strlen(buf); + + for (char* p = buf; *p; ++p) + *p = tolower(*p); + + g_ini_section_hashes[i] = Crc32_ComputeBuf(0, buf, len); + + buf += len + 1; + } + } + + free(buf); + } + } + + char s[MAX_PATH]; + strncpy(s, section, sizeof(s) - 1); + + for (char* p = s; *p; ++p) + *p = tolower(*p); + + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); + + for (int i = 0; i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]) && g_ini_section_hashes[i]; i++) + { + if (g_ini_section_hashes[i] == hash) + return TRUE; + } + + return FALSE; +} From b68cfd17ec344169fd04a8a17a860c2cb0be73ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 02:33:47 +0200 Subject: [PATCH 0039/1053] update makefile --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index b10930b..233aa78 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ FILES = src/IDirect3D/IDirect3D.c \ src/IDirectDraw/IDirectDrawGammaControl.c \ src/IAMMediaStream/IAMMediaStream.c \ src/crc32.c \ + src/ini.c \ src/blt.c \ src/dd.c \ src/ddpalette.c \ From 8a99b5e0ad90fdf48858adde40489fa325ee0328 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 02:44:31 +0200 Subject: [PATCH 0040/1053] improve mingw build --- src/hook.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index 1b654d0..224e411 100644 --- a/src/hook.c +++ b/src/hook.c @@ -326,14 +326,22 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc continue; /* avoid exceptions with obfuscated binaries in debug build */ -#if defined(_DEBUG) +#if defined(_DEBUG) || defined(__GNUC__) MEMORY_BASIC_INFORMATION mbi = { 0 }; - if (VirtualQuery((void*)import->Name, & mbi, sizeof(mbi))) + if (VirtualQuery((void*)import->Name, &mbi, sizeof(mbi))) { - DWORD mask = (PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY); + DWORD mask = ( + PAGE_READONLY | + PAGE_READWRITE | + PAGE_WRITECOPY | + PAGE_EXECUTE_READ | + PAGE_EXECUTE_READWRITE | + PAGE_EXECUTE_WRITECOPY); + BOOL b = !(mbi.Protect & mask); - // check the page is not a guard page - if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; + + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + b = TRUE; if (b) continue; @@ -603,6 +611,13 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; } + +#if defined(__GNUC__) + if (g_config.hook == 4) + { + g_config.hook = 3; + } +#endif } if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) From 43a0e95a39b9e3beadc8f1f929160617836db831 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 03:55:27 +0200 Subject: [PATCH 0041/1053] remove warning from makefile --- Makefile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/Makefile b/Makefile index 233aa78..332982d 100644 --- a/Makefile +++ b/Makefile @@ -40,12 +40,6 @@ FILES = src/IDirect3D/IDirect3D.c \ src/opengl_utils.c all: - $(info ) - $(info **********************************************************************************************) - $(info WARNING: This build is outdated and does not support all cnc-ddraw features [Detours/SEH]) - $(info WARNING: Some games that require hooks may crash or glitch, please use the msvc build instead) - $(info **********************************************************************************************) - $(info ) $(WINDRES) -J rc ddraw.rc ddraw.rc.o $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) # $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt From 07fe110b746886f3ccf7d5918875037a357d2f42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 15 Oct 2023 04:22:29 +0200 Subject: [PATCH 0042/1053] update Nox presets --- src/config.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 1e89be9..9eea32d 100644 --- a/src/config.c +++ b/src/config.c @@ -859,16 +859,16 @@ static void cfg_create_ini() "renderer=direct3d9\n" "nonexclusive=false\n" "windowed=false\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Nox Reloaded\n" "[NoxReloaded]\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Nox GOG\n" "[Game/2]\n" "checkfile=.\\nox.cfg\n" - "maxgameticks=-1\n" + "maxgameticks=125\n" "\n" "; Outlaws\n" "[olwin]\n" From 94afdc378b7b132b3a6ad08a8fb20f4a10c68677 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 01:02:42 +0200 Subject: [PATCH 0043/1053] #253 add preset for Jedi Knight Dark Forces 2 --- inc/config.h | 1 + src/IDirectDraw/IDirectDraw.c | 9 +++++---- src/config.c | 6 ++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index e0d6a72..381df22 100644 --- a/inc/config.h +++ b/inc/config.h @@ -67,6 +67,7 @@ typedef struct CNCDDRAWCONFIG int custom_width; int custom_height; int min_font_size; + BOOL direct3d_passthrough; /* Hotkeys */ diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3bf3861..35cd482 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -8,6 +8,7 @@ #include "ddsurface.h" #include "debug.h" #include "hook.h" +#include "config.h" HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) @@ -50,7 +51,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D, riid)) + else if (IsEqualGUID(&IID_IDirect3D, riid) && !g_config.direct3d_passthrough) { IDirect3DImpl* d3d = (IDirect3DImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DImpl)); @@ -64,7 +65,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D2, riid)) + else if (IsEqualGUID(&IID_IDirect3D2, riid) && !g_config.direct3d_passthrough) { IDirect3D2Impl* d3d = (IDirect3D2Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D2Impl)); @@ -78,7 +79,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D3, riid)) + else if (IsEqualGUID(&IID_IDirect3D3, riid) && !g_config.direct3d_passthrough) { IDirect3D3Impl* d3d = (IDirect3D3Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D3Impl)); @@ -92,7 +93,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ret = S_OK; } - else if (IsEqualGUID(&IID_IDirect3D7, riid)) + else if (IsEqualGUID(&IID_IDirect3D7, riid) && !g_config.direct3d_passthrough) { IDirect3D7Impl* d3d = (IDirect3D7Impl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D7Impl)); diff --git a/src/config.c b/src/config.c index 9eea32d..55b0e0a 100644 --- a/src/config.c +++ b/src/config.c @@ -85,6 +85,7 @@ void cfg_load() GET_INT(g_config.custom_width, "custom_width", 0); GET_INT(g_config.custom_height, "custom_height", 0); GET_INT(g_config.min_font_size, "min_font_size", 0); + GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); /* Hotkeys */ @@ -290,6 +291,7 @@ static void cfg_create_ini() "custom_width=0\n" "custom_height=0\n" "min_font_size=0\n" + "direct3d_passthrough=false\n" "\n" "\n" "\n" @@ -804,6 +806,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "releasealt=true\n" "\n" + "; Jedi Knight Dark Forces 2\n" + "[JK]\n" + "direct3d_passthrough=true\n" + "\n" "; Kings Quest 8\n" "[Mask]\n" "renderer=opengl\n" From 4d7fc88d379471a787d4344498dc91624eec8acc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 02:08:38 +0200 Subject: [PATCH 0044/1053] block all keys except Esc while a dvd video is playing --- inc/dd.h | 1 + src/render_d3d9.c | 2 +- src/render_gdi.c | 2 +- src/render_ogl.c | 2 +- src/utils.c | 2 ++ src/wndproc.c | 12 ++++++++++++ 6 files changed, 18 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 1d0aa8f..042a258 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,6 +136,7 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; + BOOL video_window_exists; BOOL got_child_windows; DWORD last_set_window_pos_tick; /* WINE hack */ SPEEDLIMITER ticks_limiter; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 66511ad..0934807 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -540,7 +540,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; 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 c3f339f..9d14d26 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -83,7 +83,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; 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 cc87e92..27420b9 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -769,7 +769,7 @@ static void ogl_render() if (g_config.fixchilds) { - g_ddraw->child_window_exists = FALSE; + g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; 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 af11859..a9fee1b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -476,6 +476,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) { + g_ddraw->video_window_exists = TRUE; + LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); if (!(style & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 961f33d..366b8f3 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -709,6 +709,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { + if (g_ddraw->video_window_exists) + { + if (wParam != VK_ESCAPE) + return 0; + } + if (g_config.hotkeys.unlock_cursor1 && (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { @@ -733,6 +739,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYUP: { + if (g_ddraw->video_window_exists) + { + if (wParam != VK_ESCAPE) + return 0; + } + if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); From e874a7e3059f3495e3ffe8921c6cb26958f8f6a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 02:12:29 +0200 Subject: [PATCH 0045/1053] ignore mouse input while dvd video is playing --- src/wndproc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/wndproc.c b/src/wndproc.c index 366b8f3..014318a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -755,6 +755,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONUP: case WM_MBUTTONUP: { + if (g_ddraw->video_window_exists) + { + return 0; + } + if (!g_config.devmode && !g_mouse_locked) { int x = GET_X_LPARAM(lParam); @@ -796,6 +801,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { + if (g_ddraw->video_window_exists) + { + return 0; + } + if (!g_config.devmode && !g_mouse_locked) { return 0; From 743907669ed4239b07bcd4d63b9aaff8358cfd03 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 02:14:06 +0200 Subject: [PATCH 0046/1053] allow cursor lock while playing videos --- src/wndproc.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 014318a..f36ef5b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -755,11 +755,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_RBUTTONUP: case WM_MBUTTONUP: { - if (g_ddraw->video_window_exists) - { - return 0; - } - if (!g_config.devmode && !g_mouse_locked) { int x = GET_X_LPARAM(lParam); From 65969de0bdb17deb3de4fb6fea06cfc1847adb10 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 02:18:22 +0200 Subject: [PATCH 0047/1053] allow cursor unlock while video is playing --- src/wndproc.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index f36ef5b..bf0e6a9 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -709,12 +709,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_KEYDOWN: { - if (g_ddraw->video_window_exists) - { - if (wParam != VK_ESCAPE) - return 0; - } - if (g_config.hotkeys.unlock_cursor1 && (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { @@ -735,19 +729,25 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - break; - } - case WM_KEYUP: - { if (g_ddraw->video_window_exists) { if (wParam != VK_ESCAPE) return 0; } + break; + } + case WM_KEYUP: + { if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) ss_take_screenshot(g_ddraw->primary); + if (g_ddraw->video_window_exists) + { + if (wParam != VK_ESCAPE) + return 0; + } + break; } /* button up messages reactivate cursor lock */ From ddfae6cd6721e1d2b20bb604e50f9a20de6b0b6f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:08:29 +0200 Subject: [PATCH 0048/1053] forward all input to video window --- inc/dd.h | 2 +- src/render_d3d9.c | 3 ++- src/render_gdi.c | 3 ++- src/render_ogl.c | 3 ++- src/utils.c | 2 +- src/wndproc.c | 18 +++++++++++------- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 042a258..1ab5d64 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,7 +136,7 @@ typedef struct CNCDDRAW void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_surface; /* Nox hack */ BOOL child_window_exists; - BOOL video_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/render_d3d9.c b/src/render_d3d9.c index 0934807..cae506b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -540,7 +540,8 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 9d14d26..4a24747 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -83,7 +83,8 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 27420b9..79b1477 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -769,7 +769,8 @@ static void ogl_render() if (g_config.fixchilds) { - g_ddraw->child_window_exists = g_ddraw->video_window_exists = FALSE; + g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 a9fee1b..617beb8 100644 --- a/src/utils.c +++ b/src/utils.c @@ -476,7 +476,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) { - g_ddraw->video_window_exists = TRUE; + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); diff --git a/src/wndproc.c b/src/wndproc.c index bf0e6a9..91381cb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -729,10 +729,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { - if (wParam != VK_ESCAPE) - return 0; + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; } break; @@ -742,10 +743,11 @@ 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); - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { - if (wParam != VK_ESCAPE) - return 0; + PostMessageA(video_hwnd, uMsg, wParam, lParam); + return 0; } break; @@ -796,8 +798,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - if (g_ddraw->video_window_exists) + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + if (video_hwnd) { + PostMessageA(video_hwnd, uMsg, wParam, lParam); return 0; } From 393627ee39783ac5a52b9031f4846c23da5a21ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:19:13 +0200 Subject: [PATCH 0049/1053] make sure we forward the right mouse coords to video window --- src/wndproc.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 91381cb..e812f9b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -798,13 +798,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_MBUTTONDOWN: case WM_MOUSEMOVE: { - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); - if (video_hwnd) - { - PostMessageA(video_hwnd, uMsg, wParam, lParam); - return 0; - } - if (!g_config.devmode && !g_mouse_locked) { return 0; @@ -838,6 +831,13 @@ 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 c328ae95501113f679053a5023cb3eb94d73d381 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:35:09 +0200 Subject: [PATCH 0050/1053] forward input to video window during video playback --- inc/dd.h | 1 + src/render_d3d9.c | 1 + src/render_gdi.c | 1 + src/render_ogl.c | 1 + src/utils.c | 2 ++ src/wndproc.c | 21 +++++++++++++++++++++ 6 files changed, 27 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 1d0aa8f..1ab5d64 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -136,6 +136,7 @@ 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/render_d3d9.c b/src/render_d3d9.c index 66511ad..cae506b 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -541,6 +541,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 bd88fb6..40d5263 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -84,6 +84,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 cc87e92..79b1477 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -770,6 +770,7 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; + InterlockedExchangePointer(&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 5aeadd0..999a8e4 100644 --- a/src/utils.c +++ b/src/utils.c @@ -475,6 +475,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); if (!(style & WS_EX_TRANSPARENT)) diff --git a/src/wndproc.c b/src/wndproc.c index 5ff00c2..4fccc95 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -729,6 +729,13 @@ 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: @@ -736,6 +743,13 @@ 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 */ @@ -824,6 +838,13 @@ 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 488d4ea56737078ff780c8049359549a43a484f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Oct 2023 03:50:34 +0200 Subject: [PATCH 0051/1053] only save hwnd for video windows --- src/utils.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 999a8e4..bddc06b 100644 --- a/src/utils.c +++ b/src/utils.c @@ -475,7 +475,10 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) + { + InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); From d7ed6bd7bc05200ac890a49764fddc9e75e25e6a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Oct 2023 18:13:35 +0200 Subject: [PATCH 0052/1053] improve ini reader performance --- inc/config.h | 3 +- inc/ini.h | 16 ++++- src/config.c | 43 ++++++------- src/ini.c | 170 ++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 182 insertions(+), 50 deletions(-) diff --git a/inc/config.h b/inc/config.h index 381df22..709a800 100644 --- a/inc/config.h +++ b/inc/config.h @@ -1,8 +1,8 @@ #ifndef CONFIG_H #define CONFIG_H -#define WIN32_LEAN_AND_MEAN #include +#include "ini.h" #define FILE_EXISTS(a) (GetFileAttributes(a) != INVALID_FILE_ATTRIBUTES) @@ -15,6 +15,7 @@ typedef struct CNCDDRAWCONFIG char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; + INIFILE ini; /* Optional settings */ diff --git a/inc/ini.h b/inc/ini.h index 9b73604..ee88575 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -1,6 +1,20 @@ #ifndef INI_H #define INI_H -BOOL ini_section_exists(char* section); +typedef struct +{ + char filename[MAX_PATH]; + + struct { + unsigned long hash; + char* data; + }*sections; +} INIFILE; + +void ini_create(INIFILE* ini, char* filename); +DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); +BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); +int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); +void ini_free(INIFILE* ini); #endif diff --git a/src/config.c b/src/config.c index 55b0e0a..a96644c 100644 --- a/src/config.c +++ b/src/config.c @@ -106,6 +106,8 @@ void cfg_load() GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; + + ini_free(&g_config.ini); } void cfg_save() @@ -1098,31 +1100,25 @@ static void cfg_init() { cfg_create_ini(); } + + ini_create(&g_config.ini, g_config.ini_path); } static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) { - if (!g_config.ini_path[0]) - cfg_init(); - char buf[MAX_PATH] = { 0 }; - if (ini_section_exists(g_config.process_file_name)) - { - DWORD s = GetPrivateProfileStringA( - g_config.process_file_name, key, "", out_string, out_size, g_config.ini_path); + DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); - if (s > 0) + if (s > 0) + { + if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", buf, sizeof(buf)) > 0) { - if (GetPrivateProfileStringA( - g_config.process_file_name, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } - else + if (FILE_EXISTS(buf)) return s; } + else + return s; } for (int i = 2; i < 10; i++) @@ -1130,22 +1126,19 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - if (ini_section_exists(section)) - { - DWORD s = GetPrivateProfileStringA(section, key, "", out_string, out_size, g_config.ini_path); + DWORD s = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - if (s > 0) + if (s > 0) + { + if (ini_get_string(&g_config.ini, section, "checkfile", "", buf, sizeof(buf)) > 0) { - if (GetPrivateProfileStringA(section, "checkfile", "", buf, sizeof(buf), g_config.ini_path) > 0) - { - if (FILE_EXISTS(buf)) - return s; - } + if (FILE_EXISTS(buf)) + return s; } } } - return GetPrivateProfileStringA("ddraw", key, default_value, out_string, out_size, g_config.ini_path); + return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); } static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) diff --git a/src/ini.c b/src/ini.c index 38c42bc..69456b5 100644 --- a/src/ini.c +++ b/src/ini.c @@ -1,49 +1,173 @@ #include +#include #include "debug.h" #include "config.h" #include "crc32.h" +#include "ini.h" -static unsigned long g_ini_section_hashes[1024]; +// Microsoft: The maximum profile section size is 32,767 characters. +#define BUF_SIZE (8192) -BOOL ini_section_exists(char* section) +void ini_create(INIFILE* ini, char* filename) { - if (!g_ini_section_hashes[0]) - { - char* buf = calloc(8192, 1); - if (buf) - { - if (GetPrivateProfileSectionNamesA(buf, 8192, g_config.ini_path) > 0) - { - for (int i = 0; *buf && i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]); i++) - { - size_t len = strlen(buf); + if (!ini || !filename || !filename[0]) + return; - for (char* p = buf; *p; ++p) + ini->sections = calloc(sizeof(ini->sections[0]), 1); + if (ini->sections) + { + strncpy(ini->filename, filename, sizeof(ini->filename) - 1); + + char* names = calloc(BUF_SIZE, 1); + if (names) + { + if (GetPrivateProfileSectionNamesA(names, BUF_SIZE, filename) > 0) + { + char* name = names; + + for (int i = 0; *name; i++) + { + ini->sections = realloc(ini->sections, sizeof(ini->sections[0]) * (i + 2)); + + if (!ini->sections) + return; + + memset(&ini->sections[i + 1], 0, sizeof(ini->sections[0])); + + char* buf = malloc(BUF_SIZE); + if (buf) + { + DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, ini->filename); + if (size > 0) + { + ini->sections[i].data = malloc(size + 2); + if (ini->sections[i].data) + { + memcpy(ini->sections[i].data, buf, size + 2); + } + } + + free(buf); + } + + size_t len = strlen(name); + + for (char* p = name; *p; ++p) *p = tolower(*p); - g_ini_section_hashes[i] = Crc32_ComputeBuf(0, buf, len); + ini->sections[i].hash = Crc32_ComputeBuf(0, name, len); - buf += len + 1; + name += len + 1; } } - - free(buf); + + free(names); } } +} + +DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size) +{ + if (!buf || size == 0) + { + return 0; + } + + if (!ini || !ini->sections || !section || !key) + { + goto end; + } + + size_t key_len = strlen(key); + + if (key_len == 0 || strlen(section) == 0) + { + goto end; + } char s[MAX_PATH]; strncpy(s, section, sizeof(s) - 1); + buf[sizeof(s) - 1] = 0; for (char* p = s; *p; ++p) *p = tolower(*p); - + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); - - for (int i = 0; i < sizeof(g_ini_section_hashes) / sizeof(g_ini_section_hashes[0]) && g_ini_section_hashes[i]; i++) + + for (int i = 0; ini->sections[i].hash; i++) { - if (g_ini_section_hashes[i] == hash) - return TRUE; + if (ini->sections[i].hash == hash) + { + if (!ini->sections[i].data) + break; + + for (char* p = ini->sections[i].data; *p; p += strlen(p) + 1) + { + if (_strnicmp(key, p, key_len) == 0 && p[key_len] == '=') + { + strncpy(buf, &p[key_len + 1], size - 1); + buf[size - 1] = 0; + return strlen(buf); + } + } + + break; + } } - return FALSE; +end: + if (def) + { + strncpy(buf, def, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } + + buf[0] = 0; + + return 0; +} + +BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def) +{ + char value[8]; + ini_get_string(ini, section, key, def ? "Yes" : "No", value, sizeof(value)); + + return (_stricmp(value, "yes") == 0 || _stricmp(value, "true") == 0 || _stricmp(value, "1") == 0); +} + +int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) +{ + char def_str[32]; + _snprintf(def_str, sizeof(def_str) - 1, "%d", def); + + char value[32]; + ini_get_string(ini, section, key, def_str, value, sizeof(value)); + + if (strstr(value, "0x")) + { + return strtol(value, NULL, 0); + } + else + { + return atoi(value); + } +} + +void ini_free(INIFILE* ini) +{ + if (ini->sections) + { + for (int i = 0; ini->sections[i].hash; i++) + { + if (ini->sections[i].data) + { + free(ini->sections[i].data); + ini->sections[i].data = NULL; + } + } + + free(ini->sections); + ini->sections = NULL; + } } From d3a1c821c87371865d6ae4c650fefbe4a4123fa7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 17 Oct 2023 18:31:18 +0200 Subject: [PATCH 0053/1053] fix filename --- src/ini.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ini.c b/src/ini.c index 69456b5..7956300 100644 --- a/src/ini.c +++ b/src/ini.c @@ -37,7 +37,7 @@ void ini_create(INIFILE* ini, char* filename) char* buf = malloc(BUF_SIZE); if (buf) { - DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, ini->filename); + DWORD size = GetPrivateProfileSectionA(name, buf, BUF_SIZE, filename); if (size > 0) { ini->sections[i].data = malloc(size + 2); From a9445fb3004ca395e4105d16d52a991cbbea28e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Oct 2023 05:22:06 +0200 Subject: [PATCH 0054/1053] add new window message to toggle fullscreen/maximize --- inc/wndproc.h | 5 +++++ src/debug.c | 2 ++ src/wndproc.c | 26 ++++++++++++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/inc/wndproc.h b/inc/wndproc.h index 6d2a199..3cb6a97 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -7,9 +7,14 @@ #define WM_SIZE_DDRAW WM_APP+114 #define WM_MOVE_DDRAW WM_APP+115 #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 +#define WM_TOGGLE_FULLSCREEN WM_APP+117 +#define WM_TOGGLE_MAXIMIZE WM_APP+118 #define IDT_TIMER_LEAVE_BNET 541287654 +#define CNC_DDRAW_SET_FULLSCREEN 1 +#define CNC_DDRAW_SET_WINDOWED 2 + LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); #endif diff --git a/src/debug.c b/src/debug.c index c38c940..aaa8cb7 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1502,6 +1502,8 @@ char* dbg_mes_to_str(int id) case WM_D3D9DEVICELOST: return "WM_D3D9DEVICELOST"; case WM_WINEFULLSCREEN: return "WM_WINEFULLSCREEN"; case WM_AUTORENDERER: return "WM_AUTORENDERER"; + case WM_TOGGLE_FULLSCREEN: return "WM_TOGGLE_FULLSCREEN"; + case WM_TOGGLE_MAXIMIZE: return "WM_TOGGLE_MAXIMIZE"; } return 0; diff --git a/src/wndproc.c b/src/wndproc.c index 4fccc95..db1c00a 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -652,6 +652,32 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_lock(); return 0; } + case WM_TOGGLE_FULLSCREEN: + { + if (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) + { + /* Check if we are fullscreen/borderless already */ + if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen)) + return 0; + + /* Check if we are windowed already */ + if (wParam == CNC_DDRAW_SET_WINDOWED && g_config.windowed && !g_config.fullscreen) + return 0; + + util_toggle_fullscreen(); + } + + return 0; + } + case WM_TOGGLE_MAXIMIZE: + { + if (g_config.resizable) + { + util_toggle_maximize(); + } + + return 0; + } case WM_NCLBUTTONDBLCLK: { if (g_config.resizable) From e92e01ec97c326563f969bb83e7c091e5517098b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 18 Oct 2023 05:22:27 +0200 Subject: [PATCH 0055/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 6054b33..af7cd22 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 8 #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 802f55dff41340bad9dfd03ae1e296e5f381eca6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Oct 2023 00:45:09 +0200 Subject: [PATCH 0056/1053] add some fixes to ini.c --- src/ini.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ini.c b/src/ini.c index 7956300..593dbba 100644 --- a/src/ini.c +++ b/src/ini.c @@ -17,6 +17,7 @@ void ini_create(INIFILE* ini, char* filename) if (ini->sections) { strncpy(ini->filename, filename, sizeof(ini->filename) - 1); + ini->filename[sizeof(ini->filename) - 1] = 0; char* names = calloc(BUF_SIZE, 1); if (names) @@ -156,6 +157,11 @@ int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) void ini_free(INIFILE* ini) { + if (!ini) + return; + + ini->filename[0] = 0; + if (ini->sections) { for (int i = 0; ini->sections[i].hash; i++) From 23f81c94f556f5a286b9c2e02787ba51b80a8932 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 19 Oct 2023 00:54:48 +0200 Subject: [PATCH 0057/1053] add ini_get_float function --- inc/ini.h | 1 + src/ini.c | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/inc/ini.h b/inc/ini.h index ee88575..dfcee82 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -15,6 +15,7 @@ void ini_create(INIFILE* ini, char* filename); DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); +float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def); void ini_free(INIFILE* ini); #endif diff --git a/src/ini.c b/src/ini.c index 593dbba..b71f275 100644 --- a/src/ini.c +++ b/src/ini.c @@ -155,6 +155,17 @@ int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def) } } +float ini_get_float(INIFILE* ini, LPCSTR section, LPCSTR key, float def) +{ + char def_str[32]; + _snprintf(def_str, sizeof(def_str) - 1, "%f", def); + + char value[32]; + ini_get_string(ini, section, key, def_str, value, sizeof(value)); + + return (float)atof(value); +} + void ini_free(INIFILE* ini) { if (!ini) From 9b17a9cd46a1f5b6bfef450290df6e2f3c9c4f6b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 03:59:35 +0200 Subject: [PATCH 0058/1053] add preset for vermeer --- inc/config.h | 1 + src/config.c | 5 +++++ src/dd.c | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/inc/config.h b/inc/config.h index 709a800..f609bab 100644 --- a/inc/config.h +++ b/inc/config.h @@ -90,6 +90,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL vermeer_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a96644c..2fed051 100644 --- a/src/config.c +++ b/src/config.c @@ -104,6 +104,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); + GET_BOOL(g_config.vermeer_hack, "vermeer_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -1028,6 +1029,10 @@ static void cfg_create_ini() "renderer=opengl\n" "adjmouse=true\n" "\n" + "; Vermeer\n" + "[vermeer]\n" + "vermeer_hack=true\n" + "\n" "; Wizardry 8\n" "[Wiz8]\n" "fixmousehook=true\n" diff --git a/src/dd.c b/src/dd.c index 908fa88..913a901 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1182,6 +1182,14 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } } + if (dwFlags & DDSCL_NORMAL) + { + if (g_config.vermeer_hack) + { + dd_SetDisplayMode(640, 480, 16, 0); + } + } + return DD_OK; } From 65fc87b1397d5d636d9dc386bf3c222a6f3f27fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:24:20 +0200 Subject: [PATCH 0059/1053] force regular fullscreen by default for vermeer --- src/dd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 913a901..ecc04d6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -479,7 +479,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; - if (g_ddraw->bpp == 32) + if (g_ddraw->bpp == 32 || g_config.vermeer_hack) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; @@ -1184,7 +1184,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (g_config.vermeer_hack) + if (0) { dd_SetDisplayMode(640, 480, 16, 0); } From 933fffe89d0b6d274fd478964143e5b952a83dcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:30:04 +0200 Subject: [PATCH 0060/1053] fix for last commit --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index ecc04d6..9d38296 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1184,7 +1184,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (0) + if (g_config.vermeer_hack) { dd_SetDisplayMode(640, 480, 16, 0); } From af861ff2ee9007edfa098030058a4e30ed7cfa9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 04:35:55 +0200 Subject: [PATCH 0061/1053] update vermeer preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2fed051..eaab99a 100644 --- a/src/config.c +++ b/src/config.c @@ -687,7 +687,6 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" - "devmode=true\n" "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" @@ -1031,6 +1030,7 @@ static void cfg_create_ini() "\n" "; Vermeer\n" "[vermeer]\n" + "adjmouse=true\n" "vermeer_hack=true\n" "\n" "; Wizardry 8\n" From ecc56d4cbc2d958005c012f202704f89f58d073f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 10:19:46 +0200 Subject: [PATCH 0062/1053] add some more error checks to IAT hooker --- inc/utils.h | 1 + src/hook.c | 42 ++++++++++++++---------------------------- src/utils.c | 25 +++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index fdb6b7f..4eee8a6 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_is_avx_supported(); void util_limit_game_ticks(); diff --git a/src/hook.c b/src/hook.c index 224e411..ba2ad7e 100644 --- a/src/hook.c +++ b/src/hook.c @@ -188,20 +188,23 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, while (import_desc->FirstThunk) { + if (!import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - HMODULE cur_mod = GetModuleHandle(hooks[i].module_name); + HMODULE cur_mod = GetModuleHandleA(hooks[i].module_name); PIMAGE_THUNK_DATA first_thunk = (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); - PIMAGE_THUNK_DATA original_first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); - while (first_thunk->u1.Function) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) @@ -260,7 +263,6 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, } first_thunk++; - original_first_thunk++; } } } @@ -298,6 +300,12 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc while (import_desc->FirstThunk) { + if (!import_desc->OriginalFirstThunk || !import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); @@ -325,30 +333,8 @@ 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; - /* avoid exceptions with obfuscated binaries in debug build */ -#if defined(_DEBUG) || defined(__GNUC__) - MEMORY_BASIC_INFORMATION mbi = { 0 }; - if (VirtualQuery((void*)import->Name, &mbi, sizeof(mbi))) - { - DWORD mask = ( - PAGE_READONLY | - PAGE_READWRITE | - PAGE_WRITECOPY | - PAGE_EXECUTE_READ | - PAGE_EXECUTE_READWRITE | - PAGE_EXECUTE_WRITECOPY); - - BOOL b = !(mbi.Protect & mask); - - if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) - b = TRUE; - - if (b) - continue; - } - else + if (util_is_bad_read_ptr((void*)import->Name)) continue; -#endif if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { diff --git a/src/utils.c b/src/utils.c index bddc06b..446d342 100644 --- a/src/utils.c +++ b/src/utils.c @@ -11,6 +11,31 @@ #include "config.h" +BOOL util_is_bad_read_ptr(void* p) +{ + MEMORY_BASIC_INFORMATION mbi = { 0 }; + if (VirtualQuery(p, &mbi, sizeof(mbi))) + { + DWORD mask = ( + PAGE_READONLY | + PAGE_READWRITE | + PAGE_WRITECOPY | + PAGE_EXECUTE_READ | + PAGE_EXECUTE_READWRITE | + PAGE_EXECUTE_WRITECOPY); + + BOOL b = !(mbi.Protect & mask); + + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + b = TRUE; + + if (!b) + return b; + } + + return TRUE; +} + BOOL util_is_minimized(HWND hwnd) { RECT rc = { 0 }; From ed2fa9331a01ed9935a67fe392f171793e320910 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 10:42:15 +0200 Subject: [PATCH 0063/1053] some more IAT hook tweaks --- src/hook.c | 45 +++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/hook.c b/src/hook.c index ba2ad7e..110120c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -9,6 +9,7 @@ #include "debug.h" #include "dllmain.h" #include "config.h" +#include "utils.h" #ifdef _MSC_VER #include "detours.h" @@ -196,14 +197,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 + (DWORD)(import_desc->Name)); + char* imp_module_name = (char*)((DWORD)dos_header + 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 = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); while (first_thunk->u1.Function) { @@ -264,6 +264,8 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, first_thunk++; } + + break; } } @@ -308,22 +310,25 @@ 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 + (DWORD)(import_desc->Name)); + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + 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 original_first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); - - while (first_thunk->u1.Function && original_first_thunk->u1.AddressOfData) + while (first_thunk->u1.Function) { - PIMAGE_IMPORT_BY_NAME import = - (PIMAGE_IMPORT_BY_NAME)((DWORD)dos_header + original_first_thunk->u1.AddressOfData); + if (!o_first_thunk->u1.AddressOfData) + { + first_thunk++; + o_first_thunk++; + continue; + } - if ((original_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + + if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { @@ -336,7 +341,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (util_is_bad_read_ptr((void*)import->Name)) continue; - if (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) + if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -373,8 +378,10 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } first_thunk++; - original_first_thunk++; + o_first_thunk++; } + + break; } } @@ -408,7 +415,13 @@ BOOL hook_got_ddraw_import() while (import_desc->FirstThunk) { - char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + if (!import_desc->Name) + { + import_desc++; + continue; + } + + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, "ddraw.dll") == 0) { From 3d8e05996d707b89afde89ecdfb8843f1b398cc9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 11:05:11 +0200 Subject: [PATCH 0064/1053] add GNUC check --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 110120c..ebd1c26 100644 --- a/src/hook.c +++ b/src/hook.c @@ -338,8 +338,10 @@ 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 defined(__GNUC__) if (util_is_bad_read_ptr((void*)import->Name)) continue; +#endif if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { From d194865299efe1a7233a525796e49fbbe9e2c804 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 12:26:39 +0200 Subject: [PATCH 0065/1053] update atrox preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index eaab99a..42b6f5a 100644 --- a/src/config.c +++ b/src/config.c @@ -344,8 +344,6 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" - "renderer=gdi\n" - "hook=2\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 30023e00a8d52fcc9d318eddddf02ab605eea70a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 14:00:01 +0200 Subject: [PATCH 0066/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index af7cd22..e8bacc5 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 5 -#define VERSION_MINOR 8 +#define VERSION_MINOR 9 #define VERSION_BUILD 0 -#define VERSION_REVISION 4 +#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 4da01c3683d29ee5c85d96d6396c7d4e97f4b63b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 14:51:19 +0200 Subject: [PATCH 0067/1053] fix util_is_bad_read_ptr --- src/utils.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 446d342..6c0f91e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -29,8 +29,7 @@ BOOL util_is_bad_read_ptr(void* p) if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) b = TRUE; - if (!b) - return b; + return b; } return TRUE; From 44794a84784fb8c0e23cd1c13497872a6d7d7465 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 20 Oct 2023 15:08:10 +0200 Subject: [PATCH 0068/1053] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2505635..0faf14f 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad 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) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) +Wine (Linux/macOS) only: override `ddraw` in [winecfg](https://wiki.winehq.org/Winecfg#Libraries) manually or run cnc-ddraw config.exe once.   From 5fc3764253af35406053403d8b55712ec1529262 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:27:59 +0200 Subject: [PATCH 0069/1053] add fallback solution for rgb555 texture format issues --- src/dd.c | 2 +- src/render_d3d9.c | 54 +++++++++++++++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9d38296..ab5fc5b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1441,7 +1441,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute TRACE(" proc_affinity=%08X, system_affinity=%08X\n", proc_affinity, system_affinity); } - + if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) { g_ddraw->d3d9on12 = TRUE; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index cae506b..ead6db2 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -275,17 +275,49 @@ static BOOL d3d9_create_resources() for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) { - err = err || FAILED( - IDirect3DDevice9_CreateTexture( - g_d3d9.device, - g_d3d9.tex_width, - g_d3d9.tex_height, - 1, - 0, - g_ddraw->bpp == 16 ? (g_config.rgb555 ? D3DFMT_X1R5G5B5 : D3DFMT_R5G6B5) : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, - D3DPOOL_MANAGED, - &g_d3d9.surface_tex[i], - 0)); + if (g_ddraw->bpp == 16 && g_config.rgb555) + { + BOOL error = FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_X1R5G5B5, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_A1R5G5B5, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } + } + else + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } err = err || !g_d3d9.surface_tex[i]; From f7a8f3a083efc6b0157dfb48ebce2f20ca1093ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:29:13 +0200 Subject: [PATCH 0070/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index e8bacc5..df8acc9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 5 #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 6a4159d73eb11a9d5a0001510b669996980b8b8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 06:50:24 +0200 Subject: [PATCH 0071/1053] add fallback solution for 32bit texture format --- src/render_d3d9.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index ead6db2..daf7393 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -304,6 +304,35 @@ static BOOL d3d9_create_resources() 0)); } } + else if (g_ddraw->bpp == 32) + { + BOOL error = FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_X8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + g_d3d9.tex_width, + g_d3d9.tex_height, + 1, + 0, + D3DFMT_A8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.surface_tex[i], + 0)); + } + } else { err = err || FAILED( @@ -313,7 +342,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : g_ddraw->bpp == 32 ? D3DFMT_X8R8G8B8 : D3DFMT_L8, + g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); From 26f3a0a5d2c322280b9c91a0a8c36727a8270801 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 07:02:51 +0200 Subject: [PATCH 0072/1053] add fallback solution for palette texture --- src/render_d3d9.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index daf7393..fa5914f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -288,7 +288,7 @@ static BOOL d3d9_create_resources() D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); - + if (error) { err = err || FAILED( @@ -352,7 +352,7 @@ static BOOL d3d9_create_resources() if (g_ddraw->bpp == 8) { - err = err || FAILED( + BOOL error = FAILED( IDirect3DDevice9_CreateTexture( g_d3d9.device, 256, @@ -364,6 +364,21 @@ static BOOL d3d9_create_resources() &g_d3d9.palette_tex[i], 0)); + if (error) + { + err = err || FAILED( + IDirect3DDevice9_CreateTexture( + g_d3d9.device, + 256, + 256, + 1, + 0, + D3DFMT_A8R8G8B8, + D3DPOOL_MANAGED, + &g_d3d9.palette_tex[i], + 0)); + } + err = err || !g_d3d9.palette_tex[i]; } } From 6513df2111ad5d2819be0a784dc4f4a43a5a5511 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 07:40:01 +0200 Subject: [PATCH 0073/1053] add NULL checks --- src/render_ogl.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 79b1477..ce01a5f 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -935,7 +935,9 @@ static void ogl_render() static void ogl_delete_context(HGLRC context) { - HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); + if (g_ogl.surface_tex) + HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); + glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); if (g_ddraw->bpp == 8) @@ -985,6 +987,9 @@ static void ogl_delete_context(HGLRC context) static BOOL ogl_texture_upload_test() { + if (!g_ogl.surface_tex) + return TRUE; + static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; int i; @@ -1043,6 +1048,9 @@ static BOOL ogl_texture_upload_test() static BOOL ogl_shader_test() { + if (!g_ogl.surface_tex) + return TRUE; + BOOL result = TRUE; if (g_ddraw->bpp != 8) From 64f58ef2d24d617dc8504dff25921eac1db7a59b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 08:55:28 +0200 Subject: [PATCH 0074/1053] restore old bmp screenshot code as fallback solution --- src/screenshot.c | 86 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 4 deletions(-) diff --git a/src/screenshot.c b/src/screenshot.c index d559101..d03e029 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -9,6 +9,7 @@ #include "blt.h" #include "config.h" +static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src); static BOOL ss_screenshot_8bit(char* filename, IDirectDrawSurfaceImpl* src) { @@ -154,16 +155,93 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) if (src->bpp == 8 && src->palette) { - return ss_screenshot_8bit(filename, src); + if (!ss_screenshot_8bit(filename, src)) + return ss_screenshot_bmp(filename, src); + + return TRUE; } else if (src->bpp == 16) { - return ss_screenshot_16bit(filename, src); + if (!ss_screenshot_bmp(filename, src)) + return ss_screenshot_bmp(filename, src); + + return TRUE; } else if (src->bpp == 32) { - return ss_screenshot_32bit(filename, src); - } + if (!ss_screenshot_32bit(filename, src)) + return ss_screenshot_bmp(filename, src); + return TRUE; + } + return FALSE; } + +static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) +{ + BOOL result = TRUE; + + // make sure file extension is correct + char* ext = filename + strlen(filename) - 4; + + if (_strcmpi(ext, ".png") == 0) + { + strncpy(ext, ".bmp", 4); + } + + // Create the .BMP file. + HANDLE hf = CreateFile( + filename, + GENERIC_READ | GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + (HANDLE)NULL); + + if (hf == INVALID_HANDLE_VALUE) + return FALSE; + + PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)src->bmi; + BITMAPFILEHEADER hdr; + + hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M" + // Compute the size of the entire file. + hdr.bfSize = (DWORD)(sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage); + hdr.bfReserved1 = 0; + hdr.bfReserved2 = 0; + + // Compute the offset to the array of color indices. + hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD); + + // Copy the BITMAPFILEHEADER into the .BMP file. + DWORD tmp; + if (!WriteFile(hf, (LPVOID)&hdr, sizeof(BITMAPFILEHEADER), (LPDWORD)&tmp, NULL)) + { + result = FALSE; + } + + // Copy the BITMAPINFOHEADER and RGBQUAD array into the file. + if (!WriteFile(hf, (LPVOID)pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof(RGBQUAD), (LPDWORD)&tmp, (NULL))) + { + result = FALSE; + } + + // Copy the array of color indices into the .BMP file. + DWORD cb = pbih->biSizeImage; + DWORD total = pbih->biSizeImage; + + if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL)) + { + result = FALSE; + } + + // Close the .BMP file. + if (!CloseHandle(hf)) + { + result = FALSE; + } + + return result; +} From 77319903fb9c2b5e640fd6ba8b705bd476208b25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 21 Oct 2023 09:07:38 +0200 Subject: [PATCH 0075/1053] remove unused var --- src/screenshot.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/screenshot.c b/src/screenshot.c index d03e029..4ed72fc 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -230,8 +230,6 @@ static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) // Copy the array of color indices into the .BMP file. DWORD cb = pbih->biSizeImage; - DWORD total = pbih->biSizeImage; - if (!WriteFile(hf, (LPSTR)dds_GetBuffer(src), (int)cb, (LPDWORD)&tmp, NULL)) { result = FALSE; From 9b259d4ec60521bbac869ef57b9ecabcf5cd7aca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:28:22 +0200 Subject: [PATCH 0076/1053] update build.bat path --- build.bat | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.bat b/build.bat index 85a89a6..b3508d8 100644 --- a/build.bat +++ b/build.bat @@ -2,7 +2,7 @@ REM REM cnc-patch environment config REM -set PATH=C:\win-builds-patch-32\bin -gmake clean -gmake +set PATH=C:\w64devkit\bin +make clean +make pause From 589b422d938e9526e35c5745bee50ae1694a6c24 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:46:13 +0200 Subject: [PATCH 0077/1053] fix some warnings --- src/IDirectDraw/IDirectDraw.c | 10 ++++++++++ src/ddsurface.c | 8 ++++---- src/debug.c | 5 +++-- src/render_d3d9.c | 2 +- src/render_gdi.c | 2 +- src/render_ogl.c | 4 ++-- src/screenshot.c | 4 ++-- src/utils.c | 2 +- 8 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 35cd482..9a96270 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -159,7 +159,13 @@ ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) { TRACE("-> %s(This=%p)\n", __FUNCTION__, This); ULONG ret = ++This->ref; + +#ifdef _DEBUG ULONG glob_ref = dd_AddRef(); +#else + dd_AddRef(); +#endif + TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; } @@ -177,7 +183,11 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HeapFree(GetProcessHeap(), 0, This); } +#ifdef _DEBUG ULONG glob_ref = dd_Release(); +#else + dd_Release(); +#endif TRACE("<- %s(This ref=%u, global ref=%u)\n", __FUNCTION__, ret, glob_ref); return ret; diff --git a/src/ddsurface.c b/src/ddsurface.c index e50fb21..bf47588 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -753,13 +753,13 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); - HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer(&This->bitmap, backbuffer->bitmap); - HDC dc = (HDC)InterlockedExchangePointer(&This->hdc, backbuffer->hdc); + HBITMAP bitmap = (HBITMAP)InterlockedExchangePointer((void*)&This->bitmap, backbuffer->bitmap); + HDC dc = (HDC)InterlockedExchangePointer((void*)&This->hdc, backbuffer->hdc); HANDLE map = (HANDLE)InterlockedExchangePointer(&This->mapping, backbuffer->mapping); InterlockedExchangePointer(&backbuffer->surface, buf); - InterlockedExchangePointer(&backbuffer->bitmap, bitmap); - InterlockedExchangePointer(&backbuffer->hdc, dc); + InterlockedExchangePointer((void*)&backbuffer->bitmap, bitmap); + InterlockedExchangePointer((void*)&backbuffer->hdc, dc); InterlockedExchangePointer(&backbuffer->mapping, map); if (g_config.flipclear) diff --git a/src/debug.c b/src/debug.c index aaa8cb7..eb5a875 100644 --- a/src/debug.c +++ b/src/debug.c @@ -16,11 +16,12 @@ 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 int g_dbg_crash_count = 0; static FILE* g_dbg_log_file; static BOOL g_dbg_log_rotate; -#if _DEBUG +#ifdef _DEBUG +static int g_dbg_crash_count = 0; + int dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index fa5914f..d8d3d88 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -617,7 +617,7 @@ DWORD WINAPI d3d9_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + 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 40d5263..8576450 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -84,7 +84,7 @@ DWORD WINAPI gdi_render_main(void) if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + 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 ce01a5f..141073b 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -156,7 +156,7 @@ static void ogl_build_programs() { char shader_path[MAX_PATH] = { 0 }; - strncpy(shader_path, g_config.shader, sizeof(shader_path) - 1); + strncpy(shader_path, g_config.shader, sizeof(shader_path)); if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { @@ -770,7 +770,7 @@ static void ogl_render() if (g_config.fixchilds) { g_ddraw->child_window_exists = FALSE; - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, NULL); + 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/screenshot.c b/src/screenshot.c index 4ed72fc..2c4db21 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -162,7 +162,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) } else if (src->bpp == 16) { - if (!ss_screenshot_bmp(filename, src)) + if (!ss_screenshot_16bit(filename, src)) return ss_screenshot_bmp(filename, src); return TRUE; @@ -187,7 +187,7 @@ static BOOL ss_screenshot_bmp(char* filename, IDirectDrawSurfaceImpl* src) if (_strcmpi(ext, ".png") == 0) { - strncpy(ext, ".bmp", 4); + strncpy(ext, ".bmp", 5); } // Create the .BMP file. diff --git a/src/utils.c b/src/utils.c index 6c0f91e..2f97674 100644 --- a/src/utils.c +++ b/src/utils.c @@ -501,7 +501,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { - InterlockedExchangePointer(&g_ddraw->video_window_hwnd, hwnd); + InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, hwnd); } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); From 0f08cbcc65e04ac0f91a98931d108b10b6a3ae1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 22 Oct 2023 11:54:21 +0200 Subject: [PATCH 0078/1053] update makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 332982d..8d072df 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ WINDRES ?= windres LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O2 -march=i486 +CFLAGS = -std=c99 -O2 LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From bae707f865dbd2d39e2b846c6533b4354d0f751e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 08:20:25 +0200 Subject: [PATCH 0079/1053] use different function to enumarte modules for mingw build --- inc/utils.h | 1 + src/hook.c | 28 ++------------------------ src/utils.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 26 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 4eee8a6..2e2e779 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -5,6 +5,7 @@ #include +HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_is_avx_supported(); diff --git a/src/hook.c b/src/hook.c index ebd1c26..b6a7a6a 100644 --- a/src/hook.c +++ b/src/hook.c @@ -474,17 +474,8 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; - HANDLE process = NULL; -#ifndef _MSC_VER - HMODULE mods[512]; - memset(mods, 0, sizeof(mods)); - process = GetCurrentProcess(); - EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); - for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) -#else - while (hmod = DetourEnumerateModules(hmod)) -#endif + while ((hmod = util_enumerate_modules(hmod))) { if (hmod == g_ddraw_module) continue; @@ -515,9 +506,6 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) } } } - - if (process) - CloseHandle(process); } } @@ -561,17 +549,8 @@ void hook_revert(HOOKLIST* hooks) char mod_dir[MAX_PATH] = { 0 }; char mod_filename[MAX_PATH] = { 0 }; HMODULE hmod = NULL; - HANDLE process = NULL; -#ifndef _MSC_VER - HMODULE mods[512]; - memset(mods, 0, sizeof(mods)); - process = GetCurrentProcess(); - EnumProcessModules(process, mods, sizeof(mods) - sizeof(mods[0]), NULL); - for (int i = 0; i < sizeof(mods) / sizeof(mods[0]) && (hmod = mods[i]); i++) -#else - while (hmod = DetourEnumerateModules(hmod)) -#endif + while ((hmod = util_enumerate_modules(hmod))) { if (hmod == g_ddraw_module) continue; @@ -591,9 +570,6 @@ void hook_revert(HOOKLIST* hooks) } } } - - if (process) - CloseHandle(process); } } diff --git a/src/utils.c b/src/utils.c index 2f97674..41a4c08 100644 --- a/src/utils.c +++ b/src/utils.c @@ -11,6 +11,63 @@ #include "config.h" +/* + The following code is licensed under the MIT license: + DetourEnumerateModules + Copyright (c) Microsoft Corporation + https://github.com/microsoft/Detours +*/ +#define MM_ALLOCATION_GRANULARITY 0x10000 + +HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) +{ + PBYTE pbLast = (PBYTE)hModuleLast + MM_ALLOCATION_GRANULARITY; + + MEMORY_BASIC_INFORMATION mbi; + ZeroMemory(&mbi, sizeof(mbi)); + + // Find the next memory region that contains a mapped PE image. + // + for (;; pbLast = (PBYTE)mbi.BaseAddress + mbi.RegionSize) { + if (VirtualQuery(pbLast, &mbi, sizeof(mbi)) <= 0) { + break; + } + + // Skip uncommitted regions and guard pages. + // + if ((mbi.State != MEM_COMMIT) || + ((mbi.Protect & 0xff) == PAGE_NOACCESS) || + (mbi.Protect & PAGE_GUARD)) { + continue; + } + + __try { + PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)pbLast; + if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE || + (DWORD)pDosHeader->e_lfanew > mbi.RegionSize || + (DWORD)pDosHeader->e_lfanew < sizeof(*pDosHeader)) { + continue; + } + + PIMAGE_NT_HEADERS pNtHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDosHeader + + pDosHeader->e_lfanew); + if (pNtHeader->Signature != IMAGE_NT_SIGNATURE) { + continue; + } + + return (HMODULE)pDosHeader; + } +#if defined(_MSC_VER) +#pragma prefast(suppress:28940, "A bad pointer means this probably isn't a PE header.") +#endif + __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? + EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) { + continue; + } + } + return NULL; +} + BOOL util_is_bad_read_ptr(void* p) { MEMORY_BASIC_INFORMATION mbi = { 0 }; From df52dd869a40141ec3b14da52c2928e4a5c95459 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 12:16:44 +0200 Subject: [PATCH 0080/1053] improve IAT hook performance --- inc/hook.h | 10 +++++++++- src/hook.c | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ed453fc..6ebb33b 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -8,7 +8,15 @@ #define HOOK_SKIP_2 0x00000001l #define HOOK_LOCAL_ONLY 0x00000002l -typedef struct HOOKLISTDATA { char function_name[32]; PROC new_function; PROC* function; DWORD flags; } HOOKLISTDATA; +typedef struct HOOKLISTDATA { + char function_name[32]; + PROC new_function; + PROC* function; + DWORD flags; + PROC org_function; + HMODULE mod; +} HOOKLISTDATA; + typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); diff --git a/src/hook.c b/src/hook.c index b6a7a6a..5b2500b 100644 --- a/src/hook.c +++ b/src/hook.c @@ -209,10 +209,17 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { - DWORD org_function = - (DWORD)real_GetProcAddress( - cur_mod, - hooks[i].data[x].function_name); + /* GetProcAddress is slow, save the pointer and reuse it for better performance */ + DWORD org_function = (DWORD)InterlockedExchangeAdd((LONG*)&hooks[i].data[x].org_function, 0); + + if (!org_function || cur_mod != hooks[i].data[x].mod) + { + hooks[i].data[x].mod = cur_mod; + + org_function = (DWORD)real_GetProcAddress(cur_mod, hooks[i].data[x].function_name); + + InterlockedExchange((LONG*)&hooks[i].data[x].org_function, (LONG)org_function); + } if (!hooks[i].data[x].new_function || !org_function) continue; @@ -357,7 +364,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc { DWORD org = (DWORD)real_GetProcAddress( - GetModuleHandle(hooks[i].module_name), + GetModuleHandleA(hooks[i].module_name), hooks[i].data[x].function_name); if (org && first_thunk->u1.Function != org) From 8d64f660ec7b59c86aee97811fd5f3cf954ea071 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 23 Oct 2023 13:38:24 +0200 Subject: [PATCH 0081/1053] hook only when a new module was loaded --- src/winapi_hooks.c | 72 ++++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 28 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7efbb76..ca4f9a2 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -994,96 +994,112 @@ HFONT WINAPI fake_CreateFontA( HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) { + HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryA(lpLibFileName); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) { + HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryW(lpLibFileName); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { + HMODULE hmod_old = GetModuleHandleA(lpLibFileName); HMODULE hmod = real_LoadLibraryExA(lpLibFileName, hFile, dwFlags); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) { + HMODULE hmod_old = GetModuleHandleW(lpLibFileName); HMODULE hmod = real_LoadLibraryExW(lpLibFileName, hFile, dwFlags); #ifdef _DEBUG char mod_path[MAX_PATH] = { 0 }; - if (hmod && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) + if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod); } #endif - if (hmod && hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + if (hmod && hmod != hmod_old) { - dinput_hook_init(); - } + if (hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } - hook_init(FALSE); + hook_init(FALSE); + } return hmod; } From 312dd07312db79ca5f438bfa5918836df6b6b2d4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 30 Oct 2023 19:47:27 +0100 Subject: [PATCH 0082/1053] update makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8d072df..20da2fb 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ -include config.mk WINDRES ?= windres -LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O2 +LDFLAGS = -Wl,--enable-stdcall-fixup -s +CFLAGS = -Iinc -O2 -march=pentium4 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ From 6eec2443780767b6fd9e02ab55c7dae78c768954 Mon Sep 17 00:00:00 2001 From: andrews05 Date: Tue, 31 Oct 2023 18:39:55 +1300 Subject: [PATCH 0083/1053] Use double for maintas --- src/dd.c | 4 ++-- src/utils.c | 4 ++-- src/wndproc.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index ab5fc5b..81d4109 100644 --- a/src/dd.c +++ b/src/dd.c @@ -802,12 +802,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)(((double)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 41a4c08..986d123 100644 --- a/src/utils.c +++ b/src/utils.c @@ -381,11 +381,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((double)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index db1c00a..aaa85a3 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ 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)) { - float scaleH = (float)g_ddraw->height / g_ddraw->width; - float scaleW = (float)g_ddraw->width / g_ddraw->height; + double scaleH = (double)g_ddraw->height / g_ddraw->width; + double scaleW = (double)g_ddraw->width / g_ddraw->height; switch (wParam) { From 1b00f020435d49a8754a33b73df9600392d90f04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 31 Oct 2023 16:18:56 +0100 Subject: [PATCH 0084/1053] update atrox preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 42b6f5a..a7fa470 100644 --- a/src/config.c +++ b/src/config.c @@ -344,6 +344,7 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "hook=3\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 275e68137b9c9a94eb665b82667c34fdbc683c2b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 1 Nov 2023 12:16:22 +0100 Subject: [PATCH 0085/1053] tweak IAT hooker checks --- src/hook.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/hook.c b/src/hook.c index 5b2500b..4173613 100644 --- a/src/hook.c +++ b/src/hook.c @@ -181,12 +181,14 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + 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 == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { if (!import_desc->Name) @@ -301,12 +303,14 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + 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 == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { if (!import_desc->OriginalFirstThunk || !import_desc->Name) @@ -416,25 +420,24 @@ BOOL hook_got_ddraw_import() if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return FALSE; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + 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 == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return FALSE; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { - if (!import_desc->Name) + if (import_desc->Name) { - import_desc++; - continue; - } + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); - char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); - - if (_stricmp(imp_module_name, "ddraw.dll") == 0) - { - return TRUE; + if (_stricmp(imp_module_name, "ddraw.dll") == 0) + { + return TRUE; + } } import_desc++; From c029c9c1e5bb027e711615c0583d590371b1505e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 02:56:15 +0100 Subject: [PATCH 0086/1053] #262 add preset for gruntz --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index a7fa470..75afda6 100644 --- a/src/config.c +++ b/src/config.c @@ -730,6 +730,12 @@ static void cfg_create_ini() "[Gta_61]\n" "singlecpu=false\n" "\n" + "; Gruntz\n" + "[GRUNTZ]\n" + "adjmouse=true\n" + "noactivateapp=true\n" + "nonexclusive=true\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From f79b7db8cdf4baf76e4635ebbe341c926537a0b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 03:14:32 +0100 Subject: [PATCH 0087/1053] add new .ini function ini_section_exists --- inc/ini.h | 1 + src/ini.c | 29 ++++++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/inc/ini.h b/inc/ini.h index dfcee82..e3f073c 100644 --- a/inc/ini.h +++ b/inc/ini.h @@ -12,6 +12,7 @@ typedef struct } INIFILE; void ini_create(INIFILE* ini, char* filename); +BOOL ini_section_exists(INIFILE* ini, LPCSTR section); DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size); BOOL ini_get_bool(INIFILE* ini, LPCSTR section, LPCSTR key, BOOL def); int ini_get_int(INIFILE* ini, LPCSTR section, LPCSTR key, int def); diff --git a/src/ini.c b/src/ini.c index b71f275..3304000 100644 --- a/src/ini.c +++ b/src/ini.c @@ -67,6 +67,33 @@ void ini_create(INIFILE* ini, char* filename) } } +BOOL ini_section_exists(INIFILE* ini, LPCSTR section) +{ + if (!ini || !ini->sections || !section || strlen(section) == 0) + { + return FALSE; + } + + char s[MAX_PATH]; + strncpy(s, section, sizeof(s) - 1); + s[sizeof(s) - 1] = 0; + + for (char* p = s; *p; ++p) + *p = tolower(*p); + + unsigned long hash = Crc32_ComputeBuf(0, s, strlen(s)); + + for (int i = 0; ini->sections[i].hash; i++) + { + if (ini->sections[i].hash == hash) + { + return TRUE; + } + } + + return FALSE; +} + DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR buf, DWORD size) { if (!buf || size == 0) @@ -88,7 +115,7 @@ DWORD ini_get_string(INIFILE* ini, LPCSTR section, LPCSTR key, LPCSTR def, LPSTR char s[MAX_PATH]; strncpy(s, section, sizeof(s) - 1); - buf[sizeof(s) - 1] = 0; + s[sizeof(s) - 1] = 0; for (char* p = s; *p; ++p) *p = tolower(*p); From e9b585f440a9c5d5ea891262501a72d18996914e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 03:20:30 +0100 Subject: [PATCH 0088/1053] move is_wine bool to g_config --- inc/config.h | 1 + inc/dd.h | 1 - src/config.c | 2 ++ src/dd.c | 9 ++++----- src/ddsurface.c | 2 +- src/opengl_utils.c | 3 ++- src/wndproc.c | 10 +++++----- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/inc/config.h b/inc/config.h index f609bab..2b2435e 100644 --- a/inc/config.h +++ b/inc/config.h @@ -16,6 +16,7 @@ typedef struct CNCDDRAWCONFIG char process_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; INIFILE ini; + BOOL is_wine; /* Optional settings */ diff --git a/inc/dd.h b/inc/dd.h index 1ab5d64..2e3e09f 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -124,7 +124,6 @@ typedef struct CNCDDRAW BOOL iscnc1; BOOL iskkndx; LONG upscale_hack_active; - BOOL wine; HCURSOR old_cursor; int show_cursor_count; BOOL alt_key_down; diff --git a/src/config.c b/src/config.c index 75afda6..b8209a1 100644 --- a/src/config.c +++ b/src/config.c @@ -1067,6 +1067,8 @@ static void cfg_create_ini() static void cfg_init() { + g_config.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { diff --git a/src/dd.c b/src/dd.c index 81d4109..47a0b36 100644 --- a/src/dd.c +++ b/src/dd.c @@ -855,7 +855,7 @@ 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->wine) + if (!g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -888,7 +888,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (g_ddraw->wine) + if (g_config.is_wine) { real_SetWindowLongA( g_ddraw->hwnd, @@ -1015,7 +1015,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); } - if (g_ddraw->wine) + if (g_config.is_wine) { real_SetWindowLongA( g_ddraw->hwnd, @@ -1391,7 +1391,6 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute InitializeCriticalSection(&g_ddraw->cs); g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); - g_ddraw->wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; g_blt_use_avx = util_is_avx_supported(); if (g_config.minfps > 1000) @@ -1473,7 +1472,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!g_ddraw->wine && d3d9_is_available()) + if (!g_config.is_wine && d3d9_is_available()) { g_ddraw->renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index bf47588..09ade3b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -955,7 +955,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_config.fixnotresponding && !g_ddraw->wine) + if (g_ddraw && g_config.fixnotresponding && !g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e775a90..a1bfbae 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -4,6 +4,7 @@ #include "dd.h" #include "debug.h" #include "hook.h" +#include "config.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -211,7 +212,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (g_ddraw->wine && glversion && glversion[0] == '2') // macOS + if (g_config.is_wine && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/wndproc.c b/src/wndproc.c index aaa85a3..930a5c1 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -228,7 +228,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (g_ddraw->wine && + if (g_config.is_wine && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_ddraw->wine && !g_config.fullscreen && g_ddraw->render.thread)) + if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw->render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -477,7 +477,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!g_ddraw->wine) /* hack: disable aero snap */ + if (!g_config.is_wine) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); @@ -490,7 +490,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !g_ddraw->wine) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); @@ -594,7 +594,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_ddraw->wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) + if (g_config.is_wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From 7ef71421b0db9881d400142a25ad12ac5d31bb9c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:08:51 +0100 Subject: [PATCH 0089/1053] add option to apply wine specific settings --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index b8209a1..397c923 100644 --- a/src/config.c +++ b/src/config.c @@ -1120,6 +1120,22 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; + if (g_config.is_wine) + { + char section[MAX_PATH] = { 0 }; + _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); + + if (ini_section_exists(&g_config.ini, section)) + { + DWORD x = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); + + if (x > 0) + return x; + + return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + } + } + DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); if (s > 0) From b8cef05a9c4b27ac1437255868c72b3b10310219 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:16:59 +0100 Subject: [PATCH 0090/1053] make sure at least one function is imported --- src/hook.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/hook.c b/src/hook.c index 4173613..f101e72 100644 --- a/src/hook.c +++ b/src/hook.c @@ -436,7 +436,10 @@ BOOL hook_got_ddraw_import() if (_stricmp(imp_module_name, "ddraw.dll") == 0) { - return TRUE; + PIMAGE_THUNK_DATA first_thunk = (void*)((DWORD)dos_header + import_desc->FirstThunk); + + if (first_thunk->u1.Function) + return TRUE; } } From d95423f5e6d88c2a5b56291cf9ccfed90c5be65c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:26:19 +0100 Subject: [PATCH 0091/1053] also check imported dlls for ddraw.dll import --- src/hook.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/hook.c b/src/hook.c index f101e72..a7a4b27 100644 --- a/src/hook.c +++ b/src/hook.c @@ -406,13 +406,14 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } } -BOOL hook_got_ddraw_import() +BOOL hook_got_ddraw_import(HMODULE mod, BOOL check_imported_dlls) { + if (!mod) + return FALSE; + __try { - HMODULE hmod = GetModuleHandleA(NULL); - - PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)hmod; + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return FALSE; @@ -441,6 +442,11 @@ BOOL hook_got_ddraw_import() if (first_thunk->u1.Function) return TRUE; } + else if (check_imported_dlls) + { + if (hook_got_ddraw_import(GetModuleHandleA(imp_module_name), FALSE)) + return TRUE; + } } import_desc++; @@ -596,7 +602,7 @@ void hook_init(BOOL initial_hook) { if (initial_hook) { - if (g_config.hook == 4 && hook_got_ddraw_import()) + if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE)) { /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; From c43f38fad3f63660b793a4590a7499b5883a0e15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 04:45:41 +0100 Subject: [PATCH 0092/1053] improve mingw build - always hook dinput --- src/hook.c | 7 ------- src/winapi_hooks.c | 16 +++++++++++++++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/hook.c b/src/hook.c index a7a4b27..e53f062 100644 --- a/src/hook.c +++ b/src/hook.c @@ -607,13 +607,6 @@ void hook_init(BOOL initial_hook) /* Switch to 3 if we can be sure that ddraw.dll will not be unloaded from the process */ g_config.hook = 3; } - -#if defined(__GNUC__) - if (g_config.hook == 4) - { - g_config.hook = 3; - } -#endif } if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ca4f9a2..a24a6fe 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1114,9 +1114,23 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) } #endif + BOOL hook = g_config.hook == 3; + +#if defined(__GNUC__) + if (g_config.hook == 4 && hModule && HIWORD(lpProcName)) + { + if (strcmp(lpProcName, "DirectInputCreateA") == 0 || + strcmp(lpProcName, "DirectInputCreateEx") == 0 || + strcmp(lpProcName, "DirectInput8Create") == 0) + { + hook = TRUE; + } + } +#endif + FARPROC proc = real_GetProcAddress(hModule, lpProcName); - if (g_config.hook != 3 || !hModule || !HIWORD(lpProcName)) + if (!hook || !hModule || !HIWORD(lpProcName)) return proc; for (int i = 0; g_hook_hooklist[i].module_name[0]; i++) From d04f9d3fa3d66a78f96d72ca0eb23aa1a2c119dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:09:06 +0100 Subject: [PATCH 0093/1053] make sure we always hook dinput --- src/winapi_hooks.c | 62 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a24a6fe..7ea7257 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -16,6 +16,7 @@ #include "ddclipper.h" #include "dllmain.h" #include "hook.h" +#include "directinput.h" BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) @@ -1005,15 +1006,15 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1033,15 +1034,15 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1061,15 +1062,15 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || + _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_strcmpi(lpLibFileName, "dinput.dll") == 0 || _strcmpi(lpLibFileName, "dinput") == 0 || - _strcmpi(lpLibFileName, "dinput8.dll") == 0 || _strcmpi(lpLibFileName, "dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1089,15 +1090,15 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw } #endif + if (hmod && hmod != g_ddraw_module && lpLibFileName && + (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || + _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) + { + dinput_hook_init(); + } + if (hmod && hmod != hmod_old) { - if (hmod != g_ddraw_module && lpLibFileName && - (_wcsicmp(lpLibFileName, L"dinput.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput") == 0 || - _wcsicmp(lpLibFileName, L"dinput8.dll") == 0 || _wcsicmp(lpLibFileName, L"dinput8") == 0)) - { - dinput_hook_init(); - } - hook_init(FALSE); } @@ -1119,11 +1120,12 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) #if defined(__GNUC__) if (g_config.hook == 4 && hModule && HIWORD(lpProcName)) { - if (strcmp(lpProcName, "DirectInputCreateA") == 0 || - strcmp(lpProcName, "DirectInputCreateEx") == 0 || + if (strcmp(lpProcName, "DirectInputCreateA") == 0 || + strcmp(lpProcName, "DirectInputCreateEx") == 0 || strcmp(lpProcName, "DirectInput8Create") == 0) { hook = TRUE; + g_dinput_hook_active = TRUE; } } #endif From c1a0a3a0465482ba28c7c2582a9fb5f7528b154e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:21:40 +0100 Subject: [PATCH 0094/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index df8acc9..56b8c1c 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 5 -#define VERSION_MINOR 9 +#define VERSION_MINOR 6 #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 189ce116747fb91686577fa87364198b33a0f9bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:22:34 +0100 Subject: [PATCH 0095/1053] update atrox preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 397c923..1f36d97 100644 --- a/src/config.c +++ b/src/config.c @@ -344,7 +344,6 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" - "hook=3\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 5d6d0915b01e3c94262da8dcdf375b3ea9d4ef56 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 Nov 2023 05:25:05 +0100 Subject: [PATCH 0096/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 56b8c1c..1e49441 100644 --- a/inc/version.h +++ b/inc/version.h @@ -4,8 +4,8 @@ #define str(s) #s #define ver_str(a,b,c,d) str(a) "." str(b) "." str(c) "." str(d) -#define VERSION_MAJOR 5 -#define VERSION_MINOR 6 +#define VERSION_MAJOR 6 +#define VERSION_MINOR 0 #define VERSION_BUILD 0 #define VERSION_REVISION 0 From 1443b13432d8dab83a4afb6f7a8048c46eb5e242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Nov 2023 02:17:39 +0100 Subject: [PATCH 0097/1053] unlock cursor on dialog boxes in windowed mode --- src/utils.c | 2 +- src/wndproc.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 986d123..8e62c26 100644 --- a/src/utils.c +++ b/src/utils.c @@ -549,7 +549,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //TRACE_EXT(" AVIWINDOW class=%s\n", class_name); + //TRACE(" AVIWINDOW class=%s\n", class_name); if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || diff --git a/src/wndproc.c b/src/wndproc.c index 930a5c1..445d271 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -560,6 +560,43 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } + if (wParam == WA_INACTIVE) + { + if (g_config.windowed && !g_config.fullscreen && lParam && GetParent((HWND)lParam) == hWnd) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA((HWND)lParam, class_name, sizeof(class_name) - 1); + + if (strcmp(class_name, "#32770") == 0) // dialog box + { + mouse_unlock(); + + /* + // Center to main window + RECT rc_main = { 0 }; + RECT rc_dialog = { 0 }; + RECT rc = { 0 }; + + real_GetWindowRect(hWnd, &rc_main); + real_GetWindowRect((HWND)lParam, &rc_dialog); + CopyRect(&rc, &rc_main); + + OffsetRect(&rc_dialog, -rc_dialog.left, -rc_dialog.top); + OffsetRect(&rc, -rc.left, -rc.top); + OffsetRect(&rc, -rc_dialog.right, -rc_dialog.bottom); + + real_SetWindowPos( + (HWND)lParam, + HWND_TOP, + rc_main.left + (rc.right / 2), + rc_main.top + (rc.bottom / 2), + 0, 0, + SWP_NOSIZE); + */ + } + } + } + //if (g_ddraw->windowed || g_ddraw->noactivateapp) if (!g_config.allow_wmactivate) From 8cfe73e834096e6821f6bfaa9fce3916d5e10dbf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 5 Nov 2023 02:19:40 +0100 Subject: [PATCH 0098/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 1e49441..c2c3092 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #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 07d26d7bed687f45d0506462bf1acb7b39e72983 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 Nov 2023 23:58:10 +0100 Subject: [PATCH 0099/1053] always use full path to avoid issues with working directories in wine --- config/ConfigFormUnit.cpp | 20 +++++++++++--------- config/cnc-ddraw config.cpp | 6 +++++- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 5b51d7d..4dac099 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -24,6 +24,8 @@ int Savesettings; int Resolutions; int Minfps; +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + //--------------------------------------------------------------------------- __fastcall TConfigForm::TConfigForm(TComponent* Owner) : TForm(Owner) @@ -41,7 +43,7 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -58,7 +60,7 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -87,7 +89,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - DeleteFile(".\\ddraw.ini"); + DeleteFile(GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -670,11 +672,11 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(".\\ddraw.dll") && !FileExists(".\\ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); - HMODULE ddraw = LoadLibraryW(L".\\ddraw.dll"); + HMODULE ddraw = LoadLibraryW((GAME_PATH + "ddraw.dll").w_str()); if (ddraw) { @@ -694,7 +696,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -902,8 +904,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) CompatibilityBtn->Visible = !GetBool(ini, "hide_compat_tab", false); RestoreDefaultsBtn->Visible = - FileExists(".\\ddraw.dll") && - FileExists(".\\ddraw.ini") && + FileExists(GAME_PATH + "ddraw.dll") && + FileExists(GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -916,7 +918,7 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 7cb64d5..0760b13 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -3,6 +3,7 @@ #include #pragma hdrstop #include +#include #include #include //--------------------------------------------------------------------------- @@ -10,6 +11,9 @@ #include USEFORM("ConfigFormUnit.cpp", ConfigForm); //--------------------------------------------------------------------------- + +#define GAME_PATH (TPath::GetDirectoryName(Application->ExeName) + "\\") + int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) { try @@ -31,7 +35,7 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(".\\ddraw.ini"); + auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( From ec36b6d7bcfbbd4f273f02e458b119937d8539a0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 Nov 2023 00:18:17 +0100 Subject: [PATCH 0100/1053] export DDIsWindowed function so fan patched games can query the windowed state --- ddraw.def | 1 + inc/version.h | 2 +- src/dllmain.c | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/ddraw.def b/ddraw.def index c1b0b64..ff672bc 100644 --- a/ddraw.def +++ b/ddraw.def @@ -20,3 +20,4 @@ EXPORTS DirectInput8Create = fake_DirectInput8Create GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA + DDIsWindowed diff --git a/inc/version.h b/inc/version.h index c2c3092..0c15ac6 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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) diff --git a/src/dllmain.c b/src/dllmain.c index bf6c556..ad00d68 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -133,6 +133,11 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) return TRUE; } +BOOL DDIsWindowed() +{ + return g_config.windowed && !g_config.fullscreen; +} + HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); From 434fb4de9969672499007bb82a76f09c3abd7d54 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:16:23 +0100 Subject: [PATCH 0101/1053] add support for alt+enter in fullscreen upscaled mode --- inc/config.h | 3 ++- inc/version.h | 2 +- src/config.c | 10 +++++++--- src/utils.c | 15 +++++++++++++-- src/wndproc.c | 4 ++-- 5 files changed, 25 insertions(+), 9 deletions(-) diff --git a/inc/config.h b/inc/config.h index 2b2435e..34c8c66 100644 --- a/inc/config.h +++ b/inc/config.h @@ -10,7 +10,7 @@ typedef struct CNCDDRAWCONFIG { RECT window_rect; int window_state; - int borderless_state; + int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; char process_file_name[MAX_PATH]; @@ -37,6 +37,7 @@ typedef struct CNCDDRAWCONFIG BOOL vhack; char screenshot_dir[MAX_PATH]; BOOL toggle_borderless; + BOOL toggle_upscaled; /* Compatibility settings */ diff --git a/inc/version.h b/inc/version.h index 0c15ac6..70d7cff 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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) diff --git a/src/config.c b/src/config.c index 1f36d97..5cf7718 100644 --- a/src/config.c +++ b/src/config.c @@ -23,7 +23,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, #define GET_STRING(a,b,c,d) cfg_get_string(a, b, c, d); TRACE("%s=%s\n", a, c) CNCDDRAWCONFIG g_config = - { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .borderless_state = -1 }; + { .window_rect = {.left = -32000, .top = -32000, .right = 0, .bottom = 0 }, .window_state = -1, .upscaled_state = -1 }; void cfg_load() { @@ -52,6 +52,7 @@ void cfg_load() 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); + GET_BOOL(g_config.toggle_upscaled, "toggle_upscaled", FALSE); /* Compatibility settings */ @@ -148,9 +149,9 @@ void cfg_save() WritePrivateProfileString(section, "windowed", g_config.window_state ? "true" : "false", g_config.ini_path); } - if (g_config.borderless_state != -1) + if (g_config.upscaled_state != -1) { - WritePrivateProfileString(section, "fullscreen", g_config.borderless_state ? "true" : "false", g_config.ini_path); + WritePrivateProfileString(section, "fullscreen", g_config.upscaled_state ? "true" : "false", g_config.ini_path); } } @@ -235,6 +236,9 @@ static void cfg_create_ini() "; Switch between windowed/borderless modes with alt+enter rather than windowed/fullscreen modes\n" "toggle_borderless=false\n" "\n" + "; Switch between windowed/fullscreen upscaled modes with alt+enter rather than windowed/fullscreen modes\n" + "toggle_upscaled=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" diff --git a/src/utils.c b/src/utils.c index 8e62c26..763f271 100644 --- a/src/utils.c +++ b/src/utils.c @@ -421,7 +421,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_config.fullscreen = TRUE; + g_config.upscaled_state = g_config.fullscreen = TRUE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); mouse_lock(); @@ -430,7 +430,7 @@ void util_toggle_fullscreen() { mouse_unlock(); - g_config.borderless_state = g_config.fullscreen = FALSE; + g_config.upscaled_state = g_config.fullscreen = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); //mouse_lock(); @@ -442,6 +442,11 @@ void util_toggle_fullscreen() { mouse_unlock(); + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = TRUE; + } + g_config.window_state = g_config.windowed = FALSE; dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); @@ -451,6 +456,12 @@ void util_toggle_fullscreen() else { mouse_unlock(); + + if (g_config.toggle_upscaled) + { + g_config.upscaled_state = g_config.fullscreen = FALSE; + } + g_config.window_state = g_config.windowed = TRUE; if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) diff --git a/src/wndproc.c b/src/wndproc.c index 445d271..70c70d6 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -691,7 +691,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_TOGGLE_FULLSCREEN: { - if (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) + if (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) { /* Check if we are fullscreen/borderless already */ if (wParam == CNC_DDRAW_SET_FULLSCREEN && (!g_config.windowed || g_config.fullscreen)) @@ -731,7 +731,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen && - (!g_config.fullscreen || (g_config.windowed && g_config.toggle_borderless)) && + (!g_config.fullscreen || g_config.toggle_upscaled || (g_config.windowed && g_config.toggle_borderless)) && context_code && !key_state) { From 0e2342860bf755c0b4a8983b5eeed4a3b715bf5d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 14 Nov 2023 17:24:41 +0100 Subject: [PATCH 0102/1053] set new toggle_fullscreen bool --- config/ConfigFormUnit.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 4dac099..6ea9a24 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -927,15 +927,19 @@ void TConfigForm::SaveSettings() ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "false"); ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 1: ini->WriteString("ddraw", "windowed", "false"); ini->WriteString("ddraw", "fullscreen", "true"); + ini->WriteString("ddraw", "toggle_borderless", "false"); + ini->WriteString("ddraw", "toggle_upscaled", "true"); break; case 2: ini->WriteString("ddraw", "windowed", "true"); ini->WriteString("ddraw", "fullscreen", "true"); ini->WriteString("ddraw", "toggle_borderless", "true"); + ini->WriteString("ddraw", "toggle_upscaled", "false"); break; case 3: ini->WriteString("ddraw", "windowed", "true"); From 1e9f3a0ab86f50a08165e83de08c46ec7c5bcc1f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 Nov 2023 02:26:19 +0100 Subject: [PATCH 0103/1053] fix custom resolution with high refresh rate monitors --- src/dd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 47a0b36..0534e04 100644 --- a/src/dd.c +++ b/src/dd.c @@ -171,6 +171,8 @@ HRESULT dd_EnumDisplayModes( m.dmSize = sizeof(DEVMODE); i = 0; + BOOL custom_res_injected = FALSE; + while (EnumDisplaySettings(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && @@ -183,10 +185,11 @@ HRESULT dd_EnumDisplayModes( while (--m.dmPelsWidth % 8); } - if (i == 0 && g_config.custom_width && g_config.custom_height) + if (!custom_res_injected && g_config.custom_width && g_config.custom_height) { m.dmPelsWidth = g_config.custom_width; m.dmPelsHeight = g_config.custom_height; + custom_res_injected = TRUE; } TRACE( From 91796c71c14b51742c0db57c7ccfe169be210d3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 Nov 2023 02:25:16 +0100 Subject: [PATCH 0104/1053] set lpSurface on failure --- inc/version.h | 2 +- src/ddsurface.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 70d7cff..47df2cf 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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) diff --git a/src/ddsurface.c b/src/ddsurface.c index 09ade3b..cbea99f 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -972,6 +972,8 @@ HRESULT dds_Lock( lpDestRect->right > This->width || lpDestRect->bottom > This->height) { + lpDDSurfaceDesc->lpSurface = NULL; + return DDERR_INVALIDPARAMS; } From c08ccb61c43f56da438aacd939f5ec37dc3f526e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Dec 2023 18:12:51 +0100 Subject: [PATCH 0105/1053] remove GetBltStatus from logs --- src/IDirectDraw/IDirectDrawSurface.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index ebe71b7..c7775af 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -284,9 +284,9 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface( HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - TRACE_EXT("<- %s\n", __FUNCTION__); + //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } From 3ab1f7ff11628ed6ff38063bdccf6fec615ba6e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 8 Dec 2023 00:51:16 +0100 Subject: [PATCH 0106/1053] #267 allow to override .ini path via env var --- config/ConfigFormUnit.cpp | 36 +++++++++++++++++++++++++++++------- config/cnc-ddraw config.cpp | 7 ++++++- inc/version.h | 2 +- src/config.c | 27 ++++++++++++++------------- 4 files changed, 50 insertions(+), 22 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 6ea9a24..3954825 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -43,7 +43,12 @@ void __fastcall TConfigForm::CreateParams(TCreateParams & Params) void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) { - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + ini->WriteString("ddraw", "configlang", IsEnglish ? "auto" : "english"); delete ini; @@ -60,7 +65,12 @@ void __fastcall TConfigForm::LanguageImgClick(TObject *Sender) void __fastcall TConfigForm::ThemePnlClick(TObject *Sender) { - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto theme = ThemePnl->Color == (TColor)RGB(31, 31, 31) ? "Cobalt XEMedia" : "Windows10"; @@ -89,7 +99,10 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) return; } - DeleteFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + DeleteFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); ShellExecute( NULL, @@ -671,8 +684,12 @@ void __fastcall TConfigForm::CompatibilityBtnClick(TObject *Sender) void __fastcall TConfigForm::FormCreate(TObject *Sender) { + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + /* Let cnc-ddraw create a new ddraw.ini if it doesn't exist */ - if (FileExists(GAME_PATH + "ddraw.dll") && !FileExists(GAME_PATH + "ddraw.ini")) { + if (FileExists(GAME_PATH + "ddraw.dll") && + !FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini")) { SetEnvironmentVariableW(L"cnc_ddraw_config_init", L"1"); @@ -696,7 +713,8 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) } } - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); if (ini->ReadString("ddraw", "configtheme", "Windows10") == "Cobalt XEMedia") { @@ -905,7 +923,7 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RestoreDefaultsBtn->Visible = FileExists(GAME_PATH + "ddraw.dll") && - FileExists(GAME_PATH + "ddraw.ini") && + FileExists(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini") && GetBool(ini, "allow_reset", true); delete ini; @@ -918,7 +936,11 @@ void TConfigForm::SaveSettings() if (!Initialized) return; - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); /* Display Settings */ diff --git a/config/cnc-ddraw config.cpp b/config/cnc-ddraw config.cpp index 0760b13..4c3dd33 100644 --- a/config/cnc-ddraw config.cpp +++ b/config/cnc-ddraw config.cpp @@ -35,7 +35,12 @@ int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int) return 0; } - auto *ini = new TIniFile(GAME_PATH + "ddraw.ini"); + auto iniPath = System::Sysutils::GetEnvironmentVariable( + "CNC_DDRAW_CONFIG_FILE"); + + auto *ini = + new TIniFile(iniPath.Length() ? iniPath : GAME_PATH + "ddraw.ini"); + auto theme = ini->ReadString("ddraw", "configtheme", "Windows10"); TStyleManager::TrySetStyle( diff --git a/inc/version.h b/inc/version.h index 47df2cf..7d4039c 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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) diff --git a/src/config.c b/src/config.c index 5cf7718..185b2aa 100644 --- a/src/config.c +++ b/src/config.c @@ -1090,26 +1090,27 @@ static void cfg_init() } } - /* set up settings ini */ - - if (strlen(g_config.game_path) > 0) + if (!GetEnvironmentVariableA("CNC_DDRAW_CONFIG_FILE", g_config.ini_path, sizeof(g_config.ini_path) - 1)) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); - - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + if (strlen(g_config.game_path) > 0) { - cfg_create_ini(); - } + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); - if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + cfg_create_ini(); + } + + if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) + { + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + } + } + else { strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); } } - else - { - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); - } if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { From dc3be1243ac720827c1ce1c3dc6e7fb26eb33685 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 12 Dec 2023 00:39:25 +0100 Subject: [PATCH 0107/1053] #269 add workaround for Quest for Glory 5 movies --- inc/IDirectDrawSurface.h | 1 + src/ddsurface.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/IDirectDrawSurface.h b/inc/IDirectDrawSurface.h index 5c1a26d..e339450 100644 --- a/inc/IDirectDrawSurface.h +++ b/inc/IDirectDrawSurface.h @@ -42,6 +42,7 @@ typedef struct IDirectDrawSurfaceImpl DWORD last_flip_tick; DWORD last_blt_tick; BOOL queried; + BOOL skip_flip; /* Quest for Glory 5 */ struct IDirectDrawSurfaceImpl* backbuffer; struct IDirectDrawClipperImpl* clipper; diff --git a/src/ddsurface.c b/src/ddsurface.c index cbea99f..29314bd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -747,7 +747,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa { dbg_dump_dds_flip_flags(dwFlags); - if (This->backbuffer) + if (This->backbuffer && !This->skip_flip) { EnterCriticalSection(&g_ddraw->cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; @@ -775,6 +775,8 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa } } + This->skip_flip = FALSE; + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) { This->last_flip_tick = timeGetTime(); @@ -1318,6 +1320,8 @@ HRESULT dd_CreateSurface( g_ddraw->primary->height == g_ddraw->height && g_ddraw->primary->bpp == g_ddraw->bpp) { + g_ddraw->primary->skip_flip = TRUE; + *lpDDSurface = g_ddraw->primary; IDirectDrawSurface_AddRef(g_ddraw->primary); From 564419562fc250b717b9a26454e9f5aa7ee5079e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 13 Dec 2023 00:28:13 +0100 Subject: [PATCH 0108/1053] #270 always clear entire screen --- inc/version.h | 2 +- src/render_ogl.c | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7d4039c..7a74663 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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) diff --git a/src/render_ogl.c b/src/render_ogl.c index 141073b..028e55e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -804,10 +804,7 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) - { - glClear(GL_COLOR_BUFFER_BIT); - } + glClear(GL_COLOR_BUFFER_BIT); if (scale_changed) { From 68fe009736fc9f29d6cde58447cf2d834d0f452e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 14 Dec 2023 23:01:56 +0100 Subject: [PATCH 0109/1053] Revert "#270 always clear entire screen" This reverts commit 564419562fc250b717b9a26454e9f5aa7ee5079e. --- inc/version.h | 2 +- src/render_ogl.c | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7a74663..7d4039c 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#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) diff --git a/src/render_ogl.c b/src/render_ogl.c index 028e55e..141073b 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -804,7 +804,10 @@ static void ogl_render() LeaveCriticalSection(&g_ddraw->cs); - glClear(GL_COLOR_BUFFER_BIT); + if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + { + glClear(GL_COLOR_BUFFER_BIT); + } if (scale_changed) { From 9e8f24f38d1d36ff2e55557861ffc93a76f1471e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 17 Dec 2023 17:03:05 +0100 Subject: [PATCH 0110/1053] add preset for worms 2 --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 185b2aa..3552f7a 100644 --- a/src/config.c +++ b/src/config.c @@ -1047,6 +1047,10 @@ static void cfg_create_ini() "noactivateapp=true\n" "releasealt=true\n" "\n" + "; Worms 2\n" + "[worms2]\n" + "game_handles_close=true\n" + "\n" "; Worms Armageddon\n" "[WA]\n" "adjmouse=true\n" From ff1c8fb0a37f5363efca6086e2d180ef1942b3c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Dec 2023 01:35:44 +0100 Subject: [PATCH 0111/1053] Revert "Use double for maintas" This reverts commit 6eec2443780767b6fd9e02ab55c7dae78c768954. --- src/dd.c | 4 ++-- src/utils.c | 4 ++-- src/wndproc.c | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 0534e04..db4bdf2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -805,12 +805,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((double)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 763f271..3e2d686 100644 --- a/src/utils.c +++ b/src/utils.c @@ -381,11 +381,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((double)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((double)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index 70c70d6..d6f5543 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ 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; + float scaleH = (float)g_ddraw->height / g_ddraw->width; + float scaleW = (float)g_ddraw->width / g_ddraw->height; switch (wParam) { From 988cad0200e5d04ac1739e8e3f97cb020ee93163 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Dec 2023 01:40:49 +0100 Subject: [PATCH 0112/1053] use roundf for maintas --- src/dd.c | 3 ++- src/utils.c | 5 +++-- src/wndproc.c | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index db4bdf2..cb1bb3d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1,4 +1,5 @@ #include +#include #include "ddraw.h" #include "IDirectDraw.h" #include "dd.h" @@ -805,7 +806,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw->render.viewport.width = g_ddraw->render.width; g_ddraw->render.viewport.height = - (int)(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + (int)roundf(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); if (g_ddraw->render.viewport.height > g_ddraw->render.height) { diff --git a/src/utils.c b/src/utils.c index 3e2d686..2fbd72d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,5 +1,6 @@ #include #include +#include #include "ddraw.h" #include "debug.h" #include "dd.h" @@ -381,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)roundf(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)roundf(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index d6f5543..c0886c2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)roundf(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); break; } } From 2cbf45cc2fc621dd54b16ba30948936a3ec9c73b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 30 Dec 2023 22:16:55 +0100 Subject: [PATCH 0113/1053] add missing roundf --- src/dd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index cb1bb3d..a7ee93e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -811,11 +811,14 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_ddraw->render.viewport.height > g_ddraw->render.height) { g_ddraw->render.viewport.width = - (int)(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } + g_ddraw->render.viewport.width = min(g_ddraw->render.viewport.width, g_ddraw->render.width); + g_ddraw->render.viewport.height = min(g_ddraw->render.viewport.height, g_ddraw->render.height); + g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; } From a863d8cb33fd0e23023bd3c181508e512cc37cf4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:16:45 +0100 Subject: [PATCH 0114/1053] fix aspect ratio issues --- src/dd.c | 10 ++++++---- src/utils.c | 4 ++-- src/wndproc.c | 6 +++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/dd.c b/src/dd.c index a7ee93e..e943488 100644 --- a/src/dd.c +++ b/src/dd.c @@ -804,11 +804,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = - (int)roundf(((float)g_ddraw->height / g_ddraw->width) * g_ddraw->render.viewport.width); + float dst_ar = (float)g_ddraw->height / g_ddraw->width; + float src_ar = (float)g_ddraw->render.height / g_ddraw->render.width; - if (g_ddraw->render.viewport.height > g_ddraw->render.height) + g_ddraw->render.viewport.width = g_ddraw->render.width; + g_ddraw->render.viewport.height = (int)roundf(dst_ar * g_ddraw->render.viewport.width); + + if (src_ar < dst_ar) { g_ddraw->render.viewport.width = (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); diff --git a/src/utils.c b/src/utils.c index 2fbd72d..3f4e026 100644 --- a/src/utils.c +++ b/src/utils.c @@ -382,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)roundf(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)roundf(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index c0886c2..d6f5543 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)roundf(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)roundf(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); break; } } From 3e4833bda7594778ab031b33640cf9d867408cc8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:35:08 +0100 Subject: [PATCH 0115/1053] some more maintas tweaks --- src/dd.c | 8 ++++---- src/utils.c | 4 ++-- src/wndproc.c | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index e943488..5cbf6f7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -804,16 +804,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else if (g_config.maintas) { - float dst_ar = (float)g_ddraw->height / g_ddraw->width; - float src_ar = (float)g_ddraw->render.height / g_ddraw->render.width; + double dst_ar = (double)g_ddraw->height / g_ddraw->width; + double src_ar = (double)g_ddraw->render.height / g_ddraw->render.width; g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = (int)roundf(dst_ar * g_ddraw->render.viewport.width); + g_ddraw->render.viewport.height = (int)round(dst_ar * g_ddraw->render.viewport.width); if (src_ar < dst_ar) { g_ddraw->render.viewport.width = - (int)roundf(((float)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + (int)round(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); g_ddraw->render.viewport.height = g_ddraw->render.height; } diff --git a/src/utils.c b/src/utils.c index 3f4e026..c3c94d5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -382,11 +382,11 @@ void util_toggle_maximize() dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)(((float)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)round(((double)g_ddraw->height / g_ddraw->width) * w); if (dst_rc.bottom > h) { - dst_rc.right = (LONG)(((float)dst_rc.right / dst_rc.bottom) * h); + dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; } diff --git a/src/wndproc.c b/src/wndproc.c index d6f5543..b4451b8 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -314,8 +314,8 @@ 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)) { - float scaleH = (float)g_ddraw->height / g_ddraw->width; - float scaleW = (float)g_ddraw->width / g_ddraw->height; + double scaleH = (double)g_ddraw->height / g_ddraw->width; + double scaleW = (double)g_ddraw->width / g_ddraw->height; switch (wParam) { @@ -324,19 +324,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_LEFT: case WMSZ_RIGHT: { - windowrc->bottom += (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->bottom += (LONG)round(scaleH * clientrc.right - clientrc.bottom); break; } case WMSZ_TOP: case WMSZ_BOTTOM: { - windowrc->right += (LONG)(scaleW * clientrc.bottom - clientrc.right); + windowrc->right += (LONG)round(scaleW * clientrc.bottom - clientrc.right); break; } case WMSZ_TOPRIGHT: case WMSZ_TOPLEFT: { - windowrc->top -= (LONG)(scaleH * clientrc.right - clientrc.bottom); + windowrc->top -= (LONG)round(scaleH * clientrc.right - clientrc.bottom); break; } } From 8d24dde49c123331190cce7ab6c30ec9a6c5ffa2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Dec 2023 04:45:14 +0100 Subject: [PATCH 0116/1053] more maintas tweaks --- src/utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index c3c94d5..67665a7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -379,12 +379,15 @@ 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 src_ar = (double)h / w; + dst_rc.top = 0; dst_rc.left = 0; dst_rc.right = w; - dst_rc.bottom = (LONG)round(((double)g_ddraw->height / g_ddraw->width) * w); + dst_rc.bottom = (LONG)round(dst_ar * w); - if (dst_rc.bottom > h) + if (src_ar < dst_ar) { dst_rc.right = (LONG)round(((double)dst_rc.right / dst_rc.bottom) * h); dst_rc.bottom = h; From 7002639452c275e990ebab4152c5d537f5ce5610 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 20:44:04 +0100 Subject: [PATCH 0117/1053] #273 use 64bit aligned pitch --- src/dd.c | 18 +++++++++--------- src/ddsurface.c | 4 ++-- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 5cbf6f7..1edb49d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -211,7 +211,7 @@ HRESULT dd_EnumDisplayModes( s.dwRefreshRate = 60; s.dwHeight = m.dmPelsHeight; s.dwWidth = m.dmPelsWidth; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; s.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) @@ -237,7 +237,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -262,7 +262,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -331,7 +331,7 @@ HRESULT dd_EnumDisplayModes( s.dwRefreshRate = 60; s.dwHeight = resolutions[i].cy; s.dwWidth = resolutions[i].cx; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -353,7 +353,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xF800; s.ddpfPixelFormat.dwGBitMask = 0x07E0; s.ddpfPixelFormat.dwBBitMask = 0x001F; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -378,7 +378,7 @@ HRESULT dd_EnumDisplayModes( s.ddpfPixelFormat.dwRBitMask = 0xFF0000; s.ddpfPixelFormat.dwGBitMask = 0x00FF00; s.ddpfPixelFormat.dwBBitMask = 0x0000FF; - s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { @@ -481,7 +481,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; if (g_ddraw->bpp == 32 || g_config.vermeer_hack) { @@ -492,7 +492,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } else if (g_ddraw->bpp != 8) { @@ -503,7 +503,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3; + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } } diff --git a/src/ddsurface.c b/src/ddsurface.c index 29314bd..b45cc75 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1405,7 +1405,7 @@ HRESULT dd_CreateSurface( else if (dst_surface->width && dst_surface->height) { dst_surface->bytes_pp = dst_surface->bpp / 8; - dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 31) & ~31) >> 3; + dst_surface->pitch = ((dst_surface->width * dst_surface->bpp + 63) & ~63) >> 3; dst_surface->size = dst_surface->pitch * dst_surface->height; DWORD aligned_width = dst_surface->pitch / dst_surface->bytes_pp; @@ -1429,7 +1429,7 @@ HRESULT dd_CreateSurface( } dst_surface->bmi->bmiHeader.biSizeImage = - ((aligned_width * clr_bits + 31) & ~31) / 8 * dst_surface->height; + ((aligned_width * clr_bits + 63) & ~63) / 8 * dst_surface->height; if (dst_surface->bpp == 8) { From 8fdfafc7e3f5f4219a0458e7d1d1a672934f6e2e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 20:48:28 +0100 Subject: [PATCH 0118/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7d4039c..7a74663 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 #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 3212dad148a534e293eb973699efbd972988c1e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 9 Jan 2024 21:09:47 +0100 Subject: [PATCH 0119/1053] fix palette in bmp screenshots --- src/screenshot.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/screenshot.c b/src/screenshot.c index 2c4db21..d4c1b60 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -156,7 +156,11 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) if (src->bpp == 8 && src->palette) { if (!ss_screenshot_8bit(filename, src)) + { + memcpy(&src->bmi->bmiColors[0], src->palette->data_rgb, 256 * sizeof(int)); + return ss_screenshot_bmp(filename, src); + } return TRUE; } From 8a66959df9486aabc39ac9cd118cc6e32443116f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jan 2024 04:34:42 +0100 Subject: [PATCH 0120/1053] #270 make sure framebuffer is initialized with surface_tex --- 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 141073b..f666eb5 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -583,7 +583,7 @@ static void ogl_init_scale_program() 0, GL_RGBA, GL_UNSIGNED_BYTE, - 0); + g_ogl.surface_tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id, 0); From 1b86d1cc1c6665bd017d2447bc44901c285a31e3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Jan 2024 00:34:59 +0100 Subject: [PATCH 0121/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 7a74663..8c06a04 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 0 +#define VERSION_MINOR 1 #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 4cb4ce60b17a4931c7132aec86cab1381672d55c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jan 2024 22:49:51 +0100 Subject: [PATCH 0122/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 8c06a04..f07c491 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #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 cfc5441994b674168df5716a66d2d4414dd76bf1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 1 Feb 2024 18:19:46 +0100 Subject: [PATCH 0123/1053] update nova preset to support the new CE release (Fixes open pilot menu) --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 3552f7a..f187fe0 100644 --- a/src/config.c +++ b/src/config.c @@ -689,6 +689,7 @@ static void cfg_create_ini() "\n" "; Escape Velocity Nova\n" "[EV Nova]\n" + "nonexclusive=true\n" "hook_peekmessage=true\n" "rgb555=true\n" "keytogglefullscreen=0x46\n" From 0c5c9acecf82fecee03e5ea2cac5512f2013e680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Feb 2024 21:44:15 +0100 Subject: [PATCH 0124/1053] test --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f187fe0..bf37159 100644 --- a/src/config.c +++ b/src/config.c @@ -29,7 +29,7 @@ void cfg_load() { cfg_init(); - /* Optional settings */ + /* Optional settings */ GET_INT(g_config.window_rect.right, "width", 0); GET_INT(g_config.window_rect.bottom, "height", 0); From d147e916300a1947914b26b45d995cf7df888685 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 8 Feb 2024 22:54:16 +0100 Subject: [PATCH 0125/1053] adjust default shader path --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index bf37159..31f5a5f 100644 --- a/src/config.c +++ b/src/config.c @@ -40,7 +40,7 @@ void cfg_load() GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); GET_BOOL(g_config.adjmouse, "adjmouse", TRUE); - GET_STRING("shader", "Shaders\\cubic\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); + GET_STRING("shader", "Shaders\\interpolation\\catmull-rom-bilinear.glsl", g_config.shader, sizeof(g_config.shader)); GET_INT(g_config.window_rect.left, "posX", -32000); GET_INT(g_config.window_rect.top, "posY", -32000); GET_STRING("renderer", "auto", g_config.renderer, sizeof(g_config.renderer)); @@ -201,7 +201,7 @@ static void cfg_create_ini() "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n" "; Possible values: Nearest neighbor, Bilinear, Bicubic, Lanczos, xBR-lv2\n" - "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" + "shader=Shaders\\interpolation\\catmull-rom-bilinear.glsl\n" "\n" "; Window position, -32000 = center to screen\n" "posX=-32000\n" From d70d316c7ee279120e23639331a0951b1617bb46 Mon Sep 17 00:00:00 2001 From: egornovivan Date: Fri, 16 Feb 2024 22:55:17 +0500 Subject: [PATCH 0126/1053] Added support for subdir and sync of dll and ini names https://github.com/FunkyFr3sh/cnc-ddraw/issues/287 --- inc/config.h | 3 +++ src/config.c | 24 +++++++++++++++++++++--- src/render_ogl.c | 2 +- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index 34c8c66..562535e 100644 --- a/inc/config.h +++ b/inc/config.h @@ -13,8 +13,11 @@ typedef struct CNCDDRAWCONFIG int upscaled_state; char ini_path[MAX_PATH]; char game_path[MAX_PATH]; + char dll_path[MAX_PATH]; char process_file_name[MAX_PATH]; + char dll_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; + char dll_file_ext[MAX_PATH]; INIFILE ini; BOOL is_wine; diff --git a/src/config.c b/src/config.c index 31f5a5f..543def4 100644 --- a/src/config.c +++ b/src/config.c @@ -1095,11 +1095,29 @@ static void cfg_init() } } + /* get dll filename and directory */ + if (GetModuleFileNameA(g_ddraw_module, g_config.dll_path, sizeof(g_config.dll_path) - 1) > 0) + { + _splitpath(g_config.dll_path, NULL, NULL, g_config.dll_file_name, g_config.dll_file_ext); + + int len = strlen(g_config.dll_path) - strlen(g_config.dll_file_name) - strlen(g_config.dll_file_ext); + char* end = strstr(g_config.dll_path + len, g_config.dll_file_name); + + if (end) + { + *end = 0; + } + else + { + g_config.dll_path[0] = 0; + } + } + if (!GetEnvironmentVariableA("CNC_DDRAW_CONFIG_FILE", g_config.ini_path, sizeof(g_config.ini_path) - 1)) { - if (strlen(g_config.game_path) > 0) + if (strlen(g_config.dll_path) > 0 && strlen(g_config.dll_file_name) > 0) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.game_path); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { @@ -1108,7 +1126,7 @@ static void cfg_init() if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { - strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); } } else diff --git a/src/render_ogl.c b/src/render_ogl.c index f666eb5..6ff9a2c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -160,7 +160,7 @@ static void ogl_build_programs() if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.game_path, g_config.shader); + _snprintf(shader_path, sizeof(shader_path) - 1, "%s%s", g_config.dll_path, g_config.shader); } /* detect common upscaling shaders and disable them if no upscaling is required */ From 9ba2a78588610898a1294b38942e9c495dc2bb08 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 16 Feb 2024 21:12:58 +0100 Subject: [PATCH 0127/1053] keep subdir change but revert to using ddraw.ini filename --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 543def4..d405775 100644 --- a/src/config.c +++ b/src/config.c @@ -1117,7 +1117,10 @@ static void cfg_init() { if (strlen(g_config.dll_path) > 0 && strlen(g_config.dll_file_name) > 0) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); + _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%sddraw.ini", g_config.dll_path); + + /* Use this here instead to sync .ini filename with .dll filename - by egornovivan @ github */ + //_snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { @@ -1126,7 +1129,8 @@ static void cfg_init() if (GetFileAttributes(g_config.ini_path) == INVALID_FILE_ATTRIBUTES) { - _snprintf(g_config.ini_path, sizeof(g_config.ini_path) - 1, "%s%s.ini", g_config.dll_path, g_config.dll_file_name); + /* This might not actually be needed, but we keep it for now */ + strncpy(g_config.ini_path, ".\\ddraw.ini", sizeof(g_config.ini_path) - 1); } } else From 0f20a1a25fe69ddbb8936cc95bb836ec810f7341 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 06:27:18 +0100 Subject: [PATCH 0128/1053] fix wayland bug (linux) --- src/dd.c | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 1edb49d..eec2722 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1015,13 +1015,29 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if ((!d3d9_active || g_config.nonexclusive) && - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!d3d9_active || g_config.nonexclusive) { - g_ddraw->render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } + + /* + Fix wayland bug: + ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed + */ + if (g_config.is_wine && + (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } } if (g_config.is_wine) From 194fb5e371942235fe763f8e8f4dd4b6575c2568 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 06:33:56 +0100 Subject: [PATCH 0129/1053] add ChangeDisplaySettings(NULL, 0); just to be sure --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index eec2722..750e69b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1033,6 +1033,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { + ChangeDisplaySettings(NULL, 0); + g_ddraw->render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; From c8ef48c2c903042bcc864cdf57c671deec7fe7a5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 07:59:57 +0100 Subject: [PATCH 0130/1053] fix wayland bug (linux) --- src/dd.c | 30 ++++++++++++++++++++++++------ src/hook.c | 2 ++ src/utils.c | 1 + src/winapi_hooks.c | 25 +++++++++++++++++++++---- 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9027306..54ab14c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1006,13 +1006,31 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if ((!d3d9_active || g_config.nonexclusive) && - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!d3d9_active || g_config.nonexclusive) { - g_ddraw->render.run = FALSE; - g_config.windowed = TRUE; - g_config.fullscreen = TRUE; - return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + { + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } + + /* + Fix wayland bug: + ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed + */ + if (g_ddraw->wine && + (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + { + ChangeDisplaySettings(NULL, 0); + + g_ddraw->render.run = FALSE; + g_config.windowed = TRUE; + g_config.fullscreen = TRUE; + return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); + } } if (g_ddraw->wine) diff --git a/src/hook.c b/src/hook.c index 4aa653d..1d73afe 100644 --- a/src/hook.c +++ b/src/hook.c @@ -479,6 +479,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -555,6 +556,7 @@ void hook_revert(HOOKLIST* hooks) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) diff --git a/src/utils.c b/src/utils.c index 617beb8..028b93c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -472,6 +472,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "Afx:400000:3") == 0 || strcmp(class_name, "MCIWndClass") == 0) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3f9da2c..a165b39 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -840,9 +840,26 @@ int WINAPI fake_StretchDIBits( UINT iUsage, DWORD rop) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + HWND hwnd = WindowFromDC(hdc); + + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw && 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, "MCIAVI") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "Afx:400000:3") == 0 || + strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIWndClass") == 0)))) + { + if (0) // g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) { HDC primary_dc; dds_GetDC(g_ddraw->primary, &primary_dc); @@ -870,11 +887,11 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw->width > 0) + else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { return real_StretchDIBits( - hdc, + g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, (int)(DestWidth * g_ddraw->render.scale_w), From caa06c77c0f3d7c25fd37a91c6870e6c6722574f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 18:11:58 +0100 Subject: [PATCH 0131/1053] set g_ddraw_module right away --- src/dllmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index ad00d68..f26e4dd 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -26,6 +26,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { case DLL_PROCESS_ATTACH: { + g_ddraw_module = hDll; + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) { cfg_load(); @@ -40,8 +42,6 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_load(); - g_ddraw_module = hDll; - char buf[1024]; if (GetEnvironmentVariable("__COMPAT_LAYER", buf, sizeof(buf))) From eca7dde89e385c1d6f9cfdadebb82f7a6342fe4e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:18:42 +0100 Subject: [PATCH 0132/1053] fix videos in wine --- src/hook.c | 2 ++ src/utils.c | 1 + src/winapi_hooks.c | 22 +++++++++++++++++++--- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/hook.c b/src/hook.c index e53f062..5646765 100644 --- a/src/hook.c +++ b/src/hook.c @@ -517,6 +517,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -581,6 +582,7 @@ void hook_revert(HOOKLIST* hooks) BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; if (is_local || + _strcmpi(mod_filename, "mciavi32") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) diff --git a/src/utils.c b/src/utils.c index 67665a7..91fbcaf 100644 --- a/src/utils.c +++ b/src/utils.c @@ -568,6 +568,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 7ea7257..6492f59 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -763,6 +763,7 @@ BOOL WINAPI fake_StretchBlt( (hwnd == g_ddraw->hwnd || (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) { @@ -864,7 +865,22 @@ int WINAPI fake_StretchDIBits( UINT iUsage, DWORD rop) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + HWND hwnd = WindowFromDC(hdc); + + char class_name[MAX_PATH] = { 0 }; + + if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + { + GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + } + + if (g_ddraw && 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, "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)) { @@ -894,11 +910,11 @@ int WINAPI fake_StretchDIBits( return result; } } - else if (g_ddraw->width > 0) + else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { return real_StretchDIBits( - hdc, + g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, yDest + g_ddraw->render.viewport.y, (int)(DestWidth * g_ddraw->render.scale_w), From b87e5b78fb6f444128f94e6a93c6e5bea74fc144 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:21:43 +0100 Subject: [PATCH 0133/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index f07c491..608875f 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 1 #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 ac3486bebbcc64fadb2a1781c82db4a173b16a7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 17 Feb 2024 23:22:20 +0100 Subject: [PATCH 0134/1053] update copyright year --- ddraw.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ddraw.rc b/ddraw.rc index 551bfc0..69ba76c 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -12,7 +12,7 @@ PRODUCTVERSION VERSION VALUE "FileDescription", "DirectDraw replacement" VALUE "FileVersion", VERSION_STRING VALUE "InternalName", "ddraw" - VALUE "LegalCopyright", "Copyright (c) 2010-2023" + VALUE "LegalCopyright", "Copyright (c) 2010-2024" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "cnc-ddraw" From bc1bf81e15d62f20c8311cfb6d3b5aaffca87321 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 22 Feb 2024 03:51:09 +0100 Subject: [PATCH 0135/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 608875f..58f39f3 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 1 +#define VERSION_MINOR 2 #define VERSION_BUILD 0 -#define VERSION_REVISION 2 +#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 5b3a7b4994188df4ef6cec9e0028ddbe4b6998b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 25 Feb 2024 23:46:32 +0100 Subject: [PATCH 0136/1053] add debug code for possible DwmFlush failure --- inc/fps_limiter.h | 4 +++- src/dd.c | 6 +----- src/fps_limiter.c | 41 +++++++++++++++++++++++++++++++++-------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index 5c8049f..ec0f7bc 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -48,12 +48,14 @@ typedef struct FPSLIMITER D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; BOOL got_adapter; BOOL initialized; + CRITICAL_SECTION cs; + BOOL cs_initialized; } FPSLIMITER; extern FPSLIMITER g_fpsl; void fpsl_init(); -BOOL fpsl_wait_for_vblank(BOOL open_adapter); +BOOL fpsl_wait_for_vblank(); BOOL fpsl_dwm_flush(); BOOL fpsl_dwm_is_enabled(); void fpsl_frame_start(); diff --git a/src/dd.c b/src/dd.c index 750e69b..06abd7d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1224,11 +1224,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - BOOL open = - !(g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))); - - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open)) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return DD_OK; } diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 97c0ec1..90c8076 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -35,6 +35,12 @@ void fpsl_init() g_fpsl.D3DKMTCloseAdapter(&g_fpsl.close_adapter); } + if (!g_fpsl.cs_initialized) + { + g_fpsl.cs_initialized = TRUE; + InitializeCriticalSection(&g_fpsl.cs); + } + if (!g_fpsl.gdi32_dll) { g_fpsl.gdi32_dll = real_LoadLibraryA("gdi32.dll"); @@ -78,19 +84,26 @@ void fpsl_init() g_fpsl.initialized = TRUE; } -BOOL fpsl_wait_for_vblank(BOOL open_adapter) +BOOL fpsl_wait_for_vblank() { if (g_fpsl.initialized) { - if (open_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && !g_fpsl.got_adapter) + if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc) { - g_fpsl.adapter.hDc = g_ddraw->render.hdc; + EnterCriticalSection(&g_fpsl.cs); - if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) + if (!g_fpsl.got_adapter) { - g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; - g_fpsl.got_adapter = TRUE; + g_fpsl.adapter.hDc = g_ddraw->render.hdc; + + if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) + { + g_fpsl.vblank_event.hAdapter = g_fpsl.adapter.hAdapter; + g_fpsl.got_adapter = TRUE; + } } + + LeaveCriticalSection(&g_fpsl.cs); } if (g_fpsl.got_adapter && g_fpsl.D3DKMTWaitForVerticalBlankEvent) @@ -104,7 +117,19 @@ BOOL fpsl_wait_for_vblank(BOOL open_adapter) BOOL fpsl_dwm_flush() { - return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()); + 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() @@ -128,7 +153,7 @@ void fpsl_frame_end() if (g_config.maxfps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE)) + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return; } From 0d2845b4c7eae4b4e95946fcbccfa3036c3bf6c5 Mon Sep 17 00:00:00 2001 From: egornovivan Date: Sat, 2 Mar 2024 03:39:47 +0500 Subject: [PATCH 0137/1053] Add GHA workflow --- .github/workflows/build.yml | 130 +++++++++++++++++++++++ action.yml | 198 ++++++++++++++++++++++++++++++++++++ 2 files changed, 328 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 action.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..811df5d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,130 @@ +name: Build + +on: + push: + branches: + - 'master' + - 'develop' + - 'github-action' + paths: + - '.github/workflows/build.yml' + - 'action.yml' + +jobs: + Build: + runs-on: windows-2019 + steps: + +# - name: Install Windows XP Support for Visual Studio 2022 # windows-2022 # v141_xp # Installation takes more than 5 minutes +# run: | +# Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\" +# $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise" +# $componentsToAdd = @( +# "Microsoft.VisualStudio.Component.WinXP" +# ) +# [string]$workloadArgs = $componentsToAdd | ForEach-Object {" --add " + $_} +# $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache') +# $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden +# if ($process.ExitCode -eq 0) +# { +# Write-Host "components have been successfully added" +# Get-ChildItem C:\ProgramData\Microsoft\VisualStudio\Packages\Microsoft.Windows.XPSupport.* +# } +# else +# { +# Write-Host "components were not installed" +# exit 1 +# } + + - name: Clone cnc-ddraw + uses: actions/checkout@v4 + + - name: Release build + id: build-release + uses: ./ + with: + release: true + + - name: ReleaseWin2000 build + id: build-releasewin2000 + uses: ./ + with: + releasewin2000: true + + - name: Debug build + id: build-debug + uses: ./ + with: + debug: true + + - name: DebugLog build + id: build-debuglog + uses: ./ + with: + debuglog: true + + - name: DebugLogMini build + id: build-debuglogmini + uses: ./ + with: + debuglogmini: true + + - name: Prepare artifact + run: | + : + + mkdir -p cnc-ddraw-release + mkdir -p cnc-ddraw-releasewin2000 + mkdir -p cnc-ddraw-debug + mkdir -p cnc-ddraw-debuglog + mkdir -p cnc-ddraw-debuglogmini + + cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + + cp "${{ steps.build-releasewin2000.outputs.releasewin2000 }}" cnc-ddraw-releasewin2000 + + cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug + cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + + cp "${{ steps.build-debuglog.outputs.debuglog }}" cnc-ddraw-debuglog + cp "${{ steps.build-debuglog.outputs.debuglog-pdb }}" cnc-ddraw-debuglog + + cp "${{ steps.build-debuglogmini.outputs.debuglogmini }}" cnc-ddraw-debuglogmini + cp "${{ steps.build-debuglogmini.outputs.debuglogmini-pdb }}" cnc-ddraw-debuglogmini + + shell: bash + + - name: Upload artifacts cnc-ddraw-release + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-release + path: cnc-ddraw-release + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-releasewin2000 + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-releasewin2000 + path: cnc-ddraw-releasewin2000 + 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-debuglog + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-debuglog + path: cnc-ddraw-debuglog + retention-days: 14 + + - name: Upload artifacts cnc-ddraw-debuglogmini + uses: actions/upload-artifact@v4 + with: + name: cnc-ddraw-debuglogmini + path: cnc-ddraw-debuglogmini + retention-days: 14 diff --git a/action.yml b/action.yml new file mode 100644 index 0000000..0b1e1cc --- /dev/null +++ b/action.yml @@ -0,0 +1,198 @@ +#name: 'sfall' +#description: 'Builds sfall binaries' +#author: '@wipe2238' + +### +# +# Example: +# +# - name: Build sfall +# id: sfall +# 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" +# +### + +# While both inputs are marked as required, users needs to set only one of them (at minimum) to 'true' for action to work +inputs: + + release: + description: 'Set to true to enable building with Release configuration' + required: true + + releasewin2000: + description: 'Set to true to enable building with ReleaseWin2000 configuration' + required: true + + debug: + description: 'Set to true to enable building with Debug configuration' + required: true + + debuglog: + description: 'Set to true to enable building with DebugLog configuration' + required: true + + debuglogmini: + description: 'Set to true to enable building with DebugLogMini configuration' + required: true + +# Outputs are always using Windows directory separator (`\`) +outputs: + + release: + description: 'Full path to ddraw.dll built with Release configuration' + value: ${{ steps.build-release.outputs.ddraw-dll }} + + releasewin2000: + description: 'Full path to ddraw.dll built with ReleaseWin2000 configuration' + value: ${{ steps.build-releasewin2000.outputs.ddraw-dll }} + + debug: + description: 'Full path to ddraw.dll built with Debug configuration' + value: ${{ steps.build-debug.outputs.ddraw-dll }} + debug-pdb: + description: 'Full path to ddraw.pdb built with Debug configuration' + value: ${{ steps.build-debug.outputs.ddraw-pdb }} + + debuglog: + description: 'Full path to ddraw.dll built with DebugLog configuration' + value: ${{ steps.build-debuglog.outputs.ddraw-dll }} + debuglog-pdb: + description: 'Full path to ddraw.pdb built with DebugLog configuration' + value: ${{ steps.build-debuglog.outputs.ddraw-pdb }} + + debuglogmini: + description: 'Full path to ddraw.dll built with DebugLogMini configuration' + value: ${{ steps.build-debuglogmini.outputs.ddraw-dll }} + debuglogmini-pdb: + description: 'Full path to ddraw.pdb built with DebugLogMini configuration' + value: ${{ steps.build-debuglogmini.outputs.ddraw-pdb }} + +runs: + using: 'composite' + steps: + + # Quick check for things which should never happen + - name: Sanity checks + run: | + if [[ "${{ runner.os }}" != "Windows" ]]; then + echo "[ERROR] This action can only be used on Windows" + exit 1 + elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasewin2000 }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglog }}" != "true" ]] && [[ "${{ inputs.debuglogmini }}" != "true" ]]; then + echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasewin2000', 'debug', 'debuglog', 'debuglogmini'" + exit 1 + # + elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then + echo "[ERROR] Solution file not found -- '\\cnc-ddraw.sln'" + exit 1 + fi + # + shell: bash + + # MSBuild is not in PATH on Windows machines + # Using `::set-output` to make sure workflow environment remains unchanged + - name: Prepare MSBuild + id: msbuild + run: | + echo "::group::Prepare MSBuild" + + MSBUILD_EXE="$("/c/Program Files (x86)/Microsoft Visual Studio/Installer/vswhere.exe" -latest -requires Microsoft.Component.MSBuild -find MSBuild/**/Bin/MSBuild.exe)" + echo "exe=$MSBUILD_EXE" >> $GITHUB_OUTPUT + + echo "::endgroup::" + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build Release + id: build-release + run: | + if [[ "${{ inputs.release }}" == "true" ]]; then + echo ::group::Build Release + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build ReleaseWin2000 + id: build-releasewin2000 + run: | + if [[ "${{ inputs.releasewin2000 }}" == "true" ]]; then + echo ::group::Build ReleaseWin2000 + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseWin2000 -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseWin2000/ddraw.dll")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build Debug + id: build-debug + run: | + : + if [[ "${{ inputs.debug }}" == "true" ]]; then + echo "::group::Build Debug" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build DebugLog + id: build-debuglog + run: | + : + if [[ "${{ inputs.debuglog }}" == "true" ]]; then + echo "::group::Build DebugLog" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLog -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash + + # Creating empty `PostBuild.cmd` to avoid false-positive build error + - name: Build DebugLogMini + id: build-debuglogmini + run: | + : + if [[ "${{ inputs.debuglogmini }}" == "true" ]]; then + echo "::group::Build DebugLogMini" + + # + # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMini -p:Platform=x86 -p:PlatformToolset=v141_xp + # + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.pdb")" >> $GITHUB_OUTPUT + + echo "::endgroup::" + fi + shell: bash From 9880c3899ce453d39d31f6465089703374230ace Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 2 Mar 2024 05:02:05 +0100 Subject: [PATCH 0138/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 58f39f3..2e1ad8a 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 2 #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 5082a40a3d8cf8528c3948d8d4a1240cc2da416a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 3 Mar 2024 02:53:07 +0100 Subject: [PATCH 0139/1053] fix debug build --- inc/debug.h | 2 +- src/debug.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index 1d3e6c4..f7c81d1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -4,7 +4,7 @@ #define WIN32_LEAN_AND_MEAN #include -int dbg_exception_handler(EXCEPTION_POINTERS* exception); +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char* format, ...); diff --git a/src/debug.c b/src/debug.c index eb5a875..b63c88e 100644 --- a/src/debug.c +++ b/src/debug.c @@ -22,7 +22,7 @@ static BOOL g_dbg_log_rotate; #ifdef _DEBUG static int g_dbg_crash_count = 0; -int dbg_exception_handler(EXCEPTION_POINTERS* exception) +LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception) { g_dbg_crash_count++; From 9e000720e416a71bd8fc6ce2b18daf4d7a19b257 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:42:15 +0100 Subject: [PATCH 0140/1053] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index d4c1b60..4299b8b 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -150,7 +150,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); - strftime(str_time, sizeof(str_time), "%Y-%m-%d-%H_%M_%S", localtime(&t)); + 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 (src->bpp == 8 && src->palette) From 6cc99330bd99527241211f175df81d8bf9073964 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 7 Mar 2024 17:45:04 +0100 Subject: [PATCH 0141/1053] fix screenshot names --- src/screenshot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/screenshot.c b/src/screenshot.c index 4299b8b..88d559c 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -151,7 +151,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) CreateDirectoryA(g_config.screenshot_dir, NULL); 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); + _snprintf(filename, sizeof(filename) - 1, "%s%s_%s.png", g_config.screenshot_dir, title, str_time); if (src->bpp == 8 && src->palette) { From 488bad66d86e36fbe09d421a63fae572d0d80a84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 9 Mar 2024 21:33:38 +0100 Subject: [PATCH 0142/1053] make sure you can host "no-hd" games with 640x480 --- src/dd.c | 3 ++- src/render_d3d9.c | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 06abd7d..7b8c426 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1512,8 +1512,9 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->ref--; } - + TRACE("Alloc\n"); IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); + TRACE("Alloc: dd=%p\n", dd); memcpy(&dd->guid, iid, sizeof(dd->guid)); if (IsEqualGUID(&IID_IDirectDraw, iid)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d8d3d88..0d4aae4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -25,13 +25,21 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; + TRACE("d3d9_is_available\n"); + if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { + TRACE("d3d9_is_available: mod=%p\n", g_d3d9.hmodule); + IDirect3D9* (WINAPI * d3d_create9)(UINT) = (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + TRACE("d3d9_is_available: d3d_create9=%p\n", d3d_create9); + if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - IDirect3D9_Release(d3d9); + { + TRACE("d3d9_is_available: release=%d\n", IDirect3D9_Release(d3d9)); + } } return d3d9 != NULL; From 951871669c0e9516c688aebecec39a3eae7b528b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 9 Mar 2024 21:38:24 +0100 Subject: [PATCH 0143/1053] Revert "make sure you can host "no-hd" games with 640x480" This reverts commit 488bad66d86e36fbe09d421a63fae572d0d80a84. --- src/dd.c | 3 +-- src/render_d3d9.c | 10 +--------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 7b8c426..06abd7d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1512,9 +1512,8 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute g_ddraw->ref--; } - TRACE("Alloc\n"); + IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); - TRACE("Alloc: dd=%p\n", dd); memcpy(&dd->guid, iid, sizeof(dd->guid)); if (IsEqualGUID(&IID_IDirectDraw, iid)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 0d4aae4..d8d3d88 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -25,21 +25,13 @@ BOOL d3d9_is_available() { LPDIRECT3D9 d3d9 = NULL; - TRACE("d3d9_is_available\n"); - if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { - TRACE("d3d9_is_available: mod=%p\n", g_d3d9.hmodule); - IDirect3D9* (WINAPI * d3d_create9)(UINT) = (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - TRACE("d3d9_is_available: d3d_create9=%p\n", d3d_create9); - if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - { - TRACE("d3d9_is_available: release=%d\n", IDirect3D9_Release(d3d9)); - } + IDirect3D9_Release(d3d9); } return d3d9 != NULL; From f2d1e9e3e6d8c5b7749b128b633b4d3226f66f01 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 10 Mar 2024 16:56:46 +0100 Subject: [PATCH 0144/1053] log d3d9on12 module ptr --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index d8d3d88..e755008 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -76,7 +76,7 @@ BOOL d3d9_create() if (SUCCEEDED(hr)) { TRACE("+--Direct3D9-------------------------------------\n"); - TRACE("| D3D9On12: %s\n", d3d9on12 != NULL ? "True" : "False"); + TRACE("| D3D9On12: %s (%p)\n", d3d9on12 != NULL ? "True" : "False", GetModuleHandleA("d3d9on12.dll")); TRACE("| VendorId: 0x%x\n", ai.VendorId); TRACE("| DeviceId: 0x%x\n", ai.DeviceId); TRACE("| Revision: 0x%x\n", ai.Revision); From 82571fe8dbdd16119c0deb0637dc8e5d35214e64 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 11 Mar 2024 17:48:27 +0100 Subject: [PATCH 0145/1053] #295 add workaround for Win11 steam RA2 crash --- inc/config.h | 2 ++ inc/dd.h | 2 -- src/dd.c | 4 ++-- src/dllmain.c | 6 ++++++ src/opengl_utils.c | 2 +- src/render_d3d9.c | 26 +++++++++++++++++++++----- 6 files changed, 32 insertions(+), 10 deletions(-) diff --git a/inc/config.h b/inc/config.h index 562535e..fe0f885 100644 --- a/inc/config.h +++ b/inc/config.h @@ -20,6 +20,8 @@ typedef struct CNCDDRAWCONFIG char dll_file_ext[MAX_PATH]; INIFILE ini; BOOL is_wine; + BOOL d3d9on12; + BOOL opengl_core; /* Optional settings */ diff --git a/inc/dd.h b/inc/dd.h index 2e3e09f..afd00d9 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -143,8 +143,6 @@ typedef struct CNCDDRAW DWORD minfps_tick_len; DWORD gui_thread_id; BOOL show_driver_warning; - BOOL d3d9on12; - BOOL opengl_core; } CNCDDRAW; diff --git a/src/dd.c b/src/dd.c index 06abd7d..909310e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1466,11 +1466,11 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (_strcmpi(g_config.renderer, "direct3d9on12") == 0) { - g_ddraw->d3d9on12 = TRUE; + g_config.d3d9on12 = TRUE; } else if (_strcmpi(g_config.renderer, "openglcore") == 0) { - g_ddraw->opengl_core = TRUE; + g_config.opengl_core = TRUE; } if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ diff --git a/src/dllmain.c b/src/dllmain.c index f26e4dd..ee3c2cc 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -52,6 +52,12 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) while (s) { + /* Workaround for bug in Windows 11 (Steam RA2 crash) */ + if (_strcmpi(s, "Win7RTM") == 0) + { + g_config.d3d9on12 = TRUE; + } + if (_strcmpi(s, "WIN95") == 0 || _strcmpi(s, "WIN98") == 0 || _strcmpi(s, "NT4SP5") == 0) { char mes[128] = { 0 }; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index a1bfbae..2f14a5e 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -218,7 +218,7 @@ void oglu_init() wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } - if (g_ddraw->opengl_core) + if (g_config.opengl_core) { wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); } diff --git a/src/render_d3d9.c b/src/render_d3d9.c index e755008..faed00a 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -27,11 +27,27 @@ BOOL d3d9_is_available() if ((g_d3d9.hmodule = real_LoadLibraryA("d3d9.dll"))) { - IDirect3D9* (WINAPI * d3d_create9)(UINT) = - (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + if (g_config.d3d9on12) + { + D3D9ON12_ARGS args; + memset(&args, 0, sizeof(args)); + args.Enable9On12 = TRUE; - if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) - IDirect3D9_Release(d3d9); + IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = + (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); + + if (d3d_create9on12 && (d3d9 = d3d_create9on12(D3D_SDK_VERSION, &args, 1))) + IDirect3D9_Release(d3d9); + } + + if (!d3d9) + { + IDirect3D9* (WINAPI * d3d_create9)(UINT) = + (IDirect3D9 * (WINAPI*)(UINT))real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); + + if (d3d_create9 && (d3d9 = d3d_create9(D3D_SDK_VERSION))) + IDirect3D9_Release(d3d9); + } } return d3d9 != NULL; @@ -59,7 +75,7 @@ BOOL d3d9_create() IDirect3D9* (WINAPI * d3d_create9on12)(INT, D3D9ON12_ARGS*, UINT) = NULL; IDirect3D9* (WINAPI * d3d_create9)(UINT) = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9"); - if (g_ddraw->d3d9on12) + if (g_config.d3d9on12) { d3d_create9on12 = (void*)real_GetProcAddress(g_d3d9.hmodule, "Direct3DCreate9On12"); } From c15f02c27b511294a74a335d5ead1d46f1b982fd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 11 Mar 2024 18:05:18 +0100 Subject: [PATCH 0146/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 2e1ad8a..a75a5b5 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 2 +#define VERSION_MINOR 3 #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 0af9bbb88f210ea9880b14a47e0e7c6b90ea97a1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 15 Mar 2024 17:07:40 +0100 Subject: [PATCH 0147/1053] fix build on linux --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 20da2fb..36ab707 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ -include config.mk -WINDRES ?= windres -LDFLAGS = -Wl,--enable-stdcall-fixup -s -CFLAGS = -Iinc -O2 -march=pentium4 -Wall +CC = i686-w64-mingw32-gcc +CXX = i686-w64-mingw32-g++ +WINDRES ?= i686-w64-mingw32-windres +LDFLAGS = -Wl,--enable-stdcall-fixup -s -static +CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 FILES = src/IDirect3D/IDirect3D.c \ @@ -42,7 +44,6 @@ FILES = src/IDirect3D/IDirect3D.c \ all: $(WINDRES) -J rc ddraw.rc ddraw.rc.o $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -# $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt clean: $(RM) ddraw.dll ddraw.rc.o From c52544ad6f74f15b3b68f7179bc42cc157d3c527 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 18 Mar 2024 00:37:18 +0100 Subject: [PATCH 0148/1053] fix keyboard not working with devmode TRUE --- src/directinput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 2647d6a..38d6eef 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -69,7 +69,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); - if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) + if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) { if (pdwInOut) { @@ -91,7 +91,7 @@ static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD c HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); - if (SUCCEEDED(result) && g_ddraw && !g_mouse_locked) + if (SUCCEEDED(result) && This == g_mouse_device && !g_mouse_locked && !g_config.devmode) { if (cbData > 0 && lpvData) { From 871ccbf19609acc1db69f03f04937ebd1ea9c526 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 05:35:36 +0100 Subject: [PATCH 0149/1053] hook GetKeyState and GetAsyncKeyState for infantry --- inc/hook.h | 6 +++++- inc/version.h | 2 +- inc/winapi_hooks.h | 2 ++ src/hook.c | 4 ++++ src/winapi_hooks.c | 22 ++++++++++++++++++++++ src/wndproc.c | 2 +- 6 files changed, 35 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 6ebb33b..ebb7c01 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -17,7 +17,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[30]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[32]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -56,6 +56,8 @@ typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); 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 SHORT(WINAPI* GETKEYSTATEPROC)(int); +typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); typedef int (WINAPI* GETDEVICECAPSPROC)(HDC, int); typedef HFONT(WINAPI* CREATEFONTINDIRECTAPROC)(CONST LOGFONT*); @@ -101,6 +103,8 @@ extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; +extern GETKEYSTATEPROC real_GetKeyState; +extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; extern CREATEFONTINDIRECTAPROC real_CreateFontIndirectA; extern CREATEFONTAPROC real_CreateFontA; diff --git a/inc/version.h b/inc/version.h index a75a5b5..7dd8747 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index a66f475..839eccc 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,8 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); 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); +SHORT WINAPI fake_GetKeyState(int nVirtKey); +SHORT WINAPI fake_GetAsyncKeyState(int vKey); int WINAPI fake_GetDeviceCaps(HDC hdc, int index); BOOL WINAPI fake_StretchBlt( diff --git a/src/hook.c b/src/hook.c index 5646765..d8f72a7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,8 @@ SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; +GETKEYSTATEPROC real_GetKeyState = GetKeyState; +GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; CREATEFONTINDIRECTAPROC real_CreateFontIndirectA = CreateFontIndirectA; CREATEFONTAPROC real_CreateFontA = CreateFontA; @@ -93,6 +95,8 @@ HOOKLIST g_hook_hooklist[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 0 }, { "PeekMessageA", (PROC)fake_PeekMessageA, (PROC*)&real_PeekMessageA, 0 }, { "GetMessageA", (PROC)fake_GetMessageA, (PROC*)&real_GetMessageA, 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 }, { "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA, (PROC*)&real_SetWindowsHookExA, 0 }, { "", NULL, NULL, 0 } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6492f59..a16d860 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -716,6 +716,28 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w return result; } +SHORT WINAPI fake_GetKeyState(int nVirtKey) +{ + if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + { + if (real_GetForegroundWindow() != g_ddraw->hwnd) + return 0; + } + + return GetKeyState(nVirtKey); +} + +SHORT WINAPI fake_GetAsyncKeyState(int vKey) +{ + if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + { + if (real_GetForegroundWindow() != g_ddraw->hwnd) + return 0; + } + + return GetAsyncKeyState(vKey); +} + int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { if (g_ddraw && diff --git a/src/wndproc.c b/src/wndproc.c index b4451b8..d545046 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -667,7 +667,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { /* let it pass through once (tiberian sun) */ static BOOL one_time; - + if (wParam && !one_time && g_config.tshack) { one_time = TRUE; From c8d4cd997ed08763638cdcbb6ed9a57fe9745ae7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 05:41:42 +0100 Subject: [PATCH 0150/1053] use real_ functions --- src/winapi_hooks.c | 4 ++-- src/wndproc.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a16d860..3d7632b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -724,7 +724,7 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) return 0; } - return GetKeyState(nVirtKey); + return real_GetKeyState(nVirtKey); } SHORT WINAPI fake_GetAsyncKeyState(int vKey) @@ -735,7 +735,7 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) return 0; } - return GetAsyncKeyState(vKey); + return real_GetAsyncKeyState(vKey); } int WINAPI fake_GetDeviceCaps(HDC hdc, int index) diff --git a/src/wndproc.c b/src/wndproc.c index d545046..31cbc02 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -775,7 +775,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.unlock_cursor1 && (wParam == VK_CONTROL || wParam == g_config.hotkeys.unlock_cursor1)) { - if (GetAsyncKeyState(VK_CONTROL) & 0x8000 && GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) + if (real_GetAsyncKeyState(VK_CONTROL) & 0x8000 && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor1) & 0x8000) { mouse_unlock(); return 0; @@ -785,7 +785,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.hotkeys.unlock_cursor2 && (wParam == g_config.hotkeys.unlock_cursor2 || wParam == VK_MENU || wParam == VK_CONTROL)) { - if ((GetAsyncKeyState(VK_RMENU) & 0x8000) && GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) + if ((real_GetAsyncKeyState(VK_RMENU) & 0x8000) && real_GetAsyncKeyState(g_config.hotkeys.unlock_cursor2) & 0x8000) { mouse_unlock(); return 0; From f57055fd8c797fd49246541a7ffdd93bf0a4eed8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 21:31:05 +0100 Subject: [PATCH 0151/1053] add better forground window detection and always enable new GetKeyState hooks --- inc/utils.h | 1 + src/utils.c | 7 +++++++ src/winapi_hooks.c | 10 ++++------ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 2e2e779..253ec11 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -8,6 +8,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); +BOOL util_in_foreground(); BOOL util_is_avx_supported(); void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); diff --git a/src/utils.c b/src/utils.c index 91fbcaf..d3b26c9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -100,6 +100,13 @@ BOOL util_is_minimized(HWND hwnd) return IsIconic(hwnd) || (real_GetClientRect(hwnd, &rc) && (rc.right - rc.left == 0 || rc.bottom - rc.top == 0)); } +BOOL util_in_foreground() +{ + DWORD process_id = 0; + + return GetWindowThreadProcessId(real_GetForegroundWindow(), &process_id) && process_id == GetCurrentProcessId(); +} + BOOL util_is_avx_supported() { const DWORD XMM_STATE_BIT = 1 << 1; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3d7632b..10c287e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -718,10 +718,9 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w SHORT WINAPI fake_GetKeyState(int nVirtKey) { - if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) { - if (real_GetForegroundWindow() != g_ddraw->hwnd) - return 0; + return 0; } return real_GetKeyState(nVirtKey); @@ -729,10 +728,9 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) SHORT WINAPI fake_GetAsyncKeyState(int vKey) { - if (g_config.infantryhack && g_ddraw && g_ddraw->hwnd) + if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) { - if (real_GetForegroundWindow() != g_ddraw->hwnd) - return 0; + return 0; } return real_GetAsyncKeyState(vKey); From 978946a5d94f2b89e166db384e664ab1225c6a42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 20 Mar 2024 21:51:23 +0100 Subject: [PATCH 0152/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 7dd8747..016e2b7 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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 d69a56c0d04976a2d3adc7a3b7b8a4e636411b6d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 04:36:30 +0100 Subject: [PATCH 0153/1053] add some more debug logging to dd_EnumDisplayModes --- inc/version.h | 2 +- src/dd.c | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 016e2b7..ddb62c3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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) diff --git a/src/dd.c b/src/dd.c index 909310e..bf448e5 100644 --- a/src/dd.c +++ b/src/dd.c @@ -65,6 +65,8 @@ HRESULT dd_EnumDisplayModes( { max_w = reg_m.dmPelsWidth; max_h = reg_m.dmPelsHeight; + + TRACE(" max_w=%u, max_h=%u\n", reg_m.dmPelsWidth, reg_m.dmPelsHeight); } if (g_config.stronghold_hack && max_w && (max_w % 8)) @@ -317,7 +319,10 @@ HRESULT dd_EnumDisplayModes( m.dmPelsHeight = resolutions[i].cy; if (ChangeDisplaySettings(&m, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + { + TRACE(" SKIPPED: %ux%u\n", m.dmPelsWidth, m.dmPelsHeight); continue; + } } memset(&s, 0, sizeof(s)); From 36a87419e3522b028dce9999f31a28bb9e3c7359 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 22:27:00 +0100 Subject: [PATCH 0154/1053] don't allocate ddraw struct --- inc/dd.h | 4 +- inc/version.h | 2 +- src/IDirectDraw/IDirectDraw.c | 22 +- src/IDirectDraw/IDirectDrawPalette.c | 4 +- src/IDirectDraw/IDirectDrawSurface.c | 16 +- src/dd.c | 621 ++++++++++++++------------- src/ddpalette.c | 6 +- src/ddsurface.c | 112 ++--- src/debug.c | 6 +- src/directinput.c | 4 +- src/fps_limiter.c | 12 +- src/mouse.c | 44 +- src/render_d3d9.c | 144 +++---- src/render_gdi.c | 112 ++--- src/render_ogl.c | 172 ++++---- src/screenshot.c | 2 +- src/utils.c | 120 +++--- src/winapi_hooks.c | 430 +++++++++---------- src/wndproc.c | 214 ++++----- 19 files changed, 1027 insertions(+), 1020 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index afd00d9..5fdc857 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -56,11 +56,11 @@ typedef struct SPEEDLIMITER struct IDirectDrawSurfaceImpl; -extern struct CNCDDRAW* g_ddraw; +extern struct CNCDDRAW g_ddraw; typedef struct CNCDDRAW { - ULONG ref; + LONG ref; DWORD width; DWORD height; diff --git a/inc/version.h b/inc/version.h index ddb62c3..9dc51c9 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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) diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 9a96270..1e6f6a4 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -131,20 +131,20 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid { TRACE("NOT_IMPLEMENTED GUID = %08X\n", ((GUID*)riid)->Data1); - if (!g_ddraw->real_dll) - g_ddraw->real_dll = real_LoadLibraryA("system32\\ddraw.dll"); + if (!g_ddraw.real_dll) + g_ddraw.real_dll = real_LoadLibraryA("system32\\ddraw.dll"); - if (g_ddraw->real_dll && !g_ddraw->DirectDrawCreate) - g_ddraw->DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw->real_dll, "DirectDrawCreate"); + if (g_ddraw.real_dll && !g_ddraw.DirectDrawCreate) + g_ddraw.DirectDrawCreate = (void*)real_GetProcAddress(g_ddraw.real_dll, "DirectDrawCreate"); - if (g_ddraw->DirectDrawCreate == DirectDrawCreate) - g_ddraw->DirectDrawCreate = NULL; + if (g_ddraw.DirectDrawCreate == DirectDrawCreate) + g_ddraw.DirectDrawCreate = NULL; - if (!g_ddraw->real_dd && g_ddraw->DirectDrawCreate) - g_ddraw->DirectDrawCreate(NULL, &g_ddraw->real_dd, NULL); + if (!g_ddraw.real_dd && g_ddraw.DirectDrawCreate) + g_ddraw.DirectDrawCreate(NULL, &g_ddraw.real_dd, NULL); - if (g_ddraw->real_dd) - ret = IDirectDraw_QueryInterface(g_ddraw->real_dd, riid, ppvObj); + if (g_ddraw.real_dd) + ret = IDirectDraw_QueryInterface(g_ddraw.real_dd, riid, ppvObj); else ret = E_NOINTERFACE; } @@ -355,7 +355,7 @@ HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAW { TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); HRESULT ret = DD_OK; - *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw->primary; + *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 2eb313b..2767478 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -30,8 +30,8 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { TRACE(" Released (%p)\n", This); - if (g_ddraw) - g_ddraw->last_freed_palette = This; + if (g_ddraw.ref) + g_ddraw.last_freed_palette = This; HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index c7775af..7445f99 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -82,11 +82,11 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { TRACE(" Released (%p)\n", This); - if (g_ddraw && (This->caps & DDSCAPS_PRIMARYSURFACE)) + if (g_ddraw.ref && (This->caps & DDSCAPS_PRIMARYSURFACE)) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->primary = NULL; - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.primary = NULL; + LeaveCriticalSection(&g_ddraw.cs); } if (This->bitmap) @@ -111,7 +111,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->mapping) CloseHandle(This->mapping); - if (This->backbuffer && (!g_ddraw || (void*)This->backbuffer != g_ddraw->last_freed_surface)) + if (This->backbuffer && (!g_ddraw.ref || (void*)This->backbuffer != g_ddraw.last_freed_surface)) { IDirectDrawSurface_Release(This->backbuffer); } @@ -119,15 +119,15 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) if (This->clipper) IDirectDrawClipper_Release(This->clipper); - if (This->palette && (!g_ddraw || (void*)This->palette != g_ddraw->last_freed_palette)) + if (This->palette && (!g_ddraw.ref || (void*)This->palette != g_ddraw.last_freed_palette)) { IDirectDrawPalette_Release(This->palette); } DeleteCriticalSection(&This->cs); - if (g_ddraw) - g_ddraw->last_freed_surface = This; + if (g_ddraw.ref) + g_ddraw.last_freed_surface = This; HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/dd.c b/src/dd.c index bf448e5..c6cddf1 100644 --- a/src/dd.c +++ b/src/dd.c @@ -16,7 +16,7 @@ #include "blt.h" -CNCDDRAW* g_ddraw = NULL; +CNCDDRAW g_ddraw; HRESULT dd_EnumDisplayModes( DWORD dwFlags, @@ -123,9 +123,9 @@ HRESULT dd_EnumDisplayModes( } } - if ((g_ddraw->bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) + if ((g_ddraw.bpp && g_config.resolutions == RESLIST_NORMAL) || g_config.resolutions == RESLIST_FULL) { - TRACE(" g_ddraw->bpp=%u\n", g_ddraw->bpp); + TRACE(" g_ddraw.bpp=%u\n", g_ddraw.bpp); /* set up some filters to keep the list short */ DWORD refresh_rate = 0; @@ -218,7 +218,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 8 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 8 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -243,7 +243,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 16 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 16 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -268,7 +268,7 @@ HRESULT dd_EnumDisplayModes( if (s.ddpfPixelFormat.dwRGBBitCount == bpp_filter || !bpp_filter) { - if (g_ddraw->bpp == 32 || g_config.resolutions == RESLIST_FULL) + if (g_ddraw.bpp == 32 || g_config.resolutions == RESLIST_FULL) { if (g_config.max_resolutions && res_count++ >= g_config.max_resolutions) { @@ -300,7 +300,7 @@ HRESULT dd_EnumDisplayModes( } } - if (!g_ddraw->bpp || g_config.resolutions != RESLIST_NORMAL) + if (!g_ddraw.bpp || g_config.resolutions != RESLIST_NORMAL) { for (i = 0; i < sizeof(resolutions) / sizeof(resolutions[0]); i++) { @@ -482,13 +482,13 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwHeight = g_ddraw->height ? g_ddraw->height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw->width ? g_ddraw->width : 1024; + lpDDSurfaceDesc->dwHeight = g_ddraw.height ? g_ddraw.height : 768; + lpDDSurfaceDesc->dwWidth = g_ddraw.width ? g_ddraw.width : 1024; lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - if (g_ddraw->bpp == 32 || g_config.vermeer_hack) + if (g_ddraw.bpp == 32 || g_config.vermeer_hack) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; @@ -499,7 +499,7 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) lpDDSurfaceDesc->lPitch = ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } - else if (g_ddraw->bpp != 8) + else if (g_ddraw.bpp != 8) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; @@ -525,28 +525,28 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (!g_ddraw->render.run) + if (!g_ddraw.render.run) { return DD_OK; } - if (g_ddraw->renderer != gdi_render_main) + if (g_ddraw.renderer != gdi_render_main) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } } if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -567,187 +567,187 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.mgs_hack && dwHeight == 480) dwHeight -= 32; /* Remove black bar in Metal Gear Solid */ - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + 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; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } - if (!g_ddraw->mode.dmPelsWidth) + if (!g_ddraw.mode.dmPelsWidth) { ChangeDisplaySettings(NULL, 0); - g_ddraw->mode.dmSize = sizeof(DEVMODE); - g_ddraw->mode.dmDriverExtra = 0; + g_ddraw.mode.dmSize = sizeof(DEVMODE); + g_ddraw.mode.dmDriverExtra = 0; - if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw->mode) == FALSE) + if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) { - g_ddraw->mode.dmSize = sizeof(DEVMODE); - g_ddraw->mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; - g_ddraw->mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); - g_ddraw->mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); - g_ddraw->mode.dmDisplayFrequency = 60; - g_ddraw->mode.dmBitsPerPel = 32; + g_ddraw.mode.dmSize = sizeof(DEVMODE); + g_ddraw.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; + g_ddraw.mode.dmPelsWidth = real_GetSystemMetrics(SM_CXSCREEN); + g_ddraw.mode.dmPelsHeight = real_GetSystemMetrics(SM_CYSCREEN); + g_ddraw.mode.dmDisplayFrequency = 60; + g_ddraw.mode.dmBitsPerPel = 32; - if (!g_ddraw->mode.dmPelsWidth || !g_ddraw->mode.dmPelsHeight) + if (!g_ddraw.mode.dmPelsWidth || !g_ddraw.mode.dmPelsHeight) { g_config.fullscreen = FALSE; } } } - g_ddraw->render.width = g_config.window_rect.right; - g_ddraw->render.height = g_config.window_rect.bottom; + g_ddraw.render.width = g_config.window_rect.right; + 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) && - (g_ddraw->width != dwWidth || g_ddraw->height != dwHeight) && + if ((g_ddraw.width || g_config.infantryhack) && + (g_ddraw.width != dwWidth || g_ddraw.height != dwHeight) && (dwWidth > g_config.window_rect.right || dwHeight > g_config.window_rect.bottom)) { g_config.window_rect.left = -32000; g_config.window_rect.top = -32000; } - g_ddraw->width = dwWidth; - g_ddraw->height = dwHeight; - g_ddraw->bpp = dwBPP; + g_ddraw.width = dwWidth; + 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; if (g_config.fullscreen) { - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; if (g_config.windowed) /* windowed-fullscreen aka borderless */ { border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw->renderer == ogl_render_main) + if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; } } - if (g_ddraw->render.width < g_ddraw->width) + if (g_ddraw.render.width < g_ddraw.width) { - g_ddraw->render.width = g_ddraw->width; + g_ddraw.render.width = g_ddraw.width; } - if (g_ddraw->render.height < g_ddraw->height) + if (g_ddraw.render.height < g_ddraw.height) { - g_ddraw->render.height = g_ddraw->height; + g_ddraw.render.height = g_ddraw.height; } - g_ddraw->render.run = TRUE; + g_ddraw.render.run = TRUE; BOOL lock_mouse = g_mouse_locked; mouse_unlock(); - memset(&g_ddraw->render.mode, 0, sizeof(DEVMODE)); - g_ddraw->render.mode.dmSize = sizeof(DEVMODE); + memset(&g_ddraw.render.mode, 0, sizeof(DEVMODE)); + g_ddraw.render.mode.dmSize = sizeof(DEVMODE); - g_ddraw->render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; if (g_config.refresh_rate) { - g_ddraw->render.mode.dmFields |= DM_DISPLAYFREQUENCY; - g_ddraw->render.mode.dmDisplayFrequency = g_config.refresh_rate; + g_ddraw.render.mode.dmFields |= DM_DISPLAYFREQUENCY; + g_ddraw.render.mode.dmDisplayFrequency = g_config.refresh_rate; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { g_config.refresh_rate = 0; - g_ddraw->render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; - g_ddraw->render.mode.dmDisplayFrequency = 0; + g_ddraw.render.mode.dmFields &= ~DM_DISPLAYFREQUENCY; + g_ddraw.render.mode.dmDisplayFrequency = 0; } } if (!g_config.windowed) { /* Making sure the chosen resolution is valid */ - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try without upscaling */ - g_ddraw->render.width = g_ddraw->width; - g_ddraw->render.height = g_ddraw->height; + g_ddraw.render.width = g_ddraw.width; + g_ddraw.render.height = g_ddraw.height; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* Try 2x scaling */ - g_ddraw->render.width *= 2; - g_ddraw->render.height *= 2; + g_ddraw.render.width *= 2; + g_ddraw.render.height *= 2; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if ((g_ddraw->render.width > g_ddraw->mode.dmPelsWidth || - g_ddraw->render.height > g_ddraw->mode.dmPelsHeight) || - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if ((g_ddraw.render.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.render.height > g_ddraw.mode.dmPelsHeight) || + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { SIZE res = { 0 }; /* try to get a resolution with the same aspect ratio as the requested resolution */ BOOL found_res = util_get_lowest_resolution( - (float)g_ddraw->width / g_ddraw->height, + (float)g_ddraw.width / g_ddraw.height, &res, - g_ddraw->width + 1, /* don't return the original resolution since we tested that one already */ - g_ddraw->height, - g_ddraw->mode.dmPelsWidth, - g_ddraw->mode.dmPelsHeight); + g_ddraw.width + 1, /* don't return the original resolution since we tested that one already */ + g_ddraw.height, + g_ddraw.mode.dmPelsWidth, + g_ddraw.mode.dmPelsHeight); if (!found_res) { /* try to get a resolution with the same aspect ratio as the current display mode */ found_res = util_get_lowest_resolution( - (float)g_ddraw->mode.dmPelsWidth / g_ddraw->mode.dmPelsHeight, + (float)g_ddraw.mode.dmPelsWidth / g_ddraw.mode.dmPelsHeight, &res, - g_ddraw->width, - g_ddraw->height, - g_ddraw->mode.dmPelsWidth, - g_ddraw->mode.dmPelsHeight); + g_ddraw.width, + g_ddraw.height, + g_ddraw.mode.dmPelsWidth, + g_ddraw.mode.dmPelsHeight); } - g_ddraw->render.width = res.cx; - g_ddraw->render.height = res.cy; + g_ddraw.render.width = res.cx; + g_ddraw.render.height = res.cy; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; if (!found_res || - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { - if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || - g_ddraw->height > g_ddraw->mode.dmPelsHeight) + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ g_config.adjmouse = TRUE; } /* try current display settings */ - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_TEST) != DISP_CHANGE_SUCCESSFUL) { /* everything failed, use borderless mode instead */ ChangeDisplaySettings(NULL, 0); @@ -757,7 +757,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl border = FALSE; /* prevent OpenGL from going automatically into fullscreen exclusive mode */ - if (g_ddraw->renderer == ogl_render_main) + if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; } @@ -770,151 +770,151 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl /* Support downscaling in borderless mode */ if (g_config.windowed && g_config.fullscreen) { - if (g_ddraw->width > g_ddraw->mode.dmPelsWidth || - g_ddraw->height > g_ddraw->mode.dmPelsHeight) + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) { /* Downscaling requires adjmouse to be enabled */ g_config.adjmouse = TRUE; - g_ddraw->render.width = g_ddraw->mode.dmPelsWidth; - g_ddraw->render.height = g_ddraw->mode.dmPelsHeight; + g_ddraw.render.width = g_ddraw.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.mode.dmPelsHeight; - g_ddraw->render.mode.dmPelsWidth = g_ddraw->render.width; - g_ddraw->render.mode.dmPelsHeight = g_ddraw->render.height; + g_ddraw.render.mode.dmPelsWidth = g_ddraw.render.width; + g_ddraw.render.mode.dmPelsHeight = g_ddraw.render.height; } } - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = g_ddraw->render.height; - g_ddraw->render.viewport.x = 0; - g_ddraw->render.viewport.y = 0; + g_ddraw.render.viewport.width = g_ddraw.render.width; + g_ddraw.render.viewport.height = g_ddraw.render.height; + g_ddraw.render.viewport.x = 0; + g_ddraw.render.viewport.y = 0; if (g_config.boxing) { - g_ddraw->render.viewport.width = g_ddraw->width; - g_ddraw->render.viewport.height = g_ddraw->height; + 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) + 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.render.viewport.height *= i; break; } } - g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; - g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; + g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; + g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; } 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)g_ddraw.height / g_ddraw.width; + double src_ar = (double)g_ddraw.render.height / g_ddraw.render.width; - g_ddraw->render.viewport.width = g_ddraw->render.width; - g_ddraw->render.viewport.height = (int)round(dst_ar * g_ddraw->render.viewport.width); + g_ddraw.render.viewport.width = g_ddraw.render.width; + g_ddraw.render.viewport.height = (int)round(dst_ar * g_ddraw.render.viewport.width); if (src_ar < dst_ar) { - g_ddraw->render.viewport.width = - (int)round(((double)g_ddraw->render.viewport.width / g_ddraw->render.viewport.height) * g_ddraw->render.height); + g_ddraw.render.viewport.width = + (int)round(((double)g_ddraw.render.viewport.width / g_ddraw.render.viewport.height) * g_ddraw.render.height); - g_ddraw->render.viewport.height = g_ddraw->render.height; + g_ddraw.render.viewport.height = g_ddraw.render.height; } - g_ddraw->render.viewport.width = min(g_ddraw->render.viewport.width, g_ddraw->render.width); - g_ddraw->render.viewport.height = min(g_ddraw->render.viewport.height, g_ddraw->render.height); + g_ddraw.render.viewport.width = min(g_ddraw.render.viewport.width, g_ddraw.render.width); + g_ddraw.render.viewport.height = min(g_ddraw.render.viewport.height, g_ddraw.render.height); - g_ddraw->render.viewport.y = g_ddraw->render.height / 2 - g_ddraw->render.viewport.height / 2; - g_ddraw->render.viewport.x = g_ddraw->render.width / 2 - g_ddraw->render.viewport.width / 2; + g_ddraw.render.viewport.y = g_ddraw.render.height / 2 - g_ddraw.render.viewport.height / 2; + g_ddraw.render.viewport.x = g_ddraw.render.width / 2 - g_ddraw.render.viewport.width / 2; } - g_ddraw->render.scale_w = ((float)g_ddraw->render.viewport.width / g_ddraw->width); - g_ddraw->render.scale_h = ((float)g_ddraw->render.viewport.height / g_ddraw->height); - g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); - g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); + g_ddraw.render.scale_w = ((float)g_ddraw.render.viewport.width / g_ddraw.width); + g_ddraw.render.scale_h = ((float)g_ddraw.render.viewport.height / g_ddraw.height); + g_ddraw.render.unscale_w = ((float)g_ddraw.width / g_ddraw.render.viewport.width); + g_ddraw.render.unscale_h = ((float)g_ddraw.height / g_ddraw.render.viewport.height); - g_ddraw->mouse.scale_x = ((float)(g_ddraw->render.viewport.width - 1) / (g_ddraw->width - 1)); - g_ddraw->mouse.scale_y = ((float)(g_ddraw->render.viewport.height - 1) / (g_ddraw->height - 1)); - g_ddraw->mouse.unscale_x = ((float)(g_ddraw->width - 1) / (g_ddraw->render.viewport.width - 1)); - g_ddraw->mouse.unscale_y = ((float)(g_ddraw->height - 1) / (g_ddraw->render.viewport.height - 1)); + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); - g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; - g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; - g_ddraw->mouse.rc.left = g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.top = g_ddraw->mouse.y_adjust; - g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->mouse.y_adjust; + g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.top = g_ddraw.mouse.y_adjust; + g_ddraw.mouse.rc.right = g_ddraw.width + g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.bottom = g_ddraw.height + g_ddraw.mouse.y_adjust; if (g_config.adjmouse) { - g_ddraw->mouse.rc.right = g_ddraw->render.viewport.width + g_ddraw->mouse.x_adjust; - g_ddraw->mouse.rc.bottom = g_ddraw->render.viewport.height + g_ddraw->mouse.y_adjust; + g_ddraw.mouse.rc.right = g_ddraw.render.viewport.width + g_ddraw.mouse.x_adjust; + g_ddraw.mouse.rc.bottom = g_ddraw.render.viewport.height + g_ddraw.mouse.y_adjust; } - if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw->renderer == ogl_render_main)) + if (nonexclusive || (g_config.nonexclusive && !g_config.windowed && g_ddraw.renderer == ogl_render_main)) { - g_ddraw->render.height++; - g_ddraw->render.opengl_y_align = 1; + g_ddraw.render.height++; + g_ddraw.render.opengl_y_align = 1; } else { - g_ddraw->render.opengl_y_align = 0; + g_ddraw.render.opengl_y_align = 0; } if (g_config.windowed) { - if (g_config.remove_menu && GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); if (!g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); } if (!border) { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, real_GetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - if (GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); } else { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); } - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); if ((exstyle & WS_EX_TOOLWINDOW)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } if (g_config.is_wine) { real_SetWindowLongA( - g_ddraw->hwnd, + 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 | 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; - int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw->render.width / 2); - int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw->render.height / 2); + 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; + int x = (g_config.window_rect.left != -32000) ? g_config.window_rect.left : (cy / 2) - (g_ddraw.render.width / 2); + int y = (g_config.window_rect.top != -32000) ? g_config.window_rect.top : (cx / 2) - (g_ddraw.render.height / 2); if (g_config.fullscreen) { @@ -926,18 +926,18 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl y = real_GetSystemMetrics(SM_CYCAPTION) + real_GetSystemMetrics(SM_CYSIZEFRAME); } - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); - RECT dst = { x, y, g_ddraw->render.width + x, g_ddraw->render.height + y }; + RECT dst = { x, y, g_ddraw.render.width + x, g_ddraw.render.height + y }; - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); - AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw->hwnd) != NULL, exstyle); + AdjustWindowRectEx(&dst, style, GetMenu(g_ddraw.hwnd) != NULL, exstyle); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_NOTOPMOST, dst.left, dst.top, @@ -948,27 +948,27 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl BOOL d3d9_active = FALSE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw.renderer == d3d9_render_main) { d3d9_active = d3d9_create(); if (!d3d9_active) { d3d9_release(); - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } - if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd)) + if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); } else { - if (GetMenu(g_ddraw->hwnd)) - SetMenu(g_ddraw->hwnd, NULL); + if (GetMenu(g_ddraw.hwnd)) + SetMenu(g_ddraw.hwnd, NULL); - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); DWORD swp_flags = SWP_SHOWWINDOW; @@ -977,34 +977,34 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl swp_flags |= SWP_FRAMECHANGED; real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, style & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); if ((exstyle & WS_EX_TOOLWINDOW)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } BOOL d3d9_active = FALSE; - if (g_ddraw->renderer == d3d9_render_main) + if (g_ddraw.renderer == d3d9_render_main) { if (g_config.nonexclusive) { - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, swp_flags); swp_flags = SWP_SHOWWINDOW; @@ -1015,16 +1015,16 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!d3d9_active) { d3d9_release(); - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } if (!d3d9_active || g_config.nonexclusive) { - if (ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { - g_ddraw->render.run = FALSE; + g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); @@ -1035,12 +1035,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl ChangeDisplaySettings fails silently - enable borderless mode in case display resolution was not changed */ if (g_config.is_wine && - (g_ddraw->render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || - g_ddraw->render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) + (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || + g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { ChangeDisplaySettings(NULL, 0); - g_ddraw->render.run = FALSE; + g_ddraw.render.run = FALSE; g_config.windowed = TRUE; g_config.fullscreen = TRUE; return dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, dwFlags); @@ -1050,53 +1050,53 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.is_wine) { real_SetWindowLongA( - g_ddraw->hwnd, + g_ddraw.hwnd, GWL_STYLE, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE) | WS_MINIMIZEBOX); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_MINIMIZEBOX); } - if (util_is_minimized(g_ddraw->hwnd)) - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + if (util_is_minimized(g_ddraw.hwnd)) + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, swp_flags); if (d3d9_active && g_config.nonexclusive) d3d9_reset(TRUE); - g_ddraw->last_set_window_pos_tick = timeGetTime(); + g_ddraw.last_set_window_pos_tick = timeGetTime(); mouse_lock(); } - RedrawWindow(g_ddraw->hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { - InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); + InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); } - if (g_ddraw->render.thread == NULL) + if (g_ddraw.render.thread == NULL) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + 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); - SetThreadPriority(g_ddraw->render.thread, THREAD_PRIORITY_ABOVE_NORMAL); + g_ddraw.render.thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)g_ddraw.renderer, NULL, 0, NULL); + SetThreadPriority(g_ddraw.render.thread, THREAD_PRIORITY_ABOVE_NORMAL); } if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) { - real_SendMessageA(g_ddraw->hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw->width, g_ddraw->height)); - real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); - real_SendMessageA(g_ddraw->hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw->bpp, MAKELPARAM(g_ddraw->width, g_ddraw->height)); + real_SendMessageA(g_ddraw.hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw.width, g_ddraw.height)); + real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); + real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } return DD_OK; @@ -1111,21 +1111,21 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) return DD_OK; } - if (g_ddraw->hwnd == NULL) + if (g_ddraw.hwnd == NULL) { - g_ddraw->hwnd = hwnd; + g_ddraw.hwnd = hwnd; } - if (!g_ddraw->wndproc) + if (!g_ddraw.wndproc) { hook_init(FALSE); - g_ddraw->wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)fake_WndProc); - g_ddraw->gui_thread_id = GetWindowThreadProcessId(g_ddraw->hwnd, NULL); + 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) + if (!g_ddraw.render.hdc) { - g_ddraw->render.hdc = GetDC(g_ddraw->hwnd); + g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); @@ -1133,13 +1133,13 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) pfd.nVersion = 1; pfd.dwFlags = - PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw->renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); + PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw.renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw->mode.dmBitsPerPel; + pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; pfd.iLayerType = PFD_MAIN_PLANE; - SetPixelFormat(g_ddraw->render.hdc, ChoosePixelFormat(g_ddraw->render.hdc, &pfd), &pfd); + SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); } if (!g_config.devmode) @@ -1147,11 +1147,11 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) 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)cursor); } int cursor_count = real_ShowCursor(TRUE) - 1; - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, cursor_count); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, cursor_count); real_ShowCursor(FALSE); /* Make sure the cursor is visible in windowed mode initially */ @@ -1166,24 +1166,24 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) real_ClipCursor(NULL); } - GetWindowText(g_ddraw->hwnd, (LPTSTR)&g_ddraw->title, sizeof(g_ddraw->title)); + GetWindowText(g_ddraw.hwnd, (LPTSTR)&g_ddraw.title, sizeof(g_ddraw.title)); - g_ddraw->isredalert = strcmp(g_ddraw->title, "Red Alert") == 0; - g_ddraw->iscnc1 = strcmp(g_ddraw->title, "Command & Conquer") == 0; - g_ddraw->iskkndx = strcmp(g_ddraw->title, "KKND Xtreme") == 0; + g_ddraw.isredalert = strcmp(g_ddraw.title, "Red Alert") == 0; + g_ddraw.iscnc1 = strcmp(g_ddraw.title, "Command & Conquer") == 0; + g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; - if (g_ddraw->iskkndx) + if (g_ddraw.iskkndx) { - g_ddraw->upscale_hack_width = 640; - g_ddraw->upscale_hack_height = 480; + g_ddraw.upscale_hack_width = 640; + g_ddraw.upscale_hack_height = 480; } - else if (g_ddraw->isredalert || g_ddraw->iscnc1) + else if (g_ddraw.isredalert || g_ddraw.iscnc1) { - g_ddraw->upscale_hack_width = 640; - g_ddraw->upscale_hack_height = 400; + g_ddraw.upscale_hack_width = 640; + g_ddraw.upscale_hack_height = 400; } - if (g_config.vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) + if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx) { g_config.vhack = 0; } @@ -1204,7 +1204,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) windowed = g_config.windowed; fullscreen = g_config.fullscreen; - if (GetMenu(g_ddraw->hwnd) != NULL) + if (GetMenu(g_ddraw.hwnd) != NULL) { g_config.windowed = TRUE; g_config.fullscreen = FALSE; @@ -1233,25 +1233,25 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) return DD_OK; } - if (!g_ddraw->flip_limiter.tick_length) + if (!g_ddraw.flip_limiter.tick_length) return DD_OK; - if (g_ddraw->flip_limiter.htimer) + if (g_ddraw.flip_limiter.htimer) { FILETIME ft = { 0 }; GetSystemTimeAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw->flip_limiter.due_time, &ft) == -1) + if (CompareFileTime((FILETIME*)&g_ddraw.flip_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw->flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw.flip_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw->flip_limiter.htimer, g_ddraw->flip_limiter.tick_length * 2); + WaitForSingleObject(g_ddraw.flip_limiter.htimer, g_ddraw.flip_limiter.tick_length * 2); } - g_ddraw->flip_limiter.due_time.QuadPart += g_ddraw->flip_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw->flip_limiter.htimer, &g_ddraw->flip_limiter.due_time, 0, NULL, NULL, FALSE); + g_ddraw.flip_limiter.due_time.QuadPart += g_ddraw.flip_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw.flip_limiter.htimer, &g_ddraw.flip_limiter.due_time, 0, NULL, NULL, FALSE); } else { @@ -1263,12 +1263,12 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) return DD_OK; } - next_game_tick += g_ddraw->flip_limiter.tick_length; + next_game_tick += g_ddraw.flip_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw->flip_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw.flip_limiter.tick_length) { next_game_tick = tick_count; } @@ -1283,37 +1283,37 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) ULONG dd_AddRef() { - return ++g_ddraw->ref; + return InterlockedIncrement(&g_ddraw.ref); } ULONG dd_Release() { - g_ddraw->ref--; + LONG ref = InterlockedDecrement(&g_ddraw.ref); - if (g_ddraw->ref == 0) + if (ref == 0) { - if (g_ddraw->bpp) + if (g_ddraw.bpp) { cfg_save(); } - if (g_ddraw->render.run) + if (g_ddraw.render.run) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - WaitForSingleObject(g_ddraw->render.thread, INFINITE); - g_ddraw->render.thread = NULL; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } } if (!g_config.windowed) { - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { if (!d3d9_reset(TRUE)) d3d9_release(); @@ -1324,24 +1324,24 @@ ULONG dd_Release() } } - if (g_ddraw->render.hdc) + if (g_ddraw.render.hdc) { - ReleaseDC(g_ddraw->hwnd, g_ddraw->render.hdc); - g_ddraw->render.hdc = NULL; + ReleaseDC(g_ddraw.hwnd, g_ddraw.render.hdc); + g_ddraw.render.hdc = NULL; } - if (g_ddraw->ticks_limiter.htimer) + if (g_ddraw.ticks_limiter.htimer) { - CancelWaitableTimer(g_ddraw->ticks_limiter.htimer); - CloseHandle(g_ddraw->ticks_limiter.htimer); - g_ddraw->ticks_limiter.htimer = NULL; + CancelWaitableTimer(g_ddraw.ticks_limiter.htimer); + CloseHandle(g_ddraw.ticks_limiter.htimer); + g_ddraw.ticks_limiter.htimer = NULL; } - if (g_ddraw->flip_limiter.htimer) + if (g_ddraw.flip_limiter.htimer) { - CancelWaitableTimer(g_ddraw->flip_limiter.htimer); - CloseHandle(g_ddraw->flip_limiter.htimer); - g_ddraw->flip_limiter.htimer = NULL; + CancelWaitableTimer(g_ddraw.flip_limiter.htimer); + CloseHandle(g_ddraw.flip_limiter.htimer); + g_ddraw.flip_limiter.htimer = NULL; } if (g_fpsl.htimer) @@ -1351,26 +1351,31 @@ ULONG dd_Release() g_fpsl.htimer = NULL; } - if (g_ddraw->real_dd) + if (g_ddraw.real_dd) { - g_ddraw->real_dd->lpVtbl->Release(g_ddraw->real_dd); + g_ddraw.real_dd->lpVtbl->Release(g_ddraw.real_dd); } - DeleteCriticalSection(&g_ddraw->cs); + DeleteCriticalSection(&g_ddraw.cs); /* restore old wndproc, subsequent ddraw creation will otherwise fail */ - if (g_ddraw->hwnd) + if (g_ddraw.hwnd) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_WNDPROC, (LONG)g_ddraw->wndproc); + real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)g_ddraw.wndproc); } - - HeapFree(GetProcessHeap(), 0, g_ddraw); - g_ddraw = NULL; - + + memset(&g_ddraw, 0, sizeof(g_ddraw)); + return 0; } - return g_ddraw->ref; + if (ref < 0) + { + InterlockedExchange(&g_ddraw.ref, 0); + return 0; + } + + return (ULONG)ref; } HRESULT dd_GetAvailableVidMem(LPDDSCAPS lpDDCaps, LPDWORD lpdwTotal, LPDWORD lpdwFree) @@ -1411,42 +1416,41 @@ HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - if (!g_ddraw) + if (InterlockedExchangeAdd((LONG*)&g_ddraw.ref, 0) == 0) { - g_ddraw = (CNCDDRAW*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(CNCDDRAW)); - g_ddraw->ref++; + InterlockedIncrement(&g_ddraw.ref); - InitializeCriticalSection(&g_ddraw->cs); + InitializeCriticalSection(&g_ddraw.cs); - g_ddraw->render.sem = CreateSemaphore(NULL, 0, 1, NULL); + g_ddraw.render.sem = CreateSemaphore(NULL, 0, 1, NULL); g_blt_use_avx = util_is_avx_supported(); if (g_config.minfps > 1000) g_config.minfps = 1000; if (g_config.minfps > 0) - g_ddraw->minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); + g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); - /* can't fully set it up here due to missing g_ddraw->mode.dmDisplayFrequency */ + /* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */ g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) { - g_ddraw->ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float len = 1000.0f / g_config.maxgameticks; - g_ddraw->ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); - g_ddraw->ticks_limiter.tick_length = (DWORD)(len + 0.5f); + g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); + g_ddraw.ticks_limiter.tick_length = (DWORD)(len + 0.5f); } if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) { /* always using 60 fps for flip... */ - g_ddraw->flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float flip_len = 1000.0f / 60; - g_ddraw->flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); - g_ddraw->flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); + g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); + g_ddraw.flip_limiter.tick_length = (DWORD)(flip_len + 0.5f); } @@ -1480,42 +1484,45 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (tolower(g_config.renderer[0]) == 'd') /* direct3d9 or direct3d9on12*/ { - g_ddraw->renderer = d3d9_render_main; + g_ddraw.renderer = d3d9_render_main; } else if (tolower(g_config.renderer[0]) == 's' || tolower(g_config.renderer[0]) == 'g') /* gdi */ { - g_ddraw->renderer = gdi_render_main; + g_ddraw.renderer = gdi_render_main; } else if (tolower(g_config.renderer[0]) == 'o') /* opengl or openglcore */ { if (oglu_load_dll()) { - g_ddraw->renderer = ogl_render_main; + g_ddraw.renderer = ogl_render_main; } else { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } else /* auto */ { if (!g_config.is_wine && d3d9_is_available()) { - g_ddraw->renderer = d3d9_render_main; + g_ddraw.renderer = d3d9_render_main; } else if (oglu_load_dll()) { - g_ddraw->renderer = ogl_render_main; + g_ddraw.renderer = ogl_render_main; } else { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; } } - g_ddraw->ref--; + LONG ref = InterlockedDecrement(&g_ddraw.ref); + + if (ref < 0) + InterlockedExchange(&g_ddraw.ref, 0); } IDirectDrawImpl* dd = (IDirectDrawImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirectDrawImpl)); diff --git a/src/ddpalette.c b/src/ddpalette.c index 3a7b52c..ed2b858 100644 --- a/src/ddpalette.c +++ b/src/ddpalette.c @@ -57,10 +57,10 @@ HRESULT ddp_SetEntries( This->data_rgb[255].rgbReserved = 0; } - if (g_ddraw && g_ddraw->primary && g_ddraw->primary->palette == This && g_ddraw->render.run) + if (g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette == This && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return DD_OK; diff --git a/src/ddsurface.c b/src/ddsurface.c index b45cc75..d7176c2 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -48,8 +48,8 @@ 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 && - g_ddraw->iskkndx && + if (g_ddraw.ref && + g_ddraw.iskkndx && (dwFlags & DDBLT_COLORFILL) && lpDestRect && lpDestRect->right == 640 && @@ -261,7 +261,7 @@ HRESULT dds_Blt( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; if (quad) @@ -404,20 +404,20 @@ HRESULT dds_Blt( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + 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_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -557,7 +557,7 @@ HRESULT dds_BltFast( { RGBQUAD* quad = src_surface->palette ? src_surface->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; if (quad) @@ -637,20 +637,20 @@ HRESULT dds_BltFast( } } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_config.limit_bltfast && g_ddraw->ticks_limiter.tick_length > 0) + if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -749,7 +749,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (This->backbuffer && !This->skip_flip) { - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; void* buf = InterlockedExchangePointer(&This->surface, backbuffer->surface); @@ -767,7 +767,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa blt_clear(buf, 0, backbuffer->size); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); if (!lpDDSurfaceTargetOverride && This->backbuffer->backbuffer) { @@ -777,12 +777,12 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa This->skip_flip = FALSE; - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { This->last_flip_tick = timeGetTime(); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if ((g_config.maxgameticks == 0 && (dwFlags & DDFLIP_WAIT)) || g_config.maxgameticks == -2) @@ -790,9 +790,9 @@ 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_ddraw->ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; util_limit_game_ticks(); } } @@ -877,7 +877,7 @@ HRESULT dds_GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) RGBQUAD* data = This->palette ? This->palette->data_rgb : - g_ddraw && g_ddraw->primary && g_ddraw->primary->palette ? g_ddraw->primary->palette->data_rgb : + g_ddraw.ref && g_ddraw.primary && g_ddraw.primary->palette ? g_ddraw.primary->palette->data_rgb : NULL; HDC dc = This->hdc; @@ -957,10 +957,10 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw && g_config.fixnotresponding && !g_config.is_wine) + if (g_ddraw.ref && g_config.fixnotresponding && !g_config.is_wine) { MSG msg; /* workaround for "Not Responding" window problem */ - real_PeekMessageA(&msg, g_ddraw->hwnd, 0, 0, PM_NOREMOVE); + real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); } HRESULT ret = dds_GetSurfaceDesc(This, lpDDSurfaceDesc); @@ -988,16 +988,16 @@ HRESULT dds_Lock( HRESULT dds_ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } } @@ -1061,16 +1061,16 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD if (This->palette) IDirectDrawPalette_Release(This->palette); - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref) { - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); This->palette = lpDDPalette; - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.run) + if (g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } } else @@ -1084,7 +1084,7 @@ HRESULT dds_SetPalette(IDirectDrawSurfaceImpl* This, IDirectDrawPaletteImpl* lpD HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { /* Hack for Warcraft II BNE and Diablo */ - HWND hwnd = g_ddraw && g_ddraw->bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; + HWND hwnd = g_ddraw.ref && g_ddraw.bnet_active ? FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1129,17 +1129,17 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (erase) { - BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; DDBLTFX fx = { .dwFillColor = 0xFE }; IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - g_ddraw->ticks_limiter.use_blt_or_flip = x; + g_ddraw.ticks_limiter.use_blt_or_flip = x; } } /* Hack for Star Trek Armada */ - hwnd = g_ddraw && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + hwnd = g_ddraw.ref && g_config.armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) { @@ -1168,27 +1168,27 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseDC(hwnd, hdc); } - BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; DDBLTFX fx = { .dwFillColor = 0 }; IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - g_ddraw->ticks_limiter.use_blt_or_flip = x; + g_ddraw.ticks_limiter.use_blt_or_flip = x; } - if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw && g_ddraw->render.run) + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw->ticks_limiter.tick_length > 0 && !g_ddraw->ticks_limiter.use_blt_or_flip) + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) util_limit_game_ticks(); } } @@ -1315,15 +1315,15 @@ HRESULT dd_CreateSurface( } if ((lpDDSurfaceDesc->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE) && - g_ddraw->primary && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - g_ddraw->primary->bpp == g_ddraw->bpp) + g_ddraw.primary && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + g_ddraw.primary->bpp == g_ddraw.bpp) { - g_ddraw->primary->skip_flip = TRUE; + g_ddraw.primary->skip_flip = TRUE; - *lpDDSurface = g_ddraw->primary; - IDirectDrawSurface_AddRef(g_ddraw->primary); + *lpDDSurface = g_ddraw.primary; + IDirectDrawSurface_AddRef(g_ddraw.primary); return DD_OK; } @@ -1337,7 +1337,7 @@ HRESULT dd_CreateSurface( InitializeCriticalSection(&dst_surface->cs); - dst_surface->bpp = g_ddraw->bpp == 0 ? 16 : g_ddraw->bpp; + dst_surface->bpp = g_ddraw.bpp == 0 ? 16 : g_ddraw.bpp; dst_surface->flags = lpDDSurfaceDesc->dwFlags; dst_surface->caps = lpDDSurfaceDesc->ddsCaps.dwCaps; dst_surface->ddraw = This; @@ -1378,8 +1378,8 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_FRONTBUFFER; } - dst_surface->width = g_ddraw->width; - dst_surface->height = g_ddraw->height; + dst_surface->width = g_ddraw.width; + dst_surface->height = g_ddraw.height; dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } @@ -1462,10 +1462,10 @@ HRESULT dd_CreateSurface( /* Claw hack: 128x128 surfaces need a DC for custom levels to work properly */ if (InterlockedExchangeAdd(&g_dds_gdi_handles, 0) < 4000 || - (dst_surface->width == g_ddraw->width && dst_surface->height == g_ddraw->height) || + (dst_surface->width == g_ddraw.width && dst_surface->height == g_ddraw.height) || (dst_surface->width == 128 && dst_surface->height == 128)) { - dst_surface->hdc = CreateCompatibleDC(g_ddraw->render.hdc); + dst_surface->hdc = CreateCompatibleDC(g_ddraw.render.hdc); if (dst_surface->hdc) InterlockedIncrement(&g_dds_gdi_handles); @@ -1524,7 +1524,7 @@ HRESULT dd_CreateSurface( if (dst_surface->caps & DDSCAPS_PRIMARYSURFACE) { - g_ddraw->primary = dst_surface; + g_ddraw.primary = dst_surface; FakePrimarySurface = dst_surface->surface; } } diff --git a/src/debug.c b/src/debug.c index b63c88e..4e81ab5 100644 --- a/src/debug.c +++ b/src/debug.c @@ -252,12 +252,12 @@ void dbg_draw_frame_info_start() static DWORD tick_fps = 0; static char debug_text[512] = { 0 }; - RECT debugrc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT debugrc = { 0, 0, g_ddraw.width, g_ddraw.height }; - if (g_ddraw->primary) + if (g_ddraw.primary) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); DrawText(primary_dc, debug_text, -1, &debugrc, DT_NOCLIP); } diff --git a/src/directinput.c b/src/directinput.c index 38d6eef..6dd5e5e 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -45,14 +45,14 @@ static HRESULT WINAPI fake_did_SetCooperativeLevel(IDirectInputDeviceA* This, HW { TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X)\n", This, hwnd, dwFlags); - if (This == g_mouse_device && g_ddraw && (dwFlags & DISCL_EXCLUSIVE)) + if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { if (g_mouse_locked || g_config.devmode) { while (real_ShowCursor(FALSE) >= 0); } - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, -1); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, -1); } return real_did_SetCooperativeLevel(This, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 90c8076..a6014bf 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -14,8 +14,8 @@ void fpsl_init() g_fpsl.tick_length_ns = 0; g_fpsl.tick_length = 0; - if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) - max_fps = g_ddraw->mode.dmDisplayFrequency; + if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) + max_fps = g_ddraw.mode.dmDisplayFrequency; if (max_fps > 1000) max_fps = 0; @@ -88,13 +88,13 @@ BOOL fpsl_wait_for_vblank() { if (g_fpsl.initialized) { - if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw->render.hdc) + if (!g_fpsl.got_adapter && g_fpsl.D3DKMTOpenAdapterFromHdc && g_ddraw.render.hdc) { EnterCriticalSection(&g_fpsl.cs); if (!g_fpsl.got_adapter) { - g_fpsl.adapter.hDc = g_ddraw->render.hdc; + g_fpsl.adapter.hDc = g_ddraw.render.hdc; if (g_fpsl.D3DKMTOpenAdapterFromHdc(&g_fpsl.adapter) == 0) { @@ -151,7 +151,7 @@ void fpsl_frame_start() void fpsl_frame_end() { if (g_config.maxfps < 0 || - (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))) + (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency))) { if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) return; @@ -161,7 +161,7 @@ void fpsl_frame_end() { if (g_fpsl.htimer) { - if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)) + if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw.mode.dmDisplayFrequency)) { WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2); LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns }; diff --git a/src/mouse.c b/src/mouse.c index 504ee92..c5b25eb 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -13,12 +13,12 @@ HOOKPROC g_mouse_proc; void mouse_lock() { - if (g_config.devmode || g_ddraw->bnet_active || !g_ddraw->hwnd) + if (g_config.devmode || g_ddraw.bnet_active || !g_ddraw.hwnd) return; - if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) + if (g_hook_active && !g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) { - int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); + int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw.show_cursor_count, 0); int cur_count = real_ShowCursor(TRUE) - 1; real_ShowCursor(FALSE); @@ -31,22 +31,22 @@ void mouse_lock() while (real_ShowCursor(TRUE) < game_count); } - real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw->old_cursor, 0)); + real_SetCursor((HCURSOR)InterlockedExchangeAdd((LONG*)&g_ddraw.old_cursor, 0)); RECT rc = { 0 }; - real_GetClientRect(g_ddraw->hwnd, &rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); + real_GetClientRect(g_ddraw.hwnd, &rc); + 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); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); 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 + (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); - CopyRect(&rc, &g_ddraw->mouse.rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); + CopyRect(&rc, &g_ddraw.mouse.rc); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); real_ClipCursor(&rc); g_mouse_locked = TRUE; @@ -55,7 +55,7 @@ void mouse_lock() void mouse_unlock() { - if (g_config.devmode || !g_hook_active || !g_ddraw->hwnd) + if (g_config.devmode || !g_hook_active || !g_ddraw.hwnd) return; if (g_mouse_locked) @@ -66,16 +66,16 @@ void mouse_unlock() //ReleaseCapture(); RECT rc = { 0 }; - real_GetClientRect(g_ddraw->hwnd, &rc); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - OffsetRect(&rc, g_ddraw->render.viewport.x, g_ddraw->render.viewport.y); + real_GetClientRect(g_ddraw.hwnd, &rc); + 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); + int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); real_SetCursorPos( - (int)(rc.left + (cur_x * g_ddraw->mouse.scale_x)), - (int)(rc.top + (cur_y * g_ddraw->mouse.scale_y))); + (int)(rc.left + (cur_x * g_ddraw.mouse.scale_x)), + (int)(rc.top + (cur_y * g_ddraw.mouse.scale_y))); real_SetCursor(LoadCursor(NULL, IDC_ARROW)); @@ -85,7 +85,7 @@ void mouse_unlock() LRESULT CALLBACK mouse_hook_proc(int Code, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw) + if (!g_ddraw.ref) return g_mouse_proc(Code, wParam, lParam); if (Code < 0 || (!g_config.devmode && !g_mouse_locked)) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index faed00a..276a81f 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -55,7 +55,7 @@ BOOL d3d9_is_available() BOOL d3d9_create() { - if (g_d3d9.hwnd == g_ddraw->hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) + if (g_d3d9.hwnd == g_ddraw.hwnd && d3d9_create_resources() && d3d9_reset(g_config.windowed)) { return TRUE; } @@ -122,18 +122,18 @@ BOOL d3d9_create() TRACE("+------------------------------------------------\n"); } #endif - g_d3d9.hwnd = g_ddraw->hwnd; + g_d3d9.hwnd = g_ddraw.hwnd; memset(&g_d3d9.params, 0, sizeof(g_d3d9.params)); g_d3d9.params.Windowed = g_config.windowed || g_config.nonexclusive; g_d3d9.params.SwapEffect = D3DSWAPEFFECT_DISCARD; - g_d3d9.params.hDeviceWindow = g_ddraw->hwnd; + g_d3d9.params.hDeviceWindow = g_ddraw.hwnd; g_d3d9.params.PresentationInterval = g_config.vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; 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; + g_d3d9.params.BackBufferFormat = g_ddraw.mode.dmBitsPerPel == 16 ? D3DFMT_R5G6B5 : D3DFMT_X8R8G8B8; g_d3d9.params.BackBufferCount = 1; DWORD behavior_flags[] = { @@ -151,7 +151,7 @@ BOOL d3d9_create() g_d3d9.instance, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, - g_ddraw->hwnd, + g_ddraw.hwnd, behavior_flags[i], &g_d3d9.params, &g_d3d9.device))) @@ -176,10 +176,10 @@ BOOL d3d9_on_device_lost() BOOL d3d9_reset(BOOL windowed) { g_d3d9.params.Windowed = windowed || g_config.nonexclusive; - g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw->render.width; - g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw->render.height; + g_d3d9.params.BackBufferWidth = g_d3d9.params.Windowed ? 0 : g_ddraw.render.width; + g_d3d9.params.BackBufferHeight = g_d3d9.params.Windowed ? 0 : g_ddraw.render.height; 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; + 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))) { @@ -187,9 +187,9 @@ BOOL d3d9_reset(BOOL windowed) if (result) { - InterlockedExchange(&g_ddraw->render.palette_updated, TRUE); - InterlockedExchange(&g_ddraw->render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.palette_updated, TRUE); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return result; @@ -264,8 +264,8 @@ static BOOL d3d9_create_resources() BOOL err = FALSE; - int width = g_ddraw->width; - int height = g_ddraw->height; + int width = g_ddraw.width; + int height = g_ddraw.height; g_d3d9.tex_width = width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; @@ -287,11 +287,11 @@ static BOOL d3d9_create_resources() &g_d3d9.vertex_buf, NULL)); - err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0), TRUE); + err = err || !d3d9_update_vertices(InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0), TRUE); for (int i = 0; i < D3D9_TEXTURE_COUNT; i++) { - if (g_ddraw->bpp == 16 && g_config.rgb555) + if (g_ddraw.bpp == 16 && g_config.rgb555) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -320,7 +320,7 @@ static BOOL d3d9_create_resources() 0)); } } - else if (g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 32) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -358,7 +358,7 @@ static BOOL d3d9_create_resources() g_d3d9.tex_height, 1, 0, - g_ddraw->bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, + g_ddraw.bpp == 16 ? D3DFMT_R5G6B5 : D3DFMT_L8, D3DPOOL_MANAGED, &g_d3d9.surface_tex[i], 0)); @@ -366,7 +366,7 @@ static BOOL d3d9_create_resources() err = err || !g_d3d9.surface_tex[i]; - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { BOOL error = FAILED( IDirect3DDevice9_CreateTexture( @@ -399,7 +399,7 @@ static BOOL d3d9_create_resources() } } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { err = err || FAILED( IDirect3DDevice9_CreatePixelShader(g_d3d9.device, (DWORD*)D3D9_PALETTE_SHADER, &g_d3d9.pixel_shader)); @@ -434,7 +434,7 @@ static BOOL d3d9_create_resources() } } - return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !err; + return g_d3d9.vertex_buf && (g_d3d9.pixel_shader || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !err; } static BOOL d3d9_set_states() @@ -445,14 +445,14 @@ static BOOL d3d9_set_states() 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])); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { err = err || FAILED(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_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height); err = err || FAILED( IDirect3DDevice9_SetPixelShader( @@ -471,8 +471,8 @@ static BOOL d3d9_set_states() { if (g_config.d3d9_filter == FILTER_LANCZOS && g_d3d9.pixel_shader_upscale && - (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height) && + (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))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; @@ -483,8 +483,8 @@ static BOOL d3d9_set_states() SUCCEEDED(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) && + (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))) { float texture_size[4] = { (float)g_d3d9.tex_width, (float)g_d3d9.tex_height, 0, 0 }; @@ -495,10 +495,10 @@ static BOOL d3d9_set_states() /* D3DVIEWPORT9 view_data = { - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0.0f, 1.0f }; @@ -509,14 +509,14 @@ static BOOL d3d9_set_states() static BOOL d3d9_update_vertices(BOOL upscale_hack, BOOL stretch) { - float vp_x = stretch ? (float)g_ddraw->render.viewport.x : 0.0f; - float vp_y = stretch ? (float)g_ddraw->render.viewport.y : 0.0f; + float vp_x = stretch ? (float)g_ddraw.render.viewport.x : 0.0f; + float vp_y = stretch ? (float)g_ddraw.render.viewport.y : 0.0f; - float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width; - float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height; + float vp_w = stretch ? (float)(g_ddraw.render.viewport.width + g_ddraw.render.viewport.x) : (float)g_ddraw.width; + float vp_h = stretch ? (float)(g_ddraw.render.viewport.height + g_ddraw.render.viewport.y) : (float)g_ddraw.height; - float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h; - float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w; + float s_h = upscale_hack ? g_d3d9.scale_h * ((float)g_ddraw.upscale_hack_height / g_ddraw.height) : g_d3d9.scale_h; + float s_w = upscale_hack ? g_d3d9.scale_w * ((float)g_ddraw.upscale_hack_width / g_ddraw.width) : g_d3d9.scale_w; CUSTOMVERTEX vertices[] = { @@ -546,10 +546,10 @@ DWORD WINAPI d3d9_render_main(void) BOOL needs_update = FALSE; - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -559,39 +559,39 @@ DWORD WINAPI d3d9_render_main(void) fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (g_config.vhack) { if (util_detect_low_res_screen()) { - if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) d3d9_update_vertices(TRUE, TRUE); } else { - if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) d3d9_update_vertices(FALSE, TRUE); } } D3DLOCKED_RECT lock_rc; - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= D3D9_TEXTURE_COUNT) tex_index = 0; - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + 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))) @@ -600,21 +600,21 @@ DWORD WINAPI d3d9_render_main(void) lock_rc.pBits, 0, 0, - g_ddraw->primary->width, - g_ddraw->primary->height, + g_ddraw.primary->width, + g_ddraw.primary->height, lock_rc.Pitch, - g_ddraw->primary->surface, + g_ddraw.primary->surface, 0, 0, - g_ddraw->primary->pitch, - g_ddraw->primary->bpp); + g_ddraw.primary->pitch, + g_ddraw.primary->bpp); IDirect3DTexture9_UnlockRect(g_d3d9.surface_tex[tex_index], 0); } } - if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw.bpp == 8 && + (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= D3D9_TEXTURE_COUNT) pal_index = 0; @@ -624,7 +624,7 @@ DWORD WINAPI d3d9_render_main(void) 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))) { - memcpy(lock_rc.pBits, g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(lock_rc.pBits, g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); IDirect3DTexture9_UnlockRect(g_d3d9.palette_tex[pal_index], 0); } @@ -632,13 +632,13 @@ 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); + 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) + if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) { - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); @@ -654,12 +654,12 @@ DWORD WINAPI d3d9_render_main(void) } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } @@ -668,7 +668,7 @@ DWORD WINAPI d3d9_render_main(void) IDirect3DDevice9_DrawPrimitive(g_d3d9.device, D3DPT_TRIANGLESTRIP, 0, 2); IDirect3DDevice9_EndScene(g_d3d9.device); - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) { IDirect3DDevice9_Clear(g_d3d9.device, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); } @@ -676,9 +676,9 @@ DWORD WINAPI d3d9_render_main(void) if (FAILED(IDirect3DDevice9_Present(g_d3d9.device, NULL, NULL, NULL, NULL))) { DWORD_PTR result; - SendMessageTimeout(g_ddraw->hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); + SendMessageTimeout(g_ddraw.hwnd, WM_D3D9DEVICELOST, 0, 0, 0, 1000, &result); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); Sleep(50); } @@ -690,7 +690,7 @@ DWORD WINAPI d3d9_render_main(void) } if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); return 0; } diff --git a/src/render_gdi.c b/src/render_gdi.c index 8576450..78f7d5d 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -16,16 +16,16 @@ DWORD WINAPI gdi_render_main(void) static DWORD warning_end_tick = 0; static char warning_text[512] = { 0 }; - if (g_ddraw->show_driver_warning) + if (g_ddraw.show_driver_warning) { - g_ddraw->show_driver_warning = FALSE; + g_ddraw.show_driver_warning = FALSE; TRACE(" Switched to GDI renderer\n"); warning_end_tick = timeGetTime() + (15 * 1000); if (!g_config.windowed) - PostMessage(g_ddraw->hwnd, WM_AUTORENDERER, 0, 0); + PostMessage(g_ddraw.hwnd, WM_AUTORENDERER, 0, 0); _snprintf( warning_text, @@ -38,10 +38,10 @@ DWORD WINAPI gdi_render_main(void) fpsl_init(); - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); @@ -49,25 +49,25 @@ DWORD WINAPI gdi_render_main(void) fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (warning_end_tick) { if (timeGetTime() < warning_end_tick) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); - RECT rc = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rc = { 0, 0, g_ddraw.width, g_ddraw.height }; DrawText(primary_dc, warning_text, -1, &rc, DT_NOCLIP | DT_CENTER); } else @@ -79,88 +79,88 @@ DWORD WINAPI gdi_render_main(void) BOOL upscale_hack = g_config.vhack && util_detect_low_res_screen(); if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, upscale_hack); + InterlockedExchange(&g_ddraw.upscale_hack_active, upscale_hack); 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); + 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->bpp == 8 && g_ddraw->primary->palette) + if (g_ddraw.bpp == 8 && g_ddraw.primary->palette) { - memcpy(&g_ddraw->primary->bmi->bmiColors[0], g_ddraw->primary->palette->data_rgb, 256 * sizeof(int)); + memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); } - if (InterlockedExchange(&g_ddraw->render.clear_screen, FALSE)) + if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE)) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; - FillRect(g_ddraw->render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; + FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } - if (g_ddraw->bnet_active) + 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)); + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; + FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); } else if (upscale_hack) { real_StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.hdc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0, - g_ddraw->height - g_ddraw->upscale_hack_height, - g_ddraw->upscale_hack_width, - g_ddraw->upscale_hack_height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.height - g_ddraw.upscale_hack_height, + g_ddraw.upscale_hack_width, + g_ddraw.upscale_hack_height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS, SRCCOPY); } - else if (!g_ddraw->child_window_exists && - (g_ddraw->render.width != g_ddraw->width || g_ddraw->render.height != g_ddraw->height)) + else if (!g_ddraw.child_window_exists && + (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height)) { real_StretchDIBits( - g_ddraw->render.hdc, - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height, + g_ddraw.render.hdc, + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height, 0, 0, - g_ddraw->width, - g_ddraw->height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.width, + g_ddraw.height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS, SRCCOPY); } else { real_SetDIBitsToDevice( - g_ddraw->render.hdc, + g_ddraw.render.hdc, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, 0, 0, 0, - g_ddraw->height, - g_ddraw->primary->surface, - g_ddraw->primary->bmi, + g_ddraw.height, + g_ddraw.primary->surface, + g_ddraw.primary->bmi, DIB_RGB_COLORS); } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); #if _DEBUG dbg_draw_frame_info_end(); diff --git a/src/render_ogl.c b/src/render_ogl.c index 6ff9a2c..428453e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -30,7 +30,7 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - g_ogl.context = ogl_create_context(g_ddraw->render.hdc); + g_ogl.context = ogl_create_context(g_ddraw.render.hdc); if (g_ogl.context) { oglu_init(); @@ -42,21 +42,21 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ddraw->render.hdc); + g_ogl.context = ogl_create_core_context(g_ddraw.render.hdc); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw->render.hdc) && wglSwapIntervalEXT) + if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw.render.hdc) && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); ogl_build_programs(); - ogl_create_textures(g_ddraw->width, g_ddraw->height); + ogl_create_textures(g_ddraw.width, g_ddraw.height); ogl_init_main_program(); ogl_init_scale_program(); g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; - g_ogl.use_opengl = (g_ogl.main_program || g_ddraw->bpp == 16 || g_ddraw->bpp == 32) && !g_ogl.got_error; + g_ogl.use_opengl = (g_ogl.main_program || g_ddraw.bpp == 16 || g_ddraw.bpp == 32) && !g_ogl.got_error; ogl_render(); @@ -65,8 +65,8 @@ DWORD WINAPI ogl_render_main(void) if (!g_ogl.use_opengl) { - g_ddraw->show_driver_warning = TRUE; - g_ddraw->renderer = gdi_render_main; + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; gdi_render_main(); } @@ -137,15 +137,15 @@ static void ogl_build_programs() if (g_oglu_got_version3) { - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PALETTE_FRAG_SHADER, core_profile); } - else if (g_ddraw->bpp == 16 && g_config.rgb555) + else if (g_ddraw.bpp == 16 && g_config.rgb555) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, RGB555_FRAG_SHADER, core_profile); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, PASSTHROUGH_FRAG_SHADER, core_profile); } @@ -172,14 +172,14 @@ static void ogl_build_programs() strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || - g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height) + g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height) { g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); if (!g_ogl.scale_program && - (g_ddraw->render.viewport.width != g_ddraw->width || - g_ddraw->render.viewport.height != g_ddraw->height)) + (g_ddraw.render.viewport.width != g_ddraw.width || + g_ddraw.render.viewport.height != g_ddraw.height)) { g_ogl.scale_program = oglu_build_program( @@ -209,11 +209,11 @@ static void ogl_build_programs() if (g_oglu_got_version2 && !g_ogl.main_program) { - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PALETTE_FRAG_SHADER_110, FALSE); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { g_ogl.main_program = oglu_build_program(PASSTHROUGH_VERT_SHADER_110, PASSTHROUGH_FRAG_SHADER_110, FALSE); } @@ -246,7 +246,7 @@ static void ogl_create_textures(int width, int height) while (glGetError() != GL_NO_ERROR); - if (g_ddraw->bpp == 32) + if (g_ddraw.bpp == 32) { glTexImage2D( GL_TEXTURE_2D, @@ -259,7 +259,7 @@ static void ogl_create_textures(int width, int height) g_ogl.surface_type = GL_UNSIGNED_BYTE, 0); } - else if (g_ddraw->bpp == 16 && g_config.rgb555) + else if (g_ddraw.bpp == 16 && g_config.rgb555) { if (g_oglu_got_version3) { @@ -288,7 +288,7 @@ static void ogl_create_textures(int width, int height) 0); } } - else if (g_ddraw->bpp == 16) + else if (g_ddraw.bpp == 16) { glTexImage2D( GL_TEXTURE_2D, @@ -316,7 +316,7 @@ static void ogl_create_textures(int width, int height) 0); } } - else if (g_ddraw->bpp == 8) + else if (g_ddraw.bpp == 8) { glTexImage2D( GL_TEXTURE_2D, @@ -360,7 +360,7 @@ static void ogl_create_textures(int width, int height) } } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { glGenTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); @@ -385,7 +385,7 @@ static void ogl_init_main_program() glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1); if (g_oglu_got_version3) @@ -532,12 +532,12 @@ static void ogl_init_scale_program() float input_size[2], output_size[2], texture_size[2]; - input_size[0] = (float)g_ddraw->width; - input_size[1] = (float)g_ddraw->height; + input_size[0] = (float)g_ddraw.width; + input_size[1] = (float)g_ddraw.height; texture_size[0] = (float)g_ogl.surface_tex_width; texture_size[1] = (float)g_ogl.surface_tex_height; - output_size[0] = (float)g_ddraw->render.viewport.width; - output_size[1] = (float)g_ddraw->render.viewport.height; + output_size[0] = (float)g_ddraw.render.viewport.width; + output_size[1] = (float)g_ddraw.render.viewport.height; GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize"); if (loc != -1) @@ -648,31 +648,31 @@ static void ogl_render() BOOL needs_update = FALSE; glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); if (g_ogl.main_program) { glUseProgram(g_ogl.main_program); } - else if (g_ddraw->bpp == 16 || g_ddraw->bpp == 32) + else if (g_ddraw.bpp == 16 || g_ddraw.bpp == 32) { glEnable(GL_TEXTURE_2D); } - DWORD timeout = g_config.minfps > 0 ? g_ddraw->minfps_tick_len : INFINITE; + DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; - while (g_ogl.use_opengl && g_ddraw->render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw->render.sem, timeout) != WAIT_FAILED)) + while (g_ogl.use_opengl && g_ddraw.render.run && + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) { #if _DEBUG dbg_draw_frame_info_start(); #endif - g_ogl.scale_w = (float)g_ddraw->width / g_ogl.surface_tex_width; - g_ogl.scale_h = (float)g_ddraw->height / g_ogl.surface_tex_height; + g_ogl.scale_w = (float)g_ddraw.width / g_ogl.surface_tex_width; + g_ogl.scale_h = (float)g_ddraw.height / g_ogl.surface_tex_height; static int tex_index = 0, pal_index = 0; @@ -680,36 +680,36 @@ static void ogl_render() fpsl_frame_start(); - EnterCriticalSection(&g_ddraw->cs); + EnterCriticalSection(&g_ddraw.cs); - if (g_ddraw->primary && - g_ddraw->primary->bpp == g_ddraw->bpp && - g_ddraw->primary->width == g_ddraw->width && - g_ddraw->primary->height == g_ddraw->height && - (g_ddraw->bpp == 16 || g_ddraw->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && + g_ddraw.primary->bpp == g_ddraw.bpp && + g_ddraw.primary->width == g_ddraw.width && + g_ddraw.primary->height == g_ddraw.height && + (g_ddraw.bpp == 16 || g_ddraw.bpp == 32 || g_ddraw.primary->palette)) { if (g_config.lock_surfaces) - EnterCriticalSection(&g_ddraw->primary->cs); + EnterCriticalSection(&g_ddraw.primary->cs); if (g_config.vhack) { if (util_detect_low_res_screen()) { - g_ogl.scale_w *= (float)g_ddraw->upscale_hack_width / g_ddraw->width; - g_ogl.scale_h *= (float)g_ddraw->upscale_hack_height / g_ddraw->height; + g_ogl.scale_w *= (float)g_ddraw.upscale_hack_width / g_ddraw.width; + g_ogl.scale_h *= (float)g_ddraw.upscale_hack_height / g_ddraw.height; - if (!InterlockedExchange(&g_ddraw->upscale_hack_active, TRUE)) + if (!InterlockedExchange(&g_ddraw.upscale_hack_active, TRUE)) scale_changed = TRUE; } else { - if (InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE)) + if (InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE)) scale_changed = TRUE; } } - if (g_ddraw->bpp == 8 && - (InterlockedExchange(&g_ddraw->render.palette_updated, FALSE) || g_config.minfps == -2)) + if (g_ddraw.bpp == 8 && + (InterlockedExchange(&g_ddraw.render.palette_updated, FALSE) || g_config.minfps == -2)) { if (++pal_index >= TEXTURE_COUNT) pal_index = 0; @@ -725,19 +725,19 @@ static void ogl_render() 1, GL_RGBA, GL_UNSIGNED_BYTE, - g_ddraw->primary->palette->data_bgr); + g_ddraw.primary->palette->data_bgr); } - if (InterlockedExchange(&g_ddraw->render.surface_updated, FALSE) || g_config.minfps == -2) + if (InterlockedExchange(&g_ddraw.render.surface_updated, FALSE) || g_config.minfps == -2) { if (++tex_index >= TEXTURE_COUNT) tex_index = 0; glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - DWORD row_len = g_ddraw->primary->pitch ? g_ddraw->primary->pitch / g_ddraw->primary->bytes_pp : 0; + DWORD row_len = g_ddraw.primary->pitch ? g_ddraw.primary->pitch / g_ddraw.primary->bytes_pp : 0; - if (row_len != g_ddraw->primary->width) + if (row_len != g_ddraw.primary->width) glPixelStorei(GL_UNPACK_ROW_LENGTH, row_len); glTexSubImage2D( @@ -745,13 +745,13 @@ static void ogl_render() 0, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, - g_ddraw->primary->surface); + g_ddraw.primary->surface); - if (row_len != g_ddraw->primary->width) + if (row_len != g_ddraw.primary->width) glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } @@ -769,29 +769,29 @@ 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); + 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) + if (g_ddraw.render.width != g_ddraw.width || g_ddraw.render.height != g_ddraw.height) { - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { glClear(GL_COLOR_BUFFER_BIT); if (!needs_update) { - glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); needs_update = TRUE; } } else if (needs_update) { glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); needs_update = FALSE; } @@ -799,12 +799,12 @@ static void ogl_render() } if (g_config.lock_surfaces) - LeaveCriticalSection(&g_ddraw->primary->cs); + LeaveCriticalSection(&g_ddraw.primary->cs); } - LeaveCriticalSection(&g_ddraw->cs); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { glClear(GL_COLOR_BUFFER_BIT); } @@ -848,7 +848,7 @@ static void ogl_render() glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[tex_index]); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, g_ogl.palette_tex_ids[pal_index]); @@ -861,7 +861,7 @@ static void ogl_render() /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); - glViewport(0, 0, g_ddraw->width, g_ddraw->height); + glViewport(0, 0, g_ddraw.width, g_ddraw.height); glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); @@ -874,17 +874,17 @@ static void ogl_render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, 0); - if (g_ddraw->child_window_exists) + if (g_ddraw.child_window_exists) { - glViewport(0, g_ddraw->render.height - g_ddraw->height, g_ddraw->width, g_ddraw->height); + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); } else { glViewport( - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y + g_ddraw->render.opengl_y_align, - g_ddraw->render.viewport.width, - g_ddraw->render.viewport.height); + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); } /* apply filter */ @@ -917,10 +917,10 @@ static void ogl_render() glEnd(); } - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) glClear(GL_COLOR_BUFFER_BIT); - SwapBuffers(g_ddraw->render.hdc); + SwapBuffers(g_ddraw.render.hdc); #if _DEBUG dbg_draw_frame_info_end(); @@ -930,7 +930,7 @@ static void ogl_render() } if (g_config.vhack) - InterlockedExchange(&g_ddraw->upscale_hack_active, FALSE); + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } static void ogl_delete_context(HGLRC context) @@ -940,7 +940,7 @@ static void ogl_delete_context(HGLRC context) glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) glDeleteTextures(TEXTURE_COUNT, g_ogl.palette_tex_ids); if (glUseProgram) @@ -1004,8 +1004,8 @@ static BOOL ogl_texture_upload_test() 0, 0, 0, - g_ddraw->width, - g_ddraw->height, + g_ddraw.width, + g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); @@ -1018,7 +1018,7 @@ static BOOL ogl_texture_upload_test() return FALSE; } - if (g_ddraw->bpp == 8) + if (g_ddraw.bpp == 8) { for (i = 0; i < TEXTURE_COUNT; i++) { @@ -1053,7 +1053,7 @@ static BOOL ogl_shader_test() BOOL result = TRUE; - if (g_ddraw->bpp != 8) + if (g_ddraw.bpp != 8) return result; if (g_oglu_got_version3 && g_ogl.main_program) diff --git a/src/screenshot.c b/src/screenshot.c index 88d559c..d76105e 100644 --- a/src/screenshot.c +++ b/src/screenshot.c @@ -134,7 +134,7 @@ BOOL ss_take_screenshot(IDirectDrawSurfaceImpl* src) char str_time[64]; time_t t = time(NULL); - strncpy(title, g_ddraw->title, sizeof(g_ddraw->title)); + strncpy(title, g_ddraw.title, sizeof(g_ddraw.title)); for (int i = 0; i < strlen(title); i++) { diff --git a/src/utils.c b/src/utils.c index d3b26c9..34ff9a2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -152,25 +152,25 @@ BOOL util_is_avx_supported() void util_limit_game_ticks() { - if (GetCurrentThreadId() != g_ddraw->gui_thread_id) + if (GetCurrentThreadId() != g_ddraw.gui_thread_id) return; - if (g_ddraw->ticks_limiter.htimer) + if (g_ddraw.ticks_limiter.htimer) { FILETIME ft = { 0 }; GetSystemTimeAsFileTime(&ft); - if (CompareFileTime((FILETIME*)&g_ddraw->ticks_limiter.due_time, &ft) == -1) + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) { - memcpy(&g_ddraw->ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); } else { - WaitForSingleObject(g_ddraw->ticks_limiter.htimer, g_ddraw->ticks_limiter.tick_length * 2); + WaitForSingleObject(g_ddraw.ticks_limiter.htimer, g_ddraw.ticks_limiter.tick_length * 2); } - g_ddraw->ticks_limiter.due_time.QuadPart += g_ddraw->ticks_limiter.tick_length_ns; - SetWaitableTimer(g_ddraw->ticks_limiter.htimer, &g_ddraw->ticks_limiter.due_time, 0, NULL, NULL, FALSE); + g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; + SetWaitableTimer(g_ddraw.ticks_limiter.htimer, &g_ddraw.ticks_limiter.due_time, 0, NULL, NULL, FALSE); } else { @@ -182,12 +182,12 @@ void util_limit_game_ticks() return; } - next_game_tick += g_ddraw->ticks_limiter.tick_length; + next_game_tick += g_ddraw.ticks_limiter.tick_length; DWORD tick_count = timeGetTime(); int sleep_time = next_game_tick - tick_count; - if (sleep_time <= 0 || sleep_time > g_ddraw->ticks_limiter.tick_length) + if (sleep_time <= 0 || sleep_time > g_ddraw.ticks_limiter.tick_length) { next_game_tick = tick_count; } @@ -203,7 +203,7 @@ void util_update_bnet_pos(int new_x, int new_y) static int old_x = -32000; static int old_y = -32000; - if (old_x == -32000 || old_y == -32000 || !g_ddraw->bnet_active) + if (old_x == -32000 || old_y == -32000 || !g_ddraw.bnet_active) { old_x = new_x; old_y = new_y; @@ -211,10 +211,10 @@ void util_update_bnet_pos(int new_x, int new_y) } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + real_ClientToScreen(g_ddraw.hwnd, &pt); RECT mainrc; - SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw->width, pt.y + g_ddraw->height); + SetRect(&mainrc, pt.x, pt.y, pt.x + g_ddraw.width, pt.y + g_ddraw.height); int adj_y = 0; int adj_x = 0; @@ -237,7 +237,7 @@ void util_update_bnet_pos(int new_x, int new_y) 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); - if (rc.bottom - rc.top <= g_ddraw->height) + if (rc.bottom - rc.top <= g_ddraw.height) { if (rc.bottom > mainrc.bottom && abs(mainrc.bottom - rc.bottom) > abs(adj_y)) { @@ -249,7 +249,7 @@ void util_update_bnet_pos(int new_x, int new_y) } } - if (rc.right - rc.left <= g_ddraw->width) + if (rc.right - rc.left <= g_ddraw.width) { if (rc.right > mainrc.right && abs(mainrc.right - rc.right) > abs(adj_x)) { @@ -340,23 +340,23 @@ void util_toggle_maximize() RECT client_rc; RECT dst_rc; - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); - LONG exstyle = real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE); - BOOL got_menu = GetMenu(g_ddraw->hwnd) != NULL; + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + BOOL got_menu = GetMenu(g_ddraw.hwnd) != NULL; - if (real_GetClientRect(g_ddraw->hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) + if (real_GetClientRect(g_ddraw.hwnd, &client_rc) && SystemParametersInfo(SPI_GETWORKAREA, 0, &dst_rc, 0)) { int width = (dst_rc.right - dst_rc.left); int height = (dst_rc.bottom - dst_rc.top); int x = dst_rc.left; int y = dst_rc.top; - if (client_rc.right != g_ddraw->width || client_rc.bottom != g_ddraw->height) + if (client_rc.right != g_ddraw.width || client_rc.bottom != g_ddraw.height) { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw->width; - dst_rc.bottom = g_ddraw->height; + dst_rc.right = g_ddraw.width; + dst_rc.bottom = g_ddraw.height; AdjustWindowRectEx(&dst_rc, style, got_menu, exstyle); } @@ -364,15 +364,15 @@ void util_toggle_maximize() { dst_rc.left = 0; dst_rc.top = 0; - dst_rc.right = g_ddraw->width; - dst_rc.bottom = g_ddraw->height; + dst_rc.right = g_ddraw.width; + dst_rc.bottom = g_ddraw.height; for (int i = 20; i-- > 1;) { - if (width >= g_ddraw->width * i && height - 20 >= g_ddraw->height * i) + if (width >= g_ddraw.width * i && height - 20 >= g_ddraw.height * i) { - dst_rc.right = g_ddraw->width * i; - dst_rc.bottom = g_ddraw->height * i; + dst_rc.right = g_ddraw.width * i; + dst_rc.bottom = g_ddraw.height * i; break; } } @@ -386,7 +386,7 @@ 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)g_ddraw.height / g_ddraw.width; double src_ar = (double)h / w; dst_rc.top = 0; @@ -423,7 +423,7 @@ void util_toggle_maximize() void util_toggle_fullscreen() { - if (g_ddraw->bnet_active) + if (g_ddraw.bnet_active) return; if (g_config.toggle_borderless && g_config.windowed) @@ -433,7 +433,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = TRUE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); mouse_lock(); } @@ -442,7 +442,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); //mouse_lock(); } @@ -459,7 +459,7 @@ void util_toggle_fullscreen() } g_config.window_state = g_config.windowed = FALSE; - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_WINDOWED); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); mouse_lock(); @@ -475,27 +475,27 @@ void util_toggle_fullscreen() g_config.window_state = g_config.windowed = TRUE; - if (g_ddraw->renderer == d3d9_render_main && !g_config.nonexclusive) + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) { d3d9_reset(g_config.windowed); } else { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + 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; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, SDM_LEAVE_FULLSCREEN); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_FULLSCREEN); //mouse_lock(); } } @@ -523,15 +523,15 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) { if (g_config.windowed) { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + 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; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if ((flags & SWP_NOMOVE) == 0) @@ -546,7 +546,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } } @@ -581,7 +581,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { - InterlockedExchangePointer((void*)&g_ddraw->video_window_hwnd, hwnd); + InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); } LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); @@ -603,7 +603,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } else { - g_ddraw->got_child_windows = g_ddraw->child_window_exists = TRUE; + g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_PAINT) { @@ -612,7 +612,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) dds_GetDC(this, &src_dc); - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)&pos, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2); BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); @@ -627,7 +627,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) static unsigned char util_get_pixel(int x, int y) { return ((unsigned char*)dds_GetBuffer( - g_ddraw->primary))[y * g_ddraw->primary->pitch + x * g_ddraw->primary->bytes_pp]; + g_ddraw.primary))[y * g_ddraw.primary->pitch + x * g_ddraw.primary->bytes_pp]; } BOOL util_detect_low_res_screen() @@ -636,12 +636,12 @@ BOOL util_detect_low_res_screen() static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; - if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height) + if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { return FALSE; } - if (g_ddraw->isredalert) + if (g_ddraw.isredalert) { if ((*in_movie && !*is_vqa_640) || *should_stretch) { @@ -650,15 +650,15 @@ BOOL util_detect_low_res_screen() return FALSE; } - else if (g_ddraw->iscnc1) + else if (g_ddraw.iscnc1) { return - util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 || - util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0; + util_get_pixel(g_ddraw.upscale_hack_width + 1, 0) == 0 || + util_get_pixel(g_ddraw.upscale_hack_width + 5, 1) == 0; } - else if (g_ddraw->iskkndx) + else if (g_ddraw.iskkndx) { - return util_get_pixel(g_ddraw->width - 3, 3) == 0; + return util_get_pixel(g_ddraw.width - 3, 3) == 0; } return FALSE; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 10c287e..8b6562a 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -21,7 +21,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) return real_GetCursorPos(lpPoint); POINT pt, realpt; @@ -32,16 +32,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) realpt.x = pt.x; realpt.y = pt.y; - if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw->hwnd, &pt))) + if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) { /* fallback solution for possible ClipCursor failure */ int diffx = 0, diffy = 0; - int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; + int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; - pt.x -= g_ddraw->mouse.x_adjust; - pt.y -= g_ddraw->mouse.y_adjust; + pt.x -= g_ddraw.mouse.x_adjust; + pt.y -= g_ddraw.mouse.y_adjust; if (pt.x < 0) { @@ -75,38 +75,38 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (g_config.adjmouse) { - x = min((DWORD)(roundf(pt.x * g_ddraw->mouse.unscale_x)), g_ddraw->width - 1); - y = min((DWORD)(roundf(pt.y * g_ddraw->mouse.unscale_y)), g_ddraw->height - 1); + x = min((DWORD)(roundf(pt.x * g_ddraw.mouse.unscale_x)), g_ddraw.width - 1); + y = min((DWORD)(roundf(pt.y * g_ddraw.mouse.unscale_y)), g_ddraw.height - 1); } else { - x = min(pt.x, g_ddraw->width - 1); - y = min(pt.y, g_ddraw->height - 1); + x = min(pt.x, g_ddraw.width - 1); + y = min(pt.y, g_ddraw.height - 1); } - if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw->upscale_hack_active, 0)) + if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { diffx = 0; diffy = 0; - if (x > g_ddraw->upscale_hack_width) + if (x > g_ddraw.upscale_hack_width) { - diffx = x - g_ddraw->upscale_hack_width; - x = g_ddraw->upscale_hack_width; + diffx = x - g_ddraw.upscale_hack_width; + x = g_ddraw.upscale_hack_width; } - if (y > g_ddraw->upscale_hack_height) + if (y > g_ddraw.upscale_hack_height) { - diffy = y - g_ddraw->upscale_hack_height; - y = g_ddraw->upscale_hack_height; + diffy = y - g_ddraw.upscale_hack_height; + y = g_ddraw.upscale_hack_height; } if (diffx || diffy) real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); } - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); if (lpPoint) { @@ -116,9 +116,9 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } - else if (lpPoint && g_ddraw->bnet_active && real_ScreenToClient(g_ddraw->hwnd, &pt)) + else if (lpPoint && g_ddraw.bnet_active && real_ScreenToClient(g_ddraw.hwnd, &pt)) { - if (pt.x > 0 && pt.x < g_ddraw->width && pt.y > 0 && pt.y < g_ddraw->height) + if (pt.x > 0 && pt.x < g_ddraw.width && pt.y > 0 && pt.y < g_ddraw.height) { lpPoint->x = pt.x; lpPoint->y = pt.y; @@ -129,8 +129,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (lpPoint) { - lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); - lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); + lpPoint->x = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.x, 0); + lpPoint->y = InterlockedExchangeAdd((LONG*)&g_ddraw.cursor.y, 0); } return TRUE; @@ -138,13 +138,13 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (g_ddraw && g_ddraw->hwnd && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { RECT dst_rc = { 0, 0, - g_ddraw->width, - g_ddraw->height + g_ddraw.width, + g_ddraw.height }; if (lpRect) @@ -152,28 +152,28 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) if (g_config.adjmouse) { - dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w)); - dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h)); - dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw->render.scale_h)); - dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w)); + dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw.render.scale_w)); + dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw.render.scale_h)); + dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw.render.scale_h)); + dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw.render.scale_w)); } - int max_width = g_config.adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; - int max_height = g_config.adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; + int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; dst_rc.bottom = min(dst_rc.bottom, max_height); dst_rc.right = min(dst_rc.right, max_width); OffsetRect( &dst_rc, - g_ddraw->mouse.x_adjust, - g_ddraw->mouse.y_adjust); + g_ddraw.mouse.x_adjust, + g_ddraw.mouse.y_adjust); - CopyRect(&g_ddraw->mouse.rc, &dst_rc); + CopyRect(&g_ddraw.mouse.rc, &dst_rc); - if (g_mouse_locked && !util_is_minimized(g_ddraw->hwnd)) + if (g_mouse_locked && !util_is_minimized(g_ddraw.hwnd)) { - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); return real_ClipCursor(&dst_rc); } @@ -184,19 +184,19 @@ BOOL WINAPI fake_ClipCursor(const RECT* lpRect) int WINAPI fake_ShowCursor(BOOL bShow) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { if (g_mouse_locked || g_config.devmode) { int count = real_ShowCursor(bShow); - InterlockedExchange((LONG*)&g_ddraw->show_cursor_count, count); + InterlockedExchange((LONG*)&g_ddraw.show_cursor_count, count); return count; } else { return bShow ? - InterlockedIncrement((LONG*)&g_ddraw->show_cursor_count) : - InterlockedDecrement((LONG*)&g_ddraw->show_cursor_count); + InterlockedIncrement((LONG*)&g_ddraw.show_cursor_count) : + InterlockedDecrement((LONG*)&g_ddraw.show_cursor_count); } } @@ -205,9 +205,9 @@ int WINAPI fake_ShowCursor(BOOL bShow) HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw->old_cursor, (LONG)hCursor); + HCURSOR cursor = (HCURSOR)InterlockedExchange((LONG*)&g_ddraw.old_cursor, (LONG)hCursor); if (!g_mouse_locked && !g_config.devmode) return cursor; @@ -219,15 +219,15 @@ HCURSOR WINAPI fake_SetCursor(HCURSOR hCursor) BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw && - g_ddraw->hwnd && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + g_ddraw.ref && + g_ddraw.hwnd && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -236,7 +236,7 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) { if (real_GetWindowRect(hWnd, lpRect)) { - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)lpRect, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)lpRect, 2); return TRUE; } @@ -251,13 +251,13 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) { if (lpRect && - g_ddraw && - g_ddraw->hwnd == hWnd && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + g_ddraw.ref && + g_ddraw.hwnd == hWnd && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -268,29 +268,29 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) BOOL WINAPI fake_ClientToScreen(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_ClientToScreen(hWnd, lpPoint); - if (g_ddraw->hwnd != hWnd) - return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw->hwnd, lpPoint); + if (g_ddraw.hwnd != hWnd) + return real_ClientToScreen(hWnd, lpPoint) && real_ScreenToClient(g_ddraw.hwnd, lpPoint); return TRUE; } BOOL WINAPI fake_ScreenToClient(HWND hWnd, LPPOINT lpPoint) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_ScreenToClient(hWnd, lpPoint); - if (g_ddraw->hwnd != hWnd) - return real_ClientToScreen(g_ddraw->hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); + if (g_ddraw.hwnd != hWnd) + return real_ClientToScreen(g_ddraw.hwnd, lpPoint) && real_ScreenToClient(hWnd, lpPoint); return TRUE; } BOOL WINAPI fake_SetCursorPos(int X, int Y) { - if (!g_ddraw || !g_ddraw->hwnd || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.hwnd || !g_ddraw.width) return real_SetCursorPos(X, Y); if (!g_mouse_locked && !g_config.devmode) @@ -300,35 +300,35 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y) if (g_config.adjmouse) { - pt.x = (LONG)(roundf(pt.x * g_ddraw->mouse.scale_x)); - pt.y = (LONG)(roundf(pt.y * g_ddraw->mouse.scale_y)); + pt.x = (LONG)(roundf(pt.x * g_ddraw.mouse.scale_x)); + pt.y = (LONG)(roundf(pt.y * g_ddraw.mouse.scale_y)); } - pt.x += g_ddraw->mouse.x_adjust; - pt.y += g_ddraw->mouse.y_adjust; + pt.x += g_ddraw.mouse.x_adjust; + pt.y += g_ddraw.mouse.y_adjust; - return real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); + return real_ClientToScreen(g_ddraw.hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); } HWND WINAPI fake_WindowFromPoint(POINT Point) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_WindowFromPoint(Point); POINT pt = { Point.x, Point.y }; - return real_ClientToScreen(g_ddraw->hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; + return real_ClientToScreen(g_ddraw.hwnd, &pt) ? real_WindowFromPoint(pt) : NULL; } BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) { - if (!g_ddraw || !g_ddraw->width) + if (!g_ddraw.ref || !g_ddraw.width) return real_GetClipCursor(lpRect); if (lpRect) { - lpRect->bottom = g_ddraw->height; + lpRect->bottom = g_ddraw.height; lpRect->left = 0; - lpRect->right = g_ddraw->width; + lpRect->right = g_ddraw.width; lpRect->top = 0; return TRUE; @@ -339,21 +339,21 @@ BOOL WINAPI fake_GetClipCursor(LPRECT lpRect) BOOL WINAPI fake_GetCursorInfo(PCURSORINFO pci) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_GetCursorInfo(pci); - return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw->hwnd, &pci->ptScreenPos); + return pci && real_GetCursorInfo(pci) && real_ScreenToClient(g_ddraw.hwnd, &pci->ptScreenPos); } int WINAPI fake_GetSystemMetrics(int nIndex) { - if (g_ddraw && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.width) { if (nIndex == SM_CXSCREEN) - return g_ddraw->width; + return g_ddraw.width; if (nIndex == SM_CYSCREEN) - return g_ddraw->height; + return g_ddraw.height; } return real_GetSystemMetrics(nIndex); @@ -361,19 +361,19 @@ int WINAPI fake_GetSystemMetrics(int nIndex) BOOL WINAPI fake_SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { UINT req_flags = SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER; if ((uFlags & req_flags) != req_flags) return TRUE; } - else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw->hwnd, &pt)) + if (real_ClientToScreen(g_ddraw.hwnd, &pt)) { X += pt.x; Y += pt.y; @@ -386,27 +386,27 @@ 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) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { - if (g_ddraw->hwnd == hWnd) + if (g_ddraw.hwnd == hWnd) { - if (g_ddraw->width && g_ddraw->height && (nWidth != g_ddraw->width || nHeight != g_ddraw->height)) + if (g_ddraw.width && g_ddraw.height && (nWidth != g_ddraw.width || nHeight != g_ddraw.height)) { - //real_SendMessageA(g_ddraw->hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); + //real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(X, Y)); real_SendMessageA( - g_ddraw->hwnd, + g_ddraw.hwnd, WM_SIZE_DDRAW, 0, - MAKELPARAM(min(nWidth, g_ddraw->width), min(nHeight, g_ddraw->height))); + MAKELPARAM(min(nWidth, g_ddraw.width), min(nHeight, g_ddraw.height))); } return TRUE; } - else if (!IsChild(g_ddraw->hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) + else if (!IsChild(g_ddraw.hwnd, hWnd) && !(real_GetWindowLongA(hWnd, GWL_STYLE) & WS_CHILD)) { POINT pt = { 0, 0 }; - if (real_ClientToScreen(g_ddraw->hwnd, &pt)) + if (real_ClientToScreen(g_ddraw.hwnd, &pt)) { X += pt.x; Y += pt.y; @@ -419,35 +419,35 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { - if (!g_ddraw || !g_ddraw->hwnd) + if (!g_ddraw.ref || !g_ddraw.hwnd) return real_SendMessageA(hWnd, Msg, wParam, lParam); - if (g_ddraw->hwnd == hWnd && Msg == WM_MOUSEMOVE) + 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)); + 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); + 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) + if (g_ddraw.hwnd == hWnd && Msg == WM_SIZE && g_config.hook != 2) { Msg = WM_SIZE_DDRAW; } LRESULT result = real_SendMessageA(hWnd, Msg, wParam, lParam); - if (result && g_ddraw && Msg == CB_GETDROPPEDCONTROLRECT) + if (result && g_ddraw.ref && Msg == CB_GETDROPPEDCONTROLRECT) { RECT* rc = (RECT*)lParam; if (rc) - real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, (LPPOINT)rc, 2); + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)rc, 2); } return result; @@ -455,15 +455,15 @@ 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 && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_STYLE) return 0; if (nIndex == GWL_WNDPROC) { - WNDPROC old = g_ddraw->wndproc; - g_ddraw->wndproc = (WNDPROC)dwNewLong; + WNDPROC old = g_ddraw.wndproc; + g_ddraw.wndproc = (WNDPROC)dwNewLong; return (LONG)old; } @@ -474,11 +474,11 @@ LONG WINAPI fake_SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nIndex == GWL_WNDPROC) { - return (LONG)g_ddraw->wndproc; + return (LONG)g_ddraw.wndproc; } } @@ -487,7 +487,7 @@ LONG WINAPI fake_GetWindowLongA(HWND hWnd, int nIndex) BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { return FALSE; } @@ -497,30 +497,30 @@ BOOL WINAPI fake_EnableWindow(HWND hWnd, BOOL bEnable) int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT cPoints) { - if (g_ddraw && g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd) { if (hWndTo == HWND_DESKTOP) { - if (hWndFrom == g_ddraw->hwnd) + if (hWndFrom == g_ddraw.hwnd) { return 0; } else { //real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); - //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw->hwnd, lpPoints, cPoints); + //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); } } if (hWndFrom == HWND_DESKTOP) { - if (hWndTo == g_ddraw->hwnd) + if (hWndTo == g_ddraw.hwnd) { return 0; } else { - //real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, lpPoints, cPoints); + //real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); //return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } } @@ -531,7 +531,7 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { - if (g_ddraw && g_ddraw->hwnd == hWnd) + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; @@ -548,9 +548,9 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) HWND WINAPI fake_GetTopWindow(HWND hWnd) { - if (g_ddraw && g_config.windowed && g_ddraw->hwnd && !hWnd) + if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd && !hWnd) { - return g_ddraw->hwnd; + return g_ddraw.hwnd; } return real_GetTopWindow(hWnd); @@ -558,9 +558,9 @@ HWND WINAPI fake_GetTopWindow(HWND hWnd) HWND WINAPI fake_GetForegroundWindow() { - if (g_ddraw && g_config.windowed && g_ddraw->hwnd) + if (g_ddraw.ref && g_config.windowed && g_ddraw.hwnd) { - return g_ddraw->hwnd; + return g_ddraw.hwnd; } return real_GetForegroundWindow(); @@ -568,7 +568,7 @@ HWND WINAPI fake_GetForegroundWindow() BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) { - if (g_ddraw && g_ddraw->bnet_active) + if (g_ddraw.ref && g_ddraw.bnet_active) { return TRUE; } @@ -596,7 +596,7 @@ HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, D BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { - if (g_ddraw && g_ddraw->width) + if (g_ddraw.ref && g_ddraw.width) { switch (lpMsg->message) { @@ -609,22 +609,22 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa 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) + 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; + 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 = (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); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); //return FALSE; @@ -654,12 +654,12 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa if (lpMsg->message == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lpMsg->lParam), GET_Y_LPARAM(lpMsg->lParam) }; - real_ScreenToClient(g_ddraw->hwnd, &pt); + 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); + 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) { @@ -673,16 +673,16 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa } else { - x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); + 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); + 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); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lpMsg->lParam = MAKELPARAM(x, y); fake_GetCursorPos(&lpMsg->pt); @@ -718,7 +718,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w SHORT WINAPI fake_GetKeyState(int nVirtKey) { - if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) + if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) { return 0; } @@ -728,7 +728,7 @@ SHORT WINAPI fake_GetKeyState(int nVirtKey) SHORT WINAPI fake_GetAsyncKeyState(int vKey) { - if (g_config.windowed && g_ddraw && g_ddraw->hwnd && !util_in_foreground()) + if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) { return 0; } @@ -738,18 +738,18 @@ SHORT WINAPI fake_GetAsyncKeyState(int vKey) int WINAPI fake_GetDeviceCaps(HDC hdc, int index) { - if (g_ddraw && - g_ddraw->bpp && + if (g_ddraw.ref && + g_ddraw.bpp && index == BITSPIXEL && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - return g_ddraw->bpp; + return g_ddraw.bpp; } - if (g_ddraw && - g_ddraw->bpp == 8 && + if (g_ddraw.ref && + g_ddraw.bpp == 8 && index == RASTERCAPS && - (g_config.hook != 2 || g_ddraw->renderer == gdi_render_main)) + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { return RC_PALETTE | real_GetDeviceCaps(hdc, index); } @@ -774,42 +774,42 @@ BOOL WINAPI fake_StretchBlt( char class_name[MAX_PATH] = { 0 }; - if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) { GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); } - if (g_ddraw && g_ddraw->hwnd && - (hwnd == g_ddraw->hwnd || - (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + 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, "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)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { BOOL result = real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } } - else if (g_ddraw->width > 0 && g_ddraw->render.hdc) + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(wDest * g_ddraw->render.scale_w), - (int)(hDest * g_ddraw->render.scale_h), + g_ddraw.render.hdc, + xDest + g_ddraw.render.viewport.x, + yDest + g_ddraw.render.viewport.y, + (int)(wDest * g_ddraw.render.scale_w), + (int)(hDest * g_ddraw.render.scale_h), hdcSrc, xSrc, ySrc, @@ -836,12 +836,12 @@ int WINAPI fake_SetDIBitsToDevice( const BITMAPINFO* lpbmi, UINT ColorUse) { - if (g_ddraw && g_ddraw->hwnd && WindowFromDC(hdc) == g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) { - if (g_ddraw->primary && (g_ddraw->primary->bpp == 16 || g_ddraw->primary->bpp == 32 || g_ddraw->primary->palette)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { @@ -860,7 +860,7 @@ int WINAPI fake_SetDIBitsToDevice( lpbmi, ColorUse); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } @@ -889,23 +889,23 @@ int WINAPI fake_StretchDIBits( char class_name[MAX_PATH] = { 0 }; - if (g_ddraw && g_ddraw->hwnd && hwnd && hwnd != g_ddraw->hwnd) + if (g_ddraw.ref && g_ddraw.hwnd && hwnd && hwnd != g_ddraw.hwnd) { GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); } - if (g_ddraw && g_ddraw->hwnd && - (hwnd == g_ddraw->hwnd || - (g_config.fixchilds && IsChild(g_ddraw->hwnd, hwnd) && + 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, "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)) + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { HDC primary_dc; - dds_GetDC(g_ddraw->primary, &primary_dc); + dds_GetDC(g_ddraw.primary, &primary_dc); if (primary_dc) { @@ -925,20 +925,20 @@ int WINAPI fake_StretchDIBits( iUsage, rop); - dds_ReleaseDC(g_ddraw->primary, primary_dc); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; } } - else if (g_ddraw->width > 0 && g_ddraw->render.hdc) + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchDIBits( - g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(DestWidth * g_ddraw->render.scale_w), - (int)(DestHeight * g_ddraw->render.scale_h), + g_ddraw.render.hdc, + xDest + g_ddraw.render.viewport.x, + yDest + g_ddraw.render.viewport.y, + (int)(DestWidth * g_ddraw.render.scale_w), + (int)(DestHeight * g_ddraw.render.scale_h), xSrc, ySrc, SrcWidth, @@ -1227,49 +1227,49 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw && hWnd == g_ddraw->hwnd) + if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) { - g_ddraw->hwnd = NULL; - g_ddraw->wndproc = NULL; - g_ddraw->render.hdc = NULL; + g_ddraw.hwnd = NULL; + g_ddraw.wndproc = NULL; + g_ddraw.render.hdc = NULL; } - if (g_ddraw && g_ddraw->hwnd != hWnd && g_ddraw->bnet_active) + if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active) { RedrawWindow(NULL, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN); if (!FindWindowEx(HWND_DESKTOP, NULL, "SDlgDialog", NULL)) { - g_ddraw->bnet_active = FALSE; - SetFocus(g_ddraw->hwnd); + g_ddraw.bnet_active = FALSE; + SetFocus(g_ddraw.hwnd); mouse_lock(); if (g_config.windowed) { - g_ddraw->bnet_pos.x = g_ddraw->bnet_pos.y = 0; - real_ClientToScreen(g_ddraw->hwnd, &g_ddraw->bnet_pos); + g_ddraw.bnet_pos.x = g_ddraw.bnet_pos.y = 0; + real_ClientToScreen(g_ddraw.hwnd, &g_ddraw.bnet_pos); - if (!g_ddraw->bnet_was_upscaled) + if (!g_ddraw.bnet_was_upscaled) { - int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; - int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; + int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; + int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; - UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; - int dst_width = width == g_ddraw->width ? 0 : width; - int dst_height = height == g_ddraw->height ? 0 : height; + int dst_width = width == g_ddraw.width ? 0 : width; + int dst_height = height == g_ddraw.height ? 0 : height; util_set_window_rect( - g_ddraw->bnet_win_rect.left, - g_ddraw->bnet_win_rect.top, + g_ddraw.bnet_win_rect.left, + g_ddraw.bnet_win_rect.top, dst_width, dst_height, flags); } - g_config.fullscreen = g_ddraw->bnet_was_upscaled; + g_config.fullscreen = g_ddraw.bnet_was_upscaled; - SetTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); + SetTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET, 1000, (TIMERPROC)NULL); g_config.resizable = TRUE; } @@ -1286,14 +1286,14 @@ HWND WINAPI fake_CreateWindowExA( /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw && g_ddraw->hwnd && g_ddraw->width && + g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + 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 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; @@ -1302,52 +1302,52 @@ HWND WINAPI fake_CreateWindowExA( } /* Fix for SMACKW32.DLL creating another window that steals the focus */ - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw && g_ddraw->hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "MouseTypeWind") == 0 && g_ddraw.ref && g_ddraw.hwnd) { dwStyle &= ~WS_VISIBLE; } - if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw && g_ddraw->hwnd) + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "SDlgDialog") == 0 && g_ddraw.ref && g_ddraw.hwnd) { - if (!g_ddraw->bnet_active) + if (!g_ddraw.bnet_active) { - g_ddraw->bnet_was_upscaled = g_config.fullscreen; + g_ddraw.bnet_was_upscaled = g_config.fullscreen; g_config.fullscreen = FALSE; - if (!g_config.windowed && !g_ddraw->bnet_was_fullscreen) + if (!g_config.windowed && !g_ddraw.bnet_was_fullscreen) { int ws = g_config.window_state; util_toggle_fullscreen(); g_config.window_state = ws; - g_ddraw->bnet_was_fullscreen = TRUE; + g_ddraw.bnet_was_fullscreen = TRUE; } - real_GetClientRect(g_ddraw->hwnd, &g_ddraw->bnet_win_rect); - real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw->bnet_win_rect, 2); + real_GetClientRect(g_ddraw.hwnd, &g_ddraw.bnet_win_rect); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, (LPPOINT)&g_ddraw.bnet_win_rect, 2); - int width = g_ddraw->bnet_win_rect.right - g_ddraw->bnet_win_rect.left; - int height = g_ddraw->bnet_win_rect.bottom - g_ddraw->bnet_win_rect.top; + int width = g_ddraw.bnet_win_rect.right - g_ddraw.bnet_win_rect.left; + int height = g_ddraw.bnet_win_rect.bottom - g_ddraw.bnet_win_rect.top; - int x = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.x : -32000; - int y = g_ddraw->bnet_pos.x || g_ddraw->bnet_pos.y ? g_ddraw->bnet_pos.y : -32000; + int x = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.x : -32000; + int y = g_ddraw.bnet_pos.x || g_ddraw.bnet_pos.y ? g_ddraw.bnet_pos.y : -32000; - UINT flags = width != g_ddraw->width || height != g_ddraw->height ? 0 : SWP_NOMOVE; + UINT flags = width != g_ddraw.width || height != g_ddraw.height ? 0 : SWP_NOMOVE; - int dst_width = g_config.window_rect.right ? g_ddraw->width : 0; - int dst_height = g_config.window_rect.bottom ? g_ddraw->height : 0; + int dst_width = g_config.window_rect.right ? g_ddraw.width : 0; + int dst_height = g_config.window_rect.bottom ? g_ddraw.height : 0; util_set_window_rect(x, y, dst_width, dst_height, flags); g_config.resizable = FALSE; - g_ddraw->bnet_active = TRUE; + g_ddraw.bnet_active = TRUE; mouse_unlock(); } POINT pt = { 0, 0 }; - real_ClientToScreen(g_ddraw->hwnd, &pt); + real_ClientToScreen(g_ddraw.hwnd, &pt); - int added_height = g_ddraw->height - 480; - int added_width = g_ddraw->width - 640; + int added_height = g_ddraw.height - 480; + int added_width = g_ddraw.width - 640; int align_y = added_height > 0 ? added_height / 2 : 0; int align_x = added_width > 0 ? added_width / 2 : 0; diff --git a/src/wndproc.c b/src/wndproc.c index 31cbc02..35b8cf2 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -54,15 +54,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { MINMAXINFO* mmi = (MINMAXINFO*)lParam; - if (g_config.windowed && g_ddraw->width) + if (g_config.windowed && g_ddraw.width) { - RECT rc = { 0, 0, g_ddraw->render.width, g_ddraw->render.height }; + RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; AdjustWindowRectEx( &rc, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), - GetMenu(g_ddraw->hwnd) != NULL, - real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), + GetMenu(g_ddraw.hwnd) != NULL, + real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); if (mmi->ptMaxTrackSize.x < rc.right - rc.left) mmi->ptMaxTrackSize.x = rc.right - rc.left; @@ -71,13 +71,13 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mmi->ptMaxTrackSize.y = rc.bottom - rc.top; /* - RECT rcmin = { 0, 0, g_ddraw->width, g_ddraw->height }; + RECT rcmin = { 0, 0, g_ddraw.width, g_ddraw.height }; AdjustWindowRectEx( &rcmin, - real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE), - GetMenu(g_ddraw->hwnd) != NULL, - real_GetWindowLongA(g_ddraw->hwnd, GWL_EXSTYLE)); + real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), + GetMenu(g_ddraw.hwnd) != NULL, + real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); mmi->ptMinTrackSize.x = rcmin.right - rcmin.left; mmi->ptMinTrackSize.y = rcmin.bottom - rcmin.top; @@ -122,7 +122,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_SETCURSOR: { /* show resize cursor on window borders */ - if ((HWND)wParam == g_ddraw->hwnd) + if ((HWND)wParam == g_ddraw.hwnd) { WORD message = HIWORD(lParam); @@ -176,8 +176,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_D3D9DEVICELOST: { - if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw->hwnd)) && - g_ddraw->renderer == d3d9_render_main && + if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && + g_ddraw.renderer == d3d9_render_main && d3d9_on_device_lost()) { if (!g_config.windowed) @@ -191,24 +191,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { case IDT_TIMER_LEAVE_BNET: { - KillTimer(g_ddraw->hwnd, IDT_TIMER_LEAVE_BNET); + KillTimer(g_ddraw.hwnd, IDT_TIMER_LEAVE_BNET); if (!g_config.windowed) - g_ddraw->bnet_was_fullscreen = FALSE; + g_ddraw.bnet_was_fullscreen = FALSE; - if (!g_ddraw->bnet_active) + if (!g_ddraw.bnet_active) { - if (g_ddraw->bnet_was_fullscreen) + if (g_ddraw.bnet_was_fullscreen) { int ws = g_config.window_state; util_toggle_fullscreen(); g_config.window_state = ws; - g_ddraw->bnet_was_fullscreen = FALSE; + g_ddraw.bnet_was_fullscreen = FALSE; } - else if (g_ddraw->bnet_was_upscaled) + else if (g_ddraw.bnet_was_upscaled) { util_set_window_rect(0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - g_ddraw->bnet_was_upscaled = FALSE; + g_ddraw.bnet_was_upscaled = FALSE; } } @@ -231,9 +231,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.is_wine && !g_config.windowed && (pos->x > 0 || pos->y > 0) && - g_ddraw->last_set_window_pos_tick + 500 < timeGetTime()) + g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) { - PostMessage(g_ddraw->hwnd, WM_WINEFULLSCREEN, 0, 0); + PostMessage(g_ddraw.hwnd, WM_WINEFULLSCREEN, 0, 0); } break; @@ -242,24 +242,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.windowed) { - g_ddraw->last_set_window_pos_tick = timeGetTime(); + g_ddraw.last_set_window_pos_tick = timeGetTime(); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 1, 1, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, SWP_SHOWWINDOW); real_SetWindowPos( - g_ddraw->hwnd, + g_ddraw.hwnd, HWND_TOPMOST, 0, 0, - g_ddraw->render.width, - g_ddraw->render.height, + g_ddraw.render.width, + g_ddraw.render.height, SWP_SHOWWINDOW); } return 0; @@ -278,8 +278,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { in_size_move = FALSE; - if (!g_ddraw->render.thread) - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp, 0); + if (!g_ddraw.render.thread) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } break; } @@ -291,15 +291,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (in_size_move) { - if (g_ddraw->render.thread) + if (g_ddraw.render.thread) { - EnterCriticalSection(&g_ddraw->cs); - g_ddraw->render.run = FALSE; - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw->cs); + 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; + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } RECT clientrc = { 0 }; @@ -314,8 +314,8 @@ 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 scaleH = (double)g_ddraw.height / g_ddraw.width; + double scaleW = (double)g_ddraw.width / g_ddraw.height; switch (wParam) { @@ -351,7 +351,7 @@ 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)) { - if (clientrc.right < g_ddraw->width) + if (clientrc.right < g_ddraw.width) { switch (wParam) { @@ -361,20 +361,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_BOTTOM: case WMSZ_TOP: { - windowrc->right += g_ddraw->width - clientrc.right; + windowrc->right += g_ddraw.width - clientrc.right; break; } case WMSZ_TOPLEFT: case WMSZ_BOTTOMLEFT: case WMSZ_LEFT: { - windowrc->left -= g_ddraw->width - clientrc.right; + windowrc->left -= g_ddraw.width - clientrc.right; break; } } } - if (clientrc.bottom < g_ddraw->height) + if (clientrc.bottom < g_ddraw.height) { switch (wParam) { @@ -384,14 +384,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WMSZ_RIGHT: case WMSZ_LEFT: { - windowrc->bottom += g_ddraw->height - clientrc.bottom; + windowrc->bottom += g_ddraw.height - clientrc.bottom; break; } case WMSZ_TOPLEFT: case WMSZ_TOPRIGHT: case WMSZ_TOP: { - windowrc->top -= g_ddraw->height - clientrc.bottom; + windowrc->top -= g_ddraw.height - clientrc.bottom; break; } } @@ -423,24 +423,24 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == SIZE_RESTORED) { - if (in_size_move && !g_ddraw->render.thread) + if (in_size_move && !g_ddraw.render.thread) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } /* - else if (g_ddraw->wine) + else if (g_ddraw.wine) { WindowRect.right = LOWORD(lParam); WindowRect.bottom = HIWORD(lParam); - if (WindowRect.right != g_ddraw->render.width || WindowRect.bottom != g_ddraw->render.height) - dd_SetDisplayMode(g_ddraw->width, g_ddraw->height, g_ddraw->bpp); + if (WindowRect.right != g_ddraw.render.width || WindowRect.bottom != g_ddraw.render.height) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp); } */ } } - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) { redraw_count = 2; RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); @@ -460,7 +460,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw->render.thread)) + if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -470,7 +470,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ @@ -479,11 +479,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.is_wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); if (!(style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); + real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); } } break; @@ -492,11 +492,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ { - LONG style = real_GetWindowLongA(g_ddraw->hwnd, GWL_STYLE); + LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); if ((style & WS_MAXIMIZEBOX)) { - real_SetWindowLongA(g_ddraw->hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); + real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); } } @@ -515,7 +515,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam _exit(0); } - if (wParam == SC_KEYMENU && GetMenu(g_ddraw->hwnd) == NULL) + if (wParam == SC_KEYMENU && GetMenu(g_ddraw.hwnd) == NULL) return 0; if (!GameHandlesClose) @@ -541,7 +541,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { mouse_unlock(); - if (real_GetForegroundWindow() == g_ddraw->hwnd) + if (real_GetForegroundWindow() == g_ddraw.hwnd) mouse_lock(); } } @@ -556,7 +556,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == WA_ACTIVE || wParam == WA_CLICKACTIVE) { - if (g_ddraw->got_child_windows) + if (g_ddraw.got_child_windows) RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } @@ -597,7 +597,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - //if (g_ddraw->windowed || g_ddraw->noactivateapp) + //if (g_ddraw.windowed || g_ddraw.noactivateapp) if (!g_config.allow_wmactivate) return 0; @@ -610,19 +610,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - ChangeDisplaySettings(&g_ddraw->render.mode, CDS_FULLSCREEN); - real_ShowWindow(g_ddraw->hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); mouse_lock(); } } - else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw->hwnd) + else if (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd) { mouse_lock(); } - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } else { @@ -631,15 +631,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_config.is_wine && g_ddraw->last_set_window_pos_tick + 500 > timeGetTime()) + if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) { - if (g_ddraw->renderer != d3d9_render_main || g_config.nonexclusive) + if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - real_ShowWindow(g_ddraw->hwnd, SW_MINIMIZE); - ChangeDisplaySettings(NULL, g_ddraw->bnet_active ? CDS_FULLSCREEN : 0); + real_ShowWindow(g_ddraw.hwnd, SW_MINIMIZE); + ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } } } @@ -674,8 +674,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam break; } - if (wParam && g_ddraw->alt_key_down && !g_config.releasealt) - PostMessageA(g_ddraw->hwnd, WM_SYSKEYUP, VK_MENU, 0); + if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) + PostMessageA(g_ddraw.hwnd, WM_SYSKEYUP, VK_MENU, 0); return 0; } @@ -684,8 +684,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_AUTORENDERER: { mouse_unlock(); - real_SetWindowPos(g_ddraw->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - real_SetWindowPos(g_ddraw->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); + real_SetWindowPos(g_ddraw.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); mouse_lock(); return 0; } @@ -751,7 +751,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (wParam == VK_MENU) { - g_ddraw->alt_key_down = TRUE; + g_ddraw.alt_key_down = TRUE; } break; @@ -760,7 +760,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (wParam == VK_MENU) { - g_ddraw->alt_key_down = FALSE; + g_ddraw.alt_key_down = FALSE; } if (wParam == VK_TAB || (g_config.hotkeys.toggle_fullscreen && wParam == g_config.hotkeys.toggle_fullscreen)) @@ -792,7 +792,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } } - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -804,9 +804,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam case WM_KEYUP: { if (g_config.hotkeys.screenshot && wParam == g_config.hotkeys.screenshot) - ss_take_screenshot(g_ddraw->primary); + ss_take_screenshot(g_ddraw.primary); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -825,22 +825,22 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 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) + 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; + 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 = (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); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); return 0; @@ -869,12 +869,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (uMsg == WM_MOUSEWHEEL) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - real_ScreenToClient(g_ddraw->hwnd, &pt); + 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); + 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) { @@ -888,20 +888,20 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } else { - x = (DWORD)(roundf(x * g_ddraw->mouse.unscale_x)); - y = (DWORD)(roundf(y * g_ddraw->mouse.unscale_y)); + 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); + 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); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lParam = MAKELPARAM(x, y); - HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw->video_window_hwnd, 0); + HWND video_hwnd = (HWND)InterlockedExchangeAdd((LONG*)&g_ddraw.video_window_hwnd, 0); if (video_hwnd) { PostMessageA(video_hwnd, uMsg, wParam, lParam); @@ -924,11 +924,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.devmode && !g_mouse_locked) { - int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x) * g_ddraw->mouse.unscale_x); - int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y) * g_ddraw->mouse.unscale_y); + int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); + int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); - InterlockedExchange((LONG*)&g_ddraw->cursor.x, x); - InterlockedExchange((LONG*)&g_ddraw->cursor.y, y); + InterlockedExchange((LONG*)&g_ddraw.cursor.x, x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); mouse_lock(); } @@ -945,19 +945,19 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); break; } case WM_ERASEBKGND: { - if (g_ddraw->render.viewport.x != 0 || g_ddraw->render.viewport.y != 0) + if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) { - InterlockedExchange(&g_ddraw->render.clear_screen, TRUE); - ReleaseSemaphore(g_ddraw->render.sem, 1, NULL); + InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } break; } } - return CallWindowProcA(g_ddraw->wndproc, hWnd, uMsg, wParam, lParam); + return CallWindowProcA(g_ddraw.wndproc, hWnd, uMsg, wParam, lParam); } From 18c3b3927c8768dd8730fa0ce80caeb07a3d3e04 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 22 Mar 2024 22:57:28 +0100 Subject: [PATCH 0155/1053] rename build.bat --- build.bat => build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename build.bat => build.cmd (66%) diff --git a/build.bat b/build.cmd similarity index 66% rename from build.bat rename to build.cmd index b3508d8..539995e 100644 --- a/build.bat +++ b/build.cmd @@ -1,6 +1,6 @@ @echo off REM -REM cnc-patch environment config +REM patch environment config REM set PATH=C:\w64devkit\bin make clean From ed7296220b9bd75a13b4b90c45445d16fc0d2979 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Mar 2024 01:41:02 +0100 Subject: [PATCH 0156/1053] Disable ALT+ENTER on Infantry Online Zone List Window for now --- src/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 34ff9a2..f62a037 100644 --- a/src/utils.c +++ b/src/utils.c @@ -423,7 +423,8 @@ void util_toggle_maximize() void util_toggle_fullscreen() { - if (g_ddraw.bnet_active) + /* Disable ALT+ENTER on battle.net and Infantry Online Zone List Window */ + if (g_ddraw->bnet_active || (g_config.infantryhack && GetMenu(g_ddraw->hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From 75f5c24305fec233b49f0da87fc1a8db29d48563 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 25 Mar 2024 02:50:55 +0100 Subject: [PATCH 0157/1053] fix for last commit --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f62a037..8793092 100644 --- a/src/utils.c +++ b/src/utils.c @@ -424,7 +424,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_config.infantryhack && GetMenu(g_ddraw.hwnd))) return; if (g_config.toggle_borderless && g_config.windowed) From b89b184ce08605c8a031cdf67634b27303df5b35 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 17:48:31 +0100 Subject: [PATCH 0158/1053] don't force devmode on for infantry (keep it for zone list only) --- src/config.c | 1 - src/dd.c | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index d405775..cd0ddd1 100644 --- a/src/config.c +++ b/src/config.c @@ -777,7 +777,6 @@ static void cfg_create_ini() "\n" "; Infantry Online\n" "[infantry]\n" - "devmode=true\n" "resolutions=2\n" "infantryhack=true\n" "max_resolutions=90\n" diff --git a/src/dd.c b/src/dd.c index c6cddf1..427e082 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1192,22 +1192,25 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) /* Infantry Online Zone List Window */ if (g_config.infantryhack) { - static BOOL windowed, fullscreen; + static BOOL windowed, fullscreen, devmode; if (dwFlags & DDSCL_FULLSCREEN) { g_config.windowed = windowed; g_config.fullscreen = fullscreen; + g_config.devmode = devmode; } else if (dwFlags & DDSCL_NOWINDOWCHANGES) { windowed = g_config.windowed; fullscreen = g_config.fullscreen; + devmode = g_config.devmode; if (GetMenu(g_ddraw.hwnd) != NULL) { g_config.windowed = TRUE; g_config.fullscreen = FALSE; + g_config.devmode = TRUE; } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); From 078099e3c60ad156522b171c122d3a7a2d8051ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 17:52:08 +0100 Subject: [PATCH 0159/1053] fix current GHA for testing --- .github/workflows/build.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 811df5d..cf4fd0e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,9 +6,6 @@ on: - 'master' - 'develop' - 'github-action' - paths: - - '.github/workflows/build.yml' - - 'action.yml' jobs: Build: From e89353256231a401a230906ba562b3c5d94c6248 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Mar 2024 23:11:18 +0100 Subject: [PATCH 0160/1053] fix build on linux --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 276a81f..c1875b4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -10,7 +10,7 @@ #include "wndproc.h" #include "blt.h" #include "debug.h" -#include "D3d9types.h" +#include "d3d9types.h" #include "hook.h" #include "config.h" From 86c86999d0d201a3e115e400c80895c31c48623c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 21:36:25 +0100 Subject: [PATCH 0161/1053] remove Win2000 build since it doesn't actualyl work on windows 2000 --- cnc-ddraw.sln | 3 --- cnc-ddraw.vcxproj | 63 +++-------------------------------------------- src/win2000.asm | 15 ----------- 3 files changed, 3 insertions(+), 78 deletions(-) delete mode 100644 src/win2000.asm diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index ab7f479..1b867f0 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -11,7 +11,6 @@ Global DebugLog|x86 = DebugLog|x86 DebugLogMini|x86 = DebugLogMini|x86 Release|x86 = Release|x86 - ReleaseWin2000|x86 = ReleaseWin2000|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 @@ -22,8 +21,6 @@ Global {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.ActiveCfg = ReleaseWin2000|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseWin2000|x86.Build.0 = ReleaseWin2000|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 924f32f..8a22c6a 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -13,10 +13,6 @@ Debug Win32 - - ReleaseWin2000 - Win32 - Release Win32 @@ -113,9 +109,7 @@ - - - + cnc_ddraw 7.0 @@ -135,13 +129,6 @@ true MultiByte - - DynamicLibrary - false - v141_xp - true - MultiByte - DynamicLibrary false @@ -157,9 +144,7 @@ MultiByte - - - + @@ -168,9 +153,6 @@ - - - @@ -190,12 +172,6 @@ false ddraw - - $(SolutionDir)bin\ReleaseWin2000\ - $(SolutionDir)bin\ReleaseWin2000\ - false - ddraw - $(SolutionDir)bin\DebugLog\ $(SolutionDir)bin\DebugLog\ @@ -258,37 +234,6 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" - - - Level2 - - - MaxSpeed - true - true - _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - inc;src\detours - NoExtensions - - - 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) - ddraw.def - - - -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( - copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" -) - - - - /safeseh %(AdditionalOptions) - - Level2 @@ -344,7 +289,5 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - - - + \ No newline at end of file diff --git a/src/win2000.asm b/src/win2000.asm deleted file mode 100644 index 5995502..0000000 --- a/src/win2000.asm +++ /dev/null @@ -1,15 +0,0 @@ -.model flat - -.data -__imp__EncodePointer@4 dd dummy -__imp__DecodePointer@4 dd dummy -EXTERNDEF __imp__EncodePointer@4 : DWORD -EXTERNDEF __imp__DecodePointer@4 : DWORD - -.code -dummy proc -mov eax, [esp+4] -ret 4 -dummy endp - -end From a5ddb67940c468c03a179f9a7d18f8bb64eba544 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:06:51 +0100 Subject: [PATCH 0162/1053] update project configs --- .github/workflows/build.yml | 52 ++++++++++----------- action.yml | 90 ++++++++++++++++++------------------- cnc-ddraw.sln | 15 ++++--- cnc-ddraw.vcxproj | 55 +++++++++++++++++++++-- 4 files changed, 131 insertions(+), 81 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cf4fd0e..aef68fe 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,11 +42,11 @@ jobs: with: release: true - - name: ReleaseWin2000 build - id: build-releasewin2000 + - name: ReleaseXP build + id: build-releasexp uses: ./ with: - releasewin2000: true + releasexp: true - name: Debug build id: build-debug @@ -54,40 +54,40 @@ jobs: with: debug: true - - name: DebugLog build - id: build-debuglog + - name: DebugLogXP build + id: build-debuglogxp uses: ./ with: - debuglog: true + debuglogxp: true - - name: DebugLogMini build - id: build-debuglogmini + - name: DebugLogMiniXP build + id: build-debuglogminixp uses: ./ with: - debuglogmini: true + debuglogminixp: true - name: Prepare artifact run: | : mkdir -p cnc-ddraw-release - mkdir -p cnc-ddraw-releasewin2000 + mkdir -p cnc-ddraw-releasexp mkdir -p cnc-ddraw-debug - mkdir -p cnc-ddraw-debuglog - mkdir -p cnc-ddraw-debuglogmini + mkdir -p cnc-ddraw-debuglogxp + mkdir -p cnc-ddraw-debuglogminixp cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release - cp "${{ steps.build-releasewin2000.outputs.releasewin2000 }}" cnc-ddraw-releasewin2000 + cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug - cp "${{ steps.build-debuglog.outputs.debuglog }}" cnc-ddraw-debuglog - cp "${{ steps.build-debuglog.outputs.debuglog-pdb }}" cnc-ddraw-debuglog + cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogmini.outputs.debuglogmini }}" cnc-ddraw-debuglogmini - cp "${{ steps.build-debuglogmini.outputs.debuglogmini-pdb }}" cnc-ddraw-debuglogmini + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp shell: bash @@ -98,11 +98,11 @@ jobs: path: cnc-ddraw-release retention-days: 14 - - name: Upload artifacts cnc-ddraw-releasewin2000 + - name: Upload artifacts cnc-ddraw-releasexp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-releasewin2000 - path: cnc-ddraw-releasewin2000 + name: cnc-ddraw-releasexp + path: cnc-ddraw-releasexp retention-days: 14 - name: Upload artifacts cnc-ddraw-debug @@ -112,16 +112,16 @@ jobs: path: cnc-ddraw-debug retention-days: 14 - - name: Upload artifacts cnc-ddraw-debuglog + - name: Upload artifacts cnc-ddraw-debuglogxp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-debuglog - path: cnc-ddraw-debuglog + name: cnc-ddraw-debuglogxp + path: cnc-ddraw-debuglogxp retention-days: 14 - - name: Upload artifacts cnc-ddraw-debuglogmini + - name: Upload artifacts cnc-ddraw-debuglogminixp uses: actions/upload-artifact@v4 with: - name: cnc-ddraw-debuglogmini - path: cnc-ddraw-debuglogmini + name: cnc-ddraw-debuglogminixp + path: cnc-ddraw-debuglogminixp retention-days: 14 diff --git a/action.yml b/action.yml index 0b1e1cc..8917b6d 100644 --- a/action.yml +++ b/action.yml @@ -24,20 +24,20 @@ inputs: description: 'Set to true to enable building with Release configuration' required: true - releasewin2000: - description: 'Set to true to enable building with ReleaseWin2000 configuration' + releasexp: + description: 'Set to true to enable building with ReleaseXP configuration' required: true debug: description: 'Set to true to enable building with Debug configuration' required: true - debuglog: - description: 'Set to true to enable building with DebugLog configuration' + debuglogxp: + description: 'Set to true to enable building with DebugLogXP configuration' required: true - debuglogmini: - description: 'Set to true to enable building with DebugLogMini configuration' + debuglogminixp: + description: 'Set to true to enable building with DebugLogMiniXP configuration' required: true # Outputs are always using Windows directory separator (`\`) @@ -47,9 +47,9 @@ outputs: description: 'Full path to ddraw.dll built with Release configuration' value: ${{ steps.build-release.outputs.ddraw-dll }} - releasewin2000: - description: 'Full path to ddraw.dll built with ReleaseWin2000 configuration' - value: ${{ steps.build-releasewin2000.outputs.ddraw-dll }} + releasexp: + description: 'Full path to ddraw.dll built with ReleaseXP configuration' + value: ${{ steps.build-releasexp.outputs.ddraw-dll }} debug: description: 'Full path to ddraw.dll built with Debug configuration' @@ -58,19 +58,19 @@ outputs: description: 'Full path to ddraw.pdb built with Debug configuration' value: ${{ steps.build-debug.outputs.ddraw-pdb }} - debuglog: - description: 'Full path to ddraw.dll built with DebugLog configuration' - value: ${{ steps.build-debuglog.outputs.ddraw-dll }} - debuglog-pdb: - description: 'Full path to ddraw.pdb built with DebugLog configuration' - value: ${{ steps.build-debuglog.outputs.ddraw-pdb }} + debuglogxp: + description: 'Full path to ddraw.dll built with DebugLogXP configuration' + value: ${{ steps.build-debuglogxp.outputs.ddraw-dll }} + debuglogxp-pdb: + description: 'Full path to ddraw.pdb built with DebugLogXP configuration' + value: ${{ steps.build-debuglogxp.outputs.ddraw-pdb }} - debuglogmini: - description: 'Full path to ddraw.dll built with DebugLogMini configuration' - value: ${{ steps.build-debuglogmini.outputs.ddraw-dll }} - debuglogmini-pdb: - description: 'Full path to ddraw.pdb built with DebugLogMini configuration' - value: ${{ steps.build-debuglogmini.outputs.ddraw-pdb }} + debuglogminixp: + description: 'Full path to ddraw.dll built with DebugLogMiniXP configuration' + value: ${{ steps.build-debuglogminixp.outputs.ddraw-dll }} + debuglogminixp-pdb: + description: 'Full path to ddraw.pdb built with DebugLogMiniXP configuration' + value: ${{ steps.build-debuglogminixp.outputs.ddraw-pdb }} runs: using: 'composite' @@ -82,8 +82,8 @@ runs: if [[ "${{ runner.os }}" != "Windows" ]]; then echo "[ERROR] This action can only be used on Windows" exit 1 - elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasewin2000 }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglog }}" != "true" ]] && [[ "${{ inputs.debuglogmini }}" != "true" ]]; then - echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasewin2000', 'debug', 'debuglog', 'debuglogmini'" + elif [[ "${{ inputs.release }}" != "true" ]] && [[ "${{ inputs.releasexp }}" != "true" ]] && [[ "${{ inputs.debug }}" != "true" ]] && [[ "${{ inputs.debuglogxp }}" != "true" ]] && [[ "${{ inputs.debuglogminixp }}" != "true" ]]; then + echo "[ERROR] At least one of following inputs must be set to 'true' -- 'release', 'releasexp', 'debug', 'debuglogxp', 'debuglogminixp'" exit 1 # elif [[ ! -f "$(cygpath --unix "$GITHUB_ACTION_PATH/cnc-ddraw.sln")" ]]; then @@ -115,7 +115,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v143 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Release/ddraw.dll")" >> $GITHUB_OUTPUT @@ -124,17 +124,17 @@ runs: shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build ReleaseWin2000 - id: build-releasewin2000 + - name: Build ReleaseXP + id: build-releasexp run: | - if [[ "${{ inputs.releasewin2000 }}" == "true" ]]; then - echo ::group::Build ReleaseWin2000 + if [[ "${{ inputs.releasexp }}" == "true" ]]; then + echo ::group::Build ReleaseXP # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=ReleaseWin2000 -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ 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/ReleaseWin2000/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/ReleaseXP/ddraw.dll")" >> $GITHUB_OUTPUT echo "::endgroup::" fi @@ -150,7 +150,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v143 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT @@ -160,38 +160,38 @@ runs: shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLog - id: build-debuglog + - name: Build DebugLogXP + id: build-debuglogxp run: | : - if [[ "${{ inputs.debuglog }}" == "true" ]]; then - echo "::group::Build DebugLog" + if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then + echo "::group::Build DebugLogXP" # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLog -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogXP -p:Platform=x86 -p:PlatformToolset=v141_xp # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLog/ddraw.pdb")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi shell: bash # Creating empty `PostBuild.cmd` to avoid false-positive build error - - name: Build DebugLogMini - id: build-debuglogmini + - name: Build DebugLogMiniXP + id: build-debuglogminixp run: | : - if [[ "${{ inputs.debuglogmini }}" == "true" ]]; then - echo "::group::Build DebugLogMini" + if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then + echo "::group::Build DebugLogMiniXP" # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMini -p:Platform=x86 -p:PlatformToolset=v141_xp + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=DebugLogMiniXP -p:Platform=x86 -p:PlatformToolset=v141_xp # - echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.dll")" >> $GITHUB_OUTPUT - echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMini/ddraw.pdb")" >> $GITHUB_OUTPUT + echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.dll")" >> $GITHUB_OUTPUT + echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/DebugLogMiniXP/ddraw.pdb")" >> $GITHUB_OUTPUT echo "::endgroup::" fi diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index 1b867f0..c579c3b 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -8,19 +8,22 @@ EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x86 = Debug|x86 - DebugLog|x86 = DebugLog|x86 - DebugLogMini|x86 = DebugLogMini|x86 + DebugLogMiniXP|x86 = DebugLogMiniXP|x86 + DebugLogXP|x86 = DebugLogXP|x86 Release|x86 = Release|x86 + ReleaseXP|x86 = ReleaseXP|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.ActiveCfg = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLog|x86.Build.0 = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.ActiveCfg = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMini|x86.Build.0 = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMini|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLog|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.Build.0 = ReleaseXP|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 8a22c6a..62cd509 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -13,6 +13,10 @@ Debug Win32 + + ReleaseXP + Win32 + Release Win32 @@ -112,17 +116,24 @@ cnc_ddraw - 7.0 + 10.0 {96094551-5D52-4EBD-BE4C-5291A03507FC} DynamicLibrary true - v141_xp + v143 MultiByte + DynamicLibrary + false + v143 + true + MultiByte + + DynamicLibrary false v141_xp @@ -153,6 +164,9 @@ + + + @@ -172,6 +186,12 @@ false ddraw + + $(SolutionDir)bin\ReleaseXP\ + $(SolutionDir)bin\ReleaseXP\ + false + ddraw + $(SolutionDir)bin\DebugLog\ $(SolutionDir)bin\DebugLog\ @@ -201,7 +221,7 @@ -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) @@ -228,7 +248,34 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" -if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( + copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" +) + + + + + + Level2 + + + MaxSpeed + true + true + _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + MultiThreaded + inc;src\detours + + + 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) + ddraw.def + + + +if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" ( copy "$(TargetPath)" "$(LocalDebuggerWorkingDirectory)$(TargetFileName)" ) From 979b35bcb7fae2af14f0d184d0902b7427aea93a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:16:23 +0100 Subject: [PATCH 0163/1053] use older toolset for GHA --- action.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/action.yml b/action.yml index 8917b6d..6ba68af 100644 --- a/action.yml +++ b/action.yml @@ -115,7 +115,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Release -p:Platform=x86 -p:PlatformToolset=v143 + "${{ 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 @@ -150,7 +150,7 @@ runs: # # echo "@echo off" > "$GITHUB_ACTION_PATH/sfall/PostBuild.cmd" - "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v143 + "${{ steps.msbuild.outputs.exe }}" "$GITHUB_ACTION_PATH/cnc-ddraw.sln" -p:Configuration=Debug -p:Platform=x86 -p:PlatformToolset=v142 # echo "ddraw-dll=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.dll")" >> $GITHUB_OUTPUT echo "ddraw-pdb=$(cygpath --windows "$GITHUB_ACTION_PATH/bin/Debug/ddraw.pdb")" >> $GITHUB_OUTPUT From 94d5072988f94210066ced3efeae4853301de193 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:20:25 +0100 Subject: [PATCH 0164/1053] fix dirs --- cnc-ddraw.vcxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 62cd509..d942c22 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -193,14 +193,14 @@ ddraw - $(SolutionDir)bin\DebugLog\ - $(SolutionDir)bin\DebugLog\ + $(SolutionDir)bin\DebugLogXP\ + $(SolutionDir)bin\DebugLogXP\ false ddraw - $(SolutionDir)bin\DebugLogMini\ - $(SolutionDir)bin\DebugLogMini\ + $(SolutionDir)bin\DebugLogMiniXP\ + $(SolutionDir)bin\DebugLogMiniXP\ false ddraw From 12838e5426932f4d183d661adbc47a3e8cd0b537 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:22:56 +0100 Subject: [PATCH 0165/1053] update debug build config --- cnc-ddraw.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index d942c22..f74a7b3 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -210,7 +210,7 @@ Level2 Disabled - _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_DEBUG_X;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) MultiThreadedDebug inc;src\detours From 1ef99b12955a93a86820187bc99dd5f747671ac0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:31:35 +0100 Subject: [PATCH 0166/1053] only build DebugLogXP and ReleaseXP --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 6ba68af..2a9cde0 100644 --- a/action.yml +++ b/action.yml @@ -22,7 +22,7 @@ inputs: release: description: 'Set to true to enable building with Release configuration' - required: true + required: false releasexp: description: 'Set to true to enable building with ReleaseXP configuration' @@ -30,7 +30,7 @@ inputs: debug: description: 'Set to true to enable building with Debug configuration' - required: true + required: false debuglogxp: description: 'Set to true to enable building with DebugLogXP configuration' @@ -38,7 +38,7 @@ inputs: debuglogminixp: description: 'Set to true to enable building with DebugLogMiniXP configuration' - required: true + required: false # Outputs are always using Windows directory separator (`\`) outputs: From 6c5bac90580a3a76da89dfa364eea525c8fa77d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 29 Mar 2024 22:36:44 +0100 Subject: [PATCH 0167/1053] Revert "only build DebugLogXP and ReleaseXP" This reverts commit 1ef99b12955a93a86820187bc99dd5f747671ac0. --- action.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/action.yml b/action.yml index 2a9cde0..6ba68af 100644 --- a/action.yml +++ b/action.yml @@ -22,7 +22,7 @@ inputs: release: description: 'Set to true to enable building with Release configuration' - required: false + required: true releasexp: description: 'Set to true to enable building with ReleaseXP configuration' @@ -30,7 +30,7 @@ inputs: debug: description: 'Set to true to enable building with Debug configuration' - required: false + required: true debuglogxp: description: 'Set to true to enable building with DebugLogXP configuration' @@ -38,7 +38,7 @@ inputs: debuglogminixp: description: 'Set to true to enable building with DebugLogMiniXP configuration' - required: false + required: true # Outputs are always using Windows directory separator (`\`) outputs: From 4dc8eb5f56131926f79ad3bc55ba87cb3f093e76 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 31 Mar 2024 00:25:31 +0100 Subject: [PATCH 0168/1053] fix build on macos --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 36ab707..073ff53 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,7 @@ CC = i686-w64-mingw32-gcc CXX = i686-w64-mingw32-g++ +STRIP ?= i686-w64-mingw32-strip WINDRES ?= i686-w64-mingw32-windres LDFLAGS = -Wl,--enable-stdcall-fixup -s -static CFLAGS = -Iinc -O2 -march=i486 -Wall From 3089c8872dfbdd501c5b71e6ebb3e34b469721e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Apr 2024 04:10:33 +0200 Subject: [PATCH 0169/1053] fix some warnings --- src/opengl_utils.c | 4 ++-- src/render_ogl.c | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/opengl_utils.c b/src/opengl_utils.c index 2f14a5e..e9497f3 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -196,8 +196,8 @@ void oglu_init() if (glversion) { strncpy(g_oglu_version, glversion, sizeof(g_oglu_version) - 1); - const char deli[2] = " "; - strtok(g_oglu_version, deli); + g_oglu_version[sizeof(g_oglu_version) - 1] = '\0'; /* strncpy fix */ + strtok(g_oglu_version, " "); } else { diff --git a/src/render_ogl.c b/src/render_ogl.c index 428453e..f208ab6 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -157,6 +157,7 @@ static void ogl_build_programs() char shader_path[MAX_PATH] = { 0 }; strncpy(shader_path, g_config.shader, sizeof(shader_path)); + shader_path[sizeof(shader_path) - 1] = '\0'; /* strncpy fix */ if (GetFileAttributes(shader_path) == INVALID_FILE_ATTRIBUTES) { @@ -530,7 +531,7 @@ static void ogl_init_scale_program() glBindVertexArray(0); - float input_size[2], output_size[2], texture_size[2]; + float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; input_size[0] = (float)g_ddraw.width; input_size[1] = (float)g_ddraw.height; From 3a52a07ba6e105620eda4fbc8ce809dcfd2ccb82 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Apr 2024 01:25:00 +0200 Subject: [PATCH 0170/1053] add (commented out) code to adjust the zone list size on first start --- src/dd.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/dd.c b/src/dd.c index 427e082..e72bbfd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1211,6 +1211,27 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_config.windowed = TRUE; g_config.fullscreen = FALSE; g_config.devmode = TRUE; + + /* + if (!g_config.window_rect.right) + { + if (real_GetSystemMetrics(SM_CYSCREEN) >= 2160) + { + g_config.window_rect.right = 640 * 3; + g_config.window_rect.bottom = 480 * 3; + } + else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1440) + { + g_config.window_rect.right = 640 * 2; + g_config.window_rect.bottom = 480 * 2; + } + else if (real_GetSystemMetrics(SM_CYSCREEN) >= 1080) + { + g_config.window_rect.right = (LONG)(640 * 1.5f); + g_config.window_rect.bottom = (LONG)(480 * 1.5f); + } + } + */ } dd_SetDisplayMode(640, 480, 16, SDM_MODE_SET_BY_GAME); From 9d4f3b148ba9edf276e8d14eec089d157c3a686f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Apr 2024 01:37:44 +0200 Subject: [PATCH 0171/1053] add position check to make sure we'll only resize on first start --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index e72bbfd..b75edff 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1213,7 +1213,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_config.devmode = TRUE; /* - if (!g_config.window_rect.right) + if (!g_config.window_rect.right && g_config.window_rect.left == -32000) { if (real_GetSystemMetrics(SM_CYSCREEN) >= 2160) { From 6dc8390fede9af0c4df5cb409e3c7029b0b91cfb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 02:48:15 +0200 Subject: [PATCH 0172/1053] #304 - Limit window size to max surface size (Dune2000 1.02) --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8b6562a..e21815b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1357,6 +1357,13 @@ HWND WINAPI fake_CreateWindowExA( dwStyle |= WS_CLIPCHILDREN; } + /* Limit window size to max surface size (Dune2000 1.02) */ + if (dwStyle & WS_POPUP) + { + nWidth = min((DWORD)nWidth, (DWORD)16384); + nHeight = min((DWORD)nHeight, (DWORD)16384); + } + return real_CreateWindowExA( dwExStyle, lpClassName, From 36bf42af6f12f559cf97767f30364c970423f5b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 02:54:40 +0200 Subject: [PATCH 0173/1053] allow negative values for window width/height --- 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 e21815b..3388b47 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,8 +1360,8 @@ HWND WINAPI fake_CreateWindowExA( /* Limit window size to max surface size (Dune2000 1.02) */ if (dwStyle & WS_POPUP) { - nWidth = min((DWORD)nWidth, (DWORD)16384); - nHeight = min((DWORD)nHeight, (DWORD)16384); + nWidth = min(nWidth, 16384); + nHeight = min(nHeight, 16384); } return real_CreateWindowExA( From 18c15280ba04beb120cb2c18f0c57386e8a1fb55 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 16 Apr 2024 03:11:33 +0200 Subject: [PATCH 0174/1053] #304 add a check for CW_USEDEFAULT just to be sure --- 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 3388b47..9431121 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1360,8 +1360,15 @@ HWND WINAPI fake_CreateWindowExA( /* Limit window size to max surface size (Dune2000 1.02) */ if (dwStyle & WS_POPUP) { - nWidth = min(nWidth, 16384); - nHeight = min(nHeight, 16384); + if (nWidth != CW_USEDEFAULT) + { + nWidth = min(nWidth, 16384); + } + + if (nHeight != CW_USEDEFAULT) + { + nHeight = min(nHeight, 16384); + } } return real_CreateWindowExA( From 547fda273a69f759d90335de62cbc4492130441e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Apr 2024 01:35:22 +0200 Subject: [PATCH 0175/1053] use default toolset so you don't require a specific VS version --- cnc-ddraw.vcxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index f74a7b3..b1c9390 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -116,20 +116,20 @@ cnc_ddraw - 10.0 + $(WindowsTargetPlatformVersion_10) {96094551-5D52-4EBD-BE4C-5291A03507FC} DynamicLibrary true - v143 + $(DefaultPlatformToolset) MultiByte DynamicLibrary false - v143 + $(DefaultPlatformToolset) true MultiByte From f735ef839c4cecdb89e43ec3c6c73bb58ddb442e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 00:34:46 +0200 Subject: [PATCH 0176/1053] #305 add support for window menu in borderless mode --- src/dd.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index b75edff..225a781 100644 --- a/src/dd.c +++ b/src/dd.c @@ -632,6 +632,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { border = FALSE; + if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + { + g_ddraw.render.height -= real_GetSystemMetrics(SM_CYMENU); + } + /* prevent OpenGL from going automatically into fullscreen exclusive mode */ if (g_ddraw.renderer == ogl_render_main) nonexclusive = TRUE; @@ -882,10 +887,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl GWL_STYLE, real_GetWindowLongA( g_ddraw.hwnd, - GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); - - if (GetMenu(g_ddraw.hwnd)) - SetMenu(g_ddraw.hwnd, NULL); + GWL_STYLE) & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU)); } else { @@ -919,6 +921,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.fullscreen) { x = y = 0; + + if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + { + y = real_GetSystemMetrics(SM_CYMENU); + } } else if (border && g_config.window_rect.top == -32000 && y < 0) { From ec648669ef2de6324c50ea3e27a6a3fd13694e06 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 04:41:04 +0200 Subject: [PATCH 0177/1053] add partial support for menus in fullscreen via nonexclusive=true --- src/dd.c | 19 +++++++++++++++---- src/wndproc.c | 6 ++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 225a781..6398cc7 100644 --- a/src/dd.c +++ b/src/dd.c @@ -922,7 +922,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { x = y = 0; - if (!g_config.remove_menu && GetMenu(g_ddraw.hwnd)) + if (GetMenu(g_ddraw.hwnd)) { y = real_GetSystemMetrics(SM_CYMENU); } @@ -972,8 +972,19 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + int menu_height = 0; + if (GetMenu(g_ddraw.hwnd)) - SetMenu(g_ddraw.hwnd, NULL); + { + if (g_config.remove_menu || !g_config.nonexclusive) + { + SetMenu(g_ddraw.hwnd, NULL); + } + else + { + menu_height = real_GetSystemMetrics(SM_CYMENU); + } + } LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -1011,7 +1022,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, swp_flags); swp_flags = SWP_SHOWWINDOW; @@ -1071,7 +1082,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, swp_flags); if (d3d9_active && g_config.nonexclusive) diff --git a/src/wndproc.c b/src/wndproc.c index 35b8cf2..8ea8ba5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -244,13 +244,15 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { g_ddraw.last_set_window_pos_tick = timeGetTime(); + int menu_height = GetMenu(g_ddraw.hwnd) ? real_GetSystemMetrics(SM_CYMENU) : 0; + real_SetWindowPos( g_ddraw.hwnd, HWND_TOPMOST, 1, 1, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, SWP_SHOWWINDOW); real_SetWindowPos( @@ -259,7 +261,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 0, 0, g_ddraw.render.width, - g_ddraw.render.height, + g_ddraw.render.height + menu_height, SWP_SHOWWINDOW); } return 0; From b638b90e69d8674b26bf3b56ceb4e4bd7e2b40d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 06:59:05 +0200 Subject: [PATCH 0178/1053] only build ReleaseXP and DeubgLogXP for now to speed things up a bit --- .github/workflows/build.yml | 40 +++++++++++++++++++++++++------------ action.yml | 11 +++++++--- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index aef68fe..f553ba7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -70,24 +70,38 @@ jobs: run: | : - mkdir -p cnc-ddraw-release - mkdir -p cnc-ddraw-releasexp - mkdir -p cnc-ddraw-debug - mkdir -p cnc-ddraw-debuglogxp - mkdir -p cnc-ddraw-debuglogminixp + if [[ -f "${{ steps.build-release.outputs.release }}" ]]; then + mkdir -p cnc-ddraw-release + + cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + fi - cp "${{ steps.build-release.outputs.release }}" cnc-ddraw-release + if [[ -f "${{ steps.build-releasexp.outputs.releasexp }}" ]]; then + mkdir -p cnc-ddraw-releasexp + + cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + fi - cp "${{ steps.build-releasexp.outputs.releasexp }}" cnc-ddraw-releasexp + if [[ -f "${{ steps.build-debug.outputs.debug }}" ]]; then + mkdir -p cnc-ddraw-debug + + cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug + cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + fi - cp "${{ steps.build-debug.outputs.debug }}" cnc-ddraw-debug - cp "${{ steps.build-debug.outputs.debug-pdb }}" cnc-ddraw-debug + if [[ -f "${{ steps.build-debuglogxp.outputs.debuglogxp }}" ]]; then + mkdir -p cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp - cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp }}" cnc-ddraw-debuglogxp + cp "${{ steps.build-debuglogxp.outputs.debuglogxp-pdb }}" cnc-ddraw-debuglogxp + fi - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp - cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp + if [[ -f "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" ]]; then + mkdir -p cnc-ddraw-debuglogminixp + + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp }}" cnc-ddraw-debuglogminixp + cp "${{ steps.build-debuglogminixp.outputs.debuglogminixp-pdb }}" cnc-ddraw-debuglogminixp + fi shell: bash diff --git a/action.yml b/action.yml index 6ba68af..86b657c 100644 --- a/action.yml +++ b/action.yml @@ -110,7 +110,8 @@ runs: - name: Build Release id: build-release run: | - if [[ "${{ inputs.release }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.release }}" == "true" ]]; then echo ::group::Build Release # @@ -127,6 +128,7 @@ runs: - name: Build ReleaseXP id: build-releasexp run: | + #if false; then if [[ "${{ inputs.releasexp }}" == "true" ]]; then echo ::group::Build ReleaseXP @@ -145,7 +147,8 @@ runs: id: build-debug run: | : - if [[ "${{ inputs.debug }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.debug }}" == "true" ]]; then echo "::group::Build Debug" # @@ -164,6 +167,7 @@ runs: id: build-debuglogxp run: | : + #if false; then if [[ "${{ inputs.debuglogxp }}" == "true" ]]; then echo "::group::Build DebugLogXP" @@ -183,7 +187,8 @@ runs: id: build-debuglogminixp run: | : - if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then + if false; then + #if [[ "${{ inputs.debuglogminixp }}" == "true" ]]; then echo "::group::Build DebugLogMiniXP" # From aba07e00b4cc611615485f24899ea4b5c2841be2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Apr 2024 09:09:29 +0200 Subject: [PATCH 0179/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 9dc51c9..211d331 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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 ed5176942ffcc74a25b7219340cbd35320795f73 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 25 Apr 2024 00:57:54 +0200 Subject: [PATCH 0180/1053] simplify makefile --- Makefile | 53 +++++++++------------------------------- cnc-ddraw.vcxproj | 12 ++++----- ddraw.def => exports.def | 0 ddraw.rc => res.rc | 0 4 files changed, 17 insertions(+), 48 deletions(-) rename ddraw.def => exports.def (100%) rename ddraw.rc => res.rc (100%) diff --git a/Makefile b/Makefile index 073ff53..98d7592 100644 --- a/Makefile +++ b/Makefile @@ -1,50 +1,19 @@ -include config.mk -CC = i686-w64-mingw32-gcc -CXX = i686-w64-mingw32-g++ -STRIP ?= i686-w64-mingw32-strip -WINDRES ?= i686-w64-mingw32-windres -LDFLAGS = -Wl,--enable-stdcall-fixup -s -static +TARGET = ddraw.dll +LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 -FILES = src/IDirect3D/IDirect3D.c \ - src/IDirect3D/IDirect3D2.c \ - src/IDirect3D/IDirect3D3.c \ - src/IDirect3D/IDirect3D7.c \ - src/IDirectDraw/IDirectDraw.c \ - src/IDirectDraw/IDirectDrawPalette.c \ - src/IDirectDraw/IDirectDrawClipper.c \ - src/IDirectDraw/IDirectDrawSurface.c \ - src/IDirectDraw/IDirectDrawGammaControl.c \ - src/IAMMediaStream/IAMMediaStream.c \ - src/crc32.c \ - src/ini.c \ - src/blt.c \ - src/dd.c \ - src/ddpalette.c \ - src/ddsurface.c \ - src/ddclipper.c \ - src/render_ogl.c \ - src/render_gdi.c \ - src/render_d3d9.c \ - src/debug.c \ - src/mouse.c \ - src/winapi_hooks.c \ - src/screenshot.c \ - src/config.c \ - src/lodepng.c \ - src/directinput.c \ - src/hook.c \ - src/dllmain.c \ - src/wndproc.c \ - src/utils.c \ - src/fps_limiter.c \ - src/opengl_utils.c +CC = i686-w64-mingw32-gcc +WINDRES ?= i686-w64-mingw32-windres -all: - $(WINDRES) -J rc ddraw.rc ddraw.rc.o - $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) +.PHONY: clean all +all: $(TARGET) + +$(TARGET): $(wildcard src/*.c) $(wildcard src/*/*.c) + $(WINDRES) -J rc res.rc res.o + $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ exports.def res.o $(LIBS) clean: - $(RM) ddraw.dll ddraw.rc.o + $(RM) $(TARGET) res.o diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index b1c9390..1a81dbb 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -111,7 +111,7 @@ - + @@ -217,7 +217,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) - ddraw.def + exports.def @@ -244,7 +244,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe 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) - ddraw.def + exports.def @@ -271,7 +271,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe 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) - ddraw.def + exports.def @@ -298,7 +298,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe 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) - ddraw.def + exports.def @@ -325,7 +325,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe 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) - ddraw.def + exports.def diff --git a/ddraw.def b/exports.def similarity index 100% rename from ddraw.def rename to exports.def diff --git a/ddraw.rc b/res.rc similarity index 100% rename from ddraw.rc rename to res.rc From a2ef373871c5cac3110fd5ab45ccb962d4197571 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 00:26:36 +0200 Subject: [PATCH 0181/1053] #306 partial support for road rash upscaling --- src/config.c | 1 - src/utils.c | 25 +++++++++++++------------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/config.c b/src/config.c index cd0ddd1..f24ba3c 100644 --- a/src/config.c +++ b/src/config.c @@ -908,7 +908,6 @@ static void cfg_create_ini() "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" - "fixchilds=1\n" "\n" "; Sim Copter\n" "[SimCopter]\n" diff --git a/src/utils.c b/src/utils.c index 8793092..8fbe733 100644 --- a/src/utils.c +++ b/src/utils.c @@ -562,34 +562,35 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { /* TRACE( - " util_enum_child_proc right=%u, bottom=%u, left=%d, top=%d\n", - size.right, + " util_enum_child_proc width=%u, Height=%u, left=%d, top=%d\n", + size.right, size.bottom, pos.left, pos.top); - */ + */ char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //TRACE(" AVIWINDOW class=%s\n", class_name); + //LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); + LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + //TRACE(" AVIWINDOW class=%s, style=%p, exstyle=%p\n", class_name, style, exstyle); + + if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIAVI") == 0 || - strcmp(class_name, "AVIWnd32") == 0 || + strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { InterlockedExchangePointer((void*)&g_ddraw.video_window_hwnd, hwnd); - } + } - LONG style = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - - if (!(style & WS_EX_TRANSPARENT)) + if (!(exstyle & WS_EX_TRANSPARENT)) { - real_SetWindowLongA(hwnd, GWL_EXSTYLE, style | WS_EX_TRANSPARENT); + real_SetWindowLongA(hwnd, GWL_EXSTYLE, exstyle | WS_EX_TRANSPARENT); real_SetWindowPos( hwnd, @@ -602,7 +603,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ); } } - else + else if (!(exstyle & WS_EX_TRANSPARENT)) { g_ddraw.got_child_windows = g_ddraw.child_window_exists = TRUE; From 6ddc2ad00b6a5db52c46a184fde76acaa93433ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:13:50 +0200 Subject: [PATCH 0182/1053] #306 support cutscene upscaling for road rash --- src/utils.c | 3 ++- src/winapi_hooks.c | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 8fbe733..347a143 100644 --- a/src/utils.c +++ b/src/utils.c @@ -581,7 +581,8 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) strcmp(class_name, "VideoRenderer") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || - strcmp(class_name, "MCIWndClass") == 0) + strcmp(class_name, "MCIWndClass") == 0 || + strcmp(class_name, "AVI Window") == 0) { if (g_config.fixchilds != FIX_CHILDS_DETECT_HIDE) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9431121..12ce224 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -783,6 +783,7 @@ BOOL WINAPI fake_StretchBlt( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) @@ -1301,6 +1302,16 @@ HWND WINAPI fake_CreateWindowExA( 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 && + (dwStyle & WS_POPUP)) + { + dwStyle = WS_CHILD; + hWndParent = g_ddraw.hwnd; + } + /* 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 36ae25ea89b235adcf979b1cf89d585dd5fa516e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:23:28 +0200 Subject: [PATCH 0183/1053] #306 adjust road rash preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index f24ba3c..0844b24 100644 --- a/src/config.c +++ b/src/config.c @@ -908,6 +908,7 @@ static void cfg_create_ini() "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" + "nonexclusive=true\n" "\n" "; Sim Copter\n" "[SimCopter]\n" From b34ec49a13f83c8526831bb02757e209ddd11fe2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:27:34 +0200 Subject: [PATCH 0184/1053] handle "AVI Window" in StretchDIBits as well --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 12ce224..28e29c3 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -899,6 +899,7 @@ int WINAPI fake_StretchDIBits( (hwnd == g_ddraw.hwnd || (g_config.fixchilds && IsChild(g_ddraw.hwnd, hwnd) && (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || + strcmp(class_name, "AVI Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0)))) From 4b7fe8531e17a7f7774befa57fb6f2bab2913aaf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 01:41:38 +0200 Subject: [PATCH 0185/1053] fix mingw debug build --- Makefile | 4 ++++ build.cmd | 1 + src/hook.c | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 98d7592..00da29b 100644 --- a/Makefile +++ b/Makefile @@ -8,6 +8,10 @@ LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres +ifdef DEBUG + CFLAGS += -D _DEBUG -D _DEBUG_X +endif + .PHONY: clean all all: $(TARGET) diff --git a/build.cmd b/build.cmd index 539995e..c9d3564 100644 --- a/build.cmd +++ b/build.cmd @@ -5,4 +5,5 @@ REM set PATH=C:\w64devkit\bin make clean make +REM make DEBUG=1 pause diff --git a/src/hook.c b/src/hook.c index d8f72a7..3a1b7cd 100644 --- a/src/hook.c +++ b/src/hook.c @@ -646,12 +646,13 @@ void hook_exit() hook_revert((HOOKLIST*)&g_hook_hooklist); -#if defined(_DEBUG) && defined(_MSC_VER) +#if defined(_DEBUG) +#if defined(_MSC_VER) DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach((PVOID*)&real_SetUnhandledExceptionFilter, (PVOID)fake_SetUnhandledExceptionFilter); DetourTransactionCommit(); - +#endif real_SetUnhandledExceptionFilter(g_dbg_exception_filter); #endif From b0fb8d0be75680f57acfef3990c75243692f1eaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Apr 2024 02:02:06 +0200 Subject: [PATCH 0186/1053] hook SetUnhandledExceptionFilter for mingw debug build --- src/hook.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/hook.c b/src/hook.c index 3a1b7cd..653e891 100644 --- a/src/hook.c +++ b/src/hook.c @@ -146,6 +146,9 @@ 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 }, +#if defined(_DEBUG) && defined(__GNUC__) + { "SetUnhandledExceptionFilter", (PROC)fake_SetUnhandledExceptionFilter, (PROC*)&real_SetUnhandledExceptionFilter, 0 }, +#endif { "", NULL, NULL, 0 } } }, From 13d7a3747b2bdb0def49e4e4ba87332790e60abf Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:52:51 +0200 Subject: [PATCH 0187/1053] fix default WindowsTargetPlatformVersion --- cnc-ddraw.vcxproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 1a81dbb..40036f3 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -116,7 +116,7 @@ cnc_ddraw - $(WindowsTargetPlatformVersion_10) + $([Microsoft.Build.Utilities.ToolLocationHelper]::GetLatestSDKTargetPlatformVersion('Windows', '10.0')) {96094551-5D52-4EBD-BE4C-5291A03507FC} From c61389d105bc5e5083df241928cfc4f79cc72064 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:53:29 +0200 Subject: [PATCH 0188/1053] remove unnecessary clears on flip --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d7176c2..ba7a5f1 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -762,7 +762,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa InterlockedExchangePointer((void*)&backbuffer->hdc, dc); InterlockedExchangePointer(&backbuffer->mapping, map); - if (g_config.flipclear) + if (g_config.flipclear && (This->caps & DDSCAPS_PRIMARYSURFACE)) { blt_clear(buf, 0, backbuffer->size); } From 18eddc7f7f0af5f0f3fbbb52d3534716e38acfad Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 2 May 2024 05:54:00 +0200 Subject: [PATCH 0189/1053] adjust preset to fix graphical glitches with worms 2 high resolution patch --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 0844b24..da84184 100644 --- a/src/config.c +++ b/src/config.c @@ -1049,6 +1049,7 @@ static void cfg_create_ini() "\n" "; Worms 2\n" "[worms2]\n" + "flipclear=true\n" "game_handles_close=true\n" "\n" "; Worms Armageddon\n" From 57be0f022ec73855befd8d4688a002ed29e9defc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 3 May 2024 07:40:04 +0200 Subject: [PATCH 0190/1053] tweak makefile for faster debugging --- Makefile | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 00da29b..3daa0b7 100644 --- a/Makefile +++ b/Makefile @@ -12,12 +12,17 @@ ifdef DEBUG CFLAGS += -D _DEBUG -D _DEBUG_X endif +SRCS := $(wildcard src/*.c) $(wildcard src/*/*.c) +OBJS := $(SRCS:c=o) res.o + .PHONY: clean all all: $(TARGET) -$(TARGET): $(wildcard src/*.c) $(wildcard src/*/*.c) - $(WINDRES) -J rc res.rc res.o - $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ exports.def res.o $(LIBS) +%.o: %.rc + $(WINDRES) -J rc $< $@ + +$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ exports.def $(LIBS) clean: - $(RM) $(TARGET) res.o + $(RM) $(TARGET) $(OBJS) From a6e7b5f235fee1d3cf6c5fc023e11ef2ab5a5be4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 01:45:41 +0200 Subject: [PATCH 0191/1053] Fix alt+tab issues on windows 7 (opengl + aero) --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 8ea8ba5..a551991 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -614,8 +614,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); + ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); mouse_lock(); } } From 8d97550c2b97a98a883f66c9c37646058546dc9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 06:34:37 +0200 Subject: [PATCH 0192/1053] Revert "Fix alt+tab issues on windows 7 (opengl + aero)" This reverts commit a6e7b5f235fee1d3cf6c5fc023e11ef2ab5a5be4. --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index a551991..8ea8ba5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -614,8 +614,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (g_ddraw.renderer != d3d9_render_main || g_config.nonexclusive) { - real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN); + real_ShowWindow(g_ddraw.hwnd, SW_RESTORE); mouse_lock(); } } From 64c4b73853a2328a25c52a6b5b98fa2d7abfacec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 07:19:02 +0200 Subject: [PATCH 0193/1053] Add workaround for alt+tab issues on windows 7 SP1 (opengl) --- inc/versionhelpers.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ src/dd.c | 14 ++++++- src/fps_limiter.c | 16 +++++++- 3 files changed, 124 insertions(+), 4 deletions(-) create mode 100644 inc/versionhelpers.h diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h new file mode 100644 index 0000000..5cb0d97 --- /dev/null +++ b/inc/versionhelpers.h @@ -0,0 +1,98 @@ +/** + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER within this package. + */ + +#ifndef _INC_VERSIONHELPERS +#define _INC_VERSIONHELPERS + +#if 1 + +#ifdef __cplusplus +#define VERSIONHELPERAPI inline bool +#else +#define VERSIONHELPERAPI FORCEINLINE BOOL +#endif + +#ifndef _WIN32_WINNT_WIN8 +#define _WIN32_WINNT_WIN8 0x0602 +#endif +#ifndef _WIN32_WINNT_WINBLUE +#define _WIN32_WINNT_WINBLUE 0x0603 +#endif +#ifndef _WIN32_WINNT_WINTHRESHOLD +#define _WIN32_WINNT_WINTHRESHOLD 0x0A00 /* ABRACADABRA_THRESHOLD*/ +#endif +#ifndef _WIN32_WINNT_WIN10 +#define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/ +#endif + +VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) +{ + OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,0,0,{0},servpack}; + return VerifyVersionInfoW(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR, + VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + VER_MAJORVERSION,VER_GREATER_EQUAL), + VER_MINORVERSION,VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + +VERSIONHELPERAPI IsWindowsXPOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); +} + +VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1); +} + +VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2); +} + +VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3); +} + +VERSIONHELPERAPI IsWindowsVistaOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); +} + +VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1); +} + +VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2); +} + +VERSIONHELPERAPI IsWindows7OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); +} + +VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1); +} + +VERSIONHELPERAPI IsWindows8OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); +} + +VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); +} + +VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0); +} + +VERSIONHELPERAPI IsWindows10OrGreater(void) { + return IsWindowsThresholdOrGreater(); +} + +VERSIONHELPERAPI IsWindowsServer(void) { + OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; + return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); +} + +#endif +#endif diff --git a/src/dd.c b/src/dd.c index 6398cc7..68f0810 100644 --- a/src/dd.c +++ b/src/dd.c @@ -14,6 +14,7 @@ #include "debug.h" #include "utils.h" #include "blt.h" +#include "versionhelpers.h" CNCDDRAW g_ddraw; @@ -1271,8 +1272,17 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || 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 && !g_config.is_wine && !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 a6014bf..9d74fc5 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -4,6 +4,9 @@ #include "debug.h" #include "hook.h" #include "config.h" +#include "render_ogl.h" +#include "versionhelpers.h" + FPSLIMITER g_fpsl; @@ -153,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_dwm_flush() || 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 && !g_config.is_wine && !IsWindows8OrGreater()) + { + if (fpsl_wait_for_vblank()) + return; + } + else + { + if (fpsl_dwm_flush() || fpsl_wait_for_vblank()) + return; + } } if (g_fpsl.tick_length > 0) From 2cbd9bba094007c4f4a21e2ec9c772a12db8a74a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 07:47:19 +0200 Subject: [PATCH 0194/1053] comment out non-working functions --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 5 ++++- inc/versionhelpers.h | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 40036f3..4980515 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -106,6 +106,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 5a253f1..e9fb994 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -275,9 +275,12 @@ Header Files + + Header Files + - + Resource Files diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 5cb0d97..ea574e1 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -76,7 +76,7 @@ VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { VERSIONHELPERAPI IsWindows8OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); } - +/* Those can't be used without manifest so we comment them out to ensure they're not being used by accident VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); } @@ -88,7 +88,7 @@ VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } - +*/ VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); From cc97cc0761a46de563f3f6303fd07bb9663643e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 4 May 2024 08:09:36 +0200 Subject: [PATCH 0195/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 211d331..5d0330d 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 3 #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 6626480358f06be136aef979c2c7201601e1a9bd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 01:23:59 +0200 Subject: [PATCH 0196/1053] extend versionhelpers --- cnc-ddraw.vcxproj | 1 + cnc-ddraw.vcxproj.filters | 3 ++ inc/config.h | 1 - inc/versionhelpers.h | 60 ++++++++++++++++++++------------ src/config.c | 5 ++- src/dd.c | 12 +++---- src/ddsurface.c | 3 +- src/debug.c | 17 +++------ src/dllmain.c | 3 ++ src/fps_limiter.c | 2 +- src/opengl_utils.c | 3 +- src/versionhelpers.c | 72 +++++++++++++++++++++++++++++++++++++++ src/wndproc.c | 11 +++--- 13 files changed, 140 insertions(+), 53 deletions(-) create mode 100644 src/versionhelpers.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index 4980515..edfd7ab 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -67,6 +67,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index e9fb994..34b47a6 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -159,6 +159,9 @@ Source Files + + Source Files + diff --git a/inc/config.h b/inc/config.h index fe0f885..badf4fe 100644 --- a/inc/config.h +++ b/inc/config.h @@ -19,7 +19,6 @@ typedef struct CNCDDRAWCONFIG char process_file_ext[MAX_PATH]; char dll_file_ext[MAX_PATH]; INIFILE ini; - BOOL is_wine; BOOL d3d9on12; BOOL opengl_core; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index ea574e1..21e3ced 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -6,8 +6,6 @@ #ifndef _INC_VERSIONHELPERS #define _INC_VERSIONHELPERS -#if 1 - #ifdef __cplusplus #define VERSIONHELPERAPI inline bool #else @@ -26,73 +24,91 @@ #ifndef _WIN32_WINNT_WIN10 #define _WIN32_WINNT_WIN10 0x0A00 /* ABRACADABRA_THRESHOLD*/ #endif +#ifndef _WIN32_WINNT_WIN11 +#define _WIN32_WINNT_WIN11 0x0A00 +#endif -VERSIONHELPERAPI IsWindowsVersionOrGreater(WORD major, WORD minor, WORD servpack) + +void verhelp_init(); +BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); +const char* verhelp_wine_get_version(); +void verhelp_wine_get_host_version(const char** sysname, const char** release); +BOOL verhelp_is_wine(); +BOOL verhelp_is_macos(); +BOOL verhelp_is_linux(); + +/* Original MS Functions */ + +VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) { - OSVERSIONINFOEXW vi = {sizeof(vi),major,minor,0,0,{0},servpack}; - return VerifyVersionInfoW(&vi, VER_MAJORVERSION|VER_MINORVERSION|VER_SERVICEPACKMAJOR, - VerSetConditionMask(VerSetConditionMask(VerSetConditionMask(0, + 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_GREATER_EQUAL), VER_MINORVERSION,VER_GREATER_EQUAL), + VER_BUILDNUMBER,VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } VERSIONHELPERAPI IsWindowsXPOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } VERSIONHELPERAPI IsWindowsXPSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); } VERSIONHELPERAPI IsWindowsXPSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 2); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); } VERSIONHELPERAPI IsWindowsXPSP3OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 3); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); } VERSIONHELPERAPI IsWindowsVistaOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); } VERSIONHELPERAPI IsWindowsVistaSP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); } VERSIONHELPERAPI IsWindowsVistaSP2OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 2); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); } VERSIONHELPERAPI IsWindows7OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); } VERSIONHELPERAPI IsWindows7SP1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 1); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); } VERSIONHELPERAPI IsWindows8OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); } -/* Those can't be used without manifest so we comment them out to ensure they're not being used by accident + VERSIONHELPERAPI IsWindows8Point1OrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); } VERSIONHELPERAPI IsWindowsThresholdOrGreater(void) { - return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0); + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINTHRESHOLD), LOBYTE(_WIN32_WINNT_WINTHRESHOLD), 0, 0); } VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } -*/ + +VERSIONHELPERAPI IsWindows11OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); +} + VERSIONHELPERAPI IsWindowsServer(void) { OSVERSIONINFOEXW vi = {sizeof(vi),0,0,0,0,{0},0,0,0,VER_NT_WORKSTATION}; - return !VerifyVersionInfoW(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); + return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } #endif -#endif diff --git a/src/config.c b/src/config.c index da84184..31cbad5 100644 --- a/src/config.c +++ b/src/config.c @@ -11,6 +11,7 @@ #include "debug.h" #include "dllmain.h" #include "ini.h" +#include "versionhelpers.h" static void cfg_init(); static void cfg_create_ini(); @@ -1075,8 +1076,6 @@ static void cfg_create_ini() static void cfg_init() { - g_config.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; - /* get process filename and directory */ if (GetModuleFileNameA(NULL, g_config.game_path, sizeof(g_config.game_path) - 1) > 0) { @@ -1151,7 +1150,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; - if (g_config.is_wine) + if (verhelp_is_wine()) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); diff --git a/src/dd.c b/src/dd.c index 68f0810..c2948c6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -875,7 +875,7 @@ 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_config.is_wine) + if (!verhelp_is_wine()) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -905,7 +905,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (g_config.is_wine) + if (verhelp_is_wine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1053,7 +1053,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 (g_config.is_wine && + if (verhelp_is_wine() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { @@ -1066,7 +1066,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (g_config.is_wine) + if (verhelp_is_wine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1273,7 +1273,7 @@ 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 && !g_config.is_wine && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return DD_OK; @@ -1556,7 +1556,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!g_config.is_wine && d3d9_is_available()) + if (!verhelp_is_wine() && d3d9_is_available()) { g_ddraw.renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index ba7a5f1..e188cba 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -11,6 +11,7 @@ #include "utils.h" #include "blt.h" #include "config.h" +#include "versionhelpers.h" LONG g_dds_gdi_handles; @@ -957,7 +958,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !g_config.is_wine) + if (g_ddraw.ref && g_config.fixnotresponding && !verhelp_is_wine()) { MSG msg; /* workaround for "Not Responding" window problem */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE); diff --git a/src/debug.c b/src/debug.c index 4e81ab5..bc840b8 100644 --- a/src/debug.c +++ b/src/debug.c @@ -8,6 +8,7 @@ #include "debug.h" #include "hook.h" #include "version.h" +#include "versionhelpers.h" double g_dbg_frame_time = 0; @@ -130,23 +131,13 @@ void dbg_init() RegCloseKey(hkey); } - const char* (CDECL * wine_get_version)() = - (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version"); - - if (wine_get_version) + if (verhelp_is_wine()) { - TRACE("Wine version = %s\n", wine_get_version()); - } + TRACE("Wine version = %s\n", verhelp_wine_get_version()); - void (CDECL* wine_get_host_version)(const char** sysname, const char** release) = - (void*)real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_host_version"); - - if (wine_get_host_version) - { const char* sysname = NULL; const char* release = NULL; - - wine_get_host_version(&sysname, &release); + verhelp_wine_get_host_version(&sysname, &release); TRACE("Wine sysname = %s, release = %s\n", sysname, release); } diff --git a/src/dllmain.c b/src/dllmain.c index ee3c2cc..108c9e0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -9,6 +9,7 @@ #include "debug.h" #include "config.h" #include "hook.h" +#include "versionhelpers.h" /* export for cncnet cnc games */ @@ -28,6 +29,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) { g_ddraw_module = hDll; + verhelp_init(); + if (GetEnvironmentVariableW(L"cnc_ddraw_config_init", NULL, 0)) { cfg_load(); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 9d74fc5..8ea5992 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -157,7 +157,7 @@ void fpsl_frame_end() (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 && !g_config.is_wine && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !verhelp_is_wine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index e9497f3..da6e7c7 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -5,6 +5,7 @@ #include "debug.h" #include "hook.h" #include "config.h" +#include "versionhelpers.h" PFNWGLCREATECONTEXTPROC xwglCreateContext; PFNWGLDELETECONTEXTPROC xwglDeleteContext; @@ -212,7 +213,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (g_config.is_wine && glversion && glversion[0] == '2') // macOS + if (verhelp_is_wine() && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/versionhelpers.c b/src/versionhelpers.c new file mode 100644 index 0000000..5752591 --- /dev/null +++ b/src/versionhelpers.c @@ -0,0 +1,72 @@ +#include +#include "versionhelpers.h" + +typedef NTSTATUS(WINAPI* RTLVERIFYVERSIONINFOPROC)(PRTL_OSVERSIONINFOEXW, ULONG, ULONGLONG); +typedef const char* (CDECL* WINE_GET_VERSIONPROC)(); +typedef void (CDECL* WINE_GET_HOST_VERSIONPROC)(const char** sysname, const char** release); + +static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; +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 inizialize 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"); + } +} + +BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask) +{ + return RtlVerifyVersionInfo ? + RtlVerifyVersionInfo(versionInfo, typeMask, conditionMask) == 0 : + VerifyVersionInfoW(versionInfo, typeMask, conditionMask); +} + +const char* verhelp_wine_get_version() +{ + return wine_get_version ? wine_get_version() : NULL; +} + +void verhelp_wine_get_host_version(const char** sysname, const char** release) +{ + if (wine_get_host_version) + { + wine_get_host_version(sysname, release); + return; + } + + if (sysname) + *sysname = NULL; + + if (release) + *release = NULL; +} + +BOOL verhelp_is_wine() +{ + return wine_get_version != NULL; +} + +BOOL verhelp_is_macos() +{ + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Darwin") == 0; +} + +BOOL verhelp_is_linux() +{ + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Linux") == 0; +} diff --git a/src/wndproc.c b/src/wndproc.c index 8ea8ba5..f983186 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -13,6 +13,7 @@ #include "wndproc.h" #include "utils.h" #include "debug.h" +#include "versionhelpers.h" LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) @@ -228,7 +229,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (g_config.is_wine && + if (verhelp_is_wine() && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) @@ -462,7 +463,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (g_config.is_wine && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (verhelp_is_wine() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -479,7 +480,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!g_config.is_wine) /* hack: disable aero snap */ + if (!verhelp_is_wine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -492,7 +493,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !g_config.is_wine) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !verhelp_is_wine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -633,7 +634,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (g_config.is_wine && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) + if (verhelp_is_wine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From e18eb931ebac417d8ccce7d8e06c4e986246d69d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 02:00:58 +0200 Subject: [PATCH 0197/1053] use inline functions for WINE checks --- inc/versionhelpers.h | 25 ++++++++++++++++++++----- src/config.c | 2 +- src/dd.c | 12 ++++++------ src/ddsurface.c | 2 +- src/debug.c | 2 +- src/fps_limiter.c | 2 +- src/opengl_utils.c | 2 +- src/versionhelpers.c | 23 ----------------------- src/wndproc.c | 10 +++++----- 9 files changed, 36 insertions(+), 44 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 21e3ced..116f0f4 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -33,11 +33,6 @@ void verhelp_init(); BOOL verhelp_verify_version(PRTL_OSVERSIONINFOEXW versionInfo, ULONG typeMask, ULONGLONG conditionMask); const char* verhelp_wine_get_version(); void verhelp_wine_get_host_version(const char** sysname, const char** release); -BOOL verhelp_is_wine(); -BOOL verhelp_is_macos(); -BOOL verhelp_is_linux(); - -/* Original MS Functions */ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build, WORD servpack) { @@ -111,4 +106,24 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWine(void) { + return verhelp_wine_get_version() != NULL; +} + +VERSIONHELPERAPI IsMacOS(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Darwin") == 0; +} + +VERSIONHELPERAPI IsLinux(void) { + const char* sysname = NULL; + const char* release = NULL; + verhelp_wine_get_host_version(&sysname, &release); + + return sysname && _strcmpi(sysname, "Linux") == 0; +} + #endif diff --git a/src/config.c b/src/config.c index 31cbad5..49118e5 100644 --- a/src/config.c +++ b/src/config.c @@ -1150,7 +1150,7 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, { char buf[MAX_PATH] = { 0 }; - if (verhelp_is_wine()) + if (IsWine()) { char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/wine", g_config.process_file_name); diff --git a/src/dd.c b/src/dd.c index c2948c6..576a521 100644 --- a/src/dd.c +++ b/src/dd.c @@ -875,7 +875,7 @@ 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 (!verhelp_is_wine()) + if (!IsWine()) { MSG msg; /* workaround for "Not Responding" window problem in cnc games */ real_PeekMessageA(&msg, g_ddraw.hwnd, 0, 0, PM_NOREMOVE | PM_QS_INPUT); @@ -905,7 +905,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } - if (verhelp_is_wine()) + if (IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1053,7 +1053,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 (verhelp_is_wine() && + if (IsWine() && (g_ddraw.render.mode.dmPelsWidth != real_GetSystemMetrics(SM_CXSCREEN) || g_ddraw.render.mode.dmPelsHeight != real_GetSystemMetrics(SM_CYSCREEN))) { @@ -1066,7 +1066,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - if (verhelp_is_wine()) + if (IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, @@ -1273,7 +1273,7 @@ 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 && !verhelp_is_wine() && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return DD_OK; @@ -1556,7 +1556,7 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute } else /* auto */ { - if (!verhelp_is_wine() && d3d9_is_available()) + if (!IsWine() && d3d9_is_available()) { g_ddraw.renderer = d3d9_render_main; } diff --git a/src/ddsurface.c b/src/ddsurface.c index e188cba..6b9ab6b 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -958,7 +958,7 @@ HRESULT dds_Lock( dbg_dump_dds_lock_flags(dwFlags); - if (g_ddraw.ref && g_config.fixnotresponding && !verhelp_is_wine()) + 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); diff --git a/src/debug.c b/src/debug.c index bc840b8..a25916a 100644 --- a/src/debug.c +++ b/src/debug.c @@ -131,7 +131,7 @@ void dbg_init() RegCloseKey(hkey); } - if (verhelp_is_wine()) + if (IsWine()) { TRACE("Wine version = %s\n", verhelp_wine_get_version()); diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 8ea5992..14c4394 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -157,7 +157,7 @@ void fpsl_frame_end() (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 && !verhelp_is_wine() && !IsWindows8OrGreater()) + if (g_ddraw.renderer == ogl_render_main && !IsWine() && !IsWindows8OrGreater()) { if (fpsl_wait_for_vblank()) return; diff --git a/src/opengl_utils.c b/src/opengl_utils.c index da6e7c7..9e63d8a 100644 --- a/src/opengl_utils.c +++ b/src/opengl_utils.c @@ -213,7 +213,7 @@ void oglu_init() glEnableVertexAttribArray && glUniform2fv && glUniformMatrix4fv && glGenVertexArrays && glBindVertexArray && glGetUniformLocation; - if (verhelp_is_wine() && glversion && glversion[0] == '2') // macOS + if (IsWine() && glversion && glversion[0] == '2') // macOS { g_oglu_got_version3 = FALSE; wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)xwglGetProcAddress("wglCreateContextAttribsARB"); diff --git a/src/versionhelpers.c b/src/versionhelpers.c index 5752591..dc4b450 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -47,26 +47,3 @@ void verhelp_wine_get_host_version(const char** sysname, const char** release) if (release) *release = NULL; } - -BOOL verhelp_is_wine() -{ - return wine_get_version != NULL; -} - -BOOL verhelp_is_macos() -{ - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Darwin") == 0; -} - -BOOL verhelp_is_linux() -{ - const char* sysname = NULL; - const char* release = NULL; - verhelp_wine_get_host_version(&sysname, &release); - - return sysname && _strcmpi(sysname, "Linux") == 0; -} diff --git a/src/wndproc.c b/src/wndproc.c index f983186..69e9d4b 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -229,7 +229,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam pos->hwndInsertAfter, pos->x, pos->y, pos->cx, pos->cy); */ - if (verhelp_is_wine() && + if (IsWine() && !g_config.windowed && (pos->x > 0 || pos->y > 0) && g_ddraw.last_set_window_pos_tick + 500 < timeGetTime()) @@ -463,7 +463,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam util_update_bnet_pos(x, y); } - if (in_size_move || (verhelp_is_wine() && !g_config.fullscreen && g_ddraw.render.thread)) + if (in_size_move || (IsWine() && !g_config.fullscreen && g_ddraw.render.thread)) { if (x != -32000) g_config.window_rect.left = x; /* -32000 = Exit/Minimize */ @@ -480,7 +480,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_NCMOUSELEAVE: { - if (!verhelp_is_wine()) /* hack: disable aero snap */ + if (!IsWine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -493,7 +493,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } case WM_SYSCOMMAND: { - if ((wParam & ~0x0F) == SC_MOVE && !verhelp_is_wine()) /* hack: disable aero snap */ + if ((wParam & ~0x0F) == SC_MOVE && !IsWine()) /* hack: disable aero snap */ { LONG style = real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE); @@ -634,7 +634,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam mouse_unlock(); - if (verhelp_is_wine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) + if (IsWine() && g_ddraw.last_set_window_pos_tick + 500 > timeGetTime()) return 0; if (!g_config.windowed) From 57a98d667da4d5609b755e1dd1e4458f5867659b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 6 May 2024 02:56:40 +0200 Subject: [PATCH 0198/1053] add additonoal windows version check fucntions --- inc/versionhelpers.h | 67 ++++++++++++++++++++++++++++++++++++++++++++ src/versionhelpers.c | 2 +- 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 116f0f4..3e539c7 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -45,6 +45,17 @@ VERSIONHELPERAPI IsWindowsVersionOrGreater(DWORD major, DWORD minor, DWORD build VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } +VERSIONHELPERAPI IsWindowsVersion(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_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -106,6 +117,62 @@ VERSIONHELPERAPI IsWindowsServer(void) { return !verhelp_verify_version(&vi, VER_PRODUCT_TYPE, VerSetConditionMask(0, VER_PRODUCT_TYPE, VER_EQUAL)); } +VERSIONHELPERAPI IsWindowsXP(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); +} + +VERSIONHELPERAPI IsWindowsXPSP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 1); +} + +VERSIONHELPERAPI IsWindowsXPSP2(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 2); +} + +VERSIONHELPERAPI IsWindowsXPSP3(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 3); +} + +VERSIONHELPERAPI IsWindowsVista(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); +} + +VERSIONHELPERAPI IsWindowsVistaSP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 1); +} + +VERSIONHELPERAPI IsWindowsVistaSP2(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 2); +} + +VERSIONHELPERAPI IsWindows7(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); +} + +VERSIONHELPERAPI IsWindows7SP1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 1); +} + +VERSIONHELPERAPI IsWindows8(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN8), LOBYTE(_WIN32_WINNT_WIN8), 0, 0); +} + +VERSIONHELPERAPI IsWindows8Point1(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINBLUE), LOBYTE(_WIN32_WINNT_WINBLUE), 0, 0); +} + +VERSIONHELPERAPI IsWindowsThreshold(void) { + return IsWindows10OrGreater() && !IsWindows11OrGreater(); +} + +VERSIONHELPERAPI IsWindows10(void) { + return IsWindowsThreshold(); +} + +VERSIONHELPERAPI IsWindows11(void) { + return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); +} + VERSIONHELPERAPI IsWine(void) { return verhelp_wine_get_version() != NULL; } diff --git a/src/versionhelpers.c b/src/versionhelpers.c index dc4b450..e422e90 100644 --- a/src/versionhelpers.c +++ b/src/versionhelpers.c @@ -9,7 +9,7 @@ static RTLVERIFYVERSIONINFOPROC RtlVerifyVersionInfo; 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 inizialize it once on startup */ +/* GetProcAddress is rather slow so we use a function to initialize it once on startup */ void verhelp_init() { HMODULE mod = GetModuleHandleA("ntdll.dll"); From 1c9b39a1fd8a0fd0985d36696009fa3e7f91dd50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 01:47:56 +0200 Subject: [PATCH 0199/1053] set color key on GetSurfaceDesc --- src/ddsurface.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 6b9ab6b..feeb90a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -705,6 +705,13 @@ HRESULT dds_GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC lpDDSur lpDDSurfaceDesc->dwBackBufferCount = This->backbuffer_count; } + if (This->flags & DDSD_CKSRCBLT) + { + lpDDSurfaceDesc->dwFlags |= DDSD_CKSRCBLT; + lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceHighValue = This->color_key.dwColorSpaceHighValue; + lpDDSurfaceDesc->ddckCKSrcBlt.dwColorSpaceLowValue = This->color_key.dwColorSpaceLowValue; + } + if (This->bpp == 8) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags |= DDPF_PALETTEINDEXED8; From 8326407a64b88b39dbbcd19e7edfbd3feac1c0b9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 03:30:18 +0200 Subject: [PATCH 0200/1053] set DDSD_CKSRCBLT on SetColorKey --- src/ddsurface.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index feeb90a..d1a1b24 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1046,6 +1046,8 @@ HRESULT dds_SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKE if (lpColorKey) { + This->flags |= DDSD_CKSRCBLT; + This->color_key.dwColorSpaceLowValue = lpColorKey->dwColorSpaceLowValue; if (dwFlags & DDCKEY_COLORSPACE) From 54d6ff5112fb6236c5dc1c7383a073b10f64ed77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 05:54:56 +0200 Subject: [PATCH 0201/1053] add support for woms 2 high resolution patch zoom --- inc/dd.h | 1 + src/dd.c | 5 +++-- src/render_ogl.c | 6 ++++-- src/utils.c | 34 ++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 2 +- 5 files changed, 43 insertions(+), 5 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index 5fdc857..01e535e 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -123,6 +123,7 @@ typedef struct CNCDDRAW BOOL isredalert; BOOL iscnc1; BOOL iskkndx; + BOOL isworms2; LONG upscale_hack_active; HCURSOR old_cursor; int show_cursor_count; diff --git a/src/dd.c b/src/dd.c index 576a521..94147ab 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1190,8 +1190,9 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.isredalert = strcmp(g_ddraw.title, "Red Alert") == 0; g_ddraw.iscnc1 = strcmp(g_ddraw.title, "Command & Conquer") == 0; g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; + g_ddraw.isworms2 = strcmp(g_ddraw.title, "worms2") == 0; - if (g_ddraw.iskkndx) + if (g_ddraw.iskkndx || g_ddraw.isworms2) { g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 480; @@ -1202,7 +1203,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.upscale_hack_height = 400; } - if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx) + if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) { g_config.vhack = 0; } diff --git a/src/render_ogl.c b/src/render_ogl.c index f208ab6..8e50e38 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -174,13 +174,15 @@ static void ogl_build_programs() if (!is_upscaler || g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height) + g_ddraw.render.viewport.height != g_ddraw.height || + g_config.vhack) { g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); if (!g_ogl.scale_program && (g_ddraw.render.viewport.width != g_ddraw.width || - g_ddraw.render.viewport.height != g_ddraw.height)) + g_ddraw.render.viewport.height != g_ddraw.height || + g_config.vhack)) { g_ogl.scale_program = oglu_build_program( diff --git a/src/utils.c b/src/utils.c index 347a143..f15316d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -635,9 +635,29 @@ static unsigned char util_get_pixel(int x, int y) BOOL util_detect_low_res_screen() { + /* struct Copied from wkReSolution */ + typedef struct + { + PVOID UnkTable1; + DWORD Unk1, Unk2, Unk3, Unk4; + PVOID UnkDD, UnkTable2; + DWORD Unk5; + DWORD RenderWidth, RenderHeight; + DWORD Unk6, Unk7; + DWORD WidthRT, HeightRT; + DWORD HalfWidth, HalfHeight; + DWORD Unk8; + PCHAR UnkC; + LPDIRECTDRAW lpDD; + } W2DDSTRUCT, * LPW2DDSTRUCT; + static int* in_movie = (int*)0x00665F58; static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; + static LPW2DDSTRUCT* pW2DS; + + if (!pW2DS) + pW2DS = (char*)GetModuleHandleA(NULL) + 0x799C4; if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { @@ -663,6 +683,20 @@ BOOL util_detect_low_res_screen() { return util_get_pixel(g_ddraw.width - 3, 3) == 0; } + else if (g_ddraw.isworms2) + { + if ((*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + { + if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) + { + g_ddraw.upscale_hack_width = (*pW2DS)->RenderWidth; + g_ddraw.upscale_hack_height = (*pW2DS)->RenderHeight; + InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); + } + + return TRUE; + } + } return FALSE; } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 28e29c3..6b229ed 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -84,7 +84,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) y = min(pt.y, g_ddraw.height - 1); } - if (g_config.vhack && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) + if (g_config.vhack && !g_ddraw.isworms2 && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { diffx = 0; diffy = 0; From d97dd8e106aca61c2518ffddc29f2ae2aa3ab519 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:10:35 +0200 Subject: [PATCH 0202/1053] fix warning --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f15316d..7054a2e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -657,7 +657,7 @@ BOOL util_detect_low_res_screen() static LPW2DDSTRUCT* pW2DS; if (!pW2DS) - pW2DS = (char*)GetModuleHandleA(NULL) + 0x799C4; + pW2DS = (LPW2DDSTRUCT*)((DWORD)GetModuleHandleA(NULL) + 0x799C4); if (g_ddraw.width <= g_ddraw.upscale_hack_width || g_ddraw.height <= g_ddraw.upscale_hack_height) { From 38b553191f7632a652f4980aa8b1ea2b06062fb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:17:54 +0200 Subject: [PATCH 0203/1053] allow zooming on low resolutions as well (worms2) --- src/dd.c | 7 ++++++- src/utils.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/dd.c b/src/dd.c index 94147ab..c71a4d0 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1192,7 +1192,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.iskkndx = strcmp(g_ddraw.title, "KKND Xtreme") == 0; g_ddraw.isworms2 = strcmp(g_ddraw.title, "worms2") == 0; - if (g_ddraw.iskkndx || g_ddraw.isworms2) + if (g_ddraw.iskkndx) { g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 480; @@ -1202,6 +1202,11 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw.upscale_hack_width = 640; g_ddraw.upscale_hack_height = 400; } + else if (g_ddraw.isworms2) + { + g_ddraw.upscale_hack_width = 80; + g_ddraw.upscale_hack_height = 60; + } if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) { diff --git a/src/utils.c b/src/utils.c index 7054a2e..41876b1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,7 +685,7 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if ((*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + if ((*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) { if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) { From 91cad99b6febee3b94d61dbe824365a9cf5d7b09 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 07:35:47 +0200 Subject: [PATCH 0204/1053] add addiotional null check --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 41876b1..52a1ff7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,7 +685,7 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if ((*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + if (*pW2DS && (*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) { if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) { From b8632698a48bac1b9cefa20b54dd425a38524879 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 8 May 2024 09:04:19 +0200 Subject: [PATCH 0205/1053] tweak low res function checks --- src/utils.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/utils.c b/src/utils.c index 52a1ff7..9afa971 100644 --- a/src/utils.c +++ b/src/utils.c @@ -685,12 +685,15 @@ BOOL util_detect_low_res_screen() } else if (g_ddraw.isworms2) { - if (*pW2DS && (*pW2DS)->RenderWidth && (*pW2DS)->RenderWidth < g_ddraw.width && (*pW2DS)->RenderHeight < g_ddraw.height) + DWORD w2_width = *pW2DS ? (*pW2DS)->RenderWidth : 0; + DWORD w2_height = *pW2DS ? (*pW2DS)->RenderHeight : 0; + + if (w2_width && w2_width < g_ddraw.width && w2_height && w2_height < g_ddraw.height) { - if (g_ddraw.upscale_hack_width != (*pW2DS)->RenderWidth || g_ddraw.upscale_hack_height != (*pW2DS)->RenderHeight) + if (g_ddraw.upscale_hack_width != w2_width || g_ddraw.upscale_hack_height != w2_height) { - g_ddraw.upscale_hack_width = (*pW2DS)->RenderWidth; - g_ddraw.upscale_hack_height = (*pW2DS)->RenderHeight; + g_ddraw.upscale_hack_width = w2_width; + g_ddraw.upscale_hack_height = w2_height; InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } From 5bd886435015b99b1ac534006681de551ba63536 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 01:12:11 +0200 Subject: [PATCH 0206/1053] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0faf14f..8b2deb1 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ cnc-ddraw can fix compatibility issues in older games, such as black screen, bad ### Features - - Supports Windows 2000, XP, Vista, 7, 8, 10, 11, Wine (Linux/macOS) and Virtual Machines + - Supports Windows 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 From e14515035b48e74af85c64f3b774e42a89a14fe0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 01:12:43 +0200 Subject: [PATCH 0207/1053] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b2deb1..30cb84f 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # cnc-ddraw -cnc-ddraw can fix compatibility issues in older 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.   From 5a3e1ad49b55af6fda989838d9d845e61aa6abb3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 22:16:29 +0200 Subject: [PATCH 0208/1053] update vhack comments with worms2 support --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 49118e5..70079d0 100644 --- a/src/config.c +++ b/src/config.c @@ -228,7 +228,7 @@ 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" - "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" + "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1, Worms 2 and KKND Xtreme)\n" "vhack=false\n" "\n" "; Where should screenshots be saved\n" From da3de43f446fda5e999084043ed58492cdba0822 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 9 May 2024 22:17:27 +0200 Subject: [PATCH 0209/1053] enable d3d9 filter for vhack --- src/render_d3d9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index c1875b4..05f29b9 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -452,7 +452,7 @@ static BOOL d3d9_set_states() 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_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack); err = err || FAILED( IDirect3DDevice9_SetPixelShader( From 47e1af94d0a34803dd8ff2a3aa075e2ecd5d0786 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 00:03:14 +0200 Subject: [PATCH 0210/1053] fix warning with gcc --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 9afa971..0a87f08 100644 --- a/src/utils.c +++ b/src/utils.c @@ -649,7 +649,7 @@ BOOL util_detect_low_res_screen() DWORD Unk8; PCHAR UnkC; LPDIRECTDRAW lpDD; - } W2DDSTRUCT, * LPW2DDSTRUCT; + } * LPW2DDSTRUCT; static int* in_movie = (int*)0x00665F58; static int* is_vqa_640 = (int*)0x0065D7BC; From c90af52dac4be7fe14da2f915bb458ac39a07632 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 02:43:40 +0200 Subject: [PATCH 0211/1053] remove unused psapi header --- Makefile | 2 +- src/hook.c | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 3daa0b7..3371861 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ TARGET = ddraw.dll LDFLAGS = -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS = -Iinc -O2 -march=i486 -Wall -LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 +LIBS = -lgdi32 -lwinmm -ldbghelp -lole32 CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/src/hook.c b/src/hook.c index 653e891..4ea34b7 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,7 +1,6 @@ #define WIN32_LEAN_AND_MEAN #include #include -#include #include "directinput.h" #include "dd.h" #include "winapi_hooks.h" From 175d2f5458944ebdf29761d69b924b918dfb828c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 10 May 2024 07:05:51 +0200 Subject: [PATCH 0212/1053] add inline functions for RTM versions --- inc/versionhelpers.h | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 3e539c7..8acf6f5 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -36,12 +36,12 @@ void verhelp_wine_get_host_version(const char** sysname, const char** release); VERSIONHELPERAPI IsWindowsVersionOrGreater(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, + 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_GREATER_EQUAL), - VER_MINORVERSION,VER_GREATER_EQUAL), - VER_BUILDNUMBER,VER_GREATER_EQUAL), + VER_MAJORVERSION, VER_GREATER_EQUAL), + VER_MINORVERSION, VER_GREATER_EQUAL), + VER_BUILDNUMBER, VER_GREATER_EQUAL), VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); } @@ -56,6 +56,17 @@ VERSIONHELPERAPI IsWindowsVersion(DWORD major, DWORD minor, DWORD build, WORD se VER_SERVICEPACKMAJOR, VER_EQUAL)); } +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, + VER_MAJORVERSION, VER_EQUAL), + VER_MINORVERSION, VER_EQUAL), + VER_BUILDNUMBER, VER_GREATER_EQUAL), + VER_SERVICEPACKMAJOR, VER_GREATER_EQUAL)); +} + VERSIONHELPERAPI IsWindowsXPOrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -118,6 +129,10 @@ VERSIONHELPERAPI IsWindowsServer(void) { } VERSIONHELPERAPI IsWindowsXP(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0); +} + +VERSIONHELPERAPI IsWindowsXPRTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WINXP), LOBYTE(_WIN32_WINNT_WINXP), 0, 0); } @@ -134,6 +149,10 @@ VERSIONHELPERAPI IsWindowsXPSP3(void) { } VERSIONHELPERAPI IsWindowsVista(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0); +} + +VERSIONHELPERAPI IsWindowsVistaRTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_VISTA), LOBYTE(_WIN32_WINNT_VISTA), 0, 0); } @@ -146,6 +165,10 @@ VERSIONHELPERAPI IsWindowsVistaSP2(void) { } VERSIONHELPERAPI IsWindows7(void) { + return IsWindowsVersionAnySP(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0); +} + +VERSIONHELPERAPI IsWindows7RTM(void) { return IsWindowsVersion(HIBYTE(_WIN32_WINNT_WIN7), LOBYTE(_WIN32_WINNT_WIN7), 0, 0); } From 518b940365137a99b9f787002d6ac31a52348efb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 12 May 2024 21:35:28 +0200 Subject: [PATCH 0213/1053] add hack for games that require the cursor to be in the exact center of the screen (Worms 2 / Atlantis) --- inc/config.h | 1 + src/config.c | 4 ++++ src/dd.c | 19 +++++++++++++++---- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/inc/config.h b/inc/config.h index badf4fe..ec737eb 100644 --- a/inc/config.h +++ b/inc/config.h @@ -75,6 +75,7 @@ typedef struct CNCDDRAWCONFIG int custom_height; int min_font_size; BOOL direct3d_passthrough; + BOOL center_cursor_fix; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 70079d0..624f12b 100644 --- a/src/config.c +++ b/src/config.c @@ -88,6 +88,7 @@ void cfg_load() GET_INT(g_config.custom_height, "custom_height", 0); 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); /* Hotkeys */ @@ -300,6 +301,7 @@ static void cfg_create_ini() "custom_height=0\n" "min_font_size=0\n" "direct3d_passthrough=false\n" + "center_cursor_fix=false\n" "\n" "\n" "\n" @@ -433,6 +435,7 @@ static void cfg_create_ini() "[ATLANTIS]\n" "renderer=opengl\n" "maxgameticks=60\n" + "center_cursor_fix=true\n" "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" @@ -1052,6 +1055,7 @@ static void cfg_create_ini() "[worms2]\n" "flipclear=true\n" "game_handles_close=true\n" + "center_cursor_fix=true\n" "\n" "; Worms Armageddon\n" "[WA]\n" diff --git a/src/dd.c b/src/dd.c index c71a4d0..3bb332f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -841,10 +841,21 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.render.unscale_w = ((float)g_ddraw.width / g_ddraw.render.viewport.width); g_ddraw.render.unscale_h = ((float)g_ddraw.height / g_ddraw.render.viewport.height); - g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); - g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); - g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); - g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); + /* Hack for games that require the cursor to be in the exact center of the screen (Worms 2 / Atlantis) */ + if (g_config.center_cursor_fix) + { + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width) / (g_ddraw.width)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height) / (g_ddraw.height)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width) / (g_ddraw.render.viewport.width)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height) / (g_ddraw.render.viewport.height)); + } + else + { + g_ddraw.mouse.scale_x = ((float)(g_ddraw.render.viewport.width - 1) / (g_ddraw.width - 1)); + g_ddraw.mouse.scale_y = ((float)(g_ddraw.render.viewport.height - 1) / (g_ddraw.height - 1)); + g_ddraw.mouse.unscale_x = ((float)(g_ddraw.width - 1) / (g_ddraw.render.viewport.width - 1)); + g_ddraw.mouse.unscale_y = ((float)(g_ddraw.height - 1) / (g_ddraw.render.viewport.height - 1)); + } g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; From 9897ffbd57a69d490c51e0ad0db81df1c2d35e80 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 03:03:44 +0200 Subject: [PATCH 0214/1053] remove old WM_MOVE hack --- src/dd.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 3bb332f..8e9699e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1125,7 +1125,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if ((dwFlags & SDM_MODE_SET_BY_GAME) && !g_config.infantryhack) { real_SendMessageA(g_ddraw.hwnd, WM_SIZE_DDRAW, 0, MAKELPARAM(g_ddraw.width, g_ddraw.height)); - real_SendMessageA(g_ddraw.hwnd, WM_MOVE_DDRAW, 0, MAKELPARAM(0, 0)); real_SendMessageA(g_ddraw.hwnd, WM_DISPLAYCHANGE_DDRAW, g_ddraw.bpp, MAKELPARAM(g_ddraw.width, g_ddraw.height)); } From 70f0264b1918947bd0a321fee746d6979ca866e7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 03:05:31 +0200 Subject: [PATCH 0215/1053] add preset for new FreeInfantry.exe --- src/config.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 624f12b..fb13051 100644 --- a/src/config.c +++ b/src/config.c @@ -779,12 +779,18 @@ static void cfg_create_ini() "[i76]\n" "adjmouse=true\n" "\n" - "; Infantry Online\n" + "; Infantry\n" "[infantry]\n" "resolutions=2\n" "infantryhack=true\n" "max_resolutions=90\n" "\n" + "; Infantry Steam\n" + "[FreeInfantry]\n" + "resolutions=2\n" + "infantryhack=true\n" + "max_resolutions=90\n" + "\n" "; Jagged Alliance 2\n" "[ja2]\n" "singlecpu=false\n" From 8de39f6590e4e02cc212fb2331f6b7754a7014b1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 04:21:54 +0200 Subject: [PATCH 0216/1053] enable vhack by default for worms 2 --- src/config.c | 1 + src/dd.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index fb13051..fdabd7c 100644 --- a/src/config.c +++ b/src/config.c @@ -1059,6 +1059,7 @@ static void cfg_create_ini() "\n" "; Worms 2\n" "[worms2]\n" + "vhack=true\n" "flipclear=true\n" "game_handles_close=true\n" "center_cursor_fix=true\n" diff --git a/src/dd.c b/src/dd.c index 8e9699e..bd54438 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1214,8 +1214,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) } else if (g_ddraw.isworms2) { - g_ddraw.upscale_hack_width = 80; - g_ddraw.upscale_hack_height = 60; + if (memcmp((char*)GetModuleHandleA(NULL) + 0x00010000, "\x17\x81\xC2\x00\x80\x00\x00\x89", 8) != 0) + { + g_ddraw.isworms2 = FALSE; + } + else + { + g_ddraw.upscale_hack_width = 80; + g_ddraw.upscale_hack_height = 60; + } } if (g_config.vhack && !g_ddraw.isredalert && !g_ddraw.iscnc1 && !g_ddraw.iskkndx && !g_ddraw.isworms2) From 82627161944da2726de9f3536a3c9905d1358673 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 04:32:40 +0200 Subject: [PATCH 0217/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 5d0330d..ba7b0eb 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 3 +#define VERSION_MINOR 4 #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 5eb1f00b9f244b8b41e176cf490e86f2af8f8ce1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:14:07 +0200 Subject: [PATCH 0218/1053] #309 Add possible fix for Nancy Draw: Last Train to Blue Moon Canyon SetSurfaceDesc() error --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index d1a1b24..e6770a4 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1227,7 +1227,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - if ((lpDDSD->dwFlags & req_flags) != req_flags) + if (((lpDDSD->dwFlags & req_flags) != req_flags) && (lpDDSD->dwFlags & DDSD_ALL) == 0) return DDERR_UNSUPPORTED; From 32f508cba3ffd4d684b5aec5d9ac133620940047 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:18:25 +0200 Subject: [PATCH 0219/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ba7b0eb..d5fef35 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #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 fdcf9a7d1a7ea1b3273bc2d80339f28ada7d4f19 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 13 May 2024 05:45:50 +0200 Subject: [PATCH 0220/1053] #309 Fix for Nancy Draw: Last Train to Blue Moon Canyon "SetSurfaceDesc() error" --- src/ddsurface.c | 69 ++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 26 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index e6770a4..8b6ae1d 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1225,9 +1225,7 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD dbg_dump_dds_flags(lpDDSD->dwFlags); dbg_dump_dds_caps(lpDDSD->ddsCaps.dwCaps); - DWORD req_flags = DDSD_LPSURFACE | DDSD_PITCH | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; - - if (((lpDDSD->dwFlags & req_flags) != req_flags) && (lpDDSD->dwFlags & DDSD_ALL) == 0) + if ((lpDDSD->dwFlags & DDSD_LPSURFACE) == 0) return DDERR_UNSUPPORTED; @@ -1262,32 +1260,51 @@ HRESULT dds_SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD This->mapping = NULL; } - - switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) + if (lpDDSD->dwFlags & DDSD_PIXELFORMAT) { - case 8: - This->bpp = 8; - break; - case 15: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - case 16: - This->bpp = 16; - break; - case 24: - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - case 32: - This->bpp = 32; - break; - default: - This->bpp = 8; - TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); - break; + switch (lpDDSD->ddpfPixelFormat.dwRGBBitCount) + { + case 0: + break; + case 8: + This->bpp = 8; + break; + case 15: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 16: + This->bpp = 16; + break; + case 24: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + case 32: + This->bpp = 32; + break; + default: + TRACE(" NOT_IMPLEMENTED bpp=%u\n", lpDDSD->ddpfPixelFormat.dwRGBBitCount); + break; + } + } + + if (lpDDSD->dwFlags & DDSD_WIDTH) + { + This->width = lpDDSD->dwWidth; + } + + if (lpDDSD->dwFlags & DDSD_HEIGHT) + { + This->height = lpDDSD->dwHeight; + } + + if (lpDDSD->dwFlags & DDSD_PITCH) + { + This->pitch = lpDDSD->lPitch; + } + + if (lpDDSD->dwFlags & DDSD_LPSURFACE) + { + This->surface = lpDDSD->lpSurface; } - This->width = lpDDSD->dwWidth; - This->height = lpDDSD->dwHeight; - This->surface = lpDDSD->lpSurface; - This->pitch = lpDDSD->lPitch; This->bytes_pp = This->bpp / 8; This->size = This->pitch * This->height; This->custom_buf = TRUE; From 0ad0e740432304c5e38acf370298057d2c7d02b5 Mon Sep 17 00:00:00 2001 From: Afevis Date: Wed, 15 May 2024 17:44:34 -0400 Subject: [PATCH 0221/1053] Adds supported games --- README.md | 156 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 127 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 30cb84f..655624f 100644 --- a/README.md +++ b/README.md @@ -57,37 +57,135 @@ Some games may require additional steps before they can be used with cnc-ddraw,   ### Supported Games - - - Command & Conquer Gold - - Command & Conquer: Red Alert - - Command & Conquer: Tiberian Sun - - Command & Conquer: Red Alert 2 - - Captain Claw - - Carmageddon - - Carmageddon 2 - - Warcraft 2 - - StarCraft - - Diablo - - Diablo 2 - - Age of Empires - - Age of Empires II - - Theme Hospital - - Populous: The Beginning - - Outlaws - - Dungeon Keeper - - Dark Reign: The Future of War - - Star Wars: Galactic Battlegrounds - - Atomic Bomberman - - Dune 2000 - - Oddworld: Abe's Oddysee - - Commandos - - Red Baron 3D - - F-16 Multirole Fighter - - F-22 Raptor - - Nox +- Age of Empires +- Age of Empires II +- Age of Wonders +- Age of Wonders 2 +- Age of Wonders: Shadow Magic +- Alien Nations +- American Conquest (Steam+GOG) +- Amerzone +- Anstoss 3 +- Arcanum +- Atomic Bomberman +- Atrox +- Baldr Force EXE +- Baldur's Gate +- Baldur's Gate 2 +- Blade & Sword +- Caesar III (Sierra - 1998) +- Capitalism II +- Capitalism Lab +- Captain Claw +- Carmageddon +- Carmageddon 2 +- Casino Empire (AKA Hoyle Casino) +- Chaos Gate +- Command & Conquer Gold +- Command & Conquer: Red Alert +- Command & Conquer: Red Alert 2 +- Command & Conquer: Red Alert 2: Yuri's Revenge +- Command & Conquer: Tiberian Sun +- Commandos +- Corsairs Gold +- Cossacks (Steam+GOG) +- Dark Reign: The Future of War +- Daytona USA (Sega - 1996) +- Desperados: Wanted Dead or Alive +- Diablo +- Diablo 2 + Lord of Destruction +- Divine Divinity +- Dragon Throne: Battle of Red Cliffs +- Dune 2000 +- Dungeon Keeper +- Dungeon Keeper 2 +- Economic War +- Eggsucker +- Enemy Infestation +- EV Nova +- F-16 Multirole Fighter +- F-22 Raptor +- Fairy Tale About Father Frost, Ivan and Nastya +- Fallout +- Fallout 2 +- Future Cop L.A.P.D +- Grand Theft Auto +- Gruntz +- Hearts of Iron 2 +- Heroes of Might and Magic III +- Heroes of Might and Magic IV +- Hooligans: Storm over Europe +- Hugo Gold +- Hugo Wild River +- Icewind Dale 2 +- Infantry Online +- Jagged Alliance 2 +- Jagged Alliance 2: Unfinished Business +- Jagged Alliance 2: Wildfire +- KKND Xtreme +- KKND2: Krossfire +- Knights and Merchants +- Kohan: Immortal Sovereigns +- Lionheart +- Locomotion +- LodePNG +- Mech Warrior 3 +- Megaman X4 +- Microsoft Detours +- Moorhuhn +- Moorhuhn 2 +- Nancy Drew: Secrets Can Kill +- Nancy Drew: Stay Tuned For Danger +- Need For Speed: High Stakes +- Need For Speed: III Hot Pursuit +- New Robinson +- NexusTk +- Nox +- Nox (Westwood - 2000) +- Oddworld: Abe's Exoddus +- Oddworld: Abe's Oddysee +- Outlaws +- Outlive +- Pharaoh (Sierra - 1999) +- Populous: The Beginning +- Quest for Glory 5 +- Rage of Mages 2 +- Red Baron 3D +- Reksio and the Pirate Treasure (aka Reksio si Comoara Piratilor) +- Road Rash +- RollerCoaster Tycoon +- Settlers 3 +- Sim City 3000 +- Sim Copter +- Sim Theme Park (aka Theme Park World) +- Sole Survivor +- Space Rangers +- Star Wars Jedi Knight: Dark Forces II +- Star Wars: Galactic Battlegrounds +- StarCraft +- Starship Titanic +- Start Trek Armada +- Steel Panthers: World At War +- Stronghold Crusader HD +- Theme Hospital +- Three Kingdoms: Fate of the Dragon +- Total Annihilation +- Total Annihilation (Unofficial Beta Patch v3.9.02) +- Total Annihilation: Kingdoms +- Twisted Metal +- Twisted Metal 2 +- Tzar: The Burden of the Crown +- Vermeer +- Virtua Fighter PC +- War Wind +- Warcraft 2 +- Wizardry 8 +- Wizards and Warriors +- Worms 2 +- Zeus: Master of Olympus - ... -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 instructions above. +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. [![](https://img.shields.io/github/downloads/FunkyFr3sh/cnc-ddraw/total)](https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip) From 219da4771486bbcd427486b0a8089413162fd92c Mon Sep 17 00:00:00 2001 From: Afevis Date: Wed, 15 May 2024 17:47:43 -0400 Subject: [PATCH 0222/1053] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 655624f..2b74eb3 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed: High Stakes -- Need For Speed: III Hot Pursuit +- Need For Speed III: Hot Pursuit - New Robinson - NexusTk - Nox From 0eee142a684abf910b8ad1047fc55e3208c2a7f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 15 May 2024 23:59:47 +0200 Subject: [PATCH 0223/1053] remove LodePNG and Detours from the list (they're no games, they're 3rd party libraries) --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 2b74eb3..f1e2b1f 100644 --- a/README.md +++ b/README.md @@ -128,10 +128,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Lionheart - Locomotion -- LodePNG - Mech Warrior 3 - Megaman X4 -- Microsoft Detours - Moorhuhn - Moorhuhn 2 - Nancy Drew: Secrets Can Kill From 96fdf3021a6baff24ab31f0d9b463489293c3fb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 00:44:36 +0200 Subject: [PATCH 0224/1053] add all games I currently have installed --- README.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f1e2b1f..cbda751 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 +- Balls Of Steel - Blade & Sword - Caesar III (Sierra - 1998) - Capitalism II @@ -87,8 +88,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Red Alert 2: Yuri's Revenge - Command & Conquer: Tiberian Sun - Commandos +- Commandos - Beyond The Call Of Duty - Corsairs Gold - Cossacks (Steam+GOG) +- Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Desperados: Wanted Dead or Alive @@ -112,6 +115,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Grand Theft Auto - Gruntz - Hearts of Iron 2 +- Heroes of Might and Magic II - Heroes of Might and Magic III - Heroes of Might and Magic IV - Hooligans: Storm over Europe @@ -126,16 +130,17 @@ Some games may require additional steps before they can be used with cnc-ddraw, - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns -- Lionheart +- Lionheart - Legacy of the Crusader - Locomotion - Mech Warrior 3 - Megaman X4 - Moorhuhn - Moorhuhn 2 +- Moorhuhn Winter Editon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Need For Speed: High Stakes - Need For Speed III: Hot Pursuit +- Need For Speed: High Stakes - New Robinson - NexusTk - Nox @@ -145,13 +150,20 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pharaoh (Sierra - 1999) +- Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Quest for Glory 5 - Rage of Mages 2 - Red Baron 3D -- Reksio and the Pirate Treasure (aka Reksio si Comoara Piratilor) +- Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) +- Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) +- Reksio and the Pirate Treasure (AKA Reksio si Comoara Piratilor) +- Reksio and the Time Machine (AKA Reksio si Masina Timpului) +- Reksio and the UFO (AKA Reksio si OZN-ul) +- Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Septerra Core - Settlers 3 - Sim City 3000 - Sim Copter @@ -165,6 +177,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Start Trek Armada - Steel Panthers: World At War - Stronghold Crusader HD +- Stronghold HD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation From 10f4d8b4847e006d97eb3366e215f2fed54e075b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 01:20:13 +0200 Subject: [PATCH 0225/1053] allow custom amount of framebuffers --- inc/render_ogl.h | 5 +- src/render_ogl.c | 138 ++++++++++++++++++++++++----------------------- 2 files changed, 75 insertions(+), 68 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 4de364f..9c594c4 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -5,6 +5,7 @@ #include "opengl_utils.h" #define TEXTURE_COUNT 4 +#define FBO_COUNT 1 typedef struct OGLRENDERER { @@ -26,8 +27,8 @@ typedef struct OGLRENDERER GLuint main_vbos[3]; GLuint main_vao; GLint frame_count_uni_loc; - GLuint frame_buffer_id; - GLuint frame_buffer_tex_id; + GLuint frame_buffer_id[FBO_COUNT]; + GLuint frame_buffer_tex_id[FBO_COUNT]; GLint scale_tex_coord_attr_loc; GLuint scale_vbos[3]; GLuint scale_vao; diff --git a/src/render_ogl.c b/src/render_ogl.c index 8e50e38..7226e15 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -570,76 +570,82 @@ static void ogl_init_scale_program() }; glUniformMatrix4fv(glGetUniformLocation(g_ogl.scale_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); - glGenFramebuffers(1, &g_ogl.frame_buffer_id); - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); + glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); + glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - glGenTextures(1, &g_ogl.frame_buffer_tex_id); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); - glTexImage2D( - GL_TEXTURE_2D, - 0, - GL_RGBA8, - g_ogl.surface_tex_width, - g_ogl.surface_tex_height, - 0, - GL_RGBA, - GL_UNSIGNED_BYTE, - g_ogl.surface_tex); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id, 0); - - GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; - glDrawBuffers(1, draw_buffers); - - if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) + for (int i = 0; i < FBO_COUNT; i++) { - glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[i]); - if (glDeleteFramebuffers) - glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, g_ogl.filter_bilinear ? GL_LINEAR : GL_NEAREST); + glTexImage2D( + GL_TEXTURE_2D, + 0, + GL_RGBA8, + g_ogl.surface_tex_width, + g_ogl.surface_tex_height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + g_ogl.surface_tex); - if (glDeleteProgram) - glDeleteProgram(g_ogl.scale_program); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); - g_ogl.scale_program = 0; + GLenum draw_buffers[1] = { GL_COLOR_ATTACHMENT0 }; + glDrawBuffers(1, draw_buffers); - if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); - - if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); - - if (g_ogl.main_program) + if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); - static const GLfloat vertex_coord_pal[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - glBindVertexArray(g_ogl.main_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat tex_coord_pal[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindVertexArray(0); + if (glDeleteFramebuffers) + glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); + + if (glDeleteProgram) + glDeleteProgram(g_ogl.scale_program); + + g_ogl.scale_program = 0; + + if (glDeleteBuffers) + glDeleteBuffers(3, g_ogl.scale_vbos); + + if (glDeleteVertexArrays) + glDeleteVertexArrays(1, &g_ogl.scale_vao); + + if (g_ogl.main_program) + { + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); + static const GLfloat vertex_coord_pal[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord_pal), vertex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_vertex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + + glBindVertexArray(g_ogl.main_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); + GLfloat tex_coord_pal[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord_pal), tex_coord_pal, GL_STATIC_DRAW); + glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + + break; } } @@ -866,7 +872,7 @@ static void ogl_render() glViewport(0, 0, g_ddraw.width, g_ddraw.height); - glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id); + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); glBindVertexArray(g_ogl.main_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); @@ -894,7 +900,7 @@ static void ogl_render() glUseProgram(g_ogl.scale_program); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); static int frames = 1; if (g_ogl.frame_count_uni_loc != -1) @@ -951,13 +957,13 @@ static void ogl_delete_context(HGLRC context) if (g_ogl.scale_program) { - glDeleteTextures(1, &g_ogl.frame_buffer_tex_id); + glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); if (glDeleteBuffers) glDeleteBuffers(3, g_ogl.scale_vbos); if (glDeleteFramebuffers) - glDeleteFramebuffers(1, &g_ogl.frame_buffer_id); + glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); if (glDeleteVertexArrays) glDeleteVertexArrays(1, &g_ogl.scale_vao); From 38f191e0dc4cc4fa2da7d17c781b9868a418d1ca Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:14:56 +0200 Subject: [PATCH 0226/1053] add games from ddraw.ini to readme --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cbda751..e2b53d9 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, ### Supported Games - Age of Empires +- Age of Empires: The Rise of Rome - Age of Empires II +- Age of Empires II: The Conquerors - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic @@ -67,16 +69,27 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Amerzone - Anstoss 3 - Arcanum +- Anno 1602 +- Atlantis +- Atlantis 2 +- Atlantis 3 - Atomic Bomberman - Atrox +- Airline Tycoon Deluxe - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 - Balls Of Steel - Blade & Sword +- Blood II - The Chosen +- Close Combat 2: A Bridge Too Far +- Close Combat 3: The Russian Front +- Close Combat 4: The Battle of the Bulge +- Close Combat 5: Invasion: Normandy - Caesar III (Sierra - 1998) - Capitalism II - Capitalism Lab +- Call To Power 2 - Captain Claw - Carmageddon - Carmageddon 2 @@ -87,6 +100,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Red Alert 2 - Command & Conquer: Red Alert 2: Yuri's Revenge - Command & Conquer: Tiberian Sun +- Command & Conquer: Sole Survivor - Commandos - Commandos - Beyond The Call Of Duty - Corsairs Gold @@ -95,7 +109,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Desperados: Wanted Dead or Alive +- Deadlock 2 - Diablo +- Diablo: Hellfire - Diablo 2 + Lord of Destruction - Divine Divinity - Dragon Throne: Battle of Red Cliffs @@ -105,7 +121,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Economic War - Eggsucker - Enemy Infestation -- EV Nova +- Escape Velocity Nova - F-16 Multirole Fighter - F-22 Raptor - Fairy Tale About Father Frost, Ivan and Nastya @@ -113,7 +129,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout 2 - Future Cop L.A.P.D - Grand Theft Auto +- Grand Theft Auto: London 1969 +- Grand Theft Auto: London 1961 +- Hard Truck: Road to Victory - Gruntz +- G-Police - Hearts of Iron 2 - Heroes of Might and Magic II - Heroes of Might and Magic III @@ -122,6 +142,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hugo Gold - Hugo Wild River - Icewind Dale 2 +- Invictus +- Interstate 76 - Infantry Online - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business @@ -130,26 +152,33 @@ Some games may require additional steps before they can be used with cnc-ddraw, - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns +- Kings Quest 8 +- Konung +- Konung 2 - Lionheart - Legacy of the Crusader - Locomotion - Mech Warrior 3 +- Majesty Gold +- Majesty Gold HD - Megaman X4 - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger +- Nancy Draw: Last Train to Blue Moon Canyon - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson - NexusTk -- Nox - Nox (Westwood - 2000) - Oddworld: Abe's Exoddus - Oddworld: Abe's Oddysee - Outlaws - Outlive - Pharaoh (Sierra - 1999) +- Pax Imperia +- Railroad Tycoon II - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Quest for Glory 5 @@ -168,16 +197,22 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) -- Sole Survivor - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds +- Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft - Starship Titanic - Start Trek Armada - Steel Panthers: World At War +- Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- Shadow Watch +- Shadow Flare +- Uprising +- Uprising 2 +- Shogo - Mobile Armor Division - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -193,7 +228,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Wizardry 8 - Wizards and Warriors - Worms 2 +- Worms Armageddon - Zeus: Master of Olympus +- Poseidon: Master of Atlantis - ... 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 dd80ff4bc0fae85ad6d10c5ad456037e5c3baf30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:17:12 +0200 Subject: [PATCH 0227/1053] sort entries --- README.md | 58 +++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index e2b53d9..9a878f5 100644 --- a/README.md +++ b/README.md @@ -58,49 +58,49 @@ Some games may require additional steps before they can be used with cnc-ddraw, ### Supported Games - Age of Empires -- Age of Empires: The Rise of Rome - Age of Empires II - Age of Empires II: The Conquerors +- Age of Empires: The Rise of Rome - Age of Wonders - Age of Wonders 2 - Age of Wonders: Shadow Magic +- Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) - Amerzone +- Anno 1602 - Anstoss 3 - Arcanum -- Anno 1602 - Atlantis - Atlantis 2 - Atlantis 3 - Atomic Bomberman - Atrox -- Airline Tycoon Deluxe - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 - Balls Of Steel - Blade & Sword - Blood II - The Chosen -- Close Combat 2: A Bridge Too Far -- Close Combat 3: The Russian Front -- Close Combat 4: The Battle of the Bulge -- Close Combat 5: Invasion: Normandy - Caesar III (Sierra - 1998) +- Call To Power 2 - Capitalism II - Capitalism Lab -- Call To Power 2 - Captain Claw - Carmageddon - Carmageddon 2 - Casino Empire (AKA Hoyle Casino) - Chaos Gate +- Close Combat 2: A Bridge Too Far +- Close Combat 3: The Russian Front +- Close Combat 4: The Battle of the Bulge +- Close Combat 5: Invasion: Normandy - Command & Conquer Gold - Command & Conquer: Red Alert - Command & Conquer: Red Alert 2 - Command & Conquer: Red Alert 2: Yuri's Revenge -- Command & Conquer: Tiberian Sun - Command & Conquer: Sole Survivor +- Command & Conquer: Tiberian Sun - Commandos - Commandos - Beyond The Call Of Duty - Corsairs Gold @@ -108,11 +108,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) -- Desperados: Wanted Dead or Alive - Deadlock 2 +- Desperados: Wanted Dead or Alive - Diablo -- Diablo: Hellfire - Diablo 2 + Lord of Destruction +- Diablo: Hellfire - Divine Divinity - Dragon Throne: Battle of Red Cliffs - Dune 2000 @@ -128,12 +128,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout - Fallout 2 - Future Cop L.A.P.D -- Grand Theft Auto -- Grand Theft Auto: London 1969 -- Grand Theft Auto: London 1961 -- Hard Truck: Road to Victory -- Gruntz - G-Police +- Grand Theft Auto +- Grand Theft Auto: London 1961 +- Grand Theft Auto: London 1969 +- Gruntz +- Hard Truck: Road to Victory - Hearts of Iron 2 - Heroes of Might and Magic II - Heroes of Might and Magic III @@ -142,31 +142,31 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hugo Gold - Hugo Wild River - Icewind Dale 2 -- Invictus -- Interstate 76 - Infantry Online +- Interstate 76 +- Invictus - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire +- Kings Quest 8 - KKND Xtreme - KKND2: Krossfire - Knights and Merchants - Kohan: Immortal Sovereigns -- Kings Quest 8 - Konung - Konung 2 - Lionheart - Legacy of the Crusader - Locomotion -- Mech Warrior 3 - Majesty Gold - Majesty Gold HD +- Mech Warrior 3 - Megaman X4 - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon +- Nancy Draw: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Draw: Last Train to Blue Moon Canyon - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson @@ -176,13 +176,14 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Oddworld: Abe's Oddysee - Outlaws - Outlive -- Pharaoh (Sierra - 1999) - Pax Imperia -- Railroad Tycoon II +- Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning +- Poseidon: Master of Atlantis - Quest for Glory 5 - Rage of Mages 2 +- Railroad Tycoon II - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -194,6 +195,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - RollerCoaster Tycoon - Septerra Core - Settlers 3 +- Shadow Flare +- Shadow Watch +- Shogo - Mobile Armor Division - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) @@ -208,11 +212,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD -- Shadow Watch -- Shadow Flare -- Uprising -- Uprising 2 -- Shogo - Mobile Armor Division - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -221,6 +220,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown +- Uprising +- Uprising 2 - Vermeer - Virtua Fighter PC - War Wind @@ -230,7 +231,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus -- Poseidon: Master of Atlantis - ... 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 f0c4c91cd302a6a5e684e09eb4fb43b130cb9671 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:17:52 +0200 Subject: [PATCH 0228/1053] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9a878f5..fab5559 100644 --- a/README.md +++ b/README.md @@ -164,7 +164,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Draw: Last Train to Blue Moon Canyon +- Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit From c3bab6f2e4c8aed968b8370348335af45b5d8147 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:49:18 +0200 Subject: [PATCH 0229/1053] add few more game names taken from issues --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fab5559..9c4f2c1 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Commandos - Beyond The Call Of Duty - Corsairs Gold - Cossacks (Steam+GOG) +- Cultures - The Discovery of Vinland - Cultures 2 - Dark Reign: The Future of War - Daytona USA (Sega - 1996) @@ -115,6 +116,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Diablo: Hellfire - Divine Divinity - Dragon Throne: Battle of Red Cliffs +- DuelSavior +- DuelSavior: Justice - Dune 2000 - Dungeon Keeper - Dungeon Keeper 2 @@ -127,6 +130,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fairy Tale About Father Frost, Ivan and Nastya - Fallout - Fallout 2 +- Final fantasy VII +- Final fantasy VIII - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -164,7 +169,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Drew: Last Train to Blue Moon Canyon +- Nancy Draw: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit @@ -176,6 +181,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Oddworld: Abe's Oddysee - Outlaws - Outlive +- Pacific General - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) @@ -193,6 +199,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Sega Rally +- Sega Touring Car - Septerra Core - Settlers 3 - Shadow Flare @@ -201,6 +209,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim City 3000 - Sim Copter - Sim Theme Park (aka Theme Park World) +- SimCoaster / Theme Park Inc - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds @@ -231,6 +240,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus +- 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 c096e3b683e37c67ec8d5cfcc7b30216241e29dc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 06:49:55 +0200 Subject: [PATCH 0230/1053] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c4f2c1..80cfad3 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon -- Nancy Draw: Last Train to Blue Moon Canyon +- Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Need For Speed III: Hot Pursuit From e6fea47fc7ef9fe12d059ed3e9308f277773bd91 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 07:15:29 +0200 Subject: [PATCH 0231/1053] add some more games from an old list --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index 80cfad3..7dcdf93 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Diablo - Diablo 2 + Lord of Destruction - Diablo: Hellfire +- Disciples +- Disciples 2 - Rise of the Elves - Divine Divinity - Dragon Throne: Battle of Red Cliffs - DuelSavior @@ -134,6 +136,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Final fantasy VIII - Future Cop L.A.P.D - G-Police +- G-POLICE - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 @@ -153,7 +156,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire +- Jazz Jackrabbit 2 +- Killing Time - Kings Quest 8 +- Kings Quest Mask of Eternity - KKND Xtreme - KKND2: Krossfire - Knights and Merchants @@ -162,6 +168,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Konung 2 - Lionheart - Legacy of the Crusader - Locomotion +- Lode Runner 2 - Majesty Gold - Majesty Gold HD - Mech Warrior 3 @@ -169,6 +176,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon +- Moto Racer +- Moto Racer 2 - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger @@ -182,11 +191,14 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pacific General +- Patrician 3 - Pax Imperia - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Poseidon: Master of Atlantis +- Pro Pinball - Big Race USA +- Pro Pinball - Fantastic Journey - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -199,6 +211,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and the Wizards (AKA Reksio si Magicienii) - Road Rash - RollerCoaster Tycoon +- Sanitarium - Sega Rally - Sega Touring Car - Septerra Core @@ -210,6 +223,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Sim Copter - Sim Theme Park (aka Theme Park World) - SimCoaster / Theme Park Inc +- Sonic 3D Blast - Space Rangers - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds @@ -234,7 +248,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Vermeer - Virtua Fighter PC - War Wind +- War Wind II - Human Onslaught - Warcraft 2 +- Warlords 3: Darklords Rising +- Warlords Battlecry +- Warlords Battlecry 2 +- Warlords Battlecry 3 - Wizardry 8 - Wizards and Warriors - Worms 2 From 0d1c635a84727185c91f1e1475b72200de838f5f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 07:17:08 +0200 Subject: [PATCH 0232/1053] remove duplicate entries --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 7dcdf93..2bb28e3 100644 --- a/README.md +++ b/README.md @@ -136,7 +136,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Final fantasy VIII - Future Cop L.A.P.D - G-Police -- G-POLICE - Grand Theft Auto - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 @@ -158,8 +157,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Jagged Alliance 2: Wildfire - Jazz Jackrabbit 2 - Killing Time -- Kings Quest 8 -- Kings Quest Mask of Eternity +- Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire - Knights and Merchants From d2d0be1264c2fe09fedc592dfc19cafa626a0f25 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 16 May 2024 21:08:47 +0200 Subject: [PATCH 0233/1053] don't hook new mesa3d libs --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 4ea34b7..f25b020 100644 --- a/src/hook.c +++ b/src/hook.c @@ -516,6 +516,8 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) /* Don't hook reshade/swiftshader/mesa3d */ if (_strcmpi(mod_filename, "opengl32") == 0 || + _strcmpi(mod_filename, "libgallium_wgl") == 0 || + _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From de8f51401d91cf9ec56a95d94f84923feb1698c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 17 May 2024 03:34:19 +0200 Subject: [PATCH 0234/1053] Update README.md --- README.md | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 2bb28e3..5aa4f9e 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ 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) 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.   @@ -68,12 +68,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Alien Nations - American Conquest (Steam+GOG) - Amerzone -- Anno 1602 +- Anno 1602: Creation of a New World - Anstoss 3 -- Arcanum -- Atlantis -- Atlantis 2 -- Atlantis 3 +- Arcanum: Of Steamworks and Magick Obscura +- Atlantis: The Lost Tales +- Atlantis 2: Beyond Atlantis +- Atlantis 3: The New World - Atomic Bomberman - Atrox - Baldr Force EXE @@ -103,6 +103,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Command & Conquer: Tiberian Sun - Commandos - Commandos - Beyond The Call Of Duty +- Commandos 2 - Corsairs Gold - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland @@ -112,7 +113,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Deadlock 2 - Desperados: Wanted Dead or Alive - Diablo -- Diablo 2 + Lord of Destruction +- Diablo 2 +- Diablo 2: Lord of Destruction - Diablo: Hellfire - Disciples - Disciples 2 - Rise of the Elves @@ -148,10 +150,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Hooligans: Storm over Europe - Hugo Gold - Hugo Wild River +- Icewind Dale - Icewind Dale 2 - Infantry Online - Interstate 76 -- Invictus +- Invictus: In the Shadow of Olympus - Jagged Alliance 2 - Jagged Alliance 2: Unfinished Business - Jagged Alliance 2: Wildfire @@ -170,6 +173,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Majesty Gold - Majesty Gold HD - Mech Warrior 3 +- Metal Gear Solid - Megaman X4 - Moorhuhn - Moorhuhn 2 @@ -227,6 +231,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft +- StarCraft: Broodwars - Starship Titanic - Start Trek Armada - Steel Panthers: World At War @@ -241,8 +246,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown -- Uprising -- Uprising 2 +- Uprising: Join or Die +- Uprising 2: Lead and Destroy - Vermeer - Virtua Fighter PC - War Wind From 6fbdf136a972222294ad6c7f72b927ed53467d26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 05:19:55 +0200 Subject: [PATCH 0235/1053] =?UTF-8?q?add=20support=20for=20AMD=20FidelityF?= =?UTF-8?q?X=E2=84=A2=20Super=20Resolution=20(FSR),=20xBRZ-multipass=20and?= =?UTF-8?q?=20other=202-pass=20shaders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/render_ogl.h | 15 +- src/render_ogl.c | 414 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 352 insertions(+), 77 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 9c594c4..8033aad 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -5,13 +5,14 @@ #include "opengl_utils.h" #define TEXTURE_COUNT 4 -#define FBO_COUNT 1 +#define FBO_COUNT 2 typedef struct OGLRENDERER { HGLRC context; GLuint main_program; - GLuint scale_program; + GLuint shader1_program; + GLuint shader2_program; BOOL got_error; int surface_tex_width; int surface_tex_height; @@ -29,11 +30,15 @@ typedef struct OGLRENDERER GLint frame_count_uni_loc; GLuint frame_buffer_id[FBO_COUNT]; GLuint frame_buffer_tex_id[FBO_COUNT]; - GLint scale_tex_coord_attr_loc; - GLuint scale_vbos[3]; - GLuint scale_vao; + GLint shader1_tex_coord_attr_loc; + GLint shader2_tex_coord_attr_loc; + GLuint shader1_vbos[3]; + GLuint shader2_vbos[3]; + GLuint shader1_vao; + GLuint shader2_vao; BOOL use_opengl; BOOL filter_bilinear; + BOOL shader2_upscale; } OGLRENDERER; DWORD WINAPI ogl_render_main(void); diff --git a/src/render_ogl.c b/src/render_ogl.c index 7226e15..e2e9f8e 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -17,7 +17,8 @@ static HGLRC ogl_create_context(HDC hdc); static void ogl_build_programs(); static void ogl_create_textures(int width, int height); static void ogl_init_main_program(); -static void ogl_init_scale_program(); +static void ogl_init_shader1_program(); +static void ogl_init_shader2_program(); static void ogl_render(); static void ogl_delete_context(HGLRC context); static BOOL ogl_texture_upload_test(); @@ -51,7 +52,8 @@ DWORD WINAPI ogl_render_main(void) ogl_build_programs(); ogl_create_textures(g_ddraw.width, g_ddraw.height); ogl_init_main_program(); - ogl_init_scale_program(); + ogl_init_shader1_program(); + ogl_init_shader2_program(); g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); @@ -131,8 +133,9 @@ static HGLRC ogl_create_context(HDC hdc) static void ogl_build_programs() { - g_ogl.main_program = g_ogl.scale_program = 0; + g_ogl.main_program = g_ogl.shader1_program = g_ogl.shader2_program = 0; + g_ogl.shader2_upscale = FALSE; BOOL core_profile = wglCreateContextAttribsARB != NULL; if (g_oglu_got_version3) @@ -151,11 +154,10 @@ static void ogl_build_programs() } BOOL bilinear = FALSE; + char shader_path[MAX_PATH] = { 0 }; if (g_ogl.main_program) { - char shader_path[MAX_PATH] = { 0 }; - strncpy(shader_path, g_config.shader, sizeof(shader_path)); shader_path[sizeof(shader_path) - 1] = '\0'; /* strncpy fix */ @@ -170,6 +172,7 @@ static void ogl_build_programs() strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || + strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL || strstr(g_config.shader, "xbrz-freescale.glsl") != NULL; if (!is_upscaler || @@ -177,14 +180,19 @@ static void ogl_build_programs() g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack) { - g_ogl.scale_program = oglu_build_program_from_file(shader_path, core_profile); + g_ogl.shader1_program = oglu_build_program_from_file(shader_path, core_profile); - if (!g_ogl.scale_program && + if (g_ogl.shader1_program && strstr(g_config.shader, "xbrz-freescale-multipass.glsl") != NULL) + { + g_ogl.shader2_upscale = TRUE; + } + + if (!g_ogl.shader1_program && (g_ddraw.render.viewport.width != g_ddraw.width || g_ddraw.render.viewport.height != g_ddraw.height || g_config.vhack)) { - g_ogl.scale_program = + g_ogl.shader1_program = oglu_build_program( _stricmp(g_config.shader, "xBR-lv2") == 0 ? XBR_LV2_VERT_SHADER : PASSTHROUGH_VERT_SHADER, @@ -207,6 +215,16 @@ static void ogl_build_programs() g_oglu_got_version3 = FALSE; } + if (g_ogl.shader1_program) + { + if (strlen(shader_path) <= sizeof(shader_path) - 8) + { + strcat(shader_path, ".pass1"); + + g_ogl.shader2_program = oglu_build_program_from_file(shader_path, core_profile); + } + } + g_ogl.filter_bilinear = strstr(g_config.shader, "bilinear.glsl") != NULL || bilinear; } @@ -225,11 +243,14 @@ static void ogl_build_programs() static void ogl_create_textures(int width, int height) { + int w = g_ogl.shader2_program ? max(width, g_ddraw.render.viewport.width) : width; + int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; + g_ogl.surface_tex_width = - width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width; + w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w <= 16384 ? 16384 : w; g_ogl.surface_tex_height = - height <= 512 ? 512 : height <= 1024 ? 1024 : height <= 2048 ? 2048 : height <= 4096 ? 4096 : height; + h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h <= 16384 ? 16384 : h; g_ogl.surface_tex = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); @@ -398,7 +419,7 @@ static void ogl_init_main_program() glGenBuffers(3, g_ogl.main_vbos); - if (g_ogl.scale_program) + if (g_ogl.shader1_program) { glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[0]); static const GLfloat vertex_coord[] = { @@ -477,53 +498,78 @@ static void ogl_init_main_program() } } -static void ogl_init_scale_program() +static void ogl_init_shader1_program() { - if (!g_ogl.scale_program) + if (!g_ogl.shader1_program) return; - glUseProgram(g_ogl.scale_program); + glUseProgram(g_ogl.shader1_program); - GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "VertexCoord"); - g_ogl.scale_tex_coord_attr_loc = glGetAttribLocation(g_ogl.scale_program, "TexCoord"); - g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.scale_program, "FrameCount"); + GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); + g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); + g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); - glGenBuffers(3, g_ogl.scale_vbos); + glGenBuffers(3, g_ogl.shader1_vbos); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); - static const GLfloat vertext_coord[] = { - -1.0f, 1.0f, - 1.0f, 1.0f, - 1.0f,-1.0f, - -1.0f,-1.0f, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + if (g_ogl.shader2_program) + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); + static const GLfloat vertext_coord[] = { + -1.0f,-1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - GLfloat tex_coord[] = { - 0.0f, 0.0f, - g_ogl.scale_w, 0.0f, - g_ogl.scale_w, g_ogl.scale_h, - 0.0f, g_ogl.scale_h, - }; - glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + 0.0f, g_ogl.scale_h, + g_ogl.scale_w, g_ogl.scale_h, + g_ogl.scale_w, 0.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + else + { + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); + static const GLfloat vertext_coord[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertext_coord), vertext_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - glGenVertexArrays(1, &g_ogl.scale_vao); - glBindVertexArray(g_ogl.scale_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 0.0f, g_ogl.scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + } - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[0]); + glGenVertexArrays(1, &g_ogl.shader1_vao); + glBindVertexArray(g_ogl.shader1_vao); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[0]); glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(vertex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.scale_tex_coord_attr_loc); + 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.scale_vbos[2]); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader1_vbos[2]); static const GLushort indices[] = { 0, 1, 2, @@ -542,23 +588,23 @@ static void ogl_init_scale_program() output_size[0] = (float)g_ddraw.render.viewport.width; output_size[1] = (float)g_ddraw.render.viewport.height; - GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize"); + GLint loc = glGetUniformLocation(g_ogl.shader1_program, "OutputSize"); if (loc != -1) glUniform2fv(loc, 1, output_size); - loc = glGetUniformLocation(g_ogl.scale_program, "TextureSize"); + loc = glGetUniformLocation(g_ogl.shader1_program, "TextureSize"); if (loc != -1) glUniform2fv(loc, 1, texture_size); - loc = glGetUniformLocation(g_ogl.scale_program, "InputSize"); + loc = glGetUniformLocation(g_ogl.shader1_program, "InputSize"); if (loc != -1) glUniform2fv(loc, 1, input_size); - loc = glGetUniformLocation(g_ogl.scale_program, "FrameDirection"); + loc = glGetUniformLocation(g_ogl.shader1_program, "FrameDirection"); if (loc != -1) glUniform1i(loc, 1); - loc = glGetUniformLocation(g_ogl.scale_program, "Texture"); + loc = glGetUniformLocation(g_ogl.shader1_program, "Texture"); if (loc != -1) glUniform1i(loc, 0); @@ -568,12 +614,14 @@ static void ogl_init_scale_program() 0,0,1,0, 0,0,0,1, }; - glUniformMatrix4fv(glGetUniformLocation(g_ogl.scale_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); + glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader1_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); glGenFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); glGenTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); - for (int i = 0; i < FBO_COUNT; i++) + int fbo_count = g_ogl.shader2_program ? 2 : 1; + + for (int i = 0; i < fbo_count; i++) { glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[i]); @@ -603,16 +651,24 @@ static void ogl_init_scale_program() if (glDeleteFramebuffers) glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); - if (glDeleteProgram) - glDeleteProgram(g_ogl.scale_program); + glUseProgram(0); - g_ogl.scale_program = 0; + if (glDeleteProgram) + { + glDeleteProgram(g_ogl.shader1_program); + + if (g_ogl.shader2_program) + glDeleteProgram(g_ogl.shader2_program); + } + + g_ogl.shader1_program = 0; + g_ogl.shader2_program = 0; if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); + glDeleteBuffers(3, g_ogl.shader1_vbos); if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); + glDeleteVertexArrays(1, &g_ogl.shader1_vao); if (g_ogl.main_program) { @@ -652,6 +708,110 @@ static void ogl_init_scale_program() glBindFramebuffer(GL_FRAMEBUFFER, 0); } +static void ogl_init_shader2_program() +{ + if (!g_ogl.shader1_program || !g_ogl.shader2_program) + return; + + glUseProgram(g_ogl.shader2_program); + + GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); + g_ogl.shader2_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "TexCoord"); + + glGenBuffers(3, g_ogl.shader2_vbos); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); + GLfloat vertex_coord[] = { + -1.0f, 1.0f, + 1.0f, 1.0f, + 1.0f,-1.0f, + -1.0f,-1.0f, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(vertex_coord), vertex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + float scale_w = g_ogl.shader2_upscale ? g_ogl.scale_w : (float)g_ddraw.render.viewport.width / g_ogl.surface_tex_width; + float scale_h = g_ogl.shader2_upscale ? g_ogl.scale_h : (float)g_ddraw.render.viewport.height / g_ogl.surface_tex_height; + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + scale_w, 0.0f, + scale_w, scale_h, + 0.0f, scale_h, + }; + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + + glGenVertexArrays(1, &g_ogl.shader2_vao); + glBindVertexArray(g_ogl.shader2_vao); + + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[0]); + glVertexAttribPointer(vertex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); + 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); + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_ogl.shader2_vbos[2]); + static const GLushort indices[] = + { + 0, 1, 2, + 0, 2, 3, + }; + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); + + glBindVertexArray(0); + + float input_size[2] = { 0 }, output_size[2] = { 0 }, texture_size[2] = { 0 }; + + input_size[0] = g_ogl.shader2_upscale ? (float)g_ddraw.width : (float)g_ddraw.render.viewport.width; + input_size[1] = g_ogl.shader2_upscale ? (float)g_ddraw.height : (float)g_ddraw.render.viewport.height; + texture_size[0] = (float)g_ogl.surface_tex_width; + texture_size[1] = (float)g_ogl.surface_tex_height; + output_size[0] = (float)g_ddraw.render.viewport.width; + output_size[1] = (float)g_ddraw.render.viewport.height; + + GLint loc = glGetUniformLocation(g_ogl.shader2_program, "OutputSize"); + if (loc != -1) + glUniform2fv(loc, 1, output_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "TextureSize"); + if (loc != -1) + glUniform2fv(loc, 1, texture_size); + + loc = glGetUniformLocation(g_ogl.shader2_program, "InputSize"); + if (loc != -1) + glUniform2fv(loc, 1, input_size); + + 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); + + const float mvp_matrix[16] = { + 1,0,0,0, + 0,1,0,0, + 0,0,1,0, + 0,0,0,1, + }; + glUniformMatrix4fv(glGetUniformLocation(g_ogl.shader2_program, "MVPMatrix"), 1, GL_FALSE, mvp_matrix); +} + static void ogl_render() { BOOL needs_update = FALSE; @@ -820,19 +980,51 @@ static void ogl_render() if (scale_changed) { - if (g_ogl.scale_program && g_ogl.main_program) + if (g_ogl.shader2_upscale && g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) { - glBindVertexArray(g_ogl.scale_vao); - glBindBuffer(GL_ARRAY_BUFFER, g_ogl.scale_vbos[1]); - GLfloat texCoord[] = { + glBindVertexArray(g_ogl.shader2_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader2_vbos[1]); + GLfloat tex_coord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, g_ogl.scale_h, 0.0f, g_ogl.scale_h, }; - glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW); - glVertexAttribPointer(g_ogl.scale_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(g_ogl.scale_tex_coord_attr_loc); + 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); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + else if (g_ogl.shader2_program && g_ogl.shader1_program && g_ogl.main_program) + { + glBindVertexArray(g_ogl.shader1_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + 0.0f, g_ogl.scale_h, + g_ogl.scale_w, g_ogl.scale_h, + 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); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindVertexArray(0); + } + else if (g_ogl.shader1_program && g_ogl.main_program) + { + glBindVertexArray(g_ogl.shader1_vao); + glBindBuffer(GL_ARRAY_BUFFER, g_ogl.shader1_vbos[1]); + GLfloat tex_coord[] = { + 0.0f, 0.0f, + g_ogl.scale_w, 0.0f, + g_ogl.scale_w, g_ogl.scale_h, + 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); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); } @@ -840,13 +1032,13 @@ static void ogl_render() { glBindVertexArray(g_ogl.main_vao); glBindBuffer(GL_ARRAY_BUFFER, g_ogl.main_vbos[1]); - GLfloat texCoord[] = { + GLfloat tex_coord[] = { 0.0f, 0.0f, g_ogl.scale_w, 0.0f, g_ogl.scale_w, g_ogl.scale_h, 0.0f, g_ogl.scale_h, }; - glBufferData(GL_ARRAY_BUFFER, sizeof(texCoord), texCoord, GL_STATIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, sizeof(tex_coord), tex_coord, GL_STATIC_DRAW); glVertexAttribPointer(g_ogl.main_tex_coord_attr_loc, 2, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(g_ogl.main_tex_coord_attr_loc); glBindBuffer(GL_ARRAY_BUFFER, 0); @@ -865,7 +1057,73 @@ static void ogl_render() glActiveTexture(GL_TEXTURE0); } - if (g_ogl.scale_program && g_ogl.main_program) + if (g_ogl.shader1_program && g_ogl.shader2_program && g_ogl.main_program) + { + /* draw surface into framebuffer */ + glUseProgram(g_ogl.main_program); + + glViewport(0, 0, g_ddraw.width, g_ddraw.height); + + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[0]); + + glBindVertexArray(g_ogl.main_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + + /* apply shader1 */ + + if (!g_ogl.shader2_upscale) + { + glViewport(0, 0, g_ddraw.render.viewport.width, g_ddraw.render.viewport.height); + } + + glUseProgram(g_ogl.shader1_program); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + + glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[1]); + + glBindVertexArray(g_ogl.shader1_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + /* apply shader2 */ + + if (g_ddraw.child_window_exists) + { + glViewport(0, g_ddraw.render.height - g_ddraw.height, g_ddraw.width, g_ddraw.height); + } + else + { + glViewport( + g_ddraw.render.viewport.x, + g_ddraw.render.viewport.y + g_ddraw.render.opengl_y_align, + g_ddraw.render.viewport.width, + g_ddraw.render.viewport.height); + } + + glUseProgram(g_ogl.shader2_program); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[1]); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + + glBindVertexArray(g_ogl.shader2_vao); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); + glBindVertexArray(0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + } + else if (g_ogl.shader1_program && g_ogl.main_program) { /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); @@ -898,7 +1156,7 @@ static void ogl_render() /* apply filter */ - glUseProgram(g_ogl.scale_program); + glUseProgram(g_ogl.shader1_program); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); @@ -906,7 +1164,7 @@ static void ogl_render() if (g_ogl.frame_count_uni_loc != -1) glUniform1i(g_ogl.frame_count_uni_loc, frames++); - glBindVertexArray(g_ogl.scale_vao); + glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); } @@ -955,18 +1213,27 @@ static void ogl_delete_context(HGLRC context) if (glUseProgram) glUseProgram(0); - if (g_ogl.scale_program) + if (g_ogl.shader1_program) { glDeleteTextures(FBO_COUNT, g_ogl.frame_buffer_tex_id); if (glDeleteBuffers) - glDeleteBuffers(3, g_ogl.scale_vbos); + glDeleteBuffers(3, g_ogl.shader1_vbos); if (glDeleteFramebuffers) glDeleteFramebuffers(FBO_COUNT, g_ogl.frame_buffer_id); if (glDeleteVertexArrays) - glDeleteVertexArrays(1, &g_ogl.scale_vao); + glDeleteVertexArrays(1, &g_ogl.shader1_vao); + } + + if (g_ogl.shader2_program) + { + if (glDeleteBuffers) + glDeleteBuffers(3, g_ogl.shader2_vbos); + + if (glDeleteVertexArrays) + glDeleteVertexArrays(1, &g_ogl.shader2_vao); } if (glDeleteProgram) @@ -974,8 +1241,11 @@ static void ogl_delete_context(HGLRC context) if (g_ogl.main_program) glDeleteProgram(g_ogl.main_program); - if (g_ogl.scale_program) - glDeleteProgram(g_ogl.scale_program); + if (g_ogl.shader1_program) + glDeleteProgram(g_ogl.shader1_program); + + if (g_ogl.shader2_program) + glDeleteProgram(g_ogl.shader2_program); } if (g_oglu_got_version3) From ec48aac4f9a06fd9fe4d960b9ea89117e95aa787 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 06:20:13 +0200 Subject: [PATCH 0236/1053] add missing frame counter --- inc/render_ogl.h | 3 ++- src/render_ogl.c | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 8033aad..2547ff3 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -27,7 +27,8 @@ typedef struct OGLRENDERER GLint main_vertex_coord_attr_loc; GLuint main_vbos[3]; GLuint main_vao; - GLint frame_count_uni_loc; + GLint shader1_frame_count_uni_loc; + GLint shader2_frame_count_uni_loc; GLuint frame_buffer_id[FBO_COUNT]; GLuint frame_buffer_tex_id[FBO_COUNT]; GLint shader1_tex_coord_attr_loc; diff --git a/src/render_ogl.c b/src/render_ogl.c index e2e9f8e..f3a894c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -507,7 +507,7 @@ static void ogl_init_shader1_program() GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "VertexCoord"); g_ogl.shader1_tex_coord_attr_loc = glGetAttribLocation(g_ogl.shader1_program, "TexCoord"); - g_ogl.frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); + g_ogl.shader1_frame_count_uni_loc = glGetUniformLocation(g_ogl.shader1_program, "FrameCount"); glGenBuffers(3, g_ogl.shader1_vbos); @@ -717,6 +717,7 @@ static void ogl_init_shader2_program() GLint vertex_coord_attr_loc = glGetAttribLocation(g_ogl.shader2_program, "VertexCoord"); 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); @@ -1059,6 +1060,9 @@ static void ogl_render() if (g_ogl.shader1_program && g_ogl.shader2_program && g_ogl.main_program) { + static int frames = 0; + frames++; + /* draw surface into framebuffer */ glUseProgram(g_ogl.main_program); @@ -1088,6 +1092,9 @@ static void ogl_render() glBindFramebuffer(GL_FRAMEBUFFER, g_ogl.frame_buffer_id[1]); + if (g_ogl.shader1_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames); + glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); @@ -1116,6 +1123,9 @@ static void ogl_render() glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); + if (g_ogl.shader2_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader2_frame_count_uni_loc, frames); + glBindVertexArray(g_ogl.shader2_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); glBindVertexArray(0); @@ -1161,8 +1171,8 @@ static void ogl_render() glBindTexture(GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[0]); static int frames = 1; - if (g_ogl.frame_count_uni_loc != -1) - glUniform1i(g_ogl.frame_count_uni_loc, frames++); + if (g_ogl.shader1_frame_count_uni_loc != -1) + glUniform1i(g_ogl.shader1_frame_count_uni_loc, frames++); glBindVertexArray(g_ogl.shader1_vao); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0); From 4d9657cbc89d131345cd2f33f379abf520e125e8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 07:01:07 +0200 Subject: [PATCH 0237/1053] increase dropdown count --- config/ConfigFormUnit.dfm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index a69b94f..1805a5d 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3249,7 +3249,7 @@ object ConfigForm: TConfigForm BevelInner = bvNone BevelOuter = bvSpace Style = csDropDownList - DropDownCount = 10 + DropDownCount = 13 Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 From 2b7699ffdf0bb6334734c5f03401708bc79e8778 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 07:23:09 +0200 Subject: [PATCH 0238/1053] add fsr to known upscalers list --- src/render_ogl.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/render_ogl.c b/src/render_ogl.c index f3a894c..5ff4dd8 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -169,6 +169,7 @@ static void ogl_build_programs() /* detect common upscaling shaders and disable them if no upscaling is required */ BOOL is_upscaler = + strstr(g_config.shader, "fsr.glsl") != NULL || strstr(g_config.shader, "catmull-rom-bilinear.glsl") != NULL || strstr(g_config.shader, "lanczos2-sharp.glsl") != NULL || strstr(g_config.shader, "xbr-lv2-noblend.glsl") != NULL || From 43d4adf282ed859f6aecf0cf488e8b9739f68bb4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 18 May 2024 08:47:54 +0200 Subject: [PATCH 0239/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d5fef35..07aba87 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #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 6b1f08e10882241e26b939ee14425b66a93536ec Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 19 May 2024 06:02:21 +0200 Subject: [PATCH 0240/1053] export DDGetProcAddress so fan patched games have access to the real GetProcAddress --- exports.def | 1 + src/dllmain.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/exports.def b/exports.def index ff672bc..44bfcd8 100644 --- a/exports.def +++ b/exports.def @@ -21,3 +21,4 @@ EXPORTS GameHandlesClose DATA pvBmpBits = FakePrimarySurface DATA DDIsWindowed + DDGetProcAddress diff --git a/src/dllmain.c b/src/dllmain.c index 108c9e0..637f5e5 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -147,6 +147,11 @@ BOOL DDIsWindowed() return g_config.windowed && !g_config.fullscreen; } +FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) +{ + return real_GetProcAddress(hModule, lpProcName); +} + HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); From 4e1b52b97e26bb9182d2da426b719d4d709324b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:03:22 +0200 Subject: [PATCH 0241/1053] #311 add preset for Nancy Drew: Message in a Haunted Mansion --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index fdabd7c..a45fc9d 100644 --- a/src/config.c +++ b/src/config.c @@ -879,6 +879,12 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" + "; Nancy Drew: Message in a Haunted Mansion\n" + "[Game/3]\n" + "checkfile=.\\DataFiles\\ASABYBD.cal\n" + "limit_bltfast=true\n" + "maxgameticks=600\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From e3b05ea108f70cbd7477565b802b3ee37cc0a12b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:05:20 +0200 Subject: [PATCH 0242/1053] update supported games in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5aa4f9e..8458be8 100644 --- a/README.md +++ b/README.md @@ -183,6 +183,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger +- Nancy Drew: Message in a Haunted Mansion +- Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From b55593cb4cbeb4d2eb9ecd5e3087a76b61e481e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:55:23 +0200 Subject: [PATCH 0243/1053] #311 fix fullscreen issues with opengl/gdi in nancy drew games --- src/dd.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dd.c b/src/dd.c index bd54438..c8fa433 100644 --- a/src/dd.c +++ b/src/dd.c @@ -916,6 +916,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_CLIENTEDGE)) + { + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); + } + if (IsWine()) { real_SetWindowLongA( @@ -1019,6 +1026,13 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_TOOLWINDOW)); } + exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); + + if ((exstyle & WS_EX_CLIENTEDGE)) + { + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); + } + BOOL d3d9_active = FALSE; if (g_ddraw.renderer == d3d9_render_main) From accfd91f984e85387ba6efe47e2ef7b5fced1359 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 06:55:36 +0200 Subject: [PATCH 0244/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 07aba87..ee7d471 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 4 #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 07f11bf57795ebdc0e7dd1928acafcdcc699dec2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 21 May 2024 07:03:58 +0200 Subject: [PATCH 0245/1053] keep commented out debug code --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index c8fa433..c183ecc 100644 --- a/src/dd.c +++ b/src/dd.c @@ -991,6 +991,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + //TRACE(" GetWindowLongA style=%p, exstyle=%p\n", real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); + int menu_height = 0; if (GetMenu(g_ddraw.hwnd)) From c18223e80adf5f605327ae694c0a6f7b59b36015 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 04:38:10 +0200 Subject: [PATCH 0246/1053] #292 fix mousei input issues in diablo 1 --- src/winapi_hooks.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6b229ed..b2c4a5f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1353,6 +1353,7 @@ HWND WINAPI fake_CreateWindowExA( g_ddraw.bnet_active = TRUE; mouse_unlock(); + ReleaseCapture(); } POINT pt = { 0, 0 }; From 06290bbe9db8267d4fb6c57a78daecc6ee402c9f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 06:59:17 +0200 Subject: [PATCH 0247/1053] remove balls of steel from supported games list --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 8458be8..2786201 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 -- Balls Of Steel - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) From 504c2eb1c5ac88d4f7fa417e3603260a50a4c9f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 23:23:27 +0200 Subject: [PATCH 0248/1053] add new setting to fake current display mode --- inc/config.h | 2 +- src/config.c | 5 +++-- src/dd.c | 57 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/inc/config.h b/inc/config.h index ec737eb..33b5b7c 100644 --- a/inc/config.h +++ b/inc/config.h @@ -76,6 +76,7 @@ typedef struct CNCDDRAWCONFIG int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; + char fake_mode[128]; /* Hotkeys */ @@ -97,7 +98,6 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; - BOOL vermeer_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a45fc9d..93c0c67 100644 --- a/src/config.c +++ b/src/config.c @@ -89,6 +89,7 @@ void cfg_load() 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)); /* Hotkeys */ @@ -107,7 +108,6 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.vermeer_hack, "vermeer_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -302,6 +302,7 @@ static void cfg_create_ini() "min_font_size=0\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" + ";fake_mode=640x480x32\n" "\n" "\n" "\n" @@ -1055,7 +1056,7 @@ static void cfg_create_ini() "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" - "vermeer_hack=true\n" + "fake_mode=640x480x32\n" "\n" "; Wizardry 8\n" "[Wiz8]\n" diff --git a/src/dd.c b/src/dd.c index c183ecc..a305890 100644 --- a/src/dd.c +++ b/src/dd.c @@ -476,41 +476,56 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) memset(lpDDSurfaceDesc, 0, size); + unsigned long width = 1024; + unsigned long height = 768; + unsigned long bpp = 16; + + if (g_ddraw.width) + { + width = g_ddraw.width; + height = g_ddraw.height; + bpp = g_ddraw.bpp; + } + 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); + bpp = strtoul(e + 1, &e, 0); + } + lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = bpp; lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwHeight = g_ddraw.height ? g_ddraw.height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw.width ? g_ddraw.width : 1024; + lpDDSurfaceDesc->dwWidth = width; + lpDDSurfaceDesc->dwHeight = height; - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - - if (g_ddraw.bpp == 32 || g_config.vermeer_hack) + if (bpp == 32) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } - else if (g_ddraw.bpp != 8) + else if (bpp == 8) + { + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + } + else { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } return DD_OK; @@ -1298,9 +1313,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (g_config.vermeer_hack) + if (g_config.fake_mode[0]) { - dd_SetDisplayMode(640, 480, 16, 0); + char* e = &g_config.fake_mode[0]; + + unsigned long width = strtoul(e, &e, 0); + unsigned long height = strtoul(e + 1, &e, 0); + unsigned long bpp = strtoul(e + 1, &e, 0); + + dd_SetDisplayMode(width, height, bpp, 0); } } From 0cf0533654f4089e6ab8b9776718f5a9c6605b96 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 23:51:48 +0200 Subject: [PATCH 0249/1053] #313 Add partial support for American Girls Dress Designer (Fullscreen only, no upscaling) --- inc/utils.h | 1 + src/config.c | 4 ++++ src/dd.c | 17 ++++++++++++++--- src/utils.c | 8 ++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 253ec11..2263142 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -17,6 +17,7 @@ void util_toggle_maximize(); void util_toggle_fullscreen(); BOOL util_unadjust_window_rect(LPRECT prc, DWORD dwStyle, BOOL fMenu, DWORD dwExStyle); void util_set_window_rect(int x, int y, int width, int height, UINT flags); +BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam); BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lParam); BOOL util_detect_low_res_screen(); diff --git a/src/config.c b/src/config.c index 93c0c67..00f65c9 100644 --- a/src/config.c +++ b/src/config.c @@ -387,6 +387,10 @@ static void cfg_create_ini() "guard_lines=300\n" "minfps=-2\n" "\n" + "; American Girls Dress Designer\n" + "[Dress Designer]\n" + "fake_mode=640x480x32\n" + "\n" "; Age of Wonders 2\n" "[AoW2]\n" "resolutions=2\n" diff --git a/src/dd.c b/src/dd.c index a305890..599e8c4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1166,12 +1166,23 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { dbg_dump_scl_flags(dwFlags); - if (hwnd == NULL) + if (!hwnd) { - return DD_OK; + if (!g_ddraw.hwnd && g_config.fake_mode[0]) + { + EnumThreadWindows(GetCurrentThreadId(), (WNDENUMPROC)util_enum_thread_wnd_proc, 0); + hwnd = g_ddraw.hwnd; + + if (!hwnd) + return DD_OK; + } + else + { + return DD_OK; + } } - if (g_ddraw.hwnd == NULL) + if (!g_ddraw.hwnd) { g_ddraw.hwnd = hwnd; } diff --git a/src/utils.c b/src/utils.c index 0a87f08..6013650 100644 --- a/src/utils.c +++ b/src/utils.c @@ -551,6 +551,14 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) } } +BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) +{ + if (!g_ddraw.hwnd) + g_ddraw.hwnd = hwnd; + + return FALSE; +} + BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; From a3afe9e5982d50d6b89e8f0d8a3bb89f5a28be7a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 07:12:33 +0200 Subject: [PATCH 0250/1053] fix crash in JazzJackrabbit 2 --- src/ddsurface.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index 8b6ae1d..bfc2cc3 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -826,6 +826,17 @@ HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps return DD_OK; } + if (lpDdsCaps->dwCaps & DDSCAPS_FLIP) + { + if (This->backbuffer) + { + IDirectDrawSurface_AddRef(This->backbuffer); + *lpDDsurface = This->backbuffer; + } + + return DD_OK; + } + return DDERR_NOTFOUND; } From c540a1e45c23e2c11c635d7075bd3016f4032f91 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:20:14 +0200 Subject: [PATCH 0251/1053] #314 add preset for JazzJackrabbit2 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 00f65c9..4675db6 100644 --- a/src/config.c +++ b/src/config.c @@ -749,6 +749,12 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Jazz Jackrabbit 2 plus\n" + "[Jazz2]\n" + "keytogglefullscreen=0x08\n" + "custom_width=800\n" + "custom_height=450\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From eed6edfa4e961dbe6869db5547be4545a46558e9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:39:27 +0200 Subject: [PATCH 0252/1053] add preset for nonplus jjr2 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 4675db6..f00039b 100644 --- a/src/config.c +++ b/src/config.c @@ -755,6 +755,12 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" + "; Jazz Jackrabbit 2 plus\n" + "[Jazz2_NonPlus]\n" + "keytogglefullscreen=0x08\n" + "custom_width=800\n" + "custom_height=450\n" + "\n" "; Heroes of Might and Magic II: The Succession Wars\n" "[HEROES2W]\n" "adjmouse=true\n" From 1d4403db57b1d3a1983c90ed7617c8c6603f9846 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 23 May 2024 08:41:33 +0200 Subject: [PATCH 0253/1053] fix name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index f00039b..94bcdc6 100644 --- a/src/config.c +++ b/src/config.c @@ -755,7 +755,7 @@ static void cfg_create_ini() "custom_width=800\n" "custom_height=450\n" "\n" - "; Jazz Jackrabbit 2 plus\n" + "; Jazz Jackrabbit 2\n" "[Jazz2_NonPlus]\n" "keytogglefullscreen=0x08\n" "custom_width=800\n" From c1a14a31d533a9023b463554296c553d9a492d66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 02:26:46 +0200 Subject: [PATCH 0254/1053] add new setting to enable (very bugged) resize in wine --- inc/config.h | 1 + src/config.c | 2 ++ src/dd.c | 2 +- src/wndproc.c | 13 ++++++------- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/inc/config.h b/inc/config.h index 33b5b7c..135f0df 100644 --- a/inc/config.h +++ b/inc/config.h @@ -77,6 +77,7 @@ typedef struct CNCDDRAWCONFIG BOOL direct3d_passthrough; BOOL center_cursor_fix; char fake_mode[128]; + BOOL wine_allow_resize; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 94bcdc6..5af9fa0 100644 --- a/src/config.c +++ b/src/config.c @@ -90,6 +90,7 @@ void cfg_load() 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); /* Hotkeys */ @@ -303,6 +304,7 @@ static void cfg_create_ini() "direct3d_passthrough=false\n" "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" + "wine_allow_resize=false\n" "\n" "\n" "\n" diff --git a/src/dd.c b/src/dd.c index 599e8c4..41aa9aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -938,7 +938,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } - if (IsWine()) + if (!g_config.wine_allow_resize && IsWine()) { real_SetWindowLongA( g_ddraw.hwnd, diff --git a/src/wndproc.c b/src/wndproc.c index 69e9d4b..4f53765 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -431,15 +431,14 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - /* - else if (g_ddraw.wine) + else if (!in_size_move && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) { - WindowRect.right = LOWORD(lParam); - WindowRect.bottom = HIWORD(lParam); - if (WindowRect.right != g_ddraw.render.width || WindowRect.bottom != g_ddraw.render.height) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp); + g_config.window_rect.right = LOWORD(lParam); + g_config.window_rect.bottom = HIWORD(lParam); + + if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) + dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); } - */ } } From 08583924842c92ac1d04405147cc1d3499ffd4e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 04:55:55 +0200 Subject: [PATCH 0255/1053] simplify GetAttachedSurface --- src/ddsurface.c | 26 +++++--------------------- 1 file changed, 5 insertions(+), 21 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bfc2cc3..5471417 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -810,29 +810,13 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa HRESULT dds_GetAttachedSurface(IDirectDrawSurfaceImpl* This, LPDDSCAPS lpDdsCaps, IDirectDrawSurfaceImpl** lpDDsurface) { - if (lpDdsCaps->dwCaps & DDSCAPS_BACKBUFFER) - { - if (This->backbuffer) - { - IDirectDrawSurface_AddRef(This->backbuffer); - *lpDDsurface = This->backbuffer; - } - else - { - IDirectDrawSurface_AddRef(This); - *lpDDsurface = This; - } + if (!lpDdsCaps || !lpDDsurface) + return DDERR_INVALIDPARAMS; - return DD_OK; - } - - if (lpDdsCaps->dwCaps & DDSCAPS_FLIP) + if (This->backbuffer && (This->backbuffer->caps & lpDdsCaps->dwCaps) == lpDdsCaps->dwCaps) { - if (This->backbuffer) - { - IDirectDrawSurface_AddRef(This->backbuffer); - *lpDDsurface = This->backbuffer; - } + IDirectDrawSurface_AddRef(This->backbuffer); + *lpDDsurface = This->backbuffer; return DD_OK; } From 283510f14ca94dd878deb5f612b86e40c4f6ddd1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 05:19:12 +0200 Subject: [PATCH 0256/1053] bump vesion --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index ee7d471..8e7b0a0 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 4 +#define VERSION_MINOR 5 #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 99e0cf8b4adb4a423b0f1fb873bd077ce439b266 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 24 May 2024 22:16:32 +0200 Subject: [PATCH 0257/1053] log CreateWindowExA calls --- inc/debug.h | 1 + src/debug.c | 139 +++++++++++++++++++++++++++++++++++++++++++++ src/winapi_hooks.c | 20 +++++++ 3 files changed, 160 insertions(+) diff --git a/inc/debug.h b/inc/debug.h index f7c81d1..f16a944 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -13,6 +13,7 @@ void dbg_draw_frame_info_start(); void dbg_draw_frame_info_end(); void dbg_printf(const char* fmt, ...); void dbg_init(); +void dbg_dump_wnd_styles(DWORD style, DWORD exstyle); void dbg_dump_swp_flags(DWORD flags); void dbg_dump_ddp_flags(DWORD flags); void dbg_dump_scl_flags(DWORD flags); diff --git a/src/debug.c b/src/debug.c index a25916a..12f9ca3 100644 --- a/src/debug.c +++ b/src/debug.c @@ -278,6 +278,145 @@ void dbg_draw_frame_info_end() g_dbg_frame_time = dbg_counter_stop(); } +void dbg_dump_wnd_styles(DWORD style, DWORD exstyle) +{ +#ifdef _DEBUG + if (style & WS_BORDER) { + TRACE(" WS_BORDER\n"); + } + if (style & WS_CAPTION) { + TRACE(" WS_CAPTION\n"); + } + if (style & WS_CHILD) { + TRACE(" WS_CHILD\n"); + } + if (style & WS_CHILDWINDOW) { + TRACE(" WS_CHILDWINDOW\n"); + } + if (style & WS_CLIPCHILDREN) { + TRACE(" WS_CLIPCHILDREN\n"); + } + if (style & WS_CLIPSIBLINGS) { + TRACE(" WS_CLIPSIBLINGS\n"); + } + if (style & WS_DISABLED) { + TRACE(" WS_DISABLED\n"); + } + if (style & WS_DLGFRAME) { + TRACE(" WS_DLGFRAME\n"); + } + if (style & WS_GROUP) { + TRACE(" WS_GROUP\n"); + } + if (style & WS_HSCROLL) { + TRACE(" WS_HSCROLL\n"); + } + if (style & WS_ICONIC) { + TRACE(" WS_ICONIC\n"); + } + if (style & WS_MAXIMIZE) { + TRACE(" WS_MAXIMIZE\n"); + } + if (style & WS_MAXIMIZEBOX) { + TRACE(" WS_MAXIMIZEBOX\n"); + } + if (style & WS_MINIMIZE) { + TRACE(" WS_MINIMIZE\n"); + } + if (style & WS_MINIMIZEBOX) { + TRACE(" WS_MINIMIZEBOX\n"); + } + if (style & WS_POPUP) { + TRACE(" WS_POPUP\n"); + } + if (style & WS_SIZEBOX) { + TRACE(" WS_SIZEBOX\n"); + } + if (style & WS_SYSMENU) { + TRACE(" WS_SYSMENU\n"); + } + if (style & WS_TABSTOP) { + TRACE(" WS_TABSTOP\n"); + } + if (style & WS_THICKFRAME) { + TRACE(" WS_THICKFRAME\n"); + } + if (style & WS_VISIBLE) { + TRACE(" WS_VISIBLE\n"); + } + if (style & WS_VSCROLL) { + TRACE(" WS_VSCROLL\n"); + } + + if (exstyle & WS_EX_ACCEPTFILES) { + TRACE(" WS_EX_ACCEPTFILES\n"); + } + if (exstyle & WS_EX_APPWINDOW) { + TRACE(" WS_EX_APPWINDOW\n"); + } + if (exstyle & WS_EX_CLIENTEDGE) { + TRACE(" WS_EX_CLIENTEDGE\n"); + } + if (exstyle & WS_EX_COMPOSITED) { + TRACE(" WS_EX_COMPOSITED\n"); + } + if (exstyle & WS_EX_CONTEXTHELP) { + TRACE(" WS_EX_CONTEXTHELP\n"); + } + if (exstyle & WS_EX_CONTROLPARENT) { + TRACE(" WS_EX_CONTROLPARENT\n"); + } + if (exstyle & WS_EX_DLGMODALFRAME) { + TRACE(" WS_EX_DLGMODALFRAME\n"); + } + if (exstyle & WS_EX_LAYERED) { + TRACE(" WS_EX_LAYERED\n"); + } + if (exstyle & WS_EX_LAYOUTRTL) { + TRACE(" WS_EX_LAYOUTRTL\n"); + } + if (exstyle & WS_EX_LEFTSCROLLBAR) { + TRACE(" WS_EX_LEFTSCROLLBAR\n"); + } + if (exstyle & WS_EX_MDICHILD) { + TRACE(" WS_EX_MDICHILD\n"); + } + if (exstyle & WS_EX_NOACTIVATE) { + TRACE(" WS_EX_NOACTIVATE\n"); + } + if (exstyle & WS_EX_NOINHERITLAYOUT) { + TRACE(" WS_EX_NOINHERITLAYOUT\n"); + } + if (exstyle & WS_EX_NOPARENTNOTIFY) { + TRACE(" WS_EX_NOPARENTNOTIFY\n"); + } + //if (exstyle & WS_EX_NOREDIRECTIONBITMAP) { + // TRACE(" WS_EX_NOREDIRECTIONBITMAP\n"); + //} + if (exstyle & WS_EX_RIGHT) { + TRACE(" WS_EX_RIGHT\n"); + } + if (exstyle & WS_EX_RTLREADING) { + TRACE(" WS_EX_RTLREADING\n"); + } + if (exstyle & WS_EX_STATICEDGE) { + TRACE(" WS_EX_STATICEDGE\n"); + } + if (exstyle & WS_EX_TOOLWINDOW) { + TRACE(" WS_EX_TOOLWINDOW\n"); + } + if (exstyle & WS_EX_TOPMOST) { + TRACE(" WS_EX_TOPMOST\n"); + } + if (exstyle & WS_EX_TRANSPARENT) { + TRACE(" WS_EX_TRANSPARENT\n"); + } + if (exstyle & WS_EX_WINDOWEDGE) { + TRACE(" WS_EX_WINDOWEDGE\n"); + } +#endif +} + void dbg_dump_swp_flags(DWORD flags) { #ifdef _DEBUG diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b2c4a5f..737b95b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1285,6 +1285,26 @@ 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) { + TRACE("CreateWindowExA(" + "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " + "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", + dwExStyle, + lpClassName, + lpWindowName, + dwStyle, + X, + Y, + nWidth, + nHeight, + hWndParent, + hMenu, + hInstance, + lpParam); + + TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd); + + dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && From 17a4dde30a12f1ff170469ef54e9ed7f363ccdf1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 03:30:51 +0200 Subject: [PATCH 0258/1053] log return value of CreateWindowExA --- src/winapi_hooks.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 737b95b..b1e6754 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1285,7 +1285,7 @@ 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) { - TRACE("CreateWindowExA(" + TRACE("-> CreateWindowExA(" "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", dwExStyle, @@ -1404,7 +1404,7 @@ HWND WINAPI fake_CreateWindowExA( } } - return real_CreateWindowExA( + HWND hwnd = real_CreateWindowExA( dwExStyle, lpClassName, lpWindowName, @@ -1417,6 +1417,10 @@ HWND WINAPI fake_CreateWindowExA( hMenu, hInstance, lpParam); + + TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd); + + return hwnd; } HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv) From 0bce13b314232813474b1ccc1b4c4c7f5bbbc75b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 03:36:49 +0200 Subject: [PATCH 0259/1053] add Barbie(tm) Beach Vacation(tm) to supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2786201..edbbf29 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Atlantis 3: The New World - Atomic Bomberman - Atrox +- Barbie(tm) Beach Vacation(tm) - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 From 2f2367e5b5602b023b95394e5ed37ccd988ec274 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 25 May 2024 07:29:30 +0200 Subject: [PATCH 0260/1053] hook BitBlt --- inc/hook.h | 2 ++ inc/winapi_hooks.h | 3 +++ src/ddsurface.c | 4 ++-- src/hook.c | 2 ++ src/utils.c | 2 +- src/winapi_hooks.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 52 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ebb7c01..ae3a404 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -45,6 +45,7 @@ typedef BOOL (WINAPI* SHOWWINDOWPROC)(HWND, int); typedef HWND(WINAPI* GETTOPWINDOWPROC)(HWND); typedef HWND(WINAPI* GETFOREGROUNDWINDOWPROC)(); typedef BOOL(WINAPI* STRETCHBLTPROC)(HDC, int, int, int, int, HDC, int, int, int, int, DWORD); +typedef BOOL(WINAPI* BITBLTPROC)(HDC, int, int, int, int, HDC, int, int, DWORD); typedef int (WINAPI* SETDIBITSTODEVICEPROC)( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); @@ -97,6 +98,7 @@ extern SHOWWINDOWPROC real_ShowWindow; extern GETTOPWINDOWPROC real_GetTopWindow; extern GETFOREGROUNDWINDOWPROC real_GetForegroundWindow; extern STRETCHBLTPROC real_StretchBlt; +extern BITBLTPROC real_BitBlt; extern SETDIBITSTODEVICEPROC real_SetDIBitsToDevice; extern STRETCHDIBITSPROC real_StretchDIBits; extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 839eccc..d7e6efe 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -40,6 +40,9 @@ int WINAPI fake_GetDeviceCaps(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); +BOOL WINAPI fake_BitBlt( + HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop); + int WINAPI fake_SetDIBitsToDevice( HDC, int, int, DWORD, DWORD, int, int, UINT, UINT, const VOID*, const BITMAPINFO*, UINT); diff --git a/src/ddsurface.c b/src/ddsurface.c index 5471417..30377ae 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -573,11 +573,11 @@ HRESULT dds_BltFast( } else { - BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); + real_BitBlt(dst_dc, dst_x, dst_y, dst_w, dst_h, src_dc, src_x, src_y, SRCCOPY); } /* - BitBlt( + real_BitBlt( dst_dc, dwX, dwY, diff --git a/src/hook.c b/src/hook.c index f25b020..1b2efb3 100644 --- a/src/hook.c +++ b/src/hook.c @@ -42,6 +42,7 @@ SHOWWINDOWPROC real_ShowWindow = ShowWindow; GETTOPWINDOWPROC real_GetTopWindow = GetTopWindow; GETFOREGROUNDWINDOWPROC real_GetForegroundWindow = GetForegroundWindow; STRETCHBLTPROC real_StretchBlt = StretchBlt; +BITBLTPROC real_BitBlt = BitBlt; SETDIBITSTODEVICEPROC real_SetDIBitsToDevice = SetDIBitsToDevice; STRETCHDIBITSPROC real_StretchDIBits = StretchDIBits; SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; @@ -127,6 +128,7 @@ HOOKLIST g_hook_hooklist[] = { "gdi32.dll", { + { "BitBlt", (PROC)fake_BitBlt, (PROC*)&real_BitBlt, HOOK_SKIP_2 }, { "StretchBlt", (PROC)fake_StretchBlt, (PROC*)&real_StretchBlt, HOOK_SKIP_2 }, { "SetDIBitsToDevice", (PROC)fake_SetDIBitsToDevice, (PROC*)&real_SetDIBitsToDevice, HOOK_SKIP_2 }, { "StretchDIBits", (PROC)fake_StretchDIBits, (PROC*)&real_StretchDIBits, HOOK_SKIP_2 }, diff --git a/src/utils.c b/src/utils.c index 6013650..4d29bfb 100644 --- a/src/utils.c +++ b/src/utils.c @@ -625,7 +625,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&pos, 2); - BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); + real_BitBlt(dst_dc, 0, 0, size.right, size.bottom, src_dc, pos.left, pos.top, SRCCOPY); ReleaseDC(hwnd, dst_dc); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b1e6754..c530b43 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -823,6 +823,48 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +BOOL WINAPI fake_BitBlt( + HDC hdc, + int x, + int y, + int cx, + int cy, + HDC hdcSrc, + int x1, + int y1, + DWORD rop) +{ + if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + { + if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) + { + HDC primary_dc; + dds_GetDC(g_ddraw.primary, &primary_dc); + + if (primary_dc) + { + int result = + real_BitBlt( + primary_dc, + x, + y, + cx, + cy, + hdcSrc, + x1, + y1, + rop); + + dds_ReleaseDC(g_ddraw.primary, primary_dc); + + return result; + } + } + } + + return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop); +} + int WINAPI fake_SetDIBitsToDevice( HDC hdc, int xDest, From 10ec35d458327252f0860091a199863fbca87523 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 02:02:00 +0200 Subject: [PATCH 0261/1053] fix alignment --- src/debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/debug.c b/src/debug.c index 12f9ca3..c9b5d1f 100644 --- a/src/debug.c +++ b/src/debug.c @@ -282,7 +282,7 @@ void dbg_dump_wnd_styles(DWORD style, DWORD exstyle) { #ifdef _DEBUG if (style & WS_BORDER) { - TRACE(" WS_BORDER\n"); + TRACE(" WS_BORDER\n"); } if (style & WS_CAPTION) { TRACE(" WS_CAPTION\n"); From 5bbe1299d2f7d172ba1c582c6e05d2688cfb1eaa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:08:38 +0200 Subject: [PATCH 0262/1053] add test patches for Clue Finders 4th --- inc/wndproc.h | 1 + src/dd.c | 4 +++- src/ddclipper.c | 28 ++++++++++++++++++++++++---- src/ddsurface.c | 14 +++++++++++--- src/wndproc.c | 5 +++++ 5 files changed, 44 insertions(+), 8 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index 3cb6a97..f066a04 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,6 +9,7 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 +#define WM_ACTIVATEAPP_DDRAW WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/dd.c b/src/dd.c index 41aa9aa..709414f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -921,7 +921,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~WS_MAXIMIZE); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); @@ -1003,6 +1003,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); + + real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP_DDRAW, 1, 0); } else { diff --git a/src/ddclipper.c b/src/ddclipper.c index 28fc283..72a87e1 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -66,25 +66,45 @@ HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - /* Keep this commented out until we found a game that actually needs it if (This->hwnd) return DDERR_CLIPPERISUSINGHWND; if (This->region) DeleteObject(This->region); - if (lpClipList) + if (lpClipList && lpClipList->rdh.nCount >= 1) { - This->region = ExtCreateRegion(NULL, 0, lpClipList); + RECT* rc = (RECT*)lpClipList->Buffer; + + This->region = CreateRectRgnIndirect(&rc[0]); if (!This->region) return DDERR_INVALIDCLIPLIST; + + for (int i = 1; i < lpClipList->rdh.nCount; ++i) + { + HRGN region = CreateRectRgnIndirect(&rc[i]); + + if (!region) + return DDERR_INVALIDCLIPLIST; + + if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) + { + DeleteObject(region); + DeleteObject(This->region); + This->region = NULL; + + return DDERR_INVALIDCLIPLIST; + } + + DeleteObject(region); + } } else { This->region = NULL; } - */ + return DD_OK; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 30377ae..7d06d6c 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -86,12 +86,13 @@ HRESULT dds_Blt( BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - /* Disable this for now (needs more testing) if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size))) + HRESULT result = IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size); + + if (SUCCEEDED(result)) { RGNDATA* list = (RGNDATA*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size); @@ -122,8 +123,15 @@ HRESULT dds_Blt( return DD_OK; } } + else if (result == DDERR_NOCLIPLIST) + { + return DDERR_NOCLIPLIST; + } + else + { + return DDERR_INVALIDCLIPLIST; + } } - */ if (dst_rect.right < 0) dst_rect.right = 0; diff --git a/src/wndproc.c b/src/wndproc.c index 4f53765..4b80ecb 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -175,6 +175,11 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg = WM_DISPLAYCHANGE; break; } + case WM_ACTIVATEAPP_DDRAW: + { + uMsg = WM_ACTIVATEAPP; + break; + } case WM_D3D9DEVICELOST: { if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && From 63033840d9d0f57e163645420e9c911904f84bcc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:29:14 +0200 Subject: [PATCH 0263/1053] improve error checks --- src/ddclipper.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index 72a87e1..d4ab56d 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -69,11 +69,14 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (This->hwnd) return DDERR_CLIPPERISUSINGHWND; - if (This->region) - DeleteObject(This->region); - - if (lpClipList && lpClipList->rdh.nCount >= 1) + if (lpClipList) { + if (!lpClipList->rdh.nCount) + return DDERR_INVALIDCLIPLIST; + + if (This->region) + DeleteObject(This->region); + RECT* rc = (RECT*)lpClipList->Buffer; This->region = CreateRectRgnIndirect(&rc[0]); @@ -88,7 +91,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (!region) return DDERR_INVALIDCLIPLIST; - if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) + if (CombineRgn(This->region, region, This->region, RGN_XOR) == ERROR) { DeleteObject(region); DeleteObject(This->region); @@ -102,6 +105,9 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR } else { + if (This->region) + DeleteObject(This->region); + This->region = NULL; } From 490969356f78a21e2d205c478a63dc116404c3bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 09:32:00 +0200 Subject: [PATCH 0264/1053] use RGN_OR --- src/ddclipper.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddclipper.c b/src/ddclipper.c index d4ab56d..5d67f28 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -91,7 +91,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR if (!region) return DDERR_INVALIDCLIPLIST; - if (CombineRgn(This->region, region, This->region, RGN_XOR) == ERROR) + if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) { DeleteObject(region); DeleteObject(This->region); From 98363a85c25c3e19eb6fd5a9935d8bac18a29d68 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 20:06:48 +0200 Subject: [PATCH 0265/1053] add oreset for ClueFinders 4th --- src/config.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/config.c b/src/config.c index 5af9fa0..4647f18 100644 --- a/src/config.c +++ b/src/config.c @@ -663,6 +663,13 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; ClueFinders 4th Grade Adventures\n" + "[4thadv32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" From bbab7a018a1315b697768c8a5e31858d1818db15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 26 May 2024 22:59:07 +0200 Subject: [PATCH 0266/1053] add presets for other learning company games --- src/config.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/config.c b/src/config.c index 4647f18..a34bbd5 100644 --- a/src/config.c +++ b/src/config.c @@ -670,6 +670,20 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; ClueFinders Math Adventures (1998)\n" + "[TCFM32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders(R) Reading Adventures Ages 9-12\n" + "[cfread]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" @@ -947,6 +961,13 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" + "[RRM69_32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From 9ced91af14c6f627d58341f5bd01cacf2ea890d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 01:15:30 +0200 Subject: [PATCH 0267/1053] add experimental wing32 hooks --- inc/winapi_hooks.h | 6 ++++++ src/hook.c | 10 ++++++++++ src/winapi_hooks.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index d7e6efe..3608cc2 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -40,6 +40,12 @@ int WINAPI fake_GetDeviceCaps(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); +BOOL WINAPI fake_WinGStretchBlt( + HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc); + +BOOL WINAPI fake_WinGBitBlt( + HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1); + BOOL WINAPI fake_BitBlt( HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, DWORD rop); diff --git a/src/hook.c b/src/hook.c index 1b2efb3..b6653a8 100644 --- a/src/hook.c +++ b/src/hook.c @@ -138,6 +138,16 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + /* + { + "WING32.DLL", + { + { "WinGBitBlt", (PROC)fake_WinGBitBlt, NULL, HOOK_SKIP_2 }, + { "WinGStretchBlt", (PROC)fake_WinGStretchBlt, NULL, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } + }, + */ { "kernel32.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c530b43..33399ac 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -823,6 +823,21 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); } +BOOL WINAPI fake_WinGStretchBlt( + HDC hdcDest, + int xDest, + int yDest, + int wDest, + int hDest, + HDC hdcSrc, + int xSrc, + int ySrc, + int wSrc, + int hSrc) +{ + return fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); +} + BOOL WINAPI fake_BitBlt( HDC hdc, int x, @@ -860,11 +875,39 @@ BOOL WINAPI fake_BitBlt( return result; } } + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + { + return real_StretchBlt( + g_ddraw.render.hdc, + x + g_ddraw.render.viewport.x, + y + g_ddraw.render.viewport.y, + (int)(cx * g_ddraw.render.scale_w), + (int)(cy * g_ddraw.render.scale_h), + hdcSrc, + x1, + y1, + cx, + cy, + rop); + } } return real_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, rop); } +BOOL WINAPI fake_WinGBitBlt( + HDC hdc, + int x, + int y, + int cx, + int cy, + HDC hdcSrc, + int x1, + int y1) +{ + return fake_BitBlt(hdc, x, y, cx, cy, hdcSrc, x1, y1, SRCCOPY); +} + int WINAPI fake_SetDIBitsToDevice( HDC hdc, int xDest, From 0fa70b5c382aa62983aa6a4d028dc4721537ed05 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 01:52:44 +0200 Subject: [PATCH 0268/1053] add presets for Reader Rabbit games --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index a34bbd5..7d1ee3e 100644 --- a/src/config.c +++ b/src/config.c @@ -968,6 +968,22 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Reader Rabbit Reading Ages 4-6\n" + "[rrirjw32]\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "\n" + "; Reader Rabbit Reading Ages 6-9\n" + "[irj2w32]\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "\n" "; ROAD RASH\n" "[RoadRash]\n" "adjmouse=true\n" From f2bee3d0d28e8dbbacf7664d918d6c6a72a1e20e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 03:28:35 +0200 Subject: [PATCH 0269/1053] adjust gdi hooks --- src/winapi_hooks.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33399ac..a00b834 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -807,8 +807,8 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( g_ddraw.render.hdc, - xDest + g_ddraw.render.viewport.x, - yDest + g_ddraw.render.viewport.y, + (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -879,8 +879,8 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( g_ddraw.render.hdc, - x + g_ddraw.render.viewport.x, - y + g_ddraw.render.viewport.y, + (x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, @@ -1022,8 +1022,8 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( g_ddraw.render.hdc, - xDest + g_ddraw.render.viewport.x, - yDest + g_ddraw.render.viewport.y, + (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), (int)(DestHeight * g_ddraw.render.scale_h), xSrc, From c0d8c77f90d8e0021bb00b95515772575f81237b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 04:02:48 +0200 Subject: [PATCH 0270/1053] set and restore mode --- src/winapi_hooks.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a00b834..df3fc30 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -835,7 +835,11 @@ BOOL WINAPI fake_WinGStretchBlt( int wSrc, int hSrc) { - return fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); + int mode = SetStretchBltMode(hdcDest, COLORONCOLOR); + BOOL result = fake_StretchBlt(hdcDest, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, SRCCOPY); + SetStretchBltMode(hdcDest, mode); + + return result; } BOOL WINAPI fake_BitBlt( From 009bc4e2e8daab1f4b72af4abb303e5c363cb222 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 04:34:28 +0200 Subject: [PATCH 0271/1053] send WM_ACTIVATEAPP only once --- inc/wndproc.h | 1 - src/dd.c | 5 ++++- src/wndproc.c | 9 ++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index f066a04..3cb6a97 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,7 +9,6 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 -#define WM_ACTIVATEAPP_DDRAW WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/dd.c b/src/dd.c index 709414f..d12355d 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1004,7 +1004,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); - real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP_DDRAW, 1, 0); + if (dwFlags & SDM_MODE_SET_BY_GAME) + { + real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); + } } else { diff --git a/src/wndproc.c b/src/wndproc.c index 4b80ecb..9ce3a43 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -175,11 +175,6 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam uMsg = WM_DISPLAYCHANGE; break; } - case WM_ACTIVATEAPP_DDRAW: - { - uMsg = WM_ACTIVATEAPP; - break; - } case WM_D3D9DEVICELOST: { if (((!g_config.windowed && !g_config.nonexclusive) || !util_is_minimized(g_ddraw.hwnd)) && @@ -672,10 +667,10 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if (g_config.windowed || g_config.noactivateapp) { - /* let it pass through once (tiberian sun) */ + /* let it pass through once (tiberian sun / ClueFinders) */ static BOOL one_time; - if (wParam && !one_time && g_config.tshack) + if (wParam && !one_time) { one_time = TRUE; break; From 103f78276b844c0dcf653ad99a0e0e78b054f63a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:01:54 +0200 Subject: [PATCH 0272/1053] make clipper threadsafe for TA --- inc/IDirectDrawClipper.h | 1 + src/IDirectDraw/IDirectDrawClipper.c | 2 ++ src/ddclipper.c | 48 ++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/inc/IDirectDrawClipper.h b/inc/IDirectDrawClipper.h index 7e5161f..95510e6 100644 --- a/inc/IDirectDrawClipper.h +++ b/inc/IDirectDrawClipper.h @@ -16,6 +16,7 @@ typedef struct IDirectDrawClipperImpl ULONG ref; HWND hwnd; HRGN region; + CRITICAL_SECTION cs; } IDirectDrawClipperImpl; diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 86aaaa6..b07390f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -31,6 +31,8 @@ ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) if (This->region) DeleteObject(This->region); + DeleteCriticalSection(&This->cs); + HeapFree(GetProcessHeap(), 0, This); } diff --git a/src/ddclipper.c b/src/ddclipper.c index 5d67f28..14ec412 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -7,11 +7,19 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA lpClipList, LPDWORD lpdwSiz) { + EnterCriticalSection(&This->cs); + if (!This->region) + { + LeaveCriticalSection(&This->cs); return DDERR_NOCLIPLIST; + } if (!lpdwSiz) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } HRGN region = NULL; @@ -20,11 +28,16 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l region = CreateRectRgnIndirect(lpRect); if (!region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } if (CombineRgn(region, This->region, region, RGN_AND) == ERROR) { DeleteObject(region); + + LeaveCriticalSection(&This->cs); return DDERR_GENERIC; } } @@ -39,40 +52,64 @@ HRESULT ddc_GetClipList(IDirectDrawClipperImpl* This, LPRECT lpRect, LPRGNDATA l DeleteObject(region); if (*lpdwSiz == 0) + { + LeaveCriticalSection(&This->cs); return DDERR_REGIONTOOSMALL; + } + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { + EnterCriticalSection(&This->cs); + if (!lphWnd) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } *lphWnd = This->hwnd; + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { + EnterCriticalSection(&This->cs); + if (!lpbChanged) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDPARAMS; + } *lpbChanged = FALSE; /* Always return FALSE - See ddc_SetHWnd for remarks */ + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { + EnterCriticalSection(&This->cs); + if (This->hwnd) + { + LeaveCriticalSection(&This->cs); return DDERR_CLIPPERISUSINGHWND; + } if (lpClipList) { if (!lpClipList->rdh.nCount) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } if (This->region) DeleteObject(This->region); @@ -82,14 +119,20 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR This->region = CreateRectRgnIndirect(&rc[0]); if (!This->region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } for (int i = 1; i < lpClipList->rdh.nCount; ++i) { HRGN region = CreateRectRgnIndirect(&rc[i]); if (!region) + { + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; + } if (CombineRgn(This->region, region, This->region, RGN_OR) == ERROR) { @@ -97,6 +140,7 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR DeleteObject(This->region); This->region = NULL; + LeaveCriticalSection(&This->cs); return DDERR_INVALIDCLIPLIST; } @@ -111,17 +155,20 @@ HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWOR This->region = NULL; } + LeaveCriticalSection(&This->cs); return DD_OK; } HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { + EnterCriticalSection(&This->cs); /* We don't use the regions from the hwnd here since everything is emulated and we need the entire emulated surface to be redrawn all the time */ This->hwnd = hWnd; + LeaveCriticalSection(&This->cs); return DD_OK; } @@ -137,6 +184,7 @@ HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, c->lpVtbl = &g_ddc_vtbl; IDirectDrawClipper_AddRef(c); + InitializeCriticalSection(&c->cs); *lplpDDClipper = c; From c764419b961716cfea700312355e644028d53b83 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:10:15 +0200 Subject: [PATCH 0273/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 8e7b0a0..d68ee97 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 3ca98837235888ba1589cc812f70bc4bbddbd6a6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:16:04 +0200 Subject: [PATCH 0274/1053] disable CF hack for now --- src/dd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index d12355d..44c13a9 100644 --- a/src/dd.c +++ b/src/dd.c @@ -921,7 +921,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); + //(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From b219aca1664cbf3918c83acc7ad258d567c5a1ee Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:17:57 +0200 Subject: [PATCH 0275/1053] update debug code --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 44c13a9..d5a2fec 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1012,7 +1012,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - //TRACE(" GetWindowLongA style=%p, exstyle=%p\n", 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)); int menu_height = 0; From ed0f9ccbc94ae340ed5b81bf09ba0af7aea8d028 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:31:25 +0200 Subject: [PATCH 0276/1053] fix warnings --- src/winapi_hooks.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index df3fc30..c886c7d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -807,8 +807,8 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( g_ddraw.render.hdc, - (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -883,8 +883,8 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( g_ddraw.render.hdc, - (x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, @@ -1026,8 +1026,8 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( g_ddraw.render.hdc, - (xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, + (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, + (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), (int)(DestHeight * g_ddraw.render.scale_h), xSrc, From 47ae27e1d2838532190828a3714a92c36cf983e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 05:40:31 +0200 Subject: [PATCH 0277/1053] update RR presets --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 7d1ee3e..3747a30 100644 --- a/src/config.c +++ b/src/config.c @@ -975,6 +975,8 @@ static void cfg_create_ini() "width=0\n" "height=0\n" "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Reader Rabbit Reading Ages 6-9\n" "[irj2w32]\n" @@ -983,6 +985,8 @@ static void cfg_create_ini() "width=0\n" "height=0\n" "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; ROAD RASH\n" "[RoadRash]\n" From 115617591c6dbf37ea250ccde09f90a6b16662a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:27:28 +0200 Subject: [PATCH 0278/1053] #316 add presets for learning company games --- src/config.c | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 3747a30..e83191a 100644 --- a/src/config.c +++ b/src/config.c @@ -670,8 +670,29 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; ClueFinders Math Adventures (1998)\n" - "[TCFM32]\n" + "; ClueFinders 4th Grade Adventures\n" + "[4thad32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 5th Grade Adventures\n" + "[5thadv32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 5th Grade Adventures\n" + "[5thad32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders 6th Grade Adventures\n" + "[CF6]\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -684,6 +705,20 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; ClueFinders Math Adventures 1.0\n" + "[TCFM32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders Math Adventures 2.0\n" + "[cfmath32]\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" From 2efe3567ca966784b3cd514185337342317cc8e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:36:18 +0200 Subject: [PATCH 0279/1053] add workaround for learning company games --- inc/config.h | 1 + src/config.c | 10 ++++++++++ src/dd.c | 5 +++-- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/inc/config.h b/inc/config.h index 135f0df..0e8f869 100644 --- a/inc/config.h +++ b/inc/config.h @@ -99,6 +99,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL learning_company_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index e83191a..e1c62f0 100644 --- a/src/config.c +++ b/src/config.c @@ -109,6 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); + GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -665,6 +666,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -672,6 +674,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -679,6 +682,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -686,6 +690,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -693,6 +698,7 @@ static void cfg_create_ini() "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -700,6 +706,7 @@ static void cfg_create_ini() "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -707,6 +714,7 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -714,6 +722,7 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -998,6 +1007,7 @@ static void cfg_create_ini() "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" + "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" diff --git a/src/dd.c b/src/dd.c index d5a2fec..53faeec 100644 --- a/src/dd.c +++ b/src/dd.c @@ -918,11 +918,12 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { + DWORD rem_flags = (g_config.learning_company_hack ? WS_SYSMENU : 0) | WS_MAXIMIZE; + real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); - //(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE | WS_SYSMENU)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(rem_flags)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); From 99c25fee735701ef39527131e4588637d22b873e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:39:50 +0200 Subject: [PATCH 0280/1053] update supported games list --- README.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index edbbf29..2af04d1 100644 --- a/README.md +++ b/README.md @@ -71,15 +71,15 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura -- Atlantis: The Lost Tales - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World +- Atlantis: The Lost Tales - Atomic Bomberman - Atrox -- Barbie(tm) Beach Vacation(tm) - Baldr Force EXE - Baldur's Gate - Baldur's Gate 2 +- Barbie(tm) Beach Vacation(tm) - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) @@ -95,6 +95,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge - Close Combat 5: Invasion: Normandy +- ClueFinders 4th Grade Adventures +- ClueFinders 5th Grade Adventures +- ClueFinders 6th Grade Adventures +- ClueFinders Math Adventures 1.0 +- ClueFinders Math Adventures 2.0 +- ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert - Command & Conquer: Red Alert 2 @@ -173,17 +179,17 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Majesty Gold - Majesty Gold HD - Mech Warrior 3 -- Metal Gear Solid - Megaman X4 +- Metal Gear Solid - Moorhuhn - Moorhuhn 2 - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 - Nancy Drew: Last Train to Blue Moon Canyon +- Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes @@ -206,6 +212,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Reading Ages 4-6 +- Reader Rabbit Reading Ages 6-9 +- Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -248,8 +257,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Twisted Metal - Twisted Metal 2 - Tzar: The Burden of the Crown -- Uprising: Join or Die - Uprising 2: Lead and Destroy +- Uprising: Join or Die - Vermeer - Virtua Fighter PC - War Wind From 50144f08c547f91c1134ff40029138c18e9c53f8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 06:57:38 +0200 Subject: [PATCH 0281/1053] only save window size if resized by user --- src/wndproc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wndproc.c b/src/wndproc.c index 9ce3a43..365c683 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -431,7 +431,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); } - else if (!in_size_move && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) + else if (!in_size_move && g_ddraw.render.thread && !g_config.fullscreen && g_config.wine_allow_resize && IsLinux()) { g_config.window_rect.right = LOWORD(lParam); g_config.window_rect.bottom = HIWORD(lParam); From 7835f17e7707f96f0319b51feb7c58d7684b2af3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:22:11 +0200 Subject: [PATCH 0282/1053] #316 add preset for Reader Rabbit Learn To Read With Phonics --- README.md | 1 + src/config.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/README.md b/README.md index 2af04d1..490695c 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Learn To Read With Phonics - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) diff --git a/src/config.c b/src/config.c index e1c62f0..ecab385 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,14 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Learn To Read With Phonics\n" + "[Superr]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" "learning_company_hack=true\n" From 8662d030f767b61192faca90766c25a32ab33d15 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:33:22 +0200 Subject: [PATCH 0283/1053] add presets for Reader Rabbit Toddler --- src/config.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/config.c b/src/config.c index ecab385..f22e0a2 100644 --- a/src/config.c +++ b/src/config.c @@ -1005,6 +1005,22 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Toddler: Fly the Dreamship\n" + "[Fly the Dreamship]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Reader Rabbit Toddler: Playtime for Baby\n" + "[rrbaby]\n" + "learning_company_hack=true\n" + "adjmouse=false\n" + "fixchilds=3\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" "learning_company_hack=true\n" From 5bc7504fa8cdc48512142245c90b384ea7cad4f1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:36:29 +0200 Subject: [PATCH 0284/1053] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 490695c..f17615d 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II +- Reader Rabbit Toddler: Playtime for Baby +- Reader Rabbit Toddler: Fly the Dreamship - Reader Rabbit Learn To Read With Phonics - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 From c13483248f5327c3762bf0bb3689663775274199 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 07:37:29 +0200 Subject: [PATCH 0285/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index d68ee97..3affdbe 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 07a9ba78db4869752dfb6c56eace604a7d762242 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 23:33:47 +0200 Subject: [PATCH 0286/1053] set default values in SetDisplayMode --- src/dd.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/dd.c b/src/dd.c index 53faeec..cd03c7b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -578,6 +578,30 @@ HRESULT dd_RestoreDisplayMode() HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags) { + if (!dwWidth) + { + dwWidth = g_ddraw.width; + + if (!dwWidth) + dwWidth = 800; + } + + if (!dwHeight) + { + dwHeight = g_ddraw.height; + + if (!dwHeight) + dwHeight = 600; + } + + if (!dwBPP) + { + dwBPP = g_ddraw.bpp; + + if (!dwBPP) + dwBPP = 16; + } + if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; From 9674705685284bb7a6b6b6450ba1235c6bd99fbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 27 May 2024 23:54:19 +0200 Subject: [PATCH 0287/1053] re-align code --- src/dd.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/dd.c b/src/dd.c index cd03c7b..9a3e4aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -579,28 +579,13 @@ HRESULT dd_RestoreDisplayMode() HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFlags) { if (!dwWidth) - { - dwWidth = g_ddraw.width; - - if (!dwWidth) - dwWidth = 800; - } + dwWidth = g_ddraw.width ? g_ddraw.width : 800; if (!dwHeight) - { - dwHeight = g_ddraw.height; - - if (!dwHeight) - dwHeight = 600; - } + dwHeight = g_ddraw.height ? g_ddraw.height : 600; if (!dwBPP) - { - dwBPP = g_ddraw.bpp; - - if (!dwBPP) - dwBPP = 16; - } + dwBPP = g_ddraw.bpp ? g_ddraw.bpp : 16; if (dwBPP != 8 && dwBPP != 16 && dwBPP != 32) return DDERR_INVALIDMODE; From 94c718b5b1eaff48a70c0bf3656ba32797d320b8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 00:33:05 +0200 Subject: [PATCH 0288/1053] adjust clipper logging and make clipper less strict --- inc/ddclipper.h | 1 + src/IDirectDraw/IDirectDrawClipper.c | 8 ++++---- src/ddclipper.c | 13 +++++++++++++ src/ddsurface.c | 17 ++++++++--------- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/inc/ddclipper.h b/inc/ddclipper.h index f9c02c4..3f23c93 100644 --- a/inc/ddclipper.h +++ b/inc/ddclipper.h @@ -12,6 +12,7 @@ HRESULT ddc_GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd); HRESULT ddc_IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged); HRESULT ddc_SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags); HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd); +HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect); HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter); #endif diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index b07390f..34cd4de 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -47,7 +47,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "NOT_IMPLEMENTED -> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", __FUNCTION__, This, lpRect, @@ -56,7 +56,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } @@ -86,9 +86,9 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); - TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); + TRACE("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/ddclipper.c b/src/ddclipper.c index 14ec412..eeec712 100644 --- a/src/ddclipper.c +++ b/src/ddclipper.c @@ -172,6 +172,19 @@ HRESULT ddc_SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) return DD_OK; } +HRESULT ddc_SetClipRect(IDirectDrawClipperImpl* This, LPRECT lpRect) +{ + EnterCriticalSection(&This->cs); + + if (This->region) + DeleteObject(This->region); + + This->region = CreateRectRgnIndirect(lpRect); + + LeaveCriticalSection(&This->cs); + return DD_OK; +} + HRESULT dd_CreateClipper(DWORD dwFlags, IDirectDrawClipperImpl** lplpDDClipper, IUnknown FAR* pUnkOuter) { if (!lplpDDClipper) diff --git a/src/ddsurface.c b/src/ddsurface.c index 7d06d6c..c56d407 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -11,6 +11,7 @@ #include "utils.h" #include "blt.h" #include "config.h" +#include "ddclipper.h" #include "versionhelpers.h" @@ -90,7 +91,7 @@ HRESULT dds_Blt( { DWORD size = 0; - HRESULT result = IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, NULL, &size); + HRESULT result = ddc_GetClipList(This->clipper, &dst_rect, NULL, &size); if (SUCCEEDED(result)) { @@ -98,7 +99,7 @@ HRESULT dds_Blt( if (list) { - if (SUCCEEDED(IDirectDrawClipper_GetClipList(This->clipper, &dst_rect, list, &size))) + if (SUCCEEDED(ddc_GetClipList(This->clipper, &dst_rect, list, &size))) { RECT* dst_c_rect = (RECT*)list->Buffer; @@ -125,11 +126,13 @@ HRESULT dds_Blt( } else if (result == DDERR_NOCLIPLIST) { - return DDERR_NOCLIPLIST; + TRACE(" DDERR_NOCLIPLIST\n"); + //return DDERR_NOCLIPLIST; } else { - return DDERR_INVALIDCLIPLIST; + TRACE(" DDERR_INVALIDCLIPLIST\n"); + //return DDERR_INVALIDCLIPLIST; } } @@ -1023,12 +1026,8 @@ HRESULT dds_SetClipper(IDirectDrawSurfaceImpl* This, IDirectDrawClipperImpl* lpC if ((This->caps & DDSCAPS_PRIMARYSURFACE) && lpClipper->hwnd) { - if (lpClipper->region) - DeleteObject(lpClipper->region); - RECT rc = { 0, 0, This->width, This->height }; - - lpClipper->region = CreateRectRgnIndirect(&rc); + ddc_SetClipRect(lpClipper, &rc); } } From 798cfb654339864b7771837477f07bbde01b2d50 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 00:53:50 +0200 Subject: [PATCH 0289/1053] ignore clippers that use a hwnd for now --- src/ddsurface.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index c56d407..bceeb72 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -87,7 +87,7 @@ HRESULT dds_Blt( BOOL is_stretch_blt = src_w != dst_w || src_h != dst_h; - if (This->clipper && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) + if (This->clipper && !This->clipper->hwnd && !(dwFlags & DDBLT_NO_CLIP) && dst_w > 0 && dst_h > 0) { DWORD size = 0; From 4771d1f4adb1aad77b1415dfaa3ab908839e5f31 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 02:46:17 +0200 Subject: [PATCH 0290/1053] fix scaling bug --- 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 c886c7d..5667ffd 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -808,7 +808,7 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt( g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), (int)(hDest * g_ddraw.render.scale_h), hdcSrc, @@ -884,7 +884,7 @@ BOOL WINAPI fake_BitBlt( return real_StretchBlt( g_ddraw.render.hdc, (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(y * g_ddraw.render.scale_w) + g_ddraw.render.viewport.y, + (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), (int)(cy * g_ddraw.render.scale_h), hdcSrc, From 9e61e993e8c621d7eeb8f68f134b50242acce21c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 03:08:25 +0200 Subject: [PATCH 0291/1053] use originl DC if possible --- src/winapi_hooks.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 5667ffd..bd565e8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -806,7 +806,7 @@ BOOL WINAPI fake_StretchBlt( else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(wDest * g_ddraw.render.scale_w), @@ -853,7 +853,9 @@ BOOL WINAPI fake_BitBlt( int y1, DWORD rop) { - if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + HWND hwnd = WindowFromDC(hdc); + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -882,7 +884,7 @@ BOOL WINAPI fake_BitBlt( else if (g_ddraw.width > 0 && g_ddraw.render.hdc) { return real_StretchBlt( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(cx * g_ddraw.render.scale_w), @@ -1025,7 +1027,7 @@ int WINAPI fake_StretchDIBits( { return real_StretchDIBits( - g_ddraw.render.hdc, + hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, (int)(DestWidth * g_ddraw.render.scale_w), From 5b9d8d0d1655b840a08b206ede73f05bf416f11f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 20:53:50 +0200 Subject: [PATCH 0292/1053] Carmen Sandiego's Great Chase --- src/config.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/config.c b/src/config.c index f22e0a2..9469b4d 100644 --- a/src/config.c +++ b/src/config.c @@ -78,6 +78,7 @@ void cfg_load() GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); + g_config.allow_wmactivate = TRUE; GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -482,6 +483,18 @@ static void cfg_create_ini() "[Carma2_SW]\n" "noactivateapp=true\n" "\n" + "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" + "[TIME32]\n" + "learning_company_hack=true\n" + "allow_wmactivate=true\n" + "renderer=gdi\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Captain Claw\n" "[claw]\n" "adjmouse=true\n" From 37a04d75980e69016238b46253b96aceb4cca0ac Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 21:54:49 +0200 Subject: [PATCH 0293/1053] improve logging for windows --- src/utils.c | 28 ++++++++++++++++++++++++++-- src/winapi_hooks.c | 2 ++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/utils.c b/src/utils.c index 4d29bfb..c7de295 100644 --- a/src/utils.c +++ b/src/utils.c @@ -553,10 +553,34 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) { - if (!g_ddraw.hwnd) + LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); + + if (!g_ddraw.hwnd && !(sytle & WS_DISABLED)) g_ddraw.hwnd = hwnd; - return FALSE; +#ifdef _DEBUG + char class[MAX_PATH] = { 0 }; + GetClassNameA(hwnd, class, sizeof(class) - 1); + + char title[MAX_PATH] = { 0 }; + GetWindowTextA(hwnd, title, sizeof(title) - 1); + + RECT pos = { 0 }; + real_GetWindowRect(hwnd, &pos); + + RECT size = { 0 }; + real_GetClientRect(hwnd, &size); + + LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); + + TRACE( + "%s(class=%s, title=%s, X=%d, Y=%d, nWidth=%d, nHeight=%d)\n", + __FUNCTION__, class, title, pos.left, pos.top, size.right, size.bottom); + + dbg_dump_wnd_styles(sytle, exsytle); +#endif + + return TRUE; } BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index bd565e8..f688ee6 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1318,6 +1318,8 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( BOOL WINAPI fake_DestroyWindow(HWND hWnd) { + TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + BOOL result = real_DestroyWindow(hWnd); if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) From cf3d0c51ada0a509cf38e90f53681a0900003cb9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 22:23:47 +0200 Subject: [PATCH 0294/1053] #313 improve American Girls Dress Designer support and merge changes into master --- src/config.c | 4 ++++ src/dd.c | 19 ++++++++----------- src/utils.c | 8 ++++---- src/winapi_hooks.c | 18 +++++++++++++++++- 4 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/config.c b/src/config.c index 9469b4d..45e4c95 100644 --- a/src/config.c +++ b/src/config.c @@ -394,6 +394,10 @@ static void cfg_create_ini() "; American Girls Dress Designer\n" "[Dress Designer]\n" "fake_mode=640x480x32\n" + "border=false\n" + "posX=0\n" + "posY=0\n" + "nonexclusive=true\n" "\n" "; Age of Wonders 2\n" "[AoW2]\n" diff --git a/src/dd.c b/src/dd.c index 9a3e4aa..d2eee80 100644 --- a/src/dd.c +++ b/src/dd.c @@ -546,18 +546,15 @@ HRESULT dd_RestoreDisplayMode() return DD_OK; } - if (g_ddraw.renderer != gdi_render_main) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) diff --git a/src/utils.c b/src/utils.c index c7de295..9b0ce23 100644 --- a/src/utils.c +++ b/src/utils.c @@ -553,9 +553,12 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) { + RECT size = { 0 }; + real_GetClientRect(hwnd, &size); + LONG sytle = real_GetWindowLongA(hwnd, GWL_STYLE); - if (!g_ddraw.hwnd && !(sytle & WS_DISABLED)) + if (!g_ddraw.hwnd && !(sytle & WS_DISABLED) && size.right > 0 && size.bottom > 0) g_ddraw.hwnd = hwnd; #ifdef _DEBUG @@ -568,9 +571,6 @@ BOOL CALLBACK util_enum_thread_wnd_proc(HWND hwnd, LPARAM lParam) RECT pos = { 0 }; real_GetWindowRect(hwnd, &pos); - RECT size = { 0 }; - real_GetClientRect(hwnd, &size); - LONG exsytle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); TRACE( diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index f688ee6..9b51570 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -11,6 +11,7 @@ #include "mouse.h" #include "wndproc.h" #include "render_gdi.h" +#include "render_d3d9.h" #include "directinput.h" #include "ddsurface.h" #include "ddclipper.h" @@ -1320,13 +1321,28 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) + { + dd_RestoreDisplayMode(); + + if (g_ddraw.renderer == d3d9_render_main) + { + d3d9_release(); + } + } + BOOL result = real_DestroyWindow(hWnd); - if (result && g_ddraw.ref && hWnd == g_ddraw.hwnd) + if (result && g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) { g_ddraw.hwnd = NULL; g_ddraw.wndproc = NULL; g_ddraw.render.hdc = NULL; + + if (g_config.fake_mode[0]) + { + dd_SetCooperativeLevel(NULL, DDSCL_NORMAL); + } } if (g_ddraw.ref && g_ddraw.hwnd != hWnd && g_ddraw.bnet_active) From ea63cf08bdd45cb3927d364c1db4d55d9d49f1b2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 22:24:50 +0200 Subject: [PATCH 0295/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f17615d..4d0efdc 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Airline Tycoon Deluxe - Alien Nations - American Conquest (Steam+GOG) +- American Girls Dress Designer - Amerzone - Anno 1602: Creation of a New World - Anstoss 3 From 6276cc81683ef6cae5b7f11516a7060ec425d968 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 23:31:34 +0200 Subject: [PATCH 0296/1053] #318 add presets for Knights and Merchants The Shattered Kingdom --- src/config.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/config.c b/src/config.c index 45e4c95..c805588 100644 --- a/src/config.c +++ b/src/config.c @@ -951,6 +951,16 @@ static void cfg_create_ini() "[KKND2]\n" "noactivateapp=true\n" "\n" + "; Knights and Merchants The Shattered Kingdom\n" + "[KaM_800]\n" + "limit_bltfast=true\n" + "maxgameticks=60\n" + "\n" + "; Knights and Merchants The Shattered Kingdom\n" + "[KaM_1024]\n" + "limit_bltfast=true\n" + "maxgameticks=60\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From f32f20e38e872191f2c8975d77fadb31e36e21e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 28 May 2024 23:43:02 +0200 Subject: [PATCH 0297/1053] update reame --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d0efdc..4ebf6af 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire -- Knights and Merchants +- Knights and Merchants: The Shattered Kingdom +- Knights and Merchants: The Peasants Rebellion - Kohan: Immortal Sovereigns - Konung - Konung 2 From 203f6b0ccf146735e4caab0f85f4adac9297a0c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 01:05:36 +0200 Subject: [PATCH 0298/1053] remove debug setting --- src/config.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index c805588..2f7b06d 100644 --- a/src/config.c +++ b/src/config.c @@ -78,7 +78,6 @@ void cfg_load() GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); GET_BOOL(g_config.lock_surfaces, "lock_surfaces", FALSE); GET_BOOL(g_config.allow_wmactivate, "allow_wmactivate", FALSE); - g_config.allow_wmactivate = TRUE; GET_BOOL(g_config.flipclear, "flipclear", FALSE); GET_BOOL(g_config.fixmousehook, "fixmousehook", FALSE); GET_BOOL(g_config.rgb555, "rgb555", FALSE); @@ -110,7 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); + //GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 0b29eb3d0eec1c84ff560a5bc9444a7b3de5d3ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 01:10:00 +0200 Subject: [PATCH 0299/1053] 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 2f7b06d..156f23e 100644 --- a/src/config.c +++ b/src/config.c @@ -109,7 +109,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - //GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); + GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 4de6eee162d34b0b415b27bc910e47f03118a07c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 04:28:05 +0200 Subject: [PATCH 0300/1053] make sure we got move+close menu items --- inc/config.h | 1 - src/config.c | 14 -------------- src/dd.c | 4 +--- src/winapi_hooks.c | 7 +++++++ 4 files changed, 8 insertions(+), 18 deletions(-) diff --git a/inc/config.h b/inc/config.h index 0e8f869..135f0df 100644 --- a/inc/config.h +++ b/inc/config.h @@ -99,7 +99,6 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; - BOOL learning_company_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 156f23e..379ce15 100644 --- a/src/config.c +++ b/src/config.c @@ -109,7 +109,6 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.learning_company_hack, "learning_company_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -488,7 +487,6 @@ static void cfg_create_ini() "\n" "; Carmen Sandiego's Great Chase - NOT WORKING YET\n" "[TIME32]\n" - "learning_company_hack=true\n" "allow_wmactivate=true\n" "renderer=gdi\n" "adjmouse=false\n" @@ -682,7 +680,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -690,7 +687,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -698,7 +694,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -706,7 +701,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -714,7 +708,6 @@ static void cfg_create_ini() "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -722,7 +715,6 @@ static void cfg_create_ini() "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -730,7 +722,6 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -738,7 +729,6 @@ static void cfg_create_ini() "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1033,7 +1023,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1041,7 +1030,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Playtime for Baby\n" "[rrbaby]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1049,7 +1037,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" @@ -1057,7 +1044,6 @@ static void cfg_create_ini() "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" - "learning_company_hack=true\n" "adjmouse=false\n" "fixchilds=3\n" "maintas=false\n" diff --git a/src/dd.c b/src/dd.c index d2eee80..494177a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -924,12 +924,10 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - DWORD rem_flags = (g_config.learning_company_hack ? WS_SYSMENU : 0) | WS_MAXIMIZE; - real_SetWindowLongA( g_ddraw.hwnd, GWL_STYLE, - (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(rem_flags)); + (real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE) | WS_OVERLAPPEDWINDOW) & ~(WS_MAXIMIZE)); } LONG exstyle = real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9b51570..af89ac0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -534,6 +534,13 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { + /* Make sure we got close/move menu items (Almost all of the The Learning Company games) */ + HMENU menu = GetSystemMenu(hWnd, FALSE); + if (!menu || GetMenuState(menu, SC_CLOSE, MF_BYCOMMAND) == -1 || GetMenuState(menu, SC_MOVE, MF_BYCOMMAND) == -1) + { + GetSystemMenu(hWnd, TRUE); + } + if (nCmdShow == SW_SHOWMAXIMIZED) nCmdShow = SW_SHOWNORMAL; From 8f12004d67325db6ce636d34c40cd0c65225036e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 05:10:25 +0200 Subject: [PATCH 0301/1053] tweak aero snap hack --- inc/wndproc.h | 1 + src/wndproc.c | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/inc/wndproc.h b/inc/wndproc.h index 3cb6a97..43a1e8e 100644 --- a/inc/wndproc.h +++ b/inc/wndproc.h @@ -9,6 +9,7 @@ #define WM_DISPLAYCHANGE_DDRAW WM_APP+116 #define WM_TOGGLE_FULLSCREEN WM_APP+117 #define WM_TOGGLE_MAXIMIZE WM_APP+118 +#define WM_RESTORE_STYLE WM_APP+119 #define IDT_TIMER_LEAVE_BNET 541287654 diff --git a/src/wndproc.c b/src/wndproc.c index 365c683..812f96f 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -477,7 +477,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return DefWindowProc(hWnd, uMsg, wParam, lParam); /* Carmageddon fix */ } - case WM_NCMOUSELEAVE: + case WM_RESTORE_STYLE: { if (!IsWine()) /* hack: disable aero snap */ { @@ -488,7 +488,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style | WS_MAXIMIZEBOX); } } - break; + return 0; } case WM_SYSCOMMAND: { @@ -499,6 +499,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam if ((style & WS_MAXIMIZEBOX)) { real_SetWindowLongA(g_ddraw.hwnd, GWL_STYLE, style & ~WS_MAXIMIZEBOX); + PostMessageA(g_ddraw.hwnd, WM_RESTORE_STYLE, 0, 0); } } From 815deee85deb8ae05bb4c1ef19281616fd749fe2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 05:54:28 +0200 Subject: [PATCH 0302/1053] don't allow games to hide the taskbar --- src/winapi_hooks.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index af89ac0..aecb9aa 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -532,6 +532,12 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) { + /* Don't hide the taskbar (Some of The Learning Company games) */ + if (nCmdShow == SW_HIDE && hWnd && hWnd != g_ddraw.hwnd && hWnd == FindWindowA("Shell_TrayWnd", NULL)) + { + return TRUE; + } + if (g_ddraw.ref && g_ddraw.hwnd == hWnd) { /* Make sure we got close/move menu items (Almost all of the The Learning Company games) */ From 33476726d2c39268c5db8ed250bd590fd7413975 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 06:16:57 +0200 Subject: [PATCH 0303/1053] update learning company games presets --- inc/config.h | 1 + src/config.c | 55 +++++++++++++++++----------------------------------- src/dd.c | 7 +++++-- 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/inc/config.h b/inc/config.h index 135f0df..4d56eac 100644 --- a/inc/config.h +++ b/inc/config.h @@ -78,6 +78,7 @@ typedef struct CNCDDRAWCONFIG BOOL center_cursor_fix; char fake_mode[128]; BOOL wine_allow_resize; + BOOL lock_mouse_top_left; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 379ce15..2604d52 100644 --- a/src/config.c +++ b/src/config.c @@ -91,6 +91,7 @@ void cfg_load() 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); /* Hotkeys */ @@ -112,6 +113,9 @@ void cfg_load() GameHandlesClose = GameHandlesClose || g_config.infantryhack; + if (g_config.lock_mouse_top_left) + g_config.adjmouse = FALSE; + ini_free(&g_config.ini); } @@ -305,6 +309,7 @@ static void cfg_create_ini() "center_cursor_fix=false\n" ";fake_mode=640x480x32\n" "wine_allow_resize=false\n" + "lock_mouse_top_left=false\n" "\n" "\n" "\n" @@ -489,7 +494,7 @@ static void cfg_create_ini() "[TIME32]\n" "allow_wmactivate=true\n" "renderer=gdi\n" - "adjmouse=false\n" + "lock_mouse_top_left=true\n" "width=0\n" "height=0\n" "resizable=false\n" @@ -680,59 +685,43 @@ static void cfg_create_ini() "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 4th Grade Adventures\n" "[4thad32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 5th Grade Adventures\n" "[5thadv32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 5th Grade Adventures\n" "[5thad32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders 6th Grade Adventures\n" "[CF6]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders(R) Reading Adventures Ages 9-12\n" "[cfread]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders Math Adventures 1.0\n" "[TCFM32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; ClueFinders Math Adventures 2.0\n" "[cfmath32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Divine Divinity\n" "[div]\n" @@ -1023,31 +1012,23 @@ static void cfg_create_ini() "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Toddler: Playtime for Baby\n" "[rrbaby]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Learn To Read With Phonics\n" "[Superr]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" - "adjmouse=false\n" "fixchilds=3\n" - "maintas=false\n" - "boxing=false\n" + "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" diff --git a/src/dd.c b/src/dd.c index 494177a..5a72770 100644 --- a/src/dd.c +++ b/src/dd.c @@ -878,8 +878,11 @@ 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)); } - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; - g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + if (!g_config.lock_mouse_top_left) + { + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + } g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; g_ddraw.mouse.rc.top = g_ddraw.mouse.y_adjust; From 380e2d03ed4639409fe82ae94703a87388175ccc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 06:18:00 +0200 Subject: [PATCH 0304/1053] update Carmen Sandiego preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 2604d52..7dbac8c 100644 --- a/src/config.c +++ b/src/config.c @@ -494,7 +494,7 @@ static void cfg_create_ini() "[TIME32]\n" "allow_wmactivate=true\n" "renderer=gdi\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" "width=0\n" "height=0\n" "resizable=false\n" From bf249eeafe7eef4c34c65e73ebe5ec2e12aaa19f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 07:41:00 +0200 Subject: [PATCH 0305/1053] #316 update presets for the learning company games --- README.md | 35 +++++++++++-- src/config.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 4ebf6af..4ea9137 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arthur's Pet Chase +- Arthur's Sand Castle Contest - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -81,6 +83,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Baldur's Gate - Baldur's Gate 2 - Barbie(tm) Beach Vacation(tm) +- Batman: Justice Unbalanced +- Batman: Toxic Chill - Blade & Sword - Blood II - The Chosen - Caesar III (Sierra - 1998) @@ -96,11 +100,15 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Close Combat 3: The Russian Front - Close Combat 4: The Battle of the Bulge - Close Combat 5: Invasion: Normandy +- ClueFinders 3rd Grade Adventures - ClueFinders 4th Grade Adventures - ClueFinders 5th Grade Adventures - ClueFinders 6th Grade Adventures - ClueFinders Math Adventures 1.0 - ClueFinders Math Adventures 2.0 +- ClueFinders Mystery Mansion +- ClueFinders Search +- ClueFinders toy - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert @@ -149,6 +157,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Grand Theft Auto: London 1961 - Grand Theft Auto: London 1969 - Gruntz +- Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 - Heroes of Might and Magic II @@ -170,8 +179,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kings Quest 8: Mask of Eternity - KKND Xtreme - KKND2: Krossfire -- Knights and Merchants: The Shattered Kingdom - Knights and Merchants: The Peasants Rebellion +- Knights and Merchants: The Shattered Kingdom - Kohan: Immortal Sovereigns - Konung - Konung 2 @@ -214,11 +223,22 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II -- Reader Rabbit Toddler: Playtime for Baby -- Reader Rabbit Toddler: Fly the Dreamship +- Reader Rabbit 1st Grade +- Reader Rabbit 2nd Grade +- Reader Rabbit Dreamship Tales +- Reader Rabbit Kindergarten +- Reader Rabbit Kindergarten +- Reader Rabbit Kindergarten: Creative +- Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics +- Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade +- Reader Rabbit Learning Creations: Calendar +- Reader Rabbit Learning Creations: Music +- Reader Rabbit Learning Creations: Paint - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 +- Reader Rabbit Toddler: Fly the Dreamship +- Reader Rabbit Toddler: Playtime for Baby - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) @@ -243,17 +263,23 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers +- SpongeBob SquarePants: Typing - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds - Star Wars: Galactic Battlegrounds: Clone Campaigns - StarCraft - StarCraft: Broodwars +- StarFlyers Alien Space Chase +- StarFlyers Royal Jewel Rescue - Starship Titanic - Start Trek Armada - Steel Panthers: World At War +- Strawberry Shortcake: Amazing Cookie Party - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- The Powerpuff Girls - Princess Snorebucks +- The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation @@ -278,6 +304,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Worms 2 - Worms Armageddon - Zeus: Master of Olympus +- Zoombinis Island Odyssey +- Zoombinis Logical Journey +- Zoombinis Mountain Rescue - Zuma Deluxe - ... diff --git a/src/config.c b/src/config.c index 7dbac8c..fc0d04f 100644 --- a/src/config.c +++ b/src/config.c @@ -457,6 +457,26 @@ static void cfg_create_ini() "[AT]\n" "fixchilds=0\n" "\n" + "; Arthur's Pet Chase\n" + "[ArthurPP]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Arthur's Sand Castle Contest\n" + "[ArthurSC]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Batman: Toxic Chill\n" + "[Bat1]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Batman: Justice Unbalanced\n" + "[Bat2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=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" @@ -683,6 +703,26 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" + "; ClueFinders search\n" + "[CFSEARCH]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders Mystery\n" + "[ClueFinders Mystery Mansion]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders Toy\n" + "[ToyStore]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; ClueFinders 3rd Grade Adventures\n" + "[3rdadv32]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; ClueFinders 4th Grade Adventures\n" "[4thadv32]\n" "fixchilds=3\n" @@ -811,6 +851,11 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" + "; Hamtaro: Wake Up Snoozer!\n" + "[Ham]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" @@ -1030,6 +1075,61 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit 1st Grade\n" + "[RR1]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit 2nd Grade\n" + "[RR2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten\n" + "[RRK]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade\n" + "[Learn to read Grades 1-2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Calendar \n" + "[Calendar]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Music\n" + "[Music]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Learning Creations: Paint\n" + "[Paint]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Dreamship Tales\n" + "[Dreamship Tales]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten\n" + "[rrk32]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten: Creative\n" + "[creative ]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Kindergarten: Learning Creations\n" + "[Learning Creations]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" "renderer=gdi\n" @@ -1063,6 +1163,26 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" + "; Strawberry Shortcake: Amazing Cookie Party\n" + "[Strawberry]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; SpongeBob SquarePants: Typing\n" + "[SPT]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; StarFlyers Royal Jewel Rescue\n" + "[Royal Jewel Rescue]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; StarFlyers Alien Space Chase\n" + "[Alien Space Chase]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" @@ -1122,6 +1242,11 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; The Powerpuff Girls(TM) Mojo Jojo's Clone Zone / The Powerpuff Girls - Princess Snorebucks\n" + "[Powerpuff Girls]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1214,6 +1339,21 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" + "; Zoombinis Logical Journey\n" + "[Zoombinis Logicial Journey]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Zoombinis Mountain Rescue\n" + "[zoombini2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Zoombinis Island Odyssey\n" + "[Zoombinis Island Odyssey]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" , fh); fclose(fh); From 54a619b3a1c71b9b79964d590a0bf39d0e72aa5e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 07:43:19 +0200 Subject: [PATCH 0306/1053] fix section name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index fc0d04f..15450a6 100644 --- a/src/config.c +++ b/src/config.c @@ -1121,7 +1121,7 @@ static void cfg_create_ini() "lock_mouse_top_left=true\n" "\n" "; Reader Rabbit Kindergarten: Creative\n" - "[creative ]\n" + "[creative]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From dd22c448caa2b6f4a2b9d5a93df68418d4248860 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 08:11:52 +0200 Subject: [PATCH 0307/1053] update game names --- README.md | 1 - src/config.c | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4ea9137..a6d35cf 100644 --- a/README.md +++ b/README.md @@ -227,7 +227,6 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit 2nd Grade - Reader Rabbit Dreamship Tales - Reader Rabbit Kindergarten -- Reader Rabbit Kindergarten - Reader Rabbit Kindergarten: Creative - Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics diff --git a/src/config.c b/src/config.c index 15450a6..0e135c3 100644 --- a/src/config.c +++ b/src/config.c @@ -703,17 +703,17 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" - "; ClueFinders search\n" + "; ClueFinders Search and Solve Adventures\n" "[CFSEARCH]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" - "; ClueFinders Mystery\n" + "; ClueFinders Mystery Mansion\n" "[ClueFinders Mystery Mansion]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" - "; ClueFinders Toy\n" + "; ClueFinders The Incredible Toy Store Adventure\n" "[ToyStore]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" From b2199157e855ad26e6692741940dd21c504e7992 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 08:12:29 +0200 Subject: [PATCH 0308/1053] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a6d35cf..84ad6c5 100644 --- a/README.md +++ b/README.md @@ -107,8 +107,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - ClueFinders Math Adventures 1.0 - ClueFinders Math Adventures 2.0 - ClueFinders Mystery Mansion -- ClueFinders Search -- ClueFinders toy +- ClueFinders Search and Solve Adventures +- Cluefinders The Incredible Toy Store Adventure - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert From 5e215bcaa52637ae01101e4e7a594666b3c98c66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 21:45:12 +0200 Subject: [PATCH 0309/1053] add preset for Little Bear Kindergarten Thinking Adventurest --- README.md | 2 ++ src/config.c | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 84ad6c5..abd796a 100644 --- a/README.md +++ b/README.md @@ -184,6 +184,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Little Bear Rainy Day Activities +- Little Bear Kindergarten Thinking Adventures - Lionheart - Legacy of the Crusader - Locomotion - Lode Runner 2 diff --git a/src/config.c b/src/config.c index 0e135c3..b38a8d2 100644 --- a/src/config.c +++ b/src/config.c @@ -984,6 +984,16 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=60\n" "\n" + "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" + "[LBSTART]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Little Bear Kindergarten Thinking Adventurest\n" + "[LBSTART]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From 966c925af58b91e35c3c316034870c07a1379a87 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 21:50:38 +0200 Subject: [PATCH 0310/1053] fix preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index b38a8d2..d29fd3d 100644 --- a/src/config.c +++ b/src/config.c @@ -985,7 +985,7 @@ static void cfg_create_ini() "maxgameticks=60\n" "\n" "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" - "[LBSTART]\n" + "[LBPR]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" From f0fee78c56b41c73607378bc954d802f9c10628e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 22:27:03 +0200 Subject: [PATCH 0311/1053] adjust presets --- src/config.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index d29fd3d..6839cab 100644 --- a/src/config.c +++ b/src/config.c @@ -986,13 +986,21 @@ static void cfg_create_ini() "\n" "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Little Bear Kindergarten Thinking Adventurest\n" "[LBSTART]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" "\n" "; Lionheart\n" "[Lionheart]\n" From fada7b82dd6be1015b7363d9333d4203f3219e8d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 29 May 2024 23:30:49 +0200 Subject: [PATCH 0312/1053] fake desktop window size --- src/winapi_hooks.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index aecb9aa..a8cc502 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -222,9 +222,10 @@ BOOL WINAPI fake_GetWindowRect(HWND hWnd, LPRECT lpRect) if (lpRect && g_ddraw.ref && g_ddraw.hwnd && + g_ddraw.width && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { - if (g_ddraw.hwnd == hWnd) + if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) { lpRect->bottom = g_ddraw.height; lpRect->left = 0; @@ -253,7 +254,8 @@ BOOL WINAPI fake_GetClientRect(HWND hWnd, LPRECT lpRect) { if (lpRect && g_ddraw.ref && - g_ddraw.hwnd == hWnd && + g_ddraw.width && + (g_ddraw.hwnd == hWnd || hWnd == GetDesktopWindow()) && (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) { lpRect->bottom = g_ddraw.height; From 7f0b122e29517e31bd691e9237c748b5ede17456 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 02:34:53 +0200 Subject: [PATCH 0313/1053] add preset for Arthur's Wilderness Rescue --- src/config.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 6839cab..ae1ebbc 100644 --- a/src/config.c +++ b/src/config.c @@ -457,6 +457,10 @@ static void cfg_create_ini() "[AT]\n" "fixchilds=0\n" "\n" + "; Arthur's Wilderness Rescue\n" + "[ArthurPP]\n" + "renderer=gdi\n" + "\n" "; Arthur's Pet Chase\n" "[ArthurPP]\n" "fixchilds=3\n" @@ -993,7 +997,7 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Little Bear Kindergarten Thinking Adventurest\n" + "; Little Bear Kindergarten Thinking Adventures\n" "[LBSTART]\n" "adjmouse=false\n" "width=0\n" From f5e0e954903b5f8de61c400489cfe494145a854a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:00:23 +0200 Subject: [PATCH 0314/1053] hook GetWindowPlacement --- inc/hook.h | 6 ++++-- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 27 +++++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index ae3a404..15b49df 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -17,7 +17,7 @@ typedef struct HOOKLISTDATA { HMODULE mod; } HOOKLISTDATA; -typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[32]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[33]; } HOOKLIST; typedef BOOL(WINAPI* GETCURSORPOSPROC)(LPPOINT); typedef BOOL(WINAPI* CLIPCURSORPROC)(const RECT*); @@ -53,10 +53,11 @@ typedef int (WINAPI* SETDIBITSTODEVICEPROC)( typedef int (WINAPI* STRETCHDIBITSPROC)( HDC, int, int, int, int, int, int, int, int, const VOID*, const BITMAPINFO*, UINT, DWORD); -typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND hWnd); +typedef BOOL (WINAPI* SETFOREGROUNDWINDOWPROC)(HWND); 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 SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -105,6 +106,7 @@ extern SETFOREGROUNDWINDOWPROC real_SetForegroundWindow; extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; +extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; 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 3608cc2..89a948c 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -33,6 +33,7 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd); HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId); 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); 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 b6653a8..459661d 100644 --- a/src/hook.c +++ b/src/hook.c @@ -49,6 +49,7 @@ SETFOREGROUNDWINDOWPROC real_SetForegroundWindow = SetForegroundWindow; SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; +GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -95,6 +96,7 @@ HOOKLIST g_hook_hooklist[] = { "GetForegroundWindow", (PROC)fake_GetForegroundWindow, (PROC*)&real_GetForegroundWindow, 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 }, { "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 a8cc502..0c80b72 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -732,6 +732,33 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w return result; } +BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) +{ + BOOL result = real_GetWindowPlacement(hWnd, lpwndpl); + + if (result && + lpwndpl && + g_ddraw.ref && + g_ddraw.hwnd && + g_ddraw.width && + (g_config.hook != 2 || g_ddraw.renderer == gdi_render_main)) + { + if (hWnd == g_ddraw.hwnd || hWnd == GetDesktopWindow()) + { + lpwndpl->rcNormalPosition.bottom = g_ddraw.height; + lpwndpl->rcNormalPosition.left = 0; + lpwndpl->rcNormalPosition.right = g_ddraw.width; + lpwndpl->rcNormalPosition.top = 0; + } + else + { + real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, (LPPOINT)&lpwndpl->rcNormalPosition, 2); + } + } + + return result; +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 52e35e9dd45ba153e62471c2cd433a6eedd19c74 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:00:57 +0200 Subject: [PATCH 0315/1053] fix preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index ae1ebbc..bbd577f 100644 --- a/src/config.c +++ b/src/config.c @@ -458,7 +458,7 @@ static void cfg_create_ini() "fixchilds=0\n" "\n" "; Arthur's Wilderness Rescue\n" - "[ArthurPP]\n" + "[Arthur]\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From ee3ba56534ed370e90bbcb604d6dfda0f4d8c331 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 03:59:41 +0200 Subject: [PATCH 0316/1053] update Arthur preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index bbd577f..8e9102e 100644 --- a/src/config.c +++ b/src/config.c @@ -459,6 +459,7 @@ static void cfg_create_ini() "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" + "hook_peekmessage=true\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From c0c43fc43f34af066ae7760213ad28cb84d664e2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 04:32:14 +0200 Subject: [PATCH 0317/1053] add presets for little bear games --- README.md | 3 +++ src/config.c | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index abd796a..3f1fd67 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura +- Arthur's Wilderness Rescue - Arthur's Pet Chase - Arthur's Sand Castle Contest - Atlantis 2: Beyond Atlantis @@ -184,6 +185,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 +- Little Bear Toddler Discovery Adventures +- Little Bear Preschool Thinking Adventures - Little Bear Rainy Day Activities - Little Bear Kindergarten Thinking Adventures - Lionheart - Legacy of the Crusader diff --git a/src/config.c b/src/config.c index 8e9102e..73abef9 100644 --- a/src/config.c +++ b/src/config.c @@ -989,7 +989,7 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=60\n" "\n" - "; Little Bear Kindergarten Thinking Adventures: Parent's Progress Report\n" + "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" "[LBPR]\n" "adjmouse=false\n" "width=0\n" @@ -998,7 +998,7 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Little Bear Kindergarten Thinking Adventures\n" + "; Little Bear Kindergarten/Preschool Thinking Adventures\n" "[LBSTART]\n" "adjmouse=false\n" "width=0\n" @@ -1007,6 +1007,15 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" + "; Little Bear Toddler Discovery Adventures\n" + "[LBT]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Lionheart\n" "[Lionheart]\n" "hook_peekmessage=true\n" From 275f10e6e26e911d9ec8bc8cfc6bc415a4493f26 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 06:28:16 +0200 Subject: [PATCH 0318/1053] add preset for scooby doo --- README.md | 1 + src/config.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/README.md b/README.md index 3f1fd67..ecb29c8 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Road Rash - RollerCoaster Tycoon - Sanitarium +- Scooby-Doo(TM), Case File #2 The Scary Stone Dragon - Sega Rally - Sega Touring Car - Septerra Core diff --git a/src/config.c b/src/config.c index 73abef9..0910668 100644 --- a/src/config.c +++ b/src/config.c @@ -1195,6 +1195,11 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" + "; Scooby-Doo(TM), Case File #2 The Scary Stone Dragon\n" + "[Case File #2]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Strawberry Shortcake: Amazing Cookie Party\n" "[Strawberry]\n" "fixchilds=3\n" From e7bd262681cb4ea1d29209caf6061bec8cd70445 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 06:37:32 +0200 Subject: [PATCH 0319/1053] update readme with supported games --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ecb29c8..ad85ba0 100644 --- a/README.md +++ b/README.md @@ -255,6 +255,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon +- Scooby-Doo(TM), Phantom of the Knight(TM) +- Scooby-Doo(TM), Showdown in Ghost Town(TM) - Sega Rally - Sega Touring Car - Septerra Core From e3314c0b4829526449cd36db3e550838dff4738a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 07:20:44 +0200 Subject: [PATCH 0320/1053] add presets for madeline math + adds new seetings to disable compat mode warnings --- README.md | 2 ++ inc/config.h | 1 + src/config.c | 35 +++++++++++++++++++++++++++++++++++ src/dllmain.c | 3 ++- 4 files changed, 40 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ad85ba0..9374554 100644 --- a/README.md +++ b/README.md @@ -192,6 +192,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Lionheart - Legacy of the Crusader - Locomotion - Lode Runner 2 +- Madeline 1st Grade Math +- Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD - Mech Warrior 3 diff --git a/inc/config.h b/inc/config.h index 4d56eac..2bf06ad 100644 --- a/inc/config.h +++ b/inc/config.h @@ -79,6 +79,7 @@ typedef struct CNCDDRAWCONFIG char fake_mode[128]; BOOL wine_allow_resize; BOOL lock_mouse_top_left; + BOOL no_compat_warning; /* Hotkeys */ diff --git a/src/config.c b/src/config.c index 0910668..64fe101 100644 --- a/src/config.c +++ b/src/config.c @@ -92,6 +92,7 @@ void cfg_load() 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); /* Hotkeys */ @@ -310,6 +311,7 @@ static void cfg_create_ini() ";fake_mode=640x480x32\n" "wine_allow_resize=false\n" "lock_mouse_top_left=false\n" + "no_compat_warning=false\n" "\n" "\n" "\n" @@ -1020,6 +1022,39 @@ static void cfg_create_ini() "[Lionheart]\n" "hook_peekmessage=true\n" "\n" + "; Madeline 1st Grade Math\n" + "[madmath1]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Madeline 1st Grade Math: Progress Report\n" + "[madpr]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; Madeline 2nd Grade Math\n" + "[madmath2]\n" + "nonexclusive=true\n" + "no_compat_warning=true\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Majesty Gold\n" "[Majesty]\n" "minfps=-2\n" diff --git a/src/dllmain.c b/src/dllmain.c index 637f5e5..0f9e5c4 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -72,7 +72,8 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) "then try to start the game again.", s); - MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); + if (!g_config.no_compat_warning) + MessageBoxA(NULL, mes, "Compatibility modes detected - cnc-ddraw", MB_OK); break; } From b2fedc278b8e22bd1356340aeb1416d2132bb969 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 08:50:58 +0200 Subject: [PATCH 0321/1053] add Cyberchase games to supported games list --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9374554..923c7a0 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 +- Cyberchase Castleblanca Quest +- Cyberchase Carnival Chaos - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 From 6e3a6207dad1a0b72ab15a320cce97294383d957 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 08:56:02 +0200 Subject: [PATCH 0322/1053] cleanup readme --- README.md | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 923c7a0..4d59dda 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - ClueFinders Math Adventures 2.0 - ClueFinders Mystery Mansion - ClueFinders Search and Solve Adventures -- Cluefinders The Incredible Toy Store Adventure +- ClueFinders The Incredible Toy Store Adventure - ClueFinders(R) Reading Adventures Ages 9-12 - Command & Conquer Gold - Command & Conquer: Red Alert @@ -236,17 +236,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit 2nd Grade - Reader Rabbit Dreamship Tales - Reader Rabbit Kindergarten -- Reader Rabbit Kindergarten: Creative -- Reader Rabbit Kindergarten: Learning Creations - Reader Rabbit Learn To Read With Phonics -- Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade -- Reader Rabbit Learning Creations: Calendar -- Reader Rabbit Learning Creations: Music -- Reader Rabbit Learning Creations: Paint +- Reader Rabbit Learning Creations - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 -- Reader Rabbit Toddler: Fly the Dreamship -- Reader Rabbit Toddler: Playtime for Baby +- Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) From 188ef913c37c3097344c02b890f695c6d41640a8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 21:32:02 +0200 Subject: [PATCH 0323/1053] adjust peek/getmessage hooks --- src/winapi_hooks.c | 60 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 5 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 0c80b72..f9d23af 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -701,7 +701,9 @@ BOOL HandleMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMa InterlockedExchange((LONG*)&g_ddraw.cursor.y, y); lpMsg->lParam = MAKELPARAM(x, y); - fake_GetCursorPos(&lpMsg->pt); + + lpMsg->pt.x = x; + lpMsg->pt.y = y; break; } @@ -716,8 +718,32 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && g_config.hook_getmessage) - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (g_config.hook_getmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + else if (g_mouse_locked && (!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); + } + } return result; } @@ -726,8 +752,32 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_config.hook_peekmessage) - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + { + if (g_config.hook_peekmessage) + { + HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + else if (g_mouse_locked && (!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); + } + } return result; } From c4a939eea270380f765ac89109c7e80732209117 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 21:32:32 +0200 Subject: [PATCH 0324/1053] update preset --- src/config.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.c b/src/config.c index 64fe101..bc13b7c 100644 --- a/src/config.c +++ b/src/config.c @@ -461,7 +461,6 @@ static void cfg_create_ini() "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" - "hook_peekmessage=true\n" "renderer=gdi\n" "\n" "; Arthur's Pet Chase\n" From cff92182f989c673899106b6be0fe17cddd842f4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 22:07:07 +0200 Subject: [PATCH 0325/1053] add missing NULL check --- 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 f9d23af..90ff88b 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -718,7 +718,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (g_config.hook_getmessage) { @@ -752,7 +752,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { if (g_config.hook_peekmessage) { From 4f5c332cd58a2adb9547f5abb4a2c4d57e8706fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 22:53:01 +0200 Subject: [PATCH 0326/1053] don't send WM_ACTIVATEAPP yet (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 5a72770..529b1b2 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1015,7 +1015,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (dwFlags & SDM_MODE_SET_BY_GAME) { - real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); + //real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); } } else From f9d2cb0d1f708daeed03557418e7346d851933d1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 30 May 2024 23:55:30 +0200 Subject: [PATCH 0327/1053] simplify cursor code --- src/winapi_hooks.c | 108 ++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 71 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 90ff88b..a5fe94d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -30,65 +30,31 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (!real_GetCursorPos(&pt)) return FALSE; - realpt.x = pt.x; - realpt.y = pt.y; + realpt = pt; - if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &pt))) { - /* fallback solution for possible ClipCursor failure */ - int diffx = 0, diffy = 0; - - int max_width = g_config.adjmouse ? g_ddraw.render.viewport.width : g_ddraw.width; - int max_height = g_config.adjmouse ? g_ddraw.render.viewport.height : g_ddraw.height; - - pt.x -= g_ddraw.mouse.x_adjust; - pt.y -= g_ddraw.mouse.y_adjust; - - if (pt.x < 0) - { - diffx = pt.x; - pt.x = 0; - } - - if (pt.y < 0) - { - diffy = pt.y; - pt.y = 0; - } - - if (pt.x > max_width) - { - diffx = pt.x - max_width; - pt.x = max_width; - } - - if (pt.y > max_height) - { - diffy = pt.y - max_height; - pt.y = max_height; - } - - if (diffx || diffy) - real_SetCursorPos(realpt.x - diffx, realpt.y - diffy); - - int x = 0; - int y = 0; + 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 = min((DWORD)(roundf(pt.x * g_ddraw.mouse.unscale_x)), g_ddraw.width - 1); - y = min((DWORD)(roundf(pt.y * g_ddraw.mouse.unscale_y)), g_ddraw.height - 1); - } - else - { - x = min(pt.x, g_ddraw.width - 1); - y = min(pt.y, g_ddraw.height - 1); + x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); + y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); } - if (g_config.vhack && !g_ddraw.isworms2 && InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) + x = min(x, g_ddraw.width - 1); + y = min(y, g_ddraw.height - 1); + + if (g_config.vhack && + !g_ddraw.isworms2 && + !g_config.devmode && + !g_ddraw.bnet_active && + InterlockedExchangeAdd(&g_ddraw.upscale_hack_active, 0)) { - diffx = 0; - diffy = 0; + int diffx = 0; + int diffy = 0; if (x > g_ddraw.upscale_hack_width) { @@ -117,16 +83,6 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) return TRUE; } - else if (lpPoint && g_ddraw.bnet_active && real_ScreenToClient(g_ddraw.hwnd, &pt)) - { - if (pt.x > 0 && pt.x < g_ddraw.width && pt.y > 0 && pt.y < g_ddraw.height) - { - lpPoint->x = pt.x; - lpPoint->y = pt.y; - - return TRUE; - } - } if (lpPoint) { @@ -720,11 +676,8 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if (g_config.hook_getmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!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); @@ -737,12 +690,20 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } 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; @@ -754,11 +715,8 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if (g_config.hook_peekmessage) - { - HandleMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - } - else if (g_mouse_locked && (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && + (!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); @@ -771,12 +729,20 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); + + InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); + InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } 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; From 66de7d5d1e158cf9f7cbd6e348f2e7bf85920238 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 00:55:04 +0200 Subject: [PATCH 0328/1053] remove old code --- src/dd.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 529b1b2..72f968c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1012,11 +1012,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); - - if (dwFlags & SDM_MODE_SET_BY_GAME) - { - //real_SendMessageA(g_ddraw.hwnd, WM_ACTIVATEAPP, 1, 0); - } } else { From 0e9e3f9d7a9d380b3cfad11ef3a3223008ee8f3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 01:49:43 +0200 Subject: [PATCH 0329/1053] remove conditions --- src/winapi_hooks.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a5fe94d..4ba6d04 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -676,8 +676,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && - (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + 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); @@ -715,8 +714,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) { - if ((g_mouse_locked || g_config.devmode || g_ddraw.bnet_active) && - (!g_config.windowed || real_ScreenToClient(g_ddraw.hwnd, &lpMsg->pt))) + 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); From 0be22be87b155aedbf00c2e5b6252cb635616c8a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 02:23:30 +0200 Subject: [PATCH 0330/1053] make sure we don'T double hook --- 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 4ba6d04..c0a2f38 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -674,7 +674,7 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM { BOOL result = real_GetMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + 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)) { @@ -712,7 +712,7 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w { BOOL result = real_PeekMessageA(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg); - if (result && lpMsg && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width) + 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)) { From 5c1f822a35e4d1223dc43fee2ca7cb011bde7ad8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 02:43:20 +0200 Subject: [PATCH 0331/1053] #319 fix moving cursor bug in Nancy drew games (macOS) --- src/dd.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/dd.c b/src/dd.c index 72f968c..fe94379 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1056,6 +1056,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if ((exstyle & WS_EX_CLIENTEDGE)) { + swp_flags |= SWP_FRAMECHANGED; + real_SetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE, exstyle & ~(WS_EX_CLIENTEDGE)); } From cee57257f2ba7dbeb45daa62b4a0d04a01a8f60c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 03:55:19 +0200 Subject: [PATCH 0332/1053] update presets --- README.md | 2 ++ src/config.c | 15 +++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/README.md b/README.md index 4d59dda..eb96c1e 100644 --- a/README.md +++ b/README.md @@ -241,7 +241,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 - Reader Rabbit Toddler +- Reader Rabbit Math Ages 4-6 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) +- Reader Rabbit Preschool 2002 - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) diff --git a/src/config.c b/src/config.c index bc13b7c..f5715e8 100644 --- a/src/config.c +++ b/src/config.c @@ -1136,11 +1136,26 @@ static void cfg_create_ini() "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit Math Ages 4-6\n" + "[RRM46]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" "[RRM69_32]\n" "fixchilds=3\n" "lock_mouse_top_left=true\n" "\n" + "; Reader Rabbit Preschool 2002\n" + "[Preschool Sparkle Star Rescue]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" + "; Reader Rabbit Preschool 2002\n" + "[RRP]\n" + "fixchilds=3\n" + "lock_mouse_top_left=true\n" + "\n" "; Reader Rabbit 1st Grade\n" "[RR1]\n" "fixchilds=3\n" From fd303a3191c466e30467a46e6b47e6011abfd14c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 04:13:31 +0200 Subject: [PATCH 0333/1053] add another RR preset --- README.md | 1 + src/config.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index eb96c1e..2f388cd 100644 --- a/README.md +++ b/README.md @@ -244,6 +244,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Math Ages 4-6 - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Reader Rabbit Preschool 2002 +- Reader Rabbit Thinking Ages 4-6 (US) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) diff --git a/src/config.c b/src/config.c index f5715e8..dbf2f20 100644 --- a/src/config.c +++ b/src/config.c @@ -1121,6 +1121,15 @@ static void cfg_create_ini() "[RT2]\n" "adjmouse=true\n" "\n" + "; Reader Rabbit Thinking Ages 4-6 (US)\n" + "[rrta32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Reader Rabbit Toddler: Fly the Dreamship\n" "[Fly the Dreamship]\n" "fixchilds=3\n" From a08be3e9227bbc7b609242c4fd8342cf9d6df0b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 04:55:55 +0200 Subject: [PATCH 0334/1053] add preset for TLC launcher --- inc/config.h | 1 + src/IDirectDraw/IDirectDraw.c | 2 +- src/config.c | 13 +++++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/inc/config.h b/inc/config.h index 2bf06ad..abaa180 100644 --- a/inc/config.h +++ b/inc/config.h @@ -101,6 +101,7 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; + BOOL tlc_hack; } CNCDDRAWCONFIG; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 1e6f6a4..3bd8379 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -487,7 +487,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = DD_OK; + HRESULT ret = g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/config.c b/src/config.c index dbf2f20..e868036 100644 --- a/src/config.c +++ b/src/config.c @@ -111,6 +111,7 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); 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); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -1359,6 +1360,18 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The Learning Company Launcher\n" + "[TLCLauncher]\n" + "tlc_hack=true\n" + "windowed=true\n" + "fullscreen=false\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Three Kingdoms: Fate of the Dragon\n" "[sanguo]\n" "maxgameticks=60\n" From 4b153ee11f1527c1cab728bb64744bbe2bb8683f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 05:46:26 +0200 Subject: [PATCH 0335/1053] don't save cursor post on peek/get message --- src/winapi_hooks.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index c0a2f38..9ee2eab 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -689,9 +689,6 @@ BOOL WINAPI fake_GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wM lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { @@ -727,9 +724,6 @@ BOOL WINAPI fake_PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT w lpMsg->pt.x = min(x, g_ddraw.width - 1); lpMsg->pt.y = min(y, g_ddraw.height - 1); - - InterlockedExchange((LONG*)&g_ddraw.cursor.x, lpMsg->pt.x); - InterlockedExchange((LONG*)&g_ddraw.cursor.y, lpMsg->pt.y); } else { From a5649a808bf54f73f7cb3b619e10e9594e8337ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 07:55:16 +0200 Subject: [PATCH 0336/1053] add preset for Nancy Drew: Secret of Shadow Ranch --- README.md | 1 + src/config.c | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 2f388cd..f95129d 100644 --- a/README.md +++ b/README.md @@ -211,6 +211,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger - Nancy Drew: Treasure in the Royal Tower +- Nancy Drew: The Secret of Shadow Ranch - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson diff --git a/src/config.c b/src/config.c index e868036..37d7f0e 100644 --- a/src/config.c +++ b/src/config.c @@ -1086,6 +1086,12 @@ static void cfg_create_ini() "limit_bltfast=true\n" "maxgameticks=600\n" "\n" + "; Nancy Drew: Secret of Shadow Ranch\n" + "[Game/4]\n" + "checkfile=.\\DataFiles\\DGEBody.cal\n" + "limit_bltfast=true\n" + "maxgameticks=1000\n" + "\n" "; Nox\n" "[NOX]\n" "checkfile=.\\NOX.ICD\n" From 99f388407b97ab7a9948060252163c4349c56fce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 21:12:07 +0200 Subject: [PATCH 0337/1053] always force primary update with flip --- src/ddsurface.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index bceeb72..5c52221 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,12 +419,12 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if (g_ddraw.ticks_limiter.tick_length > 0) @@ -651,15 +651,14 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - DWORD time = timeGetTime(); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; @@ -1005,14 +1004,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); - - DWORD time = timeGetTime(); - - if (!(This->flags & DDSD_BACKBUFFERCOUNT) || - (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) - { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - } + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); } return DD_OK; @@ -1191,15 +1183,14 @@ 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); - DWORD time = timeGetTime(); + InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) util_limit_game_ticks(); } From edb0f430916cd81ff73305a026f12e351214b4a9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 21:43:33 +0200 Subject: [PATCH 0338/1053] tweak ticks limiter for nancy drew games --- inc/config.h | 2 +- inc/dd.h | 7 ++++++- src/IDirectDraw/IDirectDraw.c | 2 +- src/config.c | 18 ++++++++++-------- src/dd.c | 11 +++++++++++ src/ddsurface.c | 24 +++++++----------------- 6 files changed, 36 insertions(+), 28 deletions(-) diff --git a/inc/config.h b/inc/config.h index abaa180..0e9f89d 100644 --- a/inc/config.h +++ b/inc/config.h @@ -47,6 +47,7 @@ typedef struct CNCDDRAWCONFIG BOOL noactivateapp; int maxgameticks; + int limiter_type; int minfps; BOOL nonexclusive; BOOL singlecpu; @@ -62,7 +63,6 @@ typedef struct CNCDDRAWCONFIG int hook; int guard_lines; int max_resolutions; - BOOL limit_bltfast; BOOL lock_surfaces; BOOL allow_wmactivate; BOOL flipclear; diff --git a/inc/dd.h b/inc/dd.h index 01e535e..e28249a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -24,6 +24,7 @@ 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_TestCooperativeLevel(); HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid); HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter); @@ -45,13 +46,17 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define SDM_LEAVE_WINDOWED 0x00000002l #define SDM_LEAVE_FULLSCREEN 0x00000004l +#define LIMIT_AUTO 0 +#define LIMIT_TESTCOOP 1 +#define LIMIT_BLTFAST 2 + typedef struct SPEEDLIMITER { DWORD tick_length; LONGLONG tick_length_ns; HANDLE htimer; LARGE_INTEGER due_time; - BOOL use_blt_or_flip; + BOOL dds_unlock_limiter_disabled; } SPEEDLIMITER; struct IDirectDrawSurfaceImpl; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3bd8379..3de9572 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -487,7 +487,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); - HRESULT ret = g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; + HRESULT ret = dd_TestCooperativeLevel(); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; } diff --git a/src/config.c b/src/config.c index 37d7f0e..0b4c5a3 100644 --- a/src/config.c +++ b/src/config.c @@ -59,6 +59,7 @@ void cfg_load() GET_BOOL(g_config.noactivateapp, "noactivateapp", FALSE); 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.singlecpu, "singlecpu", TRUE); @@ -75,7 +76,6 @@ void cfg_load() GET_INT(g_config.hook, "hook", 4); GET_INT(g_config.guard_lines, "guard_lines", 200); GET_INT(g_config.max_resolutions, "max_resolutions", 0); - GET_BOOL(g_config.limit_bltfast, "limit_bltfast", FALSE); 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); @@ -262,6 +262,9 @@ 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" + "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" "; Note: Set this to a low value such as 5 or 10 if some parts of the game are not being displayed (e.g. menus or loading screens)\n" "minfps=0\n" @@ -295,7 +298,6 @@ static void cfg_create_ini() "hook=4\n" "guard_lines=200\n" "max_resolutions=0\n" - "limit_bltfast=false\n" "lock_surfaces=false\n" "allow_wmactivate=false\n" "flipclear=false\n" @@ -779,7 +781,7 @@ static void cfg_create_ini() "[AdSanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "\n" "; Dark Reign: The Future of War\n" "[DKReign]\n" @@ -983,12 +985,12 @@ static void cfg_create_ini() "\n" "; Knights and Merchants The Shattered Kingdom\n" "[KaM_800]\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=60\n" "\n" "; Knights and Merchants The Shattered Kingdom\n" "[KaM_1024]\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=60\n" "\n" "; Little Bear Kindergarten/Preschool Thinking Adventures: Parent's Progress Report\n" @@ -1083,13 +1085,13 @@ static void cfg_create_ini() "; Nancy Drew: Message in a Haunted Mansion\n" "[Game/3]\n" "checkfile=.\\DataFiles\\ASABYBD.cal\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=600\n" "\n" "; Nancy Drew: Secret of Shadow Ranch\n" "[Game/4]\n" "checkfile=.\\DataFiles\\DGEBody.cal\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "maxgameticks=1000\n" "\n" "; Nox\n" @@ -1382,7 +1384,7 @@ static void cfg_create_ini() "[sanguo]\n" "maxgameticks=60\n" "noactivateapp=true\n" - "limit_bltfast=true\n" + "limiter_type=2\n" "\n" "; RollerCoaster Tycoon\n" "[rct]\n" diff --git a/src/dd.c b/src/dd.c index fe94379..20203fe 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1531,6 +1531,17 @@ HRESULT dd_GetVerticalBlankStatus(LPBOOL lpbIsInVB) return DD_OK; } +HRESULT dd_TestCooperativeLevel() +{ + if (g_config.limiter_type == LIMIT_TESTCOOP && g_ddraw.ticks_limiter.tick_length > 0) + { + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; + util_limit_game_ticks(); + } + + return g_config.tlc_hack ? DDERR_NOEXCLUSIVEMODE : DD_OK; +} + HRESULT dd_GetDeviceIdentifier(LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags, REFIID riid) { if (!pDDDI) diff --git a/src/ddsurface.c b/src/ddsurface.c index 5c52221..2c14a2a 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -429,7 +429,7 @@ HRESULT dds_Blt( if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -659,9 +659,9 @@ HRESULT dds_BltFast( if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - if (g_config.limit_bltfast && g_ddraw.ticks_limiter.tick_length > 0) + if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -810,7 +810,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa if (g_ddraw.ticks_limiter.tick_length > 0) { - g_ddraw.ticks_limiter.use_blt_or_flip = TRUE; + g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; util_limit_game_ticks(); } } @@ -1133,12 +1133,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (erase) { - BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; - - DDBLTFX fx = { .dwFillColor = 0xFE }; - IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - - g_ddraw.ticks_limiter.use_blt_or_flip = x; + blt_clear(This->surface, 0xFE, This->size); } } @@ -1172,12 +1167,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) ReleaseDC(hwnd, hdc); } - BOOL x = g_ddraw.ticks_limiter.use_blt_or_flip; - - DDBLTFX fx = { .dwFillColor = 0 }; - IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); - - g_ddraw.ticks_limiter.use_blt_or_flip = x; + blt_clear(This->surface, 0x00, This->size); } @@ -1191,7 +1181,7 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { - if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.use_blt_or_flip) + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) util_limit_game_ticks(); } } From b0a3db30a566cfcd05db9f4968af2dd3a159ccfd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 22:51:26 +0200 Subject: [PATCH 0339/1053] short SDM calls --- src/utils.c | 10 +++++----- src/wndproc.c | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utils.c b/src/utils.c index 9b0ce23..09238fe 100644 --- a/src/utils.c +++ b/src/utils.c @@ -434,7 +434,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = TRUE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); mouse_lock(); } @@ -443,7 +443,7 @@ void util_toggle_fullscreen() mouse_unlock(); g_config.upscaled_state = g_config.fullscreen = FALSE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); //mouse_lock(); } @@ -460,7 +460,7 @@ void util_toggle_fullscreen() } g_config.window_state = g_config.windowed = FALSE; - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_WINDOWED); + dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_WINDOWED); util_update_bnet_pos(0, 0); mouse_lock(); @@ -496,7 +496,7 @@ void util_toggle_fullscreen() ChangeDisplaySettings(NULL, g_ddraw.bnet_active ? CDS_FULLSCREEN : 0); } - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, SDM_LEAVE_FULLSCREEN); + dd_SetDisplayMode(0, 0, 0, SDM_LEAVE_FULLSCREEN); //mouse_lock(); } } @@ -547,7 +547,7 @@ void util_set_window_rect(int x, int y, int width, int height, UINT flags) g_config.window_rect.right = width; } - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } } diff --git a/src/wndproc.c b/src/wndproc.c index 812f96f..86a9c4c 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -282,7 +282,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam in_size_move = FALSE; if (!g_ddraw.render.thread) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } break; } @@ -437,7 +437,7 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam g_config.window_rect.bottom = HIWORD(lParam); if (g_config.window_rect.right != g_ddraw.render.width || g_config.window_rect.bottom != g_ddraw.render.height) - dd_SetDisplayMode(g_ddraw.width, g_ddraw.height, g_ddraw.bpp, 0); + dd_SetDisplayMode(0, 0, 0, 0); } } } From 9b32e255922fffa771ddb15aa0e4611880a9be11 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:35:13 +0200 Subject: [PATCH 0340/1053] update nancy drew presets --- src/config.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/config.c b/src/config.c index 0b4c5a3..47e0289 100644 --- a/src/config.c +++ b/src/config.c @@ -1082,17 +1082,11 @@ static void cfg_create_ini() "adjmouse=true\n" "hook_peekmessage=true\n" "\n" - "; Nancy Drew: Message in a Haunted Mansion\n" + "; Nancy Drew (All games)\n" "[Game/3]\n" - "checkfile=.\\DataFiles\\ASABYBD.cal\n" - "limiter_type=2\n" - "maxgameticks=600\n" - "\n" - "; Nancy Drew: Secret of Shadow Ranch\n" - "[Game/4]\n" - "checkfile=.\\DataFiles\\DGEBody.cal\n" - "limiter_type=2\n" - "maxgameticks=1000\n" + "checkfile=.\\Nancy.cid\n" + "limiter_type=1\n" + "maxgameticks=120\n" "\n" "; Nox\n" "[NOX]\n" From d0b23e5273a50f8e49961ceab4de27cea01669c0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:54:33 +0200 Subject: [PATCH 0341/1053] hook quicktime by default --- src/hook.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/hook.c b/src/hook.c index 459661d..c6ef7df 100644 --- a/src/hook.c +++ b/src/hook.c @@ -540,6 +540,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) if (is_local || _strcmpi(mod_filename, "mciavi32") == 0 || + _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -605,6 +606,7 @@ void hook_revert(HOOKLIST* hooks) if (is_local || _strcmpi(mod_filename, "mciavi32") == 0 || + _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) From 2301ba971bed191b554c9b640878945973da10c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 31 May 2024 23:55:10 +0200 Subject: [PATCH 0342/1053] update American Girls Dress Designer preset --- src/config.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/config.c b/src/config.c index 47e0289..6205ecd 100644 --- a/src/config.c +++ b/src/config.c @@ -402,9 +402,6 @@ static void cfg_create_ini() "; American Girls Dress Designer\n" "[Dress Designer]\n" "fake_mode=640x480x32\n" - "border=false\n" - "posX=0\n" - "posY=0\n" "nonexclusive=true\n" "\n" "; Age of Wonders 2\n" From c66b972f6853e5c6c601aba6b4a1447862f34bff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 02:20:21 +0200 Subject: [PATCH 0343/1053] fix chils windows in dress designer --- src/render_gdi.c | 2 +- src/winapi_hooks.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/render_gdi.c b/src/render_gdi.c index 78f7d5d..d67bee9 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -93,7 +93,7 @@ DWORD WINAPI gdi_render_main(void) memcpy(&g_ddraw.primary->bmi->bmiColors[0], g_ddraw.primary->palette->data_rgb, 256 * sizeof(int)); } - if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE)) + if (InterlockedExchange(&g_ddraw.render.clear_screen, FALSE) || g_ddraw.child_window_exists) { RECT rc = { 0, 0, g_ddraw.render.width, g_ddraw.render.height }; FillRect(g_ddraw.render.hdc, &rc, (HBRUSH)GetStockObject(BLACK_BRUSH)); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 9ee2eab..d4431b0 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -38,7 +38,7 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) 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) + if (g_config.adjmouse && !g_ddraw.child_window_exists) { x = (DWORD)(roundf(x * g_ddraw.mouse.unscale_x)); y = (DWORD)(roundf(y * g_ddraw.mouse.unscale_y)); @@ -1464,6 +1464,16 @@ HWND WINAPI fake_CreateWindowExA( dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* The American Girls Dress Designer */ + if (HIWORD(lpClassName) && + _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_config.fake_mode[0] && + (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) + { + dwStyle &= ~WS_POPUP; + } + /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && From dd04e8ce74d9cb74431e309b839adce35d734e81 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 04:08:14 +0200 Subject: [PATCH 0344/1053] fix TLC launcher fullscreen mode --- src/config.c | 2 -- src/winapi_hooks.c | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 6205ecd..3a252ad 100644 --- a/src/config.c +++ b/src/config.c @@ -1362,8 +1362,6 @@ static void cfg_create_ini() "; The Learning Company Launcher\n" "[TLCLauncher]\n" "tlc_hack=true\n" - "windowed=true\n" - "fullscreen=false\n" "adjmouse=false\n" "width=0\n" "height=0\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d4431b0..065de5d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -511,7 +511,7 @@ BOOL WINAPI fake_ShowWindow(HWND hWnd, int nCmdShow) if (nCmdShow == SW_MAXIMIZE) nCmdShow = SW_NORMAL; - if (nCmdShow == SW_MINIMIZE && g_config.hook != 2) + if (nCmdShow == SW_MINIMIZE && g_config.hook != 2 && !g_config.tlc_hack) return TRUE; } From 416c6a8d92725d40e7aa02343fa149c1f889551d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 06:30:00 +0200 Subject: [PATCH 0345/1053] detect learning company games and remove presets --- src/config.c | 238 ++++----------------------------------------- src/winapi_hooks.c | 23 ++++- 2 files changed, 37 insertions(+), 224 deletions(-) diff --git a/src/config.c b/src/config.c index 3a252ad..e03a05e 100644 --- a/src/config.c +++ b/src/config.c @@ -463,26 +463,6 @@ static void cfg_create_ini() "[Arthur]\n" "renderer=gdi\n" "\n" - "; Arthur's Pet Chase\n" - "[ArthurPP]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Arthur's Sand Castle Contest\n" - "[ArthurSC]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Batman: Toxic Chill\n" - "[Bat1]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Batman: Justice Unbalanced\n" - "[Bat2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=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" @@ -700,6 +680,24 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; ClueFinders Math Adventures 1.0\n" + "[TCFM32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" + "; ClueFinders Math Adventures 1.0\n" + "[cfmath32]\n" + "adjmouse=false\n" + "width=0\n" + "height=0\n" + "resizable=false\n" + "maintas=false\n" + "boxing=false\n" + "\n" "; Call To Power 2\n" "[ctp2]\n" "maintas=false\n" @@ -709,66 +707,6 @@ static void cfg_create_ini() "[corsairs]\n" "adjmouse=true\n" "\n" - "; ClueFinders Search and Solve Adventures\n" - "[CFSEARCH]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Mystery Mansion\n" - "[ClueFinders Mystery Mansion]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders The Incredible Toy Store Adventure\n" - "[ToyStore]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 3rd Grade Adventures\n" - "[3rdadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 4th Grade Adventures\n" - "[4thadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 4th Grade Adventures\n" - "[4thad32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 5th Grade Adventures\n" - "[5thadv32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 5th Grade Adventures\n" - "[5thad32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders 6th Grade Adventures\n" - "[CF6]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders(R) Reading Adventures Ages 9-12\n" - "[cfread]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Math Adventures 1.0\n" - "[TCFM32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; ClueFinders Math Adventures 2.0\n" - "[cfmath32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Divine Divinity\n" "[div]\n" "resolutions=2\n" @@ -857,11 +795,6 @@ static void cfg_create_ini() "noactivateapp=true\n" "nonexclusive=true\n" "\n" - "; Hamtaro: Wake Up Snoozer!\n" - "[Ham]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Jazz Jackrabbit 2 plus\n" "[Jazz2]\n" "keytogglefullscreen=0x08\n" @@ -1130,96 +1063,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; Reader Rabbit Toddler: Fly the Dreamship\n" - "[Fly the Dreamship]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Toddler: Playtime for Baby\n" - "[rrbaby]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learn To Read With Phonics\n" - "[Superr]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Math Ages 4-6\n" - "[RRM46]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit's(R) Math Ages 6 - 9 (2002)\n" - "[RRM69_32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Preschool 2002\n" - "[Preschool Sparkle Star Rescue]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Preschool 2002\n" - "[RRP]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit 1st Grade\n" - "[RR1]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit 2nd Grade\n" - "[RR2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten\n" - "[RRK]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learn To Read With Phonics: 1st - 2nd Grade\n" - "[Learn to read Grades 1-2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Calendar \n" - "[Calendar]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Music\n" - "[Music]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Learning Creations: Paint\n" - "[Paint]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Dreamship Tales\n" - "[Dreamship Tales]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten\n" - "[rrk32]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten: Creative\n" - "[creative]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Reader Rabbit Kindergarten: Learning Creations\n" - "[Learning Creations]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Reader Rabbit Reading Ages 4-6\n" "[rrirjw32]\n" "renderer=gdi\n" @@ -1253,31 +1096,6 @@ static void cfg_create_ini() "[s3]\n" "nonexclusive=true\n" "\n" - "; Scooby-Doo(TM), Case File #2 The Scary Stone Dragon\n" - "[Case File #2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Strawberry Shortcake: Amazing Cookie Party\n" - "[Strawberry]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; SpongeBob SquarePants: Typing\n" - "[SPT]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; StarFlyers Royal Jewel Rescue\n" - "[Royal Jewel Rescue]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; StarFlyers Alien Space Chase\n" - "[Alien Space Chase]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Star Trek - Armada\n" "[Armada]\n" "armadahack=true\n" @@ -1337,11 +1155,6 @@ static void cfg_create_ini() "maintas=false\n" "boxing=false\n" "\n" - "; The Powerpuff Girls(TM) Mojo Jojo's Clone Zone / The Powerpuff Girls - Princess Snorebucks\n" - "[Powerpuff Girls]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" "max_resolutions=32\n" @@ -1444,21 +1257,6 @@ static void cfg_create_ini() "[Zeus]\n" "adjmouse=true\n" "\n" - "; Zoombinis Logical Journey\n" - "[Zoombinis Logicial Journey]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Zoombinis Mountain Rescue\n" - "[zoombini2]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" - "; Zoombinis Island Odyssey\n" - "[Zoombinis Island Odyssey]\n" - "fixchilds=3\n" - "lock_mouse_top_left=true\n" - "\n" , fh); fclose(fh); diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 065de5d..ed87c1e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1464,9 +1464,25 @@ HWND WINAPI fake_CreateWindowExA( dbg_dump_wnd_styles(dwStyle, dwExStyle); + /* Almost all of the Learning Company Games */ + if (!dwExStyle && + HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 && + !lpWindowName && + dwStyle == WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS && + !X && + !Y && + g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && + g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + !hMenu) + { + dwExStyle = WS_EX_TRANSPARENT; + g_config.lock_mouse_top_left = TRUE; + g_config.adjmouse = FALSE; + dd_SetDisplayMode(0, 0, 0, 0); + } + /* The American Girls Dress Designer */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AfxFrameOrView42s") == 0 && g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && g_config.fake_mode[0] && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) @@ -1475,8 +1491,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Center Claw DVD movies */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "Afx:400000:3") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { From fb858f3f083dbf2582b8eea80314e1cdd361a3b7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:29:48 +0200 Subject: [PATCH 0346/1053] set up .ini section once and then reuse it --- inc/config.h | 1 + src/config.c | 69 +++++++++++++++++++++++++++++++--------------- src/winapi_hooks.c | 3 +- 3 files changed, 50 insertions(+), 23 deletions(-) diff --git a/inc/config.h b/inc/config.h index 0e9f89d..f6744a4 100644 --- a/inc/config.h +++ b/inc/config.h @@ -18,6 +18,7 @@ typedef struct CNCDDRAWCONFIG char dll_file_name[MAX_PATH]; char process_file_ext[MAX_PATH]; char dll_file_ext[MAX_PATH]; + char game_section[MAX_PATH]; INIFILE ini; BOOL d3d9on12; BOOL opengl_core; diff --git a/src/config.c b/src/config.c index e03a05e..90b5a07 100644 --- a/src/config.c +++ b/src/config.c @@ -18,6 +18,7 @@ static void cfg_create_ini(); static BOOL cfg_get_bool(LPCSTR key, BOOL default_value); static int cfg_get_int(LPCSTR key, int default_value); static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size); +static DWORD cfg_get_game_section(LPSTR buf, DWORD size); #define GET_INT(a,b,c) a = cfg_get_int(b, c); TRACE("%s=%d\n", b, a) #define GET_BOOL(a,b,c) a = cfg_get_bool(b, c); TRACE("%s=%s\n", b, a ? "true" : "false") @@ -1333,11 +1334,15 @@ static void cfg_init() } ini_create(&g_config.ini, g_config.ini_path); + cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); } -static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, DWORD out_size) +static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { - char buf[MAX_PATH] = { 0 }; + if (!buf || size == 0) + return 0; + + char tmp[MAX_PATH] = { 0 }; if (IsWine()) { @@ -1346,26 +1351,29 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, if (ini_section_exists(&g_config.ini, section)) { - DWORD x = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - - if (x > 0) - return x; - - return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + strncpy(buf, section, size - 1); + buf[size - 1] = 0; + return strlen(buf); } } - DWORD s = ini_get_string(&g_config.ini, g_config.process_file_name, key, "", out_string, out_size); - - if (s > 0) + if (ini_section_exists(&g_config.ini, g_config.process_file_name)) { - if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", buf, sizeof(buf)) > 0) + if (ini_get_string(&g_config.ini, g_config.process_file_name, "checkfile", "", tmp, sizeof(tmp)) > 0) { - if (FILE_EXISTS(buf)) - return s; + if (FILE_EXISTS(tmp)) + { + strncpy(buf, g_config.process_file_name, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } else - return s; + { + strncpy(buf, g_config.process_file_name, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } for (int i = 2; i < 10; i++) @@ -1373,19 +1381,36 @@ static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR out_string, char section[MAX_PATH] = { 0 }; _snprintf(section, sizeof(section) - 1, "%s/%d", g_config.process_file_name, i); - DWORD s = ini_get_string(&g_config.ini, section, key, "", out_string, out_size); - - if (s > 0) + if (ini_section_exists(&g_config.ini, section)) { - if (ini_get_string(&g_config.ini, section, "checkfile", "", buf, sizeof(buf)) > 0) + if (ini_get_string(&g_config.ini, section, "checkfile", "", tmp, sizeof(tmp)) > 0) { - if (FILE_EXISTS(buf)) - return s; + if (FILE_EXISTS(tmp)) + { + strncpy(buf, section, size - 1); + buf[size - 1] = 0; + return strlen(buf); + } } } } - return ini_get_string(&g_config.ini, "ddraw", key, default_value, out_string, out_size); + buf[0] = 0; + + return 0; +} + +static DWORD cfg_get_string(LPCSTR key, LPCSTR default_value, LPSTR buf, DWORD size) +{ + if (g_config.game_section[0]) + { + DWORD s = ini_get_string(&g_config.ini, g_config.game_section, key, "", buf, size); + + if (s > 0) + return s; + } + + return ini_get_string(&g_config.ini, "ddraw", key, default_value, buf, size); } static BOOL cfg_get_bool(LPCSTR key, BOOL default_value) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index ed87c1e..6302498 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1473,7 +1473,8 @@ HWND WINAPI fake_CreateWindowExA( !Y && g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - !hMenu) + !hMenu && + !g_config.game_section[0]) { dwExStyle = WS_EX_TRANSPARENT; g_config.lock_mouse_top_left = TRUE; From d8f29883b744240620ac4347c80600826201e288 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:41:03 +0200 Subject: [PATCH 0347/1053] fix warnings --- src/config.c | 8 ++++---- src/winapi_hooks.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/config.c b/src/config.c index 90b5a07..1bb06ff 100644 --- a/src/config.c +++ b/src/config.c @@ -1351,7 +1351,7 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) if (ini_section_exists(&g_config.ini, section)) { - strncpy(buf, section, size - 1); + strncpy(buf, section, size); buf[size - 1] = 0; return strlen(buf); } @@ -1363,14 +1363,14 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { if (FILE_EXISTS(tmp)) { - strncpy(buf, g_config.process_file_name, size - 1); + strncpy(buf, g_config.process_file_name, size); buf[size - 1] = 0; return strlen(buf); } } else { - strncpy(buf, g_config.process_file_name, size - 1); + strncpy(buf, g_config.process_file_name, size); buf[size - 1] = 0; return strlen(buf); } @@ -1387,7 +1387,7 @@ static DWORD cfg_get_game_section(LPSTR buf, DWORD size) { if (FILE_EXISTS(tmp)) { - strncpy(buf, section, size - 1); + strncpy(buf, section, size); buf[size - 1] = 0; return strlen(buf); } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6302498..b64dda1 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1468,7 +1468,7 @@ HWND WINAPI fake_CreateWindowExA( if (!dwExStyle && HIWORD(lpClassName) && _strcmpi(lpClassName, "OMWindowChildClass") == 0 && !lpWindowName && - dwStyle == WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS && + dwStyle == (WS_CHILD | WS_CHILDWINDOW | WS_CLIPSIBLINGS) && !X && !Y && g_ddraw.ref && g_ddraw.width && g_ddraw.width == nWidth && g_ddraw.height == nHeight && From 087cfcc9fd474139078e0c43617bb788b4f9d089 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 07:41:48 +0200 Subject: [PATCH 0348/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 3affdbe..04f5b86 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 13df4b3cac1bcc52cbdb5a42d521e88789b96ccb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 20:43:38 +0200 Subject: [PATCH 0349/1053] fix windowed mode in some games --- 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 b64dda1..652436c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1641,7 +1641,19 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD } } - return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + HRESULT result = real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( From 0100459248db276523477254c970257173091759 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 22:30:38 +0200 Subject: [PATCH 0350/1053] fix cutscene playbakc issues on windows 7 --- src/hook.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index 1d73afe..6fc3abc 100644 --- a/src/hook.c +++ b/src/hook.c @@ -477,9 +477,12 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) continue; BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + + BOOL wine_hook = is_wine && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) @@ -554,9 +557,12 @@ void hook_revert(HOOKLIST* hooks) _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + + BOOL wine_hook = is_wine && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || _strcmpi(mod_filename, "winmm") == 0) From f3e69355e569d2ac616206c9fedb255b7751b583 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 22:56:17 +0200 Subject: [PATCH 0351/1053] fix cutscene playback in some games --- inc/hook.h | 5 +++-- inc/winapi_hooks.h | 3 ++- src/IDirectDraw/IDirectDraw.c | 1 + src/hook.c | 9 ++++++++- src/winapi_hooks.c | 31 ++++++++++++++++++++++++++++++- 5 files changed, 44 insertions(+), 5 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 1663f99..7f9c017 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -1,10 +1,8 @@ #ifndef HOOK_H #define HOOK_H -#define WIN32_LEAN_AND_MEAN #include - #define HOOK_SKIP_2 0x00000001l #define HOOK_LOCAL_ONLY 0x00000002l @@ -59,6 +57,8 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); 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); extern GETCURSORPOSPROC real_GetCursorPos; @@ -102,6 +102,7 @@ extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; +extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index b2962da..f99fde1 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -1,7 +1,6 @@ #ifndef WINAPI_HOOKS_H #define WINAPI_HOOKS_H -#define WIN32_LEAN_AND_MEAN #include @@ -66,6 +65,8 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam); + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3bf3861..166d388 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDraw.h" #include "IDirect3D.h" diff --git a/src/hook.c b/src/hook.c index 6fc3abc..628a5ae 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,4 +1,3 @@ -#define WIN32_LEAN_AND_MEAN #include #include #include @@ -57,6 +56,7 @@ LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; +MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; HOOKLIST g_hook_hooklist[] = @@ -101,6 +101,13 @@ HOOKLIST g_hook_hooklist[] = { "CoCreateInstance", (PROC)fake_CoCreateInstance, (PROC*)&real_CoCreateInstance, HOOK_SKIP_2 }, { "", NULL, NULL, 0 } } + }, + { + "winmm.dll", + { + { "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } }, { "dinput.dll", diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index a165b39..3818fb5 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1324,7 +1324,36 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD } } - return real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + HRESULT result = real_CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; +} + +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam) +{ + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; } LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( From 6eaac8642d90b9be0143af6ffd5f079cd8a35afe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 22:59:12 +0200 Subject: [PATCH 0352/1053] fix cutscene playback on windows 7 --- src/hook.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index c6ef7df..372d891 100644 --- a/src/hook.c +++ b/src/hook.c @@ -9,6 +9,7 @@ #include "dllmain.h" #include "config.h" #include "utils.h" +#include "versionhelpers.h" #ifdef _MSC_VER #include "detours.h" @@ -537,9 +538,10 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) continue; BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || @@ -603,9 +605,10 @@ void hook_revert(HOOKLIST* hooks) _splitpath(mod_path, NULL, mod_dir, mod_filename, NULL); BOOL is_local = _strnicmp(game_dir, mod_dir, strlen(game_dir)) == 0; + BOOL wine_hook = IsWine() && _strcmpi(mod_filename, "mciavi32") == 0; if (is_local || - _strcmpi(mod_filename, "mciavi32") == 0 || + wine_hook || _strcmpi(mod_filename, "QuickTime") == 0 || _strcmpi(mod_filename, "MSVFW32") == 0 || _strcmpi(mod_filename, "quartz") == 0 || From 7d0eeb7810d94d1146e8349464e05c4108d5f3cc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 23:04:06 +0200 Subject: [PATCH 0353/1053] make sure quarts and msvfw are hooked --- inc/hook.h | 3 ++- inc/winapi_hooks.h | 3 ++- src/IDirectDraw/IDirectDraw.c | 1 + src/hook.c | 9 ++++++++- src/winapi_hooks.c | 17 +++++++++++++++++ 5 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 15b49df..e2a5b87 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -1,7 +1,6 @@ #ifndef HOOK_H #define HOOK_H -#define WIN32_LEAN_AND_MEAN #include @@ -71,6 +70,7 @@ typedef HMODULE(WINAPI* LOADLIBRARYEXWPROC)(LPCWSTR, HANDLE, DWORD); typedef FARPROC(WINAPI* GETPROCADDRESSPROC)(HMODULE, LPCSTR); typedef BOOL(WINAPI* GETDISKFREESPACEAPROC)(LPCSTR, LPDWORD, LPDWORD, LPDWORD, LPDWORD); 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); extern GETCURSORPOSPROC real_GetCursorPos; @@ -119,6 +119,7 @@ extern LOADLIBRARYEXWPROC real_LoadLibraryExW; extern GETPROCADDRESSPROC real_GetProcAddress; extern GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA; extern COCREATEINSTANCEPROC real_CoCreateInstance; +extern MCISENDCOMMANDAPROC real_mciSendCommandA; extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 89a948c..3ce0ba3 100644 --- a/inc/winapi_hooks.h +++ b/inc/winapi_hooks.h @@ -1,7 +1,6 @@ #ifndef WINAPI_HOOKS_H #define WINAPI_HOOKS_H -#define WIN32_LEAN_AND_MEAN #include @@ -79,6 +78,8 @@ HWND WINAPI fake_CreateWindowExA( HRESULT WINAPI fake_CoCreateInstance( REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID* ppv); +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam); + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter); diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 3de9572..f0ee793 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDraw.h" #include "IDirect3D.h" diff --git a/src/hook.c b/src/hook.c index 372d891..f65d714 100644 --- a/src/hook.c +++ b/src/hook.c @@ -1,4 +1,3 @@ -#define WIN32_LEAN_AND_MEAN #include #include #include "directinput.h" @@ -63,6 +62,7 @@ LOADLIBRARYEXWPROC real_LoadLibraryExW = LoadLibraryExW; GETPROCADDRESSPROC real_GetProcAddress = GetProcAddress; GETDISKFREESPACEAPROC real_GetDiskFreeSpaceA = GetDiskFreeSpaceA; COCREATEINSTANCEPROC real_CoCreateInstance = CoCreateInstance; +MCISENDCOMMANDAPROC real_mciSendCommandA = mciSendCommandA; SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter = SetUnhandledExceptionFilter; HOOKLIST g_hook_hooklist[] = @@ -112,6 +112,13 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, + { + "winmm.dll", + { + { "mciSendCommandA", (PROC)fake_mciSendCommandA, (PROC*)&real_mciSendCommandA, HOOK_SKIP_2 }, + { "", NULL, NULL, 0 } + } + }, { "dinput.dll", { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 652436c..98d5126 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1656,6 +1656,23 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD return result; } +MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR fdwCommand, DWORD_PTR dwParam) +{ + /* These dlls must be hooked for cutscene uscaling and windowed mode */ + HMODULE quartz_dll = GetModuleHandleA("quartz"); + HMODULE msvfw32_dll = GetModuleHandleA("msvfw32"); + + MCIERROR result = real_mciSendCommandA(IDDevice, uMsg, fdwCommand, dwParam); + + if ((!quartz_dll && GetModuleHandleA("quartz")) || + (!msvfw32_dll && GetModuleHandleA("msvfw32"))) + { + hook_init(FALSE); + } + + return result; +} + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI fake_SetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) { From fb6521fee18bf8815406a6996a72bc27e94ade71 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 1 Jun 2024 23:08:13 +0200 Subject: [PATCH 0354/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 04f5b86..ee20179 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 f9fa52a61f807f327311c2c5fcfd54fcd2472ea9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 01:54:14 +0200 Subject: [PATCH 0355/1053] fix lock_mouse_top_left setting --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 20203fe..13e3262 100644 --- a/src/dd.c +++ b/src/dd.c @@ -882,6 +882,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl { g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + + if (g_config.lock_mouse_top_left) + { + g_ddraw.mouse.x_adjust = 0; + g_ddraw.mouse.y_adjust = 0; } g_ddraw.mouse.rc.left = g_ddraw.mouse.x_adjust; From 04693dfb96e22576a391791d0bce67850924e5bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 01:54:27 +0200 Subject: [PATCH 0356/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index ee20179..b0c68f3 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 bdc54afcf09eb9b3c4a00732e6a1cebd5c47b12e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 02:02:27 +0200 Subject: [PATCH 0357/1053] fix build --- src/dd.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index 13e3262..6fa8c9a 100644 --- a/src/dd.c +++ b/src/dd.c @@ -878,10 +878,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)); } - if (!g_config.lock_mouse_top_left) - { - g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; - g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; + g_ddraw.mouse.x_adjust = g_ddraw.render.viewport.x; + g_ddraw.mouse.y_adjust = g_ddraw.render.viewport.y; if (g_config.lock_mouse_top_left) { From 802a9e2f9685bbf9faf238b25e5b4ce6d15b5164 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 02:05:44 +0200 Subject: [PATCH 0358/1053] improve cursor lock click checks --- src/wndproc.c | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 86a9c4c..b2ebd71 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -842,6 +842,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam 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); @@ -927,8 +930,25 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam { if (!g_config.devmode && !g_mouse_locked) { - int x = (DWORD)((GET_X_LPARAM(lParam) - g_ddraw.render.viewport.x) * g_ddraw.mouse.unscale_x); - int y = (DWORD)((GET_Y_LPARAM(lParam) - g_ddraw.render.viewport.y) * g_ddraw.mouse.unscale_y); + 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); From b2e9e427f248ff5cfc7f21bb73d95c4a8efff4ba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:17:57 +0200 Subject: [PATCH 0359/1053] fix atrox cutscenes --- src/dd.c | 3 +-- src/winapi_hooks.c | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 6fa8c9a..65d6d61 100644 --- a/src/dd.c +++ b/src/dd.c @@ -908,6 +908,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)); if (g_config.windowed) { if (g_config.remove_menu && GetMenu(g_ddraw.hwnd)) @@ -1018,8 +1019,6 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } else { - //dbg_dump_wnd_styles(real_GetWindowLongA(g_ddraw.hwnd, GWL_STYLE), real_GetWindowLongA(g_ddraw.hwnd, GWL_EXSTYLE)); - int menu_height = 0; if (GetMenu(g_ddraw.hwnd)) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 98d5126..2e457ea 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -466,8 +466,8 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI } else { - //real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); - //return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); + real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + return real_MapWindowPoints(HWND_DESKTOP, g_ddraw.hwnd, lpPoints, cPoints); } } @@ -479,8 +479,8 @@ int WINAPI fake_MapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UI } else { - //real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); - //return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); + real_MapWindowPoints(g_ddraw.hwnd, HWND_DESKTOP, lpPoints, cPoints); + return real_MapWindowPoints(hWndFrom, hWndTo, lpPoints, cPoints); } } } From 5de8cb476165207f25815e020830da9a6cbb8486 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:18:35 +0200 Subject: [PATCH 0360/1053] 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 65d6d61..ea370aa 100644 --- a/src/dd.c +++ b/src/dd.c @@ -908,7 +908,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 9ac954b7c69f30d4e0de5314ff11077c0eab39c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:19:12 +0200 Subject: [PATCH 0361/1053] update atrox preset --- src/config.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.c b/src/config.c index 1bb06ff..47d1b7f 100644 --- a/src/config.c +++ b/src/config.c @@ -365,6 +365,7 @@ static void cfg_create_ini() "\n" "; Atrox\n" "[Atrox]\n" + "nonexclusive=true\n" "fixchilds=0\n" "allow_wmactivate=true\n" "\n" From 3f611106834d0c508ea527f6d9a268ce1b169bb7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 08:53:07 +0200 Subject: [PATCH 0362/1053] add preset for scooby doo case 1 --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 47d1b7f..8611dc5 100644 --- a/src/config.c +++ b/src/config.c @@ -1090,6 +1090,12 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" + "[Case File #1]\n" + "windowed=true\n" + "nonexclusive=true\n" + "fake_mode=640x480x32\n" + "\n" "; Sim Copter\n" "[SimCopter]\n" "nonexclusive=true\n" From fa8bc4558a1905b070957b78dfc75ad039c04c43 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 09:38:55 +0200 Subject: [PATCH 0363/1053] enable wing32 hooks --- src/hook.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/hook.c b/src/hook.c index f65d714..f26ca90 100644 --- a/src/hook.c +++ b/src/hook.c @@ -148,7 +148,6 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, - /* { "WING32.DLL", { @@ -157,7 +156,6 @@ HOOKLIST g_hook_hooklist[] = { "", NULL, NULL, 0 } } }, - */ { "kernel32.dll", { From 3715f372b9edaff98d84be66ec365161ac08e128 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 09:44:34 +0200 Subject: [PATCH 0364/1053] add preset for Putt-Putt Saves The Zoo --- README.md | 1 + src/config.c | 5 +++++ src/winapi_hooks.c | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f95129d..b4712c5 100644 --- a/README.md +++ b/README.md @@ -230,6 +230,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey +- Putt-Putt Saves The Zoo - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II diff --git a/src/config.c b/src/config.c index 8611dc5..93cb282 100644 --- a/src/config.c +++ b/src/config.c @@ -1048,6 +1048,11 @@ static void cfg_create_ini() "[Pharaoh]\n" "adjmouse=true\n" "\n" + "; Putt-Putt Saves The Zoo\n" + "[PUTTZOO]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" "; Pax Imperia\n" "[Pax Imperia]\n" "nonexclusive=true\n" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 2e457ea..09a8a9e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -858,10 +858,10 @@ BOOL WINAPI fake_StretchBlt( { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdcDest : g_ddraw.render.hdc, - (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(wDest * g_ddraw.render.scale_w), - (int)(hDest * g_ddraw.render.scale_h), + (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(wDest * g_ddraw.render.scale_w)), + (int)(roundf(hDest * g_ddraw.render.scale_h)), hdcSrc, xSrc, ySrc, @@ -936,10 +936,10 @@ BOOL WINAPI fake_BitBlt( { return real_StretchBlt( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(x * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(y * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(cx * g_ddraw.render.scale_w), - (int)(cy * g_ddraw.render.scale_h), + (int)(roundf(x * g_ddraw.render.scale_w)) + g_ddraw.render.viewport.x, + (int)(roundf(y * g_ddraw.render.scale_h)) + g_ddraw.render.viewport.y, + (int)(roundf(cx * g_ddraw.render.scale_w)), + (int)(roundf(cy * g_ddraw.render.scale_h)), hdcSrc, x1, y1, @@ -1079,10 +1079,10 @@ int WINAPI fake_StretchDIBits( return real_StretchDIBits( hwnd == g_ddraw.hwnd ? hdc : g_ddraw.render.hdc, - (int)(xDest * g_ddraw.render.scale_w) + g_ddraw.render.viewport.x, - (int)(yDest * g_ddraw.render.scale_h) + g_ddraw.render.viewport.y, - (int)(DestWidth * g_ddraw.render.scale_w), - (int)(DestHeight * g_ddraw.render.scale_h), + (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(DestWidth * g_ddraw.render.scale_w)), + (int)(roundf(DestHeight * g_ddraw.render.scale_h)), xSrc, ySrc, SrcWidth, From 38d442545d0d67d2835a138a2b30a90ebc1c3aeb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 21:42:46 +0200 Subject: [PATCH 0365/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index b0c68f3..138aeb8 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #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 648fe238cab483bdcd45872ab84c37a8e5103864 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 22:17:26 +0200 Subject: [PATCH 0366/1053] tweak hook function --- inc/hook.h | 2 +- src/dd.c | 2 +- src/dllmain.c | 2 +- src/hook.c | 10 +++++----- src/winapi_hooks.c | 12 ++++++------ 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index e2a5b87..893238f 100644 --- a/inc/hook.h +++ b/inc/hook.h @@ -125,7 +125,7 @@ extern SETUNHANDLEDEXCEPTIONFILTERPROC real_SetUnhandledExceptionFilter; extern BOOL g_hook_active; extern HOOKLIST g_hook_hooklist[]; -void hook_init(BOOL initial_hook); +void hook_init(); void hook_exit(); void hook_patch_iat(HMODULE hmod, BOOL unhook, char* module_name, char* function_name, PROC new_function); void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_local); diff --git a/src/dd.c b/src/dd.c index ea370aa..cc2d248 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1202,7 +1202,7 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (!g_ddraw.wndproc) { - hook_init(FALSE); + hook_init(); g_ddraw.wndproc = (WNDPROC)real_SetWindowLongA(g_ddraw.hwnd, GWL_WNDPROC, (LONG)fake_WndProc); g_ddraw.gui_thread_id = GetWindowThreadProcessId(g_ddraw.hwnd, NULL); diff --git a/src/dllmain.c b/src/dllmain.c index 0f9e5c4..c131c54 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -121,7 +121,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) } timeBeginPeriod(1); - hook_init(TRUE); + hook_init(); break; } case DLL_PROCESS_DETACH: diff --git a/src/hook.c b/src/hook.c index f26ca90..9d9b54c 100644 --- a/src/hook.c +++ b/src/hook.c @@ -632,9 +632,9 @@ void hook_revert(HOOKLIST* hooks) } } -void hook_init(BOOL initial_hook) +void hook_init() { - if (initial_hook) + if (!g_hook_active) { if (g_config.hook == 4 && hook_got_ddraw_import(GetModuleHandleA(NULL), TRUE)) { @@ -646,7 +646,7 @@ void hook_init(BOOL initial_hook) if (!g_hook_active || g_config.hook == 3 || g_config.hook == 4) { #if defined(_DEBUG) && defined(_MSC_VER) - if (initial_hook) + if (!g_hook_active) { DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); @@ -655,12 +655,12 @@ void hook_init(BOOL initial_hook) } #endif - if (initial_hook) + if (!g_hook_active) { hook_patch_iat(GetModuleHandle("AcGenral"), FALSE, "user32.dll", "SetWindowsHookExA", (PROC)fake_SetWindowsHookExA); } - hook_create((HOOKLIST*)&g_hook_hooklist, initial_hook); + hook_create((HOOKLIST*)&g_hook_hooklist, !g_hook_active); g_hook_active = TRUE; } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 09a8a9e..560a8b8 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1195,7 +1195,7 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1223,7 +1223,7 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1251,7 +1251,7 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1279,7 +1279,7 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw if (hmod && hmod != hmod_old) { - hook_init(FALSE); + hook_init(); } return hmod; @@ -1650,7 +1650,7 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD if ((!quartz_dll && GetModuleHandleA("quartz")) || (!msvfw32_dll && GetModuleHandleA("msvfw32"))) { - hook_init(FALSE); + hook_init(); } return result; @@ -1667,7 +1667,7 @@ MCIERROR WINAPI fake_mciSendCommandA(MCIDEVICEID IDDevice, UINT uMsg, DWORD_PTR if ((!quartz_dll && GetModuleHandleA("quartz")) || (!msvfw32_dll && GetModuleHandleA("msvfw32"))) { - hook_init(FALSE); + hook_init(); } return result; From b8162e61a33d9d366bb33b0a83886131cc29b937 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 22:45:07 +0200 Subject: [PATCH 0367/1053] remove warwind preset --- src/config.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/config.c b/src/config.c index 93cb282..ac412f3 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,10 +1262,6 @@ static void cfg_create_ini() "height=0\n" "resizable=false\n" "\n" - "; War Wind\n" - "[WW]\n" - "minfps=-1\n" - "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From ba43c9525cbbe0f2a17eec5c93368b738a3b1721 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 23:53:49 +0200 Subject: [PATCH 0368/1053] Revert "remove warwind preset" This reverts commit b8162e61a33d9d366bb33b0a83886131cc29b937. --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index ac412f3..93cb282 100644 --- a/src/config.c +++ b/src/config.c @@ -1262,6 +1262,10 @@ static void cfg_create_ini() "height=0\n" "resizable=false\n" "\n" + "; War Wind\n" + "[WW]\n" + "minfps=-1\n" + "\n" "; Zeus and Poseidon\n" "[Zeus]\n" "adjmouse=true\n" From fbaabef443a59f22842e3d216bd3db205cdfbe7f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 2 Jun 2024 23:57:21 +0200 Subject: [PATCH 0369/1053] revert some changes --- src/ddsurface.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index 2c14a2a..ba876c0 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -419,12 +419,12 @@ HRESULT dds_Blt( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || This->last_flip_tick + FLIP_REDRAW_TIMEOUT < timeGetTime()) { This->last_blt_tick = timeGetTime(); + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); SwitchToThread(); if (g_ddraw.ticks_limiter.tick_length > 0) @@ -651,14 +651,15 @@ HRESULT dds_BltFast( if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_config.limiter_type == LIMIT_BLTFAST && g_ddraw.ticks_limiter.tick_length > 0) { g_ddraw.ticks_limiter.dds_unlock_limiter_disabled = TRUE; @@ -1004,7 +1005,14 @@ 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); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); + + if (!(This->flags & DDSD_BACKBUFFERCOUNT) || + (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) + { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + } } return DD_OK; @@ -1173,14 +1181,15 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw.ref && g_ddraw.render.run) { - DWORD time = timeGetTime(); - InterlockedExchange(&g_ddraw.render.surface_updated, TRUE); - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + + DWORD time = timeGetTime(); if (!(This->flags & DDSD_BACKBUFFERCOUNT) || (This->last_flip_tick + FLIP_REDRAW_TIMEOUT < time && This->last_blt_tick + FLIP_REDRAW_TIMEOUT < time)) { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_ddraw.ticks_limiter.tick_length > 0 && !g_ddraw.ticks_limiter.dds_unlock_limiter_disabled) util_limit_game_ticks(); } From 2fe2ee7a40ea71a90f79445cb9ec73a4e92e8082 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 00:07:29 +0200 Subject: [PATCH 0370/1053] update HoMM3 preset --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index 93cb282..7aee353 100644 --- a/src/config.c +++ b/src/config.c @@ -815,10 +815,12 @@ static void cfg_create_ini() "\n" "; Heroes of Might and Magic III\n" "[Heroes3]\n" + "renderer=opengl\n" "game_handles_close=true\n" "\n" "; Heroes of Might and Magic III HD Mod\n" "[Heroes3 HD]\n" + "renderer=opengl\n" "game_handles_close=true\n" "\n" "; Hard Truck: Road to Victory\n" From d6c354f1d486e44f4b1c34cb4a61fba3aadc82a4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 01:16:41 +0200 Subject: [PATCH 0371/1053] add presets for Pizza Syndicate --- src/config.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/config.c b/src/config.c index 7aee353..6f555eb 100644 --- a/src/config.c +++ b/src/config.c @@ -1055,6 +1055,14 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=3\n" "\n" + "; Pizza Syndicate\n" + "[Pizza2]\n" + "renderer=opengl\n" + "\n" + "; Pizza Syndicate - Mehr Biss (Mission CD)\n" + "[Pizza_Mission]\n" + "renderer=opengl\n" + "\n" "; Pax Imperia\n" "[Pax Imperia]\n" "nonexclusive=true\n" From 8534ff44f2fd10413204e5142783cfd95e8b6255 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 01:19:56 +0200 Subject: [PATCH 0372/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b4712c5..dff4659 100644 --- a/README.md +++ b/README.md @@ -212,6 +212,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Nancy Drew: Stay Tuned For Danger - Nancy Drew: Treasure in the Royal Tower - Nancy Drew: The Secret of Shadow Ranch +- Nancy Drew: Danger on Deception Island - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson From b6e94810147161f1b95fa36c60fc2b5d105978ab Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:04:28 +0200 Subject: [PATCH 0373/1053] add presets for humongous games --- README.md | 21 ++++++++++++ src/config.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) diff --git a/README.md b/README.md index dff4659..98076b2 100644 --- a/README.md +++ b/README.md @@ -154,6 +154,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Fallout 2 - Final fantasy VII - Final fantasy VIII +- Freddi Fish +- Freddi Fish 4 +- Freddi Fish's One-Stop Fun Shop +- Freddi Fish: The Case of the Creature of Coral Cove +- Freddi Fish: The Case of the Haunted Schoolhouse - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -225,6 +230,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Pacific General - Patrician 3 - Pax Imperia +- Pajama Sam: No Need to Hide When It's Dark Outside +- Pajama Sam +- Pajama Sam's Games to Play on Any Day +- Pajama Sam 3 +- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) +- Pajama Sam's One-Stop Fun Shop - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning @@ -232,6 +243,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey - Putt-Putt Saves The Zoo +- Putt-Putt's One-Stop Fun Shop +- Putt-Putt and Pep's Dog On A Stick +- Putt-Putt Joins the Circus +- Putt-Putt: Travels Through Time +- Putt-Putt: Pep's Birthday Surprise +- Putt-Putt and Pep's Balloon-o-Rama - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -274,6 +291,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers +- SPY Fox: Hold the Mustard +- SPY Fox in Dry Cereal +- SPY Fox : Some Assembly Required +- SPY Fox: Operation Ozone - SpongeBob SquarePants: Typing - Star Wars Jedi Knight: Dark Forces II - Star Wars: Galactic Battlegrounds diff --git a/src/config.c b/src/config.c index 6f555eb..d61fa28 100644 --- a/src/config.c +++ b/src/config.c @@ -770,6 +770,31 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Freddi Fish\n" + "[FreddiSCS]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish\n" + "[FREDDI4]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" + "; Freddi Fish's One-Stop Fun Shop\n" + "[FreddisFunShop]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: The Case of the Creature of Coral Cove\n" + "[freddicove]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: The Case of the Haunted Schoolhouse\n" + "[FreddiCHSH]\n" + "renderer=gdi\n" + "\n" + "; Freddi Fish: Maze Madness\n" + "[Maze]\n" + "renderer=gdi\n" + "\n" "; G-Police\n" "[GPOLICE]\n" "maxgameticks=60\n" @@ -1046,6 +1071,30 @@ static void cfg_create_ini() "adjmouse=true\n" "renderer=gdi\n" "\n" + "; Pajama Sam's Games to Play on Any Day\n" + "[PJGAMES]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam\n" + "[PajamaTAL]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam: No Need to Hide When It's Dark Outside\n" + "[PajamaNHD]\n" + "renderer=gdi\n" + "\n" + "; Pajama Sam 3\n" + "[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" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1055,6 +1104,34 @@ static void cfg_create_ini() "renderer=gdi\n" "hook=3\n" "\n" + "; Putt-Putt's One-Stop Fun Shop\n" + "[PuttsFunShop]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt and Pep's Dog On A Stick\n" + "[DOG]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Joins the Circus\n" + "[puttcircus]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Enters The Race\n" + "[UKPuttRace]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt: Travels Through Time\n" + "[PuttTTT]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt and Pep's Balloon-o-Rama\n" + "[Balloon]\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" @@ -1145,6 +1222,26 @@ static void cfg_create_ini() "[Rangers]\n" "hook_peekmessage=true\n" "\n" + "; SPYFox: Hold the Mustard\n" + "[mustard]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox in Dry Cereal (2008)\n" + "[SpyFox]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox in Dry Cereal (2001)\n" + "[SPYFOXDC]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox : Some Assembly Required\n" + "[SPYFOXSR]\n" + "renderer=gdi\n" + "\n" + "; SPY Fox: Operation Ozone\n" + "[spyozon]\n" + "renderer=gdi\n" + "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" "resolutions=2\n" From d4a268ead1fd898ac2bc26296bc4ed951bfcbe67 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:05:40 +0200 Subject: [PATCH 0374/1053] bump version --- README.md | 1 + inc/version.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 98076b2..ff6b8a8 100644 --- a/README.md +++ b/README.md @@ -159,6 +159,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish's One-Stop Fun Shop - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse +- Freddi Fish: Maze Madness - Future Cop L.A.P.D - G-Police - Grand Theft Auto diff --git a/inc/version.h b/inc/version.h index 138aeb8..aef7c2f 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 6 +#define VERSION_REVISION 7 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) From d0dbb16b9bb0901af998f7f9b83e0076047d42d3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 03:15:16 +0200 Subject: [PATCH 0375/1053] ignore WM_PAINT and WM_ERASEBKGND if there's no primary surface --- src/wndproc.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index b2ebd71..81c1b30 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -968,12 +968,16 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam RedrawWindow(hWnd, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); } - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + if (g_ddraw.primary) + { + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + } + break; } case WM_ERASEBKGND: { - if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) + if (g_ddraw.primary && (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0)) { InterlockedExchange(&g_ddraw.render.clear_screen, TRUE); ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); From a291508432e5e5d5244656bd969e3fe05cbc2817 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 04:44:58 +0200 Subject: [PATCH 0376/1053] log ini section --- src/config.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/config.c b/src/config.c index d61fa28..46d6a48 100644 --- a/src/config.c +++ b/src/config.c @@ -1454,6 +1454,8 @@ static void cfg_init() ini_create(&g_config.ini, g_config.ini_path); cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); + + TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); } static DWORD cfg_get_game_section(LPSTR buf, DWORD size) From 702c136c537ac7dbc04f0762540a82a2c55c3f16 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 06:05:13 +0200 Subject: [PATCH 0377/1053] tweak debug logs --- src/utils.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/src/utils.c b/src/utils.c index 09238fe..de9fc99 100644 --- a/src/utils.c +++ b/src/utils.c @@ -592,22 +592,15 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) { - /* - TRACE( - " util_enum_child_proc width=%u, Height=%u, left=%d, top=%d\n", - size.right, - size.bottom, - pos.left, - pos.top); - */ - char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - //LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE(" AVIWINDOW class=%s, style=%p, exstyle=%p\n", class_name, style, exstyle); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top); + + //dbg_dump_wnd_styles(real_GetWindowLongA(hwnd, GWL_STYLE), exstyle); if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || From b8924026195b06dd22f761bebb684c8c59d481ce Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 08:55:58 +0200 Subject: [PATCH 0378/1053] add presets for blues clues --- README.md | 2 ++ inc/version.h | 2 +- src/config.c | 13 +++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ff6b8a8..25b42e8 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Batman: Toxic Chill - Blade & Sword - Blood II - The Chosen +- Blue's 123 Time Activities +- Blue's Treasure Hunt - Caesar III (Sierra - 1998) - Call To Power 2 - Capitalism II diff --git a/inc/version.h b/inc/version.h index aef7c2f..4b648df 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 7 +#define VERSION_REVISION 8 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 46d6a48..1f1408f 100644 --- a/src/config.c +++ b/src/config.c @@ -484,6 +484,19 @@ static void cfg_create_ini() "checkfile=.\\SOUND.REZ\n" "noactivateapp=true\n" "\n" + "; Blue's 123 Time Activities\n" + "[Blues123Time]\n" + "renderer=gdi\n" + "hook=3\n" + "\n" + "; Blue's Treasure Hunt\n" + "[Blue'sTreasureHunt-Disc1]\n" + "renderer=gdi\n" + "\n" + "; Blue's Treasure Hunt\n" + "[Blue'sTreasureHunt-Disc2]\n" + "renderer=gdi\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "noactivateapp=true\n" From caf03df76204d87e87b111e9678a12f4f5303438 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 09:13:51 +0200 Subject: [PATCH 0379/1053] add filename to logs --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 1f1408f..b9ed2aa 100644 --- a/src/config.c +++ b/src/config.c @@ -1468,7 +1468,8 @@ static void cfg_init() ini_create(&g_config.ini, g_config.ini_path); cfg_get_game_section(g_config.game_section, sizeof(g_config.game_section)); - TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); + TRACE("filename = %s\n", g_config.process_file_name); + TRACE("section = %s\n", g_config.game_section[0] ? g_config.game_section : "ddraw"); } static DWORD cfg_get_game_section(LPSTR buf, DWORD size) From 4d5b95ac8f998c1889d6cc6743b7bfb38efdd8fc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 20:09:37 +0200 Subject: [PATCH 0380/1053] update presets --- inc/version.h | 2 +- src/config.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 4b648df..6752d80 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 8 +#define VERSION_REVISION 9 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index b9ed2aa..494d8c2 100644 --- a/src/config.c +++ b/src/config.c @@ -497,6 +497,14 @@ static void cfg_create_ini() "[Blue'sTreasureHunt-Disc2]\n" "renderer=gdi\n" "\n" + "; Blue's Reading Time Activities\n" + "[Blue's Reading Time]\n" + "renderer=gdi\n" + "\n" + "; Blue's ArtTime Activities\n" + "[ArtTime]\n" + "renderer=gdi\n" + "\n" "; Carmageddon\n" "[CARMA95]\n" "noactivateapp=true\n" @@ -783,6 +791,10 @@ static void cfg_create_ini() "nonexclusive=true\n" "adjmouse=true\n" "\n" + "; Freddi 1\n" + "[Freddi1]\n" + "renderer=gdi\n" + "\n" "; Freddi Fish\n" "[FreddiSCS]\n" "renderer=gdi\n" From dfeb081cabf588e8a954e6d0dd6e65032257577b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 3 Jun 2024 22:26:16 +0200 Subject: [PATCH 0381/1053] add Freddi Water Worries preset --- README.md | 53 ++++++++++++++++++++++++++-------------------------- src/config.c | 4 ++++ 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 25b42e8..edab12e 100644 --- a/README.md +++ b/README.md @@ -72,9 +72,9 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Anno 1602: Creation of a New World - Anstoss 3 - Arcanum: Of Steamworks and Magick Obscura -- Arthur's Wilderness Rescue - Arthur's Pet Chase - Arthur's Sand Castle Contest +- Arthur's Wilderness Rescue - Atlantis 2: Beyond Atlantis - Atlantis 3: The New World - Atlantis: The Lost Tales @@ -126,8 +126,8 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Cossacks (Steam+GOG) - Cultures - The Discovery of Vinland - Cultures 2 -- Cyberchase Castleblanca Quest - Cyberchase Carnival Chaos +- Cyberchase Castleblanca Quest - Dark Reign: The Future of War - Daytona USA (Sega - 1996) - Deadlock 2 @@ -159,9 +159,10 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish - Freddi Fish 4 - Freddi Fish's One-Stop Fun Shop +- Freddi Fish: Maze Madness - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse -- Freddi Fish: Maze Madness +- Freddi Water Worries - Future Cop L.A.P.D - G-Police - Grand Theft Auto @@ -195,11 +196,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Kohan: Immortal Sovereigns - Konung - Konung 2 -- Little Bear Toddler Discovery Adventures +- Lionheart - Legacy of the Crusader +- Little Bear Kindergarten Thinking Adventures - Little Bear Preschool Thinking Adventures - Little Bear Rainy Day Activities -- Little Bear Kindergarten Thinking Adventures -- Lionheart - Legacy of the Crusader +- Little Bear Toddler Discovery Adventures - Locomotion - Lode Runner 2 - Madeline 1st Grade Math @@ -214,13 +215,13 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Moorhuhn Winter Editon - Moto Racer - Moto Racer 2 +- Nancy Drew: Danger on Deception Island - Nancy Drew: Last Train to Blue Moon Canyon - Nancy Drew: Message in a Haunted Mansion - Nancy Drew: Secrets Can Kill - Nancy Drew: Stay Tuned For Danger -- Nancy Drew: Treasure in the Royal Tower - Nancy Drew: The Secret of Shadow Ranch -- Nancy Drew: Danger on Deception Island +- Nancy Drew: Treasure in the Royal Tower - Need For Speed III: Hot Pursuit - Need For Speed: High Stakes - New Robinson @@ -231,27 +232,27 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Outlaws - Outlive - Pacific General +- Pajama Sam +- Pajama Sam 3 +- 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 - Patrician 3 - Pax Imperia -- Pajama Sam: No Need to Hide When It's Dark Outside -- Pajama Sam -- Pajama Sam's Games to Play on Any Day -- Pajama Sam 3 -- Pajama Sam(r): Life is Rough When You Lose Your Stuff(tm) -- Pajama Sam's One-Stop Fun Shop - Pharaoh (Sierra - 1999) - Pizza Syndicate (AKA Fast Food Tycoon) - Populous: The Beginning - Poseidon: Master of Atlantis - Pro Pinball - Big Race USA - Pro Pinball - Fantastic Journey -- Putt-Putt Saves The Zoo -- Putt-Putt's One-Stop Fun Shop +- Putt-Putt and Pep's Balloon-o-Rama - Putt-Putt and Pep's Dog On A Stick - Putt-Putt Joins the Circus -- Putt-Putt: Travels Through Time +- Putt-Putt Saves The Zoo +- Putt-Putt's One-Stop Fun Shop - Putt-Putt: Pep's Birthday Surprise -- Putt-Putt and Pep's Balloon-o-Rama +- Putt-Putt: Travels Through Time - Quest for Glory 5 - Rage of Mages 2 - Railroad Tycoon II @@ -261,13 +262,13 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Kindergarten - Reader Rabbit Learn To Read With Phonics - Reader Rabbit Learning Creations +- Reader Rabbit Math Ages 4-6 +- Reader Rabbit Preschool 2002 - Reader Rabbit Reading Ages 4-6 - Reader Rabbit Reading Ages 6-9 -- Reader Rabbit Toddler -- Reader Rabbit Math Ages 4-6 -- Reader Rabbit's(R) Math Ages 6 - 9 (2002) -- Reader Rabbit Preschool 2002 - Reader Rabbit Thinking Ages 4-6 (US) +- Reader Rabbit Toddler +- Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D - Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) - Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) @@ -294,11 +295,11 @@ Some games may require additional steps before they can be used with cnc-ddraw, - SimCoaster / Theme Park Inc - Sonic 3D Blast - Space Rangers -- SPY Fox: Hold the Mustard -- SPY Fox in Dry Cereal -- SPY Fox : Some Assembly Required -- SPY Fox: Operation Ozone - SpongeBob SquarePants: Typing +- SPY Fox : Some Assembly Required +- SPY Fox in Dry Cereal +- SPY Fox: Hold the Mustard +- SPY Fox: Operation Ozone - 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 494d8c2..c695cd2 100644 --- a/src/config.c +++ b/src/config.c @@ -795,6 +795,10 @@ static void cfg_create_ini() "[Freddi1]\n" "renderer=gdi\n" "\n" + "; Freddi Water Worries\n" + "[Water]\n" + "renderer=gdi\n" + "\n" "; Freddi Fish\n" "[FreddiSCS]\n" "renderer=gdi\n" From 5112aa76e4ea750a196cec68c2a12efb86ccba66 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 03:40:29 +0200 Subject: [PATCH 0382/1053] fix movies in atrox --- src/config.c | 1 - src/utils.c | 16 ++++++++++++---- src/winapi_hooks.c | 24 +++++++++++++++++++++--- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index c695cd2..41c23e4 100644 --- a/src/config.c +++ b/src/config.c @@ -366,7 +366,6 @@ static void cfg_create_ini() "; Atrox\n" "[Atrox]\n" "nonexclusive=true\n" - "fixchilds=0\n" "allow_wmactivate=true\n" "\n" "; Atomic Bomberman\n" diff --git a/src/utils.c b/src/utils.c index de9fc99..8c8072c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -590,17 +590,25 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) RECT size; RECT pos; - if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos) && size.right > 1 && size.bottom > 1) + if (real_GetClientRect(hwnd, &size) && + real_GetWindowRect(hwnd, &pos) && + size.right > 1 && + size.bottom > 1) { char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); + LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); - //dbg_dump_wnd_styles(real_GetWindowLongA(hwnd, GWL_STYLE), exstyle); + //dbg_dump_wnd_styles(style, exstyle); + + /* Atrox */ + if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) + return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 560a8b8..664d16e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -834,6 +834,7 @@ BOOL WINAPI fake_StretchBlt( (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 || @@ -846,8 +847,22 @@ BOOL WINAPI fake_StretchBlt( if (primary_dc) { + POINT pt = { 0 }; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + BOOL result = - real_StretchBlt(primary_dc, xDest, yDest, wDest, hDest, hdcSrc, xSrc, ySrc, wSrc, hSrc, rop); + real_StretchBlt( + primary_dc, + xDest + pt.x, + yDest + pt.y, + wDest, + hDest, + hdcSrc, + xSrc, + ySrc, + wSrc, + hSrc, + rop); dds_ReleaseDC(g_ddraw.primary, primary_dc); @@ -1053,11 +1068,14 @@ int WINAPI fake_StretchDIBits( if (primary_dc) { + POINT pt = {0}; + real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int result = real_StretchDIBits( primary_dc, - xDest, - yDest, + xDest + pt.x, + yDest + pt.y, DestWidth, DestHeight, xSrc, From d6786bc725deaa54825fd85bdafbcef5b8f4b0dd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 03:55:40 +0200 Subject: [PATCH 0383/1053] add missing scaling code to SetDIBitsToDevice --- src/winapi_hooks.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 664d16e..6a73990 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -994,7 +994,9 @@ int WINAPI fake_SetDIBitsToDevice( const BITMAPINFO* lpbmi, UINT ColorUse) { - if (g_ddraw.ref && g_ddraw.hwnd && WindowFromDC(hdc) == g_ddraw.hwnd) + HWND hwnd = WindowFromDC(hdc); + + if (g_ddraw.ref && g_ddraw.hwnd && hwnd == g_ddraw.hwnd) { if (g_ddraw.primary && (g_ddraw.primary->bpp == 16 || g_ddraw.primary->bpp == 32 || g_ddraw.primary->palette)) { @@ -1023,6 +1025,24 @@ int WINAPI fake_SetDIBitsToDevice( return result; } } + else if (g_ddraw.width > 0 && g_ddraw.render.hdc) + { + return + real_StretchDIBits( + hwnd == g_ddraw.hwnd ? hdc : 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(w * g_ddraw.render.scale_w)), + (int)(roundf(h * g_ddraw.render.scale_h)), + xSrc, + ySrc, + w, + h, + lpvBits, + lpbmi, + ColorUse, + SRCCOPY); + } } return real_SetDIBitsToDevice(hdc, xDest, yDest, w, h, xSrc, ySrc, StartScan, cLines, lpvBits, lpbmi, ColorUse); @@ -1056,6 +1076,7 @@ int WINAPI fake_StretchDIBits( (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 || From 65977a8268f22809caf903c3545c46ec93cec800 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 06:29:55 +0200 Subject: [PATCH 0384/1053] improve logging --- src/utils.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8c8072c..f103bce 100644 --- a/src/utils.c +++ b/src/utils.c @@ -587,6 +587,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; + HWND parent = GetParent(hwnd); RECT size; RECT pos; @@ -601,10 +602,15 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); +#ifdef _DEBUG_X + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); - //dbg_dump_wnd_styles(style, exstyle); + dbg_dump_wnd_styles(style, exstyle); +#endif + + if (parent != g_ddraw.hwnd) + return TRUE; /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -657,7 +663,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } - return FALSE; + return parent == g_ddraw.hwnd ? FALSE : TRUE; } static unsigned char util_get_pixel(int x, int y) From 9cc00bd6cf127e22b4428357d030d060f9d7c2d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 06:59:01 +0200 Subject: [PATCH 0385/1053] Revert "improve logging" This reverts commit 65977a8268f22809caf903c3545c46ec93cec800. --- src/utils.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/utils.c b/src/utils.c index f103bce..8c8072c 100644 --- a/src/utils.c +++ b/src/utils.c @@ -587,7 +587,6 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) { IDirectDrawSurfaceImpl* this = (IDirectDrawSurfaceImpl*)lparam; - HWND parent = GetParent(hwnd); RECT size; RECT pos; @@ -602,15 +601,10 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); -#ifdef _DEBUG_X - TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); + //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); - dbg_dump_wnd_styles(style, exstyle); -#endif - - if (parent != g_ddraw.hwnd) - return TRUE; + //dbg_dump_wnd_styles(style, exstyle); /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -663,7 +657,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } - return parent == g_ddraw.hwnd ? FALSE : TRUE; + return FALSE; } static unsigned char util_get_pixel(int x, int y) From 515db2b2e38117ffea3e814348135ea5527b7954 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 07:28:13 +0200 Subject: [PATCH 0386/1053] fix esc not working in some games (skipping movies) --- src/wndproc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 81c1b30..3d0a986 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -798,8 +798,8 @@ 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; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; @@ -812,8 +812,8 @@ 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; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; @@ -910,8 +910,8 @@ 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; + //PostMessageA(video_hwnd, uMsg, wParam, lParam); + //return 0; } break; From 5c0b9462b94c9a4fe654e257f1c5a0961525e29b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 09:17:48 +0200 Subject: [PATCH 0387/1053] add more presets for gdi games --- README.md | 1 + inc/version.h | 2 +- src/config.c | 24 ++++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index edab12e..7402a11 100644 --- a/README.md +++ b/README.md @@ -162,6 +162,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Freddi Fish: Maze Madness - Freddi Fish: The Case of the Creature of Coral Cove - Freddi Fish: The Case of the Haunted Schoolhouse +- Freddi Fish: The Case of the Hogfish Rustlers of Briny Gulch - Freddi Water Worries - Future Cop L.A.P.D - G-Police diff --git a/inc/version.h b/inc/version.h index 6752d80..b527eba 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 5 #define VERSION_BUILD 0 -#define VERSION_REVISION 9 +#define VERSION_REVISION 10 #define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION #define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION) diff --git a/src/config.c b/src/config.c index 41c23e4..81d8a00 100644 --- a/src/config.c +++ b/src/config.c @@ -794,6 +794,10 @@ static void cfg_create_ini() "[Freddi1]\n" "renderer=gdi\n" "\n" + "; Freddi Fish : The Case of the Hogfish Rustlers of Briny Gulch\n" + "[Freddihrbg]\n" + "renderer=gdi\n" + "\n" "; Freddi Water Worries\n" "[Water]\n" "renderer=gdi\n" @@ -1123,6 +1127,10 @@ static void cfg_create_ini() "[SamsFunShop]\n" "renderer=gdi\n" "\n" + "; Pajama Sam DON'T FEAR THE DARK\n" + "[pjSam]\n" + "renderer=gdi\n" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1156,6 +1164,14 @@ static void cfg_create_ini() "[Balloon]\n" "renderer=gdi\n" "\n" + "; Putt-Putt Travels Through Time\n" + "[PUTTPUTTTTT]\n" + "renderer=gdi\n" + "\n" + "; Putt-Putt Joins the Circus\n" + "[puttputtjtc]\n" + "renderer=gdi\n" + "\n" "; Putt-Putt: Pep's Birthday Surprise\n" "[PuttsFunShop]\n" "keytogglefullscreen=0x08\n" @@ -1254,6 +1270,10 @@ static void cfg_create_ini() "[mustard]\n" "renderer=gdi\n" "\n" + "; SPYFox 2\n" + "[Spyfox 2]\n" + "renderer=gdi\n" + "\n" "; SPY Fox in Dry Cereal (2008)\n" "[SpyFox]\n" "renderer=gdi\n" @@ -1270,6 +1290,10 @@ static void cfg_create_ini() "[spyozon]\n" "renderer=gdi\n" "\n" + "; SPY Fox: Operation Ozone\n" + "[spyfoxozu]\n" + "renderer=gdi\n" + "\n" "; Stronghold Crusader HD\n" "[Stronghold Crusader]\n" "resolutions=2\n" From 8091f3aa45844e553f205ef93094caa6625d22aa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 19:43:31 +0200 Subject: [PATCH 0388/1053] update presets --- src/config.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index 81d8a00..138c8e3 100644 --- a/src/config.c +++ b/src/config.c @@ -1131,6 +1131,10 @@ static void cfg_create_ini() "[pjSam]\n" "renderer=gdi\n" "\n" + "; Pajama Sam 3: You Are What You Eat From Your Head To Your Feet\n" + "[UKpajamaEAT]\n" + "renderer=gdi\n" + "\n" "; Pharaoh\n" "[Pharaoh]\n" "adjmouse=true\n" @@ -1270,8 +1274,8 @@ static void cfg_create_ini() "[mustard]\n" "renderer=gdi\n" "\n" - "; SPYFox 2\n" - "[Spyfox 2]\n" + "; SPY Fox: Some Assembly Required\n" + "[Spyfox2]\n" "renderer=gdi\n" "\n" "; SPY Fox in Dry Cereal (2008)\n" From f57832e0b96492a1aae15aaf765420703e20364e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 19:44:57 +0200 Subject: [PATCH 0389/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7402a11..53369a1 100644 --- a/README.md +++ b/README.md @@ -239,6 +239,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - 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) From 55413ffd61cb1e3503760bbf75bb36be68ba88e5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 21:35:28 +0200 Subject: [PATCH 0390/1053] add original polish names for reksio games --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 53369a1..1b93902 100644 --- a/README.md +++ b/README.md @@ -272,12 +272,12 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reader Rabbit Toddler - Reader Rabbit's(R) Math Ages 6 - 9 (2002) - Red Baron 3D -- Reksio and Captain Nemo (AKA Reksio si Capitanul Nemo) -- Reksio and Kretes in Action (AKA Reksio si Kretes in Actiune) -- Reksio and the Pirate Treasure (AKA Reksio si Comoara Piratilor) -- Reksio and the Time Machine (AKA Reksio si Masina Timpului) -- Reksio and the UFO (AKA Reksio si OZN-ul) -- Reksio and the Wizards (AKA Reksio si Magicienii) +- 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!) - Road Rash - RollerCoaster Tycoon - Sanitarium From 8bab67b6cd018bef2ff90b44c0f00963d51d6c61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 4 Jun 2024 21:54:05 +0200 Subject: [PATCH 0391/1053] improve debug logging --- src/utils.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index 8c8072c..cbe96d9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -601,10 +601,17 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - //TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - // class_name, hwnd, size.right, size.bottom, pos.left, pos.top, GetParent(hwnd)); +#ifdef _DEBUG_X + HWND parent = GetParent(hwnd); - //dbg_dump_wnd_styles(style, exstyle); + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); + + dbg_dump_wnd_styles(style, exstyle); + + if (parent != g_ddraw.hwnd) + return TRUE; +#endif /* Atrox */ if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) @@ -657,7 +664,11 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) } } +#ifdef _DEBUG_X + return TRUE; +#else return FALSE; +#endif } static unsigned char util_get_pixel(int x, int y) From addd3538b57404145a1e72e3c947b9042eacff77 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 5 Jun 2024 00:04:35 +0200 Subject: [PATCH 0392/1053] add some testing code for claw dvd movies --- src/winapi_hooks.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6a73990..d244c44 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1532,9 +1532,13 @@ HWND WINAPI fake_CreateWindowExA( /* Center Claw DVD movies */ if (HIWORD(lpClassName) && _strcmpi(lpClassName, "Afx:400000:3") == 0 && - g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && + g_ddraw.ref && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + g_ddraw.width && (dwStyle & (WS_POPUP | WS_CHILD)) == (WS_POPUP | WS_CHILD)) { + //dwStyle &= ~WS_POPUP; + //dwExStyle = WS_EX_TRANSPARENT; + POINT pt = { 0, 0 }; real_ClientToScreen(g_ddraw.hwnd, &pt); @@ -1548,8 +1552,7 @@ HWND WINAPI fake_CreateWindowExA( } /* Road Rash movies */ - if (HIWORD(lpClassName) && - _strcmpi(lpClassName, "AVI Window") == 0 && + if (HIWORD(lpClassName) && _strcmpi(lpClassName, "AVI Window") == 0 && g_ddraw.ref && g_ddraw.hwnd && g_ddraw.width && (dwStyle & WS_POPUP)) { From ca0589ebc60d9bb74fabefb4481990470692323e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 02:29:48 +0200 Subject: [PATCH 0393/1053] copy StretchBltMode from original DC --- src/winapi_hooks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d244c44..818955f 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -850,6 +850,11 @@ BOOL WINAPI fake_StretchBlt( POINT pt = { 0 }; real_MapWindowPoints(hwnd, g_ddraw.hwnd, &pt, 1); + int org_mode = SetStretchBltMode(hdcDest, COLORONCOLOR); + SetStretchBltMode(hdcDest, org_mode); + + int mode = SetStretchBltMode(primary_dc, org_mode); + BOOL result = real_StretchBlt( primary_dc, @@ -864,6 +869,8 @@ BOOL WINAPI fake_StretchBlt( hSrc, rop); + SetStretchBltMode(primary_dc, mode); + dds_ReleaseDC(g_ddraw.primary, primary_dc); return result; From 913026f8aa5074355a21936788025a8ab8c84d9c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 02:30:12 +0200 Subject: [PATCH 0394/1053] look for MCIQTZ_Window class childs --- src/utils.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utils.c b/src/utils.c index cbe96d9..734b5b2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -619,6 +619,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || strcmp(class_name, "VideoRenderer") == 0 || + strcmp(class_name, "MCIQTZ_Window") == 0 || strcmp(class_name, "MCIAVI") == 0 || strcmp(class_name, "AVIWnd32") == 0 || strcmp(class_name, "MCIWndClass") == 0 || From 43bedd649ed720267bc9aace731fcc0eb1aea977 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 03:02:18 +0200 Subject: [PATCH 0395/1053] add preset for The X-Files DVD --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 138c8e3..fecdeb3 100644 --- a/src/config.c +++ b/src/config.c @@ -1348,6 +1348,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The X-Files DVD\n" + "[XFiles]\n" + "windowed=true\n" + "fullscreen=true\n" + "\n" "; The Learning Company Launcher\n" "[TLCLauncher]\n" "tlc_hack=true\n" From 58d0500ad1fc8ca76130b48d5ad6c9bdb26689b3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 03:50:10 +0200 Subject: [PATCH 0396/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b93902..ed77895 100644 --- a/README.md +++ b/README.md @@ -318,6 +318,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold HD - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone +- The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon - Total Annihilation From 4df9dfc654b44a39aea67fcefa0b222aaf3cafd1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 6 Jun 2024 04:55:33 +0200 Subject: [PATCH 0397/1053] bump version --- inc/version.h | 4 ++-- src/config.c | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index b527eba..f3a1b27 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 5 +#define VERSION_MINOR 6 #define VERSION_BUILD 0 -#define VERSION_REVISION 10 +#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) diff --git a/src/config.c b/src/config.c index fecdeb3..3e3f7e7 100644 --- a/src/config.c +++ b/src/config.c @@ -1352,6 +1352,7 @@ static void cfg_create_ini() "[XFiles]\n" "windowed=true\n" "fullscreen=true\n" + "toggle_borderless=true\n" "\n" "; The Learning Company Launcher\n" "[TLCLauncher]\n" From 0246dd44e952ff0037e2f6b4eb0987c0708c7bae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jun 2024 01:01:12 +0200 Subject: [PATCH 0398/1053] make sure we only let the first WM_ACTIVATEAPP pass through --- src/wndproc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wndproc.c b/src/wndproc.c index 3d0a986..43abdcf 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -671,10 +671,12 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam /* let it pass through once (tiberian sun / ClueFinders) */ static BOOL one_time; - if (wParam && !one_time) + if (!one_time) { one_time = TRUE; - break; + + if (wParam) + break; } if (wParam && g_ddraw.alt_key_down && !g_config.releasealt) From cfc6c041039badb44c9a08d0a1f75580fe0a9504 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 7 Jun 2024 01:11:37 +0200 Subject: [PATCH 0399/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index f3a1b27..83a7bc4 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #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 8269b41b5c539b144d8e8886eed18bf437b9c6d5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:28:18 +0200 Subject: [PATCH 0400/1053] add preset for Robin Hood - The Legend of Sherwood --- src/config.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/config.c b/src/config.c index 3e3f7e7..79a945d 100644 --- a/src/config.c +++ b/src/config.c @@ -1230,6 +1230,15 @@ static void cfg_create_ini() "adjmouse=true\n" "nonexclusive=true\n" "\n" + "; Robin Hood - The Legend of Sherwood (GOG)\n" + "[Game/4]\n" + "checkfile=.\\Robin Hood.exe\n" + "singlecpu=false\n" + "\n" + "; Robin Hood - The Legend of Sherwood\n" + "[Robin Hood]\n" + "singlecpu=false\n" + "\n" "; Scooby-Doo(TM), Case File #1 The Glowing Bug Man - NOT WORKING YET\n" "[Case File #1]\n" "windowed=true\n" From d3416988f31f25ae9311689e4fa44206fa9a6efd Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:38:10 +0200 Subject: [PATCH 0401/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ed77895..3714a69 100644 --- a/README.md +++ b/README.md @@ -279,6 +279,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Reksio and Captain Nemo (Reksio i Kapitan Nemo) - Reksio and Kretes in Action (Reksio i Kretes w Akcji!) - Road Rash +- Robin Hood - The Legend of Sherwood - RollerCoaster Tycoon - Sanitarium - Scooby-Doo(TM), Case File #2 The Scary Stone Dragon From 0c6a0fba4b6388433f3a41fa423780b5d722e9bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 21:56:29 +0200 Subject: [PATCH 0402/1053] remove duplicate code --- src/dd.c | 49 +++++++++++-------------------------------------- 1 file changed, 11 insertions(+), 38 deletions(-) diff --git a/src/dd.c b/src/dd.c index cc2d248..73ebcf6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -541,20 +541,18 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (!g_ddraw.render.run) + if (g_ddraw.render.run) { - return DD_OK; - } + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } } if (!g_config.windowed) @@ -1433,32 +1431,7 @@ ULONG dd_Release() cfg_save(); } - if (g_ddraw.render.run) - { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); - - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } - } - - if (!g_config.windowed) - { - if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) - { - if (!d3d9_reset(TRUE)) - d3d9_release(); - } - else - { - ChangeDisplaySettings(NULL, 0); - } - } + dd_RestoreDisplayMode(); if (g_ddraw.render.hdc) { From e19d896dab73ba17747d3736746d2d027ed4bcc8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 8 Jun 2024 22:08:23 +0200 Subject: [PATCH 0403/1053] Revert "remove duplicate code" This reverts commit 0c6a0fba4b6388433f3a41fa423780b5d722e9bc. --- src/dd.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index 73ebcf6..cc2d248 100644 --- a/src/dd.c +++ b/src/dd.c @@ -541,18 +541,20 @@ HRESULT dd_GetMonitorFrequency(LPDWORD lpdwFreq) HRESULT dd_RestoreDisplayMode() { - if (g_ddraw.render.run) + if (!g_ddraw.render.run) { - EnterCriticalSection(&g_ddraw.cs); - g_ddraw.render.run = FALSE; - ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); - LeaveCriticalSection(&g_ddraw.cs); + return DD_OK; + } - if (g_ddraw.render.thread) - { - WaitForSingleObject(g_ddraw.render.thread, INFINITE); - g_ddraw.render.thread = NULL; - } + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; } if (!g_config.windowed) @@ -1431,7 +1433,32 @@ ULONG dd_Release() cfg_save(); } - dd_RestoreDisplayMode(); + if (g_ddraw.render.run) + { + EnterCriticalSection(&g_ddraw.cs); + g_ddraw.render.run = FALSE; + ReleaseSemaphore(g_ddraw.render.sem, 1, NULL); + LeaveCriticalSection(&g_ddraw.cs); + + if (g_ddraw.render.thread) + { + WaitForSingleObject(g_ddraw.render.thread, INFINITE); + g_ddraw.render.thread = NULL; + } + } + + if (!g_config.windowed) + { + if (g_ddraw.renderer == d3d9_render_main && !g_config.nonexclusive) + { + if (!d3d9_reset(TRUE)) + d3d9_release(); + } + else + { + ChangeDisplaySettings(NULL, 0); + } + } if (g_ddraw.render.hdc) { From 4385f77b52f8110e8b752c468486dc3dfd78dea3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 00:02:39 +0200 Subject: [PATCH 0404/1053] hook EnumDisplaySettingsA --- inc/hook.h | 4 +++- inc/version.h | 2 +- inc/winapi_hooks.h | 1 + src/hook.c | 2 ++ src/winapi_hooks.c | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) diff --git a/inc/hook.h b/inc/hook.h index 893238f..cd1dab8 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[33]; } HOOKLIST; +typedef struct HOOKLIST { char module_name[32]; HOOKLISTDATA data[34]; } 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* ENUMDISPLAYSETTINGSAPROC)(LPCSTR, DWORD, DEVMODEA*); typedef SHORT(WINAPI* GETKEYSTATEPROC)(int); typedef SHORT(WINAPI* GETASYNCKEYSTATEPROC)(int); @@ -107,6 +108,7 @@ extern SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA; extern PEEKMESSAGEAPROC real_PeekMessageA; extern GETMESSAGEAPROC real_GetMessageA; extern GETWINDOWPLACEMENTPROC real_GetWindowPlacement; +extern ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA; extern GETKEYSTATEPROC real_GetKeyState; extern GETASYNCKEYSTATEPROC real_GetAsyncKeyState; extern GETDEVICECAPSPROC real_GetDeviceCaps; diff --git a/inc/version.h b/inc/version.h index 83a7bc4..3b43e44 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #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) diff --git a/inc/winapi_hooks.h b/inc/winapi_hooks.h index 3ce0ba3..6e2965d 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_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode); 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 9d9b54c..91d18db 100644 --- a/src/hook.c +++ b/src/hook.c @@ -50,6 +50,7 @@ SETWINDOWSHOOKEXAPROC real_SetWindowsHookExA = SetWindowsHookExA; PEEKMESSAGEAPROC real_PeekMessageA = PeekMessageA; GETMESSAGEAPROC real_GetMessageA = GetMessageA; GETWINDOWPLACEMENTPROC real_GetWindowPlacement = GetWindowPlacement; +ENUMDISPLAYSETTINGSAPROC real_EnumDisplaySettingsA = EnumDisplaySettingsA; GETKEYSTATEPROC real_GetKeyState = GetKeyState; GETASYNCKEYSTATEPROC real_GetAsyncKeyState = GetAsyncKeyState; GETDEVICECAPSPROC real_GetDeviceCaps = GetDeviceCaps; @@ -98,6 +99,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 }, + { "EnumDisplaySettingsA", (PROC)fake_EnumDisplaySettingsA, (PROC*)&real_EnumDisplaySettingsA, 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 818955f..26ebc7c 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -767,6 +767,39 @@ BOOL WINAPI fake_GetWindowPlacement(HWND hWnd, WINDOWPLACEMENT* lpwndpl) return result; } +BOOL WINAPI fake_EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, DEVMODEA* lpDevMode) +{ + BOOL result = real_EnumDisplaySettingsA(lpszDeviceName, iModeNum, lpDevMode); + + if (result && !lpszDeviceName && lpDevMode && iModeNum == ENUM_CURRENT_SETTINGS) + { + if (g_ddraw.ref && g_ddraw.width) + { + lpDevMode->dmPelsWidth = g_ddraw.width; + lpDevMode->dmPelsHeight = g_ddraw.height; + lpDevMode->dmBitsPerPel = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + lpDevMode->dmPelsWidth = strtoul(e, &e, 0); + lpDevMode->dmPelsHeight = strtoul(e + 1, &e, 0); + lpDevMode->dmBitsPerPel = strtoul(e + 1, &e, 0); + } + else + { + lpDevMode->dmPelsWidth = 1024; + lpDevMode->dmPelsHeight = 768; + lpDevMode->dmBitsPerPel = 16; + } + + lpDevMode->dmDisplayFrequency = 60; + } + + return result; +} + SHORT WINAPI fake_GetKeyState(int nVirtKey) { if (g_config.windowed && g_ddraw.ref && g_ddraw.hwnd && !util_in_foreground()) From 526a068a9aa87bb33a3508d4102f96bbc1b3003e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 00:05:04 +0200 Subject: [PATCH 0405/1053] use real_ functions --- src/dd.c | 8 ++++---- src/utils.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index cc2d248..db0623f 100644 --- a/src/dd.c +++ b/src/dd.c @@ -62,7 +62,7 @@ HRESULT dd_EnumDisplayModes( memset(®_m, 0, sizeof(DEVMODE)); reg_m.dmSize = sizeof(DEVMODE); - if (EnumDisplaySettings(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) + if (real_EnumDisplaySettingsA(NULL, ENUM_REGISTRY_SETTINGS, ®_m)) { max_w = reg_m.dmPelsWidth; max_h = reg_m.dmPelsHeight; @@ -138,7 +138,7 @@ HRESULT dd_EnumDisplayModes( memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { TRACE_EXT( " %u: %ux%u@%u %u bpp | flags=0x%08X, FO=%u\n", @@ -177,7 +177,7 @@ HRESULT dd_EnumDisplayModes( BOOL custom_res_injected = FALSE; - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { if (refresh_rate == m.dmDisplayFrequency && bpp == m.dmBitsPerPel && @@ -607,7 +607,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.mode.dmSize = sizeof(DEVMODE); g_ddraw.mode.dmDriverExtra = 0; - if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) + if (real_EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &g_ddraw.mode) == FALSE) { g_ddraw.mode.dmSize = sizeof(DEVMODE); g_ddraw.mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_DISPLAYFREQUENCY; diff --git a/src/utils.c b/src/utils.c index 734b5b2..48218b2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -308,7 +308,7 @@ BOOL util_get_lowest_resolution( memset(&m, 0, sizeof(DEVMODE)); m.dmSize = sizeof(DEVMODE); - while (EnumDisplaySettings(NULL, i, &m)) + while (real_EnumDisplaySettingsA(NULL, i, &m)) { if (m.dmPelsWidth >= min_width && m.dmPelsHeight >= min_height && From 38a6785ff8e7ba1d36c21f4129c2ae770c9a4855 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 22:00:38 +0200 Subject: [PATCH 0406/1053] #323 remove dinput hooks when dlls is being unloaded --- src/directinput.c | 88 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 6dd5e5e..13d06b8 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -19,10 +19,15 @@ DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; DIRECTINPUT8CREATEPROC real_DirectInput8Create; static DICREATEDEVICEPROC real_di_CreateDevice; +static PROC* di_CreateDevice_vtbl_addr; static DICREATEDEVICEEXPROC real_di_CreateDeviceEx; +static PROC* di_CreateDeviceEx_vtbl_addr; static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel; +static PROC* did_SetCooperativeLevel_vtbl_addr; static DIDGETDEVICEDATAPROC real_did_GetDeviceData; +static PROC* did_GetDeviceData_vtbl_addr; static DIDGETDEVICESTATEPROC real_did_GetDeviceState; +static PROC* did_GetDeviceState_vtbl_addr; static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) @@ -121,17 +126,20 @@ static HRESULT WINAPI fake_di_CreateDevice( if (!real_did_SetCooperativeLevel) { + did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + + did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + + did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -158,17 +166,20 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (!real_did_SetCooperativeLevel) { + did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + + did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + + did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func( - (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -186,7 +197,7 @@ HRESULT WINAPI fake_DirectInputCreateA( if (!real_DirectInputCreateA) { real_DirectInputCreateA = - (DIRECTINPUTCREATEAPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateA"); + (DIRECTINPUTCREATEAPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateA"); if (real_DirectInputCreateA == fake_DirectInputCreateA) { @@ -204,8 +215,10 @@ HRESULT WINAPI fake_DirectInputCreateA( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -222,7 +235,7 @@ HRESULT WINAPI fake_DirectInputCreateW( if (!real_DirectInputCreateW) { real_DirectInputCreateW = - (DIRECTINPUTCREATEWPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateW"); + (DIRECTINPUTCREATEWPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateW"); if (real_DirectInputCreateW == fake_DirectInputCreateW) { @@ -240,8 +253,10 @@ HRESULT WINAPI fake_DirectInputCreateW( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -259,7 +274,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (!real_DirectInputCreateEx) { real_DirectInputCreateEx = - (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(GetModuleHandle("dinput.dll"), "DirectInputCreateEx"); + (DIRECTINPUTCREATEEXPROC)real_GetProcAddress(real_LoadLibraryA("dinput.dll"), "DirectInputCreateEx"); if (real_DirectInputCreateEx == fake_DirectInputCreateEx) { @@ -277,8 +292,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } if (SUCCEEDED(result) && @@ -287,8 +304,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) && !g_config.no_dinput_hook) { + di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; + real_di_CreateDeviceEx = - (DICREATEDEVICEEXPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx, (PROC)fake_di_CreateDeviceEx); + (DICREATEDEVICEEXPROC)hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); } return result; @@ -306,7 +325,7 @@ HRESULT WINAPI fake_DirectInput8Create( if (!real_DirectInput8Create) { real_DirectInput8Create = - (DIRECTINPUT8CREATEPROC)real_GetProcAddress(GetModuleHandle("dinput8.dll"), "DirectInput8Create"); + (DIRECTINPUT8CREATEPROC)real_GetProcAddress(real_LoadLibraryA("dinput8.dll"), "DirectInput8Create"); if (real_DirectInput8Create == fake_DirectInput8Create) { @@ -324,8 +343,10 @@ HRESULT WINAPI fake_DirectInput8Create( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { + di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func((PROC*)&(*ppvOut)->lpVtbl->CreateDevice, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -383,6 +404,31 @@ void dinput_hook_init() void dinput_hook_exit() { + if (di_CreateDevice_vtbl_addr && *di_CreateDevice_vtbl_addr == (PROC)fake_di_CreateDevice) + { + hook_func(di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); + } + + if (di_CreateDeviceEx_vtbl_addr && *di_CreateDeviceEx_vtbl_addr == (PROC)fake_di_CreateDeviceEx) + { + hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); + } + + if (did_SetCooperativeLevel_vtbl_addr && *did_SetCooperativeLevel_vtbl_addr == (PROC)fake_did_SetCooperativeLevel) + { + hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); + } + + if (did_GetDeviceData_vtbl_addr && *did_GetDeviceData_vtbl_addr == (PROC)fake_did_GetDeviceData) + { + hook_func(did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); + } + + if (did_GetDeviceState_vtbl_addr && *did_GetDeviceState_vtbl_addr == (PROC)fake_did_GetDeviceState) + { + hook_func(did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); + } + #ifdef _MSC_VER if (g_dinput_hook_active) { From c67d80282a3de592a5d354f185ec9d4f977e4235 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 10 Jun 2024 22:08:44 +0200 Subject: [PATCH 0407/1053] update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3714a69..c35f44e 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,7 @@ Some games may require additional steps before they can be used with cnc-ddraw, - Stronghold Crusader Extreme HD - Stronghold Crusader HD - Stronghold HD +- Sudden Strike 2 - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD From 32349fd6a49d3b021e4301f5dbeba889a791d69b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jun 2024 02:58:20 +0200 Subject: [PATCH 0408/1053] simplify code --- src/directinput.c | 88 ++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 51 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index 13d06b8..e5e4dd5 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -19,19 +19,24 @@ DIRECTINPUTCREATEEXPROC real_DirectInputCreateEx; DIRECTINPUT8CREATEPROC real_DirectInput8Create; static DICREATEDEVICEPROC real_di_CreateDevice; -static PROC* di_CreateDevice_vtbl_addr; static DICREATEDEVICEEXPROC real_di_CreateDeviceEx; -static PROC* di_CreateDeviceEx_vtbl_addr; static DIDSETCOOPERATIVELEVELPROC real_did_SetCooperativeLevel; -static PROC* did_SetCooperativeLevel_vtbl_addr; static DIDGETDEVICEDATAPROC real_did_GetDeviceData; -static PROC* did_GetDeviceData_vtbl_addr; static DIDGETDEVICESTATEPROC real_did_GetDeviceState; -static PROC* did_GetDeviceState_vtbl_addr; + +static PROC* g_di_CreateDevice_vtbl_addr; +static PROC* g_di_CreateDeviceEx_vtbl_addr; +static PROC* g_did_SetCooperativeLevel_vtbl_addr; +static PROC* g_did_GetDeviceData_vtbl_addr; +static PROC* g_did_GetDeviceState_vtbl_addr; + static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) { + if (!org_func) + return 0; + PROC org = *org_func; DWORD old_protect; @@ -126,20 +131,20 @@ static HRESULT WINAPI fake_di_CreateDevice( if (!real_did_SetCooperativeLevel) { - did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -166,20 +171,20 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( if (!real_did_SetCooperativeLevel) { - did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; + g_did_SetCooperativeLevel_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->SetCooperativeLevel; real_did_SetCooperativeLevel = - (DIDSETCOOPERATIVELEVELPROC)hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); + (DIDSETCOOPERATIVELEVELPROC)hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)fake_did_SetCooperativeLevel); - did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; + g_did_GetDeviceData_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceData; real_did_GetDeviceData = - (DIDGETDEVICEDATAPROC)hook_func(did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); + (DIDGETDEVICEDATAPROC)hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)fake_did_GetDeviceData); - did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; + g_did_GetDeviceState_vtbl_addr = (PROC*)&(*lplpDIDevice)->lpVtbl->GetDeviceState; real_did_GetDeviceState = - (DIDGETDEVICESTATEPROC)hook_func(did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); + (DIDGETDEVICESTATEPROC)hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)fake_did_GetDeviceState); } } @@ -215,10 +220,10 @@ HRESULT WINAPI fake_DirectInputCreateA( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -253,10 +258,10 @@ HRESULT WINAPI fake_DirectInputCreateW( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*lplpDirectInput)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -292,10 +297,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } if (SUCCEEDED(result) && @@ -304,10 +309,10 @@ HRESULT WINAPI fake_DirectInputCreateEx( (IsEqualGUID(&IID_IDirectInput7A, riidltf) || IsEqualGUID(&IID_IDirectInput7W, riidltf)) && !g_config.no_dinput_hook) { - di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; + g_di_CreateDeviceEx_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDeviceEx; real_di_CreateDeviceEx = - (DICREATEDEVICEEXPROC)hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); + (DICREATEDEVICEEXPROC)hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)fake_di_CreateDeviceEx); } return result; @@ -343,10 +348,10 @@ HRESULT WINAPI fake_DirectInput8Create( if (SUCCEEDED(result) && !real_di_CreateDevice && !g_config.no_dinput_hook) { - di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; + g_di_CreateDevice_vtbl_addr = (PROC*)&(*ppvOut)->lpVtbl->CreateDevice; real_di_CreateDevice = - (DICREATEDEVICEPROC)hook_func(di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); + (DICREATEDEVICEPROC)hook_func(g_di_CreateDevice_vtbl_addr, (PROC)fake_di_CreateDevice); } return result; @@ -404,30 +409,11 @@ void dinput_hook_init() void dinput_hook_exit() { - if (di_CreateDevice_vtbl_addr && *di_CreateDevice_vtbl_addr == (PROC)fake_di_CreateDevice) - { - hook_func(di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); - } - - if (di_CreateDeviceEx_vtbl_addr && *di_CreateDeviceEx_vtbl_addr == (PROC)fake_di_CreateDeviceEx) - { - hook_func(di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); - } - - if (did_SetCooperativeLevel_vtbl_addr && *did_SetCooperativeLevel_vtbl_addr == (PROC)fake_did_SetCooperativeLevel) - { - hook_func(did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); - } - - if (did_GetDeviceData_vtbl_addr && *did_GetDeviceData_vtbl_addr == (PROC)fake_did_GetDeviceData) - { - hook_func(did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); - } - - if (did_GetDeviceState_vtbl_addr && *did_GetDeviceState_vtbl_addr == (PROC)fake_did_GetDeviceState) - { - hook_func(did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); - } + hook_func(g_di_CreateDevice_vtbl_addr, (PROC)real_di_CreateDevice); + hook_func(g_di_CreateDeviceEx_vtbl_addr, (PROC)real_di_CreateDeviceEx); + hook_func(g_did_SetCooperativeLevel_vtbl_addr, (PROC)real_did_SetCooperativeLevel); + hook_func(g_did_GetDeviceData_vtbl_addr, (PROC)real_did_GetDeviceData); + hook_func(g_did_GetDeviceState_vtbl_addr, (PROC)real_did_GetDeviceState); #ifdef _MSC_VER if (g_dinput_hook_active) From 8316f89eb4d6b4f68bffaff2b4ab18ed0225acb5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 11 Jun 2024 03:00:50 +0200 Subject: [PATCH 0409/1053] add NULL check --- src/directinput.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directinput.c b/src/directinput.c index e5e4dd5..bf5e3d5 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -34,7 +34,7 @@ static LPDIRECTINPUTDEVICEA g_mouse_device; static PROC hook_func(PROC* org_func, PROC new_func) { - if (!org_func) + if (!org_func || !new_func) return 0; PROC org = *org_func; From afef91cb7fab7344bddba11832b18ebb88f5290e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 00:38:23 +0200 Subject: [PATCH 0410/1053] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index c35f44e..4637a7a 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,10 @@ Some games may require additional steps before they can be used with cnc-ddraw,   +Need help and don't have a github account? Ask on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) + +  + ### Hotkeys * [Alt] + [Enter] = Switch between windowed and fullscreen mode * [Ctrl] + [Tab] = Unlock cursor From 05a79a8cbf8f00e3d2e4018e53a2fa27107c6fbc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 00:41:24 +0200 Subject: [PATCH 0411/1053] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4637a7a..9bce324 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -Need help and don't have a github account? Ask on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) +Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required)   From c7312c2c07b73958ede09bfa4bc69c6d31a6f680 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 02:47:31 +0200 Subject: [PATCH 0412/1053] allow to toggle windowed mode with F4 in HoMM games --- inc/config.h | 1 + src/config.c | 7 +++++++ src/wndproc.c | 9 +++++++++ 3 files changed, 17 insertions(+) diff --git a/inc/config.h b/inc/config.h index f6744a4..f0b8275 100644 --- a/inc/config.h +++ b/inc/config.h @@ -103,6 +103,7 @@ typedef struct CNCDDRAWCONFIG BOOL stronghold_hack; BOOL mgs_hack; BOOL tlc_hack; + BOOL homm_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index 79a945d..80c787e 100644 --- a/src/config.c +++ b/src/config.c @@ -113,6 +113,7 @@ 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); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -874,11 +875,17 @@ static void cfg_create_ini() "[Heroes3]\n" "renderer=opengl\n" "game_handles_close=true\n" + "homm_hack=true\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" + "\n" + "; Heroes of Might and Magic IV\n" + "[heroes4]\n" + "homm_hack=true\n" "\n" "; Hard Truck: Road to Victory\n" "[htruck]\n" diff --git a/src/wndproc.c b/src/wndproc.c index 43abdcf..ebde744 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -777,6 +777,12 @@ 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)) { @@ -808,6 +814,9 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam } 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); From 02605d2b45f7c5fff4185bd4dbab85fb6682c7e0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 12 Jun 2024 02:50:41 +0200 Subject: [PATCH 0413/1053] add preset for Master of Puppets mod --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 80c787e..324f8be 100644 --- a/src/config.c +++ b/src/config.c @@ -883,6 +883,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "homm_hack=true\n" "\n" + "; Heroes of Might and Magic III - Master of Puppets mod\n" + "[MoP]\n" + "game_handles_close=true\n" + "homm_hack=true\n" + "\n" "; Heroes of Might and Magic IV\n" "[heroes4]\n" "homm_hack=true\n" From 30de4d7df42380c4850fbbf6f8a12529d6a30183 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Jun 2024 05:28:06 +0200 Subject: [PATCH 0414/1053] use high resolutuion timer by default --- inc/dd.h | 4 ++++ inc/versionhelpers.h | 4 ++++ src/dd.c | 25 ++++++++++++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/inc/dd.h b/inc/dd.h index e28249a..8a074da 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -50,6 +50,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define LIMIT_TESTCOOP 1 #define LIMIT_BLTFAST 2 +#ifndef CREATE_WAITABLE_TIMER_HIGH_RESOLUTION +#define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; diff --git a/inc/versionhelpers.h b/inc/versionhelpers.h index 8acf6f5..3aa5742 100644 --- a/inc/versionhelpers.h +++ b/inc/versionhelpers.h @@ -119,6 +119,10 @@ VERSIONHELPERAPI IsWindows10OrGreater(void) { return IsWindowsThresholdOrGreater(); } +VERSIONHELPERAPI IsWindows10Version1803OrGreater(void) { + return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN10), LOBYTE(_WIN32_WINNT_WIN10), 17134, 0); +} + VERSIONHELPERAPI IsWindows11OrGreater(void) { return IsWindowsVersionOrGreater(HIBYTE(_WIN32_WINNT_WIN11), LOBYTE(_WIN32_WINNT_WIN11), 22000, 0); } diff --git a/src/dd.c b/src/dd.c index db0623f..c6dfc7e 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1578,12 +1578,28 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.minfps > 0) g_ddraw.minfps_tick_len = (DWORD)(1000.0f / g_config.minfps); + + HANDLE (WINAPI *createTimerExW)(LPSECURITY_ATTRIBUTES, LPCWSTR, DWORD, DWORD) = NULL; + + if (!IsWine() && IsWindows10Version1803OrGreater()) + { + createTimerExW = (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "CreateWaitableTimerExW"); + } + + DWORD timer_flags = CREATE_WAITABLE_TIMER_MANUAL_RESET | CREATE_WAITABLE_TIMER_HIGH_RESOLUTION; + /* can't fully set it up here due to missing g_ddraw.mode.dmDisplayFrequency */ - g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_fpsl.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_fpsl.htimer) + g_fpsl.htimer = CreateWaitableTimer(NULL, TRUE, NULL); if (g_config.maxgameticks > 0 && g_config.maxgameticks <= 1000) { - g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.ticks_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_ddraw.ticks_limiter.htimer) + g_ddraw.ticks_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float len = 1000.0f / g_config.maxgameticks; g_ddraw.ticks_limiter.tick_length_ns = (LONGLONG)(len * 10000); @@ -1593,7 +1609,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute if (g_config.maxgameticks >= 0 || g_config.maxgameticks == -2) { /* always using 60 fps for flip... */ - g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); + g_ddraw.flip_limiter.htimer = createTimerExW ? createTimerExW(NULL, NULL, timer_flags, TIMER_ALL_ACCESS) : NULL; + + if (!g_ddraw.flip_limiter.htimer) + g_ddraw.flip_limiter.htimer = CreateWaitableTimer(NULL, TRUE, NULL); float flip_len = 1000.0f / 60; g_ddraw.flip_limiter.tick_length_ns = (LONGLONG)(flip_len * 10000); From a0abcb20be68d80531eb9ce4c5ca9545fdb33a4d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 15 Jun 2024 06:06:27 +0200 Subject: [PATCH 0415/1053] define CREATE_WAITABLE_TIMER_MANUAL_RESET in header --- inc/dd.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index 8a074da..73a1202 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -54,6 +54,10 @@ HRESULT dd_CreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOute #define CREATE_WAITABLE_TIMER_HIGH_RESOLUTION 0x00000002 #endif +#ifndef CREATE_WAITABLE_TIMER_MANUAL_RESET +#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001 +#endif + typedef struct SPEEDLIMITER { DWORD tick_length; From 69ad0c2ac677702dbd27c25709d651a2553b8304 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 02:36:20 +0200 Subject: [PATCH 0416/1053] improve debug logs --- src/IDirect3D/IDirect3D.c | 28 +++-- src/IDirect3D/IDirect3D2.c | 20 ++-- src/IDirect3D/IDirect3D3.c | 34 +++--- src/IDirect3D/IDirect3D7.c | 26 +++-- src/IDirectDraw/IDirectDraw.c | 97 ++++++++++------- src/IDirectDraw/IDirectDrawClipper.c | 31 ++++-- src/IDirectDraw/IDirectDrawGammaControl.c | 20 +++- src/IDirectDraw/IDirectDrawPalette.c | 29 +++-- src/IDirectDraw/IDirectDrawSurface.c | 123 ++++++++++++---------- 9 files changed, 255 insertions(+), 153 deletions(-) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 352430f..d1e6cc9 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D__AddRef(IDirect3DImpl* This) ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D__Release(IDirect3DImpl* This) HRESULT __stdcall IDirect3D__Initialize(IDirect3DImpl* This, int a) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,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)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D__EnumDevices(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D__CreateLight(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D__CreateMaterial(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +87,7 @@ HRESULT __stdcall IDirect3D__CreateViewport(IDirect3DImpl* This, int a, int b) HRESULT __stdcall IDirect3D__FindDevice(IDirect3DImpl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index d84598f..84169ae 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -1,10 +1,12 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, obj); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -12,7 +14,7 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +22,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); ULONG ret = --This->ref; @@ -37,7 +39,7 @@ ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +47,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +55,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +63,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +71,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +79,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 0978d4a..736572a 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D3__AddRef(IDirect3D3Impl* This) ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D3__Release(IDirect3D3Impl* This) HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,7 @@ HRESULT __stdcall IDirect3D3__EnumDevices(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D3__CreateLight(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D3__CreateMaterial(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D3__CreateViewport(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -77,7 +87,7 @@ HRESULT __stdcall IDirect3D3__FindDevice(IDirect3D3Impl* This, int a, int b) HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -85,7 +95,7 @@ HRESULT __stdcall IDirect3D3__CreateDevice(IDirect3D3Impl* This, int a, int b, i HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, int b, int c, int d) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -93,7 +103,7 @@ HRESULT __stdcall IDirect3D3__CreateVertexBuffer(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -101,7 +111,7 @@ HRESULT __stdcall IDirect3D3__EnumZBufferFormats(IDirect3D3Impl* This, int a, in HRESULT __stdcall IDirect3D3__EvictManagedTextures(IDirect3D3Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 99c36bb..364b957 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -1,18 +1,28 @@ +#include #include "IDirect3D.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p)\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirect3D7__AddRef(IDirect3D7Impl* This) ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -37,7 +47,7 @@ ULONG __stdcall IDirect3D7__Release(IDirect3D7Impl* This) HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -45,7 +55,7 @@ HRESULT __stdcall IDirect3D7__EnumDevices(IDirect3D7Impl* This, int a, int b) HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -53,7 +63,7 @@ HRESULT __stdcall IDirect3D7__CreateDevice(IDirect3D7Impl* This, int a, int b, i HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -61,7 +71,7 @@ HRESULT __stdcall IDirect3D7__CreateVertexBuffer(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -69,7 +79,7 @@ HRESULT __stdcall IDirect3D7__EnumZBufferFormats(IDirect3D7Impl* This, int a, in HRESULT __stdcall IDirect3D7__EvictManagedTextures(IDirect3D7Impl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index f0ee793..6c58b22 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,5 +1,6 @@ #include #include +#include #include "IDirectDraw.h" #include "IDirect3D.h" #include "IAMMediaStream.h" @@ -11,10 +12,11 @@ #include "hook.h" #include "config.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = E_NOINTERFACE; @@ -158,7 +160,7 @@ HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; #ifdef _DEBUG @@ -173,7 +175,7 @@ ULONG __stdcall IDirectDraw__AddRef(IDirectDrawImpl* This) ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -196,7 +198,7 @@ ULONG __stdcall IDirectDraw__Release(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__Compact(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -209,12 +211,13 @@ HRESULT __stdcall IDirectDraw__CreateClipper( IUnknown FAR* pUnkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lplpDDClipper=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, dwFlags, lplpDDClipper, - pUnkOuter); + pUnkOuter, + _ReturnAddress()); HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); @@ -230,13 +233,14 @@ HRESULT __stdcall IDirectDraw__CreatePalette( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lpDDColorArray=%p, lpDDPalette=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDColorArray, lpDDPalette, - unkOuter); + unkOuter, + _ReturnAddress()); HRESULT ret = dd_CreatePalette(dwFlags, lpDDColorArray, (IDirectDrawPaletteImpl**)lpDDPalette, unkOuter); @@ -251,12 +255,13 @@ HRESULT __stdcall IDirectDraw__CreateSurface( IUnknown FAR* unkOuter) { TRACE( - "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p)\n", + "-> %s(This=%p, lpDDSurfaceDesc=%p, lpDDSurface=%p, unkOuter=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, lpDDSurface, - unkOuter); + unkOuter, + _ReturnAddress()); HRESULT ret = dd_CreateSurface( @@ -274,7 +279,7 @@ HRESULT __stdcall IDirectDraw__DuplicateSurface( LPDIRECTDRAWSURFACE7 lpDDSrcSurface, LPDIRECTDRAWSURFACE7* lpDDDestSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_CANTDUPLICATE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -288,13 +293,14 @@ HRESULT __stdcall IDirectDraw__EnumDisplayModes( LPDDENUMMODESCALLBACK2 lpEnumModesCallback) { TRACE( - "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p)\n", + "-> %s(This=%p, dwFlags=%08X, lpDDSurfaceDesc=%p, lpContext=%p, lpEnumModesCallback=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurfaceDesc, lpContext, - lpEnumModesCallback); + lpEnumModesCallback, + _ReturnAddress()); HRESULT ret = dd_EnumDisplayModes( @@ -314,7 +320,7 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -322,7 +328,7 @@ HRESULT __stdcall IDirectDraw__EnumSurfaces( HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -330,7 +336,14 @@ HRESULT __stdcall IDirectDraw__FlipToGDISurface(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDEmulCaps) { - TRACE("-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p)\n", __FUNCTION__, This, lpDDDriverCaps, lpDDEmulCaps); + TRACE( + "-> %s(This=%p, lpDDDriverCaps=%p, lpDDEmulCaps=%p) [%p]\n", + __FUNCTION__, + This, + lpDDDriverCaps, + lpDDEmulCaps, + _ReturnAddress()); + HRESULT ret = dd_GetCaps((LPDDCAPS_DX1)lpDDDriverCaps, (LPDDCAPS_DX1)lpDDEmulCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -338,7 +351,7 @@ HRESULT __stdcall IDirectDraw__GetCaps(IDirectDrawImpl* This, LPDDCAPS lpDDDrive HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_GetDisplayMode((LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -346,7 +359,7 @@ HRESULT __stdcall IDirectDraw__GetDisplayMode(IDirectDrawImpl* This, LPDDSURFACE HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpNumCodes, LPDWORD lpCodes) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -354,7 +367,7 @@ HRESULT __stdcall IDirectDraw__GetFourCCCodes(IDirectDrawImpl* This, LPDWORD lpN HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAWSURFACE7* lplpGDIDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; *lplpGDIDDSurface = (LPDIRECTDRAWSURFACE7)g_ddraw.primary; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); @@ -363,7 +376,7 @@ HRESULT __stdcall IDirectDraw__GetGDISurface(IDirectDrawImpl* This, LPDIRECTDRAW HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWORD lpdwFreq) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_GetMonitorFrequency(lpdwFreq); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -371,7 +384,7 @@ HRESULT __stdcall IDirectDraw__GetMonitorFrequency(IDirectDrawImpl* This, LPDWOR HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwScanLine) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_UNSUPPORTED; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -379,7 +392,7 @@ HRESULT __stdcall IDirectDraw__GetScanLine(IDirectDrawImpl* This, LPDWORD lpdwSc HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPBOOL lpbIsInVB) { - TRACE("-> %s(This=%p, lpbIsInVB=%p)\n", __FUNCTION__, This, lpbIsInVB); + TRACE("-> %s(This=%p, lpbIsInVB=%p) [%p]\n", __FUNCTION__, This, lpbIsInVB, _ReturnAddress()); HRESULT ret = dd_GetVerticalBlankStatus(lpbIsInVB); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -387,7 +400,7 @@ HRESULT __stdcall IDirectDraw__GetVerticalBlankStatus(IDirectDrawImpl* This, LPB HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -395,7 +408,7 @@ HRESULT __stdcall IDirectDraw__Initialize(IDirectDrawImpl* This, GUID* lpGUID) HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_RestoreDisplayMode(); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -403,7 +416,7 @@ HRESULT __stdcall IDirectDraw__RestoreDisplayMode(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND hwnd, DWORD dwFlags) { - TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X)\n", __FUNCTION__, This, hwnd, dwFlags); + TRACE("-> %s(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", __FUNCTION__, This, hwnd, dwFlags, _ReturnAddress()); HRESULT ret = dd_SetCooperativeLevel(hwnd, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -411,7 +424,15 @@ HRESULT __stdcall IDirectDraw__SetCooperativeLevel(IDirectDrawImpl* This, HWND h HRESULT __stdcall IDirectDraw__SetDisplayMode(IDirectDrawImpl* This, DWORD dwWidth, DWORD dwHeight, DWORD dwBPP) { - TRACE("-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d)\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP); + TRACE( + "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d) [%p]\n", + __FUNCTION__, + This, + dwWidth, + dwHeight, + dwBPP, + _ReturnAddress()); + HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -426,14 +447,15 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( DWORD dwFlags) { TRACE( - "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d)\n", + "-> %s(This=%p, dwWidth=%d, dwHeight=%d, dwBPP=%d, refreshRate=%d, dwFlags=%d) [%p]\n", __FUNCTION__, This, dwWidth, dwHeight, dwBPP, dwRefreshRate, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dd_SetDisplayMode(dwWidth, dwHeight, dwBPP, SDM_MODE_SET_BY_GAME); @@ -443,7 +465,7 @@ HRESULT __stdcall IDirectDraw__SetDisplayModeX( HRESULT __stdcall IDirectDraw__WaitForVerticalBlank(IDirectDrawImpl* This, DWORD dwFlags, HANDLE hEvent) { - TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p)\n", __FUNCTION__, This, dwFlags, hEvent); + TRACE_EXT("-> %s(This=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, dwFlags, hEvent, _ReturnAddress()); HRESULT ret = dd_WaitForVerticalBlank(dwFlags, hEvent); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -456,12 +478,13 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( LPDWORD lpdwFree) { TRACE( - "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p)\n", + "-> %s(This=%p, lpDDCaps=%p, lpdwTotal=%p, lpdwFree=%p) [%p]\n", __FUNCTION__, This, lpDDCaps, lpdwTotal, - lpdwFree); + lpdwFree, + _ReturnAddress()); HRESULT ret = dd_GetAvailableVidMem((LPDDSCAPS)lpDDCaps, lpdwTotal, lpdwFree); @@ -471,7 +494,7 @@ HRESULT __stdcall IDirectDraw__GetAvailableVidMem( HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, LPDIRECTDRAWSURFACE7* lplpDDSurface) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -479,7 +502,7 @@ HRESULT __stdcall IDirectDraw__GetSurfaceFromDC(IDirectDrawImpl* This, HDC hdc, HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -487,7 +510,7 @@ HRESULT __stdcall IDirectDraw__RestoreAllSurfaces(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dd_TestCooperativeLevel(); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -495,7 +518,7 @@ HRESULT __stdcall IDirectDraw__TestCooperativeLevel(IDirectDrawImpl* This) HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDEVICEIDENTIFIER2 pDDDI, DWORD dwFlags) { - TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X)\n", __FUNCTION__, This, pDDDI, dwFlags); + TRACE("-> %s(This=%p, pDDDI=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, pDDDI, dwFlags, _ReturnAddress()); HRESULT ret = dd_GetDeviceIdentifier((LPDDDEVICEIDENTIFIER)pDDDI, dwFlags, &This->guid); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -503,7 +526,7 @@ HRESULT __stdcall IDirectDraw__GetDeviceIdentifier(IDirectDrawImpl* This, LPDDDE HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pModes, DWORD dwNumModes, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_CURRENTLYNOTAVAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -511,7 +534,7 @@ HRESULT __stdcall IDirectDraw__StartModeTest(IDirectDrawImpl* This, LPSIZE pMode HRESULT __stdcall IDirectDraw__EvaluateMode(IDirectDrawImpl* This, DWORD dwFlags, DWORD* pTimeout) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 34cd4de..9dba68f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -1,10 +1,20 @@ +#include #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) + HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -12,7 +22,7 @@ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* Thi ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -20,7 +30,7 @@ ULONG __stdcall IDirectDrawClipper__AddRef(IDirectDrawClipperImpl* This) ULONG __stdcall IDirectDrawClipper__Release(IDirectDrawClipperImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -47,12 +57,13 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( LPDWORD lpdwSiz) { TRACE( - "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p)\n", + "-> %s(This=%p, lpRect=%p, lpClipList=%p, lpdwSiz=%p) [%p]\n", __FUNCTION__, This, lpRect, lpClipList, - lpdwSiz); + lpdwSiz, + _ReturnAddress()); HRESULT ret = ddc_GetClipList(This, lpRect, lpClipList, lpdwSiz); @@ -62,7 +73,7 @@ HRESULT __stdcall IDirectDrawClipper__GetClipList( HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND FAR* lphWnd) { - TRACE("-> %s(This=%p, lphWnd=%p)\n", __FUNCTION__, This, lphWnd); + TRACE("-> %s(This=%p, lphWnd=%p) [%p]\n", __FUNCTION__, This, lphWnd, _ReturnAddress()); HRESULT ret = ddc_GetHWnd(This, lphWnd); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -70,7 +81,7 @@ HRESULT __stdcall IDirectDrawClipper__GetHWnd(IDirectDrawClipperImpl* This, HWND HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, LPDIRECTDRAW lpDD, DWORD dwFlags) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -78,7 +89,7 @@ HRESULT __stdcall IDirectDrawClipper__Initialize(IDirectDrawClipperImpl* This, L HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* This, BOOL FAR* lpbChanged) { - TRACE("-> %s(This=%p, lpbChanged=%p)\n", __FUNCTION__, This, lpbChanged); + TRACE("-> %s(This=%p, lpbChanged=%p) [%p]\n", __FUNCTION__, This, lpbChanged, _ReturnAddress()); HRESULT ret = ddc_IsClipListChanged(This, lpbChanged); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -86,7 +97,7 @@ HRESULT __stdcall IDirectDrawClipper__IsClipListChanged(IDirectDrawClipperImpl* HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, LPRGNDATA lpClipList, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpClipList, dwFlags); + TRACE("-> %s(This=%p, lpClipList=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpClipList, dwFlags, _ReturnAddress()); HRESULT ret = ddc_SetClipList(This, lpClipList, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -94,7 +105,7 @@ HRESULT __stdcall IDirectDrawClipper__SetClipList(IDirectDrawClipperImpl* This, HRESULT __stdcall IDirectDrawClipper__SetHWnd(IDirectDrawClipperImpl* This, DWORD dwFlags, HWND hWnd) { - TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p)\n", __FUNCTION__, This, dwFlags, hWnd); + TRACE("-> %s(This=%p, dwFlags=%08X, hWnd=%p) [%p]\n", __FUNCTION__, This, dwFlags, hWnd, _ReturnAddress()); HRESULT ret = ddc_SetHWnd(This, dwFlags, hWnd); TRACE("<- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 7676bc2..71f10d9 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -1,9 +1,19 @@ +#include #include "IDirectDrawGammaControl.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) + HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -11,7 +21,7 @@ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaContro ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -19,7 +29,7 @@ ULONG __stdcall IDirectDrawGammaControl__AddRef(IDirectDrawGammaControlImpl* Thi ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -36,7 +46,7 @@ ULONG __stdcall IDirectDrawGammaControl__Release(IDirectDrawGammaControlImpl* Th HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -44,7 +54,7 @@ HRESULT __stdcall IDirectDrawGammaControl__GetGammaRamp(IDirectDrawGammaControlI HRESULT __stdcall IDirectDrawGammaControl__SetGammaRamp(IDirectDrawGammaControlImpl* This, DWORD dwFlags, LPDDGAMMARAMP lpRampData) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_EXCEPTION; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 2767478..6d221b6 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -1,12 +1,21 @@ +#include #include "IDirectDrawPalette.h" #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + ppvObj, + _ReturnAddress()); + HRESULT ret = E_NOINTERFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -14,7 +23,7 @@ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* Thi ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -22,7 +31,7 @@ ULONG __stdcall IDirectDrawPalette__AddRef(IDirectDrawPaletteImpl* This) ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -42,7 +51,7 @@ ULONG __stdcall IDirectDrawPalette__Release(IDirectDrawPaletteImpl* This) HRESULT __stdcall IDirectDrawPalette__GetCaps(IDirectDrawPaletteImpl* This, LPDWORD lpdwCaps) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p)\n", __FUNCTION__, This, lpdwCaps); + TRACE("NOT_IMPLEMENTED -> %s(This=%p, lpdwCaps=%p) [%p]\n", __FUNCTION__, This, lpdwCaps, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -56,13 +65,14 @@ HRESULT __stdcall IDirectDrawPalette__GetEntries( LPPALETTEENTRY lpEntries) { TRACE( - "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p)\n", + "-> %s(This=%p, dwFlags=%08X, dwBase=%u, dwNumEntries=%u, lpEntries=%p) [%p]\n", __FUNCTION__, This, dwFlags, dwBase, dwNumEntries, - lpEntries); + lpEntries, + _ReturnAddress()); HRESULT ret = ddp_GetEntries(This, dwFlags, dwBase, dwNumEntries, lpEntries); @@ -76,7 +86,7 @@ HRESULT __stdcall IDirectDrawPalette__Initialize( DWORD dwFlags, LPPALETTEENTRY lpDDColorTable) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -90,13 +100,14 @@ HRESULT __stdcall IDirectDrawPalette__SetEntries( LPPALETTEENTRY lpEntries) { TRACE_EXT( - "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p)\n", + "-> %s(This=%p, dwFlags=%08X, dwStartingEntry=%u, dwCount=%u, lpEntries=%p) [%p]\n", __FUNCTION__, This, dwFlags, dwStartingEntry, dwCount, - lpEntries); + lpEntries, + _ReturnAddress()); HRESULT ret = ddp_SetEntries(This, dwFlags, dwStartingEntry, dwCount, lpEntries); diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 7445f99..23c8e33 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -1,3 +1,4 @@ +#include #include #include "IDirectDrawSurface.h" #include "IDirectDrawGammaControl.h" @@ -5,10 +6,11 @@ #include "dd.h" #include "debug.h" +#pragma intrinsic(_ReturnAddress) HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { - TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p)\n", __FUNCTION__, This, (unsigned int)riid, ppvObj); + TRACE("-> %s(This=%p, riid=%08X, ppvObj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, ppvObj, _ReturnAddress()); HRESULT ret = S_OK; if (riid) @@ -60,7 +62,7 @@ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* Thi ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -68,7 +70,7 @@ ULONG __stdcall IDirectDrawSurface__AddRef(IDirectDrawSurfaceImpl* This) ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -138,7 +140,7 @@ ULONG __stdcall IDirectDrawSurface__Release(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, lpDDSurface=%p)\n", __FUNCTION__, This, lpDDSurface); + TRACE("-> %s(This=%p, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, lpDDSurface, _ReturnAddress()); HRESULT ret = dds_AddAttachedSurface(This, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -146,7 +148,7 @@ HRESULT __stdcall IDirectDrawSurface__AddAttachedSurface(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__AddOverlayDirtyRect(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -161,14 +163,15 @@ HRESULT __stdcall IDirectDrawSurface__Blt( LPDDBLTFX lpDDBltFx) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p)\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X, lpDDBltFx=%p) [%p]\n", __FUNCTION__, This, lpDestRect, lpDDSrcSurface, lpSrcRect, dwFlags, - lpDDBltFx); + lpDDBltFx, + _ReturnAddress()); HRESULT ret = dds_Blt(This, lpDestRect, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags, lpDDBltFx); @@ -182,7 +185,7 @@ HRESULT __stdcall IDirectDrawSurface__BltBatch( DWORD dwCount, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -197,14 +200,15 @@ HRESULT __stdcall IDirectDrawSurface__BltFast( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X)\n", + "-> %s(This=%p, dwX=%d, dwY=%d, lpDDSrcSurface=%p, lpSrcRect=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, dwX, dwY, lpDDSrcSurface, lpSrcRect, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dds_BltFast(This, dwX, dwY, (IDirectDrawSurfaceImpl*)lpDDSrcSurface, lpSrcRect, dwFlags); @@ -217,7 +221,7 @@ HRESULT __stdcall IDirectDrawSurface__DeleteAttachedSurface( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSurface) { - TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p)\n", __FUNCTION__, This, dwFlags, lpDDSurface); + TRACE("-> %s(This=%p, dwFlags=%08X, lpDDSurface=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpDDSurface, _ReturnAddress()); HRESULT ret = dds_DeleteAttachedSurface(This, dwFlags, (IDirectDrawSurfaceImpl*)lpDDSurface); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -229,11 +233,12 @@ HRESULT __stdcall IDirectDrawSurface__EnumAttachedSurfaces( LPDDENUMSURFACESCALLBACK7 lpEnumSurfacesCallback) { TRACE( - "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p)\n", + "-> %s(This=%p, lpContext=%p, lpEnumSurfacesCallback=%p) [%p]\n", __FUNCTION__, This, lpContext, - lpEnumSurfacesCallback); + lpEnumSurfacesCallback, + _ReturnAddress()); HRESULT ret = dds_EnumAttachedSurfaces(This, lpContext, (LPDDENUMSURFACESCALLBACK)lpEnumSurfacesCallback); @@ -247,7 +252,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -259,11 +264,12 @@ HRESULT __stdcall IDirectDrawSurface__Flip( DWORD dwFlags) { TRACE_EXT( - "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X)\n", + "-> %s(This=%p, lpDDSurfaceTargetOverride=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSurfaceTargetOverride, - dwFlags); + dwFlags, + _ReturnAddress()); HRESULT ret = dds_Flip(This, (IDirectDrawSurfaceImpl*)lpDDSurfaceTargetOverride, dwFlags); @@ -276,15 +282,23 @@ HRESULT __stdcall IDirectDrawSurface__GetAttachedSurface( LPDDSCAPS2 lpDdsCaps, LPDIRECTDRAWSURFACE7 FAR* lpDDsurface) { - TRACE("-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p)\n", __FUNCTION__, This, lpDdsCaps->dwCaps, lpDDsurface); + TRACE( + "-> %s(This=%p, dwCaps=%08X, lpDDsurface=%p) [%p]\n", + __FUNCTION__, + This, + lpDdsCaps->dwCaps, + lpDDsurface, + _ReturnAddress()); + HRESULT ret = dds_GetAttachedSurface(This, (LPDDSCAPS)lpDdsCaps, (IDirectDrawSurfaceImpl**)lpDDsurface); + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -292,7 +306,7 @@ HRESULT __stdcall IDirectDrawSurface__GetBltStatus(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDDSCAPS2 lpDDSCaps) { - TRACE("-> %s(This=%p, lpDDSCaps=%p)\n", __FUNCTION__, This, lpDDSCaps); + TRACE("-> %s(This=%p, lpDDSCaps=%p) [%p]\n", __FUNCTION__, This, lpDDSCaps, _ReturnAddress()); HRESULT ret = dds_GetCaps(This, (LPDDSCAPS)lpDDSCaps); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -300,7 +314,7 @@ HRESULT __stdcall IDirectDrawSurface__GetCaps(IDirectDrawSurfaceImpl* This, LPDD HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER FAR* lpClipper) { - TRACE_EXT("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); + TRACE_EXT("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); HRESULT ret = dds_GetClipper(This, (IDirectDrawClipperImpl**)lpClipper); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -308,7 +322,7 @@ HRESULT __stdcall IDirectDrawSurface__GetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); HRESULT ret = dds_GetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -316,7 +330,7 @@ HRESULT __stdcall IDirectDrawSurface__GetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FAR* lpHDC) { - TRACE_EXT("-> %s(This=%p, lpHDC=%p)\n", __FUNCTION__, This, lpHDC); + TRACE_EXT("-> %s(This=%p, lpHDC=%p) [%p]\n", __FUNCTION__, This, lpHDC, _ReturnAddress()); HRESULT ret = dds_GetDC(This, lpHDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -324,7 +338,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDC(IDirectDrawSurfaceImpl* This, HDC FA HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -332,7 +346,7 @@ HRESULT __stdcall IDirectDrawSurface__GetFlipStatus(IDirectDrawSurfaceImpl* This HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* This, LPLONG lplX, LPLONG lplY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTAOVERLAYSURFACE; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -340,7 +354,7 @@ HRESULT __stdcall IDirectDrawSurface__GetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE FAR* lplpDDPalette) { - TRACE("-> %s(This=%p, lplpDDPalette=%p)\n", __FUNCTION__, This, lplpDDPalette); + TRACE("-> %s(This=%p, lplpDDPalette=%p) [%p]\n", __FUNCTION__, This, lplpDDPalette, _ReturnAddress()); HRESULT ret = dds_GetPalette(This, (IDirectDrawPaletteImpl**)lplpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -348,7 +362,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* This, LPDDPIXELFORMAT ddpfPixelFormat) { - TRACE_EXT("-> %s(This=%p, ...)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p, ...) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_GetPixelFormat(This, ddpfPixelFormat); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -356,7 +370,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPixelFormat(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__GetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p)\n", __FUNCTION__, This, lpDDSurfaceDesc); + TRACE_EXT("-> %s(This=%p, lpDDSurfaceDesc=%p) [%p]\n", __FUNCTION__, This, lpDDSurfaceDesc, _ReturnAddress()); HRESULT ret = dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)lpDDSurfaceDesc); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -367,7 +381,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( LPDIRECTDRAW lpDD, LPDDSURFACEDESC2 lpDDSurfaceDesc) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("<- %s\n", __FUNCTION__); return ret; @@ -375,7 +389,7 @@ HRESULT __stdcall IDirectDrawSurface__Initialize( HRESULT __stdcall IDirectDrawSurface__IsLost(IDirectDrawSurfaceImpl* This) { - //TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + //TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; //TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -389,13 +403,14 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HANDLE hEvent) { TRACE_EXT( - "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p)\n", + "-> %s(This=%p, lpDestRect=%p, lpDDSurfaceDesc=%p, dwFlags=%08X, hEvent=%p) [%p]\n", __FUNCTION__, This, lpDestRect, lpDDSurfaceDesc, dwFlags, - hEvent); + hEvent, + _ReturnAddress()); HRESULT ret = dds_Lock(This, lpDestRect, (LPDDSURFACEDESC)lpDDSurfaceDesc, dwFlags, hEvent); @@ -405,7 +420,7 @@ HRESULT __stdcall IDirectDrawSurface__Lock( HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HDC hDC) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_ReleaseDC(This, hDC); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -413,7 +428,7 @@ HRESULT __stdcall IDirectDrawSurface__ReleaseDC(IDirectDrawSurfaceImpl* This, HD HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) { - TRACE_EXT("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE_EXT("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -421,7 +436,7 @@ HRESULT __stdcall IDirectDrawSurface__Restore(IDirectDrawSurfaceImpl* This) HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWCLIPPER lpClipper) { - TRACE("-> %s(This=%p, lpClipper=%p)\n", __FUNCTION__, This, lpClipper); + TRACE("-> %s(This=%p, lpClipper=%p) [%p]\n", __FUNCTION__, This, lpClipper, _ReturnAddress()); HRESULT ret = dds_SetClipper(This, (IDirectDrawClipperImpl*)lpClipper); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -429,7 +444,7 @@ HRESULT __stdcall IDirectDrawSurface__SetClipper(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, DWORD dwFlags, LPDDCOLORKEY lpColorKey) { - TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p)\n", __FUNCTION__, This, dwFlags, lpColorKey); + TRACE_EXT("-> %s(This=%p, dwFlags=0x%08X, lpColorKey=%p) [%p]\n", __FUNCTION__, This, dwFlags, lpColorKey, _ReturnAddress()); HRESULT ret = dds_SetColorKey(This, dwFlags, lpColorKey); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -437,7 +452,7 @@ HRESULT __stdcall IDirectDrawSurface__SetColorKey(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* This, LONG lX, LONG lY) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -445,7 +460,7 @@ HRESULT __stdcall IDirectDrawSurface__SetOverlayPosition(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, LPDIRECTDRAWPALETTE lpDDPalette) { - TRACE("-> %s(This=%p, lpDDPalette=%p)\n", __FUNCTION__, This, lpDDPalette); + TRACE("-> %s(This=%p, lpDDPalette=%p) [%p]\n", __FUNCTION__, This, lpDDPalette, _ReturnAddress()); HRESULT ret = dds_SetPalette(This, (IDirectDrawPaletteImpl*)lpDDPalette); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -453,7 +468,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPalette(IDirectDrawSurfaceImpl* This, L HRESULT __stdcall IDirectDrawSurface__Unlock(IDirectDrawSurfaceImpl* This, LPRECT lpRect) { - TRACE_EXT("-> %s(This=%p, lpRect=%p)\n", __FUNCTION__, This, lpRect); + TRACE_EXT("-> %s(This=%p, lpRect=%p) [%p]\n", __FUNCTION__, This, lpRect, _ReturnAddress()); HRESULT ret = dds_Unlock(This, lpRect); TRACE_EXT("<- %s\n", __FUNCTION__); return ret; @@ -467,7 +482,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( DWORD dwFlags, LPDDOVERLAYFX lpDDOverlayFx) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -475,7 +490,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlay( HRESULT __stdcall IDirectDrawSurface__UpdateOverlayDisplay(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -486,7 +501,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( DWORD dwFlags, LPDIRECTDRAWSURFACE7 lpDDSReference) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -494,7 +509,7 @@ HRESULT __stdcall IDirectDrawSurface__UpdateOverlayZOrder( HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* This, LPVOID* lplpDD) { - TRACE("-> %s(This=%p)\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = dds_GetDDInterface(This, lplpDD); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -502,7 +517,7 @@ HRESULT __stdcall IDirectDrawSurface__GetDDInterface(IDirectDrawSurfaceImpl* Thi HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -510,7 +525,7 @@ HRESULT __stdcall IDirectDrawSurface__PageLock(IDirectDrawSurfaceImpl* This, DWO HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -518,7 +533,7 @@ HRESULT __stdcall IDirectDrawSurface__PageUnlock(IDirectDrawSurfaceImpl* This, D HRESULT __stdcall IDirectDrawSurface__SetSurfaceDesc(IDirectDrawSurfaceImpl* This, LPDDSURFACEDESC2 lpDDSD, DWORD dwFlags) { - TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X)\n", __FUNCTION__, This, lpDDSD, dwFlags); + TRACE("-> %s(This=%p, lpDDSD=%p, dwFlags=%08X) [%p]\n", __FUNCTION__, This, lpDDSD, dwFlags, _ReturnAddress()); HRESULT ret = dds_SetSurfaceDesc(This, lpDDSD, dwFlags); TRACE("<- %s\n", __FUNCTION__); return ret; @@ -531,7 +546,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPrivateData( DWORD dwSize, DWORD dwFlags) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_OUTOFMEMORY; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -543,7 +558,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( LPVOID lpBuffer, LPDWORD lpdwBufferSize) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_NOTFOUND; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -551,7 +566,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPrivateData( HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* This, REFGUID rtag) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -559,7 +574,7 @@ HRESULT __stdcall IDirectDrawSurface__FreePrivateData(IDirectDrawSurfaceImpl* Th HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* This, LPDWORD lpdwValue) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -567,7 +582,7 @@ HRESULT __stdcall IDirectDrawSurface__GetUniquenessValue(IDirectDrawSurfaceImpl* HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceImpl* This) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -575,7 +590,7 @@ HRESULT __stdcall IDirectDrawSurface__ChangeUniquenessValue(IDirectDrawSurfaceIm HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, DWORD dwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -583,7 +598,7 @@ HRESULT __stdcall IDirectDrawSurface__SetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, LPDWORD lpdwPrio) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -591,7 +606,7 @@ HRESULT __stdcall IDirectDrawSurface__GetPriority(IDirectDrawSurfaceImpl* This, HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD dwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -599,7 +614,7 @@ HRESULT __stdcall IDirectDrawSurface__SetLOD(IDirectDrawSurfaceImpl* This, DWORD HRESULT __stdcall IDirectDrawSurface__GetLOD(IDirectDrawSurfaceImpl* This, LPDWORD lpdwLod) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p)\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DDERR_INVALIDOBJECT; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; From 0290ccf0e98b9751c77f0221042fb901d12f523b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 02:40:31 +0200 Subject: [PATCH 0417/1053] fix for last commit --- src/IDirect3D/IDirect3D2.c | 26 +++++++++++++++++--------- src/IDirectDraw/IDirectDrawSurface.c | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index 84169ae..d25c2f5 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -6,15 +6,23 @@ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", __FUNCTION__, This, (unsigned int)riid, obj); + TRACE( + "NOT_IMPLEMENTED -> %s(This=%p, riid=%08X, obj=%p) [%p]\n", + __FUNCTION__, + This, + (unsigned int)riid, + obj, + _ReturnAddress()); + HRESULT ret = E_FAIL; + TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; } ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = ++This->ref; TRACE("<- %s(This ref=%u)\n", __FUNCTION__, ret); return ret; @@ -22,7 +30,7 @@ ULONG __stdcall IDirect3D2__AddRef(IDirect3D2Impl* This) ULONG __stdcall IDirect3D2__Release(IDirect3D2Impl* This) { - TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("-> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); ULONG ret = --This->ref; @@ -39,7 +47,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); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -47,7 +55,7 @@ HRESULT __stdcall IDirect3D2__EnumDevices(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -55,7 +63,7 @@ HRESULT __stdcall IDirect3D2__CreateLight(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -63,7 +71,7 @@ HRESULT __stdcall IDirect3D2__CreateMaterial(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -71,7 +79,7 @@ HRESULT __stdcall IDirect3D2__CreateViewport(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -79,7 +87,7 @@ HRESULT __stdcall IDirect3D2__FindDevice(IDirect3D2Impl* This, int a, int b) HRESULT __stdcall IDirect3D2__CreateDevice(IDirect3D2Impl* This, int a, int b, int c) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 23c8e33..48dbca4 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -252,7 +252,7 @@ HRESULT __stdcall IDirectDrawSurface__EnumOverlayZOrders( LPVOID lpContext, LPDDENUMSURFACESCALLBACK7 lpfnCallback) { - TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This); + TRACE("NOT_IMPLEMENTED -> %s(This=%p) [%p]\n", __FUNCTION__, This, _ReturnAddress()); HRESULT ret = DD_OK; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; From 0ce1f4970c2b53c47c89bd71f2b715f652e37844 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 05:37:11 +0200 Subject: [PATCH 0418/1053] improve logging --- src/directinput.c | 17 ++++++++++------- src/winapi_hooks.c | 31 +++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index bf5e3d5..12382b2 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,5 +1,6 @@ #include #include +#include #include "directinput.h" #include "debug.h" #include "hook.h" @@ -7,6 +8,8 @@ #include "mouse.h" #include "config.h" +#pragma intrinsic(_ReturnAddress) + #ifdef _MSC_VER #include "detours.h" #endif @@ -53,7 +56,7 @@ 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)\n", This, hwnd, dwFlags); + TRACE("DirectInput SetCooperativeLevel(This=%p, hwnd=%p, dwFlags=0x%08X) [%p]\n", This, hwnd, dwFlags, _ReturnAddress()); if (This == g_mouse_device && g_ddraw.ref && (dwFlags & DISCL_EXCLUSIVE)) { @@ -118,7 +121,7 @@ static HRESULT WINAPI fake_di_CreateDevice( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDevice\n"); + TRACE("DirectInput CreateDevice [%p]\n", _ReturnAddress()); HRESULT result = real_di_CreateDevice(This, rguid, lplpDIDevice, pUnkOuter); @@ -158,7 +161,7 @@ static HRESULT WINAPI fake_di_CreateDeviceEx( LPDIRECTINPUTDEVICEA* lplpDIDevice, LPUNKNOWN pUnkOuter) { - TRACE("DirectInput CreateDeviceEx\n"); + TRACE("DirectInput CreateDeviceEx [%p]\n", _ReturnAddress()); HRESULT result = real_di_CreateDeviceEx(This, rguid, riid, lplpDIDevice, pUnkOuter); @@ -197,7 +200,7 @@ HRESULT WINAPI fake_DirectInputCreateA( LPDIRECTINPUTA* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateA\n"); + TRACE("DirectInputCreateA [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateA) { @@ -235,7 +238,7 @@ HRESULT WINAPI fake_DirectInputCreateW( LPDIRECTINPUTW* lplpDirectInput, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateW\n"); + TRACE("DirectInputCreateW [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateW) { @@ -274,7 +277,7 @@ HRESULT WINAPI fake_DirectInputCreateEx( LPDIRECTINPUT7A* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInputCreateEx\n"); + TRACE("DirectInputCreateEx [%p]\n", _ReturnAddress()); if (!real_DirectInputCreateEx) { @@ -325,7 +328,7 @@ HRESULT WINAPI fake_DirectInput8Create( LPDIRECTINPUT8* ppvOut, LPUNKNOWN punkOuter) { - TRACE("DirectInput8Create\n"); + TRACE("DirectInput8Create [%p]\n", _ReturnAddress()); if (!real_DirectInput8Create) { diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 26ebc7c..b3a4cce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -550,7 +550,13 @@ BOOL WINAPI fake_SetForegroundWindow(HWND hWnd) HHOOK WINAPI fake_SetWindowsHookExA(int idHook, HOOKPROC lpfn, HINSTANCE hmod, DWORD dwThreadId) { - TRACE("SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d)\n", idHook, lpfn, hmod, dwThreadId); + TRACE( + "SetWindowsHookExA(idHook=%d, lpfn=%p, hmod=%p, dwThreadId=%d) [%p]\n", + idHook, + lpfn, + hmod, + dwThreadId, + _ReturnAddress()); if (idHook == WH_KEYBOARD_LL && hmod && GetModuleHandle("AcGenral") == hmod) { @@ -1261,7 +1267,7 @@ HMODULE WINAPI fake_LoadLibraryA(LPCSTR lpLibFileName) char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + TRACE("LoadLibraryA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); } #endif @@ -1289,7 +1295,7 @@ HMODULE WINAPI fake_LoadLibraryW(LPCWSTR lpLibFileName) char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryW Module %s = %p\n", mod_path, hmod); + TRACE("LoadLibraryW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); } #endif @@ -1317,7 +1323,7 @@ HMODULE WINAPI fake_LoadLibraryExA(LPCSTR lpLibFileName, HANDLE hFile, DWORD dwF char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryExA Module %s = %p (%s)\n", mod_path, hmod, lpLibFileName); + TRACE("LoadLibraryExA Module %s = %p (%s) [%p]\n", mod_path, hmod, lpLibFileName, _ReturnAddress()); } #endif @@ -1345,7 +1351,7 @@ HMODULE WINAPI fake_LoadLibraryExW(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dw char mod_path[MAX_PATH] = { 0 }; if (hmod && hmod != hmod_old && GetModuleFileNameA(hmod, mod_path, MAX_PATH)) { - TRACE("LoadLibraryExW Module %s = %p\n", mod_path, hmod); + TRACE("LoadLibraryExW Module %s = %p [%p]\n", mod_path, hmod, _ReturnAddress()); } #endif @@ -1370,7 +1376,7 @@ FARPROC WINAPI fake_GetProcAddress(HMODULE hModule, LPCSTR lpProcName) char mod_path[MAX_PATH] = { 0 }; if (hModule && GetModuleFileNameA(hModule, mod_path, MAX_PATH)) { - TRACE("GetProcAddress %s (%s)\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path); + TRACE("GetProcAddress %s (%s) [%p]\n", HIWORD(lpProcName) ? lpProcName : NULL, mod_path, _ReturnAddress()); } #endif @@ -1448,7 +1454,7 @@ BOOL WINAPI fake_GetDiskFreeSpaceA( BOOL WINAPI fake_DestroyWindow(HWND hWnd) { - TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p\n", hWnd, g_ddraw.hwnd); + TRACE("DestroyWindow(hwnd=%p) - g_ddraw.hwnd=%p [%p]\n", hWnd, g_ddraw.hwnd, _ReturnAddress()); if (g_ddraw.ref && hWnd && hWnd == g_ddraw.hwnd) { @@ -1525,7 +1531,7 @@ HWND WINAPI fake_CreateWindowExA( { TRACE("-> CreateWindowExA(" "dwExStyle=%08X, lpClassName=%p, lpWindowName=%p, dwStyle=%08X, X=%d, Y=%d, nWidth=%d, " - "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p)\n", + "nHeight=%d, hWndParent=%p, hMenu=%p, hInstance=%p, lpParam=%p) [%p]\n", dwExStyle, lpClassName, lpWindowName, @@ -1537,7 +1543,8 @@ HWND WINAPI fake_CreateWindowExA( hWndParent, hMenu, hInstance, - lpParam); + lpParam, + _ReturnAddress()); TRACE(" WindowName=%s, ClassName=%s, g_ddraw.hwnd=%p\n", lpWindowName, HIWORD(lpClassName) ? lpClassName : "", g_ddraw.hwnd); @@ -1694,7 +1701,11 @@ HRESULT WINAPI fake_CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD { if (rclsid && riid) { - TRACE("CoCreateInstance rclsid = %08X, riid = %08X\n", ((GUID*)rclsid)->Data1, ((GUID*)riid)->Data1); + TRACE( + "CoCreateInstance rclsid = %08X, riid = %08X [%p]\n", + ((GUID*)rclsid)->Data1, + ((GUID*)riid)->Data1, + _ReturnAddress()); if (IsEqualGUID(&CLSID_DirectDraw, rclsid) || IsEqualGUID(&CLSID_DirectDraw7, rclsid)) { From f82987ceec6a84b0a7bbe6f6a1d23ae9e10454c8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 05:37:55 +0200 Subject: [PATCH 0419/1053] add header --- src/winapi_hooks.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b3a4cce..b1b3ab1 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" @@ -19,6 +20,7 @@ #include "hook.h" #include "directinput.h" +#pragma intrinsic(_ReturnAddress) BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 188a41ee740d05a0847525958cc63e48ac99e7bc Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 06:14:17 +0200 Subject: [PATCH 0420/1053] fix mingw build --- src/IDirect3D/IDirect3D.c | 7 +++++++ src/IDirect3D/IDirect3D2.c | 7 +++++++ src/IDirect3D/IDirect3D3.c | 7 +++++++ src/IDirect3D/IDirect3D7.c | 7 +++++++ src/IDirectDraw/IDirectDraw.c | 8 ++++++++ src/IDirectDraw/IDirectDrawClipper.c | 7 +++++++ src/IDirectDraw/IDirectDrawGammaControl.c | 7 +++++++ src/IDirectDraw/IDirectDrawPalette.c | 7 +++++++ src/IDirectDraw/IDirectDrawSurface.c | 7 +++++++ src/directinput.c | 7 +++++++ src/winapi_hooks.c | 7 +++++++ 11 files changed, 78 insertions(+) diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index d1e6cc9..7702407 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index d25c2f5..ed8c5dc 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 736572a..38d6d64 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 364b957..85eb13e 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -2,7 +2,14 @@ #include "IDirect3D.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 6c58b22..8295bbd 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -12,7 +12,15 @@ #include "hook.h" #include "config.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ + HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 9dba68f..7270fd2 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -3,7 +3,14 @@ #include "ddclipper.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index 71f10d9..d234ba3 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -2,7 +2,14 @@ #include "IDirectDrawGammaControl.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 6d221b6..89c8f2b 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -4,7 +4,14 @@ #include "ddsurface.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 48dbca4..8624667 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -6,7 +6,14 @@ #include "dd.h" #include "debug.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/directinput.c b/src/directinput.c index 12382b2..b542bc2 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -8,7 +8,14 @@ #include "mouse.h" #include "config.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ #ifdef _MSC_VER #include "detours.h" diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b1b3ab1..807e3cf 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -20,7 +20,14 @@ #include "hook.h" #include "directinput.h" +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else #pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 78265056605bf59410dc5856615f4b929fae5c1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 16 Jun 2024 06:19:41 +0200 Subject: [PATCH 0421/1053] fix logging --- src/directinput.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/directinput.c b/src/directinput.c index b542bc2..059e034 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -85,7 +85,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( LPDWORD pdwInOut, DWORD dwFlags) { - //TRACE("DirectInput GetDeviceData\n"); + //TRACE("DirectInput GetDeviceData [%p]\n", _ReturnAddress()); HRESULT result = real_did_GetDeviceData(This, cbObjectData, rgdod, pdwInOut, dwFlags); @@ -107,7 +107,7 @@ static HRESULT WINAPI fake_did_GetDeviceData( static HRESULT WINAPI fake_did_GetDeviceState(IDirectInputDeviceA* This, DWORD cbData, LPVOID lpvData) { - //TRACE("DirectInput GetDeviceState\n"); + //TRACE("DirectInput GetDeviceState [%p]\n", _ReturnAddress()); HRESULT result = real_did_GetDeviceState(This, cbData, lpvData); From 12715febe9d55d88cd85b5652e0de615e088f507 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 21 Jun 2024 23:00:40 +0200 Subject: [PATCH 0422/1053] set pixel format only for opengl renderer (prevents loading of open32.dll) --- src/dd.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/dd.c b/src/dd.c index c6dfc7e..fda72bd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1211,19 +1211,20 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) { g_ddraw.render.hdc = GetDC(g_ddraw.hwnd); - PIXELFORMATDESCRIPTOR pfd; - memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); - pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + if (g_ddraw.renderer == ogl_render_main) + { + PIXELFORMATDESCRIPTOR pfd; + memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); - pfd.nVersion = 1; - pfd.dwFlags = - PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | (g_ddraw.renderer == ogl_render_main ? PFD_SUPPORT_OPENGL : 0); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; + pfd.iLayerType = PFD_MAIN_PLANE; - pfd.iPixelType = PFD_TYPE_RGBA; - pfd.cColorBits = g_ddraw.mode.dmBitsPerPel; - pfd.iLayerType = PFD_MAIN_PLANE; - - SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); + SetPixelFormat(g_ddraw.render.hdc, ChoosePixelFormat(g_ddraw.render.hdc, &pfd), &pfd); + } } if (!g_config.devmode) From c86b6f01a237688305954c059e62dc42230f9bba Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 22 Jun 2024 01:19:25 +0200 Subject: [PATCH 0423/1053] move debug code defines into header --- inc/debug.h | 10 +++++++ src/IDirect3D/IDirect3D.c | 9 ------ src/IDirect3D/IDirect3D2.c | 9 ------ src/IDirect3D/IDirect3D3.c | 9 ------ src/IDirect3D/IDirect3D7.c | 9 ------ src/IDirectDraw/IDirectDraw.c | 10 ------- src/IDirectDraw/IDirectDrawClipper.c | 9 ------ src/IDirectDraw/IDirectDrawGammaControl.c | 9 ------ src/IDirectDraw/IDirectDrawPalette.c | 9 ------ src/IDirectDraw/IDirectDrawSurface.c | 9 ------ src/directinput.c | 10 ------- src/utils.c | 34 +++++++++++++++++++++++ src/winapi_hooks.c | 9 ------ 13 files changed, 44 insertions(+), 101 deletions(-) diff --git a/inc/debug.h b/inc/debug.h index f16a944..72efcf1 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -3,6 +3,7 @@ #define WIN32_LEAN_AND_MEAN #include +#include LONG WINAPI dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); @@ -31,6 +32,15 @@ extern double g_dbg_frame_time; extern DWORD g_dbg_frame_count; extern LPTOP_LEVEL_EXCEPTION_FILTER g_dbg_exception_filter; +#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ +#undef _ReturnAddress +#undef _AddressOfReturnAddress +#define _ReturnAddress() __builtin_return_address(0) +#define _AddressOfReturnAddress() __builtin_frame_address (0) +#else +#pragma intrinsic(_ReturnAddress) +#endif /* __GNUC__ */ + //#define _DEBUG 1 /* use OutputDebugStringA rather than printf */ diff --git a/src/IDirect3D/IDirect3D.c b/src/IDirect3D/IDirect3D.c index 7702407..0aaa1e8 100644 --- a/src/IDirect3D/IDirect3D.c +++ b/src/IDirect3D/IDirect3D.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D__QueryInterface(IDirect3DImpl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D2.c b/src/IDirect3D/IDirect3D2.c index ed8c5dc..50ae5ec 100644 --- a/src/IDirect3D/IDirect3D2.c +++ b/src/IDirect3D/IDirect3D2.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D2__QueryInterface(IDirect3D2Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D3.c b/src/IDirect3D/IDirect3D3.c index 38d6d64..9cc65bd 100644 --- a/src/IDirect3D/IDirect3D3.c +++ b/src/IDirect3D/IDirect3D3.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D3__QueryInterface(IDirect3D3Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirect3D/IDirect3D7.c b/src/IDirect3D/IDirect3D7.c index 85eb13e..5d64fc6 100644 --- a/src/IDirect3D/IDirect3D7.c +++ b/src/IDirect3D/IDirect3D7.c @@ -1,15 +1,6 @@ -#include #include "IDirect3D.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirect3D7__QueryInterface(IDirect3D7Impl* This, REFIID riid, void** obj) { diff --git a/src/IDirectDraw/IDirectDraw.c b/src/IDirectDraw/IDirectDraw.c index 8295bbd..ee6c653 100644 --- a/src/IDirectDraw/IDirectDraw.c +++ b/src/IDirectDraw/IDirectDraw.c @@ -1,6 +1,5 @@ #include #include -#include #include "IDirectDraw.h" #include "IDirect3D.h" #include "IAMMediaStream.h" @@ -12,15 +11,6 @@ #include "hook.h" #include "config.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ - HRESULT __stdcall IDirectDraw__QueryInterface(IDirectDrawImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawClipper.c b/src/IDirectDraw/IDirectDrawClipper.c index 7270fd2..86b8a2f 100644 --- a/src/IDirectDraw/IDirectDrawClipper.c +++ b/src/IDirectDraw/IDirectDrawClipper.c @@ -1,16 +1,7 @@ -#include #include "IDirectDrawClipper.h" #include "ddclipper.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawClipper__QueryInterface(IDirectDrawClipperImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawGammaControl.c b/src/IDirectDraw/IDirectDrawGammaControl.c index d234ba3..65f61fa 100644 --- a/src/IDirectDraw/IDirectDrawGammaControl.c +++ b/src/IDirectDraw/IDirectDrawGammaControl.c @@ -1,15 +1,6 @@ -#include #include "IDirectDrawGammaControl.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawGammaControl__QueryInterface(IDirectDrawGammaControlImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawPalette.c b/src/IDirectDraw/IDirectDrawPalette.c index 89c8f2b..a5429ea 100644 --- a/src/IDirectDraw/IDirectDrawPalette.c +++ b/src/IDirectDraw/IDirectDrawPalette.c @@ -1,17 +1,8 @@ -#include #include "IDirectDrawPalette.h" #include "ddpalette.h" #include "ddsurface.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawPalette__QueryInterface(IDirectDrawPaletteImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/IDirectDraw/IDirectDrawSurface.c b/src/IDirectDraw/IDirectDrawSurface.c index 8624667..8984571 100644 --- a/src/IDirectDraw/IDirectDrawSurface.c +++ b/src/IDirectDraw/IDirectDrawSurface.c @@ -1,4 +1,3 @@ -#include #include #include "IDirectDrawSurface.h" #include "IDirectDrawGammaControl.h" @@ -6,14 +5,6 @@ #include "dd.h" #include "debug.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ HRESULT __stdcall IDirectDrawSurface__QueryInterface(IDirectDrawSurfaceImpl* This, REFIID riid, LPVOID FAR* ppvObj) { diff --git a/src/directinput.c b/src/directinput.c index 059e034..4c29144 100644 --- a/src/directinput.c +++ b/src/directinput.c @@ -1,6 +1,5 @@ #include #include -#include #include "directinput.h" #include "debug.h" #include "hook.h" @@ -8,15 +7,6 @@ #include "mouse.h" #include "config.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ - #ifdef _MSC_VER #include "detours.h" #endif diff --git a/src/utils.c b/src/utils.c index 48218b2..be3c430 100644 --- a/src/utils.c +++ b/src/utils.c @@ -155,6 +155,40 @@ void util_limit_game_ticks() if (GetCurrentThreadId() != g_ddraw.gui_thread_id) return; + /* + static void (WINAPI * getSystemTimePreciseAsFileTime)(LPFILETIME); + + if (!getSystemTimePreciseAsFileTime) + { + getSystemTimePreciseAsFileTime = GetProcAddress(LoadLibraryA("Kernel32.dll"), "GetSystemTimePreciseAsFileTime"); + + //if (!getSystemTimePreciseAsFileTime) + // getSystemTimePreciseAsFileTime = GetSystemTimeAsFileTime; + } + + + if (1) + { + FILETIME ft = { 0 }; + getSystemTimePreciseAsFileTime(&ft); + + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) == -1) + { + memcpy(&g_ddraw.ticks_limiter.due_time, &ft, sizeof(LARGE_INTEGER)); + } + else + { + while (TRUE) + { + getSystemTimePreciseAsFileTime(&ft); + if (CompareFileTime((FILETIME*)&g_ddraw.ticks_limiter.due_time, &ft) <= 0) + break; + } + } + + g_ddraw.ticks_limiter.due_time.QuadPart += g_ddraw.ticks_limiter.tick_length_ns; + } + else */ if (g_ddraw.ticks_limiter.htimer) { FILETIME ft = { 0 }; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 807e3cf..b3a4cce 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -1,7 +1,6 @@ #include #include #include -#include #include "debug.h" #include "config.h" #include "dd.h" @@ -20,14 +19,6 @@ #include "hook.h" #include "directinput.h" -#if defined(__GNUC__) /* wrap msvc intrinsics onto gcc builtins */ -#undef _ReturnAddress -#undef _AddressOfReturnAddress -#define _ReturnAddress() __builtin_return_address(0) -#define _AddressOfReturnAddress() __builtin_frame_address (0) -#else -#pragma intrinsic(_ReturnAddress) -#endif /* __GNUC__ */ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) { From 824b366d5d3fb53eb62259e5423824ddbca24ff1 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 25 Jun 2024 02:30:32 +0200 Subject: [PATCH 0424/1053] update airline tycoon preset --- src/config.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 324f8be..b3b50e6 100644 --- a/src/config.c +++ b/src/config.c @@ -459,7 +459,8 @@ static void cfg_create_ini() "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" - "fixchilds=0\n" + "lock_mouse_top_left=false\n" + "fixchilds=3\n" "\n" "; Arthur's Wilderness Rescue\n" "[Arthur]\n" From c1b0b9b816211cebf8229218a7b9cfc1c2e66f9e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 25 Jun 2024 23:14:11 +0200 Subject: [PATCH 0425/1053] fix AT preset --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index b3b50e6..d429fd3 100644 --- a/src/config.c +++ b/src/config.c @@ -459,7 +459,7 @@ static void cfg_create_ini() "\n" "; Airline Tycoon Deluxe\n" "[AT]\n" - "lock_mouse_top_left=false\n" + "lock_mouse_top_left=true\n" "fixchilds=3\n" "\n" "; Arthur's Wilderness Rescue\n" From b651a026abb05da93ebe0a2d2590bdf9ea91da1b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jun 2024 20:54:41 +0200 Subject: [PATCH 0426/1053] update supported games in readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9bce324..6dd6d04 100644 --- a/README.md +++ b/README.md @@ -322,11 +322,13 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Stronghold Crusader HD - Stronghold HD - Sudden Strike 2 +- The Missing on Lost Island - The Powerpuff Girls - Princess Snorebucks - The Powerpuff Girls(TM) Mojo Jojo's Clone Zone - The X-Files DVD - Theme Hospital - Three Kingdoms: Fate of the Dragon +- Throne of Darkness - Total Annihilation - Total Annihilation (Unofficial Beta Patch v3.9.02) - Total Annihilation: Kingdoms From adff08b8b15a740bfed11480537895f10b327df2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 28 Jun 2024 20:58:05 +0200 Subject: [PATCH 0427/1053] add preset for The Missing on Lost Island --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index d429fd3..8b2d44a 100644 --- a/src/config.c +++ b/src/config.c @@ -1370,6 +1370,11 @@ static void cfg_create_ini() "game_handles_close=true\n" "max_resolutions=32\n" "\n" + "; The Missing on Lost Island\n" + "[Island]\n" + "lock_mouse_top_left=true\n" + "fixchilds=3\n" + "\n" "; The X-Files DVD\n" "[XFiles]\n" "windowed=true\n" From 2239c67a72c22a3e1c04e12d9255d1ab5992aba8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 01:12:20 +0200 Subject: [PATCH 0428/1053] add check for TMediaPlayer --- src/utils.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/utils.c b/src/utils.c index be3c430..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,6 +697,9 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } + + if (strcmp(class_name, "TMediaPlayer") == 0) + return TRUE; } #ifdef _DEBUG_X From cdd09496adcbd2452737f1399e23807906e73cdb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 21:42:37 +0200 Subject: [PATCH 0429/1053] fix discord invite link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6dd6d04..ee33179 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ Some games may require additional steps before they can be used with cnc-ddraw,   -Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/HUBx4ktzfs) (No registration required) +Need help and don't have a github account? Ask your questions on [Discord](https://discord.gg/afWXJNDDF5) (No registration required)   From ae08ecdf451e14be1da3c3b26a39a81f58d7ad30 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:29:38 +0200 Subject: [PATCH 0430/1053] testing webhook --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..400f80f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + // webhook test if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From b8ad4b27ddd7c269c38ddcf12b535e63f718e5de Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:31:02 +0200 Subject: [PATCH 0431/1053] test 2 --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 400f80f..19b74be 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // webhook test + // webhook test 2 if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 9bfb52fcb966d9cac477c8cd76df99eea9b7f960 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:31:53 +0200 Subject: [PATCH 0432/1053] revert changes --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 19b74be..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // webhook test 2 + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From fcc4269754daceabe2f3a7f6bb90107827a842c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:36:57 +0200 Subject: [PATCH 0433/1053] testing discord webhook <@1017990327593881620> --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..ea47ef9 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + // ping discordf user test if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From f1349f086cf77ba8d5e4630986c39c396585fc78 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:37:25 +0200 Subject: [PATCH 0434/1053] Revert "testing discord webhook <@1017990327593881620>" This reverts commit fcc4269754daceabe2f3a7f6bb90107827a842c7. --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index ea47ef9..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - // ping discordf user test + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From e373042dc9e262c320dcf29bcc4063532f814dbe Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:38:10 +0200 Subject: [PATCH 0435/1053] <@1017990327593881620> test --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f983cd0..f4d6f2e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - + //ff if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 31df9d244fca7f9f9d0fb61fa26ed09bad69c0ff Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 22:39:23 +0200 Subject: [PATCH 0436/1053] <@1017990327593881620> revert changes --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index f4d6f2e..f983cd0 100644 --- a/src/utils.c +++ b/src/utils.c @@ -697,7 +697,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) ReleaseDC(hwnd, dst_dc); } } - //ff + if (strcmp(class_name, "TMediaPlayer") == 0) return TRUE; } From 8ac58b663a67fac7d985b9bbfeba939a82bad190 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 29 Jun 2024 23:27:23 +0200 Subject: [PATCH 0437/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 3b43e44..0f1a3fe 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #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 9172074e6380f697e544779c8ed6680e860712b0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 30 Jun 2024 10:00:17 +0200 Subject: [PATCH 0438/1053] add preset for Final Liberation <@295717582948794378> --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index 8b2d44a..d9e2fc3 100644 --- a/src/config.c +++ b/src/config.c @@ -787,6 +787,10 @@ static void cfg_create_ini() "[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" From f54a3ec17185411458a52341fe7e2f0a3b434da9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 01:31:12 +0200 Subject: [PATCH 0439/1053] fix dds caps --- src/ddsurface.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ddsurface.c b/src/ddsurface.c index ba876c0..b6913ed 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1397,10 +1397,15 @@ HRESULT dd_CreateSurface( dst_surface->caps |= DDSCAPS_FRONTBUFFER; } + if (!(dst_surface->caps & DDSCAPS_SYSTEMMEMORY)) + { + dst_surface->caps |= DDSCAPS_VIDEOMEMORY; + } + + dst_surface->caps |= DDSCAPS_VISIBLE; + dst_surface->width = g_ddraw.width; dst_surface->height = g_ddraw.height; - - dst_surface->caps |= DDSCAPS_VIDEOMEMORY; } else { @@ -1575,11 +1580,21 @@ HRESULT dd_CreateSurface( desc.ddsCaps.dwCaps |= DDSCAPS_FLIP; } + if (dst_surface->caps & DDSCAPS_COMPLEX) + { + desc.ddsCaps.dwCaps |= DDSCAPS_COMPLEX; + } + if (dst_surface->caps & DDSCAPS_VIDEOMEMORY) { desc.ddsCaps.dwCaps |= DDSCAPS_VIDEOMEMORY; } + if (dst_surface->caps & DDSCAPS_SYSTEMMEMORY) + { + desc.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; + } + desc.dwWidth = dst_surface->width; desc.dwHeight = dst_surface->height; From dfd37760819ebb94414966364e5580cf5ce3b784 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 04:24:27 +0200 Subject: [PATCH 0440/1053] add hack for c1 lowres --- inc/config.h | 1 + src/config.c | 3 +++ src/ddsurface.c | 14 +++++++++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/inc/config.h b/inc/config.h index f0b8275..3a33eaf 100644 --- a/inc/config.h +++ b/inc/config.h @@ -104,6 +104,7 @@ typedef struct CNCDDRAWCONFIG BOOL mgs_hack; BOOL tlc_hack; BOOL homm_hack; + BOOL carma95_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index d9e2fc3..110ac17 100644 --- a/src/config.c +++ b/src/config.c @@ -114,6 +114,7 @@ void cfg_load() 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.homm_hack, "carma95_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -510,11 +511,13 @@ static void cfg_create_ini() "[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" diff --git a/src/ddsurface.c b/src/ddsurface.c index b6913ed..c392ef9 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -755,8 +755,16 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { - dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); - lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); + if (g_config.carma95_hack && g_ddraw.height == 200) + { + dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc); + lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This, (LPDDSURFACEDESC)&desc, lpContext); + } + else + { + dds_GetSurfaceDesc(This->backbuffer, (LPDDSURFACEDESC)&desc); + lpEnumSurfacesCallback((LPDIRECTDRAWSURFACE)This->backbuffer, (LPDDSURFACEDESC)&desc, lpContext); + } } return DD_OK; @@ -766,7 +774,7 @@ HRESULT dds_Flip(IDirectDrawSurfaceImpl* This, IDirectDrawSurfaceImpl* lpDDSurfa { dbg_dump_dds_flip_flags(dwFlags); - if (This->backbuffer && !This->skip_flip) + if (This->backbuffer && !This->skip_flip && !(g_config.carma95_hack && g_ddraw.height == 200)) { EnterCriticalSection(&g_ddraw.cs); IDirectDrawSurfaceImpl* backbuffer = lpDDSurfaceTargetOverride ? lpDDSurfaceTargetOverride : This->backbuffer; From c6fa7d389469257325f74aa30e1b9d7dbc485bf0 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 04:25:23 +0200 Subject: [PATCH 0441/1053] fix setting name --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 110ac17..1db05c4 100644 --- a/src/config.c +++ b/src/config.c @@ -114,7 +114,7 @@ void cfg_load() 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.homm_hack, "carma95_hack", FALSE); + GET_BOOL(g_config.carma95_hack, "carma95_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; From 8ef54bd5fa6229b840178042067381a9e7d5fd45 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 05:41:41 +0200 Subject: [PATCH 0442/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 0f1a3fe..de56bf0 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #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 4efb3cde520a0c1fd9ed0f2517169f4bedf2ee8e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 05:47:30 +0200 Subject: [PATCH 0443/1053] add comment for c1 hack --- src/ddsurface.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ddsurface.c b/src/ddsurface.c index c392ef9..2f6a873 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -755,6 +755,7 @@ HRESULT dds_EnumAttachedSurfaces( if (This->backbuffer) { + /* Hack for carmageddon 1 lowres mode */ if (g_config.carma95_hack && g_ddraw.height == 200) { dds_GetSurfaceDesc(This, (LPDDSURFACEDESC)&desc); From 237715f85b561f72dc8e4bdbf2607fba7c557a64 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 3 Jul 2024 08:04:31 +0200 Subject: [PATCH 0444/1053] don't hook mdraw (renamed ddraw.dll from GOG/stream) --- src/hook.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hook.c b/src/hook.c index 91d18db..c9641f4 100644 --- a/src/hook.c +++ b/src/hook.c @@ -541,6 +541,7 @@ void hook_create(HOOKLIST* hooks, BOOL initial_hook) _strcmpi(mod_filename, "libgallium_wgl") == 0 || _strcmpi(mod_filename, "libglapi") == 0 || _strcmpi(mod_filename, "d3d9") == 0 || + _strcmpi(mod_filename, "mdraw") == 0 || _strcmpi(mod_filename, "Shw32") == 0) continue; From dfca31fab99c6c50b22fa42340eb91fce4aa47c5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 04:38:16 +0200 Subject: [PATCH 0445/1053] bump version <@1017990327593881620> testing long commit message - testing long commit message - testing long commit message --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index de56bf0..2ff2136 100644 --- a/inc/version.h +++ b/inc/version.h @@ -7,7 +7,7 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 6 #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 79b8b4d0839a824f21533b4d10a925a6d6637b3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 07:52:17 +0200 Subject: [PATCH 0446/1053] add temporary registry keys --- cnc-ddraw.vcxproj | 2 ++ cnc-ddraw.vcxproj.filters | 6 ++++ inc/indeo.h | 7 +++++ src/dllmain.c | 3 ++ src/indeo.c | 61 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 inc/indeo.h create mode 100644 src/indeo.c diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index edfd7ab..c7d6352 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -49,6 +49,7 @@ + @@ -84,6 +85,7 @@ + diff --git a/cnc-ddraw.vcxproj.filters b/cnc-ddraw.vcxproj.filters index 34b47a6..7de9def 100644 --- a/cnc-ddraw.vcxproj.filters +++ b/cnc-ddraw.vcxproj.filters @@ -162,6 +162,9 @@ Source Files + + Source Files + @@ -281,6 +284,9 @@ Header Files + + Header Files + diff --git a/inc/indeo.h b/inc/indeo.h new file mode 100644 index 0000000..a83e007 --- /dev/null +++ b/inc/indeo.h @@ -0,0 +1,7 @@ +#ifndef INDEO_H +#define INDEO_H + +void indeo_enable(); +void indeo_disable(); + +#endif diff --git a/src/dllmain.c b/src/dllmain.c index c131c54..ff0874c 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -9,6 +9,7 @@ #include "debug.h" #include "config.h" #include "hook.h" +#include "indeo.h" #include "versionhelpers.h" @@ -120,6 +121,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) set_aware(); } + indeo_enable(); timeBeginPeriod(1); hook_init(); break; @@ -133,6 +135,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) cfg_save(); + indeo_disable(); timeEndPeriod(1); dinput_hook_exit(); hook_exit(); diff --git a/src/indeo.c b/src/indeo.c new file mode 100644 index 0000000..fbaa113 --- /dev/null +++ b/src/indeo.c @@ -0,0 +1,61 @@ +#include + + +void indeo_enable() +{ + HKEY hkey; + LONG status = + RegCreateKeyExA( + HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE | KEY_QUERY_VALUE, + NULL, + &hkey, + NULL); + + if (status == ERROR_SUCCESS) + { + LPCTSTR iv31 = "ir32_32.dll"; + RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, iv31, strlen(iv31) + 1); + + LPCTSTR iv32 = "ir32_32.dll"; + RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, iv32, strlen(iv32) + 1); + + LPCTSTR iv41 = "ir41_32.ax"; + RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, iv41, strlen(iv41) + 1); + + LPCTSTR iv50 = "ir50_32.dll"; + RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, iv50, strlen(iv50) + 1); + + RegCloseKey(hkey); + } +} + +void indeo_disable() +{ + HKEY hkey; + LONG status = + RegCreateKeyExA( + HKEY_CURRENT_USER, + "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", + 0, + NULL, + REG_OPTION_NON_VOLATILE, + KEY_WRITE | KEY_QUERY_VALUE, + NULL, + &hkey, + NULL); + + if (status == ERROR_SUCCESS) + { + RegDeleteValueA(hkey, "vidc.iv31"); + RegDeleteValueA(hkey, "vidc.iv32"); + RegDeleteValueA(hkey, "vidc.iv41"); + RegDeleteValueA(hkey, "vidc.iv50"); + + RegCloseKey(hkey); + } +} From 12af03ef6d3f67a0a43266a78357492f9a8c4588 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 07:58:59 +0200 Subject: [PATCH 0447/1053] fix warnings --- src/indeo.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/indeo.c b/src/indeo.c index fbaa113..65fa2ab 100644 --- a/src/indeo.c +++ b/src/indeo.c @@ -19,16 +19,16 @@ void indeo_enable() if (status == ERROR_SUCCESS) { LPCTSTR iv31 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, iv31, strlen(iv31) + 1); + RegSetValueExA(hkey, "vidc.iv31", 0, REG_SZ, (const BYTE*)iv31, strlen(iv31) + 1); LPCTSTR iv32 = "ir32_32.dll"; - RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, iv32, strlen(iv32) + 1); + RegSetValueExA(hkey, "vidc.iv32", 0, REG_SZ, (const BYTE*)iv32, strlen(iv32) + 1); LPCTSTR iv41 = "ir41_32.ax"; - RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, iv41, strlen(iv41) + 1); + RegSetValueExA(hkey, "vidc.iv41", 0, REG_SZ, (const BYTE*)iv41, strlen(iv41) + 1); LPCTSTR iv50 = "ir50_32.dll"; - RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, iv50, strlen(iv50) + 1); + RegSetValueExA(hkey, "vidc.iv50", 0, REG_SZ, (const BYTE*)iv50, strlen(iv50) + 1); RegCloseKey(hkey); } From 11e8df2f5a115a3534aba142620dbff9da35c14b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 4 Jul 2024 21:25:16 +0200 Subject: [PATCH 0448/1053] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee33179..5e18f0d 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,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 +- Gorasul: The Legacy of the Dragon - Hamtaro: Wake Up Snoozer! - Hard Truck: Road to Victory - Hearts of Iron 2 From a7042cb23425ee581ce7af1d41e77f18fd5e0431 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 8 Jul 2024 23:29:04 +0200 Subject: [PATCH 0449/1053] #332 add preset for AOE1 RockNRor patch --- src/config.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.c b/src/config.c index 1db05c4..a21b6ea 100644 --- a/src/config.c +++ b/src/config.c @@ -386,6 +386,12 @@ static void cfg_create_ini() "adjmouse=true\n" "resolutions=2\n" "\n" + "; Age of Empires: The Rise of Rome (RockNRor patch)\n" + "[EmpiresX_RockNRor]\n" + "nonexclusive=true\n" + "adjmouse=true\n" + "resolutions=2\n" + "\n" "; Age of Empires II\n" "[EMPIRES2]\n" "nonexclusive=true\n" From d93149d02e8bdb4e50b34ce3595beae37406cf3f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jul 2024 22:29:59 +0200 Subject: [PATCH 0450/1053] add hints to settings that require upscaling --- config/ConfigFormUnit.cpp | 105 ++++++++++++++++++++++++++++++++++++++ config/ConfigFormUnit.dfm | 12 +++++ 2 files changed, 117 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 3954825..a327efc 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -117,6 +117,8 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) void TConfigForm::ApplyTranslation(TIniFile *ini) { + Application->HintHidePause = 100 * 1000; + auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); int priID = SysLocale.PriLangID; @@ -178,6 +180,18 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30tick每秒", NULL); MaxgameticksCbx->AddItem(L"25tick每秒", NULL); MaxgameticksCbx->AddItem(L"15tick每秒", NULL); + + auto upscaleHint = + L"必须启用升级才能使此设置发挥作用。\n\n" + "要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" + "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) { LanguageImg->Visible = true; @@ -237,6 +251,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL); + + auto upscaleHint = + L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n" + "Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" + "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" + "y cambia el tamaño de la ventana."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) { LanguageImg->Visible = true; @@ -296,6 +323,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL); + + auto upscaleHint = + L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" + "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Präsentation \n" + "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" + "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; @@ -356,6 +396,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL); + + auto upscaleHint = + L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n" + "Чтобы включить масштабирование, установите для презентации режим \n" + "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" + "в 'Оконный' режиме и измените размер окна."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) { LanguageImg->Visible = true; @@ -415,6 +468,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL); + + auto upscaleHint = + L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n" + "A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" + "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" + "módban, és méretezze át az ablakot."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) { LanguageImg->Visible = true; @@ -474,6 +540,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); + + auto upscaleHint = + L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n" + "Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" + "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" + "et redimensionnez la fenêtre."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { LanguageImg->Visible = true; @@ -533,6 +612,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"30 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); + + auto upscaleHint = + L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n" + "Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" + "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" + "'In Finestra' e ridimensiona la finestra."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } else { IsEnglish = true; @@ -638,6 +730,19 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 ticks per second", NULL); MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ + + auto upscaleHint = + L"Upscaling must be enabled for this setting to work. \n\n" + "To enable upscaling, set your presentation to either 'Borderless', \n" + "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" + "resize the window."; + + MaintasLbl->Hint = upscaleHint; + MaintasChk->Hint = upscaleHint; + AdjmouseLbl->Hint = upscaleHint; + AdjmouseChk->Hint = upscaleHint; + BoxingLbl->Hint = upscaleHint; + BoxingChk->Hint = upscaleHint; } ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index 1805a5d..b1e29df 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -2727,6 +2727,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object VsyncLbl: TLabel Left = 40 @@ -2755,6 +2757,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object DevmodeLbl: TLabel Left = 40 @@ -2834,6 +2838,8 @@ object ConfigForm: TConfigForm Top = 132 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 0 OnClick = MaintasChkClick @@ -2852,6 +2858,8 @@ object ConfigForm: TConfigForm Top = 268 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 3 OnClick = AdjmouseChkClick @@ -3159,6 +3167,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object RendererPbox: TPaintBox Left = 40 @@ -3273,6 +3283,8 @@ object ConfigForm: TConfigForm Top = 277 Width = 50 Height = 20 + ParentShowHint = False + ShowHint = True ShowStateCaption = False TabOrder = 5 OnClick = BoxingChkClick From 560a7222e9c93ad00c33036b35698a904fb8f31a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 10 Jul 2024 23:05:13 +0200 Subject: [PATCH 0451/1053] fix german translation --- config/ConfigFormUnit.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index a327efc..f7b3579 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -326,7 +326,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) auto upscaleHint = L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" - "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Präsentation \n" + "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; From 4b4a6663badfeaa02640ad96decbbc51a03f26fa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:17:53 +0200 Subject: [PATCH 0452/1053] add upscaling hint for shaders --- config/ConfigFormUnit.cpp | 216 +++++++++++++++++++++++++------------- config/ConfigFormUnit.dfm | 6 ++ 2 files changed, 150 insertions(+), 72 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f7b3579..d5a3357 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -181,17 +181,26 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25tick每秒", NULL); MaxgameticksCbx->AddItem(L"15tick每秒", NULL); - auto upscaleHint = - L"必须启用升级才能使此设置发挥作用。\n\n" - "要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" + System::UnicodeString shaderHint = + L"某些着色器仅在启用升级时才起作用。\n\n"; + + System::UnicodeString upscaleHint = + L"必须启用升级才能使此设置发挥作用。\n\n"; + + System::UnicodeString enableUpscaleHint = + L"要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "spanish" || (lang == "auto" && priID == LANG_SPANISH)) { LanguageImg->Visible = true; @@ -252,18 +261,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tics por segundo", NULL); MaxgameticksCbx->AddItem(L"15 tics por segundo", NULL); - auto upscaleHint = - L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n" - "Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" + System::UnicodeString shaderHint = + L"Algunos de los sombreadores solo funcionan cuando la ampliación está habilitada. \n\n"; + + System::UnicodeString upscaleHint = + L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" "y cambia el tamaño de la ventana."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "german" || (lang == "auto" && priID == LANG_GERMAN)) { LanguageImg->Visible = true; @@ -324,18 +342,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 Ticks pro Sekunde", NULL); MaxgameticksCbx->AddItem(L"15 Ticks pro Sekunde", NULL); - auto upscaleHint = - L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n" - "Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" + System::UnicodeString shaderHint = + L"Einige der Shader funktionieren nur, wenn die Hochskalierung aktiviert ist. \n\n"; + + System::UnicodeString upscaleHint = + L"Damit diese Einstellung funktioniert, muss die Hochskalierung aktiviert sein. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "russian" || (lang == "auto" && priID == LANG_RUSSIAN)) { LanguageImg->Visible = true; @@ -397,18 +424,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 тиков в секунду", NULL); MaxgameticksCbx->AddItem(L"15 тиков в секунду", NULL); - auto upscaleHint = - L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n" - "Чтобы включить масштабирование, установите для презентации режим \n" + System::UnicodeString shaderHint = + L"Некоторые шейдеры работают только при включенном масштабировании. \n\n"; + + System::UnicodeString upscaleHint = + L"Чтобы этот параметр работал, необходимо включить масштабирование. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Чтобы включить масштабирование, установите для презентации режим \n" "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" "в 'Оконный' режиме и измените размер окна."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "hungarian" || (lang == "auto" && priID == LANG_HUNGARIAN)) { LanguageImg->Visible = true; @@ -469,18 +505,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tick másodpercenként", NULL); MaxgameticksCbx->AddItem(L"15 tick másodpercenként", NULL); - auto upscaleHint = - L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n" - "A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" + System::UnicodeString shaderHint = + L"Néhány árnyékoló csak akkor működik, ha a felskálázás engedélyezve van. \n\n"; + + System::UnicodeString upscaleHint = + L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" "módban, és méretezze át az ablakot."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "french" || (lang == "auto" && priID == LANG_FRENCH)) { LanguageImg->Visible = true; @@ -541,18 +586,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tics par seconde", NULL); MaxgameticksCbx->AddItem(L"15 tics par seconde", NULL); - auto upscaleHint = - L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n" - "Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" + System::UnicodeString shaderHint = + L"Certains shaders ne fonctionnent que lorsque la mise à l'échelle est activée. \n\n"; + + System::UnicodeString upscaleHint = + L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" "et redimensionnez la fenêtre."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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 if (lang == "italian" || (lang == "auto" && priID == LANG_ITALIAN)) { LanguageImg->Visible = true; @@ -613,18 +667,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"25 tick al secondo", NULL); MaxgameticksCbx->AddItem(L"15 tick al secondo", NULL); - auto upscaleHint = - L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n" - "Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" + System::UnicodeString shaderHint = + L"Alcuni shader funzionano solo quando l'upscaling è abilitato. \n\n"; + + System::UnicodeString upscaleHint = + L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" "'In Finestra' e ridimensiona la finestra."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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; @@ -731,18 +794,27 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15 ticks per second", NULL); */ - auto upscaleHint = - L"Upscaling must be enabled for this setting to work. \n\n" - "To enable upscaling, set your presentation to either 'Borderless', \n" + System::UnicodeString shaderHint = + L"Some of the shaders only work when upscaling is enabled. \n\n"; + + System::UnicodeString upscaleHint = + L"Upscaling must be enabled for this setting to work. \n\n"; + + System::UnicodeString enableUpscaleHint = + L"To enable upscaling, set your presentation to either 'Borderless', \n" "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" "resize the window."; - MaintasLbl->Hint = upscaleHint; - MaintasChk->Hint = upscaleHint; - AdjmouseLbl->Hint = upscaleHint; - AdjmouseChk->Hint = upscaleHint; - BoxingLbl->Hint = upscaleHint; - BoxingChk->Hint = upscaleHint; + 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; } ToggleWindowedKeyLbl->Caption = GetKeyText(VK_MENU) + L" +"; diff --git a/config/ConfigFormUnit.dfm b/config/ConfigFormUnit.dfm index b1e29df..6ed9761 100644 --- a/config/ConfigFormUnit.dfm +++ b/config/ConfigFormUnit.dfm @@ -3125,6 +3125,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True end object MaxfpsLbl: TLabel Left = 40 @@ -3200,6 +3202,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True TabOrder = 6 Visible = False OnChange = ShaderD3DCbxChange @@ -3266,6 +3270,8 @@ object ConfigForm: TConfigForm Font.Name = 'Segoe UI' Font.Style = [] ParentFont = False + ParentShowHint = False + ShowHint = True TabOrder = 3 OnChange = ShaderCbxChange end From b662011045bac278ade240be6b647f8e8edd6942 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:27:18 +0200 Subject: [PATCH 0453/1053] #288 disable shader combobox when gdi renderer is enabled --- config/ConfigFormUnit.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d5a3357..c4499e3 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -967,6 +967,9 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender) RendererCbx->ItemIndex = 0; } + ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); + ShaderCbx->Enabled = ShaderD3DCbx->Enabled; + try { TStringDynArray list = TDirectory::GetFiles( @@ -1553,6 +1556,9 @@ void __fastcall TConfigForm::DevmodeChkClick(TObject *Sender) void __fastcall TConfigForm::RendererCbxChange(TObject *Sender) { + ShaderD3DCbx->Enabled = !ContainsStr(RendererCbx->Text, "GDI"); + ShaderCbx->Enabled = ShaderD3DCbx->Enabled; + if (ContainsStr(RendererCbx->Text, "Direct3D")) { ShaderLbl->Caption = From 241e3749b2b66620c9fb6e13e33d8787663591e6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 00:48:40 +0200 Subject: [PATCH 0454/1053] show hints instantly --- config/ConfigFormUnit.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index c4499e3..f009fbf 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -118,6 +118,7 @@ void __fastcall TConfigForm::RestoreDefaultsBtnClick(TObject *Sender) void TConfigForm::ApplyTranslation(TIniFile *ini) { Application->HintHidePause = 100 * 1000; + Application->HintPause = 0; auto lang = LowerCase(ini->ReadString("ddraw", "configlang", "auto")); int priID = SysLocale.PriLangID; From 3204574eb572e3ebd355855c58132a4719413122 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 01:35:17 +0200 Subject: [PATCH 0455/1053] bump version --- inc/version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inc/version.h b/inc/version.h index 2ff2136..088c32b 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 6 +#define VERSION_MINOR 7 #define VERSION_BUILD 0 -#define VERSION_REVISION 5 +#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 6ba50718a796fcbbfa6b0aa559f98b1a9d25734a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 01:50:13 +0200 Subject: [PATCH 0456/1053] add preset for robin hood steam --- src/config.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/config.c b/src/config.c index a21b6ea..cc0926b 100644 --- a/src/config.c +++ b/src/config.c @@ -1261,6 +1261,10 @@ static void cfg_create_ini() "checkfile=.\\Robin Hood.exe\n" "singlecpu=false\n" "\n" + "; Robin Hood - The Legend of Sherwood (Steam)\n" + "[_rh]\n" + "singlecpu=false\n" + "\n" "; Robin Hood - The Legend of Sherwood\n" "[Robin Hood]\n" "singlecpu=false\n" From 5609e02f3a78122cb428b245a0541ad059df357e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 07:52:34 +0200 Subject: [PATCH 0457/1053] adjust tooltips --- config/ConfigFormUnit.cpp | 46 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index f009fbf..d0e6992 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -189,8 +189,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"必须启用升级才能使此设置发挥作用。\n\n"; System::UnicodeString enableUpscaleHint = - L"要启用放大功能,请将演示文稿设置为'拉伸至全屏'、\n" - "'无边框'或以'窗口化'模式启动游戏并调整窗口大小。"; + L"要启用放大功能,请将演示文稿设置为“无边框”或“拉伸至全屏”。\n" + "为了使设置在“窗口化”演示中起作用,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -269,9 +269,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"La ampliación debe estar habilitada para que esta configuración funcione. \n\n"; System::UnicodeString enableUpscaleHint = - L"Para habilitar la mejora, configura tu presentación en 'Sin bordes', \n" - "'Pantalla completa ampliada' o inicia el juego en modo 'Ventana' \n" - "y cambia el tamaño de la ventana."; + L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n" + "o 'Pantalla completa ampliada'. Para que la configuración funcione en \n" + "la presentación 'Ventana', debe cambiar el tamaño o maximizar la ventana."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -351,8 +351,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" - "entweder auf 'Ränderfreies Fenster', 'Hochskaliertes Vollbild' ein \n" - "oder starten Sie das Spiel im 'Fenstermodus' und ändern Sie die Fenstergröße."; + "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" + "Damit die Einstellung in der 'Fenstermodus' Darstellung funktioniert, \n" + "müssen Sie die Größe des Fensters ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -433,8 +434,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Чтобы включить масштабирование, установите для презентации режим \n" - "'Без границ', 'Полноэкранный масштабированный' или запустите игру \n" - "в 'Оконный' режиме и измените размер окна."; + "'Без границ' или 'Полноэкранный масштабированный'. Чтобы эта настройка \n" + "работала в 'оконной' презентации, необходимо изменить размер или развернуть окно."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -513,9 +514,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"A beállítás működéséhez engedélyezni kell a felskálázást. \n\n"; System::UnicodeString enableUpscaleHint = - L"A felskálázás engedélyezéséhez állítsa be a prezentációt 'Keret nélkül', \n" - "'Teljes képernyő felskálázva' értékre, vagy indítsa el a játékot 'Ablakban' \n" - "módban, és méretezze át az ablakot."; + L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n" + "vagy 'Teljes képernyő felskálázva' értékre. Ahhoz, hogy a beállítás \n" + "működjön az 'Ablakban' prezentációban, át kell méretezni vagy \n" + "maximalizálni kell az ablakot."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -594,9 +596,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"La mise à l'échelle doit être activée pour que ce paramètre fonctionne. \n\n"; System::UnicodeString enableUpscaleHint = - L"Pour activer la mise à l'échelle, définissez votre présentation sur 'Sans Bordure', \n" - "'Plein Écran Mis à l'Échelle' ou démarrez le jeu en mode 'Fenêtré' \n" - "et redimensionnez la fenêtre."; + L"Pour activer la mise à l'échelle, définissez votre présentation \n" + "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour que le \n" + "paramètre fonctionne dans la présentation 'Fenêtré', vous devez \n" + "redimensionner ou agrandir la fenêtre."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -675,9 +678,10 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Affinché questa impostazione funzioni, è necessario abilitare l'upscaling. \n\n"; System::UnicodeString enableUpscaleHint = - L"Per abilitare l'upscaling, imposta la presentazione su 'Senza Bordi', \n" - "'Schermo Intero Ridimensionato' oppure avvia il gioco in modalità \n" - "'In Finestra' e ridimensiona la finestra."; + L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" + "o 'Schermo Intero Ridimensionato'. Affinché l'impostazione funzioni \n" + "nella presentazione 'In Finestra', è necessario ridimensionare \n" + "o ingrandire la finestra."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -802,9 +806,9 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) L"Upscaling must be enabled for this setting to work. \n\n"; System::UnicodeString enableUpscaleHint = - L"To enable upscaling, set your presentation to either 'Borderless', \n" - "'Fullscreen Upscaled' or start the game in 'Windowed' mode and \n" - "resize the window."; + L"To enable upscaling, set your presentation to either 'Borderless' \n" + "or 'Fullscreen Upscaled'. For the setting to work in the 'Windowed' \n" + "presentation, you must resize or maximize the window."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 12e18985edecb4d84860bb4004eb0fd94b098b61 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 08:05:00 +0200 Subject: [PATCH 0458/1053] adjust tooltips --- config/ConfigFormUnit.cpp | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index d0e6992..1abb86e 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -190,7 +190,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"要启用放大功能,请将演示文稿设置为“无边框”或“拉伸至全屏”。\n" - "为了使设置在“窗口化”演示中起作用,您必须调整窗口大小或最大化窗口。"; + "对于'窗口化'演示,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -270,8 +270,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Para habilitar la mejora, configure su presentación en 'Sin bordes' \n" - "o 'Pantalla completa ampliada'. Para que la configuración funcione en \n" - "la presentación 'Ventana', debe cambiar el tamaño o maximizar la ventana."; + "o 'Pantalla completa ampliada'. Para la presentación 'Ventana', \n" + "debe cambiar el tamaño o maximizar la ventana."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -352,8 +352,7 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" - "Damit die Einstellung in der 'Fenstermodus' Darstellung funktioniert, \n" - "müssen Sie die Größe des Fensters ändern oder es maximieren."; + "Für die 'Fenster'-Darstellung müssen Sie die Größe des Fensters ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -434,8 +433,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Чтобы включить масштабирование, установите для презентации режим \n" - "'Без границ' или 'Полноэкранный масштабированный'. Чтобы эта настройка \n" - "работала в 'оконной' презентации, необходимо изменить размер или развернуть окно."; + "'Без границ' или 'Полноэкранный масштабированный'. Для презентации в \n" + "'Оконный' режиме необходимо изменить размер или развернуть окно."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -515,9 +514,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"A felskálázás engedélyezéséhez állítsa a prezentációt 'Keret nélkül' \n" - "vagy 'Teljes képernyő felskálázva' értékre. Ahhoz, hogy a beállítás \n" - "működjön az 'Ablakban' prezentációban, át kell méretezni vagy \n" - "maximalizálni kell az ablakot."; + "vagy 'Teljes képernyő felskálázva' értékre. Az 'Ablakban' bemutatóhoz \n" + "át kell méretezni vagy maximalizálni kell az ablakot."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -597,9 +595,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Pour activer la mise à l'échelle, définissez votre présentation \n" - "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour que le \n" - "paramètre fonctionne dans la présentation 'Fenêtré', vous devez \n" - "redimensionner ou agrandir la fenêtre."; + "sur 'Sans Bordure' ou 'Plein Écran Mis à l'Échelle'. Pour la \n" + "présentation 'Fenêtré', vous devez redimensionner ou agrandir la fenêtre."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -679,9 +676,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Per abilitare l'ingrandimento, imposta la presentazione su 'Senza Bordi' \n" - "o 'Schermo Intero Ridimensionato'. Affinché l'impostazione funzioni \n" - "nella presentazione 'In Finestra', è necessario ridimensionare \n" - "o ingrandire la finestra."; + "o 'Schermo Intero Ridimensionato'. Per la presentazione 'In Finestra', \n" + "è necessario ridimensionare o ingrandire la finestra."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; @@ -807,8 +803,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"To enable upscaling, set your presentation to either 'Borderless' \n" - "or 'Fullscreen Upscaled'. For the setting to work in the 'Windowed' \n" - "presentation, you must resize or maximize the window."; + "or 'Fullscreen Upscaled'. For the 'Windowed' presentation, \n" + "you must resize or maximize the window."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 4e7dfa7205235fe6420bab93bf9cea3a2958964c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 11 Jul 2024 08:07:13 +0200 Subject: [PATCH 0459/1053] fix german tooltip --- config/ConfigFormUnit.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 1abb86e..5f03c4b 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -352,7 +352,8 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) System::UnicodeString enableUpscaleHint = L"Um die Hochskalierung zu aktivieren, stellen Sie Ihre Darstellung \n" "entweder auf 'Ränderfreies Fenster' oder 'Hochskaliertes Vollbild' ein. \n" - "Für die 'Fenster'-Darstellung müssen Sie die Größe des Fensters ändern oder es maximieren."; + "Für die 'Fenstermodus'-Darstellung müssen Sie die Größe des Fensters \n" + "ändern oder es maximieren."; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From f30ab79f6bebdac4051b480cd25df0df97db1ca1 Mon Sep 17 00:00:00 2001 From: universal963 <36097923+universal963@users.noreply.github.com> Date: Fri, 12 Jul 2024 14:24:53 +0800 Subject: [PATCH 0460/1053] Update Chinese translation of hints --- config/ConfigFormUnit.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/ConfigFormUnit.cpp b/config/ConfigFormUnit.cpp index 5f03c4b..9da37ad 100644 --- a/config/ConfigFormUnit.cpp +++ b/config/ConfigFormUnit.cpp @@ -183,14 +183,14 @@ void TConfigForm::ApplyTranslation(TIniFile *ini) MaxgameticksCbx->AddItem(L"15tick每秒", 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" + "对于‘窗口化’显示方式,您必须调整窗口大小或最大化窗口。"; ShaderLbl->Hint = shaderHint + enableUpscaleHint; ShaderD3DCbx->Hint = shaderHint + enableUpscaleHint; From 487e78a7088cb5f50ca249e8b1bc0833e7f0992d Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 12 Jul 2024 23:09:33 +0200 Subject: [PATCH 0461/1053] fix upscaling in AOE2 --- inc/version.h | 2 +- src/utils.c | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/inc/version.h b/inc/version.h index 088c32b..62c616d 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 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) diff --git a/src/utils.c b/src/utils.c index f983cd0..a1e8bf7 100644 --- a/src/utils.c +++ b/src/utils.c @@ -624,31 +624,24 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) RECT size; RECT pos; - if (real_GetClientRect(hwnd, &size) && - real_GetWindowRect(hwnd, &pos) && - size.right > 1 && - size.bottom > 1) + if (real_GetClientRect(hwnd, &size) && real_GetWindowRect(hwnd, &pos)) { char class_name[MAX_PATH] = { 0 }; GetClassNameA(hwnd, class_name, sizeof(class_name) - 1); - LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); LONG exstyle = real_GetWindowLongA(hwnd, GWL_EXSTYLE); - -#ifdef _DEBUG_X HWND parent = GetParent(hwnd); - TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p\n", - class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent); +#ifdef _DEBUG_X + LONG style = real_GetWindowLongA(hwnd, GWL_STYLE); + + TRACE("util_enum_child_proc class=%s, hwnd=%p, width=%u, height=%u, left=%d, top=%d, parent=%p, style=%08X\n", + class_name, hwnd, size.right, size.bottom, pos.left, pos.top, parent, style); dbg_dump_wnd_styles(style, exstyle); - - if (parent != g_ddraw.hwnd) - return TRUE; #endif - /* Atrox */ - if (style == 0x500100C4 && strcmp(class_name, "Edit") == 0) + if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || strcmp(class_name, "Edit") == 0) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || From 6c53f51d7b2d4e8ba109f1b2c484fc3e545e1ca2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 03:58:36 +0200 Subject: [PATCH 0462/1053] detect other DirectDraw wrappers and error out --- inc/utils.h | 1 + src/dllmain.c | 85 ++++++++++++++++++++++++++++++++++++++++++--------- src/utils.c | 61 ++++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+), 15 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 2263142..40eec1d 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,6 +6,7 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); +BOOL util_caller_is_ddraw_wrapper(void* returnAddress); BOOL util_is_bad_read_ptr(void* p); BOOL util_is_minimized(HWND hwnd); BOOL util_in_foreground(); diff --git a/src/dllmain.c b/src/dllmain.c index ff0874c..a2804d0 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -10,6 +10,7 @@ #include "config.h" #include "hook.h" #include "indeo.h" +#include "utils.h" #include "versionhelpers.h" @@ -158,31 +159,74 @@ FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnknown FAR* pUnkOuter) { - TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p)\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter); - HRESULT ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); + TRACE("-> %s(lpGUID=%p, lplpDD=%p, pUnkOuter=%p) [%p]\n", __FUNCTION__, lpGUID, lplpDD, pUnkOuter, _ReturnAddress()); + + HRESULT ret; + + if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + { + if (lplpDD) + *lplpDD = NULL; + + ret = DDERR_GENERIC; + } + else + { + ret = dd_CreateEx(lpGUID, (LPVOID*)lplpDD, &IID_IDirectDraw, pUnkOuter); + } + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateClipper(DWORD dwFlags, LPDIRECTDRAWCLIPPER FAR* lplpDDClipper, IUnknown FAR* pUnkOuter) { - TRACE("-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p)\n", __FUNCTION__, (int)dwFlags, lplpDDClipper, pUnkOuter); + TRACE( + "-> %s(dwFlags=%08X, DDClipper=%p, unkOuter=%p) [%p]\n", + __FUNCTION__, + (int)dwFlags, + lplpDDClipper, + pUnkOuter, + _ReturnAddress()); + HRESULT ret = dd_CreateClipper(dwFlags, (IDirectDrawClipperImpl**)lplpDDClipper, pUnkOuter); + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawCreateEx(GUID* lpGuid, LPVOID* lplpDD, REFIID iid, IUnknown* pUnkOuter) { - TRACE("-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p)\n", __FUNCTION__, lpGuid, lplpDD, iid, pUnkOuter); - HRESULT ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); + TRACE( + "-> %s(lpGUID=%p, lplpDD=%p, riid=%08X, pUnkOuter=%p) [%p]\n", + __FUNCTION__, + lpGuid, + lplpDD, + iid, + pUnkOuter, + _ReturnAddress()); + + HRESULT ret; + + if (util_caller_is_ddraw_wrapper(_ReturnAddress())) + { + if (lplpDD) + *lplpDD = NULL; + + ret = DDERR_GENERIC; + } + else + { + ret = dd_CreateEx(lpGuid, lplpDD, &IID_IDirectDraw7, pUnkOuter); + } + TRACE("<- %s\n", __FUNCTION__); return ret; } HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); + TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext); @@ -193,7 +237,13 @@ HRESULT WINAPI DirectDrawEnumerateA(LPDDENUMCALLBACK lpCallback, LPVOID lpContex HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); + TRACE( + "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", + __FUNCTION__, + lpCallback, + lpContext, + dwFlags, + _ReturnAddress()); if (lpCallback) lpCallback(NULL, "Primary Display Driver", "display", lpContext, NULL); @@ -204,7 +254,12 @@ HRESULT WINAPI DirectDrawEnumerateExA(LPDDENUMCALLBACKEXA lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpContext, DWORD dwFlags) { - TRACE("-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d)\n", __FUNCTION__, lpCallback, lpContext, dwFlags); + TRACE( + "-> %s(lpCallback=%p, lpContext=%p, dwFlags=%d) [%p]\n", __FUNCTION__, + lpCallback, + lpContext, + dwFlags, + _ReturnAddress()); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext, NULL); @@ -215,7 +270,7 @@ HRESULT WINAPI DirectDrawEnumerateExW(LPDDENUMCALLBACKEXW lpCallback, LPVOID lpC HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpContext) { - TRACE("-> %s(lpCallback=%p, lpContext=%p)\n", __FUNCTION__, lpCallback, lpContext); + TRACE("-> %s(lpCallback=%p, lpContext=%p) [%p]\n", __FUNCTION__, lpCallback, lpContext, _ReturnAddress()); if (lpCallback) lpCallback(NULL, L"Primary Display Driver", L"display", lpContext); @@ -226,7 +281,7 @@ HRESULT WINAPI DirectDrawEnumerateW(LPDDENUMCALLBACKW lpCallback, LPVOID lpConte DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -234,7 +289,7 @@ DWORD WINAPI CompleteCreateSysmemSurface(DWORD a) HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) { - TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p)\n", __FUNCTION__, lpCmd, lpRetCmd); + TRACE("NOT_IMPLEMENTED -> %s(lpCmd=%p, lpRetCmd=%p) [%p]\n", __FUNCTION__, lpCmd, lpRetCmd, _ReturnAddress()); HRESULT ret = E_FAIL; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -242,7 +297,7 @@ HRESULT WINAPI D3DParseUnknownCommand(LPVOID lpCmd, LPVOID* lpRetCmd) DWORD WINAPI AcquireDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -250,7 +305,7 @@ DWORD WINAPI AcquireDDThreadLock() DWORD WINAPI ReleaseDDThreadLock() { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -258,7 +313,7 @@ DWORD WINAPI ReleaseDDThreadLock() DWORD WINAPI DDInternalLock(DWORD a, DWORD b) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; @@ -266,7 +321,7 @@ DWORD WINAPI DDInternalLock(DWORD a, DWORD b) DWORD WINAPI DDInternalUnlock(DWORD a) { - TRACE("NOT_IMPLEMENTED -> %s()\n", __FUNCTION__); + TRACE("NOT_IMPLEMENTED -> %s() [%p]\n", __FUNCTION__, _ReturnAddress()); DWORD ret = 0; TRACE("NOT_IMPLEMENTED <- %s\n", __FUNCTION__); return ret; diff --git a/src/utils.c b/src/utils.c index a1e8bf7..3ff958f 100644 --- a/src/utils.c +++ b/src/utils.c @@ -69,6 +69,67 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } +BOOL util_caller_is_ddraw_wrapper(void* returnAddress) +{ + HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); + HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); + HMODULE age_dll = GetModuleHandleA("age.dll"); + + HMODULE mod = NULL; + DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + + if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable wndmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable windmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable DxWnd and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + + return FALSE; +} + BOOL util_is_bad_read_ptr(void* p) { MEMORY_BASIC_INFORMATION mbi = { 0 }; From 4974b6c9bdbbc02d921617ee72f21ec3764e0156 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 04:02:15 +0200 Subject: [PATCH 0463/1053] reorganize --- src/utils.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/utils.c b/src/utils.c index 3ff958f..75c4419 100644 --- a/src/utils.c +++ b/src/utils.c @@ -71,14 +71,10 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) BOOL util_caller_is_ddraw_wrapper(void* returnAddress) { - HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); - HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); - HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); - HMODULE age_dll = GetModuleHandleA("age.dll"); - HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) { MessageBoxA( @@ -91,6 +87,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) { MessageBoxA( @@ -103,6 +100,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) { MessageBoxA( @@ -115,6 +113,7 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) return TRUE; } + HMODULE age_dll = GetModuleHandleA("age.dll"); if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) { MessageBoxA( From 8c3149982b8099424fc993a8a793966c2f81df1c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 04:12:24 +0200 Subject: [PATCH 0464/1053] use shorter line for error message --- src/utils.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index 75c4419..ad207f5 100644 --- a/src/utils.c +++ b/src/utils.c @@ -119,7 +119,8 @@ BOOL util_caller_is_ddraw_wrapper(void* returnAddress) MessageBoxA( NULL, "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Please disable the other wrapper by clicking in the game room on the very top \n" + "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", "Conflicting DirectDraw wrapper detected - cnc-ddraw", MB_OK | MB_TOPMOST); From cecfd5c61139f0e653a905f6abbc778e27518fae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 20:52:10 +0200 Subject: [PATCH 0465/1053] fix build config names --- cnc-ddraw.sln | 8 ++++---- cnc-ddraw.vcxproj | 24 ++++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/cnc-ddraw.sln b/cnc-ddraw.sln index c579c3b..eca7295 100644 --- a/cnc-ddraw.sln +++ b/cnc-ddraw.sln @@ -16,10 +16,10 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.ActiveCfg = Debug|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Debug|x86.Build.0 = Debug|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMini|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLog|Win32 - {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLog|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.ActiveCfg = DebugLogMiniXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogMiniXP|x86.Build.0 = DebugLogMiniXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.ActiveCfg = DebugLogXP|Win32 + {96094551-5D52-4EBD-BE4C-5291A03507FC}.DebugLogXP|x86.Build.0 = DebugLogXP|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.ActiveCfg = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.Release|x86.Build.0 = Release|Win32 {96094551-5D52-4EBD-BE4C-5291A03507FC}.ReleaseXP|x86.ActiveCfg = ReleaseXP|Win32 diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index c7d6352..fda7e42 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -1,12 +1,12 @@  - - DebugLogMini + + DebugLogMiniXP Win32 - - DebugLog + + DebugLogXP Win32 @@ -144,14 +144,14 @@ true MultiByte - + DynamicLibrary false v141_xp true MultiByte - + DynamicLibrary false v141_xp @@ -171,10 +171,10 @@ - + - + @@ -196,13 +196,13 @@ false ddraw - + $(SolutionDir)bin\DebugLogXP\ $(SolutionDir)bin\DebugLogXP\ false ddraw - + $(SolutionDir)bin\DebugLogMiniXP\ $(SolutionDir)bin\DebugLogMiniXP\ false @@ -285,7 +285,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - + Level2 @@ -312,7 +312,7 @@ if NOT "$(LocalDebuggerWorkingDirectory)" == "$(ProjectDir)" if exist "$(LocalDe - + Level2 From 9ac5eda9bea23f524492b8b31ed0b0e10c47e032 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 22:47:40 +0200 Subject: [PATCH 0466/1053] improve ddraw wrapper detection --- inc/utils.h | 3 +- src/utils.c | 170 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 138 insertions(+), 35 deletions(-) diff --git a/inc/utils.h b/inc/utils.h index 40eec1d..beb1c57 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -6,7 +6,8 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast); -BOOL util_caller_is_ddraw_wrapper(void* returnAddress); +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); BOOL util_is_minimized(HWND hwnd); BOOL util_in_foreground(); diff --git a/src/utils.c b/src/utils.c index ad207f5..df961e1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -69,62 +69,164 @@ HMODULE WINAPI util_enumerate_modules(_In_opt_ HMODULE hModuleLast) return NULL; } -BOOL util_caller_is_ddraw_wrapper(void* returnAddress) +FARPROC util_get_iat_proc(HMODULE mod, char* module_name, char* function_name) { + if (!mod || mod == INVALID_HANDLE_VALUE) + return NULL; + + __try + { + PIMAGE_DOS_HEADER dos_header = (PIMAGE_DOS_HEADER)mod; + 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); + 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) + return NULL; + + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + + while (import_desc->FirstThunk) + { + if (!import_desc->OriginalFirstThunk || !import_desc->Name) + { + import_desc++; + continue; + } + + char* imp_module_name = (char*)((DWORD)dos_header + 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); + + while (first_thunk->u1.Function) + { + if (!o_first_thunk->u1.AddressOfData) + { + first_thunk++; + o_first_thunk++; + continue; + } + + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + + if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + { +#if defined(__GNUC__) + if (util_is_bad_read_ptr((void*)import->Name)) + continue; +#endif + + if (strcmp((const char*)import->Name, function_name) == 0 && first_thunk->u1.Function) + { + return (FARPROC)first_thunk->u1.Function; + } + } + + first_thunk++; + o_first_thunk++; + } + } + + import_desc++; + } + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + } + + return NULL; +} + +BOOL util_caller_is_ddraw_wrapper(void* return_address) +{ + void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); + void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); + + TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx); + HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); - if (wndmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == wndmode_dll) + if (wndmode_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable wndmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable wndmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE windmode_dll = GetModuleHandleA("windmode.dll"); - if (windmode_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == windmode_dll) + if (windmode_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please remove/disable windmode.dll and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please remove/disable windmode.dll and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE dxwnd_dll = GetModuleHandleA("dxwnd.dll"); - if (dxwnd_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == dxwnd_dll) + if (dxwnd_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable DxWnd and then try to start the game again.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable DxWnd and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } HMODULE age_dll = GetModuleHandleA("age.dll"); - if (age_dll && GetModuleHandleExA(flags, returnAddress, &mod) && mod == age_dll) + if (age_dll) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top \n" - "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + if ((GetModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (GetModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (GetModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top \n" + "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); - return TRUE; + return TRUE; + } } return FALSE; From 0fabacc58c12a89068556ecfe5782cfa5554c3d6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 13 Jul 2024 23:48:48 +0200 Subject: [PATCH 0467/1053] keep it windows 2000 compatible for now --- src/utils.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/utils.c b/src/utils.c index df961e1..ceb4368 100644 --- a/src/utils.c +++ b/src/utils.c @@ -148,6 +148,12 @@ 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*) = + real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA");; + + if (!getModuleHandleExA) + return FALSE; + void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); @@ -159,9 +165,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 ((getModuleHandleExA(flags, return_address, &mod) && mod == wndmode_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == wndmode_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == wndmode_dll)) { MessageBoxA( NULL, @@ -177,9 +183,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 ((getModuleHandleExA(flags, return_address, &mod) && mod == windmode_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == windmode_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == windmode_dll)) { MessageBoxA( NULL, @@ -195,9 +201,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 ((getModuleHandleExA(flags, return_address, &mod) && mod == dxwnd_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == dxwnd_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == dxwnd_dll)) { MessageBoxA( NULL, @@ -213,9 +219,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 ((getModuleHandleExA(flags, return_address, &mod) && mod == age_dll) || + (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || + (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { MessageBoxA( NULL, From 86eb6020d7d06de85e51757baf534a1255eefffa Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 00:09:03 +0200 Subject: [PATCH 0468/1053] fix warnings --- src/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils.c b/src/utils.c index ceb4368..bae65bc 100644 --- a/src/utils.c +++ b/src/utils.c @@ -149,7 +149,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*) = - real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA");; + (void*)real_GetProcAddress(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA"); if (!getModuleHandleExA) return FALSE; From cd3bef1ceac543d93a5838e982ddb2195dcb6ee9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 01:11:55 +0200 Subject: [PATCH 0469/1053] use LoadLibrary --- src/utils.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils.c b/src/utils.c index bae65bc..fe1db06 100644 --- a/src/utils.c +++ b/src/utils.c @@ -149,13 +149,13 @@ 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(GetModuleHandleA("Kernel32.dll"), "GetModuleHandleExA"); + (void*)real_GetProcAddress(real_LoadLibraryA("Kernel32.dll"), "GetModuleHandleExA"); if (!getModuleHandleExA) return FALSE; - void* directDrawCreate = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); - void* directDrawCreateEx = util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); + void* directDrawCreate = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreate"); + void* directDrawCreateEx = (void*)util_get_iat_proc(GetModuleHandleA(NULL), "ddraw.dll", "DirectDrawCreateEx"); TRACE("%s directDrawCreate = %p, directDrawCreateEx = %p\n", __FUNCTION__, directDrawCreate, directDrawCreateEx); From c850b0dcc3a0d8653dfdf85fef18287b561fc2bb Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:21:07 +0200 Subject: [PATCH 0470/1053] fix AOE2 textbox position --- inc/dd.h | 7 +++++++ src/dd.c | 23 +++++++++++++++++++++++ src/utils.c | 2 +- src/winapi_hooks.c | 25 +++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 73a1202..4a964f1 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -158,6 +158,13 @@ typedef struct CNCDDRAW DWORD gui_thread_id; BOOL show_driver_warning; + struct + { + HWND hwnd; + int x; + int y; + } textbox; /* Age Of Empires 2 textbox align */ + } CNCDDRAW; #endif diff --git a/src/dd.c b/src/dd.c index fda72bd..e0d99be 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1149,6 +1149,29 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_lock(); } + if (g_ddraw.textbox.hwnd && + g_ddraw.textbox.x && + g_ddraw.textbox.y && + IsWindow(g_ddraw.textbox.hwnd) && + GetParent(g_ddraw.textbox.hwnd) == g_ddraw.hwnd) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(g_ddraw.textbox.hwnd, class_name, sizeof(class_name) - 1); + + if (_strcmpi(class_name, "Edit") == 0) + { + real_SetWindowPos( + g_ddraw.textbox.hwnd, + 0, + g_ddraw.textbox.x * g_ddraw.render.scale_w, + g_ddraw.textbox.y * g_ddraw.render.scale_h, + 0, + 0, + SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER + ); + } + } + RedrawWindow(g_ddraw.hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE); if (g_ddraw.render.viewport.x != 0 || g_ddraw.render.viewport.y != 0) diff --git a/src/utils.c b/src/utils.c index fe1db06..a9e0f4a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -810,7 +810,7 @@ BOOL CALLBACK util_enum_child_proc(HWND hwnd, LPARAM lparam) dbg_dump_wnd_styles(style, exstyle); #endif - if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || strcmp(class_name, "Edit") == 0) + if (parent != g_ddraw.hwnd || size.right <= 1 || size.bottom <= 1 || _strcmpi(class_name, "Edit") == 0) return TRUE; if (g_config.fixchilds == FIX_CHILDS_DETECT_HIDE || diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index b3a4cce..8a58b46 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -371,6 +371,20 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO Y += pt.y; } } + else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width) + { + char class_name[MAX_PATH] = { 0 }; + GetClassNameA(hWnd, class_name, sizeof(class_name) - 1); + + if (_strcmpi(class_name, "Edit") == 0) + { + g_ddraw.textbox.x = X; + g_ddraw.textbox.y = Y; + + X *= g_ddraw.render.scale_w; + Y *= g_ddraw.render.scale_h; + } + } } return real_MoveWindow(hWnd, X, Y, nWidth, nHeight, bRepaint); @@ -1692,6 +1706,17 @@ HWND WINAPI fake_CreateWindowExA( hInstance, lpParam); + /* Age Of Empires 2 */ + if (!dwExStyle && + HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 && + !lpWindowName && + g_ddraw.ref && g_ddraw.width && + g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && + hMenu == 1) + { + g_ddraw.textbox.hwnd = hwnd; + } + TRACE("<- CreateWindowExA(hwnd=%p)\n", hwnd); return hwnd; From d968d320c6964ca10596bb5b3809c1596029df1a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:29:26 +0200 Subject: [PATCH 0471/1053] fix textbox with maintain aspect ratio enabled --- src/dd.c | 4 ++-- src/winapi_hooks.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dd.c b/src/dd.c index e0d99be..313464b 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1163,8 +1163,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowPos( g_ddraw.textbox.hwnd, 0, - g_ddraw.textbox.x * g_ddraw.render.scale_w, - g_ddraw.textbox.y * g_ddraw.render.scale_h, + g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w), + g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 8a58b46..6ac4530 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -381,8 +381,8 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO g_ddraw.textbox.x = X; g_ddraw.textbox.y = Y; - X *= g_ddraw.render.scale_w; - Y *= g_ddraw.render.scale_h; + X = g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w); + Y = g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h); } } } From b472679643a7f4d1e6bdb974b997b2c10fcb815f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:43:43 +0200 Subject: [PATCH 0472/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index 62c616d..cc32d36 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 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 2465b13d7381e2dbdb0fbe430321ea73a910ceb2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 14 Jul 2024 07:59:39 +0200 Subject: [PATCH 0473/1053] add comments for AOE2 textbox hack --- src/dd.c | 1 + src/winapi_hooks.c | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 313464b..9a5a745 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1149,6 +1149,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl mouse_lock(); } + /* Age Of Empires 2 textbox align */ if (g_ddraw.textbox.hwnd && g_ddraw.textbox.x && g_ddraw.textbox.y && diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 6ac4530..424c831 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -373,6 +373,7 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO } else if (hWnd == g_ddraw.textbox.hwnd && IsWindow(hWnd) && GetParent(hWnd) == g_ddraw.hwnd && g_ddraw.width) { + /* Age Of Empires 2 textbox align */ char class_name[MAX_PATH] = { 0 }; GetClassNameA(hWnd, class_name, sizeof(class_name) - 1); @@ -1706,7 +1707,7 @@ HWND WINAPI fake_CreateWindowExA( hInstance, lpParam); - /* Age Of Empires 2 */ + /* Age Of Empires 2 textbox align */ if (!dwExStyle && HIWORD(lpClassName) && _strcmpi(lpClassName, "edit") == 0 && !lpWindowName && From 25b4bb8ce593351cd7a65ed541614de072f0fae6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 17 Jul 2024 11:01:18 +0200 Subject: [PATCH 0474/1053] update Shadow Flare preset --- src/config.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/config.c b/src/config.c index cc0926b..bff5940 100644 --- a/src/config.c +++ b/src/config.c @@ -1367,8 +1367,6 @@ static void cfg_create_ini() "[ShadowFlare]\n" "nonexclusive=true\n" "adjmouse=true\n" - "maintas=false\n" - "boxing=false\n" "\n" "; Total Annihilation (Unofficial Beta Patch v3.9.02)\n" "[TotalA]\n" From 8b41ad1aa4dcea60c7e229e44b80ead15ea6d0b4 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Jul 2024 01:09:14 +0200 Subject: [PATCH 0475/1053] check registry key for voobly AOE2 windowed detection --- src/utils.c | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/utils.c b/src/utils.c index a9e0f4a..44772f2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -223,15 +223,30 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) (getModuleHandleExA(flags, directDrawCreate, &mod) && mod == age_dll) || (getModuleHandleExA(flags, directDrawCreateEx, &mod) && mod == age_dll)) { - MessageBoxA( - NULL, - "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" - "Please disable the other wrapper by clicking in the game room on the very top \n" - "on 'Game', now select 'DirectX' and disable 'Render in 32-bit color'.", - "Conflicting DirectDraw wrapper detected - cnc-ddraw", - MB_OK | MB_TOPMOST); + HKEY hkey; + LONG status = + RegOpenKeyExA(HKEY_CURRENT_USER, "SOFTWARE\\Voobly\\Voobly\\game\\13", 0L, KEY_READ, &hkey); - return TRUE; + if (status == ERROR_SUCCESS) + { + char windowed[256] = { 0 }; + DWORD size = sizeof(windowed); + RegQueryValueExA(hkey, "windowmode", NULL, NULL, (PVOID)&windowed, &size); + RegCloseKey(hkey); + + if (tolower(windowed[0]) == 't') + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable the other wrapper by clicking in the game room on the very top " + "on 'Game', now select 'DirectX' and disable 'Start in Window-Mode'.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + } } } From 7cb1fceac7caaecdb133141f392820d4d66559f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 18 Jul 2024 01:50:31 +0200 Subject: [PATCH 0476/1053] fix warnings --- src/dd.c | 4 ++-- src/winapi_hooks.c | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/dd.c b/src/dd.c index 9a5a745..c0ddbd4 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1164,8 +1164,8 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl real_SetWindowPos( g_ddraw.textbox.hwnd, 0, - g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w), - g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h), + (int)(g_ddraw.render.viewport.x + (g_ddraw.textbox.x * g_ddraw.render.scale_w)), + (int)(g_ddraw.render.viewport.y + (g_ddraw.textbox.y * g_ddraw.render.scale_h)), 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 424c831..d260b22 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -382,8 +382,8 @@ BOOL WINAPI fake_MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BO g_ddraw.textbox.x = X; g_ddraw.textbox.y = Y; - X = g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w); - Y = g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h); + X = (int)(g_ddraw.render.viewport.x + (X * g_ddraw.render.scale_w)); + Y = (int)(g_ddraw.render.viewport.y + (Y * g_ddraw.render.scale_h)); } } } @@ -1713,7 +1713,7 @@ HWND WINAPI fake_CreateWindowExA( !lpWindowName && g_ddraw.ref && g_ddraw.width && g_ddraw.hwnd && hWndParent == g_ddraw.hwnd && - hMenu == 1) + (int)hMenu == 1) { g_ddraw.textbox.hwnd = hwnd; } From 7ac53e1e970ae8627f1c34d028f051e40f312677 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 19 Jul 2024 07:35:21 +0200 Subject: [PATCH 0477/1053] add preset for Barbie(R) Photo Designer --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 5e18f0d..0c23ef2 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Baldur's Gate - Baldur's Gate 2 - Barbie(tm) Beach Vacation(tm) +- Barbie(R) Photo Designer - Batman: Justice Unbalanced - Batman: Toxic Chill - Blade & Sword diff --git a/src/config.c b/src/config.c index bff5940..b1842f0 100644 --- a/src/config.c +++ b/src/config.c @@ -473,6 +473,10 @@ 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" From ce64c20ae690474a7117b9f9e027187633f64917 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:15:29 +0200 Subject: [PATCH 0478/1053] update supported games list --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0c23ef2..32d7150 100644 --- a/README.md +++ b/README.md @@ -214,6 +214,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Madeline 2nd Grade Math - Majesty Gold - Majesty Gold HD +- ​M.A.X. 2 Mechanized Assault & Exploration - Mech Warrior 3 - Megaman X4 - Metal Gear Solid From 751a1e94199dd84b81986113e56392d038fb0273 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:19:31 +0200 Subject: [PATCH 0479/1053] detect D3DWindower as well --- src/utils.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/utils.c b/src/utils.c index 44772f2..16bdd37 100644 --- a/src/utils.c +++ b/src/utils.c @@ -162,6 +162,24 @@ BOOL util_caller_is_ddraw_wrapper(void* return_address) HMODULE mod = NULL; DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT; + 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)) + { + MessageBoxA( + NULL, + "Error: You cannot combine cnc-ddraw with other DirectDraw wrappers. \n\n" + "Please disable D3DWindower and then try to start the game again.", + "Conflicting DirectDraw wrapper detected - cnc-ddraw", + MB_OK | MB_TOPMOST); + + return TRUE; + } + } + HMODULE wndmode_dll = GetModuleHandleA("wndmode.dll"); if (wndmode_dll) { From 1f532f9f6fefdc757f4c9cc0f51ca7ca82626585 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 20 Jul 2024 02:44:57 +0200 Subject: [PATCH 0480/1053] bump version --- inc/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/version.h b/inc/version.h index cc32d36..a9eb822 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 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 f4f5c2d71b6a2ccbb160e64eebe7a66ebed0c23f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 21 Jul 2024 04:01:00 +0200 Subject: [PATCH 0481/1053] fix GL_OUT_OF_MEMORY error issues on high resolutions such as 8k and above --- inc/render_ogl.h | 1 - src/render_ogl.c | 73 +++++++++++++++++++++++++++++------------------- 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 2547ff3..8dbb9a4 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -16,7 +16,6 @@ typedef struct OGLRENDERER BOOL got_error; int surface_tex_width; int surface_tex_height; - int* surface_tex; GLenum surface_format; GLenum surface_type; GLuint surface_tex_ids[TEXTURE_COUNT]; diff --git a/src/render_ogl.c b/src/render_ogl.c index 5ff4dd8..ef18352 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -248,13 +248,10 @@ static void ogl_create_textures(int width, int height) int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; g_ogl.surface_tex_width = - w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w <= 16384 ? 16384 : w; + w <= 1024 ? 1024 : w <= 2048 ? 2048 : w <= 4096 ? 4096 : w <= 8192 ? 8192 : w; g_ogl.surface_tex_height = - h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h <= 16384 ? 16384 : h; - - g_ogl.surface_tex = - HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + h <= 512 ? 512 : h <= 1024 ? 1024 : h <= 2048 ? 2048 : h <= 4096 ? 4096 : h <= 8192 ? 8192 : h; g_ogl.scale_w = (float)width / g_ogl.surface_tex_width; g_ogl.scale_h = (float)height / g_ogl.surface_tex_height; @@ -638,7 +635,7 @@ static void ogl_init_shader1_program() 0, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + 0); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, g_ogl.frame_buffer_tex_id[i], 0); @@ -704,6 +701,10 @@ static void ogl_init_shader1_program() break; } + else + { + glClear(GL_COLOR_BUFFER_BIT); + } } glBindFramebuffer(GL_FRAMEBUFFER, 0); @@ -1213,9 +1214,6 @@ static void ogl_render() static void ogl_delete_context(HGLRC context) { - if (g_ogl.surface_tex) - HeapFree(GetProcessHeap(), 0, g_ogl.surface_tex); - glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); if (g_ddraw.bpp == 8) @@ -1277,7 +1275,13 @@ static void ogl_delete_context(HGLRC context) static BOOL ogl_texture_upload_test() { - if (!g_ogl.surface_tex) + if (g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) + return TRUE; + + int* surface_tex = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + + if (!surface_tex) return TRUE; static char test_data[] = { 0,1,2,0,0,2,3,0,0,4,5,0,0,6,7,0,0,8,9,0 }; @@ -1285,7 +1289,7 @@ static BOOL ogl_texture_upload_test() int i; for (i = 0; i < TEXTURE_COUNT; i++) { - memcpy(g_ogl.surface_tex, test_data, sizeof(test_data)); + memcpy(surface_tex, test_data, sizeof(test_data)); glBindTexture(GL_TEXTURE_2D, g_ogl.surface_tex_ids[i]); @@ -1298,14 +1302,17 @@ static BOOL ogl_texture_upload_test() g_ddraw.height, g_ogl.surface_format, g_ogl.surface_type, - g_ogl.surface_tex); + surface_tex); - memset(g_ogl.surface_tex, 0, sizeof(test_data)); + memset(surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, g_ogl.surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, g_ogl.surface_format, g_ogl.surface_type, surface_tex); - if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) + if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) + { + HeapFree(GetProcessHeap(), 0, surface_tex); return FALSE; + } } if (g_ddraw.bpp == 8) @@ -1323,32 +1330,41 @@ static BOOL ogl_texture_upload_test() 1, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); - memset(g_ogl.surface_tex, 0, sizeof(test_data)); + memset(surface_tex, 0, sizeof(test_data)); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); + glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, surface_tex); - if (memcmp(g_ogl.surface_tex, test_data, sizeof(test_data)) != 0) + if (memcmp(surface_tex, test_data, sizeof(test_data)) != 0) + { + HeapFree(GetProcessHeap(), 0, surface_tex); return FALSE; + } + } } + + HeapFree(GetProcessHeap(), 0, surface_tex); return TRUE; } static BOOL ogl_shader_test() { - if (!g_ogl.surface_tex) - return TRUE; - BOOL result = TRUE; - if (g_ddraw.bpp != 8) + if (g_ddraw.bpp != 8 || g_ogl.surface_tex_width > 4096 || g_ogl.surface_tex_height > 4096) return result; + int* surface_tex = + HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_ogl.surface_tex_width * g_ogl.surface_tex_height * sizeof(int)); + + if (!surface_tex) + return TRUE; + if (g_oglu_got_version3 && g_ogl.main_program) { - memset(g_ogl.surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); + memset(surface_tex, 0, g_ogl.surface_tex_height * g_ogl.surface_tex_width * sizeof(int)); GLuint fbo_id = 0; glGenFramebuffers(1, &fbo_id); @@ -1369,7 +1385,7 @@ static BOOL ogl_shader_test() 0, GL_RGBA, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex_id, 0); @@ -1404,7 +1420,7 @@ static BOOL ogl_shader_test() g_ogl.surface_tex_height, g_ogl.surface_format, GL_UNSIGNED_BYTE, - g_ogl.surface_tex); + surface_tex); glViewport(0, 0, g_ogl.surface_tex_width, g_ogl.surface_tex_height); @@ -1423,12 +1439,12 @@ static BOOL ogl_shader_test() glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, fbo_tex_id); - glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, g_ogl.surface_tex); + 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 (g_ogl.surface_tex[i] != 0x80808080) + if (surface_tex[i] != 0x80808080) { result = FALSE; break; @@ -1446,5 +1462,6 @@ static BOOL ogl_shader_test() glBindFramebuffer(GL_FRAMEBUFFER, 0); } + HeapFree(GetProcessHeap(), 0, surface_tex); return result; } From 4b5ded46f16f7f9b033418ea2de1d04215e09d4b Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 21 Jul 2024 07:18:09 +0200 Subject: [PATCH 0482/1053] reduce waiting time in SetDisplayMode( --- src/render_d3d9.c | 6 +++++- src/render_gdi.c | 6 +++++- src/render_ogl.c | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 05f29b9..c8e911e 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -549,7 +549,8 @@ DWORD WINAPI d3d9_render_main(void) DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -682,6 +683,9 @@ DWORD WINAPI d3d9_render_main(void) Sleep(50); } + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif diff --git a/src/render_gdi.c b/src/render_gdi.c index d67bee9..390fc56 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -41,7 +41,8 @@ DWORD WINAPI gdi_render_main(void) DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -162,6 +163,9 @@ DWORD WINAPI gdi_render_main(void) LeaveCriticalSection(&g_ddraw.cs); + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif diff --git a/src/render_ogl.c b/src/render_ogl.c index ef18352..2242ca3 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -837,7 +837,8 @@ static void ogl_render() DWORD timeout = g_config.minfps > 0 ? g_ddraw.minfps_tick_len : INFINITE; while (g_ogl.use_opengl && g_ddraw.render.run && - (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED)) + (g_config.minfps < 0 || WaitForSingleObject(g_ddraw.render.sem, timeout) != WAIT_FAILED) && + g_ddraw.render.run) { #if _DEBUG dbg_draw_frame_info_start(); @@ -1201,6 +1202,9 @@ static void ogl_render() SwapBuffers(g_ddraw.render.hdc); + if (!g_ddraw.render.run) + break; + #if _DEBUG dbg_draw_frame_info_end(); #endif From e3b81f82506c2adea7d986f593292b836217cee3 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 22 Jul 2024 09:02:31 +0200 Subject: [PATCH 0483/1053] only create opengl context once per window fixes issues on intel and improves performance --- inc/render_ogl.h | 4 +++ src/dd.c | 23 ++++++++++++++ src/render_ogl.c | 79 ++++++++++++++++++++++++++++------------------ src/winapi_hooks.c | 5 +++ 4 files changed, 81 insertions(+), 30 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 8dbb9a4..969c41a 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -9,6 +9,8 @@ typedef struct OGLRENDERER { + HWND hwnd; + HDC hdc; HGLRC context; GLuint main_program; GLuint shader1_program; @@ -42,5 +44,7 @@ typedef struct OGLRENDERER } OGLRENDERER; DWORD WINAPI ogl_render_main(void); +BOOL ogl_create(); +BOOL ogl_release(); #endif diff --git a/src/dd.c b/src/dd.c index c0ddbd4..6491f62 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1013,6 +1013,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.renderer = gdi_render_main; } } + else if (g_ddraw.renderer == ogl_render_main) + { + if (!ogl_create()) + { + ogl_release(); + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; + } + } if (lock_mouse || (g_config.fullscreen && real_GetForegroundWindow() == g_ddraw.hwnd)) mouse_lock(); @@ -1093,6 +1102,15 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw.renderer = gdi_render_main; } } + else if (g_ddraw.renderer == ogl_render_main) + { + if (!ogl_create()) + { + ogl_release(); + g_ddraw.show_driver_warning = TRUE; + g_ddraw.renderer = gdi_render_main; + } + } if (!d3d9_active || g_config.nonexclusive) { @@ -1485,6 +1503,11 @@ ULONG dd_Release() } } + if (g_ddraw.renderer == ogl_render_main) + { + ogl_release(); + } + if (g_ddraw.render.hdc) { ReleaseDC(g_ddraw.hwnd, g_ddraw.render.hdc); diff --git a/src/render_ogl.c b/src/render_ogl.c index 2242ca3..a56b295 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -13,26 +13,48 @@ static HGLRC ogl_create_core_context(HDC hdc); -static HGLRC ogl_create_context(HDC hdc); static void ogl_build_programs(); static void ogl_create_textures(int width, int height); static void ogl_init_main_program(); static void ogl_init_shader1_program(); static void ogl_init_shader2_program(); static void ogl_render(); -static void ogl_delete_context(HGLRC context); +static BOOL ogl_release_resources(); static BOOL ogl_texture_upload_test(); static BOOL ogl_shader_test(); static OGLRENDERER g_ogl; +BOOL ogl_create() +{ + if (g_ogl.hwnd == g_ddraw.hwnd && g_ogl.hdc == g_ddraw.render.hdc && g_ogl.context) + { + return TRUE; + } + + ogl_release(); + + g_ogl.context = xwglCreateContext(g_ddraw.render.hdc); + if (g_ogl.context) + { + g_ogl.hwnd = g_ddraw.hwnd; + g_ogl.hdc = g_ddraw.render.hdc; + + return TRUE; + } + + g_ogl.hwnd = NULL; + g_ogl.hdc = NULL; + + return FALSE; +} + DWORD WINAPI ogl_render_main(void) { Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - g_ogl.context = ogl_create_context(g_ddraw.render.hdc); - if (g_ogl.context) + if (xwglMakeCurrent(g_ogl.hdc, g_ogl.context) && glGetError() == GL_NO_ERROR) { oglu_init(); @@ -43,9 +65,9 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ddraw.render.hdc); + g_ogl.context = ogl_create_core_context(g_ogl.hdc); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ddraw.render.hdc) && wglSwapIntervalEXT) + if (oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc) && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); @@ -62,9 +84,11 @@ DWORD WINAPI ogl_render_main(void) ogl_render(); - ogl_delete_context(g_ogl.context); + ogl_release_resources(); } + xwglMakeCurrent(NULL, NULL); + if (!g_ogl.use_opengl) { g_ddraw.show_driver_warning = TRUE; @@ -112,25 +136,6 @@ static HGLRC ogl_create_core_context(HDC hdc) return g_ogl.context; } -static HGLRC ogl_create_context(HDC hdc) -{ - HGLRC context = xwglCreateContext(hdc); - BOOL made_current = context && xwglMakeCurrent(hdc, context); - - if (!made_current || glGetError() != GL_NO_ERROR) - { - if (made_current) - { - xwglMakeCurrent(NULL, NULL); - xwglDeleteContext(context); - } - - context = 0; - } - - return context; -} - static void ogl_build_programs() { g_ogl.main_program = g_ogl.shader1_program = g_ogl.shader2_program = 0; @@ -1200,7 +1205,7 @@ static void ogl_render() if (g_ddraw.bnet_active) glClear(GL_COLOR_BUFFER_BIT); - SwapBuffers(g_ddraw.render.hdc); + SwapBuffers(g_ogl.hdc); if (!g_ddraw.render.run) break; @@ -1216,7 +1221,7 @@ static void ogl_render() InterlockedExchange(&g_ddraw.upscale_hack_active, FALSE); } -static void ogl_delete_context(HGLRC context) +static BOOL ogl_release_resources() { glDeleteTextures(TEXTURE_COUNT, g_ogl.surface_tex_ids); @@ -1273,8 +1278,22 @@ static void ogl_delete_context(HGLRC context) } } - xwglMakeCurrent(NULL, NULL); - xwglDeleteContext(context); + return TRUE; +} + +BOOL ogl_release() +{ + if (g_ddraw.render.thread) + return FALSE; + + if (g_ogl.context) + { + xwglMakeCurrent(NULL, NULL); + xwglDeleteContext(g_ogl.context); + g_ogl.context = NULL; + } + + return TRUE; } static BOOL ogl_texture_upload_test() diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index d260b22..b856f0e 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -12,6 +12,7 @@ #include "wndproc.h" #include "render_gdi.h" #include "render_d3d9.h" +#include "render_ogl.h" #include "directinput.h" #include "ddsurface.h" #include "ddclipper.h" @@ -1479,6 +1480,10 @@ BOOL WINAPI fake_DestroyWindow(HWND hWnd) { d3d9_release(); } + else if (g_ddraw.renderer == ogl_render_main) + { + ogl_release(); + } } BOOL result = real_DestroyWindow(hWnd); From 3ef9e29a8bc58b3ce523626e8f4855d01b256f49 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 22 Jul 2024 11:03:33 +0200 Subject: [PATCH 0484/1053] retry wglMakeCurrent at least once --- src/render_ogl.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index a56b295..84ec194 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -54,7 +54,15 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - if (xwglMakeCurrent(g_ogl.hdc, g_ogl.context) && glGetError() == GL_NO_ERROR) + BOOL made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); + if (!made_current) + { + /* make sure we retry at least once */ + Sleep(50); + made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); + } + + if (made_current && glGetError() == GL_NO_ERROR) { oglu_init(); From 86940e993749aa285c47c90f9aa3b3c52f6c317e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 23 Jul 2024 23:25:02 +0200 Subject: [PATCH 0485/1053] add new DDEnableZoom export --- exports.def | 1 + inc/dd.h | 5 +++++ src/dllmain.c | 11 +++++++++++ 3 files changed, 17 insertions(+) diff --git a/exports.def b/exports.def index 44bfcd8..1e25f0f 100644 --- a/exports.def +++ b/exports.def @@ -22,3 +22,4 @@ EXPORTS pvBmpBits = FakePrimarySurface DATA DDIsWindowed DDGetProcAddress + DDEnableZoom diff --git a/inc/dd.h b/inc/dd.h index 4a964f1..8fdd7a7 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -165,6 +165,11 @@ typedef struct CNCDDRAW int y; } textbox; /* Age Of Empires 2 textbox align */ + + struct + { + BOOL enabled; + } zoom; /* Age Of Empires 2 textbox align */ } CNCDDRAW; #endif diff --git a/src/dllmain.c b/src/dllmain.c index a2804d0..b75c335 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -147,13 +147,24 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) return TRUE; } +void DDEnableZoom() +{ + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + + g_ddraw.zoom.enabled = TRUE; +} + BOOL DDIsWindowed() { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + return g_config.windowed && !g_config.fullscreen; } FARPROC WINAPI DDGetProcAddress(HMODULE hModule, LPCSTR lpProcName) { + TRACE("%s [%p]\n", __FUNCTION__, _ReturnAddress()); + return real_GetProcAddress(hModule, lpProcName); } From 0c393e24b4a61f175b40fa81cd949b52700022ef Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 23 Jul 2024 23:26:17 +0200 Subject: [PATCH 0486/1053] remove comment --- inc/dd.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/dd.h b/inc/dd.h index 8fdd7a7..bce317a 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -169,7 +169,7 @@ typedef struct CNCDDRAW struct { BOOL enabled; - } zoom; /* Age Of Empires 2 textbox align */ + } zoom; } CNCDDRAW; #endif From f2f6ffe69f00a135bef4d950b5c2865ca3cf81c7 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 24 Jul 2024 07:58:55 +0200 Subject: [PATCH 0487/1053] initial zoom support --- src/dd.c | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/dd.c b/src/dd.c index 6491f62..819a0fd 100644 --- a/src/dd.c +++ b/src/dd.c @@ -623,6 +623,9 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } + BOOL zooming = g_ddraw.zoom.enabled; + g_ddraw.zoom.enabled = FALSE; + g_ddraw.render.width = g_config.window_rect.right; g_ddraw.render.height = g_config.window_rect.bottom; @@ -665,15 +668,35 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl } } - - if (g_ddraw.render.width < g_ddraw.width) + else if (zooming) { - g_ddraw.render.width = g_ddraw.width; + if (g_ddraw.width > g_ddraw.mode.dmPelsWidth || + g_ddraw.height > g_ddraw.mode.dmPelsHeight) + { + /* Downscaling requires adjmouse to be enabled */ + g_config.adjmouse = TRUE; + } + + /* Do not change display resolution when zooming */ + g_ddraw.render.width = g_ddraw.render.mode.dmPelsWidth; + g_ddraw.render.height = g_ddraw.render.mode.dmPelsHeight; + + /* Resize and alt+enter are not supported yet with zooming */ + g_config.resizable = FALSE; + g_config.hotkeys.toggle_fullscreen = 0; } - if (g_ddraw.render.height < g_ddraw.height) + if (!zooming || g_config.fullscreen) { - g_ddraw.render.height = g_ddraw.height; + if (g_ddraw.render.width < g_ddraw.width) + { + g_ddraw.render.width = g_ddraw.width; + } + + if (g_ddraw.render.height < g_ddraw.height) + { + g_ddraw.render.height = g_ddraw.height; + } } g_ddraw.render.run = TRUE; @@ -1114,7 +1137,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (!d3d9_active || g_config.nonexclusive) { - if (ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) + if (!zooming && ChangeDisplaySettings(&g_ddraw.render.mode, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) { g_ddraw.render.run = FALSE; g_config.windowed = TRUE; From 9bd6cb9cc8ee5a3cea4a80c82910ae64563d5aa9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 24 Jul 2024 08:05:03 +0200 Subject: [PATCH 0488/1053] retry wglMakeCurrent up to 5 times on failure --- src/render_ogl.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/render_ogl.c b/src/render_ogl.c index 84ec194..9dc8770 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -54,12 +54,14 @@ DWORD WINAPI ogl_render_main(void) Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - BOOL made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); - if (!made_current) + BOOL made_current = FALSE; + + for (int i = 0; i < 5; i++) { - /* make sure we retry at least once */ + if ((made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context))) + break; + Sleep(50); - made_current = xwglMakeCurrent(g_ogl.hdc, g_ogl.context); } if (made_current && glGetError() == GL_NO_ERROR) From 2efc7f8a590670c10b10989646cde96f452b0510 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 25 Jul 2024 23:53:17 +0200 Subject: [PATCH 0489/1053] add preset for Emperor: Rise of the Middle Kingdom --- README.md | 1 + src/config.c | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 32d7150..1659ea2 100644 --- a/README.md +++ b/README.md @@ -152,6 +152,7 @@ Need help and don't have a github account? Ask your questions on [Discord](https - Dungeon Keeper 2 - Economic War - Eggsucker +- Emperor: Rise of the Middle Kingdom - Enemy Infestation - Escape Velocity Nova - F-16 Multirole Fighter diff --git a/src/config.c b/src/config.c index b1842f0..4d030de 100644 --- a/src/config.c +++ b/src/config.c @@ -792,6 +792,10 @@ static void cfg_create_ini() "maxgameticks=60\n" "fixnotresponding=true\n" "\n" + "; Emperor: Rise of the Middle Kingdom\n" + "[Emperor]\n" + "nonexclusive=true\n" + "\n" "; Enemy Infestation\n" "[EI]\n" "hook_getmessage=true\n" From 3a579e36cc03a502afd27cb34df56e635e6cf81f Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 26 Jul 2024 08:17:56 +0200 Subject: [PATCH 0490/1053] improve opengl error logs --- inc/render_ogl.h | 9 +++++++ src/render_ogl.c | 69 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 16 deletions(-) diff --git a/inc/render_ogl.h b/inc/render_ogl.h index 969c41a..bc4d39f 100644 --- a/inc/render_ogl.h +++ b/inc/render_ogl.h @@ -7,6 +7,15 @@ #define TEXTURE_COUNT 4 #define FBO_COUNT 2 +#ifdef _DEBUG +#define GL_CHECK(stmt) do { \ + stmt; \ + ogl_check_error(#stmt); \ + } while (0) +#else +#define GL_CHECK(stmt) stmt +#endif + typedef struct OGLRENDERER { HWND hwnd; diff --git a/src/render_ogl.c b/src/render_ogl.c index 9dc8770..a348ed6 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -22,6 +22,7 @@ static void ogl_render(); static BOOL ogl_release_resources(); static BOOL ogl_texture_upload_test(); static BOOL ogl_shader_test(); +static void ogl_check_error(const char* stmt); static OGLRENDERER g_ogl; @@ -53,7 +54,7 @@ DWORD WINAPI ogl_render_main(void) { Sleep(250); g_ogl.got_error = g_ogl.use_opengl = FALSE; - + GLenum err = GL_NO_ERROR; BOOL made_current = FALSE; for (int i = 0; i < 5; i++) @@ -64,9 +65,9 @@ DWORD WINAPI ogl_render_main(void) Sleep(50); } - if (made_current && glGetError() == GL_NO_ERROR) + if (made_current && (err = glGetError()) == GL_NO_ERROR) { - oglu_init(); + GL_CHECK(oglu_init()); TRACE("+--OpenGL-----------------------------------------\n"); TRACE("| GL_VERSION: %s\n", glGetString(GL_VERSION)); @@ -75,26 +76,36 @@ DWORD WINAPI ogl_render_main(void) TRACE("| GL_SHADING_LANGUAGE_VERSION: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION)); TRACE("+------------------------------------------------\n"); - g_ogl.context = ogl_create_core_context(g_ogl.hdc); + GL_CHECK(g_ogl.context = ogl_create_core_context(g_ogl.hdc)); - if (oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc) && wglSwapIntervalEXT) + BOOL got_swap_ctrl; + GL_CHECK(got_swap_ctrl = oglu_ext_exists("WGL_EXT_swap_control", g_ogl.hdc)); + + if (got_swap_ctrl && wglSwapIntervalEXT) wglSwapIntervalEXT(g_config.vsync ? 1 : 0); fpsl_init(); - ogl_build_programs(); - ogl_create_textures(g_ddraw.width, g_ddraw.height); - ogl_init_main_program(); - ogl_init_shader1_program(); - ogl_init_shader2_program(); + GL_CHECK(ogl_build_programs()); + GL_CHECK(ogl_create_textures(g_ddraw.width, g_ddraw.height)); + GL_CHECK(ogl_init_main_program()); + GL_CHECK(ogl_init_shader1_program()); + GL_CHECK(ogl_init_shader2_program()); - g_ogl.got_error = g_ogl.got_error || !ogl_texture_upload_test(); - g_ogl.got_error = g_ogl.got_error || !ogl_shader_test(); - g_ogl.got_error = g_ogl.got_error || 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; - ogl_render(); + GL_CHECK(ogl_render()); - ogl_release_resources(); + GL_CHECK(ogl_release_resources()); + + while (glGetError() != GL_NO_ERROR); + } + else + { + TRACE("OpenGL error %08x, GetLastError %lu (xwglMakeCurrent())\n", err, GetLastError()); + ogl_check_error("xwglMakeCurrent()"); } xwglMakeCurrent(NULL, NULL); @@ -109,6 +120,19 @@ DWORD WINAPI ogl_render_main(void) return 0; } + +static void ogl_check_error(const char* stmt) +{ +#ifdef _DEBUG + GLenum err; + while ((err = glGetError()) != GL_NO_ERROR) + { + g_ogl.got_error = TRUE; + TRACE("OpenGL error %08x (%s)\n", err, stmt); + } +#endif +} + static HGLRC ogl_create_core_context(HDC hdc) { if (!wglCreateContextAttribsARB) @@ -259,6 +283,8 @@ static void ogl_build_programs() static void ogl_create_textures(int width, int height) { + GLenum err = GL_NO_ERROR; + int w = g_ogl.shader2_program ? max(width, g_ddraw.render.viewport.width) : width; int h = g_ogl.shader2_program ? max(height, g_ddraw.render.viewport.height) : height; @@ -279,7 +305,13 @@ static void ogl_create_textures(int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - g_ogl.got_error = g_ogl.got_error || glGetError() != GL_NO_ERROR; + g_ogl.got_error = g_ogl.got_error || (err = glGetError()) != GL_NO_ERROR; + + if (err != GL_NO_ERROR) + { + TRACE("OpenGL error %08x (ogl_create_textures())\n", err); + ogl_check_error("ogl_create_textures()"); + } while (glGetError() != GL_NO_ERROR); @@ -952,7 +984,12 @@ static void ogl_render() GLenum err = glGetError(); if (err != GL_NO_ERROR && err != GL_INVALID_FRAMEBUFFER_OPERATION) + { g_ogl.use_opengl = FALSE; + + TRACE("OpenGL error %08x (ogl_render())\n", err); + ogl_check_error("ogl_render()"); + } } if (g_config.fixchilds) From 50b68a63bbe8a182e1b6f2b695e3b44a3ba72528 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 28 Jul 2024 04:39:22 +0200 Subject: [PATCH 0491/1053] 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 0492/1053] =?UTF-8?q?add=20new=20limiter=20type=20"LIMIT?= =?UTF-8?q?=5FUNL=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 0493/1053] 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 0494/1053] 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 0495/1053] 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 0496/1053] 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 0497/1053] #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 0498/1053] 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 0499/1053] 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 0500/1053] 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 663743b49ffd69d3333731af0e9f18649cc4dc3c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 3 Aug 2024 08:55:05 +0200 Subject: [PATCH 0501/1053] 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 0502/1053] 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 0503/1053] 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 0504/1053] 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 0505/1053] #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 0506/1053] 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 0507/1053] 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 0508/1053] 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 0509/1053] 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 0510/1053] 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 0511/1053] 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 0512/1053] 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 0513/1053] 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 0514/1053] 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 0515/1053] 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 0516/1053] 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 0517/1053] 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 0518/1053] 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 0519/1053] 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 0520/1053] 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 0521/1053] 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 0522/1053] 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 0523/1053] 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 0524/1053] 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 0525/1053] 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 0526/1053] 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 0527/1053] 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 0528/1053] 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 0529/1053] 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 0530/1053] 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 0531/1053] 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 0532/1053] 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 0533/1053] 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 0534/1053] 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 0535/1053] 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 0536/1053] 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 0537/1053] 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 0538/1053] 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 0539/1053] 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 0540/1053] 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 0541/1053] 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 0542/1053] 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 0543/1053] 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 0544/1053] 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 0545/1053] 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 0546/1053] 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 0547/1053] 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 0548/1053] 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 0549/1053] 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 0550/1053] 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 0551/1053] 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 0552/1053] 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 0553/1053] 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 0554/1053] 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 0555/1053] 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 0556/1053] 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 0557/1053] 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 0558/1053] 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 0559/1053] 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 0560/1053] 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 0561/1053] 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 0562/1053] 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 0563/1053] 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 0564/1053] 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 0565/1053] 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 0566/1053] 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 0567/1053] 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 0568/1053] 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 0569/1053] 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 0570/1053] 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 0571/1053] 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 0572/1053] 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 0573/1053] 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 0574/1053] 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 0575/1053] 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 0576/1053] 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 0577/1053] 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 0578/1053] 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 0579/1053] 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 0580/1053] 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 0581/1053] 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 0582/1053] 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 0583/1053] 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 0584/1053] 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 0585/1053] 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 0586/1053] 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 0587/1053] 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 0588/1053] 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 0589/1053] 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 0590/1053] 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 0591/1053] 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 0592/1053] 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 0593/1053] 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 0594/1053] 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 0595/1053] 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 0596/1053] 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 0597/1053] 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 0598/1053] 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 0599/1053] 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 0600/1053] 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 0601/1053] 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 0602/1053] 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 0603/1053] 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 0604/1053] 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 0605/1053] 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 0606/1053] 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 0607/1053] 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 0608/1053] 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 0609/1053] 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 0610/1053] 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 0611/1053] 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 0612/1053] 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 0613/1053] 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 0614/1053] 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 0615/1053] 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 0616/1053] 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 0617/1053] 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 0618/1053] 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 0619/1053] 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 0620/1053] 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 0621/1053] 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 0622/1053] 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 0623/1053] 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 0624/1053] 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 0625/1053] 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 0626/1053] 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 0627/1053] 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 0628/1053] 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 0629/1053] 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 0630/1053] 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 0631/1053] 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 0632/1053] 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 0633/1053] 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 0634/1053] 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 0635/1053] 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 0636/1053] 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 0637/1053] 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 0638/1053] 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 0639/1053] 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 0640/1053] 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 0641/1053] 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 0642/1053] 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 0643/1053] 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 0644/1053] 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 0645/1053] 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 0646/1053] 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 0647/1053] 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 0648/1053] 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 0649/1053] 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 0650/1053] 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 0651/1053] 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 0652/1053] 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 0653/1053] 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 0654/1053] 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 0655/1053] 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 0656/1053] 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 0657/1053] 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 0658/1053] 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 0659/1053] 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 0660/1053] 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 0661/1053] 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 0662/1053] 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 0663/1053] 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 0664/1053] 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 0665/1053] 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 0666/1053] 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 0667/1053] 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 0668/1053] 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 0669/1053] 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 0670/1053] 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 0671/1053] 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 0672/1053] 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 0673/1053] 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 0674/1053] 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 0675/1053] 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 0676/1053] 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 0677/1053] 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 0678/1053] 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 0679/1053] 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 0680/1053] 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 0681/1053] 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 0682/1053] 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 0683/1053] 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 0684/1053] 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 0685/1053] 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 0686/1053] 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 0687/1053] 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 0688/1053] 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 0689/1053] 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 0690/1053] 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 0691/1053] 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 0692/1053] 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 0693/1053] 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 0694/1053] 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 0695/1053] 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 0696/1053] 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 0697/1053] 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 0698/1053] 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 0699/1053] 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 0700/1053] 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 0701/1053] 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 0702/1053] 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 0703/1053] 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 0704/1053] 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 0705/1053] 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 0706/1053] 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 0707/1053] 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 0708/1053] 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 0709/1053] 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 0710/1053] 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 0711/1053] 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 0712/1053] 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 0713/1053] 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 0714/1053] 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 0715/1053] 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 0716/1053] 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 0717/1053] 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 0718/1053] 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 0719/1053] 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 0720/1053] 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 0721/1053] 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 0722/1053] 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 0723/1053] 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 0724/1053] 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 0725/1053] 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 0726/1053] 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 0727/1053] 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 0728/1053] 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 0729/1053] 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 0730/1053] 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 0731/1053] 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 0732/1053] 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 0733/1053] 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 0734/1053] 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 0735/1053] 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 0736/1053] 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 0737/1053] 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 0738/1053] 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 0739/1053] 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 0740/1053] 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 0741/1053] 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 0742/1053] 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 0743/1053] 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 0744/1053] 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 0745/1053] 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 0746/1053] 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 0747/1053] 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 0748/1053] 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 0749/1053] 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 ef0fff19bdce44fd1fe3efbf89bc7589cab6a323 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Oct 2024 20:57:02 +0200 Subject: [PATCH 0750/1053] don't emulate 60hz vblank if we are running at 60hz already --- src/dd.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dd.c b/src/dd.c index 54ab14c..7aa729c 100644 --- a/src/dd.c +++ b/src/dd.c @@ -590,6 +590,11 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_config.fullscreen = FALSE; } } + + if (g_config.maxgameticks == 0 && g_ddraw->mode.dmDisplayFrequency == 60) + { + g_config.maxgameticks == -2; + } } g_ddraw->render.width = g_config.window_rect.right; From 5ee245651eb3edf5822e5989cf35849ca834ef6c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Oct 2024 20:58:00 +0200 Subject: [PATCH 0751/1053] enable maintain aspect ratio by default --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index c736c97..80b9ee4 100644 --- a/src/config.c +++ b/src/config.c @@ -34,7 +34,7 @@ void cfg_load() GET_INT(g_config.window_rect.bottom, "height", 0); 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.maintas, "maintas", TRUE); GET_BOOL(g_config.boxing, "boxing", FALSE); GET_INT(g_config.maxfps, "maxfps", -1); GET_BOOL(g_config.vsync, "vsync", FALSE); @@ -173,7 +173,7 @@ static void cfg_create_ini() "windowed=true\n" "\n" "; Maintain aspect ratio\n" - "maintas=false\n" + "maintas=true\n" "\n" "; Windowboxing / Integer Scaling\n" "boxing=false\n" From 9f58e7925d16112147dfc85491d280821ee90508 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Oct 2024 20:59:42 +0200 Subject: [PATCH 0752/1053] fix for last commit --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 7aa729c..68dd028 100644 --- a/src/dd.c +++ b/src/dd.c @@ -593,7 +593,7 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl if (g_config.maxgameticks == 0 && g_ddraw->mode.dmDisplayFrequency == 60) { - g_config.maxgameticks == -2; + g_config.maxgameticks = -2; } } From 0f575b40ea1c0ad5932d82df496b6ffbbc78830e Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Tue, 1 Oct 2024 21:02:02 +0200 Subject: [PATCH 0753/1053] enable singlecpu by default --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 80b9ee4..2b66ab2 100644 --- a/src/config.c +++ b/src/config.c @@ -253,7 +253,7 @@ static void cfg_create_ini() "\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" - "singlecpu=false\n" + "singlecpu=true\n" "\n" "; Available 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" From 95a5f7231e8298d73302a02982631fe3a9401e84 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 2 Oct 2024 16:47:17 +0200 Subject: [PATCH 0754/1053] 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 0755/1053] 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 0756/1053] 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 0757/1053] 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 0758/1053] 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 0759/1053] 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 0760/1053] 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 0761/1053] 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 0762/1053] 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 0763/1053] 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 0764/1053] 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 0765/1053] 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 0766/1053] 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 0767/1053] 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 0768/1053] 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 0769/1053] 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 0770/1053] 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 0771/1053] 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 0772/1053] 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 0773/1053] 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 0774/1053] 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 0775/1053] 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 0776/1053] 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 0777/1053] #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 0778/1053] 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 0779/1053] 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 0780/1053] 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 0781/1053] 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 0782/1053] 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 0783/1053] 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 0784/1053] 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 0785/1053] 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 0786/1053] 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 0787/1053] 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 0788/1053] 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 0789/1053] 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 0790/1053] 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 0791/1053] 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 0792/1053] 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 0793/1053] 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 0794/1053] 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 0795/1053] 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 0796/1053] 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 0797/1053] 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 0798/1053] 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 0799/1053] 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 0800/1053] 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 0801/1053] 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 0802/1053] 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 0803/1053] 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 0804/1053] 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 0805/1053] 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 0806/1053] 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 0807/1053] 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 0808/1053] 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 0809/1053] 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 0810/1053] 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 0811/1053] 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 0812/1053] 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 0813/1053] 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 0814/1053] 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 0815/1053] 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 0816/1053] 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 0817/1053] 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 411f0438274d1c4193aeb6f68dbb17d9ff62dcb8 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 05:35:12 +0100 Subject: [PATCH 0818/1053] update makefile --- Makefile | 89 ++++++++++++++++++++++++++----------------------------- build.bat | 6 ++-- 2 files changed, 45 insertions(+), 50 deletions(-) diff --git a/Makefile b/Makefile index b10930b..1147210 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,48 @@ -include config.mk -WINDRES ?= windres -LDFLAGS = -Iinc -Wall -Wl,--enable-stdcall-fixup -s -CFLAGS = -std=c99 -O2 -march=i486 -LIBS = -lgdi32 -lwinmm -lpsapi -ldbghelp -lole32 +TARGET ?= ddraw.dll -FILES = src/IDirect3D/IDirect3D.c \ - src/IDirect3D/IDirect3D2.c \ - src/IDirect3D/IDirect3D3.c \ - src/IDirect3D/IDirect3D7.c \ - src/IDirectDraw/IDirectDraw.c \ - src/IDirectDraw/IDirectDrawPalette.c \ - src/IDirectDraw/IDirectDrawClipper.c \ - src/IDirectDraw/IDirectDrawSurface.c \ - src/IDirectDraw/IDirectDrawGammaControl.c \ - src/IAMMediaStream/IAMMediaStream.c \ - src/crc32.c \ - src/blt.c \ - src/dd.c \ - src/ddpalette.c \ - src/ddsurface.c \ - src/ddclipper.c \ - src/render_ogl.c \ - src/render_gdi.c \ - src/render_d3d9.c \ - src/debug.c \ - src/mouse.c \ - src/winapi_hooks.c \ - src/screenshot.c \ - src/config.c \ - src/lodepng.c \ - src/directinput.c \ - src/hook.c \ - src/dllmain.c \ - src/wndproc.c \ - src/utils.c \ - src/fps_limiter.c \ - src/opengl_utils.c +LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared +CFLAGS ?= -Iinc -O2 -Wall -std=c99 -Wno-incompatible-pointer-types +LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 -lPsapi -all: - $(info ) - $(info **********************************************************************************************) - $(info WARNING: This build is outdated and does not support all cnc-ddraw features [Detours/SEH]) - $(info WARNING: Some games that require hooks may crash or glitch, please use the msvc build instead) - $(info **********************************************************************************************) - $(info ) - $(WINDRES) -J rc ddraw.rc ddraw.rc.o - $(CC) $(CFLAGS) $(LDFLAGS) -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -# $(CC) $(CFLAGS) $(LDFLAGS) -nostdlib -shared -o ddraw.dll $(FILES) ddraw.def ddraw.rc.o $(LIBS) -lkernel32 -luser32 -lmsvcrt +COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) +BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) + +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) +endif + +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) ddraw.rc +OBJS := $(addsuffix .o, $(basename $(SRCS))) + +.PHONY: clean all +all: $(TARGET) + +%.o: %.rc + $(WINDRES) -J rc $< $@ || windres -J rc $< $@ + +$(TARGET): $(OBJS) + $(CC) $(LDFLAGS) -o $@ $^ ddraw.def $(LIBS) clean: - $(RM) ddraw.dll ddraw.rc.o + $(RM) $(TARGET) $(OBJS) || del $(TARGET) $(subst /,\\,$(OBJS)) diff --git a/build.bat b/build.bat index 85a89a6..b3508d8 100644 --- a/build.bat +++ b/build.bat @@ -2,7 +2,7 @@ REM REM cnc-patch environment config REM -set PATH=C:\win-builds-patch-32\bin -gmake clean -gmake +set PATH=C:\w64devkit\bin +make clean +make pause From 0a7f877c8f61377c88f3173622a65b65b5950a00 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 05:58:32 +0100 Subject: [PATCH 0819/1053] fix build on linux --- Makefile | 25 +------------------------ src/render_d3d9.c | 2 +- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/Makefile b/Makefile index 1147210..ba2ed6d 100644 --- a/Makefile +++ b/Makefile @@ -4,30 +4,7 @@ TARGET ?= ddraw.dll LDFLAGS ?= -Wl,--enable-stdcall-fixup -s -static -shared CFLAGS ?= -Iinc -O2 -Wall -std=c99 -Wno-incompatible-pointer-types -LIBS = -lgdi32 -lwinmm -lole32 -lMsimg32 -lPsapi - -COMMIT := $(shell git describe --match=NeVeRmAtCh --always --dirty || echo UNKNOWN) -BRANCH := $(shell git rev-parse --abbrev-ref HEAD || echo UNKNOWN) - -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) -endif - -ifdef DEBUG - CFLAGS += -D _DEBUG -D _DEBUG_X -endif - -ifdef _WIN32_WINNT - CFLAGS += -march=i486 -D _WIN32_WINNT=$(_WIN32_WINNT) -endif +LIBS = -lgdi32 -lwinmm -lole32 -lmsimg32 -lpsapi CC = i686-w64-mingw32-gcc WINDRES ?= i686-w64-mingw32-windres diff --git a/src/render_d3d9.c b/src/render_d3d9.c index cae506b..8898df4 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -10,7 +10,7 @@ #include "wndproc.h" #include "blt.h" #include "debug.h" -#include "D3d9types.h" +#include "d3d9types.h" #include "hook.h" #include "config.h" From 362400809978360558e7c7289b2fbebbab625784 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 06:19:03 +0100 Subject: [PATCH 0820/1053] copy IAT hook changes from master branch --- src/hook.c | 55 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/hook.c b/src/hook.c index 628a5ae..b40977f 100644 --- a/src/hook.c +++ b/src/hook.c @@ -185,14 +185,22 @@ void hook_patch_obfuscated_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + 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 == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { + if (!import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); @@ -295,32 +303,43 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc if (nt_headers->Signature != IMAGE_NT_SIGNATURE) return; - PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + - (DWORD)(nt_headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress)); + 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 == (PIMAGE_IMPORT_DESCRIPTOR)nt_headers) + if (import_desc_rva == 0 || import_desc_size == 0) return; + PIMAGE_IMPORT_DESCRIPTOR import_desc = (PIMAGE_IMPORT_DESCRIPTOR)((DWORD)dos_header + import_desc_rva); + while (import_desc->FirstThunk) { + if (!import_desc->OriginalFirstThunk || !import_desc->Name) + { + import_desc++; + continue; + } + for (int i = 0; hooks[i].module_name[0]; i++) { - char* imp_module_name = (char*)((DWORD)dos_header + (DWORD)(import_desc->Name)); + char* imp_module_name = (char*)((DWORD)dos_header + import_desc->Name); if (_stricmp(imp_module_name, hooks[i].module_name) == 0) { - PIMAGE_THUNK_DATA first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->FirstThunk); + 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 original_first_thunk = - (PIMAGE_THUNK_DATA)((DWORD)dos_header + (DWORD)import_desc->OriginalFirstThunk); - - while (first_thunk->u1.Function && original_first_thunk->u1.AddressOfData) + while (first_thunk->u1.Function) { - PIMAGE_IMPORT_BY_NAME import = - (PIMAGE_IMPORT_BY_NAME)((DWORD)dos_header + original_first_thunk->u1.AddressOfData); + if (!o_first_thunk->u1.AddressOfData) + { + first_thunk++; + o_first_thunk++; + continue; + } - if ((original_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) + PIMAGE_IMPORT_BY_NAME import = (void*)((DWORD)dos_header + o_first_thunk->u1.AddressOfData); + + if ((o_first_thunk->u1.Ordinal & IMAGE_ORDINAL_FLAG) == 0) { for (int x = 0; hooks[i].data[x].function_name[0]; x++) { @@ -330,7 +349,7 @@ 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 (_stricmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) + if (strcmp((const char*)import->Name, hooks[i].data[x].function_name) == 0) { DWORD op; @@ -367,7 +386,7 @@ void hook_patch_iat_list(HMODULE hmod, BOOL unhook, HOOKLIST* hooks, BOOL is_loc } first_thunk++; - original_first_thunk++; + o_first_thunk++; } } } From ff9edf3e924f66fd974316cbcf23bdd83cd9b8d2 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 06:21:51 +0100 Subject: [PATCH 0821/1053] fix some warnings --- src/dllmain.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dllmain.c b/src/dllmain.c index d2bbec2..c5ef785 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -89,10 +89,10 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) if (status == ERROR_SUCCESS) { LPCTSTR x264 = "x264vfw.dll"; - RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, x264, strlen(x264) + 1); + RegSetValueExA(hkey,"vidc.x264", 0, REG_SZ, (const BYTE*)x264, strlen(x264) + 1); LPCTSTR xvid = "xvidvfw.dll"; - RegSetValueExA(hkey, "vidc.xvid", 0, REG_SZ, xvid, strlen(xvid) + 1); + RegSetValueExA(hkey, "vidc.xvid", 0, REG_SZ, (const BYTE*)xvid, strlen(xvid) + 1); RegCloseKey(hkey); } From 1e61ebc099d88a0ea79ab2909b41eb3d66a71513 Mon Sep 17 00:00:00 2001 From: EmoonX Date: Fri, 6 Dec 2024 14:55:50 -0300 Subject: [PATCH 0822/1053] Fix stretched HQ cutscene videos on Claw --- src/winapi_hooks.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 3818fb5..929a1ff 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -889,13 +889,19 @@ int WINAPI fake_StretchDIBits( } else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { + int base_width = g_ddraw->height * 4.0/3.0; + double scaling_factor = (double)g_ddraw->render.height / g_ddraw->height; + DestWidth = base_width * scaling_factor; + DestHeight = g_ddraw->render.height; + xDest += (g_ddraw->render.width - DestWidth) / 2; + return real_StretchDIBits( g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(DestWidth * g_ddraw->render.scale_w), - (int)(DestHeight * g_ddraw->render.scale_h), + xDest, + yDest, + DestWidth, + DestHeight, xSrc, ySrc, SrcWidth, From 896c2f5def950e7e6350735eabd41dc8606fab53 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 20:00:58 +0100 Subject: [PATCH 0823/1053] keep old maintas setting working for cutscenes --- 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 929a1ff..641adba 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -889,11 +889,23 @@ int WINAPI fake_StretchDIBits( } else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { - int base_width = g_ddraw->height * 4.0/3.0; - double scaling_factor = (double)g_ddraw->render.height / g_ddraw->height; - DestWidth = base_width * scaling_factor; - DestHeight = g_ddraw->render.height; - xDest += (g_ddraw->render.width - DestWidth) / 2; + // new logic by emoon + // g_ddraw->width check detects new widescreen patch + if (g_ddraw->width > 640 && g_config.maintas) + { + int base_width = g_ddraw->height * 4.0 / 3.0; + double scaling_factor = (double)g_ddraw->render.height / g_ddraw->height; + DestWidth = base_width * scaling_factor; + DestHeight = g_ddraw->render.height; + xDest += (g_ddraw->render.width - DestWidth) / 2; + } + else // original 4:3 logic + { + xDest += g_ddraw->render.viewport.x; + yDest += g_ddraw->render.viewport.y; + DestWidth = (int)(DestWidth * g_ddraw->render.scale_w); + DestHeight = (int)(DestHeight * g_ddraw->render.scale_h); + } return real_StretchDIBits( From 721cf6616ae3529b2ba6e175bf4b462eb459f085 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 20:01:49 +0100 Subject: [PATCH 0824/1053] make emoon's patch working on windows as well --- src/winapi_hooks.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 641adba..a1687f9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -759,6 +759,24 @@ BOOL WINAPI fake_StretchBlt( } else if (g_ddraw->width > 0 && g_ddraw->render.hdc) { + // new logic by emoon + // g_ddraw->width check detects new widescreen patch + if (g_ddraw->width > 640 && g_config.maintas) + { + int base_width = g_ddraw->height * 4.0 / 3.0; + double scaling_factor = (double)g_ddraw->render.height / g_ddraw->height; + wDest = base_width * scaling_factor; + hDest = g_ddraw->render.height; + xDest += (g_ddraw->render.width - wDest) / 2; + } + else // original 4:3 logic + { + xDest += g_ddraw->render.viewport.x; + yDest += g_ddraw->render.viewport.y; + wDest = (int)(wDest * g_ddraw->render.scale_w); + hDest = (int)(hDest * g_ddraw->render.scale_h); + } + return real_StretchBlt( g_ddraw->render.hdc, xDest + g_ddraw->render.viewport.x, From 4b9bd890a474ad3a537dd1f2f31de3b3b10d3470 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 20:02:09 +0100 Subject: [PATCH 0825/1053] fix for last commit --- 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 a1687f9..bb7da5d 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -779,10 +779,10 @@ BOOL WINAPI fake_StretchBlt( return real_StretchBlt( g_ddraw->render.hdc, - xDest + g_ddraw->render.viewport.x, - yDest + g_ddraw->render.viewport.y, - (int)(wDest * g_ddraw->render.scale_w), - (int)(hDest * g_ddraw->render.scale_h), + xDest, + yDest, + wDest, + hDest, hdcSrc, xSrc, ySrc, From c77a6ce19eec84f48d5fe056982ca291e4d3b2ae Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Fri, 6 Dec 2024 22:09:53 +0100 Subject: [PATCH 0826/1053] use HKLM for wine --- src/dllmain.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/dllmain.c b/src/dllmain.c index c5ef785..b6c5f2b 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -73,10 +73,12 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) /* add registry key for x264vfw */ + BOOL is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + HKEY hkey; LONG status = RegCreateKeyExA( - HKEY_CURRENT_USER, + is_wine ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Drivers32", 0, NULL, From 14ff0a0d9ebce9bf7bd643a89e99d8d28fb8279c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sat, 7 Dec 2024 02:24:22 +0100 Subject: [PATCH 0827/1053] 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 0828/1053] 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 0829/1053] 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 0830/1053] #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 0831/1053] 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 0832/1053] 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 0833/1053] 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 0834/1053] 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 0835/1053] 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 0836/1053] #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 0837/1053] 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 0838/1053] 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 0839/1053] 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 0840/1053] #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 0841/1053] 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 0842/1053] 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 0843/1053] 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 0844/1053] 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 0845/1053] 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 0846/1053] 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 0847/1053] 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 0848/1053] 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 0849/1053] 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 0850/1053] 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 0851/1053] 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 0852/1053] 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 0853/1053] 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 0854/1053] 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 0855/1053] 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 0856/1053] 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 0857/1053] 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 0858/1053] 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 0859/1053] 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 0860/1053] 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 0861/1053] 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 0862/1053] 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 0863/1053] 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 0864/1053] 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 0865/1053] 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 0866/1053] 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 0867/1053] 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 0868/1053] 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 0869/1053] #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 0870/1053] #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 0871/1053] 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 0872/1053] 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 0873/1053] 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 0874/1053] 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 0875/1053] 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 92c0b2a3eddbfb4104f475dd49b8303ccdca11b6 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:33:25 +0100 Subject: [PATCH 0876/1053] don't use DwmFlush in wine --- inc/fps_limiter.h | 1 + src/fps_limiter.c | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/inc/fps_limiter.h b/inc/fps_limiter.h index 5c8049f..019c3ef 100644 --- a/inc/fps_limiter.h +++ b/inc/fps_limiter.h @@ -48,6 +48,7 @@ typedef struct FPSLIMITER D3DKMTCLOSEADAPTERPROC D3DKMTCloseAdapter; BOOL got_adapter; BOOL initialized; + BOOL is_wine; } FPSLIMITER; extern FPSLIMITER g_fpsl; diff --git a/src/fps_limiter.c b/src/fps_limiter.c index 094f902..2652598 100644 --- a/src/fps_limiter.c +++ b/src/fps_limiter.c @@ -75,6 +75,8 @@ void fpsl_init() (D3DKMTCLOSEADAPTERPROC)real_GetProcAddress(g_fpsl.gdi32_dll, "D3DKMTCloseAdapter"); } + g_fpsl.is_wine = real_GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_version") != 0; + g_fpsl.initialized = TRUE; } @@ -104,7 +106,12 @@ BOOL fpsl_wait_for_vblank(BOOL open_adapter) BOOL fpsl_dwm_flush() { - return g_fpsl.initialized && fpsl_dwm_is_enabled() && g_fpsl.DwmFlush && SUCCEEDED(g_fpsl.DwmFlush()); + return + g_fpsl.initialized && + fpsl_dwm_is_enabled() && + g_fpsl.DwmFlush && + !g_fpsl.is_wine && + SUCCEEDED(g_fpsl.DwmFlush()); } BOOL fpsl_dwm_is_enabled() From 3c3af81cd9f923c4f5dab4c6ac1e4749ac3ccda5 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 02:34:10 +0100 Subject: [PATCH 0877/1053] try fpsl_wait_for_vblank first --- src/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dd.c b/src/dd.c index 68dd028..14b0874 100644 --- a/src/dd.c +++ b/src/dd.c @@ -1212,7 +1212,7 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent) { if (g_config.maxgameticks == -2) { - if (fpsl_dwm_flush() || fpsl_wait_for_vblank(g_config.maxfps >= 0 && !g_config.vsync)) + if (fpsl_wait_for_vblank(g_config.maxfps >= 0 && !g_config.vsync) || fpsl_dwm_flush()) return DD_OK; } From 82386fbbc462770450651474f69baf743f317a42 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 16 Dec 2024 06:43:32 +0100 Subject: [PATCH 0878/1053] 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 0879/1053] 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 0880/1053] 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 0881/1053] 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 0882/1053] 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 0883/1053] 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 0884/1053] 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 0885/1053] 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 0886/1053] 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 0887/1053] 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 0888/1053] 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 0889/1053] 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 0890/1053] 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 0891/1053] 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 0892/1053] 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 0893/1053] 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 0894/1053] 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 0895/1053] 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 0896/1053] 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 0897/1053] 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 0898/1053] 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 0899/1053] 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 0900/1053] #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 0901/1053] 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 0902/1053] 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 0903/1053] 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 0904/1053] 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 0905/1053] 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 0906/1053] 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 0907/1053] 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 0908/1053] 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 0909/1053] 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 0910/1053] 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 0911/1053] 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 0912/1053] 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 0913/1053] 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 0914/1053] 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 0915/1053] 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 0916/1053] 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 0917/1053] 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 0918/1053] 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 0919/1053] 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 0920/1053] 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 0921/1053] 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 0922/1053] 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 0923/1053] 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 0924/1053] 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 0925/1053] 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 0926/1053] 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 0927/1053] 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 0928/1053] 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 0929/1053] 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 0930/1053] 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 0931/1053] 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 0932/1053] 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 0933/1053] 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 0934/1053] 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 0935/1053] 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 0936/1053] 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 0937/1053] 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 0938/1053] 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 0939/1053] 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 0940/1053] 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 0941/1053] 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 0942/1053] 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 0943/1053] 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 0944/1053] 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 0945/1053] 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 0946/1053] 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 0947/1053] 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 0948/1053] 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 0949/1053] 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 0950/1053] 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 0951/1053] 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 0952/1053] 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 0953/1053] 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 0954/1053] 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 0955/1053] 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 0956/1053] 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 0957/1053] 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 0958/1053] 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 0959/1053] 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 0960/1053] 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 0961/1053] 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 0962/1053] 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 0963/1053] 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 0964/1053] 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 0965/1053] 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 0966/1053] 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 0967/1053] 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 0968/1053] 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 0969/1053] 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 0970/1053] 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 0971/1053] 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 0972/1053] 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 0973/1053] 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 0974/1053] 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 0975/1053] 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 0976/1053] 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 0977/1053] 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 0978/1053] 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 0979/1053] 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 0980/1053] 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 0981/1053] 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 0982/1053] 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 0983/1053] 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 0984/1053] 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 0985/1053] 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 0986/1053] 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 0987/1053] 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 0988/1053] 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 0989/1053] 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 0990/1053] 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 0991/1053] 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 0992/1053] 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 0993/1053] 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 0994/1053] 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 0995/1053] 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 0996/1053] 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 0997/1053] 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 0998/1053] 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 0999/1053] 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 1000/1053] 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 1001/1053] #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 1002/1053] 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 1003/1053] 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 1004/1053] 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 1005/1053] 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 1006/1053] 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 1007/1053] 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 1008/1053] 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 1009/1053] 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 1010/1053] 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 1011/1053] 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 1012/1053] 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 1013/1053] 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 1014/1053] 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 1015/1053] 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 1016/1053] 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 1017/1053] 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 1018/1053] 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 1019/1053] 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 1020/1053] 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 1021/1053] 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 1022/1053] 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 1023/1053] 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 1024/1053] 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 1025/1053] 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 1026/1053] 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 1027/1053] 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 1028/1053] 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 1029/1053] 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 1030/1053] 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 1031/1053] 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 1032/1053] #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 1033/1053] 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 1034/1053] #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 1035/1053] 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 1036/1053] #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 1037/1053] 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 1038/1053] 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 1039/1053] #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 1040/1053] #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 1041/1053] 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 1042/1053] 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 1043/1053] 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 1044/1053] 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 1045/1053] 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 1046/1053] 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 1047/1053] 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 1048/1053] 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 1049/1053] 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 1050/1053] 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 1051/1053] 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 1052/1053] 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 1053/1053] 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(