diff --git a/src/drivers/simplix/simplix_mpa1/1/skill.xml b/src/drivers/simplix/simplix_mpa1/1/skill.xml
index 1be852c2..f80ccaaf 100644
--- a/src/drivers/simplix/simplix_mpa1/1/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/1/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/2/skill.xml b/src/drivers/simplix/simplix_mpa1/2/skill.xml
index 1be852c2..2564685a 100644
--- a/src/drivers/simplix/simplix_mpa1/2/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/2/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/3/skill.xml b/src/drivers/simplix/simplix_mpa1/3/skill.xml
index 1be852c2..dc66821a 100644
--- a/src/drivers/simplix/simplix_mpa1/3/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/3/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/4/skill.xml b/src/drivers/simplix/simplix_mpa1/4/skill.xml
index 1be852c2..2a7739cb 100644
--- a/src/drivers/simplix/simplix_mpa1/4/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/4/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/5/skill.xml b/src/drivers/simplix/simplix_mpa1/5/skill.xml
index 1be852c2..6ed5c076 100644
--- a/src/drivers/simplix/simplix_mpa1/5/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/5/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/6/skill.xml b/src/drivers/simplix/simplix_mpa1/6/skill.xml
index 1be852c2..08e05ac7 100644
--- a/src/drivers/simplix/simplix_mpa1/6/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/6/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/7/skill.xml b/src/drivers/simplix/simplix_mpa1/7/skill.xml
index 1be852c2..af762172 100644
--- a/src/drivers/simplix/simplix_mpa1/7/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/7/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/8/skill.xml b/src/drivers/simplix/simplix_mpa1/8/skill.xml
index 1be852c2..019ade1c 100644
--- a/src/drivers/simplix/simplix_mpa1/8/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/8/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/simplix_mpa1/9/skill.xml b/src/drivers/simplix/simplix_mpa1/9/skill.xml
index 1be852c2..b4aaf39c 100644
--- a/src/drivers/simplix/simplix_mpa1/9/skill.xml
+++ b/src/drivers/simplix/simplix_mpa1/9/skill.xml
@@ -12,7 +12,7 @@
-
+
diff --git a/src/drivers/simplix/src/unitclothoid.cpp b/src/drivers/simplix/src/unitclothoid.cpp
index 5d5766db..2f9debac 100644
--- a/src/drivers/simplix/src/unitclothoid.cpp
+++ b/src/drivers/simplix/src/unitclothoid.cpp
@@ -672,6 +672,17 @@ bool TClothoidLane::SaveToFile(const char* Filename)
}
//==========================================================================*
+//==========================================================================*
+// Called for every track change or new race.
+//--------------------------------------------------------------------------*
+int TClothoidLane::GetWeather()
+{
+ const TSection& Sec = (*oTrack)[0];
+ tTrackSeg* Seg = Sec.Seg;
+ return (int) (100000 * Seg->surface->kFriction);
+};
+//==========================================================================*
+
//==========================================================================*
// Save path points
//--------------------------------------------------------------------------*
@@ -684,12 +695,26 @@ bool TClothoidLane::LoadPointsFromFile(const char* TrackLoad)
int K;
fread(&K,sizeof(int),1,F);
if (K > 0)
+ {
+ fclose(F);
return false;
+ }
int Version;
fread(&Version,sizeof(int),1,F);
- if (Version < 110)
+ if (Version < 112)
+ {
+ fclose(F);
return false;
+ }
+
+ int Weather;
+ fread(&Weather,sizeof(int),1,F);
+ if (Weather != GetWeather())
+ {
+ fclose(F);
+ return false;
+ }
int N;
fread(&N,sizeof(int),1,F);
@@ -717,9 +742,12 @@ void TClothoidLane::SavePointsToFile(const char* TrackLoad)
int K = 0;
fwrite(&K,sizeof(int),1,F);
- int Version = 111;
+ int Version = 112;
fwrite(&Version,sizeof(int),1,F);
+ int Weather = GetWeather();
+ fwrite(&Weather,sizeof(int),1,F);
+
int N = oTrack->Count();
fwrite(&N,sizeof(int),1,F);
diff --git a/src/drivers/simplix/src/unitclothoid.h b/src/drivers/simplix/src/unitclothoid.h
index fbe4e570..58a844ef 100644
--- a/src/drivers/simplix/src/unitclothoid.h
+++ b/src/drivers/simplix/src/unitclothoid.h
@@ -2,17 +2,17 @@
// unitclothoid.h
//--------------------------------------------------------------------------*
// TORCS: "The Open Racing Car Simulator"
-// A robot for Speed Dreams Version 1.4.0
+// A robot for Speed Dreams Version 1.4.0/2.X
//--------------------------------------------------------------------------*
// Lane clothoide like
// Fahrspur clothoidenähnlich
//
// File : unitclothoid.h
// Created : 2007.11.17
-// Last changed : 2009.02.14
-// Copyright : © 2007-2009 Wolf-Dieter Beelitz
+// Last changed : 2010.10.17
+// Copyright : © 2007-2010 Wolf-Dieter Beelitz
// eMail : wdb@wdbee.de
-// Version : 2.00.000
+// Version : 3.00.000
//--------------------------------------------------------------------------*
// Ein erweiterter TORCS-Roboters
//--------------------------------------------------------------------------*
@@ -164,6 +164,7 @@ class TClothoidLane : public TLane
int NIterations,
double BumpMod /*,
bool Smooth*/);
+ int GetWeather();
};
//==========================================================================*
diff --git a/src/drivers/simplix/src/unitdriver.cpp b/src/drivers/simplix/src/unitdriver.cpp
index 8325759e..9639ec1b 100644
--- a/src/drivers/simplix/src/unitdriver.cpp
+++ b/src/drivers/simplix/src/unitdriver.cpp
@@ -94,6 +94,7 @@ const char* TDriver::DEFAULTCARTYPE = "car1-trb1";// Default car type
bool TDriver::AdvancedParameters = false; // Advanced parameters
bool TDriver::UseOldSkilling = false; // Use old skilling
bool TDriver::UseSCSkilling = false; // Use supercar skilling
+bool TDriver::UseMPA1Skilling = false; // Use mpa1 car skilling
bool TDriver::UseBrakeLimit = false; // Use brake limit
bool TDriver::UseGPBrakeLimit = false; // Use brake limit for GP36
float TDriver::BrakeLimit = -6; // Brake limit
@@ -449,231 +450,10 @@ void TDriver::SetBotName(void* RobotSettings, char* Value)
//==========================================================================*
//==========================================================================*
-// Called for every track change or new race.
+// Adjust brakes
//--------------------------------------------------------------------------*
-void TDriver::InitTrack
- (PTrack Track, PCarHandle CarHandle,
- PCarSettings *CarSettings, PSituation Situation)
+void TDriver::AdjustBrakes(PCarHandle Handle)
{
- GfOut("#\n\n\n#TDriver::InitTrack >>> \n\n\n");
-
- oTrack = Track; // save pointers
-#ifdef SPEED_DREAMS
- if (TrackLength < 2000)
- RtTeamManagerLaps(3);
- else if (TrackLength < 3000)
- RtTeamManagerLaps(2);
-#else
-#endif
-
- oSituation = Situation;
-
- oSkillGlobal = oSkill = oDecelAdjustPerc = oDriverAggression = 0.0;
-
- // Initialize race type array
- const char* RaceType[] =
- {"practice", "qualify", "race"};
-
- // Initialize the base param path
- const char* BaseParamPath = TDriver::ROBOT_DIR;
- const char* PathFilename = PathFilenameBuffer;
-
- // Global skilling from Andrew Sumner ...
- // Check if skilling is enabled
- int SkillEnabled = 0;
- snprintf(PathFilenameBuffer, BUFLEN, // In default.xml
- "%s/default.xml", BaseParamPath); // of the robot
- GfOut("#PathFilename: %s\n", PathFilenameBuffer); // itself
- void* SkillHandle = GfParmReadFile
- (PathFilename, GFPARM_RMODE_REREAD);
- if (SkillHandle)
- {
- SkillEnabled = (int) MAX(0,MIN(1,(int) GfParmGetNum(SkillHandle,
- "skilling", "enable", (char *) NULL, 0.0)));
- GfOut("#SkillEnabled %d\n",SkillEnabled);
- oTeamEnabled =
- GfParmGetNum(SkillHandle,"team","enable",0,(float) oTeamEnabled) != 0;
- GfOut("#oTeamEnabled %d\n",oTeamEnabled);
- }
-
- if (SkillEnabled > 0) // If skilling is enabled
- { // Get Skill level
- oSkilling = true; // of TORCS-Installation
- GfOut("#Skilling: On\n");
-
- void* SkillHandle = NULL;
-
- snprintf(PathFilenameBuffer, BUFLEN,
- "%sconfig/raceman/extra/skill.xml",GetLocalDir());
- GfOut("#skill.xml: %s\n", PathFilename);
- SkillHandle = GfParmReadFile
- (PathFilename, GFPARM_RMODE_REREAD);
- if (SkillHandle)
- {
- oSkillGlobal = MAX(0.0,MIN(10.0,GfParmGetNum(SkillHandle,
- "skill", "level", (char *) NULL, 10.0)));
- GfOut("#LocalDir: SkillGlobal: %g\n", oSkillGlobal);
- }
- else
- {
- snprintf(PathFilenameBuffer, BUFLEN,
- "%sconfig/raceman/extra/skill.xml",GetDataDir());
- GfOut("#skill.xml: %s\n", PathFilename);
- SkillHandle = GfParmReadFile
- (PathFilename, GFPARM_RMODE_REREAD);
- if (SkillHandle)
- {
- oSkillGlobal = MAX(0.0,MIN(10.0,GfParmGetNum(SkillHandle,
- "skill", "level", (char *) NULL, 10.0)));
- GfOut("#DataDir: SkillGlobal: %g\n", oSkillGlobal);
- }
- }
-
- // Get individual skilling
- //int SkillEnabled = 0;
- snprintf(PathFilenameBuffer,BUFLEN,"%s/%d/skill.xml",
- BaseParamPath,oIndex);
- GfOut("#PathFilename: %s\n", PathFilenameBuffer); // itself
- SkillHandle = GfParmReadFile
- (PathFilename, GFPARM_RMODE_REREAD);
- if (SkillHandle)
- {
- oSkillDriver = GfParmGetNum(SkillHandle,"skill","level",0,0.0);
- oSkillDriver = MIN(1.0, MAX(0.0, oSkillDriver));
- GfOut("#oSkillDriver: %g\n", oSkillDriver);
-
- oDriverAggression =
- GfParmGetNum(SkillHandle, "skill", "aggression", (char *)NULL, 0.0);
- GfOut("#oDriverAggression: %g\n", oDriverAggression);
- }
- }
- else
- {
- oSkilling = false;
- GfOut("#Skilling: Off\n");
- }
- // ... Global skilling from Andrew Sumner
-
- // Get the name of the track
- strncpy(TrackNameBuffer, // Copy name of track file
- strrchr(oTrack->filename, '/') + 1, // from path and filename
- sizeof(TrackNameBuffer)); // regarding length of buffer
- *strrchr(TrackNameBuffer, '.') = '\0'; // Truncate at point
- oTrackName = TrackNameBuffer; // Set pointer to buffer
-
- // Read/merge car parms
- // First all params out of the common files
- oMaxFuel = GfParmGetNum(CarHandle // Maximal möglicher
- , SECT_CAR, PRM_TANK // Tankinhalt
- , (char*) NULL, 100.0);
- GfOut("#oMaxFuel (TORCS) = %.1f\n",oMaxFuel);
-
- oMaxPressure = GfParmGetNum(CarHandle // Maximal möglicher
- , "Brake System", MAXPRESSURE // Bremsdruck
- , (char*) NULL, (float) oMaxPressure);
- GfOut("#oMaxPressure = %.1f\n",oMaxPressure);
-
- oBrakeScale *= MAX(1.0,INITIAL_BRAKE_PRESSURE / oMaxPressure);
- GfOut("#oBrakeScale = %.3f\n",oBrakeScale);
- oBrakeForceMax *= oBrakeScale/INITIAL_BRAKE_SCALE;
- GfOut("#oBrakeForceMax = %.3f\n",oBrakeForceMax);
-
- // Next Params out of the own files
- PCarHandle Handle = NULL; // Start with an "empty file"
- char Buf[1024]; // Multi purpose buffer
-
- // Default params for car type (e.g. .../ROBOT_DIR/sc-petrol/default.xml)
- snprintf(Buf,sizeof(Buf),"%s/%s/default.xml",
- BaseParamPath,oCarType);
- GfOut("#Default params for car type: %s\n", Buf);
- Handle = TUtils::MergeParamFile(Handle,Buf);
-
- snprintf(TrackLoadBuffer,sizeof(TrackLoadBuffer),"%s/tracks/%s.trk",
- BaseParamPath,oTrackName);
- oTrackLoad = TrackLoadBuffer; // Set pointer to buffer
- snprintf(TrackLoadQualifyBuffer,sizeof(TrackLoadQualifyBuffer),"%s/tracks/%s.trq",
- BaseParamPath,oTrackName);
- oTrackLoadQualify = TrackLoadQualifyBuffer; // Set pointer to buffer
- snprintf(TrackLoadLeftBuffer,sizeof(TrackLoadLeftBuffer),"%s/tracks/%s.trl",
- BaseParamPath,oTrackName);
- oTrackLoadLeft = TrackLoadLeftBuffer; // Set pointer to buffer
- snprintf(TrackLoadRightBuffer,sizeof(TrackLoadRightBuffer),"%s/tracks/%s.trr",
- BaseParamPath,oTrackName);
- oTrackLoadRight = TrackLoadRightBuffer; // Set pointer to buffer
- snprintf(PitLoadBuffer,sizeof(PitLoadBuffer),"%s/tracks/%s.tpk",
- BaseParamPath,oTrackName);
- oPitLoad[0] = PitLoadBuffer; // Set pointer to buffer
- snprintf(PitLoadLeftBuffer,sizeof(PitLoadLeftBuffer),"%s/tracks/%s.tpl",
- BaseParamPath,oTrackName);
- oPitLoad[1] = PitLoadLeftBuffer; // Set pointer to buffer
- snprintf(PitLoadRightBuffer,sizeof(PitLoadRightBuffer),"%s/tracks/%s.tpr",
- BaseParamPath,oTrackName);
- oPitLoad[2] = PitLoadRightBuffer; // Set pointer to buffer
-
- // Override params for track (Pitting)
- snprintf(Buf,sizeof(Buf),"%s/tracks/%s.xml",
- BaseParamPath,oTrackName);
- Handle = TUtils::MergeParamFile(Handle,Buf);
- double ScaleBrake = GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SCALE__BRAKE,NULL,0.80f);
- double ScaleMu = GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SCALE__MU,NULL,0.95f);
-
- // Override params for car type with params of track
- snprintf(Buf,sizeof(Buf),"%s/%s/%s.xml",
- BaseParamPath,oCarType,oTrackName);
- Handle = TUtils::MergeParamFile(Handle,Buf);
-
- // Override params for car type on track with params of specific race type
- snprintf(Buf,sizeof(Buf),"%s/%s/%s-%s.xml",
- BaseParamPath,oCarType,oTrackName,RaceType[oSituation->_raceType]);
- Handle = TUtils::MergeParamFile(Handle,Buf);
-
- // Override params for car type on track with driver on track
- snprintf(Buf,sizeof(Buf),"%s/%d/%s.xml",
- BaseParamPath,oIndex,oTrackName);
-// Handle = TUtils::MergeParamFile(Handle,Buf);
-
- // Override params for driver on track with params of specific race type
- snprintf(Buf,sizeof(Buf),"%s/%d/%s-%s.xml",
- BaseParamPath,oIndex,oTrackName,RaceType[oSituation->_raceType]);
- Handle = TUtils::MergeParamFile(Handle,Buf);
-
- // Setup the car param handle to be returned
- *CarSettings = Handle;
-
- // Get the private parameters now.
- TDriver::LengthMargin =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_LENGTH_MARGIN,0,LENGTH_MARGIN);
- GfOut("#LengthMargin %.2f\n",TDriver::LengthMargin);
-
- // Check test flag:
- const char* ForceLane = GfParmGetStr(Handle,
- TDriver::SECT_PRIV,PRV_FORCE_LANE,"F");
-
- if (strcmp(ForceLane,"L") == 0)
- oTestLane = -1;
- else if (strcmp(ForceLane,"R") == 0)
- oTestLane = 1;
- else
- oTestLane = 0;
-
- int TestQualification =
- (int) GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_QUALIFICATION,0,0);
- if ((oSituation->_raceType == RM_TYPE_QUALIF)
- || (TestQualification > 0))
- {
- if ((oSituation->_raceType == RM_TYPE_PRACTICE)
- || (oSituation->_raceType == RM_TYPE_QUALIF))
- {
- Qualification = true;
- GfOut("#Qualification = True\n");
- NBRRL = 1;
- }
- }
-
- // Get car's length
- Param.Fix.oLength =
- GfParmGetNum(Handle,SECT_CAR,PRM_LEN,0,4.5);
-
if ((TDriver::UseBrakeLimit) || (TDriver::UseGPBrakeLimit))
{
TDriver::BrakeLimit =
@@ -692,71 +472,14 @@ void TDriver::InitTrack
GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SPEED_LIMIT_SCALE,0,(float) TDriver::SpeedLimitScale);
GfOut("#SpeedLimitScale %g\n",TDriver::SpeedLimitScale);
}
+};
+//==========================================================================*
- // Adjust pitting ...
- Param.Pit.oUseFirstPit = (int)
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_USE_FIRST,0,1);
- GfOut("#oUseFirstPit %d\n",Param.Pit.oUseFirstPit);
-
- Param.Pit.oUseSmoothPit = (int)
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_USE_SMOOTH,0,0);
- GfOut("#oUseSmoothPit %d\n",Param.Pit.oUseSmoothPit);
-
- Param.Pit.oLaneEntryOffset =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PITLANE_ENTRY,0,3.0f);
- GfOut("#oLaneEntryOffset %g\n",Param.Pit.oLaneEntryOffset);
-
- Param.Pit.oLaneExitOffset =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PITLANE_EXIT,0,5.0f);
- GfOut("#oLaneExitOffset %g\n",Param.Pit.oLaneExitOffset);
-
- Param.Pit.oEntryLong =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_ENTRY_LONG,0,0);
- GfOut("#oEntryLong %g\n",Param.Pit.oEntryLong);
-
- Param.Pit.oExitLong =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_EXIT_LONG,0,0);
- GfOut("#oExitLong %g\n",Param.Pit.oExitLong);
-
- Param.Pit.oExitLength =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_EXIT_LEN,0,0);
- GfOut("#oExitLength %g\n",Param.Pit.oExitLength);
-
- Param.Pit.oLatOffset =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_LAT_OFFS,0,0.0);
- GfOut("#Lateral Pit Offset %f\n",Param.Pit.oLatOffset);
-
- Param.Pit.oLongOffset =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_LONG_OFFS,0,0.0);
- GfOut("#Longitudinal Pit Offset %f\n",Param.Pit.oLongOffset);
-
- Param.oCarParam.oScaleBrakePit =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_SCALE_BRAKE,0,
- (float) MIN(1.0,Param.oCarParam.oScaleBrake));
- GfOut("#ScaleBrakePit %g\n",Param.oCarParam.oScaleBrakePit);
-
- Param.Pit.oStoppingDist =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_STOP_DIST,0,1.5);
- GfOut("#oStoppingDist %g\n",Param.Pit.oStoppingDist);
-
- Param.Fix.oPitBrakeDist =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_BRAKE_DIST,0,150.0);
- GfOut("#oPitBrakeDist %g\n",Param.Fix.oPitBrakeDist);
-
- Param.Fix.oPitMinEntrySpeed =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_MINENTRYSPEED,0,24.5);
- GfOut("#oPitMinEntrySpeed %g\n",Param.Fix.oPitMinEntrySpeed);
-
- Param.Fix.oPitMinExitSpeed =
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_MINEXITSPEED,0,24.5);
- GfOut("#oPitMinExitSpeed %g\n",Param.Fix.oPitMinExitSpeed);
-
- oTestPitStop = (int)
- GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_TEST_STOP,0,0);
- GfOut("#TestPitStop %d\n",oTestPitStop);
- // ... Adjust pitting
-
- // Adjust driving ...
+//==========================================================================*
+// Adjust driving
+//--------------------------------------------------------------------------*
+void TDriver::AdjustDriving(PCarHandle Handle, double ScaleBrake, double ScaleMu)
+{
Param.oCarParam.oScaleBrake = ScaleBrake *
GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SCALE_BRAKE,NULL,0.85f);
if(Qualification)
@@ -919,7 +642,84 @@ void TDriver::InitTrack
GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_TEAM_ENABLE,0,(float)oTeamEnabled) != 0;
GfOut("#oTeamEnabled %d\n",oTeamEnabled);
// ... Adjust driving
+};
+//==========================================================================*
+//==========================================================================*
+// Adjust pitting
+//--------------------------------------------------------------------------*
+void TDriver::AdjustPitting(PCarHandle Handle)
+{
+ // Adjust pitting ...
+ Param.Pit.oUseFirstPit = (int)
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_USE_FIRST,0,1);
+ GfOut("#oUseFirstPit %d\n",Param.Pit.oUseFirstPit);
+
+ Param.Pit.oUseSmoothPit = (int)
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_USE_SMOOTH,0,0);
+ GfOut("#oUseSmoothPit %d\n",Param.Pit.oUseSmoothPit);
+
+ Param.Pit.oLaneEntryOffset =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PITLANE_ENTRY,0,3.0f);
+ GfOut("#oLaneEntryOffset %g\n",Param.Pit.oLaneEntryOffset);
+
+ Param.Pit.oLaneExitOffset =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PITLANE_EXIT,0,5.0f);
+ GfOut("#oLaneExitOffset %g\n",Param.Pit.oLaneExitOffset);
+
+ Param.Pit.oEntryLong =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_ENTRY_LONG,0,0);
+ GfOut("#oEntryLong %g\n",Param.Pit.oEntryLong);
+
+ Param.Pit.oExitLong =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_EXIT_LONG,0,0);
+ GfOut("#oExitLong %g\n",Param.Pit.oExitLong);
+
+ Param.Pit.oExitLength =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_EXIT_LEN,0,0);
+ GfOut("#oExitLength %g\n",Param.Pit.oExitLength);
+
+ Param.Pit.oLatOffset =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_LAT_OFFS,0,0.0);
+ GfOut("#Lateral Pit Offset %f\n",Param.Pit.oLatOffset);
+
+ Param.Pit.oLongOffset =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_LONG_OFFS,0,0.0);
+ GfOut("#Longitudinal Pit Offset %f\n",Param.Pit.oLongOffset);
+
+ Param.oCarParam.oScaleBrakePit =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_SCALE_BRAKE,0,
+ (float) MIN(1.0,Param.oCarParam.oScaleBrake));
+ GfOut("#ScaleBrakePit %g\n",Param.oCarParam.oScaleBrakePit);
+
+ Param.Pit.oStoppingDist =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_STOP_DIST,0,1.5);
+ GfOut("#oStoppingDist %g\n",Param.Pit.oStoppingDist);
+
+ Param.Fix.oPitBrakeDist =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_BRAKE_DIST,0,150.0);
+ GfOut("#oPitBrakeDist %g\n",Param.Fix.oPitBrakeDist);
+
+ Param.Fix.oPitMinEntrySpeed =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_MINENTRYSPEED,0,24.5);
+ GfOut("#oPitMinEntrySpeed %g\n",Param.Fix.oPitMinEntrySpeed);
+
+ Param.Fix.oPitMinExitSpeed =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_MINEXITSPEED,0,24.5);
+ GfOut("#oPitMinExitSpeed %g\n",Param.Fix.oPitMinExitSpeed);
+
+ oTestPitStop = (int)
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_PIT_TEST_STOP,0,0);
+ GfOut("#TestPitStop %d\n",oTestPitStop);
+ // ... Adjust pitting
+};
+//==========================================================================*
+
+//==========================================================================*
+// Adjust skilling depending on the car types to drive
+//--------------------------------------------------------------------------*
+void TDriver::AdjustSkilling(PCarHandle Handle)
+{
// Adjust skilling ...
if ((oSkill < 0) || (!oSkilling))
{
@@ -938,32 +738,7 @@ void TDriver::InitTrack
oLookAhead = oLookAhead / (1+oSkillGlobal/24);
oLookAheadFactor = oLookAheadFactor / (1+oSkillGlobal/24);
- if (UseOldSkilling)
- {
- // Scaling to match hymies
- oSkill =
- -0.0000455 * oSkillGlobal*oSkillGlobal*oSkillGlobal*oSkillGlobal*oSkillGlobal
- +0.0014 * oSkillGlobal*oSkillGlobal*oSkillGlobal*oSkillGlobal
- -0.0145 * oSkillGlobal*oSkillGlobal*oSkillGlobal
- +0.0512 * oSkillGlobal*oSkillGlobal
- +0.0978 * oSkillGlobal
- + oSkillOffset + oSkillDriver;
- }
- else if (UseSCSkilling)
- {
- // Scaling to match usr_sc
- oSkillScale = oSkillScale/50.0;
- oSkillDriver = oSkillDriver / ((50.0 - oSkillGlobal)/40.0);
- oSkill = oSkillScale * (oSkillGlobal + oSkillDriver * 2) * (1.0 + oSkillDriver) + oSkillOffset;
- }
- else
- {
- // Scaling
- oSkillScale = oSkillScale/50.0;
- oSkillDriver = oSkillDriver / (5.0 * ((50.0 - oSkillGlobal)/40.0));
- oSkill = oSkillScale * (oSkillGlobal + oSkillDriver * 2) * (1.0 + oSkillDriver) + oSkillOffset;
- oSkillMax = oSkillScale * 24 + oSkillOffset;
- }
+ CalcSkilling();
if (Qualification)
{
@@ -976,6 +751,249 @@ void TDriver::InitTrack
oSkill,oSkillGlobal,oSkillDriver,oLookAhead,oLookAheadFactor,Param.Tmp.oSkill);
}
// ... Adjust skilling
+};
+//==========================================================================*
+
+//==========================================================================*
+// Get skilling parameters
+//--------------------------------------------------------------------------*
+void TDriver::GetSkillingParameters
+ (const char* BaseParamPath, const char* PathFilename)
+{
+ // Global skilling from Andrew Sumner ...
+ // Check if skilling is enabled
+ int SkillEnabled = 0;
+ snprintf(PathFilenameBuffer, BUFLEN, // In default.xml
+ "%s/default.xml", BaseParamPath); // of the robot
+ GfOut("#PathFilename: %s\n", PathFilenameBuffer); // itself
+ void* SkillHandle = GfParmReadFile
+ (PathFilename, GFPARM_RMODE_REREAD);
+ if (SkillHandle)
+ {
+ SkillEnabled = (int) MAX(0,MIN(1,(int) GfParmGetNum(SkillHandle,
+ "skilling", "enable", (char *) NULL, 0.0)));
+ GfOut("#SkillEnabled %d\n",SkillEnabled);
+ oTeamEnabled =
+ GfParmGetNum(SkillHandle,"team","enable",0,(float) oTeamEnabled) != 0;
+ GfOut("#oTeamEnabled %d\n",oTeamEnabled);
+ }
+
+ if (SkillEnabled > 0) // If skilling is enabled
+ { // Get Skill level
+ oSkilling = true; // of TORCS-Installation
+ GfOut("#Skilling: On\n");
+
+ void* SkillHandle = NULL;
+
+ snprintf(PathFilenameBuffer, BUFLEN,
+ "%sconfig/raceman/extra/skill.xml",GetLocalDir());
+ GfOut("#skill.xml: %s\n", PathFilename);
+ SkillHandle = GfParmReadFile
+ (PathFilename, GFPARM_RMODE_REREAD);
+ if (SkillHandle)
+ {
+ oSkillGlobal = MAX(0.0,MIN(10.0,GfParmGetNum(SkillHandle,
+ "skill", "level", (char *) NULL, 10.0)));
+ GfOut("#LocalDir: SkillGlobal: %g\n", oSkillGlobal);
+ }
+ else
+ {
+ snprintf(PathFilenameBuffer, BUFLEN,
+ "%sconfig/raceman/extra/skill.xml",GetDataDir());
+ GfOut("#skill.xml: %s\n", PathFilename);
+ SkillHandle = GfParmReadFile
+ (PathFilename, GFPARM_RMODE_REREAD);
+ if (SkillHandle)
+ {
+ oSkillGlobal = MAX(0.0,MIN(10.0,GfParmGetNum(SkillHandle,
+ "skill", "level", (char *) NULL, 10.0)));
+ GfOut("#DataDir: SkillGlobal: %g\n", oSkillGlobal);
+ }
+ }
+
+ // Get individual skilling
+ //int SkillEnabled = 0;
+ snprintf(PathFilenameBuffer,BUFLEN,"%s/%d/skill.xml",
+ BaseParamPath,oIndex);
+ GfOut("#PathFilename: %s\n", PathFilenameBuffer); // itself
+ SkillHandle = GfParmReadFile
+ (PathFilename, GFPARM_RMODE_REREAD);
+ if (SkillHandle)
+ {
+ oSkillDriver = GfParmGetNum(SkillHandle,"skill","level",0,0.0);
+ oSkillDriver = MIN(1.0, MAX(0.0, oSkillDriver));
+ GfOut("#oSkillDriver: %g\n", oSkillDriver);
+
+ oDriverAggression =
+ GfParmGetNum(SkillHandle, "skill", "aggression", (char *)NULL, 0.0);
+ GfOut("#oDriverAggression: %g\n", oDriverAggression);
+ }
+ }
+ else
+ {
+ oSkilling = false;
+ GfOut("#Skilling: Off\n");
+ }
+ // ... Global skilling from Andrew Sumner
+};
+//==========================================================================*
+
+//==========================================================================*
+// Called for every track change or new race.
+//--------------------------------------------------------------------------*
+void TDriver::InitTrack
+ (PTrack Track, PCarHandle CarHandle,
+ PCarSettings *CarSettings, PSituation Situation)
+{
+ GfOut("#\n\n\n#TDriver::InitTrack >>> \n\n\n");
+
+ oTrack = Track; // save pointers
+#ifdef SPEED_DREAMS
+ if (TrackLength < 2000)
+ RtTeamManagerLaps(3);
+ else if (TrackLength < 3000)
+ RtTeamManagerLaps(2);
+#else
+#endif
+
+ oSituation = Situation;
+
+ oSkillGlobal = oSkill = oDecelAdjustPerc = oDriverAggression = 0.0;
+
+ // Initialize race type array
+ const char* RaceType[] =
+ {"practice", "qualify", "race"};
+
+ // Initialize the base param path
+ const char* BaseParamPath = TDriver::ROBOT_DIR;
+ const char* PathFilename = PathFilenameBuffer;
+
+ GetSkillingParameters(BaseParamPath,PathFilename);
+
+ // Get the name of the track
+ strncpy(TrackNameBuffer, // Copy name of track file
+ strrchr(oTrack->filename, '/') + 1, // from path and filename
+ sizeof(TrackNameBuffer)); // regarding length of buffer
+ *strrchr(TrackNameBuffer, '.') = '\0'; // Truncate at point
+ oTrackName = TrackNameBuffer; // Set pointer to buffer
+
+ // Read/merge car parms
+ // First all params out of the common files
+ oMaxFuel = GfParmGetNum(CarHandle // Maximal möglicher
+ , SECT_CAR, PRM_TANK // Tankinhalt
+ , (char*) NULL, 100.0);
+ GfOut("#oMaxFuel (TORCS) = %.1f\n",oMaxFuel);
+
+ oMaxPressure = GfParmGetNum(CarHandle // Maximal möglicher
+ , "Brake System", MAXPRESSURE // Bremsdruck
+ , (char*) NULL, (float) oMaxPressure);
+ GfOut("#oMaxPressure = %.1f\n",oMaxPressure);
+
+ oBrakeScale *= MAX(1.0,INITIAL_BRAKE_PRESSURE / oMaxPressure);
+ GfOut("#oBrakeScale = %.3f\n",oBrakeScale);
+ oBrakeForceMax *= oBrakeScale/INITIAL_BRAKE_SCALE;
+ GfOut("#oBrakeForceMax = %.3f\n",oBrakeForceMax);
+
+ // Next Params out of the own files
+ PCarHandle Handle = NULL; // Start with an "empty file"
+ char Buf[1024]; // Multi purpose buffer
+
+ // Default params for car type (e.g. .../ROBOT_DIR/sc-petrol/default.xml)
+ snprintf(Buf,sizeof(Buf),"%s/%s/default.xml",
+ BaseParamPath,oCarType);
+ GfOut("#Default params for car type: %s\n", Buf);
+ Handle = TUtils::MergeParamFile(Handle,Buf);
+
+ snprintf(TrackLoadBuffer,sizeof(TrackLoadBuffer),"%s/tracks/%s.trk",
+ BaseParamPath,oTrackName);
+ oTrackLoad = TrackLoadBuffer; // Set pointer to buffer
+ snprintf(TrackLoadQualifyBuffer,sizeof(TrackLoadQualifyBuffer),"%s/tracks/%s.trq",
+ BaseParamPath,oTrackName);
+ oTrackLoadQualify = TrackLoadQualifyBuffer; // Set pointer to buffer
+ snprintf(TrackLoadLeftBuffer,sizeof(TrackLoadLeftBuffer),"%s/tracks/%s.trl",
+ BaseParamPath,oTrackName);
+ oTrackLoadLeft = TrackLoadLeftBuffer; // Set pointer to buffer
+ snprintf(TrackLoadRightBuffer,sizeof(TrackLoadRightBuffer),"%s/tracks/%s.trr",
+ BaseParamPath,oTrackName);
+ oTrackLoadRight = TrackLoadRightBuffer; // Set pointer to buffer
+ snprintf(PitLoadBuffer,sizeof(PitLoadBuffer),"%s/tracks/%s.tpk",
+ BaseParamPath,oTrackName);
+ oPitLoad[0] = PitLoadBuffer; // Set pointer to buffer
+ snprintf(PitLoadLeftBuffer,sizeof(PitLoadLeftBuffer),"%s/tracks/%s.tpl",
+ BaseParamPath,oTrackName);
+ oPitLoad[1] = PitLoadLeftBuffer; // Set pointer to buffer
+ snprintf(PitLoadRightBuffer,sizeof(PitLoadRightBuffer),"%s/tracks/%s.tpr",
+ BaseParamPath,oTrackName);
+ oPitLoad[2] = PitLoadRightBuffer; // Set pointer to buffer
+
+ // Override params for track (Pitting)
+ snprintf(Buf,sizeof(Buf),"%s/tracks/%s.xml",
+ BaseParamPath,oTrackName);
+ Handle = TUtils::MergeParamFile(Handle,Buf);
+ double ScaleBrake = GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SCALE__BRAKE,NULL,0.80f);
+ double ScaleMu = GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_SCALE__MU,NULL,0.95f);
+
+ // Override params for car type with params of track
+ snprintf(Buf,sizeof(Buf),"%s/%s/%s.xml",
+ BaseParamPath,oCarType,oTrackName);
+ Handle = TUtils::MergeParamFile(Handle,Buf);
+
+ // Override params for car type on track with params of specific race type
+ snprintf(Buf,sizeof(Buf),"%s/%s/%s-%s.xml",
+ BaseParamPath,oCarType,oTrackName,RaceType[oSituation->_raceType]);
+ Handle = TUtils::MergeParamFile(Handle,Buf);
+
+ // Override params for car type on track with driver on track
+ snprintf(Buf,sizeof(Buf),"%s/%d/%s.xml",
+ BaseParamPath,oIndex,oTrackName);
+// Handle = TUtils::MergeParamFile(Handle,Buf);
+
+ // Override params for driver on track with params of specific race type
+ snprintf(Buf,sizeof(Buf),"%s/%d/%s-%s.xml",
+ BaseParamPath,oIndex,oTrackName,RaceType[oSituation->_raceType]);
+ Handle = TUtils::MergeParamFile(Handle,Buf);
+
+ // Setup the car param handle to be returned
+ *CarSettings = Handle;
+
+ // Get the private parameters now.
+ TDriver::LengthMargin =
+ GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_LENGTH_MARGIN,0,LENGTH_MARGIN);
+ GfOut("#LengthMargin %.2f\n",TDriver::LengthMargin);
+
+ // Check test flag:
+ const char* ForceLane = GfParmGetStr(Handle,
+ TDriver::SECT_PRIV,PRV_FORCE_LANE,"F");
+
+ if (strcmp(ForceLane,"L") == 0)
+ oTestLane = -1;
+ else if (strcmp(ForceLane,"R") == 0)
+ oTestLane = 1;
+ else
+ oTestLane = 0;
+
+ int TestQualification =
+ (int) GfParmGetNum(Handle,TDriver::SECT_PRIV,PRV_QUALIFICATION,0,0);
+ if ((oSituation->_raceType == RM_TYPE_QUALIF)
+ || (TestQualification > 0))
+ {
+ if ((oSituation->_raceType == RM_TYPE_PRACTICE)
+ || (oSituation->_raceType == RM_TYPE_QUALIF))
+ {
+ Qualification = true;
+ GfOut("#Qualification = True\n");
+ NBRRL = 1;
+ }
+ }
+
+ // Get car's length
+ Param.Fix.oLength =
+ GfParmGetNum(Handle,SECT_CAR,PRM_LEN,0,4.5);
+
+ AdjustBrakes(Handle);
+ AdjustPitting(Handle);
+ AdjustDriving(Handle,ScaleBrake,ScaleMu);
+ AdjustSkilling(Handle);
// Find side and sections of pits ...
TTrackDescription::PitSideMod PitSideMod; // Data for track description
@@ -1014,6 +1032,11 @@ void TDriver::InitTrack
GfOut("#oFuelNeeded: %.1f\n",oFuelNeeded);
// ... Setup initial fuel for race
+ tTrackSeg* Seg = oTrack->seg;
+ oRain = Seg->surface->kFriction < 0.9;
+ if (oRain)
+ UseFilterAccel();
+
GfOut("#\n\n\n#<<< TDriver::InitTrack\n\n\n");
}
//==========================================================================*
@@ -1373,7 +1396,7 @@ void TDriver::FindRacinglines()
oRacingLine[oRL_FREE].MakeSmoothPath // Calculate a smooth path
(&oTrackDesc, Param, // as main racingline
TClothoidLane::TOptions(oBumpMode));
- oRacingLine[oRL_FREE].SaveToFile("RL_FREE.tk3");
+ //oRacingLine[oRL_FREE].SaveToFile("RL_FREE.tk3");
oRacingLine[oRL_FREE].SavePointsToFile(oTrackLoad);
}
else if (oSituation->_raceType == RM_TYPE_QUALIF)
@@ -1399,7 +1422,7 @@ void TDriver::FindRacinglines()
oRacingLine[oRL_FREE].MakeSmoothPath // Calculate a smooth path
(&oTrackDesc, Param, // as main racingline
TClothoidLane::TOptions(oBumpMode));
- oRacingLine[oRL_FREE].SaveToFile("RL_FREE.tk3");
+ //oRacingLine[oRL_FREE].SaveToFile("RL_FREE.tk3");
oRacingLine[oRL_FREE].SavePointsToFile(oTrackLoad);
}
@@ -1428,7 +1451,7 @@ void TDriver::FindRacinglines()
oRacingLine[oRL_LEFT].MakeSmoothPath // Avoid to left racingline
(&oTrackDesc, Param,
TClothoidLane::TOptions(oBumpMode, FLT_MAX, -oAvoidWidth, true));
- oRacingLine[oRL_LEFT].SaveToFile("RL_LEFT.tk3");
+ //oRacingLine[oRL_LEFT].SaveToFile("RL_LEFT.tk3");
oRacingLine[oRL_LEFT].SavePointsToFile(oTrackLoadLeft);
}
@@ -1447,7 +1470,7 @@ void TDriver::FindRacinglines()
oRacingLine[oRL_RIGHT].MakeSmoothPath // Avoid to right racingline
(&oTrackDesc, Param,
TClothoidLane::TOptions(oBumpMode, -oAvoidWidth, FLT_MAX, true));
- oRacingLine[oRL_RIGHT].SaveToFile("RL_RIGHT.tk3");
+ //oRacingLine[oRL_RIGHT].SaveToFile("RL_RIGHT.tk3");
oRacingLine[oRL_RIGHT].SavePointsToFile(oTrackLoadRight);
}
@@ -1463,9 +1486,9 @@ void TDriver::FindRacinglines()
if (MaxPitDist < oStrategy->oPit->oPitLane[I].PitDist())
MaxPitDist = oStrategy->oPit->oPitLane[I].PitDist();
}
- oStrategy->oPit->oPitLane[oRL_FREE].SaveToFile("RL_PIT_FREE.tk3");
- oStrategy->oPit->oPitLane[oRL_LEFT].SaveToFile("RL_PIT_LEFT.tk3");
- oStrategy->oPit->oPitLane[oRL_RIGHT].SaveToFile("RL_PIT_RIGHT.tk3");
+ //oStrategy->oPit->oPitLane[oRL_FREE].SaveToFile("RL_PIT_FREE.tk3");
+ //oStrategy->oPit->oPitLane[oRL_LEFT].SaveToFile("RL_PIT_LEFT.tk3");
+ //oStrategy->oPit->oPitLane[oRL_RIGHT].SaveToFile("RL_PIT_RIGHT.tk3");
oStrategy->oDistToSwitch = MaxPitDist + 100; // Distance to pit entry
}
}
@@ -3110,27 +3133,39 @@ double TDriver::FilterBrakeSpeed(double Brake)
//--------------------------------------------------------------------------*
double TDriver::FilterAccel(double Accel)
{
- if (DistanceRaced < 50) // Not at start
- return Accel;
+ if (DistanceRaced < 50) // At start
+ {
+ if(fabs(CarSpeedLong) < 0.001) // Only if driving faster
+ return Accel;
- if(fabs(CarSpeedLong) < 0.001) // Only if driving faster
- return Accel;
+ if (fabs(oDriftAngle) > 0.1)
+ return MIN(Accel, oLastAccel + 0.00005);
- //if (fabs(oDriftAngle) > 0.3)
- // return MIN(Accel, oLastAccel + 0.01);
+ return MIN(Accel,oLastAccel + 0.0005);
+ }
+ else
+ {
+ if(fabs(CarSpeedLong) < 0.001) // Only if driving faster
+ return Accel;
- return MIN(Accel,oLastAccel + 0.05);
+ if (fabs(oDriftAngle) > 0.1)
+ return MIN(Accel, oLastAccel + 0.0001);
+
+ return MIN(Accel,oLastAccel + 0.001);
+ }
}
//==========================================================================*
-
//==========================================================================*
// Filter Traction Control
//--------------------------------------------------------------------------*
double TDriver::FilterTCL(double Accel)
{
- if (DistanceRaced < 50) // Not at start
- return Accel;
+ if (!oRain)
+ {
+ if (DistanceRaced < 50) // Not at start
+ return Accel;
+ }
if(fabs(CarSpeedLong) < 0.001) // Only if driving faster
return Accel;
@@ -3158,6 +3193,9 @@ double TDriver::FilterTCL(double Accel)
Wr /= Count; // and radius
double Slip = Spin * Wr - CarSpeedLong; // Calculate slip
+ if (oRain)
+ Slip *= 3;
+
if (Slip > oTclSlip) // Decrease accel if needed
{
float MinAccel = (float) (0.2 * Accel);
@@ -3393,6 +3431,15 @@ void TDriver::SideBorderOuter(float Factor)
}
//==========================================================================*
+//==========================================================================*
+// Calculate the skilling
+//--------------------------------------------------------------------------*
+void TDriver::CalcSkilling()
+{
+ (this->*CalcSkillingFoo)();
+}
+//==========================================================================*
+
//==========================================================================*
// Calculate the friction
//--------------------------------------------------------------------------*
@@ -3672,6 +3719,40 @@ double TDriver::CalcFriction_simplix_TRB1(const double Crv)
}
//==========================================================================*
+//==========================================================================*
+// simplix_GP36
+//--------------------------------------------------------------------------*
+void TDriver::CalcSkilling_simplix()
+{
+ oSkillScale = oSkillScale/50.0;
+ oSkillDriver = oSkillDriver / (5.0 * ((50.0 - oSkillGlobal)/40.0));
+ oSkill = oSkillScale * (oSkillGlobal + oSkillDriver * 2) * (1.0 + oSkillDriver) + oSkillOffset;
+ oSkillMax = oSkillScale * 24 + oSkillOffset;
+}
+//==========================================================================*
+
+//==========================================================================*
+// simplix_MPA1
+//--------------------------------------------------------------------------*
+void TDriver::CalcSkilling_simplix_MPA1()
+{
+ oSkillGlobal = oSkillGlobal/10.0;
+ oSkillDriver = oSkillDriver/3.0;
+ oSkill = oSkillScale * (oSkillGlobal + oSkillDriver) + oSkillOffset;
+}
+//==========================================================================*
+
+//==========================================================================*
+// simplix_SC
+//--------------------------------------------------------------------------*
+void TDriver::CalcSkilling_simplix_SC()
+{
+ oSkillScale = oSkillScale/50.0;
+ oSkillDriver = oSkillDriver / ((50.0 - oSkillGlobal)/40.0);
+ oSkill = oSkillScale * (oSkillGlobal + oSkillDriver * 2) * (1.0 + oSkillDriver) + oSkillOffset;
+}
+//==========================================================================*
+
//--------------------------------------------------------------------------*
// end of file unitdriver.cpp
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
diff --git a/src/drivers/simplix/src/unitdriver.h b/src/drivers/simplix/src/unitdriver.h
index 6b625005..64403a0a 100644
--- a/src/drivers/simplix/src/unitdriver.h
+++ b/src/drivers/simplix/src/unitdriver.h
@@ -390,6 +390,7 @@ private:
float oSideScaleBrake;
float oSideBorderOuter;
double oXXX;
+ bool oRain;
static int NBBOTS; // Nbr of cars
// static double CurrSimTime; // Current simulation time
@@ -402,6 +403,7 @@ private:
static bool AdvancedParameters;
static bool UseOldSkilling;
static bool UseSCSkilling;
+ static bool UseMPA1Skilling;
static bool UseBrakeLimit;
static bool UseGPBrakeLimit;
static float BrakeLimit;
@@ -415,14 +417,26 @@ private:
void ScaleSide(float FactorMu, float FactorBrake);
void SideBorderOuter(float Factor);
+ void AdjustBrakes(PCarHandle Handle);
+ void AdjustDriving(PCarHandle Handle, double ScaleBrake, double ScaleMu);
+ void AdjustPitting(PCarHandle Handle);
+ void AdjustSkilling(PCarHandle Handle);
+ void GetSkillingParameters(const char* BaseParamPath, const char* PathFilename);
+
+ void CalcSkilling();
double CalcFriction(const double Crv);
double CalcCrv(double Crv);
double CalcHairpin(double Crv);
+ void (TDriver::*CalcSkillingFoo)();
double (TDriver::*CalcFrictionFoo)(const double Crv);
double (TDriver::*CalcCrvFoo)(double Crv);
double (TDriver::*CalcHairpinFoo)(double Crv);
+ void CalcSkilling_simplix();
+ void CalcSkilling_simplix_MPA1();
+ void CalcSkilling_simplix_SC();
+
double CalcFriction_simplix(double Crv);
double CalcFriction_simplix_TRB1(double Crv);
diff --git a/src/drivers/simplix/src/unitmain.cpp b/src/drivers/simplix/src/unitmain.cpp
index 2370dd83..3a0b23e9 100644
--- a/src/drivers/simplix/src/unitmain.cpp
+++ b/src/drivers/simplix/src/unitmain.cpp
@@ -260,6 +260,7 @@ void SetUpSimplix_mpa1()
TDriver::AdvancedParameters = true;
TDriver::UseBrakeLimit = true;
TDriver::Learning = true;
+ TDriver::UseMPA1Skilling = true;
};
//==========================================================================*
@@ -610,6 +611,7 @@ static int InitFuncPt(int Index, void *Pt)
if (cRobotType == RTYPE_SIMPLIX)
{
GfOut("#cRobotType == RTYPE_SIMPLIX\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix;
@@ -619,6 +621,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_TRB1)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_TRB1\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix_TRB1;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_TRB1;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_TRB1;
@@ -628,6 +631,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_SC)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_SC\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix_SC;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_SC;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_SC;
@@ -637,6 +641,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_36GP)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_36GP\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_36GP;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_36GP;
@@ -647,7 +652,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_MPA1)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_MPA1\n");
-// cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix_TRB1;
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix_MPA1;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_MPA1;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_MPA1;
@@ -657,6 +662,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_LS1)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_LS1\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_LS1;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_LS1;
@@ -666,6 +672,7 @@ static int InitFuncPt(int Index, void *Pt)
else if (cRobotType == RTYPE_SIMPLIX_GP1600)
{
GfOut("#cRobotType == RTYPE_SIMPLIX_GP1600\n");
+ cInstances[Index-IndexOffset].cRobot->CalcSkillingFoo = &TDriver::CalcSkilling_simplix;
cInstances[Index-IndexOffset].cRobot->CalcFrictionFoo = &TDriver::CalcFriction_simplix;
cInstances[Index-IndexOffset].cRobot->CalcCrvFoo = &TDriver::CalcCrv_simplix_GP1600;
cInstances[Index-IndexOffset].cRobot->CalcHairpinFoo = &TDriver::CalcHairpin_simplix_GP1600;
@@ -880,6 +887,10 @@ extern "C" int simplix_mpa1(tModInfo *ModInfo)
return -1;
SetParameters(10, "indycar01");
+ TDriver::AdvancedParameters = true;
+ TDriver::UseBrakeLimit = true;
+ TDriver::Learning = true;
+ TDriver::UseMPA1Skilling = true;
return simplixEntryPoint(ModInfo,RobotSettings);
};
//==========================================================================*
diff --git a/src/libs/raceengineclient/racecars.cpp b/src/libs/raceengineclient/racecars.cpp
index 8ed3c2f4..a135c02f 100644
--- a/src/libs/raceengineclient/racecars.cpp
+++ b/src/libs/raceengineclient/racecars.cpp
@@ -168,8 +168,11 @@ reCarsApplyRaceRules(tCarElt *car)
!(car->_state & RM_CAR_STATE_PIT) &&
(car->_driverType != RM_DRV_HUMAN))
{
- car->_state |= RM_CAR_STATE_ELIMINATED;
- GfLogInfo("%s eliminated (too long to finish the lap).\n", car->_name);
+ if (!(car->_state & RM_CAR_STATE_ELIMINATED))
+ {
+ car->_state |= RM_CAR_STATE_ELIMINATED;
+ GfLogInfo("%s eliminated (too long to finish the lap).\n", car->_name);
+ }
return;
}
diff --git a/src/raceman/indy-champ.xml b/src/raceman/mpa1-champ.xml
similarity index 76%
rename from src/raceman/indy-champ.xml
rename to src/raceman/mpa1-champ.xml
index 40a26643..fbdd3255 100644
--- a/src/raceman/indy-champ.xml
+++ b/src/raceman/mpa1-champ.xml
@@ -1,283 +1,263 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+