|
@@ -243,30 +243,29 @@ static void DrawGraph(const GraphDrawer
|
|
|
/****************/
|
|
|
/* GRAPH LEGEND */
|
|
|
/****************/
|
|
|
|
|
|
static void GraphLegendWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
const Player* p;
|
|
|
|
|
|
switch (e->event) {
|
|
|
case WE_CREATE: {
|
|
|
uint i;
|
|
|
for (i = 3; i < w->widget_count; i++) {
|
|
|
case WE_CREATE:
|
|
|
for (uint i = 3; i < w->widget_count; i++) {
|
|
|
if (!HASBIT(_legend_excluded_players, i - 3)) LowerWindowWidget(w, i);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_PAINT: {
|
|
|
const Player *p;
|
|
|
|
|
|
case WE_PAINT:
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (!p->is_active) {
|
|
|
if (p->is_active) continue;
|
|
|
|
|
|
SETBIT(_legend_excluded_players, p->index);
|
|
|
RaiseWindowWidget(w, p->index + 3);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (!p->is_active) continue;
|
|
|
|
|
|
DrawPlayerIcon(p->index, 4, 18+p->index*12);
|
|
@@ -274,24 +273,25 @@ static void GraphLegendWndProc(Window *w
|
|
|
SetDParam(0, p->name_1);
|
|
|
SetDParam(1, p->name_2);
|
|
|
SetDParam(2, GetPlayerNameString(p->index, 3));
|
|
|
DrawString(21, 17 + p->index * 12, STR_7021, HASBIT(_legend_excluded_players, p->index) ? 0x10 : 0xC);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (IS_INT_INSIDE(e->we.click.widget, 3, 11)) {
|
|
|
if (!IS_INT_INSIDE(e->we.click.widget, 3, 11)) return;
|
|
|
|
|
|
TOGGLEBIT(_legend_excluded_players, e->we.click.widget - 3);
|
|
|
ToggleWidgetLoweredState(w, e->we.click.widget);
|
|
|
SetWindowDirty(w);
|
|
|
InvalidateWindow(WC_INCOME_GRAPH, 0);
|
|
|
InvalidateWindow(WC_OPERATING_PROFIT, 0);
|
|
|
InvalidateWindow(WC_DELIVERED_CARGO, 0);
|
|
|
InvalidateWindow(WC_PERFORMANCE_HISTORY, 0);
|
|
|
InvalidateWindow(WC_COMPANY_VALUE, 0);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _graph_legend_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -359,44 +359,44 @@ static void SetupGraphDrawerForPlayers(G
|
|
|
static void OperatingProfitWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
GraphDrawer gd;
|
|
|
const Player* p;
|
|
|
int i,j;
|
|
|
int numd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
gd.left = 2;
|
|
|
gd.top = 18;
|
|
|
gd.height = 136;
|
|
|
gd.has_negative_values = true;
|
|
|
gd.format_str_y_axis = STR_CURRCOMPACT;
|
|
|
|
|
|
SetupGraphDrawerForPlayers(&gd);
|
|
|
|
|
|
numd = 0;
|
|
|
int numd = 0;
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (p->is_active) {
|
|
|
gd.colors[numd] = _colour_gradient[p->player_color][6];
|
|
|
for (j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : (p->old_economy[j].income + p->old_economy[j].expenses);
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
numd++;
|
|
|
}
|
|
|
|
|
|
gd.num_dataset = numd;
|
|
|
|
|
|
DrawGraph(&gd);
|
|
|
} break;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget == 2) /* Clicked on Legend */
|
|
|
ShowGraphLegend();
|
|
|
/* Clicked on legend? */
|
|
|
if (e->we.click.widget == 2) ShowGraphLegend();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _operating_profit_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -430,29 +430,27 @@ void ShowOperatingProfitGraph(void)
|
|
|
static void IncomeGraphWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
GraphDrawer gd;
|
|
|
const Player* p;
|
|
|
int i,j;
|
|
|
int numd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
gd.left = 2;
|
|
|
gd.top = 18;
|
|
|
gd.height = 104;
|
|
|
gd.has_negative_values = false;
|
|
|
gd.format_str_y_axis = STR_CURRCOMPACT;
|
|
|
SetupGraphDrawerForPlayers(&gd);
|
|
|
|
|
|
numd = 0;
|
|
|
int numd = 0;
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (p->is_active) {
|
|
|
gd.colors[numd] = _colour_gradient[p->player_color][6];
|
|
|
for (j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].income;
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
numd++;
|
|
|
}
|
|
@@ -461,14 +459,13 @@ static void IncomeGraphWndProc(Window *w
|
|
|
|
|
|
DrawGraph(&gd);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget == 2)
|
|
|
ShowGraphLegend();
|
|
|
if (e->we.click.widget == 2) ShowGraphLegend();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _income_graph_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -500,29 +497,27 @@ void ShowIncomeGraph(void)
|
|
|
static void DeliveredCargoGraphWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
GraphDrawer gd;
|
|
|
const Player* p;
|
|
|
int i,j;
|
|
|
int numd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
gd.left = 2;
|
|
|
gd.top = 18;
|
|
|
gd.height = 104;
|
|
|
gd.has_negative_values = false;
|
|
|
gd.format_str_y_axis = STR_7024;
|
|
|
SetupGraphDrawerForPlayers(&gd);
|
|
|
|
|
|
numd = 0;
|
|
|
int numd = 0;
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (p->is_active) {
|
|
|
gd.colors[numd] = _colour_gradient[p->player_color][6];
|
|
|
for (j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].delivered_cargo;
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
numd++;
|
|
|
}
|
|
@@ -531,14 +526,13 @@ static void DeliveredCargoGraphWndProc(W
|
|
|
|
|
|
DrawGraph(&gd);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget == 2)
|
|
|
ShowGraphLegend();
|
|
|
if (e->we.click.widget == 2) ShowGraphLegend();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _delivered_cargo_graph_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -570,29 +564,27 @@ void ShowDeliveredCargoGraph(void)
|
|
|
static void PerformanceHistoryWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
GraphDrawer gd;
|
|
|
const Player* p;
|
|
|
int i,j;
|
|
|
int numd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
gd.left = 2;
|
|
|
gd.top = 18;
|
|
|
gd.height = 200;
|
|
|
gd.has_negative_values = false;
|
|
|
gd.format_str_y_axis = STR_7024;
|
|
|
SetupGraphDrawerForPlayers(&gd);
|
|
|
|
|
|
numd = 0;
|
|
|
int numd = 0;
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (p->is_active) {
|
|
|
gd.colors[numd] = _colour_gradient[p->player_color][6];
|
|
|
for (j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].performance_history;
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
numd++;
|
|
|
}
|
|
@@ -601,16 +593,14 @@ static void PerformanceHistoryWndProc(Wi
|
|
|
|
|
|
DrawGraph(&gd);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget == 2)
|
|
|
ShowGraphLegend();
|
|
|
if (e->we.click.widget == 3)
|
|
|
ShowPerformanceRatingDetail();
|
|
|
if (e->we.click.widget == 2) ShowGraphLegend();
|
|
|
if (e->we.click.widget == 3) ShowPerformanceRatingDetail();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _performance_history_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -643,29 +633,27 @@ void ShowPerformanceHistoryGraph(void)
|
|
|
static void CompanyValueGraphWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
GraphDrawer gd;
|
|
|
const Player* p;
|
|
|
int i,j;
|
|
|
int numd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
gd.left = 2;
|
|
|
gd.top = 18;
|
|
|
gd.height = 200;
|
|
|
gd.has_negative_values = false;
|
|
|
gd.format_str_y_axis = STR_CURRCOMPACT;
|
|
|
SetupGraphDrawerForPlayers(&gd);
|
|
|
|
|
|
numd = 0;
|
|
|
int numd = 0;
|
|
|
FOR_ALL_PLAYERS(p) {
|
|
|
if (p->is_active) {
|
|
|
gd.colors[numd] = _colour_gradient[p->player_color][6];
|
|
|
for (j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
for (int j = gd.num_on_x_axis, i = 0; --j >= 0;) {
|
|
|
gd.cost[numd][i] = (j >= p->num_valid_stat_ent) ? INVALID_DATAPOINT : p->old_economy[j].company_value;
|
|
|
i++;
|
|
|
}
|
|
|
}
|
|
|
numd++;
|
|
|
}
|
|
@@ -674,14 +662,13 @@ static void CompanyValueGraphWndProc(Win
|
|
|
|
|
|
DrawGraph(&gd);
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget == 2)
|
|
|
ShowGraphLegend();
|
|
|
if (e->we.click.widget == 2) ShowGraphLegend();
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _company_value_graph_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
@@ -711,20 +698,18 @@ void ShowCompanyValueGraph(void)
|
|
|
/*****************/
|
|
|
|
|
|
static void CargoPaymentRatesWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
int j, x, y;
|
|
|
uint i = 0;
|
|
|
GraphDrawer gd;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
x = 495;
|
|
|
y = 24;
|
|
|
int x = 495;
|
|
|
int y = 24;
|
|
|
|
|
|
gd.excluded_data = _legend_excluded_cargo;
|
|
|
gd.left = 2;
|
|
|
gd.top = 24;
|
|
|
gd.height = w->height - 38;
|
|
|
gd.has_negative_values = false;
|
|
@@ -732,12 +717,13 @@ static void CargoPaymentRatesWndProc(Win
|
|
|
gd.num_on_x_axis = 20;
|
|
|
gd.num_vert_lines = 20;
|
|
|
gd.month = 0xFF;
|
|
|
gd.x_values_start = 10;
|
|
|
gd.x_values_increment = 10;
|
|
|
|
|
|
uint i = 0;
|
|
|
for (CargoID c = 0; c != NUM_CARGO; c++) {
|
|
|
const CargoSpec *cs = GetCargo(c);
|
|
|
if (!cs->IsValid()) continue;
|
|
|
|
|
|
/* Only draw labels for widgets that exist. If the widget doesn't
|
|
|
* exist then the local player has used the climate cheat or
|
|
@@ -754,33 +740,34 @@ static void CargoPaymentRatesWndProc(Win
|
|
|
SetDParam(0, cs->name);
|
|
|
DrawString(x + 14 + clk_dif, y + clk_dif, STR_7065, 0);
|
|
|
y += 8;
|
|
|
}
|
|
|
|
|
|
gd.colors[i] = cs->legend_colour;
|
|
|
for (j = 0; j != 20; j++) {
|
|
|
for (uint j = 0; j != 20; j++) {
|
|
|
gd.cost[i][j] = GetTransportedGoodsIncome(10, 20, j * 6 + 6, c);
|
|
|
}
|
|
|
|
|
|
i++;
|
|
|
}
|
|
|
gd.num_dataset = 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;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_CLICK: {
|
|
|
if (e->we.click.widget >= 3 && e->we.click.widget < (int)w->widget_count) {
|
|
|
case WE_CLICK:
|
|
|
if (e->we.click.widget >= 3) {
|
|
|
TOGGLEBIT(_legend_excluded_cargo, e->we.click.widget - 3);
|
|
|
ToggleWidgetLoweredState(w, e->we.click.widget);
|
|
|
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},
|
|
@@ -873,23 +860,21 @@ static int CDECL PerfHistComp(const void
|
|
|
static void CompanyLeagueWndProc(Window *w, WindowEvent *e)
|
|
|
{
|
|
|
switch (e->event) {
|
|
|
case WE_PAINT: {
|
|
|
const Player* plist[MAX_PLAYERS];
|
|
|
const Player* p;
|
|
|
uint pl_num;
|
|
|
uint i;
|
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
pl_num = 0;
|
|
|
uint pl_num = 0;
|
|
|
FOR_ALL_PLAYERS(p) if (p->is_active) plist[pl_num++] = p;
|
|
|
|
|
|
qsort((void*)plist, pl_num, sizeof(*plist), PerfHistComp);
|
|
|
|
|
|
for (i = 0; i != pl_num; i++) {
|
|
|
for (uint i = 0; i != pl_num; i++) {
|
|
|
p = plist[i];
|
|
|
SetDParam(0, i + STR_01AC_1ST);
|
|
|
SetDParam(1, p->name_1);
|
|
|
SetDParam(2, p->name_2);
|
|
|
SetDParam(3, GetPlayerNameString(p->index, 4));
|
|
|
SetDParam(5, GetPerformanceTitleFromValue(p->old_economy[1].performance_history));
|
|
@@ -1080,17 +1065,16 @@ static void PerformanceRatingDetailWndPr
|
|
|
SetWindowDirty(w);
|
|
|
}
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case WE_CREATE: {
|
|
|
PlayerID i;
|
|
|
Player *p2;
|
|
|
|
|
|
/* Disable the players who are not active */
|
|
|
for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
|
|
|
for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
|
|
|
SetWindowWidgetDisabledState(w, i + 13, !GetPlayer(i)->is_active);
|
|
|
}
|
|
|
/* Update all player stats with the current data
|
|
|
* (this is because _score_info is not saved to a savegame) */
|
|
|
FOR_ALL_PLAYERS(p2) {
|
|
|
if (p2->is_active) UpdateCompanyRatingAndValue(p2, false);
|
|
@@ -1102,13 +1086,13 @@ static void PerformanceRatingDetailWndPr
|
|
|
if (_performance_rating_detail_player != INVALID_PLAYER) LowerWindowWidget(w, _performance_rating_detail_player + 13);
|
|
|
SetWindowDirty(w);
|
|
|
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
case WE_TICK: {
|
|
|
case WE_TICK:
|
|
|
/* Update the player score every 5 days */
|
|
|
if (--w->custom[0] == 0) {
|
|
|
w->custom[0] = DAY_TICKS;
|
|
|
if (--w->custom[1] == 0) {
|
|
|
Player *p2;
|
|
|
|
|
@@ -1121,13 +1105,12 @@ static void PerformanceRatingDetailWndPr
|
|
|
}
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static const Widget _performance_rating_detail_widgets[] = {
|
|
|
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
|
{ WWT_CAPTION, RESIZE_NONE, 14, 11, 298, 0, 13, STR_PERFORMANCE_DETAIL, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
|
|
{ WWT_PANEL, RESIZE_NONE, 14, 0, 298, 14, 27, 0x0, STR_NULL},
|
|
|
|