From e7ae07a961ae948b1af03a698bda5dfd4443585a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Sun, 29 Dec 2024 00:30:04 +0100 Subject: [PATCH 01/75] 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 02/75] 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 03/75] 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 04/75] 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 05/75] 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 06/75] 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 07/75] 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 08/75] 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 09/75] 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 10/75] 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 11/75] 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 12/75] 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 13/75] 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 14/75] 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 15/75] 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 16/75] 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 17/75] 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 18/75] 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 19/75] 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 20/75] 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 21/75] 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 22/75] 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 23/75] #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 24/75] 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 25/75] 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 26/75] 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 27/75] 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 28/75] 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 29/75] 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 30/75] 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 31/75] 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 32/75] 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 33/75] 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 34/75] 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 35/75] 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 36/75] 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 37/75] 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 38/75] 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 39/75] 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 40/75] 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 41/75] 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 42/75] 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 43/75] 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 44/75] 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 45/75] 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 46/75] 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 47/75] 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 48/75] 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 49/75] 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 50/75] 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 51/75] 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 52/75] 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 53/75] 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 54/75] #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 55/75] 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 56/75] #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 57/75] 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 58/75] #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 59/75] 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 60/75] 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 61/75] #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 62/75] #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 63/75] 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 64/75] 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 65/75] 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 66/75] 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 67/75] 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 68/75] 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 69/75] 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 70/75] 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 71/75] 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 72/75] 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 73/75] 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 74/75] 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 75/75] 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(