src/vehicle_gui.cpp
branchgamebalance
changeset 9895 7bd07f43b0e3
parent 6474 24e7ceeb25f5
child 9906 6f41b8713b65
equal deleted inserted replaced
9894:70d78ac95d6c 9895:7bd07f43b0e3
    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 	Window* const *wz;
    95 	Window* const *wz;
    96 
    96 
    97 	FOR_ALL_WINDOWS(wz) {
    97 	FOR_ALL_WINDOWS(wz) {
    98 		Window *w = *wz;
    98 		Window *w = *wz;
   109 			default: break;
   109 			default: break;
   110 		}
   110 		}
   111 	}
   111 	}
   112 }
   112 }
   113 
   113 
   114 void ResortVehicleLists(void)
   114 void ResortVehicleLists()
   115 {
   115 {
   116 	Window* const *wz;
   116 	Window* const *wz;
   117 
   117 
   118 	FOR_ALL_WINDOWS(wz) {
   118 	FOR_ALL_WINDOWS(wz) {
   119 		Window *w = *wz;
   119 		Window *w = *wz;
   178 		pal = PALETTE_TO_GREEN;
   178 		pal = PALETTE_TO_GREEN;
   179 	}
   179 	}
   180 	DrawSprite(SPR_BLOT, pal, x, y);
   180 	DrawSprite(SPR_BLOT, pal, x, y);
   181 }
   181 }
   182 
   182 
   183 typedef struct RefitOption {
   183 struct RefitOption {
   184 	CargoID cargo;
   184 	CargoID cargo;
   185 	byte subtype;
   185 	byte subtype;
   186 	uint16 value;
   186 	uint16 value;
   187 	EngineID engine;
   187 	EngineID engine;
   188 } RefitOption;
   188 };
   189 
   189 
   190 typedef struct RefitList {
   190 struct RefitList {
   191 	uint num_lines;
   191 	uint num_lines;
   192 	RefitOption *items;
   192 	RefitOption *items;
   193 } RefitList;
   193 };
   194 
   194 
   195 static RefitList *BuildRefitList(const Vehicle *v)
   195 static RefitList *BuildRefitList(const Vehicle *v)
   196 {
   196 {
   197 	uint max_lines = 256;
   197 	uint max_lines = 256;
   198 	RefitOption *refit = CallocT<RefitOption>(max_lines);
   198 	RefitOption *refit = CallocT<RefitOption>(max_lines);
   265 					refit[num_lines].engine  = INVALID_ENGINE;
   265 					refit[num_lines].engine  = INVALID_ENGINE;
   266 					num_lines++;
   266 					num_lines++;
   267 				}
   267 				}
   268 			}
   268 			}
   269 		}
   269 		}
   270 	} while (v->type == VEH_Train && (u = u->next) != NULL && num_lines < max_lines);
   270 	} while (v->type == VEH_TRAIN && (u = u->next) != NULL && num_lines < max_lines);
   271 
   271 
   272 	list->num_lines = num_lines;
   272 	list->num_lines = num_lines;
   273 	list->items = refit;
   273 	list->items = refit;
   274 
   274 
   275 	return list;
   275 	return list;
   318 {
   318 {
   319 	switch (e->event) {
   319 	switch (e->event) {
   320 		case WE_PAINT: {
   320 		case WE_PAINT: {
   321 			Vehicle *v = GetVehicle(w->window_number);
   321 			Vehicle *v = GetVehicle(w->window_number);
   322 
   322 
   323 			if (v->type == VEH_Train) {
   323 			if (v->type == VEH_TRAIN) {
   324 				uint length = CountVehiclesInChain(v);
   324 				uint length = CountVehiclesInChain(v);
   325 
   325 
   326 				if (length != WP(w, refit_d).length) {
   326 				if (length != WP(w, refit_d).length) {
   327 					/* Consist length has changed, so rebuild the refit list */
   327 					/* Consist length has changed, so rebuild the refit list */
   328 					free(WP(w, refit_d).list->items);
   328 					free(WP(w, refit_d).list->items);
   370 
   370 
   371 						if (WP(w, refit_d).order == INVALID_VEH_ORDER_ID) {
   371 						if (WP(w, refit_d).order == INVALID_VEH_ORDER_ID) {
   372 							int command = 0;
   372 							int command = 0;
   373 
   373 
   374 							switch (v->type) {
   374 							switch (v->type) {
   375 								case VEH_Train:    command = CMD_REFIT_RAIL_VEHICLE | CMD_MSG(STR_RAIL_CAN_T_REFIT_VEHICLE);  break;
   375 								case VEH_TRAIN:    command = CMD_REFIT_RAIL_VEHICLE | CMD_MSG(STR_RAIL_CAN_T_REFIT_VEHICLE);  break;
   376 								case VEH_Road:     command = CMD_REFIT_ROAD_VEH     | CMD_MSG(STR_REFIT_ROAD_VEHICLE_CAN_T);  break;
   376 								case VEH_ROAD:     command = CMD_REFIT_ROAD_VEH     | CMD_MSG(STR_REFIT_ROAD_VEHICLE_CAN_T);  break;
   377 								case VEH_Ship:     command = CMD_REFIT_SHIP         | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP);     break;
   377 								case VEH_SHIP:     command = CMD_REFIT_SHIP         | CMD_MSG(STR_9841_CAN_T_REFIT_SHIP);     break;
   378 								case VEH_Aircraft: command = CMD_REFIT_AIRCRAFT     | CMD_MSG(STR_A042_CAN_T_REFIT_AIRCRAFT); break;
   378 								case VEH_AIRCRAFT: command = CMD_REFIT_AIRCRAFT     | CMD_MSG(STR_A042_CAN_T_REFIT_AIRCRAFT); break;
   379 							}
   379 							}
   380 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, NULL, command)) DeleteWindow(w);
   380 							if (DoCommandP(v->tile, v->index, WP(w,refit_d).cargo->cargo | WP(w,refit_d).cargo->subtype << 8, NULL, command)) DeleteWindow(w);
   381 						} else {
   381 						} else {
   382 							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)) DeleteWindow(w);
   382 							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)) DeleteWindow(w);
   383 						}
   383 						}
   435 		w->caption_color = v->owner;
   435 		w->caption_color = v->owner;
   436 		w->vscroll.cap = 8;
   436 		w->vscroll.cap = 8;
   437 		w->resize.step_height = 14;
   437 		w->resize.step_height = 14;
   438 		WP(w, refit_d).sel  = -1;
   438 		WP(w, refit_d).sel  = -1;
   439 		WP(w, refit_d).list = BuildRefitList(v);
   439 		WP(w, refit_d).list = BuildRefitList(v);
   440 		if (v->type == VEH_Train) WP(w, refit_d).length = CountVehiclesInChain(v);
   440 		if (v->type == VEH_TRAIN) WP(w, refit_d).length = CountVehiclesInChain(v);
   441 		SetVScrollCount(w, WP(w, refit_d).list->num_lines);
   441 		SetVScrollCount(w, WP(w, refit_d).list->num_lines);
   442 
   442 
   443 		switch (v->type) {
   443 		switch (v->type) {
   444 			case VEH_Train:
   444 			case VEH_TRAIN:
   445 				w->widget[3].tooltips = STR_RAIL_SELECT_TYPE_OF_CARGO_FOR;
   445 				w->widget[3].tooltips = STR_RAIL_SELECT_TYPE_OF_CARGO_FOR;
   446 				w->widget[6].data     = STR_RAIL_REFIT_VEHICLE;
   446 				w->widget[6].data     = STR_RAIL_REFIT_VEHICLE;
   447 				w->widget[6].tooltips = STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED;
   447 				w->widget[6].tooltips = STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED;
   448 				break;
   448 				break;
   449 			case VEH_Road:
   449 			case VEH_ROAD:
   450 				w->widget[3].tooltips = STR_ROAD_SELECT_TYPE_OF_CARGO_FOR;
   450 				w->widget[3].tooltips = STR_ROAD_SELECT_TYPE_OF_CARGO_FOR;
   451 				w->widget[6].data     = STR_REFIT_ROAD_VEHICLE;
   451 				w->widget[6].data     = STR_REFIT_ROAD_VEHICLE;
   452 				w->widget[6].tooltips = STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED;
   452 				w->widget[6].tooltips = STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED;
   453 				break;
   453 				break;
   454 			case VEH_Ship:
   454 			case VEH_SHIP:
   455 				w->widget[3].tooltips = STR_983D_SELECT_TYPE_OF_CARGO_FOR;
   455 				w->widget[3].tooltips = STR_983D_SELECT_TYPE_OF_CARGO_FOR;
   456 				w->widget[6].data     = STR_983C_REFIT_SHIP;
   456 				w->widget[6].data     = STR_983C_REFIT_SHIP;
   457 				w->widget[6].tooltips = STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED;
   457 				w->widget[6].tooltips = STR_983E_REFIT_SHIP_TO_CARRY_HIGHLIGHTED;
   458 				break;
   458 				break;
   459 			case VEH_Aircraft:
   459 			case VEH_AIRCRAFT:
   460 				w->widget[3].tooltips = STR_A03E_SELECT_TYPE_OF_CARGO_FOR;
   460 				w->widget[3].tooltips = STR_A03E_SELECT_TYPE_OF_CARGO_FOR;
   461 				w->widget[6].data     = STR_A03D_REFIT_AIRCRAFT;
   461 				w->widget[6].data     = STR_A03D_REFIT_AIRCRAFT;
   462 				w->widget[6].tooltips = STR_A03F_REFIT_AIRCRAFT_TO_CARRY;
   462 				w->widget[6].tooltips = STR_A03F_REFIT_AIRCRAFT_TO_CARRY;
   463 				break;
   463 				break;
   464 			default: NOT_REACHED();
   464 			default: NOT_REACHED();
   650 	const Vehicle* vb = *(const Vehicle**)b;
   650 	const Vehicle* vb = *(const Vehicle**)b;
   651 	int max_speed_a = 0xFFFF, max_speed_b = 0xFFFF;
   651 	int max_speed_a = 0xFFFF, max_speed_b = 0xFFFF;
   652 	int r;
   652 	int r;
   653 	const Vehicle *ua = va, *ub = vb;
   653 	const Vehicle *ua = va, *ub = vb;
   654 
   654 
   655 	if (va->type == VEH_Train && vb->type == VEH_Train) {
   655 	if (va->type == VEH_TRAIN && vb->type == VEH_TRAIN) {
   656 		do {
   656 		do {
   657 			if (RailVehInfo(ua->engine_type)->max_speed != 0)
   657 			if (RailVehInfo(ua->engine_type)->max_speed != 0)
   658 				max_speed_a = min(max_speed_a, RailVehInfo(ua->engine_type)->max_speed);
   658 				max_speed_a = min(max_speed_a, RailVehInfo(ua->engine_type)->max_speed);
   659 		} while ((ua = ua->next) != NULL);
   659 		} while ((ua = ua->next) != NULL);
   660 
   660 
   700 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   700 	VEHICLEUNITNUMBERSORTER(r, va, vb);
   701 
   701 
   702 	return (_internal_sort_order & 1) ? -r : r;
   702 	return (_internal_sort_order & 1) ? -r : r;
   703 }
   703 }
   704 
   704 
   705 void InitializeGUI(void)
   705 void InitializeGUI()
   706 {
   706 {
   707 	memset(&_sorting, 0, sizeof(_sorting));
   707 	memset(&_sorting, 0, sizeof(_sorting));
   708 }
   708 }
   709 
   709 
   710 /** Assigns an already open vehicle window to a new vehicle.
   710 /** Assigns an already open vehicle window to a new vehicle.
   824 			WIDGET_LIST_END);
   824 			WIDGET_LIST_END);
   825 	}
   825 	}
   826 
   826 
   827 	/* Set up the window widgets */
   827 	/* Set up the window widgets */
   828 	switch (vl->vehicle_type) {
   828 	switch (vl->vehicle_type) {
   829 		case VEH_Train:
   829 		case VEH_TRAIN:
   830 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
   830 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_883D_TRAINS_CLICK_ON_TRAIN_FOR;
   831 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
   831 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_TRAINS;
   832 			break;
   832 			break;
   833 
   833 
   834 		case VEH_Road:
   834 		case VEH_ROAD:
   835 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_901A_ROAD_VEHICLES_CLICK_ON;
   835 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_901A_ROAD_VEHICLES_CLICK_ON;
   836 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
   836 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_ROAD_VEHICLES;
   837 			break;
   837 			break;
   838 
   838 
   839 		case VEH_Ship:
   839 		case VEH_SHIP:
   840 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
   840 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_9823_SHIPS_CLICK_ON_SHIP_FOR;
   841 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
   841 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_SHIPS;
   842 			break;
   842 			break;
   843 
   843 
   844 		case VEH_Aircraft:
   844 		case VEH_AIRCRAFT:
   845 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
   845 			w->widget[VLW_WIDGET_LIST].tooltips          = STR_A01F_AIRCRAFT_CLICK_ON_AIRCRAFT;
   846 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
   846 			w->widget[VLW_WIDGET_AVAILABLE_VEHICLES].data = STR_AVAILABLE_AIRCRAFT;
   847 			break;
   847 			break;
   848 
   848 
   849 		default: NOT_REACHED();
   849 		default: NOT_REACHED();
   853 		case VLW_SHARED_ORDERS:
   853 		case VLW_SHARED_ORDERS:
   854 			w->widget[VLW_WIDGET_CAPTION].data  = STR_VEH_WITH_SHARED_ORDERS_LIST;
   854 			w->widget[VLW_WIDGET_CAPTION].data  = STR_VEH_WITH_SHARED_ORDERS_LIST;
   855 			break;
   855 			break;
   856 		case VLW_STANDARD: /* Company Name - standard widget setup */
   856 		case VLW_STANDARD: /* Company Name - standard widget setup */
   857 			switch (vl->vehicle_type) {
   857 			switch (vl->vehicle_type) {
   858 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_881B_TRAINS;        break;
   858 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_881B_TRAINS;        break;
   859 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_9001_ROAD_VEHICLES; break;
   859 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_9001_ROAD_VEHICLES; break;
   860 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_9805_SHIPS;         break;
   860 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_9805_SHIPS;         break;
   861 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_A009_AIRCRAFT;      break;
   861 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_A009_AIRCRAFT;      break;
   862 				default: NOT_REACHED(); break;
   862 				default: NOT_REACHED(); break;
   863 			}
   863 			}
   864 			break;
   864 			break;
   865 		case VLW_STATION_LIST: /* Station Name */
   865 		case VLW_STATION_LIST: /* Station Name */
   866 			switch (vl->vehicle_type) {
   866 			switch (vl->vehicle_type) {
   867 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_TRAINS;        break;
   867 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_TRAINS;        break;
   868 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_ROAD_VEHICLES; break;
   868 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_ROAD_VEHICLES; break;
   869 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_SHIPS;         break;
   869 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_SHIPS;         break;
   870 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_AIRCRAFT;      break;
   870 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_SCHEDULED_AIRCRAFT;      break;
   871 				default: NOT_REACHED(); break;
   871 				default: NOT_REACHED(); break;
   872 			}
   872 			}
   873 			break;
   873 			break;
   874 
   874 
   875 		case VLW_DEPOT_LIST:
   875 		case VLW_DEPOT_LIST:
   876 			switch (vl->vehicle_type) {
   876 			switch (vl->vehicle_type) {
   877 				case VEH_Train:    w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_TRAIN_DEPOT;    break;
   877 				case VEH_TRAIN:    w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_TRAIN_DEPOT;    break;
   878 				case VEH_Road:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_ROADVEH_DEPOT;  break;
   878 				case VEH_ROAD:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_ROADVEH_DEPOT;  break;
   879 				case VEH_Ship:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_SHIP_DEPOT;     break;
   879 				case VEH_SHIP:     w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_SHIP_DEPOT;     break;
   880 				case VEH_Aircraft: w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_AIRCRAFT_DEPOT; break;
   880 				case VEH_AIRCRAFT: w->widget[VLW_WIDGET_CAPTION].data = STR_VEHICLE_LIST_AIRCRAFT_DEPOT; break;
   881 				default: NOT_REACHED(); break;
   881 				default: NOT_REACHED(); break;
   882 			}
   882 			}
   883 			break;
   883 			break;
   884 		default: NOT_REACHED(); break;
   884 		default: NOT_REACHED(); break;
   885 	}
   885 	}
   886 
   886 
   887 	switch (vl->vehicle_type) {
   887 	switch (vl->vehicle_type) {
   888 		case VEH_Train:
   888 		case VEH_TRAIN:
   889 			w->resize.step_width = 1;
   889 			w->resize.step_width = 1;
   890 			/* Fallthrough */
   890 			/* Fallthrough */
   891 		case VEH_Road:
   891 		case VEH_ROAD:
   892 			w->vscroll.cap = 7;
   892 			w->vscroll.cap = 7;
   893 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL;
   893 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_SMALL;
   894 			w->resize.height = 220 - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 3); // Minimum of 4 vehicles
   894 			w->resize.height = 220 - (PLY_WND_PRC__SIZE_OF_ROW_SMALL * 3); // Minimum of 4 vehicles
   895 			break;
   895 			break;
   896 		case VEH_Ship:
   896 		case VEH_SHIP:
   897 		case VEH_Aircraft:
   897 		case VEH_AIRCRAFT:
   898 			w->vscroll.cap = 4;
   898 			w->vscroll.cap = 4;
   899 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_BIG;
   899 			w->resize.step_height = PLY_WND_PRC__SIZE_OF_ROW_BIG;
   900 			break;
   900 			break;
   901 		default: NOT_REACHED();
   901 		default: NOT_REACHED();
   902 	}
   902 	}
   905 
   905 
   906 	/* Set up sorting. Make the window-specific _sorting variable
   906 	/* Set up sorting. Make the window-specific _sorting variable
   907 		* point to the correct global _sorting struct so we are freed
   907 		* point to the correct global _sorting struct so we are freed
   908 		* from having conditionals during window operation */
   908 		* from having conditionals during window operation */
   909 	switch (vl->vehicle_type) {
   909 	switch (vl->vehicle_type) {
   910 		case VEH_Train:    vl->_sorting = &_sorting.train; break;
   910 		case VEH_TRAIN:    vl->_sorting = &_sorting.train; break;
   911 		case VEH_Road:     vl->_sorting = &_sorting.roadveh; break;
   911 		case VEH_ROAD:     vl->_sorting = &_sorting.roadveh; break;
   912 		case VEH_Ship:     vl->_sorting = &_sorting.ship; break;
   912 		case VEH_SHIP:     vl->_sorting = &_sorting.ship; break;
   913 		case VEH_Aircraft: vl->_sorting = &_sorting.aircraft; break;
   913 		case VEH_AIRCRAFT: vl->_sorting = &_sorting.aircraft; break;
   914 		default: NOT_REACHED(); break;
   914 		default: NOT_REACHED(); break;
   915 	}
   915 	}
   916 
   916 
   917 	vl->l.flags = VL_REBUILD | (vl->_sorting->order ? VL_DESC : VL_NONE);
   917 	vl->l.flags = VL_REBUILD | (vl->_sorting->order ? VL_DESC : VL_NONE);
   918 	vl->l.sort_type = vl->_sorting->criteria;
   918 	vl->l.sort_type = vl->_sorting->criteria;
   930 	FOR_VEHICLE_ORDERS(v, order) {
   930 	FOR_VEHICLE_ORDERS(v, order) {
   931 		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, 16);
   931 		if (sel == 0) DrawString(x - 6, y, STR_SMALL_RIGHT_ARROW, 16);
   932 		sel--;
   932 		sel--;
   933 
   933 
   934 		if (order->type == OT_GOTO_STATION) {
   934 		if (order->type == OT_GOTO_STATION) {
   935 			if (v->type == VEH_Ship && GetStation(order->dest)->IsBuoy()) continue;
   935 			if (v->type == VEH_SHIP && GetStation(order->dest)->IsBuoy()) continue;
   936 
   936 
   937 			SetDParam(0, order->dest);
   937 			SetDParam(0, order->dest);
   938 			DrawString(x, y, STR_A036, 0);
   938 			DrawString(x, y, STR_A036, 0);
   939 
   939 
   940 			y += 6;
   940 			y += 6;
   981 			SetDParam(1, w->vscroll.count);
   981 			SetDParam(1, w->vscroll.count);
   982 			break;
   982 			break;
   983 
   983 
   984 		case VLW_DEPOT_LIST:
   984 		case VLW_DEPOT_LIST:
   985 			switch (vl->vehicle_type) {
   985 			switch (vl->vehicle_type) {
   986 				case VEH_Train:    SetDParam(0, STR_8800_TRAIN_DEPOT);        break;
   986 				case VEH_TRAIN:    SetDParam(0, STR_8800_TRAIN_DEPOT);        break;
   987 				case VEH_Road:     SetDParam(0, STR_9003_ROAD_VEHICLE_DEPOT); break;
   987 				case VEH_ROAD:     SetDParam(0, STR_9003_ROAD_VEHICLE_DEPOT); break;
   988 				case VEH_Ship:     SetDParam(0, STR_9803_SHIP_DEPOT);         break;
   988 				case VEH_SHIP:     SetDParam(0, STR_9803_SHIP_DEPOT);         break;
   989 				case VEH_Aircraft: SetDParam(0, STR_A002_AIRCRAFT_HANGAR);    break;
   989 				case VEH_AIRCRAFT: SetDParam(0, STR_A002_AIRCRAFT_HANGAR);    break;
   990 				default: NOT_REACHED(); break;
   990 				default: NOT_REACHED(); break;
   991 			}
   991 			}
   992 			if (vl->vehicle_type == VEH_Aircraft) {
   992 			if (vl->vehicle_type == VEH_AIRCRAFT) {
   993 				SetDParam(1, index); // Airport name
   993 				SetDParam(1, index); // Airport name
   994 			} else {
   994 			} else {
   995 				SetDParam(1, GetDepot(index)->town_index);
   995 				SetDParam(1, GetDepot(index)->town_index);
   996 			}
   996 			}
   997 			SetDParam(2, w->vscroll.count);
   997 			SetDParam(2, w->vscroll.count);
  1022 		SetDParam(1, v->profit_last_year);
  1022 		SetDParam(1, v->profit_last_year);
  1023 
  1023 
  1024 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
  1024 		DrawVehicleImage(v, x + 19, y + 6, w->widget[VLW_WIDGET_LIST].right - w->widget[VLW_WIDGET_LIST].left - 20, 0, INVALID_VEHICLE);
  1025 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
  1025 		DrawString(x + 19, y + w->resize.step_height - 8, STR_0198_PROFIT_THIS_YEAR_LAST_YEAR, 0);
  1026 
  1026 
  1027 		if ((v->type == VEH_Train    && v->string_id != STR_SV_TRAIN_NAME)   ||
  1027 		if ((v->type == VEH_TRAIN    && v->string_id != STR_SV_TRAIN_NAME)   ||
  1028 			(v->type == VEH_Road     && v->string_id != STR_SV_ROADVEH_NAME) ||
  1028 			(v->type == VEH_ROAD     && v->string_id != STR_SV_ROADVEH_NAME) ||
  1029 			(v->type == VEH_Ship     && v->string_id != STR_SV_SHIP_NAME)    ||
  1029 			(v->type == VEH_SHIP     && v->string_id != STR_SV_SHIP_NAME)    ||
  1030 			(v->type == VEH_Aircraft && v->string_id != STR_SV_AIRCRAFT_NAME)) {
  1030 			(v->type == VEH_AIRCRAFT && v->string_id != STR_SV_AIRCRAFT_NAME)) {
  1031 
  1031 
  1032 			/* The vehicle got a name so we will print it */
  1032 			/* The vehicle got a name so we will print it */
  1033 			SetDParam(0, v->string_id);
  1033 			SetDParam(0, v->string_id);
  1034 			DrawString(x + 19, y, STR_01AB, 0);
  1034 			DrawString(x + 19, y, STR_01AB, 0);
  1035 		}
  1035 		}
  1094 					if (id_v >= vl->l.list_length) return; // click out of list bound
  1094 					if (id_v >= vl->l.list_length) return; // click out of list bound
  1095 
  1095 
  1096 					v = vl->sort_list[id_v];
  1096 					v = vl->sort_list[id_v];
  1097 
  1097 
  1098 					switch (vl->vehicle_type) {
  1098 					switch (vl->vehicle_type) {
  1099 						case VEH_Train: ShowTrainViewWindow(v); break;
  1099 						case VEH_TRAIN: ShowTrainViewWindow(v); break;
  1100 						case VEH_Road: ShowRoadVehViewWindow(v); break;
  1100 						case VEH_ROAD: ShowRoadVehViewWindow(v); break;
  1101 						case VEH_Ship: ShowShipViewWindow(v); break;
  1101 						case VEH_SHIP: ShowShipViewWindow(v); break;
  1102 						case VEH_Aircraft: ShowAircraftViewWindow(v); break;
  1102 						case VEH_AIRCRAFT: ShowAircraftViewWindow(v); break;
  1103 						default: NOT_REACHED(); break;
  1103 						default: NOT_REACHED(); break;
  1104 					}
  1104 					}
  1105 				} break;
  1105 				} break;
  1106 
  1106 
  1107 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1107 				case VLW_WIDGET_AVAILABLE_VEHICLES:
  1242 	/* The vehicle list windows have been unified. Just some strings need
  1242 	/* The vehicle list windows have been unified. Just some strings need
  1243 	 * to be changed which happens in the WE_CREATE event and resizing
  1243 	 * to be changed which happens in the WE_CREATE event and resizing
  1244 	 * some of the windows to the correct size */
  1244 	 * some of the windows to the correct size */
  1245 	switch (vehicle_type) {
  1245 	switch (vehicle_type) {
  1246 		default: NOT_REACHED();
  1246 		default: NOT_REACHED();
  1247 		case VEH_Train:
  1247 		case VEH_TRAIN:
  1248 			w = AllocateWindowDescFront(&_player_vehicle_list_train_desc, num);
  1248 			w = AllocateWindowDescFront(&_player_vehicle_list_train_desc, num);
  1249 			if (w != NULL) ResizeWindow(w, 65, 38);
  1249 			if (w != NULL) ResizeWindow(w, 65, 38);
  1250 			break;
  1250 			break;
  1251 		case VEH_Road:
  1251 		case VEH_ROAD:
  1252 			w = AllocateWindowDescFront(&_player_vehicle_list_road_veh_desc, num);
  1252 			w = AllocateWindowDescFront(&_player_vehicle_list_road_veh_desc, num);
  1253 			if (w != NULL) ResizeWindow(w, 0, 38);
  1253 			if (w != NULL) ResizeWindow(w, 0, 38);
  1254 			break;
  1254 			break;
  1255 		case VEH_Ship:
  1255 		case VEH_SHIP:
  1256 			w = AllocateWindowDescFront(&_player_vehicle_list_ship_desc, num);
  1256 			w = AllocateWindowDescFront(&_player_vehicle_list_ship_desc, num);
  1257 			break;
  1257 			break;
  1258 		case VEH_Aircraft:
  1258 		case VEH_AIRCRAFT:
  1259 			w = AllocateWindowDescFront(&_player_vehicle_list_aircraft_desc, num);
  1259 			w = AllocateWindowDescFront(&_player_vehicle_list_aircraft_desc, num);
  1260 			break;
  1260 			break;
  1261 	}
  1261 	}
  1262 
  1262 
  1263 	if (w != NULL) {
  1263 	if (w != NULL) {
  1285 
  1285 
  1286 void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile)
  1286 void ShowVehicleListWindow(PlayerID player, byte vehicle_type, TileIndex depot_tile)
  1287 {
  1287 {
  1288 	uint16 depot_airport_index;
  1288 	uint16 depot_airport_index;
  1289 
  1289 
  1290 	if (vehicle_type == VEH_Aircraft) {
  1290 	if (vehicle_type == VEH_AIRCRAFT) {
  1291 		depot_airport_index = GetStationIndex(depot_tile);
  1291 		depot_airport_index = GetStationIndex(depot_tile);
  1292 	} else {
  1292 	} else {
  1293 		Depot *depot = GetDepotByTile(depot_tile);
  1293 		Depot *depot = GetDepotByTile(depot_tile);
  1294 		if (depot == NULL) return; // no depot to show
  1294 		if (depot == NULL) return; // no depot to show
  1295 		depot_airport_index = depot->index;
  1295 		depot_airport_index = depot->index;