From a72b4881a0085f724853acc3aa73769a8ff04e26 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Thu, 9 Apr 2020 21:27:09 +0100 Subject: [PATCH] Scheduled dispatch: Fix double dispatch request when no timetable set See: #141 --- src/timetable_cmd.cpp | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index d61cecdb80..000a0a75b2 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -787,9 +787,10 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) } bool just_started = false; + bool set_scheduled_dispatch = false; /* Start scheduled dispatch at first opportunity */ - if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED) && HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) { + if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) { if (IsVehicleAtFirstWaitingLocation(v) && travelling) { /* Update scheduled information */ v->orders.list->UpdateScheduledDispatch(); @@ -800,6 +801,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) SetBit(v->vehicle_flags, VF_TIMETABLE_STARTED); v->lateness_counter = _scaled_date_ticks - slot + wait_offset; v->orders.list->SetScheduledDispatchLastDispatch(slot - v->orders.list->GetScheduledDispatchStartTick()); + set_scheduled_dispatch = true; } } } @@ -955,28 +957,14 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) * when this happens. */ if (timetabled == 0 && (travelling || v->lateness_counter >= 0)) return; - if (HasBit(v->vehicle_flags, VF_TIMETABLE_SEPARATION) && HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { + if (set_scheduled_dispatch) { + // do nothing + } else if (HasBit(v->vehicle_flags, VF_TIMETABLE_SEPARATION) && HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { v->current_order_time = time_taken; v->current_loading_time = time_loading; UpdateSeparationOrder(v); v->current_order_time = 0; v->current_loading_time = 0; - } else if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) && HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) { - const bool is_first_waiting = IsVehicleAtFirstWaitingLocation(v); - if (is_first_waiting && travelling) { - /* Update scheduled information */ - v->orders.list->UpdateScheduledDispatch(); - const int wait_offset = real_timetable_order->GetTimetabledWait(); - DateTicksScaled slot = GetScheduledDispatchTime(v, wait_offset); - if (slot > -1) { - v->lateness_counter = _scaled_date_ticks - slot + wait_offset; - v->orders.list->SetScheduledDispatchLastDispatch(slot - v->orders.list->GetScheduledDispatchStartTick()); - } else { - v->lateness_counter -= (timetabled - time_taken); - } - } else { - v->lateness_counter -= (timetabled - time_taken); - } } else { v->lateness_counter -= (timetabled - time_taken); }