diff --git a/data/language/en-GB.txt b/data/language/en-GB.txt index 1e8025d933..ed52fcbaea 100644 --- a/data/language/en-GB.txt +++ b/data/language/en-GB.txt @@ -3727,6 +3727,10 @@ STR_6276 :{RED}{STRINGID} has guests getting stuck, possibly due to invalid r STR_6277 :{WINDOW_COLOUR_2}Station index: {BLACK}{COMMA16} STR_6278 :Autosave amount STR_6279 :{SMALLFONT}{BLACK}Number of autosaves that should be kept +STR_6280 :{SMALLFONT}{BLACK}Chat +STR_6281 :{SMALLFONT}{BLACK}Show a separate button for the Chat window in the toolbar +STR_6282 :Chat +STR_6283 :Chat not available at this time. Are you connected to a server? ############# # Scenarios # diff --git a/distribution/changelog.txt b/distribution/changelog.txt index 4b78405b06..22ff0d653e 100644 --- a/distribution/changelog.txt +++ b/distribution/changelog.txt @@ -17,6 +17,7 @@ - Feature: [#8377] Add option to adjust amount of autosaves to keep. - Feature: [#8458] Add sprite sorting benchmark. - Feature: [#8583] Add boosters to water coaster. +- Feature: [#8648] Add optional chat button to top toolbar in multiplayer games. - Change: [#7961] Add new object types: station, terrain surface, and terrain edge. - Change: [#8222] The climate setting has been moved from objective options to scenario options. - Change: [#8647] Increased 'guest generation probability' thresholds of marketing campaigns. diff --git a/resources/g2/icons/chat.png b/resources/g2/icons/chat.png new file mode 100644 index 0000000000..852482054e Binary files /dev/null and b/resources/g2/icons/chat.png differ diff --git a/resources/g2/sprites.json b/resources/g2/sprites.json index 4e89f50a25..66046226a4 100644 --- a/resources/g2/sprites.json +++ b/resources/g2/sprites.json @@ -389,6 +389,11 @@ "x_offset": 5, "y_offset": 5 }, + { + "path": "icons/chat.png", + "x_offset": 2, + "y_offset": 1 + }, { "path": "font/latin/ae-uc-small.png", "y_offset": 0, diff --git a/src/openrct2-ui/windows/Options.cpp b/src/openrct2-ui/windows/Options.cpp index 1d413377b5..72ebce1b62 100644 --- a/src/openrct2-ui/windows/Options.cpp +++ b/src/openrct2-ui/windows/Options.cpp @@ -150,6 +150,7 @@ enum WINDOW_OPTIONS_WIDGET_IDX { WIDX_TOOLBAR_SHOW_CHEATS, WIDX_TOOLBAR_SHOW_NEWS, WIDX_TOOLBAR_SHOW_MUTE, + WIDX_TOOLBAR_SHOW_CHAT, // Misc WIDX_TITLE_SEQUENCE_GROUP = WIDX_PAGE_START, @@ -319,6 +320,7 @@ static rct_widget window_options_controls_and_interface_widgets[] = { { WWT_CHECKBOX, 2, 155, 299, TOOLBAR_GROUP_START + 31, TOOLBAR_GROUP_START + 42, STR_CHEATS_BUTTON_ON_TOOLBAR, STR_CHEATS_BUTTON_ON_TOOLBAR_TIP }, // Cheats { WWT_CHECKBOX, 2, 155, 299, TOOLBAR_GROUP_START + 46, TOOLBAR_GROUP_START + 57, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR, STR_SHOW_RECENT_MESSAGES_ON_TOOLBAR_TIP }, // Recent messages { WWT_CHECKBOX, 2, 24, 185, TOOLBAR_GROUP_START + 61, TOOLBAR_GROUP_START + 72, STR_MUTE_BUTTON_ON_TOOLBAR, STR_MUTE_BUTTON_ON_TOOLBAR_TIP }, // Mute + { WWT_CHECKBOX, 2, 155, 299, TOOLBAR_GROUP_START + 61, TOOLBAR_GROUP_START + 72, STR_CHAT_BUTTON_ON_TOOLBAR, STR_CHAT_BUTTON_ON_TOOLBAR_TIP }, // Chat { WIDGETS_END }, #undef TOOLBAR_GROUP_START }; @@ -577,7 +579,8 @@ static uint64_t window_options_page_enabled_widgets[] = { (1 << WIDX_THEMES) | (1 << WIDX_THEMES_DROPDOWN) | (1 << WIDX_THEMES_BUTTON) | - (1 << WIDX_TOOLBAR_SHOW_MUTE), + (1 << WIDX_TOOLBAR_SHOW_MUTE) | + (1 << WIDX_TOOLBAR_SHOW_CHAT) | MAIN_OPTIONS_ENABLED_WIDGETS | (1 << WIDX_REAL_NAME_CHECKBOX) | @@ -852,6 +855,12 @@ static void window_options_mouseup(rct_window* w, rct_widgetindex widgetIndex) window_invalidate(w); window_invalidate_by_class(WC_TOP_TOOLBAR); break; + case WIDX_TOOLBAR_SHOW_CHAT: + gConfigInterface.toolbar_show_chat ^= 1; + config_save_default(); + window_invalidate(w); + window_invalidate_by_class(WC_TOP_TOOLBAR); + break; case WIDX_INVERT_DRAG: gConfigGeneral.invert_viewport_drag ^= 1; config_save_default(); @@ -1857,6 +1866,7 @@ static void window_options_invalidate(rct_window* w) widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_CHEATS, gConfigInterface.toolbar_show_cheats); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_NEWS, gConfigInterface.toolbar_show_news); widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_MUTE, gConfigInterface.toolbar_show_mute); + widget_set_checkbox_value(w, WIDX_TOOLBAR_SHOW_CHAT, gConfigInterface.toolbar_show_chat); size_t activeAvailableThemeIndex = theme_manager_get_active_available_theme_index(); const utf8* activeThemeName = theme_manager_get_available_theme_name(activeAvailableThemeIndex); diff --git a/src/openrct2-ui/windows/TopToolbar.cpp b/src/openrct2-ui/windows/TopToolbar.cpp index c3a018a41e..ee694ea80c 100644 --- a/src/openrct2-ui/windows/TopToolbar.cpp +++ b/src/openrct2-ui/windows/TopToolbar.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -78,6 +79,7 @@ enum { WIDX_RESEARCH, WIDX_NEWS, WIDX_NETWORK, + WIDX_CHAT, WIDX_SEPARATOR, }; @@ -165,6 +167,7 @@ static constexpr const int32_t left_aligned_widgets_order[] = { WIDX_FILE_MENU, WIDX_MUTE, WIDX_NETWORK, + WIDX_CHAT, WIDX_CHEATS, WIDX_DEBUG, @@ -226,6 +229,7 @@ static rct_widget window_top_toolbar_widgets[] = { { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, TOP_TOOLBAR_HEIGHT, IMAGE_TYPE_REMAP | SPR_TAB_TOOLBAR, STR_FINANCES_RESEARCH_TIP }, // Research { WWT_TRNBTN, 3, 0x001E, 0x003B, 0, TOP_TOOLBAR_HEIGHT, IMAGE_TYPE_REMAP | SPR_TAB_TOOLBAR, STR_SHOW_RECENT_MESSAGES_TIP }, // News { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, TOP_TOOLBAR_HEIGHT, IMAGE_TYPE_REMAP | SPR_TAB_TOOLBAR, STR_SHOW_MULTIPLAYER_STATUS_TIP }, // Network + { WWT_TRNBTN, 0, 0x001E, 0x003B, 0, TOP_TOOLBAR_HEIGHT, IMAGE_TYPE_REMAP | SPR_TAB_TOOLBAR, STR_TOOLBAR_CHAT_TIP }, // Chat { WWT_EMPTY, 0, 0, 10-1, 0, 0, 0xFFFFFFFF, STR_NONE }, // Artificial widget separator { WIDGETS_END }, @@ -389,6 +393,16 @@ static void window_top_toolbar_mouseup(rct_window* w, rct_widgetindex widgetInde case WIDX_MUTE: audio_toggle_all_sounds(); break; + case WIDX_CHAT: + if (chat_available()) + { + chat_toggle(); + } + else + { + context_show_error(STR_CHAT_UNAVAILABLE, STR_NONE); + } + break; } } @@ -689,6 +703,7 @@ static void window_top_toolbar_invalidate(rct_window* w) window_top_toolbar_widgets[WIDX_VIEW_MENU].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_MAP].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_MUTE].type = WWT_TRNBTN; + window_top_toolbar_widgets[WIDX_CHAT].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_LAND].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_WATER].type = WWT_TRNBTN; window_top_toolbar_widgets[WIDX_SCENERY].type = WWT_TRNBTN; @@ -712,6 +727,11 @@ static void window_top_toolbar_invalidate(rct_window* w) window_top_toolbar_widgets[WIDX_MUTE].type = WWT_EMPTY; } + if (!gConfigInterface.toolbar_show_chat) + { + window_top_toolbar_widgets[WIDX_CHAT].type = WWT_EMPTY; + } + if (gScreenFlags & (SCREEN_FLAGS_SCENARIO_EDITOR | SCREEN_FLAGS_TRACK_DESIGNER | SCREEN_FLAGS_TRACK_MANAGER)) { window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY; @@ -767,6 +787,7 @@ static void window_top_toolbar_invalidate(rct_window* w) { case NETWORK_MODE_NONE: window_top_toolbar_widgets[WIDX_NETWORK].type = WWT_EMPTY; + window_top_toolbar_widgets[WIDX_CHAT].type = WWT_EMPTY; break; case NETWORK_MODE_CLIENT: window_top_toolbar_widgets[WIDX_PAUSE].type = WWT_EMPTY; @@ -778,7 +799,7 @@ static void window_top_toolbar_invalidate(rct_window* w) } enabledWidgets = 0; - for (int i = WIDX_PAUSE; i <= WIDX_NETWORK; i++) + for (int i = WIDX_PAUSE; i <= WIDX_CHAT; i++) if (window_top_toolbar_widgets[i].type != WWT_EMPTY) enabledWidgets |= (1 << i); w->enabled_widgets = enabledWidgets; @@ -910,6 +931,17 @@ static void window_top_toolbar_paint(rct_window* w, rct_drawpixelinfo* dpi) gfx_draw_sprite(dpi, imgId, x, y, 3); } + // Draw chat button + if (window_top_toolbar_widgets[WIDX_CHAT].type != WWT_EMPTY) + { + x = w->x + window_top_toolbar_widgets[WIDX_CHAT].left; + y = w->y + window_top_toolbar_widgets[WIDX_CHAT].top - 2; + if (widget_is_pressed(w, WIDX_CHAT)) + y++; + imgId = SPR_G2_CHAT; + gfx_draw_sprite(dpi, imgId, x, y, 3); + } + // Draw debug button if (window_top_toolbar_widgets[WIDX_DEBUG].type != WWT_EMPTY) { diff --git a/src/openrct2/config/Config.cpp b/src/openrct2/config/Config.cpp index b43be14830..cf164b856b 100644 --- a/src/openrct2/config/Config.cpp +++ b/src/openrct2/config/Config.cpp @@ -298,6 +298,7 @@ namespace Config model->toolbar_show_cheats = reader->GetBoolean("toolbar_show_cheats", false); model->toolbar_show_news = reader->GetBoolean("toolbar_show_news", false); model->toolbar_show_mute = reader->GetBoolean("toolbar_show_mute", false); + model->toolbar_show_chat = reader->GetBoolean("toolbar_show_chat", false); model->console_small_font = reader->GetBoolean("console_small_font", false); model->current_theme_preset = reader->GetCString("current_theme", "*RCT2"); model->current_title_sequence_preset = reader->GetCString("current_title_sequence", "*OPENRCT2"); @@ -314,6 +315,7 @@ namespace Config writer->WriteBoolean("toolbar_show_cheats", model->toolbar_show_cheats); writer->WriteBoolean("toolbar_show_news", model->toolbar_show_news); writer->WriteBoolean("toolbar_show_mute", model->toolbar_show_mute); + writer->WriteBoolean("toolbar_show_chat", model->toolbar_show_chat); writer->WriteBoolean("console_small_font", model->console_small_font); writer->WriteString("current_theme", model->current_theme_preset); writer->WriteString("current_title_sequence", model->current_title_sequence_preset); diff --git a/src/openrct2/config/Config.h b/src/openrct2/config/Config.h index c4b0ecc0b3..de762b4612 100644 --- a/src/openrct2/config/Config.h +++ b/src/openrct2/config/Config.h @@ -102,6 +102,7 @@ struct InterfaceConfiguration bool toolbar_show_cheats; bool toolbar_show_news; bool toolbar_show_mute; + bool toolbar_show_chat; bool console_small_font; utf8* current_theme_preset; utf8* current_title_sequence_preset; diff --git a/src/openrct2/interface/Chat.cpp b/src/openrct2/interface/Chat.cpp index a6b4801917..1c4b2a9ce1 100644 --- a/src/openrct2/interface/Chat.cpp +++ b/src/openrct2/interface/Chat.cpp @@ -38,6 +38,12 @@ static const char* chat_history_get(uint32_t index); static uint32_t chat_history_get_time(uint32_t index); static void chat_clear_input(); +bool chat_available() +{ + return network_get_mode() != NETWORK_MODE_NONE && network_get_status() == NETWORK_STATUS_CONNECTED + && network_get_authstatus() == NETWORK_AUTH_OK; +} + void chat_open() { gChatOpen = true; @@ -76,8 +82,7 @@ void chat_update() void chat_draw(rct_drawpixelinfo* dpi, uint8_t chatBackgroundColor) { - if (network_get_mode() == NETWORK_MODE_NONE || network_get_status() != NETWORK_STATUS_CONNECTED - || network_get_authstatus() != NETWORK_AUTH_OK) + if (!chat_available()) { gChatOpen = false; return; diff --git a/src/openrct2/interface/Chat.h b/src/openrct2/interface/Chat.h index d2d380f006..4262f60a60 100644 --- a/src/openrct2/interface/Chat.h +++ b/src/openrct2/interface/Chat.h @@ -28,6 +28,7 @@ enum CHAT_INPUT extern bool gChatOpen; +bool chat_available(); void chat_open(); void chat_close(); void chat_toggle(); diff --git a/src/openrct2/localisation/StringIds.h b/src/openrct2/localisation/StringIds.h index ccc26b2d44..a0b19c556a 100644 --- a/src/openrct2/localisation/StringIds.h +++ b/src/openrct2/localisation/StringIds.h @@ -3901,6 +3901,11 @@ enum STR_AUTOSAVE_AMOUNT = 6278, STR_AUTOSAVE_AMOUNT_TIP = 6279, + STR_TOOLBAR_CHAT_TIP = 6280, + STR_CHAT_BUTTON_ON_TOOLBAR_TIP = 6281, + STR_CHAT_BUTTON_ON_TOOLBAR = 6282, + STR_CHAT_UNAVAILABLE = 6283, + // 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/openrct2/sprites.h b/src/openrct2/sprites.h index 397c05e8b4..5bad3cefca 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -827,8 +827,9 @@ enum SPR_G2_SELECTION_EDGE_SE = SPR_G2_BEGIN + 111, SPR_G2_EYEDROPPER = SPR_G2_BEGIN + 112, + SPR_G2_CHAT = SPR_G2_BEGIN + 113, - SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 113, + SPR_G2_CHAR_BEGIN = SPR_G2_BEGIN + 114, SPR_G2_AE_UPPER = SPR_G2_CHAR_BEGIN, SPR_G2_AE_LOWER = SPR_G2_CHAR_BEGIN + 1, @@ -918,7 +919,6 @@ enum SPR_G2_E_CARON_LOWER = SPR_G2_CHAR_BEGIN + 73, SPR_G2_ROUBLE_SIGN = SPR_G2_CHAR_BEGIN + 74, - SPR_G2_CHAR_END = SPR_G2_ROUBLE_SIGN, SPR_G2_GLYPH_COUNT = (SPR_G2_CHAR_END - SPR_G2_CHAR_BEGIN) + 1,