Show predicted scheduled dispatch arr/dep times in timetable window
This commit is contained in:
@@ -33,10 +33,16 @@
|
||||
|
||||
#include "safeguards.h"
|
||||
|
||||
enum TimetableArrivalDepartureFlags {
|
||||
TADF_ARRIVAL_PREDICTED,
|
||||
TADF_DEPARTURE_PREDICTED,
|
||||
};
|
||||
|
||||
/** Container for the arrival/departure dates of a vehicle */
|
||||
struct TimetableArrivalDeparture {
|
||||
Ticks arrival; ///< The arrival time
|
||||
Ticks departure; ///< The departure time
|
||||
uint flags;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -121,8 +127,11 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID
|
||||
/* Pre-initialize with unknown time */
|
||||
for (int i = 0; i < v->GetNumOrders(); ++i) {
|
||||
table[i].arrival = table[i].departure = INVALID_TICKS;
|
||||
table[i].flags = 0;
|
||||
}
|
||||
|
||||
bool predicted = false;
|
||||
|
||||
/* 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 {
|
||||
@@ -134,12 +143,26 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID
|
||||
if (!CanDetermineTimeTaken(order, true)) return;
|
||||
sum += order->GetTimetabledTravel();
|
||||
table[i].arrival = sum;
|
||||
if (predicted) SetBit(table[i].flags, TADF_ARRIVAL_PREDICTED);
|
||||
}
|
||||
|
||||
if (order->IsScheduledDispatchOrder(true) && !(i == start && !travelling)) return;
|
||||
if (!CanDetermineTimeTaken(order, false)) return;
|
||||
sum += order->GetTimetabledWait();
|
||||
if (order->IsScheduledDispatchOrder(true) && !(i == start && !travelling)) {
|
||||
extern DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksScaled leave_time);
|
||||
DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex());
|
||||
DispatchSchedule predicted_ds;
|
||||
predicted_ds.BorrowSchedule(ds);
|
||||
predicted_ds.UpdateScheduledDispatchToDate(_scaled_date_ticks + sum);
|
||||
DateTicksScaled slot = GetScheduledDispatchTime(predicted_ds, _scaled_date_ticks + sum + order->GetTimetabledWait());
|
||||
predicted_ds.ReturnSchedule(ds);
|
||||
if (slot <= -1) return;
|
||||
sum = slot - _scaled_date_ticks;
|
||||
predicted = true;
|
||||
} else {
|
||||
if (!CanDetermineTimeTaken(order, false)) return;
|
||||
sum += order->GetTimetabledWait();
|
||||
}
|
||||
table[i].departure = sum;
|
||||
if (predicted) SetBit(table[i].flags, TADF_DEPARTURE_PREDICTED);
|
||||
}
|
||||
|
||||
++i;
|
||||
@@ -694,17 +717,17 @@ struct TimetableWindow : Window {
|
||||
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival);
|
||||
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY, TC_GREEN);
|
||||
} else {
|
||||
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival + offset);
|
||||
SetDParam(0, _scaled_date_ticks + arr_dep[i / 2].arrival + (HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_PREDICTED) ? 0 : offset));
|
||||
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY,
|
||||
show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK);
|
||||
HasBit(arr_dep[i / 2].flags, TADF_ARRIVAL_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (arr_dep[i / 2].departure != INVALID_TICKS) {
|
||||
DrawString(abbr_left, abbr_right, y, STR_TIMETABLE_DEPARTURE_ABBREVIATION, i == selected ? TC_WHITE : TC_BLACK);
|
||||
SetDParam(0, _scaled_date_ticks + arr_dep[i/2].departure + offset);
|
||||
SetDParam(0, _scaled_date_ticks + arr_dep[i/2].departure + (HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_PREDICTED) ? 0 : offset));
|
||||
DrawString(time_left, time_right, y, STR_JUST_DATE_WALLCLOCK_TINY,
|
||||
show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK);
|
||||
HasBit(arr_dep[i / 2].flags, TADF_DEPARTURE_PREDICTED) ? (TextColour)(TC_IS_PALETTE_COLOUR | TC_NO_SHADE | 4) : (show_late ? TC_RED : i == selected ? TC_WHITE : TC_BLACK));
|
||||
}
|
||||
}
|
||||
y += line_height;
|
||||
|
Reference in New Issue
Block a user