diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -1027,6 +1027,7 @@ CommandCost CmdBuildRailroadStation(Tile do { byte layout = *layout_ptr++; if (IsRailwayStationTile(tile) && GetRailwayStationReservation(tile)) { + /* Check for trains having a reservation for this tile. */ Vehicle *v = GetTrainForReservation(tile, AxisToTrack(GetRailStationAxis(tile))); if (v != NULL) { FreeTrainTrackReservation(v); @@ -1062,9 +1063,10 @@ CommandCost CmdBuildRailroadStation(Tile } while (--numtracks); for (uint i = 0; i < affected_vehicles.Length(); ++i) { + /* Restore reservations of trains. */ Vehicle *v = affected_vehicles[i]; if (IsRailwayStationTile(v->tile)) SetRailwayStationPlatformReservation(v->tile, TrackdirToExitdir(GetVehicleTrackdir(v)), true); - TryPathReserve(v, true); + TryPathReserve(v, true, true); for (; v->Next() != NULL; v = v->Next()) ; if (IsRailwayStationTile(v->tile)) SetRailwayStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(GetVehicleTrackdir(v))), true); } @@ -1198,7 +1200,14 @@ CommandCost CmdRemoveFromRailroadStation if (GetRailwayStationReservation(tile2)) { v = GetTrainForReservation(tile2, track); - if (v != NULL) FreeTrainTrackReservation(v); + if (v != NULL) { + /* Free train reservation. */ + FreeTrainTrackReservation(v); + if (IsRailwayStationTile(v->tile)) SetRailwayStationPlatformReservation(v->tile, TrackdirToExitdir(GetVehicleTrackdir(v)), false); + Vehicle *temp = v; + for (; temp->Next() != NULL; temp = temp->Next()) ; + if (IsRailwayStationTile(temp->tile)) SetRailwayStationPlatformReservation(temp->tile, TrackdirToExitdir(ReverseTrackdir(GetVehicleTrackdir(temp))), false); + } } DoClearSquare(tile2); @@ -1215,7 +1224,13 @@ CommandCost CmdRemoveFromRailroadStation st->MarkTilesDirty(false); UpdateStationSignCoord(st); - if (v != NULL) TryPathReserve(v, true); + if (v != NULL) { + /* Restore station reservation. */ + if (IsRailwayStationTile(v->tile)) SetRailwayStationPlatformReservation(v->tile, TrackdirToExitdir(GetVehicleTrackdir(v)), true); + TryPathReserve(v, true, true); + for (; v->Next() != NULL; v = v->Next()) ; + if (IsRailwayStationTile(v->tile)) SetRailwayStationPlatformReservation(v->tile, TrackdirToExitdir(ReverseTrackdir(GetVehicleTrackdir(v))), true); + } /* if we deleted the whole station, delete the train facility. */ if (st->train_tile == 0) {