Departures: Support waypoints with wait times as calling points

This commit is contained in:
Jonathan G Rennison 2024-09-09 21:17:32 +01:00
parent 1859b4a059
commit d8e011d17f
10 changed files with 104 additions and 107 deletions

View File

@ -564,6 +564,13 @@ static void GetDepartureCandidateOrderDatesFromVehicle(std::vector<OrderDate> &n
}
}
static bool IsStationIDCallingPointOrder(const Order *order)
{
if ((order->IsType(OT_GOTO_STATION) || order->IsType(OT_IMPLICIT)) && (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) return true;
if (order->IsType(OT_GOTO_WAYPOINT) && order->IsWaitTimetabled()) return true;
return false;
}
struct DepartureViaTerminusState {
/* We keep track of potential via stations along the way. If we call at a station immediately after going via it, then it is the via station. */
StationID candidate_via = INVALID_STATION;
@ -574,7 +581,7 @@ struct DepartureViaTerminusState {
bool found_terminus = false;
bool CheckOrder(const Vehicle *v, Departure *d, const Order *order, DepartureOrderDestinationDetector source, DepartureCallingSettings calling_settings);
bool HandleCallingPoint(Departure *d, const Order *order, CallAt c);
bool HandleCallingPoint(Departure *d, const Order *order, CallAt c, DepartureCallingSettings calling_settings);
};
/**
@ -620,32 +627,35 @@ bool DepartureViaTerminusState::CheckOrder(const Vehicle *v, Departure *d, const
return false;
}
bool DepartureViaTerminusState::HandleCallingPoint(Departure *d, const Order *order, CallAt c)
bool DepartureViaTerminusState::HandleCallingPoint(Departure *d, const Order *order, CallAt c, DepartureCallingSettings calling_settings)
{
if (!IsStationIDCallingPointOrder(order)) return false;
if (order->IsType(OT_GOTO_WAYPOINT)) {
if (!calling_settings.ShowAllStops()) return false;
} else {
if (!calling_settings.ShowAllStops() && order->GetUnloadType() == OUFB_NO_UNLOAD) return false;
}
/* If this order's station is already in the calling, then the previous called at station is the terminus. */
if (std::find(d->calling_at.begin(), d->calling_at.end(), c) != d->calling_at.end()) {
this->found_terminus = true;
return true;
}
/* If appropriate, add the station to the calling at list and make it the candidate terminus. */
if ((order->GetType() == OT_GOTO_STATION ||
order->GetType() == OT_IMPLICIT) &&
order->GetNonStopType() != ONSF_NO_STOP_AT_ANY_STATION &&
order->GetNonStopType() != ONSF_NO_STOP_AT_DESTINATION_STATION) {
if (d->via == INVALID_STATION && pending_via != INVALID_STATION) {
d->via = this->pending_via;
d->via2 = this->pending_via2;
}
if (d->via == INVALID_STATION && this->candidate_via == (StationID)order->GetDestination()) {
d->via = (StationID)order->GetDestination();
}
d->terminus = c;
d->calling_at.push_back(c);
/* Add the station to the calling at list and make it the candidate terminus. */
if (d->via == INVALID_STATION && pending_via != INVALID_STATION) {
d->via = this->pending_via;
d->via2 = this->pending_via2;
}
if (d->via == INVALID_STATION && this->candidate_via == (StationID)order->GetDestination()) {
d->via = (StationID)order->GetDestination();
}
d->terminus = c;
d->calling_at.push_back(c);
/* If we unload all at this station, then it is the terminus. */
if (order->GetType() == OT_GOTO_STATION && order->GetUnloadType() == OUFB_UNLOAD) {
/* If we unload all at this station and departure load tests are not disabled, then it is the terminus. */
if (order->GetType() == OT_GOTO_STATION && order->GetUnloadType() == OUFB_UNLOAD && !calling_settings.DepartureNoLoadTest()) {
if (d->calling_at.size() > 0) {
this->found_terminus = true;
}
@ -655,20 +665,6 @@ bool DepartureViaTerminusState::HandleCallingPoint(Departure *d, const Order *or
return false;
}
/**
* Determine whether this order is an ignorable calling point.
*/
static bool IsIgnorableCallingAtOrder(const Order *order, DepartureCallingSettings calling_settings)
{
if ((order->GetType() != OT_GOTO_STATION && order->GetType() != OT_IMPLICIT) ||
(order->GetUnloadType() == OUFB_NO_UNLOAD && !calling_settings.ShowAllStops()) ||
order->GetNonStopType() == ONSF_NO_STOP_AT_ANY_STATION ||
order->GetNonStopType() == ONSF_NO_STOP_AT_DESTINATION_STATION) {
return true;
}
return false;
}
/**
* Process arrival history, returns true if a valid arrival was found.
*/
@ -679,9 +675,7 @@ static bool ProcessArrivalHistory(Departure *d, std::span<const Order *> arrival
for (uint i = 0; i < (uint)arrival_history.size(); i++) {
const Order *o = arrival_history[i];
if ((o->GetType() == OT_GOTO_STATION ||
o->GetType() == OT_IMPLICIT) &&
(o->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) {
if (IsStationIDCallingPointOrder(o)) {
if (source.StationMatches(o->GetDestination())) {
/* Same as source order, remove all possible origins */
possible_origins.clear();
@ -695,14 +689,13 @@ static bool ProcessArrivalHistory(Departure *d, std::span<const Order *> arrival
item.first = INVALID_STATION;
}
}
}
}
if ((o->GetType() == OT_GOTO_STATION || o->GetType() == OT_IMPLICIT) &&
(o->GetLoadType() != OLFB_NO_LOAD || calling_settings.ShowAllStops()) &&
!source.StationMatches(o->GetDestination()) &&
(o->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) {
possible_origins.push_back({ o->GetDestination(), i });
if (o->IsType(OT_GOTO_WAYPOINT)) {
if (calling_settings.ShowAllStops()) possible_origins.push_back({ o->GetDestination(), i });
} else {
if (calling_settings.ShowAllStops() || o->GetLoadType() != OLFB_NO_LOAD) possible_origins.push_back({ o->GetDestination(), i });
}
}
}
}
@ -719,10 +712,12 @@ static bool ProcessArrivalHistory(Departure *d, std::span<const Order *> arrival
if (origin != nullptr) {
for (uint i = origin_arrival_history_index + 1; i < (uint)arrival_history.size(); i++) {
const Order *o = arrival_history[i];
if (o->GetType() == OT_GOTO_STATION &&
(o->GetLoadType() != OLFB_NO_LOAD || calling_settings.ShowAllStops()) &&
(o->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION) == 0) {
d->calling_at.push_back(CallAt((StationID)o->GetDestination()));
if (IsStationIDCallingPointOrder(o)) {
if (o->IsType(OT_GOTO_STATION) && (o->GetLoadType() != OLFB_NO_LOAD || calling_settings.ShowAllStops())) {
d->calling_at.push_back(CallAt((StationID)o->GetDestination()));
} else if (o->IsType(OT_GOTO_WAYPOINT) && calling_settings.ShowAllStops()) {
d->calling_at.push_back(CallAt((StationID)o->GetDestination()));
}
}
}
@ -896,9 +891,7 @@ static DepartureList MakeDepartureListLiveMode(DepartureOrderDestinationDetector
c.station = (StationID)order->GetDestination();
/* We're not interested in this order any further if we're not calling at it. */
if (!IsIgnorableCallingAtOrder(order, calling_settings)) {
if (via_state.HandleCallingPoint(d, order, c)) break;
}
if (via_state.HandleCallingPoint(d, order, c, calling_settings)) break;
departure_tick += order->GetWaitTime();
@ -974,7 +967,7 @@ static DepartureList MakeDepartureListLiveMode(DepartureOrderDestinationDetector
std::vector<const Order *> new_history;
for (const Order *o = lod.v->GetOrder(predict_history_starting_from); o != existing_history_start; o = lod.v->orders->GetNext(o)) {
if (o->GetType() == OT_GOTO_STATION || o->GetType() == OT_IMPLICIT) new_history.push_back(o);
if (o->GetType() == OT_GOTO_STATION || o->GetType() == OT_IMPLICIT || (o->IsType(OT_GOTO_WAYPOINT) && o->IsWaitTimetabled())) new_history.push_back(o);
}
new_history.insert(new_history.end(), lod.arrival_history.begin(), lod.arrival_history.end());
lod.arrival_history = std::move(new_history);
@ -1253,9 +1246,7 @@ void DepartureListScheduleModeSlotEvaluator::EvaluateFromSourceOrder(const Order
c.station = (StationID)order->GetDestination();
/* We're not interested in this order any further if we're not calling at it. */
if (!IsIgnorableCallingAtOrder(order, this->calling_settings)) {
if (via_state.HandleCallingPoint(&d, order, c)) break;
}
if (via_state.HandleCallingPoint(&d, order, c, this->calling_settings)) break;
departure_tick += order->GetWaitTime();

View File

@ -823,6 +823,17 @@ uint DeparturesWindow::GetMinWidth() const
return result + ScaleGUITrad(140);
}
/* Uses 2 parameters */
static void FillBaseStationDParam(size_t n, StationID id)
{
if (Waypoint::IsValidID(id)) {
SetDParam(n, STR_WAYPOINT_NAME);
} else {
SetDParam(n, STR_STATION_NAME);
}
SetDParam(n + 1, id);
}
/**
* Draws a list of departures.
*/
@ -1048,8 +1059,8 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
if (via == INVALID_STATION) {
/* Only show the terminus. */
SetDParam(0, d->terminus.station);
SetDParam(1, icon);
FillBaseStationDParam(0, d->terminus.station);
SetDParam(2, icon);
DrawString(dest_left, dest_right, y + 1, STR_DEPARTURES_TERMINUS);
} else {
auto set_via_dparams = [&](uint offset) {
@ -1087,16 +1098,16 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
SetDParam(offset, SPECSTR_TEMP_START);
};
/* Show the terminus and the via station. */
SetDParam(0, d->terminus.station);
SetDParam(1, icon);
set_via_dparams(2);
FillBaseStationDParam(0, d->terminus.station);
SetDParam(2, icon);
set_via_dparams(3);
int text_width = (GetStringBoundingBox(STR_DEPARTURES_TERMINUS_VIA_STATION)).width;
if (dest_left + text_width < dest_right) {
/* They will both fit, so show them both. */
SetDParam(0, d->terminus.station);
SetDParam(1, icon);
set_via_dparams(2);
FillBaseStationDParam(0, d->terminus.station);
SetDParam(2, icon);
set_via_dparams(3);
DrawString(dest_left, dest_right, y + 1, STR_DEPARTURES_TERMINUS_VIA_STATION);
} else {
/* They won't both fit, so switch between showing the terminus and the via station approximately every 4 seconds. */
@ -1104,8 +1115,8 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
set_via_dparams(0);
DrawString(dest_left, dest_right, y + 1, STR_DEPARTURES_VIA);
} else {
SetDParam(0, d->terminus.station);
SetDParam(1, icon);
FillBaseStationDParam(0, d->terminus.station);
SetDParam(2, icon);
DrawString(dest_left, dest_right, y + 1, STR_DEPARTURES_TERMINUS_VIA);
}
this->scroll_refresh = true;
@ -1188,18 +1199,19 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
/* STR_DEPARTURES_CALLING_AT_LAST_STATION :{STATION} & {RAW_STRING}*/
std::string buffer;
auto station_str = [&](const CallAt &c) -> StringID {
/* Uses 3 or 4 parameters */
auto fill_calling_at_dparam = [&](size_t n, const CallAt &c) {
if (c.scheduled_tick != 0 && arrival_time_width > 0) {
return STR_DEPARTURES_CALLING_AT_STATION_WITH_TIME;
} else {
return STR_STATION_NAME;
SetDParam(n, STR_DEPARTURES_CALLING_AT_STATION_WITH_TIME);
n++;
}
FillBaseStationDParam(n, c.station);
SetDParam(n + 2, c.scheduled_tick);
};
if (d->calling_at.size() != 0) {
SetDParam(0, d->calling_at[0].station);
SetDParam(1, d->calling_at[0].scheduled_tick);
std::string calling_at_buffer = GetString(station_str(d->calling_at[0]));
fill_calling_at_dparam(0, d->calling_at[0]);
std::string calling_at_buffer = GetString(STR_JUST_STRING3);
const CallAt *continues_to = nullptr;
@ -1217,17 +1229,13 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
break;
}
SetDParamStr(0, std::move(calling_at_buffer));
SetDParam(1, station_str(d->calling_at[i]));
SetDParam(2, d->calling_at[i].station);
SetDParam(3, d->calling_at[i].scheduled_tick);
fill_calling_at_dparam(1, d->calling_at[i]);
calling_at_buffer = GetString(STR_DEPARTURES_CALLING_AT_STATION);
}
/* Finally, finish off with " and <station>". */
SetDParamStr(0, std::move(calling_at_buffer));
SetDParam(1, station_str(d->calling_at[i]));
SetDParam(2, d->calling_at[i].station);
SetDParam(3, d->calling_at[i].scheduled_tick);
fill_calling_at_dparam(1, d->calling_at[i]);
calling_at_buffer = GetString(STR_DEPARTURES_CALLING_AT_LAST_STATION);
}
@ -1235,9 +1243,7 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const
if (continues_to == nullptr) {
buffer = GetString(STR_DEPARTURES_CALLING_AT_LIST);
} else {
SetDParam(1, station_str(*continues_to));
SetDParam(2, continues_to->station);
SetDParam(3, continues_to->scheduled_tick);
fill_calling_at_dparam(1, *continues_to);
buffer = GetString(STR_DEPARTURES_CALLING_AT_LIST_SMART_TERMINUS);
}

View File

@ -1184,9 +1184,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} přes {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} přes
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} přes {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} přes
STR_DEPARTURES_VIA :{ORANGE}přes {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -1368,19 +1368,19 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING1} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING1} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING1} {RED}{DOWN_ARROW} {COLOUR}{STRING1} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} via {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} via
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING1}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING1}{STRING} via {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING1}{STRING} via
STR_DEPARTURES_VIA :{ORANGE}via {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}
STR_DEPARTURES_VEH :{ORANGE}{VEHICLE}
STR_DEPARTURES_CALLING_AT :{ORANGE}Calling at:
STR_DEPARTURES_CALLING_AT_STATION :{RAW_STRING}, {STRING2}
STR_DEPARTURES_CALLING_AT_LAST_STATION :{RAW_STRING} and {STRING2}
STR_DEPARTURES_CALLING_AT_STATION :{RAW_STRING}, {STRING3}
STR_DEPARTURES_CALLING_AT_LAST_STATION :{RAW_STRING} and {STRING3}
STR_DEPARTURES_CALLING_AT_LIST :{ORANGE}{RAW_STRING}.
STR_DEPARTURES_CALLING_AT_LIST_SMART_TERMINUS :{ORANGE}{RAW_STRING}. This service continues to {STRING2}.
STR_DEPARTURES_CALLING_AT_STATION_WITH_TIME :{STATION} ({TT_TIME_ABS})
STR_DEPARTURES_CALLING_AT_LIST_SMART_TERMINUS :{ORANGE}{RAW_STRING}. This service continues to {STRING3}.
STR_DEPARTURES_CALLING_AT_STATION_WITH_TIME :{STRING1} ({TT_TIME_ABS})
STR_DEPARTURES_TINY :{TINY_FONT}{STRING2}
STR_DEPARTURES_VIA_DESCRIPTOR :{STRING1}{STRING}
STR_DEPARTURES_VIA_AND :{STRING} and {STRING}

View File

@ -1306,9 +1306,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} vía {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} vía
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} vía {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} vía
STR_DEPARTURES_VIA :{ORANGE}vía {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -1066,9 +1066,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} über {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} über
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} über {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} über
STR_DEPARTURES_VIA :{ORANGE}über {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -47,9 +47,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} 経由 {STRING}経由
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} 経由
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} 経由 {STRING}経由
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} 経由
STR_DEPARTURES_VIA :{ORANGE} {STRING} 経由
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -1306,9 +1306,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} 경유 {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} 경유
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} 경유 {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} 경유
STR_DEPARTURES_VIA :{ORANGE}경유 {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -1313,9 +1313,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING} через {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING} через
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING} через {STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING} через
STR_DEPARTURES_VIA :{ORANGE}через {STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}

View File

@ -1308,9 +1308,9 @@ STR_DEPARTURES_TIME :{COLOUR}{STRING
STR_DEPARTURES_TIME_DEP :{COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TIME_ARR :{COLOUR}{STRING} {RED}{DOWN_ARROW}
STR_DEPARTURES_TIME_BOTH :{COLOUR}{STRING} {RED}{DOWN_ARROW} {COLOUR}{STRING} {GREEN}{UP_ARROW}
STR_DEPARTURES_TERMINUS :{ORANGE}{STATION}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STATION}{STRING}经由{STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STATION}{STRING}经由
STR_DEPARTURES_TERMINUS :{ORANGE}{STRING}{STRING}
STR_DEPARTURES_TERMINUS_VIA_STATION :{ORANGE}{STRING}{STRING}经由{STRING}
STR_DEPARTURES_TERMINUS_VIA :{ORANGE}{STRING}{STRING}经由
STR_DEPARTURES_VIA :{ORANGE}经由{STRING}
STR_DEPARTURES_TOC :{ORANGE}{COMPANY}
STR_DEPARTURES_GROUP :{ORANGE}{GROUP}