29 #include "table/strings.h" 36 static CompanyMask _legend_excluded_companies;
37 static CargoTypes _legend_excluded_cargo;
41 static const uint INVALID_DATAPOINT_POS = UINT_MAX;
70 DrawCompanyIcon(cid, rtl ? r.right - d.width - 2 : r.left + 2, r.top + (r.bottom - r.top - d.height) / 2);
98 if (!gui_scope)
return;
101 SetBit(_legend_excluded_companies, data);
121 panel->
SetDataTip(0x0, STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP);
128 static const NWidgetPart _nested_graph_legend_widgets[] = {
149 _nested_graph_legend_widgets,
lengthof(_nested_graph_legend_widgets)
152 static void ShowGraphLegend()
154 AllocateWindowDescFront<GraphLegendWindow>(&_graph_legend_desc, 0);
169 static const int GRAPH_MAX_DATASETS = 64;
170 static const int GRAPH_AXIS_LINE_COLOUR =
PC_BLACK;
171 static const int GRAPH_NUM_MONTHS = 24;
173 static const int MIN_GRAPH_NUM_LINES_Y = 9;
174 static const int MIN_GRID_PIXEL_SIZE = 20;
189 uint16 x_values_start;
190 uint16 x_values_increment;
194 byte colours[GRAPH_MAX_DATASETS];
205 assert(num_hori_lines > 0);
208 current_interval.
highest = INT64_MIN;
209 current_interval.
lowest = INT64_MAX;
211 for (
int i = 0; i < this->num_dataset; i++) {
212 if (
HasBit(this->excluded_data, i))
continue;
213 for (
int j = 0; j < this->num_on_x_axis; j++) {
216 if (datapoint != INVALID_DATAPOINT) {
225 current_interval.
lowest = (11 * current_interval.
lowest) / 10;
228 double abs_lower = (current_interval.
lowest > 0) ? 0 : (
double)
abs(current_interval.
lowest);
229 double abs_higher = (current_interval.
highest < 0) ? 0 : (
double)current_interval.
highest;
234 if (abs_lower != 0 || abs_higher != 0) {
236 num_pos_grids = (int)floor(0.5 + num_hori_lines * abs_higher / (abs_higher + abs_lower));
239 if (num_pos_grids == 0 && abs_higher != 0) num_pos_grids++;
240 if (num_pos_grids == num_hori_lines && abs_lower != 0) num_pos_grids--;
243 int64 grid_size_higher = (abs_higher > 0) ? ((int64)abs_higher + num_pos_grids - 1) / num_pos_grids : 0;
244 int64 grid_size_lower = (abs_lower > 0) ? ((int64)abs_lower + num_hori_lines - num_pos_grids - 1) / (num_hori_lines - num_pos_grids) : 0;
245 grid_size =
max(grid_size_higher, grid_size_lower);
248 num_pos_grids = num_hori_lines / 2;
252 current_interval.
highest = num_pos_grids * grid_size;
253 current_interval.
lowest = -(num_hori_lines - num_pos_grids) * grid_size;
254 return current_interval;
265 int64 y_label = current_interval.
highest;
266 int64 y_label_separation = (current_interval.
highest - current_interval.
lowest) / num_hori_lines;
270 for (
int i = 0; i < (num_hori_lines + 1); i++) {
274 if (d.width > max_width) max_width = d.width;
276 y_label -= y_label_separation;
295 assert(this->num_vert_lines > 0);
307 int num_hori_lines = 160 / MIN_GRID_PIXEL_SIZE;
309 int resize = (r.bottom - r.top - 160) / (2 * MIN_GRID_PIXEL_SIZE);
310 if (resize > 0) num_hori_lines +=
resize;
312 interval = GetValuesInterval(num_hori_lines);
314 int label_width = GetYLabelWidth(interval, num_hori_lines);
316 r.left += label_width;
318 int x_sep = (r.right - r.left) / this->num_vert_lines;
319 int y_sep = (r.bottom - r.top) / num_hori_lines;
323 r.right = r.left + x_sep * this->num_vert_lines;
324 r.bottom = r.top + y_sep * num_hori_lines;
328 x_axis_offset = (int)((r.bottom - r.top) * (double)interval.
highest / (
double)interval_size);
335 for (
int i = 0; i < this->num_vert_lines; i++) {
343 for (
int i = 0; i < (num_hori_lines + 1); i++) {
344 GfxFillRect(r.left - 3, y, r.left - 1, y, GRAPH_AXIS_LINE_COLOUR);
350 GfxFillRect(r.left, r.top, r.left, r.bottom, GRAPH_AXIS_LINE_COLOUR);
353 y = x_axis_offset + r.top;
354 GfxFillRect(r.left, y, r.right, y, GRAPH_AXIS_LINE_COLOUR);
357 if (this->num_on_x_axis == 0)
return;
359 assert(this->num_on_x_axis > 0);
360 assert(this->num_dataset > 0);
363 int64 y_label = interval.
highest;
364 int64 y_label_separation =
abs(interval.
highest - interval.
lowest) / num_hori_lines;
368 for (
int i = 0; i < (num_hori_lines + 1); i++) {
371 DrawString(r.left - label_width - 4, r.left - 4, y, STR_GRAPH_Y_LABEL, graph_axis_label_colour,
SA_RIGHT);
373 y_label -= y_label_separation;
378 if (this->month != 0xFF) {
381 byte month = this->month;
382 Year year = this->year;
383 for (
int i = 0; i < this->num_on_x_axis; i++) {
384 SetDParam(0, month + STR_MONTH_ABBREV_JAN);
385 SetDParam(1, month + STR_MONTH_ABBREV_JAN + 2);
387 DrawStringMultiLine(x, x + x_sep, y, this->
height, month == 0 ? STR_GRAPH_X_LABEL_MONTH_YEAR : STR_GRAPH_X_LABEL_MONTH, graph_axis_label_colour);
400 uint16 label = this->x_values_start;
402 for (
int i = 0; i < this->num_on_x_axis; i++) {
406 label += this->x_values_increment;
413 uint pointoffs1 = (linewidth + 1) / 2;
414 uint pointoffs2 = linewidth + 1 - pointoffs1;
415 for (
int i = 0; i < this->num_dataset; i++) {
416 if (!
HasBit(this->excluded_data, i)) {
418 x = r.left + (x_sep / 2);
420 byte colour = this->colours[i];
421 uint prev_x = INVALID_DATAPOINT_POS;
422 uint prev_y = INVALID_DATAPOINT_POS;
424 for (
int j = 0; j < this->num_on_x_axis; j++) {
427 if (datapoint != INVALID_DATAPOINT) {
440 int reduce_range =
max(mult_range - 31, 0);
444 datapoint = -(
abs(datapoint) >> reduce_range);
446 datapoint >>= reduce_range;
448 y = r.top + x_axis_offset - ((r.bottom - r.top) * datapoint) / (interval_size >> reduce_range);
451 GfxFillRect(x - pointoffs1, y - pointoffs1, x + pointoffs2, y + pointoffs2, colour);
454 if (prev_x != INVALID_DATAPOINT_POS) GfxDrawLine(prev_x, prev_y, x, y, colour, linewidth);
459 prev_x = INVALID_DATAPOINT_POS;
460 prev_y = INVALID_DATAPOINT_POS;
472 format_str_y_axis(format_str_y_axis)
475 this->num_vert_lines = 24;
476 this->graph_widget = widget;
482 this->UpdateStatistics(
true);
490 if (widget != this->graph_widget)
return;
492 uint x_label_width = 0;
494 if (this->month != 0xFF) {
495 byte month = this->month;
496 Year year = this->year;
497 for (
int i = 0; i < this->num_on_x_axis; i++) {
498 SetDParam(0, month + STR_MONTH_ABBREV_JAN);
499 SetDParam(1, month + STR_MONTH_ABBREV_JAN + 2);
519 size->width = max<uint>(size->width, 5 + y_label_width + this->num_on_x_axis * (x_label_width + 5) + 9);
520 size->height = max<uint>(size->height, 5 + (1 + MIN_GRAPH_NUM_LINES_Y * 2 + (this->month != 0xFF ? 3 : 1)) *
FONT_HEIGHT_SMALL + 4);
521 size->height = max<uint>(size->height, size->width / 3);
526 if (widget != this->graph_widget)
return;
533 return INVALID_DATAPOINT;
544 this->UpdateStatistics(
false);
554 if (!gui_scope)
return;
555 this->UpdateStatistics(
true);
564 CompanyMask excluded_companies = _legend_excluded_companies;
573 FOR_ALL_COMPANIES(c) {
584 if (!initialize && this->excluded_data == excluded_companies && this->num_on_x_axis == nums &&
585 this->year == yr && this->month == mo) {
590 this->excluded_data = excluded_companies;
591 this->num_on_x_axis = nums;
600 for (
int j = this->num_on_x_axis, i = 0; --j >= 0;) {
601 this->cost[numd][i] = (j >= c->
num_valid_stat_ent) ? INVALID_DATAPOINT : GetGraphData(c, j);
608 this->num_dataset = numd;
621 this->InitializeWindow(window_number);
630 static const NWidgetPart _nested_operating_profit_widgets[] = {
651 WDP_AUTO,
"graph_operating_profit", 0, 0,
654 _nested_operating_profit_widgets,
lengthof(_nested_operating_profit_widgets)
658 void ShowOperatingProfitGraph()
660 AllocateWindowDescFront<OperatingProfitGraphWindow>(&_operating_profit_desc, 0);
672 this->InitializeWindow(window_number);
681 static const NWidgetPart _nested_income_graph_widgets[] = {
705 _nested_income_graph_widgets,
lengthof(_nested_income_graph_widgets)
708 void ShowIncomeGraph()
710 AllocateWindowDescFront<IncomeGraphWindow>(&_income_graph_desc, 0);
721 this->InitializeWindow(window_number);
730 static const NWidgetPart _nested_delivered_cargo_graph_widgets[] = {
750 static WindowDesc _delivered_cargo_graph_desc(
751 WDP_AUTO,
"graph_delivered_cargo", 0, 0,
754 _nested_delivered_cargo_graph_widgets,
lengthof(_nested_delivered_cargo_graph_widgets)
757 void ShowDeliveredCargoGraph()
759 AllocateWindowDescFront<DeliveredCargoGraphWindow>(&_delivered_cargo_graph_desc, 0);
770 this->InitializeWindow(window_number);
785 static const NWidgetPart _nested_performance_history_widgets[] = {
807 WDP_AUTO,
"graph_performance", 0, 0,
810 _nested_performance_history_widgets,
lengthof(_nested_performance_history_widgets)
813 void ShowPerformanceHistoryGraph()
815 AllocateWindowDescFront<PerformanceHistoryGraphWindow>(&_performance_history_desc, 0);
826 this->InitializeWindow(window_number);
835 static const NWidgetPart _nested_company_value_graph_widgets[] = {
856 WDP_AUTO,
"graph_company_value", 0, 0,
859 _nested_company_value_graph_widgets,
lengthof(_nested_company_value_graph_widgets)
862 void ShowCompanyValueGraph()
864 AllocateWindowDescFront<CompanyValueGraphWindow>(&_company_value_graph_desc, 0);
878 this->num_on_x_axis = 20;
879 this->num_vert_lines = 20;
881 this->x_values_start = 10;
882 this->x_values_increment = 10;
894 void UpdateExcludedData()
896 this->excluded_data = 0;
923 this->line_height = size->height;
924 size->height = this->line_height * 11;
926 resize->height = this->line_height;
946 if (pos-- > 0)
continue;
947 if (--max < 0)
break;
949 bool lowered = !
HasBit(_legend_excluded_cargo, cs->
Index());
952 if (lowered)
DrawFrameRect(r.left, y, r.right, y + this->line_height - 1, COLOUR_ORANGE, lowered ?
FR_LOWERED : FR_NONE);
954 byte clk_dif = lowered ? 1 : 0;
958 GfxFillRect(rect_x + 1, y + 1 + clk_dif, rect_x + 7, y + 4 + clk_dif, cs->legend_colour);
960 DrawString(rtl ? r.left : x + 14 + clk_dif, (rtl ? r.right - 14 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO);
962 y += this->line_height;
971 _legend_excluded_cargo = 0;
972 this->excluded_data = 0;
982 SetBit(this->excluded_data, i);
991 if (row >= this->vscroll->
GetCount())
return;
995 if (row-- > 0)
continue;
998 this->UpdateExcludedData();
1024 if (!gui_scope)
return;
1030 this->UpdateExcludedData();
1035 this->colours[i] = cs->legend_colour;
1036 for (uint j = 0; j != 20; j++) {
1037 this->cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 4 + 4, cs->
Index());
1041 this->num_dataset = i;
1045 static const NWidgetPart _nested_cargo_payment_rates_widgets[] = {
1056 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CPR_HEADER),
SetMinimalSize(0, 6),
SetPadding(2, 0, 2, 0),
SetDataTip(STR_GRAPH_CARGO_PAYMENT_RATES_TITLE, STR_NULL),
1076 NWidget(
WWT_TEXT, COLOUR_GREY,
WID_CPR_FOOTER),
SetMinimalSize(0, 6),
SetPadding(2, 0, 2, 0),
SetDataTip(STR_GRAPH_CARGO_PAYMENT_RATES_X_LABEL, STR_NULL),
1084 WDP_AUTO,
"graph_cargo_payment_rates", 0, 0,
1087 _nested_cargo_payment_rates_widgets,
lengthof(_nested_cargo_payment_rates_widgets)
1091 void ShowCargoPaymentRates()
1093 AllocateWindowDescFront<PaymentRatesGraphWindow>(&_cargo_payment_rates_desc, 0);
1100 static const StringID _performance_titles[] = {
1101 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
1102 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
1103 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
1104 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
1105 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
1106 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
1107 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
1108 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
1109 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
1110 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
1111 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
1112 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
1113 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
1114 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
1115 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT,
1116 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON,
1119 static inline StringID GetPerformanceTitleFromValue(uint value)
1121 return _performance_titles[
minu(value, 1000) >> 6];
1139 this->companies.
Clear();
1142 FOR_ALL_COMPANIES(c) {
1143 *this->companies.
Append() = c;
1153 return (*c2)->old_economy[0].performance_history - (*c1)->old_economy[0].performance_history;
1166 this->BuildCompanyList();
1167 this->companies.
Sort(&PerformanceSorter);
1186 for (uint i = 0; i != this->companies.
Length(); i++) {
1187 const Company *c = this->companies[i];
1188 DrawString(ordinal_left, ordinal_right, y, i + STR_ORDINAL_NUMBER_1ST, i == 0 ? TC_WHITE : TC_YELLOW);
1195 DrawString(text_left, text_right, y, STR_COMPANY_LEAGUE_COMPANY_NAME);
1196 y += this->line_height;
1204 this->ordinal_width = 0;
1208 this->ordinal_width += 5;
1210 uint widest_width = 0;
1211 uint widest_title = 0;
1212 for (uint i = 0; i <
lengthof(_performance_titles); i++) {
1214 if (width > widest_width) {
1216 widest_width =
width;
1221 this->icon_width = d.width + 2;
1225 FOR_ALL_COMPANIES(c) {
1228 SetDParam(2, _performance_titles[widest_title]);
1232 this->text_width = widest_width + 30;
1262 static const NWidgetPart _nested_company_league_widgets[] = {
1276 _nested_company_league_widgets,
lengthof(_nested_company_league_widgets)
1279 void ShowCompanyLeagueTable()
1281 AllocateWindowDescFront<CompanyLeagueWindow>(&_company_league_desc, 0);
1294 this->UpdateCompanyStats();
1300 void UpdateCompanyStats()
1305 FOR_ALL_COMPANIES(c) {
1312 uint score_info_left;
1313 uint score_info_right;
1318 uint score_detail_left;
1319 uint score_detail_right;
1328 uint score_info_width = 0;
1329 for (uint i = SCORE_BEGIN; i <
SCORE_END; i++) {
1344 int max = -(999999999 - 500);
1357 if (_currency->rate < 1000) max /= _currency->rate;
1362 size->width = 7 + score_info_width + 5 + this->bar_width + 5 + score_detail_width + 7;
1364 uint right = size->width - 7;
1367 this->score_info_left = rtl ? right - score_info_width :
left;
1368 this->score_info_right = rtl ? right : left + score_info_width;
1370 this->score_detail_left = rtl ?
left : right - score_detail_width;
1371 this->score_detail_right = rtl ? left + score_detail_width : right;
1373 this->bar_left = left + (rtl ? score_detail_width : score_info_width) + 5;
1374 this->bar_right = this->bar_left + this->bar_width;
1387 int offset = (cid == this->company) ? 1 : 0;
1389 DrawCompanyIcon(cid, (r.left + r.right - sprite_size.width) / 2 + offset, (r.top + r.bottom - sprite_size.height) / 2 + offset);
1402 int64 val = _score_part[company][score_type];
1413 uint text_top = bar_top + 2;
1415 DrawString(this->score_info_left, this->score_info_right, text_top, STR_PERFORMANCE_DETAIL_VEHICLES + score_type);
1419 DrawString(this->score_info_left, this->score_info_right, text_top, STR_BLACK_COMMA, TC_FROMSTRING,
SA_RIGHT);
1422 uint x = Clamp<int64>(val, 0, needed) * this->bar_width / needed;
1425 x = this->bar_right - x;
1427 x = this->bar_left + x;
1431 if (x != this->bar_left)
GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height, rtl ? colour_notdone : colour_done);
1432 if (x != this->bar_right)
GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height, rtl ? colour_done : colour_notdone);
1435 SetDParam(0, Clamp<int64>(val, 0, needed) * 100 / needed);
1436 DrawString(this->bar_left, this->bar_right, text_top, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING,
SA_HOR_CENTER);
1439 if (score_type == SCORE_LOAN) val = needed - val;
1445 switch (score_type) {
1446 case SCORE_MIN_PROFIT:
1447 case SCORE_MIN_INCOME:
1448 case SCORE_MAX_INCOME:
1451 DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY);
1454 DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_INT);
1475 if (--this->timeout == 0) {
1476 this->UpdateCompanyStats();
1488 if (!gui_scope)
return;
1503 FOR_ALL_COMPANIES(c) {
1504 this->company = c->
index;
1524 const StringID performance_tips[] = {
1525 STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP,
1526 STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP,
1527 STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP,
1528 STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP,
1529 STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP,
1530 STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP,
1531 STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP,
1532 STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP,
1533 STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP,
1534 STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP,
1556 static const NWidgetPart _nested_performance_rating_detail_widgets[] = {
1569 static WindowDesc _performance_rating_detail_desc(
1573 _nested_performance_rating_detail_widgets,
lengthof(_nested_performance_rating_detail_widgets)
1576 void ShowPerformanceRatingDetail()
1578 AllocateWindowDescFront<PerformanceRatingDetailWindow>(&_performance_rating_detail_desc, 0);
1581 void InitializeGraphGui()
1583 _legend_excluded_companies = 0;
1584 _legend_excluded_cargo = 0;
Functions related to OTTD's strings.
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
virtual void OnGameTick()
Called once per (game) tick.
Base types for having sorted lists in GUIs.
List template of 'things' T to sort in a GUI.
void RebuildDone()
Notify the sortlist that the rebuild is done.
Definition of stuff that is very close to a company, like the company struct itself.
static Titem * GetIfValid(size_t index)
Returns Titem with given index.
const ScoreInfo _score_info[]
Score info, values used for computing the detailed performance rating.
static uint minu(const uint a, const uint b)
Returns the minimum of two unsigned integers.
Horizontally center the text.
ResizeInfo resize
Resize information.
OverflowSafeInt64 lowest
Lowest value of this interval. Must be zero or less.
Window(WindowDesc *desc)
Empty constructor, initialization has been moved to InitNested() called from the constructor of the d...
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...
virtual void OnResize()
Called after the window got resized.
void SetWidgetDisabledState(byte widget_index, bool disab_stat)
Sets the enabled/disabled status of a widget.
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
High level window description.
int left
x position of left edge of the window
void DrawWidgets() const
Paint all widgets of a window.
int32 performance_history
Company score (scale 0-1000)
Functions related to dates.
static bool IsInsideMM(const T x, const uint min, const uint max)
Checks if a value is in an interval.
static T ToggleBit(T &x, const uint8 y)
Toggles a bit in a variable.
Functions to handle different currencies.
int GetCharacterHeight(FontSize size)
Get height of a character for a given font size.
virtual void OnHundredthTick()
Called once every 100 (game) ticks.
Offset at top to draw the frame rectangular area.
static T SetBit(T &x, const uint8 y)
Set a bit in a variable.
static int CDECL PerformanceSorter(const Company *const *c1, const Company *const *c2)
Sort the company league by performance history.
byte _colour_gradient[COLOUR_END][8]
All 16 colour gradients 8 colours per gradient from darkest (0) to lightest (7)
Maximal number of cargo types in a game.
NWidgetBase * MakeCompanyButtonRowsGraphGUI(int *biggest_index)
Make a number of rows with buttons for each company for the performance rating detail window...
Specification of a cargo type.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
void DrawCompanyIcon(CompanyID c, int x, int y)
Draw the icon of a company.
virtual void OnGameTick()
Called once per (game) tick.
void Clear()
Remove all items from the list.
void ToggleWidgetLoweredState(byte widget_index)
Invert the lowered/raised status of a widget.
void Compact()
Compact the list down to the smallest block size boundary.
Tindex index
Index of this pool item.
This must always be the last entry.
static const int DAY_TICKS
1 day is 74 ticks; _date_fract used to be uint16 and incremented by 885.
uint64 excluded_data
bitmask of the datasets that shouldn't be displayed.
Offset at top of a matrix cell.
Payment rates graph; Window numbers:
Company value graph; Window numbers:
bool NeedResort()
Check if a resort is needed next loop If used the resort timer will decrease every call till 0...
uint text_width
The width of the actual text.
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
uint8 graph_line_thickness
the thickness of the lines in the various graph guis
int32 Year
Type for the year, note: 0 based, i.e. starts at the year 0.
static T max(const T a, const T b)
Returns the maximum of two values.
void RaiseWidget(byte widget_index)
Marks a widget as raised.
Year _cur_year
Current year, starting at 0.
void CreateNestedTree(bool fill_nested=true)
Perform the first part of the initialization of a nested widget tree.
static NWidgetBase * MakePerformanceDetailPanels(int *biggest_index)
Make a vertical list of panels for outputting score details.
StringID name
Name of this type of cargo.
bool NeedRebuild() const
Check if a rebuild is needed.
Functions, definitions and such used only by the GUI.
T * Append(uint to_add=1)
Append an item and return it.
virtual void OnPaint()
The window must be repainted.
void ForceRebuild()
Force that a rebuild is needed.
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.
Data structure for an opened window.
Income graph; Window numbers:
Money expenses
The amount of expenses.
void FinishInitNested(WindowNumber window_number=0)
Perform the second part of the initialization of a nested widget tree.
void InitNested(WindowNumber number=0)
Perform complete initialization of the Window with nested widgets, to allow use.
How many scores are there..
byte num_valid_stat_ent
Number of valid statistical entries in old_economy.
#define FONT_HEIGHT_SMALL
Height of characters in the small (FS_SMALL) font.
uint Length() const
Get the number of items in the list.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
void UpdateStatistics(bool initialize)
Update the statistics.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
Functions related to the gfx engine.
ClientSettings _settings_client
The current settings for this game.
Definition of base types and functions in a cross-platform compatible way.
A number of safeguards to prevent using unsafe methods.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
First company, same as owner.
ValuesInterval GetValuesInterval(int num_hori_lines) const
Get the interval that contains the graph's data.
int score
How much score it will give.
bool IsWidgetDisabled(byte widget_index) const
Gets the enabled/disabled status of a widget.
Operating profit graph; Window numbers:
Company league window; Window numbers:
const Scrollbar * GetScrollbar(uint widnum) const
Return the Scrollbar to a widget index.
GUI Functions related to companies.
void LowerWidget(byte widget_index)
Marks a widget as lowered.
uint icon_width
The width of the company icon.
OverflowSafeInt64 highest
Highest value of this interval. Must be zero or greater.
Offset at bottom to draw the frame rectangular area.
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.
#define lengthof(x)
Return the length of an fixed size array.
static T min(const T a, const T b)
Returns the minimum of two values.
void DrawGraph(Rect r) const
Actually draw the graph.
#define FOR_ALL_SORTED_STANDARD_CARGOSPECS(var)
Loop header for iterating over 'real' cargoes, sorted by name.
bool Sort(SortFunction *compare)
Sort the list.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
static const uint8 PC_BLACK
Black palette colour.
The max score that can be in the performance history.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
uint8 FindLastBit(uint64 x)
Search the last set bit in a 64 bit variable.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Maximum number of companies.
int line_height
Height of the text lines.
void SetDirty() const
Mark entire window as dirty (in need of re-paint)
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
Performance detail window; Window numbers:
Month _cur_month
Current month (0..11)
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.
Contains the interval of a graph's data.
uint8 _sorted_standard_cargo_specs_size
Number of standard cargo specifications stored at the _sorted_cargo_specs array.
GUISettings gui
settings related to the GUI
Scrollbar * vscroll
Cargo list scrollbar.
virtual void OnGameTick()
Called once per (game) tick.
If set the frame is lowered and the background colour brighter (ie. buttons when pressed) ...
uint ordinal_width
The width of the ordinal number.
TextDirection _current_text_dir
Text direction of the currently selected language.
byte colour
Company colour.
Functions related to the economy.
CargoArray delivered_cargo
The amount of delivered cargo.
void SetDParamMaxValue(uint n, uint64 max_value, uint min_count, FontSize size)
Set DParam n to some number that is suitable for string size computations.
int UpdateCompanyRatingAndValue(Company *c, bool update)
if update is set to true, the economy is updated with this score (also the house is updated...
static T abs(const T a)
Returns the absolute value of (scalar) variable.
CompanyEconomyEntry old_economy[MAX_HISTORY_QUARTERS]
Economic data of the company of the last MAX_HISTORY_QUARTERS quarters.
uint GetYLabelWidth(ValuesInterval current_interval, int num_hori_lines) const
Get width for Y labels.
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.
Types/functions related to cargoes.
Coordinates of a point in 2D.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
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.
Index of the small font in the font tables.
static NWidgetBase * MakeNWidgetCompanyLines(int *biggest_index)
Construct a vertical list of buttons, one for each company.
Delivered cargo graph; Window numbers:
ScoreID
Score categories in the detailed performance rating.
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
Width of a resize box widget.
Offset at right to draw the frame rectangular area.
uint line_height
Pixel height of each cargo type row.
int width
width of the window (number of pixels to the right in x direction)
static bool HasBit(const T x, const uint8 y)
Checks if a bit in a value is set.
int needed
How much you need to get the perfect score.
int32 WindowNumber
Number to differentiate different windows of the same class.
virtual void OnClick(Point pt, int widget, int click_count)
A click with the left mouse button has been made on the window.
Specification of a rectangle with absolute coordinates of all edges.
Money income
The amount of income.
Text is written right-to-left by default.
Right align the text (must be a single bit).
WindowNumber window_number
Window number within the window class.
Owner
Enum for all companies/owners.
Window functions not directly related to making/drawing windows.
Money company_value
The value of the company.
Find a place automatically.
void BuildCompanyList()
(Re)Build the company league list
virtual void OnHundredthTick()
Called once every 100 (game) ticks.
Legend for graphs; Window numbers:
Dimensions (a width and height) of a rectangle in 2D.
virtual void DrawWidget(const Rect &r, int widget) const
Draw the contents of a nested widget.
Offset at left to draw the frame rectangular area.
This file contains all sprite-related enums and defines.
virtual void OnInvalidateData(int data=0, bool gui_scope=true)
Some data on this window has become invalid.
const T GetSum() const
Get the sum of all cargo amounts.
Performance history graph; Window numbers:
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-...
int height
Height of the window (number of pixels down in y direction)
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.
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.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.