diff --git a/TransitWebViewer/Components/Timetables/LineTimetable/LineTimetable.razor b/TransitWebViewer/Components/Timetables/LineTimetable/LineTimetable.razor
index 3b6a066..7152f05 100644
--- a/TransitWebViewer/Components/Timetables/LineTimetable/LineTimetable.razor
+++ b/TransitWebViewer/Components/Timetables/LineTimetable/LineTimetable.razor
@@ -8,7 +8,7 @@
}
else
{
-
+
|
diff --git a/VipTimetable/Lines/Bus605/Bus605.cs b/VipTimetable/Lines/Bus605/Bus605.cs
index 8f67965..15a950c 100644
--- a/VipTimetable/Lines/Bus605/Bus605.cs
+++ b/VipTimetable/Lines/Bus605/Bus605.cs
@@ -2,5 +2,6 @@ namespace VipTimetable.Lines.Bus605;
internal class Bus605 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus605From20241214(), new Bus605From20241215()];
+ public IEnumerable LineInstances { get; } =
+ [new Bus605From20241214(), new Bus605From20241215(), new Bus605From20250203()];
}
diff --git a/VipTimetable/Lines/Bus605/Bus605From20250203.cs b/VipTimetable/Lines/Bus605/Bus605From20250203.cs
new file mode 100644
index 0000000..fd2f88d
--- /dev/null
+++ b/VipTimetable/Lines/Bus605/Bus605From20250203.cs
@@ -0,0 +1,164 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Bus605;
+
+public class Bus605From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus605From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[0].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M2, M1, M1, M1, M1, M1, M2, M1, M1, M0, M2, M2, M2, M2, M1, M1, M2, M1, M2,
+ M1, M3,
+ ],
+ },
+ ],
+ },
+ ..Previous.Line.Routes[1..]
+ ],
+ TripsCreate =
+ [
+ ..Previous.Line.TripsCreate.Where(trip =>
+ {
+ if (trip.RouteIndex.Equals(1) && new TimeOnly(7, 52) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(13, 54))
+ {
+ return false;
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime > new TimeOnly(16, 40))
+ {
+ return false;
+ }
+
+ if (trip.RouteIndex.Equals(0) && trip.DaysOfOperation == DaysOfOperation.School)
+ {
+ return false;
+ }
+
+ if (trip.RouteIndex.Equals(5) && new TimeOnly(8, 10) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(14, 30))
+ {
+ return false;
+ }
+
+ if (trip.RouteIndex.Equals(5) && trip.StartTime >= new TimeOnly(17, 10))
+ {
+ return false;
+ }
+
+ return true;
+ }).SelectMany(trip =>
+ {
+ Line.TripCreate[]? returnTrips = null;
+ if (trip.RouteIndex.Equals(0) && new TimeOnly(7, 0) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(10, 0))
+ {
+ var startTimeDiffMinutes = trip.StartTime < new TimeOnly(9, 0) ? -1 : -3;
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekday,
+ TimeProfileIndex = 4,
+ StartTime = trip.StartTime.AddMinutes(startTimeDiffMinutes),
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekend,
+ },
+ ];
+ }
+ else if (trip.RouteIndex.Equals(0) && new TimeOnly(13, 10) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(17, 30))
+ {
+ var startTimeDiffMinutes =
+ trip.StartTime > new TimeOnly(14, 30) && trip.StartTime < new TimeOnly(16, 40) ? -1 : -3;
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekday,
+ TimeProfileIndex = 4,
+ StartTime = trip.StartTime.AddMinutes(startTimeDiffMinutes),
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekend,
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(1) && new TimeOnly(14, 0) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(14, 40))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekday,
+ TimeProfileIndex = 1,
+ StartTime = trip.StartTime.AddMinutes(-2),
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekend,
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(4) && trip.StartTime == new TimeOnly(10, 4))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekday,
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekend,
+ TimeProfileIndex = 1,
+ },
+ ];
+ }
+
+ return returnTrips ?? [trip];
+ }).Where(trip => trip.DaysOfOperation is not DaysOfOperation.None),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 4,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 50),
+ }.AlsoEvery(M20, 3),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 4,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(16, 50),
+ }.AlsoEvery(M20, 3),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 4,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(13, 34),
+ }.AlsoEvery(M20, 3),
+ ],
+ };
+}
diff --git a/VipTimetable/Lines/Bus612/Bus612.cs b/VipTimetable/Lines/Bus612/Bus612.cs
index 437442b..367c733 100644
--- a/VipTimetable/Lines/Bus612/Bus612.cs
+++ b/VipTimetable/Lines/Bus612/Bus612.cs
@@ -2,5 +2,6 @@ namespace VipTimetable.Lines.Bus612;
internal class Bus612 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus612From20241214(), new Bus612From20241215()];
+ public IEnumerable LineInstances { get; } =
+ [new Bus612From20241214(), new Bus612From20241215(), new Bus612From20250203()];
}
diff --git a/VipTimetable/Lines/Bus612/Bus612From20250203.cs b/VipTimetable/Lines/Bus612/Bus612From20250203.cs
new file mode 100644
index 0000000..79f1bef
--- /dev/null
+++ b/VipTimetable/Lines/Bus612/Bus612From20250203.cs
@@ -0,0 +1,107 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Bus612;
+
+public class Bus612From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus612From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[0].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M0, M1, M2, M1, M1, M2, M2, M2, M1, M3, M1, M1, M1, M1, M2, M1, M1, M1, M1, M1, M2,
+ M3, M3, M2, M1, M2,
+ ],
+ },
+ ]
+ },
+ ..Previous.Line.Routes[1..2],
+ Previous.Line.Routes[2] with
+ {
+ TimeProfiles =
+ [
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M0, M1, M2, M1, M1, M2, M2, M2, M1, M1, M1, M1, M1, M0, M2, M1, M2, M3, M2, M1, M2,
+ M1,
+ ],
+ },
+ ],
+ },
+ Previous.Line.Routes[3] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[3].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M2, M1, M3, M2, M1, M1, M1, M0, M0, M1, M0, M2, M1, M1, M1, M1, M2, M3, M1, M1, M1, M1, M1,
+ M1, M1, M1, M0, M0, M1, M1,
+ ],
+ },
+ ],
+ },
+ ],
+ TripsCreate = Previous.Line.TripsCreate.SelectMany(trip =>
+ {
+ Line.TripCreate[]? returnTrips = null;
+ if (trip.RouteIndex.Equals(0) && new TimeOnly(6, 20) <= trip.StartTime &&
+ trip.StartTime <= new TimeOnly(9, 0))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekday,
+ StartTime = trip.StartTime.AddMinutes(-2),
+ TimeProfileIndex = 4,
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.Weekend,
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(2))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ StartTime = trip.StartTime.AddMinutes(-2),
+ }
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(3) && trip.StartTime > new TimeOnly(19, 45))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ TimeProfileIndex = 3,
+ },
+ ];
+ }
+
+ return returnTrips ?? [trip];
+ }).Where(trip => trip.DaysOfOperation is not DaysOfOperation.None).ToArray(),
+ };
+}
diff --git a/VipTimetable/Lines/Bus616/Bus616.cs b/VipTimetable/Lines/Bus616/Bus616.cs
index 05548f6..56b455e 100644
--- a/VipTimetable/Lines/Bus616/Bus616.cs
+++ b/VipTimetable/Lines/Bus616/Bus616.cs
@@ -2,5 +2,5 @@ namespace VipTimetable.Lines.Bus616;
internal class Bus616 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus616From20241214()];
+ public IEnumerable LineInstances { get; } = [new Bus616From20241214(), new Bus616From20250203()];
}
diff --git a/VipTimetable/Lines/Bus616/Bus616From20241214.cs b/VipTimetable/Lines/Bus616/Bus616From20241214.cs
index 782d594..7ceb330 100644
--- a/VipTimetable/Lines/Bus616/Bus616From20241214.cs
+++ b/VipTimetable/Lines/Bus616/Bus616From20241214.cs
@@ -40,7 +40,7 @@ public class Bus616From20241214 : ILineInstance
new Line.Route.TimeProfile
{ StopDistances = [M2, M1, M1, M2, M1, M1, M1, M1, M1, M1, M1, M1, M1, M2] }
],
- CommonStopIndex = 5,
+ CommonStopIndex = 5 /* Schloss Babelsberg */,
},
new Line.Route
{
diff --git a/VipTimetable/Lines/Bus616/Bus616From20250203.cs b/VipTimetable/Lines/Bus616/Bus616From20250203.cs
new file mode 100644
index 0000000..98ed5ed
--- /dev/null
+++ b/VipTimetable/Lines/Bus616/Bus616From20250203.cs
@@ -0,0 +1,45 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Bus616;
+
+public class Bus616From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus616From20241214 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0], Previous.Line.Routes[1] with
+ {
+ TimeProfiles =
+ [
+ new Line.Route.TimeProfile
+ { StopDistances = [M1, M1, M1, M1, M2, M1, M1, M1, M1, M1, M2, M0, M1, M1,], },
+ ],
+ },
+ ],
+ TripsCreate = Previous.Line.TripsCreate.Select(trip =>
+ {
+ ReadOnlySpan cancelledTowardsGriebnitzsee =
+ [
+ new(6, 53), new(7, 33), new(8, 13), new(8, 53), new(13, 33), new(14, 13), new(14, 53), new(15, 33),
+ new(16, 13)
+ ];
+ ReadOnlySpan cancelledTowardsBabelsberg =
+ [
+ new(7, 14), new(7, 54), new(8, 34), new(13, 14), new(13, 54), new(14, 34), new(15, 14), new(15, 54),
+ new(16, 34),
+ ];
+ if (trip.RouteIndex.Equals(0) && cancelledTowardsGriebnitzsee.Contains(trip.StartTime) ||
+ trip.RouteIndex.Equals(1) && cancelledTowardsBabelsberg.Contains(trip.StartTime))
+ return trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & (DaysOfOperation.School | DaysOfOperation.Weekend)
+ };
+ return trip;
+ }).Where(trip => trip.DaysOfOperation is not DaysOfOperation.None).ToArray(),
+ };
+}
diff --git a/VipTimetable/Lines/Bus638/Bus638.cs b/VipTimetable/Lines/Bus638/Bus638.cs
index d3e54cc..26ffa05 100644
--- a/VipTimetable/Lines/Bus638/Bus638.cs
+++ b/VipTimetable/Lines/Bus638/Bus638.cs
@@ -2,5 +2,6 @@ namespace VipTimetable.Lines.Bus638;
internal class Bus638 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus638From20241214(), new Bus638From20241215()];
+ public IEnumerable LineInstances { get; } =
+ [new Bus638From20241214(), new Bus638From20241215(), new Bus638From20250203()];
}
diff --git a/VipTimetable/Lines/Bus638/Bus638From20250203.cs b/VipTimetable/Lines/Bus638/Bus638From20250203.cs
new file mode 100644
index 0000000..cf56fd4
--- /dev/null
+++ b/VipTimetable/Lines/Bus638/Bus638From20250203.cs
@@ -0,0 +1,75 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Bus638;
+
+public class Bus638From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus638From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ ..Previous.Line.Routes[..2], ..Previous.Line.Routes[3..5], Previous.Line.Routes[5] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[5].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M2, M1, M2, M2, M2, M1, M1, M1, M1, M1, M4, M2, M1, M1, M1, M1, M1, M3,
+ ],
+ },
+ ],
+ },
+ Previous.Line.Routes[6], new Line.Route
+ {
+ StopPositions =
+ [
+ Stops.CampusJungfernsee,
+ Stops.AmundsenstrNedlitzerStr,
+ Stops.Römerschanze,
+ Stops.HeinrichHeineWeg,
+ Stops.Bassewitz,
+ Stops.Krampnitzsee,
+ Stops.Bullenwinkel,
+ Stops.AmSchlahn,
+ Stops.TheodorFontaneStr,
+ Stops.KircheGroßGlienicke,
+ ],
+ TimeProfiles = [new Line.Route.TimeProfile { StopDistances = [M2, M1, M1, M1, M2, M2, M1, M1, M1,], },],
+ CommonStopIndex = 0,
+ },
+ ..Previous.Line.Routes[8..],
+ ],
+ MainRouteIndices = Previous.Line.MainRouteIndices
+ .Select(index => new Index(index.Value >= 2 ? index.Value - 1 : index.Value)).ToArray(),
+ OverviewRouteIndices = Previous.Line.OverviewRouteIndices
+ .Select(index => new Index(index.Value >= 2 ? index.Value - 1 : index.Value)).ToArray(),
+ TripsCreate =
+ [
+ ..Previous.Line.TripsCreate.Select(trip =>
+ trip.RouteIndex.Value > 2 ? trip with { RouteIndex = new Index(trip.RouteIndex.Value - 1) } :
+ trip.RouteIndex.Equals(2) ? trip with
+ {
+ RouteIndex = 4, StartTime = trip.StartTime.AddMinutes(2), TimeProfileIndex = 1,
+ } :
+ trip).Where(trip => !trip.RouteIndex.Equals(6)).Select(trip =>
+ trip.RouteIndex.Value > 4 &&
+ (trip.StartTime > new TimeOnly(20, 30) || trip.StartTime < new TimeOnly(1, 0))
+ ? trip with { StartTime = trip.StartTime.AddMinutes(2) }
+ : trip),
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(6, 37)
+ },
+ ],
+ };
+}
diff --git a/VipTimetable/Lines/Bus639/Bus639.cs b/VipTimetable/Lines/Bus639/Bus639.cs
index 39d5550..5c2a412 100644
--- a/VipTimetable/Lines/Bus639/Bus639.cs
+++ b/VipTimetable/Lines/Bus639/Bus639.cs
@@ -2,5 +2,5 @@ namespace VipTimetable.Lines.Bus639;
internal class Bus639 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus639From20241214()];
+ public IEnumerable LineInstances { get; } = [new Bus639From20241214(), new Bus639From20250203()];
}
diff --git a/VipTimetable/Lines/Bus639/Bus639From20250203.cs b/VipTimetable/Lines/Bus639/Bus639From20250203.cs
new file mode 100644
index 0000000..e240f7b
--- /dev/null
+++ b/VipTimetable/Lines/Bus639/Bus639From20250203.cs
@@ -0,0 +1,15 @@
+using Timetable;
+
+namespace VipTimetable.Lines.Bus639;
+
+public class Bus639From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus639From20241214 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ TripsCreate = Previous.Line.TripsCreate.Select(trip => trip with { DaysOfOperation = DaysOfOperation.School })
+ .ToArray(),
+ };
+}
diff --git a/VipTimetable/Lines/Bus692/Bus692.cs b/VipTimetable/Lines/Bus692/Bus692.cs
index dfec982..67195f5 100644
--- a/VipTimetable/Lines/Bus692/Bus692.cs
+++ b/VipTimetable/Lines/Bus692/Bus692.cs
@@ -2,5 +2,5 @@ namespace VipTimetable.Lines.Bus692;
internal class Bus692 : ICompleteLine
{
- public IEnumerable LineInstances { get; } = [new Bus692From20241214()];
+ public IEnumerable LineInstances { get; } = [new Bus692From20241214(), new Bus692From20250203()];
}
diff --git a/VipTimetable/Lines/Bus692/Bus692From20241214.cs b/VipTimetable/Lines/Bus692/Bus692From20241214.cs
index 3332700..d92b7fb 100644
--- a/VipTimetable/Lines/Bus692/Bus692From20241214.cs
+++ b/VipTimetable/Lines/Bus692/Bus692From20241214.cs
@@ -244,14 +244,6 @@ public class Bus692From20241214 : ILineInstance
M1, M1,
],
},
- new Line.Route.TimeProfile
- {
- StopDistances =
- [
- M2, M2, M1, M0, M2, M1, M1, M2, M0, M2, M1, M1, M3, M2, M1, M1, M2, M1, M1, M1, M1, M1, M3,
- M1, M1,
- ],
- },
],
CommonStopIndex = 20,
},
@@ -740,7 +732,7 @@ ..new Line.TripCreate
..new Line.TripCreate
{
RouteIndex = 3,
- TimeProfileIndex = 2,
+ TimeProfileIndex = 0,
DaysOfOperation = DaysOfOperation.Weekend,
StartTime = new TimeOnly(10, 14),
}.AlsoEvery(M60, new TimeOnly(19, 14)),
diff --git a/VipTimetable/Lines/Bus692/Bus692From20250203.cs b/VipTimetable/Lines/Bus692/Bus692From20250203.cs
new file mode 100644
index 0000000..d661864
--- /dev/null
+++ b/VipTimetable/Lines/Bus692/Bus692From20250203.cs
@@ -0,0 +1,466 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Bus692;
+
+public class Bus692From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Bus692From20241214 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[0].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M2, M1, M0, M1, M1, M0, M2, M1, M0, M1, M2, M0, M2, M1, M1, M3, M2, M0, M1, M2, M1, M1,
+ M1, M1, M1, M3, M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M2, M2, M1, M0, M2, M1, M0, M2, M1, M0, M1, M2, M0, M2, M1, M2, M3, M2, M1, M1, M2, M1, M1,
+ M1, M2, M1, M3, M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M2, M2, M1, M0, M2, M1, M0, M2, M1, M0, M1, M2, M0, M2, M1, M2, M3, M2, M0, M1, M2, M1, M1,
+ M1, M2, M1, M3, M1, M1,
+ ]
+ },
+ ],
+ },
+ Previous.Line.Routes[1] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[1].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M0, M1, M2, M0, M2, M1, M1, M3, M2, M0, M1, M2, M1, M1, M1, M1, M1, M3, M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M0, M1, M2, M0, M2, M1, M2, M3, M2, M1, M1, M2, M1, M1, M1, M2, M1, M3, M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M0, M1, M2, M0, M2, M1, M1, M3, M2, M0, M1, M2, M1, M1, M1, M2, M1, M3, M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M0, M1, M2, M0, M2, M1, M2, M3, M2, M0, M1, M2, M1, M1, M1, M2, M1, M3, M1, M1,
+ ]
+ },
+ ],
+ },
+ Previous.Line.Routes[2] with
+ {
+ TimeProfiles =
+ [
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M0, M2, M1, M0, M2, M1, M0, M1, M2, M0, M2, M1, M2, M3, M2, M1, M1, M2, M1, M1, M1, M2,
+ M1, M3, M1, M1,
+ ],
+ },
+ ..Previous.Line.Routes[2].TimeProfiles[1..],
+ ],
+ },
+ Previous.Line.Routes[3] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[3].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M2, M2, M1, M0, M2, M1, M1, M2, M0, M2, M1, M2, M3, M2, M1, M1, M2, M1, M1, M1, M2, M1, M3,
+ M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M2, M2, M1, M0, M2, M1, M1, M2, M0, M2, M1, M1, M3, M2, M0, M1, M2, M1, M1, M1, M2, M1, M3,
+ M1, M1,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M2, M1, M0, M1, M1, M1, M2, M0, M2, M1, M1, M3, M2, M0, M1, M2, M1, M1, M1, M1, M1, M3,
+ M1, M1,
+ ],
+ },
+ ],
+ },
+ Previous.Line.Routes[4] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[4].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M1, M2, M1, M2, M1, M1, M3, M3, M1, M1, M1, M1, M1, M1, M0, M2,],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M1, M1, M1, M1, M0, M2,],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M2, M1, M1, M1, M0, M2,],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M1, M2, M1, M1, M1, M1, M3, M2, M1, M1, M1, M1, M1, M1, M0, M2,],
+ },
+ ],
+ },
+ Previous.Line.Routes[5] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[5].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M1, M2, M1, M2, M1, M1, M3, M3, M1, M1, M1, M1, M1, M1, M2, M1, M0, M1,
+ M3, M2,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M1, M1, M1, M1, M2, M1, M0, M1,
+ M3, M2,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M2, M1, M1, M1, M2, M1, M1, M1,
+ M3, M2,
+ ],
+ },
+ ],
+ },
+ Previous.Line.Routes[6] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[6].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M1, M1, M1, M1, M0, M2, M1, M0,
+ M2, M1, M0, M1, M3, M2,
+ ],
+ },
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [
+ M1, M1, M1, M1, M1, M2, M2, M1, M2, M1, M1, M3, M3, M1, M1, M2, M1, M1, M1, M0, M2, M1, M0,
+ M2, M1, M1, M1, M3, M2,
+ ],
+ },
+ ],
+ },
+ ..Previous.Line.Routes[7..],
+ ],
+ TripsCreate = Previous.Line.TripsCreate.Select(Helpers.Transform).ToArray(),
+ };
+}
+
+file static class Helpers
+{
+ public static Line.TripCreate Transform(Line.TripCreate trip)
+ {
+ // Some special cases
+ if (trip.RouteIndex.Equals(4) && trip.StartTime == new TimeOnly(0, 4))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 7,
+ };
+ }
+
+ return (trip.DaysOfOperation & DaysOfOperation.Weekend) > 0 ? TransformWeekend(trip) : TransformWeekday(trip);
+ }
+
+ private static Line.TripCreate TransformWeekday(Line.TripCreate trip) =>
+ trip.RouteIndex.Value switch
+ {
+ <= 3 => TransformWeekdayToKlinikum(trip),
+ >= 4 => TransformWeekdayFromKlinikum(trip),
+ };
+
+ private static Line.TripCreate TransformWeekdayFromKlinikum(Line.TripCreate trip)
+ {
+ if (trip.RouteIndex.Equals(4))
+ {
+ if (trip.StartTime < new TimeOnly(6, 20))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+
+ if (new TimeOnly(6, 20) < trip.StartTime && trip.StartTime < new TimeOnly(11, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+
+ if (new TimeOnly(11, 0) < trip.StartTime && trip.StartTime < new TimeOnly(17, 20))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 6,
+ };
+ }
+
+ if (new TimeOnly(17, 20) < trip.StartTime)
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+ }
+
+ if (trip.RouteIndex.Equals(5))
+ {
+ if (trip.StartTime == new TimeOnly(5, 41))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 3,
+ };
+ }
+
+ if (new TimeOnly(8, 40) < trip.StartTime && trip.StartTime < new TimeOnly(11, 40))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+
+ if (new TimeOnly(11, 40) < trip.StartTime && trip.StartTime < new TimeOnly(17, 40))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+
+ if (new TimeOnly(17, 40) < trip.StartTime)
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+ }
+
+ if (trip.RouteIndex.Equals(6))
+ {
+ if (trip.StartTime < new TimeOnly(13, 40))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+
+ if (new TimeOnly(13, 40) < trip.StartTime)
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+ }
+
+ return trip;
+ }
+
+ private static Line.TripCreate TransformWeekdayToKlinikum(Line.TripCreate trip)
+ {
+ if (trip.RouteIndex.Equals(0) && trip.StartTime == new TimeOnly(5, 7))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ StartTime = new TimeOnly(5, 8),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(0) && trip.StartTime > new TimeOnly(6, 0) &&
+ trip.StartTime < new TimeOnly(20, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = trip.StartTime < new TimeOnly(12, 0) ? 5 : 6,
+ StartTime = trip.StartTime.AddMinutes(trip.StartTime > new TimeOnly(15, 0) ? 0 :
+ trip.StartTime > new TimeOnly(7, 0) ? -1 : -2),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime == new TimeOnly(5, 55))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 3,
+ StartTime = new TimeOnly(5, 56),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime > new TimeOnly(6, 20) &&
+ trip.StartTime < new TimeOnly(10, 30))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ StartTime = trip.StartTime.AddMinutes(
+ trip.StartTime > new TimeOnly(7, 0) && trip.StartTime < new TimeOnly(8, 30) ? -1 : -2),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && ((trip.StartTime > new TimeOnly(10, 30) &&
+ trip.StartTime < new TimeOnly(12, 0)) ||
+ (trip.StartTime > new TimeOnly(16, 30) &&
+ trip.StartTime < new TimeOnly(20, 0))))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime > new TimeOnly(12, 0) &&
+ trip.StartTime < new TimeOnly(16, 30))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 6,
+ StartTime = trip.StartTime.AddMinutes(trip.StartTime < new TimeOnly(14, 30) ? -1 : 0),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(2) && trip.StartTime == new TimeOnly(7, 9))
+ {
+ return trip with
+ {
+ StartTime = new TimeOnly(7, 8),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(3) && trip.StartTime < new TimeOnly(11, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 2,
+ StartTime = trip.StartTime.AddMinutes(-2),
+ };
+ }
+
+ if (trip.RouteIndex.Equals(3) && trip.StartTime > new TimeOnly(11, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 3,
+ };
+ }
+
+ return trip;
+ }
+
+ private static Line.TripCreate TransformWeekend(Line.TripCreate trip)
+ {
+ if (trip.RouteIndex.Equals(0) && trip.StartTime < new TimeOnly(9, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime < new TimeOnly(10, 0) && trip.StartTime > new TimeOnly(1, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 3,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(1) && trip.StartTime > new TimeOnly(10, 0) && trip.StartTime < new TimeOnly(19, 50))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 5,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(3) && trip.StartTime < new TimeOnly(10, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 4,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(3) && trip.StartTime > new TimeOnly(10, 0))
+ {
+ return trip with
+ {
+ TimeProfileIndex = 3,
+ };
+ }
+
+ return trip;
+ }
+}
diff --git a/VipTimetable/Lines/BusX5/BusX5.cs b/VipTimetable/Lines/BusX5/BusX5.cs
index 48d4868..485e7e5 100644
--- a/VipTimetable/Lines/BusX5/BusX5.cs
+++ b/VipTimetable/Lines/BusX5/BusX5.cs
@@ -3,5 +3,5 @@ namespace VipTimetable.Lines.BusX5;
internal class BusX5 : ICompleteLine
{
public IEnumerable LineInstances { get; } =
- [new BusX5From20241214Until20241220(), new BusX5From20250106()];
+ [new BusX5From20241214Until20241220(), new BusX5From20250106(), new BusX5From20250203Until20250207()];
}
diff --git a/VipTimetable/Lines/BusX5/BusX5From20250203Until20250207.cs b/VipTimetable/Lines/BusX5/BusX5From20250203Until20250207.cs
new file mode 100644
index 0000000..ffc665f
--- /dev/null
+++ b/VipTimetable/Lines/BusX5/BusX5From20250203Until20250207.cs
@@ -0,0 +1,36 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.BusX5;
+
+public class BusX5From20250203Until20250207 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ public DateOnly? ValidUntilInclusive() => new DateOnly(2025, 2, 7);
+ private static BusX5From20250106 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0] with
+ {
+ TimeProfiles =
+ [
+ new Line.Route.TimeProfile
+ { StopDistances = [M1, M3, M2, M3, M1, M1, M0, M2, M2, M3, M3, M2, M4,], },
+ new Line.Route.TimeProfile
+ { StopDistances = [M1, M3, M3, M3, M1, M1, M0, M2, M2, M3, M3, M2, M4,], },
+ ],
+ },
+ ..Previous.Line.Routes[1..3]
+ ],
+ MainRouteIndices = [0, 1, 2],
+ TripsCreate = Previous.Line.TripsCreate
+ .Select(trip => trip.RouteIndex.Equals(3)
+ ? trip with { RouteIndex = 2 }
+ : trip.RouteIndex.Equals(0) && trip.StartTime == new TimeOnly(15, 50)
+ ? trip with { TimeProfileIndex = 1 }
+ : trip).ToArray(),
+ };
+}
diff --git a/VipTimetable/Lines/Tram91/Tram91.cs b/VipTimetable/Lines/Tram91/Tram91.cs
index 2ddf66f..e411625 100644
--- a/VipTimetable/Lines/Tram91/Tram91.cs
+++ b/VipTimetable/Lines/Tram91/Tram91.cs
@@ -11,5 +11,6 @@ internal class Tram91 : ICompleteLine
new Tram91From20241104(),
new Tram91From20241215(),
new Tram91From20250110Until20250112(),
+ new Tram91From20250203(),
];
}
diff --git a/VipTimetable/Lines/Tram91/Tram91From20250203.cs b/VipTimetable/Lines/Tram91/Tram91From20250203.cs
new file mode 100644
index 0000000..220065a
--- /dev/null
+++ b/VipTimetable/Lines/Tram91/Tram91From20250203.cs
@@ -0,0 +1,38 @@
+using Timetable;
+
+namespace VipTimetable.Lines.Tram91;
+
+public class Tram91From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Tram91From20241215 Original { get; } = new();
+
+ public Line Line { get; } = Original.Line with
+ {
+ TripsCreate =
+ [
+ ..Original.Line.TripsCreate,
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 36),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 5,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(13, 5),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 4,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Daily,
+ StartTime = new TimeOnly(0, 40),
+ },
+ ],
+ };
+}
diff --git a/VipTimetable/Lines/Tram92/Tram92.cs b/VipTimetable/Lines/Tram92/Tram92.cs
index 6b88fbd..5a1068b 100644
--- a/VipTimetable/Lines/Tram92/Tram92.cs
+++ b/VipTimetable/Lines/Tram92/Tram92.cs
@@ -7,6 +7,6 @@ internal class Tram92 : ICompleteLine
new Tram92From20240102(), new Tram92From20240422(), new Tram92From20240606(), new Tram92From20240608(),
new Tram92From20240610(), new Tram92From20240816Until20240818(), new Tram92From20240921Until20240922(),
new Tram92From20240923(), new Tram92From20241012Until20241013(), new Tram92From20241104(),
- new Tram92From20241215(), new Tram92From20250110Until20250112(),
+ new Tram92From20241215(), new Tram92From20250110Until20250112(), new Tram92From20250203(),
];
}
diff --git a/VipTimetable/Lines/Tram92/Tram92From20240422.cs b/VipTimetable/Lines/Tram92/Tram92From20240422.cs
index 76debd0..9c9ce9b 100644
--- a/VipTimetable/Lines/Tram92/Tram92From20240422.cs
+++ b/VipTimetable/Lines/Tram92/Tram92From20240422.cs
@@ -79,7 +79,7 @@ public class Tram92From20240422 : ILineInstance
{
StopDistances =
[
- M1, M0, M0, M2, M1, M1, M1, M1, M1, M2, M2, M1, M1, M3, M2, M1, M1, M1, M1, M2, M1, M1, M2, M1,
+ M1, M0, M1, M1, M1, M1, M1, M1, M1, M2, M2, M1, M1, M3, M2, M1, M1, M1, M1, M2, M1, M1, M2, M1,
M1, M1, M1, M1, M1, M2
]
},
diff --git a/VipTimetable/Lines/Tram92/Tram92From20250203.cs b/VipTimetable/Lines/Tram92/Tram92From20250203.cs
new file mode 100644
index 0000000..1f778d4
--- /dev/null
+++ b/VipTimetable/Lines/Tram92/Tram92From20250203.cs
@@ -0,0 +1,562 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Tram92;
+
+public class Tram92From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Tram92From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes = [..Previous.Line.Routes[..4], ..Previous.Line.Routes[6..10], ..Previous.Line.Routes[11..]],
+ MainRouteIndices = [0, 1, 2, 3, 4, 5, 6, 7,],
+ OverviewRouteIndices = [0, 4],
+ TripsCreate =
+ [
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Weekday,
+ StartTime = new TimeOnly(4, 50),
+ }.AlsoEvery(M20, 2),
+ new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Weekday,
+ StartTime = new TimeOnly(5, 27),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(5, 50),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 2,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(6, 10),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 2,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(6, 30),
+ }.AlsoEvery(M10, 3),
+ new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(6, 59),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 9),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 19),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 29),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 39),
+ }.AlsoEvery(M10, new TimeOnly(8, 9)),
+ new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 19),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 30),
+ }.AlsoEvery(M20, new TimeOnly(9, 10)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 40),
+ }.AlsoEvery(M20, new TimeOnly(9, 0)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(9, 20),
+ }.AlsoEvery(M10, new TimeOnly(12, 40)),
+ new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(12, 47),
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(12, 50),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(13, 0),
+ }.AlsoEvery(M20, new TimeOnly(14, 20)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 2,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(13, 10),
+ }.AlsoEvery(M20, new TimeOnly(14, 10)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(14, 29),
+ }.AlsoEvery(M10, new TimeOnly(15, 29)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(15, 39),
+ }.AlsoEvery(M20, new TimeOnly(16, 19)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 1,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(15, 49),
+ }.AlsoEvery(M20, new TimeOnly(16, 9)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(16, 30),
+ }.AlsoEvery(M10, new TimeOnly(17, 50)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(18, 0),
+ }.AlsoEvery(M10, new TimeOnly(18, 40)),
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(18, 50),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(19, 0),
+ }.AlsoEvery(M10, 2),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(19, 31),
+ }.AlsoEvery(M20, new TimeOnly(20, 11)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(5, 50),
+ }.AlsoEvery(M20, new TimeOnly(6, 50)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(7, 9),
+ }.AlsoEvery(M20, 2),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(7, 49),
+ }.AlsoEvery(M20, 2),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(8, 30),
+ }.AlsoEvery(M20, new TimeOnly(14, 10)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(14, 29),
+ }.AlsoEvery(M20, new TimeOnly(16, 9)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(16, 30),
+ }.AlsoEvery(M20, new TimeOnly(17, 50)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(18, 10),
+ }.AlsoEvery(M20, new TimeOnly(19, 10)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(19, 31),
+ }.AlsoEvery(M20, new TimeOnly(20, 11)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Saturday,
+ StartTime = new TimeOnly(4, 55),
+ }.AlsoEvery(M20, new TimeOnly(6, 55)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(7, 15),
+ }.AlsoEvery(M20, new TimeOnly(7, 55)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(8, 15),
+ }.AlsoEvery(M20, new TimeOnly(9, 55)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 2,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(10, 15),
+ }.AlsoEvery(M20, new TimeOnly(19, 35)),
+ new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(19, 53),
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 3,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(20, 8),
+ }.AlsoEvery(M20, 2),
+ // These must be the last ones.
+ ..new Line.TripCreate
+ {
+ RouteIndex = 3,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Daily,
+ StartTime = new TimeOnly(20, 31),
+ }.AlsoEvery(M20, new TimeOnly(0, 11)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 1,
+ DaysOfOperation = DaysOfOperation.Daily,
+ StartTime = new TimeOnly(0, 31),
+ }.AlsoEvery(M20, new TimeOnly(1, 11)),
+ // The other direction.
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekday,
+ StartTime = new TimeOnly(4, 8)
+ }.AlsoEvery(M20, 3),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(5, 17)
+ }.AlsoEvery(M20, new TimeOnly(5, 57)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(6, 8)
+ }.AlsoEvery(M10, new TimeOnly(6, 58)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 5,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 1)
+ }.AlsoEvery(M10, new TimeOnly(7, 41)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 58)
+ }.AlsoEvery(M20, new TimeOnly(8, 38)),
+ new Line.TripCreate
+ {
+ RouteIndex = 4,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(7, 56)
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 5,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 21)
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 54)
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(8, 48)
+ }.AlsoEvery(M20, new TimeOnly(9, 28)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(9, 7)
+ }.AlsoEvery(M20, new TimeOnly(9, 27)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(9, 47)
+ }.AlsoEvery(M10, new TimeOnly(13, 17)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(13, 18)
+ }.AlsoEvery(M10, new TimeOnly(13, 58)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(14, 18)
+ }.AlsoEvery(M20, new TimeOnly(14, 58)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 5,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(14, 1)
+ }.AlsoEvery(M20, new TimeOnly(17, 1)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 5,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(15, 11)
+ }.AlsoEvery(M20, new TimeOnly(15, 51)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(16, 18)
+ }.AlsoEvery(M20, new TimeOnly(16, 58)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(17, 18)
+ }.AlsoEvery(M10, new TimeOnly(18, 8)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(18, 27)
+ }.AlsoEvery(M10, new TimeOnly(18, 57)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.School,
+ StartTime = new TimeOnly(19, 17)
+ }.AlsoEvery(M20, new TimeOnly(20, 37)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(5, 17)
+ }.AlsoEvery(M20, new TimeOnly(7, 57)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(8, 8)
+ }.AlsoEvery(M20, new TimeOnly(18, 8)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Holiday,
+ StartTime = new TimeOnly(18, 37)
+ }.AlsoEvery(M20, new TimeOnly(20, 37)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Saturday,
+ StartTime = new TimeOnly(4, 23)
+ }.AlsoEvery(M20, new TimeOnly(5, 23)),
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Saturday,
+ StartTime = new TimeOnly(5, 26)
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Saturday,
+ StartTime = new TimeOnly(5, 52)
+ }.AlsoEvery(M20, new TimeOnly(7, 12)),
+ ..new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Sunday,
+ StartTime = new TimeOnly(6, 43)
+ }.AlsoEvery(M20, 2),
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Sunday,
+ StartTime = new TimeOnly(7, 26)
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(7, 32)
+ }.AlsoEvery(M20, new TimeOnly(8, 12)),
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Saturday,
+ StartTime = new TimeOnly(8, 23)
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Sunday,
+ StartTime = new TimeOnly(8, 32)
+ },
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(8, 43)
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 4,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(8, 51)
+ }.AlsoEvery(M20, new TimeOnly(19, 11)),
+ new Line.TripCreate
+ {
+ RouteIndex = 6,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(19, 37)
+ },
+ ..new Line.TripCreate
+ {
+ RouteIndex = 4,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekend,
+ StartTime = new TimeOnly(19, 39)
+ }.AlsoEvery(M20, new TimeOnly(20, 19)),
+ // This must be the last one.
+ ..new Line.TripCreate
+ {
+ RouteIndex = 7,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Daily,
+ StartTime = new TimeOnly(20, 57)
+ }.AlsoEvery(M20, new TimeOnly(0, 37)),
+ ],
+ };
+}
diff --git a/VipTimetable/Lines/Tram93/Tram93From20240102.cs b/VipTimetable/Lines/Tram93/Tram93From20240102.cs
index 1a7a8be..bb2071f 100644
--- a/VipTimetable/Lines/Tram93/Tram93From20240102.cs
+++ b/VipTimetable/Lines/Tram93/Tram93From20240102.cs
@@ -130,7 +130,7 @@ internal class Tram93From20240102 : ILineInstance
[
new Line.Route.TimeProfile
{
- StopDistances = [M1, M1, M1, M2, M1, M1, M1, M1, M4]
+ StopDistances = [M1, M1, M1, M2, M1, M1, M2, M1, M4,],
}
],
CommonStopIndex = 0,
diff --git a/VipTimetable/Lines/Tram94/Tram94.cs b/VipTimetable/Lines/Tram94/Tram94.cs
index 691dcb9..7a803cd 100644
--- a/VipTimetable/Lines/Tram94/Tram94.cs
+++ b/VipTimetable/Lines/Tram94/Tram94.cs
@@ -10,5 +10,6 @@ internal class Tram94 : ICompleteLine
new Tram94From20240826Until20240831(),
new Tram94From20241021Until20241102(),
new Tram94From20241104(),
+ new Tram94From20250203(),
];
}
diff --git a/VipTimetable/Lines/Tram94/Tram94From20250203.cs b/VipTimetable/Lines/Tram94/Tram94From20250203.cs
new file mode 100644
index 0000000..47dd0b3
--- /dev/null
+++ b/VipTimetable/Lines/Tram94/Tram94From20250203.cs
@@ -0,0 +1,83 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Tram94;
+
+public class Tram94From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Tram94From20241104 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ ..Previous.Line.Routes[..2],
+ Previous.Line.Routes[3] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[3].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M2, M2, M1, M1, M1, M2, M1, M1, M2, M1, M1, M2, M1, M2, M1, M3,],
+ },
+ ],
+ },
+ Previous.Line.Routes[4] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[4].TimeProfiles,
+ new Line.Route.TimeProfile
+ {
+ StopDistances =
+ [M1, M1, M1, M1, M1, M2, M2, M1, M1, M1, M2, M1, M1, M2, M1, M1, M2,],
+ },
+ ],
+ },
+ ..Previous.Line.Routes[5..5], ..Previous.Line.Routes[6..]
+ ],
+ MainRouteIndices = Previous.Line.MainRouteIndices.Select(Helpers.ReduceIndex).ToArray(),
+ OverviewRouteIndices = Previous.Line.OverviewRouteIndices.Select(Helpers.ReduceIndex).ToArray(),
+ TripsCreate = Previous.Line.TripsCreate.Where(trip => !trip.RouteIndex.Equals(2) && !trip.RouteIndex.Equals(5))
+ .Select(trip =>
+ {
+ trip = trip with
+ {
+ RouteIndex = Helpers.ReduceIndex(trip.RouteIndex),
+ };
+ if (trip.RouteIndex.Equals(2) && (trip.StartTime > new TimeOnly(7, 3) &&
+ trip.StartTime < new TimeOnly(9, 0) ||
+ trip.StartTime > new TimeOnly(13, 3) &&
+ trip.StartTime < new TimeOnly(16, 40)))
+ {
+ return trip with
+ {
+ StartTime = trip.StartTime.AddMinutes(-1),
+ TimeProfileIndex = 1,
+ };
+ }
+
+ if (trip.RouteIndex.Equals(3) && trip.DaysOfOperation == DaysOfOperation.Holiday &&
+ (trip.StartTime > new TimeOnly(7, 22) && trip.StartTime <= new TimeOnly(8, 3) ||
+ trip.StartTime > new TimeOnly(13, 22) && trip.StartTime <= new TimeOnly(16, 23)))
+ {
+ return trip with
+ {
+ StartTime = trip.StartTime.AddMinutes(-1),
+ TimeProfileIndex = 2,
+ };
+ }
+
+ return trip;
+ }).ToArray()
+ };
+}
+
+file static class Helpers
+{
+ public static Index ReduceIndex(Index index) =>
+ new(index.Value > 5 ? index.Value - 2 : index.Value > 2 ? index.Value - 1 : index.Value);
+}
diff --git a/VipTimetable/Lines/Tram96/Tram96.cs b/VipTimetable/Lines/Tram96/Tram96.cs
index 20fc81a..7fe7b67 100644
--- a/VipTimetable/Lines/Tram96/Tram96.cs
+++ b/VipTimetable/Lines/Tram96/Tram96.cs
@@ -7,6 +7,6 @@ internal class Tram96 : ICompleteLine
new Tram96From20240102(), new Tram96From20240606(), new Tram96From20240608(), new Tram96From20240610(),
new Tram96From20240816Until20240818(), new Tram96From20240921Until20240922(),
new Tram96From20241012Until20241013(), new Tram96From20241104(), new Tram96From20241215(),
- new Tram96From20250110Until20250112(), new Tram96From20250120Until20250124(),
+ new Tram96From20250110Until20250112(), new Tram96From20250120Until20250124(), new Tram96From20250203(),
];
}
diff --git a/VipTimetable/Lines/Tram96/Tram96From20240102.cs b/VipTimetable/Lines/Tram96/Tram96From20240102.cs
index f6a8cde..69f1512 100644
--- a/VipTimetable/Lines/Tram96/Tram96From20240102.cs
+++ b/VipTimetable/Lines/Tram96/Tram96From20240102.cs
@@ -103,8 +103,8 @@ internal class Tram96From20240102 : ILineInstance
[
new Line.Route.TimeProfile
{
- StopDistances = [M2, M1, M1, M2, M1, M1, M1, M1, M1, M1, M2, M1, M1, M3, M2, M1, M1, M1, M1, M2]
- }
+ StopDistances = [M2, M1, M1, M1, M1, M1, M1, M1, M1, M2, M2, M1, M1, M4, M2, M0, M1, M1, M2, M2,],
+ },
],
CommonStopIndex = 0
},
@@ -187,8 +187,8 @@ internal class Tram96From20240102 : ILineInstance
[
new Line.Route.TimeProfile
{
- StopDistances = [M1, M1, M1, M3, M2, M0, M1, M1, M1, M2]
- }
+ StopDistances = [M1, M1, M1, M3, M2, M0, M1, M1, M2, M2,],
+ },
],
CommonStopIndex = 4
},
diff --git a/VipTimetable/Lines/Tram96/Tram96From20250203.cs b/VipTimetable/Lines/Tram96/Tram96From20250203.cs
new file mode 100644
index 0000000..2a71def
--- /dev/null
+++ b/VipTimetable/Lines/Tram96/Tram96From20250203.cs
@@ -0,0 +1,35 @@
+using Timetable;
+
+namespace VipTimetable.Lines.Tram96;
+
+public class Tram96From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Tram96From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ TripsCreate =
+ [
+ ..Previous.Line.TripsCreate.Select(trip =>
+ trip.RouteIndex.Equals(4) && trip.StartTime == new TimeOnly(20, 52)
+ ?
+ trip with { StartTime = trip.StartTime.AddMinutes(6) }
+ : trip.RouteIndex.Equals(0) && trip.DaysOfOperation == DaysOfOperation.Weekend &&
+ trip.StartTime == new TimeOnly(10, 3)
+ ? trip with { TimeProfileIndex = 0 }
+ : trip.RouteIndex.Equals(7) && trip.StartTime == new TimeOnly(5, 21)
+ ? trip with { StartTime = trip.StartTime.AddMinutes(-1) }
+ : trip).ToArray(),
+ // For future reference: This trip was previously part of a 92 from Kirschallee to Marie-Juchacz-Str.
+ // that was cut back to end at Bisamkiez instead.
+ new Line.TripCreate
+ {
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ DaysOfOperation = DaysOfOperation.Weekday,
+ StartTime = new TimeOnly(8, 37),
+ },
+ ],
+ };
+}
diff --git a/VipTimetable/Lines/Tram99/Tram99.cs b/VipTimetable/Lines/Tram99/Tram99.cs
index 195a3b6..7fe72c4 100644
--- a/VipTimetable/Lines/Tram99/Tram99.cs
+++ b/VipTimetable/Lines/Tram99/Tram99.cs
@@ -7,5 +7,6 @@ internal class Tram99 : ICompleteLine
new Tram99From20240102(), new Tram99From20240608(), new Tram99From20240610(), new Tram99From20240816(),
new Tram99From20240826Until20240831(), new Tram99From20240921Until20240922(),
new Tram99From20241012Until20241013(), new Tram99From20241215(), new Tram99From20250110Until20250112(),
+ new Tram99From20250203(),
];
}
diff --git a/VipTimetable/Lines/Tram99/Tram99From20250203.cs b/VipTimetable/Lines/Tram99/Tram99From20250203.cs
new file mode 100644
index 0000000..bef3d80
--- /dev/null
+++ b/VipTimetable/Lines/Tram99/Tram99From20250203.cs
@@ -0,0 +1,87 @@
+using Timetable;
+using static VipTimetable.Minutes;
+
+namespace VipTimetable.Lines.Tram99;
+
+public class Tram99From20250203 : ILineInstance
+{
+ public DateOnly ValidFrom { get; } = new(2025, 2, 3);
+ private static Tram99From20241215 Previous { get; } = new();
+
+ public Line Line { get; } = Previous.Line with
+ {
+ Routes =
+ [
+ Previous.Line.Routes[0] with
+ {
+ TimeProfiles =
+ [
+ ..Previous.Line.Routes[0].TimeProfiles,
+ new Line.Route.TimeProfile { StopDistances = [M1, M1, M1, M1, M1, M2, M2, M1, M1, M2,], },
+ ],
+ },
+ ..Previous.Line.Routes[1..]
+ ],
+ TripsCreate = Previous.Line.TripsCreate.SelectMany(trip =>
+ {
+ Line.TripCreate[]? returnTrips = null;
+ if (trip.RouteIndex.Equals(0) &&
+ (new TimeOnly(7, 12) <= trip.StartTime && trip.StartTime <= new TimeOnly(7, 53) ||
+ new TimeOnly(13, 32) <= trip.StartTime && trip.StartTime <= new TimeOnly(16, 33)))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ StartTime = trip.StartTime.AddMinutes(-1),
+ TimeProfileIndex = 1
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(2) && trip.StartTime == new TimeOnly(19, 13))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ RouteIndex = 0,
+ TimeProfileIndex = 0,
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(1) && trip.StartTime == new TimeOnly(19, 36))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & DaysOfOperation.School,
+ RouteIndex = 2,
+ TimeProfileIndex = 0,
+ },
+ trip with
+ {
+ DaysOfOperation = trip.DaysOfOperation & (DaysOfOperation.Holiday | DaysOfOperation.Weekend),
+ },
+ ];
+ }
+
+ else if (trip.RouteIndex.Equals(5) && trip.StartTime == new TimeOnly(19, 15))
+ {
+ returnTrips =
+ [
+ trip with
+ {
+ RouteIndex = 3,
+ StartTime = trip.StartTime.AddMinutes(11),
+ TimeProfileIndex = 0,
+ },
+ ];
+ }
+
+ return returnTrips ?? [trip];
+ }).ToArray(),
+ };
+}
diff --git a/VipTimetable/VipHistory.cs b/VipTimetable/VipHistory.cs
index 04ef883..a69a78c 100644
--- a/VipTimetable/VipHistory.cs
+++ b/VipTimetable/VipHistory.cs
@@ -167,5 +167,15 @@ Daher wird montags bis freitags die Linie 96 ab ca. 20 Uhr zwischen Bisamkiez un
),
new HistoryEntry(new DateOnly(2025, 1, 25),
"Ursprünglich auch noch in der Folgewoche geplant sind die Bauarbeiten in Abzweig Betriebshof bereits nach einer Woche beendet."),
+ new HistoryEntry(new DateOnly(2025, 2, 3),
+ """
+ Zu Beginn der Winterferien wird ein Fahrplanwechsel durchgeführt.
+ Als Verbesserung wird der 10-Minuten-Takt der 92 an Schultagen zwischen Bisamkiez und Gaußstr. ausgeweitet.
+ Auf der anderen Seite wird in den Ferien der 20-Minuten-Takt auf der Linie 616 ersatzlos gestrichen.
+ Auch wird der 10-Minuten-Takt der 605 nur noch in der Hauptverkehrszeit angeboten
+ und die Linie 639 in den Ferien ersatzlos gestrichen.
+ Außerdem kommt es zu kleineren Fahrplananpassungen.
+ """
+ ),
];
}
|