diff --git a/src/drivers/usr/src/driver.cpp b/src/drivers/usr/src/driver.cpp
index f7bdc92c5..3156228e8 100644
--- a/src/drivers/usr/src/driver.cpp
+++ b/src/drivers/usr/src/driver.cpp
@@ -2098,8 +2098,9 @@ bool Driver::canOvertake2( Opponent *o, int avoidingside )
}
oAspeed = MIN(oAspeed, o->getSpeed()+2.0);
+ oAspeed = MAX(oAspeed, car->_speed_x - MIN(distance, o->getTimeImpact())/2);
- if (oAspeed > o->getSpeed())
+ if (oAspeed >= o->getSpeed()) // speed on avoidside of opponent is fast enough
{
if (DebugMsg & debug_overtake)
fprintf(stderr,"-> %s: OVERTAKE2 ospd=%.1f oAspd=%.1f\n",ocar->_name,o->getSpeed(),oAspeed);
@@ -2130,6 +2131,7 @@ bool Driver::canOvertake( Opponent *o, double *mincatchdist, bool outside, bool
speed = MIN(avspeed, (speed + MAX(0.0, (30.0 - distance) * MAX(0.1, 1.0 - MAX(0.0, rInv-0.001)*80))));
double ospeed = o->getSpeed();
oAspeed = MIN(oAspeed, ospeed+2.0);
+ oAspeed = MAX(oAspeed, car->_speed_x - MIN(distance, o->getTimeImpact())/2);
double timeLimit = 3.0 - MIN(2.4, rInv * 1000);
if (*mincatchdist > speed - ospeed)
@@ -2142,10 +2144,10 @@ bool Driver::canOvertake( Opponent *o, double *mincatchdist, bool outside, bool
return false;
}
- if (speed > ospeed + 2*overtakecaution + fabs(rInv) * 500 &&
- oAspeed > ospeed &&
- (o->getTimeImpact() * (1.0+overtakecaution) < timeLimit ||
- distance < MAX(3.0, speed/7)))
+ if (speed > ospeed + 2*overtakecaution + fabs(rInv) * 500 && // our speed quicker than opponent
+ oAspeed > ospeed && // avoid speed quicker than opponent
+ (o->getTimeImpact() * (1.0+overtakecaution) < timeLimit || // approaching opponent quickly
+ distance < MAX(3.0, speed/5))) // close behind opponent
{
// faster than opponent, overtake
*mincatchdist = speed - ospeed;
diff --git a/src/drivers/usr/src/raceline.cpp b/src/drivers/usr/src/raceline.cpp
index 4f54656bb..c98006fc7 100644
--- a/src/drivers/usr/src/raceline.cpp
+++ b/src/drivers/usr/src/raceline.cpp
@@ -2192,12 +2192,12 @@ double LRaceLine::getAvoidSteer(double offset, LRaceLineData *data)
//double offline = MIN(2.0, MAX(-2.0, (offset - car->_trkPos.toMiddle)));
//targetAngle -= offline/15;
- double steer_direction = targetAngle - (car->_yaw + car->_yaw_rate/(15-MIN(8, car->_speed_x/10)));
+ double steer_direction = targetAngle - (car->_yaw + car->_yaw_rate/15); //(15-MIN(8, car->_speed_x/10)));
NORM_PI_PI(steer_direction);
steer = steer_direction / car->_steerLock;
- double nextangle = data->angle + car->_yaw_rate/3;
+ double nextangle = data->angle + car->_yaw_rate/4;
if (fabs(nextangle) > fabs(data->speedangle))
{
@@ -2356,14 +2356,24 @@ double LRaceLine::correctLimit(double avoidsteer, double racesteer, int insideli
// correct would take us in the opposite direction to a corner - correct less!
if ((SRL[SRLidx].tRInverse[Next] > 0.001 && avoidsteer > racesteer) ||
(SRL[SRLidx].tRInverse[Next] < -0.001 && avoidsteer < racesteer))
- return MAX(0.001, MIN(limit, limit - (fabs(SRL[SRLidx].tRInverse[Next]) * 200.0 + tbump)));
+ {
+ limit = MAX(0.001, MIN(limit, limit - (fabs(SRL[SRLidx].tRInverse[Next]) * 200.0 + tbump)));
+ }
+ else
+ {
+ // correct would take us in the opposite direction to a corner - correct less (but not as much as above)
+ int nnext = (Next + (int) (car->_speed_x/3)) % Divs;
+ //double nnlane2left = SRL[SRLidx].tLane[nnext] * SRL[SRLidx].Width;
+ if ((SRL[SRLidx].tRInverse[nnext] > 0.001 && avoidsteer > racesteer) ||
+ (SRL[SRLidx].tRInverse[nnext] < -0.001 && avoidsteer < racesteer))
+ limit = MAX(0.001, MIN(limit, limit - (fabs(SRL[SRLidx].tRInverse[nnext]) * 140.0 + tbump)));
+ }
- // correct would take us in the opposite direction to a corner - correct less (but not as much as above)
- int nnext = (Next + (int) (car->_speed_x/3)) % Divs;
- //double nnlane2left = SRL[SRLidx].tLane[nnext] * SRL[SRLidx].Width;
- if ((SRL[SRLidx].tRInverse[nnext] > 0.001 && avoidsteer > racesteer) ||
- (SRL[SRLidx].tRInverse[nnext] < -0.001 && avoidsteer < racesteer))
- return MAX(0.001, MIN(limit, limit - (fabs(SRL[SRLidx].tRInverse[nnext]) * 140.0 + tbump)));
+ if ((avoidsteer > racesteer && car->_yaw_rate < 0.0) || (avoidsteer < racesteer && car->_yaw_rate > 0.0))
+ {
+ // avoid oversteering back towards raceline
+ limit = MAX(0.001, limit - (fabs(car->_yaw_rate) * car->_speed_x) / 100.0);
+ }
// ok, we're not inside the racing line. Check and see if we're outside it and turning
// into a corner, in which case we want to correct more to try and get closer to the
diff --git a/src/drivers/usr/usr_ls2/ls2-boxer-96rsr/default.xml b/src/drivers/usr/usr_ls2/ls2-boxer-96rsr/default.xml
index ede0fdd54..33503967c 100755
--- a/src/drivers/usr/usr_ls2/ls2-boxer-96rsr/default.xml
+++ b/src/drivers/usr/usr_ls2/ls2-boxer-96rsr/default.xml
@@ -19,7 +19,7 @@
-
+
@@ -43,12 +43,12 @@
-
-
+
+
-
+
diff --git a/src/drivers/usr/usr_ls2/ls2-condor-c400r/default.xml b/src/drivers/usr/usr_ls2/ls2-condor-c400r/default.xml
index 76e3bdc72..e7b20433c 100755
--- a/src/drivers/usr/usr_ls2/ls2-condor-c400r/default.xml
+++ b/src/drivers/usr/usr_ls2/ls2-condor-c400r/default.xml
@@ -19,12 +19,12 @@
-
+
-
+
@@ -48,7 +48,7 @@
-
+