(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

This commit is contained in:
rubidium
2010-12-26 09:03:19 +00:00
parent 8a278f7711
commit 64f04c3a74
10 changed files with 123 additions and 27 deletions

View File

@@ -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;
}