diff --git a/src/train.h b/src/train.h index 59b9583c0f..aeee416ce0 100644 --- a/src/train.h +++ b/src/train.h @@ -191,6 +191,8 @@ struct Train FINAL : public GroundVehicle { int advisory_max_speed; }; + bool ConsistNeedsRepair() const; + private: MaxSpeedInfo GetCurrentMaxSpeedInfoInternal(bool update_state) const; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 7aa8b396b1..03f316e057 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1201,6 +1201,16 @@ void Train::UpdateAcceleration() } } +bool Train::ConsistNeedsRepair() const +{ + if (!HasBit(this->flags, VRF_CONSIST_BREAKDOWN)) return false; + + for (const Train *u = this; u != nullptr; u = u->Next()) { + if (HasBit(u->flags, VRF_NEED_REPAIR)) return true; + } + return false; +} + /** * Get the width of a train vehicle image in the GUI. * @param offset Additional offset for positioning the sprite; set to nullptr if not needed diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 0d83158341..915c7f3cce 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -232,7 +232,7 @@ bool Vehicle::NeedsServicing() const if ((this->ServiceIntervalIsPercent() ? (this->reliability >= this->GetEngine()->reliability * (100 - this->service_interval) / 100) : (this->date_of_last_service + this->service_interval >= _date)) - && !(this->type == VEH_TRAIN && HasBit(Train::From(this)->flags, VRF_NEED_REPAIR)) + && !(this->type == VEH_TRAIN && HasBit(Train::From(this)->flags, VRF_CONSIST_BREAKDOWN) && Train::From(this)->ConsistNeedsRepair()) && !(this->type == VEH_ROAD && RoadVehicle::From(this)->critical_breakdown_count > 0) && !(this->type == VEH_SHIP && Ship::From(this)->critical_breakdown_count > 0)) { return false;