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