Revision: 2661
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2661&view=rev
Author:   ulteq
Date:     2012-05-25 06:26:47 +0000 (Fri, 25 May 2012)
Log Message:
-----------
-Feature: adds an engine speed limiter (caps throttle at maxRPM)
+Bugfix: switching from N to D will select an appropriate gear now
+Bugfix: engine won't stall anymore in automatic mode TWO
+Bugfix: engine can't be blown up anymore in automatic mode
~renamed curGearboxRPM to curWheelRevolutions
~fixed a typo (iddleRPM -> idleRPM)

Modified Paths:
--------------
    trunk/source/main/gameplay/BeamEngine.cpp
    trunk/source/main/gameplay/BeamEngine.h

Modified: trunk/source/main/gameplay/BeamEngine.cpp
===================================================================
--- trunk/source/main/gameplay/BeamEngine.cpp   2012-05-25 01:56:26 UTC (rev 
2660)
+++ trunk/source/main/gameplay/BeamEngine.cpp   2012-05-25 06:26:47 UTC (rev 
2661)
@@ -38,14 +38,14 @@
        , curEngineRPM(0.0f)
        , curGear(0)
        , curGearRange(0)
-       , curGearboxRPM(0.0f)
+       , curWheelRevolutions(0.0f)
        , curTurboRPM(0.0f)
        , engineTorque(torque - brakingTorque)
        , gearsRatio(gears)
        , hasair(true)
        , hasturbo(true)
        , hydropump(0.0f)
-       , iddleRPM(iddle)
+       , idleRPM(iddle)
        , inertia(10.0f)
        , maxRPM(max)
        , numGears((int)gears.size() - 2)
@@ -209,7 +209,7 @@
        if (curGear)
        {
                float gearboxspinner = curEngineRPM / gearsRatio[curGear + 1];
-               curClutchTorque = (gearboxspinner - curGearboxRPM) * curClutch 
* clutchForce;
+               curClutchTorque = (gearboxspinner - curWheelRevolutions) * 
curClutch * clutchForce;
        } else
        {
                curClutchTorque = 0.0f;
@@ -245,7 +245,7 @@
                                curGear += shiftval;
                                if (automode == AUTOMATIC)
                                {
-                                       while (curGear > 2 && curGearboxRPM * 
gearsRatio[curGear + 1] < iddleRPM)
+                                       while (curGear > 2 && 
curWheelRevolutions * gearsRatio[curGear + 1] < idleRPM)
                                        {
                                                curGear -= 2;
                                        }
@@ -278,7 +278,7 @@
                        }
                }
 
-               // auto release clutch
+               // auto declutch
                if (shifting)
                {
                        // we are shifting, just avoid stalling in worst case
@@ -302,9 +302,9 @@
                } else if (std::abs(curGear) == 1)
                {
                        // 1st gear : special
-                       if (curEngineRPM > iddleRPM)
+                       if (curEngineRPM > idleRPM)
                        {
-                               curClutch = ((curEngineRPM - iddleRPM) / 
(maxRPM - iddleRPM));
+                               curClutch = ((curEngineRPM - idleRPM) / (maxRPM 
- idleRPM));
                                curClutch = std::min(curClutch, 1.0f);
                        } else
                        {
@@ -316,21 +316,43 @@
                }
        }
 
-       if (doUpdate)
+       // gear hack
+       if (automode == AUTOMATIC && curGear >= 0 && !shifting && !postshifting 
&& (autoselect == DRIVE || autoselect == TWO))
        {
-               // gear hack
-               if (curGear >= 0 && automode == AUTOMATIC && !shifting && 
!postshifting && autoselect == DRIVE)
+               if ((curEngineRPM > maxRPM - 100.0f || curWheelRevolutions * 
gearsRatio[curGear + 1] > maxRPM - 100.0f))
                {
-                       if (curEngineRPM > maxRPM - 100.0f && curGear < 
numGears )
+                       if ((autoselect == DRIVE && curGear < numGears) || 
(autoselect == TWO && curGear < 2))
                        {
                                shift(1);
-                       } else if (curEngineRPM < iddleRPM && curGear > 1 )
-                       {
-                               shift(-1);
                        }
+               } else if (curGear > 1 && curEngineRPM < idleRPM)
+               {
+                       shift(-1);
                }
        }
 
+       // engine speed limiter
+       if (curEngineRPM > maxRPM) // you could add a factor of 1.248f for 
legacy purposes (a factor of 1.0f significantly lowers the top speed of most 
vehicles)
+       {
+               float acc = 0.0f + 1.0f / (1.0f + (curEngineRPM - maxRPM) / 
2.0f);
+               setAcc(acc);
+       }
+
+       // avoid over-revving
+       if (automode <= SEMIAUTO && curGear != 0)
+       {
+               if (std::abs(curWheelRevolutions * gearsRatio[curGear + 1]) > 
maxRPM * 1.05f)
+               {
+                       float clutch = 0.0f + 1.0f / (1.0f + 
std::abs(curWheelRevolutions * gearsRatio[curGear + 1] - maxRPM * 1.05f) / 
2.0f);
+                       curClutch = std::min(clutch, curClutch);
+               }
+               if (curGear * curWheelRevolutions < -10.0f)
+               {
+                       float clutch = 0.0f + 1.0f / (1.0f + std::abs(-10.0f - 
curGear * curWheelRevolutions) / 2.0f);
+                       curClutch = std::min(clutch, curClutch);
+               }
+       }
+
        // audio stuff  
        updateAudio(doUpdate);
 }
@@ -349,7 +371,7 @@
 #ifdef USE_OPENAL
                SoundScriptManager::getSingleton().modulate(trucknum, 
SS_MOD_ENGINE, curEngineRPM);
                SoundScriptManager::getSingleton().modulate(trucknum, 
SS_MOD_TORQUE, curClutchTorque);
-               SoundScriptManager::getSingleton().modulate(trucknum, 
SS_MOD_GEARBOX, curGearboxRPM);
+               SoundScriptManager::getSingleton().modulate(trucknum, 
SS_MOD_GEARBOX, curWheelRevolutions);
 #endif // USE_OPENAL
        }
 #ifdef USE_OPENAL
@@ -364,17 +386,11 @@
 #endif // USE_OPENAL
 }
 
-
 float BeamEngine::getRPM()
 {
        return curEngineRPM;
 }
 
-void BeamEngine::setRPM(float value)
-{
-       curEngineRPM = value;
-}
-
 void BeamEngine::toggleAutoMode()
 {
        automode = (automode + 1) % MANUAL_RANGES;
@@ -469,9 +485,14 @@
        return curClutchTorque;
 }
 
+void BeamEngine::setRPM(float rpm)
+{
+       curEngineRPM = rpm;
+}
+
 void BeamEngine::setSpin(float rpm)
 {
-       curGearboxRPM=rpm;
+       curWheelRevolutions = rpm;
 }
 
 // for hydros acceleration
@@ -529,7 +550,7 @@
        }
        curClutch = 0.0f;
        curEngineRPM = 750.0f;
-       curGearboxRPM = 750.0f;
+       curWheelRevolutions = 0.0f;
        curClutchTorque = 0.0f;
        curTurboRPM = 0.0f;
        apressure = 0.0f;
@@ -546,7 +567,7 @@
 {
        curGear = 0;
        curClutch = 0.0f;
-       autoselect= NEUTRAL;
+       autoselect = NEUTRAL;
        curEngineRPM = 0.0f;
        running = false;
        contact = false;
@@ -668,15 +689,39 @@
 
 void BeamEngine::updateShifts()
 {
+       if (autoselect == MANUALMODE) return;
+
 #ifdef USE_OPENAL
        SoundScriptManager::getSingleton().trigOnce(trucknum, SS_TRIG_SHIFT);
 #endif // USE_OPENAL
 
-       if (autoselect == REAR)    curGear = -1;
-       if (autoselect == NEUTRAL) curGear =  0;
-       if (autoselect == DRIVE)   curGear =  std::max(1, curGear);
-       if (autoselect == TWO)     curGear =  std::max(1, std::min(curGear, 2));
-       if (autoselect == ONE)     curGear =  1;
+       if (autoselect == REAR)
+       {
+               curGear = -1;
+       } else if (autoselect == NEUTRAL)
+       {
+               curGear =  0;
+       } else if (autoselect == ONE)
+       {
+               curGear =  1;
+       } else
+       {
+               // search for an appropriate gear
+               int newGear = 1;
+
+               while (newGear < numGears && curWheelRevolutions > 0.0f && 
curWheelRevolutions * gearsRatio[newGear + 1] < maxRPM - 100.0f)
+               {
+                       newGear++;
+               }
+
+               if (autoselect == DRIVE)
+               {
+                       curGear = newGear;
+               } else if (autoselect == TWO)
+               {
+                       curGear = std::min(newGear, 2);
+               }
+       }
 }
 
 void BeamEngine::autoShiftSet(int mode)

Modified: trunk/source/main/gameplay/BeamEngine.h
===================================================================
--- trunk/source/main/gameplay/BeamEngine.h     2012-05-25 01:56:26 UTC (rev 
2660)
+++ trunk/source/main/gameplay/BeamEngine.h     2012-05-25 06:26:47 UTC (rev 
2661)
@@ -47,7 +47,7 @@
        void setAutoMode(int mode);
        void setClutch(float clutch);
        void setOptions(float einertia, char etype, float eclutch, float ctime, 
float stime, float pstime);
-       void setRPM(float value);
+       void setRPM(float rpm);
        void setSpin(float rpm);
 
        void toggleAutoMode();
@@ -73,7 +73,7 @@
        bool isRunning() { return running; };
        char getType() { return type; };
        float getEngineTorque() { return engineTorque; };
-       float getIdleRPM() { return iddleRPM; };
+       float getIdleRPM() { return idleRPM; };
        float getMaxRPM() { return maxRPM; };
        int getAutoShift();
        size_t getNumGears() { return gearsRatio.size() - 2; };
@@ -97,7 +97,7 @@
 protected:
 
        // gear stuff
-       float curGearboxRPM;
+       float curWheelRevolutions;
        int curGear;
        int curGearRange;
        int numGears;
@@ -120,7 +120,7 @@
        float curEngineRPM;
        float engineTorque;
        float hydropump;
-       float iddleRPM;
+       float idleRPM;
        float inertia;
        float maxRPM;
        float stallRPM;
@@ -147,6 +147,7 @@
        TorqueCurve *torqueCurve;
        float apressure;
        int automode;
+
        int trucknum;
 };
 

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to