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:
parent
c82ea3c0fd
commit
aabb1f2132
16 changed files with 749 additions and 631 deletions
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
||||
};
|
||||
//==========================================================================*
|
||||
|
|
|
@ -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
|
||||
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
//==========================================================================*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue