diff --git a/inc/dd.h b/inc/dd.h index acd89e7..349f5eb 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -89,8 +89,11 @@ typedef struct cnc_ddraw BOOL devmode; BOOL vsync; BOOL vhack; + int upscale_hack_width; + int upscale_hack_height; BOOL isredalert; BOOL iscnc1; + BOOL iskkndx; LONG incutscene; DWORD (WINAPI *renderer)(void); BOOL fullscreen; diff --git a/inc/utils.h b/inc/utils.h index a1c4256..b5f9d95 100644 --- a/inc/utils.h +++ b/inc/utils.h @@ -4,9 +4,6 @@ #define WIN32_LEAN_AND_MEAN #include -#define CUTSCENE_WIDTH 640 -#define CUTSCENE_HEIGHT 400 - void util_limit_game_ticks(); void util_update_bnet_pos(int newX, int newY); diff --git a/src/config.c b/src/config.c index 08bee56..a05f3e3 100644 --- a/src/config.c +++ b/src/config.c @@ -282,12 +282,12 @@ static void cfg_create_ini() "; Should the window be resizeable by the user in windowed mode?\n" "resizeable=true\n" "\n" - "; Enable C&C video resize hack - Stretches C&C cutscenes to fullscreen\n" - "vhack=false\n" - "\n" "; Enable linear (D3DTEXF_LINEAR) upscaling filter for the direct3d9 renderer (16 bit color depth games only)\n" "d3d9linear=true\n" "\n" + "; Enable upscale hack for high resolution patches (Supports C&C1, Red Alert 1 and KKND Xtreme)\n" + "vhack=false\n" + "\n" "\n" "\n" "; ### Compatibility settings ###\n" @@ -565,6 +565,10 @@ static void cfg_create_ini() "[Moorhuhn2]\n" "hook=3\n" "\n" + "; KKND Xtreme (With high resolution patch)\n" + "[KKNDgame]\n" + "vhack=true\n" + "\n" , fh); fclose(fh); diff --git a/src/dd.c b/src/dd.c index aa91378..15eb7ad 100644 --- a/src/dd.c +++ b/src/dd.c @@ -690,8 +690,20 @@ HRESULT dd_SetCooperativeLevel(HWND hwnd, DWORD dwFlags) g_ddraw->isredalert = strcmp(g_ddraw->title, "Red Alert") == 0; g_ddraw->iscnc1 = strcmp(g_ddraw->title, "Command & Conquer") == 0; + g_ddraw->iskkndx = strcmp(g_ddraw->title, "KKND Xtreme") == 0; - if (g_ddraw->vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1) + if (g_ddraw->iskkndx) + { + g_ddraw->upscale_hack_width = 640; + g_ddraw->upscale_hack_height = 480; + } + else if (g_ddraw->isredalert || g_ddraw->iscnc1) + { + g_ddraw->upscale_hack_width = 640; + g_ddraw->upscale_hack_height = 400; + } + + if (g_ddraw->vhack && !g_ddraw->isredalert && !g_ddraw->iscnc1 && !g_ddraw->iskkndx) { g_ddraw->vhack = 0; } diff --git a/src/ddsurface.c b/src/ddsurface.c index 621494f..fca53cd 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -36,6 +36,9 @@ HRESULT dds_Blt(IDirectDrawSurfaceImpl *This, LPRECT lpDestRect, LPDIRECTDRAWSUR dbg_dump_dds_blt_flags(dwFlags); + if (g_ddraw->iskkndx && (dwFlags & DDBLT_COLORFILL) && lpDestRect && lpDestRect->right == 640 && lpDestRect->bottom == 480) + lpDestRect = NULL; + RECT src_rect = { 0, 0, src_surface ? src_surface->width : 0, src_surface ? src_surface->height : 0 }; RECT dst_rect = { 0, 0, This->width, This->height }; diff --git a/src/render_d3d9.c b/src/render_d3d9.c index 1fca0c9..a287400 100644 --- a/src/render_d3d9.c +++ b/src/render_d3d9.c @@ -284,8 +284,8 @@ static BOOL d3d9_update_vertices(BOOL in_cutscene, BOOL stretch) float vp_w = stretch ? (float)(g_ddraw->render.viewport.width + g_ddraw->render.viewport.x) : (float)g_ddraw->width; float vp_h = stretch ? (float)(g_ddraw->render.viewport.height + g_ddraw->render.viewport.y) : (float)g_ddraw->height; - float s_h = in_cutscene ? g_d3d9.scale_h * ((float)CUTSCENE_HEIGHT / g_ddraw->height) : g_d3d9.scale_h; - float s_w = in_cutscene ? g_d3d9.scale_w * ((float)CUTSCENE_WIDTH / g_ddraw->width) : g_d3d9.scale_w; + float s_h = in_cutscene ? g_d3d9.scale_h * ((float)g_ddraw->upscale_hack_height / g_ddraw->height) : g_d3d9.scale_h; + float s_w = in_cutscene ? g_d3d9.scale_w * ((float)g_ddraw->upscale_hack_width / g_ddraw->width) : g_d3d9.scale_w; CUSTOMVERTEX vertices[] = { diff --git a/src/render_gdi.c b/src/render_gdi.c index 5cbbdd2..c750155 100644 --- a/src/render_gdi.c +++ b/src/render_gdi.c @@ -86,9 +86,9 @@ DWORD WINAPI gdi_render_main(void) g_ddraw->render.viewport.width, g_ddraw->render.viewport.height, 0, - g_ddraw->height - CUTSCENE_HEIGHT, - CUTSCENE_WIDTH, - CUTSCENE_HEIGHT, + g_ddraw->height - g_ddraw->upscale_hack_height, + g_ddraw->upscale_hack_width, + g_ddraw->upscale_hack_height, g_ddraw->primary->surface, g_ddraw->primary->bmi, DIB_RGB_COLORS, diff --git a/src/render_ogl.c b/src/render_ogl.c index b705367..9af9d8c 100644 --- a/src/render_ogl.c +++ b/src/render_ogl.c @@ -567,8 +567,8 @@ static void ogl_render() { if (util_detect_cutscene()) { - g_ogl.scale_w *= (float)CUTSCENE_WIDTH / g_ddraw->width; - g_ogl.scale_h *= (float)CUTSCENE_HEIGHT / g_ddraw->height; + g_ogl.scale_w *= (float)g_ddraw->upscale_hack_width / g_ddraw->width; + g_ogl.scale_h *= (float)g_ddraw->upscale_hack_height / g_ddraw->height; if (!InterlockedExchange(&g_ddraw->incutscene, TRUE)) scale_changed = TRUE; diff --git a/src/utils.c b/src/utils.c index 2b88e57..9db3451 100644 --- a/src/utils.c +++ b/src/utils.c @@ -341,7 +341,7 @@ BOOL util_detect_cutscene() static int* is_vqa_640 = (int*)0x0065D7BC; static BYTE* should_stretch = (BYTE*)0x00607D78; - if (g_ddraw->width <= CUTSCENE_WIDTH || g_ddraw->height <= CUTSCENE_HEIGHT) + if (g_ddraw->width <= g_ddraw->upscale_hack_width || g_ddraw->height <= g_ddraw->upscale_hack_height) { return FALSE; } @@ -357,7 +357,13 @@ BOOL util_detect_cutscene() } else if (g_ddraw->iscnc1) { - return util_get_pixel(CUTSCENE_WIDTH + 1, 0) == 0 || util_get_pixel(CUTSCENE_WIDTH + 5, 1) == 0 ? TRUE : FALSE; + return + util_get_pixel(g_ddraw->upscale_hack_width + 1, 0) == 0 || + util_get_pixel(g_ddraw->upscale_hack_width + 5, 1) == 0; + } + else if (g_ddraw->iskkndx) + { + return util_get_pixel(g_ddraw->width - 3, 3) == 0; } return FALSE; diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 4050764..4aafb03 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -70,16 +70,16 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) diffx = 0; diffy = 0; - if (g_ddraw->cursor.x > CUTSCENE_WIDTH) + if (g_ddraw->cursor.x > g_ddraw->upscale_hack_width) { - diffx = g_ddraw->cursor.x - CUTSCENE_WIDTH; - g_ddraw->cursor.x = CUTSCENE_WIDTH; + diffx = g_ddraw->cursor.x - g_ddraw->upscale_hack_width; + g_ddraw->cursor.x = g_ddraw->upscale_hack_width; } - if (g_ddraw->cursor.y > CUTSCENE_HEIGHT) + if (g_ddraw->cursor.y > g_ddraw->upscale_hack_height) { - diffy = g_ddraw->cursor.y - CUTSCENE_HEIGHT; - g_ddraw->cursor.y = CUTSCENE_HEIGHT; + diffy = g_ddraw->cursor.y - g_ddraw->upscale_hack_height; + g_ddraw->cursor.y = g_ddraw->upscale_hack_height; } if (diffx || diffy)