diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp --- a/src/ground_vehicle.hpp +++ b/src/ground_vehicle.hpp @@ -89,9 +89,11 @@ struct GroundVehicle : public Specialize void PowerChanged(); void CargoChanged(); - int GetAcceleration() const; + int GetAcceleration(); bool IsChainInDepot() const override; + void CalculatePower(uint32& power, uint32& max_te, bool breakdowns) const; + /** * Common code executed for crashed ground vehicles * @param flooded was this vehicle flooded? @@ -367,7 +369,22 @@ protected: /* When we are going faster than the maximum speed, reduce the speed * somewhat gradually. But never lower than the maximum speed. */ - int tempmax = max_speed; + int tempmax = ((this->breakdown_ctr == 1) ? this->cur_speed : max_speed); + + if (this->breakdown_ctr == 1) { + if (this->breakdown_type == BREAKDOWN_LOW_POWER) { + if((this->tick_counter & 0x7) == 0) { + if(this->cur_speed > (this->breakdown_severity * max_speed) >> 8) { + tempmax = this->cur_speed - (this->cur_speed / 10) - 1; + } else { + tempmax = (this->breakdown_severity * max_speed) >> 8; + } + } + } + if(this->breakdown_type == BREAKDOWN_LOW_SPEED) + tempmax = std::min(max_speed, this->breakdown_severity); + } + if (this->cur_speed > max_speed) { tempmax = std::max(this->cur_speed - (this->cur_speed / 10) - 1, max_speed); }