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 } |
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); |