57 switch (car->_pitStopType) {
74 car->_penaltyTime = 0.0f;
75 ReInfo->_reSimItf.reconfig(car);
80 car->_penaltyTime = 0.0f;
132 static float color[] = {0.5, 0.5, 1.0, 1.0};
134 const int BUFSIZE = 1024;
139 if (car->_speed_x > car->_topSpeed) {
140 car->_topSpeed = car->_speed_x;
144 if (car->_speed_x > info->
topSpd) {
145 info->
topSpd = car->_speed_x;
148 if (car->_speed_x < info->
botSpd) {
149 info->
botSpd = car->_speed_x;
150 car->_currentMinSpeedForLap = car->_speed_x;
158 snprintf(car->
ctrl.
msg[2], 32,
"Can Pit");
160 snprintf(car->
ctrl.
msg[2], 32,
"Pit Occupied");
171 snprintf(buf, BUFSIZE,
"%s pit stop %.1fs", car->_name, info->
totalPitTime);
178 (s->_maxDammage == 0 || car->_dammage <= s->_maxDammage))
180 tdble lgFromStart = car->_trkPos.seg->lgfromstart;
182 switch (car->_trkPos.seg->type) {
184 lgFromStart += car->_trkPos.toStart;
187 lgFromStart += car->_trkPos.toStart * car->_trkPos.seg->radius;
191 if ((lgFromStart > car->_pit->lmin) && (lgFromStart < car->
_pit->lmax)) {
197 toBorder = car->_trkPos.toRight;
200 toBorder = car->_trkPos.toLeft;
203 sseg = car->_trkPos.seg->side[side];
205 if (sseg->
side[side]) {
206 sseg = sseg->
side[side];
210 (fabs(car->_speed_x) < 1.0) &&
211 (fabs(car->_speed_y) < 1.0))
219 for (i = 0; i < car->_pit->freeCarIndex; i++) {
220 if (car->_pit->car[i] == car) {
221 car->_pit->pitCarIndex = i;
226 snprintf(buf, BUFSIZE,
"%s in pits", car->_name);
247 car->_remainingLaps--;
248 if (car->_laps > 1) {
250 car->_curTime += car->_lastLapTime;
251 if (car->_bestLapTime != 0) {
252 car->_deltaBestLapTime = car->_lastLapTime - car->_bestLapTime;
254 if ((car->_lastLapTime < car->_bestLapTime) || (car->_bestLapTime == 0)) {
255 if (car->_commitBestLapTime) {
256 car->_bestLapTime = car->_lastLapTime;
260 car->_commitBestLapTime =
true;
262 if (car->_pos != 1) {
263 car->_timeBehindLeader = car->_curTime - s->
cars[0]->_curTime;
264 car->_lapsBehindLeader = s->
cars[0]->_laps - car->_laps;
265 car->_timeBehindPrev = car->_curTime - s->
cars[car->_pos - 2]->_curTime;
266 s->
cars[car->_pos - 2]->_timeBeforeNext = car->_timeBehindPrev;
268 car->_timeBehindLeader = 0;
269 car->_lapsBehindLeader = 0;
270 car->_timeBehindPrev = 0;
273 printf(
"Sim Time: %8.2f [s], Leader Laps: %4d, Leader Distance: %8.3f [km]\n", s->
currentTime, car->_laps - 1, car->_distRaced/1000.0f);
277 switch (
ReInfo->
s->_raceType) {
280 ReInfo->_refreshDisplay = 1;
281 const int TIMEFMTSIZE=256;
282 char t1[TIMEFMTSIZE], t2[TIMEFMTSIZE];
283 GfTime2Str(t1, TIMEFMTSIZE, car->_lastLapTime, 0);
284 GfTime2Str(t2, TIMEFMTSIZE, car->_bestLapTime, 0);
285 snprintf(buf, BUFSIZE,
"lap: %02d time: %s best: %s top spd: %.2f min spd: %.2f damage: %d",
286 car->_laps - 1, t1, t2,
306 info->
topSpd = car->_speed_x;
307 info->
botSpd = car->_speed_x;
308 car->_currentMinSpeedForLap = car->_speed_x;
313 if (car->_pos == 1) {
314 snprintf(buf, BUFSIZE,
"Winner %s", car->_name);
317 const char *numSuffix =
"th";
318 if (abs(12 - car->_pos) > 1) {
319 switch (car->_pos % 10) {
333 snprintf(buf, BUFSIZE,
"%s Finished %d%s", car->_name, car->_pos, numSuffix);
340 for (i = 0; i < s->_ncars; i++) {
359 car->_distFromStartLine = car->_trkPos.seg->lgfromstart +
360 (car->_trkPos.seg->type ==
TR_STR ? car->_trkPos.toStart : car->_trkPos.toStart * car->_trkPos.seg->radius);
378 for (i = 1; i < s->_ncars; i++) {
383 if (s->
cars[j]->_distRaced > s->
cars[j-1]->_distRaced) {
387 s->
cars[j]->_pos = j+1;
388 s->
cars[j-1]->_pos = j;
413 static float color[] = {0.0, 0.0, 1.0, 1.0};
428 const int BUFSIZE = 1024;
438 car->_commitBestLapTime =
false;
451 tdble toborder = 0.0f;
452 tdble minradius = 1.0f;
469 toborder = car->_trkPos.toLeft;
474 toborder = car->_trkPos.toRight;
480 tdble cuttinglimit = car->_dimension_y*0.7f;
481 if (toborder < -cuttinglimit) {
486 car->_commitBestLapTime =
false;
490 minradius -= cuttinglimit;
491 if (minradius > 1.0f) {
498 if (car->_skillLevel < 3) {
513 snprintf(car->
ctrl.
msg[3], 32,
"Drive Through Penalty");
516 snprintf(car->
ctrl.
msg[3], 32,
"Stop And Go Penalty");
533 snprintf(buf, BUFSIZE,
"%s DRIVE THROUGH PENALTY CLEANING", car->_name);
538 snprintf(buf, BUFSIZE,
"%s STOP&GO PENALTY CLEANING", car->_name);
564 snprintf(buf, BUFSIZE,
"%s penalty cleared", car->_name);
576 snprintf(buf, BUFSIZE,
"%s STOP&GO PENALTY", car->_name);
591 snprintf(buf, BUFSIZE,
"%s STOP&GO PENALTY", car->_name);
603 snprintf(buf, BUFSIZE,
"%s DRIVE THROUGH PENALTY", car->_name);
632 ReInfo->_reCurTime += deltaTimeIncrement *
ReInfo->_reTimeMult;
641 ReInfo->_reLastTime = 0.0;
647 for (i = 0; i < s->_ncars; i++) {
658 ReInfo->_reSimItf.update(s, deltaTimeIncrement, -1);
659 for (i = 0; i < s->_ncars; i++) {
680 ReInfo->_reGraphicItf.muteformenu();
690 const int BUFSIZE = 1024;
694 img = (
unsigned char*)malloc(vw * vh * 3);
699 glPixelStorei(GL_PACK_ROW_LENGTH, 0);
700 glPixelStorei(GL_PACK_ALIGNMENT, 1);
701 glReadBuffer(GL_FRONT);
702 glReadPixels((sw-vw)/2, (sh-vh)/2, vw, vh, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)img);
717 const int MAXSTEPS = 2000;
720 ReInfo->_refreshDisplay = 0;
721 switch (
ReInfo->_displayMode) {
746 while ((t -
ReInfo->_reCurTime + 2.0) > 0.0) {
769 while ((t -
ReInfo->_reCurTime + 2.0) > 0.0) {
784 long cmd = (long)vcmd;
788 ReInfo->_reTimeMult *= 2.0;
789 if (
ReInfo->_reTimeMult > 64.0) {
790 ReInfo->_reTimeMult = 64.0;
794 ReInfo->_reTimeMult *= 0.5;
795 if (
ReInfo->_reTimeMult < 1.0f/128.0f) {
796 ReInfo->_reTimeMult = 1.0f/128.0f;
801 ReInfo->_reTimeMult = 1.0;
805 const int BUFSIZE = 1024;
808 snprintf(buf, BUFSIZE,
"Time x%.2f", 1.0 /
ReInfo->_reTimeMult);
#define RM_CMD_PIT_ASKED
Race command: Pit asked.
Race Manager General Info.
void ReSetRaceMsg(const char *msg)
tRmCarRules * rules
by car rules
double currentTime
current time in sec since the beginning of the simulation
static void ReRaceMsgUpdate(void)
int type
Geometrical type:
int raceCmd
command issued by the driver
int GfImgWritePng(unsigned char *img, const char *filename, int width, int height)
Write a buffer to a png image on disk.
cars situation used to inform the GUI and the drivers
Interface Structure for Robots.
#define TR_SPEEDLIMIT
Segment where the speed is limited.
tCarElt ** cars
list of cars
#define GF_TAILQ_INSERT_TAIL(head, elm, field)
Insert an element at the tail.
static void ReRaceRules(tCarElt *car)
#define TR_PIT_ON_TRACK_SIDE
The pits are on the track side.
unsigned int raceInfo
Type of segment regarding the race: Mask value in:
#define RM_RACE_FINISHING
Robot Module Interface Definition.
#define RM_PNST_STOPANDGO
void GfuiDisplay(void)
Display function for the GUI to be called during redisplay of glut.
char msg[4][32]
4 lines of 31 characters 0-1 from car 2-3 from race engine
tSituation * s
Situation during race.
#define RM_PENALTY_STOPANDGO
#define RM_PNST_STOPANDGO_OK
static void ReRaceBigMsgSet(const char *msg, double life)
#define RM_CAR_STATE_NO_SIMU
Do not simulate the car.
tTrackSeg * pitEntry
Pit lane segment.
The Gaming Framework API (client part).
int simcollision
For rules etc.
#define RCM_MAX_DT_ROBOTS
tdble length
main track length
#define RM_PNST_DRIVETHROUGH
static void reCapture(void)
#define TR_LAST
Segment before start line.
#define TR_LFT
Left curve.
void ReSetRaceBigMsg(const char *msg)
tdble radiusr
Radius in meters of the right side of the track (>0)
float tdble
Floating point type used in TORCS.
struct RobotItf * robot
private
tdble radiusl
Radius in meters of the left side of the track (>0)
#define RM_DISP_MODE_NONE
#define RM_DISP_MODE_CAPTURE
struct trackSeg * side[2]
tTrack * track
Current track.
#define TR_PITEND
Car pit End.
#define RM_PENALTY_DRIVETHROUGH
tTrackSeg * pitExit
Pit lane segment.
static void ReSortCars(void)
void ReTimeMod(void *vcmd)
tRmMovieCapture movieCapture
void ReSavePracticeLap(tCarElt *car)
This is the race information structures.
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
void ReResScreenAddText(char *text)
static void ReUpdtPitTime(tCarElt *car)
#define GF_TAILQ_FIRST(head)
First element of a TAILQ.
static void ReManage(tCarElt *car)
tTrackSeg * seg
Track segment.
void GfScrGetSize(int *scrw, int *scrh, int *vieww, int *viewh)
Get the screen and viewport sizes.
double GfTimeClock(void)
Get the time in seconds.
tdble width
Width of each pit stop.
static void ReRaceMsgSet(const char *msg, double life)
#define GF_TAILQ_REMOVE(head, elm, field)
Remove an element.
Track segment (tTrackSeg) The segments can be straights (type TR_STR): (the track goes from the right...
int track(tModInfo *modInfo)
#define RM_CAR_STATE_ELIMINATED
Eliminated due to rules infringement.
#define RM_CAR_STATE_PIT
Car currently stopped in pits.
#define TR_START
Segment after start line.
#define ROB_PIT_MENU
Call the interactive menu for pit command.
#define TR_RGT
Right curve.
int lapToClear
the lap before the penalty has to be cleared
#define TR_PIT_STATE_FREE
#define RM_DISP_MODE_CONSOLE
void GfTime2Str(char *result, int resultSize, tdble sec, int sgn)
Convert a time in seconds (float) to an ascii string.
static void ReOneStep(double deltaTimeIncrement)
void ReUpdateQualifCurRes(tCarElt *car)
Race Engine Car Information about the race.
#define RM_DISP_MODE_NORMAL
#define SEM_COLLISION_XYSCENE
float msgColor[4]
RGBA of text.
int skillLevel
Driver's skill level (0=rookie -> 3=pro)
tTrackPitInfo pits
Pits information.
int state
state of the car.
#define TR_PITSTART
Car pit Star.
#define RM_CAR_STATE_FINISH
Car having passed the finish line.
static void ReUpdtPitCmd(void *pvcar)