Changeset - r4887:8b115bb93f3d
[Not reviewed]
master
0 3 0
Darkvater - 18 years ago 2006-10-18 21:07:36
darkvater@openttd.org
(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)
3 files changed with 55 insertions and 17 deletions:
0 comments (0 inline, 0 general)
main_gui.c
Show inline comments
 
@@ -2326,9 +2326,37 @@ static void MainWindowWndProc(Window *w,
 
				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;
network_data.h
Show inline comments
 
@@ -169,9 +169,9 @@ typedef enum {
 
} 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;
network_gui.c
Show inline comments
 
@@ -1630,20 +1630,30 @@ static void ChatWindowWndProc(Window *w,
 
		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 @@ static void ChatWindowWndProc(Window *w,
 
			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 void ChatWindowWndProc(Window *w,
 
}
 

	
 
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 @@ void ShowNetworkChatQueryWindow(byte des
 

	
 
	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);
 
}
0 comments (0 inline, 0 general)