diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj index 1613699264..95409e492a 100644 --- a/projects/openrct2.vcxproj +++ b/projects/openrct2.vcxproj @@ -60,6 +60,7 @@ + @@ -166,6 +167,7 @@ + diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters index 93ba75f423..b9706a8846 100644 --- a/projects/openrct2.vcxproj.filters +++ b/projects/openrct2.vcxproj.filters @@ -379,7 +379,6 @@ - Source\Drawing @@ -440,6 +439,10 @@ Source\Windows + + + Source\Interface + @@ -640,5 +643,8 @@ Source\Ride + + Source\Interface + \ No newline at end of file diff --git a/src/game.c b/src/game.c index eb9caadad4..cd2ebfa732 100644 --- a/src/game.c +++ b/src/game.c @@ -50,6 +50,16 @@ int gGameSpeed = 1; +void game_increase_game_speed() +{ + gGameSpeed = min(8, gGameSpeed + 1); +} + +void game_reduce_game_speed() +{ + gGameSpeed = max(1, gGameSpeed - 1); +} + /** * * rct2: 0x0066B5C0 (part of 0x0066B3E8) diff --git a/src/game.h b/src/game.h index 6a55485f62..d4772bfe91 100644 --- a/src/game.h +++ b/src/game.h @@ -86,6 +86,9 @@ typedef void (GAME_COMMAND_POINTER)(int* eax, int* ebx, int* ecx, int* edx, int* extern int gGameSpeed; +void game_increase_game_speed(); +void game_reduce_game_speed(); + void game_create_windows(); void game_update(); void game_logic_update(); diff --git a/src/input.c b/src/input.c index d7c82284e5..096ca1c0fd 100644 --- a/src/input.c +++ b/src/input.c @@ -25,6 +25,7 @@ #include "config.h" #include "game.h" #include "input.h" +#include "interface/keyboard_shortcut.h" #include "interface/viewport.h" #include "interface/widget.h" #include "interface/window.h" @@ -926,324 +927,6 @@ int get_next_key() return 0; } -void handle_shortcut_command(int shortcutIndex) -{ - rct_window *window; - - switch (shortcutIndex) { - case SHORTCUT_CLOSE_TOP_MOST_WINDOW: - window_close_top(); - break; - case SHORTCUT_CLOSE_ALL_FLOATING_WINDOWS: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) - window_close_all(); - else if (RCT2_GLOBAL(0x0141F570, uint8) == 1) - window_close_top(); - break; - case SHORTCUT_CANCEL_CONSTRUCTION_MODE: - window = window_find_by_class(WC_ERROR); - if (window != NULL) - window_close(window); - else if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) - tool_cancel(); - break; - case SHORTCUT_PAUSE_GAME: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 10)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 0, WE_MOUSE_UP); - } - } - break; - case SHORTCUT_ZOOM_VIEW_OUT: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 2, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_ZOOM_VIEW_IN: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 3, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_ROTATE_VIEW: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 4, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_ROTATE_CONSTRUCTION_OBJECT: - RCT2_CALLPROC_EBPSAFE(0x006E4182); - break; - case SHORTCUT_UNDERGROUND_VIEW_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_UNDERGROUND_INSIDE; - window_invalidate(window); - } - break; - case SHORTCUT_REMOVE_BASE_LAND_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_HIDE_BASE; - window_invalidate(window); - } - break; - case SHORTCUT_REMOVE_VERTICAL_LAND_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_HIDE_VERTICAL; - window_invalidate(window); - } - break; - case SHORTCUT_SEE_THROUGH_RIDES_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_RIDES; - window_invalidate(window); - } - break; - case SHORTCUT_SEE_THROUGH_SCENERY_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_SEETHROUGH_SCENERY; - window_invalidate(window); - } - break; - case SHORTCUT_INVISIBLE_SUPPORTS_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_SUPPORTS; - window_invalidate(window); - } - break; - case SHORTCUT_INVISIBLE_PEOPLE_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_INVISIBLE_PEEPS; - window_invalidate(window); - } - break; - case SHORTCUT_HEIGHT_MARKS_ON_LAND_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_LAND_HEIGHTS; - window_invalidate(window); - } - break; - case SHORTCUT_HEIGHT_MARKS_ON_RIDE_TRACKS_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_TRACK_HEIGHTS; - window_invalidate(window); - } - break; - case SHORTCUT_HEIGHT_MARKS_ON_PATHS_TOGGLE: - window = window_get_main(); - if (window != NULL) { - window->viewport->flags ^= VIEWPORT_FLAG_PATH_HEIGHTS; - window_invalidate(window); - } - break; - case SHORTCUT_ADJUST_LAND: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 7, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_ADJUST_WATER: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 8, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_BUILD_SCENERY: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 9, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_BUILD_PATHS: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 10, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_BUILD_NEW_RIDE: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 11, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_SHOW_FINANCIAL_INFORMATION: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) - if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) - window_finances_open(); - break; - case SHORTCUT_SHOW_RESEARCH_INFORMATION: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { - // Open new ride window - RCT2_CALLPROC_EBPSAFE(0x006B3CFF); - window = window_find_by_class(WC_CONSTRUCT_RIDE); - if (window != NULL) - RCT2_CALLPROC_WE_MOUSE_DOWN(window->event_handlers[WE_MOUSE_DOWN], 10, window, NULL); - } - break; - case SHORTCUT_SHOW_RIDES_LIST: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 12, WE_MOUSE_UP); - } - } - break; - case SHORTCUT_SHOW_PARK_INFORMATION: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 13, WE_MOUSE_UP); - } - } - break; - case SHORTCUT_SHOW_GUEST_LIST: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 15, WE_MOUSE_UP); - } - } - break; - case SHORTCUT_SHOW_STAFF_LIST: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 14, WE_MOUSE_UP); - } - } - break; - case SHORTCUT_SHOW_RECENT_MESSAGES: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) - window_news_open(); - break; - case SHORTCUT_SHOW_MAP: - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { - if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { - window = window_find_by_class(WC_TOP_TOOLBAR); - if (window != NULL) { - window_invalidate(window); - window_event_helper(window, 6, WE_MOUSE_UP); - } - } - } - break; - case SHORTCUT_SCREENSHOT: - RCT2_CALLPROC_EBPSAFE(0x006E4034); // set screenshot countdown to 2 - break; - - // New - case SHORTCUT_REDUCE_GAME_SPEED: - game_reduce_game_speed(); - break; - case SHORTCUT_INCREASE_GAME_SPEED: - game_increase_game_speed(); - break; - } -} - -void game_increase_game_speed() -{ - gGameSpeed = min(8, gGameSpeed + 1); -} - -void game_reduce_game_speed() -{ - gGameSpeed = max(1, gGameSpeed - 1); -} - -/** - * - * rct2: 0x006E3E68 - */ -void handle_shortcut(int key) -{ - int i; - for (i = 0; i < SHORTCUT_COUNT; i++) { - if (key == gShortcutKeys[i]) { - handle_shortcut_command(i); - break; - } - } -} - -/** - * - * rct2: 0x006E3E91 - */ -void set_shortcut(int key) -{ - int i; - - // Unmap shortcut that already uses this key - for (i = 0; i < 32; i++) { - if (key == gShortcutKeys[i]) { - gShortcutKeys[i] = 0xFFFF; - break; - } - } - - // Map shortcut to this key - gShortcutKeys[RCT2_GLOBAL(0x009DE511, uint8)] = key; - window_close_by_class(WC_CHANGE_KEYBOARD_SHORTCUT); - window_invalidate_by_class(WC_KEYBOARD_SHORTCUT_LIST); - config_save(); -} - /** * * rct2: 0x006E3B43 @@ -1281,7 +964,7 @@ void game_handle_keyboard_input() w = window_find_by_class(WC_CHANGE_KEYBOARD_SHORTCUT); if (w != NULL) - set_shortcut(key); + keyboard_shortcut_set(key); else if (RCT2_GLOBAL(RCT2_ADDRESS_ON_TUTORIAL, uint8) == 1) tutorial_stop(); else{ @@ -1290,7 +973,7 @@ void game_handle_keyboard_input() ((void(*)(int, rct_window*))w->event_handlers[WE_TEXT_INPUT])(key,w); } else{ - handle_shortcut(key); + keyboard_shortcut_handle(key); } } diff --git a/src/input.h b/src/input.h index 0b6c63960c..94ea8fc8e7 100644 --- a/src/input.h +++ b/src/input.h @@ -46,7 +46,6 @@ enum { void game_handle_input(); void game_handle_keyboard_input(); -void handle_shortcut_command(int shortcutIndex); void store_mouse_input(int state); diff --git a/src/interface/keyboard_shortcut.c b/src/interface/keyboard_shortcut.c new file mode 100644 index 0000000000..a4b15ce463 --- /dev/null +++ b/src/interface/keyboard_shortcut.c @@ -0,0 +1,447 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#include "../addresses.h" +#include "../config.h" +#include "../game.h" +#include "../input.h" +#include "keyboard_shortcut.h" +#include "viewport.h" +#include "window.h" + +typedef void (*shortcut_action)(); + +static const shortcut_action shortcut_table[SHORTCUT_COUNT]; + +/** + * + * rct2: 0x006E3E91 + */ +void keyboard_shortcut_set(int key) +{ + int i; + + // Unmap shortcut that already uses this key + for (i = 0; i < 32; i++) { + if (key == gShortcutKeys[i]) { + gShortcutKeys[i] = 0xFFFF; + break; + } + } + + // Map shortcut to this key + gShortcutKeys[RCT2_GLOBAL(0x009DE511, uint8)] = key; + window_close_by_class(WC_CHANGE_KEYBOARD_SHORTCUT); + window_invalidate_by_class(WC_KEYBOARD_SHORTCUT_LIST); + config_save(); +} + +/** + * + * rct2: 0x006E3E68 + */ +void keyboard_shortcut_handle(int key) +{ + int i; + for (i = 0; i < SHORTCUT_COUNT; i++) { + if (key == gShortcutKeys[i]) { + keyboard_shortcut_handle_command(i); + break; + } + } +} + +void keyboard_shortcut_handle_command(int shortcutIndex) +{ + if (shortcutIndex >= 0 && shortcutIndex < countof(shortcut_table)) + shortcut_table[shortcutIndex](); +} + +#pragma region Shortcut Commands + +static void toggle_view_flag(int viewportFlag) +{ + rct_window *window; + + window = window_get_main(); + if (window != NULL) { + window->viewport->flags ^= viewportFlag; + window_invalidate(window); + } +} + +static void shortcut_close_top_most_window() +{ + window_close_top(); +} + +static void shortcut_close_all_floating_windows() +{ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2)) + window_close_all(); + else if (RCT2_GLOBAL(0x0141F570, uint8) == 1) + window_close_top(); +} + +static void shortcut_cancel_construction_mode() +{ + rct_window *window; + + window = window_find_by_class(WC_ERROR); + if (window != NULL) + window_close(window); + else if (RCT2_GLOBAL(RCT2_ADDRESS_INPUT_FLAGS, uint32) & INPUT_FLAG_TOOL_ACTIVE) + tool_cancel(); +} + +static void shortcut_pause_game() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 10)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 0, WE_MOUSE_UP); + } + } +} + +static void shortcut_zoom_view_out() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 2, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_zoom_view_in() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 3, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_rotate_view() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 8)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 4, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_rotate_construction_object() +{ + RCT2_CALLPROC_EBPSAFE(0x006E4182); +} + +static void shortcut_underground_view_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_UNDERGROUND_INSIDE); +} + +static void shortcut_remove_base_land_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_HIDE_BASE); +} + +static void shortcut_remove_vertical_land_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_HIDE_VERTICAL); +} + +static void shortcut_see_through_rides_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_SEETHROUGH_RIDES); +} + +static void shortcut_see_through_scenery_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_SEETHROUGH_SCENERY); +} + +static void shortcut_invisible_supports_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_INVISIBLE_SUPPORTS); +} + +static void shortcut_invisible_people_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_INVISIBLE_PEEPS); +} + +static void shortcut_height_marks_on_land_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_LAND_HEIGHTS); +} + +static void shortcut_height_marks_on_ride_tracks_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_TRACK_HEIGHTS); +} + +static void shortcut_height_marks_on_paths_toggle() +{ + toggle_view_flag(VIEWPORT_FLAG_PATH_HEIGHTS); +} + +static void shortcut_adjust_land() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 7, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_adjust_water() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 8, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_build_scenery() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 9, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_build_paths() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 10, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_build_new_ride() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 11, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_show_financial_information() +{ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)) + window_finances_open(); +} + +static void shortcut_show_research_information() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { + // Open new ride window + RCT2_CALLPROC_EBPSAFE(0x006B3CFF); + window = window_find_by_class(WC_CONSTRUCT_RIDE); + if (window != NULL) + RCT2_CALLPROC_WE_MOUSE_DOWN(window->event_handlers[WE_MOUSE_DOWN], 10, window, NULL); + } +} + +static void shortcut_show_rides_list() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 12, WE_MOUSE_UP); + } + } +} + +static void shortcut_show_park_information() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 13, WE_MOUSE_UP); + } + } +} + +static void shortcut_show_guest_list() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 15, WE_MOUSE_UP); + } + } +} + +static void shortcut_show_staff_list() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 14, WE_MOUSE_UP); + } + } +} + +static void shortcut_show_recent_messages() +{ + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0E)) + window_news_open(); +} + +static void shortcut_show_map() +{ + rct_window *window; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 2) || RCT2_GLOBAL(0x0141F570, uint8) == 1) { + if (!(RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) & 0x0C)) { + window = window_find_by_class(WC_TOP_TOOLBAR); + if (window != NULL) { + window_invalidate(window); + window_event_helper(window, 6, WE_MOUSE_UP); + } + } + } +} + +static void shortcut_screenshot() +{ + RCT2_CALLPROC_EBPSAFE(0x006E4034); // set screenshot countdown to 2 +} + +static void shortcut_reduce_game_speed() +{ + game_reduce_game_speed(); +} + +static void shortcut_increase_game_speed() +{ + game_increase_game_speed(); +} + +static const shortcut_action shortcut_table[SHORTCUT_COUNT] = { + shortcut_close_top_most_window, + shortcut_close_all_floating_windows, + shortcut_cancel_construction_mode, + shortcut_pause_game, + shortcut_zoom_view_out, + shortcut_zoom_view_in, + shortcut_rotate_view, + shortcut_rotate_construction_object, + shortcut_underground_view_toggle, + shortcut_remove_base_land_toggle, + shortcut_remove_vertical_land_toggle, + shortcut_see_through_rides_toggle, + shortcut_see_through_scenery_toggle, + shortcut_invisible_supports_toggle, + shortcut_invisible_people_toggle, + shortcut_height_marks_on_land_toggle, + shortcut_height_marks_on_ride_tracks_toggle, + shortcut_height_marks_on_paths_toggle, + shortcut_adjust_land, + shortcut_adjust_water, + shortcut_build_scenery, + shortcut_build_paths, + shortcut_build_new_ride, + shortcut_show_financial_information, + shortcut_show_research_information, + shortcut_show_rides_list, + shortcut_show_park_information, + shortcut_show_guest_list, + shortcut_show_staff_list, + shortcut_show_recent_messages, + shortcut_show_map, + shortcut_screenshot, + shortcut_reduce_game_speed, + shortcut_increase_game_speed +}; + +#pragma endregion diff --git a/src/interface/keyboard_shortcut.h b/src/interface/keyboard_shortcut.h new file mode 100644 index 0000000000..e735a85592 --- /dev/null +++ b/src/interface/keyboard_shortcut.h @@ -0,0 +1,28 @@ +/***************************************************************************** + * Copyright (c) 2014 Ted John + * OpenRCT2, an open source clone of Roller Coaster Tycoon 2. + * + * This file is part of OpenRCT2. + * + * OpenRCT2 is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + *****************************************************************************/ + +#ifndef _INTERFACE_KEYBOARD_SHORTCUT_H_ +#define _INTERFACE_KEYBOARD_SHORTCUT_H_ + +void keyboard_shortcut_set(int key); +void keyboard_shortcut_handle(int key); +void keyboard_shortcut_handle_command(int shortcutIndex); + +#endif \ No newline at end of file diff --git a/src/platform/osinterface.c b/src/platform/osinterface.c index 3a64ca9abe..35a7e83a41 100644 --- a/src/platform/osinterface.c +++ b/src/platform/osinterface.c @@ -30,6 +30,7 @@ #include "../cursors.h" #include "../drawing/drawing.h" #include "../input.h" +#include "../interface/keyboard_shortcut.h" #include "../interface/screenshot.h" #include "../interface/window.h" #include "osinterface.h" @@ -467,10 +468,10 @@ void osinterface_process_messages() int gesturePixels = (int)(_gestureRadius * RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16)); if (gesturePixels > tolerance) { _gestureRadius = 0; - handle_shortcut_command(SHORTCUT_ZOOM_VIEW_IN); + keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_IN); } else if (gesturePixels < -tolerance) { _gestureRadius = 0; - handle_shortcut_command(SHORTCUT_ZOOM_VIEW_OUT); + keyboard_shortcut_handle_command(SHORTCUT_ZOOM_VIEW_OUT); } } break;