forked from speed-dreams/speed-dreams-code
Skilling enabled.
Re #183. git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@3017 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 0e914058cfed2c9d2a0fc87cbcbda20e781d62fa Former-commit-id: 170010c212f94a7f75c87d0f922dc9ed55beb1d9
This commit is contained in:
parent
0291e505f7
commit
9c0a4869c5
6 changed files with 148 additions and 21 deletions
17
src/drivers/kilo2008/1/skill.xml
Normal file
17
src/drivers/kilo2008/1/skill.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!DOCTYPE params SYSTEM "../../../../src/libs/tgf/params.dtd">
|
||||
|
||||
<params name="Skill" type="template">
|
||||
|
||||
<section name="skill">
|
||||
|
||||
<!-- This skill level is added to the global skill level set in -->
|
||||
<!-- 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"/>
|
||||
|
||||
</section>
|
||||
|
||||
</params>
|
17
src/drivers/kilo2008/2/skill.xml
Normal file
17
src/drivers/kilo2008/2/skill.xml
Normal file
|
@ -0,0 +1,17 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!DOCTYPE params SYSTEM "../../../../src/libs/tgf/params.dtd">
|
||||
|
||||
<params name="Skill" type="template">
|
||||
|
||||
<section name="skill">
|
||||
|
||||
<!-- This skill level is added to the global skill level set in -->
|
||||
<!-- 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"/>
|
||||
|
||||
</section>
|
||||
|
||||
</params>
|
|
@ -38,7 +38,7 @@
|
|||
#include <robottools.h> //Rt*
|
||||
#include <robot.h> //ROB_PIT_IM
|
||||
|
||||
#define DEBUG
|
||||
//#define DEBUG
|
||||
|
||||
//"I AM DEATH, NOT TAXES. *I* TURN UP ONLY ONCE." -- Death
|
||||
//Fear was theirs, not yers.
|
||||
|
@ -660,11 +660,13 @@ void
|
|||
KDriver::initTrack(tTrack * t, void *carHandle, void **carParmHandle,
|
||||
tSituation * s)
|
||||
{
|
||||
m_track = t;
|
||||
initSkill(s);
|
||||
|
||||
stringstream buf;
|
||||
|
||||
//Load a custom setup if one is available.
|
||||
m_track = t;
|
||||
char *trackname = strrchr(m_track->filename, '/') + 1; //Ptr to the track filename
|
||||
stringstream buf;
|
||||
stringstream botPath;
|
||||
|
||||
//Try to load the default setup
|
||||
|
@ -735,14 +737,6 @@ KDriver::initTrack(tTrack * t, void *carHandle, void **carParmHandle,
|
|||
cout << "merge #2" << endl;
|
||||
#endif
|
||||
|
||||
|
||||
// Create a pit stop strategy object.
|
||||
m_strategy = new KStrategy();
|
||||
// Init fuel.
|
||||
m_strategy->setFuelAtRaceStart(t, carParmHandle, s, INDEX);
|
||||
|
||||
m_raceline = new LRaceLine;
|
||||
|
||||
// Load and set parameters.
|
||||
MU_FACTOR =
|
||||
GfParmGetNum(*carParmHandle, KILO_SECT_PRIV, KILO_ATT_MUFACTOR, NULL, 0.69f);
|
||||
|
@ -750,8 +744,15 @@ KDriver::initTrack(tTrack * t, void *carHandle, void **carParmHandle,
|
|||
GfParmGetNum(*carParmHandle, KILO_SECT_PRIV, KILO_ATT_PITOFFSET, NULL, 10.0);
|
||||
m_brakeDelay =
|
||||
GfParmGetNum(*carParmHandle, KILO_SECT_PRIV, KILO_ATT_BRDELAY, NULL, 10.0);
|
||||
|
||||
m_raceline->InitTrack(m_track, carParmHandle, s);
|
||||
|
||||
// Create a pit stop strategy object.
|
||||
m_strategy = new KStrategy();
|
||||
// Init fuel.
|
||||
m_strategy->setFuelAtRaceStart(t, carParmHandle, s, INDEX);
|
||||
|
||||
m_raceline = new LRaceLine;
|
||||
//m_raceline->setSkill(m_skill);
|
||||
m_raceline->InitTrack(m_track, carParmHandle, s, m_filterSideSkill);
|
||||
}//initTrack
|
||||
|
||||
|
||||
|
@ -1237,7 +1238,9 @@ KDriver::brakeDist(double allowedspeed, double mu)
|
|||
double d = (CA * mu + CW) / m_mass;
|
||||
double v1sqr = m_currentSpeedSqr;
|
||||
double v2sqr = pow(allowedspeed, 2);
|
||||
return -log((c + v2sqr * d) / (c + v1sqr * d)) / (2.0 * d);
|
||||
double ret = -log((c + v2sqr * d) / (c + v1sqr * d)) / (2.0 * d);
|
||||
ret /= m_filterBrakeSkill;
|
||||
return ret;
|
||||
}//brakeDist
|
||||
|
||||
|
||||
|
@ -1576,6 +1579,8 @@ KDriver::getTargetPoint()
|
|||
lookahead = MAX(cmplookahead, lookahead);
|
||||
}//if getInPit
|
||||
|
||||
lookahead *= m_filterLookaheadSkill;
|
||||
|
||||
m_oldLookahead = lookahead;
|
||||
|
||||
// Search for the segment containing the target point.
|
||||
|
@ -1692,6 +1697,7 @@ KDriver::getAccel()
|
|||
if(fabs(m_angle) > 0.8 && getSpeed() > 10.0)
|
||||
m_accelCmd = MAX(0.0, MIN(m_accelCmd, 1.0 - getSpeed() / 100.0 * fabs(m_angle)));
|
||||
ret = m_accelCmd;
|
||||
ret *= (m_car->_gear > 1) ? m_filterAccelSkill : 1.0;
|
||||
}//if m_car->_gear
|
||||
|
||||
return ret;
|
||||
|
@ -1707,10 +1713,15 @@ KDriver::getAccel()
|
|||
double
|
||||
KDriver::getBrake()
|
||||
{
|
||||
double ret = (m_car->_speed_x < -MAX_UNSTUCK_SPEED)
|
||||
? 1.0 //Car drives backward, brake
|
||||
: m_brakeCmd; //Car drives forward, normal braking.
|
||||
|
||||
double ret;
|
||||
|
||||
if(m_car->_speed_x < -MAX_UNSTUCK_SPEED) {
|
||||
ret = 1.0; //Car drives backward, brake
|
||||
} else {
|
||||
ret = m_brakeCmd; //Car drives forward, normal braking.
|
||||
//ret *= m_filterBrakeSkill; //Brake earlier if less skilled
|
||||
}
|
||||
|
||||
return ret;
|
||||
}//getBrake
|
||||
|
||||
|
@ -1791,3 +1802,68 @@ KDriver::getClutch()
|
|||
}
|
||||
}
|
||||
}//getClutch
|
||||
|
||||
|
||||
/**
|
||||
* initSkill
|
||||
* Reads the global and the driver-specific skill values.
|
||||
*
|
||||
* @return The accumulated skill value
|
||||
*/
|
||||
double
|
||||
KDriver::initSkill(tSituation * s)
|
||||
{
|
||||
double globalSkill = m_skill = 0.0;
|
||||
m_filterBrakeSkill = 1.0;
|
||||
m_filterAccelSkill = 1.0;
|
||||
m_filterLookaheadSkill = 1.0;
|
||||
m_filterSideSkill = 1.0;
|
||||
|
||||
if(s->_raceType != RM_TYPE_PRACTICE) {
|
||||
stringstream buf;
|
||||
// load the global skill level, range 0 - 10
|
||||
buf << GetLocalDir() << "config/raceman/extra/skill.xml";
|
||||
void *skillHandle = GfParmReadFile(buf.str().c_str(), GFPARM_RMODE_REREAD);
|
||||
if(!skillHandle) {
|
||||
buf.str(string());
|
||||
buf << GetDataDir() << "config/raceman/extra/skill.xml";
|
||||
skillHandle = GfParmReadFile(buf.str().c_str(), GFPARM_RMODE_REREAD);
|
||||
}//if !skillHandle
|
||||
|
||||
if(skillHandle) {
|
||||
globalSkill = GfParmGetNum(skillHandle, KILO_SECT_SKILL, KILO_SKILL_LEVEL, NULL, 10.0);
|
||||
globalSkill = MIN(10.0, MAX(0.0, globalSkill));
|
||||
}
|
||||
|
||||
//load the driver skill level, range 0 - 1
|
||||
double driverSkill = 0.0;
|
||||
buf.str(string());
|
||||
buf << "drivers/" << bot << "/" << INDEX << "/skill.xml";
|
||||
skillHandle = GfParmReadFile(buf.str().c_str(), GFPARM_RMODE_STD);
|
||||
if(skillHandle) {
|
||||
driverSkill = GfParmGetNum(skillHandle, KILO_SECT_SKILL, KILO_SKILL_LEVEL, NULL, 0.0);
|
||||
//driver_aggression = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_AGGRO, (char *)NULL, 0.0);
|
||||
driverSkill = MIN(1.0, MAX(0.0, driverSkill));
|
||||
}
|
||||
|
||||
//limits: 0.0 - 24.0
|
||||
m_skill = (globalSkill + driverSkill * 2.0) * (1.0 + driverSkill);
|
||||
|
||||
//Set up different handicap values
|
||||
m_filterBrakeSkill = MAX(0.85, 1.0 - m_skill / 24.0 * 0.15);
|
||||
m_filterAccelSkill = MAX(0.80, 1.0 - m_skill / 24.0 * 0.20);
|
||||
m_filterLookaheadSkill = 1.0 / (1.0 + m_skill / 24.0);
|
||||
m_filterSideSkill = 1.0 + m_skill / 24.0;
|
||||
}//if not practice
|
||||
|
||||
#ifdef DEBUG
|
||||
cout << "Skill: " << m_skill
|
||||
<< ", brake: " << m_filterBrakeSkill
|
||||
<< ", accel: " << m_filterAccelSkill
|
||||
<< ", lookA: " << m_filterLookaheadSkill
|
||||
<< ", sides: " << m_filterSideSkill
|
||||
<< endl;
|
||||
#endif
|
||||
|
||||
return m_skill;
|
||||
}//initSkill
|
||||
|
|
|
@ -57,6 +57,9 @@ class LRaceLine;
|
|||
#define KILO_ATT_BRDELAY "BrakeDelay"
|
||||
#define KILO_ATT_SECRAD "SecurityRadius"
|
||||
#define KILO_ATT_PITOFFSET "PitOffset"
|
||||
#define KILO_SECT_SKILL "Skill"
|
||||
#define KILO_SKILL_LEVEL "Level"
|
||||
#define KILO_SKILL_AGGRO "Aggression"
|
||||
|
||||
|
||||
enum { NORMAL = 1, AVOIDING, CORRECTING, PITTING, BEING_OVERLAPPED };
|
||||
|
@ -90,6 +93,7 @@ protected:
|
|||
void initCw();
|
||||
void initTireMu();
|
||||
void initTCLFilter();
|
||||
double initSkill(tSituation * s);
|
||||
|
||||
//Driving aids
|
||||
double filterTCL_RWD();
|
||||
|
@ -194,7 +198,14 @@ protected:
|
|||
double m_rInverse;
|
||||
std::string m_carType;
|
||||
int m_carIndex;
|
||||
|
||||
|
||||
//Skilling
|
||||
double m_skill;
|
||||
double m_filterBrakeSkill;
|
||||
double m_filterAccelSkill;
|
||||
double m_filterLookaheadSkill;
|
||||
double m_filterSideSkill;
|
||||
|
||||
// Data that should stay constant after first initialization.
|
||||
int MAX_UNSTUCK_COUNT;
|
||||
int INDEX;
|
||||
|
|
|
@ -478,7 +478,8 @@ LRaceLine::Interpolate(int Step, int rl)
|
|||
|
||||
|
||||
void
|
||||
LRaceLine::InitTrack(const tTrack * const track, void **carParmHandle, const tSituation *s)
|
||||
LRaceLine::InitTrack(const tTrack * const track, void **carParmHandle,
|
||||
const tSituation *s, const double filterSideSkill)
|
||||
{
|
||||
m_dMinCornerInverse =
|
||||
GfParmGetNum(*carParmHandle, KILO_SECT_PRIV, KILO_ATT_MINCORNER, NULL, 0.002);
|
||||
|
@ -497,6 +498,11 @@ LRaceLine::InitTrack(const tTrack * const track, void **carParmHandle, const tSi
|
|||
m_dSecurityRadius =
|
||||
GfParmGetNum(*carParmHandle, KILO_SECT_PRIV, KILO_ATT_SECRAD, NULL, 100.0);
|
||||
|
||||
if(s->_raceType != RM_TYPE_PRACTICE) {
|
||||
m_dExtMargin *= filterSideSkill;
|
||||
m_dIntMargin *= filterSideSkill;
|
||||
}//if not practice
|
||||
|
||||
// split track
|
||||
for(int rl = LINE_MID; rl <= LINE_RL; rl++)
|
||||
{
|
||||
|
|
|
@ -84,7 +84,7 @@ public:
|
|||
|
||||
inline void setCar(tCarElt * const car) {m_pCar = car;}
|
||||
|
||||
void InitTrack(const tTrack * const track, void **carParmHandle, const tSituation *s);
|
||||
void InitTrack(const tTrack * const track, void **carParmHandle, const tSituation *s, const double filterSideSkill);
|
||||
void NewRace();
|
||||
void GetRaceLineData(const tSituation * const s, v2d * target,
|
||||
double *speed, double *avspeed, double *raceoffset,
|
||||
|
|
Loading…
Reference in a new issue