summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ground_vehicle.hpp5
-rw-r--r--src/train_cmd.cpp10
-rw-r--r--src/vehicle.cpp15
3 files changed, 25 insertions, 5 deletions
diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp
index 941ddca15..225ce0edb 100644
--- a/src/ground_vehicle.hpp
+++ b/src/ground_vehicle.hpp
@@ -50,8 +50,9 @@ struct GroundVehicleCache {
/** 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.
};
/**
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 100b467ff..92ee36e30 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2287,19 +2287,21 @@ static bool TryReserveSafeTrack(const Train *v, TileIndex tile, Trackdir td, boo
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 @@ public:
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 @@ static void CheckIfTrainNeedsService(Train *v)
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);
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index 38437c1b9..81880f3c3 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -1797,6 +1797,17 @@ uint GetVehicleCapacity(const Vehicle *v, uint16 *mail_capacity)
*/
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 @@ void Vehicle::BeginLoading()
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 @@ void Vehicle::BeginLoading()
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);