diff src/order_cmd.cpp @ 12377:0762b2672bc9 draft

(svn r16802) -Fix [FS#3031]: service orders didn't behave like conditional orders; if a train doesn't need service it didn't completely skip the order, it would first send the vehicle towards the depot and would then realise it doesn't need to go there making it possible that the vehicle leaves that station on the wrong side.
author rubidium <rubidium@openttd.org>
date Mon, 13 Jul 2009 09:18:07 +0000 (2009-07-13)
parents 82830e1cd892
children 604a2cfc77ab
line wrap: on
line diff
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -1640,10 +1640,12 @@
  */
 bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth)
 {
+	if (conditional_depth > v->GetNumOrders()) return false;
+
 	switch (order->GetType()) {
 		case OT_GOTO_STATION:
 			v->dest_tile = v->GetOrderStationLocation(order->GetDestination());
-			break;
+			return true;
 
 		case OT_GOTO_DEPOT:
 			if (v->current_order.GetDepotActionType() & ODATFB_NEAREST_DEPOT) {
@@ -1667,19 +1669,19 @@
 							AircraftNextAirportPos_and_Order(a);
 						}
 					}
-				} else {
-					if (conditional_depth > v->GetNumOrders()) return false;
-
-					UpdateVehicleTimetable(v, true);
-					v->IncrementOrderIndex();
+					return true;
+				}
 
-					/* Get the current order */
-					const Order *order = v->GetOrder(v->cur_order_index);
-					v->current_order = *order;
-					return UpdateOrderDest(v, order, conditional_depth + 1);
+				UpdateVehicleTimetable(v, true);
+				v->IncrementOrderIndex();
+			} else if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) {
+				UpdateVehicleTimetable(v, true);
+				v->IncrementOrderIndex();
+			} else {
+				if (v->type != VEH_AIRCRAFT) {
+					v->dest_tile = Depot::Get(order->GetDestination())->xy;
 				}
-			} else if (v->type != VEH_AIRCRAFT) {
-				v->dest_tile = Depot::Get(order->GetDestination())->xy;
+				return true;
 			}
 			break;
 
@@ -1689,11 +1691,9 @@
 			} else {
 				v->dest_tile = Station::Get(order->GetDestination())->xy;
 			}
-			break;
+			return true;
 
 		case OT_CONDITIONAL: {
-			if (conditional_depth > v->GetNumOrders()) return false;
-
 			VehicleOrderID next_order = ProcessConditionalOrder(order, v);
 			if (next_order != INVALID_VEH_ORDER_ID) {
 				UpdateVehicleTimetable(v, false);
@@ -1703,20 +1703,20 @@
 				UpdateVehicleTimetable(v, true);
 				v->IncrementOrderIndex();
 			}
-
-			assert(v->cur_order_index < v->GetNumOrders());
-
-			/* Get the current order */
-			const Order *order = v->GetOrder(v->cur_order_index);
-			v->current_order = *order;
-			return UpdateOrderDest(v, order, conditional_depth + 1);
+			break;
 		}
 
 		default:
 			v->dest_tile = 0;
 			return false;
 	}
-	return true;
+
+	assert(v->cur_order_index < v->GetNumOrders());
+
+	/* Get the current order */
+	order = v->GetOrder(v->cur_order_index);
+	v->current_order = *order;
+	return UpdateOrderDest(v, order, conditional_depth + 1);
 }
 
 /**
@@ -1732,11 +1732,6 @@
 		case OT_GOTO_DEPOT:
 			/* Let a depot order in the orderlist interrupt. */
 			if (!(v->current_order.GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return false;
-
-			if ((v->current_order.GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) {
-				UpdateVehicleTimetable(v, true);
-				v->IncrementOrderIndex();
-			}
 			break;
 
 		case OT_LOADING: