Auto-separation: Do not clear separation on congestion

Clear timetable started, and do no separate using vehicles
without timetable started
pull/171/head
Jonathan G Rennison 4 years ago
parent 09a1a7ce1a
commit b7a9f9901a

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

Loading…
Cancel
Save