diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2630,38 +2630,14 @@ void Train::MarkDirty() */ int Train::UpdateSpeed() { - uint accel; - uint16 max_speed; - switch (_settings_game.vehicle.train_acceleration_model) { default: NOT_REACHED(); case AM_ORIGINAL: - max_speed = this->gcache.cached_max_track_speed; - accel = this->acceleration * (this->GetAccelerationStatus() == AS_BRAKE ? -4 : 2); - break; + return this->DoUpdateSpeed(this->acceleration * (this->GetAccelerationStatus() == AS_BRAKE ? -4 : 2), 0, this->gcache.cached_max_track_speed); + case AM_REALISTIC: - max_speed = this->GetCurrentMaxSpeed(); - accel = this->GetAcceleration(); - break; + return this->DoUpdateSpeed(this->GetAcceleration(), this->GetAccelerationStatus() == AS_BRAKE ? 0 : 2, this->GetCurrentMaxSpeed()); } - - uint spd = this->subspeed + accel; - this->subspeed = (byte)spd; - { - int tempmax = max_speed; - if (this->cur_speed > max_speed) { - tempmax = max(this->cur_speed - (this->cur_speed / 10) - 1, tempmax); - } - /* Force a minimum speed of 1 km/h when realistic acceleration is on and the train is not braking. */ - int min_speed = (_settings_game.vehicle.train_acceleration_model == AM_ORIGINAL || this->GetAccelerationStatus() == AS_BRAKE) ? 0 : 2; - 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 TrainLocoHandler or TrainController - return scaled_spd; } /**