src/network/network_gui.cpp
changeset 10784 c3c7b558b4f1
parent 10780 1c73c1821c44
child 10792 95b6eb9fcc9e
equal deleted inserted replaced
10783:2f30f2917b84 10784:c3c7b558b4f1
   238 	}
   238 	}
   239 
   239 
   240 public:
   240 public:
   241 	NetworkGameWindow(const WindowDesc *desc) : QueryStringBaseWindow(desc)
   241 	NetworkGameWindow(const WindowDesc *desc) : QueryStringBaseWindow(desc)
   242 	{
   242 	{
   243 		ttd_strlcpy(this->edit_str_buf, _network_player_name, lengthof(this->edit_str_buf));
   243 		ttd_strlcpy(this->edit_str_buf, _settings_client.network.player_name, lengthof(this->edit_str_buf));
   244 		this->afilter = CS_ALPHANUMERAL;
   244 		this->afilter = CS_ALPHANUMERAL;
   245 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 120);
   245 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 120);
   246 
   246 
   247 		UpdateNetworkGameWindow(true);
   247 		UpdateNetworkGameWindow(true);
   248 
   248 
   288 		this->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
   288 		this->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
   289 				!sel->online ||
   289 				!sel->online ||
   290 				sel->info.grfconfig == NULL);
   290 				sel->info.grfconfig == NULL);
   291 
   291 
   292 		SetDParam(0, 0x00);
   292 		SetDParam(0, 0x00);
   293 		SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
   293 		SetDParam(1, _lan_internet_types_dropdown[_settings_client.network.lan_internet]);
   294 		this->DrawWidgets();
   294 		this->DrawWidgets();
   295 
   295 
   296 		/* Edit box to set player name */
   296 		/* Edit box to set player name */
   297 		this->DrawEditBox(NGWW_PLAYER);
   297 		this->DrawEditBox(NGWW_PLAYER);
   298 
   298 
   313 			const NetworkGameList *ngl = this->servers[i];
   313 			const NetworkGameList *ngl = this->servers[i];
   314 			this->DrawServerLine(ngl, y, ngl == sel);
   314 			this->DrawServerLine(ngl, y, ngl == sel);
   315 			y += NET_PRC__SIZE_OF_ROW;
   315 			y += NET_PRC__SIZE_OF_ROW;
   316 		}
   316 		}
   317 
   317 
   318 		const NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_network_last_host), _network_last_port);
   318 		const NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_settings_client.network.last_host), _settings_client.network.last_port);
   319 		/* Draw the last joined server, if any */
   319 		/* Draw the last joined server, if any */
   320 		if (last_joined != NULL) this->DrawServerLine(last_joined, y = this->widget[NGWW_LASTJOINED].top + 3, last_joined == sel);
   320 		if (last_joined != NULL) this->DrawServerLine(last_joined, y = this->widget[NGWW_LASTJOINED].top + 3, last_joined == sel);
   321 
   321 
   322 		/* Draw the right menu */
   322 		/* Draw the right menu */
   323 		GfxFillRect(this->widget[NGWW_DETAILS].left + 1, 43, this->widget[NGWW_DETAILS].right - 1, 92, 157);
   323 		GfxFillRect(this->widget[NGWW_DETAILS].left + 1, 43, this->widget[NGWW_DETAILS].right - 1, 92, 157);
   404 			case NGWW_CANCEL: // Cancel button
   404 			case NGWW_CANCEL: // Cancel button
   405 				DeleteWindowById(WC_NETWORK_WINDOW, 0);
   405 				DeleteWindowById(WC_NETWORK_WINDOW, 0);
   406 				break;
   406 				break;
   407 
   407 
   408 			case NGWW_CONN_BTN: // 'Connection' droplist
   408 			case NGWW_CONN_BTN: // 'Connection' droplist
   409 				ShowDropDownMenu(this, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
   409 				ShowDropDownMenu(this, _lan_internet_types_dropdown, _settings_client.network.lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
   410 				break;
   410 				break;
   411 
   411 
   412 			case NGWW_NAME: // Sort by name
   412 			case NGWW_NAME: // Sort by name
   413 			case NGWW_CLIENTS: // Sort by connected clients
   413 			case NGWW_CLIENTS: // Sort by connected clients
   414 			case NGWW_INFO: // Connectivity (green dot)
   414 			case NGWW_INFO: // Connectivity (green dot)
   430 				this->server = (id_v < this->servers.Length()) ? this->servers[id_v] : NULL;
   430 				this->server = (id_v < this->servers.Length()) ? this->servers[id_v] : NULL;
   431 				this->SetDirty();
   431 				this->SetDirty();
   432 			} break;
   432 			} break;
   433 
   433 
   434 			case NGWW_LASTJOINED: {
   434 			case NGWW_LASTJOINED: {
   435 				NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_network_last_host), _network_last_port);
   435 				NetworkGameList *last_joined = NetworkGameListAddItem(inet_addr(_settings_client.network.last_host), _settings_client.network.last_port);
   436 				if (last_joined != NULL) {
   436 				if (last_joined != NULL) {
   437 					this->server = last_joined;
   437 					this->server = last_joined;
   438 					this->SetDirty();
   438 					this->SetDirty();
   439 				}
   439 				}
   440 			} break;
   440 			} break;
   441 
   441 
   442 			case NGWW_FIND: // Find server automatically
   442 			case NGWW_FIND: // Find server automatically
   443 				switch (_network_lan_internet) {
   443 				switch (_settings_client.network.lan_internet) {
   444 					case 0: NetworkUDPSearchGame(); break;
   444 					case 0: NetworkUDPSearchGame(); break;
   445 					case 1: NetworkUDPQueryMasterServer(); break;
   445 					case 1: NetworkUDPQueryMasterServer(); break;
   446 				}
   446 				}
   447 				break;
   447 				break;
   448 
   448 
   449 			case NGWW_ADD: // Add a server
   449 			case NGWW_ADD: // Add a server
   450 				ShowQueryString(
   450 				ShowQueryString(
   451 					BindCString(_network_default_ip),
   451 					BindCString(_settings_client.network.connect_to_ip),
   452 					STR_NETWORK_ENTER_IP,
   452 					STR_NETWORK_ENTER_IP,
   453 					31 | 0x1000,  // maximum number of characters OR
   453 					31 | 0x1000,  // maximum number of characters OR
   454 					250, // characters up to this width pixels, whichever is satisfied first
   454 					250, // characters up to this width pixels, whichever is satisfied first
   455 					this, CS_ALPHANUMERAL);
   455 					this, CS_ALPHANUMERAL);
   456 				break;
   456 				break;
   459 				ShowNetworkStartServerWindow();
   459 				ShowNetworkStartServerWindow();
   460 				break;
   460 				break;
   461 
   461 
   462 			case NGWW_JOIN: // Join Game
   462 			case NGWW_JOIN: // Join Game
   463 				if (this->server != NULL) {
   463 				if (this->server != NULL) {
   464 					snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&this->server->ip));
   464 					snprintf(_settings_client.network.last_host, sizeof(_settings_client.network.last_host), "%s", inet_ntoa(*(struct in_addr *)&this->server->ip));
   465 					_network_last_port = this->server->port;
   465 					_settings_client.network.last_port = this->server->port;
   466 					ShowNetworkLobbyWindow(this->server);
   466 					ShowNetworkLobbyWindow(this->server);
   467 				}
   467 				}
   468 				break;
   468 				break;
   469 
   469 
   470 			case NGWW_REFRESH: // Refresh
   470 			case NGWW_REFRESH: // Refresh
   479 
   479 
   480 	virtual void OnDropdownSelect(int widget, int index)
   480 	virtual void OnDropdownSelect(int widget, int index)
   481 	{
   481 	{
   482 		switch (widget) {
   482 		switch (widget) {
   483 			case NGWW_CONN_BTN:
   483 			case NGWW_CONN_BTN:
   484 				_network_lan_internet = index;
   484 				_settings_client.network.lan_internet = index;
   485 				break;
   485 				break;
   486 
   486 
   487 			default:
   487 			default:
   488 				NOT_REACHED();
   488 				NOT_REACHED();
   489 		}
   489 		}
   519 
   519 
   520 		if (this->HandleEditBoxKey(NGWW_PLAYER, key, keycode, state) == 1) return state; // enter pressed
   520 		if (this->HandleEditBoxKey(NGWW_PLAYER, key, keycode, state) == 1) return state; // enter pressed
   521 
   521 
   522 		/* The name is only allowed when it starts with a letter! */
   522 		/* The name is only allowed when it starts with a letter! */
   523 		if (!StrEmpty(this->edit_str_buf) && this->edit_str_buf[0] != ' ') {
   523 		if (!StrEmpty(this->edit_str_buf) && this->edit_str_buf[0] != ' ') {
   524 			ttd_strlcpy(_network_player_name, this->edit_str_buf, lengthof(_network_player_name));
   524 			ttd_strlcpy(_settings_client.network.player_name, this->edit_str_buf, lengthof(_settings_client.network.player_name));
   525 		} else {
   525 		} else {
   526 			ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
   526 			ttd_strlcpy(_settings_client.network.player_name, "Player", lengthof(_settings_client.network.player_name));
   527 		}
   527 		}
   528 		return state;
   528 		return state;
   529 	}
   529 	}
   530 
   530 
   531 	virtual void OnQueryTextFinished(char *str)
   531 	virtual void OnQueryTextFinished(char *str)
   663 	FiosItem *map;               ///< Selected map
   663 	FiosItem *map;               ///< Selected map
   664 	byte widget_id;              ///< The widget that has the pop-up input menu
   664 	byte widget_id;              ///< The widget that has the pop-up input menu
   665 
   665 
   666 	NetworkStartServerWindow(const WindowDesc *desc) : QueryStringBaseWindow(desc)
   666 	NetworkStartServerWindow(const WindowDesc *desc) : QueryStringBaseWindow(desc)
   667 	{
   667 	{
   668 		ttd_strlcpy(this->edit_str_buf, _network_server_name, lengthof(this->edit_str_buf));
   668 		ttd_strlcpy(this->edit_str_buf, _settings_client.network.server_name, lengthof(this->edit_str_buf));
   669 
   669 
   670 		_saveload_mode = SLD_NEW_GAME;
   670 		_saveload_mode = SLD_NEW_GAME;
   671 		BuildFileList();
   671 		BuildFileList();
   672 		this->vscroll.cap = 12;
   672 		this->vscroll.cap = 12;
   673 		this->vscroll.count = _fios_num + 1;
   673 		this->vscroll.count = _fios_num + 1;
   674 
   674 
   675 		this->afilter = CS_ALPHANUMERAL;
   675 		this->afilter = CS_ALPHANUMERAL;
   676 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 160);
   676 		InitializeTextBuffer(&this->text, this->edit_str_buf, lengthof(this->edit_str_buf), 160);
   677 
   677 
   678 		this->field = NSSW_GAMENAME;
   678 		this->field = NSSW_GAMENAME;
   679 		_network_game_info.use_password = !StrEmpty(_network_server_password);
   679 		_network_game_info.use_password = !StrEmpty(_settings_client.network.server_password);
   680 
   680 
   681 		this->FindWindowPlacementAndResize(desc);
   681 		this->FindWindowPlacementAndResize(desc);
   682 	}
   682 	}
   683 
   683 
   684 	virtual void OnPaint()
   684 	virtual void OnPaint()
   735 				ShowOnScreenKeyboard(this, NSSW_GAMENAME, 0, 0);
   735 				ShowOnScreenKeyboard(this, NSSW_GAMENAME, 0, 0);
   736 				break;
   736 				break;
   737 
   737 
   738 			case NSSW_SETPWD: // Set password button
   738 			case NSSW_SETPWD: // Set password button
   739 				this->widget_id = NSSW_SETPWD;
   739 				this->widget_id = NSSW_SETPWD;
   740 				ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, this, CS_ALPHANUMERAL);
   740 				ShowQueryString(BindCString(_settings_client.network.server_password), STR_NETWORK_SET_PASSWORD, 20, 250, this, CS_ALPHANUMERAL);
   741 				break;
   741 				break;
   742 
   742 
   743 			case NSSW_SELMAP: { // Select map
   743 			case NSSW_SELMAP: { // Select map
   744 				int y = (pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   744 				int y = (pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   745 
   745 
   860 	{
   860 	{
   861 		EventState state = ES_NOT_HANDLED;
   861 		EventState state = ES_NOT_HANDLED;
   862 		if (this->field == NSSW_GAMENAME) {
   862 		if (this->field == NSSW_GAMENAME) {
   863 			if (this->HandleEditBoxKey(NSSW_GAMENAME, key, keycode, state) == 1) return state; // enter pressed
   863 			if (this->HandleEditBoxKey(NSSW_GAMENAME, key, keycode, state) == 1) return state; // enter pressed
   864 
   864 
   865 			ttd_strlcpy(_network_server_name, this->text.buf, sizeof(_network_server_name));
   865 			ttd_strlcpy(_settings_client.network.server_name, this->text.buf, sizeof(_settings_client.network.server_name));
   866 		}
   866 		}
   867 
   867 
   868 		return state;
   868 		return state;
   869 	}
   869 	}
   870 
   870 
   871 	virtual void OnQueryTextFinished(char *str)
   871 	virtual void OnQueryTextFinished(char *str)
   872 	{
   872 	{
   873 		if (str == NULL) return;
   873 		if (str == NULL) return;
   874 
   874 
   875 		if (this->widget_id == NSSW_SETPWD) {
   875 		if (this->widget_id == NSSW_SETPWD) {
   876 			ttd_strlcpy(_network_server_password, str, lengthof(_network_server_password));
   876 			ttd_strlcpy(_settings_client.network.server_password, str, lengthof(_settings_client.network.server_password));
   877 			_network_game_info.use_password = !StrEmpty(_network_server_password);
   877 			_network_game_info.use_password = !StrEmpty(_settings_client.network.server_password);
   878 		} else {
   878 		} else {
   879 			int32 value = atoi(str);
   879 			int32 value = atoi(str);
   880 			this->InvalidateWidget(this->widget_id);
   880 			this->InvalidateWidget(this->widget_id);
   881 			switch (this->widget_id) {
   881 			switch (this->widget_id) {
   882 				default: NOT_REACHED();
   882 				default: NOT_REACHED();
  1102 			} break;
  1102 			} break;
  1103 
  1103 
  1104 			case NLWW_JOIN:     // Join company
  1104 			case NLWW_JOIN:     // Join company
  1105 				/* Button can be clicked only when it is enabled */
  1105 				/* Button can be clicked only when it is enabled */
  1106 				_network_playas = this->company;
  1106 				_network_playas = this->company;
  1107 				NetworkClientConnectGame(_network_last_host, _network_last_port);
  1107 				NetworkClientConnectGame(_settings_client.network.last_host, _settings_client.network.last_port);
  1108 				break;
  1108 				break;
  1109 
  1109 
  1110 			case NLWW_NEW:      // New company
  1110 			case NLWW_NEW:      // New company
  1111 				_network_playas = PLAYER_NEW_COMPANY;
  1111 				_network_playas = PLAYER_NEW_COMPANY;
  1112 				NetworkClientConnectGame(_network_last_host, _network_last_port);
  1112 				NetworkClientConnectGame(_settings_client.network.last_host, _settings_client.network.last_port);
  1113 				break;
  1113 				break;
  1114 
  1114 
  1115 			case NLWW_SPECTATE: // Spectate game
  1115 			case NLWW_SPECTATE: // Spectate game
  1116 				_network_playas = PLAYER_SPECTATOR;
  1116 				_network_playas = PLAYER_SPECTATOR;
  1117 				NetworkClientConnectGame(_network_last_host, _network_last_port);
  1117 				NetworkClientConnectGame(_settings_client.network.last_host, _settings_client.network.last_port);
  1118 				break;
  1118 				break;
  1119 
  1119 
  1120 			case NLWW_REFRESH:  // Refresh
  1120 			case NLWW_REFRESH:  // Refresh
  1121 				NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
  1121 				NetworkTCPQueryServer(_settings_client.network.last_host, _settings_client.network.last_port); // company info
  1122 				NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
  1122 				NetworkUDPQueryServer(_settings_client.network.last_host, _settings_client.network.last_port); // general data
  1123 				break;
  1123 				break;
  1124 		}
  1124 		}
  1125 	}
  1125 	}
  1126 };
  1126 };
  1127 
  1127 
  1160  * @param ngl Selected game pointer which is passed to the new window */
  1160  * @param ngl Selected game pointer which is passed to the new window */
  1161 static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
  1161 static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
  1162 {
  1162 {
  1163 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
  1163 	DeleteWindowById(WC_NETWORK_WINDOW, 0);
  1164 
  1164 
  1165 	NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
  1165 	NetworkTCPQueryServer(_settings_client.network.last_host, _settings_client.network.last_port); // company info
  1166 	NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
  1166 	NetworkUDPQueryServer(_settings_client.network.last_host, _settings_client.network.last_port); // general data
  1167 
  1167 
  1168 	new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
  1168 	new NetworkLobbyWindow(&_network_lobby_window_desc, ngl);
  1169 }
  1169 }
  1170 
  1170 
  1171 // The window below gives information about the connected clients
  1171 // The window below gives information about the connected clients
  1892 struct NetworkCompanyPasswordWindow : public QueryStringBaseWindow {
  1892 struct NetworkCompanyPasswordWindow : public QueryStringBaseWindow {
  1893 	NetworkCompanyPasswordWindow(const WindowDesc *desc, Window *parent) : QueryStringBaseWindow(desc)
  1893 	NetworkCompanyPasswordWindow(const WindowDesc *desc, Window *parent) : QueryStringBaseWindow(desc)
  1894 	{
  1894 	{
  1895 		this->parent = parent;
  1895 		this->parent = parent;
  1896 		this->afilter = CS_ALPHANUMERAL;
  1896 		this->afilter = CS_ALPHANUMERAL;
  1897 		InitializeTextBuffer(&this->text, this->edit_str_buf, min(lengthof(_network_default_company_pass), lengthof(this->edit_str_buf)), 0);
  1897 		InitializeTextBuffer(&this->text, this->edit_str_buf, min(lengthof(_settings_client.network.default_company_pass), lengthof(this->edit_str_buf)), 0);
  1898 
  1898 
  1899 		this->FindWindowPlacementAndResize(desc);
  1899 		this->FindWindowPlacementAndResize(desc);
  1900 	}
  1900 	}
  1901 
  1901 
  1902 	void OnOk()
  1902 	void OnOk()
  1903 	{
  1903 	{
  1904 		if (this->IsWidgetLowered(NCPWW_SAVE_AS_DEFAULT_PASSWORD)) {
  1904 		if (this->IsWidgetLowered(NCPWW_SAVE_AS_DEFAULT_PASSWORD)) {
  1905 			snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", this->edit_str_buf);
  1905 			snprintf(_settings_client.network.default_company_pass, lengthof(_settings_client.network.default_company_pass), "%s", this->edit_str_buf);
  1906 		}
  1906 		}
  1907 
  1907 
  1908 		/* empty password is a '*' because of console argument */
  1908 		/* empty password is a '*' because of console argument */
  1909 		if (StrEmpty(this->edit_str_buf)) snprintf(this->edit_str_buf, lengthof(this->edit_str_buf), "*");
  1909 		if (StrEmpty(this->edit_str_buf)) snprintf(this->edit_str_buf, lengthof(this->edit_str_buf), "*");
  1910 		char *password = this->edit_str_buf;
  1910 		char *password = this->edit_str_buf;