diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index 5e9a730625..f6575b9e94 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1423,6 +1423,17 @@ CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_ [is_road](Waypoint *wp) -> bool { return HasBit(wp->waypoint_flags, WPF_ROAD) == is_road; }); } +/** + * Clear any rail station platform reservation ahead of and behind train. + * @param v vehicle which may hold reservations + */ +void FreeTrainStationPlatformReservation(const Train *v) +{ + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); + v = v->Last(); + if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false); +} + /** * Clear platform reservation during station building/removing. * @param v vehicle which holds reservation @@ -1430,9 +1441,7 @@ CommandCost FindJoiningWaypoint(StationID existing_waypoint, StationID waypoint_ static void FreeTrainReservation(Train *v) { FreeTrainTrackReservation(v); - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(v->GetVehicleTrackdir()), false); - v = v->Last(); - if (IsRailStationTile(v->tile)) SetRailStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(v->GetVehicleTrackdir())), false); + FreeTrainStationPlatformReservation(v); } /** diff --git a/src/station_func.h b/src/station_func.h index dcfe6746e3..ad7a42f5e2 100644 --- a/src/station_func.h +++ b/src/station_func.h @@ -57,6 +57,8 @@ void IncreaseStats(Station *st, CargoID cargo, StationID next_station_id, uint c void RerouteCargo(Station *st, CargoID c, StationID avoid, StationID avoid2); void RerouteCargoFromSource(Station *st, CargoID c, StationID source, StationID avoid, StationID avoid2); +void FreeTrainStationPlatformReservation(const Train *v); + /** * Calculates the maintenance cost of a number of station tiles. * @param num Number of station tiles. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 5ce3549cb9..96a74c6ea6 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -6831,6 +6831,7 @@ void DeleteVisibleTrain(Train *v) /* delete train from back to front */ Train *u; Train *prev = v->Last(); + FreeTrainStationPlatformReservation(v); do { u = prev; prev = u->Previous();