USR_SC: More robot improvements
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@917 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 4ae52edca91aa08190a5fcb044bc9e00901c90d8 Former-commit-id: 7fa321db807a139b80fb3bb8b5e6d9a27c72e024
This commit is contained in:
parent
871149ca06
commit
bffc9f919d
3 changed files with 47 additions and 4 deletions
|
@ -2969,7 +2969,7 @@ bool Driver::isStuck()
|
|||
// does the car's position indicate we're stuck?
|
||||
bool position_stuck = (((fabs(angle) > MAX_UNSTUCK_ANGLE &&
|
||||
((car->_gear == -1 && car->_speed_x < MAX_UNSTUCK_SPEED) ||
|
||||
(car->_gear > -1 && fabs(car->_speed_x) < MAX_UNSTUCK_SPEED)) &&
|
||||
(car->_gear > -1 && fabs(car->_speed_x+car->_accel_x) < MAX_UNSTUCK_SPEED)) &&
|
||||
(MIN(car->_trkPos.toLeft, car->_trkPos.toRight)) < MIN_UNSTUCK_DIST)));
|
||||
int reversing_ok = 0, force_reverse = 0;
|
||||
if (car->_gear == -1 && fabs(angle) > 0.6)
|
||||
|
@ -3093,7 +3093,7 @@ fprintf(stderr,"NOT STUCK: Stick with Forwards ps=%d fr=%d (%.3f <= %.3f)\n",pos
|
|||
allow_stuck = 0;
|
||||
stuck_timer = simtime;
|
||||
}
|
||||
else if ((!allow_stuck && (simtime-stuck_timer > 3.0 || !stuckcheck || simtime - last_stuck_time > 4.0)))
|
||||
else if ((!allow_stuck && simtime-stuck_timer > 3.0 && position_stuck && (!stuckcheck || simtime - last_stuck_time > 4.0)))
|
||||
{
|
||||
allow_stuck = 1;
|
||||
stuck_timer = simtime;
|
||||
|
|
|
@ -88,6 +88,7 @@ class Driver {
|
|||
int getCarefulBrake() { return raceline->getCarefulBrake(); }
|
||||
double speedAngleChange() { return speedangle - prevspeedangle; }
|
||||
void GetSteerPoint( double lookahead, vec2f *rt, double offset=-100.0, double time=-1.0 );
|
||||
float getWidth() { return mycardata->getWidthOnTrack(); }
|
||||
|
||||
private:
|
||||
// Utility functions.
|
||||
|
@ -106,7 +107,6 @@ class Driver {
|
|||
float correctSteering( float avoidsteer, float racesteer );
|
||||
double calcSteer( double targetAngle, int rl );
|
||||
void setMode( int newmode );
|
||||
float getWidth() { return mycardata->getWidthOnTrack(); }
|
||||
void calcSpeed();
|
||||
float adjustOffset( float offset );
|
||||
bool canOvertake( Opponent *o, double *mincatchdist, bool outside, bool lenient );
|
||||
|
|
|
@ -280,6 +280,49 @@ fprintf(stderr,">>> NOCOLL cd=%.3f >= %.3f ",cardist,SIDE_MARGIN - MAX(0.0, (dis
|
|||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
double speed = getSpeed();
|
||||
double dspeed = driver->getSpeed();
|
||||
double time_margin = MAX(4.0, (dspeed-speed) / 16);
|
||||
double width = cardata->getWidthOnTrack();
|
||||
double dwidth = driver->getWidth();
|
||||
double ow = width;
|
||||
double dw = dwidth;
|
||||
double osa = ((car->_trkPos.toLeft - prevleft)*0.8) * (t_impact/s->deltaTime);
|
||||
double dsa = ((driver->getNextLeft() - mycar->_trkPos.toLeft)*0.8) * (t_impact/s->deltaTime);
|
||||
double oleft = car->_trkPos.toLeft + osa*0.8;
|
||||
double dleft = mycar->_trkPos.toLeft + dsa*0.8;
|
||||
tTrackSeg *cseg = car->_trkPos.seg;
|
||||
tTrackSeg *seg = mycar->_trkPos.seg;
|
||||
|
||||
|
||||
if (!collide && t_impact < time_margin/2)
|
||||
{
|
||||
// sanity check for cars that are about to plow full speed into the back of other cars
|
||||
double margin = dwidth + 0.5;
|
||||
double time = 0.6;
|
||||
double mti = t_impact;
|
||||
|
||||
if (mti < time || (team == TEAM_FRIEND && mti < 3.0))
|
||||
{
|
||||
double addition = 0.25;//0.5;
|
||||
if (team != TEAM_FRIEND && fabs(car->_trkPos.toMiddle) > fabs(mycar->_trkPos.toMiddle))
|
||||
{
|
||||
margin *= 1.0;
|
||||
}
|
||||
|
||||
if (fabs(oleft - dleft) < ow/2 + dw/2 + addition ||
|
||||
(mti < 0.8 &&
|
||||
(((cseg->type != TR_STR && cseg->radius <= 120.0) || (seg->type != TR_STR && seg->radius <= 120.0)) &&
|
||||
((oleft - ow/2 < margin && dleft - dw/4 < oleft + ow/2) ||
|
||||
(oleft + ow/2 > cseg->width-margin && dleft + dw/4 > oleft - ow/2)))))
|
||||
{
|
||||
collide = 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef OPP_DEBUG
|
||||
fprintf(stderr,"\n");fflush(stderr);
|
||||
#endif
|
||||
|
@ -566,7 +609,7 @@ int Opponent::testCollision(Driver *driver, double impact, double sizefactor, ve
|
|||
}
|
||||
}
|
||||
|
||||
if (targ != NULL)
|
||||
if (targ != NULL && t_impact < 1.0)
|
||||
{
|
||||
// locate front of car at steer target position
|
||||
double frx = (d_new[FRNT_RGT].ax + d_new[FRNT_LFT].ax) / 2;
|
||||
|
|
Loading…
Reference in a new issue