src/vehicle_gui.cpp
branchcpp_gui
changeset 6298 c30fe89622df
parent 6268 4b5241e5dd10
child 6303 84c215fc8eb8
equal deleted inserted replaced
6297:4bf29d14edba 6298:c30fe89622df
    28 #include "roadveh.h"
    28 #include "roadveh.h"
    29 #include "depot.h"
    29 #include "depot.h"
    30 #include "helpers.hpp"
    30 #include "helpers.hpp"
    31 #include "cargotype.h"
    31 #include "cargotype.h"
    32 
    32 
    33 typedef struct Sorting {
    33 struct Sorting {
    34 	Listing aircraft;
    34 	Listing aircraft;
    35 	Listing roadveh;
    35 	Listing roadveh;
    36 	Listing ship;
    36 	Listing ship;
    37 	Listing train;
    37 	Listing train;
    38 } Sorting;
    38 };
    39 
    39 
    40 static Sorting _sorting;
    40 static Sorting _sorting;
    41 
    41 
    42 typedef struct vehiclelist_d {
    42 struct vehiclelist_d {
    43 	const Vehicle** sort_list;  // List of vehicles (sorted)
    43 	const Vehicle** sort_list;  // List of vehicles (sorted)
    44 	Listing *_sorting;          // pointer to the appropiate subcategory of _sorting
    44 	Listing *_sorting;          // pointer to the appropiate subcategory of _sorting
    45 	uint16 length_of_sort_list; // Keeps track of how many vehicle pointers sort list got space for
    45 	uint16 length_of_sort_list; // Keeps track of how many vehicle pointers sort list got space for
    46 	byte vehicle_type;          // The vehicle type that is sorted
    46 	byte vehicle_type;          // The vehicle type that is sorted
    47 	list_d l;                   // General list struct
    47 	list_d l;                   // General list struct
    48 } vehiclelist_d;
    48 };
    49 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehiclelist_d));
    49 assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vehiclelist_d));
    50 
    50 
    51 static bool   _internal_sort_order;     // descending/ascending
    51 static bool   _internal_sort_order;     // descending/ascending
    52 
    52 
    53 typedef int CDECL VehicleSortListingTypeFunction(const void*, const void*);
    53 typedef int CDECL VehicleSortListingTypeFunction(const void*, const void*);
    88 	STR_SORT_BY_MODEL,
    88 	STR_SORT_BY_MODEL,
    89 	STR_SORT_BY_VALUE,
    89 	STR_SORT_BY_VALUE,
    90 	INVALID_STRING_ID
    90 	INVALID_STRING_ID
    91 };
    91 };
    92 
    92 
    93 void RebuildVehicleLists(void)
    93 void RebuildVehicleLists()
    94 {
    94 {
    95 	BaseWindow *w = NULL;
    95 	BaseWindow *w = NULL;
    96 
    96 
    97 	FOR_ALL_WINDOWS(w) {
    97 	FOR_ALL_WINDOWS(w) {
    98 		switch (w->window_class) {
    98 		switch (w->window_class) {
   107 			default: break;
   107 			default: break;
   108 		}
   108 		}
   109 	}
   109 	}
   110 }
   110 }
   111 
   111 
   112 void ResortVehicleLists(void)
   112 void ResortVehicleLists()
   113 {
   113 {
   114 	BaseWindow *w = NULL;
   114 	BaseWindow *w = NULL;
   115 
   115 
   116 	FOR_ALL_WINDOWS(w) {
   116 	FOR_ALL_WINDOWS(w) {
   117 
   117 
   175 		pal = PALETTE_TO_GREEN;
   175 		pal = PALETTE_TO_GREEN;
   176 	}
   176 	}
   177 	DrawSprite(SPR_BLOT, pal, x, y);
   177 	DrawSprite(SPR_BLOT, pal, x, y);
   178 }
   178 }
   179 
   179 
   180 typedef struct RefitOption {
   180 struct RefitOption {
   181 	CargoID cargo;
   181 	CargoID cargo;
   182 	byte subtype;
   182 	byte subtype;
   183 	uint16 value;
   183 	uint16 value;
   184 	EngineID engine;
   184 	EngineID engine;
   185 } RefitOption;
   185 };
   186 
   186 
   187 typedef struct RefitList {
   187 struct RefitList {
   188 	uint num_lines;
   188 	uint num_lines;
   189 	RefitOption *items;
   189 	RefitOption *items;
   190 } RefitList;
   190 };
   191 
   191 
   192 static RefitList *BuildRefitList(const Vehicle *v)
   192 static RefitList *BuildRefitList(const Vehicle *v)
   193 {
   193 {
   194 	uint max_lines = 256;
   194 	uint max_lines = 256;
   195 	RefitOption *refit = CallocT<RefitOption>(max_lines);
   195 	RefitOption *refit = CallocT<RefitOption>(max_lines);
   262 					refit[num_lines].engine  = INVALID_ENGINE;
   262 					refit[num_lines].engine  = INVALID_ENGINE;
   263 					num_lines++;
   263 					num_lines++;
   264 				}
   264 				}
   265 			}
   265 			}
   266 		}
   266 		}
   267 	} while (v->type == VEH_Train && (u = u->next) != NULL && num_lines < max_lines);
   267 	} while (v->type == VEH_TRAIN && (u = u->next) != NULL && num_lines < max_lines);
   268 
   268 
   269 	list->num_lines = num_lines;
   269 	list->num_lines = num_lines;
   270 	list->items = refit;
   270 	list->items = refit;
   271 
   271 
   272 	return list;
   272 	return list;
   315 {
   315 {
   316 	switch (e->event) {
   316 	switch (e->event) {
   317 		case WE_PAINT: {
   317 		case WE_PAINT: {
   318 			Vehicle *v = GetVehicle(w->window_number);
   318 			Vehicle *v = GetVehicle(w->window_number);
   319 
   319 
   320 			if (v->type == VEH_Train) {
   320 			if (v->type == VEH_TRAIN) {
   321 				uint length = CountVehiclesInChain(v);
   321 				uint length = CountVehiclesInChain(v);
   322 
   322 
   323 				if (length != WP(w, refit_d).length) {
   323 				if (length != WP(w, refit_d).length) {
   324 					/* Consist length has changed, so rebuild the refit list */
   324 					/* Consist length has changed, so rebuild the refit list */
   325 					free(WP(w, refit_d).list->items);
   325 					free(WP(w, refit_d).list->items);
   367 
   367 
   368 						if (WP(w, refit_d).order == INVALID_VEH_ORDER_ID) {
   368 						if (WP(w, refit_d).order == INVALID_VEH_ORDER_ID) {
   369 							int command = 0;
   369 							int command = 0;
   370 
   370 
   371 							switch (v->type) {
   371 							switch (v->type) {
   372 								case VEH_Train:    command = CMD_REFIT_RAIL_VEHICLE | CMD_MSG(STR_RAIL_CAN_T_REFIT_VEHICLE);  break;
   372 								case VEH_TRAIN:    command = CMD_REFIT_RAIL_VEHICLE | CMD_MSG(STR_RAIL_CAN_T_REFIT_VEHICLE);  break;
   373 								case VEH_Road:     command = CMD_REFIT_ROAD_VEH     | CMD_MSG(STR_REFIT_ROAD_VEHICLE_CAN_T);  break;
   373 								case VEH_ROAD:     command = CMD_REFIT_ROAD_VEH     | CMD_MSG(STR_REFIT_ROAD_VEHICLE_CAN_T);  break;
   374 								case VEH_Ship:     command = CMD_REFIT_SHIP         | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP);     break;
   374 								case VEH_SHIP:     command = CMD_REFIT_SHIP         | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP);     break;
   375 								case VEH_Aircraft: command = CMD_REFIT_AIRCRAFT     | CMD_MSG(STR_A042_CAN_T_REFIT_AIRCRAFT); break;
   375 								case VEH_AIRCRAFT: command = CMD_REFIT_AIRCRAFT     | CMD_MSG(STR_A042_CAN_T_REFIT_AIRCRAFT); break;
   376 							}
   376 							}
   377 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, NULL, command)) w->Close();
   377 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, NULL, command)) w->Close();
   378 						} else {
   378 						} else {
   379 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8 | WP(w, refit_d).order << 16, NULL, CMD_ORDER_REFIT)) w->Close();
   379 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8 | WP(w, refit_d).order << 16, NULL, CMD_ORDER_REFIT)) w->Close();
   380 						}
   380 						}
   432 		w->caption_color = v->owner;
   432 		w->caption_color = v->owner;
   433 		w->vscroll.cap = 8;
   433 		w->vscroll.cap = 8;
   434 		w->resize.step_height = 14;
   434 		w->resize.step_height = 14;
   435 		WP(w, refit_d).sel  = -1;
   435 		WP(w, refit_d).sel  = -1;
   436 		WP(w, refit_d).list = BuildRefitList(v);
   436 		WP(w, refit_d).list = BuildRefitList(v);
   437 		if (v->type == VEH_Train) WP(w, refit_d).length = CountVehiclesInChain(v);
   437 		if (v->type == VEH_TRAIN) WP(w, refit_d).length = CountVehiclesInChain(v);
   438 		SetVScrollCount(w, WP(w, refit_d).list->num_lines);
   438 		SetVScrollCount(w, WP(w, refit_d).list->num_lines);
   439 
   439 
   440 		switch (v->type) {
   440 		switch (v->type) {
   441 			case VEH_Train:
   441 			case VEH_TRAIN:
   442 				w->widget[3].tooltips = STR_RAIL_SELECT_TYPE_OF_CARGO_FOR;
   442 				w->widget[3].tooltips = STR_RAIL_SELECT_TYPE_OF_CARGO_FOR;
   443 				w->widget[6].data     = STR_RAIL_REFIT_VEHICLE;
   443 				w->widget[6].data     = STR_RAIL_REFIT_VEHICLE;
   444 				w->widget[6].tooltips = STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED;
   444 				w->widget[6].tooltips = STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED;
   445 				break;
   445 				break;
   446 			case VEH_Road:
   446 			case VEH_ROAD:
   447 				w->widget[3].tooltips = STR_ROAD_SELECT_TYPE_OF_CARGO_FOR;
   447 				w->widget[3].tooltips = STR_ROAD_SELECT_TYPE_OF_CARGO_FOR;
   448 				w->widget[6].data     = STR_REFIT_ROAD_VEHICLE;
   448 				w->widget[6].data     = STR_REFIT_ROAD_VEHICLE;
   449 				w->widget[6].tooltips = STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED;
   449 				w->widget[6].tooltips = STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED;
   450 				break;
   450 				break;
   451 			case VEH_Ship:
   451 			case VEH_SHIP:
   452 				w->widget[3].tooltips = STR_983D_SELECT_TYPE_OF_CARGO_FOR;
   452 				w->widget[3].tooltips = STR_983D_SELECT_TYPE_OF_CARGO_FOR;
   453 				w->widget[6].data     = STR_983C_REFIT_SHIP;
   453 				w->widget[6].data     = STR_983C_REFIT_SHIP;
   454 				w->widget[6].tooltips = STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED;
   454 				w->widget[6].tooltips = STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED;
   455 				break;
   455 				break;
   456 			case VEH_Aircraft:
   456 			case VEH_AIRCRAFT:
   457 				w->widget[3].tooltips = STR_A03E_SELECT_TYPE_OF_CARGO_FOR;
   457 				w->widget[3].tooltips = STR_A03E_SELECT_TYPE_OF_CARGO_FOR;
   458 				w->widget[6].data     = STR_A03D_REFIT_AIRCRAFT;
   458 				w->widget[6].data     = STR_A03D_REFIT_AIRCRAFT;
   459 				w->widget[6].tooltips = STR_A03F_REFIT_AIRCRAFT_TO_CARRY;
   459 				w->widget[6].tooltips = STR_A03F_REFIT_AIRCRAFT_TO_CARRY;
   460 				break;
   460 				break;
   461 			default: NOT_REACHED();
   461 			default: NOT_REACHED();
   647 	const Vehicle* vb = *(const Vehicle**)b;
   647 	const Vehicle* vb = *(const Vehicle**)b;
   648 	int max_speed_a = 0xFFFF, max_speed_b = 0xFFFF;
   648 	int max_speed_a = 0xFFFF, max_speed_b = 0xFFFF;
   649 	int r;
   649 	int r;
   650 	const Vehicle *ua = va, *ub = vb;
   650 	const Vehicle *ua = va, *ub = vb;
   651 
   651 
   652 	if (va->type == VEH_Train && vb->type == VEH_Train) {
   652 	if (va->type == VEH_TRAIN && vb->type == VEH_TRAIN) {
   653 		do {
   653 		do {
   654 			if (RailVehInfo(ua->engine_type)->max_speed != 0)
   654 			if (RailVehInfo(ua->engine_type)->max_speed != 0)
   655 				max_speed_a = min(max_speed_a, RailVehInfo(ua->engine_type)->max_speed);
   655 				max_speed_a = min(max_speed_a, RailVehInfo(ua->engine_type)->max_speed);
   656 		} while ((ua = ua->next) != NULL);
   656 		} while ((ua = ua->next) != NULL);
   657 
   657 
   697 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   697 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   698 
   698 
   699 	return (_internal_sort_order & 1) ? -r : r;
   699 	return (_internal_sort_order & 1) ? -r : r;
   700 }
   700 }
   701 
   701 
   702 void InitializeGUI(void)
   702 void InitializeGUI()
   703 {
   703 {
   704 	memset(&_sorting, 0, sizeof(_sorting));
   704 	memset(&_sorting, 0, sizeof(_sorting));
   705 }
   705 }
   706 
   706 
   707 /** Assigns an already open vehicle window to a new vehicle.
   707 /** Assigns an already open vehicle window to a new vehicle.
   821 			WIDGET_LIST_END);
   821 			WIDGET_LIST_END);
   822 	}
   822 	}
   823 
   823 
   824 	/* Set up the window widgets */
   824 	/* Set up the window widgets */
   825 	switch (vl->vehicle_type) {
   825 	switch (vl->vehicle_type) {
   826 		case VEH_Train:
   826 		case VEH_TRAIN:
   827 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
   827 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
   828 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
   828 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
   829 			break;
   829 			break;
   830 
   830 
   831 		case VEH_Road:
   831 		case VEH_ROAD:
   832 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_901A_ROAD_VEHICLES_CLICK_ON;
   832 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_901A_ROAD_VEHICLES_CLICK_ON;
   833 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
   833 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
   834 			break;
   834 			break;
   835 
   835 
   836 		case VEH_Ship:
   836 		case VEH_SHIP:
   837 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
   837 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
   838 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
   838 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
   839 			break;
   839 			break;
   840 
   840 
   841 		case VEH_Aircraft:
   841 		case VEH_AIRCRAFT:
   842 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
   842 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
   843 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
   843 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
   844 			break;
   844 			break;
   845 
   845 
   846 		default: NOT_REACHED();
   846 		default: NOT_REACHED();
   850 		case VLW_SHARED_ORDERS:
   850 		case VLW_SHARED_ORDERS:
   851 			w->widget[VLW_WIDGET_CAPTION].data  = STR_VEH_WITH_SHARED_ORDERS_LIST;
   851 			w->widget[VLW_WIDGET_CAPTION].data  = STR_VEH_WITH_SHARED_ORDERS_LIST;
   852 			break;
   852 			break;
   853 		case VLW_STANDARD: /* Company Name - standard widget setup */
   853 		case VLW_STANDARD: /* Company Name - standard widget setup */
   854 			switch (vl->vehicle_type) {
   854 			switch (vl->vehicle_type) {
   855 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_881B_TRAINS;        break;
   855 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_881B_TRAINS;        break;
   856 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_9001_ROAD_VEHICLES; break;
   856 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_9001_ROAD_VEHICLES; break;
   857 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_9805_SHIPS;         break;
   857 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_9805_SHIPS;         break;
   858 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_A009_AIRCRAFT;      break;
   858 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_A009_AIRCRAFT;      break;
   859 				default: NOT_REACHED(); break;
   859 				default: NOT_REACHED(); break;
   860 			}
   860 			}
   861 			break;
   861 			break;
   862 		case VLW_STATION_LIST: /* Station Name */
   862 		case VLW_STATION_LIST: /* Station Name */
   863 			switch (vl->vehicle_type) {
   863 			switch (vl->vehicle_type) {
   864 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_TRAINS;        break;
   864 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_TRAINS;        break;
   865 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_ROAD_VEHICLES; break;
   865 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_ROAD_VEHICLES; break;
   866 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_SHIPS;         break;
   866 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_SHIPS;         break;
   867 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_AIRCRAFT;      break;
   867 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_AIRCRAFT;      break;
   868 				default: NOT_REACHED(); break;
   868 				default: NOT_REACHED(); break;
   869 			}
   869 			}
   870 			break;
   870 			break;
   871 
   871 
   872 		case VLW_DEPOT_LIST:
   872 		case VLW_DEPOT_LIST:
   873 			switch (vl->vehicle_type) {
   873 			switch (vl->vehicle_type) {
   874 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_TRAIN_DEPOT;    break;
   874 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_TRAIN_DEPOT;    break;
   875 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_ROADVEH_DEPOT;  break;
   875 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_ROADVEH_DEPOT;  break;
   876 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_SHIP_DEPOT;     break;
   876 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_SHIP_DEPOT;     break;
   877 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_AIRCRAFT_DEPOT; break;
   877 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_AIRCRAFT_DEPOT; break;
   878 				default: NOT_REACHED(); break;
   878 				default: NOT_REACHED(); break;
   879 			}
   879 			}
   880 			break;
   880 			break;
   881 		default: NOT_REACHED(); break;
   881 		default: NOT_REACHED(); break;
   882 	}
   882 	}
   883 
   883 
   884 	switch (vl->vehicle_type) {
   884 	switch (vl->vehicle_type) {
   885 		case VEH_Train:
   885 		case VEH_TRAIN:
   886 			w->resize.step_width = 1;
   886 			w->resize.step_width = 1;
   887 			/* Fallthrough */
   887 			/* Fallthrough */
   888 		case VEH_Road:
   888 		case VEH_ROAD:
   889 			w->vscroll.cap = 7;
   889 			w->vscroll.cap = 7;
   890 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL;
   890 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL;
   891 			w->resize.height = 220 - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 3); // Minimum of 4 vehicles
   891 			w->resize.height = 220 - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 3); // Minimum of 4 vehicles
   892 			break;
   892 			break;
   893 		case VEH_Ship:
   893 		case VEH_SHIP:
   894 		case VEH_Aircraft:
   894 		case VEH_AIRCRAFT:
   895 			w->vscroll.cap = 4;
   895 			w->vscroll.cap = 4;
   896 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_BIG;
   896 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_BIG;
   897 			break;
   897 			break;
   898 		default: NOT_REACHED();
   898 		default: NOT_REACHED();
   899 	}
   899 	}
   902 
   902 
   903 	/* Set up sorting. Make the window-specific _sorting variable
   903 	/* Set up sorting. Make the window-specific _sorting variable
   904 		* point to the correct global _sorting struct so we are freed
   904 		* point to the correct global _sorting struct so we are freed
   905 		* from having conditionals during window operation */
   905 		* from having conditionals during window operation */
   906 	switch (vl->vehicle_type) {
   906 	switch (vl->vehicle_type) {
   907 		case VEH_Train:    vl->_sorting = &_sorting.train; break;
   907 		case VEH_TRAIN:    vl->_sorting = &_sorting.train; break;
   908 		case VEH_Road:     vl->_sorting = &_sorting.roadveh; break;
   908 		case VEH_ROAD:     vl->_sorting = &_sorting.roadveh; break;
   909 		case VEH_Ship:     vl->_sorting = &_sorting.ship; break;
   909 		case VEH_SHIP:     vl->_sorting = &_sorting.ship; break;
   910 		case VEH_Aircraft: vl->_sorting = &_sorting.aircraft; break;
   910 		case VEH_AIRCRAFT: vl->_sorting = &_sorting.aircraft; break;
   911 		default: NOT_REACHED(); break;
   911 		default: NOT_REACHED(); break;
   912 	}
   912 	}
   913 
   913 
   914 	vl->l.flags = VL_REBUILD | (vl->_sorting->order ? VL_DESC : VL_NONE);
   914 	vl->l.flags = VL_REBUILD | (vl->_sorting->order ? VL_DESC : VL_NONE);
   915 	vl->l.sort_type = vl->_sorting->criteria;
   915 	vl->l.sort_type = vl->_sorting->criteria;
   927 	FOR_VEHICLE_ORDERS(v, order) {
   927 	FOR_VEHICLE_ORDERS(v, order) {
   928 		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, 16);
   928 		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, 16);
   929 		sel--;
   929 		sel--;
   930 
   930 
   931 		if (order->type == OT_GOTO_STATION) {
   931 		if (order->type == OT_GOTO_STATION) {
   932 			if (v->type == VEH_Ship && GetStation(order->dest)->IsBuoy()) continue;
   932 			if (v->type == VEH_SHIP && GetStation(order->dest)->IsBuoy()) continue;
   933 
   933 
   934 			SetDParam(0, order->dest);
   934 			SetDParam(0, order->dest);
   935 			DrawString(x, y, STR_A036, 0);
   935 			DrawString(x, y, STR_A036, 0);
   936 
   936 
   937 			y += 6;
   937 			y += 6;
   978 			SetDParam(1, w->vscroll.count);
   978 			SetDParam(1, w->vscroll.count);
   979 			break;
   979 			break;
   980 
   980 
   981 		case VLW_DEPOT_LIST:
   981 		case VLW_DEPOT_LIST:
   982 			switch (vl->vehicle_type) {
   982 			switch (vl->vehicle_type) {
   983 				case VEH_Train:    SetDParam(0, STR_8800_TRAIN_DEPOT);        break;
   983 				case VEH_TRAIN:    SetDParam(0, STR_8800_TRAIN_DEPOT);        break;
   984 				case VEH_Road:     SetDParam(0, STR_9003_ROAD_VEHICLE_DEPOT); break;
   984 				case VEH_ROAD:     SetDParam(0, STR_9003_ROAD_VEHICLE_DEPOT); break;
   985 				case VEH_Ship:     SetDParam(0, STR_9803_SHIP_DEPOT);         break;
   985 				case VEH_SHIP:     SetDParam(0, STR_9803_SHIP_DEPOT);         break;
   986 				case VEH_Aircraft: SetDParam(0, STR_A002_AIRCRAFT_HANGAR);    break;
   986 				case VEH_AIRCRAFT: SetDParam(0, STR_A002_AIRCRAFT_HANGAR);    break;
   987 				default: NOT_REACHED(); break;
   987 				default: NOT_REACHED(); break;
   988 			}
   988 			}
   989 			if (vl->vehicle_type == VEH_Aircraft) {
   989 			if (vl->vehicle_type == VEH_AIRCRAFT) {
   990 				SetDParam(1, index); // Airport name
   990 				SetDParam(1, index); // Airport name
   991 			} else {
   991 			} else {
   992 				SetDParam(1, GetDepot(index)->town_index);
   992 				SetDParam(1, GetDepot(index)->town_index);
   993 			}
   993 			}
   994 			SetDParam(2, w->vscroll.count);
   994 			SetDParam(2, w->vscroll.count);
  1019 		SetDParam(1, v->profit_last_year);
  1019 		SetDParam(1, v->profit_last_year);
  1020 
  1020 
  1021 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
  1021 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
  1022 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
  1022 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
  1023 
  1023 
  1024 		if ((v->type == VEH_Train    && v->string_id != STR_SV_TRAIN_NAME)   ||
  1024 		if ((v->type == VEH_TRAIN    && v->string_id != STR_SV_TRAIN_NAME)   ||
  1025 			(v->type == VEH_Road     && v->string_id != STR_SV_ROADVEH_NAME) ||
  1025 			(v->type == VEH_ROAD     && v->string_id != STR_SV_ROADVEH_NAME) ||
  1026 			(v->type == VEH_Ship     && v->string_id != STR_SV_SHIP_NAME)    ||
  1026 			(v->type == VEH_SHIP     && v->string_id != STR_SV_SHIP_NAME)    ||
  1027 			(v->type == VEH_Aircraft && v->string_id != STR_SV_AIRCRAFT_NAME)) {
  1027 			(v->type == VEH_AIRCRAFT && v->string_id != STR_SV_AIRCRAFT_NAME)) {
  1028 
  1028 
  1029 			/* The vehicle got a name so we will print it */
  1029 			/* The vehicle got a name so we will print it */
  1030 			SetDParam(0, v->string_id);
  1030 			SetDParam(0, v->string_id);
  1031 			DrawString(x + 19, y, STR_01AB, 0);
  1031 			DrawString(x + 19, y, STR_01AB, 0);
  1032 		}
  1032 		}
  1091 					if (id_v >= vl->l.list_length) return; // click out of list bound
  1091 					if (id_v >= vl->l.list_length) return; // click out of list bound
  1092 
  1092 
  1093 					v = vl->sort_list[id_v];
  1093 					v = vl->sort_list[id_v];
  1094 
  1094 
  1095 					switch (vl->vehicle_type) {
  1095 					switch (vl->vehicle_type) {
  1096 						case VEH_Train: ShowTrainViewWindow(v); break;
  1096 						case VEH_TRAIN: ShowTrainViewWindow(v); break;
  1097 						case VEH_Road: ShowRoadVehViewWindow(v); break;
  1097 						case VEH_ROAD: ShowRoadVehViewWindow(v); break;
  1098 						case VEH_Ship: ShowShipViewWindow(v); break;
  1098 						case VEH_SHIP: ShowShipViewWindow(v); break;
  1099 						case VEH_Aircraft: ShowAircraftViewWindow(v); break;
  1099 						case VEH_AIRCRAFT: ShowAircraftViewWindow(v); break;
  1100 						default: NOT_REACHED(); break;
  1100 						default: NOT_REACHED(); break;
  1101 					}
  1101 					}
  1102 				} break;
  1102 				} break;
  1103 
  1103 
  1104 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1104 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1239 	/* The vehicle list windows have been unified. Just some strings need
  1239 	/* The vehicle list windows have been unified. Just some strings need
  1240 	 * to be changed which happens in the WE_CREATE event and resizing
  1240 	 * to be changed which happens in the WE_CREATE event and resizing
  1241 	 * some of the windows to the correct size */
  1241 	 * some of the windows to the correct size */
  1242 	switch (vehicle_type) {
  1242 	switch (vehicle_type) {
  1243 		default: NOT_REACHED();
  1243 		default: NOT_REACHED();
  1244 		case VEH_Train:
  1244 		case VEH_TRAIN:
  1245 			w = BaseWindow::AllocateFront(&_player_vehicle_list_train_desc, num);
  1245 			w = BaseWindow::AllocateFront(&_player_vehicle_list_train_desc, num);
  1246 			if (w != NULL) w->Resize(65, 38);
  1246 			if (w != NULL) w->Resize(65, 38);
  1247 			break;
  1247 			break;
  1248 		case VEH_Road:
  1248 		case VEH_ROAD:
  1249 			w = BaseWindow::AllocateFront(&_player_vehicle_list_road_veh_desc, num);
  1249 			w = BaseWindow::AllocateFront(&_player_vehicle_list_road_veh_desc, num);
  1250 			if (w != NULL) w->Resize(0, 38);
  1250 			if (w != NULL) w->Resize(0, 38);
  1251 			break;
  1251 			break;
  1252 		case VEH_Ship:
  1252 		case VEH_SHIP:
  1253 			w = BaseWindow::AllocateFront(&_player_vehicle_list_ship_desc, num);
  1253 			w = BaseWindow::AllocateFront(&_player_vehicle_list_ship_desc, num);
  1254 			break;
  1254 			break;
  1255 		case VEH_Aircraft:
  1255 		case VEH_AIRCRAFT:
  1256 			w = BaseWindow::AllocateFront(&_player_vehicle_list_aircraft_desc, num);
  1256 			w = BaseWindow::AllocateFront(&_player_vehicle_list_aircraft_desc, num);
  1257 			break;
  1257 			break;
  1258 	}
  1258 	}
  1259 
  1259 
  1260 	if (w != NULL) {
  1260 	if (w != NULL) {
  1282 
  1282 
  1283 void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile)
  1283 void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile)
  1284 {
  1284 {
  1285 	uint16 depot_airport_index;
  1285 	uint16 depot_airport_index;
  1286 
  1286 
  1287 	if (vehicle_type == VEH_Aircraft) {
  1287 	if (vehicle_type == VEH_AIRCRAFT) {
  1288 		depot_airport_index = GetStationIndex(depot_tile);
  1288 		depot_airport_index = GetStationIndex(depot_tile);
  1289 	} else {
  1289 	} else {
  1290 		Depot *depot = GetDepotByTile(depot_tile);
  1290 		Depot *depot = GetDepotByTile(depot_tile);
  1291 		if (depot == NULL) return; // no depot to show
  1291 		if (depot == NULL) return; // no depot to show
  1292 		depot_airport_index = depot->index;
  1292 		depot_airport_index = depot->index;