# HG changeset patch # User Darkvater # Date 1161205656 0 # Node ID 71da70810c22f874ef06cd547c5d37a002fe8149 # Parent 19d09a4386ad8c1d83038378d44f79a4631e0711 (svn r6824) -Feature: Change the functionality of the chat window. SHIFT+ENTER (SHIFT+T) sends a message to all players, CTRL+ENTER (CTRL+T) sends a message to all team mates and ENTER (T) sends a message to teammates if you have any, otherwise to all players. The chat-window now also shows what kind of message is being sent. Shortcut functionality has not been changed (ENTER sends message, ESC closes window) diff -r 19d09a4386ad -r 71da70810c22 main_gui.c --- a/main_gui.c Wed Oct 18 17:44:46 2006 +0000 +++ b/main_gui.c Wed Oct 18 21:07:36 2006 +0000 @@ -2326,9 +2326,37 @@ break; #ifdef ENABLE_NETWORK - case WKC_RETURN: case 'T' | WKC_SHIFT: + case WKC_RETURN: case 'T': // smart chat; send to team if any, otherwise to all + if (_networking) { + const NetworkClientInfo *ci; + const NetworkClientInfo *cio = NetworkFindClientInfoFromIndex(_network_own_client_index); + bool has_team = false; + + /* Only players actually playing can speak to team. Eg spectators cannot */ + if (IsValidPlayer(cio->client_playas)) { + FOR_ALL_ACTIVE_CLIENT_INFOS(ci) { + if (ci->client_playas == cio->client_playas && ci != cio) { + has_team = true; + break; + } + } + } + + ShowNetworkChatQueryWindow(has_team ? DESTTYPE_PLAYER : DESTTYPE_BROADCAST, ci->client_playas); + break; + } + break; + + case WKC_SHIFT | WKC_RETURN: case WKC_SHIFT | 'T': // send text message to all players if (_networking) ShowNetworkChatQueryWindow(DESTTYPE_BROADCAST, 0); break; + + case WKC_CTRL | WKC_RETURN: case WKC_CTRL | 'T': // send text to all team mates + if (_networking) { + const NetworkClientInfo *ci = NetworkFindClientInfoFromIndex(_network_own_client_index); + ShowNetworkChatQueryWindow(DESTTYPE_PLAYER, ci->client_playas); + } + break; #endif default: return; diff -r 19d09a4386ad -r 71da70810c22 network_data.h --- a/network_data.h Wed Oct 18 17:44:46 2006 +0000 +++ b/network_data.h Wed Oct 18 21:07:36 2006 +0000 @@ -169,9 +169,9 @@ } PacketType; typedef enum { - DESTTYPE_BROADCAST, - DESTTYPE_PLAYER, - DESTTYPE_CLIENT + DESTTYPE_BROADCAST, ///< Send message/notice to all players (All) + DESTTYPE_PLAYER, ///< Send message/notice to everyone playing the same company (Team) + DESTTYPE_CLIENT, ///< Send message/notice to only a certain player (Private) } DestType; CommandPacket *_local_command_queue; diff -r 19d09a4386ad -r 71da70810c22 network_gui.c --- a/network_gui.c Wed Oct 18 17:44:46 2006 +0000 +++ b/network_gui.c Wed Oct 18 21:07:36 2006 +0000 @@ -1630,20 +1630,30 @@ SETBIT(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys break; - case WE_PAINT: + case WE_PAINT: { + static const StringID chat_captions[] = { + STR_NETWORK_CHAT_ALL, + STR_NETWORK_CHAT_COMPANY, + STR_NETWORK_CHAT_CLIENT + }; + DrawWindowWidgets(w); - DrawEditBox(w, &WP(w, querystr_d), 1); - break; + + assert(_chat_type < lengthof(chat_captions)); + SetDParam(0, STR_EMPTY); + DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, chat_captions[_chat_type], 16); + DrawEditBox(w, &WP(w, querystr_d), 2); + } break; case WE_CLICK: switch (e->we.click.widget) { - case 2: /* Send */ SendChat(WP(w, querystr_d).text.buf); /* FALLTHROUGH */ - case 3: /* Cancel */ DeleteWindow(w); break; + case 3: /* Send */ SendChat(WP(w, querystr_d).text.buf); /* FALLTHROUGH */ + case 0: /* Cancel */ DeleteWindow(w); break; } break; case WE_MOUSELOOP: - HandleEditBox(w, &WP(w, querystr_d), 1); + HandleEditBox(w, &WP(w, querystr_d), 2); break; case WE_KEYPRESS: @@ -1651,7 +1661,7 @@ ChatTabCompletion(w); } else { _chat_tab_completion_active = false; - switch (HandleEditBoxKey(w, &WP(w, querystr_d), 1, e, CS_ALPHANUMERAL)) { + switch (HandleEditBoxKey(w, &WP(w, querystr_d), 2, e, CS_ALPHANUMERAL)) { case 1: /* Return */ SendChat(WP(w, querystr_d).text.buf); /* FALLTHROUGH */ case 2: /* Escape */ DeleteWindow(w); break; } @@ -1666,10 +1676,10 @@ } static const Widget _chat_window_widgets[] = { -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 639, 0, 13, STR_NULL, STR_NULL}, // background -{ WWT_IMGBTN, RESIZE_NONE, 14, 2, 399, 1, 12, STR_NULL, STR_NULL}, // text box -{ WWT_TEXTBTN, RESIZE_NONE, 14, 400, 519, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button -{ WWT_TEXTBTN, RESIZE_NONE, 14, 520, 639, 1, 12, STR_012E_CANCEL, STR_NULL}, // cancel button +{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 11, 639, 0, 13, STR_NULL, STR_NULL}, // background +{ WWT_IMGBTN, RESIZE_NONE, 14, 75, 577, 1, 12, STR_NULL, STR_NULL}, // text box +{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 578, 639, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button { WIDGETS_END}, }; @@ -1696,13 +1706,13 @@ w = AllocateWindowDesc(&_chat_window_desc); - LowerWindowWidget(w, 1); + LowerWindowWidget(w, 2); WP(w,querystr_d).caption = STR_NULL; WP(w,querystr_d).wnd_class = WC_MAIN_TOOLBAR; WP(w,querystr_d).wnd_num = 0; WP(w,querystr_d).text.caret = false; WP(w,querystr_d).text.maxlength = lengthof(_edit_str_buf); - WP(w,querystr_d).text.maxwidth = w->widget[1].right - w->widget[1].left - 2; // widget[1] is the "text box" + WP(w,querystr_d).text.maxwidth = w->widget[2].right - w->widget[2].left - 2; // widget[1] is the "text box" WP(w,querystr_d).text.buf = _edit_str_buf; UpdateTextBufferSize(&WP(w, querystr_d).text); }