From 3f900d3580fc4afd967df859e6dfdce664ff3ca9 Mon Sep 17 00:00:00 2001 From: rubidium Date: Tue, 18 Jan 2011 14:27:43 +0000 Subject: (svn r21832) -Feature: limit vehicle lateness to the length of a full timetable cycle, e.g. when a cycle takes 50 days and the vehicle is 65 days later reduce the lateness to 15 days --- src/timetable_cmd.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index c633ec61b..94c9812ef 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -310,6 +310,18 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) v->lateness_counter -= (timetabled - time_taken); + /* When we are more late than this timetabled bit takes we (somewhat expensively) + * check how many ticks the (fully filled) timetable has. If a timetable cycle is + * shorter than the amount of ticks we are late we reduce the lateness by the + * length of a full cycle till lateness is less than the length of a timetable + * cycle. When the timetable isn't fully filled the cycle will be INVALID_TICKS. */ + if (v->lateness_counter > (int)timetabled) { + Ticks cycle = v->orders.list->GetTimetableTotalDuration(); + if (cycle != INVALID_TICKS && v->lateness_counter > cycle) { + v->lateness_counter %= cycle; + } + } + for (v = v->FirstShared(); v != NULL; v = v->NextShared()) { SetWindowDirty(WC_VEHICLE_TIMETABLE, v->index); } -- cgit v1.2.3-70-g09d2