network_gui.c
changeset 2100 868d62687c9a
parent 2071 37c57d697d9b
child 2114 6b2451b1f6b0
equal deleted inserted replaced
2099:22f535ad9eea 2100:868d62687c9a
    51 };
    51 };
    52 
    52 
    53 static NetworkGameList *_selected_item = NULL;
    53 static NetworkGameList *_selected_item = NULL;
    54 static int8 _selected_company_item = -1;
    54 static int8 _selected_company_item = -1;
    55 
    55 
    56 // Truncates a string to max_width (via GetStringWidth) and adds 3 dots
       
    57 //  at the end of the name.
       
    58 static void NetworkTruncateString(char *name, const int max_width)
       
    59 {
       
    60 	char temp[NETWORK_NAME_LENGTH];
       
    61 	char internal_name[NETWORK_NAME_LENGTH];
       
    62 
       
    63 	ttd_strlcpy(internal_name, name, sizeof(internal_name));
       
    64 
       
    65 	if (GetStringWidth(internal_name) > max_width) {
       
    66 		// Servername is too long, trunc it!
       
    67 		snprintf(temp, sizeof(temp), "%s...", internal_name);
       
    68 		// Continue to delete 1 char of the string till it is in range
       
    69 		while (GetStringWidth(temp) > max_width) {
       
    70 			internal_name[strlen(internal_name) - 1] = '\0';
       
    71 			snprintf(temp, sizeof(temp), "%s...", internal_name);
       
    72 		}
       
    73 		ttd_strlcpy(name, temp, sizeof(temp));
       
    74 	}
       
    75 }
       
    76 
       
    77 extern const char _openttd_revision[];
    56 extern const char _openttd_revision[];
    78 
    57 
    79 static FiosItem *selected_map = NULL; // to highlight slected map
    58 static FiosItem *_selected_map = NULL; // to highlight slected map
    80 
    59 
    81 // called when a new server is found on the network
    60 // called when a new server is found on the network
    82 void UpdateNetworkGameWindow(bool unselect)
    61 void UpdateNetworkGameWindow(bool unselect)
    83 {
    62 {
    84 	Window *w;
    63 	Window *w;
   130 
   109 
   131 		{ // draw list of games
   110 		{ // draw list of games
   132 			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
   111 			uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
   133 			int32 n = 0;
   112 			int32 n = 0;
   134 			int32 pos = w->vscroll.pos;
   113 			int32 pos = w->vscroll.pos;
   135 			char servername[NETWORK_NAME_LENGTH];
       
   136 			const NetworkGameList *cur_item = _network_game_list;
   114 			const NetworkGameList *cur_item = _network_game_list;
   137 
   115 
   138 			while (pos > 0 && cur_item != NULL) {
   116 			while (pos > 0 && cur_item != NULL) {
   139 				pos--;
   117 				pos--;
   140 				cur_item = cur_item->next;
   118 				cur_item = cur_item->next;
   146 					!strncmp(cur_item->info.server_revision, NOREV_STRING, sizeof(cur_item->info.server_revision));
   124 					!strncmp(cur_item->info.server_revision, NOREV_STRING, sizeof(cur_item->info.server_revision));
   147 
   125 
   148 				if (cur_item == sel)
   126 				if (cur_item == sel)
   149 					GfxFillRect(11, y - 2, 218, y + 9, 10); // show highlighted item with a different colour
   127 					GfxFillRect(11, y - 2, 218, y + 9, 10); // show highlighted item with a different colour
   150 
   128 
   151 				snprintf(servername, sizeof(servername), "%s", cur_item->info.server_name);
   129 				SetDParamStr(0, cur_item->info.server_name);
   152 				NetworkTruncateString(servername, 110);
   130 				DrawStringTruncated(15, y, STR_02BD, 16, 110);
   153 				DoDrawString(servername, 15, y, 16); // server name
       
   154 
   131 
   155 				SetDParam(0, cur_item->info.clients_on);
   132 				SetDParam(0, cur_item->info.clients_on);
   156 				SetDParam(1, cur_item->info.clients_max);
   133 				SetDParam(1, cur_item->info.clients_max);
   157 				DrawString(135, y, STR_NETWORK_CLIENTS_ONLINE, 2);
   134 				DrawString(135, y, STR_NETWORK_CLIENTS_ONLINE, 2);
   158 
   135 
   190 
   167 
   191 			DrawStringMultiCenter(365, 30, STR_NETWORK_GAME_INFO, 0);
   168 			DrawStringMultiCenter(365, 30, STR_NETWORK_GAME_INFO, 0);
   192 
   169 
   193 
   170 
   194 			SetDParamStr(0, sel->info.server_name);
   171 			SetDParamStr(0, sel->info.server_name);
   195 			DrawStringMultiCenter(365, 42, STR_ORANGE, 2); // game name
   172 			DrawStringCenteredTruncated(365, 42, STR_ORANGE, 16, 220); // game name
   196 
   173 
   197 			SetDParamStr(0, sel->info.map_name);
   174 			SetDParamStr(0, sel->info.map_name);
   198 			DrawStringMultiCenter(365, 54, STR_02BD, 2); // map name
   175 			DrawStringCenteredTruncated(365, 54, STR_02BD, 16, 220); // map name
   199 
   176 
   200 			SetDParam(0, sel->info.clients_on);
   177 			SetDParam(0, sel->info.clients_on);
   201 			SetDParam(1, sel->info.clients_max);
   178 			SetDParam(1, sel->info.clients_max);
   202 			DrawString(260, y, STR_NETWORK_CLIENTS, 2); // clients on the server / maximum slots
   179 			DrawString(260, y, STR_NETWORK_CLIENTS, 2); // clients on the server / maximum slots
   203 			y+=10;
   180 			y+=10;
   493 
   470 
   494 		// draw list of maps
   471 		// draw list of maps
   495 		pos = w->vscroll.pos;
   472 		pos = w->vscroll.pos;
   496 		while (pos < _fios_num + 1) {
   473 		while (pos < _fios_num + 1) {
   497 			item = _fios_list + pos - 1;
   474 			item = _fios_list + pos - 1;
   498 			if (item == selected_map || (pos == 0 && selected_map == NULL))
   475 			if (item == _selected_map || (pos == 0 && _selected_map == NULL))
   499 				GfxFillRect(11, y - 1, 259, y + 10, 155); // show highlighted item with a different colour
   476 				GfxFillRect(11, y - 1, 259, y + 10, 155); // show highlighted item with a different colour
   500 
   477 
   501 			if (pos == 0) DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, 9);
   478 			if (pos == 0) DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, 9);
   502 			else DoDrawString(item->title[0] ? item->title : item->name, 14, y, _fios_colors[item->type] );
   479 			else DoDrawString(item->title, 14, y, _fios_colors[item->type] );
   503 			pos++;
   480 			pos++;
   504 			y += NSSWND_ROWSIZE;
   481 			y += NSSWND_ROWSIZE;
   505 
   482 
   506 			if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
   483 			if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
   507 		}
   484 		}
   519 			} break;
   496 			} break;
   520 		case 5: { /* Select map */
   497 		case 5: { /* Select map */
   521 			int y = (e->click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   498 			int y = (e->click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
   522 			if ((y += w->vscroll.pos) >= w->vscroll.count)
   499 			if ((y += w->vscroll.pos) >= w->vscroll.count)
   523 				return;
   500 				return;
   524 			if (y == 0) selected_map = NULL;
   501 
   525 			else selected_map = _fios_list + y-1;
   502 			_selected_map = (y == 0) ? NULL : _fios_list + y - 1;
   526 			SetWindowDirty(w);
   503 			SetWindowDirty(w);
   527 			} break;
   504 			} break;
   528 		case 7: case 8: /* Connection type */
   505 		case 7: case 8: /* Connection type */
   529 			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0, 0); // do it for widget 8
   506 			ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, 8, 0, 0); // do it for widget 8
   530 			break;
   507 			break;
   536 			return;
   513 			return;
   537 		case 13: /* Start game */
   514 		case 13: /* Start game */
   538 			_is_network_server = true;
   515 			_is_network_server = true;
   539 			ttd_strlcpy(_network_server_name, WP(w, querystr_d).text.buf, sizeof(_network_server_name));
   516 			ttd_strlcpy(_network_server_name, WP(w, querystr_d).text.buf, sizeof(_network_server_name));
   540 			UpdateTextBufferSize(&WP(w, querystr_d).text);
   517 			UpdateTextBufferSize(&WP(w, querystr_d).text);
   541 			if (selected_map == NULL) { // start random new game
   518 			if (_selected_map == NULL) { // start random new game
   542 				GenRandomNewGame(Random(), InteractiveRandom());
   519 				GenRandomNewGame(Random(), InteractiveRandom());
   543 			} else { // load a scenario
   520 			} else { // load a scenario
   544 				char *name;
   521 				char *name = FiosBrowseTo(_selected_map);
   545 				if ((name = FiosBrowseTo(selected_map)) != NULL) {
   522 				if (name != NULL) {
   546 					SetFiosType(selected_map->type);
   523 					SetFiosType(_selected_map->type);
   547 					strcpy(_file_to_saveload.name, name);
   524 					ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
   548 					snprintf(_network_game_info.map_name, sizeof(_network_game_info.map_name), "Loaded scenario");
   525 					ttd_strlcpy(_file_to_saveload.title, _selected_map->title, sizeof(_file_to_saveload.title));
       
   526 
   549 					DeleteWindow(w);
   527 					DeleteWindow(w);
   550 					StartScenarioEditor(Random(), InteractiveRandom());
   528 					StartScenarioEditor(Random(), InteractiveRandom());
   551 				}
   529 				}
   552 			}
   530 			}
   553 			break;
   531 			break;
   554 		case 14: /* Load game */
   532 		case 14: /* Load game */
   555 			_is_network_server = true;
   533 			_is_network_server = true;
   556 			ttd_strlcpy(_network_server_name, WP(w, querystr_d).text.buf, sizeof(_network_server_name));
   534 			ttd_strlcpy(_network_server_name, WP(w, querystr_d).text.buf, sizeof(_network_server_name));
   557 			UpdateTextBufferSize(&WP(w, querystr_d).text);
   535 			UpdateTextBufferSize(&WP(w, querystr_d).text);
   558 			snprintf(_network_game_info.map_name, sizeof(_network_game_info.map_name), "Loaded game");
       
   559 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   536 			/* XXX - WC_NETWORK_WINDOW should stay, but if it stays, it gets
   560 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   537 			 * copied all the elements of 'load game' and upon closing that, it segfaults */
   561 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   538 			DeleteWindowById(WC_NETWORK_WINDOW, 0);
   562 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   539 			ShowSaveLoadDialog(SLD_LOAD_GAME);
   563 			break;
   540 			break;