(svn r21914) -Codechange: move the algorithmic part of Train::UpdateSpeed to a function in GroundVehicle

This commit is contained in:
rubidium
2011-01-26 17:34:07 +00:00
parent 982de9cf86
commit b4a175ba41
2 changed files with 38 additions and 27 deletions

View File

@@ -377,6 +377,41 @@ struct GroundVehicle : public SpecializedVehicle<T, Type> {
this->gcache.last_speed = this->cur_speed;
}
}
protected:
/**
* Update the speed of the vehicle.
*
* It updates the cur_speed and subspeed variables depending on the state
* of the vehicle; in this case the current acceleration, minimum and
* maximum speeds of the vehicle. It returns the distance that that the
* vehicle can drive this tick. #Vehicle::GetAdvanceDistance() determines
* the distance to drive before moving a step on the map.
* @param accel The acceleration we would like to give this vehicle.
* @param min_speed The minimum speed here, in vehicle specific units.
* @param max_speed The maximum speed here, in vehicle specific units.
* @return Distance to drive.
*/
FORCEINLINE uint DoUpdateSpeed(uint accel, int min_speed, int max_speed)
{
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;
if (this->cur_speed > max_speed) {
tempmax = max(this->cur_speed - (this->cur_speed / 10) - 1, max_speed);
}
this->cur_speed = spd = Clamp(this->cur_speed + ((int)spd >> 8), min_speed, tempmax);
int scaled_spd = this->GetAdvanceSpeed(spd);
scaled_spd += this->progress;
this->progress = 0; // set later in *Handler or *Controller
return scaled_spd;
}
};
#endif /* GROUND_VEHICLE_HPP */