diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index c8e8fba870..9f69e90c64 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -715,14 +715,18 @@ void UpdateSeparationOrder(Vehicle *v_start) break; } } - int separation_ahead = SeparationBetween(v, v->AheadSeparation()); - int separation_behind = SeparationBetween(v->BehindSeparation(), v); - if (separation_ahead != -1 && separation_behind != -1) { - Company *owner = Company::GetIfValid(v->owner); - uint8 timetable_separation_rate = owner ? owner->settings.auto_timetable_separation_rate : 100; - int new_lateness = (separation_ahead - separation_behind) / 2; - v->lateness_counter = (new_lateness * timetable_separation_rate + - v->lateness_counter * (100 - timetable_separation_rate)) / 100; + if (HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED) && + HasBit(v->AheadSeparation()->vehicle_flags, VF_TIMETABLE_STARTED) && + HasBit(v->BehindSeparation()->vehicle_flags, VF_TIMETABLE_STARTED)) { + int separation_ahead = SeparationBetween(v, v->AheadSeparation()); + int separation_behind = SeparationBetween(v->BehindSeparation(), v); + if (separation_ahead != -1 && separation_behind != -1) { + Company *owner = Company::GetIfValid(v->owner); + uint8 timetable_separation_rate = owner ? owner->settings.auto_timetable_separation_rate : 100; + int new_lateness = (separation_ahead - separation_behind) / 2; + v->lateness_counter = (new_lateness * timetable_separation_rate + + v->lateness_counter * (100 - timetable_separation_rate)) / 100; + } } v = v->AheadSeparation(); } while (v != v_start); @@ -918,7 +922,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) * Otherwise we risk trains blocking 1-lane stations for long times. */ ChangeTimetable(v, v->cur_timetable_order_index, 0, travel_field ? MTF_TRAVEL_TIME : MTF_WAIT_TIME, true); for (Vehicle *v2 = v->FirstShared(); v2 != nullptr; v2 = v2->NextShared()) { - v2->ClearSeparation(); + /* Clear VF_TIMETABLE_STARTED but do not call ClearSeparation */ ClrBit(v2->vehicle_flags, VF_TIMETABLE_STARTED); v2->lateness_counter = 0; SetWindowDirty(WC_VEHICLE_TIMETABLE, v2->index);