summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aircraft_cmd.cpp6
-rw-r--r--src/roadveh_cmd.cpp6
-rw-r--r--src/ship_cmd.cpp17
3 files changed, 25 insertions, 4 deletions
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 098e30c44..a330280be 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -1311,6 +1311,12 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
!v->current_order.IsType(OT_GOTO_DEPOT))
return;
+ /* We are leaving a hangar, but have to go to the exact same one; re-enter */
+ if (v->current_order.IsType(OT_GOTO_DEPOT) && v->current_order.GetDestination() == v->targetairport) {
+ VehicleEnterDepot(v);
+ return;
+ }
+
/* if the block of the next position is busy, stay put */
if (AirportHasBlock(v, &apc->layout[v->pos], apc)) return;
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 69c1a555d..5ef0946c5 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -941,6 +941,12 @@ static bool RoadVehLeaveDepot(RoadVehicle *v, bool first)
int y = TileY(v->tile) * TILE_SIZE + (rdp[RVC_DEPOT_START_FRAME].y & 0xF);
if (first) {
+ /* We are leaving a depot, but have to go to the exact same one; re-enter */
+ if (v->current_order.IsType(OT_GOTO_DEPOT) && v->tile == v->dest_tile) {
+ VehicleEnterDepot(v);
+ return true;
+ }
+
if (RoadVehFindCloseTo(v, x, y, v->direction, false) != NULL) return true;
VehicleServiceInDepot(v);
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index 6eb03ebbf..ccc0c33b5 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -266,9 +266,16 @@ static const TileIndexDiffC _ship_leave_depot_offs[] = {
{ 0, -1}
};
-static void CheckShipLeaveDepot(Ship *v)
+static bool CheckShipLeaveDepot(Ship *v)
{
- if (!v->IsInDepot()) return;
+ if (!v->IsInDepot()) return false;
+
+ /* We are leaving a depot, but have to go to the exact same one; re-enter */
+ if (v->current_order.IsType(OT_GOTO_DEPOT) &&
+ IsShipDepotTile(v->tile) && GetDepotIndex(v->tile) == v->current_order.GetDestination()) {
+ VehicleEnterDepot(v);
+ return true;
+ }
TileIndex tile = v->tile;
Axis axis = GetShipDepotAxis(tile);
@@ -280,7 +287,7 @@ static void CheckShipLeaveDepot(Ship *v)
} else if (DiagdirReachesTracks((DiagDirection)(axis + 2)) & GetTileShipTrackStatus(TILE_ADD(tile, -2 * ToTileIndexDiff(_ship_leave_depot_offs[axis])))) {
v->direction = AxisToDirection(axis);
} else {
- return;
+ return false;
}
v->state = AxisToTrackBits(axis);
@@ -294,6 +301,8 @@ static void CheckShipLeaveDepot(Ship *v)
VehicleServiceInDepot(v);
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
SetWindowClassesDirty(WC_SHIPS_LIST);
+
+ return false;
}
static bool ShipAccelerate(Vehicle *v)
@@ -446,7 +455,7 @@ static void ShipController(Ship *v)
if (v->current_order.IsType(OT_LOADING)) return;
- CheckShipLeaveDepot(v);
+ if (CheckShipLeaveDepot(v)) return;
v->ShowVisualEffect();