From 504c2eb1c5ac88d4f7fa417e3603260a50a4c9f9 Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 22 May 2024 23:23:27 +0200 Subject: [PATCH] add new setting to fake current display mode --- inc/config.h | 2 +- src/config.c | 5 +++-- src/dd.c | 57 +++++++++++++++++++++++++++++++++++----------------- 3 files changed, 43 insertions(+), 21 deletions(-) diff --git a/inc/config.h b/inc/config.h index ec737eb..33b5b7c 100644 --- a/inc/config.h +++ b/inc/config.h @@ -76,6 +76,7 @@ typedef struct CNCDDRAWCONFIG int min_font_size; BOOL direct3d_passthrough; BOOL center_cursor_fix; + char fake_mode[128]; /* Hotkeys */ @@ -97,7 +98,6 @@ typedef struct CNCDDRAWCONFIG BOOL infantryhack; BOOL stronghold_hack; BOOL mgs_hack; - BOOL vermeer_hack; } CNCDDRAWCONFIG; diff --git a/src/config.c b/src/config.c index a45fc9d..93c0c67 100644 --- a/src/config.c +++ b/src/config.c @@ -89,6 +89,7 @@ void cfg_load() GET_INT(g_config.min_font_size, "min_font_size", 0); GET_BOOL(g_config.direct3d_passthrough, "direct3d_passthrough", FALSE); GET_BOOL(g_config.center_cursor_fix, "center_cursor_fix", FALSE); + GET_STRING("fake_mode", "", g_config.fake_mode, sizeof(g_config.fake_mode)); /* Hotkeys */ @@ -107,7 +108,6 @@ void cfg_load() GET_BOOL(g_config.infantryhack, "infantryhack", FALSE); GET_BOOL(g_config.stronghold_hack, "stronghold_hack", FALSE); GET_BOOL(g_config.mgs_hack, "mgs_hack", FALSE); - GET_BOOL(g_config.vermeer_hack, "vermeer_hack", FALSE); GameHandlesClose = GameHandlesClose || g_config.infantryhack; @@ -302,6 +302,7 @@ static void cfg_create_ini() "min_font_size=0\n" "direct3d_passthrough=false\n" "center_cursor_fix=false\n" + ";fake_mode=640x480x32\n" "\n" "\n" "\n" @@ -1055,7 +1056,7 @@ static void cfg_create_ini() "; Vermeer\n" "[vermeer]\n" "adjmouse=true\n" - "vermeer_hack=true\n" + "fake_mode=640x480x32\n" "\n" "; Wizardry 8\n" "[Wiz8]\n" diff --git a/src/dd.c b/src/dd.c index c183ecc..a305890 100644 --- a/src/dd.c +++ b/src/dd.c @@ -476,41 +476,56 @@ HRESULT dd_GetDisplayMode(LPDDSURFACEDESC lpDDSurfaceDesc) memset(lpDDSurfaceDesc, 0, size); + unsigned long width = 1024; + unsigned long height = 768; + unsigned long bpp = 16; + + if (g_ddraw.width) + { + width = g_ddraw.width; + height = g_ddraw.height; + bpp = g_ddraw.bpp; + } + else if (g_config.fake_mode[0]) + { + char* e = &g_config.fake_mode[0]; + + width = strtoul(e, &e, 0); + height = strtoul(e + 1, &e, 0); + bpp = strtoul(e + 1, &e, 0); + } + lpDDSurfaceDesc->ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); - lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 8; + lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = bpp; lpDDSurfaceDesc->dwSize = size; lpDDSurfaceDesc->dwFlags = DDSD_HEIGHT | DDSD_REFRESHRATE | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT; lpDDSurfaceDesc->dwRefreshRate = 60; - lpDDSurfaceDesc->dwHeight = g_ddraw.height ? g_ddraw.height : 768; - lpDDSurfaceDesc->dwWidth = g_ddraw.width ? g_ddraw.width : 1024; + lpDDSurfaceDesc->dwWidth = width; + lpDDSurfaceDesc->dwHeight = height; - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; - - if (g_ddraw.bpp == 32 || g_config.vermeer_hack) + if (bpp == 32) { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; - lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 32; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xFF0000; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x00FF00; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x0000FF; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } - else if (g_ddraw.bpp != 8) + else if (bpp == 8) + { + lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_PALETTEINDEXED8 | DDPF_RGB; + } + else { lpDDSurfaceDesc->ddpfPixelFormat.dwFlags = DDPF_RGB; lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount = 16; lpDDSurfaceDesc->ddpfPixelFormat.dwRBitMask = 0xF800; lpDDSurfaceDesc->ddpfPixelFormat.dwGBitMask = 0x07E0; lpDDSurfaceDesc->ddpfPixelFormat.dwBBitMask = 0x001F; - - lpDDSurfaceDesc->lPitch = - ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } + + lpDDSurfaceDesc->lPitch = + ((lpDDSurfaceDesc->dwWidth * lpDDSurfaceDesc->ddpfPixelFormat.dwRGBBitCount + 63) & ~63) >> 3; } return DD_OK; @@ -1298,9 +1313,15 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) if (dwFlags & DDSCL_NORMAL) { - if (g_config.vermeer_hack) + if (g_config.fake_mode[0]) { - dd_SetDisplayMode(640, 480, 16, 0); + char* e = &g_config.fake_mode[0]; + + unsigned long width = strtoul(e, &e, 0); + unsigned long height = strtoul(e + 1, &e, 0); + unsigned long bpp = strtoul(e + 1, &e, 0); + + dd_SetDisplayMode(width, height, bpp, 0); } }