43 #include "table/strings.h" 49 bool _ignore_restrictions;
86 suffix.
text[0] =
'\0';
95 if (
GB(callback, 0, 8) == 0xFF)
return;
96 if (callback < 0x400) {
107 if (callback == 0x400)
return;
108 if (callback == 0x401) {
112 if (callback < 0x400) {
119 if (callback >= 0x800 && callback < 0xC00) {
132 enum CargoSuffixInOut {
147 template <
typename TC,
typename TS>
154 for (uint j = 0; j <
lengthof(suffixes); j++) {
157 uint cargotype = local_id << 16 | use_input;
158 GetCargoSuffix(cargotype, cst, ind, ind_type, indspec, suffixes[j]);
160 suffixes[j].text[0] =
'\0';
166 for (uint j = 0; j <
lengthof(suffixes); j++) {
167 suffixes[j].text[0] =
'\0';
171 case CARGOSUFFIX_OUT:
191 static char industry_name[2][64];
194 GetString(industry_name[0], indsp1->
name,
lastof(industry_name[0]));
197 GetString(industry_name[1], indsp2->
name,
lastof(industry_name[1]));
199 int r =
strnatcmp(industry_name[0], industry_name[1]);
202 return (r != 0) ? r : (*a - *b);
230 uint8 indtype =
GB(p1, 0, 8);
240 static const NWidgetPart _nested_build_industry_widgets[] = {
249 NWidget(
WWT_MATRIX, COLOUR_DARK_GREEN,
WID_DPI_MATRIX_WIDGET),
SetMatrixDataTip(1, 0, STR_FUND_INDUSTRY_SELECTION_TOOLTIP),
SetFill(1, 0),
SetResize(1, 1),
SetScrollbar(
WID_DPI_SCROLLBAR),
256 SetDataTip(STR_INDUSTRY_DISPLAY_CHAIN, STR_INDUSTRY_DISPLAY_CHAIN_TOOLTIP),
264 WDP_AUTO,
"build_industry", 170, 212,
267 _nested_build_industry_widgets,
lengthof(_nested_build_industry_widgets)
282 static const int MATRIX_TEXT_OFFSET = 17;
284 static const int MAX_MINWIDTH_LINEHEIGHTS = 20;
290 for (uint i = 0; i <
lengthof(this->index); i++) {
292 this->enabled[i] =
false;
295 if (_game_mode == GM_EDITOR) {
297 this->enabled[this->count] =
true;
299 this->timer_enabled =
false;
314 if (this->selected_type == ind) this->selected_index = -1;
317 this->index[this->count] = ind;
320 if (this->selected_type == ind) this->selected_index = this->count;
327 if (this->selected_index == -1) {
328 this->selected_index = 0;
329 this->selected_type = this->index[0];
332 this->vscroll->
SetCount(this->count);
356 std::string cargostring;
361 for (byte j = 0; j < cargolistlen; j++) {
364 if (firstcargo < 0) {
370 GetString(buf, STR_INDUSTRY_VIEW_CARGO_LIST_EXTENSION,
lastof(buf));
377 GetString(buf, prefixstr,
lastof(buf));
378 cargostring = std::string(buf) + cargostring;
382 GetString(buf, prefixstr,
lastof(buf));
383 cargostring = std::string(buf);
394 this->selected_index = -1;
399 this->CreateNestedTree();
401 this->FinishInitNested(0);
416 for (byte i = 0; i < this->count; i++) {
421 d.width += MATRIX_TEXT_OFFSET + padding.width;
422 d.height = 5 * resize->height;
430 uint extra_lines_req = 0;
431 uint extra_lines_prd = 0;
434 for (byte i = 0; i < this->count; i++) {
444 if (strdim.width > max_minwidth) {
445 extra_lines_req =
max(extra_lines_req, strdim.width / max_minwidth + 1);
446 strdim.width = max_minwidth;
452 cargostring = this->MakeCargoListString(indsp->produced_cargo, cargo_suffix,
lengthof(indsp->produced_cargo), STR_INDUSTRY_VIEW_PRODUCES_N_CARGO);
454 if (strdim.width > max_minwidth) {
455 extra_lines_prd =
max(extra_lines_prd, strdim.width / max_minwidth + 1);
456 strdim.width = max_minwidth;
462 height += extra_lines_prd + extra_lines_req;
472 d.width += padding.width;
473 d.height += padding.height;
486 if (_game_mode == GM_EDITOR) {
488 SetDParam(0, STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY);
501 uint text_left, text_right, icon_left, icon_right;
504 icon_left = icon_right - 10;
509 icon_right = icon_left + 10;
514 for (byte i = 0; i < this->vscroll->
GetCapacity() && i + this->vscroll->
GetPosition() < this->count; i++) {
515 int y = r.top +
WD_MATRIX_TOP + i * this->resize.step_height;
516 bool selected = this->selected_index == i + this->vscroll->
GetPosition();
519 DrawString(text_left, text_right, y, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE);
525 DrawString(text_left, text_right, y, indsp->
name, selected ? TC_WHITE : TC_ORANGE);
539 DrawStringMultiLine(left, right, y, bottom, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES_TOOLTIP);
545 if (_game_mode != GM_EDITOR) {
547 DrawString(left, right, y, STR_FUND_INDUSTRY_INDUSTRY_BUILD_COST);
560 cargostring = this->MakeCargoListString(indsp->produced_cargo, cargo_suffix,
lengthof(indsp->produced_cargo), STR_INDUSTRY_VIEW_PRODUCES_N_CARGO);
567 if (callback_res > 0x400) {
571 if (str != STR_UNDEFINED) {
589 if (y < this->count) {
590 this->selected_index = y;
591 this->selected_type = this->index[y];
599 !this->enabled[this->selected_index])) {
601 this->RaiseButtons();
606 if (this->enabled[this->selected_index] && click_count > 1) this->OnClick(pt,
WID_DPI_FUND_WIDGET, 1);
649 uint32 seed = InteractiveRandom();
651 if (_game_mode == GM_EDITOR) {
661 _ignore_restrictions =
true;
663 DoCommandP(tile, (InteractiveRandomRange(indsp->
num_table) << 8) | this->selected_type, seed,
667 _ignore_restrictions =
false;
679 if (!this->timer_enabled)
return;
680 if (--this->callback_timer == 0) {
691 if (call_back_result != this->enabled[this->selected_index]) {
692 this->enabled[this->selected_index] = call_back_result;
702 this->RaiseButtons();
707 this->RaiseButtons();
717 if (!gui_scope)
return;
726 void ShowBuildIndustryWindow()
733 static void UpdateIndustryProduction(
Industry *i);
735 static inline bool IsProductionAlterable(
const Industry *i)
738 bool has_prod =
false;
739 for (
size_t j = 0; j <
lengthof(is->production_rate); j++) {
740 if (is->production_rate[j] != 0) {
778 this->editbox_line = IL_NONE;
779 this->clicked_line = IL_NONE;
780 this->clicked_button = 0;
783 this->InitNested(window_number);
787 this->InvalidateData();
794 if (this->IsShaded())
return;
799 this->info_height = expected + 1;
818 bool has_accept =
false;
843 switch (cargo_suffix[j].
display) {
848 str = stockpiling ? STR_INDUSTRY_VIEW_ACCEPT_CARGO_AMOUNT : STR_INDUSTRY_VIEW_ACCEPT_CARGO;
855 str = STR_INDUSTRY_VIEW_ACCEPT_CARGO;
873 if (this->editable == EA_RATE) this->production_offset_y = y;
884 if (this->editable == EA_RATE) {
892 if (this->editable == EA_MULTIPLIER) {
894 this->production_offset_y = y;
907 if (callback_res > 0x400) {
911 if (message != STR_NULL && message != STR_UNDEFINED) {
934 if (widget ==
WID_IV_INFO) size->height = this->info_height;
944 switch (this->editable) {
952 if (pt.y >= this->production_offset_y) {
965 if (line == IL_NONE)
return;
967 NWidgetBase *nwi = this->GetWidget<NWidgetBase>(widget);
973 switch (this->editable) {
996 default: NOT_REACHED();
999 UpdateIndustryProduction(i);
1002 this->clicked_line = line;
1003 this->clicked_button = button;
1006 this->editbox_line = line;
1007 switch (this->editable) {
1018 default: NOT_REACHED();
1044 this->clicked_line = IL_NONE;
1045 this->clicked_button = 0;
1051 if (this->viewport != NULL) {
1064 uint value = atoi(str);
1065 switch (this->editbox_line) {
1066 case IL_NONE: NOT_REACHED();
1076 UpdateIndustryProduction(i);
1087 if (!gui_scope)
return;
1089 if (IsProductionAlterable(i)) {
1093 this->editable = EA_NONE;
1108 static void UpdateIndustryProduction(
Industry *i)
1132 NWidget(
NWID_VIEWPORT, INVALID_COLOUR,
WID_IV_VIEWPORT),
SetMinimalSize(254, 86),
SetFill(1, 0),
SetPadding(1, 1, 1, 1),
SetResize(1, 1),
1146 WDP_AUTO,
"view_industry", 260, 120,
1149 _nested_industry_view_widgets,
lengthof(_nested_industry_view_widgets)
1152 void ShowIndustryViewWindow(
int industry)
1192 static const Industry *last_industry;
1195 static const StringID sorter_names[];
1205 this->industries.
Clear();
1208 FOR_ALL_INDUSTRIES(i) {
1209 *this->industries.
Append() = i;
1217 if (!this->industries.
Sort())
return;
1218 IndustryDirectoryWindow::last_industry = NULL;
1246 int p1 = GetCargoTransportedPercentsIfValid(i, 0);
1247 int p2 = GetCargoTransportedPercentsIfValid(i, 1);
1249 if (p1 > p2)
Swap(p1, p2);
1251 return (p1 << 8) + p2;
1257 static char buf_cache[96];
1258 static char buf[96];
1261 GetString(buf, STR_INDUSTRY_NAME,
lastof(buf));
1263 if (*b != last_industry) {
1266 GetString(buf_cache, STR_INDUSTRY_NAME,
lastof(buf_cache));
1279 int r = it_a - it_b;
1280 return (r == 0) ? IndustryNameSorter(a, b) : r;
1286 uint prod_a = 0, prod_b = 0;
1287 for (uint i = 0; i <
lengthof((*a)->produced_cargo); i++) {
1288 if ((*a)->produced_cargo[i] !=
CT_INVALID) prod_a += (*a)->last_month_production[i];
1289 if ((*b)->produced_cargo[i] !=
CT_INVALID) prod_b += (*b)->last_month_production[i];
1291 int r = prod_a - prod_b;
1293 return (r == 0) ? IndustryTypeSorter(a, b) : r;
1299 int r = GetCargoTransportedSortValue(*a) - GetCargoTransportedSortValue(*b);
1300 return (r == 0) ? IndustryNameSorter(a, b) : r;
1335 case 1:
return STR_INDUSTRY_DIRECTORY_ITEM_NOPROD;
1336 case 5:
return STR_INDUSTRY_DIRECTORY_ITEM;
1337 default:
return STR_INDUSTRY_DIRECTORY_ITEM_TWO;
1344 this->CreateNestedTree();
1347 this->industries.
SetListing(this->last_sorting);
1348 this->industries.
SetSortFuncs(IndustryDirectoryWindow::sorter_funcs);
1350 this->BuildSortIndustriesList();
1352 this->FinishInitNested(0);
1357 this->last_sorting = this->industries.
GetListing();
1375 if (this->industries.
Length() == 0) {
1379 for (uint i = this->vscroll->
GetPosition(); i < this->industries.
Length(); i++) {
1382 y += this->resize.step_height;
1396 d.height += padding.height;
1397 *size =
maxdim(*size, d);
1403 for (uint i = 0; IndustryDirectoryWindow::sorter_names[i] !=
INVALID_STRING_ID; i++) {
1406 d.width += padding.width;
1407 d.height += padding.height;
1408 *size =
maxdim(*size, d);
1414 for (uint i = 0; i < this->industries.
Length(); i++) {
1417 resize->height = d.height;
1421 *size =
maxdim(*size, d);
1442 if (p < this->industries.
Length()) {
1456 if (this->industries.
SortType() != index) {
1458 this->BuildSortIndustriesList();
1469 if (this->industries.
NeedRebuild()) this->BuildSortIndustriesList();
1470 this->DrawWidgets();
1476 this->BuildSortIndustriesList();
1495 Listing IndustryDirectoryWindow::last_sorting = {
false, 0};
1496 const Industry *IndustryDirectoryWindow::last_industry = NULL;
1500 &IndustryNameSorter,
1501 &IndustryTypeSorter,
1502 &IndustryProductionSorter,
1503 &IndustryTransportedCargoSorter
1507 const StringID IndustryDirectoryWindow::sorter_names[] = {
1510 STR_SORT_BY_PRODUCTION,
1511 STR_SORT_BY_TRANSPORTED,
1518 WDP_AUTO,
"list_industries", 428, 190,
1521 _nested_industry_directory_widgets,
lengthof(_nested_industry_directory_widgets)
1524 void ShowIndustryDirectory()
1543 SetDataTip(STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP, STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP),
1546 SetDataTip(STR_INDUSTRY_CARGOES_SELECT_INDUSTRY, STR_INDUSTRY_CARGOES_SELECT_INDUSTRY_TOOLTIP),
1548 SetDataTip(STR_INDUSTRY_CARGOES_SELECT_CARGO, STR_INDUSTRY_CARGOES_SELECT_CARGO_TOOLTIP),
1560 WDP_AUTO,
"industry_cargoes", 300, 210,
1563 _nested_industry_cargoes_widgets,
lengthof(_nested_industry_cargoes_widgets)
1634 this->u.industry.ind_type = ind_type;
1652 for (
int i = 0; i < this->u.cargo.num_cargoes; i++) {
1653 if (cargo == this->u.cargo.vertical_cargoes[i]) {
1658 if (column < 0)
return -1;
1661 assert(this->u.cargo.supp_cargoes[column] ==
INVALID_CARGO);
1662 this->u.cargo.supp_cargoes[column] = column;
1664 assert(this->u.cargo.cust_cargoes[column] ==
INVALID_CARGO);
1665 this->u.cargo.cust_cargoes[column] = column;
1679 if (this->u.cargo.supp_cargoes[i] !=
INVALID_CARGO)
return true;
1680 if (this->u.cargo.cust_cargoes[i] !=
INVALID_CARGO)
return true;
1694 void MakeCargo(
const CargoID *cargoes, uint length,
int count = -1,
bool top_end =
false,
bool bottom_end =
false)
1701 this->u.cargo.vertical_cargoes[num] = cargoes[i];
1705 this->u.cargo.num_cargoes = (count < 0) ? num : count;
1707 this->u.cargo.top_end = top_end;
1708 this->u.cargo.bottom_end = bottom_end;
1723 for (i = 0; i <
MAX_CARGOES && i < length; i++) this->u.cargo_label.cargoes[i] = cargoes[i];
1725 this->u.cargo_label.left_align = left_align;
1735 this->u.header = textid;
1746 int n = this->u.cargo.num_cargoes;
1749 return xpos + cargo_field_width / 2 - (HOR_CARGO_WIDTH + HOR_CARGO_SPACE / 2) * (n / 2);
1751 return xpos + cargo_field_width / 2 - HOR_CARGO_WIDTH / 2 - (HOR_CARGO_WIDTH + HOR_CARGO_SPACE) * (n / 2);
1760 void Draw(
int xpos,
int ypos)
const 1762 switch (this->type) {
1773 int ypos1 = ypos + VERT_INTER_INDUSTRY_SPACE / 2;
1774 int ypos2 = ypos + normal_height - 1 - VERT_INTER_INDUSTRY_SPACE / 2;
1775 int xpos2 = xpos + industry_width - 1;
1776 GfxDrawLine(xpos, ypos1, xpos2, ypos1, INDUSTRY_LINE_COLOUR);
1777 GfxDrawLine(xpos, ypos1, xpos, ypos2, INDUSTRY_LINE_COLOUR);
1778 GfxDrawLine(xpos, ypos2, xpos2, ypos2, INDUSTRY_LINE_COLOUR);
1779 GfxDrawLine(xpos2, ypos1, xpos2, ypos2, INDUSTRY_LINE_COLOUR);
1786 int blob_left, blob_right;
1788 blob_right = xpos2 - BLOB_DISTANCE;
1789 blob_left = blob_right - BLOB_WIDTH;
1791 blob_left = xpos + BLOB_DISTANCE;
1792 blob_right = blob_left + BLOB_WIDTH;
1794 GfxFillRect(blob_left, ypos2 - BLOB_DISTANCE - BLOB_HEIGHT, blob_right, ypos2 - BLOB_DISTANCE,
PC_BLACK);
1795 GfxFillRect(blob_left + 1, ypos2 - BLOB_DISTANCE - BLOB_HEIGHT + 1, blob_right - 1, ypos2 - BLOB_DISTANCE - 1, indsp->
map_colour);
1801 const CargoID *other_right, *other_left;
1803 other_right = this->u.industry.other_accepted;
1804 other_left = this->u.industry.other_produced;
1806 other_right = this->u.industry.other_produced;
1807 other_left = this->u.industry.other_accepted;
1809 ypos1 += VERT_CARGO_EDGE;
1813 int xp = xpos + industry_width + CARGO_STUB_WIDTH;
1814 DrawHorConnection(xpos + industry_width, xp - 1, ypos1, csp);
1819 int xp = xpos - CARGO_STUB_WIDTH;
1820 DrawHorConnection(xp + 1, xpos - 1, ypos1, csp);
1829 int cargo_base = this->GetCargoBase(xpos);
1830 int top = ypos + (this->u.cargo.top_end ? VERT_INTER_INDUSTRY_SPACE / 2 + 1 : 0);
1831 int bot = ypos - (this->u.cargo.bottom_end ? VERT_INTER_INDUSTRY_SPACE / 2 + 1 : 0) + normal_height - 1;
1832 int colpos = cargo_base;
1833 for (
int i = 0; i < this->u.cargo.num_cargoes; i++) {
1834 if (this->u.cargo.top_end) GfxDrawLine(colpos, top - 1, colpos + HOR_CARGO_WIDTH - 1, top - 1, CARGO_LINE_COLOUR);
1835 if (this->u.cargo.bottom_end) GfxDrawLine(colpos, bot + 1, colpos + HOR_CARGO_WIDTH - 1, bot + 1, CARGO_LINE_COLOUR);
1836 GfxDrawLine(colpos, top, colpos, bot, CARGO_LINE_COLOUR);
1840 colpos += HOR_CARGO_WIDTH - 2;
1841 GfxDrawLine(colpos, top, colpos, bot, CARGO_LINE_COLOUR);
1842 colpos += 1 + HOR_CARGO_SPACE;
1845 const CargoID *hor_left, *hor_right;
1847 hor_left = this->u.cargo.cust_cargoes;
1848 hor_right = this->u.cargo.supp_cargoes;
1850 hor_left = this->u.cargo.supp_cargoes;
1851 hor_right = this->u.cargo.cust_cargoes;
1853 ypos += VERT_CARGO_EDGE + VERT_INTER_INDUSTRY_SPACE / 2;
1856 int col = hor_left[i];
1859 for (; col > 0; col--) {
1860 int lf = cargo_base + col * HOR_CARGO_WIDTH + (col - 1) * HOR_CARGO_SPACE;
1861 DrawHorConnection(lf, lf + HOR_CARGO_SPACE - dx, ypos, csp);
1864 DrawHorConnection(xpos, cargo_base - dx, ypos, csp);
1867 int col = hor_right[i];
1870 for (; col < this->u.cargo.num_cargoes - 1; col++) {
1871 int lf = cargo_base + (col + 1) * HOR_CARGO_WIDTH + col * HOR_CARGO_SPACE;
1872 DrawHorConnection(lf + dx - 1, lf + HOR_CARGO_SPACE - 1, ypos, csp);
1883 ypos += VERT_CARGO_EDGE + VERT_INTER_INDUSTRY_SPACE / 2;
1911 int cpos = this->GetCargoBase(0);
1913 for (col = 0; col < this->u.cargo.num_cargoes; col++) {
1914 if (pt.x < cpos)
break;
1920 int vpos = VERT_INTER_INDUSTRY_SPACE / 2 + VERT_CARGO_EDGE;
1931 if (this->u.cargo.supp_cargoes[row] !=
INVALID_CARGO)
return this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]];
1938 if (col == this->u.cargo.num_cargoes) {
1939 if (this->u.cargo.cust_cargoes[row] !=
INVALID_CARGO)
return this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]];
1940 if (right != NULL) {
1951 return (this->u.cargo.supp_cargoes[row] !=
INVALID_CARGO) ? this->u.cargo.vertical_cargoes[this->u.cargo.supp_cargoes[row]] :
INVALID_CARGO;
1954 return (this->u.cargo.cust_cargoes[row] !=
INVALID_CARGO) ? this->u.cargo.vertical_cargoes[this->u.cargo.cust_cargoes[row]] :
INVALID_CARGO;
1967 int vpos = VERT_INTER_INDUSTRY_SPACE / 2 + VERT_CARGO_EDGE;
1975 return this->u.cargo_label.cargoes[row];
1988 GfxDrawLine(left, top, right, top, CARGO_LINE_COLOUR);
2036 int other_count = 0;
2041 int col = cargo_fld->
ConnectCargo(indsp->produced_cargo[i],
true);
2042 if (col < 0) others[other_count++] = indsp->produced_cargo[i];
2046 for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
2051 for (uint i = 0; i < cargo_fld->u.
cargo.num_cargoes; i++) {
2053 if (cid == CT_PASSENGERS || cid == CT_MAIL) cargo_fld->
ConnectCargo(cid,
true);
2069 CargoesField *cargo_fld = this->columns + (accepting ? column - 1 : column + 1);
2072 for (uint i = 0; i < cargo_fld->u.
cargo.num_cargoes; i++) {
2073 int col = cargo_fld->
ConnectCargo(cargo_fld->u.
cargo.vertical_cargoes[i], !accepting);
2074 if (col >= 0) cargoes[col] = cargo_fld->u.
cargo.vertical_cargoes[i];
2094 int other_count = 0;
2100 if (col < 0) others[other_count++] = indsp->
accepts_cargo[i];
2104 for (uint i = 0; i < CargoesField::max_cargoes && other_count > 0; i++) {
2109 for (uint i = 0; i < cargo_fld->u.
cargo.num_cargoes; i++) {
2169 this->CreateNestedTree();
2171 this->FinishInitNested(0);
2172 this->OnInvalidateData(
id);
2185 this->ind_textsize.width = 0;
2186 this->ind_textsize.height = 0;
2190 if (!indsp->
enabled)
continue;
2195 d.width =
max(d.width, this->ind_textsize.width);
2196 d.height = this->ind_textsize.height;
2200 this->cargo_textsize.width = 0;
2201 this->cargo_textsize.height = 0;
2204 if (!csp->
IsValid())
continue;
2207 d =
maxdim(d, this->cargo_textsize);
2210 d.width += 2 * HOR_TEXT_PADDING;
2213 d.height =
max(d.height + 2 * VERT_TEXT_PADDING, min_ind_height);
2230 size->width =
max(size->width, this->ind_textsize.width + padding.width);
2234 size->width =
max(size->width, this->cargo_textsize.width + padding.width);
2264 while (length1 > 0) {
2266 for (uint i = 0; i < length2; i++)
if (*cargoes1 == cargoes2[i])
return true;
2282 for (uint i = 0; i < length; i++) {
2284 if (cargoes[i] == CT_PASSENGERS || cargoes[i] == CT_MAIL)
return true;
2299 case LT_TEMPERATE: climate_mask =
HZ_TEMP;
break;
2302 case LT_TOYLAND: climate_mask =
HZ_TOYLND;
break;
2303 default: NOT_REACHED();
2305 for (uint i = 0; i < length; i++) {
2331 if (!indsp->
enabled)
continue;
2349 if (!indsp->
enabled)
continue;
2351 if (HasCommonValidCargo(cargoes, length, indsp->produced_cargo,
lengthof(indsp->produced_cargo))) count++;
2364 while (top < bottom && !this->fields[top].columns[column].HasConnection()) {
2365 this->fields[top].columns[column].MakeEmpty(
CFT_EMPTY);
2368 this->fields[top].columns[column].u.cargo.top_end =
true;
2370 while (bottom > top && !this->fields[bottom].columns[column].HasConnection()) {
2371 this->fields[bottom].columns[column].MakeEmpty(
CFT_EMPTY);
2374 this->fields[bottom].columns[column].u.cargo.bottom_end =
true;
2385 assert(this->fields[row].columns[col].type ==
CFT_EMPTY);
2386 this->fields[row].columns[col].MakeIndustry(it);
2388 this->fields[row].ConnectIndustryProduced(col);
2390 this->fields[row].ConnectIndustryAccepted(col);
2412 this->GetWidget<NWidgetCore>(
WID_IC_CAPTION)->widget_data = STR_INDUSTRY_CARGOES_INDUSTRY_CAPTION;
2413 this->ind_cargo = it;
2417 this->fields.
Clear();
2427 bool houses_accept = HousesCanAccept(central_sp->produced_cargo,
lengthof(central_sp->produced_cargo));
2430 int num_cust = CountMatchingAcceptingIndustries(central_sp->produced_cargo,
lengthof(central_sp->produced_cargo)) + houses_accept;
2431 int num_indrows =
max(3,
max(num_supp, num_cust));
2432 for (
int i = 0; i < num_indrows; i++) {
2441 int central_row = 1 + num_indrows / 2;
2442 this->fields[central_row].columns[2].MakeIndustry(it);
2443 this->fields[central_row].ConnectIndustryProduced(2);
2444 this->fields[central_row].ConnectIndustryAccepted(2);
2447 this->fields[central_row - 1].MakeCargoLabel(2,
true);
2448 this->fields[central_row + 1].MakeCargoLabel(2,
false);
2455 if (!indsp->
enabled)
continue;
2458 this->
PlaceIndustry(1 + supp_count * num_indrows / num_supp, 0, it);
2463 this->
PlaceIndustry(1 + cust_count * num_indrows / num_cust, 4, it);
2468 if (houses_supply) {
2469 this->
PlaceIndustry(1 + supp_count * num_indrows / num_supp, 0, NUM_INDUSTRYTYPES);
2472 if (houses_accept) {
2473 this->
PlaceIndustry(1 + cust_count * num_indrows / num_cust, 4, NUM_INDUSTRYTYPES);
2477 this->ShortenCargoColumn(1, 1, num_indrows);
2478 this->ShortenCargoColumn(3, 1, num_indrows);
2482 this->NotifySmallmap();
2491 this->GetWidget<NWidgetCore>(
WID_IC_CAPTION)->widget_data = STR_INDUSTRY_CARGOES_CARGO_CAPTION;
2495 this->fields.
Clear();
2503 bool houses_supply = HousesCanSupply(&cid, 1);
2504 bool houses_accept = HousesCanAccept(&cid, 1);
2505 int num_supp = CountMatchingProducingIndustries(&cid, 1) + houses_supply + 1;
2506 int num_cust = CountMatchingAcceptingIndustries(&cid, 1) + houses_accept;
2507 int num_indrows =
max(num_supp, num_cust);
2508 for (
int i = 0; i < num_indrows; i++) {
2517 this->fields[num_indrows].MakeCargoLabel(0,
false);
2524 if (!indsp->
enabled)
continue;
2526 if (HasCommonValidCargo(&cid, 1, indsp->produced_cargo,
lengthof(indsp->produced_cargo))) {
2527 this->
PlaceIndustry(1 + supp_count * num_indrows / num_supp, 0, it);
2532 this->
PlaceIndustry(1 + cust_count * num_indrows / num_cust, 2, it);
2537 if (houses_supply) {
2538 this->
PlaceIndustry(1 + supp_count * num_indrows / num_supp, 0, NUM_INDUSTRYTYPES);
2541 if (houses_accept) {
2542 this->
PlaceIndustry(1 + cust_count * num_indrows / num_cust, 2, NUM_INDUSTRYTYPES);
2546 this->ShortenCargoColumn(1, 1, num_indrows);
2550 this->NotifySmallmap();
2562 if (!gui_scope)
return;
2572 this->ComputeIndustryDisplay(data);
2580 int width = r.right - r.left + 1;
2584 _cur_dpi = &tmp_dpi;
2592 for (uint i = 0; i < this->fields.
Length(); i++) {
2594 if (vpos + row_height >= 0) {
2595 int xpos = left_pos;
2604 while (col >= 0 && col <= last_column) {
2605 this->fields[i].columns[col].Draw(xpos, vpos);
2611 if (vpos >= height)
break;
2631 if (pt.y < vpos)
return false;
2634 if (row + 1 >= (
int)this->fields.
Length())
return false;
2639 if (pt.x < xpos)
return false;
2641 for (column = 0; column <= 5; column++) {
2643 if (pt.x < xpos + width)
break;
2647 if (column > num_columns)
return false;
2654 fieldxy->x = num_columns - column;
2657 fieldxy->x = column;
2668 if (!CalculatePositionInWidget(pt, &fieldxy, &xy))
return;
2670 const CargoesField *fld = this->fields[fieldxy.y].columns + fieldxy.x;
2671 switch (fld->
type) {
2677 CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : NULL;
2678 CargoesField *rgt = (fieldxy.x < 4) ? this->fields[fieldxy.y].columns + fieldxy.x + 1 : NULL;
2703 this->NotifySmallmap();
2713 if (lst->
Length() == 0) {
2727 if (!indsp->
enabled)
continue;
2730 if (lst->
Length() == 0) {
2734 int selected = (this->ind_cargo <
NUM_INDUSTRYTYPES) ? (
int)this->ind_cargo : -1;
2743 if (index < 0)
return;
2747 this->ComputeCargoDisplay(index);
2751 this->ComputeIndustryDisplay(index);
2761 if (!CalculatePositionInWidget(pt, &fieldxy, &xy))
return;
2763 const CargoesField *fld = this->fields[fieldxy.y].columns + fieldxy.x;
2765 switch (fld->
type) {
2767 CargoesField *lft = (fieldxy.x > 0) ? this->fields[fieldxy.y].columns + fieldxy.x - 1 : NULL;
2768 CargoesField *rgt = (fieldxy.x < 4) ? this->fields[fieldxy.y].columns + fieldxy.x + 1 : NULL;
2780 GuiShowTooltips(
this, STR_INDUSTRY_CARGOES_INDUSTRY_TOOLTIP, 0, NULL, TCC_HOVER);
2790 params[0] = csp->
name;
2791 GuiShowTooltips(
this, STR_INDUSTRY_CARGOES_CARGO_TOOLTIP, 1, params, TCC_HOVER);
2818 if (
id >= NUM_INDUSTRYTYPES)
return;
CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]
16 accepted cargoes.
bool enabled
the house is available to build (true by default, but can be disabled by newgrf)
virtual void OnHover(Point pt, int widget)
The mouse is hovering over a widget in the window, perform an action for it, like opening a custom to...
Functions related to OTTD's strings.
void NotifySmallmap()
Notify smallmap that new displayed industries have been selected (in _displayed_industries).
void GenerateIndustries()
This function will create random industries during game creation.
static const int HOR_CARGO_BORDER_SPACE
Amount of space between the left/right edge of a CFT_CARGO field, and the left/right most vertical ca...
void ShowDropDownMenu(Window *w, const StringID *strings, int selected, int button, uint32 disabled_mask, uint32 hidden_mask, uint width)
Show a dropdown menu window near a widget of the parent window.
Functions/types related to NewGRF debugging.
static void Swap(T &a, T &b)
Type safe swap operation.
Transfer storage of cargo suffix information.
Base types for having sorted lists in GUIs.
void RebuildDone()
Notify the sortlist that the rebuild is done.
static const uint MAX_CARGOES
Maximum number of cargoes carried in a CFT_CARGO field in CargoesField.
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
Update size and resize step of a widget in the window.
GameSettings _settings_game
Game settings of a running game or the scenario editor.
Definition of stuff that is very close to a company, like the company struct itself.
bool _networking
are we in networking mode?
static int GetCargoTransportedPercentsIfValid(const Industry *i, uint id)
Returns percents of cargo transported if industry produces this cargo, else -1.
static uint minu(const uint a, const uint b)
Returns the minimum of two unsigned integers.
virtual void OnDropdownSelect(int widget, int index)
A dropdown option associated to this window has been selected.
bool enabled
entity still available (by default true).newgrf can disable it, though
Build (fund or prospect) a new industry,.
byte production_rate[INDUSTRY_NUM_OUTPUTS]
production rate for each cargo
void SortIndustryTypes()
Initialize the list of sorted industry types.
static const uint CALLBACK_FAILED
Different values for Callback result evaluations.
Data about how and where to blit pixels.
static const uint8 PC_WHITE
White palette colour.
Horizontally center the text.
static int CountMatchingAcceptingIndustries(const CargoID *cargoes, uint length)
Count how many industries have accepted cargoes in common with one of the supplied set...
uint8 raw_industry_construction
type of (raw) industry construction (none, "normal", prospecting)
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...
Offset at right of a matrix cell.
byte landscape
the landscape we're currently in
High level window description.
byte map_colour
colour used for the small map
static int industry_width
Width of an industry field.
uint16 count
How many industries are loaded.
void MakeIndustry(IndustryType ind_type)
Make an industry type field.
below this level, the industry is set to be closing
static Titem * Get(size_t index)
Returns Titem with given index.
static bool IsInsideMM(const T x, const uint min, const uint max)
Checks if a value is in an interval.
static const int VERT_CARGO_SPACE
Amount of vertical space between two connected cargoes at an industry.
int info_height
Height needed for the WID_IV_INFO panel.
Functions for NewGRF industries.
static const int INDUSTRY_LINE_COLOUR
Line colour of the industry type box.
void MakeEmpty(CargoesFieldType type)
Make one of the empty fields (CFT_EMPTY or CFT_SMALL_EMPTY).
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
virtual void SetStringParameters(int widget) const
Initialize string parameters for a widget.
void PlaceIndustry(int row, int col, IndustryType it)
Place an industry in the fields.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
Offset at top to draw the frame rectangular area.
void ShowSmallMap()
Show the smallmap window.
virtual void OnPaint()
The window must be repainted.
void SetSortFuncs(SortFunction *const *n_funcs)
Hand the array of sort function pointers to the sort list.
void ShowQueryString(StringID str, StringID caption, uint maxsize, Window *parent, CharSetFilter afilter, QueryStringFlags flags)
Show a query popup window with a textbox in it.
uint32 GetIndustryProbabilityCallback(IndustryType type, IndustryAvailabilityCallType creation_type, uint32 default_prob)
Check with callback CBID_INDUSTRY_PROBABILITY whether the industry can be built.
Maximal number of cargo types in a game.
void ShowDropDownList(Window *w, const DropDownList *list, int selected, int button, uint width, bool auto_width, bool instant_close)
Show a drop down list.
CargoSuffixDisplay
Ways of displaying the cargo.
byte cargo_acceptance[HOUSE_NUM_ACCEPTS]
acceptance level for the cargo slots
void BuildSortIndustriesList()
(Re)Build industries list
Specification of a cargo type.
void GuiShowTooltips(Window *parent, StringID str, uint paramcount, const uint64 params[], TooltipCloseCondition close_tooltip)
Shows a tooltip.
Display the cargo without sub-type (cb37 result 401).
from the Fund/build window
default level set when the industry is created
static int small_height
Height of the header row.
IndustryType _sorted_industry_types[NUM_INDUSTRYTYPES]
Industry types sorted by name.
Editability editable
Mode for changing production.
CargoID accepts_cargo[HOUSE_NUM_ACCEPTS]
input cargo slots
uint16 callback_mask
Bitmask of industry callbacks that have to be called.
struct CargoesField::@17::@19 cargo
Cargo data (for CFT_CARGO).
static uint TileX(TileIndex tile)
Get the X component of a tile.
static const int CARGO_LINE_COLOUR
Line colour around the cargo.
static bool IsInsideBS(const T x, const uint base, const uint size)
Checks if a value is between a window started at some base point.
void Clear()
Remove all items from the list.
static bool HousesCanSupply(const CargoID *cargoes, uint length)
Can houses be used to supply one of the cargoes?
void Compact()
Compact the list down to the smallest block size boundary.
signal set to actually close the industry
Defines the internal data of a functional industry.
static const int BLOB_HEIGHT
Height of the industry legend colour, including border.
DifficultySettings difficulty
settings related to the difficulty
virtual void SetStringParameters(int widget) const
Initialize string parameters for a widget.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
Industry-directory window.
Tindex index
Index of this pool item.
static const int DAY_TICKS
1 day is 74 ticks; _date_fract used to be uint16 and incremented by 885.
Offset at top of a matrix cell.
InfoLine
Specific lines in the info panel.
#define lastof(x)
Get the last element of an fixed size array.
virtual void OnPlaceObjectAbort()
The user cancelled a tile highlight mode that has been set.
StringID GetGRFStringID(uint32 grfid, StringID stringid)
Returns the index for this stringid associated with its grfID.
Functions related to world/map generation.
static void ShowIndustryCargoesWindow(IndustryType id)
Open the industry and cargoes window.
Stuff related to the text buffer GUI.
static const int MATRIX_TEXT_OFFSET
The offset for the text in the matrix.
static int CountMatchingProducingIndustries(const CargoID *cargoes, uint length)
Count how many industries have produced cargoes in common with one of the supplied set...
bool persistent_buildingtools
keep the building tools active after usage
void ComputeCargoDisplay(CargoID cid)
Compute what and where to display for cargo id cid.
Common return value for all commands.
Dimension ind_textsize
Size to hold any industry type text, as well as STR_INDUSTRY_CARGOES_SELECT_INDUSTRY.
bool IsCargoIDValid(CargoID t)
Test whether cargo type is not CT_INVALID.
void MakeHeader(StringID textid)
Make a header above an industry column.
static T max(const T a, const T b)
Returns the maximum of two values.
the industry is running at full speed
void SetListing(Listing l)
Import sort conditions.
Large amount of vertical space between two paragraphs of text.
int DrawInfo(uint left, uint right, uint top)
Draw the text in the WID_IV_INFO panel.
Allow changing the production rates.
Window * GetCallbackWnd()
Get the window that started the current highlighting.
static const uint TILE_SIZE
Tile size in world coordinates.
StringID name
Name of this type of cargo.
Industry directory; Window numbers:
static const HouseID NUM_HOUSES
Total number of houses.
StringID name
Displayed name of the industry.
static int RoundDivSU(int a, uint b)
Computes round(a / b) for signed a and unsigned b.
bool NeedRebuild() const
Check if a rebuild is needed.
static int cargo_field_width
Width of a cargo field.
bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int height)
Set up a clipping area for only drawing into a certain area.
Called to determine more text in the fund industry window.
Display the cargo and amount (if useful), but no sub-type (cb37 result 400 or fail).
static uint ClampU(const uint a, const uint min, const uint max)
Clamp an unsigned integer between an interval.
virtual void OnResize()
Called after the window got resized.
T * Append(uint to_add=1)
Append an item and return it.
StringID GetIndustryString(const Industry *i) const
Get the StringID to draw and set the appropriate DParams.
HouseZones building_availability
where can it be built (climates, zones)
Class to backup a specific variable and restore it later.
CompanyByte _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
Functions related to (drawing on) viewports.
Pseudo random number generator.
void ForceRebuild()
Force that a rebuild is needed.
Data structure for an opened window.
bool _ctrl_pressed
Is Ctrl pressed?
void InvalidateWindowClassesData(WindowClass cls, int data, bool gui_scope)
Mark window data of all windows of a given class as invalid (in need of re-computing) Note that by de...
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x=0, int y=0, const GRFFile *textref_stack_grffile=NULL, uint textref_stack_size=0, const uint32 *textref_stack=NULL)
Display an error message in a window.
Bottom offset of the text of the frame.
Header of Action 04 "universal holder" structure and functions.
void SetDParamStr(uint n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Functions related to low-level strings.
Types related to cheating.
virtual void OnInit()
Notification that the nested widget tree gets initialized.
StringID header
Header text (for CFT_HEADER).
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
Update size and resize step of a widget in the window.
Functions related to errors.
Offset at bottom of a matrix cell.
bool IsRawIndustry() const
Is an industry with the spec a raw industry?
uint Length() const
Get the number of items in the list.
This window is used for construction; close it whenever changing company.
static int CDECL IndustryProductionSorter(const Industry *const *a, const Industry *const *b)
Sort industries by production and name.
Fill rectangle with a single colour.
SoundSettings sound
sound effect settings
virtual void OnTimeout()
Called when this window's timeout has been reached.
Listing GetListing() const
Export current sort conditions.
static const NWidgetPart _nested_industry_cargoes_widgets[]
Widgets of the industry cargoes window.
void MakeCargoLabel(int column, bool accepting)
Construct a CFT_CARGO_LABEL field.
StringID GetErrorMessage() const
Returns the error message of a command.
Small map; Window numbers:
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
void CcBuildIndustry(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2)
Command callback.
Simple vector template class, with automatic delete.
CargoSuffixDisplay display
How to display the cargo and text.
ClientSettings _settings_client
The current settings for this game.
virtual void OnResize()
Called after the window got resized.
bool Succeeded() const
Did this command succeed?
const IndustrySpec * GetIndustrySpec(IndustryType thistype)
Accessor for array _industry_specs.
Data about a single field in the IndustryCargoesWindow panel.
Definition of base types and functions in a cross-platform compatible way.
TileIndex GetCenterTile() const
Get the center tile.
char text[512]
Cargo suffix text.
bool UsesSmoothEconomy() const
Determines whether this industrytype uses smooth economy or whether it uses standard/newgrf productio...
static int CDECL IndustryNameSorter(const Industry *const *a, const Industry *const *b)
Sort industries by name.
A number of safeguards to prevent using unsafe methods.
CargoesFieldType
Available types of field.
bool value
tells if the bool cheat is active or not
static void DrawHorConnection(int left, int right, int top, const CargoSpec *csp)
Draw a horizontal cargo connection.
IndustryType type
type of industry.
rectangle (stations, depots, ...)
static const int VERT_TEXT_PADDING
Vertical padding around the industry type text.
static uint CeilDiv(uint a, uint b)
Computes ceil(a / b) for non-negative a and b.
Default zoom level for the industry view.
Fields fields
Fields to display in the WID_IC_PANEL.
Cheat setup_prod
setup raw-material production in game
void MakeCargoLabel(const CargoID *cargoes, uint length, bool left_align)
Make a field displaying cargo type names.
TileArea location
Location of the industry.
additional text in industry window
static const int BLOB_DISTANCE
Distance of the industry legend colour from the edge of the industry box.
uint16 last_month_production[INDUSTRY_NUM_OUTPUTS]
total units produced per cargo in the last full month
void Draw(int xpos, int ypos) const
Draw the field.
static const int HOR_CARGO_WIDTH
Width of a vertical cargo column (inclusive the border line).
static const int VERT_INTER_INDUSTRY_SPACE
Amount of space between two industries in a column.
CargoID produced_cargo[INDUSTRY_NUM_OUTPUTS]
16 production cargo slots
Offset at left of a matrix cell.
static const NWidgetPart _nested_industry_view_widgets[]
Widget definition of the view industry gui.
static WindowDesc _build_industry_desc(WDP_AUTO, "build_industry", 170, 212, WC_BUILD_INDUSTRY, WC_NONE, WDF_CONSTRUCTION, _nested_build_industry_widgets, lengthof(_nested_build_industry_widgets))
Window definition of the dynamic place industries gui.
byte bottom_end
Stop at the bottom of the vertical cargoes.
Defines the data structure for constructing industry.
InfoLine clicked_line
The line of the button that has been clicked.
virtual void OnTimeout()
Called when this window's timeout has been reached.
static WindowDesc _industry_directory_desc(WDP_AUTO, "list_industries", 428, 190, WC_INDUSTRY_DIRECTORY, WC_NONE, 0, _nested_industry_directory_widgets, lengthof(_nested_industry_directory_widgets))
Window definition of the industry directory gui.
The tile has no ownership.
CargoesFieldType type
Type of field.
Offset at bottom to draw the frame rectangular area.
std::string MakeCargoListString(const CargoID *cargolist, const CargoSuffix *cargo_suffix, int cargolistlen, StringID prefixstr) const
Build a string of cargo names with suffixes attached.
Money GetConstructionCost() const
Get the cost for constructing this industry.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
additional text in fund window
Basic functions/variables used all over the place.
static bool HasCommonValidCargo(const CargoID *cargoes1, uint length1, const CargoID *cargoes2, uint length2)
Do the two sets of cargoes have a valid cargo in common?
CargoID accepts_cargo[INDUSTRY_NUM_INPUTS]
16 input cargo slots
Empty small field (for the header).
Right offset of the text of the frame.
bool DoCommandP(const CommandContainer *container, bool my_cmd)
Shortcut for the long DoCommandP when having a container with the data.
Industry view; Window numbers:
uint8 cargo_map[NUM_CARGO]
Inverse cargo translation table (CargoID -> local ID)
uint16 incoming_cargo_waiting[INDUSTRY_NUM_INPUTS]
incoming cargo waiting to be processed
static const int CARGO_STUB_WIDTH
Width of a cargo not carried in the column (should be less than HOR_CARGO_BORDER_SPACE).
#define lengthof(x)
Return the length of an fixed size array.
IndustryBehaviour behaviour
How this industry will behave, and how others entities can use it.
byte prod_level
general production level
GRFFileProps grf_prop
properties related to the grf file
static int CDECL IndustryTypeSorter(const Industry *const *a, const Industry *const *b)
Sort industries by type and name.
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var)
Loop header for iterating over 'real' cargoes, sorted by name.
Dimension cargo_textsize
Size to hold any cargo text, as well as STR_INDUSTRY_CARGOES_SELECT_CARGO.
Top offset of the text of the frame.
Left offset of the text of the frame.
Types related to the drop down widget.
bool ScrollWindowToTile(TileIndex tile, Window *w, bool instant)
Scrolls the viewport in a window to a given location.
Functions related to sound.
void DrawArrowButtons(int x, int y, Colours button_colour, byte state, bool clickable_left, bool clickable_right)
Draw [<][>] boxes.
void SetSortType(uint8 n_type)
Set the sorttype of the list.
bool Sort(SortFunction *compare)
Sort the list.
void StartTextRefStackUsage(const GRFFile *grffile, byte numEntries, const uint32 *values)
Start using the TTDP compatible string code parsing.
The game does not build industries.
static int SortButtonWidth()
Get width of up/down arrow of sort button state.
bool CalculatePositionInWidget(Point pt, Point *fieldxy, Point *xy)
Calculate in which field was clicked, and within the field, at what position.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
IndustryType selected_type
industry corresponding to the above index
static const uint8 PC_BLACK
Black palette colour.
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
Update size and resize step of a widget in the window.
#define SETTING_BUTTON_WIDTH
Width of setting buttons.
12 1000 can appear in temperate climate
virtual void OnDropdownSelect(int widget, int index)
A dropdown option associated to this window has been selected.
IndustryType ind_type
Industry type (NUM_INDUSTRYTYPES means 'houses').
static const int HOR_CARGO_SPACE
Amount of horizontal space between two vertical cargoes.
Display then cargo, amount, and string (cb37 result 000-3FF).
int GetCargoBase(int xpos) const
For a CFT_CARGO, compute the left position of the left-most vertical cargo connection.
static int normal_height
Height of the non-header rows.
Build industry; Window numbers:
void ShowExtraViewPortWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
Allow changing the production multiplier.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
bool timer_enabled
timer can be used
TileIndex tile
The base tile of the area.
14 4000 can appear in subtropical climate
void ForceResort()
Force a resort next Sort call Reset the resort timer if used too.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
No window, redirects to WC_MAIN_WINDOW.
std::bitset< NUM_INDUSTRYTYPES > _displayed_industries
Communication from the industry chain window to the smallmap window about what industries to display...
13 2000 can appear in sub-arctic climate below the snow line
void ConnectIndustryProduced(int column)
Connect industry production cargoes to the cargo column after it.
virtual void OnPlaceObject(Point pt, TileIndex tile)
The user clicked some place on the map when a tile highlight mode has been set.
byte num_table
Number of elements in the table.
static bool HousesCanAccept(const CargoID *cargoes, uint length)
Can houses be used as customers of the produced cargoes?
static const uint8 PC_YELLOW
Yellow palette colour.
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
Functions related to companies.
static WindowDesc _industry_cargoes_desc(WDP_AUTO, "industry_cargoes", 300, 210, WC_INDUSTRY_CARGOES, WC_NONE, 0, _nested_industry_cargoes_widgets, lengthof(_nested_industry_cargoes_widgets))
Window description for the industry cargoes window.
bool IsNewGRFInspectable(GrfSpecFeature feature, uint index)
Can we inspect the data given a certain feature and index.
void ErrorUnknownCallbackResult(uint32 grfid, uint16 cbid, uint16 cb_res)
Record that a NewGRF returned an unknown/invalid callback result.
bool _generating_world
Whether we are generating the map or not.
15 8000 can appear in toyland climate
Both numeric and alphabetic and spaces and stuff.
static const IndustryType INVALID_INDUSTRYTYPE
one above amount is considered invalid
GUISettings gui
settings related to the GUI
int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front)
Compares two strings using case insensitive natural sort.
Display cargo connections.
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
virtual void ShowNewGRFInspectWindow() const
Show the NewGRF inspection window.
static CargoSpec * Get(size_t index)
Retrieve cargo details for the given cargo ID.
static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, CargoSuffix &suffix)
Gets the string to display after the cargo name (using callback 37)
CompanyByte _current_company
Company currently doing an action.
byte clicked_button
The button that has been clicked (to raise)
Editability
Modes for changing production.
void ShowNewGRFInspectWindow(GrfSpecFeature feature, uint index, const uint32 grfid=0)
Show the inspect window for a given feature and index.
uint32 TileIndex
The index/ID of a Tile.
bool HandlePlacePushButton(Window *w, int widget, CursorID cursor, HighLightStyle mode)
This code is shared for the majority of the pushbuttons.
#define cpp_lengthof(base, variable)
Gets the length of an array variable within a class.
static int GetCargoTransportedSortValue(const Industry *i)
Returns value representing industry's transported cargo percentage for industry sorting.
static uint ToPercent8(uint i)
Converts a "fract" value 0..255 to "percent" value 0..100.
Production rate of cargo 1.
static size_t GetNumItems()
Returns number of valid items in the pool.
uint ind_cargo
If less than NUM_INDUSTRYTYPES, an industry type, else a cargo id + NUM_INDUSTRYTYPES.
CargoesField columns[5]
One row of fields.
void RecomputeProductionMultipliers()
Recompute production_rate for current prod_level.
TextDirection _current_text_dir
Text direction of the currently selected language.
void ToggleSortOrder()
Toggle the sort order Since that is the worst condition for the sort function reverse the list here...
A single row of CargoesField.
void ConnectIndustryAccepted(int column)
Connect industry accepted cargoes to the cargo column before it.
byte num_cargoes
Number of cargoes.
bool has_newindustries
Set if there are any newindustries loaded.
static const IndustryType NUM_INDUSTRYTYPES
total number of industry types, new and old; limited to 240 because we need some special ids like INV...
static uint TileY(TileIndex tile)
Get the Y component of a tile.
Display then cargo and supplied string (cb37 result 800-BFF).
int CDECL SortFunction(const T *, const T *)
Signature of sort function.
Allow produced/accepted cargoes callbacks to supply more than 2 and 3 types.
Functions for setting GUIs.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
virtual void OnResize()
Called after the window got resized.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
static const byte INVALID_CARGO
Constant representing invalid cargo.
static Industry * PlaceIndustry(IndustryType type, IndustryAvailabilityCallType creation_type, bool try_hard)
Try to place the industry in the game.
#define endof(x)
Get the end element of an fixed size array.
Window displaying the cargo connections around an industry (or cargo).
call production callback when cargo arrives at the industry
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Functions related to the drop down widget.
virtual void OnHundredthTick()
Called once every 100 (game) ticks.
Window * FindWindowByClass(WindowClass cls)
Find any window by its class.
CargoSuffixType
Cargo suffix type (for which window is it requested)
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
Scrolls the viewport of the main window to a given location.
Functions related to commands.
virtual void OnQueryTextFinished(char *str)
The query window opened from this window has closed.
Coordinates of a point in 2D.
byte top_end
Stop at the top of the vertical cargoes.
CargoID Index() const
Determines index of this cargospec.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-NULL) Titem.
Data structure describing how to show the list (what sort direction and criteria).
static const int BLOB_WIDTH
Width of the industry legend colour, including border.
static int CDECL IndustryTransportedCargoSorter(const Industry *const *a, const Industry *const *b)
Sort industries by transported cargo and name.
virtual bool IsNewGRFInspectable() const
Is the data related to this window NewGRF inspectable?
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
Update size and resize step of a widget in the window.
Window does not do autoscroll,.
ConstructionSettings construction
construction of things in-game
static int CDECL IndustryTypeNameSorter(const IndustryType *a, const IndustryType *b)
Sort industry types by their name.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
virtual void OnPaint()
The window must be repainted.
Called to determine text to display after cargo name.
virtual void OnGameTick()
Called once per (game) tick.
bool left_align
Align all cargo texts to the left (else align to the right).
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
bool HasConnection()
Does this CFT_CARGO field have a horizontal connection?
Offset at right to draw the frame rectangular area.
const struct GRFFile * grffile
grf file that introduced this entity
Used for DoCommand-like (and some non-fatal AI GUI) errors/information.
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
bool IsValid() const
Tests for validity of this cargospec.
CargoesFieldType type
Type of field.
CargoID CargoClickedAt(const CargoesField *left, const CargoesField *right, Point pt) const
Decide which cargo was clicked at in a CFT_CARGO field.
void Restore()
Restore the variable.
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
static void GetAllCargoSuffixes(CargoSuffixInOut use_input, CargoSuffixType cst, const Industry *ind, IndustryType ind_type, const IndustrySpec *indspec, const TC &cargoes, TS &suffixes)
Gets all strings to display after the cargoes of industries (using callback 37)
bool IsDescSortOrder() const
Check if the sort order is descending.
#define CMD_MSG(x)
Used to combine a StringID with the command.
int32 WindowNumber
Number to differentiate different windows of the same class.
GameCreationSettings game_creation
settings used during the creation of a game (map)
void ResetObjectToPlace()
Reset the cursor and mouse mode handling back to default (normal cursor, only clicking in windows)...
Specification of a rectangle with absolute coordinates of all edges.
byte CargoID
Cargo slots to indicate a cargo type within a game.
InfoLine editbox_line
The line clicked to open the edit box.
Text is written right-to-left by default.
Right align the text (must be a single bit).
Called to determine more text in the industry window.
Functions related to tile highlights.
Window functions not directly related to making/drawing windows.
int ConnectCargo(CargoID cargo, bool producer)
Connect a cargo from an industry to the CFT_CARGO column.
GRFLoadedFeatures _loaded_newgrf_features
Indicates which are the newgrf features currently loaded ingame.
Find a place automatically.
byte industry_density
The industry density.
void MakeCargo(const CargoID *cargoes, uint length, int count=-1, bool top_end=false, bool bottom_end=false)
Make a piece of cargo column.
byte last_month_pct_transported[INDUSTRY_NUM_OUTPUTS]
percentage transported per cargo in the last full month
virtual void OnResize()
Called after the window got resized.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
GUI functions that shouldn't be here.
CargoID CargoLabelClickedAt(Point pt) const
Decide what cargo the user clicked in the cargo label field.
void SetButtons()
Update status of the fund and display-chain widgets.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
call production callback every 256 ticks
struct CargoesField::@17::@18 industry
Industry data (for CFT_INDUSTRY).
static void QSortT(T *base, uint num, int(CDECL *comparator)(const T *, const T *), bool desc=false)
Type safe qsort()
virtual void OnInit()
Notification that the nested widget tree gets initialized.
int production_offset_y
The offset of the production texts/buttons.
Industry cargoes chain; Window numbers:
void ComputeIndustryDisplay(IndustryType it)
Compute what and where to display for industry type it.
static WindowDesc _industry_view_desc(WDP_AUTO, "view_industry", 260, 120, WC_INDUSTRY_VIEW, WC_NONE, 0, _nested_industry_view_widgets, lengthof(_nested_industry_view_widgets))
Window definition of the view industry gui.
Dimensions (a width and height) of a rectangle in 2D.
bool click_beep
Beep on a random selection of buttons.
Offset at left to draw the frame rectangular area.
virtual void SetStringParameters(int widget) const
Initialize string parameters for a widget.
Class for backupping variables and making sure they are restored later.
void ShortenCargoColumn(int column, int top, int bottom)
Shorten the cargo column to just the part between industries.
Window * BringWindowToFrontById(WindowClass cls, WindowNumber number)
Find a window and make it the relative top-window on the screen.
static const int HOR_TEXT_PADDING
Horizontal padding around the industry type text.
virtual void SetStringParameters(int widget) const
Initialize string parameters for a widget.
void InvalidateData(int data=0, bool gui_scope=true)
Mark this window's data as invalid (in need of re-computing)
struct CargoesField::@17::@20 cargo_label
Label data (for CFT_CARGO_LABEL).
void StopTextRefStackUsage()
Stop using the TTDP compatible string code parsing.
AutoDeleteSmallVector< const DropDownListItem *, 4 > DropDownList
A drop down list is a collection of drop down list items.
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
static const int VERT_CARGO_EDGE
Amount of vertical space between top/bottom and the top/bottom connected cargo at an industry...
static void MemSetT(T *ptr, byte value, size_t num=1)
Type-safe version of memset().
Cheats _cheats
All the cheats.
uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile)
Perform an industry callback.
int selected_index
index of the element in the matrix
11 800 can appear in sub-arctic climate above the snow line
static uint max_cargoes
Largest number of cargoes actually on any industry.
static const NWidgetPart _nested_industry_directory_widgets[]
Widget definition of the industry directory gui.
Production rate of cargo 2.
uint8 SortType() const
Get the sorttype of the list.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.
uint16 callback_timer
timer counter for callback eventual verification