1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-15 06:04:49 +01:00

add new setting to fake current display mode

This commit is contained in:
FunkyFr3sh 2024-05-22 23:23:27 +02:00
parent 06290bbe9d
commit 504c2eb1c5
3 changed files with 43 additions and 21 deletions

View File

@ -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;

View File

@ -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"

View File

@ -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);
}
}