(svn r6824) -Feature: Change the functionality of the chat window. SHIFT+ENTER (SHIFT+T)
authorDarkvater
Wed, 18 Oct 2006 21:07:36 +0000
changeset 4887 71da70810c22
parent 4886 19d09a4386ad
child 4888 acb34a8e5b13
(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)
main_gui.c
network_data.h
network_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;
--- 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;
--- 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);
 }