96 /* delete */ |
96 /* delete */ |
97 w->SetWidgetDisabledState(ORDER_WIDGET_DELETE, |
97 w->SetWidgetDisabledState(ORDER_WIDGET_DELETE, |
98 (uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel); |
98 (uint)v->num_orders + ((shared_orders || v->num_orders != 0) ? 1 : 0) <= (uint)WP(w, order_d).sel); |
99 |
99 |
100 /* non-stop only for trains */ |
100 /* non-stop only for trains */ |
101 w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP, v->type != VEH_Train || order == NULL); |
101 w->SetWidgetDisabledState(ORDER_WIDGET_NON_STOP, v->type != VEH_TRAIN || order == NULL); |
102 w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load |
102 w->SetWidgetDisabledState(ORDER_WIDGET_FULL_LOAD, order == NULL); // full load |
103 w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD, order == NULL); // unload |
103 w->SetWidgetDisabledState(ORDER_WIDGET_UNLOAD, order == NULL); // unload |
104 w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER, order == NULL); // transfer |
104 w->SetWidgetDisabledState(ORDER_WIDGET_TRANSFER, order == NULL); // transfer |
105 /* Disable list of vehicles with the same shared orders if there is no list */ |
105 /* Disable list of vehicles with the same shared orders if there is no list */ |
106 w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL); |
106 w->SetWidgetDisabledState(ORDER_WIDGET_SHARED_ORDER_LIST, !shared_orders || v->orders == NULL); |
160 break; |
160 break; |
161 |
161 |
162 case OT_GOTO_DEPOT: { |
162 case OT_GOTO_DEPOT: { |
163 StringID s = STR_NULL; |
163 StringID s = STR_NULL; |
164 |
164 |
165 if (v->type == VEH_Aircraft) { |
165 if (v->type == VEH_AIRCRAFT) { |
166 s = STR_GO_TO_AIRPORT_HANGAR; |
166 s = STR_GO_TO_AIRPORT_HANGAR; |
167 SetDParam(2, order->dest); |
167 SetDParam(2, order->dest); |
168 } else { |
168 } else { |
169 SetDParam(2, GetDepot(order->dest)->town_index); |
169 SetDParam(2, GetDepot(order->dest)->town_index); |
170 |
170 |
171 switch (v->type) { |
171 switch (v->type) { |
172 case VEH_Train: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break; |
172 case VEH_TRAIN: s = (order->flags & OF_NON_STOP) ? STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT : STR_GO_TO_TRAIN_DEPOT; break; |
173 case VEH_Road: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; |
173 case VEH_ROAD: s = STR_9038_GO_TO_ROADVEH_DEPOT; break; |
174 case VEH_Ship: s = STR_GO_TO_SHIP_DEPOT; break; |
174 case VEH_SHIP: s = STR_GO_TO_SHIP_DEPOT; break; |
175 default: break; |
175 default: break; |
176 } |
176 } |
177 } |
177 } |
178 |
178 |
179 if (order->flags & OF_FULL_LOAD) s++; /* service at */ |
179 if (order->flags & OF_FULL_LOAD) s++; /* service at */ |
229 |
229 |
230 // check depot first |
230 // check depot first |
231 if (_patches.gotodepot) { |
231 if (_patches.gotodepot) { |
232 switch (GetTileType(tile)) { |
232 switch (GetTileType(tile)) { |
233 case MP_RAILWAY: |
233 case MP_RAILWAY: |
234 if (v->type == VEH_Train && IsTileOwner(tile, _local_player)) { |
234 if (v->type == VEH_TRAIN && IsTileOwner(tile, _local_player)) { |
235 if (IsRailDepot(tile)) { |
235 if (IsRailDepot(tile)) { |
236 order.type = OT_GOTO_DEPOT; |
236 order.type = OT_GOTO_DEPOT; |
237 order.flags = OF_PART_OF_ORDERS; |
237 order.flags = OF_PART_OF_ORDERS; |
238 order.dest = GetDepotByTile(tile)->index; |
238 order.dest = GetDepotByTile(tile)->index; |
239 return order; |
239 return order; |
240 } |
240 } |
241 } |
241 } |
242 break; |
242 break; |
243 |
243 |
244 case MP_STREET: |
244 case MP_STREET: |
245 if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_Road && IsTileOwner(tile, _local_player)) { |
245 if (GetRoadTileType(tile) == ROAD_TILE_DEPOT && v->type == VEH_ROAD && IsTileOwner(tile, _local_player)) { |
246 order.type = OT_GOTO_DEPOT; |
246 order.type = OT_GOTO_DEPOT; |
247 order.flags = OF_PART_OF_ORDERS; |
247 order.flags = OF_PART_OF_ORDERS; |
248 order.dest = GetDepotByTile(tile)->index; |
248 order.dest = GetDepotByTile(tile)->index; |
249 return order; |
249 return order; |
250 } |
250 } |
251 break; |
251 break; |
252 |
252 |
253 case MP_STATION: |
253 case MP_STATION: |
254 if (v->type != VEH_Aircraft) break; |
254 if (v->type != VEH_AIRCRAFT) break; |
255 if (IsHangar(tile) && IsTileOwner(tile, _local_player)) { |
255 if (IsHangar(tile) && IsTileOwner(tile, _local_player)) { |
256 order.type = OT_GOTO_DEPOT; |
256 order.type = OT_GOTO_DEPOT; |
257 order.flags = OF_PART_OF_ORDERS; |
257 order.flags = OF_PART_OF_ORDERS; |
258 order.dest = GetStationIndex(tile); |
258 order.dest = GetStationIndex(tile); |
259 return order; |
259 return order; |
260 } |
260 } |
261 break; |
261 break; |
262 |
262 |
263 case MP_WATER: |
263 case MP_WATER: |
264 if (v->type != VEH_Ship) break; |
264 if (v->type != VEH_SHIP) break; |
265 if (IsTileDepotType(tile, TRANSPORT_WATER) && |
265 if (IsTileDepotType(tile, TRANSPORT_WATER) && |
266 IsTileOwner(tile, _local_player)) { |
266 IsTileOwner(tile, _local_player)) { |
267 TileIndex tile2 = GetOtherShipDepotTile(tile); |
267 TileIndex tile2 = GetOtherShipDepotTile(tile); |
268 |
268 |
269 order.type = OT_GOTO_DEPOT; |
269 order.type = OT_GOTO_DEPOT; |
277 } |
277 } |
278 } |
278 } |
279 |
279 |
280 // check waypoint |
280 // check waypoint |
281 if (IsTileType(tile, MP_RAILWAY) && |
281 if (IsTileType(tile, MP_RAILWAY) && |
282 v->type == VEH_Train && |
282 v->type == VEH_TRAIN && |
283 IsTileOwner(tile, _local_player) && |
283 IsTileOwner(tile, _local_player) && |
284 IsRailWaypoint(tile)) { |
284 IsRailWaypoint(tile)) { |
285 order.type = OT_GOTO_WAYPOINT; |
285 order.type = OT_GOTO_WAYPOINT; |
286 order.flags = 0; |
286 order.flags = 0; |
287 order.dest = GetWaypointByTile(tile)->index; |
287 order.dest = GetWaypointByTile(tile)->index; |
292 StationID st_index = GetStationIndex(tile); |
292 StationID st_index = GetStationIndex(tile); |
293 const Station *st = GetStation(st_index); |
293 const Station *st = GetStation(st_index); |
294 |
294 |
295 if (st->owner == _current_player || st->owner == OWNER_NONE) { |
295 if (st->owner == _current_player || st->owner == OWNER_NONE) { |
296 byte facil; |
296 byte facil; |
297 (facil=FACIL_DOCK, v->type == VEH_Ship) || |
297 (facil=FACIL_DOCK, v->type == VEH_SHIP) || |
298 (facil=FACIL_TRAIN, v->type == VEH_Train) || |
298 (facil=FACIL_TRAIN, v->type == VEH_TRAIN) || |
299 (facil=FACIL_AIRPORT, v->type == VEH_Aircraft) || |
299 (facil=FACIL_AIRPORT, v->type == VEH_AIRCRAFT) || |
300 (facil=FACIL_BUS_STOP, v->type == VEH_Road && v->cargo_type == CT_PASSENGERS) || |
300 (facil=FACIL_BUS_STOP, v->type == VEH_ROAD && v->cargo_type == CT_PASSENGERS) || |
301 (facil=FACIL_TRUCK_STOP, 1); |
301 (facil=FACIL_TRUCK_STOP, 1); |
302 if (st->facilities & facil) { |
302 if (st->facilities & facil) { |
303 order.type = OT_GOTO_STATION; |
303 order.type = OT_GOTO_STATION; |
304 order.flags = 0; |
304 order.flags = 0; |
305 order.dest = st_index; |
305 order.dest = st_index; |
307 } |
307 } |
308 } |
308 } |
309 } |
309 } |
310 |
310 |
311 // not found |
311 // not found |
312 order.type = OT_NOTHING; |
312 order.Free(); |
313 order.flags = 0; |
|
314 order.dest = INVALID_STATION; |
313 order.dest = INVALID_STATION; |
315 return order; |
314 return order; |
316 } |
315 } |
317 |
316 |
318 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, BaseWindow *w) |
317 static bool HandleOrderVehClick(const Vehicle *v, const Vehicle *u, BaseWindow *w) |
319 { |
318 { |
320 if (u->type != v->type) return false; |
319 if (u->type != v->type) return false; |
321 |
320 |
322 if (u->type == VEH_Train && !IsFrontEngine(u)) { |
321 if (u->type == VEH_TRAIN && !IsFrontEngine(u)) { |
323 u = GetFirstVehicleInChain(u); |
322 u = GetFirstVehicleInChain(u); |
324 if (!IsFrontEngine(u)) return false; |
323 if (!IsFrontEngine(u)) return false; |
325 } |
324 } |
326 |
325 |
327 // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet |
326 // v is vehicle getting orders. Only copy/clone orders if vehicle doesn't have any orders yet |
345 // check if we're clicking on a vehicle first.. clone orders in that case. |
344 // check if we're clicking on a vehicle first.. clone orders in that case. |
346 u = CheckMouseOverVehicle(); |
345 u = CheckMouseOverVehicle(); |
347 if (u != NULL && HandleOrderVehClick(v, u, w)) return; |
346 if (u != NULL && HandleOrderVehClick(v, u, w)) return; |
348 |
347 |
349 cmd = GetOrderCmdFromTile(v, tile); |
348 cmd = GetOrderCmdFromTile(v, tile); |
350 if (cmd.type == OT_NOTHING) return; |
349 if (!cmd.IsValid()) return; |
351 |
350 |
352 if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) { |
351 if (DoCommandP(v->tile, v->index + (OrderGetSel(w) << 16), PackOrder(&cmd), NULL, CMD_INSERT_ORDER | CMD_MSG(STR_8833_CAN_T_INSERT_NEW_ORDER))) { |
353 if (WP(w,order_d).sel != -1) WP(w,order_d).sel++; |
352 if (WP(w,order_d).sel != -1) WP(w,order_d).sel++; |
354 ResetObjectToPlace(); |
353 ResetObjectToPlace(); |
355 } |
354 } |
463 const Order *ord = GetVehicleOrder(v, sel); |
462 const Order *ord = GetVehicleOrder(v, sel); |
464 TileIndex xy; |
463 TileIndex xy; |
465 |
464 |
466 switch (ord->type) { |
465 switch (ord->type) { |
467 case OT_GOTO_STATION: xy = GetStation(ord->dest)->xy ; break; |
466 case OT_GOTO_STATION: xy = GetStation(ord->dest)->xy ; break; |
468 case OT_GOTO_DEPOT: xy = (v->type == VEH_Aircraft) ? GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy; break; |
467 case OT_GOTO_DEPOT: xy = (v->type == VEH_AIRCRAFT) ? GetStation(ord->dest)->xy : GetDepot(ord->dest)->xy; break; |
469 case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break; |
468 case OT_GOTO_WAYPOINT: xy = GetWaypoint(ord->dest)->xy; break; |
470 default: xy = 0; break; |
469 default: xy = 0; break; |
471 } |
470 } |
472 |
471 |
473 if (xy != 0) ScrollMainWindowToTile(xy); |
472 if (xy != 0) ScrollMainWindowToTile(xy); |
675 DeleteWindowById(WC_VEHICLE_DETAILS, veh); |
674 DeleteWindowById(WC_VEHICLE_DETAILS, veh); |
676 |
675 |
677 if (v->owner != _local_player) { |
676 if (v->owner != _local_player) { |
678 w = BaseWindow::AllocateFront(&_other_orders_desc, veh); |
677 w = BaseWindow::AllocateFront(&_other_orders_desc, veh); |
679 } else { |
678 } else { |
680 w = BaseWindow::AllocateFront((v->type == VEH_Train) ? &_orders_train_desc : &_orders_desc, veh); |
679 w = BaseWindow::AllocateFront((v->type == VEH_TRAIN) ? &_orders_train_desc : &_orders_desc, veh); |
681 } |
680 } |
682 |
681 |
683 if (w != NULL) { |
682 if (w != NULL) { |
684 w->caption_color = v->owner; |
683 w->caption_color = v->owner; |
685 w->vscroll.cap = 6; |
684 w->vscroll.cap = 6; |