mirror of https://github.com/OpenTTD/OpenTTD.git
(svn r1587) -CodeChange: fixed up the graph loop a little..numd now shows the exact amount, no +1 needed
-CodeMotion: moved 'Company performancerating detail' to the end of the file; it fits there
This commit is contained in:
parent
6e17ee9fe2
commit
7c28bafba9
757
graph_gui.c
757
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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue