29 #include "table/strings.h" 36 static uint _legend_excluded_companies;
37 static uint _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 = 32;
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 uint 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);
876 this->first_init =
true;
877 this->num_on_x_axis = 20;
878 this->num_vert_lines = 20;
880 this->x_values_start = 10;
881 this->x_values_increment = 10;
888 this->UpdateLoweredWidgets();
895 if (!this->first_init) {
898 this->UpdateLoweredWidgets();
900 this->first_init =
false;
903 void UpdateExcludedData()
905 this->excluded_data = 0;
915 void UpdateLoweredWidgets()
959 GfxFillRect(rect_x + 1, y + 1 + clk_dif, rect_x + 7, y + 4 + clk_dif, cs->legend_colour);
961 DrawString(rtl ? r.left : x + 14 + clk_dif, (rtl ? r.right - 14 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO);
969 _legend_excluded_cargo = 0;
970 this->excluded_data = 0;
971 this->UpdateLoweredWidgets();
981 SetBit(this->excluded_data, i);
984 this->UpdateLoweredWidgets();
994 this->UpdateExcludedData();
1013 if (!gui_scope)
return;
1019 this->UpdateExcludedData();
1024 this->colours[i] = cs->legend_colour;
1025 for (uint j = 0; j != 20; j++) {
1026 this->cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 4 + 4, cs->
Index());
1030 this->num_dataset = i;
1041 leaf->
tool_tip = STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO;
1051 static const NWidgetPart _nested_cargo_payment_rates_widgets[] = {
1062 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),
1079 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),
1087 WDP_AUTO,
"graph_cargo_payment_rates", 0, 0,
1090 _nested_cargo_payment_rates_widgets,
lengthof(_nested_cargo_payment_rates_widgets)
1094 void ShowCargoPaymentRates()
1096 AllocateWindowDescFront<PaymentRatesGraphWindow>(&_cargo_payment_rates_desc, 0);
1103 static const StringID _performance_titles[] = {
1104 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
1105 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ENGINEER,
1106 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
1107 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRAFFIC_MANAGER,
1108 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
1109 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TRANSPORT_COORDINATOR,
1110 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
1111 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_ROUTE_SUPERVISOR,
1112 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
1113 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_DIRECTOR,
1114 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
1115 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHIEF_EXECUTIVE,
1116 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
1117 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_CHAIRMAN,
1118 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_PRESIDENT,
1119 STR_COMPANY_LEAGUE_PERFORMANCE_TITLE_TYCOON,
1122 static inline StringID GetPerformanceTitleFromValue(uint value)
1124 return _performance_titles[
minu(value, 1000) >> 6];
1142 this->companies.
Clear();
1145 FOR_ALL_COMPANIES(c) {
1146 *this->companies.
Append() = c;
1156 return (*c2)->old_economy[0].performance_history - (*c1)->old_economy[0].performance_history;
1169 this->BuildCompanyList();
1170 this->companies.
Sort(&PerformanceSorter);
1189 for (uint i = 0; i != this->companies.
Length(); i++) {
1190 const Company *c = this->companies[i];
1191 DrawString(ordinal_left, ordinal_right, y, i + STR_ORDINAL_NUMBER_1ST, i == 0 ? TC_WHITE : TC_YELLOW);
1198 DrawString(text_left, text_right, y, STR_COMPANY_LEAGUE_COMPANY_NAME);
1199 y += this->line_height;
1207 this->ordinal_width = 0;
1211 this->ordinal_width += 5;
1213 uint widest_width = 0;
1214 uint widest_title = 0;
1215 for (uint i = 0; i <
lengthof(_performance_titles); i++) {
1217 if (width > widest_width) {
1219 widest_width =
width;
1224 this->icon_width = d.width + 2;
1228 FOR_ALL_COMPANIES(c) {
1231 SetDParam(2, _performance_titles[widest_title]);
1235 this->text_width = widest_width + 30;
1265 static const NWidgetPart _nested_company_league_widgets[] = {
1279 _nested_company_league_widgets,
lengthof(_nested_company_league_widgets)
1282 void ShowCompanyLeagueTable()
1284 AllocateWindowDescFront<CompanyLeagueWindow>(&_company_league_desc, 0);
1297 this->UpdateCompanyStats();
1303 void UpdateCompanyStats()
1308 FOR_ALL_COMPANIES(c) {
1315 uint score_info_left;
1316 uint score_info_right;
1321 uint score_detail_left;
1322 uint score_detail_right;
1331 uint score_info_width = 0;
1332 for (uint i = SCORE_BEGIN; i <
SCORE_END; i++) {
1347 int max = -(999999999 - 500);
1360 if (_currency->rate < 1000) max /= _currency->rate;
1365 size->width = 7 + score_info_width + 5 + this->bar_width + 5 + score_detail_width + 7;
1367 uint right = size->width - 7;
1370 this->score_info_left = rtl ? right - score_info_width :
left;
1371 this->score_info_right = rtl ? right : left + score_info_width;
1373 this->score_detail_left = rtl ?
left : right - score_detail_width;
1374 this->score_detail_right = rtl ? left + score_detail_width : right;
1376 this->bar_left = left + (rtl ? score_detail_width : score_info_width) + 5;
1377 this->bar_right = this->bar_left + this->bar_width;
1390 int offset = (cid == this->company) ? 1 : 0;
1392 DrawCompanyIcon(cid, (r.left + r.right - sprite_size.width) / 2 + offset, (r.top + r.bottom - sprite_size.height) / 2 + offset);
1405 int val = _score_part[company][score_type];
1416 uint text_top = bar_top + 2;
1418 DrawString(this->score_info_left, this->score_info_right, text_top, STR_PERFORMANCE_DETAIL_VEHICLES + score_type);
1422 DrawString(this->score_info_left, this->score_info_right, text_top, STR_BLACK_COMMA, TC_FROMSTRING,
SA_RIGHT);
1425 uint x =
Clamp(val, 0, needed) * this->bar_width / needed;
1428 x = this->bar_right - x;
1430 x = this->bar_left + x;
1434 if (x != this->bar_left)
GfxFillRect(this->bar_left, bar_top, x, bar_top + this->bar_height, rtl ? colour_notdone : colour_done);
1435 if (x != this->bar_right)
GfxFillRect(x, bar_top, this->bar_right, bar_top + this->bar_height, rtl ? colour_done : colour_notdone);
1439 DrawString(this->bar_left, this->bar_right, text_top, STR_PERFORMANCE_DETAIL_PERCENT, TC_FROMSTRING,
SA_HOR_CENTER);
1442 if (score_type == SCORE_LOAN) val = needed - val;
1448 switch (score_type) {
1449 case SCORE_MIN_PROFIT:
1450 case SCORE_MIN_INCOME:
1451 case SCORE_MAX_INCOME:
1454 DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_CURRENCY);
1457 DrawString(this->score_detail_left, this->score_detail_right, text_top, STR_PERFORMANCE_DETAIL_AMOUNT_INT);
1480 if (--this->timeout == 0) {
1481 this->UpdateCompanyStats();
1493 if (!gui_scope)
return;
1508 FOR_ALL_COMPANIES(c) {
1509 this->company = c->
index;
1529 const StringID performance_tips[] = {
1530 STR_PERFORMANCE_DETAIL_VEHICLES_TOOLTIP,
1531 STR_PERFORMANCE_DETAIL_STATIONS_TOOLTIP,
1532 STR_PERFORMANCE_DETAIL_MIN_PROFIT_TOOLTIP,
1533 STR_PERFORMANCE_DETAIL_MIN_INCOME_TOOLTIP,
1534 STR_PERFORMANCE_DETAIL_MAX_INCOME_TOOLTIP,
1535 STR_PERFORMANCE_DETAIL_DELIVERED_TOOLTIP,
1536 STR_PERFORMANCE_DETAIL_CARGO_TOOLTIP,
1537 STR_PERFORMANCE_DETAIL_MONEY_TOOLTIP,
1538 STR_PERFORMANCE_DETAIL_LOAN_TOOLTIP,
1539 STR_PERFORMANCE_DETAIL_TOTAL_TOOLTIP,
1561 static const NWidgetPart _nested_performance_rating_detail_widgets[] = {
1574 static WindowDesc _performance_rating_detail_desc(
1578 _nested_performance_rating_detail_widgets,
lengthof(_nested_performance_rating_detail_widgets)
1581 void ShowPerformanceRatingDetail()
1583 AllocateWindowDescFront<PerformanceRatingDetailWindow>(&_performance_rating_detail_desc, 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.
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...
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)
void SetWidgetLoweredState(byte widget_index, bool lowered_stat)
Sets the lowered/raised status of a widget.
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 OnTick()
Called once per (game) tick.
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)
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.
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.
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.
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 first_init
This value is true until the first initialization of the window has finished.
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 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.
bool IsWidgetLowered(byte widget_index) const
Gets the lowered state of a widget.
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:
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.
virtual void OnInit()
Notification that the nested widget tree gets initialized.
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.
PauseModeByte _pause_mode
The current pause mode.
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.
static T Clamp(const T a, const T min, const T max)
Clamp a value between an interval.
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:
Maximal number of cargo types in a game.
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
virtual void OnTick()
Called once per (game) tick.
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.
static NWidgetBase * MakeCargoButtons(int *biggest_index)
Construct the row containing the digit keys.
uint excluded_data
bitmask of the datasets that shouldn't be displayed.
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.
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.
virtual void OnTick()
Called once per (game) tick.
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
const CargoSpec * _sorted_cargo_specs[NUM_CARGO]
Cargo specifications sorted alphabetically by name.
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.