From f71a96d584216c800b1fafd2d3f785635e9818a8 Mon Sep 17 00:00:00 2001 From: frosch Date: Tue, 14 Jun 2011 19:19:13 +0000 Subject: (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. --- src/order_cmd.cpp | 13 +++++++++++-- src/order_func.h | 2 +- src/train_cmd.cpp | 3 +-- 3 files changed, 13 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 21772f9bd..dee910a8a 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -1808,8 +1808,9 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v) * @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 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) 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 UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) 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 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) 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 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) 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 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth) } v->current_order = *order; - return UpdateOrderDest(v, order, conditional_depth + 1); + return UpdateOrderDest(v, order, conditional_depth + 1, pbs_look_ahead); } /** diff --git a/src/order_func.h b/src/order_func.h index c6ed76d23..ba3d7e6b5 100644 --- a/src/order_func.h +++ b/src/order_func.h @@ -22,7 +22,7 @@ void InvalidateVehicleOrder(const Vehicle *v, int data); 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); diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 35ded7fdf..8db6490b9 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2340,8 +2340,7 @@ public: 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); -- cgit v1.2.3-54-g00ecf