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