network_gui.c
changeset 675 9be22ffb4625
parent 670 d164965bb35a
child 685 c52bdb4cac92
equal deleted inserted replaced
674:9604d4d8de7d 675:9be22ffb4625
    26 static void ShowNetworkLobbyWindow(void);
    26 static void ShowNetworkLobbyWindow(void);
    27 
    27 
    28 static byte _selected_field;
    28 static byte _selected_field;
    29 
    29 
    30 static const StringID _connection_types_dropdown[] = {
    30 static const StringID _connection_types_dropdown[] = {
    31 	STR_NETWORK_LAN,
    31 	STR_NETWORK_LAN_INTERNET,
    32 	STR_NETWORK_INTERNET,
    32 	STR_NETWORK_INTERNET_ADVERTISE,
    33 	INVALID_STRING_ID
    33 	INVALID_STRING_ID
    34 };
    34 };
    35 
       
    36 static byte _network_connection;
       
    37 
    35 
    38 static StringID _str_map_name, _str_game_name, _str_server_version, _str_server_address;
    36 static StringID _str_map_name, _str_game_name, _str_server_version, _str_server_address;
    39 
    37 
    40 enum {
    38 enum {
    41 	NET_PRC__OFFSET_TOP_WIDGET					= 74,
    39 	NET_PRC__OFFSET_TOP_WIDGET					= 74,
    75 	switch(e->event) {
    73 	switch(e->event) {
    76 	case WE_PAINT: {
    74 	case WE_PAINT: {
    77 		w->disabled_state = 0;
    75 		w->disabled_state = 0;
    78 
    76 
    79 		if (_selected_item == NULL) {
    77 		if (_selected_item == NULL) {
    80 			SETBIT(w->disabled_state, 17); SETBIT(w->disabled_state, 18);
    78 			SETBIT(w->disabled_state, 15); SETBIT(w->disabled_state, 16);
    81 		} else if (!_selected_item->online) {
    79 		} else if (!_selected_item->online) {
    82 			SETBIT(w->disabled_state, 17); // Server offline, join button disabled
    80 			SETBIT(w->disabled_state, 15); // Server offline, join button disabled
    83 		} else if (_selected_item->info.clients_on == _selected_item->info.clients_max) {
    81 		} else if (_selected_item->info.clients_on == _selected_item->info.clients_max) {
    84 			SETBIT(w->disabled_state, 17); // Server full, join button disabled
    82 			SETBIT(w->disabled_state, 15); // Server full, join button disabled
    85 
    83 
    86 			// revisions don't match, check if server has no revision; then allow connection
    84 			// revisions don't match, check if server has no revision; then allow connection
    87 		} else if (strncmp(_selected_item->info.server_revision, _openttd_revision, NETWORK_REVISION_LENGTH - 1) != 0) {
    85 		} else if (strncmp(_selected_item->info.server_revision, _openttd_revision, NETWORK_REVISION_LENGTH - 1) != 0) {
    88 			if (strncmp(_selected_item->info.server_revision, NOREV_STRING, sizeof(_selected_item->info.server_revision)) != 0)
    86 			if (strncmp(_selected_item->info.server_revision, NOREV_STRING, sizeof(_selected_item->info.server_revision)) != 0)
    89 				SETBIT(w->disabled_state, 17); // Revision mismatch, join button disabled
    87 				SETBIT(w->disabled_state, 15); // Revision mismatch, join button disabled
    90 		}
    88 		}
    91 
    89 
    92 		SetDParam(0, 0x00);
    90 		SetDParam(0, 0x00);
    93 		SetDParam(2, STR_NETWORK_LAN + _network_connection);
       
    94 		DrawWindowWidgets(w);
    91 		DrawWindowWidgets(w);
    95 
    92 
    96 		DrawEditBox(w, 3);
    93 		DrawEditBox(w, 3);
    97 
    94 
    98 		DrawString(9, 23, STR_NETWORK_PLAYER_NAME, 2);
    95 		DrawString(9, 23, STR_NETWORK_PLAYER_NAME, 2);
    99 		DrawString(9, 43, STR_NETWORK_CONNECTION, 2);
       
   100 
    96 
   101 		DrawString(15, 63, STR_NETWORK_GAME_NAME, 2);
    97 		DrawString(15, 63, STR_NETWORK_GAME_NAME, 2);
   102 		DrawString(135, 63, STR_NETWORK_CLIENTS_CAPTION, 2);
    98 		DrawString(135, 63, STR_NETWORK_CLIENTS_CAPTION, 2);
   103 
    99 
   104 		{ // draw list of games
   100 		{ // draw list of games
   212 	}	break;
   208 	}	break;
   213 
   209 
   214 	case WE_CLICK:
   210 	case WE_CLICK:
   215 		_selected_field = e->click.widget;
   211 		_selected_field = e->click.widget;
   216 		switch(e->click.widget) {
   212 		switch(e->click.widget) {
   217 		case 0: case 14: /* Close 'X' | Cancel button */
   213 		case 0: case 12: /* Close 'X' | Cancel button */
   218 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   214 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   219 			break;
   215 			break;
   220 		case 4: case 5: /* Connection type */
   216 		case 8: { /* Matrix to show networkgames */
   221 			ShowDropDownMenu(w, _connection_types_dropdown, _network_connection, 5, 0); // do it for widget 5
       
   222 			return;
       
   223 		case 10: { /* Matrix to show networkgames */
       
   224 			uint32 id_v = (e->click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
   217 			uint32 id_v = (e->click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
   225 
   218 
   226 			if (id_v >= w->vscroll.cap) { return;} // click out of bounds
   219 			if (id_v >= w->vscroll.cap) { return;} // click out of bounds
   227 			id_v += w->vscroll.pos;
   220 			id_v += w->vscroll.pos;
   228 
   221 
   263 				else
   256 				else
   264 					_str_server_address = STR_EMPTY;
   257 					_str_server_address = STR_EMPTY;
   265 			}
   258 			}
   266 			SetWindowDirty(w);
   259 			SetWindowDirty(w);
   267 		} break;
   260 		} break;
   268 		case 11: /* Find server automatically */
   261 		case 9: /* Find server automatically */
   269 			NetworkUDPSearchGame();
   262 			NetworkUDPSearchGame();
   270 			break;
   263 			break;
   271 		case 12: { // Add a server
   264 		case 10: { // Add a server
   272 				StringID str = AllocateName((byte*)_network_default_ip, 0);
   265 				StringID str = AllocateName((byte*)_network_default_ip, 0);
   273 
   266 
   274 				ShowQueryString(
   267 				ShowQueryString(
   275 				str,
   268 				str,
   276 				STR_NETWORK_ENTER_IP,
   269 				STR_NETWORK_ENTER_IP,
   278 				250, // characters up to this width pixels, whichever is satisfied first
   271 				250, // characters up to this width pixels, whichever is satisfied first
   279 				w->window_class,
   272 				w->window_class,
   280 				w->window_number);
   273 				w->window_number);
   281 				DeleteName(str);
   274 				DeleteName(str);
   282 		} break;
   275 		} break;
   283 		case 13: /* Start server */
   276 		case 11: /* Start server */
   284 			ShowNetworkStartServerWindow();
   277 			ShowNetworkStartServerWindow();
   285 			break;
   278 			break;
   286 		case 17: /* Join Game */
   279 		case 15: /* Join Game */
   287 			if (_selected_item != NULL) {
   280 			if (_selected_item != NULL) {
   288 				memcpy(&_network_game_info, &_selected_item->info, sizeof(NetworkGameInfo));
   281 				memcpy(&_network_game_info, &_selected_item->info, sizeof(NetworkGameInfo));
   289 				snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&_selected_item->ip));
   282 				snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&_selected_item->ip));
   290 				_network_last_port = _selected_item->port;
   283 				_network_last_port = _selected_item->port;
   291 				ShowNetworkLobbyWindow();
   284 				ShowNetworkLobbyWindow();
   292 			}
   285 			}
   293 			break;
   286 			break;
   294 		case 18: // Refresh
   287 		case 16: // Refresh
   295 			if (_selected_item != NULL) {
   288 			if (_selected_item != NULL) {
   296 				NetworkQueryServer(_selected_item->info.hostname, _selected_item->port, true);
   289 				NetworkQueryServer(_selected_item->info.hostname, _selected_item->port, true);
   297 			}
   290 			}
   298 			break;
   291 			break;
   299 
   292 
   300 	}	break;
   293 	}	break;
   301 
   294 
   302 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
       
   303 		_network_connection = e->dropdown.index;
       
   304 		switch (_network_connection) {
       
   305 		case 0: /* LAN */
       
   306 //			NetworkGameListFromLAN();
       
   307 			break;
       
   308 		case 1: /* Internet */
       
   309 //			NetworkGameListFromInternet();
       
   310 			break;
       
   311 		}
       
   312 
       
   313 		SetWindowDirty(w);
       
   314 		break;
       
   315 
       
   316 	case WE_MOUSELOOP:
   295 	case WE_MOUSELOOP:
   317 		if (_selected_field == 3)
   296 		if (_selected_field == 3)
   318 			HandleEditBox(w, 3);
   297 			HandleEditBox(w, 3);
   319 
   298 
   320 		break;
   299 		break;
   323 		if (_selected_field != 3)
   302 		if (_selected_field != 3)
   324 			break;
   303 			break;
   325 
   304 
   326 		switch (HandleEditBoxKey(w, 3, e)) {
   305 		switch (HandleEditBoxKey(w, 3, e)) {
   327 		case 1:
   306 		case 1:
   328 			HandleButtonClick(w, 10);
   307 			HandleButtonClick(w, 8);
   329 			break;
   308 			break;
   330 		}
   309 		}
   331 
   310 
   332 		// The name is only allowed when it starts with a letter!
   311 		// The name is only allowed when it starts with a letter!
   333 		if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ')
   312 		if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ')
   368 {     WWT_IMGBTN,   BGC,     0,   479,    14,   214, 0x0,													STR_NULL},
   347 {     WWT_IMGBTN,   BGC,     0,   479,    14,   214, 0x0,													STR_NULL},
   369 
   348 
   370 /* LEFT SIDE */
   349 /* LEFT SIDE */
   371 {     WWT_IMGBTN,   BGC,    90,   230,    22,    33, 0x0,													STR_NETWORK_ENTER_NAME_TIP},
   350 {     WWT_IMGBTN,   BGC,    90,   230,    22,    33, 0x0,													STR_NETWORK_ENTER_NAME_TIP},
   372 
   351 
   373 {          WWT_6,   BGC,    90,   230,    42,    53, STR_NETWORK_COMBO1,					STR_NETWORK_CONNECTION_TIP},
       
   374 {   WWT_CLOSEBOX,   BGC,   219,   229,    43,    52, STR_0225,										STR_NETWORK_CONNECTION_TIP},
       
   375 
       
   376 {  WWT_SCROLLBAR,   BGC,   220,   230,    62,   185, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
   352 {  WWT_SCROLLBAR,   BGC,   220,   230,    62,   185, 0x0,													STR_0190_SCROLL_BAR_SCROLLS_LIST},
   377 
   353 
   378 {     WWT_IMGBTN,   BTC,    10,   130,    62,    73, 0x0,													STR_NETWORK_GAME_NAME_TIP },
   354 {     WWT_IMGBTN,   BTC,    10,   130,    62,    73, 0x0,													STR_NETWORK_GAME_NAME_TIP },
   379 {     WWT_IMGBTN,   BTC,   131,   180,    62,    73, 0x0,													STR_NETWORK_CLIENTS_CAPTION_TIP },
   355 {     WWT_IMGBTN,   BTC,   131,   180,    62,    73, 0x0,													STR_NETWORK_CLIENTS_CAPTION_TIP },
   380 {     WWT_IMGBTN,   BTC,   181,   219,    62,    73, 0x0,													STR_NETWORK_INFO_ICONS_TIP },
   356 {     WWT_IMGBTN,   BTC,   181,   219,    62,    73, 0x0,													STR_NETWORK_INFO_ICONS_TIP },
   413 
   389 
   414 //	NetworkLobbyInit();
   390 //	NetworkLobbyInit();
   415 	w = AllocateWindowDesc(&_network_game_window_desc);
   391 	w = AllocateWindowDesc(&_network_game_window_desc);
   416 	ttd_strlcpy(_edit_str_buf, _network_player_name, MAX_QUERYSTR_LEN);
   392 	ttd_strlcpy(_edit_str_buf, _network_player_name, MAX_QUERYSTR_LEN);
   417 	w->vscroll.cap = 8;
   393 	w->vscroll.cap = 8;
   418 	w->disabled_state = (1<<4) | (1<<5); // disable buttons not yet working
       
   419 //	NetworkGameListFromLAN(); // default dropdown item is LAN, so fill that array
       
   420 
   394 
   421 	WP(w,querystr_d).caret = 1;
   395 	WP(w,querystr_d).caret = 1;
   422 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   396 	WP(w,querystr_d).maxlen = MAX_QUERYSTR_LEN;
   423 	WP(w,querystr_d).maxwidth = 120;
   397 	WP(w,querystr_d).maxwidth = 120;
   424 	WP(w,querystr_d).buf = _edit_str_buf;
   398 	WP(w,querystr_d).buf = _edit_str_buf;
   468 	switch(e->event) {
   442 	switch(e->event) {
   469 	case WE_PAINT: {
   443 	case WE_PAINT: {
   470 		int y = NSSWND_START, pos;
   444 		int y = NSSWND_START, pos;
   471 		const FiosItem *item;
   445 		const FiosItem *item;
   472 
   446 
   473 		SetDParam(7, STR_NETWORK_2_CLIENTS + _network_game_info.clients_max - 2);
   447 		SetDParam(7, STR_NETWORK_LAN_INTERNET + _network_advertise);
   474 		SetDParam(9, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
   448 		SetDParam(9, STR_NETWORK_2_CLIENTS + _network_game_info.clients_max - 2);
       
   449 		SetDParam(11, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
   475 		DrawWindowWidgets(w);
   450 		DrawWindowWidgets(w);
   476 
   451 
   477 		GfxFillRect(11, 63, 239, 165, 0xD7);
   452 		GfxFillRect(11, 63, 239, 165, 0xD7);
   478 
   453 
   479 		DrawEditBox(w, 3);
   454 		DrawEditBox(w, 3);
   480 
   455 
   481 		DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2);
   456 		DrawString(10, 22, STR_NETWORK_NEW_GAME_NAME, 2);
   482 
   457 
   483 		DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2);
   458 		DrawString(10, 43, STR_NETWORK_SELECT_MAP, 2);
   484 		DrawString(260, 63, STR_NETWORK_NUMBER_OF_CLIENTS, 2);
   459 		DrawString(260, 63, STR_NETWORK_CONNECTION, 2);
   485 		DrawString(260, 105, STR_NETWORK_LANGUAGE_SPOKEN, 2);
   460 		DrawString(260, 95, STR_NETWORK_NUMBER_OF_CLIENTS, 2);
       
   461 		DrawString(260, 127, STR_NETWORK_LANGUAGE_SPOKEN, 2);
   486 
   462 
   487 		// draw list of maps
   463 		// draw list of maps
   488 		pos = w->vscroll.pos;
   464 		pos = w->vscroll.pos;
   489 		while (pos < _fios_num + 1) {
   465 		while (pos < _fios_num + 1) {
   490 			item = _fios_list + pos - 1;
   466 			item = _fios_list + pos - 1;
   501 	}	break;
   477 	}	break;
   502 
   478 
   503 	case WE_CLICK:
   479 	case WE_CLICK:
   504 		_selected_field = e->click.widget;
   480 		_selected_field = e->click.widget;
   505 		switch(e->click.widget) {
   481 		switch(e->click.widget) {
   506 		case 0: case 13: /* Close 'X' | Cancel button */
   482 		case 0: case 15: /* Close 'X' | Cancel button */
   507 			ShowNetworkGameWindow();
   483 			ShowNetworkGameWindow();
   508 			break;
   484 			break;
   509 		case 4: { /* Set password button */
   485 		case 4: { /* Set password button */
   510 			StringID str;
   486 			StringID str;
   511 			str = AllocateName(_network_game_info.server_password, 0);
   487 			str = AllocateName(_network_game_info.server_password, 0);
   518 				return;
   494 				return;
   519 			if (y == 0) selected_map = NULL;
   495 			if (y == 0) selected_map = NULL;
   520 			else selected_map = _fios_list + y-1;
   496 			else selected_map = _fios_list + y-1;
   521 			SetWindowDirty(w);
   497 			SetWindowDirty(w);
   522 			} break;
   498 			} break;
   523 		case 7: case 8: /* Number of Players */
   499 		case 7: case 8: /* Connection type */
   524 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.clients_max - 2, 8, 0); // do it for widget 8
   500 			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0); // do it for widget 8
       
   501 			break;
       
   502 		case 9: case 10: /* Number of Players */
       
   503 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.clients_max - 2, 10, 0); // do it for widget 10
   525 			return;
   504 			return;
   526 		case 9: case 10: /* Language */
   505 		case 11: case 12: /* Language */
   527 			ShowDropDownMenu(w, _language_dropdown, _network_game_info.server_lang, 10, 0); // do it for widget 10
   506 			ShowDropDownMenu(w, _language_dropdown, _network_game_info.server_lang, 12, 0); // do it for widget 12
   528 			return;
   507 			return;
   529 		case  11: /* Start game */
   508 		case 13: /* Start game */
   530 			_is_network_server = true;
   509 			_is_network_server = true;
   531 			ttd_strlcpy(_network_server_name, WP(w,querystr_d).buf, sizeof(_network_server_name));
   510 			ttd_strlcpy(_network_server_name, WP(w,querystr_d).buf, sizeof(_network_server_name));
   532 			if(selected_map==NULL) { // start random new game
   511 			if(selected_map==NULL) { // start random new game
   533 				DoCommandP(0, Random(), InteractiveRandom(), NULL, CMD_GEN_RANDOM_NEW_GAME);
   512 				DoCommandP(0, Random(), InteractiveRandom(), NULL, CMD_GEN_RANDOM_NEW_GAME);
   534 			} else { // load a scenario
   513 			} else { // load a scenario
   540 					DeleteWindow(w);
   519 					DeleteWindow(w);
   541 					DoCommandP(0, Random(), InteractiveRandom(), NULL, CMD_START_SCENARIO);
   520 					DoCommandP(0, Random(), InteractiveRandom(), NULL, CMD_START_SCENARIO);
   542 				}
   521 				}
   543 			}
   522 			}
   544 			break;
   523 			break;
   545 		case 12: /* Load game */
   524 		case 14: /* Load game */
   546 			_is_network_server = true;
   525 			_is_network_server = true;
   547 			ttd_strlcpy(_network_server_name, WP(w,querystr_d).buf, sizeof(_network_server_name));
   526 			ttd_strlcpy(_network_server_name, WP(w,querystr_d).buf, sizeof(_network_server_name));
   548 			snprintf(_network_game_info.map_name, sizeof(_network_game_info.map_name), "Loaded game");
   527 			snprintf(_network_game_info.map_name, sizeof(_network_game_info.map_name), "Loaded game");
   549 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   528 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   550 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   529 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   555 		break;
   534 		break;
   556 
   535 
   557 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
   536 	case WE_DROPDOWN_SELECT: /* we have selected a dropdown item in the list */
   558 		switch(e->dropdown.button) {
   537 		switch(e->dropdown.button) {
   559 			case 8:
   538 			case 8:
       
   539 				_network_advertise = (e->dropdown.index == 0) ? false : true;
       
   540 				break;
       
   541 			case 10:
   560 				_network_game_info.clients_max = e->dropdown.index + 2;
   542 				_network_game_info.clients_max = e->dropdown.index + 2;
   561 				break;
   543 				break;
   562 			case 10:
   544 			case 12:
   563 				_network_game_info.server_lang = e->dropdown.index;
   545 				_network_game_info.server_lang = e->dropdown.index;
   564 				break;
   546 				break;
   565 		}
   547 		}
   566 
   548 
   567 		SetWindowDirty(w);
   549 		SetWindowDirty(w);
   604 { WWT_PUSHTXTBTN,   BTC,   270,   380,    22,    33, STR_NETWORK_SET_PASSWORD,			STR_NETWORK_PASSWORD_TIP},
   586 { WWT_PUSHTXTBTN,   BTC,   270,   380,    22,    33, STR_NETWORK_SET_PASSWORD,			STR_NETWORK_PASSWORD_TIP},
   605 
   587 
   606 {          WWT_6,   BGC,    10,   251,    62,   166, 0x0,														STR_NETWORK_SELECT_MAP_TIP},
   588 {          WWT_6,   BGC,    10,   251,    62,   166, 0x0,														STR_NETWORK_SELECT_MAP_TIP},
   607 {  WWT_SCROLLBAR,   BGC,   240,   250,    63,   165, 0x0,														STR_0190_SCROLL_BAR_SCROLLS_LIST},
   589 {  WWT_SCROLLBAR,   BGC,   240,   250,    63,   165, 0x0,														STR_0190_SCROLL_BAR_SCROLLS_LIST},
   608 
   590 
   609 {          WWT_6,   BGC,   260,   390,    77,    88, STR_NETWORK_COMBO2,						STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   591 {          WWT_6,   BGC,   260,   390,    77,    88, STR_NETWORK_COMBO1,						STR_NETWORK_CONNECTION_TIP},
   610 {   WWT_CLOSEBOX,   BGC,   379,   389,    78,    87, STR_0225,											STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   592 {   WWT_CLOSEBOX,   BGC,   379,   389,    78,    87, STR_0225,											STR_NETWORK_CONNECTION_TIP},
   611 
   593 
   612 {          WWT_6,   BGC,   260,   390,   119,   130, STR_NETWORK_COMBO3,						STR_NETWORK_LANGUAGE_TIP},
   594 {          WWT_6,   BGC,   260,   390,   109,   120, STR_NETWORK_COMBO2,						STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   613 {   WWT_CLOSEBOX,   BGC,   379,   389,   120,   129, STR_0225,											STR_NETWORK_LANGUAGE_TIP},
   595 {   WWT_CLOSEBOX,   BGC,   379,   389,   110,   119, STR_0225,											STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
       
   596 
       
   597 {          WWT_6,   BGC,   260,   390,   141,   152, STR_NETWORK_COMBO3,						STR_NETWORK_LANGUAGE_TIP},
       
   598 {   WWT_CLOSEBOX,   BGC,   379,   389,   142,   151, STR_0225,											STR_NETWORK_LANGUAGE_TIP},
   614 
   599 
   615 { WWT_PUSHTXTBTN,   BTC,    55,   145,   180,   191, STR_NETWORK_START_GAME,				STR_NETWORK_START_GAME_TIP},
   600 { WWT_PUSHTXTBTN,   BTC,    55,   145,   180,   191, STR_NETWORK_START_GAME,				STR_NETWORK_START_GAME_TIP},
   616 { WWT_PUSHTXTBTN,   BTC,   155,   245,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NETWORK_LOAD_GAME_TIP},
   601 { WWT_PUSHTXTBTN,   BTC,   155,   245,   180,   191, STR_NETWORK_LOAD_GAME,					STR_NETWORK_LOAD_GAME_TIP},
   617 { WWT_PUSHTXTBTN,   BTC,   255,   345,   180,   191, STR_012E_CANCEL,								STR_NULL},
   602 { WWT_PUSHTXTBTN,   BTC,   255,   345,   180,   191, STR_012E_CANCEL,								STR_NULL},
   618 {   WIDGETS_END},
   603 {   WIDGETS_END},