From 64f04c3a74be3769a3e0bbf2e1c68bd27d6579eb Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 26 Dec 2010 09:03:19 +0000 Subject: (svn r21642) -Feature: concept of automatic station orders; add stub orders for intermediate stations and remove them when not visiting them anymore. This allows you to see what trains visit a station without actually having to order a vehicle to stop at all stations. Based on patch by fonsinchen --- src/timetable_gui.cpp | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) (limited to 'src/timetable_gui.cpp') diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 026d20a10..fdd308bed 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -90,7 +90,7 @@ static void SetArrivalDepartParams(int param1, int param2, Ticks ticks) static bool CanDetermineTimeTaken(const Order *order, bool travelling) { /* Current order is conditional */ - if (order->IsType(OT_CONDITIONAL)) return false; + if (order->IsType(OT_CONDITIONAL) || order->IsType(OT_AUTOMATIC)) return false; /* No travel time and we have not already finished travelling */ if (travelling && order->travel_time == 0) return false; /* No wait time but we are loading at this timetabled station */ @@ -126,15 +126,20 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID /* Cyclically loop over all orders until we reach the current one again. * As we may start at the current order, do a post-checking loop */ do { - if (travelling || i != start) { - if (!CanDetermineTimeTaken(order, true)) return; - sum += order->travel_time; - table[i].arrival = sum; - } + /* Automatic orders don't influence the overall timetable; + * they just add some untimetabled entries, but the time till + * the next non-automatic order can still be known. */ + if (!order->IsType(OT_AUTOMATIC)) { + if (travelling || i != start) { + if (!CanDetermineTimeTaken(order, true)) return; + sum += order->travel_time; + table[i].arrival = sum; + } - if (!CanDetermineTimeTaken(order, false)) return; - sum += order->wait_time; - table[i].departure = sum; + if (!CanDetermineTimeTaken(order, false)) return; + sum += order->wait_time; + table[i].departure = sum; + } ++i; order = order->next; @@ -317,7 +322,7 @@ struct TimetableWindow : Window { if (selected != -1) { const Order *order = v->GetOrder(((selected + 1) / 2) % v->GetNumOrders()); if (selected % 2 == 1) { - disable = order != NULL && order->IsType(OT_CONDITIONAL); + disable = order != NULL && (order->IsType(OT_CONDITIONAL) || order->IsType(OT_AUTOMATIC)); } else { disable = order == NULL || ((!order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL)); } @@ -387,9 +392,12 @@ struct TimetableWindow : Window { } } else { StringID string; - + TextColour colour = (i == selected) ? TC_WHITE : TC_BLACK; if (order->IsType(OT_CONDITIONAL)) { string = STR_TIMETABLE_NO_TRAVEL; + } else if(order->IsType(OT_AUTOMATIC)) { + string = STR_TIMETABLE_NOT_TIMETABLEABLE; + colour = ((i == selected) ? TC_SILVER : TC_GREY) | TC_NO_SHADE; } else if (order->travel_time == 0) { string = STR_TIMETABLE_TRAVEL_NOT_TIMETABLED; } else { @@ -397,7 +405,7 @@ struct TimetableWindow : Window { string = STR_TIMETABLE_TRAVEL_FOR; } - DrawString(rtl ? r.left + WD_FRAMERECT_LEFT : middle, rtl ? middle : r.right - WD_FRAMERECT_LEFT, y, string, (i == selected) ? TC_WHITE : TC_BLACK); + DrawString(rtl ? r.left + WD_FRAMERECT_LEFT : middle, rtl ? middle : r.right - WD_FRAMERECT_LEFT, y, string, colour); if (final_order) break; } -- cgit v1.2.3-54-g00ecf