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 @@ - +