|
OpenTTD Source
14.0-beta1
|
Go to the documentation of this file.
10 #include "../stdafx.h"
11 #include "../strings_func.h"
24 #include "../window_func.h"
25 #include "../gfx_func.h"
26 #include "../widgets/dropdown_type.h"
27 #include "../widgets/dropdown_func.h"
28 #include "../querystring_gui.h"
29 #include "../sortlist_type.h"
30 #include "../company_func.h"
31 #include "../command_func.h"
32 #include "../core/geometry_func.hpp"
33 #include "../genworld.h"
34 #include "../map_type.h"
35 #include "../zoom_func.h"
36 #include "../sprite.h"
37 #include "../settings_internal.h"
38 #include "../company_cmd.h"
39 #include "../timer/timer.h"
40 #include "../timer/timer_window.h"
41 #include "../timer/timer_game_calendar.h"
42 #include "../textfile_gui.h"
44 #include "../widgets/network_widget.h"
46 #include "table/strings.h"
47 #include "../table/sprites.h"
49 #include "../stringfilter_type.h"
52 # include <emscripten.h>
55 #include "../safeguards.h"
57 static void ShowNetworkStartServerWindow();
75 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_SERVER_VISIBILITY_LOCAL, SERVER_GAME_TYPE_LOCAL,
false));
76 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_SERVER_VISIBILITY_INVITE_ONLY, SERVER_GAME_TYPE_INVITE_ONLY,
false));
77 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_SERVER_VISIBILITY_PUBLIC, SERVER_GAME_TYPE_PUBLIC,
false));
83 typedef int ServerListPosition;
84 static const ServerListPosition SLP_INVALID = -1;
92 auto leaf = std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_NAME, STR_NETWORK_SERVER_LIST_GAME_NAME, STR_NETWORK_SERVER_LIST_GAME_NAME_TOOLTIP);
93 leaf->SetResize(1, 0);
95 this->
Add(std::move(leaf));
97 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_CLIENTS, STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION, STR_NETWORK_SERVER_LIST_CLIENTS_CAPTION_TOOLTIP));
98 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_MAPSIZE, STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION, STR_NETWORK_SERVER_LIST_MAP_SIZE_CAPTION_TOOLTIP));
99 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_DATE, STR_NETWORK_SERVER_LIST_DATE_CAPTION, STR_NETWORK_SERVER_LIST_DATE_CAPTION_TOOLTIP));
100 this->
Add(std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_YEARS, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION, STR_NETWORK_SERVER_LIST_PLAY_TIME_CAPTION_TOOLTIP));
102 leaf = std::make_unique<NWidgetLeaf>(
WWT_PUSHTXTBTN, COLOUR_WHITE,
WID_NG_INFO, STR_EMPTY, STR_NETWORK_SERVER_LIST_INFO_ICONS_TOOLTIP);
106 this->
Add(std::move(leaf));
118 for (
const auto &child_wid : this->
children) {
119 child_wid->SetupSmallestSize(w);
120 this->
smallest_y = std::max(this->
smallest_y, child_wid->smallest_y + child_wid->padding.Vertical());
124 for (
const auto &child_wid : this->children) {
125 child_wid->current_x = child_wid->smallest_x;
129 this->
smallest_x = this->children.front()->smallest_x + this->children.back()->smallest_x;
141 given_width -= this->
children.back()->smallest_x;
144 auto first = std::next(std::begin(this->
children));
145 auto last = std::prev(std::end(this->
children));
146 for (
auto it = first; it != last; ++it) {
147 auto &child_wid = *it;
149 given_width -= child_wid->smallest_x;
150 child_wid->current_x = child_wid->smallest_x;
152 child_wid->current_x = 0;
158 this->
children.front()->current_x = given_width;
162 auto assign_position = [&](
const std::unique_ptr<NWidgetBase> &child_wid) {
163 if (child_wid->current_x != 0) {
164 child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
165 position += child_wid->current_x;
170 std::for_each(std::rbegin(this->
children), std::rend(this->
children), assign_position);
172 std::for_each(std::begin(this->
children), std::end(this->
children), assign_position);
209 this->servers.clear();
211 bool found_current_server =
false;
212 bool found_last_joined =
false;
214 this->servers.push_back(ngl);
215 if (ngl == this->server) {
216 found_current_server =
true;
218 if (ngl == this->last_joined) {
219 found_last_joined =
true;
223 if (!found_last_joined) {
224 this->last_joined =
nullptr;
226 if (!found_current_server) {
227 this->server =
nullptr;
228 this->list_pos = SLP_INVALID;
242 this->servers.shrink_to_fit();
244 this->vscroll->
SetCount(this->servers.size());
247 this->servers.
Sort();
331 this->list_pos = SLP_INVALID;
332 for (uint i = 0; i != this->servers.size(); i++) {
333 if (this->servers[i] == this->server) {
342 assert(item !=
nullptr);
343 assert((*item) !=
nullptr);
346 sf.
AddLine((*item)->info.server_name);
358 Rect name = this->GetWidget<NWidgetBase>(
WID_NG_NAME)->GetCurrentRect();
359 Rect info = this->GetWidget<NWidgetBase>(
WID_NG_INFO)->GetCurrentRect();
363 Rect r = {std::min(name.left, info.left), y, std::max(name.right, info.right), y + (int)this->
resize.
step_height - 1};
378 Rect clients = nwid->GetCurrentRect();
383 DrawString(clients.left, clients.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_GENERAL_ONLINE, TC_FROMSTRING,
SA_HOR_CENTER);
388 Rect mapsize = nwid->GetCurrentRect();
391 DrawString(mapsize.left, mapsize.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_MAP_SIZE_SHORT, TC_FROMSTRING,
SA_HOR_CENTER);
396 Rect date = nwid->GetCurrentRect();
404 Rect years = nwid->GetCurrentRect();
408 DrawString(years.left, years.right, y + text_y_offset, STR_NETWORK_SERVER_LIST_PLAY_TIME_SHORT, TC_BLACK,
SA_HOR_CENTER);
428 if (this->list_pos == SLP_INVALID)
return;
435 this->list_pos = SLP_INVALID;
436 this->server =
nullptr;
453 #ifdef __EMSCRIPTEN__
454 EM_ASM(
if (window[
"openttd_server_list"]) openttd_server_list());
468 this->last_sorting = this->servers.
GetListing();
483 fill->height =
resize->height;
484 size->height = 12 *
resize->height;
492 size->width = NWidgetScrollbar::GetVerticalDimension().width;
524 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
530 const int max = std::min(this->vscroll->
GetPosition() + this->vscroll->GetCapacity(), (
int)this->servers.size());
532 for (
int i = this->vscroll->
GetPosition(); i < max; ++i) {
535 y += this->resize.step_height;
542 if (this->last_joined !=
nullptr) this->
DrawServerLine(this->last_joined, r.top, this->last_joined == this->server);
546 this->DrawDetails(r);
582 bool changed =
false;
590 #ifdef __EMSCRIPTEN__
602 if (this->server ==
nullptr)
return STR_NETWORK_SERVER_LIST_GAME_INFO;
603 switch (this->server->
status) {
604 case NGLS_OFFLINE:
return STR_NETWORK_SERVER_LIST_SERVER_OFFLINE;
605 case NGLS_ONLINE:
return STR_NETWORK_SERVER_LIST_GAME_INFO;
606 case NGLS_FULL:
return STR_NETWORK_SERVER_LIST_SERVER_FULL;
607 case NGLS_BANNED:
return STR_NETWORK_SERVER_LIST_SERVER_BANNED;
608 case NGLS_TOO_OLD:
return STR_NETWORK_SERVER_LIST_SERVER_TOO_OLD;
609 default: NOT_REACHED();
613 void DrawDetails(
const Rect &r)
const
618 StringID header_msg = this->GetHeaderString();
625 tr.top += header_height;
631 if (sel ==
nullptr)
return;
654 StringID invite_or_address = sel->
connection_string.starts_with(
"+") ? STR_NETWORK_SERVER_LIST_INVITE_CODE : STR_NETWORK_SERVER_LIST_SERVER_ADDRESS;
687 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
702 if (this->list_pos != SLP_INVALID) this->list_pos = (ServerListPosition)this->servers.size() - this->list_pos - 1;
714 this->server = (it != this->servers.end()) ? *it :
nullptr;
715 this->list_pos = (
server ==
nullptr) ? SLP_INVALID : it - this->servers.begin();
724 if (this->last_joined !=
nullptr) {
740 this->searched_internet =
true;
751 STR_NETWORK_SERVER_LIST_ENTER_SERVER_ADDRESS,
757 ShowNetworkStartServerWindow();
761 if (this->server !=
nullptr) {
785 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
791 EventState OnKeyPress([[maybe_unused]] char32_t key, uint16_t keycode)
override
797 if (this->list_pos == SLP_INVALID)
return ES_HANDLED;
799 this->server = this->servers[this->
list_pos];
809 if (this->server !=
nullptr) {
810 if (keycode == WKC_DELETE) {
812 if (this->server == this->last_joined) this->last_joined =
nullptr;
813 this->server =
nullptr;
814 this->list_pos = SLP_INVALID;
821 void OnEditboxChanged(
WidgetID wid)
override
840 void OnQueryTextFinished(
char *str)
override
845 NetworkRebuildHostList();
856 if (!this->searched_internet)
return;
862 Listing NetworkGameWindow::last_sorting = {
false, 5};
867 &NGameCalendarDateSorter,
868 &NGameTicksPlayingSorter,
876 static std::unique_ptr<NWidgetBase> MakeResizableHeader()
878 return std::make_unique<NWidgetServerListHeader>();
881 static constexpr
NWidgetPart _nested_network_game_widgets[] = {
896 SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
911 SetDataTip(0x0, STR_NETWORK_SERVER_LIST_CLICK_TO_SELECT_LAST),
922 SetDataTip(STR_NETWORK_SERVER_LIST_PLAYER_NAME_OSKTITLE, STR_NETWORK_SERVER_LIST_ENTER_NAME_TOOLTIP),
959 static WindowDesc _network_game_window_desc(__FILE__, __LINE__,
963 std::begin(_nested_network_game_widgets), std::end(_nested_network_game_widgets)
966 void ShowNetworkGameWindow()
968 static bool first =
true;
997 void SetStringParameters(
WidgetID widget)
const override
1019 size->width += padding.width;
1020 size->height += padding.height;
1025 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
1034 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
1038 ShowNetworkGameWindow();
1058 default: NOT_REACHED();
1083 if (!CheckServerName())
return;
1093 if (!CheckServerName())
return;
1099 if (!CheckServerName())
return;
1105 if (!CheckServerName())
return;
1112 void OnDropdownSelect(
WidgetID widget,
int index)
override
1125 bool CheckServerName()
1127 std::string str = this->name_editbox.text.
buf;
1139 void OnQueryTextFinished(
char *str)
override
1141 if (str ==
nullptr)
return;
1146 int32_t value = atoi(str);
1148 switch (this->widget_id) {
1149 default: NOT_REACHED();
1159 static constexpr
NWidgetPart _nested_network_start_server_window_widgets[] = {
1226 static WindowDesc _network_start_server_window_desc(__FILE__, __LINE__,
1230 std::begin(_nested_network_start_server_window_widgets), std::end(_nested_network_start_server_window_widgets)
1233 static void ShowNetworkStartServerWindow()
1247 static constexpr
NWidgetPart _nested_client_list_widgets[] = {
1255 NWidget(
WWT_FRAME, COLOUR_GREY),
SetDataTip(STR_NETWORK_CLIENT_LIST_SERVER, STR_NULL),
SetPadding(4, 4, 0, 4),
SetPIP(0, 2, 0),
1259 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CL_SERVER_NAME),
SetFill(1, 0),
SetResize(1, 0),
SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_NAME_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1272 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CL_SERVER_INVITE_CODE),
SetFill(1, 0),
SetResize(1, 0),
SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_SERVER_INVITE_CODE_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1277 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CL_SERVER_CONNECTION_TYPE),
SetFill(1, 0),
SetResize(1, 0),
SetDataTip(STR_JUST_STRING, STR_NETWORK_CLIENT_LIST_SERVER_CONNECTION_TYPE_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1282 NWidget(
WWT_FRAME, COLOUR_GREY),
SetDataTip(STR_NETWORK_CLIENT_LIST_PLAYER, STR_NULL),
SetPadding(4, 4, 4, 4),
SetPIP(0, 2, 0),
1286 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CL_CLIENT_NAME),
SetFill(1, 0),
SetResize(1, 0),
SetDataTip(STR_JUST_RAW_STRING, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_TOOLTIP),
SetAlignment(
SA_VERT_CENTER |
SA_RIGHT),
1293 NWidget(
WWT_MATRIX, COLOUR_GREY,
WID_CL_MATRIX),
SetMinimalSize(180, 0),
SetResize(1, 1),
SetFill(1, 1),
SetMatrixDataTip(1, 0, STR_NULL),
SetScrollbar(
WID_CL_SCROLLBAR),
1295 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CL_CLIENT_COMPANY_COUNT),
SetFill(1, 0),
SetResize(1, 0),
SetPadding(2, 1, 2, 1),
SetAlignment(
SA_CENTER),
SetDataTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT_TOOLTIP),
1305 static WindowDesc _client_list_desc(__FILE__, __LINE__,
1306 WDP_AUTO,
"list_clients", 220, 300,
1309 std::begin(_nested_client_list_widgets), std::end(_nested_client_list_widgets)
1317 DD_CLIENT_ADMIN_KICK,
1318 DD_CLIENT_ADMIN_BAN,
1319 DD_COMPANY_ADMIN_RESET,
1320 DD_COMPANY_ADMIN_UNLOCK,
1399 template<
typename T>
1412 assert(
proc !=
nullptr);
1419 this->
proc(w, pt, this->
id);
1444 std::map<uint, std::vector<std::unique_ptr<ButtonCommon>>>
buttons;
1470 w->join_company = company_id;
1500 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_KICK, DD_CLIENT_ADMIN_KICK,
false));
1501 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_CLIENT_LIST_ADMIN_CLIENT_BAN, DD_CLIENT_ADMIN_BAN,
false));
1504 wi_rect.left = pt.x;
1505 wi_rect.right = pt.x;
1507 wi_rect.bottom = pt.y;
1509 w->dd_client_id = client_id;
1522 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_RESET, DD_COMPANY_ADMIN_RESET,
NetworkCompanyHasClients(company_id)));
1523 list.push_back(std::make_unique<DropDownListStringItem>(STR_NETWORK_CLIENT_LIST_ADMIN_COMPANY_UNLOCK, DD_COMPANY_ADMIN_UNLOCK, !
NetworkCompanyIsPassworded(company_id)));
1526 wi_rect.left = pt.x;
1527 wi_rect.right = pt.x;
1529 wi_rect.bottom = pt.y;
1531 w->dd_company_id = company_id;
1555 this->buttons[
line_count].emplace_back(chat_button);
1558 this->line_count += 1;
1560 bool has_players =
false;
1562 if (ci->client_playas != company_id)
continue;
1574 this->line_count += 1;
1578 chat_button->
disabled = !has_players;
1589 this->buttons.clear();
1590 this->line_count = 0;
1591 this->player_host_index = -1;
1592 this->player_self_index = -1;
1597 this->line_count += 1;
1606 if (c->index == client_playas)
continue;
1614 this->vscroll->
SetCount(this->line_count);
1628 uint x = rtl ? matrix.left : matrix.right;
1631 auto button_find = this->buttons.find(index);
1632 if (button_find == this->buttons.end())
return nullptr;
1635 for (
auto &button : button_find->second) {
1636 uint
left = rtl ? x : x - button->width;
1637 uint right = rtl ? x + button->width : x;
1640 return button.get();
1668 void OnInvalidateData([[maybe_unused]]
int data = 0, [[maybe_unused]]
bool gui_scope =
true)
override
1689 size->width = std::min(size->width,
static_cast<uint
>(
ScaleGUITrad(200)));
1694 size->width += padding.width;
1695 size->height += padding.height;
1706 size->height = std::max(size->height, 5 * this->line_height);
1717 void SetStringParameters(
WidgetID widget)
const override
1729 static std::string empty = {};
1752 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
1778 if (button ==
nullptr)
break;
1786 bool OnTooltip([[maybe_unused]]
Point pt,
WidgetID widget, TooltipCloseCondition close_cond)
override
1802 uint player_icon_x = rtl ? text_right - offset_x - d2.width : text_left + offset_x;
1804 if (
IsInsideMM(pt.x, player_icon_x, player_icon_x + d2.width)) {
1805 if (index == this->player_self_index) {
1806 GuiShowTooltips(
this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_SELF_TOOLTIP, close_cond);
1808 }
else if (index == this->player_host_index) {
1809 GuiShowTooltips(
this, STR_NETWORK_CLIENT_LIST_PLAYER_ICON_HOST_TOOLTIP, close_cond);
1815 if (button ==
nullptr)
return false;
1833 void OnDropdownSelect(
WidgetID widget,
int index)
override
1848 case DD_CLIENT_ADMIN_KICK:
1850 text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_KICK;
1855 case DD_CLIENT_ADMIN_BAN:
1857 text = STR_NETWORK_CLIENT_LIST_ASK_CLIENT_BAN;
1862 case DD_COMPANY_ADMIN_RESET:
1864 text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_RESET;
1869 case DD_COMPANY_ADMIN_UNLOCK:
1871 text = STR_NETWORK_CLIENT_LIST_ASK_COMPANY_UNLOCK;
1880 assert(text != STR_NULL);
1881 assert(callback !=
nullptr);
1884 ShowQuery(STR_NETWORK_CLIENT_LIST_ASK_CAPTION, text,
this, callback);
1896 void OnQueryTextFinished(
char *str)
override
1898 if (str ==
nullptr)
return;
1900 switch (this->query_widget) {
1901 default: NOT_REACHED();
1937 for (
auto &button :
buttons) {
1940 int offset = (this->line_height - button->height) / 2;
1941 r.left = rtl ? x : x - button->width + 1;
1942 r.right = rtl ? x + button->width - 1 : x;
1944 r.bottom = r.top + button->height - 1;
1948 if (button->disabled) {
1969 int offset =
CenterBounds(0, this->line_height, d.height);
1972 uint line_end = line_start + this->vscroll->
GetCapacity();
1974 uint y = r.top + (this->line_height * (line - line_start));
1977 if (
IsInsideMM(line, line_start, line_end)) {
1978 int icon_left = r.
WithWidth(d.width, rtl).left;
1980 int &x = rtl ? tr.left : tr.right;
1983 auto button_find = this->buttons.find(line);
1984 if (button_find != this->buttons.end()) {
1989 DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset);
1990 DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_SPECTATORS, TC_SILVER);
1992 DrawSprite(SPR_COMPANY_ICON, PALETTE_TO_GREY, icon_left, y + offset);
1993 DrawString(tr.left, tr.right, y + text_y_offset, STR_NETWORK_CLIENT_LIST_NEW_COMPANY, TC_WHITE);
1999 DrawString(tr.left, tr.right, y + text_y_offset, STR_COMPANY_NAME, TC_SILVER);
2007 if (ci->client_playas != company_id)
continue;
2010 if (
IsInsideMM(line, line_start, line_end)) {
2014 auto button_find = this->buttons.find(line);
2015 if (button_find != this->buttons.end()) {
2016 int &x = rtl ? tr.left : tr.right;
2022 player_icon = SPR_PLAYER_SELF;
2024 player_icon = SPR_PLAYER_HOST;
2027 if (player_icon != 0) {
2029 int offset_y =
CenterBounds(0, this->line_height, d2.height);
2030 DrawSprite(player_icon, PALETTE_TO_GREY, rtl ? tr.right - d2.width : tr.left, y + offset_y);
2035 DrawString(tr.left, tr.right, y + text_y_offset, STR_JUST_RAW_STRING, TC_BLACK);
2043 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
2050 if (this->hover_index >= 0) {
2067 if (client_playas == c->index)
continue;
2079 void OnMouseOver([[maybe_unused]]
Point pt,
WidgetID widget)
override
2082 if (this->hover_index != -1) {
2083 this->hover_index = -1;
2088 if (index != this->hover_index) {
2089 this->hover_index = index;
2096 void ShowClientList()
2098 AllocateWindowDescFront<NetworkClientListWindow>(&_client_list_desc, 0);
2115 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
2124 case NETWORK_JOIN_STATUS_CONNECTING:
2125 case NETWORK_JOIN_STATUS_AUTHORIZING:
2126 case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
2129 case NETWORK_JOIN_STATUS_WAITING:
2132 case NETWORK_JOIN_STATUS_DOWNLOADING:
2150 case NETWORK_JOIN_STATUS_WAITING:
2154 case NETWORK_JOIN_STATUS_DOWNLOADING:
2171 for (uint i = 0; i < NETWORK_JOIN_STATUS_END; i++) {
2192 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
2197 ShowNetworkGameWindow();
2201 void OnQueryTextFinished(
char *str)
override
2208 switch (this->password_type) {
2211 default: NOT_REACHED();
2216 static constexpr
NWidgetPart _nested_network_join_status_window_widgets[] = {
2227 static WindowDesc _network_join_status_window_desc(__FILE__, __LINE__,
2231 std::begin(_nested_network_join_status_window_widgets), std::end(_nested_network_join_status_window_widgets)
2234 void ShowJoinStatusWindow()
2243 if (w ==
nullptr)
return;
2244 w->password_type = npt;
2248 default: NOT_REACHED();
2262 this->UpdateWarningStringSize();
2271 void UpdateWarningStringSize()
2275 this->warning_size.height =
GetStringHeight(STR_WARNING_PASSWORD_SECURITY, this->warning_size.width);
2288 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
2293 STR_WARNING_PASSWORD_SECURITY, TC_FROMSTRING,
SA_CENTER);
2305 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
2324 static constexpr
NWidgetPart _nested_network_company_password_window_widgets[] = {
2338 SetDataTip(STR_COMPANY_PASSWORD_MAKE_DEFAULT, STR_COMPANY_PASSWORD_MAKE_DEFAULT_TOOLTIP),
2349 static WindowDesc _network_company_password_window_desc(__FILE__, __LINE__,
2353 std::begin(_nested_network_company_password_window_widgets), std::end(_nested_network_company_password_window_widgets)
2356 void ShowNetworkCompanyPasswordWindow(
Window *parent)
2394 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
2401 void FindWindowPlacementAndResize([[maybe_unused]]
int def_width, [[maybe_unused]]
int def_height)
override
2409 void SetStringParameters(
WidgetID widget)
const override
2419 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
2441 static constexpr
NWidgetPart _nested_network_ask_relay_widgets[] = {
2458 static WindowDesc _network_ask_relay_desc(__FILE__, __LINE__,
2462 std::begin(_nested_network_ask_relay_widgets), std::end(_nested_network_ask_relay_widgets)
2471 void ShowNetworkAskRelay(
const std::string &server_connection_string,
const std::string &relay_connection_string,
const std::string &token)
2476 new NetworkAskRelayWindow(&_network_ask_relay_desc, parent, server_connection_string, relay_connection_string, token);
2497 void DrawWidget(
const Rect &r,
WidgetID widget)
const override
2504 void FindWindowPlacementAndResize([[maybe_unused]]
int def_width, [[maybe_unused]]
int def_height)
override
2512 void OnClick([[maybe_unused]]
Point pt,
WidgetID widget, [[maybe_unused]]
int click_count)
override
2516 ShowSurveyResultTextfileWindow();
2536 static constexpr
NWidgetPart _nested_network_ask_survey_widgets[] = {
2556 static WindowDesc _network_ask_survey_desc(__FILE__, __LINE__,
2560 std::begin(_nested_network_ask_survey_widgets), std::end(_nested_network_ask_survey_widgets)
2569 if constexpr (!NetworkSurveyHandler::IsSurveyPossible())
return;
2583 this->ConstructWindow();
2591 void ShowSurveyResultTextfileWindow()
void ShowNewGRFSettings(bool editable, bool show_params, bool exec_changes, GRFConfig **config)
Setup the NewGRF gui.
@ ES_HANDLED
The passed event is handled.
uint8_t timeout_timer
Timer value of the WF_TIMEOUT for flags.
std::string connect_to_ip
default for the "Add server" query
static bool NGameAllowedSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by joinability.
int gamescript_version
Version of the gamescript.
static ClientID _admin_client_id
For what client a confirmation window is open.
bool NetworkValidateServerName(std::string &server_name)
Trim the given server name in place, i.e.
std::string connection_string
Address of the server.
QueryString name_editbox
Client name editbox.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
void CloseWindowByClass(WindowClass cls, int data)
Close all windows of a given class.
bool SetSettingValue(const IntSettingDesc *sd, int32_t value, bool force_newgame)
Top function to save the new value of an element of the Settings struct.
static void OnClickClientChat([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, ClientID client_id)
Chat button on a Client is clicked.
std::string gamescript_name
Name of the gamescript.
static const uint8_t PC_DARK_BLUE
Dark blue palette colour.
@ FT_SCENARIO
old or new scenario
static Titem * Get(size_t index)
Returns Titem with given index.
int ok_button
Widget button of parent window to simulate when pressing OK in OSK.
std::string relay_connection_string
The relay server we want to connect to.
bool NetworkValidateOurClientName()
Convenience method for NetworkValidateClientName on _settings_client.network.client_name.
void ShowQuery(StringID caption, StringID message, Window *parent, QueryCallbackProc *callback, bool focus)
Show a confirmation window with standard 'yes' and 'no' buttons The window is aligned to the centre o...
void ShowNetworkAskSurvey()
Show a modal confirmation window with "no" / "preview" / "yes" buttons.
NetworkGameList * NetworkAddServer(const std::string &connection_string, bool manually, bool never_expire)
Validates an address entered as a string and adds the server to the list.
void SetDParamMaxDigits(size_t n, uint count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
@ QSF_PASSWORD
password entry box, show warning about password security
Dimensions (a width and height) of a rectangle in 2D.
constexpr bool IsInsideMM(const T x, const size_t min, const size_t max) noexcept
Checks if a value is in an interval.
std::string client_name
Name of the client.
void OnResize() override
Called after the window got resized.
void SetFilterState(bool state)
Enable or disable the filter.
@ QSF_ACCEPT_UNCHANGED
return success even when the text didn't change
Rect Shrink(int s) const
Copy and shrink Rect by s pixels.
static const SettingDesc * GetSettingFromName(const std::string_view name, const SettingTable &settings)
Given a name of setting, return a setting description from the table.
Scrollbar * vscroll
Vertical scrollbar of the list of servers.
ConnectionType _network_server_connection_type
What type of connection the Game Coordinator detected we are on.
bool IsEmpty() const
Check whether any filter words were entered.
ButtonCommon * GetButtonAtPoint(Point pt)
Get the button at a specific point on the WID_CL_MATRIX.
virtual void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close)
A dropdown window associated to this window has been closed.
void SetFilterTerm(const char *str)
Set the term to filter on.
static const uint NETWORK_NAME_LENGTH
The maximum length of the server name and map name, in bytes including '\0'.
CompanyID client_playas
As which company is this client playing (CompanyID)
std::string server_revision
The version number the server is using (e.g.: 'r304' or 0.5.0)
void SetWidgetDirty(WidgetID widget_index) const
Invalidate a widget, i.e.
void NetworkClientRequestMove(CompanyID company_id, const std::string &pass)
Notify the server of this client wanting to be moved to another company.
uint32_t StringID
Numeric value that represents a string, independent of the selected language.
std::string default_company_pass
default password for new companies in encrypted form
bool _network_server
network-server is active
void Assign(StringID string)
Render a string into the textbuffer.
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
void SortNetworkGameList()
Sort the server list.
int hover_index
Index of the current line we are hovering over, or -1 if none.
void CloseWindowById(WindowClass cls, WindowNumber number, bool force, int data)
Close a window by its class and window number (if it is open).
std::vector< std::unique_ptr< const DropDownListItem > > DropDownList
A drop down list is a collection of drop down list items.
@ WC_CLIENT_LIST
Client list; Window numbers:
byte clients_max
Max clients allowed on server.
@ WC_COMPANY_PASSWORD_WINDOW
Company password query; Window numbers:
bool NetworkCompanyHasClients(CompanyID company)
Check whether a particular company has clients.
void ConnectFailure(const std::string &token, uint8_t tracking_number)
Callback from a Connecter to let the Game Coordinator know the connection failed.
GUIGameServerList servers
List with game servers.
NetworkJoinStatus
Status of the clients during joining.
void OnResize() override
Called after the window got resized.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
virtual void Close(int data=0)
Hide the window and all its child windows, and mark them for a later deletion.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
static bool NGameNameSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by name.
std::map< uint, std::vector< std::unique_ptr< ButtonCommon > > > buttons
Per line which buttons are available.
void ShowMissingContentWindow(const GRFConfig *list)
Show the content list window with all missing grfs from the given list.
static void AdminCompanyUnlockCallback(Window *, bool confirmed)
Callback function for admin command to unlock company.
void NetworkServerDoMove(ClientID client_id, CompanyID company_id)
Handle the tid-bits of moving a client from one company to another.
const GRFConfig * grf_config
View the textfile of this GRFConfig.
QueryString password_editbox
Password editbox.
bool _ctrl_pressed
Is Ctrl pressed?
@ FILLRECT_CHECKER
Draw only every second pixel, used for greying-out.
static const uint MAX_CLIENTS
How many clients can we have.
void SetSortType(uint8_t n_type)
Set the sorttype of the list.
void OnInit() override
Notification that the nested widget tree gets initialized.
int StrNaturalCompare(std::string_view s1, std::string_view s2, bool ignore_garbage_at_front)
Compares two strings using case insensitive natural sort.
Window used for asking if the user wants to participate in the automated survey.
ClientSettings _settings_client
The current settings for this game.
void UpdateNetworkGameWindow()
Update the network new window because a new server is found on the network.
void NetworkUDPSearchGame()
Find all servers.
constexpr uint Vertical() const
Get total vertical padding of RectPadding.
void AddLine(const char *str)
Pass another text line from the current item to the filter.
ClientID dd_client_id
During admin dropdown, track which client this was for.
NetworkJoinStatus _network_join_status
The status of joining.
@ FR_LOWERED
If set the frame is lowered and the background colour brighter (ie. buttons when pressed)
std::string _network_server_name
The current name of the server you are on.
@ SA_RIGHT
Right align the text (must be a single bit).
@ SA_VERT_CENTER
Vertically center the text.
UseRelayService use_relay_service
Use relay service?
static bool NGameClientSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by the amount of clients online on a server.
static const uint NETWORK_CLIENT_NAME_LENGTH
The maximum length of a client's name, in bytes including '\0'.
Owner
Enum for all companies/owners.
const Scrollbar * GetScrollbar(WidgetID widnum) const
Return the Scrollbar to a widget index.
void StartNewGameWithoutGUI(uint32_t seed)
Start a normal game without the GUI.
bool StrEmpty(const char *s)
Check if a string buffer is empty.
TextfileType file_type
Type of textfile to view.
void DrawServerLine(const NetworkGameList *cur_item, int y, bool highlight) const
Draw a single server line.
Rect WithHeight(int height, bool end=false) const
Copy Rect and set its height.
bool version_compatible
Can we connect to this server or not? (based on server_revision)
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
bool NeedRebuild() const
Check if a rebuild is needed.
Data stored about a string that can be modified in the GUI.
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
char *const buf
buffer in which text is saved
@ QSF_LEN_IN_CHARS
the length of the string is counted in characters
NetworkGameList * _network_game_list
Game list of this client.
CompanyID dd_company_id
During admin dropdown, track which company this was for.
std::string NetworkChangeCompanyPassword(CompanyID company_id, std::string password)
Change the company password of a given company.
void NetworkQueryServer(const std::string &connection_string)
Query a server to fetch the game-info.
High level window description.
constexpr uint Horizontal() const
Get total horizontal padding of RectPadding.
Window used for asking the user if he is okay using a relay server.
int ScaleGUITrad(int value)
Scale traditional pixel dimensions to GUI zoom level.
ServerGameType
Game type the server can be using.
static NetworkClientInfo * GetByClientID(ClientID client_id)
Return the CI given it's client-identifier.
NetworkGameList * last_joined
The last joined server.
static NetworkRecvStatus SendCompanyPassword(const std::string &password)
Set the company password as requested.
static void OnClickCompanyAdmin([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, CompanyID company_id)
Admin button on a Company is clicked.
@ NGLS_TOO_OLD
Server is too old to query.
@ COMPANY_NEW_COMPANY
The client wants a new company.
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0.
@ WDP_AUTO
Find a place automatically.
Data structure describing how to show the list (what sort direction and criteria).
@ SLO_LOAD
File is being loaded.
ResizeInfo resize
Resize information.
std::string last_joined
Last joined server.
int32_t WindowNumber
Number to differentiate different windows of the same class.
Information about GRF, used in the game and (part of it) in savegames.
Main handle for clientlist.
@ FS_NORMAL
Index of the normal font in the font tables.
Rect Translate(int x, int y) const
Copy and translate Rect by x,y pixels.
void ShowGenerateLandscape()
Start with a normal game.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
bool NetworkMaxCompaniesReached()
Check if max_companies has been reached on the server (local check only).
bool Filter(FilterFunction *decide, F filter_data)
Filter the list.
std::unique_ptr< NWidgetBase > nested_root
Root of the nested tree.
static void OnClickCompanyNew([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, CompanyID)
Crete new company button is clicked.
void HandleButtonClick(WidgetID widget)
Do all things to make a button look clicked and mark it to be unclicked in a few ticks.
int height
Height of the window (number of pixels down in y direction)
uint16_t map_height
Map height.
@ WN_NETWORK_WINDOW_START
Network start server.
QueryString name_editbox
Server name editbox.
void DrawCompany(CompanyID company_id, const Rect &r, uint &line) const
Draw a company and its clients on the matrix.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
std::conditional_t< std::is_same_v< P, std::nullptr_t >, bool(const T &, const T &), bool(const T &, const T &, const P)> SortFunction
Signature of sort function.
void ForceResort()
Force a resort next Sort call Reset the resort timer if used too.
static void AdminClientKickCallback(Window *, bool confirmed)
Callback function for admin command to kick client.
static bool NGameTicksPlayingSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by the number of ticks the game is running.
@ ES_NOT_HANDLED
The passed event is not handled.
void ToggleSortOrder()
Toggle the sort order Since that is the worst condition for the sort function reverse the list here.
QueryString filter_editbox
Editbox for filter on servers.
void LoadText(std::string_view buf)
Load a text into the textfile viewer.
void ReInit(int rx=0, int ry=0, bool reposition=false)
Re-initialize a window, and optionally change its size.
Window * parent
Parent window.
@ MAX_COMPANIES
Maximum number of companies.
bool IsDescSortOrder() const
Check if the sort order is descending.
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
uint line_count
Amount of lines in the matrix.
@ NETWORK_COMPANY_PASSWORD
The password of the company.
static YearMonthDay ConvertDateToYMD(Date date)
Converts a Date to a Year, Month & Day.
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
std::string client_name
name of the player (as client)
int left
x position of left edge of the window
static void AdminCompanyResetCallback(Window *, bool confirmed)
Callback function for admin command to reset company.
WindowFlags flags
Window flags.
Rect Indent(int indent, bool end) const
Copy Rect and indent it from its position.
@ WF_TIMEOUT
Window timeout counter.
@ WN_NETWORK_WINDOW_GAME
Network game window.
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
Calculates height of string (in pixels).
int blot_offset
Left offset for green/yellow/red compatibility icon.
Window for displaying the textfile of a survey result.
static const std::string NETWORK_SURVEY_DETAILS_LINK
Link with more details & privacy statement of the survey.
Rect WithWidth(int width, bool end) const
Copy Rect and set its width.
void BuildGUINetworkGameList()
(Re)build the GUI network game list (a.k.a.
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub, ZoomLevel zoom)
Draw a sprite, not in a viewport.
@ WDF_MODAL
The window is a modal child of some other window, meaning the parent is 'inactive'.
byte companies_on
How many started companies do we have.
uint NetworkServerKickOrBanIP(ClientID client_id, bool ban, const std::string &reason)
Ban, or kick, everyone joined from the given client's IP.
@ PREVIEW
User is previewing the survey result.
Coordinates of a point in 2D.
bool searched_internet
Did we ever press "Search Internet" button?
bool IsWidgetDisabled(WidgetID widget_index) const
Gets the enabled/disabled status of a widget.
byte companies_max
Max companies allowed on server.
int CenterBounds(int min, int max, int size)
Determine where to draw a centred object inside a widget.
void GetListing()
Request a listing of all public servers.
std::string token
The token for this connection.
int player_self_index
The line the current player is on.
@ WC_NETWORK_ASK_SURVEY
Network ask survey window; Window numbers:
void ShowSaveLoadDialog(AbstractFileType abstract_filetype, SaveLoadOperation fop)
Launch save/load dialog in the given mode.
@ FT_SAVEGAME
old or new savegame
WindowNumber window_number
Window number within the window class.
bool SetFocusedWidget(WidgetID widget_index)
Set focus within this window to the given widget.
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
uint step_height
Step-size of height resize changes.
uint32_t SpriteID
The number of a sprite, without mapping bits and colourtables.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
@ CS_ALPHANUMERAL
Both numeric and alphabetic and spaces and stuff.
void OnTimeout() override
Called when this window's timeout has been reached.
bool NetworkCompanyIsPassworded(CompanyID company_id)
Check if the company we want to join requires a password.
@ WC_NONE
No window, redirects to WC_MAIN_WINDOW.
int player_host_index
The line the host is on.
@ SA_HOR_CENTER
Horizontally center the text.
void SetWidgetLoweredState(WidgetID widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
static const uint NETWORK_HOSTNAME_PORT_LENGTH
The maximum length of the host name + port, in bytes including '\0'. The extra six is ":" + port numb...
@ CONNECTION_TYPE_UNKNOWN
The Game Coordinator hasn't informed us yet what type of connection we have.
void NetworkDisconnect(bool close_admins)
We want to disconnect from the host/clients.
@ DESTTYPE_TEAM
Send message/notice to everyone playing the same company (Team)
static const uint NETWORK_PASSWORD_LENGTH
The maximum length of the password, in bytes including '\0' (must be >= NETWORK_SERVER_ID_LENGTH)
static const uint32_t GENERATE_NEW_SEED
Create a new random seed.
ClientID _network_own_client_id
Our client identifier.
void SetWidgetDisabledState(WidgetID widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
void DrawButtons(int &x, uint y, const std::vector< std::unique_ptr< ButtonCommon >> &buttons) const
Draw the buttons for a single line in the matrix.
std::string server_name
name of the server
std::string server_connection_string
The game server we want to connect to.
static bool NGameCalendarDateSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by calendar date.
static void OnClickCompanyJoin([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, CompanyID company_id)
Join button on a Company is clicked.
void ForceRebuild()
Force that a rebuild is needed.
CompanyID join_company
During query for company password, this stores what company we wanted to join.
@ NRWCD_UNHANDLED
Relay request is unhandled.
@ CCA_NEW
Create a new company.
@ TFT_SURVEY_RESULT
Survey result (preview)
void ScrollToSelectedServer()
Scroll the list up or down to the currently selected server.
bool IsWidgetLowered(WidgetID widget_index) const
Gets the lowered state of a widget.
NetworkGameList * server
Selected server.
std::map< WidgetID, QueryString * > querystrings
QueryString associated to WWT_EDITBOX widgets.
@ SBS_DOWN
Sort ascending.
ServerGameType server_game_type
Server type: local / public / invite-only.
int cancel_button
Widget button of parent window to simulate when pressing CANCEL in OSK.
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
void DrawSortButtonState(WidgetID widget, SortButtonState state) const
Draw a sort button's up or down arrow symbol.
void GuiShowTooltips(Window *parent, StringID str, TooltipCloseCondition close_tooltip, uint paramcount)
Shows a tooltip.
DropDownAdmin
The possibly entries in a DropDown for an admin.
static Pool::IterateWrapper< Titem > Iterate(size_t from=0)
Returns an iterable ensemble of all valid Titem.
void CreateNestedTree()
Perform the first part of the initialization of a nested widget tree.
static CompanyID _admin_company_id
For what company a confirmation window is open.
void ShowDropDownList(Window *w, DropDownList &&list, int selected, WidgetID button, uint width, bool instant_close)
Show a drop down list.
ClientID
'Unique' identifier to be given to clients
Listing GetListing() const
Export current sort conditions.
static size_t GetNumItems()
Returns number of valid items in the pool.
void RebuildListCompany(CompanyID company_id, CompanyID client_playas)
Part of RebuildList() to create the information for a single company.
void SetDParamMaxValue(size_t n, uint64_t max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
uint line_height
Current lineheight of each entry in the matrix.
@ CRR_NONE
Dummy reason for actions that don't need one.
ClientListWidgets query_widget
During a query this tracks what widget caused the query.
void SetDParam(size_t n, uint64_t v)
Set a string parameter v at index n in the global string parameter array.
@ COMPANY_SPECTATOR
The client is spectating.
@ WC_NETWORK_WINDOW
Network window; Window numbers:
Window * GetMainWindow()
Get the main window, i.e.
static void AdminClientBanCallback(Window *, bool confirmed)
Callback function for admin command to ban client.
uint8_t _network_join_waiting
The number of clients waiting in front of us.
bool use_password
Is this server passworded?
@ WC_NETWORK_STATUS_WINDOW
Network status window; Window numbers:
void ResetState()
Reset the matching state to process a new item.
void UpdateListPos()
Set this->list_pos to match this->server.
ClientNetworkCoordinatorSocketHandler _network_coordinator_client
The connection to the Game Coordinator.
TimerGameCalendar::Date calendar_date
Current calendar date.
@ NGLS_BANNED
You are banned from this server.
uint8_t max_clients
maximum amount of clients
uint32_t _network_join_bytes_total
The total number of bytes to download.
std::string server_password
password for joining this server
NetworkPasswordType
The type of password we're asking for.
EventState
State of handling an event.
@ NGLS_ONLINE
Server is online.
uint8_t max_companies
maximum amount of companies
uint16_t map_width
Map width.
@ WC_NETWORK_ASK_RELAY
Network ask relay window; Window numbers:
static const uint8_t PC_GREY
Grey palette colour.
bool GetState() const
Get the matching state of the current item.
@ DESTTYPE_CLIENT
Send message/notice to only a certain client (Private)
@ FT_HEIGHTMAP
heightmap file
void SetDParamStr(size_t n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
@ INVALID_CLIENT_ID
Client is not part of anything.
uint NetworkMaxCompaniesAllowed()
Get the maximum number of companies that are allowed by the server.
@ SM_MENU
Switch to game intro menu.
static const int ACTION_CLEAR
Clear editbox.
int top
y position of top edge of the window
static constexpr TimerGameTick::Ticks TICKS_PER_SECOND
Estimation of how many ticks fit in a single second.
void ShowNetworkChatQueryWindow(DestType type, int dest)
Show the chat window.
Structure with information shown in the game list (GUI)
void OnDropdownClose(Point pt, WidgetID widget, int index, bool instant_close) override
A dropdown window associated to this window has been closed.
void SetFilterFuncs(FilterFunction *const *n_funcs)
Hand the array of filter function pointers to the sort list.
bool NetworkClientConnectGame(const std::string &connection_string, CompanyID default_company, const std::string &join_server_password, const std::string &join_company_password)
Join a client to the server at with the given connection string.
uint8_t SortType() const
Get the sorttype of the list.
@ SA_CENTER
Center both horizontally and vertically.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
@ NGLS_OFFLINE
Server is offline (or cannot be queried).
#define lengthof(x)
Return the length of an fixed size array.
int width
width of the window (number of pixels to the right in x direction)
Dimension warning_size
How much space to use for the warning text.
void MarkWholeScreenDirty()
This function mark the whole screen as dirty.
NetworkSettings network
settings related to the network
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
void SetSortFuncs(SortFunction *const *n_funcs)
Hand the array of sort function pointers to the sort list.
void RebuildDone()
Notify the sortlist that the rebuild is done.
bool CDECL FilterFunction(const NetworkGameList * *, StringFilter &)
Signature of filter function.
int lock_offset
Left offset for lock icon.
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
int GetRowFromWidget(int clickpos, WidgetID widget, int padding, int line_height=-1) const
Compute the row of a widget that a user clicked in.
Scrollbar * vscroll
Vertical scrollbar of this window.
@ INVALID_COMPANY
An invalid company.
void RebuildList()
Rebuild the list, meaning: calculate the lines needed and what buttons go on which line.
void NetworkUpdateServerGameType()
The setting server_game_type was updated; possibly we need to take some action.
Window for displaying a textfile.
void RaiseWidgetsWhenLowered(Args... widgets)
Raises the widgets and sets widgets dirty that are lowered.
void NetworkServerKickClient(ClientID client_id, const std::string &reason)
Kick a single client.
NetworkGameList * next
Next pointer to make a linked game list.
byte landscape
The used landscape.
void Close(int data=0) override
Hide the window and all its child windows, and mark them for a later deletion.
Data structure for an opened window.
TextfileType
Additional text files accompanying Tar archives.
static void OnClickCompanyChat([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, CompanyID company_id)
Chat button on a Company is clicked.
void QueryCallbackProc(Window *, bool)
Callback procedure for the ShowQuery method.
std::string server_name
Server name.
void DrawWidgets() const
Paint all widgets of a window.
constexpr T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
@ ZOOM_LVL_OUT_4X
Zoomed 4 times out.
bool refreshing
Whether this server is being queried.
static const uint MAX_MAP_SIZE
Maximal map size = 4096.
void OnInvalidateData([[maybe_unused]] int data=0, [[maybe_unused]] bool gui_scope=true) override
Some data on this window has become invalid.
static NetworkRecvStatus SendGamePassword(const std::string &password)
Set the game password as requested.
StringList _network_host_list
The servers we know.
void OnPaint() override
The window must be repainted.
NetworkGameInfo info
The game information of this server.
byte clients_on
Current count of clients on server.
int Width() const
Get width of Rect.
@ WN_NETWORK_STATUS_WINDOW_JOIN
Network join status.
@ CCA_DELETE
Delete a company.
@ NGLS_FULL
Server is full and cannot be queried.
void NetworkServerSetCompanyPassword(CompanyID company_id, const std::string &password, bool already_hashed)
Set/Reset a company password on the server end.
Specification of a rectangle with absolute coordinates of all edges.
void ToggleWidgetLoweredState(WidgetID widget_index)
Invert the lowered/raised status of a widget.
std::string _network_server_invite_code
Our invite code as indicated by the Game Coordinator.
@ NRWCD_HANDLED
Relay request is handled, either by user or by timeout.
static void OnClickClientAdmin([[maybe_unused]] NetworkClientListWindow *w, [[maybe_unused]] Point pt, ClientID client_id)
Admin button on a Client is clicked.
bool Sort(Comp compare)
Sort the list.
uint32_t _network_join_bytes
The number of bytes we already downloaded.
void NetworkGameListRemoveItem(NetworkGameList *remove)
Remove an item from the gamelist linked list.
@ WC_TEXTFILE
textfile; Window numbers:
GRFConfig * grfconfig
List of NewGRF files used.
@ CLIENT_ID_SERVER
Servers always have this ID.
#define GREY_SCALE(level)
Return the colour for a particular greyscale level.
ServerListPosition list_pos
Position of the selected server.
@ WDP_CENTER
Center the window.
static bool NGameMapSizeSorter(NetworkGameList *const &a, NetworkGameList *const &b)
Sort servers by map size.
bool _left_button_clicked
Is left mouse button clicked?
void OnInit() override
Notification that the nested widget tree gets initialized.
@ TD_RTL
Text is written right-to-left by default.
TextDirection _current_text_dir
Text direction of the currently selected language.
bool _is_network_server
Does this client wants to be a network-server?
TimerGameCalendar::Date calendar_start
When the game started.
@ CS_NUMERAL
Only numeric ones.
Container for all information known about a client.
bool compatible
Can we connect to this server or not? (based on server_revision and grf_match.
@ CRR_MANUAL
The company is manually removed.
IntervalTimer< TimerWindow > refresh_interval
Refresh the online servers on a regular interval.
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
Return the string dimension in pixels.
int flag_offset
Left offset for language flag icon.
WidgetID widget_id
The widget that has the pop-up input menu.
@ NETWORK_GAME_PASSWORD
The password of the game.
@ FR_BORDERONLY
Draw border only, no background.
void ShowDropDownListAt(Window *w, DropDownList &&list, int selected, WidgetID button, Rect wi_rect, Colours wi_colour, bool instant_close)
Show a drop down list.
TimerGameTick::TickCounter ticks_playing
Amount of ticks the game has been running unpaused.
void SetListing(Listing l)
Import sort conditions.
void ShowNetworkAskRelay(const std::string &server_connection_string, const std::string &relay_connection_string, const std::string &token)
Show a modal confirmation window with "no" / "yes, once" / "yes, always" buttons.
NetworkGameListStatus status
Stats of the server.
void DrawCompanyIcon(CompanyID cid, int x, int y)
Draw the icon of a company.
ParticipateSurvey participate_survey
Participate in the automated survey.