src/network/network_gui.cpp
changeset 7935 b5bc2bd79e6b
parent 7859 f0d341e69326
child 7937 a65b8906ba7f
equal deleted inserted replaced
7934:4e1280beb7e4 7935:b5bc2bd79e6b
    35 struct network_d {
    35 struct network_d {
    36 	PlayerID company;        // select company in network lobby
    36 	PlayerID company;        // select company in network lobby
    37 	byte field;              // select text-field in start-server and game-listing
    37 	byte field;              // select text-field in start-server and game-listing
    38 	NetworkGameList *server; // selected server in lobby and game-listing
    38 	NetworkGameList *server; // selected server in lobby and game-listing
    39 	FiosItem *map;           // selected map in start-server
    39 	FiosItem *map;           // selected map in start-server
       
    40 	byte widget_id;          ///< The widget that has the pop-up input menu
    40 };
    41 };
    41 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(network_d));
    42 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(network_d));
    42 
    43 
    43 struct network_ql_d {
    44 struct network_ql_d {
    44 	network_d n;                 // see above; general stuff
    45 	network_d n;                 // see above; general stuff
    65 };
    66 };
    66 
    67 
    67 static const StringID _lan_internet_types_dropdown[] = {
    68 static const StringID _lan_internet_types_dropdown[] = {
    68 	STR_NETWORK_LAN,
    69 	STR_NETWORK_LAN,
    69 	STR_NETWORK_INTERNET,
    70 	STR_NETWORK_INTERNET,
    70 	INVALID_STRING_ID
       
    71 };
       
    72 
       
    73 static const StringID _players_dropdown[] = {
       
    74 	STR_NETWORK_0_PLAYERS,
       
    75 	STR_NETWORK_1_PLAYERS,
       
    76 	STR_NETWORK_2_PLAYERS,
       
    77 	STR_NETWORK_3_PLAYERS,
       
    78 	STR_NETWORK_4_PLAYERS,
       
    79 	STR_NETWORK_5_PLAYERS,
       
    80 	STR_NETWORK_6_PLAYERS,
       
    81 	STR_NETWORK_7_PLAYERS,
       
    82 	STR_NETWORK_8_PLAYERS,
       
    83 	STR_NETWORK_9_PLAYERS,
       
    84 	STR_NETWORK_10_PLAYERS,
       
    85 	INVALID_STRING_ID
    71 	INVALID_STRING_ID
    86 };
    72 };
    87 
    73 
    88 static StringID _language_dropdown[NETLANG_COUNT + 1] = {STR_NULL};
    74 static StringID _language_dropdown[NETLANG_COUNT + 1] = {STR_NULL};
    89 
    75 
   262 		SetWindowWidgetHiddenState(w, 18, sel == NULL ||
   248 		SetWindowWidgetHiddenState(w, 18, sel == NULL ||
   263 				!sel->online ||
   249 				!sel->online ||
   264 				sel->info.grfconfig == NULL);
   250 				sel->info.grfconfig == NULL);
   265 
   251 
   266 		SetDParam(0, 0x00);
   252 		SetDParam(0, 0x00);
   267 		SetDParam(7, _lan_internet_types_dropdown[_network_lan_internet]);
   253 		SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
   268 		DrawWindowWidgets(w);
   254 		DrawWindowWidgets(w);
   269 
   255 
   270 		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
   256 		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
   271 
   257 
   272 		DrawString(9, 23, STR_NETWORK_CONNECTION, 2);
   258 		DrawString(9, 23, STR_NETWORK_CONNECTION, 2);
   533 		break;
   519 		break;
   534 	}
   520 	}
   535 }
   521 }
   536 
   522 
   537 static const Widget _network_game_window_widgets[] = {
   523 static const Widget _network_game_window_widgets[] = {
   538 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                    STR_018B_CLOSE_WINDOW},
   524 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW},
   539 {    WWT_CAPTION,   RESIZE_RIGHT,  BGC,    11,   449,     0,    13, STR_NETWORK_MULTIPLAYER,     STR_NULL},
   525 {    WWT_CAPTION,   RESIZE_RIGHT,  BGC,    11,   449,     0,    13, STR_NETWORK_MULTIPLAYER,        STR_NULL},
   540 {      WWT_PANEL,   RESIZE_RB,     BGC,     0,   449,    14,   263, 0x0,                         STR_NULL},
   526 {      WWT_PANEL,   RESIZE_RB,     BGC,     0,   449,    14,   263, 0x0,                            STR_NULL},
   541 
   527 
   542 /* LEFT SIDE */
   528 /* LEFT SIDE */
   543 {      WWT_PANEL,   RESIZE_LR,     BGC,   290,   440,    22,    33, 0x0,                         STR_NETWORK_ENTER_NAME_TIP},
   529 {      WWT_PANEL,   RESIZE_LR,     BGC,   290,   440,    22,    33, 0x0,                            STR_NETWORK_ENTER_NAME_TIP},
   544 
   530 
   545 {      WWT_INSET,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_COMBO1,          STR_NETWORK_CONNECTION_TIP},
   531 {      WWT_INSET,   RESIZE_NONE,   BGC,    90,   181,    22,    33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},
   546 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   170,   180,    23,    32, STR_0225,                    STR_NETWORK_CONNECTION_TIP},
   532 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   170,   180,    23,    32, STR_0225,                       STR_NETWORK_CONNECTION_TIP},
   547 
   533 
   548 { WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,       STR_NETWORK_GAME_NAME_TIP},
   534 { WWT_PUSHTXTBTN,   RESIZE_RIGHT,  BTC,    10,    70,    42,    53, STR_NETWORK_GAME_NAME,          STR_NETWORK_GAME_NAME_TIP},
   549 { WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP},
   535 { WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,    71,   150,    42,    53, STR_NETWORK_CLIENTS_CAPTION,    STR_NETWORK_CLIENTS_CAPTION_TIP},
   550 { WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                   STR_NETWORK_INFO_ICONS_TIP},
   536 { WWT_PUSHTXTBTN,   RESIZE_LR,     BTC,   151,   190,    42,    53, STR_EMPTY,                      STR_NETWORK_INFO_ICONS_TIP},
   551 
   537 
   552 {     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,               STR_NETWORK_CLICK_GAME_TO_SELECT},
   538 {     WWT_MATRIX,   RESIZE_RB,     BGC,    10,   190,    54,   236, (13 << 8) + 1,                  STR_NETWORK_CLICK_GAME_TO_SELECT},
   553 {  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, STR_NULL,                    STR_0190_SCROLL_BAR_SCROLLS_LIST},
   539 {  WWT_SCROLLBAR,   RESIZE_LRB,    BGC,   191,   202,    42,   236, STR_NULL,                       STR_0190_SCROLL_BAR_SCROLLS_LIST},
   554 
   540 
   555 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,     STR_NETWORK_FIND_SERVER_TIP},
   541 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,    10,   110,   246,   257, STR_NETWORK_FIND_SERVER,        STR_NETWORK_FIND_SERVER_TIP},
   556 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,      STR_NETWORK_ADD_SERVER_TIP},
   542 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   118,   218,   246,   257, STR_NETWORK_ADD_SERVER,         STR_NETWORK_ADD_SERVER_TIP},
   557 
   543 
   558 /* RIGHT SIDE */
   544 /* RIGHT SIDE */
   559 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,    STR_NETWORK_START_SERVER_TIP},
   545 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   226,   326,   246,   257, STR_NETWORK_START_SERVER,       STR_NETWORK_START_SERVER_TIP},
   560 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,             STR_NULL},
   546 { WWT_PUSHTXTBTN,   RESIZE_TB,     BTC,   334,   434,   246,   257, STR_012E_CANCEL,                STR_NULL},
   561 
   547 
   562 {      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                         STR_NULL},
   548 {      WWT_PANEL,   RESIZE_LRB,    BGC,   210,   440,    42,   236, 0x0,                            STR_NULL},
   563 
   549 
   564 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,       STR_NULL},
   550 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   215,   315,   215,   226, STR_NETWORK_JOIN_GAME,          STR_NULL},
   565 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,         STR_NETWORK_REFRESH_TIP},
   551 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   215,   226, STR_NETWORK_REFRESH,            STR_NETWORK_REFRESH_TIP},
   566 
   552 
   567 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,  STR_NULL},
   553 { WWT_PUSHTXTBTN,   RESIZE_LRTB,   BTC,   330,   435,   197,   208, STR_NEWGRF_SETTINGS_BUTTON,     STR_NULL},
   568 
   554 
   569 {  WWT_RESIZEBOX,   RESIZE_LRTB,   BGC,   438,   449,   252,   263, 0x0,                         STR_RESIZE_BUTTON },
   555 {  WWT_RESIZEBOX,   RESIZE_LRTB,   BGC,   438,   449,   252,   263, 0x0,                            STR_RESIZE_BUTTON },
   570 
   556 
   571 {   WIDGETS_END},
   557 {   WIDGETS_END},
   572 };
   558 };
   573 
   559 
   574 static const WindowDesc _network_game_window_desc = {
   560 static const WindowDesc _network_game_window_desc = {
   629 
   615 
   630 	case WE_PAINT: {
   616 	case WE_PAINT: {
   631 		int y = NSSWND_START, pos;
   617 		int y = NSSWND_START, pos;
   632 		const FiosItem *item;
   618 		const FiosItem *item;
   633 
   619 
   634 		SetDParam( 7, _connection_types_dropdown[_network_advertise]);
   620 		SetDParam(1, _connection_types_dropdown[_network_advertise]);
   635 		SetDParam( 9, _players_dropdown[_network_game_info.clients_max]);
   621 		SetDParam(2, _network_game_info.clients_max);
   636 		SetDParam(11, _players_dropdown[_network_game_info.companies_max]);
   622 		SetDParam(3, _network_game_info.companies_max);
   637 		SetDParam(13, _players_dropdown[_network_game_info.spectators_max]);
   623 		SetDParam(4, _network_game_info.spectators_max);
   638 		SetDParam(15, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
   624 		SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
   639 		DrawWindowWidgets(w);
   625 		DrawWindowWidgets(w);
   640 
   626 
   641 		GfxFillRect(11, 63, 258, 215, 0xD7);
   627 		GfxFillRect(11, 63, 258, 215, 0xD7);
   642 		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
   628 		DrawEditBox(w, &WP(w, network_ql_d).q, 3);
   643 
   629 
   674 
   660 
   675 	case WE_CLICK:
   661 	case WE_CLICK:
   676 		nd->field = e->we.click.widget;
   662 		nd->field = e->we.click.widget;
   677 		switch (e->we.click.widget) {
   663 		switch (e->we.click.widget) {
   678 		case 0: /* Close 'X' */
   664 		case 0: /* Close 'X' */
   679 		case 19: /* Cancel button */
   665 		case 22: /* Cancel button */
   680 			ShowNetworkGameWindow();
   666 			ShowNetworkGameWindow();
   681 			break;
   667 			break;
   682 
   668 
   683 		case 4: /* Set password button */
   669 		case 4: /* Set password button */
       
   670 			nd->widget_id = 4;
   684 			ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
   671 			ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
   685 			break;
   672 			break;
   686 
   673 
   687 		case 5: { /* Select map */
   674 		case 5: { /* Select map */
   688 			int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   675 			int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   694 			SetWindowDirty(w);
   681 			SetWindowDirty(w);
   695 			} break;
   682 			} break;
   696 		case 7: case 8: /* Connection type */
   683 		case 7: case 8: /* Connection type */
   697 			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0, 0); // do it for widget 8
   684 			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0, 0); // do it for widget 8
   698 			break;
   685 			break;
   699 		case 9: case 10: /* Number of Players (hide 0 and 1 players) */
   686 		case  9: case 11: // Click on up/down button for number of players
   700 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.clients_max, 10, 0, 3);
   687 		case 12: case 14: // Click on up/down button for number of companies
   701 			break;
   688 		case 15: case 17: // Click on up/down button for number of spectators
   702 		case 11: case 12: /* Number of Companies (hide 0, 9 and 10 companies; max is 8) */
   689 			/* Don't allow too fast scrolling */
   703 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.companies_max, 12, 0, 1537);
   690 			if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
   704 			break;
   691 				HandleButtonClick(w, e->we.click.widget);
   705 		case 13: case 14: /* Number of Spectators */
   692 				SetWindowDirty(w);
   706 			ShowDropDownMenu(w, _players_dropdown, _network_game_info.spectators_max, 14, 0, 0);
   693 				switch (e->we.click.widget) {
   707 			break;
   694 					default: NOT_REACHED();
   708 		case 15: case 16: { /* Language */
   695 					case  9: case 11: _network_game_info.clients_max    = clamp(_network_game_info.clients_max    + e->we.click.widget - 10, 2, MAX_CLIENTS); break;
       
   696 					case 12: case 14: _network_game_info.companies_max  = clamp(_network_game_info.companies_max  + e->we.click.widget - 13, 1, MAX_PLAYERS); break;
       
   697 					case 15: case 17: _network_game_info.spectators_max = clamp(_network_game_info.spectators_max + e->we.click.widget - 16, 0, MAX_CLIENTS); break;
       
   698 				}
       
   699 			}
       
   700 			_left_button_clicked = false;
       
   701 			break;
       
   702 		case 10: // Click on number of players
       
   703 			nd->widget_id = 10;
       
   704 			SetDParam(0, _network_game_info.clients_max);
       
   705 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL);
       
   706 			break;
       
   707 		case 13: // Click on number of companies
       
   708 			nd->widget_id = 13;
       
   709 			SetDParam(0, _network_game_info.companies_max);
       
   710 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL);
       
   711 			break;
       
   712 		case 16: // Click on number of companies
       
   713 			nd->widget_id = 16;
       
   714 			SetDParam(0, _network_game_info.spectators_max);
       
   715 			ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
       
   716 			break;
       
   717 		case 18: case 19: { /* Language */
   709 			uint sel = 0;
   718 			uint sel = 0;
   710 			for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
   719 			for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
   711 				if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
   720 				if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
   712 					sel = i;
   721 					sel = i;
   713 					break;
   722 					break;
   714 				}
   723 				}
   715 			}
   724 			}
   716 			ShowDropDownMenu(w, _language_dropdown, sel, 16, 0, 0);
   725 			ShowDropDownMenu(w, _language_dropdown, sel, 19, 0, 0);
   717 			break;
   726 			break;
   718 		}
   727 		}
   719 		case 17: /* Start game */
   728 		case 20: /* Start game */
   720 			_is_network_server = true;
   729 			_is_network_server = true;
   721 
   730 
   722 			if (nd->map == NULL) { // start random new game
   731 			if (nd->map == NULL) { // start random new game
   723 				ShowGenerateLandscape();
   732 				ShowGenerateLandscape();
   724 			} else { // load a scenario
   733 			} else { // load a scenario
   731 					DeleteWindow(w);
   740 					DeleteWindow(w);
   732 					SwitchMode(SM_START_SCENARIO);
   741 					SwitchMode(SM_START_SCENARIO);
   733 				}
   742 				}
   734 			}
   743 			}
   735 			break;
   744 			break;
   736 		case 18: /* Load game */
   745 		case 21: /* Load game */
   737 			_is_network_server = true;
   746 			_is_network_server = true;
   738 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   747 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   739 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   748 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   740 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   749 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   741 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   750 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   767 
   776 
   768 			ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
   777 			ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
   769 		}
   778 		}
   770 		break;
   779 		break;
   771 
   780 
   772 	case WE_ON_EDIT_TEXT: {
   781 	case WE_ON_EDIT_TEXT:
   773 		ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
   782 		if (e->we.edittext.str == NULL) break;
   774 		_network_game_info.use_password = (_network_server_password[0] != '\0');
   783 
       
   784 		if (nd->widget_id == 4) {
       
   785 			ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
       
   786 			_network_game_info.use_password = (_network_server_password[0] != '\0');
       
   787 		} else {
       
   788 			int32 value = atoi(e->we.edittext.str);
       
   789 			InvalidateWidget(w, nd->widget_id);
       
   790 			switch (nd->widget_id) {
       
   791 				default: NOT_REACHED();
       
   792 				case 10: _network_game_info.clients_max    = clamp(value, 2, MAX_CLIENTS); break;
       
   793 				case 13: _network_game_info.companies_max  = clamp(value, 1, MAX_PLAYERS); break;
       
   794 				case 16: _network_game_info.spectators_max = clamp(value, 0, MAX_CLIENTS); break;
       
   795 			}
       
   796 		}
       
   797 
   775 		SetWindowDirty(w);
   798 		SetWindowDirty(w);
   776 	} break;
   799 		break;
   777 	}
   800 	}
   778 }
   801 }
   779 
   802 
   780 static const Widget _network_start_server_window_widgets[] = {
   803 static const Widget _network_start_server_window_widgets[] = {
   781 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                      STR_018B_CLOSE_WINDOW },
   804 {   WWT_CLOSEBOX,   RESIZE_NONE,   BGC,     0,    10,     0,    13, STR_00C5,                       STR_018B_CLOSE_WINDOW },
   782 {    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW, STR_NULL},
   805 {    WWT_CAPTION,   RESIZE_NONE,   BGC,    11,   419,     0,    13, STR_NETWORK_START_GAME_WINDOW,  STR_NULL},
   783 {      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                           STR_NULL},
   806 {      WWT_PANEL,   RESIZE_NONE,   BGC,     0,   419,    14,   243, 0x0,                            STR_NULL},
   784 
   807 
   785 {      WWT_PANEL,   RESIZE_NONE,   BGC,   100,   272,    22,    33, 0x0,                           STR_NETWORK_NEW_GAME_NAME_TIP},
   808 {      WWT_PANEL,   RESIZE_NONE,   BGC,   100,   272,    22,    33, 0x0,                            STR_NETWORK_NEW_GAME_NAME_TIP},
   786 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,      STR_NETWORK_PASSWORD_TIP},
   809 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   285,   405,    22,    33, STR_NETWORK_SET_PASSWORD,       STR_NETWORK_PASSWORD_TIP},
   787 
   810 
   788 {      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, 0x0,                           STR_NETWORK_SELECT_MAP_TIP},
   811 {      WWT_INSET,   RESIZE_NONE,   BGC,    10,   271,    62,   216, 0x0,                            STR_NETWORK_SELECT_MAP_TIP},
   789 {  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                           STR_0190_SCROLL_BAR_SCROLLS_LIST},
   812 {  WWT_SCROLLBAR,   RESIZE_NONE,   BGC,   259,   270,    63,   215, 0x0,                            STR_0190_SCROLL_BAR_SCROLLS_LIST},
   790 /* Combo boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
   813 /* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
   791 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_COMBO1,            STR_NETWORK_CONNECTION_TIP},
   814 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,    77,    88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP},
   792 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,    78,    87, STR_0225,                      STR_NETWORK_CONNECTION_TIP},
   815 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,    78,    87, STR_0225,                       STR_NETWORK_CONNECTION_TIP},
   793 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   109,   120, STR_NETWORK_COMBO2,            STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   816 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   109,   120, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   794 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   110,   119, STR_0225,                      STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   817 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   109,   120, STR_NETWORK_CLIENTS_SELECT,     STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   795 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   141,   152, STR_NETWORK_COMBO3,            STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
   818 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   109,   120, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_CLIENTS_TIP},
   796 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   142,   151, STR_0225,                      STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
   819 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   141,   152, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
   797 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   173,   184, STR_NETWORK_COMBO4,            STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
   820 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   141,   152, STR_NETWORK_COMPANIES_SELECT,   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
   798 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   174,   183, STR_0225,                      STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
   821 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   141,   152, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_COMPANIES_TIP},
   799 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_COMBO5,            STR_NETWORK_LANGUAGE_TIP},
   822 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   280,   291,   173,   184, SPR_ARROW_DOWN,                 STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
   800 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   206,   215, STR_0225,                      STR_NETWORK_LANGUAGE_TIP},
   823 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BGC,   292,   397,   173,   184, STR_NETWORK_SPECTATORS_SELECT,  STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
   801 
   824 {     WWT_IMGBTN,   RESIZE_NONE,   BGC,   398,   410,   173,   184, SPR_ARROW_UP,                   STR_NETWORK_NUMBER_OF_SPECTATORS_TIP},
   802 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,        STR_NETWORK_START_GAME_TIP},
   825 
   803 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,         STR_NETWORK_LOAD_GAME_TIP},
   826 {      WWT_INSET,   RESIZE_NONE,   BGC,   280,   410,   205,   216, STR_NETWORK_LANGUAGE_COMBO,     STR_NETWORK_LANGUAGE_TIP},
   804 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,               STR_NULL},
   827 {    WWT_TEXTBTN,   RESIZE_NONE,   BGC,   399,   409,   206,   215, STR_0225,                       STR_NETWORK_LANGUAGE_TIP},
       
   828 
       
   829 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,    40,   140,   224,   235, STR_NETWORK_START_GAME,         STR_NETWORK_START_GAME_TIP},
       
   830 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   150,   250,   224,   235, STR_NETWORK_LOAD_GAME,          STR_NETWORK_LOAD_GAME_TIP},
       
   831 { WWT_PUSHTXTBTN,   RESIZE_NONE,   BTC,   260,   360,   224,   235, STR_012E_CANCEL,                STR_NULL},
   805 {   WIDGETS_END},
   832 {   WIDGETS_END},
   806 };
   833 };
   807 
   834 
   808 static const WindowDesc _network_start_server_window_desc = {
   835 static const WindowDesc _network_start_server_window_desc = {
   809 	WDP_CENTER, WDP_CENTER, 420, 244, 420, 244,
   836 	WDP_CENTER, WDP_CENTER, 420, 244, 420, 244,