From e2355c075f5bb0e46b24184239a2507716b12eb8 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 00:13:22 +0200 Subject: [PATCH 01/17] data: add change entry --- VipTimetable/VipHistory.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) 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. + """ + ), ]; } From 9c12a1cbf870007e04319141ca194a4577062996 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 00:31:17 +0200 Subject: [PATCH 02/17] data: add 91 --- VipTimetable/Lines/Tram91/Tram91.cs | 1 + .../Lines/Tram91/Tram91From20250203.cs | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 VipTimetable/Lines/Tram91/Tram91From20250203.cs 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), + }, + ], + }; +} From 5ea828960600b37949244965ec04dd550f5e8ce3 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 17:55:37 +0200 Subject: [PATCH 03/17] data: add 92 & fix small error in 92 --- VipTimetable/Lines/Tram92/Tram92.cs | 2 +- .../Lines/Tram92/Tram92From20240422.cs | 2 +- .../Lines/Tram92/Tram92From20250203.cs | 562 ++++++++++++++++++ 3 files changed, 564 insertions(+), 2 deletions(-) create mode 100644 VipTimetable/Lines/Tram92/Tram92From20250203.cs 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)), + ], + }; +} From 49ddd1372856550821bf34161a2728704a1c168e Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 18:00:21 +0200 Subject: [PATCH 04/17] data: fix error in 93 --- VipTimetable/Lines/Tram93/Tram93From20240102.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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, From 9f4d6946a45fd35a381e3caca724fcbfa47f6c56 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 23:27:59 +0200 Subject: [PATCH 05/17] data: add 94 --- VipTimetable/Lines/Tram94/Tram94.cs | 1 + .../Lines/Tram94/Tram94From20250203.cs | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 VipTimetable/Lines/Tram94/Tram94From20250203.cs 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); +} From 4f115c477053bd9adb6c31750b1b53f737cf915c Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 29 Aug 2025 23:53:57 +0200 Subject: [PATCH 06/17] data: add 96 & fix some timetable issues with 96 --- VipTimetable/Lines/Tram96/Tram96.cs | 2 +- .../Lines/Tram96/Tram96From20240102.cs | 8 ++--- .../Lines/Tram96/Tram96From20250203.cs | 35 +++++++++++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 VipTimetable/Lines/Tram96/Tram96From20250203.cs 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), + }, + ], + }; +} From 3c5f2ffe3e15f0a9fd99db1bc1e16f449d3ab91b Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 30 Aug 2025 00:21:04 +0200 Subject: [PATCH 07/17] data: add 99 --- VipTimetable/Lines/Tram99/Tram99.cs | 1 + .../Lines/Tram99/Tram99From20250203.cs | 87 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 VipTimetable/Lines/Tram99/Tram99From20250203.cs 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(), + }; +} From c94876d9877f2e0c9cac495159678f7f9b646401 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 30 Aug 2025 14:37:56 +0200 Subject: [PATCH 08/17] data: add X5 --- VipTimetable/Lines/BusX5/BusX5.cs | 2 +- .../BusX5/BusX5From20250203Until20250207.cs | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 VipTimetable/Lines/BusX5/BusX5From20250203Until20250207.cs 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(), + }; +} From d52b3d0f8f79c0588023ea6fcdb235da28f27d3a Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 30 Aug 2025 18:22:56 +0200 Subject: [PATCH 09/17] feat: prevent word wrap in line timetable --- .../Components/Timetables/LineTimetable/LineTimetable.razor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 { - +
From 74db84f0905bc0ef71751906ca990416f9800cc7 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 30 Aug 2025 23:28:05 +0200 Subject: [PATCH 10/17] data: add 605 --- VipTimetable/Lines/Bus605/Bus605.cs | 3 +- .../Lines/Bus605/Bus605From20250203.cs | 164 ++++++++++++++++++ 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 VipTimetable/Lines/Bus605/Bus605From20250203.cs 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), + ], + }; +} From 57df75a08a3ab7d617742458a9ad927e273a9eba Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 30 Aug 2025 23:51:31 +0200 Subject: [PATCH 11/17] data: add 612 --- VipTimetable/Lines/Bus612/Bus612.cs | 3 +- .../Lines/Bus612/Bus612From20250203.cs | 107 ++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 VipTimetable/Lines/Bus612/Bus612From20250203.cs 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(), + }; +} From e67d981a5646dc105404f929f8565590a1d04d84 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:08:39 +0200 Subject: [PATCH 12/17] data: add 616 --- VipTimetable/Lines/Bus616/Bus616.cs | 2 +- .../Lines/Bus616/Bus616From20241214.cs | 2 +- .../Lines/Bus616/Bus616From20250203.cs | 45 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 VipTimetable/Lines/Bus616/Bus616From20250203.cs 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(), + }; +} From 0d8c8d5736e5661df1c6ab29e66f21400c58bcba Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:32:31 +0200 Subject: [PATCH 13/17] data: add 638 --- VipTimetable/Lines/Bus638/Bus638.cs | 3 +- .../Lines/Bus638/Bus638From20250203.cs | 75 +++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 VipTimetable/Lines/Bus638/Bus638From20250203.cs 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) + }, + ], + }; +} From eca5b73ddbca5580fe8528f8862365696d8d2faa Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:36:29 +0200 Subject: [PATCH 14/17] data: add 639 --- VipTimetable/Lines/Bus639/Bus639.cs | 2 +- VipTimetable/Lines/Bus639/Bus639From20250203.cs | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 VipTimetable/Lines/Bus639/Bus639From20250203.cs 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(), + }; +} From b5100ece773f16feef997371b62cc193cb64ed48 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Mon, 17 Nov 2025 19:49:04 +0100 Subject: [PATCH 15/17] data: add 692 (15, > Klinikum) --- VipTimetable/Lines/Bus692/Bus692.cs | 2 +- .../Lines/Bus692/Bus692From20241214.cs | 10 +- .../Lines/Bus692/Bus692From20250203.cs | 217 ++++++++++++++++++ 3 files changed, 219 insertions(+), 10 deletions(-) create mode 100644 VipTimetable/Lines/Bus692/Bus692From20250203.cs 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..e1f0610 --- /dev/null +++ b/VipTimetable/Lines/Bus692/Bus692From20250203.cs @@ -0,0 +1,217 @@ +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, + ], + }, + ], + }, + ..Previous.Line.Routes[4..] + ], + TripsCreate = Previous.Line.TripsCreate.Select(trip => + { + if ((trip.DaysOfOperation & DaysOfOperation.Weekend) > 0) + { + // Do not handle weekend trips here. + return 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; + }).ToArray(), + }; +} From 03a044e2122cc299ad2535143d169009edb208df Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 21 Nov 2025 00:13:24 +0100 Subject: [PATCH 16/17] data: add 692 (67, > Klinikum) --- .../Lines/Bus692/Bus692From20250203.cs | 257 +++++++++++------- 1 file changed, 157 insertions(+), 100 deletions(-) diff --git a/VipTimetable/Lines/Bus692/Bus692From20250203.cs b/VipTimetable/Lines/Bus692/Bus692From20250203.cs index e1f0610..e7d1ec5 100644 --- a/VipTimetable/Lines/Bus692/Bus692From20250203.cs +++ b/VipTimetable/Lines/Bus692/Bus692From20250203.cs @@ -40,7 +40,7 @@ Previous.Line.Routes[0] with 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 @@ -75,7 +75,7 @@ Previous.Line.Routes[1] with [ 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 @@ -90,7 +90,7 @@ Previous.Line.Routes[2] with M1, M3, M1, M1, ], }, - ..Previous.Line.Routes[2].TimeProfiles[1..] + ..Previous.Line.Routes[2].TimeProfiles[1..], ], }, Previous.Line.Routes[3] with @@ -113,105 +113,162 @@ Previous.Line.Routes[3] with 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..] + ..Previous.Line.Routes[4..], ], - TripsCreate = Previous.Line.TripsCreate.Select(trip => - { - if ((trip.DaysOfOperation & DaysOfOperation.Weekend) > 0) - { - // Do not handle weekend trips here. - return 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; - }).ToArray(), + TripsCreate = Previous.Line.TripsCreate.Select(Helpers.Transform).ToArray(), }; } + +file static class Helpers +{ + public static Line.TripCreate Transform(Line.TripCreate trip) + { + return (trip.DaysOfOperation & DaysOfOperation.Weekend) > 0 ? TransformWeekend(trip) : TransformWeekday(trip); + } + + private static Line.TripCreate TransformWeekday(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; + } +} From 0654fa2818a6a8afb9b3bd37ba8d170c5c78a255 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:19:41 +0100 Subject: [PATCH 17/17] data: add 692 (15, > Campus Jungfernsee) --- .../Lines/Bus692/Bus692From20250203.cs | 198 +++++++++++++++++- 1 file changed, 195 insertions(+), 3 deletions(-) diff --git a/VipTimetable/Lines/Bus692/Bus692From20250203.cs b/VipTimetable/Lines/Bus692/Bus692From20250203.cs index e7d1ec5..d661864 100644 --- a/VipTimetable/Lines/Bus692/Bus692From20250203.cs +++ b/VipTimetable/Lines/Bus692/Bus692From20250203.cs @@ -97,7 +97,8 @@ Previous.Line.Routes[3] with { TimeProfiles = [ - ..Previous.Line.Routes[3].TimeProfiles, new Line.Route.TimeProfile + ..Previous.Line.Routes[3].TimeProfiles, + new Line.Route.TimeProfile { StopDistances = [ @@ -123,7 +124,88 @@ Previous.Line.Routes[3] with }, ], }, - ..Previous.Line.Routes[4..], + 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(), }; @@ -133,10 +215,120 @@ 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) + 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)) {