Mercurial > hg > openttd
changeset 17564:d5ff867052a5 draft
(svn r22328) -Add: a flag to GroundVehicles to disable insertion and removal of automatic orders until the next real order is reached.
author | frosch <frosch@openttd.org> |
---|---|
date | Sat, 16 Apr 2011 16:45:35 +0000 |
parents | acf9e2d5558d |
children | 2ddbdf4793ab |
files | src/ground_vehicle.hpp src/train_cmd.cpp src/vehicle.cpp |
diffstat | 3 files changed, 25 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ground_vehicle.hpp +++ b/src/ground_vehicle.hpp @@ -50,8 +50,9 @@ /** Ground vehicle flags. */ enum GroundVehicleFlags { - GVF_GOINGUP_BIT = 0, - GVF_GOINGDOWN_BIT = 1, + GVF_GOINGUP_BIT = 0, ///< Vehicle is currently going uphill. (Cached track information for acceleration) + GVF_GOINGDOWN_BIT = 1, ///< Vehicle is currently going downhill. (Cached track information for acceleration) + GVF_SUPPRESS_AUTOMATIC_ORDERS = 2, ///< Disable insertion and removal of automatic orders until the vehicle completes the real order. }; /**
--- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2287,19 +2287,21 @@ class VehicleOrderSaver { private: - Vehicle *v; + Train *v; Order old_order; TileIndex old_dest_tile; StationID old_last_station_visited; VehicleOrderID index; + bool suppress_automatic_orders; public: - VehicleOrderSaver(Vehicle *_v) : + VehicleOrderSaver(Train *_v) : v(_v), old_order(_v->current_order), old_dest_tile(_v->dest_tile), old_last_station_visited(_v->last_station_visited), - index(_v->cur_real_order_index) + index(_v->cur_real_order_index), + suppress_automatic_orders(HasBit(_v->gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS)) { } @@ -2308,6 +2310,7 @@ this->v->current_order = this->old_order; this->v->dest_tile = this->old_dest_tile; this->v->last_station_visited = this->old_last_station_visited; + SB(this->v->gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS, 1, suppress_automatic_orders ? 1: 0); } /** @@ -3767,6 +3770,7 @@ return; } + SetBit(v->gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS); v->current_order.MakeGoToDepot(depot, ODTFB_SERVICE); v->dest_tile = tfdd.tile; SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, VVW_WIDGET_START_STOP_VEH);
--- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -1797,6 +1797,17 @@ */ void Vehicle::DeleteUnreachedAutoOrders() { + if (this->IsGroundVehicle()) { + uint16 &gv_flags = this->GetGroundVehicleFlags(); + if (HasBit(gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS)) { + /* Do not delete orders, only skip them */ + ClrBit(gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS); + this->cur_auto_order_index = this->cur_real_order_index; + InvalidateVehicleOrder(this, 0); + return; + } + } + const Order *order = this->GetOrder(this->cur_auto_order_index); while (order != NULL) { if (this->cur_auto_order_index == this->cur_real_order_index) break; @@ -1843,6 +1854,9 @@ this->current_order.SetNonStopType(ONSF_NO_STOP_AT_ANY_STATION); } else { + assert(this->IsGroundVehicle()); + bool suppress_automatic_orders = HasBit(this->GetGroundVehicleFlags(), GVF_SUPPRESS_AUTOMATIC_ORDERS); + /* We weren't scheduled to stop here. Insert an automatic order * to show that we are stopping here, but only do that if the order * list isn't empty. */ @@ -1850,6 +1864,7 @@ if (in_list != NULL && this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID && (!in_list->IsType(OT_AUTOMATIC) || in_list->GetDestination() != this->last_station_visited) && + !suppress_automatic_orders && Order::CanAllocateItem()) { Order *auto_order = new Order(); auto_order->MakeAutomatic(this->last_station_visited);