From fd86b0608d051d14d5c1eba2a9730d94f4c505d2 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 6 Feb 2011 16:45:27 +0000 Subject: [PATCH] (svn r21997) -Fix [FS#4473]: when the difference between force and resistance is smaller than the mass(*4) there would be no acceleration anymore, even when at higher (or lower) speed the force and resistance balance out better --- src/ground_vehicle.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ground_vehicle.cpp b/src/ground_vehicle.cpp index cc2360d3f1..1c706b5c67 100644 --- a/src/ground_vehicle.cpp +++ b/src/ground_vehicle.cpp @@ -151,8 +151,16 @@ int GroundVehicle::GetAcceleration() const } if (mode == AS_ACCEL) { - /* Divide by 4 to compensate for the wacky game scale. */ - return (force - resistance) / (mass * 4); + /* Easy way out when there is no acceleration. */ + if (force == resistance) return 0; + + /* When we accelerate, make sure we always keep doing that, even when + * the excess force is more than the mass. Otherwise a vehicle going + * down hill will never slow down enough, and a vehicle that came up + * a hill will never speed up enough to (eventually) get back to the + * same (maximum) speed. */ + int accel = (force - resistance) / (mass * 4); + return force < resistance ? min(-1, accel) : max(1, accel); } else { return min(-force - resistance, -10000) / mass; }