From 7caebc2a77b4429ad3910ef4066a1d465ab6e22c Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 22 Mar 2016 22:08:26 +0000 Subject: [PATCH] Avoid aircraft leaving the state machine in the event of a breakdown. This can result in airport state machine blocks being left erroneously occupied, blocking the airport. --- src/aircraft_cmd.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 87831dcd04..ca5759ec69 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1124,11 +1124,23 @@ void FindBreakdownDestination(Aircraft *v) if(destination != INVALID_STATION) { if(destination != v->current_order.GetDestination()) { v->current_order.MakeGoToDepot(destination, ODTFB_BREAKDOWN); - AircraftNextAirportPos_and_Order(v); + if (v->state == FLYING) { + /* Do not change airport if in the middle of another airport's state machine, + * as this can result in the airport being left in a blocked state */ + AircraftNextAirportPos_and_Order(v); + } } else { v->current_order.MakeGoToDepot(destination, ODTFB_BREAKDOWN); } } else { + if (v->state != FLYING && v->targetairport != INVALID_STATION) { + /* Crashing whilst in an airport state machine is inconvenient + * as any blocks would need to then be marked unoccupied. + * Change the breakdown type to a speed reduction. */ + v->breakdown_type = BREAKDOWN_AIRCRAFT_SPEED; + v->breakdown_severity = 15; /* very slow */ + return; + } /* If no hangar was found, crash */ v->targetairport = INVALID_STATION; CrashAirplane(v);