diff --git a/inc/dd.h b/inc/dd.h index e22b25e..dbabebe 100644 --- a/inc/dd.h +++ b/inc/dd.h @@ -97,6 +97,13 @@ typedef struct CNCDDRAW float unscale_h; } render; + struct + { + int y_adjust; + int x_adjust; + RECT rc; + } mouse; + HWND hwnd; WNDPROC wndproc; struct { DWORD x; DWORD y; } cursor; @@ -131,7 +138,6 @@ typedef struct CNCDDRAW int resolutions; BOOL armadahack; BOOL tshack; - BOOL cnchack; int maxgameticks; BOOL alt_key_down; BOOL releasealt; @@ -140,7 +146,6 @@ typedef struct CNCDDRAW BOOL bnet_was_upscaled; RECT bnet_win_rect; POINT bnet_pos; - int mouse_y_adjust; void* last_freed_palette; /* Dungeon Keeper hack */ BOOL child_window_exists; BOOL got_child_windows; diff --git a/src/config.c b/src/config.c index 1ef113f..a16d617 100644 --- a/src/config.c +++ b/src/config.c @@ -46,7 +46,6 @@ void cfg_load() g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->tshack = cfg_get_bool("tshack", FALSE); - g_ddraw->cnchack = cfg_get_bool("cnchack", FALSE); g_config.window_rect.right = cfg_get_int("width", 0); g_config.window_rect.bottom = cfg_get_int("height", 0); @@ -445,7 +444,6 @@ static void cfg_create_ini() "maxgameticks=120\n" "maxfps=60\n" "minfps=-1\n" - "cnchack=true\n" "\n" "; Command & Conquer: Red Alert - CnCNet\n" "[ra95-spawn]\n" @@ -456,14 +454,12 @@ static void cfg_create_ini() "maxgameticks=120\n" "maxfps=60\n" "minfps=-1\n" - "cnchack=true\n" "\n" "; Command & Conquer: Red Alert\n" "[ra95_Mod-Launcher]\n" "maxgameticks=120\n" "maxfps=60\n" "minfps=-1\n" - "cnchack=true\n" "\n" "; Command & Conquer: Red Alert\n" "[ra95p]\n" diff --git a/src/dd.c b/src/dd.c index 629c13e..e4e07f6 100644 --- a/src/dd.c +++ b/src/dd.c @@ -641,6 +641,20 @@ HRESULT dd_SetDisplayMode(DWORD dwWidth, DWORD dwHeight, DWORD dwBPP, DWORD dwFl g_ddraw->render.unscale_w = ((float)g_ddraw->width / g_ddraw->render.viewport.width); g_ddraw->render.unscale_h = ((float)g_ddraw->height / g_ddraw->render.viewport.height); + g_ddraw->mouse.x_adjust = g_ddraw->render.viewport.x; + g_ddraw->mouse.y_adjust = g_ddraw->render.viewport.y; + + g_ddraw->mouse.rc.left = g_ddraw->render.viewport.x; + g_ddraw->mouse.rc.top = g_ddraw->render.viewport.y; + g_ddraw->mouse.rc.right = g_ddraw->width + g_ddraw->render.viewport.x; + g_ddraw->mouse.rc.bottom = g_ddraw->height + g_ddraw->render.viewport.y; + + if (g_ddraw->adjmouse) + { + g_ddraw->mouse.rc.right = g_ddraw->render.viewport.width + g_ddraw->render.viewport.x; + g_ddraw->mouse.rc.bottom = g_ddraw->render.viewport.height + g_ddraw->render.viewport.y; + } + if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main)) { g_ddraw->render.height++; diff --git a/src/mouse.c b/src/mouse.c index de48611..e55684b 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -15,23 +15,11 @@ void mouse_lock() if (g_hook_active && !g_ddraw->locked) { - RECT rc = { - g_ddraw->render.viewport.x, - g_ddraw->render.viewport.y, - g_ddraw->width + g_ddraw->render.viewport.x, - g_ddraw->height + g_ddraw->render.viewport.y, - }; - - if (g_ddraw->adjmouse) - { - rc.right = g_ddraw->render.viewport.width + g_ddraw->render.viewport.x; - rc.bottom = g_ddraw->render.viewport.height + g_ddraw->render.viewport.y; - } + RECT rc = { 0 }; + CopyRect(&rc, &g_ddraw->mouse.rc); real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); - rc.bottom -= (LONG)((g_ddraw->mouse_y_adjust * 2) * g_ddraw->render.scale_h); - int cur_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0); int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); @@ -39,11 +27,11 @@ void mouse_lock() { real_SetCursorPos( (int)(rc.left + (cur_x * g_ddraw->render.scale_w)), - (int)(rc.top + ((cur_y - g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); + (int)(rc.top + (cur_y * g_ddraw->render.scale_h))); } else { - real_SetCursorPos(rc.left + cur_x, rc.top + cur_y - g_ddraw->mouse_y_adjust); + real_SetCursorPos(rc.left + cur_x, rc.top + cur_y); } int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0); @@ -89,7 +77,7 @@ void mouse_unlock() real_SetCursorPos( (int)(rc.left + g_ddraw->render.viewport.x + (cur_x * g_ddraw->render.scale_w)), - (int)(rc.top + g_ddraw->render.viewport.y + ((cur_y + g_ddraw->mouse_y_adjust) * g_ddraw->render.scale_h))); + (int)(rc.top + g_ddraw->render.viewport.y + (cur_y * g_ddraw->render.scale_h))); } } diff --git a/src/winapi_hooks.c b/src/winapi_hooks.c index 33be65e..7231cf9 100644 --- a/src/winapi_hooks.c +++ b/src/winapi_hooks.c @@ -31,8 +31,8 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; - pt.x -= g_ddraw->render.viewport.x; - pt.y -= g_ddraw->render.viewport.y; + pt.x -= g_ddraw->mouse.x_adjust; + pt.y -= g_ddraw->mouse.y_adjust; if (pt.x < 0) { @@ -119,20 +119,47 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint) BOOL WINAPI fake_ClipCursor(const RECT* lpRect) { - if (lpRect) + if (g_ddraw) { - /* hack for 640x480 mode */ - if (lpRect->bottom == 400 && g_ddraw && g_ddraw->height == 480 && g_ddraw->cnchack) - { - g_ddraw->mouse_y_adjust = 40; + RECT dst_rc = { + 0, + 0, + g_ddraw->width, + g_ddraw->height + }; - if (g_ddraw->locked) - { - mouse_unlock(); - mouse_lock(); - } + if (lpRect) + CopyRect(&dst_rc, lpRect); + + if (g_ddraw->adjmouse) + { + dst_rc.left = (LONG)(roundf(dst_rc.left * g_ddraw->render.scale_w)); + dst_rc.top = (LONG)(roundf(dst_rc.top * g_ddraw->render.scale_h)); + dst_rc.bottom = (LONG)(roundf(dst_rc.bottom * g_ddraw->render.scale_h)); + dst_rc.right = (LONG)(roundf(dst_rc.right * g_ddraw->render.scale_w)); + } + + int max_width = g_ddraw->adjmouse ? g_ddraw->render.viewport.width : g_ddraw->width; + int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height; + + dst_rc.bottom = min(dst_rc.bottom, max_height); + dst_rc.right = min(dst_rc.right, max_width); + + OffsetRect( + &dst_rc, + g_ddraw->mouse.x_adjust, + g_ddraw->mouse.y_adjust); + + CopyRect(&g_ddraw->mouse.rc, &dst_rc); + + if (g_ddraw->locked) + { + real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&dst_rc, 2); + + return real_ClipCursor(&dst_rc); } } + return TRUE; } @@ -251,8 +278,8 @@ BOOL WINAPI fake_SetCursorPos(int X, int Y) pt.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h)); } - pt.x += g_ddraw->render.viewport.x; - pt.y += g_ddraw->render.viewport.y; + pt.x += g_ddraw->mouse.x_adjust; + pt.y += g_ddraw->mouse.y_adjust; } return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); @@ -358,7 +385,7 @@ LRESULT WINAPI fake_SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lPar y = (int)(roundf(y * g_ddraw->render.scale_h)); } - lParam = MAKELPARAM(x + g_ddraw->render.viewport.x, y + g_ddraw->render.viewport.y); + lParam = MAKELPARAM(x + g_ddraw->mouse.x_adjust, y + g_ddraw->mouse.y_adjust); } if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3)) diff --git a/src/wndproc.c b/src/wndproc.c index 0bd273e..b03ddd5 100644 --- a/src/wndproc.c +++ b/src/wndproc.c @@ -692,8 +692,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam return 0; } - int x = max(GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x, 0); - int y = max(GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y, 0); + int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0); + int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0); if (g_ddraw->adjmouse) {