Mercurial > hg > openttd
changeset 8830:981a95f3204d draft
(svn r12578) -Codechange: merge the aircrafts ProcessOrder too into the 'unified' ProcessOrder.
author | rubidium <rubidium@openttd.org> |
---|---|
date | Sat, 05 Apr 2008 12:01:34 +0000 |
parents | 2557485ff613 |
children | 61f2c9cd0544 |
files | src/aircraft.h src/aircraft_cmd.cpp src/order_cmd.cpp src/order_func.h src/roadveh_cmd.cpp src/ship_cmd.cpp src/train_cmd.cpp |
diffstat | 7 files changed, 75 insertions(+), 88 deletions(-) [+] |
line wrap: on
line diff
--- a/src/aircraft.h +++ b/src/aircraft.h @@ -126,6 +126,7 @@ bool IsInDepot() const { return (this->vehstatus & VS_HIDDEN) != 0 && IsHangarTile(this->tile); } void Tick(); void OnNewDay(); + TileIndex GetOrderStationLocation(StationID station); }; #endif /* AIRCRAFT_H */
--- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1361,74 +1361,48 @@ } } -static void ProcessAircraftOrder(Vehicle *v) +void HandleMissingAircraftOrders(Vehicle *v) { - switch (v->current_order.type) { - case OT_GOTO_DEPOT: - if (!(v->current_order.flags & OFB_PART_OF_ORDERS)) return; - if (v->current_order.flags & OFB_SERVICE_IF_NEEDED && - !VehicleNeedsService(v)) { - UpdateVehicleTimetable(v, true); - v->cur_order_index++; - } - break; + /* + * We do not have an order. This can be divided into two cases: + * 1) we are heading to an invalid station. In this case we must + * find another airport to go to. If there is nowhere to go, + * we will destroy the aircraft as it otherwise will enter + * the holding pattern for the first airport, which can cause + * the plane to go into an undefined state when building an + * airport with the same StationID. + * 2) we are (still) heading to a (still) valid airport, then we + * can continue going there. This can happen when you are + * changing the aircraft's orders while in-flight or in for + * example a depot. However, when we have a current order to + * go to a depot, we have to keep that order so the aircraft + * actually stops. + */ + const Station *st = GetStation(v->u.air.targetairport); + if (!st->IsValid() || st->airport_tile == 0) { + CommandCost ret; + PlayerID old_player = _current_player; - case OT_LOADING: return; + _current_player = v->owner; + ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR); + _current_player = old_player; - default: break; + if (CmdFailed(ret)) CrashAirplane(v); + } else if (v->current_order.type != OT_GOTO_DEPOT) { + v->current_order.Free(); + } +} + + +TileIndex Aircraft::GetOrderStationLocation(StationID station) +{ + /* Orders are changed in flight, ensure going to the right station. */ + if (this->u.air.state == FLYING) { + AircraftNextAirportPos_and_Order(this); } - if (v->cur_order_index >= v->num_orders) v->cur_order_index = 0; - - const Order *order = GetVehicleOrder(v, v->cur_order_index); - - if (order == NULL|| (order->type == OT_DUMMY && !CheckForValidOrders(v))) { - /* - * We do not have an order. This can be divided into two cases: - * 1) we are heading to an invalid station. In this case we must - * find another airport to go to. If there is nowhere to go, - * we will destroy the aircraft as it otherwise will enter - * the holding pattern for the first airport, which can cause - * the plane to go into an undefined state when building an - * airport with the same StationID. - * 2) we are (still) heading to a (still) valid airport, then we - * can continue going there. This can happen when you are - * changing the aircraft's orders while in-flight or in for - * example a depot. However, when we have a current order to - * go to a depot, we have to keep that order so the aircraft - * actually stops. - */ - const Station *st = GetStation(v->u.air.targetairport); - if (!st->IsValid() || st->airport_tile == 0) { - CommandCost ret; - PlayerID old_player = _current_player; - - _current_player = v->owner; - ret = DoCommand(v->tile, v->index, 0, DC_EXEC, CMD_SEND_AIRCRAFT_TO_HANGAR); - _current_player = old_player; - - if (CmdFailed(ret)) CrashAirplane(v); - } else if (v->current_order.type != OT_GOTO_DEPOT) { - v->current_order.Free(); - } - return; - } - - if (order->type == v->current_order.type && - order->flags == v->current_order.flags && - order->dest == v->current_order.dest) - return; - - v->current_order = *order; - - /* orders are changed in flight, ensure going to the right station */ - if (order->type == OT_GOTO_STATION && v->u.air.state == FLYING) { - AircraftNextAirportPos_and_Order(v); - } - - InvalidateVehicleOrder(v); - - InvalidateWindowClasses(WC_AIRCRAFT_LIST); + /* Aircraft do not use dest-tile */ + return 0; } void Aircraft::MarkDirty() @@ -2149,7 +2123,7 @@ } HandleAircraftSmoke(v); - ProcessAircraftOrder(v); + ProcessOrders(v); v->HandleLoading(loop != 0); if (v->current_order.type >= OT_LOADING) return;
--- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1278,6 +1278,22 @@ } /** + * + * Check if a vehicle has any valid orders + * + * @return false if there are no valid orders + * + */ +static bool CheckForValidOrders(const Vehicle *v) +{ + const Order *order; + + FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true; + + return false; +} + +/** * Handle the orders of a vehicle and determine the next place * to go to if needed. * @param v the vehicle to do this for. @@ -1298,8 +1314,11 @@ break; case OT_LOADING: + return false; + case OT_LEAVESTATION: - return false; + if (v->type != VEH_AIRCRAFT) return false; + break; default: break; } @@ -1334,7 +1353,14 @@ const Order *order = GetVehicleOrder(v, v->cur_order_index); /* If no order, do nothing. */ - if (order == NULL) { + if (order == NULL || (v->type == VEH_AIRCRAFT && order->type == OT_DUMMY && !CheckForValidOrders(v))) { + if (v->type == VEH_AIRCRAFT) { + /* Aircraft do something vastly different here, so handle separately */ + extern void HandleMissingAircraftOrders(Vehicle *v); + HandleMissingAircraftOrders(v); + return false; + } + v->current_order.Free(); v->dest_tile = 0; if (v->type == VEH_ROAD) ClearSlot(v); @@ -1361,6 +1387,7 @@ case VEH_TRAIN: break; + case VEH_AIRCRAFT: case VEH_SHIP: InvalidateWindowClasses(v->GetVehicleListWindowClass()); break; @@ -1368,14 +1395,11 @@ switch (order->type) { case OT_GOTO_STATION: - if (order->dest == v->last_station_visited) { - v->last_station_visited = INVALID_STATION; - } v->dest_tile = v->GetOrderStationLocation(order->dest); break; case OT_GOTO_DEPOT: - v->dest_tile = GetDepot(order->dest)->xy; + if (v->type != VEH_AIRCRAFT) v->dest_tile = GetDepot(order->dest)->xy; break; case OT_GOTO_WAYPOINT: @@ -1390,22 +1414,6 @@ return may_reverse; } -/** - * - * Check if a vehicle has any valid orders - * - * @return false if there are no valid orders - * - */ -bool CheckForValidOrders(const Vehicle* v) -{ - const Order *order; - - FOR_VEHICLE_ORDERS(v, order) if (order->type != OT_DUMMY) return true; - - return false; -} - void InitializeOrders() { _Order_pool.CleanPool();
--- a/src/order_func.h +++ b/src/order_func.h @@ -35,7 +35,6 @@ bool VehicleHasDepotOrders(const Vehicle *v); void CheckOrders(const Vehicle*); void DeleteVehicleOrders(Vehicle *v); -bool CheckForValidOrders(const Vehicle* v); bool ProcessOrders(Vehicle *v); #define MIN_SERVINT_PERCENT 5
--- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -756,8 +756,9 @@ TileIndex RoadVehicle::GetOrderStationLocation(StationID station) { + if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION; + TileIndex dest = INVALID_TILE; - const RoadStop *rs = GetStation(station)->GetPrimaryRoadStop(this); if (rs != NULL) { uint mindist = MAX_UVALUE(uint);
--- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -244,6 +244,8 @@ TileIndex Ship::GetOrderStationLocation(StationID station) { + if (station == this->last_station_visited) this->last_station_visited = INVALID_STATION; + Station *st = GetStation(station); if (st->dock_tile != 0) { return TILE_ADD(st->dock_tile, ToTileIndexDiff(GetDockOffset(st->dock_tile)));