diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index b03e932aaa..d53bcf5fc1 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -1158,11 +1158,18 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags) Track track = DiagDirToDiagTrack(dir); Owner owner = GetTileOwner(tile); - Train *v = nullptr; - if (HasTunnelReservation(tile)) { - v = GetTrainForReservation(tile, track); - if (v != nullptr) FreeTrainTrackReservation(v); - } + std::vector vehicles_affected; + auto check_tile = [&](TileIndex t) { + if (HasTunnelReservation(t)) { + Train *v = GetTrainForReservation(t, track); + if (v != nullptr) { + FreeTrainTrackReservation(v); + vehicles_affected.push_back(v); + } + } + }; + check_tile(tile); + check_tile(endtile); if (Company::IsValidID(owner)) { Company::Get(owner)->infrastructure.rail[GetRailType(tile)] -= len * TUNNELBRIDGE_TRACKBIT_FACTOR; @@ -1184,7 +1191,9 @@ static CommandCost DoClearTunnel(TileIndex tile, DoCommandFlag flags) YapfNotifyTrackLayoutChange(tile, track); YapfNotifyTrackLayoutChange(endtile, track); - if (v != nullptr) TryPathReserve(v); + for (Train *v : vehicles_affected) { + TryPathReserve(v); + } } else { /* A full diagonal road tile has two road bits. */ UpdateCompanyRoadInfrastructure(GetRoadTypeRoad(tile), GetRoadOwner(tile, RTT_ROAD), -(int)(len * 2 * TUNNELBRIDGE_TRACKBIT_FACTOR));