Fix rail platforms being left partially reserved after deleting train

Due to company being removed when infrastructure sharing in use
This commit is contained in:
Jonathan G Rennison
2023-05-01 12:34:57 +01:00
parent aa28fcf7de
commit dc56add6a3
3 changed files with 15 additions and 3 deletions

View File

@@ -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);
}
/**

View File

@@ -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.

View File

@@ -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();