src/depot_gui.cpp
branchcpp_gui
changeset 6298 c30fe89622df
parent 6285 187e3ef04cc9
child 6307 f40e88cff863
equal deleted inserted replaced
6297:4bf29d14edba 6298:c30fe89622df
   131 
   131 
   132 void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2)
   132 void CcCloneVehicle(bool success, TileIndex tile, uint32 p1, uint32 p2)
   133 {
   133 {
   134 	if (!success) return;
   134 	if (!success) return;
   135 	switch(GetVehicle(p1)->type) {
   135 	switch(GetVehicle(p1)->type) {
   136 		case VEH_Train:    CcCloneTrain(   true, tile, p1, p2); break;
   136 		case VEH_TRAIN:    CcCloneTrain(   true, tile, p1, p2); break;
   137 		case VEH_Road:     CcCloneRoadVeh( true, tile, p1, p2); break;
   137 		case VEH_ROAD:     CcCloneRoadVeh( true, tile, p1, p2); break;
   138 		case VEH_Ship:     CcCloneShip(    true, tile, p1, p2); break;
   138 		case VEH_SHIP:     CcCloneShip(    true, tile, p1, p2); break;
   139 		case VEH_Aircraft: CcCloneAircraft(true, tile, p1, p2); break;
   139 		case VEH_AIRCRAFT: CcCloneAircraft(true, tile, p1, p2); break;
   140 	}
   140 	}
   141 }
   141 }
   142 
   142 
   143 static inline void ShowVehicleViewWindow(const Vehicle *v)
   143 static inline void ShowVehicleViewWindow(const Vehicle *v)
   144 {
   144 {
   145 	switch (v->type) {
   145 	switch (v->type) {
   146 		case VEH_Train:    ShowTrainViewWindow(v);    break;
   146 		case VEH_TRAIN:    ShowTrainViewWindow(v);    break;
   147 		case VEH_Road:     ShowRoadVehViewWindow(v);  break;
   147 		case VEH_ROAD:     ShowRoadVehViewWindow(v);  break;
   148 		case VEH_Ship:     ShowShipViewWindow(v);     break;
   148 		case VEH_SHIP:     ShowShipViewWindow(v);     break;
   149 		case VEH_Aircraft: ShowAircraftViewWindow(v); break;
   149 		case VEH_AIRCRAFT: ShowAircraftViewWindow(v); break;
   150 		default: NOT_REACHED();
   150 		default: NOT_REACHED();
   151 	}
   151 	}
   152 }
   152 }
   153 
   153 
   154 static void DepotSellAllConfirmationCallback(BaseWindow *w, bool confirmed)
   154 static void DepotSellAllConfirmationCallback(BaseWindow *w, bool confirmed)
   173 	byte diff_x = 0, diff_y = 0;
   173 	byte diff_x = 0, diff_y = 0;
   174 
   174 
   175 	int sprite_y = y + w->resize.step_height - GetVehicleListHeight(v->type);
   175 	int sprite_y = y + w->resize.step_height - GetVehicleListHeight(v->type);
   176 
   176 
   177 	switch (v->type) {
   177 	switch (v->type) {
   178 		case VEH_Train:
   178 		case VEH_TRAIN:
   179 			DrawTrainImage(v, x + 21, sprite_y, w->widget[DEPOT_WIDGET_MATRIX].right - 32, w->hscroll.pos, WP(w,depot_d).sel);
   179 			DrawTrainImage(v, x + 21, sprite_y, w->widget[DEPOT_WIDGET_MATRIX].right - 32, w->hscroll.pos, WP(w,depot_d).sel);
   180 
   180 
   181 			/* Number of wagons relative to a standard length wagon (rounded up) */
   181 			/* Number of wagons relative to a standard length wagon (rounded up) */
   182 			SetDParam(0, (v->u.rail.cached_total_length + 7) / 8);
   182 			SetDParam(0, (v->u.rail.cached_total_length + 7) / 8);
   183 			DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
   183 			DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
   184 			break;
   184 			break;
   185 
   185 
   186 		case VEH_Road:     DrawRoadVehImage( v, x + 24, sprite_y, WP(w, depot_d).sel); break;
   186 		case VEH_ROAD:     DrawRoadVehImage( v, x + 24, sprite_y, WP(w, depot_d).sel); break;
   187 		case VEH_Ship:     DrawShipImage(    v, x + 19, sprite_y - 1, WP(w, depot_d).sel); break;
   187 		case VEH_SHIP:     DrawShipImage(    v, x + 19, sprite_y - 1, WP(w, depot_d).sel); break;
   188 		case VEH_Aircraft: {
   188 		case VEH_AIRCRAFT: {
   189 			const Sprite *spr = GetSprite(GetAircraftImage(v, DIR_W));
   189 			const Sprite *spr = GetSprite(GetAircraftImage(v, DIR_W));
   190 			DrawAircraftImage(v, x + 12,
   190 			DrawAircraftImage(v, x + 12,
   191 							  y + max(spr->height + spr->y_offs - 14, 0), // tall sprites needs an y offset
   191 							  y + max(spr->height + spr->y_offs - 14, 0), // tall sprites needs an y offset
   192 							  WP(w, depot_d).sel);
   192 							  WP(w, depot_d).sel);
   193 		} break;
   193 		} break;
   194 		default: NOT_REACHED();
   194 		default: NOT_REACHED();
   195 	}
   195 	}
   196 
   196 
   197 	if (w->resize.step_height == 14) {
   197 	if (w->resize.step_height == 14) {
   198 		/* VEH_Train and VEH_Road, which are low */
   198 		/* VEH_TRAIN and VEH_ROAD, which are low */
   199 		diff_x = 15;
   199 		diff_x = 15;
   200 	} else {
   200 	} else {
   201 		/* VEH_Ship and VEH_Aircraft, which are tall */
   201 		/* VEH_SHIP and VEH_AIRCRAFT, which are tall */
   202 		diff_y = 12;
   202 		diff_y = 12;
   203 	}
   203 	}
   204 
   204 
   205 	DrawSprite((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, x + diff_x, y + diff_y);
   205 	DrawSprite((v->vehstatus & VS_STOPPED) ? SPR_FLAG_VEH_STOPPED : SPR_FLAG_VEH_RUNNING, PAL_NONE, x + diff_x, y + diff_y);
   206 
   206 
   231 		DEPOT_WIDGET_CLONE,
   231 		DEPOT_WIDGET_CLONE,
   232 		DEPOT_WIDGET_AUTOREPLACE,
   232 		DEPOT_WIDGET_AUTOREPLACE,
   233 		WIDGET_LIST_END);
   233 		WIDGET_LIST_END);
   234 
   234 
   235 	/* determine amount of items for scroller */
   235 	/* determine amount of items for scroller */
   236 	if (WP(w, depot_d).type == VEH_Train) {
   236 	if (WP(w, depot_d).type == VEH_TRAIN) {
   237 		hnum = 8;
   237 		hnum = 8;
   238 		for (num = 0; num < WP(w, depot_d).engine_count; num++) {
   238 		for (num = 0; num < WP(w, depot_d).engine_count; num++) {
   239 			const Vehicle *v = vl[num];
   239 			const Vehicle *v = vl[num];
   240 			hnum = max(hnum, v->u.rail.cached_total_length);
   240 			hnum = max(hnum, v->u.rail.cached_total_length);
   241 		}
   241 		}
   245 	} else {
   245 	} else {
   246 		SetVScrollCount(w, (num + w->hscroll.cap - 1) / w->hscroll.cap);
   246 		SetVScrollCount(w, (num + w->hscroll.cap - 1) / w->hscroll.cap);
   247 	}
   247 	}
   248 
   248 
   249 	/* locate the depot struct */
   249 	/* locate the depot struct */
   250 	if (WP(w, depot_d).type == VEH_Aircraft) {
   250 	if (WP(w, depot_d).type == VEH_AIRCRAFT) {
   251 		SetDParam(0, GetStationIndex(tile)); // Airport name
   251 		SetDParam(0, GetStationIndex(tile)); // Airport name
   252 	} else {
   252 	} else {
   253 		Depot *depot = GetDepotByTile(tile);
   253 		Depot *depot = GetDepotByTile(tile);
   254 		assert(depot != NULL);
   254 		assert(depot != NULL);
   255 
   255 
   288 		SetDParam(0, i);                      // Set the counter
   288 		SetDParam(0, i);                      // Set the counter
   289 		DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
   289 		DrawStringRightAligned(w->widget[DEPOT_WIDGET_MATRIX].right - 1, y + 4, STR_TINY_BLACK, 0); // Draw the counter
   290 	}
   290 	}
   291 }
   291 }
   292 
   292 
   293 typedef struct GetDepotVehiclePtData {
   293 struct GetDepotVehiclePtData {
   294 	Vehicle *head;
   294 	Vehicle *head;
   295 	Vehicle *wagon;
   295 	Vehicle *wagon;
   296 } GetDepotVehiclePtData;
   296 };
   297 
   297 
   298 enum {
   298 enum {
   299 	MODE_ERROR        =  1,
   299 	MODE_ERROR        =  1,
   300 	MODE_DRAG_VEHICLE =  0,
   300 	MODE_DRAG_VEHICLE =  0,
   301 	MODE_SHOW_VEHICLE = -1,
   301 	MODE_SHOW_VEHICLE = -1,
   307 	Vehicle **vl = WP(w, depot_d).vehicle_list;
   307 	Vehicle **vl = WP(w, depot_d).vehicle_list;
   308 	uint xt, row, xm = 0, ym = 0;
   308 	uint xt, row, xm = 0, ym = 0;
   309 	int pos, skip = 0;
   309 	int pos, skip = 0;
   310 	uint16 boxes_in_each_row = w->widget[DEPOT_WIDGET_MATRIX].data & 0xFF;
   310 	uint16 boxes_in_each_row = w->widget[DEPOT_WIDGET_MATRIX].data & 0xFF;
   311 
   311 
   312 	if (WP(w, depot_d).type == VEH_Train) {
   312 	if (WP(w, depot_d).type == VEH_TRAIN) {
   313 		xt = 0;
   313 		xt = 0;
   314 		x -= 23;
   314 		x -= 23;
   315 	} else {
   315 	} else {
   316 		xt = x / w->resize.step_width;
   316 		xt = x / w->resize.step_width;
   317 		xm = x % w->resize.step_width;
   317 		xm = x % w->resize.step_width;
   324 	if (row >= w->vscroll.cap) return MODE_ERROR;
   324 	if (row >= w->vscroll.cap) return MODE_ERROR;
   325 
   325 
   326 	pos = ((row + w->vscroll.pos) * boxes_in_each_row) + xt;
   326 	pos = ((row + w->vscroll.pos) * boxes_in_each_row) + xt;
   327 
   327 
   328 	if (WP(w, depot_d).engine_count + WP(w, depot_d).wagon_count <= pos) {
   328 	if (WP(w, depot_d).engine_count + WP(w, depot_d).wagon_count <= pos) {
   329 		if (WP(w, depot_d).type == VEH_Train) {
   329 		if (WP(w, depot_d).type == VEH_TRAIN) {
   330 			d->head  = NULL;
   330 			d->head  = NULL;
   331 			d->wagon = NULL;
   331 			d->wagon = NULL;
   332 			return MODE_DRAG_VEHICLE;
   332 			return MODE_DRAG_VEHICLE;
   333 		} else {
   333 		} else {
   334 			return MODE_ERROR; // empty block, so no vehicle is selected
   334 			return MODE_ERROR; // empty block, so no vehicle is selected
   345 		/* free wagons don't have an initial loco. */
   345 		/* free wagons don't have an initial loco. */
   346 		x -= _traininfo_vehicle_width;
   346 		x -= _traininfo_vehicle_width;
   347 	}
   347 	}
   348 
   348 
   349 	switch (WP(w, depot_d).type) {
   349 	switch (WP(w, depot_d).type) {
   350 		case VEH_Train: {
   350 		case VEH_TRAIN: {
   351 			Vehicle *v = *veh;
   351 			Vehicle *v = *veh;
   352 			d->head = d->wagon = v;
   352 			d->head = d->wagon = v;
   353 
   353 
   354 			/* either pressed the flag or the number, but only when it's a loco */
   354 			/* either pressed the flag or the number, but only when it's a loco */
   355 			if (x < 0 && IsFrontEngine(v)) return (x >= -10) ? MODE_START_STOP : MODE_SHOW_VEHICLE;
   355 			if (x < 0 && IsFrontEngine(v)) return (x >= -10) ? MODE_START_STOP : MODE_SHOW_VEHICLE;
   370 
   370 
   371 			return MODE_DRAG_VEHICLE;
   371 			return MODE_DRAG_VEHICLE;
   372 			}
   372 			}
   373 			break;
   373 			break;
   374 
   374 
   375 		case VEH_Road:
   375 		case VEH_ROAD:
   376 			if (xm >= 24) return MODE_DRAG_VEHICLE;
   376 			if (xm >= 24) return MODE_DRAG_VEHICLE;
   377 			if (xm <= 16) return MODE_SHOW_VEHICLE;
   377 			if (xm <= 16) return MODE_SHOW_VEHICLE;
   378 			break;
   378 			break;
   379 
   379 
   380 		case VEH_Ship:
   380 		case VEH_SHIP:
   381 			if (xm >= 19) return MODE_DRAG_VEHICLE;
   381 			if (xm >= 19) return MODE_DRAG_VEHICLE;
   382 			if (ym <= 10) return MODE_SHOW_VEHICLE;
   382 			if (ym <= 10) return MODE_SHOW_VEHICLE;
   383 			break;
   383 			break;
   384 
   384 
   385 		case VEH_Aircraft:
   385 		case VEH_AIRCRAFT:
   386 			if (xm >= 12) return MODE_DRAG_VEHICLE;
   386 			if (xm >= 12) return MODE_DRAG_VEHICLE;
   387 			if (ym <= 12) return MODE_SHOW_VEHICLE;
   387 			if (ym <= 12) return MODE_SHOW_VEHICLE;
   388 			break;
   388 			break;
   389 
   389 
   390 		default: NOT_REACHED();
   390 		default: NOT_REACHED();
   418 	Vehicle *v = NULL;
   418 	Vehicle *v = NULL;
   419 	int mode = GetVehicleFromDepotWndPt(w, x, y, &v, &gdvp);
   419 	int mode = GetVehicleFromDepotWndPt(w, x, y, &v, &gdvp);
   420 
   420 
   421 	/* share / copy orders */
   421 	/* share / copy orders */
   422 	if (_thd.place_mode && mode <= 0) {
   422 	if (_thd.place_mode && mode <= 0) {
   423 		_place_clicked_vehicle = (WP(w, depot_d).type == VEH_Train ? gdvp.head : v);
   423 		_place_clicked_vehicle = (WP(w, depot_d).type == VEH_TRAIN ? gdvp.head : v);
   424 		return;
   424 		return;
   425 	}
   425 	}
   426 
   426 
   427 	if (WP(w, depot_d).type == VEH_Train) v = gdvp.wagon;
   427 	if (WP(w, depot_d).type == VEH_TRAIN) v = gdvp.wagon;
   428 
   428 
   429 	switch (mode) {
   429 	switch (mode) {
   430 		case MODE_ERROR: // invalid
   430 		case MODE_ERROR: // invalid
   431 			return;
   431 			return;
   432 
   432 
   433 		case MODE_DRAG_VEHICLE: { // start dragging of vehicle
   433 		case MODE_DRAG_VEHICLE: { // start dragging of vehicle
   434 			VehicleID sel = WP(w, depot_d).sel;
   434 			VehicleID sel = WP(w, depot_d).sel;
   435 
   435 
   436 			if (WP(w, depot_d).type == VEH_Train && sel != INVALID_VEHICLE) {
   436 			if (WP(w, depot_d).type == VEH_TRAIN && sel != INVALID_VEHICLE) {
   437 				WP(w,depot_d).sel = INVALID_VEHICLE;
   437 				WP(w,depot_d).sel = INVALID_VEHICLE;
   438 				TrainDepotMoveVehicle(v, sel, gdvp.head);
   438 				TrainDepotMoveVehicle(v, sel, gdvp.head);
   439 			} else if (v != NULL) {
   439 			} else if (v != NULL) {
   440 				int image;
   440 				int image;
   441 
   441 
   442 				switch (WP(w, depot_d).type) {
   442 				switch (WP(w, depot_d).type) {
   443 					case VEH_Train:    image = GetTrainImage(v, DIR_W);    break;
   443 					case VEH_TRAIN:    image = GetTrainImage(v, DIR_W);    break;
   444 					case VEH_Road:     image = GetRoadVehImage(v, DIR_W);  break;
   444 					case VEH_ROAD:     image = GetRoadVehImage(v, DIR_W);  break;
   445 					case VEH_Ship:     image = GetShipImage(v, DIR_W);     break;
   445 					case VEH_SHIP:     image = GetShipImage(v, DIR_W);     break;
   446 					case VEH_Aircraft: image = GetAircraftImage(v, DIR_W); break;
   446 					case VEH_AIRCRAFT: image = GetAircraftImage(v, DIR_W); break;
   447 					default: NOT_REACHED(); image = 0;
   447 					default: NOT_REACHED(); image = 0;
   448 				}
   448 				}
   449 
   449 
   450 				WP(w, depot_d).sel = v->index;
   450 				WP(w, depot_d).sel = v->index;
   451 				w->SetDirty();
   451 				w->SetDirty();
   460 
   460 
   461 		case MODE_START_STOP: { // click start/stop flag
   461 		case MODE_START_STOP: { // click start/stop flag
   462 			uint command;
   462 			uint command;
   463 
   463 
   464 			switch (WP(w, depot_d).type) {
   464 			switch (WP(w, depot_d).type) {
   465 				case VEH_Train:    command = CMD_START_STOP_TRAIN | CMD_MSG(STR_883B_CAN_T_STOP_START_TRAIN);          break;
   465 				case VEH_TRAIN:    command = CMD_START_STOP_TRAIN | CMD_MSG(STR_883B_CAN_T_STOP_START_TRAIN);          break;
   466 				case VEH_Road:     command = CMD_START_STOP_ROADVEH | CMD_MSG(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE); break;
   466 				case VEH_ROAD:     command = CMD_START_STOP_ROADVEH | CMD_MSG(STR_9015_CAN_T_STOP_START_ROAD_VEHICLE); break;
   467 				case VEH_Ship:     command = CMD_START_STOP_SHIP | CMD_MSG(STR_9818_CAN_T_STOP_START_SHIP);            break;
   467 				case VEH_SHIP:     command = CMD_START_STOP_SHIP | CMD_MSG(STR_9818_CAN_T_STOP_START_SHIP);            break;
   468 				case VEH_Aircraft: command = CMD_START_STOP_AIRCRAFT | CMD_MSG(STR_A016_CAN_T_STOP_START_AIRCRAFT);    break;
   468 				case VEH_AIRCRAFT: command = CMD_START_STOP_AIRCRAFT | CMD_MSG(STR_A016_CAN_T_STOP_START_AIRCRAFT);    break;
   469 				default: NOT_REACHED(); command = 0;
   469 				default: NOT_REACHED(); command = 0;
   470 			}
   470 			}
   471 			DoCommandP(v->tile, v->index, 0, NULL, command);
   471 			DoCommandP(v->tile, v->index, 0, NULL, command);
   472 			}
   472 			}
   473 			break;
   473 			break;
   485 {
   485 {
   486 	uint error_str;
   486 	uint error_str;
   487 
   487 
   488 	if (v == NULL) return;
   488 	if (v == NULL) return;
   489 
   489 
   490 	if (v->type == VEH_Train && !IsFrontEngine(v)) {
   490 	if (v->type == VEH_TRAIN && !IsFrontEngine(v)) {
   491 		v = GetFirstVehicleInChain(v);
   491 		v = GetFirstVehicleInChain(v);
   492 		/* Do nothing when clicking on a train in depot with no loc attached */
   492 		/* Do nothing when clicking on a train in depot with no loc attached */
   493 		if (!IsFrontEngine(v)) return;
   493 		if (!IsFrontEngine(v)) return;
   494 	}
   494 	}
   495 
   495 
   496 	switch (v->type) {
   496 	switch (v->type) {
   497 		case VEH_Train:    error_str = CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE); break;
   497 		case VEH_TRAIN:    error_str = CMD_MSG(STR_882B_CAN_T_BUILD_RAILROAD_VEHICLE); break;
   498 		case VEH_Road:     error_str = CMD_MSG(STR_9009_CAN_T_BUILD_ROAD_VEHICLE);     break;
   498 		case VEH_ROAD:     error_str = CMD_MSG(STR_9009_CAN_T_BUILD_ROAD_VEHICLE);     break;
   499 		case VEH_Ship:     error_str = CMD_MSG(STR_980D_CAN_T_BUILD_SHIP);             break;
   499 		case VEH_SHIP:     error_str = CMD_MSG(STR_980D_CAN_T_BUILD_SHIP);             break;
   500 		case VEH_Aircraft: error_str = CMD_MSG(STR_A008_CAN_T_BUILD_AIRCRAFT);         break;
   500 		case VEH_AIRCRAFT: error_str = CMD_MSG(STR_A008_CAN_T_BUILD_AIRCRAFT);         break;
   501 		default: return;
   501 		default: return;
   502 	}
   502 	}
   503 
   503 
   504 	DoCommandP(w->window_number, v->index, _ctrl_pressed ? 1 : 0, CcCloneVehicle, CMD_CLONE_VEHICLE | error_str);
   504 	DoCommandP(w->window_number, v->index, _ctrl_pressed ? 1 : 0, CcCloneVehicle, CMD_CLONE_VEHICLE | error_str);
   505 
   505 
   515 
   515 
   516 static void ResizeDepotButtons(BaseWindow *w)
   516 static void ResizeDepotButtons(BaseWindow *w)
   517 {
   517 {
   518 	w->ResizeButtons(DEPOT_WIDGET_BUILD, DEPOT_WIDGET_LOCATION);
   518 	w->ResizeButtons(DEPOT_WIDGET_BUILD, DEPOT_WIDGET_LOCATION);
   519 
   519 
   520 	if (WP(w, depot_d).type == VEH_Train) {
   520 	if (WP(w, depot_d).type == VEH_TRAIN) {
   521 		/* Divide the size of DEPOT_WIDGET_SELL into two equally big buttons so DEPOT_WIDGET_SELL and DEPOT_WIDGET_SELL_CHAIN will get the same size.
   521 		/* Divide the size of DEPOT_WIDGET_SELL into two equally big buttons so DEPOT_WIDGET_SELL and DEPOT_WIDGET_SELL_CHAIN will get the same size.
   522 		* This way it will stay the same even if DEPOT_WIDGET_SELL_CHAIN is resized for some reason                                                  */
   522 		* This way it will stay the same even if DEPOT_WIDGET_SELL_CHAIN is resized for some reason                                                  */
   523 		w->widget[DEPOT_WIDGET_SELL_CHAIN].top    = ((w->widget[DEPOT_WIDGET_SELL_CHAIN].bottom - w->widget[DEPOT_WIDGET_SELL].top) / 2) + w->widget[DEPOT_WIDGET_SELL].top;
   523 		w->widget[DEPOT_WIDGET_SELL_CHAIN].top    = ((w->widget[DEPOT_WIDGET_SELL_CHAIN].bottom - w->widget[DEPOT_WIDGET_SELL].top) / 2) + w->widget[DEPOT_WIDGET_SELL].top;
   524 		w->widget[DEPOT_WIDGET_SELL].bottom     = w->widget[DEPOT_WIDGET_SELL_CHAIN].top - 1;
   524 		w->widget[DEPOT_WIDGET_SELL].bottom     = w->widget[DEPOT_WIDGET_SELL_CHAIN].top - 1;
   525 	}
   525 	}
   530  * Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the widget array
   530  * Vehicle specific text/sprites, that's in a widget, that's only shown for one vehicle type (like sell whole train) is set in the widget array
   531  */
   531  */
   532 static void SetupStringsForDepotWindow(BaseWindow *w, byte type)
   532 static void SetupStringsForDepotWindow(BaseWindow *w, byte type)
   533 {
   533 {
   534 	switch (type) {
   534 	switch (type) {
   535 		case VEH_Train:
   535 		case VEH_TRAIN:
   536 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_8800_TRAIN_DEPOT;
   536 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_8800_TRAIN_DEPOT;
   537 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
   537 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_TRAIN_TIP;
   538 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_TRAIN_TIP;
   538 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_TRAIN_TIP;
   539 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE;
   539 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_8841_DRAG_TRAIN_VEHICLE_TO_HERE;
   540 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
   540 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP;
   554 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_TRAIN;
   554 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_TRAIN;
   555 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_TRAIN;
   555 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_TRAIN;
   556 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_TRAIN;
   556 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_TRAIN;
   557 			break;
   557 			break;
   558 
   558 
   559 		case VEH_Road:
   559 		case VEH_ROAD:
   560 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9003_ROAD_VEHICLE_DEPOT;
   560 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9003_ROAD_VEHICLE_DEPOT;
   561 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_ROADVEH_TIP;
   561 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_ROADVEH_TIP;
   562 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_ROADVEH_TIP;
   562 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_ROADVEH_TIP;
   563 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9024_DRAG_ROAD_VEHICLE_TO_HERE;
   563 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9024_DRAG_ROAD_VEHICLE_TO_HERE;
   564 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
   564 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP;
   578 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_ROADVEH;
   578 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_ROADVEH;
   579 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_ROADVEH;
   579 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_ROADVEH;
   580 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_ROADVEH;
   580 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_ROADVEH;
   581 			break;
   581 			break;
   582 
   582 
   583 		case VEH_Ship:
   583 		case VEH_SHIP:
   584 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9803_SHIP_DEPOT;
   584 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_9803_SHIP_DEPOT;
   585 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_SHIP_TIP;
   585 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_DEPOT_SHIP_TIP;
   586 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_SHIP_TIP;
   586 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_DEPOT_SHIP_TIP;
   587 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9821_DRAG_SHIP_TO_HERE_TO_SELL;
   587 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_9821_DRAG_SHIP_TO_HERE_TO_SELL;
   588 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
   588 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_SHIP_TIP;
   602 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_SHIP;
   602 			w->widget[DEPOT_WIDGET_SELL].data        = SPR_SELL_SHIP;
   603 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_SHIP;
   603 			w->widget[DEPOT_WIDGET_SELL_ALL].data    = SPR_SELL_ALL_SHIP;
   604 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_SHIP;
   604 			w->widget[DEPOT_WIDGET_AUTOREPLACE].data = SPR_REPLACE_SHIP;
   605 			break;
   605 			break;
   606 
   606 
   607 		case VEH_Aircraft:
   607 		case VEH_AIRCRAFT:
   608 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_A002_AIRCRAFT_HANGAR;
   608 			w->widget[DEPOT_WIDGET_CAPTION].data      = STR_A002_AIRCRAFT_HANGAR;
   609 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_HANGAR_TIP;
   609 			w->widget[DEPOT_WIDGET_STOP_ALL].tooltips = STR_MASS_STOP_HANGAR_TIP;
   610 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_HANGAR_TIP;
   610 			w->widget[DEPOT_WIDGET_START_ALL].tooltips=	STR_MASS_START_HANGAR_TIP;
   611 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_A023_DRAG_AIRCRAFT_TO_HERE_TO;
   611 			w->widget[DEPOT_WIDGET_SELL].tooltips     = STR_A023_DRAG_AIRCRAFT_TO_HERE_TO;
   612 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
   612 			w->widget[DEPOT_WIDGET_SELL_ALL].tooltips =	STR_DEPOT_SELL_ALL_BUTTON_AIRCRAFT_TIP;
   636 uint _block_sizes[4][2];
   636 uint _block_sizes[4][2];
   637 
   637 
   638 /* Array to hold the default resize capacities
   638 /* Array to hold the default resize capacities
   639 * First part is the vehicle type, while the last is 0 = x, 1 = y */
   639 * First part is the vehicle type, while the last is 0 = x, 1 = y */
   640 const uint _resize_cap[][2] = {
   640 const uint _resize_cap[][2] = {
   641 /* VEH_Train */    {6, 10 * 29 + 36}, ///< flags, unitnumber and unit count uses a total of 36 pixels and we set default to 10 units
   641 /* VEH_TRAIN */    {6, 10 * 29 + 36}, ///< flags, unitnumber and unit count uses a total of 36 pixels and we set default to 10 units
   642 /* VEH_Road */     {5, 5},
   642 /* VEH_ROAD */     {5, 5},
   643 /* VEH_Ship */     {3, 3},
   643 /* VEH_SHIP */     {3, 3},
   644 /* VEH_Aircraft */ {3, 4},
   644 /* VEH_AIRCRAFT */ {3, 4},
   645 };
   645 };
   646 
   646 
   647 static void ResizeDefaultWindowSizeForTrains()
   647 static void ResizeDefaultWindowSizeForTrains()
   648 {
   648 {
   649 	_block_sizes[VEH_Train][0] = 1;
   649 	_block_sizes[VEH_TRAIN][0] = 1;
   650 	_block_sizes[VEH_Train][1] = GetVehicleListHeight(VEH_Train);
   650 	_block_sizes[VEH_TRAIN][1] = GetVehicleListHeight(VEH_TRAIN);
   651 }
   651 }
   652 
   652 
   653 static void ResizeDefaultWindowSizeForRoadVehicles()
   653 static void ResizeDefaultWindowSizeForRoadVehicles()
   654 {
   654 {
   655 	_block_sizes[VEH_Road][0] = 56;
   655 	_block_sizes[VEH_ROAD][0] = 56;
   656 	_block_sizes[VEH_Road][1] = GetVehicleListHeight(VEH_Road);
   656 	_block_sizes[VEH_ROAD][1] = GetVehicleListHeight(VEH_ROAD);
   657 }
   657 }
   658 
   658 
   659 static void ResizeDefaultWindowSize(byte type)
   659 static void ResizeDefaultWindowSize(byte type)
   660 {
   660 {
   661 	EngineID engine;
   661 	EngineID engine;
   665 	FOR_ALL_ENGINEIDS_OF_TYPE(engine, type) {
   665 	FOR_ALL_ENGINEIDS_OF_TYPE(engine, type) {
   666 		uint x, y;
   666 		uint x, y;
   667 
   667 
   668 		switch (type) {
   668 		switch (type) {
   669 			default: NOT_REACHED();
   669 			default: NOT_REACHED();
   670 			case VEH_Ship:     GetShipSpriteSize(    engine, x, y); break;
   670 			case VEH_SHIP:     GetShipSpriteSize(    engine, x, y); break;
   671 			case VEH_Aircraft: GetAircraftSpriteSize(engine, x, y); break;
   671 			case VEH_AIRCRAFT: GetAircraftSpriteSize(engine, x, y); break;
   672 		}
   672 		}
   673 		if (x > max_width)  max_width  = x;
   673 		if (x > max_width)  max_width  = x;
   674 		if (y > max_height) max_height = y;
   674 		if (y > max_height) max_height = y;
   675 	}
   675 	}
   676 
   676 
   677 	switch (type) {
   677 	switch (type) {
   678 		default: NOT_REACHED();
   678 		default: NOT_REACHED();
   679 		case VEH_Ship:
   679 		case VEH_SHIP:
   680 			_block_sizes[VEH_Ship][0] = max(90U, max_width + 20); // we need 20 pixels from the right edge to the sprite
   680 			_block_sizes[VEH_SHIP][0] = max(90U, max_width + 20); // we need 20 pixels from the right edge to the sprite
   681 			break;
   681 			break;
   682 		case VEH_Aircraft:
   682 		case VEH_AIRCRAFT:
   683 			_block_sizes[VEH_Aircraft][0] = max(74U, max_width);
   683 			_block_sizes[VEH_AIRCRAFT][0] = max(74U, max_width);
   684 			break;
   684 			break;
   685 	}
   685 	}
   686 	_block_sizes[type][1] = max(GetVehicleListHeight(type), max_height);
   686 	_block_sizes[type][1] = max(GetVehicleListHeight(type), max_height);
   687 }
   687 }
   688 
   688 
   690  * We will only need to call this once for each game */
   690  * We will only need to call this once for each game */
   691 void InitDepotWindowBlockSizes()
   691 void InitDepotWindowBlockSizes()
   692 {
   692 {
   693 	ResizeDefaultWindowSizeForTrains();
   693 	ResizeDefaultWindowSizeForTrains();
   694 	ResizeDefaultWindowSizeForRoadVehicles();
   694 	ResizeDefaultWindowSizeForRoadVehicles();
   695 	ResizeDefaultWindowSize(VEH_Ship);
   695 	ResizeDefaultWindowSize(VEH_SHIP);
   696 	ResizeDefaultWindowSize(VEH_Aircraft);
   696 	ResizeDefaultWindowSize(VEH_AIRCRAFT);
   697 }
   697 }
   698 
   698 
   699 static void CreateDepotListWindow(BaseWindow *w, byte type)
   699 static void CreateDepotListWindow(BaseWindow *w, byte type)
   700 {
   700 {
   701 	WP(w, depot_d).type = type;
   701 	WP(w, depot_d).type = type;
   715 
   715 
   716 	/* Enlarge the window to fit with the selected number of blocks of the selected size */
   716 	/* Enlarge the window to fit with the selected number of blocks of the selected size */
   717 	w->Resize(_block_sizes[type][0] * w->hscroll.cap,
   717 	w->Resize(_block_sizes[type][0] * w->hscroll.cap,
   718 	                _block_sizes[type][1] * w->vscroll.cap);
   718 	                _block_sizes[type][1] * w->vscroll.cap);
   719 
   719 
   720 	if (type == VEH_Train) {
   720 	if (type == VEH_TRAIN) {
   721 		/* The train depot has a horizontal scroller so we should make room for it */
   721 		/* The train depot has a horizontal scroller so we should make room for it */
   722 		w->Resize(0, 12);
   722 		w->Resize(0, 12);
   723 		/* substract the newly added space from the matrix since it was meant for the scrollbar */
   723 		/* substract the newly added space from the matrix since it was meant for the scrollbar */
   724 		w->widget[DEPOT_WIDGET_MATRIX].bottom -= 12;
   724 		w->widget[DEPOT_WIDGET_MATRIX].bottom -= 12;
   725 	}
   725 	}
   730 
   730 
   731 	SetupStringsForDepotWindow(w, type);
   731 	SetupStringsForDepotWindow(w, type);
   732 
   732 
   733 	w->widget[DEPOT_WIDGET_MATRIX].data =
   733 	w->widget[DEPOT_WIDGET_MATRIX].data =
   734 		(w->vscroll.cap * 0x100) // number of rows to draw on the background
   734 		(w->vscroll.cap * 0x100) // number of rows to draw on the background
   735 		+ (type == VEH_Train ? 1 : w->hscroll.cap); // number of boxes in each row. Trains always have just one
   735 		+ (type == VEH_TRAIN ? 1 : w->hscroll.cap); // number of boxes in each row. Trains always have just one
   736 
   736 
   737 
   737 
   738 	w->SetWidgetsHiddenState(type != VEH_Train,
   738 	w->SetWidgetsHiddenState(type != VEH_TRAIN,
   739 		DEPOT_WIDGET_H_SCROLL,
   739 		DEPOT_WIDGET_H_SCROLL,
   740 		DEPOT_WIDGET_SELL_CHAIN,
   740 		DEPOT_WIDGET_SELL_CHAIN,
   741 		WIDGET_LIST_END);
   741 		WIDGET_LIST_END);
   742 
   742 
   743 	ResizeDepotButtons(w);
   743 	ResizeDepotButtons(w);
   838 							STR_A002_AIRCRAFT_HANGAR
   838 							STR_A002_AIRCRAFT_HANGAR
   839 						};
   839 						};
   840 						TileIndex tile = w->window_number;
   840 						TileIndex tile = w->window_number;
   841 						byte vehtype = WP(w, depot_d).type;
   841 						byte vehtype = WP(w, depot_d).type;
   842 
   842 
   843 						SetDParam(0, (vehtype == VEH_Aircraft) ? GetStationIndex(tile) : GetDepotByTile(tile)->town_index);
   843 						SetDParam(0, (vehtype == VEH_AIRCRAFT) ? GetStationIndex(tile) : GetDepotByTile(tile)->town_index);
   844 						ShowQuery(
   844 						ShowQuery(
   845 							confirm_captions[vehtype],
   845 							confirm_captions[vehtype],
   846 							STR_DEPOT_SELL_CONFIRMATION_TEXT,
   846 							STR_DEPOT_SELL_CONFIRMATION_TEXT,
   847 							w,
   847 							w,
   848 							DepotSellAllConfirmationCallback
   848 							DepotSellAllConfirmationCallback
   894 					VehicleID sel = WP(w, depot_d).sel;
   894 					VehicleID sel = WP(w, depot_d).sel;
   895 
   895 
   896 					WP(w, depot_d).sel = INVALID_VEHICLE;
   896 					WP(w, depot_d).sel = INVALID_VEHICLE;
   897 					w->SetDirty();
   897 					w->SetDirty();
   898 
   898 
   899 					if (WP(w, depot_d).type == VEH_Train) {
   899 					if (WP(w, depot_d).type == VEH_TRAIN) {
   900 						GetDepotVehiclePtData gdvp;
   900 						GetDepotVehiclePtData gdvp;
   901 
   901 
   902 						if (GetVehicleFromDepotWndPt(w, e->we.dragdrop.pt.x, e->we.dragdrop.pt.y, &v, &gdvp) == MODE_DRAG_VEHICLE &&
   902 						if (GetVehicleFromDepotWndPt(w, e->we.dragdrop.pt.x, e->we.dragdrop.pt.y, &v, &gdvp) == MODE_DRAG_VEHICLE &&
   903 							sel != INVALID_VEHICLE) {
   903 							sel != INVALID_VEHICLE) {
   904 							if (gdvp.wagon != NULL && gdvp.wagon->index == sel && _ctrl_pressed) {
   904 							if (gdvp.wagon != NULL && gdvp.wagon->index == sel && _ctrl_pressed) {
   931 
   931 
   932 						v = GetVehicle(WP(w, depot_d).sel);
   932 						v = GetVehicle(WP(w, depot_d).sel);
   933 						WP(w, depot_d).sel = INVALID_VEHICLE;
   933 						WP(w, depot_d).sel = INVALID_VEHICLE;
   934 						w->SetDirty();
   934 						w->SetDirty();
   935 
   935 
   936 						sell_cmd = (v->type == VEH_Train && (e->we.click.widget == DEPOT_WIDGET_SELL_CHAIN || _ctrl_pressed)) ? 1 : 0;
   936 						sell_cmd = (v->type == VEH_TRAIN && (e->we.click.widget == DEPOT_WIDGET_SELL_CHAIN || _ctrl_pressed)) ? 1 : 0;
   937 
   937 
   938 						is_engine = (!(v->type == VEH_Train && !IsFrontEngine(v)));
   938 						is_engine = (!(v->type == VEH_TRAIN && !IsFrontEngine(v)));
   939 
   939 
   940 						if (is_engine) {
   940 						if (is_engine) {
   941 							_backup_orders_tile = v->tile;
   941 							_backup_orders_tile = v->tile;
   942 							BackupVehicleOrders(v, _backup_orders_data);
   942 							BackupVehicleOrders(v, _backup_orders_data);
   943 						}
   943 						}
   944 
   944 
   945 						switch (v->type) {
   945 						switch (v->type) {
   946 							case VEH_Train:    command = CMD_SELL_RAIL_WAGON | CMD_MSG(STR_8839_CAN_T_SELL_RAILROAD_VEHICLE); break;
   946 							case VEH_TRAIN:    command = CMD_SELL_RAIL_WAGON | CMD_MSG(STR_8839_CAN_T_SELL_RAILROAD_VEHICLE); break;
   947 							case VEH_Road:     command = CMD_SELL_ROAD_VEH | CMD_MSG(STR_9014_CAN_T_SELL_ROAD_VEHICLE);       break;
   947 							case VEH_ROAD:     command = CMD_SELL_ROAD_VEH | CMD_MSG(STR_9014_CAN_T_SELL_ROAD_VEHICLE);       break;
   948 							case VEH_Ship:     command = CMD_SELL_SHIP | CMD_MSG(STR_980C_CAN_T_SELL_SHIP);                   break;
   948 							case VEH_SHIP:     command = CMD_SELL_SHIP | CMD_MSG(STR_980C_CAN_T_SELL_SHIP);                   break;
   949 							case VEH_Aircraft: command = CMD_SELL_AIRCRAFT | CMD_MSG(STR_A01C_CAN_T_SELL_AIRCRAFT);           break;
   949 							case VEH_AIRCRAFT: command = CMD_SELL_AIRCRAFT | CMD_MSG(STR_A01C_CAN_T_SELL_AIRCRAFT);           break;
   950 							default: NOT_REACHED(); command = 0;
   950 							default: NOT_REACHED(); command = 0;
   951 						}
   951 						}
   952 
   952 
   953 						if (!DoCommandP(v->tile, v->index, sell_cmd, NULL, command) && is_engine) _backup_orders_tile = 0;
   953 						if (!DoCommandP(v->tile, v->index, sell_cmd, NULL, command) && is_engine) _backup_orders_tile = 0;
   954 					}
   954 					}
   960 			break;
   960 			break;
   961 
   961 
   962 		case WE_RESIZE:
   962 		case WE_RESIZE:
   963 			w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
   963 			w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
   964 			w->hscroll.cap += e->we.sizing.diff.x / (int)w->resize.step_width;
   964 			w->hscroll.cap += e->we.sizing.diff.x / (int)w->resize.step_width;
   965 			w->widget[DEPOT_WIDGET_MATRIX].data = (w->vscroll.cap << 8) + (WP(w, depot_d).type == VEH_Train ? 1 : w->hscroll.cap);
   965 			w->widget[DEPOT_WIDGET_MATRIX].data = (w->vscroll.cap << 8) + (WP(w, depot_d).type == VEH_TRAIN ? 1 : w->hscroll.cap);
   966 			ResizeDepotButtons(w);
   966 			ResizeDepotButtons(w);
   967 			break;
   967 			break;
   968 	}
   968 	}
   969 }
   969 }
   970 
   970 
   976 {
   976 {
   977 	BaseWindow *w;
   977 	BaseWindow *w;
   978 
   978 
   979 	switch (type) {
   979 	switch (type) {
   980 		default: NOT_REACHED();
   980 		default: NOT_REACHED();
   981 		case VEH_Train:
   981 		case VEH_TRAIN:
   982 			w = BaseWindow::AllocateFront(&_train_depot_desc, tile); break;
   982 			w = BaseWindow::AllocateFront(&_train_depot_desc, tile); break;
   983 		case VEH_Road:
   983 		case VEH_ROAD:
   984 			w = BaseWindow::AllocateFront(&_road_depot_desc, tile); break;
   984 			w = BaseWindow::AllocateFront(&_road_depot_desc, tile); break;
   985 		case VEH_Ship:
   985 		case VEH_SHIP:
   986 			w = BaseWindow::AllocateFront(&_ship_depot_desc, tile); break;
   986 			w = BaseWindow::AllocateFront(&_ship_depot_desc, tile); break;
   987 		case VEH_Aircraft:
   987 		case VEH_AIRCRAFT:
   988 			w = BaseWindow::AllocateFront(&_aircraft_depot_desc, tile); break;
   988 			w = BaseWindow::AllocateFront(&_aircraft_depot_desc, tile); break;
   989 	}
   989 	}
   990 
   990 
   991 	if (w != NULL) {
   991 	if (w != NULL) {
   992 		w->caption_color = GetTileOwner(tile);
   992 		w->caption_color = GetTileOwner(tile);