diff --git a/src/vehicle.cpp b/src/vehicle.cpp --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -67,9 +67,10 @@ INSTANTIATE_POOL_METHODS(Vehicle) /** * Function to tell if a vehicle needs to be autorenewed * @param *c The vehicle owner + * @param use_renew_setting Should the company renew setting be considered? * @return true if the vehicle is old enough for replacement */ -bool Vehicle::NeedsAutorenewing(const Company *c) const +bool Vehicle::NeedsAutorenewing(const Company *c, bool use_renew_setting) const { /* We can always generate the Company pointer when we have the vehicle. * However this takes time and since the Company pointer is often present @@ -77,7 +78,7 @@ bool Vehicle::NeedsAutorenewing(const Co * argument rather than finding it again. */ assert(c == Company::Get(this->owner)); - if (!c->settings.engine_renew) return false; + if (use_renew_setting && !c->settings.engine_renew) return false; if (this->age - this->max_age < (c->settings.engine_renew_months * 30)) return false; /* Only engines need renewing */ @@ -131,10 +132,13 @@ bool Vehicle::NeedsServicing() const if (needed_money > c->money) return false; for (const Vehicle *v = this; v != NULL; v = (v->type == VEH_TRAIN) ? Train::From(v)->GetNextUnit() : NULL) { - EngineID new_engine = EngineReplacementForCompany(c, v->engine_type, v->group_id); + bool replace_when_old = false; + EngineID new_engine = EngineReplacementForCompany(c, v->engine_type, v->group_id, &replace_when_old); /* Check engine availability */ if (new_engine == INVALID_ENGINE || !HasBit(Engine::Get(new_engine)->company_avail, v->owner)) continue; + /* Is the vehicle old if we are not always replacing? */ + if (replace_when_old && !v->NeedsAutorenewing(c, false)) continue; /* Check refittability */ uint32 available_cargo_types, union_mask;