summaryrefslogtreecommitdiff
path: root/src/timetable_gui.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-12-26 09:03:19 +0000
committerrubidium <rubidium@openttd.org>2010-12-26 09:03:19 +0000
commit64f04c3a74be3769a3e0bbf2e1c68bd27d6579eb (patch)
tree8608582c367f18f6c6669751ca8f0374e9f6a54d /src/timetable_gui.cpp
parent8a278f771163b11074d23a573840af7b945abb8c (diff)
downloadopenttd-64f04c3a74be3769a3e0bbf2e1c68bd27d6579eb.tar.xz
(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
Diffstat (limited to 'src/timetable_gui.cpp')
-rw-r--r--src/timetable_gui.cpp32
1 files changed, 20 insertions, 12 deletions
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;
}