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:
andrewsumner 2009-04-28 23:24:41 +00:00
parent 871149ca06
commit bffc9f919d
3 changed files with 47 additions and 4 deletions

View file

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

View file

@ -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 );

View file

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