changeset 17568:cf44305677e8 draft

(svn r22332) -Fix: When inserting automatic orders, do not create consecutive duplicate orders.
author frosch <frosch@openttd.org>
date Sat, 16 Apr 2011 17:18:04 +0000
parents 3a23cb7f4a41
children 180462eff3ee
files src/vehicle.cpp
diffstat 1 files changed, 20 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -1861,20 +1861,28 @@
 		 * to show that we are stopping here, but only do that if the order
 		 * list isn't empty. */
 		Order *in_list = this->GetOrder(this->cur_auto_order_index);
-		if (in_list != NULL && this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID &&
+		if (in_list != NULL &&
 				(!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);
-			InsertOrder(this, auto_order, this->cur_auto_order_index);
-			if (this->cur_auto_order_index > 0) --this->cur_auto_order_index;
+				in_list->GetDestination() != this->last_station_visited)) {
+			/* Do not create consecutive duplicates of automatic orders */
+			Order *prev_order = this->cur_auto_order_index > 0 ? this->GetOrder(this->cur_auto_order_index - 1) : NULL;
+			if (prev_order == NULL ||
+					(!prev_order->IsType(OT_AUTOMATIC) && !prev_order->IsType(OT_GOTO_STATION)) ||
+					prev_order->GetDestination() != this->last_station_visited) {
 
-			/* InsertOrder disabled creation of automatic orders for all vehicles with the same automatic order.
-			 * Reenable it for this vehicle */
-			uint16 &gv_flags = this->GetGroundVehicleFlags();
-			ClrBit(gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS);
+				if (!suppress_automatic_orders && this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID && Order::CanAllocateItem()) {
+					/* Insert new automatic order */
+					Order *auto_order = new Order();
+					auto_order->MakeAutomatic(this->last_station_visited);
+					InsertOrder(this, auto_order, this->cur_auto_order_index);
+					if (this->cur_auto_order_index > 0) --this->cur_auto_order_index;
+
+					/* InsertOrder disabled creation of automatic orders for all vehicles with the same automatic order.
+					 * Reenable it for this vehicle */
+					uint16 &gv_flags = this->GetGroundVehicleFlags();
+					ClrBit(gv_flags, GVF_SUPPRESS_AUTOMATIC_ORDERS);
+				}
+			}
 		}
 		this->current_order.MakeLoading(false);
 	}