network_gui.c
changeset 211 2954c4b30525
parent 206 7f8c26d8526b
child 213 770e504a6e51
equal deleted inserted replaced
210:6d715f410a2f 211:2954c4b30525
     2 #include "ttd.h"
     2 #include "ttd.h"
     3 #include "window.h"
     3 #include "window.h"
     4 #include "gui.h"
     4 #include "gui.h"
     5 #include "gfx.h"
     5 #include "gfx.h"
     6 #include "command.h"
     6 #include "command.h"
       
     7 #include "network.h"
     7 
     8 
     8 #define BGC 5
     9 #define BGC 5
     9 #define BTC 15
    10 #define BTC 15
    10 #define MAX_QUERYSTR_LEN 64
    11 #define MAX_QUERYSTR_LEN 64
    11 static byte _edit_str_buf[MAX_QUERYSTR_LEN*2];
    12 static byte _edit_str_buf[MAX_QUERYSTR_LEN*2];
    31 * we'll just use some dummy here
    32 * we'll just use some dummy here
    32 */
    33 */
    33 static byte _network_connection;
    34 static byte _network_connection;
    34 static uint16 _network_game_count_last;
    35 static uint16 _network_game_count_last;
    35 
    36 
       
    37 enum {
       
    38   NET_PRC__OFFSET_TOP_WIDGET	= 93,
       
    39 	NET_PRC__SIZE_OF_ROW				= 14,
       
    40 };
       
    41 
       
    42 static NetworkGameList *selected_item = NULL;
       
    43 
    36 static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
    44 static void NetworkGameWindowWndProc(Window *w, WindowEvent *e)
    37 {
    45 {
    38 	switch(e->event) {
    46 	switch(e->event) {
    39 	case WE_TICK: {
       
    40 		if (_network_game_count_last != _network_game_count) {
       
    41 			SetWindowDirty(w);
       
    42 			}
       
    43 		}
       
    44 		break;
       
    45 	case WE_PAINT: {
    47 	case WE_PAINT: {
    46 
    48 
    47 		SET_DPARAM16(0, 0x00);
    49 		SET_DPARAM16(0, 0x00);
    48 		SET_DPARAM16(2, STR_NETWORK_LAN + _network_connection);
    50 		SET_DPARAM16(2, STR_NETWORK_LAN + _network_connection);
    49 		DrawWindowWidgets(w);
    51 		DrawWindowWidgets(w);
    55 
    57 
    56 		DrawString(15, 82, STR_NETWORK_GAME_NAME, 2);
    58 		DrawString(15, 82, STR_NETWORK_GAME_NAME, 2);
    57 		DrawString(238, 82, STR_NETWORK_PLAYERS, 2);
    59 		DrawString(238, 82, STR_NETWORK_PLAYERS, 2);
    58 		DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2);
    60 		DrawString(288, 82, STR_NETWORK_MAP_SIZE, 2);
    59 
    61 
       
    62 		{ // draw list of games
       
    63 			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
       
    64 			int32 n = 0;
       
    65 			NetworkGameList *cur_item = _network_game_list;
       
    66 			while (cur_item != NULL) {
       
    67 				if (cur_item == selected_item)
       
    68 					GfxFillRect(11, y - 2, 380, y + 9, 10); // show highlighted item with a different colour
       
    69 
       
    70 				DoDrawString(cur_item->item.server_name, 15, y, 16); // server name
       
    71 
       
    72 				SET_DPARAM8(0, cur_item->item.players_on);
       
    73 				SET_DPARAM8(1, cur_item->item.players_max);
       
    74 				DrawString(238, y, STR_NETWORK_PLAYERS_VAL, 2); // #/#
       
    75 
       
    76 				DoDrawString(cur_item->item.map_name, 288, y, 16); // map size
       
    77 				cur_item = cur_item->_next;
       
    78 				y += NET_PRC__SIZE_OF_ROW;
       
    79 				if (++n == w->vscroll.cap) { break;} // max number of games in the window
       
    80 			}
       
    81 		}
    60 	}	break;
    82 	}	break;
    61 
    83 
    62 	case WE_CLICK:
    84 	case WE_CLICK:
    63 		_selected_field = e->click.widget;
    85 		_selected_field = e->click.widget;
    64 		switch(e->click.widget) {
    86 		switch(e->click.widget) {
    86 			ShowNetworkStartServerWindow();
   108 			ShowNetworkStartServerWindow();
    87 			break;
   109 			break;
    88 		case 7: case 8: /* Connection type */
   110 		case 7: case 8: /* Connection type */
    89 			ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8
   111 			ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 8, 0); // do it for widget 8
    90 			return;
   112 			return;
       
   113 		case 14: { /* Matrix to show networkgames */
       
   114 			uint32 id_v = (e->click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
       
   115 
       
   116 			if (id_v >= w->vscroll.cap) { return;} // click out of bounds
       
   117 
       
   118 			id_v += w->vscroll.pos;
       
   119 
       
   120 			{
       
   121 				NetworkGameList *cur_item = _network_game_list;
       
   122 				int32 n = 0;
       
   123 				while (cur_item != NULL) {
       
   124 					if (n++ == id_v) { break;} // found clicked item
       
   125 
       
   126 					cur_item = cur_item->_next;
       
   127 				}
       
   128 
       
   129 				if (cur_item == NULL) { return;} // click out of vehicle bounds
       
   130 
       
   131 				selected_item = cur_item;
       
   132 			}
       
   133 		} break;
       
   134 		case 16: /* Join Game */
       
   135 			if (selected_item != NULL)
       
   136 				NetworkCoreConnectGameStruct(selected_item);
       
   137 			break;
    91 		}
   138 		}
    92 		break;
   139 		break;
    93 
   140 
    94 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
   141 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
    95 		_network_connection = e->dropdown.index;
   142 		_network_connection = e->dropdown.index;
    96 		switch (_network_connection) {
   143 		switch (_network_connection) {
    97 		case 0:
   144 		case 0: /* LAN */
    98 			NetworkGameListFromLAN();
   145 			NetworkGameListFromLAN();
    99 			_network_game_count_last = _network_game_count;
   146 			break;
   100 			SetWindowDirty(w);
   147 		case 1: /* Internet */
   101 			break;
       
   102 		case 1:
       
   103 			NetworkGameListFromInternet();
   148 			NetworkGameListFromInternet();
   104 			_network_game_count_last = _network_game_count;
   149 			break;
   105 			SetWindowDirty(w);
   150 		}
   106 			break;
   151 		
   107 		}
   152 		_network_game_count_last = _network_game_count;
       
   153 		SetWindowDirty(w);
       
   154 
   108 		break;
   155 		break;
   109 
   156 
   110 	case WE_MOUSELOOP:
   157 	case WE_MOUSELOOP:
   111 		if (_selected_field == 6)
   158 		if (_selected_field == 6)
   112 			HandleEditBox(w, 6);
   159 			HandleEditBox(w, 6);
   124 		}
   171 		}
   125 		break;
   172 		break;
   126 
   173 
   127 	case WE_ON_EDIT_TEXT: {
   174 	case WE_ON_EDIT_TEXT: {
   128 		const byte *b = e->edittext.str;
   175 		const byte *b = e->edittext.str;
   129 		if (*b == 0)
   176 		if (*b != 0)
   130 			return;
   177 			NetworkCoreConnectGame(b, _network_server_port);
   131 		NetworkCoreConnectGame(b,_network_server_port);
       
   132 	} break;
   178 	} break;
   133 
   179 
       
   180 	case WE_TICK: {
       
   181 		if (_network_game_count_last != _network_game_count)
       
   182 			SetWindowDirty(w);
       
   183 	} break;
       
   184 
   134 	}
   185 	}
   135 }
   186 }
   136 
   187 
   137 static const Widget _network_game_window_widgets[] = {
   188 static const Widget _network_game_window_widgets[] = {
   138 { WWT_PUSHTXTBTN,   BGC,     0,    10,     0,    13, STR_00C5,										STR_018B_CLOSE_WINDOW},
   189 {   WWT_CLOSEBOX,   BGC,     0,    10,     0,    13, STR_00C5,										STR_018B_CLOSE_WINDOW},
   139 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_MULTIPLAYER,			STR_NULL},
   190 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_MULTIPLAYER,			STR_NULL},
   140 {     WWT_IMGBTN,   BGC,     0,   399,    14,   199, 0x0,													STR_NULL},
   191 {     WWT_IMGBTN,   BGC,     0,   399,    14,   199, 0x0,													STR_NULL},
   141 
   192 
   142 { WWT_PUSHTXTBTN,   BTC,    20,   130,    22,    33, STR_NETWORK_FIND_SERVER,			STR_NETWORK_FIND_SERVER_TIP},
   193 { WWT_PUSHTXTBTN,   BTC,    20,   130,    22,    33, STR_NETWORK_FIND_SERVER,			STR_NETWORK_FIND_SERVER_TIP},
   143 { WWT_PUSHTXTBTN,   BTC,   145,   255,    22,    33, STR_NETWORK_DIRECT_CONNECT,	STR_NETWORK_DIRECT_CONNECT_TIP},
   194 { WWT_PUSHTXTBTN,   BTC,   145,   255,    22,    33, STR_NETWORK_DIRECT_CONNECT,	STR_NETWORK_DIRECT_CONNECT_TIP},
   146 {     WWT_IMGBTN,   BGC,   250,   394,    42,    53, 0x0,													STR_NETWORK_ENTER_NAME_TIP},
   197 {     WWT_IMGBTN,   BGC,   250,   394,    42,    53, 0x0,													STR_NETWORK_ENTER_NAME_TIP},
   147 
   198 
   148 {          WWT_6,   BGC,   250,   393,    62,    73, STR_NETWORK_COMBO1,					STR_NETWORK_CONNECTION_TYPE_TIP},
   199 {          WWT_6,   BGC,   250,   393,    62,    73, STR_NETWORK_COMBO1,					STR_NETWORK_CONNECTION_TYPE_TIP},
   149 {   WWT_CLOSEBOX,   BGC,   382,   392,    63,    72, STR_0225,										STR_NETWORK_CONNECTION_TYPE_TIP},
   200 {   WWT_CLOSEBOX,   BGC,   382,   392,    63,    72, STR_0225,										STR_NETWORK_CONNECTION_TYPE_TIP},
   150 
   201 
   151 {  WWT_SCROLLBAR,   BGC,   382,   392,    81,   175, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
   202 {  WWT_SCROLLBAR,   BGC,   382,   392,    81,   176, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
   152 
   203 
   153 {     WWT_IMGBTN,   BTC,    10,   231,    81,    92, 0x0,													STR_NETWORK_GAME_NAME_TIP },
   204 {     WWT_IMGBTN,   BTC,    10,   231,    81,    92, 0x0,													STR_NETWORK_GAME_NAME_TIP },
   154 {     WWT_IMGBTN,   BTC,   232,   281,    81,    92, 0x0,													STR_NETWORK_PLAYERS_TIP },
   205 {     WWT_IMGBTN,   BTC,   232,   281,    81,    92, 0x0,													STR_NETWORK_PLAYERS_TIP },
   155 {     WWT_IMGBTN,   BTC,   282,   331,    81,    92, 0x0,													STR_NETWORK_MAP_SIZE_TIP },
   206 {     WWT_IMGBTN,   BTC,   282,   331,    81,    92, 0x0,													STR_NETWORK_MAP_SIZE_TIP },
   156 {     WWT_IMGBTN,   BTC,   332,   381,    81,    92, 0x0,													STR_NETWORK_INFO_ICONS_TIP },
   207 {     WWT_IMGBTN,   BTC,   332,   381,    81,    92, 0x0,													STR_NETWORK_INFO_ICONS_TIP },
   157 
   208 
   158 {     WWT_MATRIX,   BGC,    10,   381,    93,   175, 0x601,												STR_NETWORK_CLICK_GAME_TO_SELECT},
   209 {     WWT_MATRIX,   BGC,    10,   381,    93,   176, 0x601,												STR_NETWORK_CLICK_GAME_TO_SELECT},
   159 
   210 
   160 { WWT_PUSHTXTBTN,   BTC,   145,   255,   180,   191, STR_012E_CANCEL,							STR_NULL},
   211 { WWT_PUSHTXTBTN,   BTC,   145,   255,   180,   191, STR_012E_CANCEL,							STR_NULL},
   161 { WWT_PUSHTXTBTN,   BTC,   270,   392,   180,   191, STR_NETWORK_JOIN_GAME,				STR_NULL},
   212 { WWT_PUSHTXTBTN,   BTC,   270,   392,   180,   191, STR_NETWORK_JOIN_GAME,				STR_NULL},
   162 {   WIDGETS_END},
   213 {   WIDGETS_END},
   163 };
   214 };
   178 
   229 
   179 	NetworkLobbyInit();
   230 	NetworkLobbyInit();
   180 
   231 
   181 	w = AllocateWindowDesc(&_network_game_window_desc);
   232 	w = AllocateWindowDesc(&_network_game_window_desc);
   182 	strcpy(_edit_str_buf, "Your name");
   233 	strcpy(_edit_str_buf, "Your name");
       
   234 	w->vscroll.cap = 6;
       
   235 	w->disabled_state = (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working
       
   236 	NetworkGameListFromLAN(); // default dropdown item is LAN, so fill that array
   183 
   237 
   184 	_network_game_count_last = _network_game_count;
   238 	_network_game_count_last = _network_game_count;
   185 
   239 
   186 	WP(w,querystr_d).caret = 1;
   240 	WP(w,querystr_d).caret = 1;
   187 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   241 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   230 		case 7: case 8: /* Number of Players */
   284 		case 7: case 8: /* Number of Players */
   231 			ShowDropDownMenu(w, _players_dropdown, _players_max, 8, 0); // do it for widget 8
   285 			ShowDropDownMenu(w, _players_dropdown, _players_max, 8, 0); // do it for widget 8
   232 			return;
   286 			return;
   233 		case  9: /* Start game */
   287 		case  9: /* Start game */
   234 			NetworkCoreStartGame();
   288 			NetworkCoreStartGame();
       
   289 			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
   235 			//ShowNetworkLobbyWindow();
   290 			//ShowNetworkLobbyWindow();
   236 			DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME);
   291 			DoCommandP(0, 0, 0, NULL, CMD_START_NEW_GAME);
   237 			break;
   292 			break;
   238 		case 10: /* Load game */
   293 		case 10: /* Load game */
   239 			NetworkCoreStartGame();
   294 			NetworkCoreStartGame();
       
   295 			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
   240 			//ShowNetworkLobbyWindow();
   296 			//ShowNetworkLobbyWindow();
   241 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   297 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   242 			break;
   298 			break;
   243 		case 11: /* Load scenario */
   299 		case 11: /* Load scenario */
   244 			NetworkCoreStartGame();
   300 			NetworkCoreStartGame();
       
   301 			strcpy(_network_game.server_name,	WP(w,querystr_d).buf);
   245 			//ShowNetworkLobbyWindow();
   302 			//ShowNetworkLobbyWindow();
   246 			ShowSaveLoadDialog(SLD_LOAD_SCENARIO);;
   303 			ShowSaveLoadDialog(SLD_LOAD_SCENARIO);
   247 			break;
   304 			break;
   248 		}
   305 		}
   249 		break;
   306 		break;
   250 
   307 
   251 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
   308 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
   285 {  WWT_SCROLLBAR,   BGC,   241,   251,    62,   170, 0x0,														STR_0190_SCROLL_BAR_SCROLLS_LIST},
   342 {  WWT_SCROLLBAR,   BGC,   241,   251,    62,   170, 0x0,														STR_0190_SCROLL_BAR_SCROLLS_LIST},
   286 
   343 
   287 {          WWT_6,   BGC,   260,   390,    81,    92, STR_NETWORK_COMBO2,						STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
   344 {          WWT_6,   BGC,   260,   390,    81,    92, STR_NETWORK_COMBO2,						STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
   288 {   WWT_CLOSEBOX,   BGC,   379,   389,    82,    91, STR_0225,											STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
   345 {   WWT_CLOSEBOX,   BGC,   379,   389,    82,    91, STR_0225,											STR_NETWORK_NUMBER_OF_PLAYERS_TIP},
   289 
   346 
   290 { WWT_PUSHTXTBTN,   BTC,    10,   100,   180,   191, STR_NETWORK_START_GAME,				STR_NULL},
   347 { WWT_PUSHTXTBTN,   BTC,    10,   100,   180,   191, STR_NETWORK_START_GAME,				STR_NETWORK_START_GAME_TIP},
   291 { WWT_PUSHTXTBTN,   BTC,   110,   200,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NULL},
   348 { WWT_PUSHTXTBTN,   BTC,   110,   200,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NETWORK_LOAD_GAME_TIP},
   292 { WWT_PUSHTXTBTN,   BTC,   210,   300,   180,   191, STR_NETWORK_LOAD_SCENARIO,			STR_NULL},
   349 { WWT_PUSHTXTBTN,   BTC,   210,   300,   180,   191, STR_NETWORK_LOAD_SCENARIO,			STR_NETWORK_LOAD_SCENARIO_TIP},
   293 { WWT_PUSHTXTBTN,   BTC,   310,   390,   180,   191, STR_012E_CANCEL,								STR_NULL},
   350 { WWT_PUSHTXTBTN,   BTC,   310,   390,   180,   191, STR_012E_CANCEL,								STR_NULL},
   294 {   WIDGETS_END},
   351 {   WIDGETS_END},
   295 };
   352 };
   296 
   353 
   297 static const WindowDesc _network_start_server_window_desc = {
   354 static const WindowDesc _network_start_server_window_desc = {
   307 	Window *w;
   364 	Window *w;
   308 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
   365 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
   309 
   366 
   310 	w = AllocateWindowDesc(&_network_start_server_window_desc);
   367 	w = AllocateWindowDesc(&_network_start_server_window_desc);
   311 	strcpy(_edit_str_buf, "");
   368 	strcpy(_edit_str_buf, "");
       
   369 	w->disabled_state = (1<<4) | (1<<5) | (1<<6) | (1<<7) | (1<<8); // disable buttons not yet working
   312 
   370 
   313 	WP(w,querystr_d).caret = 1;
   371 	WP(w,querystr_d).caret = 1;
   314 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   372 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   315 	WP(w,querystr_d).maxwidth = 240;
   373 	WP(w,querystr_d).maxwidth = 240;
   316 	WP(w,querystr_d).buf = _edit_str_buf;
   374 	WP(w,querystr_d).buf = _edit_str_buf;
   373 
   431 
   374 	}
   432 	}
   375 }
   433 }
   376 
   434 
   377 static const Widget _network_lobby_window_widgets[] = {
   435 static const Widget _network_lobby_window_widgets[] = {
   378 { WWT_PUSHTXTBTN,   BGC,     0,    10,     0,    13, STR_00C5,									STR_018B_CLOSE_WINDOW },
   436 {   WWT_CLOSEBOX,   BGC,     0,    10,     0,    13, STR_00C5,									STR_018B_CLOSE_WINDOW },
   379 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_GAME_LOBBY,		STR_NULL},
   437 {    WWT_CAPTION,   BGC,    10,   399,     0,    13, STR_NETWORK_GAME_LOBBY,		STR_NULL},
   380 {     WWT_IMGBTN,   BGC,     0,   399,    14,   299, 0x0,												STR_NULL},
   438 {     WWT_IMGBTN,   BGC,     0,   399,    14,   299, 0x0,												STR_NULL},
   381 
   439 
   382 // chat widget
   440 // chat widget
   383 {     WWT_IMGBTN,   BGC,    10,   240,    30,   240, 0x0,												STR_NULL},
   441 {     WWT_IMGBTN,   BGC,    10,   240,    30,   240, 0x0,												STR_NULL},