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
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel