changeset 17804:7fc728e847d1 draft

(svn r22589) -Fix [FS#4641]: PBS order forecasting modified the current order index in case of a goto-nearest-depot order and no depot could be found.
author frosch <frosch@openttd.org>
date Tue, 14 Jun 2011 19:19:13 +0000
parents 3d33b9642678
children 6d8a11a27468
files src/order_cmd.cpp src/order_func.h src/train_cmd.cpp
diffstat 3 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -1808,8 +1808,9 @@
  * @param order the order the vehicle currently has
  * @param v the vehicle to update
  * @param conditional_depth the depth (amount of steps) to go with conditional orders. This to prevent infinite loops.
+ * @param pbs_look_ahead Whether we are forecasting orders for pbs reservations in advance. If true, the order indices must not be modified.
  */
-bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth)
+bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool pbs_look_ahead)
 {
 	if (conditional_depth > v->GetNumOrders()) return false;
 
@@ -1820,6 +1821,7 @@
 
 		case OT_GOTO_DEPOT:
 			if ((order->GetDepotOrderType() & ODTFB_SERVICE) && !v->NeedsServicing()) {
+				assert(!pbs_look_ahead);
 				UpdateVehicleTimetable(v, true);
 				v->IncrementRealOrderIndex();
 				break;
@@ -1832,6 +1834,9 @@
 				bool reverse;
 
 				if (v->FindClosestDepot(&location, &destination, &reverse)) {
+					/* PBS reservations cannot reverse */
+					if (pbs_look_ahead && reverse) return false;
+
 					v->dest_tile = location;
 					v->current_order.MakeGoToDepot(destination, v->current_order.GetDepotOrderType(), v->current_order.GetNonStopType(), (OrderDepotActionFlags)(v->current_order.GetDepotActionType() & ~ODATFB_NEAREST_DEPOT), v->current_order.GetRefitCargo(), v->current_order.GetRefitSubtype());
 
@@ -1849,6 +1854,9 @@
 					return true;
 				}
 
+				/* If there is no depot, we cannot help PBS either. */
+				if (pbs_look_ahead) return false;
+
 				UpdateVehicleTimetable(v, true);
 				v->IncrementRealOrderIndex();
 			} else {
@@ -1864,6 +1872,7 @@
 			return true;
 
 		case OT_CONDITIONAL: {
+			assert(!pbs_look_ahead);
 			VehicleOrderID next_order = ProcessConditionalOrder(order, v);
 			if (next_order != INVALID_VEH_ORDER_ID) {
 				/* Jump to next_order. cur_implicit_order_index becomes exactly that order,
@@ -1908,7 +1917,7 @@
 	}
 
 	v->current_order = *order;
-	return UpdateOrderDest(v, order, conditional_depth + 1);
+	return UpdateOrderDest(v, order, conditional_depth + 1, pbs_look_ahead);
 }
 
 /**
--- a/src/order_func.h
+++ b/src/order_func.h
@@ -22,7 +22,7 @@
 void CheckOrders(const Vehicle*);
 void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist = false, bool reset_order_indices = true);
 bool ProcessOrders(Vehicle *v);
-bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth = 0);
+bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth = 0, bool pbs_look_ahead = false);
 VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v);
 
 void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int y, bool selected, bool timetable, int left, int middle, int right);
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2340,8 +2340,7 @@
 				case OT_GOTO_STATION:
 				case OT_GOTO_WAYPOINT:
 					this->v->current_order = *order;
-					UpdateOrderDest(this->v, order);
-					return true;
+					return UpdateOrderDest(this->v, order, 0, true);
 				case OT_CONDITIONAL: {
 					if (conditional_depth > this->v->GetNumOrders()) return false;
 					VehicleOrderID next = ProcessConditionalOrder(order, this->v);