summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-01-26 17:34:07 +0000
committerrubidium <rubidium@openttd.org>2011-01-26 17:34:07 +0000
commitb4a175ba41a4e731c145f5282630265d471c52ff (patch)
treecc968ff01ef1487b8ae4869d4d1a59afdf88c26a
parent982de9cf86ad7d4c6bb4e77b19953999a1ee9eb6 (diff)
downloadopenttd-b4a175ba41a4e731c145f5282630265d471c52ff.tar.xz
(svn r21914) -Codechange: move the algorithmic part of Train::UpdateSpeed to a function in GroundVehicle
-rw-r--r--src/ground_vehicle.hpp35
-rw-r--r--src/train_cmd.cpp30
2 files changed, 38 insertions, 27 deletions
diff --git a/src/ground_vehicle.hpp b/src/ground_vehicle.hpp
index 0dcfbeaf8..65bcb7653 100644
--- a/src/ground_vehicle.hpp
+++ b/src/ground_vehicle.hpp
@@ -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 */
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 2c816c280..42ceb8ae8 100644
--- 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;
- case AM_REALISTIC:
- max_speed = this->GetCurrentMaxSpeed();
- accel = this->GetAcceleration();
- break;
- }
+ return this->DoUpdateSpeed(this->acceleration * (this->GetAccelerationStatus() == AS_BRAKE ? -4 : 2), 0, this->gcache.cached_max_track_speed);
- 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);
+ case AM_REALISTIC:
+ return this->DoUpdateSpeed(this->GetAcceleration(), this->GetAccelerationStatus() == AS_BRAKE ? 0 : 2, this->GetCurrentMaxSpeed());
}
-
- int scaled_spd = this->GetAdvanceSpeed(spd);
-
- scaled_spd += this->progress;
- this->progress = 0; // set later in TrainLocoHandler or TrainController
- return scaled_spd;
}
/**