diff --git a/data/language/english_uk.txt b/data/language/english_uk.txt index 7a0c6f46b7..7d2341055d 100644 --- a/data/language/english_uk.txt +++ b/data/language/english_uk.txt @@ -3788,3 +3788,5 @@ STR_5451 :Open cheats window STR_5452 :Toggle visibility of toolbars STR_5453 :Select another ride STR_5454 :Uncap FPS +STR_5458 :Rotate clockwise +STR_5459 :Rotate anti-clockwise diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c index d0382709c7..3c2e5d4ad3 100644 --- a/src/interface/keyboard_shortcut.c +++ b/src/interface/keyboard_shortcut.c @@ -157,17 +157,8 @@ static void shortcut_zoom_view_in() static void shortcut_rotate_view() { - rct_window *window; - - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_SCENARIO_EDITOR) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & SCREEN_FLAGS_TRACK_MANAGER)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_mouse_up_call(window, 4); - } - } - } + rct_window* w = window_get_main(); + window_rotate_camera(w, 1); } static void shortcut_rotate_construction_object() diff --git a/src/interface/window.c b/src/interface/window.c index a80ffa2238..06ee517216 100644 --- a/src/interface/window.c +++ b/src/interface/window.c @@ -1353,8 +1353,11 @@ void sub_688956() /** * * rct2: 0x0068881A + * direction can be used to alter the camera rotation: + * 1: clockwise + * -1: anti-clockwise */ -void window_rotate_camera(rct_window *w) +void window_rotate_camera(rct_window *w, int direction) { rct_viewport *viewport = w->viewport; if (viewport == NULL) @@ -1375,11 +1378,12 @@ void window_rotate_camera(rct_window *w) y = (viewport->view_height >> 1) + viewport->view_y; sub_689174(&x, &y, &z); - } else { + } + else { z = map_element_height(x, y); } - RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + 1) % 4; + RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) = (RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32) + direction) % 4; int new_x, new_y; center_2d_coordinates(x, y, z, &new_x, &new_y, viewport); diff --git a/src/interface/window.h b/src/interface/window.h index 6093d52ee1..6de725f398 100644 --- a/src/interface/window.h +++ b/src/interface/window.h @@ -496,7 +496,7 @@ rct_window *window_get_main(); void window_scroll_to_viewport(rct_window *w); void window_scroll_to_location(rct_window *w, int x, int y, int z); -void window_rotate_camera(rct_window *w); +void window_rotate_camera(rct_window *w, int direction); void window_zoom_set(rct_window *w, int zoomLevel); void window_zoom_in(rct_window *w); void window_zoom_out(rct_window *w); diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 768315e2a9..7424d11e93 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -83,6 +83,9 @@ enum { STR_PAUSE_GAME_TIP = 833, STR_DISC_AND_GAME_OPTIONS_TIP = 834, + STR_ROTATE_CLOCKWISE = 5458, + STR_ROTATE_ANTI_CLOCKWISE = 5459, + STR_ABOUT = 847, STR_ROLLERCOASTER_TYCOON_2 = 848, STR_VERSION_X = 849, diff --git a/src/title.c b/src/title.c index ad472457df..6fe269bd0b 100644 --- a/src/title.c +++ b/src/title.c @@ -300,7 +300,7 @@ static void title_do_next_script_opcode() w = window_get_main(); if (w != NULL) for (i = 0; i < script_operand; i++) - window_rotate_camera(w); + window_rotate_camera(w, 1); break; case TITLE_SCRIPT_ZOOM: script_operand = (*_currentScript++); diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index 45dce4a486..a880b07206 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -218,6 +218,8 @@ void top_toolbar_init_view_menu(rct_window *window, rct_widget *widget); void top_toolbar_view_menu_dropdown(short dropdownIndex); void top_toolbar_init_fastforward_menu(rct_window *window, rct_widget *widget); void top_toolbar_fastforward_menu_dropdown(short dropdownIndex); +void top_toolbar_init_rotate_menu(rct_window *window, rct_widget *widget); +void top_toolbar_rotate_menu_dropdown(short dropdownIndex); void top_toolbar_init_debug_menu(rct_window *window, rct_widget *widget); void top_toolbar_debug_menu_dropdown(short dropdownIndex); @@ -274,10 +276,6 @@ static void window_top_toolbar_mouseup() if ((mainWindow = window_get_main()) != NULL) window_zoom_in(mainWindow); break; - case WIDX_ROTATE: - if ((mainWindow = window_get_main()) != NULL) - window_rotate_camera(mainWindow); - break; case WIDX_CLEAR_SCENERY: toggle_clear_scenery_window(w, WIDX_CLEAR_SCENERY); break; @@ -422,6 +420,9 @@ static void window_top_toolbar_mousedown(int widgetIndex, rct_window*w, rct_widg case WIDX_FASTFORWARD: top_toolbar_init_fastforward_menu(w, widget); break; + case WIDX_ROTATE: + top_toolbar_init_rotate_menu(w, widget); + break; case WIDX_DEBUG: top_toolbar_init_debug_menu(w, widget); break; @@ -506,6 +507,9 @@ static void window_top_toolbar_dropdown() case WIDX_FASTFORWARD: top_toolbar_fastforward_menu_dropdown(dropdownIndex); break; + case WIDX_ROTATE: + top_toolbar_rotate_menu_dropdown(dropdownIndex); + break; case WIDX_DEBUG: top_toolbar_debug_menu_dropdown(dropdownIndex); break; @@ -2792,7 +2796,7 @@ void top_toolbar_init_fastforward_menu(rct_window* w, rct_widget* widget) { gDropdownItemsArgs[1] = 5143; gDropdownItemsArgs[2] = 5144; gDropdownItemsArgs[3] = 5145; - + window_dropdown_show_text( w->x + widget->left, @@ -2828,6 +2832,37 @@ void top_toolbar_fastforward_menu_dropdown(short dropdownIndex) { } } +void top_toolbar_init_rotate_menu(rct_window* w, rct_widget* widget) { + gDropdownItemsFormat[0] = STR_ROTATE_CLOCKWISE; + gDropdownItemsFormat[1] = STR_ROTATE_ANTI_CLOCKWISE; + + window_dropdown_show_text( + w->x + widget->left, + w->y + widget->top, + widget->bottom - widget->top + 1, + w->colours[1] | 0x80, + 0, + 2 + ); + + RCT2_GLOBAL(0x9DEBA2, uint16) = 0; +} + +void top_toolbar_rotate_menu_dropdown(short dropdownIndex) { + if (dropdownIndex == -1) dropdownIndex = RCT2_GLOBAL(0x9DEBA2, uint16); + rct_window* w = window_get_main(); + if (w) { + if (dropdownIndex == 0) { + window_rotate_camera(w, 1); + window_invalidate(w); + } + else if (dropdownIndex == 1){ + window_rotate_camera(w, -1); + window_invalidate(w); + } + } +} + void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) { gDropdownItemsFormat[0] = STR_DEBUG_DROPDOWN_CONSOLE; gDropdownItemsFormat[1] = STR_DEBUG_DROPDOWN_TILE_INSPECTOR;