1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-24 17:49:52 +01:00

fix ClipCursor for ja2

This commit is contained in:
FunkyFr3sh 2021-09-19 03:04:45 +02:00
parent 447e0ca2c9
commit 09f57918cb
6 changed files with 70 additions and 40 deletions

View File

@ -97,6 +97,13 @@ typedef struct CNCDDRAW
float unscale_h; float unscale_h;
} render; } render;
struct
{
int y_adjust;
int x_adjust;
RECT rc;
} mouse;
HWND hwnd; HWND hwnd;
WNDPROC wndproc; WNDPROC wndproc;
struct { DWORD x; DWORD y; } cursor; struct { DWORD x; DWORD y; } cursor;
@ -131,7 +138,6 @@ typedef struct CNCDDRAW
int resolutions; int resolutions;
BOOL armadahack; BOOL armadahack;
BOOL tshack; BOOL tshack;
BOOL cnchack;
int maxgameticks; int maxgameticks;
BOOL alt_key_down; BOOL alt_key_down;
BOOL releasealt; BOOL releasealt;
@ -140,7 +146,6 @@ typedef struct CNCDDRAW
BOOL bnet_was_upscaled; BOOL bnet_was_upscaled;
RECT bnet_win_rect; RECT bnet_win_rect;
POINT bnet_pos; POINT bnet_pos;
int mouse_y_adjust;
void* last_freed_palette; /* Dungeon Keeper hack */ void* last_freed_palette; /* Dungeon Keeper hack */
BOOL child_window_exists; BOOL child_window_exists;
BOOL got_child_windows; BOOL got_child_windows;

View File

@ -46,7 +46,6 @@ void cfg_load()
g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE); g_ddraw->armadahack = cfg_get_bool("armadahack", FALSE);
g_ddraw->tshack = cfg_get_bool("tshack", 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.right = cfg_get_int("width", 0);
g_config.window_rect.bottom = cfg_get_int("height", 0); g_config.window_rect.bottom = cfg_get_int("height", 0);
@ -445,7 +444,6 @@ static void cfg_create_ini()
"maxgameticks=120\n" "maxgameticks=120\n"
"maxfps=60\n" "maxfps=60\n"
"minfps=-1\n" "minfps=-1\n"
"cnchack=true\n"
"\n" "\n"
"; Command & Conquer: Red Alert - CnCNet\n" "; Command & Conquer: Red Alert - CnCNet\n"
"[ra95-spawn]\n" "[ra95-spawn]\n"
@ -456,14 +454,12 @@ static void cfg_create_ini()
"maxgameticks=120\n" "maxgameticks=120\n"
"maxfps=60\n" "maxfps=60\n"
"minfps=-1\n" "minfps=-1\n"
"cnchack=true\n"
"\n" "\n"
"; Command & Conquer: Red Alert\n" "; Command & Conquer: Red Alert\n"
"[ra95_Mod-Launcher]\n" "[ra95_Mod-Launcher]\n"
"maxgameticks=120\n" "maxgameticks=120\n"
"maxfps=60\n" "maxfps=60\n"
"minfps=-1\n" "minfps=-1\n"
"cnchack=true\n"
"\n" "\n"
"; Command & Conquer: Red Alert\n" "; Command & Conquer: Red Alert\n"
"[ra95p]\n" "[ra95p]\n"

View File

@ -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_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->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)) if (nonexclusive || (g_ddraw->nonexclusive && !g_ddraw->windowed && g_ddraw->renderer == ogl_render_main))
{ {
g_ddraw->render.height++; g_ddraw->render.height++;

View File

@ -15,23 +15,11 @@ void mouse_lock()
if (g_hook_active && !g_ddraw->locked) if (g_hook_active && !g_ddraw->locked)
{ {
RECT rc = { RECT rc = { 0 };
g_ddraw->render.viewport.x, CopyRect(&rc, &g_ddraw->mouse.rc);
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;
}
real_MapWindowPoints(g_ddraw->hwnd, HWND_DESKTOP, (LPPOINT)&rc, 2); 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_x = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.x, 0);
int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0); int cur_y = InterlockedExchangeAdd((LONG*)&g_ddraw->cursor.y, 0);
@ -39,11 +27,11 @@ void mouse_lock()
{ {
real_SetCursorPos( real_SetCursorPos(
(int)(rc.left + (cur_x * g_ddraw->render.scale_w)), (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 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); int game_count = InterlockedExchangeAdd((LONG*)&g_ddraw->show_cursor_count, 0);
@ -89,7 +77,7 @@ void mouse_unlock()
real_SetCursorPos( real_SetCursorPos(
(int)(rc.left + g_ddraw->render.viewport.x + (cur_x * g_ddraw->render.scale_w)), (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)));
} }
} }

View File

@ -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_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; int max_height = g_ddraw->adjmouse ? g_ddraw->render.viewport.height : g_ddraw->height;
pt.x -= g_ddraw->render.viewport.x; pt.x -= g_ddraw->mouse.x_adjust;
pt.y -= g_ddraw->render.viewport.y; pt.y -= g_ddraw->mouse.y_adjust;
if (pt.x < 0) if (pt.x < 0)
{ {
@ -119,20 +119,47 @@ BOOL WINAPI fake_GetCursorPos(LPPOINT lpPoint)
BOOL WINAPI fake_ClipCursor(const RECT* lpRect) BOOL WINAPI fake_ClipCursor(const RECT* lpRect)
{ {
if (lpRect) if (g_ddraw)
{ {
/* hack for 640x480 mode */ RECT dst_rc = {
if (lpRect->bottom == 400 && g_ddraw && g_ddraw->height == 480 && g_ddraw->cnchack) 0,
{ 0,
g_ddraw->mouse_y_adjust = 40; g_ddraw->width,
g_ddraw->height
};
if (g_ddraw->locked) if (lpRect)
{ CopyRect(&dst_rc, lpRect);
mouse_unlock();
mouse_lock(); 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; 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.y = (LONG)(roundf(pt.y * g_ddraw->render.scale_h));
} }
pt.x += g_ddraw->render.viewport.x; pt.x += g_ddraw->mouse.x_adjust;
pt.y += g_ddraw->render.viewport.y; pt.y += g_ddraw->mouse.y_adjust;
} }
return g_ddraw && real_ClientToScreen(g_ddraw->hwnd, &pt) && real_SetCursorPos(pt.x, pt.y); 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)); 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)) if (g_ddraw && g_ddraw->hwnd == hWnd && Msg == WM_SIZE && (g_hook_method != 2 && g_hook_method != 3))

View File

@ -692,8 +692,8 @@ LRESULT CALLBACK fake_WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
return 0; return 0;
} }
int x = max(GET_X_LPARAM(lParam) - g_ddraw->render.viewport.x, 0); int x = max(GET_X_LPARAM(lParam) - g_ddraw->mouse.x_adjust, 0);
int y = max(GET_Y_LPARAM(lParam) - g_ddraw->render.viewport.y, 0); int y = max(GET_Y_LPARAM(lParam) - g_ddraw->mouse.y_adjust, 0);
if (g_ddraw->adjmouse) if (g_ddraw->adjmouse)
{ {