Revision: 2654
http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2654&view=rev
Author: ulteq
Date: 2012-05-24 22:30:18 +0000 (Thu, 24 May 2012)
Log Message:
-----------
-Fix: improved manual gear selection behavior refs #969
Modified Paths:
--------------
trunk/source/main/gameplay/RoRFrameListener.cpp
Modified: trunk/source/main/gameplay/RoRFrameListener.cpp
===================================================================
--- trunk/source/main/gameplay/RoRFrameListener.cpp 2012-05-24 20:17:51 UTC
(rev 2653)
+++ trunk/source/main/gameplay/RoRFrameListener.cpp 2012-05-24 22:30:18 UTC
(rev 2654)
@@ -2405,14 +2405,16 @@
{
curr_truck->engine->autoSetAcc(accval);
}
- curr_truck->brake =
brake*curr_truck->brakeforce;
+ curr_truck->brake =
brake * curr_truck->brakeforce;
} else
{
// start engine
if (accval > 0 &&
curr_truck->engine && curr_truck->engine->contact &&
!curr_truck->engine->running)
+ {
curr_truck->engine->start();
+ }
- // arcade controls: hey
- people wanted it x|
+ // arcade controls: hey
- people wanted it x| ... <- and it's convenient
if
(curr_truck->engine->getGear() >= 0)
{
// neutral or
drive forward, everything is as its used to be: brake is brake and accel. is
accel.
@@ -2420,7 +2422,7 @@
{
curr_truck->engine->autoSetAcc(accval);
}
-
curr_truck->brake = brake*curr_truck->brakeforce;
+
curr_truck->brake = brake * curr_truck->brakeforce;
} else
{
// reverse
gear, reverse controls: brake is accel. and accel. is brake.
@@ -2428,7 +2430,7 @@
{
curr_truck->engine->autoSetAcc(brake);
}
-
curr_truck->brake = accval*curr_truck->brakeforce;
+
curr_truck->brake = accval * curr_truck->brakeforce;
}
// only when the truck
really is not moving anymore
@@ -2438,7 +2440,7 @@
if (brake >
0.5f && accval < 0.5f && curr_truck->engine->getGear() >= 0)
{
// we
are on the brake, jump to reverse gear
-
if(curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
+ if
(curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
{
curr_truck->engine->autoShiftSet(BeamEngine::REAR);
} else
@@ -2448,7 +2450,7 @@
} else if
(brake < 0.5f && accval > 0.5f && curr_truck->engine->getGear() < 0)
{
// we
are on the gas pedal, jump to first gear when we were in rear gear
-
if(curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
+ if
(curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
{
curr_truck->engine->autoShiftSet(BeamEngine::DRIVE);
} else
@@ -2467,175 +2469,177 @@
//IMI
// gear management -- it might
should be transferred to a standalone function of Beam or RoRFrameListener
if (curr_truck->engine)
+ {
+ if
(curr_truck->engine->getAutoMode() == BeamEngine::AUTOMATIC)
{
if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_AUTOSHIFT_UP))
curr_truck->engine->autoShiftUp();
if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_AUTOSHIFT_DOWN))
curr_truck->engine->autoShiftDown();
- if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_TOGGLE_CONTACT))
curr_truck->engine->toggleContact();
+ }
+ if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_TOGGLE_CONTACT))
curr_truck->engine->toggleContact();
- if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_STARTER) && curr_truck->engine->contact
&& !curr_truck->replaymode)
- {
-
//starter
-
curr_truck->engine->setstarter(1);
+ if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_STARTER) && curr_truck->engine->contact
&& !curr_truck->replaymode)
+ {
+ //starter
+
curr_truck->engine->setstarter(1);
#ifdef USE_OPENAL
-
SoundScriptManager::getSingleton().trigStart(curr_truck, SS_TRIG_STARTER);
+
SoundScriptManager::getSingleton().trigStart(curr_truck, SS_TRIG_STARTER);
#endif // OPENAL
- }
- else
- {
-
curr_truck->engine->setstarter(0);
+ } else
+ {
+
curr_truck->engine->setstarter(0);
#ifdef USE_OPENAL
-
SoundScriptManager::getSingleton().trigStop(curr_truck, SS_TRIG_STARTER);
+
SoundScriptManager::getSingleton().trigStop(curr_truck, SS_TRIG_STARTER);
#endif // OPENAL
- }
+ }
- if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SWITCH_SHIFT_MODES))
- {
-
//Toggle Auto shift
-
curr_truck->engine->toggleAutoMode();
+ if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SWITCH_SHIFT_MODES))
+ {
+ //Toggle Auto
shift
+
curr_truck->engine->toggleAutoMode();
- //
force gui update
-
curr_truck->triggerGUIFeaturesChanged();
-
+ // force gui
update
+
curr_truck->triggerGUIFeaturesChanged();
#ifdef USE_MYGUI
-
switch(curr_truck->engine->getAutoMode())
- {
-
case BeamEngine::AUTOMATIC:
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Automatic shift"), "cog.png", 3000);
-
break;
-
case BeamEngine::SEMIAUTO:
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Manual shift - Auto clutch"), "cog.png",
3000);
-
break;
-
case BeamEngine::MANUAL:
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: sequential shift"),
"cog.png", 3000);
-
break;
-
case BeamEngine::MANUAL_STICK:
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully manual: stick shift"), "cog.png",
3000);
-
break;
-
case BeamEngine::MANUAL_RANGES:
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: stick shift with ranges"),
"cog.png", 3000);
-
break;
- }
+
switch(curr_truck->engine->getAutoMode())
+ {
+ case
BeamEngine::AUTOMATIC:
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Automatic shift"), "cog.png", 3000);
+
break;
+ case
BeamEngine::SEMIAUTO:
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Manual shift - Auto clutch"), "cog.png",
3000);
+
break;
+ case
BeamEngine::MANUAL:
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: sequential shift"),
"cog.png", 3000);
+
break;
+ case
BeamEngine::MANUAL_STICK:
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully manual: stick shift"), "cog.png",
3000);
+
break;
+ case
BeamEngine::MANUAL_RANGES:
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Fully Manual: stick shift with ranges"),
"cog.png", 3000);
+
break;
+ }
#endif //USE_MYGUI
- }
+ }
- //joy clutch
- float cval =
INPUTENGINE.getEventValue(EV_TRUCK_MANUAL_CLUTCH);
-
curr_truck->engine->setManualClutch(cval);
+ //joy clutch
+ float cval =
INPUTENGINE.getEventValue(EV_TRUCK_MANUAL_CLUTCH);
+
curr_truck->engine->setManualClutch(cval);
- bool
gear_changed_rel = false;
- int shiftmode =
curr_truck->engine->getAutoMode();
+ bool gear_changed_rel =
false;
+ int shiftmode =
curr_truck->engine->getAutoMode();
-// if
(shiftmode==SEMIAUTO || shiftmode==MANUAL) // manual sequencial shifting
- if
(shiftmode<=BeamEngine::MANUAL) // manual sequencial shifting, semi auto
shifting, auto shifting
+ if (shiftmode <=
BeamEngine::MANUAL) // auto, semi auto and sequential shifting
+ {
+ if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_UP))
+ {
+ if
(shiftmode != BeamEngine::AUTOMATIC || curr_truck->engine->getAutoShift() ==
BeamEngine::DRIVE)
{
-
if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_UP))
-
{
-
curr_truck->engine->shift(1);
-
gear_changed_rel=true;
-
}
-
else if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_DOWN))
-
{
-
curr_truck->engine->shift(-1);
-
gear_changed_rel=true;
-
}
-
else if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_NEUTRAL))
-
{
-
curr_truck->engine->shiftTo(0);
-
}
+
curr_truck->engine->shift(1);
+
gear_changed_rel = true;
}
- else // if
(shiftmode>MANUAL) // h-shift or h-shift with ranges shifting
+ } else if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_DOWN))
+ {
+ if
(shiftmode > BeamEngine::SEMIAUTO ||
+
shiftmode == BeamEngine::SEMIAUTO && curr_truck->engine->getGear() > 0 ||
+
shiftmode == BeamEngine::AUTOMATIC && curr_truck->engine->getGear() > 1)
{
-
bool gear_changed = false;
-
bool found = false;
-
int curgear = curr_truck->engine->getGear();
-
int curgearrange= curr_truck->engine->getGearRange();
-
int gearoffset = curgear-curgearrange*6;
-
if (gearoffset<0) gearoffset = 0;
-
// one can select range only if in natural
-
if (shiftmode==BeamEngine::MANUAL_RANGES && curgear == 0)
-
{
-
// maybe this should not be here, but should experiment
-
if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_LOWRANGE) &&
curgearrange!=0)
-
{
-
curr_truck->engine->setGearRange(0);
-
gear_changed = true;
+
curr_truck->engine->shift(-1);
+
gear_changed_rel = true;
+ }
+ } else if
(shiftmode != BeamEngine::AUTOMATIC &&
INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_NEUTRAL))
+ {
+
curr_truck->engine->shiftTo(0);
+ }
+ } else //if (shiftmode
> BeamEngine::MANUAL) // h-shift or h-shift with ranges shifting
+ {
+ bool
gear_changed = false;
+ bool found
= false;
+ int curgear
= curr_truck->engine->getGear();
+ int
curgearrange = curr_truck->engine->getGearRange();
+ int gearoffset
= std::max(0, curgear - curgearrange * 6);
+
+ // one can
select range only if in natural
+ if
(shiftmode==BeamEngine::MANUAL_RANGES && curgear == 0)
+ {
+ //
maybe this should not be here, but should experiment
+ if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_LOWRANGE) && curgearrange
!= 0)
+ {
+
curr_truck->engine->setGearRange(0);
+
gear_changed = true;
#ifdef USE_MYGUI
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Low range selected"), "cog.png", 3000);
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Low range selected"), "cog.png", 3000);
#endif //USE_MYGUI
-
-
}
-
else if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_MIDRANGE) && curgearrange
!=1 && curr_truck->engine->getNumGearsRanges()>1)
-
{
-
curr_truck->engine->setGearRange(1);
-
gear_changed = true;
+ } else
if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_MIDRANGE) &&
curgearrange != 1 && curr_truck->engine->getNumGearsRanges()>1)
+ {
+
curr_truck->engine->setGearRange(1);
+
gear_changed = true;
#ifdef USE_MYGUI
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Mid range selected"), "cog.png", 3000);
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("Mid range selected"), "cog.png", 3000);
#endif //USE_MYGUI
-
}
-
else if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_HIGHRANGE) &&
curgearrange!=2 && curr_truck->engine->getNumGearsRanges()>2)
-
{
-
curr_truck->engine->setGearRange(2);
-
gear_changed = true;
+ } else
if (INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_SHIFT_HIGHRANGE) &&
curgearrange != 2 && curr_truck->engine->getNumGearsRanges()>2)
+ {
+
curr_truck->engine->setGearRange(2);
+
gear_changed = true;
#ifdef USE_MYGUI
-
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("High range selected"), "cog.png", 3000);
+
Console::getSingleton().putMessage(Console::CONSOLE_MSGTYPE_INFO,
Console::CONSOLE_SYSTEM_NOTICE, _L("High range selected"), "cog.png", 3000);
#endif // USE_MYGUI
-
}
-
}
+ }
+ }
//zaxxon
-
if (curgear == -1)
+ if (curgear ==
-1)
+ {
+
gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR_REVERSE);
+ } else if
(curgear > 0 && curgear < 19)
+ {
+ if
(shiftmode==BeamEngine::MANUAL)
+ {
+
gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + curgear
-1);
+ } else
+ {
+
gear_changed = !INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 +
gearoffset-1); // range mode
+ }
+ }
+
+ if
(gear_changed || curgear == 0)
+ {
+ if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR_REVERSE))
+ {
+
curr_truck->engine->shiftTo(-1);
+
found = true;
+ } else
if (INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_NEUTRAL))
+ {
+
curr_truck->engine->shiftTo(0);
+
found = true;
+ } else
+ {
+
if (shiftmode == BeamEngine::MANUAL_STICK)
+
{
+
for (int i=1;i<19 && !found;i++)
{
-
gear_changed =
!INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR_REVERSE);
+
if (INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 +i - 1))
+
{
+
curr_truck->engine->shiftTo(i);
+
found = true;
+
}
}
-
else if (curgear > 0 && curgear < 19)
+
} else // BeamEngine::MANUALMANUAL_RANGES
+
{
+
for (int i=1; i < 7 && !found; i++)
{
-
if (shiftmode==BeamEngine::MANUAL) gear_changed =
!INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + curgear -1);
-
else gear_changed =
!INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 + gearoffset-1); // range
mode
+
if (INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 +i - 1))
+
{
+
curr_truck->engine->shiftTo(i + curgearrange * 6);
+
found = true;
+
}
}
+
}
+ }
+ if
(!found) curr_truck->engine->shiftTo(0);
+ } // end of if
(gear_changed)
+ } // end of shitmode >
BeamEngine::MANUAL
+ } // end of ->engine
+ } // end of ->replaymode
-
if (gear_changed || curgear==0)
-
{
-
if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR_REVERSE))
-
{
-
curr_truck->engine->shiftTo(-1);
-
found = true;
-
}
-
else if (INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_NEUTRAL))
-
{
-
curr_truck->engine->shiftTo(0);
-
found = true;
-
}
-
else
-
{
-
if (shiftmode==BeamEngine::MANUAL_STICK)
-
{
-
for (int i=1;i<19 && !found;i++)
-
{
-
if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 +i - 1))
-
{
-
curr_truck->engine->shiftTo(i);
-
found = true;
-
}
-
}
-
}
-
else // MANUAL_RANGES
-
{
-
for (int i=1;i<7 && !found;i++)
-
{
-
if
(INPUTENGINE.getEventBoolValue(EV_TRUCK_SHIFT_GEAR1 +i - 1))
-
{
-
curr_truck->engine->shiftTo(i+curgearrange*6);
-
found = true;
-
}
-
}
-
}
-
}
-
if (!found) curr_truck->engine->shiftTo(0);
-
} // end of if (gear_changed)
-//
if (!found && curgear!=0) curr_truck->engine->shiftTo(0);
- } //
end of shitmode>MANUAL
- } // endof ->engine
- } // endof ->replaymode
-
if
(INPUTENGINE.getEventBoolValueBounce(EV_TRUCK_TOGGLE_AXLE_LOCK))
{
//Toggle Auto shift
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
