diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index f9f7206d12..a3e0f05f6c 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -4170,8 +4170,9 @@ STR_5858 :{SMALLFONT}{BLACK}Use GPU for displaying instead of CPU. Improves c STR_5859 :{SMALLFONT}{BLACK}Enables frame tweening for visually{NEWLINE}smoother gameplay. When disabled,{NEWLINE}the game will run at 40 FPS. STR_5860 :Toggle original/decompiled track drawing STR_5861 :Key verification failure. -STR_5862 :Allow joining with known keys only. -STR_5863 :This host only allows known keys to connect. +STR_5862 :Block unknown players. +STR_5863 :{SMALLFONT}{BLACK}Only allow players with known keys to join. +STR_5864 :This server only allows whitelisted players to connect. ############# # Scenarios # diff --git a/src/localisation/string_ids.h b/src/localisation/string_ids.h index 29c24c3e3b..9853314944 100644 --- a/src/localisation/string_ids.h +++ b/src/localisation/string_ids.h @@ -2635,7 +2635,8 @@ enum { STR_MULTIPLAYER_VERIFICATION_FAILURE = 5861, STR_ALLOW_KNOWN_KEYS_ONLY = 5862, - STR_MULTIPLAYER_UNKNOWN_KEY_DISALLOWED = 5863, + STR_ALLOW_KNOWN_KEYS_ONLY_TIP = 5863, + STR_MULTIPLAYER_UNKNOWN_KEY_DISALLOWED = 5864, // Have to include resource strings (from scenarios and objects) for the time being now that language is partially working STR_COUNT = 32768 diff --git a/src/sprites.h b/src/sprites.h index 782c9c998c..4df75f8831 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -98,6 +98,11 @@ enum { SPR_PARK_ENTRANCE = 5197, + SPR_TAB_GEARS_0 = 5201, + SPR_TAB_GEARS_1 = SPR_TAB_GEARS_0 + 1, + SPR_TAB_GEARS_2 = SPR_TAB_GEARS_0 + 2, + SPR_TAB_GEARS_3 = SPR_TAB_GEARS_0 + 3, + SPR_TAB_GRAPH_0 = 5245, SPR_TAB_GRAPH_1 = SPR_TAB_GRAPH_0 + 1, SPR_TAB_GRAPH_2 = SPR_TAB_GRAPH_0 + 2, diff --git a/src/windows/multiplayer.c b/src/windows/multiplayer.c index 92cd552ea0..4277a139a3 100644 --- a/src/windows/multiplayer.c +++ b/src/windows/multiplayer.c @@ -14,6 +14,7 @@ *****************************************************************************/ #pragma endregion +#include "../config.h" #include "../interface/themes.h" #include "../interface/widget.h" #include "../interface/window.h" @@ -25,7 +26,8 @@ enum { WINDOW_MULTIPLAYER_PAGE_PLAYERS, - WINDOW_MULTIPLAYER_PAGE_GROUPS + WINDOW_MULTIPLAYER_PAGE_GROUPS, + WINDOW_MULTIPLAYER_PAGE_OPTIONS }; enum WINDOW_MULTIPLAYER_WIDGET_IDX { @@ -35,10 +37,11 @@ enum WINDOW_MULTIPLAYER_WIDGET_IDX { WIDX_CONTENT_PANEL, WIDX_TAB1, WIDX_TAB2, + WIDX_TAB3, - WIDX_LIST = 6, + WIDX_LIST = 7, - WIDX_DEFAULT_GROUP = 6, + WIDX_DEFAULT_GROUP = 7, WIDX_DEFAULT_GROUP_DROPDOWN, WIDX_ADD_GROUP, WIDX_REMOVE_GROUP, @@ -46,52 +49,60 @@ enum WINDOW_MULTIPLAYER_WIDGET_IDX { WIDX_SELECTED_GROUP, WIDX_SELECTED_GROUP_DROPDOWN, WIDX_PERMISSIONS_LIST, + + WIDX_KNOWN_KEYS_ONLY_CHECKBOX = 7, }; +#define MAIN_MULTIPLAYER_WIDGETS \ + { WWT_FRAME, 0, 0, 339, 0, 239, 0x0FFFFFFFF, STR_NONE }, /* panel / background */ \ + { WWT_CAPTION, 0, 1, 338, 1, 14, STR_MULTIPLAYER, STR_WINDOW_TITLE_TIP }, /* title bar */ \ + { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, /* close x button */ \ + { WWT_RESIZE, 1, 0, 339, 43, 239, 0x0FFFFFFFF, STR_NONE }, /* content panel */ \ + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_PLAYERS_TIP }, /* tab */ \ + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_GROUPS_TIP }, /* tab */ \ + { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_OPTIONS_TIP } /* tab */ \ + static rct_widget window_multiplayer_players_widgets[] = { - { WWT_FRAME, 0, 0, 339, 0, 239, 0x0FFFFFFFF, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 1, 338, 1, 14, STR_MULTIPLAYER, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_RESIZE, 1, 0, 339, 43, 239, 0x0FFFFFFFF, STR_NONE }, // content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_PLAYERS_TIP }, // tab - { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_GROUPS_TIP }, // tab - { WWT_SCROLL, 1, 3, 336, 60, 236, 2, STR_NONE }, // list + MAIN_MULTIPLAYER_WIDGETS, + { WWT_SCROLL, 1, 3, 336, 60, 236, 2, STR_NONE }, // list { WIDGETS_END } }; static rct_widget window_multiplayer_groups_widgets[] = { - { WWT_FRAME, 0, 0, 339, 0, 239, 0x0FFFFFFFF, STR_NONE }, // panel / background - { WWT_CAPTION, 0, 1, 338, 1, 14, STR_MULTIPLAYER, STR_WINDOW_TITLE_TIP }, // title bar - { WWT_CLOSEBOX, 0, 327, 337, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP }, // close x button - { WWT_RESIZE, 1, 0, 339, 43, 239, 0x0FFFFFFFF, STR_NONE }, // content panel - { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_PLAYERS_TIP }, // tab - { WWT_TAB, 1, 3, 33, 17, 43, 0x02000144E, STR_GROUPS_TIP }, // tab - { WWT_DROPDOWN, 1, 141, 315, 46, 57, 0x0FFFFFFFF, STR_NONE }, // default group - { WWT_DROPDOWN_BUTTON, 1, 305, 315, 47, 56, 876, STR_NONE }, // - { WWT_DROPDOWN_BUTTON, 1, 11, 102, 65, 76, STR_ADD_GROUP, STR_NONE }, // add group button - { WWT_DROPDOWN_BUTTON, 1, 113, 204, 65, 76, STR_REMOVE_GROUP, STR_NONE }, // remove group button - { WWT_DROPDOWN_BUTTON, 1, 215, 306, 65, 76, STR_RENAME_GROUP, STR_NONE }, // rename group button - { WWT_DROPDOWN, 1, 72, 246, 80, 91, 0x0FFFFFFFF, STR_NONE }, // selected group - { WWT_DROPDOWN_BUTTON, 1, 236, 246, 81, 90, 876, STR_NONE }, // - { WWT_SCROLL, 1, 3, 316, 94, 300, 2, STR_NONE }, // permissions list + MAIN_MULTIPLAYER_WIDGETS, + { WWT_DROPDOWN, 1, 141, 315, 46, 57, 0x0FFFFFFFF, STR_NONE }, // default group + { WWT_DROPDOWN_BUTTON, 1, 305, 315, 47, 56, 876, STR_NONE }, // + { WWT_DROPDOWN_BUTTON, 1, 11, 102, 65, 76, STR_ADD_GROUP, STR_NONE }, // add group button + { WWT_DROPDOWN_BUTTON, 1, 113, 204, 65, 76, STR_REMOVE_GROUP, STR_NONE }, // remove group button + { WWT_DROPDOWN_BUTTON, 1, 215, 306, 65, 76, STR_RENAME_GROUP, STR_NONE }, // rename group button + { WWT_DROPDOWN, 1, 72, 246, 80, 91, 0x0FFFFFFFF, STR_NONE }, // selected group + { WWT_DROPDOWN_BUTTON, 1, 236, 246, 81, 90, 876, STR_NONE }, // + { WWT_SCROLL, 1, 3, 316, 94, 300, 2, STR_NONE }, // permissions list + { WIDGETS_END } +}; + +static rct_widget window_multiplayer_options_widgets[] = { + MAIN_MULTIPLAYER_WIDGETS, + { WWT_CHECKBOX, 1, 3, 297, 50, 61, STR_ALLOW_KNOWN_KEYS_ONLY, STR_ALLOW_KNOWN_KEYS_ONLY_TIP }, { WIDGETS_END } }; static rct_widget *window_multiplayer_page_widgets[] = { window_multiplayer_players_widgets, - window_multiplayer_groups_widgets + window_multiplayer_groups_widgets, + window_multiplayer_options_widgets }; const uint64 window_multiplayer_page_enabled_widgets[] = { - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2), - (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_DEFAULT_GROUP) | (1 << WIDX_DEFAULT_GROUP_DROPDOWN) | (1 << WIDX_ADD_GROUP) | (1 << WIDX_REMOVE_GROUP) | (1 << WIDX_RENAME_GROUP) | (1 << WIDX_SELECTED_GROUP) | (1 << WIDX_SELECTED_GROUP_DROPDOWN) + (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_DEFAULT_GROUP) | (1 << WIDX_DEFAULT_GROUP_DROPDOWN) | (1 << WIDX_ADD_GROUP) | (1 << WIDX_REMOVE_GROUP) | (1 << WIDX_RENAME_GROUP) | (1 << WIDX_SELECTED_GROUP) | (1 << WIDX_SELECTED_GROUP_DROPDOWN), + (1 << WIDX_CLOSE) | (1 << WIDX_TAB1) | (1 << WIDX_TAB2) | (1 << WIDX_TAB3) | (1 << WIDX_KNOWN_KEYS_ONLY_CHECKBOX), }; static uint8 _selectedGroup = 0; static void window_multiplayer_players_mouseup(rct_window *w, int widgetIndex); static void window_multiplayer_players_resize(rct_window *w); -static void window_multiplayer_players_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); static void window_multiplayer_players_update(rct_window *w); static void window_multiplayer_players_scrollgetsize(rct_window *w, int scrollIndex, int *width, int *height); static void window_multiplayer_players_scrollmousedown(rct_window *w, int scrollIndex, int x, int y); @@ -113,11 +124,17 @@ static void window_multiplayer_groups_invalidate(rct_window *w); static void window_multiplayer_groups_paint(rct_window *w, rct_drawpixelinfo *dpi); static void window_multiplayer_groups_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrollIndex); +static void window_multiplayer_options_mouseup(rct_window *w, int widgetIndex); +static void window_multiplayer_options_resize(rct_window *w); +static void window_multiplayer_options_update(rct_window *w); +static void window_multiplayer_options_invalidate(rct_window *w); +static void window_multiplayer_options_paint(rct_window *w, rct_drawpixelinfo *dpi); + static rct_window_event_list window_multiplayer_players_events = { NULL, window_multiplayer_players_mouseup, window_multiplayer_players_resize, - window_multiplayer_players_mousedown, + NULL, NULL, NULL, window_multiplayer_players_update, @@ -175,13 +192,45 @@ static rct_window_event_list window_multiplayer_groups_events = { window_multiplayer_groups_scrollpaint }; -static rct_window_event_list *window_multiplayer_page_events[] = { - &window_multiplayer_players_events, - &window_multiplayer_groups_events +static rct_window_event_list window_multiplayer_options_events = { + NULL, + window_multiplayer_options_mouseup, + window_multiplayer_options_resize, + NULL, + NULL, + NULL, + window_multiplayer_options_update, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + window_multiplayer_options_invalidate, + window_multiplayer_options_paint, + NULL }; -static const int window_multiplayer_animation_divisor[] = { 4, 2 }; -static const int window_multiplayer_animation_frames[] = { 8, 7 }; +static rct_window_event_list *window_multiplayer_page_events[] = { + &window_multiplayer_players_events, + &window_multiplayer_groups_events, + &window_multiplayer_options_events +}; + +static const int window_multiplayer_animation_divisor[] = { 4, 2, 2 }; +static const int window_multiplayer_animation_frames[] = { 8, 7, 4 }; static void window_multiplayer_draw_tab_images(rct_window *w, rct_drawpixelinfo *dpi); static void window_multiplayer_set_page(rct_window* w, int page); @@ -214,6 +263,12 @@ static void window_multiplayer_set_page(rct_window* w, int page){ w->event_handlers = window_multiplayer_page_events[page]; w->pressed_widgets = 0; w->widgets = window_multiplayer_page_widgets[page]; + + if (network_get_mode() == NETWORK_MODE_CLIENT) { + w->widgets[WIDX_TAB3].type = WWT_EMPTY; + w->disabled_widgets |= (1 << WIDX_TAB3); + } + window_event_resize_call(w); window_event_invalidate_call(w); window_init_scroll_widgets(w); @@ -270,12 +325,21 @@ static void window_multiplayer_groups_show_group_dropdown(rct_window *w, rct_wid } } +#pragma region Players page + static void window_multiplayer_players_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; + case WIDX_TAB1: + case WIDX_TAB2: + case WIDX_TAB3: + if (w->page != widgetIndex - WIDX_TAB1) { + window_multiplayer_set_page(w, widgetIndex - WIDX_TAB1); + } + break; } } @@ -290,18 +354,6 @@ static void window_multiplayer_players_resize(rct_window *w) window_invalidate(w); } -static void window_multiplayer_players_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) -{ - switch (widgetIndex) { - case WIDX_TAB1: - case WIDX_TAB2: - if (w->page != widgetIndex - WIDX_TAB1) { - window_multiplayer_set_page(w, widgetIndex - WIDX_TAB1); - } - break; - } -} - static void window_multiplayer_players_update(rct_window *w) { w->frame_no++; @@ -361,7 +413,7 @@ static void window_multiplayer_players_invalidate(rct_window *w) window_multiplayer_anchor_border_widgets(w); window_multiplayer_players_widgets[WIDX_LIST].right = w->width - 4; window_multiplayer_players_widgets[WIDX_LIST].bottom = w->height - 0x0F; - window_align_tabs(w, WIDX_TAB1, WIDX_TAB2); + window_align_tabs(w, WIDX_TAB1, WIDX_TAB3); } static void window_multiplayer_players_paint(rct_window *w, rct_drawpixelinfo *dpi) @@ -452,12 +504,23 @@ static void window_multiplayer_players_scrollpaint(rct_window *w, rct_drawpixeli } } +#pragma endregion + +#pragma region Groups page + static void window_multiplayer_groups_mouseup(rct_window *w, int widgetIndex) { switch (widgetIndex) { case WIDX_CLOSE: window_close(w); break; + case WIDX_TAB1: + case WIDX_TAB2: + case WIDX_TAB3: + if (w->page != widgetIndex - WIDX_TAB1) { + window_multiplayer_set_page(w, widgetIndex - WIDX_TAB1); + } + break; case WIDX_ADD_GROUP: game_do_command(0, GAME_COMMAND_FLAG_APPLY, 0, 0, GAME_COMMAND_MODIFY_GROUPS, 0, 0); break; @@ -486,12 +549,6 @@ static void window_multiplayer_groups_resize(rct_window *w) static void window_multiplayer_groups_mousedown(int widgetIndex, rct_window* w, rct_widget* widget) { switch (widgetIndex) { - case WIDX_TAB1: - case WIDX_TAB2: - if (w->page != widgetIndex - WIDX_TAB1) { - window_multiplayer_set_page(w, widgetIndex - WIDX_TAB1); - } - break; case WIDX_DEFAULT_GROUP_DROPDOWN: window_multiplayer_groups_show_group_dropdown(w, widget); break; @@ -589,7 +646,7 @@ static void window_multiplayer_groups_invalidate(rct_window *w) window_multiplayer_anchor_border_widgets(w); window_multiplayer_groups_widgets[WIDX_PERMISSIONS_LIST].right = w->width - 4; window_multiplayer_groups_widgets[WIDX_PERMISSIONS_LIST].bottom = w->height - 0x0F; - window_align_tabs(w, WIDX_TAB1, WIDX_TAB2); + window_align_tabs(w, WIDX_TAB1, WIDX_TAB3); // select other group if one is removed while (network_get_group_index(_selectedGroup) == -1 && _selectedGroup > 0) { @@ -687,11 +744,63 @@ static void window_multiplayer_groups_scrollpaint(rct_window *w, rct_drawpixelin } } +#pragma endregion + +#pragma region Options page + +static void window_multiplayer_options_mouseup(rct_window *w, int widgetIndex) +{ + switch (widgetIndex) { + case WIDX_CLOSE: + window_close(w); + break; + case WIDX_TAB1: + case WIDX_TAB2: + case WIDX_TAB3: + if (w->page != widgetIndex - WIDX_TAB1) { + window_multiplayer_set_page(w, widgetIndex - WIDX_TAB1); + } + break; + case WIDX_KNOWN_KEYS_ONLY_CHECKBOX: + gConfigNetwork.known_keys_only = !gConfigNetwork.known_keys_only; + config_save_default(); + break; + } +} + +static void window_multiplayer_options_resize(rct_window *w) +{ + window_set_resize(w, 300, 100, 300, 100); +} + +static void window_multiplayer_options_update(rct_window *w) +{ + w->frame_no++; + widget_invalidate(w, WIDX_TAB1 + w->page); +} + +static void window_multiplayer_options_invalidate(rct_window *w) +{ + window_multiplayer_set_pressed_tab(w); + window_multiplayer_anchor_border_widgets(w); + window_align_tabs(w, WIDX_TAB1, WIDX_TAB3); + + widget_set_checkbox_value(w, WIDX_KNOWN_KEYS_ONLY_CHECKBOX, gConfigNetwork.known_keys_only); +} + +static void window_multiplayer_options_paint(rct_window *w, rct_drawpixelinfo *dpi) +{ + window_draw_widgets(w, dpi); + window_multiplayer_draw_tab_images(w, dpi); +} + +#pragma endregion + static void window_multiplayer_draw_tab_image(rct_window *w, rct_drawpixelinfo *dpi, int page, int spriteIndex) { int widgetIndex = WIDX_TAB1 + page; - if (!(w->disabled_widgets & (1LL << widgetIndex))) { + if (!widget_is_disabled(w, widgetIndex)) { if (w->page == page) { int numFrames = window_multiplayer_animation_frames[w->page]; if (numFrames > 1) { @@ -706,6 +815,7 @@ static void window_multiplayer_draw_tab_image(rct_window *w, rct_drawpixelinfo * static void window_multiplayer_draw_tab_images(rct_window *w, rct_drawpixelinfo *dpi) { - window_multiplayer_draw_tab_image(w, dpi, 0, SPR_TAB_GUESTS_0); - window_multiplayer_draw_tab_image(w, dpi, 1, SPR_TAB_STAFF_OPTIONS_0); + window_multiplayer_draw_tab_image(w, dpi, WINDOW_MULTIPLAYER_PAGE_PLAYERS, SPR_TAB_GUESTS_0); + window_multiplayer_draw_tab_image(w, dpi, WINDOW_MULTIPLAYER_PAGE_GROUPS, SPR_TAB_STAFF_OPTIONS_0); + window_multiplayer_draw_tab_image(w, dpi, WINDOW_MULTIPLAYER_PAGE_OPTIONS, SPR_TAB_GEARS_0); } diff --git a/src/windows/top_toolbar.c b/src/windows/top_toolbar.c index e3ae28b6f7..7eaf2913b0 100644 --- a/src/windows/top_toolbar.c +++ b/src/windows/top_toolbar.c @@ -109,9 +109,7 @@ typedef enum { } TOP_TOOLBAR_DEBUG_DDIDX; typedef enum { - DDIDX_MULTIPLAYER = 0, - // separator - DDIDX_KNOWN_KEYS_ONLY = 2 + DDIDX_MULTIPLAYER = 0 } TOP_TOOLBAR_NETWORK_DDIDX; enum { @@ -2957,15 +2955,6 @@ void top_toolbar_init_debug_menu(rct_window* w, rct_widget* widget) void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) { gDropdownItemsFormat[0] = STR_MULTIPLAYER; - int num_items = 1; - - if (network_get_mode() == NETWORK_MODE_SERVER) { - gDropdownItemsFormat[DDIDX_KNOWN_KEYS_ONLY - 1] = 0; - gDropdownItemsFormat[DDIDX_KNOWN_KEYS_ONLY] = 1156; - gDropdownItemsArgs[DDIDX_KNOWN_KEYS_ONLY] = STR_ALLOW_KNOWN_KEYS_ONLY; - // includes separator - num_items += 2; - } window_dropdown_show_text( w->x + widget->left, @@ -2973,13 +2962,9 @@ void top_toolbar_init_network_menu(rct_window* w, rct_widget* widget) widget->bottom - widget->top + 1, w->colours[0] | 0x80, 0, - num_items + 1 ); - if (network_get_mode() == NETWORK_MODE_SERVER && gConfigNetwork.known_keys_only) { - dropdown_set_checked(DDIDX_KNOWN_KEYS_ONLY, true); - } - gDropdownDefaultIndex = DDIDX_MULTIPLAYER; } @@ -3016,10 +3001,6 @@ void top_toolbar_network_menu_dropdown(short dropdownIndex) case DDIDX_MULTIPLAYER: window_multiplayer_open(); break; - case DDIDX_KNOWN_KEYS_ONLY: - gConfigNetwork.known_keys_only = !gConfigNetwork.known_keys_only; - config_save_default(); - break; } } }