diff --git a/src/drivers/simplix/src/unitstrategy.cpp b/src/drivers/simplix/src/unitstrategy.cpp index 0ce088c5d..694caf7c6 100644 --- a/src/drivers/simplix/src/unitstrategy.cpp +++ b/src/drivers/simplix/src/unitstrategy.cpp @@ -428,7 +428,7 @@ void TSimpleStrategy::Update(PtCarElt Car, //==========================================================================* // State (Sequential logic system) //--------------------------------------------------------------------------* -void TSimpleStrategy::CheckPitState(float PitScaleBrake) +void TSimpleStrategy::CheckPitState(float /*PitScaleBrake*/) { if (oPit == NULL) // No Pit no service return; @@ -485,8 +485,10 @@ void TSimpleStrategy::CheckPitState(float PitScaleBrake) // We reached the poit to stopp oState = PIT_ASKED; LogSimplix.debug("#PIT_ENTER: %g\n", TrackPos); - - // falls through... + // falls through... +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif case PIT_ASKED: // We are still going to the pit @@ -496,7 +498,7 @@ void TSimpleStrategy::CheckPitState(float PitScaleBrake) oDriver->oStanding = true; // For motion survey! oPitTicker = 0; // Start service timer CarAccelCmd = 0; // release throttle - CarBrakeCmd = 1.0 * PitScaleBrake; // Start braking + CarBrakeCmd = 1.0; // Start braking CarRaceCmd = RM_CMD_PIT_ASKED; // Tell TORCS to service us! To test oPitTicker comment out oState = PIT_SERVICE; } diff --git a/src/modules/graphic/ssggraph/grmain.cpp b/src/modules/graphic/ssggraph/grmain.cpp index d37eb1f98..475f51b8b 100644 --- a/src/modules/graphic/ssggraph/grmain.cpp +++ b/src/modules/graphic/ssggraph/grmain.cpp @@ -138,6 +138,7 @@ grAdaptScreenSize(void) switch (grNbArrangeScreens) { default: grNbArrangeScreens = 0; + [[fallthrough]]; case 0: // Top & Bottom half of the window grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2, 0.0); @@ -167,6 +168,9 @@ grAdaptScreenSize(void) switch (grNbArrangeScreens) { default: grNbArrangeScreens = 0; +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif case 0: // Left/Right below wide grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2, 0.0); @@ -224,8 +228,12 @@ grAdaptScreenSize(void) grScreens[3]->activate(grWinx + grWinw * 3/4, grWiny, grWinw / 4, grWinh, 0.0); break; } +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif default: grNbArrangeScreens = 0; + [[fallthrough]]; case 0: // Top/Bottom Left/Rigth Quarters grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0); @@ -290,6 +298,9 @@ grAdaptScreenSize(void) switch (grNbArrangeScreens) { default: grNbArrangeScreens = 0; +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif case 0: // Top/Bottom Left/Middle/Rigth Matrix grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2, 0.0); @@ -323,8 +334,14 @@ grAdaptScreenSize(void) grScreens[5]->activate(grWinx + grWinw * 5/6, grWiny, grWinw / 6, grWinh, 0.0); break; } +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif default: grNbArrangeScreens = 0; +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif case 0: // Top/Bottom Left/Middle/Rigth Matrix grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 3, grWinh / 2, 0.0); diff --git a/src/modules/racing/genparoptv1/raceresults.cpp b/src/modules/racing/genparoptv1/raceresults.cpp index 981c90f1b..265f48a13 100644 --- a/src/modules/racing/genparoptv1/raceresults.cpp +++ b/src/modules/racing/genparoptv1/raceresults.cpp @@ -4,7 +4,7 @@ created : Thu Jan 2 12:43:10 CET 2003 copyright : (C) 2002 by Eric Espie email : eric.espie@torcs.org - version : $Id$ + version : $Id$ ***************************************************************************/ @@ -17,8 +17,8 @@ * * ***************************************************************************/ -/** @file - Results managment for all race types +/** @file + Results managment for all race types @author Eric Espie @version $Id$ */ @@ -48,583 +48,586 @@ static char path2[1024]; typedef struct ReStandings { - std::string drvName; - std::string modName; - std::string carName; - int extended; - int drvIdx; - int points; + std::string drvName; + std::string modName; + std::string carName; + int extended; + int drvIdx; + int points; } tReStandings; void ReInitResults(void) { - struct tm *stm; - time_t t; - void *results; - - t = time(NULL); - stm = localtime(&t); - snprintf(buf, sizeof(buf), "results/%s/results-%4d-%02d-%02d-%02d-%02d.xml", - ReInfo->_reFilename, - stm->tm_year+1900, - stm->tm_mon+1, - stm->tm_mday, - stm->tm_hour, - stm->tm_min); - - ReInfo->results = GfParmReadFileLocal(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); - ReInfo->mainResults = ReInfo->results; - results = ReInfo->results; - GfParmSetNum(results, RE_SECT_HEADER, RE_ATTR_DATE, NULL, (tdble)t); - GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, 1); - GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1); - GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1); + struct tm *stm; + time_t t; + void *results; + + t = time(NULL); + stm = localtime(&t); + snprintf(buf, sizeof(buf), "results/%s/results-%4d-%02d-%02d-%02d-%02d.xml", + ReInfo->_reFilename, + stm->tm_year+1900, + stm->tm_mon+1, + stm->tm_mday, + stm->tm_hour, + stm->tm_min); + + ReInfo->results = GfParmReadFileLocal(buf, GFPARM_RMODE_STD | GFPARM_RMODE_CREAT); + ReInfo->mainResults = ReInfo->results; + results = ReInfo->results; + GfParmSetNum(results, RE_SECT_HEADER, RE_ATTR_DATE, NULL, (tdble)t); + GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_TRACK, NULL, 1); + GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_RACE, NULL, 1); + GfParmSetNum(results, RE_SECT_CURRENT, RE_ATTR_CUR_DRIVER, NULL, 1); } void ReEventInitResults(void) { - void *results = ReInfo->results; - void *params = ReInfo->params; - - const int nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS); - for (int i = 1; i < nCars + 1; i++) - { - snprintf(path, sizeof(path), "%s/%s/%d", ReInfo->track->name, RM_SECT_DRIVERS, i); - snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS, i); - GfParmSetStr(results, path, RE_ATTR_DLL_NAME, - GfParmGetStr(params, path2, RM_ATTR_MODULE, "")); - GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, - GfParmGetNum(params, path2, RM_ATTR_IDX, (char*)NULL, 0)); - GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, - GfParmGetNum(params, path2, RM_ATTR_EXTENDED, (char*)NULL, 0)); - //GfParmSetStr(results, path, ROB_ATTR_NAME, - // GfParmGetStr(params, path2, ROB_ATTR_NAME, "")); - //GfParmSetStr(results, path, ROB_ATTR_CAR, - // GfParmGetStr(params, path2, ROB_ATTR_CAR, "")); - } + void *results = ReInfo->results; + void *params = ReInfo->params; + + const int nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS); + for (int i = 1; i < nCars + 1; i++) + { + snprintf(path, sizeof(path), "%s/%s/%d", ReInfo->track->name, RM_SECT_DRIVERS, i); + snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS, i); + GfParmSetStr(results, path, RE_ATTR_DLL_NAME, + GfParmGetStr(params, path2, RM_ATTR_MODULE, "")); + GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, + GfParmGetNum(params, path2, RM_ATTR_IDX, (char*)NULL, 0)); + GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, + GfParmGetNum(params, path2, RM_ATTR_EXTENDED, (char*)NULL, 0)); + //GfParmSetStr(results, path, ROB_ATTR_NAME, + // GfParmGetStr(params, path2, ROB_ATTR_NAME, "")); + //GfParmSetStr(results, path, ROB_ATTR_CAR, + // GfParmGetStr(params, path2, ROB_ATTR_CAR, "")); + } } //for sort() inline bool sortByScore(const tReStandings& a, const tReStandings& b) { - return (a.points > b.points); + return (a.points > b.points); } - + //for find() inline bool operator ==(const tReStandings& a, const std::string &b) { - return a.drvName == b; + return a.drvName == b; } void ReUpdateStandings(void) { - tReStandings st; - std::string drvName; - std::vector *standings; - std::vector::iterator found; - std::vector::iterator it; - int runDrv, curDrv; - int i; - void *results = ReInfo->results; + tReStandings st; + std::string drvName; + std::vector *standings; + std::vector::iterator found; + std::vector::iterator it; + int runDrv, curDrv; + int i; + void *results = ReInfo->results; - snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); - runDrv = GfParmGetEltNb(results, path); - curDrv = GfParmGetEltNb(results, RE_SECT_STANDINGS); - - standings = new std::vector; + snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); + runDrv = GfParmGetEltNb(results, path); + curDrv = GfParmGetEltNb(results, RE_SECT_STANDINGS); - standings->reserve(curDrv); + standings = new std::vector; - /* Read the current standings */ - for (i = 0; i < curDrv; i++) - { - snprintf(path2, sizeof(path2), "%s/%d", RE_SECT_STANDINGS, i + 1); - st.drvName = GfParmGetStr(results, path2, RE_ATTR_NAME, 0); - st.modName = GfParmGetStr(results, path2, RE_ATTR_MODULE, 0); - st.carName = GfParmGetStr(results, path2, RE_ATTR_CAR, 0); - st.extended = (int)GfParmGetNum(results, path2, RM_ATTR_EXTENDED, NULL, 0); - st.drvIdx = (int)GfParmGetNum(results, path2, RE_ATTR_IDX, NULL, 0); - st.points = (int)GfParmGetNum(results, path2, RE_ATTR_POINTS, NULL, 0); - standings->push_back(st); - }//for i + standings->reserve(curDrv); - //Void the stored results - GfParmListClean(results, RE_SECT_STANDINGS); - - //Check last races' drivers and search their name in the results. - //If found there, adds recent points. - //If not found, adds the driver - for (i = 0; i < runDrv; i++) { - //Search the driver name in the standings - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK, i + 1); - drvName = GfParmGetStr(results, path, RE_ATTR_NAME, 0); - found = std::find(standings->begin(), standings->end(), drvName); - - if(found == standings->end()) { - //No such driver in the standings, let's add it - st.drvName = drvName; - st.modName = GfParmGetStr(results, path, RE_ATTR_MODULE, 0); - st.carName = GfParmGetStr(results, path, RE_ATTR_CAR, 0); - st.extended = (int)GfParmGetNum(results, path, RM_ATTR_EXTENDED, NULL, 0); - st.drvIdx = (int)GfParmGetNum(results, path, RE_ATTR_IDX, NULL, 0); - st.points = (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); - standings->push_back(st); - } else { - //Driver found, add recent points - found->points += (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); - }//if found - }//for i - - //sort standings by score - std::sort(standings->begin(), standings->end(), sortByScore); - - //Store the standing back - for(it = standings->begin(), i = 0; it != standings->end(); ++it, ++i) { - snprintf(path, sizeof(path), "%s/%d", RE_SECT_STANDINGS, i + 1); - GfParmSetStr(results, path, RE_ATTR_NAME, it->drvName.c_str()); - GfParmSetStr(results, path, RE_ATTR_MODULE, it->modName.c_str()); - GfParmSetStr(results, path, RE_ATTR_CAR, it->carName.c_str()); - GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)it->drvIdx); - GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, (tdble)it->points); - }//for it - delete standings; - - char str1[512], str2[512]; - snprintf(str1, sizeof(str1), "%sconfig/params.dtd", GfDataDir()); - snprintf(str2, sizeof(str2), "", GfDataDir()); - - GfParmSetDTD (results, str1, str2); - GfParmWriteFile(0, results, "Results"); + /* Read the current standings */ + for (i = 0; i < curDrv; i++) + { + snprintf(path2, sizeof(path2), "%s/%d", RE_SECT_STANDINGS, i + 1); + st.drvName = GfParmGetStr(results, path2, RE_ATTR_NAME, 0); + st.modName = GfParmGetStr(results, path2, RE_ATTR_MODULE, 0); + st.carName = GfParmGetStr(results, path2, RE_ATTR_CAR, 0); + st.extended = (int)GfParmGetNum(results, path2, RM_ATTR_EXTENDED, NULL, 0); + st.drvIdx = (int)GfParmGetNum(results, path2, RE_ATTR_IDX, NULL, 0); + st.points = (int)GfParmGetNum(results, path2, RE_ATTR_POINTS, NULL, 0); + standings->push_back(st); + }//for i + + //Void the stored results + GfParmListClean(results, RE_SECT_STANDINGS); + + //Check last races' drivers and search their name in the results. + //If found there, adds recent points. + //If not found, adds the driver + for (i = 0; i < runDrv; i++) { + //Search the driver name in the standings + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK, i + 1); + drvName = GfParmGetStr(results, path, RE_ATTR_NAME, 0); + found = std::find(standings->begin(), standings->end(), drvName); + + if(found == standings->end()) { + //No such driver in the standings, let's add it + st.drvName = drvName; + st.modName = GfParmGetStr(results, path, RE_ATTR_MODULE, 0); + st.carName = GfParmGetStr(results, path, RE_ATTR_CAR, 0); + st.extended = (int)GfParmGetNum(results, path, RM_ATTR_EXTENDED, NULL, 0); + st.drvIdx = (int)GfParmGetNum(results, path, RE_ATTR_IDX, NULL, 0); + st.points = (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); + standings->push_back(st); + } else { + //Driver found, add recent points + found->points += (int)GfParmGetNum(results, path, RE_ATTR_POINTS, NULL, 0); + }//if found + }//for i + + //sort standings by score + std::sort(standings->begin(), standings->end(), sortByScore); + + //Store the standing back + for(it = standings->begin(), i = 0; it != standings->end(); ++it, ++i) { + snprintf(path, sizeof(path), "%s/%d", RE_SECT_STANDINGS, i + 1); + GfParmSetStr(results, path, RE_ATTR_NAME, it->drvName.c_str()); + GfParmSetStr(results, path, RE_ATTR_MODULE, it->modName.c_str()); + GfParmSetStr(results, path, RE_ATTR_CAR, it->carName.c_str()); + GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)it->drvIdx); + GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, (tdble)it->points); + }//for it + delete standings; + + char str1[512], str2[512]; + snprintf(str1, sizeof(str1), "%sconfig/params.dtd", GfDataDir()); + snprintf(str2, sizeof(str2), "", GfDataDir()); + + GfParmSetDTD (results, str1, str2); + GfParmWriteFile(0, results, "Results"); }//ReUpdateStandings void ReCalculateClassPoints(char const *race) { - double points; - char *path3; - int rank = 1; - int count; + double points; + char *path3; + int rank = 1; + int count; - snprintf(buf, sizeof(buf), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); - path3 = strdup(buf); - if (GfParmListSeekFirst(ReInfo->results, path3) != 0) - { - free(path3); - return; /* No result found */ - } - count = GfParmGetEltNb(ReInfo->results, path3); - do { - snprintf( path2, sizeof(path2), "%s/%s", race, RM_SECT_CLASSPOINTS ); - if (GfParmListSeekFirst( ReInfo->params, path2 ) != 0) { - GfLogDebug( "ReCalculateClassPoints: First not found in %s)\n", path2 ); - continue; - } - do { - snprintf( buf, sizeof(buf), "%s/%s", path2, GfParmListGetCurEltName( ReInfo->params, path2 ) ); - snprintf( path, sizeof(path), "%s/%s/%d/%d/%s", RE_SECT_CLASSPOINTS, - GfParmGetCurStr (ReInfo->results, path3, RE_ATTR_MODULE, ""), - (int)GfParmGetCurNum (ReInfo->results, path3, RM_ATTR_EXTENDED, NULL, 0), - (int)GfParmGetCurNum (ReInfo->results, path3, RE_ATTR_IDX, NULL, 0), - GfParmGetStr( ReInfo->params, buf, RM_ATTR_SUFFIX, "" ) ); - points = GfParmGetNum (ReInfo->results, path, RE_ATTR_POINTS, NULL, 0); - GfParmSetVariable (ReInfo->params, buf, "pos", (tdble)rank); - GfParmSetVariable (ReInfo->params, buf, "cars", (tdble)count); - //GfLogDebug( "ReCalculateClassPoints: pos = %d; count = %d\n", rank, count); - //GfLogDebug( "ReCalculateClassPoints: GfParmGetNum (..., %s, %s, NULL, 0)\n", buf, RM_ATTR_POINTS ); - points += ( GfParmGetNum (ReInfo->params, buf, RM_ATTR_POINTS, NULL, 0) / - GfParmGetNum (ReInfo->params, RM_SECT_TRACKS, RM_ATTR_NUMBER, NULL, 1) ); - GfParmRemoveVariable (ReInfo->params, buf, "pos"); - GfParmRemoveVariable (ReInfo->params, buf, "cars"); - GfParmSetNum (ReInfo->results, path, RE_ATTR_POINTS, NULL, (tdble)points); - } while (GfParmListSeekNext( ReInfo->params, path2 ) == 0); - ++rank; - } while (GfParmListSeekNext (ReInfo->results, path3) == 0); - free(path3); + snprintf(buf, sizeof(buf), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, RE_SECT_RANK); + path3 = strdup(buf); + if (GfParmListSeekFirst(ReInfo->results, path3) != 0) + { + free(path3); + return; /* No result found */ + } + count = GfParmGetEltNb(ReInfo->results, path3); + do { + snprintf( path2, sizeof(path2), "%s/%s", race, RM_SECT_CLASSPOINTS ); + if (GfParmListSeekFirst( ReInfo->params, path2 ) != 0) { + GfLogDebug( "ReCalculateClassPoints: First not found in %s)\n", path2 ); + continue; + } + do { + snprintf( buf, sizeof(buf), "%s/%s", path2, GfParmListGetCurEltName( ReInfo->params, path2 ) ); + snprintf( path, sizeof(path), "%s/%s/%d/%d/%s", RE_SECT_CLASSPOINTS, + GfParmGetCurStr (ReInfo->results, path3, RE_ATTR_MODULE, ""), + (int)GfParmGetCurNum (ReInfo->results, path3, RM_ATTR_EXTENDED, NULL, 0), + (int)GfParmGetCurNum (ReInfo->results, path3, RE_ATTR_IDX, NULL, 0), + GfParmGetStr( ReInfo->params, buf, RM_ATTR_SUFFIX, "" ) ); + points = GfParmGetNum (ReInfo->results, path, RE_ATTR_POINTS, NULL, 0); + GfParmSetVariable (ReInfo->params, buf, "pos", (tdble)rank); + GfParmSetVariable (ReInfo->params, buf, "cars", (tdble)count); + //GfLogDebug( "ReCalculateClassPoints: pos = %d; count = %d\n", rank, count); + //GfLogDebug( "ReCalculateClassPoints: GfParmGetNum (..., %s, %s, NULL, 0)\n", buf, RM_ATTR_POINTS ); + points += ( GfParmGetNum (ReInfo->params, buf, RM_ATTR_POINTS, NULL, 0) / + GfParmGetNum (ReInfo->params, RM_SECT_TRACKS, RM_ATTR_NUMBER, NULL, 1) ); + GfParmRemoveVariable (ReInfo->params, buf, "pos"); + GfParmRemoveVariable (ReInfo->params, buf, "cars"); + GfParmSetNum (ReInfo->results, path, RE_ATTR_POINTS, NULL, (tdble)points); + } while (GfParmListSeekNext( ReInfo->params, path2 ) == 0); + ++rank; + } while (GfParmListSeekNext (ReInfo->results, path3) == 0); + free(path3); } void ReStoreRaceResults(const char *race) { - int i; - int nCars; - tCarElt *car; - tSituation *s = ReInfo->s; - char *carName; - void *carparam; - void *results = ReInfo->results; - void *params = ReInfo->params; - - /* Store the number of laps of the race */ - switch (ReInfo->s->_raceType) { - case RM_TYPE_RACE: - car = s->cars[0]; - if (car->_laps > s->_totLaps) car->_laps = s->_totLaps + 1; + int i; + int nCars; + tCarElt *car; + tSituation *s = ReInfo->s; + char *carName; + void *carparam; + void *results = ReInfo->results; + void *params = ReInfo->params; - snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); - GfParmListClean(results, path); - GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); - - for (i = 0; i < s->_ncars; i++) { - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); - car = s->cars[i]; - if (car->_laps > s->_totLaps) - car->_laps = s->_totLaps + 1; - - GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); - - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = GfParmGetName(carparam); - - GfParmSetStr(results, path, RE_ATTR_CAR, carName); - GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, (tdble)car->index); - - GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); - GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_curTime); - GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); - GfParmSetNum(results, path, RE_ATTR_TOP_SPEED, NULL, car->_topSpeed); - GfParmSetNum(results, path, RE_ATTR_DAMMAGES, NULL, (tdble)car->_dammage); - GfParmSetNum(results, path, RE_ATTR_NB_PIT_STOPS, NULL, (tdble)car->_nbPitStops); - - GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); - GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); - snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); - GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, - GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); - GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); - snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); - GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, - GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); - if (strlen(car->_skinName) > 0) - GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); - GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); + /* Store the number of laps of the race */ + switch (ReInfo->s->_raceType) { + case RM_TYPE_RACE: + car = s->cars[0]; + if (car->_laps > s->_totLaps) car->_laps = s->_totLaps + 1; - GfParmReleaseHandle(carparam); - } - break; - - case RM_TYPE_PRACTICE: - if (s->_ncars == 1) - { - car = s->cars[0]; - snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); - GfParmSetStr(results, path, RM_ATTR_DRVNAME, car->_name); - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = GfParmGetName(carparam); - GfParmSetStr(results, path, RE_ATTR_CAR, carName); - GfParmReleaseHandle(carparam); - break; - } - /* Otherwise, fall through */ - - case RM_TYPE_QUALIF: - if (s->_ncars == 1) - { - car = s->cars[0]; - snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK); - nCars = GfParmGetEltNb(results, path); - for (i = nCars; i > 0; i--) { - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i); - float opponentBestLapTime = GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0); - - if (car->_bestLapTime != 0.0 - && (car->_bestLapTime < opponentBestLapTime || opponentBestLapTime == 0.0)) - { - /* shift */ - snprintf(path2, sizeof(path2), "%s/%s/%s/%s/%d", - ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); - GfParmSetStr(results, path2, RE_ATTR_NAME, - GfParmGetStr(results, path, RE_ATTR_NAME, "")); - GfParmSetStr(results, path2, RE_ATTR_CAR, - GfParmGetStr(results, path, RE_ATTR_CAR, "")); - GfParmSetNum(results, path2, RE_ATTR_BEST_LAP_TIME, NULL, - GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0)); - GfParmSetStr(results, path2, RE_ATTR_MODULE, - GfParmGetStr(results, path, RM_ATTR_MODULE, "")); - GfParmSetNum(results, path2, RE_ATTR_IDX, NULL, - GfParmGetNum(results, path, RM_ATTR_IDX, NULL, 0)); - GfParmSetNum(results, path2, RM_ATTR_EXTENDED, NULL, - GfParmGetNum(results, path, RM_ATTR_EXTENDED, NULL, 0)); - GfParmSetStr(results, path2, ROB_ATTR_CAR, - GfParmGetStr(results, path, ROB_ATTR_CAR, "")); - GfParmSetStr(results, path2, ROB_ATTR_NAME, - GfParmGetStr(results, path, ROB_ATTR_NAME, "")); - snprintf(path, sizeof(path), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); - GfParmSetNum(results, path2, RE_ATTR_POINTS, NULL, - GfParmGetNum(params, path, RE_ATTR_POINTS, NULL, 0)); - if (GfParmGetStr(results, path, RM_ATTR_SKINNAME, 0)) - GfParmSetStr(results, path2, RM_ATTR_SKINNAME, - GfParmGetStr(results, path, RM_ATTR_SKINNAME, 0)); - GfParmSetNum(results, path2, RM_ATTR_SKINTARGETS, NULL, - GfParmGetNum(results, path, RM_ATTR_SKINTARGETS, NULL, 0)); - } else { - break; - } - } - /* insert after */ - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); - GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); - - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = GfParmGetName(carparam); - - GfParmSetStr(results, path, RE_ATTR_CAR, carName); - GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); - GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); - GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); - GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); - GfParmSetStr(results, path, ROB_ATTR_NAME, car->_name); - snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); - GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, - GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); - snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); - GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, - GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); - if (strlen(car->_skinName) > 0) - GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); - GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); - - GfParmReleaseHandle(carparam); - break; - } else { - car = s->cars[0]; - - if (s->_totTime < 0.0f) - GfLogWarning("Saving results of multicar non-race session, but it was not timed!\n" ); - snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); - GfParmListClean(results, path); - GfParmSetNum(results, path, RE_ATTR_SESSIONTIME, NULL, (tdble)s->_totTime); - - for (i = 0; i < s->_ncars; i++) { - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); - car = s->cars[i]; - - GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); - - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = GfParmGetName(carparam); - - GfParmSetStr(results, path, RE_ATTR_CAR, carName); - GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, (tdble)car->index); - - GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); - GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_curTime); - GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); - GfParmSetNum(results, path, RE_ATTR_TOP_SPEED, NULL, car->_topSpeed); - GfParmSetNum(results, path, RE_ATTR_DAMMAGES, NULL, (tdble)car->_dammage); - GfParmSetNum(results, path, RE_ATTR_NB_PIT_STOPS, NULL, (tdble)car->_nbPitStops); - - GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); - GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); - snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); - GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, - GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); - GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); - snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); - GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, - GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); - if (strlen(car->_skinName) > 0) - GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); - GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); - - GfParmReleaseHandle(carparam); - } - break; - } - } + snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); + GfParmListClean(results, path); + GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); + + for (i = 0; i < s->_ncars; i++) { + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); + car = s->cars[i]; + if (car->_laps > s->_totLaps) + car->_laps = s->_totLaps + 1; + + GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); + + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = GfParmGetName(carparam); + + GfParmSetStr(results, path, RE_ATTR_CAR, carName); + GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, (tdble)car->index); + + GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); + GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_curTime); + GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); + GfParmSetNum(results, path, RE_ATTR_TOP_SPEED, NULL, car->_topSpeed); + GfParmSetNum(results, path, RE_ATTR_DAMMAGES, NULL, (tdble)car->_dammage); + GfParmSetNum(results, path, RE_ATTR_NB_PIT_STOPS, NULL, (tdble)car->_nbPitStops); + + GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); + GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); + snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); + GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, + GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); + GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); + snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); + GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, + GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); + if (strlen(car->_skinName) > 0) + GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); + GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); + + GfParmReleaseHandle(carparam); + } + break; + + case RM_TYPE_PRACTICE: + if (s->_ncars == 1) + { + car = s->cars[0]; + snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); + GfParmSetStr(results, path, RM_ATTR_DRVNAME, car->_name); + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = GfParmGetName(carparam); + GfParmSetStr(results, path, RE_ATTR_CAR, carName); + GfParmReleaseHandle(carparam); + break; + } +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif + /* Otherwise, fall through */ + + case RM_TYPE_QUALIF: + if (s->_ncars == 1) + { + car = s->cars[0]; + snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK); + nCars = GfParmGetEltNb(results, path); + for (i = nCars; i > 0; i--) { + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i); + float opponentBestLapTime = GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0); + + if (car->_bestLapTime != 0.0 + && (car->_bestLapTime < opponentBestLapTime || opponentBestLapTime == 0.0)) + { + /* shift */ + snprintf(path2, sizeof(path2), "%s/%s/%s/%s/%d", + ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); + GfParmSetStr(results, path2, RE_ATTR_NAME, + GfParmGetStr(results, path, RE_ATTR_NAME, "")); + GfParmSetStr(results, path2, RE_ATTR_CAR, + GfParmGetStr(results, path, RE_ATTR_CAR, "")); + GfParmSetNum(results, path2, RE_ATTR_BEST_LAP_TIME, NULL, + GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0)); + GfParmSetStr(results, path2, RE_ATTR_MODULE, + GfParmGetStr(results, path, RM_ATTR_MODULE, "")); + GfParmSetNum(results, path2, RE_ATTR_IDX, NULL, + GfParmGetNum(results, path, RM_ATTR_IDX, NULL, 0)); + GfParmSetNum(results, path2, RM_ATTR_EXTENDED, NULL, + GfParmGetNum(results, path, RM_ATTR_EXTENDED, NULL, 0)); + GfParmSetStr(results, path2, ROB_ATTR_CAR, + GfParmGetStr(results, path, ROB_ATTR_CAR, "")); + GfParmSetStr(results, path2, ROB_ATTR_NAME, + GfParmGetStr(results, path, ROB_ATTR_NAME, "")); + snprintf(path, sizeof(path), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); + GfParmSetNum(results, path2, RE_ATTR_POINTS, NULL, + GfParmGetNum(params, path, RE_ATTR_POINTS, NULL, 0)); + if (GfParmGetStr(results, path, RM_ATTR_SKINNAME, 0)) + GfParmSetStr(results, path2, RM_ATTR_SKINNAME, + GfParmGetStr(results, path, RM_ATTR_SKINNAME, 0)); + GfParmSetNum(results, path2, RM_ATTR_SKINTARGETS, NULL, + GfParmGetNum(results, path, RM_ATTR_SKINTARGETS, NULL, 0)); + } else { + break; + } + } + /* insert after */ + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); + GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); + + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = GfParmGetName(carparam); + + GfParmSetStr(results, path, RE_ATTR_CAR, carName); + GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); + GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); + GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); + GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); + GfParmSetStr(results, path, ROB_ATTR_NAME, car->_name); + snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); + GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, + GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); + snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); + GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, + GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); + if (strlen(car->_skinName) > 0) + GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); + GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); + + GfParmReleaseHandle(carparam); + break; + } else { + car = s->cars[0]; + + if (s->_totTime < 0.0f) + GfLogWarning("Saving results of multicar non-race session, but it was not timed!\n" ); + snprintf(path, sizeof(path), "%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race); + GfParmListClean(results, path); + GfParmSetNum(results, path, RE_ATTR_SESSIONTIME, NULL, (tdble)s->_totTime); + + for (i = 0; i < s->_ncars; i++) { + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i + 1); + car = s->cars[i]; + + GfParmSetStr(results, path, RE_ATTR_NAME, car->_name); + + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = GfParmGetName(carparam); + + GfParmSetStr(results, path, RE_ATTR_CAR, carName); + GfParmSetNum(results, path, RE_ATTR_INDEX, NULL, (tdble)car->index); + + GfParmSetNum(results, path, RE_ATTR_LAPS, NULL, (tdble)(car->_laps - 1)); + GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_curTime); + GfParmSetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, (tdble)car->_bestLapTime); + GfParmSetNum(results, path, RE_ATTR_TOP_SPEED, NULL, car->_topSpeed); + GfParmSetNum(results, path, RE_ATTR_DAMMAGES, NULL, (tdble)car->_dammage); + GfParmSetNum(results, path, RE_ATTR_NB_PIT_STOPS, NULL, (tdble)car->_nbPitStops); + + GfParmSetStr(results, path, RE_ATTR_MODULE, car->_modName); + GfParmSetNum(results, path, RE_ATTR_IDX, NULL, (tdble)car->_moduleIndex); + snprintf(path2, sizeof(path2), "%s/%d", RM_SECT_DRIVERS_RACING, car->index + 1 ); + GfParmSetNum(results, path, RM_ATTR_EXTENDED, NULL, + GfParmGetNum(params, path2, RM_ATTR_EXTENDED, NULL, 0)); + GfParmSetStr(results, path, ROB_ATTR_CAR, car->_carName); + snprintf(path2, sizeof(path2), "%s/%s/%d", race, RM_SECT_POINTS, i + 1); + GfParmSetNum(results, path, RE_ATTR_POINTS, NULL, + GfParmGetNum(params, path2, RE_ATTR_POINTS, NULL, 0)); + if (strlen(car->_skinName) > 0) + GfParmSetStr(results, path, RM_ATTR_SKINNAME, car->_skinName); + GfParmSetNum(results, path, RM_ATTR_SKINTARGETS, NULL, (tdble)car->_skinTargets); + + GfParmReleaseHandle(carparam); + } + break; + } + } } void ReInitCurRes() { - if (ReInfo->_displayMode != RM_DISP_MODE_NORMAL) - { - if (ReInfo->s->_raceType == RM_TYPE_QUALIF) - { - //ReUpdateQualifCurRes(ReInfo->s->cars[0]); - } - else if (ReInfo->s->_raceType == RM_TYPE_PRACTICE && ReInfo->s->_ncars > 1) - { - //ReUpdatePracticeCurRes(ReInfo->s->cars[0]); - } - else - { - static const char* pszTableHeader = "Rank Time Driver Car"; - char pszTitle[128]; - snprintf(pszTitle, sizeof(pszTitle), "%s at %s", - ReInfo->_reRaceName, ReInfo->track->name); - char pszSubTitle[128]; - snprintf(pszSubTitle, sizeof(pszSubTitle), "%s (%s)", - ReInfo->s->cars[0]->_name, ReInfo->s->cars[0]->_carName); - ReUI().setResultsTableTitles(pszTitle, pszSubTitle); - ReUI().setResultsTableHeader(pszTableHeader); - } - }//if displayMode != normal + if (ReInfo->_displayMode != RM_DISP_MODE_NORMAL) + { + if (ReInfo->s->_raceType == RM_TYPE_QUALIF) + { + //ReUpdateQualifCurRes(ReInfo->s->cars[0]); + } + else if (ReInfo->s->_raceType == RM_TYPE_PRACTICE && ReInfo->s->_ncars > 1) + { + //ReUpdatePracticeCurRes(ReInfo->s->cars[0]); + } + else + { + static const char* pszTableHeader = "Rank Time Driver Car"; + char pszTitle[128]; + snprintf(pszTitle, sizeof(pszTitle), "%s at %s", + ReInfo->_reRaceName, ReInfo->track->name); + char pszSubTitle[128]; + snprintf(pszSubTitle, sizeof(pszSubTitle), "%s (%s)", + ReInfo->s->cars[0]->_name, ReInfo->s->cars[0]->_carName); + ReUI().setResultsTableTitles(pszTitle, pszSubTitle); + ReUI().setResultsTableHeader(pszTableHeader); + } + }//if displayMode != normal } void ReUpdatePracticeCurRes(tCarElt *car, bool bForceNew) { - if (bForceNew) - { - static const char* pszTableHeader = - "Lap \tTime \tBest \tTop spd \tMin spd \tDamages"; - ReUI().setResultsTableHeader(pszTableHeader); - char* t1 = GfTime2Str(car->_lastLapTime, 0, false, 3); - char* t2 = GfTime2Str(car->_bestLapTime, 0, false, 3); - char buf[128]; + if (bForceNew) + { + static const char* pszTableHeader = + "Lap \tTime \tBest \tTop spd \tMin spd \tDamages"; + ReUI().setResultsTableHeader(pszTableHeader); + char* t1 = GfTime2Str(car->_lastLapTime, 0, false, 3); + char* t2 = GfTime2Str(car->_bestLapTime, 0, false, 3); + char buf[128]; - // Cancel hightlight on first line - if (car->_laps == 2) ReUI().setResultsTableRow(0, ""); + // Cancel hightlight on first line + if (car->_laps == 2) ReUI().setResultsTableRow(0, ""); - tReCarInfo *info = &(ReInfo->_reCarInfo[car->index]); - static int nLastLapDamages = 0; - if (car->_laps <= 2) - nLastLapDamages = 0; - snprintf(buf, sizeof(buf), "%.3d \t%-12s \t%-12s \t%5.1f \t%5.1f \t %.5d (%d)", - car->_laps - 1, t1, t2, info->topSpd * 3.6, info->botSpd * 3.6, - car->_dammage ? car->_dammage - nLastLapDamages : 0, car->_dammage); - nLastLapDamages = car->_dammage; - free(t1); - free(t2); - - ReUI().addResultsTableRow(buf); - } - else - { - //ReUpdateQualifCurRes(car); - } + tReCarInfo *info = &(ReInfo->_reCarInfo[car->index]); + static int nLastLapDamages = 0; + if (car->_laps <= 2) + nLastLapDamages = 0; + snprintf(buf, sizeof(buf), "%.3d \t%-12s \t%-12s \t%5.1f \t%5.1f \t %.5d (%d)", + car->_laps - 1, t1, t2, info->topSpd * 3.6, info->botSpd * 3.6, + car->_dammage ? car->_dammage - nLastLapDamages : 0, car->_dammage); + nLastLapDamages = car->_dammage; + free(t1); + free(t2); + + ReUI().addResultsTableRow(buf); + } + else + { + //ReUpdateQualifCurRes(car); + } } void ReUpdateQualifCurRes(tCarElt *car) { - static const char* pszTableHeader = "Rank \tTime \tDriver \tCar"; - int i; - int xx; - int nCars; - int nCarsReal; - int printed; - int maxLines; - void *carparam; - char *carName; - const char *race = ReInfo->_reRaceName; - void *results = ReInfo->results; - char *tmp_str; - double time_left; - - if (ReInfo->s->_ncars == 1) - { - ReUI().eraseResultsTable(); - maxLines = ReUI().getResultsTableRowCount(); - - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = GfParmGetName(carparam); + static const char* pszTableHeader = "Rank \tTime \tDriver \tCar"; + int i; + int xx; + int nCars; + int nCarsReal; + int printed; + int maxLines; + void *carparam; + char *carName; + const char *race = ReInfo->_reRaceName; + void *results = ReInfo->results; + char *tmp_str; + double time_left; - char pszTitle[128]; - snprintf(pszTitle, sizeof(pszTitle), "%s at %s", - race, ReInfo->track->name); - if (ReInfo->s->_raceType == RM_TYPE_PRACTICE || car->_laps < 1 || car->_laps > ReInfo->s->_totLaps) - snprintf(buf, sizeof(buf), "%s (%s)", car->_name, carName); - else - snprintf(buf, sizeof(buf), "%s (%s) - Lap %d", car->_name, carName, car->_laps); - ReUI().setResultsTableTitles(pszTitle, buf); - ReUI().setResultsTableHeader(pszTableHeader); + if (ReInfo->s->_ncars == 1) + { + ReUI().eraseResultsTable(); + maxLines = ReUI().getResultsTableRowCount(); - printed = 0; - snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK); - nCarsReal = GfParmGetEltNb(results, path); - nCars = MIN(nCarsReal + 1, maxLines); // limit display to only those on 1st page - for (i = 1; i < nCars; i++) { - snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i); - if (!printed && car->_bestLapTime != 0.0 - && car->_bestLapTime < GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0)) { - tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); - snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", i, tmp_str, car->_name, carName); - free(tmp_str); - ReUI().setResultsTableRow(i - 1, buf, /*highlight=*/true); - printed = 1; - } - tmp_str = GfTime2Str(GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0), " ", false, 3); - snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", - i + printed, tmp_str, GfParmGetStr(results, path, RE_ATTR_NAME, ""), - GfParmGetStr(results, path, RE_ATTR_CAR, "")); - free (tmp_str); - ReUI().setResultsTableRow(i - 1 + printed, buf); - } - - if (!printed) { - tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); - snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", nCarsReal + 1, tmp_str, car->_name, carName); - free(tmp_str); - ReUI().setResultsTableRow(i - 1, buf, /*highlight=*/true); - } - - GfParmReleaseHandle(carparam); - } - else - { - nCars = ReInfo->s->_ncars; - if (nCars > ReUI().getResultsTableRowCount()) - nCars = ReUI().getResultsTableRowCount(); + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = GfParmGetName(carparam); - char pszTitle[128]; - snprintf(pszTitle, sizeof(pszTitle), "%s at %s", - race, ReInfo->track->name); - if (ReInfo->s->_totTime > ReInfo->s->currentTime) - { - time_left = ReInfo->s->_totTime - ReInfo->s->currentTime; - snprintf( buf, sizeof(buf), "%d:%02d:%02d", - (int)floor( time_left / 3600.0f ), (int)floor( time_left / 60.0f ) % 60, - (int)floor( time_left ) % 60 ); - } - else - { - snprintf( buf, sizeof(buf), "%d laps", ReInfo->s->_totLaps ); - } - ReUI().setResultsTableTitles(pszTitle, buf); - ReUI().setResultsTableHeader(pszTableHeader); - - for (xx = 0; xx < nCars; ++xx) { - car = ReInfo->s->cars[ xx ]; - snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); - carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); - carName = strdup(GfParmGetName(carparam)); - GfParmReleaseHandle(carparam); - - if (car->_state & RM_CAR_STATE_DNF) { - snprintf(buf, sizeof(buf), "out \t \t%-25s \t%-20s", car->_name, carName); - } else if (car->_bestLapTime <= 0.0f) { - snprintf(buf, sizeof(buf), " %2d \t --:--- \t%-25s \t%-20s", - xx + 1, car->_name, carName); - } else { - if (xx == 0) - tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); - else - tmp_str = GfTime2Str(car->_bestLapTime - ReInfo->s->cars[0]->_bestLapTime, - "+", false, 3); - snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", - xx + 1, tmp_str, car->_name, carName); - free(tmp_str); - } - ReUI().setResultsTableRow(xx, buf); - FREEZ(carName); - } - } + char pszTitle[128]; + snprintf(pszTitle, sizeof(pszTitle), "%s at %s", + race, ReInfo->track->name); + if (ReInfo->s->_raceType == RM_TYPE_PRACTICE || car->_laps < 1 || car->_laps > ReInfo->s->_totLaps) + snprintf(buf, sizeof(buf), "%s (%s)", car->_name, carName); + else + snprintf(buf, sizeof(buf), "%s (%s) - Lap %d", car->_name, carName, car->_laps); + ReUI().setResultsTableTitles(pszTitle, buf); + ReUI().setResultsTableHeader(pszTableHeader); + + printed = 0; + snprintf(path, sizeof(path), "%s/%s/%s/%s", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK); + nCarsReal = GfParmGetEltNb(results, path); + nCars = MIN(nCarsReal + 1, maxLines); // limit display to only those on 1st page + for (i = 1; i < nCars; i++) { + snprintf(path, sizeof(path), "%s/%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, race, RE_SECT_RANK, i); + if (!printed && car->_bestLapTime != 0.0 + && car->_bestLapTime < GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0)) { + tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); + snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", i, tmp_str, car->_name, carName); + free(tmp_str); + ReUI().setResultsTableRow(i - 1, buf, /*highlight=*/true); + printed = 1; + } + tmp_str = GfTime2Str(GfParmGetNum(results, path, RE_ATTR_BEST_LAP_TIME, NULL, 0), " ", false, 3); + snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", + i + printed, tmp_str, GfParmGetStr(results, path, RE_ATTR_NAME, ""), + GfParmGetStr(results, path, RE_ATTR_CAR, "")); + free (tmp_str); + ReUI().setResultsTableRow(i - 1 + printed, buf); + } + + if (!printed) { + tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); + snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", nCarsReal + 1, tmp_str, car->_name, carName); + free(tmp_str); + ReUI().setResultsTableRow(i - 1, buf, /*highlight=*/true); + } + + GfParmReleaseHandle(carparam); + } + else + { + nCars = ReInfo->s->_ncars; + if (nCars > ReUI().getResultsTableRowCount()) + nCars = ReUI().getResultsTableRowCount(); + + char pszTitle[128]; + snprintf(pszTitle, sizeof(pszTitle), "%s at %s", + race, ReInfo->track->name); + if (ReInfo->s->_totTime > ReInfo->s->currentTime) + { + time_left = ReInfo->s->_totTime - ReInfo->s->currentTime; + snprintf( buf, sizeof(buf), "%d:%02d:%02d", + (int)floor( time_left / 3600.0f ), (int)floor( time_left / 60.0f ) % 60, + (int)floor( time_left ) % 60 ); + } + else + { + snprintf( buf, sizeof(buf), "%d laps", ReInfo->s->_totLaps ); + } + ReUI().setResultsTableTitles(pszTitle, buf); + ReUI().setResultsTableHeader(pszTableHeader); + + for (xx = 0; xx < nCars; ++xx) { + car = ReInfo->s->cars[ xx ]; + snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); + carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); + carName = strdup(GfParmGetName(carparam)); + GfParmReleaseHandle(carparam); + + if (car->_state & RM_CAR_STATE_DNF) { + snprintf(buf, sizeof(buf), "out \t \t%-25s \t%-20s", car->_name, carName); + } else if (car->_bestLapTime <= 0.0f) { + snprintf(buf, sizeof(buf), " %2d \t --:--- \t%-25s \t%-20s", + xx + 1, car->_name, carName); + } else { + if (xx == 0) + tmp_str = GfTime2Str(car->_bestLapTime, " ", false, 3); + else + tmp_str = GfTime2Str(car->_bestLapTime - ReInfo->s->cars[0]->_bestLapTime, + "+", false, 3); + snprintf(buf, sizeof(buf), " %2d \t%-12s \t%-25s \t%-20s", + xx + 1, tmp_str, car->_name, carName); + free(tmp_str); + } + ReUI().setResultsTableRow(xx, buf); + FREEZ(carName); + } + } } void ReUpdateRaceCurRes() { - static const char* pszTableHeader = "Rank \tTime \tDriver \tCar"; + static const char* pszTableHeader = "Rank \tTime \tDriver \tCar"; int ncars; int xx; void *carparam; @@ -643,56 +646,56 @@ ReUpdateRaceCurRes() if (ReInfo->s->_totTime > ReInfo->s->currentTime) { - time_left = ReInfo->s->_totTime - ReInfo->s->currentTime; - snprintf( buf, sizeof(buf), "%d:%02d:%02d", - (int)floor( time_left / 3600.0f ), - (int)floor( time_left / 60.0f ) % 60, (int)floor( time_left ) % 60 ); + time_left = ReInfo->s->_totTime - ReInfo->s->currentTime; + snprintf( buf, sizeof(buf), "%d:%02d:%02d", + (int)floor( time_left / 3600.0f ), + (int)floor( time_left / 60.0f ) % 60, (int)floor( time_left ) % 60 ); } else { - snprintf( buf, sizeof(buf), "%d laps", ReInfo->s->_totLaps ); + snprintf( buf, sizeof(buf), "%d laps", ReInfo->s->_totLaps ); } - ReUI().setResultsTableTitles(pszTitle, buf); - ReUI().setResultsTableHeader(pszTableHeader); + ReUI().setResultsTableTitles(pszTitle, buf); + ReUI().setResultsTableHeader(pszTableHeader); for (xx = 0; xx < ncars; ++xx) { - car = ReInfo->s->cars[ xx ]; + car = ReInfo->s->cars[ xx ]; snprintf(buf, sizeof(buf), "cars/models/%s/%s.xml", car->_carName, car->_carName); carparam = GfParmReadFile(buf, GFPARM_RMODE_STD); carName = strdup(GfParmGetName(carparam)); GfParmReleaseHandle(carparam); - - if (car->_state & RM_CAR_STATE_DNF) { - snprintf(buf, sizeof(buf), "out %-20s %-20s", car->_name, carName); - } else if (car->_timeBehindLeader == 0.0f) { - if (xx != 0) - snprintf(buf, sizeof(buf), " %2d \t --:--- \t%-25s \t%-20s", - xx + 1, car->_name, carName); - else - snprintf(buf, sizeof(buf), " %2d \t%3d laps \t%-25s \t%-20s", - xx + 1, car->_laps - 1, car->_name, carName); - } else { - if (xx == 0) { - snprintf(buf, sizeof(buf), " %2d \t%3d laps \t%-25s \t%-20s", - xx + 1, car->_laps - 1, car->_name, carName); - } else { - if (car->_lapsBehindLeader == 0) - { - tmp_str = GfTime2Str(car->_timeBehindLeader, " ", false, 3); - snprintf(buf, sizeof(buf), " %2d \t%-12s\t%-25s \t%-20s", - xx + 1, tmp_str, car->_name, carName); - free(tmp_str); - } - else if (car->_lapsBehindLeader == 1) - snprintf(buf, sizeof(buf), " %2d \t 1 lap \t%-25s \t%-20s", - xx + 1, car->_name, carName); - else - snprintf(buf, sizeof(buf), " %2d \t %3d laps \t%-25s \t%-20s", - xx + 1, car->_lapsBehindLeader, car->_name, carName); - } - } - ReUI().setResultsTableRow(xx, buf); - FREEZ(carName); + + if (car->_state & RM_CAR_STATE_DNF) { + snprintf(buf, sizeof(buf), "out %-20s %-20s", car->_name, carName); + } else if (car->_timeBehindLeader == 0.0f) { + if (xx != 0) + snprintf(buf, sizeof(buf), " %2d \t --:--- \t%-25s \t%-20s", + xx + 1, car->_name, carName); + else + snprintf(buf, sizeof(buf), " %2d \t%3d laps \t%-25s \t%-20s", + xx + 1, car->_laps - 1, car->_name, carName); + } else { + if (xx == 0) { + snprintf(buf, sizeof(buf), " %2d \t%3d laps \t%-25s \t%-20s", + xx + 1, car->_laps - 1, car->_name, carName); + } else { + if (car->_lapsBehindLeader == 0) + { + tmp_str = GfTime2Str(car->_timeBehindLeader, " ", false, 3); + snprintf(buf, sizeof(buf), " %2d \t%-12s\t%-25s \t%-20s", + xx + 1, tmp_str, car->_name, carName); + free(tmp_str); + } + else if (car->_lapsBehindLeader == 1) + snprintf(buf, sizeof(buf), " %2d \t 1 lap \t%-25s \t%-20s", + xx + 1, car->_name, carName); + else + snprintf(buf, sizeof(buf), " %2d \t %3d laps \t%-25s \t%-20s", + xx + 1, car->_lapsBehindLeader, car->_name, carName); + } + } + ReUI().setResultsTableRow(xx, buf); + FREEZ(carName); } } @@ -706,7 +709,7 @@ ReSavePracticeLap(tCarElt *car) /* hack to allow results from practice hillclimb to be recorded (as lap1) */ snprintf(path, sizeof(path), "%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, 1); GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_curTime); - } else { + } else { snprintf(path, sizeof(path), "%s/%s/%s/%d", ReInfo->track->name, RE_SECT_RESULTS, ReInfo->_reRaceName, car->_laps - 1); GfParmSetNum(results, path, RE_ATTR_TIME, NULL, (tdble)car->_lastLapTime); } diff --git a/src/modules/racing/genparoptv1/racestate.cpp b/src/modules/racing/genparoptv1/racestate.cpp index 0bed696b7..4b744234a 100644 --- a/src/modules/racing/genparoptv1/racestate.cpp +++ b/src/modules/racing/genparoptv1/racestate.cpp @@ -3,7 +3,7 @@ file : racestate.cpp created : Sat Nov 16 12:00:42 CET 2002 copyright : (C) 2002 by Eric Espie - email : eric.espie@torcs.org + email : eric.espie@torcs.org version : $Id$ ***************************************************************************/ @@ -16,8 +16,8 @@ * * ***************************************************************************/ -/** @file - The Race Engine State Automaton +/** @file + The Race Engine State Automaton @author Eric Espie @version $Id$ */ @@ -52,197 +52,202 @@ ReStateInit(void *prevMenu) void ReStateManage(void) { - int mode = RM_SYNC | RM_NEXT_STEP; + int mode = RM_SYNC | RM_NEXT_STEP; - do { - switch (ReInfo->_reState) { - case RE_STATE_CONFIG: - GfLogInfo("%s now in CONFIG state\n", ReInfo->_reName); - // Race configuration - mode = ReConfigure(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_EVENT_INIT; - } - break; + do + { + switch (ReInfo->_reState) + { + case RE_STATE_CONFIG: + GfLogInfo("%s now in CONFIG state\n", ReInfo->_reName); + // Race configuration + mode = ReConfigure(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_EVENT_INIT; + } + break; - case RE_STATE_EVENT_INIT: - GfLogInfo("%s now in EVENT_INIT state\n", ReInfo->_reName); - // Use new Memory Manager ... - #ifdef __DEBUG_MEMORYMANAGER__ - //fprintf(stderr,"Initialise memory manager tracking ...\n"); - GfMemoryManagerSetGroup(1); - #endif - // ... Use new Memory Manager + case RE_STATE_EVENT_INIT: + GfLogInfo("%s now in EVENT_INIT state\n", ReInfo->_reName); + // Use new Memory Manager ... + #ifdef __DEBUG_MEMORYMANAGER__ + //fprintf(stderr,"Initialise memory manager tracking ...\n"); + GfMemoryManagerSetGroup(1); + #endif + // ... Use new Memory Manager +#if ( __GNUC__ >= 5 || _MSVC_VER >= 1910) + [[fallthrough]]; +#endif - case RE_STATE_EVENT_LOOP: - GfLogInfo("%s now in EVENT_INIT_LOOP state\n", ReInfo->_reName); - // Load the event description (track and drivers list) - mode = ReRaceEventInit(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_PRE_RACE; - } - break; + case RE_STATE_EVENT_LOOP: + GfLogInfo("%s now in EVENT_INIT_LOOP state\n", ReInfo->_reName); + // Load the event description (track and drivers list) + mode = ReRaceEventInit(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_PRE_RACE; + } + break; - case RE_STATE_PRE_RACE: - GfLogInfo("%s now in PRE_RACE state\n", ReInfo->_reName); - mode = RePreRace(); - if (mode & RM_NEXT_RACE) { - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_EVENT_SHUTDOWN; - } - } else if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_RACE_START; - } - break; + case RE_STATE_PRE_RACE: + GfLogInfo("%s now in PRE_RACE state\n", ReInfo->_reName); + mode = RePreRace(); + if (mode & RM_NEXT_RACE) { + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_EVENT_SHUTDOWN; + } + } else if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_RACE_START; + } + break; - case RE_STATE_RACE_START: - GfLogInfo("%s now in RACE_START state\n", ReInfo->_reName); - mode = ReRaceStart(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_RACE; - GfLogInfo("%s now in RACE state\n", ReInfo->_reName); - } - break; + case RE_STATE_RACE_START: + GfLogInfo("%s now in RACE_START state\n", ReInfo->_reName); + mode = ReRaceStart(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_RACE; + GfLogInfo("%s now in RACE state\n", ReInfo->_reName); + } + break; - case RE_STATE_RACE: - mode = ReUpdate(); - if (ReInfo->s->_raceState == RM_RACE_ENDED) { - // Race is finished - ReInfo->_reState = RE_STATE_RACE_END; - } else if (mode & RM_END_RACE) { - // Race was interrupted (paused) by the player - ReInfo->_reState = RE_STATE_RACE_STOP; - } - break; + case RE_STATE_RACE: + mode = ReUpdate(); + if (ReInfo->s->_raceState == RM_RACE_ENDED) { + // Race is finished + ReInfo->_reState = RE_STATE_RACE_END; + } else if (mode & RM_END_RACE) { + // Race was interrupted (paused) by the player + ReInfo->_reState = RE_STATE_RACE_STOP; + } + break; - case RE_STATE_RACE_STOP: - GfLogInfo("%s now in RACE_STOP state\n", ReInfo->_reName); - // Race was interrupted (paused) by the player - mode = ReRaceStop(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_RACE_END; - } - break; + case RE_STATE_RACE_STOP: + GfLogInfo("%s now in RACE_STOP state\n", ReInfo->_reName); + // Race was interrupted (paused) by the player + mode = ReRaceStop(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_RACE_END; + } + break; - case RE_STATE_RACE_END: - GfLogInfo("%s now in RACE_END state\n", ReInfo->_reName); - mode = ReRaceEnd(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_POST_RACE; - } else if (mode & RM_NEXT_RACE) { - ReInfo->_reState = RE_STATE_RACE_START; - } - break; + case RE_STATE_RACE_END: + GfLogInfo("%s now in RACE_END state\n", ReInfo->_reName); + mode = ReRaceEnd(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_POST_RACE; + } else if (mode & RM_NEXT_RACE) { + ReInfo->_reState = RE_STATE_RACE_START; + } + break; - case RE_STATE_POST_RACE: - GfLogInfo("%s now in POST_RACE state\n", ReInfo->_reName); - mode = RePostRace(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_EVENT_SHUTDOWN; - } else if (mode & RM_NEXT_RACE) { - ReInfo->_reState = RE_STATE_PRE_RACE; - } - break; + case RE_STATE_POST_RACE: + GfLogInfo("%s now in POST_RACE state\n", ReInfo->_reName); + mode = RePostRace(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_EVENT_SHUTDOWN; + } else if (mode & RM_NEXT_RACE) { + ReInfo->_reState = RE_STATE_PRE_RACE; + } + break; - case RE_STATE_EVOLUTION: - GfLogInfo("RaceEngine: state = RE_STATE_EVOLUTION\n"); - mode = ReEvolution(); - // Setup short cut - if (mode & RM_NEXT_STEP) { - /* Back to optimization */ - ReInfo->_reState = RE_STATE_EVENT_LOOP; - } else { - /* Next step */ - // Use new Memory Manager ... - #ifdef __DEBUG_MEMORYMANAGER__ - fprintf(stderr,"... Reset memory manager tracking\n"); - GfMemoryManagerSetGroup(0); - #endif - // ... Use new Memory Manager + case RE_STATE_EVOLUTION: + GfLogInfo("RaceEngine: state = RE_STATE_EVOLUTION\n"); + mode = ReEvolution(); + // Setup short cut + if (mode & RM_NEXT_STEP) { + /* Back to optimization */ + ReInfo->_reState = RE_STATE_EVENT_LOOP; + } else { + /* Next step */ + // Use new Memory Manager ... + #ifdef __DEBUG_MEMORYMANAGER__ + fprintf(stderr,"... Reset memory manager tracking\n"); + GfMemoryManagerSetGroup(0); + #endif + // ... Use new Memory Manager - ReInfo->_reState = RE_STATE_SHUTDOWN; - } - break; + ReInfo->_reState = RE_STATE_SHUTDOWN; + } + break; - case RE_STATE_EVENT_SHUTDOWN: - GfLogInfo("%s now in EVENT_SHUTDOWN state\n", ReInfo->_reName); - mode = ReRaceEventShutdown(); - if (mode & RM_NEXT_STEP) { - ReInfo->_reState = RE_STATE_EVOLUTION; - } else if (mode & RM_NEXT_RACE) { - ReInfo->_reState = RE_STATE_EVENT_INIT; - } - break; + case RE_STATE_EVENT_SHUTDOWN: + GfLogInfo("%s now in EVENT_SHUTDOWN state\n", ReInfo->_reName); + mode = ReRaceEventShutdown(); + if (mode & RM_NEXT_STEP) { + ReInfo->_reState = RE_STATE_EVOLUTION; + } else if (mode & RM_NEXT_RACE) { + ReInfo->_reState = RE_STATE_EVENT_INIT; + } + break; - case RE_STATE_SHUTDOWN: - GfLogInfo("%s now in SHUTDOWN state\n", ReInfo->_reName); - ReCleanupGeneticOptimisation(); - ReInfo->_reState = RE_STATE_RESULTS; - mode = RM_SYNC; - break; + case RE_STATE_SHUTDOWN: + GfLogInfo("%s now in SHUTDOWN state\n", ReInfo->_reName); + ReCleanupGeneticOptimisation(); + ReInfo->_reState = RE_STATE_RESULTS; + mode = RM_SYNC; + break; - case RE_STATE_RESULTS: - GfLogInfo("%s now in RESULTS state\n", ReInfo->_reName); - ReDisplayResults(); - ReInfo->_reState = RE_STATE_CLEANUP; - mode = RM_SYNC; - break; + case RE_STATE_RESULTS: + GfLogInfo("%s now in RESULTS state\n", ReInfo->_reName); + ReDisplayResults(); + ReInfo->_reState = RE_STATE_CLEANUP; + mode = RM_SYNC; + break; - case RE_STATE_CLEANUP: - GfLogInfo("%s now in CLEANUP state\n", ReInfo->_reName); - ReCleanupReInfo(); - // Back to the race manager menu - ReInfo->_reState = RE_STATE_WAITFORKEYPRESS; - mode = RM_SYNC; - break; + case RE_STATE_CLEANUP: + GfLogInfo("%s now in CLEANUP state\n", ReInfo->_reName); + ReCleanupReInfo(); + // Back to the race manager menu + ReInfo->_reState = RE_STATE_WAITFORKEYPRESS; + mode = RM_SYNC; + break; - case RE_STATE_WAITFORKEYPRESS: - GfLogInfo("%s now in WAITFORKEYPRESS state\n", ReInfo->_reName); - mode = ReWaitForKeyPress(); - if (mode & RM_NEXT_STEP){ - ReInfo->_reState = RE_STATE_CONFIG; - } else { - ReInfo->_reState = RE_STATE_WAITFORKEYPRESS; - } - mode = RM_SYNC; - break; + case RE_STATE_WAITFORKEYPRESS: + GfLogInfo("%s now in WAITFORKEYPRESS state\n", ReInfo->_reName); + mode = ReWaitForKeyPress(); + if (mode & RM_NEXT_STEP){ + ReInfo->_reState = RE_STATE_CONFIG; + } else { + ReInfo->_reState = RE_STATE_WAITFORKEYPRESS; + } + mode = RM_SYNC; + break; - case RE_STATE_ERROR: - // If this state is set, there was a serious error: - // i.e. no driver in the race (no one selected OR parameters out of range) - // Error messages are normally dumped in the game trace stream ! - // TODO: Define another screen showing the error messages instead of - // only having it in the console window! - GfLogInfo("%s now in ERROR state\n", ReInfo->_reName); - ReCleanupGeneticOptimisation(); - // Back to race manager menu - ReInfo->_reState = RE_STATE_CONFIG; - mode = RM_SYNC; - break; + case RE_STATE_ERROR: + // If this state is set, there was a serious error: + // i.e. no driver in the race (no one selected OR parameters out of range) + // Error messages are normally dumped in the game trace stream ! + // TODO: Define another screen showing the error messages instead of + // only having it in the console window! + GfLogInfo("%s now in ERROR state\n", ReInfo->_reName); + ReCleanupGeneticOptimisation(); + // Back to race manager menu + ReInfo->_reState = RE_STATE_CONFIG; + mode = RM_SYNC; + break; - case RE_STATE_EXIT: - // Exit the race engine. - mode = ReExit(); - break; - } + case RE_STATE_EXIT: + // Exit the race engine. + mode = ReExit(); + break; + } - if (mode & RM_ERROR) { - GfLogError("Race engine error (see above messages)\n"); - ReInfo->_reState = RE_STATE_ERROR; - mode = RM_SYNC; - } + if (mode & RM_ERROR) { + GfLogError("Race engine error (see above messages)\n"); + ReInfo->_reState = RE_STATE_ERROR; + mode = RM_SYNC; + } - //GfLogDebug("ReStateManage : New state 0x%X, %sing.\n", - // ReInfo->_reState, (mode & RM_SYNC) ? "loop" : "return"); - - } while (mode & RM_SYNC); + //GfLogDebug("ReStateManage : New state 0x%X, %sing.\n", + // ReInfo->_reState, (mode & RM_SYNC) ? "loop" : "return"); + + } while (mode & RM_SYNC); } // Change and Execute a New State void ReStateApply(void *pvState) { - ReInfo->_reState = (int)(long)pvState; + ReInfo->_reState = (int)(long)pvState; - ReStateManage(); + ReStateManage(); } diff --git a/src/tools/trackgen/main.cpp b/src/tools/trackgen/main.cpp index ff28a2393..51c2318df 100644 --- a/src/tools/trackgen/main.cpp +++ b/src/tools/trackgen/main.cpp @@ -17,8 +17,8 @@ * * ***************************************************************************/ -/** @file - +/** @file + @author Eric Espie @version $Id$ */ @@ -106,17 +106,17 @@ class Application : public GfApplication { public: - //! Constructor. - Application(); + //! Constructor. + Application(); //! Initialization. virtual void initialize(bool bLoggingEnabled, int argc = 0, char **argv = 0); //! Parse the command line options. - // TODO: Move to the GfApplication way of parsing options ? - bool parseOptions(); - - void generate(); + // TODO: Move to the GfApplication way of parsing options ? + bool parseOptions(); + + void generate(); }; //! Constructor. @@ -127,33 +127,33 @@ Application::Application() void Application::initialize(bool bLoggingEnabled, int argc, char **argv) { - // Base initialization first. - GfApplication::initialize(bLoggingEnabled, argc, argv); - - // Specific options. - registerOption("c", "category", /* nHasValue = */ true); - registerOption("n", "name", /* nHasValue = */ true); - registerOption("b", "bump", /* nHasValue = */ false); - registerOption("r", "raceline", /* nHasValue = */ false); - registerOption("B", "noborder", /* nHasValue = */ false); - registerOption("a", "all", /* nHasValue = */ false); - registerOption("z", "calc", /* nHasValue = */ false); - registerOption("s", "split", /* nHasValue = */ false); - registerOption("S", "splitall", /* nHasValue = */ false); - registerOption("E", "saveelev", /* nHasValue = */ true); - registerOption("H", "height4", /* nHasValue = */ true); + // Base initialization first. + GfApplication::initialize(bLoggingEnabled, argc, argv); + + // Specific options. + registerOption("c", "category", /* nHasValue = */ true); + registerOption("n", "name", /* nHasValue = */ true); + registerOption("b", "bump", /* nHasValue = */ false); + registerOption("r", "raceline", /* nHasValue = */ false); + registerOption("B", "noborder", /* nHasValue = */ false); + registerOption("a", "all", /* nHasValue = */ false); + registerOption("z", "calc", /* nHasValue = */ false); + registerOption("s", "split", /* nHasValue = */ false); + registerOption("S", "splitall", /* nHasValue = */ false); + registerOption("E", "saveelev", /* nHasValue = */ true); + registerOption("H", "height4", /* nHasValue = */ true); + + // Help on specific options. + addOptionsHelpSyntaxLine("-c|--category -n|--name [-b|bump] [-r|--raceline] [-B|--noborder]"); + addOptionsHelpSyntaxLine("[-a|--all] [-z|--calc] [-s|split] [-S|splitall]"); + addOptionsHelpSyntaxLine("[-E|--saveelev <#ef> [-H|height4 <#hs>]]"); - // Help on specific options. - addOptionsHelpSyntaxLine("-c|--category -n|--name [-b|bump] [-r|--raceline] [-B|--noborder]"); - addOptionsHelpSyntaxLine("[-a|--all] [-z|--calc] [-s|split] [-S|splitall]"); - addOptionsHelpSyntaxLine("[-E|--saveelev <#ef> [-H|height4 <#hs>]]"); - addOptionsHelpExplainLine(" : track category (road, speedway, dirt...)"); addOptionsHelpExplainLine(" : track name"); addOptionsHelpExplainLine("bump : draw bump track"); - addOptionsHelpExplainLine("raceline : draw raceline track\n"); + addOptionsHelpExplainLine("raceline : draw raceline track\n"); addOptionsHelpExplainLine("noborder : don't use terrain border " - "(relief supplied int clockwise, ext CC)"); + "(relief supplied int clockwise, ext CC)"); addOptionsHelpExplainLine("all : draw all (default is track only)"); addOptionsHelpExplainLine("calc : only calculate track parameters and exit"); addOptionsHelpExplainLine("split : split the track and the terrain"); @@ -170,228 +170,237 @@ void Application::initialize(bool bLoggingEnabled, int argc, char **argv) // Parse the command line options. bool Application::parseOptions() { - // Parse command line for registered options, and interpret standard ones. - if (!GfApplication::parseOptions()) - return false; + // Parse command line for registered options, and interpret standard ones. + if (!GfApplication::parseOptions()) + return false; - // Then interpret the specific ones. - TrackName = NULL; - TrackCategory = NULL; + // Then interpret the specific ones. + TrackName = NULL; + TrackCategory = NULL; TrackOnly = 1; - JustCalculate = 0; + JustCalculate = 0; MergeAll = 1; MergeTerrain = 1; DoSaveElevation = -1; - std::list