src/vehicle_gui.cpp
branchNewGRF_ports
changeset 6872 1c4a4a609f85
parent 6871 5a9dc001e1ad
child 6877 889301acc299
equal deleted inserted replaced
6871:5a9dc001e1ad 6872:1c4a4a609f85
     3 /** @file vehicle_gui.cpp */
     3 /** @file vehicle_gui.cpp */
     4 
     4 
     5 #include "stdafx.h"
     5 #include "stdafx.h"
     6 #include "openttd.h"
     6 #include "openttd.h"
     7 #include "debug.h"
     7 #include "debug.h"
     8 #include "functions.h"
     8 #include "player_func.h"
     9 #include "player.h"
       
    10 #include "station.h"
     9 #include "station.h"
    11 #include "strings.h"
       
    12 #include "table/sprites.h"
       
    13 #include "table/strings.h"
       
    14 #include "vehicle.h"
       
    15 #include "window.h"
       
    16 #include "engine.h"
    10 #include "engine.h"
    17 #include "gui.h"
    11 #include "gui.h"
    18 #include "command.h"
    12 #include "window_gui.h"
    19 #include "gfx.h"
    13 #include "textbuf_gui.h"
       
    14 #include "command_func.h"
    20 #include "variables.h"
    15 #include "variables.h"
    21 #include "vehicle_gui.h"
    16 #include "vehicle_gui.h"
    22 #include "viewport.h"
    17 #include "viewport_func.h"
       
    18 #include "gfx_func.h"
    23 #include "train.h"
    19 #include "train.h"
    24 #include "newgrf_callbacks.h"
    20 #include "newgrf_callbacks.h"
    25 #include "newgrf_engine.h"
    21 #include "newgrf_engine.h"
    26 #include "newgrf_text.h"
    22 #include "newgrf_text.h"
    27 #include "date.h"
       
    28 #include "ship.h"
    23 #include "ship.h"
    29 #include "aircraft.h"
    24 #include "aircraft.h"
    30 #include "roadveh.h"
    25 #include "roadveh.h"
    31 #include "depot.h"
    26 #include "depot.h"
    32 #include "helpers.hpp"
       
    33 #include "cargotype.h"
    27 #include "cargotype.h"
    34 #include "group.h"
    28 #include "group.h"
       
    29 #include "group_gui.h"
       
    30 #include "strings_func.h"
       
    31 #include "functions.h"
       
    32 #include "window_func.h"
       
    33 #include "vehicle_func.h"
       
    34 #include "autoreplace_gui.h"
       
    35 #include "core/alloc_func.hpp"
       
    36 #include "string_func.h"
       
    37 #include "settings_type.h"
       
    38 #include "widgets/dropdown_func.h"
       
    39 
       
    40 #include "table/sprites.h"
       
    41 #include "table/strings.h"
    35 
    42 
    36 struct Sorting {
    43 struct Sorting {
    37 	Listing aircraft;
    44 	Listing aircraft;
    38 	Listing roadveh;
    45 	Listing roadveh;
    39 	Listing ship;
    46 	Listing ship;
   504 
   511 
   505 		/* Add each cargo type to the list */
   512 		/* Add each cargo type to the list */
   506 		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
   513 		for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
   507 			if (!HasBit(cmask, cid)) continue;
   514 			if (!HasBit(cmask, cid)) continue;
   508 
   515 
       
   516 			if (b >= lastof(_userstring) - (2 + 2 * 4)) break; // ", " and two calls to Utf8Encode()
       
   517 
   509 			if (!first) b = strecpy(b, ", ", lastof(_userstring));
   518 			if (!first) b = strecpy(b, ", ", lastof(_userstring));
   510 			first = false;
   519 			first = false;
   511 
   520 
   512 			b = InlineString(b, GetCargo(cid)->name);
   521 			b = InlineString(b, GetCargo(cid)->name);
   513 		}
   522 		}
   514 	}
   523 	}
   515 
   524 
   516 	/* Terminate and display the completed string */
   525 	/* Terminate and display the completed string */
   517 	*b = '\0';
   526 	*b = '\0';
       
   527 
       
   528 	/* Make sure we detect any buffer overflow */
       
   529 	assert(b < endof(_userstring));
       
   530 
   518 	return DrawStringMultiLine(x, y, STR_SPEC_USERSTRING, w);
   531 	return DrawStringMultiLine(x, y, STR_SPEC_USERSTRING, w);
   519 }
   532 }
   520 
   533 
   521 
   534 
   522 /* if the sorting criteria had the same value, sort vehicle by unitnumber */
   535 /* if the sorting criteria had the same value, sort vehicle by unitnumber */
   540 	const Vehicle* vb = *(const Vehicle**)b;
   553 	const Vehicle* vb = *(const Vehicle**)b;
   541 	int r;
   554 	int r;
   542 
   555 
   543 	if (va != last_vehicle[0]) {
   556 	if (va != last_vehicle[0]) {
   544 		last_vehicle[0] = va;
   557 		last_vehicle[0] = va;
   545 		if (IsCustomName(va->string_id)) {
   558 		SetDParam(0, va->index);
   546 			GetString(last_name[0], va->string_id, lastof(last_name[0]));
   559 		GetString(last_name[0], STR_VEHICLE_NAME, lastof(last_name[0]));
   547 		} else {
       
   548 			last_name[0][0] = '\0';
       
   549 		}
       
   550 	}
   560 	}
   551 
   561 
   552 	if (vb != last_vehicle[1]) {
   562 	if (vb != last_vehicle[1]) {
   553 		last_vehicle[1] = vb;
   563 		last_vehicle[1] = vb;
   554 		if (IsCustomName(vb->string_id)) {
   564 		SetDParam(1, vb->index);
   555 			GetString(last_name[1], vb->string_id, lastof(last_name[1]));
   565 		GetString(last_name[1], STR_VEHICLE_NAME, lastof(last_name[1]));
   556 		} else {
       
   557 			last_name[1][0] = '\0';
       
   558 		}
       
   559 	}
   566 	}
   560 
   567 
   561 	r = strcmp(last_name[0], last_name[1]); // sort by name
   568 	r = strcmp(last_name[0], last_name[1]); // sort by name
   562 
   569 
   563 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   570 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   734 enum VehicleListWindowWidgets {
   741 enum VehicleListWindowWidgets {
   735 	VLW_WIDGET_CLOSEBOX = 0,
   742 	VLW_WIDGET_CLOSEBOX = 0,
   736 	VLW_WIDGET_CAPTION,
   743 	VLW_WIDGET_CAPTION,
   737 	VLW_WIDGET_STICKY,
   744 	VLW_WIDGET_STICKY,
   738 	VLW_WIDGET_SORT_ORDER,
   745 	VLW_WIDGET_SORT_ORDER,
   739 	VLW_WIDGET_SORT_BY_TEXT,
       
   740 	VLW_WIDGET_SORT_BY_PULLDOWN,
   746 	VLW_WIDGET_SORT_BY_PULLDOWN,
   741 	VLW_WIDGET_EMPTY_TOP_RIGHT,
   747 	VLW_WIDGET_EMPTY_TOP_RIGHT,
   742 	VLW_WIDGET_LIST,
   748 	VLW_WIDGET_LIST,
   743 	VLW_WIDGET_SCROLLBAR,
   749 	VLW_WIDGET_SCROLLBAR,
   744 	VLW_WIDGET_OTHER_PLAYER_FILLER,
   750 	VLW_WIDGET_OTHER_PLAYER_FILLER,
   745 	VLW_WIDGET_AVAILABLE_VEHICLES,
   751 	VLW_WIDGET_AVAILABLE_VEHICLES,
   746 	VLW_WIDGET_MANAGE_VEHICLES,
       
   747 	VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   752 	VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   748 	VLW_WIDGET_STOP_ALL,
   753 	VLW_WIDGET_STOP_ALL,
   749 	VLW_WIDGET_START_ALL,
   754 	VLW_WIDGET_START_ALL,
   750 	VLW_WIDGET_EMPTY_BOTTOM_RIGHT,
   755 	VLW_WIDGET_EMPTY_BOTTOM_RIGHT,
   751 	VLW_WIDGET_RESIZE,
   756 	VLW_WIDGET_RESIZE,
   754 static const Widget _vehicle_list_widgets[] = {
   759 static const Widget _vehicle_list_widgets[] = {
   755 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,             STR_018B_CLOSE_WINDOW},
   760 	{   WWT_CLOSEBOX,   RESIZE_NONE,    14,     0,    10,     0,    13, STR_00C5,             STR_018B_CLOSE_WINDOW},
   756 	{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   247,     0,    13, 0x0,                  STR_018C_WINDOW_TITLE_DRAG_THIS},
   761 	{    WWT_CAPTION,  RESIZE_RIGHT,    14,    11,   247,     0,    13, 0x0,                  STR_018C_WINDOW_TITLE_DRAG_THIS},
   757 	{  WWT_STICKYBOX,     RESIZE_LR,    14,   248,   259,     0,    13, 0x0,                  STR_STICKY_BUTTON},
   762 	{  WWT_STICKYBOX,     RESIZE_LR,    14,   248,   259,     0,    13, 0x0,                  STR_STICKY_BUTTON},
   758 	{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    80,    14,    25, STR_SORT_BY,          STR_SORT_ORDER_TIP},
   763 	{ WWT_PUSHTXTBTN,   RESIZE_NONE,    14,     0,    80,    14,    25, STR_SORT_BY,          STR_SORT_ORDER_TIP},
   759 	{      WWT_PANEL,   RESIZE_NONE,    14,    81,   235,    14,    25, 0x0,                  STR_SORT_CRITERIA_TIP},
   764 	{   WWT_DROPDOWN,   RESIZE_NONE,    14,    81,   247,    14,    25, 0x0,                  STR_SORT_CRITERIA_TIP},
   760 	{    WWT_TEXTBTN,   RESIZE_NONE,    14,   236,   247,    14,    25, STR_0225,             STR_SORT_CRITERIA_TIP},
       
   761 	{      WWT_PANEL,  RESIZE_RIGHT,    14,   248,   259,    14,    25, 0x0,                  STR_NULL},
   765 	{      WWT_PANEL,  RESIZE_RIGHT,    14,   248,   259,    14,    25, 0x0,                  STR_NULL},
   762 	{     WWT_MATRIX,     RESIZE_RB,    14,     0,   247,    26,   169, 0x0,                  STR_NULL},
   766 	{     WWT_MATRIX,     RESIZE_RB,    14,     0,   247,    26,   169, 0x0,                  STR_NULL},
   763 	{  WWT_SCROLLBAR,    RESIZE_LRB,    14,   248,   259,    26,   169, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
   767 	{  WWT_SCROLLBAR,    RESIZE_LRB,    14,   248,   259,    26,   169, 0x0,                  STR_0190_SCROLL_BAR_SCROLLS_LIST},
   764 	/* Widget to be shown for other players hiding the following 6 widgets */
   768 	/* Widget to be shown for other players hiding the following 6 widgets */
   765 	{      WWT_PANEL,    RESIZE_RTB,    14,     0,   247,   170,   181, 0x0,                  STR_NULL},
   769 	{      WWT_PANEL,    RESIZE_RTB,    14,     0,   247,   170,   181, 0x0,                  STR_NULL},
   766 
   770 
   767 	{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   105,   170,   181, 0x0,                  STR_AVAILABLE_ENGINES_TIP},
   771 	{ WWT_PUSHTXTBTN,     RESIZE_TB,    14,     0,   105,   170,   181, 0x0,                  STR_AVAILABLE_ENGINES_TIP},
   768 	{    WWT_TEXTBTN,     RESIZE_TB,    14,   106,   211,   170,   181, STR_MANAGE_LIST,      STR_MANAGE_LIST_TIP},
   772 	{   WWT_DROPDOWN,     RESIZE_TB,    14,   106,   223,   170,   181, STR_MANAGE_LIST,      STR_MANAGE_LIST_TIP},
   769 	{    WWT_TEXTBTN,     RESIZE_TB,    14,   212,   223,   170,   181, STR_0225,             STR_MANAGE_LIST_TIP},
       
   770 
   773 
   771 	{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   224,   235,   170,   181, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP},
   774 	{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   224,   235,   170,   181, SPR_FLAG_VEH_STOPPED, STR_MASS_STOP_LIST_TIP},
   772 	{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   236,   247,   170,   181, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP},
   775 	{ WWT_PUSHIMGBTN,     RESIZE_TB,    14,   236,   247,   170,   181, SPR_FLAG_VEH_RUNNING, STR_MASS_START_LIST_TIP},
   773 	{      WWT_PANEL,    RESIZE_RTB,    14,   248,   247,   170,   181, 0x0,                  STR_NULL},
   776 	{      WWT_PANEL,    RESIZE_RTB,    14,   248,   247,   170,   181, 0x0,                  STR_NULL},
   774 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   248,   259,   170,   181, 0x0,                  STR_RESIZE_BUTTON},
   777 	{  WWT_RESIZEBOX,   RESIZE_LRTB,    14,   248,   259,   170,   181, 0x0,                  STR_RESIZE_BUTTON},
   792 		w->HideWidget(VLW_WIDGET_OTHER_PLAYER_FILLER);
   795 		w->HideWidget(VLW_WIDGET_OTHER_PLAYER_FILLER);
   793 		w->SetWidgetDisabledState(VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD);
   796 		w->SetWidgetDisabledState(VLW_WIDGET_AVAILABLE_VEHICLES, window_type != VLW_STANDARD);
   794 	} else {
   797 	} else {
   795 		w->SetWidgetsHiddenState(true,
   798 		w->SetWidgetsHiddenState(true,
   796 			VLW_WIDGET_AVAILABLE_VEHICLES,
   799 			VLW_WIDGET_AVAILABLE_VEHICLES,
   797 			VLW_WIDGET_MANAGE_VEHICLES,
       
   798 			VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   800 			VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   799 			VLW_WIDGET_STOP_ALL,
   801 			VLW_WIDGET_STOP_ALL,
   800 			VLW_WIDGET_START_ALL,
   802 			VLW_WIDGET_START_ALL,
   801 			VLW_WIDGET_EMPTY_BOTTOM_RIGHT,
   803 			VLW_WIDGET_EMPTY_BOTTOM_RIGHT,
   802 			WIDGET_LIST_END);
   804 			WIDGET_LIST_END);
   927 	int x = 2;
   929 	int x = 2;
   928 	int y = PLY_WND_PRC__OFFSET_TOP_WIDGET;
   930 	int y = PLY_WND_PRC__OFFSET_TOP_WIDGET;
   929 	int max;
   931 	int max;
   930 	int i;
   932 	int i;
   931 	const PlayerID owner = (PlayerID)w->caption_color;
   933 	const PlayerID owner = (PlayerID)w->caption_color;
   932 	const Player *p = GetPlayer(owner);
       
   933 	const uint16 window_type = w->window_number & VLW_MASK;
   934 	const uint16 window_type = w->window_number & VLW_MASK;
   934 	const uint16 index = GB(w->window_number, 16, 16);
   935 	const uint16 index = GB(w->window_number, 16, 16);
   935 
   936 
   936 	BuildVehicleList(vl, owner, index, window_type);
   937 	BuildVehicleList(vl, owner, index, window_type);
   937 	SortVehicleList(vl);
   938 	SortVehicleList(vl);
   947 			}
   948 			}
   948 			SetDParam(0, w->vscroll.count);
   949 			SetDParam(0, w->vscroll.count);
   949 			break;
   950 			break;
   950 
   951 
   951 		case VLW_STANDARD: /* Company Name */
   952 		case VLW_STANDARD: /* Company Name */
   952 			SetDParam(0, p->index);
   953 			SetDParam(0, owner);
   953 			SetDParam(1, w->vscroll.count);
   954 			SetDParam(1, w->vscroll.count);
   954 			break;
   955 			break;
   955 
   956 
   956 		case VLW_STATION_LIST: /* Station Name */
   957 		case VLW_STATION_LIST: /* Station Name */
   957 			SetDParam(0, index);
   958 			SetDParam(0, index);
   975 			break;
   976 			break;
   976 		default: NOT_REACHED(); break;
   977 		default: NOT_REACHED(); break;
   977 	}
   978 	}
   978 
   979 
   979 	w->SetWidgetsDisabledState(vl->l.list_length == 0,
   980 	w->SetWidgetsDisabledState(vl->l.list_length == 0,
   980 		VLW_WIDGET_MANAGE_VEHICLES,
       
   981 		VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   981 		VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN,
   982 		VLW_WIDGET_STOP_ALL,
   982 		VLW_WIDGET_STOP_ALL,
   983 		VLW_WIDGET_START_ALL,
   983 		VLW_WIDGET_START_ALL,
   984 		WIDGET_LIST_END);
   984 		WIDGET_LIST_END);
   985 
   985 
   986 	DrawWindowWidgets(w);
   986 	DrawWindowWidgets(w);
   987 
   987 
   988 	/* draw sorting criteria string */
   988 	/* draw sorting criteria string */
   989 	DrawString(85, 15, _vehicle_sort_listing[vl->l.sort_type], TC_BLACK);
   989 	DrawString(85, 15, _vehicle_sort_listing[vl->l.sort_type], TC_BLACK);
   990 	/* draw arrow pointing up/down for ascending/descending sorting */
   990 	/* draw arrow pointing up/down for ascending/descending sorting */
   991 	DoDrawString(vl->l.flags & VL_DESC ? DOWNARROW : UPARROW, 69, 15, TC_BLACK);
   991 	DrawSortButtonState(w, VLW_WIDGET_SORT_ORDER, vl->l.flags & VL_DESC ? SBS_DOWN : SBS_UP);
   992 
   992 
   993 	max = min(w->vscroll.pos + w->vscroll.cap, vl->l.list_length);
   993 	max = min(w->vscroll.pos + w->vscroll.cap, vl->l.list_length);
   994 	for (i = w->vscroll.pos; i < max; ++i) {
   994 	for (i = w->vscroll.pos; i < max; ++i) {
   995 		const Vehicle *v = vl->sort_list[i];
   995 		const Vehicle *v = vl->sort_list[i];
   996 		StringID str;
   996 		StringID str;
   997 
   997 
   998 		SetDParam(0, v->profit_this_year);
   998 		SetDParam(0, v->profit_this_year);
   999 		SetDParam(1, v->profit_last_year);
   999 		SetDParam(1, v->profit_last_year);
  1000 
  1000 
  1001 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
  1001 		DrawVehicleImage(v, x + 19, y + 6, INVALID_VEHICLE, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0);
  1002 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
  1002 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, TC_FROMSTRING);
  1003 
  1003 
  1004 		if ((v->type == VEH_TRAIN    && v->string_id != STR_SV_TRAIN_NAME)   ||
  1004 		if (v->name != NULL) {
  1005 			(v->type == VEH_ROAD     && v->string_id != STR_SV_ROADVEH_NAME) ||
       
  1006 			(v->type == VEH_SHIP     && v->string_id != STR_SV_SHIP_NAME)    ||
       
  1007 			(v->type == VEH_AIRCRAFT && v->string_id != STR_SV_AIRCRAFT_NAME)) {
       
  1008 
       
  1009 			/* The vehicle got a name so we will print it */
  1005 			/* The vehicle got a name so we will print it */
  1010 			SetDParam(0, v->index);
  1006 			SetDParam(0, v->index);
  1011 			DrawString(x + 19, y, STR_01AB, TC_FROMSTRING);
  1007 			DrawString(x + 19, y, STR_01AB, TC_FROMSTRING);
  1012 		}
  1008 		}
  1013 
  1009 
  1055 					vl->l.flags |= VL_RESORT;
  1051 					vl->l.flags |= VL_RESORT;
  1056 
  1052 
  1057 					vl->_sorting->order = !!(vl->l.flags & VL_DESC);
  1053 					vl->_sorting->order = !!(vl->l.flags & VL_DESC);
  1058 					SetWindowDirty(w);
  1054 					SetWindowDirty(w);
  1059 					break;
  1055 					break;
  1060 				case VLW_WIDGET_SORT_BY_TEXT: case VLW_WIDGET_SORT_BY_PULLDOWN:/* Select sorting criteria dropdown menu */
  1056 				case VLW_WIDGET_SORT_BY_PULLDOWN:/* Select sorting criteria dropdown menu */
  1061 					ShowDropDownMenu(w, _vehicle_sort_listing, vl->l.sort_type, VLW_WIDGET_SORT_BY_PULLDOWN, 0, 0);
  1057 					ShowDropDownMenu(w, _vehicle_sort_listing, vl->l.sort_type, VLW_WIDGET_SORT_BY_PULLDOWN, 0, 0);
  1062 					return;
  1058 					return;
  1063 				case VLW_WIDGET_LIST: { /* Matrix to show vehicles */
  1059 				case VLW_WIDGET_LIST: { /* Matrix to show vehicles */
  1064 					uint32 id_v = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / w->resize.step_height;
  1060 					uint32 id_v = (e->we.click.pt.y - PLY_WND_PRC__OFFSET_TOP_WIDGET) / w->resize.step_height;
  1065 					const Vehicle *v;
  1061 					const Vehicle *v;
  1077 
  1073 
  1078 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1074 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1079 					ShowBuildVehicleWindow(0, vl->vehicle_type);
  1075 					ShowBuildVehicleWindow(0, vl->vehicle_type);
  1080 					break;
  1076 					break;
  1081 
  1077 
  1082 				case VLW_WIDGET_MANAGE_VEHICLES:
       
  1083 				case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: {
  1078 				case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN: {
  1084 					static StringID action_str[] = {
  1079 					static StringID action_str[] = {
  1085 						STR_REPLACE_VEHICLES,
  1080 						STR_REPLACE_VEHICLES,
  1086 						STR_SEND_FOR_SERVICING,
  1081 						STR_SEND_FOR_SERVICING,
  1087 						STR_NULL,
  1082 						STR_NULL,
  1121 				case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN:
  1116 				case VLW_WIDGET_MANAGE_VEHICLES_DROPDOWN:
  1122 					assert(vl->l.list_length != 0);
  1117 					assert(vl->l.list_length != 0);
  1123 
  1118 
  1124 					switch (e->we.dropdown.index) {
  1119 					switch (e->we.dropdown.index) {
  1125 						case 0: /* Replace window */
  1120 						case 0: /* Replace window */
  1126 							ShowReplaceVehicleWindow(vl->vehicle_type);
  1121 							ShowReplaceGroupVehicleWindow(DEFAULT_GROUP, vl->vehicle_type);
  1127 							break;
  1122 							break;
  1128 						case 1: /* Send for servicing */
  1123 						case 1: /* Send for servicing */
  1129 							DoCommandP(0, GB(w->window_number, 16, 16) /* StationID or OrderID (depending on VLW) */,
  1124 							DoCommandP(0, GB(w->window_number, 16, 16) /* StationID or OrderID (depending on VLW) */,
  1130 								(w->window_number & VLW_MASK) | DEPOT_MASS_SEND | DEPOT_SERVICE,
  1125 								(w->window_number & VLW_MASK) | DEPOT_MASS_SEND | DEPOT_SERVICE,
  1131 								NULL,
  1126 								NULL,
  1149 		case WE_DESTROY:
  1144 		case WE_DESTROY:
  1150 			free((void*)vl->sort_list);
  1145 			free((void*)vl->sort_list);
  1151 			break;
  1146 			break;
  1152 
  1147 
  1153 		case WE_TICK: /* resort the list every 20 seconds orso (10 days) */
  1148 		case WE_TICK: /* resort the list every 20 seconds orso (10 days) */
       
  1149 			if (_pause_game != 0) break;
  1154 			if (--vl->l.resort_timer == 0) {
  1150 			if (--vl->l.resort_timer == 0) {
  1155 				StationID station = ((w->window_number & VLW_MASK) == VLW_STATION_LIST) ? GB(w->window_number, 16, 16) : INVALID_STATION;
  1151 				StationID station = ((w->window_number & VLW_MASK) == VLW_STATION_LIST) ? GB(w->window_number, 16, 16) : INVALID_STATION;
  1156 				PlayerID owner = (PlayerID)w->caption_color;
  1152 				PlayerID owner = (PlayerID)w->caption_color;
  1157 
  1153 
  1158 				DEBUG(misc, 3, "Periodic resort %d list player %d at station %d", vl->vehicle_type, owner, station);
  1154 				DEBUG(misc, 3, "Periodic resort %d list player %d at station %d", vl->vehicle_type, owner, station);
  1536 			break;
  1532 			break;
  1537 
  1533 
  1538 		case VEH_ROAD:
  1534 		case VEH_ROAD:
  1539 		case VEH_SHIP:
  1535 		case VEH_SHIP:
  1540 		case VEH_AIRCRAFT:
  1536 		case VEH_AIRCRAFT:
  1541 			DrawVehicleImage(v, 3, 57, 0, 0, INVALID_VEHICLE);
  1537 			DrawVehicleImage(v, 3, 57, INVALID_VEHICLE, 0, 0);
  1542 			DrawVehicleDetails(v, 75, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
  1538 			DrawVehicleDetails(v, 75, 57, w->vscroll.pos, w->vscroll.cap, det_tab);
  1543 			break;
  1539 			break;
  1544 
  1540 
  1545 		default: NOT_REACHED();
  1541 		default: NOT_REACHED();
  1546 	}
  1542 	}
  1646 	AllocateWindowDescFront(&_vehicle_details_desc, v->index);
  1642 	AllocateWindowDescFront(&_vehicle_details_desc, v->index);
  1647 }
  1643 }
  1648 
  1644 
  1649 
  1645 
  1650 /* Unified vehicle GUI - Vehicle View Window */
  1646 /* Unified vehicle GUI - Vehicle View Window */
  1651 
       
  1652 /** Constants of vehicle view widget indices */
       
  1653 enum VehicleViewWindowWidgets {
       
  1654 	VVW_WIDGET_CLOSEBOX = 0,
       
  1655 	VVW_WIDGET_CAPTION,
       
  1656 	VVW_WIDGET_STICKY,
       
  1657 	VVW_WIDGET_PANEL,
       
  1658 	VVW_WIDGET_VIEWPORT,
       
  1659 	VVW_WIDGET_START_STOP_VEH,
       
  1660 	VVW_WIDGET_CENTER_MAIN_VIEH,
       
  1661 	VVW_WIDGET_GOTO_DEPOT,
       
  1662 	VVW_WIDGET_REFIT_VEH,
       
  1663 	VVW_WIDGET_SHOW_ORDERS,
       
  1664 	VVW_WIDGET_SHOW_DETAILS,
       
  1665 	VVW_WIDGET_CLONE_VEH,
       
  1666 	VVW_WIDGET_EMPTY_BOTTOM_RIGHT,
       
  1667 	VVW_WIDGET_RESIZE,
       
  1668 	VVW_WIDGET_TURN_AROUND,
       
  1669 	VVW_WIDGET_FORCE_PROCEED,
       
  1670 };
       
  1671 
  1647 
  1672 /** Vehicle view widgets. */
  1648 /** Vehicle view widgets. */
  1673 static const Widget _vehicle_view_widgets[] = {
  1649 static const Widget _vehicle_view_widgets[] = {
  1674 	{   WWT_CLOSEBOX,  RESIZE_NONE,  14,   0,  10,   0,  13, STR_00C5,                 STR_018B_CLOSE_WINDOW },           // VVW_WIDGET_CLOSEBOX
  1650 	{   WWT_CLOSEBOX,  RESIZE_NONE,  14,   0,  10,   0,  13, STR_00C5,                 STR_018B_CLOSE_WINDOW },           // VVW_WIDGET_CLOSEBOX
  1675 	{    WWT_CAPTION, RESIZE_RIGHT,  14,  11, 237,   0,  13, 0x0 /* filled later */,   STR_018C_WINDOW_TITLE_DRAG_THIS }, // VVW_WIDGET_CAPTION
  1651 	{    WWT_CAPTION, RESIZE_RIGHT,  14,  11, 237,   0,  13, 0x0 /* filled later */,   STR_018C_WINDOW_TITLE_DRAG_THIS }, // VVW_WIDGET_CAPTION
  1985 				} else {
  1961 				} else {
  1986 					Depot *depot = GetDepot(v->current_order.dest);
  1962 					Depot *depot = GetDepot(v->current_order.dest);
  1987 					SetDParam(0, depot->town_index);
  1963 					SetDParam(0, depot->town_index);
  1988 					SetDParam(1, v->GetDisplaySpeed());
  1964 					SetDParam(1, v->GetDisplaySpeed());
  1989 				}
  1965 				}
  1990 				if (HasBit(v->current_order.flags, OFB_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OFB_PART_OF_ORDERS)) {
  1966 				if (HasBit(v->current_order.flags, OF_HALT_IN_DEPOT) && !HasBit(v->current_order.flags, OF_PART_OF_ORDERS)) {
  1991 					str = _heading_for_depot_strings[v->type] + _patches.vehicle_speed;
  1967 					str = _heading_for_depot_strings[v->type] + _patches.vehicle_speed;
  1992 				} else {
  1968 				} else {
  1993 					str = _heading_for_depot_service_strings[v->type] + _patches.vehicle_speed;
  1969 					str = _heading_for_depot_service_strings[v->type] + _patches.vehicle_speed;
  1994 				}
  1970 				}
  1995 			} break;
  1971 			} break;
  2160 				SetWindowDirty(w);
  2136 				SetWindowDirty(w);
  2161 			}
  2137 			}
  2162 		} break;
  2138 		} break;
  2163 	}
  2139 	}
  2164 }
  2140 }
       
  2141 
       
  2142 void DrawVehicleImage(const Vehicle *v, int x, int y, VehicleID selection, int count, int skip)
       
  2143 {
       
  2144 	switch (v->type) {
       
  2145 		case VEH_TRAIN:    DrawTrainImage(v, x, y, selection, count, skip); break;
       
  2146 		case VEH_ROAD:     DrawRoadVehImage(v, x, y, selection, count);     break;
       
  2147 		case VEH_SHIP:     DrawShipImage(v, x, y, selection);               break;
       
  2148 		case VEH_AIRCRAFT: DrawAircraftImage(v, x, y, selection);           break;
       
  2149 		default: NOT_REACHED();
       
  2150 	}
       
  2151 }