diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 48a450b7ad..8adf291c9e 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -3095,6 +3095,17 @@ static Vehicle *CheckTrainAtSignal(Vehicle *v, void *data) return t; } +uint16 ReversingDistanceTargetSpeed(const Train *v) +{ + int target_speed; + if (_settings_game.vehicle.train_acceleration_model == AM_REALISTIC) { + target_speed = ((v->reverse_distance - 1) * 5) / 2; + } else { + target_speed = (v->reverse_distance - 1) * 10 - 5; + } + return max(0, target_speed); +} + /** * Move a vehicle chain one movement stop forwards. * @param v First vehicle to move. @@ -3113,14 +3124,7 @@ bool TrainController(Train *v, Vehicle *nomove, bool reverse) } if (v->reverse_distance > 1) { - v->vehstatus |= VS_TRAIN_SLOWING; - int target_speed; - if (_settings_game.vehicle.train_acceleration_model == AM_REALISTIC) { - target_speed = ((v->reverse_distance - 1) * 5) / 2; - } else { - target_speed = (v->reverse_distance - 1) * 10 - 5; - } - uint16 spd = max(0, target_speed); + uint16 spd = ReversingDistanceTargetSpeed(v); if (spd < v->cur_speed) v->cur_speed = spd; } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 31e03f0a08..77469e4b9f 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2395,6 +2395,8 @@ static void SpawnAdvancedVisualEffect(const Vehicle *v) } } +uint16 ReversingDistanceTargetSpeed(const Train *v); + /** * Draw visual effects (smoke and/or sparks) for a vehicle chain. * @pre this->IsPrimaryVehicle() @@ -2423,10 +2425,12 @@ void Vehicle::ShowVisualEffect() const /* For trains, do not show any smoke when: * - the train is reversing * - is entering a station with an order to stop there and its speed is equal to maximum station entering speed + * - is approaching a reversing point and its speed is equal to maximum approach speed */ if (HasBit(t->flags, VRF_REVERSING) || (IsRailStationTile(t->tile) && t->IsFrontEngine() && t->current_order.ShouldStopAtStation(t, GetStationIndex(t->tile)) && - t->cur_speed >= max_speed)) { + t->cur_speed >= max_speed) || + (t->reverse_distance >= 1 && t->cur_speed >= ReversingDistanceTargetSpeed(t))) { return; } }