summaryrefslogtreecommitdiff
path: root/src/ground_vehicle.hpp
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 /src/ground_vehicle.hpp
parent982de9cf86ad7d4c6bb4e77b19953999a1ee9eb6 (diff)
downloadopenttd-b4a175ba41a4e731c145f5282630265d471c52ff.tar.xz
(svn r21914) -Codechange: move the algorithmic part of Train::UpdateSpeed to a function in GroundVehicle
Diffstat (limited to 'src/ground_vehicle.hpp')
-rw-r--r--src/ground_vehicle.hpp35
1 files changed, 35 insertions, 0 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 */