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

limit available resolutions to avoid crashes (Infantry Online)

This commit is contained in:
FunkyFr3sh 2022-10-11 23:13:04 +02:00
parent befbb19a2e
commit 1fb996d8a2
3 changed files with 41 additions and 0 deletions

View File

@ -154,6 +154,7 @@ typedef struct CNCDDRAW
BOOL d3d9on12;
int guard_lines;
int resolutions;
int max_resolutions;
BOOL armadahack;
BOOL tshack;
BOOL infantryhack;

View File

@ -52,6 +52,7 @@ void cfg_load()
g_ddraw->allow_wmactivate = cfg_get_bool("allow_wmactivate", FALSE);
g_ddraw->d3d9_adapter = cfg_get_int("d3d9_adapter", 0);
g_ddraw->guard_lines = cfg_get_int("guard_lines", 200);
g_ddraw->max_resolutions = cfg_get_int("max_resolutions", 0);
g_ddraw->opengl_core = cfg_get_bool("opengl_core", FALSE);
cfg_get_string("screenshotdir", ".\\Screenshots\\", g_ddraw->screenshot_dir, sizeof(g_ddraw->screenshot_dir));
@ -357,6 +358,7 @@ static void cfg_create_ini()
"opengl_core=false\n"
"d3d9on12=false\n"
"guard_lines=200\n"
"max_resolutions=0\n"
"game_handles_close=false\n"
"accuratetimers=false\n"
"fixpitch=true\n"
@ -789,6 +791,7 @@ static void cfg_create_ini()
"devmode=true\n"
"resolutions=2\n"
"infantryhack=true\n"
"max_resolutions=90\n"
"\n"
"; Jagged Alliance 2\n"
"[ja2]\n"

View File

@ -26,6 +26,7 @@ HRESULT dd_EnumDisplayModes(
dbg_dump_edm_flags(dwFlags);
DWORD i = 0;
DWORD res_count = 0;
DDSURFACEDESC2 s;
/* Some games crash when you feed them with too many resolutions so we have to keep the list short */
@ -144,6 +145,12 @@ HRESULT dd_EnumDisplayModes(
if (g_ddraw->bpp == 8 || g_ddraw->resolutions == RESLIST_FULL)
{
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");
@ -160,6 +167,12 @@ HRESULT dd_EnumDisplayModes(
if (g_ddraw->bpp == 16 || g_ddraw->resolutions == RESLIST_FULL)
{
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");
@ -176,6 +189,12 @@ HRESULT dd_EnumDisplayModes(
if (g_ddraw->bpp == 32 || g_ddraw->resolutions == RESLIST_FULL)
{
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");
@ -233,6 +252,12 @@ HRESULT dd_EnumDisplayModes(
s.dwWidth = resolutions[i].cx;
s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3;
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");
@ -246,6 +271,12 @@ HRESULT dd_EnumDisplayModes(
s.ddpfPixelFormat.dwBBitMask = 0x001F;
s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3;
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");
@ -262,6 +293,12 @@ HRESULT dd_EnumDisplayModes(
s.ddpfPixelFormat.dwBBitMask = 0x0000FF;
s.lPitch = ((s.dwWidth * s.ddpfPixelFormat.dwRGBBitCount + 31) & ~31) >> 3;
if (g_ddraw->max_resolutions && res_count++ >= g_ddraw->max_resolutions)
{
TRACE(" resolution limit reached, stopping\n");
return DD_OK;
}
if (lpEnumModesCallback((LPDDSURFACEDESC)&s, lpContext) == DDENUMRET_CANCEL)
{
TRACE(" DDENUMRET_CANCEL returned, stopping\n");