diff --git a/src/lang/english.txt b/src/lang/english.txt index 1ff9eaf612..baa40974e6 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -5189,6 +5189,7 @@ STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Can't ti STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Vehicles can only wait at stations STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}This vehicle is not stopping at this station STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... timetable is incomplete +STR_ERROR_TIMETABLE_NOT_STARTED :{WHITE}... timetable has not started yet # Sign related errors STR_ERROR_TOO_MANY_SIGNS :{WHITE}... too many signs diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index 8fe617ed70..6b77355c59 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -221,6 +221,10 @@ CommandCost CmdSetVehicleOnTime(DoCommandFlag flags, VehicleID veh, bool apply_t Vehicle *v = Vehicle::GetIfValid(veh); if (v == nullptr || !v->IsPrimaryVehicle() || v->orders == nullptr) return CMD_ERROR; + /* A vehicle can't be late if its timetable hasn't started. + * If we're setting all vehicles in the group, we handle that below. */ + if (!apply_to_group && !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) return CommandCost(STR_ERROR_TIMETABLE_NOT_STARTED); + CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; @@ -228,12 +232,18 @@ CommandCost CmdSetVehicleOnTime(DoCommandFlag flags, VehicleID veh, bool apply_t if (apply_to_group) { int32_t most_late = 0; for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { + /* A vehicle can't be late if its timetable hasn't started. */ + if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) continue; + if (u->lateness_counter > most_late) { most_late = u->lateness_counter; } } if (most_late > 0) { for (Vehicle *u = v->FirstShared(); u != nullptr; u = u->NextShared()) { + /* A vehicle can't be late if its timetable hasn't started. */ + if (!HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) continue; + u->lateness_counter -= most_late; SetWindowDirty(WC_VEHICLE_TIMETABLE, u->index); }