From 093284f565128270103b8a585d32abf4f6c1df7c Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Wed, 9 Jun 2021 07:24:17 +0200 Subject: [PATCH] add hack for armada --- inc/dd.h | 1 + src/config.c | 3 +++ src/ddsurface.c | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/inc/dd.h b/inc/dd.h index a2aa12b..1a9b7ef 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -115,6 +115,7 @@ typedef struct cnc_ddraw BOOL gdilinear; BOOL backbuffer; BOOL passthrough; + BOOL armadahack; int maxgameticks; BOOL alt_key_down; BOOL bnet_active; diff --git a/src/config.c b/src/config.c index 4251ecd..6e8b63c 100644 --- a/src/config.c +++ b/src/config.c @@ -56,6 +56,8 @@ void cfg_load() g_ddraw->backbuffer = cfg_get_bool("backbuffer", TRUE); g_ddraw->passthrough = cfg_get_bool("passthrough", TRUE); + g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); + g_config.window_rect.right = cfg_get_int("width", 0); g_config.window_rect.bottom = cfg_get_int("height", 0); g_config.window_rect.left = cfg_get_int("posX", -32000); @@ -706,6 +708,7 @@ static void cfg_create_ini() "\n" "; Star Trek - Armada\n" "[Armada]\n" + "armadahack=true\n" "renderer=opengl\n" "nonexclusive=true\n" "handlemouse=false\n" diff --git a/src/ddsurface.c b/src/ddsurface.c index 0d79386..2d9d2fa 100644 --- a/src/ddsurface.c +++ b/src/ddsurface.c @@ -1200,6 +1200,45 @@ HRESULT dds_Unlock(IDirectDrawSurfaceImpl *This, LPVOID lpRect) } } + + hwnd = g_ddraw->armadahack ? FindWindowEx(HWND_DESKTOP, NULL, "#32770", NULL) : NULL; + + if (hwnd && (This->caps & DDSCAPS_PRIMARYSURFACE)) + { + HDC primary_dc; + dds_GetDC(g_ddraw->primary, &primary_dc); + + RECT rc; + if (fake_GetWindowRect(hwnd, &rc)) + { + HDC hdc = GetDC(hwnd); + + GdiTransparentBlt( + hdc, + 0, + 0, + rc.right - rc.left, + rc.bottom - rc.top, + primary_dc, + rc.left, + rc.top, + rc.right - rc.left, + rc.bottom - rc.top, + 0 + ); + + ReleaseDC(hwnd, hdc); + } + + BOOL x = g_ddraw->ticks_limiter.use_blt_or_flip; + + DDBLTFX fx = { .dwFillColor = 0 }; + IDirectDrawSurface_Blt(This, NULL, NULL, NULL, DDBLT_COLORFILL, &fx); + + g_ddraw->ticks_limiter.use_blt_or_flip = x; + } + + if ((This->caps & DDSCAPS_PRIMARYSURFACE) && g_ddraw->render.run) { InterlockedExchange(&g_ddraw->render.surface_updated, TRUE);