|
@@ -86,15 +86,17 @@ struct GroundVehicle : public Specialize
|
|
|
* The constructor at SpecializedVehicle must be called.
|
|
|
*/
|
|
|
GroundVehicle() : SpecializedVehicle<T, Type>() {}
|
|
|
|
|
|
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?
|
|
|
* @return number of victims
|
|
|
*/
|
|
|
uint Crash(bool flooded) override
|
|
@@ -364,13 +366,28 @@ protected:
|
|
|
{
|
|
|
uint spd = this->subspeed + accel;
|
|
|
this->subspeed = (byte)spd;
|
|
|
|
|
|
/* 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<int>(max_speed, this->breakdown_severity);
|
|
|
}
|
|
|
|
|
|
if (this->cur_speed > max_speed) {
|
|
|
tempmax = std::max(this->cur_speed - (this->cur_speed / 10) - 1, max_speed);
|
|
|
}
|
|
|
|
|
|
/* Enforce a maximum and minimum speed. Normally we would use something like
|
|
|
* Clamp for this, but in this case min_speed might be below the maximum speed
|