Skilling for simplix_mpa1

Start and drive with rain

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@2909 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: a14e64374d0e336cebe49ca4b57ce9cd5ef34c8e
Former-commit-id: bcd67f640aa1430c2dfd6f06fba70e800f403de7
This commit is contained in:
wdbee 2010-10-17 15:25:35 +00:00
parent c82ea3c0fd
commit aabb1f2132
16 changed files with 749 additions and 631 deletions

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="1.0"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.1"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.9"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.2"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.8"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.3"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.7"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.4"/>
</section>

View file

@ -12,7 +12,7 @@
<!-- raceman/config/extra/skill.xml to provide a unique value for -->
<!-- each driver. The values should be between 0 and 1, with 0 being -->
<!-- the highest skill level. -->
<attnum name="level" min="0.0" max="1.0" val="0.0"/>
<attnum name="level" min="0.0" max="1.0" val="0.6"/>
</section>

View file

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

View file

@ -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();
};
//==========================================================================*

View file

@ -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
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*

View file

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

View file

@ -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);
};
//==========================================================================*

View file

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

View file

@ -1,283 +1,263 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE params SYSTEM "params.dtd">
<params name="MPA1 Championship" version="1.1">
<section name="Header">
<attstr name="name" val="MPA1 Championship"/>
<attstr name="description" val="Championship"/>
<attnum name="priority" val="50"/>
<attstr name="menu image" val="data/img/splash-dtm.png"/>
<attstr name="run image" val="data/img/splash-run-practice.png"/>
<attstr name="start image" val="data/img/splash-dtm.png"/>
</section>
<section name="Tracks">
<attnum name="maximum number" val="20"/>
<section name="1">
<attstr name="name" val="b-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="2">
<attstr name="name" val="c-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="3">
<attstr name="name" val="Corkscrew"/>
<attstr name="category" val="circuit"/>
</section>
<section name="4">
<attstr name="name" val="d-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="5">
<attstr name="name" val="e-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="6">
<attstr name="name" val="f-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="7">
<attstr name="name" val="g-speedway"/>
<attstr name="category" val="speedway"/>
</section>
<section name="8">
<attstr name="name" val="street-1"/>
<attstr name="category" val="road"/>
</section>
<section name="9">
<attstr name="name" val="manton"/>
<attstr name="category" val="speedway"/>
</section>
</section>
<section name="Races">
<section name="1">
<attstr name="name" val="Qualifications"/>
</section>
<section name="2">
<attstr name="name" val="First Race"/>
</section>
<section name="3">
<attstr name="name" val="Second Race"/>
</section>
</section>
<section name="Qualifications">
<attnum name="laps" val="3"/>
<attstr name="type" val="qualifications"/>
<attstr name="starting order" val="drivers list"/>
<attstr name="display mode" val="results only"/>
<attstr name="restart" val="no"/>
<attstr name="display results" val="yes"/>
<attstr name="must complete" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="1"/>
<attnum name="distance to start" val="100"/>
<attnum name="distance between columns" val="20"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="3"/>
</section>
<section name="2">
<attnum name="points" val="2"/>
</section>
<section name="3">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="First Race">
<attnum name="distance" unit="km" val="30"/>
<attstr name="type" val="race"/>
<attstr name="starting order" val="last race"/>
<attstr name="restart" val="no"/>
<attnum name="maximum drivers" val="31"/>
<attstr name="splash menu" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="2"/>
<attnum name="distance to start" val="25"/>
<attnum name="distance between columns" val="30"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="15"/>
</section>
<section name="2">
<attnum name="points" val="10"/>
</section>
<section name="3">
<attnum name="points" val="8"/>
</section>
<section name="4">
<attnum name="points" val="6"/>
</section>
<section name="5">
<attnum name="points" val="4"/>
</section>
<section name="6">
<attnum name="points" val="3"/>
</section>
<section name="7">
<attnum name="points" val="2"/>
</section>
<section name="8">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="Second Race">
<attnum name="distance" unit="km" val="30"/>
<attstr name="type" val="race"/>
<attstr name="starting order" val="last race reversed"/>
<attstr name="restart" val="no"/>
<attnum name="maximum drivers" val="16"/>
<attstr name="splash menu" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="2"/>
<attnum name="distance to start" val="25"/>
<attnum name="distance between columns" val="30"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="15"/>
</section>
<section name="2">
<attnum name="points" val="10"/>
</section>
<section name="3">
<attnum name="points" val="8"/>
</section>
<section name="4">
<attnum name="points" val="6"/>
</section>
<section name="5">
<attnum name="points" val="4"/>
</section>
<section name="6">
<attnum name="points" val="3"/>
</section>
<section name="7">
<attnum name="points" val="2"/>
</section>
<section name="8">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="Drivers">
<attnum name="maximum number" val="50"/>
<attstr name="focused module" val="simplix_indy"/>
<attnum name="focused idx" val="1"/>
<section name="1">
<attnum name="idx" val="1"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="2">
<attnum name="idx" val="2"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="3">
<attnum name="idx" val="3"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="4">
<attnum name="idx" val="4"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="5">
<attnum name="idx" val="5"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="6">
<attnum name="idx" val="6"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="7">
<attnum name="idx" val="7"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="8">
<attnum name="idx" val="8"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="9">
<attnum name="idx" val="9"/>
<attstr name="module" val="simplix_indy"/>
</section>
<section name="10">
<attnum name="idx" val="10"/>
<attstr name="module" val="simplix_indy"/>
</section>
</section>
<section name="Configuration">
<attnum name="current configuration" val="2"/>
<section name="1">
<attstr name="type" val="drivers select"/>
</section>
</section>
</params>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE params SYSTEM "params.dtd">
<params name="MPA1 Championship" version="1.2">
<section name="Header">
<attstr name="name" val="MPA1 Championship"/>
<attstr name="description" val="Championship"/>
<attnum name="priority" val="50"/>
<attstr name="menu image" val="data/img/splash-dtm.png"/>
<attstr name="run image" val="data/img/splash-run-practice.png"/>
<attstr name="start image" val="data/img/splash-dtm.png"/>
</section>
<section name="Tracks">
<attnum name="maximum number" val="20"/>
<section name="1">
<attstr name="name" val="manton"/>
<attstr name="category" val="speedway"/>
</section>
<section name="2">
<attstr name="name" val="g-track-1"/>
<attstr name="category" val="road"/>
</section>
<section name="3">
<attstr name="name" val="g-track-2"/>
<attstr name="category" val="circuit"/>
</section>
<section name="4">
<attstr name="name" val="migrants"/>
<attstr name="category" val="circuit"/>
</section>
<section name="5">
<attstr name="name" val="bueno"/>
<attstr name="category" val="circuit"/>
</section>
<section name="6">
<attstr name="name" val="espie"/>
<attstr name="category" val="circuit"/>
</section>
<section name="7">
<attstr name="name" val="brondehach"/>
<attstr name="category" val="circuit"/>
</section>
<section name="8">
<attstr name="name" val="karwada"/>
<attstr name="category" val="circuit"/>
</section>
<section name="9">
<attstr name="name" val="Corkscrew"/>
<attstr name="category" val="circuit"/>
</section>
</section>
<section name="Races">
<section name="1">
<attstr name="name" val="Qualifications"/>
</section>
<section name="2">
<attstr name="name" val="First Race"/>
</section>
<section name="3">
<attstr name="name" val="Second Race"/>
</section>
</section>
<section name="Qualifications">
<attnum name="laps" val="3"/>
<attstr name="type" val="qualifications"/>
<attstr name="starting order" val="drivers list"/>
<attstr name="display mode" val="results only"/>
<attstr name="restart" val="no"/>
<attstr name="display results" val="yes"/>
<attstr name="must complete" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="1"/>
<attnum name="distance to start" val="100"/>
<attnum name="distance between columns" val="20"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="3"/>
</section>
<section name="2">
<attnum name="points" val="2"/>
</section>
<section name="3">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="First Race">
<attnum name="distance" unit="km" val="20"/>
<attstr name="type" val="race"/>
<attstr name="starting order" val="last race"/>
<attstr name="restart" val="no"/>
<attnum name="maximum drivers" val="31"/>
<attstr name="splash menu" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="2"/>
<attnum name="distance to start" val="25"/>
<attnum name="distance between columns" val="30"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="15"/>
</section>
<section name="2">
<attnum name="points" val="10"/>
</section>
<section name="3">
<attnum name="points" val="8"/>
</section>
<section name="4">
<attnum name="points" val="6"/>
</section>
<section name="5">
<attnum name="points" val="4"/>
</section>
<section name="6">
<attnum name="points" val="3"/>
</section>
<section name="7">
<attnum name="points" val="2"/>
</section>
<section name="8">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="Second Race">
<attnum name="distance" unit="km" val="20"/>
<attstr name="type" val="race"/>
<attstr name="starting order" val="last race reversed"/>
<attstr name="restart" val="no"/>
<attnum name="maximum drivers" val="16"/>
<attstr name="splash menu" val="yes"/>
<section name="Starting Grid">
<attnum name="rows" val="2"/>
<attnum name="distance to start" val="25"/>
<attnum name="distance between columns" val="30"/>
<attnum name="offset within a column" val="10"/>
<attnum name="initial speed" val="0"/>
<attnum name="initial height" val="0.2"/>
</section>
<section name="Points">
<section name="1">
<attnum name="points" val="15"/>
</section>
<section name="2">
<attnum name="points" val="10"/>
</section>
<section name="3">
<attnum name="points" val="8"/>
</section>
<section name="4">
<attnum name="points" val="6"/>
</section>
<section name="5">
<attnum name="points" val="4"/>
</section>
<section name="6">
<attnum name="points" val="3"/>
</section>
<section name="7">
<attnum name="points" val="2"/>
</section>
<section name="8">
<attnum name="points" val="1"/>
</section>
</section>
</section>
<section name="Drivers">
<attnum name="maximum number" val="50"/>
<attnum name="focused idx" val="0"/>
<attstr name="focused module" val="simplix_mpa1"/>
<section name="1">
<attnum name="idx" val="0"/>
<attstr name="module" val="simplix_mpa1"/>
<attnum name="extended" val="0"/>
</section>
<section name="2">
<attnum name="idx" val="2"/>
<attstr name="module" val="simplix_mpa1"/>
<attnum name="extended" val="0"/>
</section>
<section name="3">
<attnum name="idx" val="4"/>
<attstr name="module" val="simplix_mpa1"/>
<attnum name="extended" val="0"/>
</section>
<section name="4">
<attnum name="idx" val="6"/>
<attstr name="module" val="simplix_mpa1"/>
<attnum name="extended" val="0"/>
</section>
<section name="5">
<attnum name="idx" val="8"/>
<attstr name="module" val="simplix_mpa1"/>
<attnum name="extended" val="0"/>
</section>
</section>
<section name="Configuration">
<attnum name="current configuration" val="2"/>
<section name="1">
<attstr name="type" val="drivers select"/>
</section>
</section>
</params>