From b2bacb95c3f6e0b1a39bd4feeba2d7ae44c9fe38 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Mon, 19 Mar 2018 00:32:13 +0100 Subject: [PATCH] optional fake GetCursorPos for carmageddon --- ddraw.rc | 8 ++++---- inc/main.h | 1 + src/main.c | 54 ++++++++++++++++++++++++++++++++--------------------- src/mouse.c | 11 +++++++++++ 4 files changed, 49 insertions(+), 25 deletions(-) diff --git a/ddraw.rc b/ddraw.rc index 9a54b8f..5a2db92 100644 --- a/ddraw.rc +++ b/ddraw.rc @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION 1,1,5,7 -PRODUCTVERSION 1,1,5,7 +FILEVERSION 1,1,5,8 +PRODUCTVERSION 1,1,5,8 { BLOCK "StringFileInfo" { @@ -8,13 +8,13 @@ PRODUCTVERSION 1,1,5,7 { VALUE "CompanyName", "cncnet.org" VALUE "FileDescription", "DirectDraw replacement for C&C95 and Red Alert" - VALUE "FileVersion", "1.1.5.7" + VALUE "FileVersion", "1.1.5.8" VALUE "InternalName", "ddraw" VALUE "LegalCopyright", "Copyright (c) 2010-2018" VALUE "LegalTrademarks", "" VALUE "OriginalFileName", "ddraw.dll" VALUE "ProductName", "DirectDraw replacement for C&C95 and Red Alert" - VALUE "ProductVersion", "1.1.5.7" + VALUE "ProductVersion", "1.1.5.8" VALUE "Comments", "https://cncnet.org" } } diff --git a/inc/main.h b/inc/main.h index 8a200f2..fb730f7 100644 --- a/inc/main.h +++ b/inc/main.h @@ -86,6 +86,7 @@ typedef struct IDirectDrawImpl BOOL opengl_pbo; BOOL fullscreen; BOOL maintas; + BOOL fakecursorpos; } IDirectDrawImpl; diff --git a/src/main.c b/src/main.c index 63d8d3c..2457301 100644 --- a/src/main.c +++ b/src/main.c @@ -364,45 +364,45 @@ HRESULT __stdcall ddraw_SetDisplayMode(IDirectDrawImpl *This, DWORD width, DWORD } } - ddraw->render.viewport.width = ddraw->render.width; - ddraw->render.viewport.height = ddraw->render.height; - ddraw->render.viewport.x = 0; - ddraw->render.viewport.y = 0; + This->render.viewport.width = This->render.width; + This->render.viewport.height = This->render.height; + This->render.viewport.x = 0; + This->render.viewport.y = 0; - if (ddraw->boxing) + if (This->boxing) { - ddraw->render.viewport.width = ddraw->width; - ddraw->render.viewport.height = ddraw->height; + This->render.viewport.width = This->width; + This->render.viewport.height = This->height; int i; for (i = 20; i-- > 1;) { - if (ddraw->width * i <= ddraw->render.width && ddraw->height * i <= ddraw->render.height) + if (This->width * i <= This->render.width && This->height * i <= This->render.height) { - ddraw->render.viewport.width *= i; - ddraw->render.viewport.height *= i; + This->render.viewport.width *= i; + This->render.viewport.height *= i; break; } } - ddraw->render.viewport.y = ddraw->render.height / 2 - ddraw->render.viewport.height / 2; - ddraw->render.viewport.x = ddraw->render.width / 2 - ddraw->render.viewport.width / 2; + This->render.viewport.y = This->render.height / 2 - This->render.viewport.height / 2; + This->render.viewport.x = This->render.width / 2 - This->render.viewport.width / 2; } - else if (ddraw->maintas) + else if (This->maintas) { - ddraw->render.viewport.width = ddraw->render.width; - ddraw->render.viewport.height = ((float)ddraw->height / ddraw->width) * ddraw->render.viewport.width; + This->render.viewport.width = This->render.width; + This->render.viewport.height = ((float)This->height / This->width) * This->render.viewport.width; - if (ddraw->render.viewport.height > ddraw->render.height) + if (This->render.viewport.height > This->render.height) { - ddraw->render.viewport.width = - ((float)ddraw->render.viewport.width / ddraw->render.viewport.height) * ddraw->render.height; + This->render.viewport.width = + ((float)This->render.viewport.width / This->render.viewport.height) * This->render.height; - ddraw->render.viewport.height = ddraw->render.height; + This->render.viewport.height = This->render.height; } - ddraw->render.viewport.y = ddraw->render.height / 2 - ddraw->render.viewport.height / 2; - ddraw->render.viewport.x = ddraw->render.width / 2 - ddraw->render.viewport.width / 2; + This->render.viewport.y = This->render.height / 2 - This->render.viewport.height / 2; + This->render.viewport.x = This->render.width / 2 - This->render.viewport.width / 2; } if(This->windowed) @@ -981,6 +981,8 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk "screenshotKey=G\n" "; Use Pixel Buffer Objects (OpenGL only)\n" "opengl_pbo=false\n" + "; Fake cursor position for games that use GetCursorPos and expect to be in fullscreen\n" + "fakecursorpos=true\n" , fh); fclose(fh); } @@ -1102,6 +1104,16 @@ HRESULT WINAPI DirectDrawCreate(GUID FAR* lpGUID, LPDIRECTDRAW FAR* lplpDD, IUnk This->vsync = FALSE; } + GetPrivateProfileStringA("ddraw", "fakecursorpos", "TRUE", tmp, sizeof(tmp), SettingsIniPath); + if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') + { + This->fakecursorpos = TRUE; + } + else + { + This->fakecursorpos = FALSE; + } + GetPrivateProfileStringA("ddraw", "vhack", "false", tmp, sizeof(tmp), SettingsIniPath); if (tolower(tmp[0]) == 'y' || tolower(tmp[0]) == 't' || tolower(tmp[0]) == 'e' || tmp[0] == '1') { diff --git a/src/mouse.c b/src/mouse.c index 87fabcc..011ee42 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -56,6 +56,17 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) if (lpPoint) { + if (!ddraw->fakecursorpos) + { + if (ddraw->locked || ddraw->devmode) + { + lpPoint->x = pt.x; + lpPoint->y = pt.y; + } + else + return FALSE; + } + lpPoint->x = (int)ddraw->cursor.x; lpPoint->y = (int)ddraw->cursor.y; }