diff --git a/graph_gui.c b/graph_gui.c index d575b80447..463d23598a 100644 --- a/graph_gui.c +++ b/graph_gui.c @@ -334,19 +334,19 @@ static void OperatingProfitWndProc(Window *w, WindowEvent *e) SetupGraphDrawerForPlayers(&gd); - numd = -1; + numd = 0; FOR_ALL_PLAYERS(p) { - numd++; - if (!p->is_active) - continue; - gd.colors[numd] = _color_list[p->player_color].window_color_bgb; - for(j=gd.num_on_x_axis,i=0; --j >= 0;) { - gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)(p->old_economy[j].income + p->old_economy[j].expenses); - i++; + if (p->is_active) { + gd.colors[numd] = _color_list[p->player_color].window_color_bgb; + for(j=gd.num_on_x_axis,i=0; --j >= 0;) { + gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)(p->old_economy[j].income + p->old_economy[j].expenses); + i++; + } } + numd++; } - gd.num_dataset = numd + 1; + gd.num_dataset = numd; DrawGraph(&gd); } break; @@ -407,19 +407,19 @@ static void IncomeGraphWndProc(Window *w, WindowEvent *e) gd.bg_line_color = 0xE; SetupGraphDrawerForPlayers(&gd); - numd = -1; + numd = 0; FOR_ALL_PLAYERS(p) { - numd++; - if (!p->is_active) - continue; - gd.colors[numd] = _color_list[p->player_color].window_color_bgb; - for(j=gd.num_on_x_axis,i=0; --j >= 0;) { - gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].income; - i++; + if (p->is_active) { + gd.colors[numd] = _color_list[p->player_color].window_color_bgb; + for(j=gd.num_on_x_axis,i=0; --j >= 0;) { + gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].income; + i++; + } } + numd++; } - gd.num_dataset = numd + 1; + gd.num_dataset = numd; DrawGraph(&gd); break; @@ -480,19 +480,19 @@ static void DeliveredCargoGraphWndProc(Window *w, WindowEvent *e) gd.bg_line_color = 0xE; SetupGraphDrawerForPlayers(&gd); - numd = -1; + numd = 0; FOR_ALL_PLAYERS(p) { - numd++; - if (!p->is_active) - continue; - gd.colors[numd] = _color_list[p->player_color].window_color_bgb; - for(j=gd.num_on_x_axis,i=0; --j >= 0;) { - gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].delivered_cargo; - i++; + if (p->is_active) { + gd.colors[numd] = _color_list[p->player_color].window_color_bgb; + for(j=gd.num_on_x_axis,i=0; --j >= 0;) { + gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].delivered_cargo; + i++; + } } + numd++; } - gd.num_dataset = numd + 1; + gd.num_dataset = numd; DrawGraph(&gd); break; @@ -528,6 +528,357 @@ void ShowDeliveredCargoGraph() } } +/***********************/ +/* PERFORMANCE HISTORY */ +/***********************/ + +static void PerformanceHistoryWndProc(Window *w, WindowEvent *e) +{ + switch(e->event) { + case WE_PAINT: { + GraphDrawer gd; + Player *p; + int i,j; + int numd; + + DrawWindowWidgets(w); + + gd.left = 2; + gd.top = 18; + gd.height = 200; + gd.include_neg = false; + gd.format_str_y_axis = STR_7024; + gd.color_3 = 0x10; + gd.color_2 = 0xD7; + gd.bg_line_color = 0xE; + SetupGraphDrawerForPlayers(&gd); + + numd = 0; + FOR_ALL_PLAYERS(p) { + if (p->is_active) { + gd.colors[numd] = _color_list[p->player_color].window_color_bgb; + for(j=gd.num_on_x_axis,i=0; --j >= 0;) { + gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].performance_history; + i++; + } + } + numd++; + } + + gd.num_dataset = numd; + + DrawGraph(&gd); + break; + } + + case WE_CLICK: + if (e->click.widget == 2) + ShowGraphLegend(); + if (e->click.widget == 3) + ShowPerformanceRatingDetail(); + break; + } +} + +static const Widget _performance_history_widgets[] = { +{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, RESIZE_NONE, 14, 11, 475, 0, 13, STR_7051_COMPANY_PERFORMANCE_RATINGS, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, +{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 476, 525, 0, 13, STR_PERFORMANCE_DETAIL_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 575, 14, 237, 0x0, STR_NULL}, +{ WIDGETS_END}, +}; + +static const WindowDesc _performance_history_desc = { + -1, -1, 576, 238, + WC_PERFORMANCE_HISTORY,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, + _performance_history_widgets, + PerformanceHistoryWndProc +}; + +void ShowPerformanceHistoryGraph() +{ + if (AllocateWindowDescFront(&_performance_history_desc, 0)) { + InvalidateWindow(WC_GRAPH_LEGEND, 0); + } +} + +/*****************/ +/* COMPANY VALUE */ +/*****************/ + +static void CompanyValueGraphWndProc(Window *w, WindowEvent *e) +{ + switch(e->event) { + case WE_PAINT: { + GraphDrawer gd; + Player *p; + int i,j; + int numd; + + DrawWindowWidgets(w); + + gd.left = 2; + gd.top = 18; + gd.height = 200; + gd.include_neg = false; + gd.format_str_y_axis = STR_CURRCOMPACT64; + gd.color_3 = 0x10; + gd.color_2 = 0xD7; + gd.bg_line_color = 0xE; + SetupGraphDrawerForPlayers(&gd); + + numd = 0; + FOR_ALL_PLAYERS(p) { + if (p->is_active) { + gd.colors[numd] = _color_list[p->player_color].window_color_bgb; + for(j=gd.num_on_x_axis,i=0; --j >= 0;) { + gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].company_value; + i++; + } + } + numd++; + } + + gd.num_dataset = numd; + + DrawGraph(&gd); + break; + } + + case WE_CLICK: + if (e->click.widget == 2) + ShowGraphLegend(); + break; + } +} + +static const Widget _company_value_graph_widgets[] = { +{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, RESIZE_NONE, 14, 11, 525, 0, 13, STR_7052_COMPANY_VALUES, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 575, 14, 237, 0x0, STR_NULL}, +{ WIDGETS_END}, +}; + +static const WindowDesc _company_value_graph_desc = { + -1, -1, 576, 238, + WC_COMPANY_VALUE,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, + _company_value_graph_widgets, + CompanyValueGraphWndProc +}; + +void ShowCompanyValueGraph() +{ + if (AllocateWindowDescFront(&_company_value_graph_desc, 0)) { + InvalidateWindow(WC_GRAPH_LEGEND, 0); + } +} + +/*****************/ +/* PAYMENT RATES */ +/*****************/ + +static const byte _cargo_legend_colors[12] = {152, 32, 15, 174, 208, 194, 191, 84, 184, 10, 202, 215}; + +static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) +{ + switch(e->event) { + case WE_PAINT: { + int i, j, x, y; + GraphDrawer gd; + + gd.sel = _legend_cargobits; + w->click_state = (~_legend_cargobits) << 3; + DrawWindowWidgets(w); + + x = 495; + y = 25; + + for(i=0; i!=NUM_CARGO; i++) { + GfxFillRect(x, y, x+8, y+5, 0); + GfxFillRect(x+1, y+1, x+7, y+4, _cargo_legend_colors[i]); + SetDParam(0, _cargoc.names_s[i]); + DrawString(x+14, y, STR_7065, 0); + y += 8; + } + + gd.left = 2; + gd.top = 24; + gd.height = 104; + gd.include_neg = false; + gd.format_str_y_axis = STR_CURRCOMPACT32; + gd.color_3 = 16; + gd.color_2 = 215; + gd.bg_line_color = 14; + gd.num_dataset = NUM_CARGO; + gd.num_on_x_axis = 20; + gd.num_vert_lines = 20; + gd.month = 0xFF; + gd.unk61A = 10; + gd.unk61C = 10; + + for(i=0; i!=NUM_CARGO; i++) { + gd.colors[i] = _cargo_legend_colors[i]; + for(j=0; j!=20; j++) { + gd.cost[i][j] = (uint64)GetTransportedGoodsIncome(10, 20, j*6+6,i); + } + } + + DrawGraph(&gd); + + DrawString(2 + 46, 24 + gd.height + 7, STR_7062_DAYS_IN_TRANSIT, 0); + DrawString(2 + 84, 24 - 9, STR_7063_PAYMENT_FOR_DELIVERING, 0); + } break; + + case WE_CLICK: { + switch(e->click.widget) { + case 3: case 4: case 5: case 6: + case 7: case 8: case 9: case 10: + case 11: case 12: case 13: case 14: + _legend_cargobits ^= 1 << (e->click.widget - 3); + SetWindowDirty(w); + break; + } + } break; + } +} + +static const Widget _cargo_payment_rates_widgets[] = { +{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, RESIZE_NONE, 14, 11, 567, 0, 13, STR_7061_CARGO_PAYMENT_RATES, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_PANEL, RESIZE_NONE, 14, 0, 567, 14, 141, 0x0, STR_NULL}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 24, 31, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 32, 39, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 40, 47, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 48, 55, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 56, 63, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 64, 71, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 72, 79, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 80, 87, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 88, 95, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 96, 103, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 104, 111, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 112, 119, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, +{ WIDGETS_END}, +}; + +static const WindowDesc _cargo_payment_rates_desc = { + -1, -1, 568, 142, + WC_PAYMENT_RATES,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, + _cargo_payment_rates_widgets, + CargoPaymentRatesWndProc +}; + + +void ShowCargoPaymentRates() +{ + AllocateWindowDescFront(&_cargo_payment_rates_desc, 0); +} + +/************************/ +/* COMPANY LEAGUE TABLE */ +/************************/ + +static const StringID _performance_titles[] = { + STR_7066_ENGINEER, + STR_7066_ENGINEER, + STR_7067_TRAFFIC_MANAGER, + STR_7067_TRAFFIC_MANAGER, + STR_7068_TRANSPORT_COORDINATOR, + STR_7068_TRANSPORT_COORDINATOR, + STR_7069_ROUTE_SUPERVISOR, + STR_7069_ROUTE_SUPERVISOR, + STR_706A_DIRECTOR, + STR_706A_DIRECTOR, + STR_706B_CHIEF_EXECUTIVE, + STR_706B_CHIEF_EXECUTIVE, + STR_706C_CHAIRMAN, + STR_706C_CHAIRMAN, + STR_706D_PRESIDENT, + STR_706E_TYCOON, +}; + +static inline StringID GetPerformanceTitleFromValue(uint value) +{ + return _performance_titles[minu(value, 1000) >> 6]; +} + +static int CDECL _perf_hist_comp(const void *elem1, const void *elem2 ) { + const Player *p1 = *(const Player* const *)elem1; + const Player *p2 = *(const Player* const *)elem2; + int32 v = p2->old_economy[1].performance_history - p1->old_economy[1].performance_history; + return (v!=0) | (v >> (sizeof(int32)*8-1)); +} + +static void CompanyLeagueWndProc(Window *w, WindowEvent *e) +{ + switch(e->event) { + case WE_PAINT: { + Player *p; + Player *plist[MAX_PLAYERS]; + size_t pl_num, i; + + DrawWindowWidgets(w); + + pl_num=0; + FOR_ALL_PLAYERS(p) { + if (p->is_active) + plist[pl_num++] = p; + } + assert(pl_num > 0); + + qsort(plist, pl_num, sizeof(Player*), _perf_hist_comp); + + i = 0; + do { + SetDParam(0, i + 1 + STR_01AB); + p = plist[i]; + SetDParam(1, p->name_1); + SetDParam(2, p->name_2); + + SetDParam(3, GetPlayerNameString(p->index, 4)); + /* WARNING ugly hack! + GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16 + It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like + that because there is another param after it. + So we'll just shift the rating one back if player is AI and all is fine + */ + SetDParam((IS_HUMAN_PLAYER(p->index) ? 5 : 4), GetPerformanceTitleFromValue(p->old_economy[1].performance_history)); + + DrawString(2, 15 + i * 10, i == 0 ? STR_7054 : STR_7055, 0); + DrawPlayerIcon(p->index, 27, 16 + i * 10); + } while (++i != pl_num); + + break; + } + } +} + + +static const Widget _company_league_widgets[] = { +{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, +{ WWT_CAPTION, RESIZE_NONE, 14, 11, 399, 0, 13, STR_7053_COMPANY_LEAGUE_TABLE, STR_018C_WINDOW_TITLE_DRAG_THIS}, +{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 399, 14, 96, 0x0, STR_NULL}, +{ WIDGETS_END}, +}; + +static const WindowDesc _company_league_desc = { + -1, -1, 400, 97, + WC_COMPANY_LEAGUE,0, + WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, + _company_league_widgets, + CompanyLeagueWndProc +}; + +void ShowCompanyLeagueTable() +{ + AllocateWindowDescFront(&_company_league_desc,0); +} + /*****************************/ /* PERFORMANCE RATING DETAIL */ /*****************************/ @@ -747,355 +1098,3 @@ void ShowPerformanceRatingDetail() { AllocateWindowDescFront(&_performance_rating_detail_desc, 0); } - -/***********************/ -/* PERFORMANCE HISTORY */ -/***********************/ - -static void PerformanceHistoryWndProc(Window *w, WindowEvent *e) -{ - switch(e->event) { - case WE_PAINT: { - GraphDrawer gd; - Player *p; - int i,j; - int numd; - - DrawWindowWidgets(w); - - gd.left = 2; - gd.top = 18; - gd.height = 200; - gd.include_neg = false; - gd.format_str_y_axis = STR_7024; - gd.color_3 = 0x10; - gd.color_2 = 0xD7; - gd.bg_line_color = 0xE; - SetupGraphDrawerForPlayers(&gd); - - numd = -1; - FOR_ALL_PLAYERS(p) { - numd++; - if (!p->is_active) - continue; - gd.colors[numd] = _color_list[p->player_color].window_color_bgb; - for(j=gd.num_on_x_axis,i=0; --j >= 0;) { - gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].performance_history; - i++; - } - } - - gd.num_dataset = numd + 1; - - DrawGraph(&gd); - break; - } - - case WE_CLICK: - if (e->click.widget == 2) - ShowGraphLegend(); - if (e->click.widget == 3) - ShowPerformanceRatingDetail(); - break; - } -} - -static const Widget _performance_history_widgets[] = { -{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 475, 0, 13, STR_7051_COMPANY_PERFORMANCE_RATINGS, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 476, 525, 0, 13, STR_PERFORMANCE_DETAIL_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 575, 14, 237, 0x0, STR_NULL}, -{ WIDGETS_END}, -}; - -static const WindowDesc _performance_history_desc = { - -1, -1, 576, 238, - WC_PERFORMANCE_HISTORY,0, - WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, - _performance_history_widgets, - PerformanceHistoryWndProc -}; - -void ShowPerformanceHistoryGraph() -{ - if (AllocateWindowDescFront(&_performance_history_desc, 0)) { - InvalidateWindow(WC_GRAPH_LEGEND, 0); - } -} - -/*****************/ -/* COMPANY VALUE */ -/*****************/ - -static void CompanyValueGraphWndProc(Window *w, WindowEvent *e) -{ - switch(e->event) { - case WE_PAINT: { - GraphDrawer gd; - Player *p; - int i,j; - int numd; - - DrawWindowWidgets(w); - - gd.left = 2; - gd.top = 18; - gd.height = 200; - gd.include_neg = false; - gd.format_str_y_axis = STR_CURRCOMPACT64; - gd.color_3 = 0x10; - gd.color_2 = 0xD7; - gd.bg_line_color = 0xE; - SetupGraphDrawerForPlayers(&gd); - - numd = -1; - FOR_ALL_PLAYERS(p) { - numd++; - if (!p->is_active) - continue; - - gd.colors[numd] = _color_list[p->player_color].window_color_bgb; - for(j=gd.num_on_x_axis,i=0; --j >= 0;) { - gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_VALUE : (uint64)p->old_economy[j].company_value; - i++; - } - } - - gd.num_dataset = numd + 1; - - DrawGraph(&gd); - break; - } - - case WE_CLICK: - if (e->click.widget == 2) - ShowGraphLegend(); - break; - } -} - -static const Widget _company_value_graph_widgets[] = { -{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 525, 0, 13, STR_7052_COMPANY_VALUES, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 526, 575, 0, 13, STR_704C_KEY, STR_704D_SHOW_KEY_TO_GRAPHS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 575, 14, 237, 0x0, STR_NULL}, -{ WIDGETS_END}, -}; - -static const WindowDesc _company_value_graph_desc = { - -1, -1, 576, 238, - WC_COMPANY_VALUE,0, - WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS, - _company_value_graph_widgets, - CompanyValueGraphWndProc -}; - -void ShowCompanyValueGraph() -{ - if (AllocateWindowDescFront(&_company_value_graph_desc, 0)) { - InvalidateWindow(WC_GRAPH_LEGEND, 0); - } -} - -/*****************/ -/* PAYMENT RATES */ -/*****************/ - -static const byte _cargo_legend_colors[12] = {152, 32, 15, 174, 208, 194, 191, 84, 184, 10, 202, 215}; - -static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e) -{ - switch(e->event) { - case WE_PAINT: { - int i, j, x, y; - GraphDrawer gd; - - gd.sel = _legend_cargobits; - w->click_state = (~_legend_cargobits) << 3; - DrawWindowWidgets(w); - - x = 495; - y = 25; - - for(i=0; i!=NUM_CARGO; i++) { - GfxFillRect(x, y, x+8, y+5, 0); - GfxFillRect(x+1, y+1, x+7, y+4, _cargo_legend_colors[i]); - SetDParam(0, _cargoc.names_s[i]); - DrawString(x+14, y, STR_7065, 0); - y += 8; - } - - gd.left = 2; - gd.top = 24; - gd.height = 104; - gd.include_neg = false; - gd.format_str_y_axis = STR_CURRCOMPACT32; - gd.color_3 = 16; - gd.color_2 = 215; - gd.bg_line_color = 14; - gd.num_dataset = 12; - gd.num_on_x_axis = 20; - gd.num_vert_lines = 20; - gd.month = 0xFF; - gd.unk61A = 10; - gd.unk61C = 10; - - for(i=0; i!=NUM_CARGO; i++) { - gd.colors[i] = _cargo_legend_colors[i]; - for(j=0; j!=20; j++) { - gd.cost[i][j] = (uint64)GetTransportedGoodsIncome(10, 20, j*6+6,i); - } - } - - DrawGraph(&gd); - - DrawString(2 + 46, 24 + gd.height + 7, STR_7062_DAYS_IN_TRANSIT, 0); - DrawString(2 + 84, 24 - 9, STR_7063_PAYMENT_FOR_DELIVERING, 0); - } break; - - case WE_CLICK: { - switch(e->click.widget) { - case 3: case 4: case 5: case 6: - case 7: case 8: case 9: case 10: - case 11: case 12: case 13: case 14: - _legend_cargobits ^= 1 << (e->click.widget - 3); - SetWindowDirty(w); - break; - } - } break; - } -} - -static const Widget _cargo_payment_rates_widgets[] = { -{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 567, 0, 13, STR_7061_CARGO_PAYMENT_RATES, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_PANEL, RESIZE_NONE, 14, 0, 567, 14, 141, 0x0, STR_NULL}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 24, 31, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 32, 39, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 40, 47, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 48, 55, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 56, 63, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 64, 71, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 72, 79, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 80, 87, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 88, 95, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 96, 103, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 104, 111, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WWT_PANEL, RESIZE_NONE, 12, 493, 562, 112, 119, 0x0, STR_7064_TOGGLE_GRAPH_FOR_CARGO}, -{ WIDGETS_END}, -}; - -static const WindowDesc _cargo_payment_rates_desc = { - -1, -1, 568, 142, - WC_PAYMENT_RATES,0, - WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, - _cargo_payment_rates_widgets, - CargoPaymentRatesWndProc -}; - - -void ShowCargoPaymentRates() -{ - AllocateWindowDescFront(&_cargo_payment_rates_desc, 0); -} - -/************************/ -/* COMPANY LEAGUE TABLE */ -/************************/ - -static const StringID _performance_titles[] = { - STR_7066_ENGINEER, - STR_7066_ENGINEER, - STR_7067_TRAFFIC_MANAGER, - STR_7067_TRAFFIC_MANAGER, - STR_7068_TRANSPORT_COORDINATOR, - STR_7068_TRANSPORT_COORDINATOR, - STR_7069_ROUTE_SUPERVISOR, - STR_7069_ROUTE_SUPERVISOR, - STR_706A_DIRECTOR, - STR_706A_DIRECTOR, - STR_706B_CHIEF_EXECUTIVE, - STR_706B_CHIEF_EXECUTIVE, - STR_706C_CHAIRMAN, - STR_706C_CHAIRMAN, - STR_706D_PRESIDENT, - STR_706E_TYCOON, -}; - -static inline StringID GetPerformanceTitleFromValue(uint value) -{ - return _performance_titles[minu(value, 1000) >> 6]; -} - -static int CDECL _perf_hist_comp(const void *elem1, const void *elem2 ) { - const Player *p1 = *(const Player* const *)elem1; - const Player *p2 = *(const Player* const *)elem2; - int32 v = p2->old_economy[1].performance_history - p1->old_economy[1].performance_history; - return (v!=0) | (v >> (sizeof(int32)*8-1)); -} - -static void CompanyLeagueWndProc(Window *w, WindowEvent *e) -{ - switch(e->event) { - case WE_PAINT: { - Player *p; - Player *plist[MAX_PLAYERS]; - size_t pl_num, i; - - DrawWindowWidgets(w); - - pl_num=0; - FOR_ALL_PLAYERS(p) { - if (p->is_active) - plist[pl_num++] = p; - } - assert(pl_num > 0); - - qsort(plist, pl_num, sizeof(Player*), _perf_hist_comp); - - i = 0; - do { - SetDParam(0, i + 1 + STR_01AB); - p = plist[i]; - SetDParam(1, p->name_1); - SetDParam(2, p->name_2); - - SetDParam(3, GetPlayerNameString(p->index, 4)); - /* WARNING ugly hack! - GetPlayerNameString sets up (Player #) if the player is human in an extra DPARAM16 - It seems that if player is non-human, nothing is set up, so param is 0. GetString doesn't like - that because there is another param after it. - So we'll just shift the rating one back if player is AI and all is fine - */ - SetDParam((IS_HUMAN_PLAYER(p->index) ? 5 : 4), GetPerformanceTitleFromValue(p->old_economy[1].performance_history)); - - DrawString(2, 15 + i * 10, i == 0 ? STR_7054 : STR_7055, 0); - DrawPlayerIcon(p->index, 27, 16 + i * 10); - } while (++i != pl_num); - - break; - } - } -} - - -static const Widget _company_league_widgets[] = { -{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, -{ WWT_CAPTION, RESIZE_NONE, 14, 11, 399, 0, 13, STR_7053_COMPANY_LEAGUE_TABLE, STR_018C_WINDOW_TITLE_DRAG_THIS}, -{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 399, 14, 96, 0x0, STR_NULL}, -{ WIDGETS_END}, -}; - -static const WindowDesc _company_league_desc = { - -1, -1, 400, 97, - WC_COMPANY_LEAGUE,0, - WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET, - _company_league_widgets, - CompanyLeagueWndProc -}; - -void ShowCompanyLeagueTable() -{ - AllocateWindowDescFront(&_company_league_desc,0); -}