1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-26 07:59:09 +00:00

Fix #10741: Rail platforms left partially reserved after train crash (#10751)

This commit is contained in:
Jonathan G Rennison
2023-05-04 21:45:13 +01:00
committed by Loïc Guilloux
parent 0569331f6b
commit b8eca7ddb1

View File

@@ -3559,6 +3559,20 @@ static Vehicle *CollectTrackbitsFromCrashedVehiclesEnum(Vehicle *v, void *data)
return nullptr;
}
static bool IsRailStationPlatformOccupied(TileIndex tile)
{
TileIndexDiff delta = (GetRailStationAxis(tile) == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
for (TileIndex t = tile; IsCompatibleTrainStationTile(t, tile); t -= delta) {
if (HasVehicleOnPos(t, nullptr, &TrainOnTileEnum)) return true;
}
for (TileIndex t = tile + delta; IsCompatibleTrainStationTile(t, tile); t += delta) {
if (HasVehicleOnPos(t, nullptr, &TrainOnTileEnum)) return true;
}
return false;
}
/**
* Deletes/Clears the last wagon of a crashed train. It takes the engine of the
* train, then goes to the last wagon and deletes that. Each call to this function
@@ -3617,6 +3631,13 @@ static void DeleteLastWagon(Train *v)
/* check if the wagon was on a road/rail-crossing */
if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile);
if (IsRailStationTile(tile)) {
bool occupied = IsRailStationPlatformOccupied(tile);
DiagDirection dir = AxisToDiagDir(GetRailStationAxis(tile));
SetRailStationPlatformReservation(tile, dir, occupied);
SetRailStationPlatformReservation(tile, ReverseDiagDir(dir), occupied);
}
/* Update signals */
if (IsTileType(tile, MP_TUNNELBRIDGE) || IsRailDepotTile(tile)) {
UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, owner);