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; |