diff --git a/src/input.c b/src/input.c index 2cdefc3e61..0116e026f6 100644 --- a/src/input.c +++ b/src/input.c @@ -62,8 +62,6 @@ static uint8 _mouseInputQueueReadIndex = 0; static uint8 _mouseInputQueueWriteIndex = 0; static uint32 _ticksSinceDragStart; -static sint32 _dragX; -static sint32 _dragY; static widget_ref _dragWidget; static uint8 _dragScrollIndex; static sint32 _originalWindowWidth; @@ -73,6 +71,9 @@ uint8 gInputState; uint8 gInputFlags; uint8 gInputPlaceObjectModifier; +sint32 gInputDragLastX; +sint32 gInputDragLastY; + widget_ref gHoverWidget; widget_ref gPressedWidget; @@ -207,8 +208,8 @@ static rct_mouse_data *get_mouse_input() static void input_scroll_drag_begin(int x, int y, rct_window* w, rct_widget* widget, int widgetIndex) { gInputState = INPUT_STATE_SCROLL_RIGHT; - _dragX = x; - _dragY = y; + gInputDragLastX = x; + gInputDragLastY = y; _dragWidget.window_classification = w->classification; _dragWidget.window_number = w->number; _dragWidget.widget_index = widgetIndex; @@ -231,8 +232,8 @@ static void input_scroll_drag_continue(int x, int y, rct_window* w) rct_scroll* scroll = &w->scrolls[scrollIndex]; int dx, dy; - dx = x - _dragX; - dy = y - _dragY; + dx = x - gInputDragLastX; + dy = y - gInputDragLastY; if (scroll->flags & HSCROLLBAR_VISIBLE) { sint16 size = widget->right - widget->left - 1; @@ -252,7 +253,7 @@ static void input_scroll_drag_continue(int x, int y, rct_window* w) widget_scroll_update_thumbs(w, widgetIndex); window_invalidate_by_number(w->classification, w->number); - platform_set_cursor_position(_dragX, _dragY); + platform_set_cursor_position(gInputDragLastX, gInputDragLastY); } /** @@ -340,7 +341,7 @@ static void game_handle_input_mouse(int x, int y, int state) if (w == NULL) { gInputState = INPUT_STATE_RESET; } else { - input_window_position_continue(w, _dragX, _dragY, x, y); + input_window_position_continue(w, gInputDragLastX, gInputDragLastY, x, y); if (state == MOUSE_STATE_LEFT_RELEASE) { input_window_position_end(w, x, y); } @@ -443,8 +444,8 @@ static void game_handle_input_mouse(int x, int y, int state) void input_window_position_begin(rct_window *w, int widgetIndex, int x, int y) { gInputState = INPUT_STATE_POSITIONING_WINDOW; - _dragX = x - w->x; - _dragY = y - w->y; + gInputDragLastX = x - w->x; + gInputDragLastY = y - w->y; _dragWidget.window_classification = w->classification; _dragWidget.window_number = w->number; _dragWidget.widget_index = widgetIndex; @@ -469,8 +470,8 @@ static void input_window_position_end(rct_window *w, int x, int y) static void input_window_resize_begin(rct_window *w, int widgetIndex, int x, int y) { gInputState = INPUT_STATE_RESIZING; - _dragX = x; - _dragY = y; + gInputDragLastX = x; + gInputDragLastY = y; _dragWidget.window_classification = w->classification; _dragWidget.window_number = w->number; _dragWidget.widget_index = widgetIndex; @@ -483,8 +484,8 @@ static void input_window_resize_continue(rct_window *w, int x, int y) int dx, dy, targetWidth, targetHeight; if (y < RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, uint16) - 2) { - dx = x - _dragX; - dy = y - _dragY; + dx = x - gInputDragLastX; + dy = y - gInputDragLastY; targetWidth = _originalWindowWidth + dx; targetHeight = _originalWindowHeight + dy; @@ -514,7 +515,7 @@ static void input_viewport_drag_begin(rct_window *w, int x, int y) _dragWidget.window_classification = w->classification; _dragWidget.window_number = w->number; _ticksSinceDragStart = 0; - platform_get_cursor_position(&_dragX, &_dragY); + platform_get_cursor_position(&gInputDragLastX, &gInputDragLastY); platform_hide_cursor(); // gInputFlags |= INPUT_FLAG_5; @@ -528,8 +529,8 @@ static void input_viewport_drag_continue() platform_get_cursor_position(&newDragX, &newDragY); - dx = newDragX - _dragX; - dy = newDragY - _dragY; + dx = newDragX - gInputDragLastX; + dy = newDragY - gInputDragLastY; w = window_find_by_number(_dragWidget.window_classification, _dragWidget.window_number); assert(w != NULL); @@ -558,7 +559,7 @@ static void input_viewport_drag_continue() } } - platform_set_cursor_position(_dragX, _dragY); + platform_set_cursor_position(gInputDragLastX, gInputDragLastY); } static void input_viewport_drag_end() @@ -1002,8 +1003,8 @@ static void input_widget_left(int x, int y, rct_window *w, int widgetIndex) break; case WWT_VIEWPORT: gInputState = INPUT_STATE_VIEWPORT_LEFT; - _dragX = x; - _dragY = y; + gInputDragLastX = x; + gInputDragLastY = y; _dragWidget.window_classification = windowClass; _dragWidget.window_number = windowNumber; if (gInputFlags & INPUT_FLAG_TOOL_ACTIVE) { diff --git a/src/input.h b/src/input.h index b6d442761e..b02baa6377 100644 --- a/src/input.h +++ b/src/input.h @@ -76,6 +76,9 @@ extern uint8 gInputState; extern uint8 gInputFlags; extern uint8 gInputPlaceObjectModifier; +extern sint32 gInputDragLastX; +extern sint32 gInputDragLastY; + extern widget_ref gHoverWidget; extern widget_ref gPressedWidget; diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index a7a20d23c1..b29b17680f 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -2638,27 +2638,21 @@ void window_top_toolbar_land_tool_drag(short x, short y) sint16 tile_height = -16 / (1 << viewport->zoom); - int y_diff = y - RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16); - + int y_diff = y - gInputDragLastY; if (y_diff <= tile_height) { - RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) += tile_height; + gInputDragLastY += tile_height; selection_raise_land(GAME_COMMAND_FLAG_APPLY); RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) = MONEY32_UNDEFINED; RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, uint32) = MONEY32_UNDEFINED; - return; - } - - if (y_diff >= -tile_height) { - RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) -= tile_height; + } else if (y_diff >= -tile_height) { + gInputDragLastY -= tile_height; selection_lower_land(GAME_COMMAND_FLAG_APPLY); RCT2_GLOBAL(RCT2_ADDRESS_LAND_RAISE_COST, uint32) = MONEY32_UNDEFINED; RCT2_GLOBAL(RCT2_ADDRESS_LAND_LOWER_COST, uint32) = MONEY32_UNDEFINED; - - return; } } @@ -2684,10 +2678,10 @@ void window_top_toolbar_water_tool_drag(short x, short y) sint16 dx = 0xFFF0; dx >>= viewport->zoom; - y -= RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16); + y -= gInputDragLastY; if (y <= dx) { - RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) += dx; + gInputDragLastY += dx; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_RAISE_WATER_LEVEL_HERE; @@ -2709,7 +2703,7 @@ void window_top_toolbar_water_tool_drag(short x, short y) dx = -dx; if (y >= dx) { - RCT2_GLOBAL(RCT2_ADDRESS_CURSOR_DRAG_LAST_Y, uint16) += dx; + gInputDragLastY += dx; RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = STR_CANT_LOWER_WATER_LEVEL_HERE;