- Update USR's driver

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

Former-commit-id: 15e493bfa76b8f70bc031c9b054dc27fa2ee138a
Former-commit-id: 92acc07c4aba8132932d100aa2f3aebea00489c8
This commit is contained in:
torcs-ng 2020-02-23 00:54:57 +00:00
parent dcd3fee4e6
commit 047e0e7025
6 changed files with 155 additions and 171 deletions

View file

@ -97,17 +97,17 @@ enum { FLYING_FRONT = 1, FLYING_BACK = 2, FLYING_SIDE = 4 };
void Driver::SetRandomSeed(unsigned int seed)
{
random_seed = seed ? seed : RANDOM_SEED;
random_seed = seed ? seed : RANDOM_SEED;
return;
return;
}
unsigned int Driver::getRandom()
{
random_seed = RANDOM_A * random_seed + RANDOM_C;
LogUSR.debug("Random = %.3f\n", random_seed);
random_seed = RANDOM_A * random_seed + RANDOM_C;
LogUSR.debug("Random = %.3f\n", random_seed);
return (random_seed >> 16);
return (random_seed >> 16);
}
@ -449,44 +449,44 @@ void Driver::initTrack(tTrack* t, void *carHandle, void **carParmHandle, tSituat
// Get skill level
decel_adjust_perc = global_skill = skill = driver_aggression = 0.0;
SetRandomSeed(10);
decel_adjust_perc = global_skill = skill = driver_aggression = 0.0;
SetRandomSeed(10);
// load the global skill level, range 0 - 10
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetLocalDir());
void *skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
// load the global skill level, range 0 - 10
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetLocalDir());
void *skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
if(!skillHandle)
{
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetDataDir());
skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
}//if !skillHandle
if(!skillHandle)
{
snprintf(buffer, BUFSIZE, "%sconfig/raceman/extra/skill.xml", GetDataDir());
skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_REREAD);
}//if !skillHandle
if (skillHandle)
{
global_skill = GfParmGetNum(skillHandle, (char *)SECT_SKILL, (char *)PRV_SKILL_LEVEL, (char *) NULL, 30.0f);
}
if (skillHandle)
{
global_skill = GfParmGetNum(skillHandle, (char *)SECT_SKILL, (char *)PRV_SKILL_LEVEL, (char *) NULL, 30.0f);
}
global_skill = MAX(0.0f, MIN(30.0f, global_skill));
global_skill = MAX(0.0f, MIN(30.0f, global_skill));
LogUSR.info("Global Skill: %.3f\n", global_skill);
LogUSR.info("Global Skill: %.3f\n", global_skill);
//load the driver skill level, range 0 - 1
float driver_skill = 0.0f;
snprintf(buffer, BUFSIZE, "drivers/%s/%d/skill.xml", MyBotName, INDEX);
LogUSR.info("Path skill driver: %s\n", buffer);
skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
//load the driver skill level, range 0 - 1
float driver_skill = 0.0f;
snprintf(buffer, BUFSIZE, "drivers/%s/%d/skill.xml", MyBotName, INDEX);
LogUSR.info("Path skill driver: %s\n", buffer);
skillHandle = GfParmReadFile(buffer, GFPARM_RMODE_STD);
if (skillHandle)
{
driver_skill = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_LEVEL, (char *) NULL, 0.0);
driver_aggression = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_AGGRO, (char *)NULL, 0.0);
driver_skill = (float)MIN(1.0, MAX(0.0, driver_skill));
LogUSR.info("Global skill = %.2f - driver skill: %.2f - driver agression: %.2f\n", global_skill, driver_skill, driver_aggression);
}
if (skillHandle)
{
driver_skill = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_LEVEL, (char *) NULL, 0.0);
driver_aggression = GfParmGetNum(skillHandle, SECT_SKILL, PRV_SKILL_AGGRO, (char *)NULL, 0.0);
driver_skill = (float)MIN(1.0, MAX(0.0, driver_skill));
LogUSR.info("Global skill = %.2f - driver skill: %.2f - driver agression: %.2f\n", global_skill, driver_skill, driver_aggression);
}
skill = (float)((global_skill + driver_skill * 2) * (1.0 + driver_skill));
LogUSR.debug("... USR Driver skill = %.2f\n", skill);
skill = (float)((global_skill + driver_skill * 2) * (1.0 + driver_skill));
LogUSR.debug("... USR Driver skill = %.2f\n", skill);
LogUSR.debug("... USR Driver initrack end\n");
}
@ -678,8 +678,11 @@ bool Driver::calcSpeed()
{
double factor = 30.0;
if (mycardata->TYREWEAR < mycardata->CRITICAL_TYREWEAR + 0.02)
factor *= 1.0 + (1.0 * mycardata->GRIP_FACTOR);
if(mycardata->HasTYC)
{
if (mycardata->TYREWEAR < mycardata->CRITICAL_TYREWEAR + 0.02)
factor *= 1.0 - (1.0 * mycardata->GRIP_FACTOR);
}
brakecmd = MIN(1.0f, factor * fabs(x));
}
@ -3319,33 +3322,33 @@ int Driver::GetWeather()
void Driver::calcSkill()
{
//if (RM_TYPE_PRACTICE != racetype)
//if (RM_TYPE_PRACTICE != racetype)
if (skill_adjust_timer == -1.0 || simtime - skill_adjust_timer > skill_adjust_limit)
{
double rand1 = (double) getRandom() / 65536.0; // how long we'll change speed for
double rand2 = (double) getRandom() / 65536.0; // the actual speed change
double rand3 = (double) getRandom() / 65536.0; // whether change is positive or negative
double rand1 = (double) getRandom() / 65536.0; // how long we'll change speed for
double rand2 = (double) getRandom() / 65536.0; // the actual speed change
double rand3 = (double) getRandom() / 65536.0; // whether change is positive or negative
// acceleration to use in current time limit
decel_adjust_targ = (skill/4 * rand1);
// acceleration to use in current time limit
decel_adjust_targ = (skill/4 * rand1);
// brake to use - usually 1.0, sometimes less (more rarely on higher skill)
brake_adjust_targ = MAX(0.85, 1.0 - MAX(0.0, skill/15 * (rand2-0.85)));
// brake to use - usually 1.0, sometimes less (more rarely on higher skill)
brake_adjust_targ = MAX(0.85, 1.0 - MAX(0.0, skill/15 * (rand2-0.85)));
// how long this skill mode to last for
skill_adjust_limit = 5.0 + rand3 * 50.0;
skill_adjust_timer = simtime;
// how long this skill mode to last for
skill_adjust_limit = 5.0 + rand3 * 50.0;
skill_adjust_timer = simtime;
}
if (decel_adjust_perc < decel_adjust_targ)
decel_adjust_perc += MIN(deltaTime*4, decel_adjust_targ - decel_adjust_perc);
decel_adjust_perc += MIN(deltaTime*4, decel_adjust_targ - decel_adjust_perc);
else
decel_adjust_perc -= MIN(deltaTime*4, decel_adjust_perc - decel_adjust_targ);
decel_adjust_perc -= MIN(deltaTime*4, decel_adjust_perc - decel_adjust_targ);
if (brake_adjust_perc < brake_adjust_targ)
brake_adjust_perc += MIN(deltaTime*2, brake_adjust_targ - brake_adjust_perc);
brake_adjust_perc += MIN(deltaTime*2, brake_adjust_targ - brake_adjust_perc);
else
brake_adjust_perc -= MIN(deltaTime*2, brake_adjust_perc - brake_adjust_targ);
brake_adjust_perc -= MIN(deltaTime*2, brake_adjust_perc - brake_adjust_targ);
LogUSR.debug("skill: decel %.3f - %.3f, brake %.3f - %.3f\n", decel_adjust_perc, decel_adjust_targ, brake_adjust_perc, brake_adjust_targ);
}

View file

@ -24,7 +24,6 @@
#include "linemode.h"
#include "raceline.h"
#include "globaldefs.h"
//#define LINEMODE_DEBUG
//
// Public methods
@ -58,18 +57,11 @@ LLineMode::~LLineMode()
double LLineMode::GetTransitionIncrement(int div)
{
double ti = m_TransitionIncrement;
/*
if (fabs(m_Car->_accel_x) > 3.0)
{
double tiFactor1 = MIN(8.0, fabs(m_Car->_accel_x));
tiFactor1 *= tiFactor1 / 2;
double tiFactor2 = MAX(0.0, MIN(1.0, fabs(m_Car->ctrl.steer)) - 0.5);
ti *= MAX(0.1, MIN(1.0 - tiFactor1 / 32.0, 1.0 - tiFactor2 / 0.5));
}
*/
if (m_OverrideCollection)
{
LManualOverride *labelOverride = m_OverrideCollection->getOverrideForLabel(PRV_TRANSITION_INC);
if (labelOverride)
{
double tti = ti;
@ -77,8 +69,10 @@ double LLineMode::GetTransitionIncrement(int div)
ti = tti;
}
}
if (m_CurrentTime - m_TimerStarted < 0.5)
return MAX(0.0, ti * ((m_CurrentTime - m_TimerStarted) / 0.5));
return ti;
}
@ -102,9 +96,9 @@ bool LLineMode::IsOnHold(int div, bool stay_inside)
{
m_OnHold = false;
m_HoldApexDiv = -1;
#ifdef LINEMODE_DEBUG
fprintf(stderr, "%s: NO HOLD (A %d %d %d) = dist (%.1f > %.1f) || div %d != %d && line %s != %s\n", m_Car->_name, (distance > m_Car->_speed_x * 5), (m_HoldApexDiv < 0), (hold_div > 0 && hold_div != m_HoldApexDiv && m_PreferLine != this_prefer_line), distance, m_Car->_speed_x * 5, m_HoldApexDiv, hold_div, m_PreferLine == TR_STR ? "STR" : m_PreferLine == TR_RGT ? "RGT" : "LFT", this_prefer_line == TR_STR ? "STR" : this_prefer_line == TR_RGT ? "RGT" : "LFT"); fflush(stderr);
#endif
LogUSR.debug("%s: NO HOLD (A %d %d %d) = dist (%.1f > %.1f) || div %d != %d && line %s != %s\n", m_Car->_name, (distance > m_Car->_speed_x * 5), (m_HoldApexDiv < 0), (hold_div > 0 && hold_div != m_HoldApexDiv && m_PreferLine != this_prefer_line), distance, m_Car->_speed_x * 5, m_HoldApexDiv, hold_div, m_PreferLine == TR_STR ? "STR" : m_PreferLine == TR_RGT ? "RGT" : "LFT", this_prefer_line == TR_STR ? "STR" : this_prefer_line == TR_RGT ? "RGT" : "LFT");
return false;
}
@ -113,9 +107,9 @@ bool LLineMode::IsOnHold(int div, bool stay_inside)
{
m_OnHold = false;
m_HoldApexDiv = -1;
#ifdef LINEMODE_DEBUG
fprintf(stderr,"%s: NO HOLD (2)\n",m_Car->_name);fflush(stderr);
#endif
LogUSR.debug("%s: NO HOLD (2)\n",m_Car->_name);
return false;
}
@ -124,22 +118,19 @@ bool LLineMode::IsOnHold(int div, bool stay_inside)
{
ResetTimer();
m_HoldApexDiv = hold_div;
#ifdef LINEMODE_DEBUG
fprintf(stderr,"%s: HOLDING!!\n",m_Car->_name);fflush(stderr);
#endif
LogUSR.debug("%s: HOLDING!!\n",m_Car->_name);
return true;
}
#ifdef LINEMODE_DEBUG
fprintf(stderr, "%s: NO HOLD (C) line=%s, lftMarg=%.3f rgtMarg=%.3f\n", m_Car->_name, this_prefer_line == TR_STR ? "STR" : this_prefer_line == TR_RGT ? "RGT" : "LFT",m_LeftCurrentMargin,m_RightCurrentMargin); fflush(stderr);
#endif
LogUSR.debug("%s: NO HOLD (C) line=%s, lftMarg=%.3f rgtMarg=%.3f\n", m_Car->_name, this_prefer_line == TR_STR ? "STR" : this_prefer_line == TR_RGT ? "RGT" : "LFT",m_LeftCurrentMargin,m_RightCurrentMargin);
}
#ifdef LINEMODE_DEBUG
else
{
fprintf(stderr, "%s: NO HOLD (D), threat=%d\n", m_Car->_name, m_UnderThreat); fflush(stderr);
LogUSR.debug("%s: NO HOLD (D), threat=%d\n", m_Car->_name, m_UnderThreat);
}
#endif
m_HoldApexDiv = -1;
m_OnHold = false;
@ -220,16 +211,14 @@ void LLineMode::SetTargetMargins(int raceline, double leftMargin, double rightMa
if (m_LeftTargetMargin != 0.0 || m_RightTargetMargin != 1.0)
m_HoldApexDiv = -1;
//fprintf(stderr, "New Margins: %.3f %.3f (%d)\n", m_LeftTargetMargin, m_RightTargetMargin,force);
m_IsTransitioning = true;
}
}
void LLineMode::SetRecoverToRaceLine()
{
#ifdef LINEMODE_DEBUG
fprintf(stderr, "setRecoveryToRaceLine\n");fflush(stderr);
#endif
LogUSR.debug("setRecoveryToRaceLine\n");
if (m_LeftTargetMargin != 0.0 || m_RightTargetMargin != 1.0)
{
m_HoldApexDiv = -1;
@ -272,5 +261,4 @@ void LLineMode::SetPitting()
void LLineMode::ResetTimer()
{
m_TimerStarted = m_CurrentTime;
//prefer_line = LINE_MID;
}

View file

@ -29,7 +29,6 @@
#include "globaldefs.h"
#include "manual_override.h"
//enum { LINE_MID=0, LINE_LEFT, LINE_RIGHT, LINE_RL, LINE_RL_MID, LINE_RL_SLOW, LINE_LEFT_OUTSTEER, LINE_RIGHT_OUTSTEER, LINE_MID_COLD, LINE_LEFT_COLD, LINE_RIGHT_COLD, LINE_RL_COLD, LINE_RL_MID_COLD, LINE_RL_SLOW_COLD, LINE_LEFT_OUTSTEER_COLD, LINE_RIGHT_OUTSTEER_COLD, LINE_NONE };
enum { LINE_MID=0, LINE_LEFT, LINE_RIGHT, LINE_RL, LINE_RL_MID, LINE_RL_SLOW, LINE_MID_COLD, LINE_LEFT_COLD, LINE_RIGHT_COLD, LINE_RL_COLD, LINE_RL_MID_COLD, LINE_RL_SLOW_COLD, LINE_NONE };
class LRaceLine;

View file

@ -27,10 +27,6 @@
#include "manual_override.h"
#include "globaldefs.h"
//#if defined(WIN32)
//#define snprintf _snprintf
//#endif
#define SECT_OVERRIDE "overrides"
LManualOverride::LManualOverride(const char *theLabel)
@ -340,21 +336,19 @@ void LManualOverrideCollection::loadFromFile(char *trackName, const char *botnam
void LManualOverrideCollection::saveToFile()
{
#if 0
char buffer[1025];
snprintf(buffer, 1024, "%sdrivers/%s/%s/%s.dat_save", GetLocalDir(), BOT_NAME, "carName", "trackName");
char buffer[1024];
snprintf(buffer, 1024, "%sdrivers/%s/%s/%s.dat_save", GetLocalDir(), "USR", "carName", "trackName");
FILE *filepointer = fopen(buffer, "w");
if (filepointer)
{
for (int i=0; i<OVERRIDE_COUNT; i++)
for (int i=0; i < override_count; i++)
{
overrides[i]->saveToFile(filepointer);
}
fclose(filepointer);
}
#endif
}
LManualOverride *LManualOverrideCollection::getOverrideForLabel(const char *label)

View file

@ -43,7 +43,7 @@ public:
void saveToFile(FILE *filepointer);
bool getOverrideValue(int dist, double *value);
void setOverrideValue(int startdist, int enddist, double value);
int valueCount() { return overrideValueCount; }
int valueCount() { return overrideValueCount; }
private:
OverrideValue *overrideValues;

View file

@ -537,9 +537,9 @@ void LRaceLine::AdjustRadius(int prev, int i, int next, double TargetRInverse, i
// Start by aligning points for a reasonable initial lane
//
tLane[rl][i] = (-(ty[rl][next] - ty[rl][prev]) * (txLeft[rl][i] - tx[rl][prev]) +
(tx[rl][next] - tx[rl][prev]) * (tyLeft[rl][i] - ty[rl][prev])) /
((ty[rl][next] - ty[rl][prev]) * (txRight[rl][i] - txLeft[rl][i]) -
(tx[rl][next] - tx[rl][prev]) * (tyRight[rl][i] - tyLeft[rl][i]));
(tx[rl][next] - tx[rl][prev]) * (tyLeft[rl][i] - ty[rl][prev])) /
((ty[rl][next] - ty[rl][prev]) * (txRight[rl][i] - txLeft[rl][i]) -
(tx[rl][next] - tx[rl][prev]) * (tyRight[rl][i] - tyLeft[rl][i]));
if (tLane[rl][i] < -0.2)
tLane[rl][i] = -0.2;
@ -972,9 +972,9 @@ double LRaceLine::getBrakeDist(int Div, int rl)
if (!(labelOverride->getOverrideValue(Div, &brakedelay_override)))
brakedelay_override = brakeDist;
if (cardata->HasTYC == TRUE && cardata->GRIP_FACTOR < 0.8)
if (cardata->GRIP_FACTOR < 0.8)
coldfactor = MIN(1.0, brakedelay_cold_override / brakedelay_override);
else if (cardata->HasTYC == TRUE && cardata->GRIP_FACTOR < 0.7)
else if (cardata->GRIP_FACTOR < 0.7)
coldfactor = MIN(1.0, (cardata->GRIP_FACTOR));
}
}
@ -1213,7 +1213,7 @@ double LRaceLine::getExtMargin(int raceline, int Div, double rInverse)
while (!done && pSide)
{
double w = pSide->startWidth +
(pSide->endWidth - pSide->startWidth) * t;
(pSide->endWidth - pSide->startWidth) * t;
// w = MX(0, w - 0.5);
// w = MN(w, 1.0);
@ -1224,8 +1224,8 @@ double LRaceLine::getExtMargin(int raceline, int Div, double rInverse)
done = true;
if ((s == TR_SIDE_LFT && pseg->type == TR_RGT ||
s == TR_SIDE_RGT && pseg->type == TR_LFT) &&
pSide->surface->kFriction < pseg->surface->kFriction)
s == TR_SIDE_RGT && pseg->type == TR_LFT) &&
pSide->surface->kFriction < pseg->surface->kFriction)
// keep a wheel on the good stuff.
w = 0;//MN(w, 1.5);
@ -1240,15 +1240,15 @@ double LRaceLine::getExtMargin(int raceline, int Div, double rInverse)
else if (pSide->style == TR_PLAN)
{
if ( /* FIXME */ (inPit && pitSide == s) ||
(pSide->raceInfo & (TR_SPEEDLIMIT | TR_PITLANE)))
(pSide->raceInfo & (TR_SPEEDLIMIT | TR_PITLANE)))
{
w = 0;
done = true;
}
if (s == m_sideMod.side &&
i >= m_sideMod.start &&
i <= m_sideMod.end)
i >= m_sideMod.start &&
i <= m_sideMod.end)
{
if (w > 0.5)
{
@ -1257,20 +1257,20 @@ double LRaceLine::getExtMargin(int raceline, int Div, double rInverse)
}
else
if (pSide->surface->kFriction < MIN_MU ||
pSide->surface->kRoughness > MAX_ROUGH ||
pSide->surface->kRollRes > MAX_RESIST ||
fabs(pSide->Kzw - SLOPE) > 0.005)
pSide->surface->kRoughness > MAX_ROUGH ||
pSide->surface->kRollRes > MAX_RESIST ||
fabs(pSide->Kzw - SLOPE) > 0.005)
{
bool inner =
s == TR_SIDE_LFT && pseg->type == TR_LFT ||
s == TR_SIDE_RGT && pseg->type == TR_RGT;
s == TR_SIDE_LFT && pseg->type == TR_LFT ||
s == TR_SIDE_RGT && pseg->type == TR_RGT;
w = 0;//inner ? MN(w, 0.5) : 0;
done = true;
}
if ((s == TR_SIDE_LFT && pseg->type == TR_RGT ||
s == TR_SIDE_RGT && pseg->type == TR_LFT) &&
pSide->surface->kFriction < pseg->surface->kFriction)
s == TR_SIDE_RGT && pseg->type == TR_LFT) &&
pSide->surface->kFriction < pseg->surface->kFriction)
{
// keep a wheel on the good stuff.
w = 0;//MN(w, 1.5);
@ -1717,8 +1717,8 @@ void LRaceLine::UpdateRacelineSpeeds(int raceType)
else if (cardata->HasTYC == true)
{
shouldUpdate = (fabs(car->_fuel - cardata->fuel) > (raceType == RM_TYPE_QUALIF ? 1.0 : 5.0) ||
fabs(car->_dammage - cardata->damage) > 100.0f ||
(/*(CaTT() - */cardata->GRIP_FACTOR < 0.8 || cardata->GRIP_FACTOR /*- CaTT()*/ > 0.9) && (cardata->TYREWEAR < cardata->CRITICAL_TYREWEAR + 0.50));
fabs(car->_dammage - cardata->damage) > 100.0f ||
(/*(CaTT() - */cardata->GRIP_FACTOR < 0.8 || cardata->GRIP_FACTOR /*- CaTT()*/ > 0.9) && (cardata->TYREWEAR < cardata->CRITICAL_TYREWEAR + 0.50));
}
else
shouldUpdate = (fabs(car->_fuel - cardata->fuel) > (raceType == RM_TYPE_QUALIF ? 1.0 : 5.0) || fabs(car->_dammage - cardata->damage) > 100.0f);
@ -1727,8 +1727,8 @@ void LRaceLine::UpdateRacelineSpeeds(int raceType)
{
if (cardata->HasTYC == true)
shouldUpdate = (fabs(car->_fuel - cardata->fuel) > (raceType == RM_TYPE_QUALIF ? 1.0 : 5.0) ||
fabs(car->_dammage - cardata->damage) > 100.0f ||
(/*(CaTT() - */cardata->GRIP_FACTOR < 0.8 || cardata->GRIP_FACTOR /*- CaTT()*/ > 0.9) && (cardata->TYREWEAR < cardata->CRITICAL_TYREWEAR + 0.50));
fabs(car->_dammage - cardata->damage) > 100.0f ||
(/*(CaTT() - */cardata->GRIP_FACTOR < 0.8 || cardata->GRIP_FACTOR /*- CaTT()*/ > 0.9) && (cardata->TYREWEAR < cardata->CRITICAL_TYREWEAR + 0.50));
else
shouldUpdate = (fabs(car->_fuel - cardata->fuel) > (raceType == RM_TYPE_QUALIF ? 1.0 : 5.0) || fabs(car->_dammage - cardata->damage) > 100.0f);
}
@ -1794,7 +1794,7 @@ void LRaceLine::ComputeRacelineBraking(int i, int rl, double **tSpeed, int speed
double Speed = (tSpeed[speedrl][i] + tSpeed[speedrl][prev]) / 2;
double LatA = tSpeed[speedrl][i] * tSpeed[speedrl][i] *
((fabs(tRInverse[rl][prev])*0.2 + fabs(tRInverse[rl][i])*0.8));
((fabs(tRInverse[rl][prev])*0.2 + fabs(tRInverse[rl][i])*0.8));
#if 1
double TanA = MAX(0.0, TireAccel * TireAccel - LatA * LatA);
@ -1852,19 +1852,19 @@ void LRaceLine::ComputeRacelineSpeed(int i, int rl, double **tSpeed, int speedrl
if (MaxSpeed > 25.0 && fabs(rInverse) > 0.0005)
{
if (rInverse < 0.0)
MaxSpeed = (MaxSpeed /*- 20.0)*/ * cardata->GRIP_FACTOR_LEFT);
MaxSpeed = (MaxSpeed * cardata->GRIP_FACTOR_LEFT);
else if (rInverse > 0.0)
MaxSpeed = (MaxSpeed /*- 20.0) */* cardata->GRIP_FACTOR_RIGHT);
MaxSpeed = (MaxSpeed * cardata->GRIP_FACTOR_RIGHT);
}
else
}
else
{
if (MaxSpeed > 25.0 && fabs(rInverse) > 0.0005)
{
if (MaxSpeed > 25.0 && fabs(rInverse) > 0.0005)
{
if (rInverse < 0.0)
MaxSpeed = (MaxSpeed * 0.94);
else if (rInverse > 0.0)
MaxSpeed = (MaxSpeed * 0.94);
}
if (rInverse < 0.0)
MaxSpeed = (MaxSpeed * 0.94);
else if (rInverse > 0.0)
MaxSpeed = (MaxSpeed * 0.94);
}
}
@ -1931,13 +1931,13 @@ void LRaceLine::NewRace(tCarElt* newcar, tSituation *s)
last_lane = MAX(0.0, MIN(1.0, car->_trkPos.toLeft / Width));
wheelbase = (car->priv.wheel[FRNT_RGT].relPos.x +
car->priv.wheel[FRNT_LFT].relPos.x -
car->priv.wheel[REAR_RGT].relPos.x -
car->priv.wheel[REAR_LFT].relPos.x) / 2;
car->priv.wheel[FRNT_LFT].relPos.x -
car->priv.wheel[REAR_RGT].relPos.x -
car->priv.wheel[REAR_LFT].relPos.x) / 2;
wheeltrack = (car->priv.wheel[FRNT_LFT].relPos.y +
car->priv.wheel[REAR_LFT].relPos.y -
car->priv.wheel[FRNT_RGT].relPos.y -
car->priv.wheel[REAR_RGT].relPos.y) / 2;
car->priv.wheel[REAR_LFT].relPos.y -
car->priv.wheel[FRNT_RGT].relPos.y -
car->priv.wheel[REAR_RGT].relPos.y) / 2;
}
////////////////////////////////////////////////////////////////////////////
@ -1965,7 +1965,7 @@ int LRaceLine::findNextCorner(tCarElt *theCar, int index, int *apex_div, double
double distance = 0.0;
int Index = (index >= 0 ? index % Divs : DivIndexForCar(theCar));
int prefer_side = ((tRInverse[LINE_RL][Index] > 0.003) ? TR_LFT :
((tRInverse[LINE_RL][Index]) < -0.003 ? TR_RGT : TR_STR));
((tRInverse[LINE_RL][Index]) < -0.003 ? TR_RGT : TR_STR));
int i = 1, div = -1;
double CR = tRInverse[LINE_RL][Index];
@ -2039,14 +2039,14 @@ int LRaceLine::findNextCorner(tCarElt *theCar, int index, int *apex_div, double
}
if ((tRInverse[LINE_RL][div] > 0 && tRInverse[LINE_RL][nextdiv] < 0.0) ||
(tRInverse[LINE_RL][div] < 0 && tRInverse[LINE_RL][nextdiv] > 0.0))
(tRInverse[LINE_RL][div] < 0 && tRInverse[LINE_RL][nextdiv] > 0.0))
{
newdiv = -1;
break;
}
if ((tRInverse[LINE_RL][div] < 0.0 && tRInverse[LINE_RL][nextdiv] < 0.0 && tLane[LINE_RL][nextdiv] < tLane[LINE_RL][newdiv] && tLane[LINE_RL][nextdiv] > tLane[LINE_RL][Index]) ||
(tRInverse[LINE_RL][div] > 0.0 && tRInverse[LINE_RL][nextdiv] > 0.0 && tLane[LINE_RL][nextdiv] > tLane[LINE_RL][newdiv] && tLane[LINE_RL][nextdiv] < tLane[LINE_RL][Index]))
(tRInverse[LINE_RL][div] > 0.0 && tRInverse[LINE_RL][nextdiv] > 0.0 && tLane[LINE_RL][nextdiv] > tLane[LINE_RL][newdiv] && tLane[LINE_RL][nextdiv] < tLane[LINE_RL][Index]))
break;
newdiv = nextdiv;
count++;
@ -2148,7 +2148,7 @@ double LRaceLine::getLookAhead(int rl, double leftMargin, double rightMargin, bo
if (tSpeed[rl][Next] > tSpeed[rl][(Next - 5 + Divs) % Divs]) gripfactor = 1.0;
#if 1
if ((tRInverse[rl][Next] > 0.0 && driver->getAngle() < 0.0) ||
(tRInverse[rl][Next] < 0.0 && driver->getAngle() > 0.0))
(tRInverse[rl][Next] < 0.0 && driver->getAngle() > 0.0))
speedfactor = 1.0;
#endif
@ -2331,8 +2331,8 @@ int LRaceLine::DivIndex(RaceLineDriveData *data, double leftMargin, double right
data->lookahead = (float)(sqrt(dx*dx + dy * dy) * MAX(0.5, 1.0 - fabs((rInverse * 100)*(rInverse * 100))*cornersteer));
if (data->lookahead > minLookAhead &&
((thisX - indexX) * (*X - thisX) +
(thisY - indexY) * (*Y - thisY) < 0.1))
((thisX - indexX) * (*X - thisX) +
(thisY - indexY) * (*Y - thisY) < 0.1))
break;
Index = Next;
} while (tmp_Index != Index);
@ -2390,8 +2390,8 @@ int LRaceLine::DivIndex(RaceLineDriveData *data, int raceline, double *X, double
data->lookahead = (float)(sqrt(dx*dx + dy * dy) * MAX(0.5, 1.0 - fabs((tRInverse[raceline][Next] * 100)*(tRInverse[raceline][Next] * 100))*cornersteer));
if (data->lookahead > minLookAhead && // + (1.0 - MIN(0.1, MAX(0.0, 1.0 - car->_fuel / (maxfuel/2))/11)) &&
((tx[raceline][Next] - tx[raceline][Index]) * (*X - tx[raceline][Next]) +
(ty[raceline][Next] - ty[raceline][Index]) * (*Y - ty[raceline][Next]) < 0.1))
((tx[raceline][Next] - tx[raceline][Index]) * (*X - tx[raceline][Next]) +
(ty[raceline][Next] - ty[raceline][Index]) * (*Y - ty[raceline][Next]) < 0.1))
break;
Index = Next;
} while (tmp_Index != Index);
@ -2427,19 +2427,19 @@ int LRaceLine::DivIndex(RaceLineDriveData *data, int raceline, double *X, double
float LRaceLine::AdjustLookahead(int raceline, float lookahead)
{
if ((tRInverse[raceline][Next] > 0.0 && car->_trkPos.toMiddle < 0.0) ||
(tRInverse[raceline][Next] < 0.0 && car->_trkPos.toMiddle > 0.0))
(tRInverse[raceline][Next] < 0.0 && car->_trkPos.toMiddle > 0.0))
lookahead *= (float)MIN(4.0f, 1.5f + fabs(car->_trkPos.toMiddle*0.3));
else
lookahead *= (float)MAX(0.7f, 1.5f - fabs(car->_trkPos.toMiddle*0.2));
#if 1
if ((tRInverse[raceline][Next] < 0.0 && car->_trkPos.toMiddle > 0.0) ||
(tRInverse[raceline][Next] > 0.0 && car->_trkPos.toMiddle < 0.0))
(tRInverse[raceline][Next] > 0.0 && car->_trkPos.toMiddle < 0.0))
{
lookahead *= (float)MAX(1.0f, MIN(3.6f, 1.0f + (MIN(2.6f, fabs(car->_trkPos.toMiddle) / (Width / 2)) / 2) * (1.0f + fabs(tRInverse[raceline][Next]) * 65.0f + car->_speed_x / 120.0f)));
}
else if ((tRInverse[raceline][Next] < 0.0 && car->_trkPos.toRight < 5.0) ||
(tRInverse[raceline][Next] > 0.0 && car->_trkPos.toLeft < 5.0))
(tRInverse[raceline][Next] > 0.0 && car->_trkPos.toLeft < 5.0))
{
lookahead *= (float)MAX(0.8f, MIN(1.0f, 1.0f - fabs(tRInverse[raceline][Next])*200.0 * ((5.0f - MIN(car->_trkPos.toRight, car->_trkPos.toLeft)) / 5.0f)));
}
@ -2522,9 +2522,9 @@ double LRaceLine::CalculateOfflineSpeed(int index, int next, double leftMargin,
double nextY = AdjustTyForMargin(next, nextLane);
double c0 = (nextX - indexX) * (nextX - X) +
(nextY - indexY) * (nextY - Y);
(nextY - indexY) * (nextY - Y);
double c1 = (nextX - indexX) * (X - indexX) +
(nextY - indexY) * (Y - indexY);
(nextY - indexY) * (Y - indexY);
double sum = c0 + c1;
c0 /= sum;
@ -2926,21 +2926,21 @@ void LRaceLine::GetRaceLineData(RaceLineDriveData *data, bool transitioning)
// Stop the car changing direction suddenly
if ((leftTargetMargin < leftCurrentMargin && leftPredictMargin > leftCurrentMargin) ||
(leftTargetMargin > leftCurrentMargin && leftPredictMargin < leftCurrentMargin))
(leftTargetMargin > leftCurrentMargin && leftPredictMargin < leftCurrentMargin))
{
leftCurrentMargin = leftPredictMargin;
data->linemode->SetLeftCurrentMargin(leftCurrentMargin);
}
if ((rightTargetMargin < rightCurrentMargin && rightPredictMargin > rightCurrentMargin) ||
(rightTargetMargin > rightCurrentMargin && rightPredictMargin < rightCurrentMargin))
(rightTargetMargin > rightCurrentMargin && rightPredictMargin < rightCurrentMargin))
{
rightCurrentMargin = rightPredictMargin;
data->linemode->SetRightCurrentMargin(rightCurrentMargin);
}
if ((MAX(tRInverse[LINE_RIGHT][Next], tRInverse[LINE_RL][Next]) > 0.002 && leftTargetMargin > leftCurrentMargin) ||
(MIN(tRInverse[LINE_LEFT][Next], tRInverse[LINE_RL][Next]) < -0.002 && rightTargetMargin < rightCurrentMargin))
(MIN(tRInverse[LINE_LEFT][Next], tRInverse[LINE_RL][Next]) < -0.002 && rightTargetMargin < rightCurrentMargin))
outsteer = true;
else
{
@ -2949,7 +2949,7 @@ void LRaceLine::GetRaceLineData(RaceLineDriveData *data, bool transitioning)
int div = (Next + i) % Divs;
if ((MAX(tRInverse[LINE_RIGHT][div], tRInverse[LINE_RL][div]) > 0.002 && leftTargetMargin > leftCurrentMargin) ||
(MIN(tRInverse[LINE_LEFT][div], tRInverse[LINE_RL][div]) < -0.002 && rightTargetMargin < rightCurrentMargin))
(MIN(tRInverse[LINE_LEFT][div], tRInverse[LINE_RL][div]) < -0.002 && rightTargetMargin < rightCurrentMargin))
{
outsteer = true;
break;
@ -3012,19 +3012,19 @@ void LRaceLine::GetRaceLineData(RaceLineDriveData *data, bool transitioning)
else if (data->s->currentTime - driver->pitTimer < 5.0)
tiFactor *= 1.0 + (5.0 - (data->s->currentTime - driver->pitTimer)) * (cardata->GRIP_FACTOR);
else if ((targetRaceline && car->_accel_x > 0 && ((leftCurrentMargin > 0.0001 && tRInverse[LINE_RL][Next] < -0.001) || // recover to raceline and on the inside
(rightCurrentMargin < 1.0 && tRInverse[LINE_RL][Next] > 0.001))) || // on exit from a corner...
((rightCurrentMargin < 1.0 && rightTargetMargin > rightCurrentMargin && tRInverse[LINE_RL][Next] < -0.001) || // avoiding on the outside & there's room
(leftCurrentMargin > 0.001 && leftTargetMargin < leftCurrentMargin && tRInverse[LINE_RL][Next] > 0.001)) || // on the inside to use more space...
(!targetRaceline && offlineSpeed > car->_speed_x - 1.0 && fabs(data->racesteer) < 0.1 && fabs(data->angle) < 0.1 && // car's close to target raceline, so lets
((leftTargetMargin > 0.0001 && carMargin > leftTargetMargin && futureCarMargin > leftTargetMargin) || // adjust faster...
(rightTargetMargin < 1.000 && carMargin < rightTargetMargin && futureCarMargin < rightTargetMargin))))
(rightCurrentMargin < 1.0 && tRInverse[LINE_RL][Next] > 0.001))) || // on exit from a corner...
((rightCurrentMargin < 1.0 && rightTargetMargin > rightCurrentMargin && tRInverse[LINE_RL][Next] < -0.001) || // avoiding on the outside & there's room
(leftCurrentMargin > 0.001 && leftTargetMargin < leftCurrentMargin && tRInverse[LINE_RL][Next] > 0.001)) || // on the inside to use more space...
(!targetRaceline && offlineSpeed > car->_speed_x - 1.0 && fabs(data->racesteer) < 0.1 && fabs(data->angle) < 0.1 && // car's close to target raceline, so lets
((leftTargetMargin > 0.0001 && carMargin > leftTargetMargin && futureCarMargin > leftTargetMargin) || // adjust faster...
(rightTargetMargin < 1.000 && carMargin < rightTargetMargin && futureCarMargin < rightTargetMargin))))
{
tiFactor *= 3.0;
}
else
{
if ((leftTargetMargin > data->linemode->GetLeftCurrentMargin() && tRInverse[LINE_RIGHT][Next] < -0.001) ||
(rightTargetMargin < data->linemode->GetRightCurrentMargin() && tRInverse[LINE_RIGHT][Next] > 0.001))
(rightTargetMargin < data->linemode->GetRightCurrentMargin() && tRInverse[LINE_RIGHT][Next] > 0.001))
tiFactor = MIN(tiFactor, MAX(0.3, 1.0 - MAX(fabs(tRInverse[LINE_LEFT][Next]), fabs(tRInverse[LINE_RIGHT][Next]) * 20))); // avoid steering too hard towards apex
if (car->_speed_x >= data->left_speed - 1.0 && car->_speed_x > 25.0f)
@ -3348,7 +3348,7 @@ void LRaceLine::SteerTheCar(RaceLineDriveData *data, int target_raceline)
double LRaceLine::getSlowestSpeedForDistance(double distance, int raceline, double toLeft, int *slowdiv)
{
if ((raceline == LINE_LEFT && toLeft < edgeLineMargin*Width + 1.0) ||
(raceline == LINE_RIGHT && toLeft > Width - edgeLineMargin * Width - 1.0))
(raceline == LINE_RIGHT && toLeft > Width - edgeLineMargin * Width - 1.0))
{
*slowdiv = Next;
return 0.0;
@ -3452,7 +3452,7 @@ double LRaceLine::correctLimit(int line)
double nlane2left = tLane[line][Next] * Width;
if ((tRInverse[line][Next] > 0.001 && car->_trkPos.toLeft < nlane2left - 2.0) ||
(tRInverse[line][Next] < -0.001 && car->_trkPos.toLeft > nlane2left + 2.0))
(tRInverse[line][Next] < -0.001 && car->_trkPos.toLeft > nlane2left + 2.0))
//return MAX(0.2, MIN(1.0, 1.0 - fabs(tRInverse[line][Next]) * 80.0));
return MAX(0.2, MIN(1.0, 1.0 - fabs(tRInverse[line][Next]) * 100.0));
@ -3460,7 +3460,7 @@ double LRaceLine::correctLimit(int line)
double nnlane2left = tLane[line][nnext] * Width;
if ((tRInverse[line][nnext] > 0.001 && car->_trkPos.toLeft < nnlane2left - 2.0) ||
(tRInverse[line][nnext] < -0.001 && car->_trkPos.toLeft > nnlane2left + 2.0))
(tRInverse[line][nnext] < -0.001 && car->_trkPos.toLeft > nnlane2left + 2.0))
//return MAX(0.2, MIN(1.0, 1.0 - fabs(tRInverse[line][nnext]) * 40.0));
return MAX(0.3, MIN(1.0, 1.0 - fabs(tRInverse[line][nnext]) * 40.0));
@ -3469,17 +3469,17 @@ double LRaceLine::correctLimit(int line)
// Check and see if we're significantly outside it and turning a corner,
// in which case we don't want to correct too much either.
if ((tRInverse[line][Next] > 0.001 && car->_trkPos.toLeft > nlane2left + 2.0) ||
(tRInverse[line][Next] < -0.001 && car->_trkPos.toLeft < nlane2left - 2.0))
(tRInverse[line][Next] < -0.001 && car->_trkPos.toLeft < nlane2left - 2.0))
return MAX(0.2, MIN(1.0, 1.0 - fabs(tRInverse[line][Next]) * (car->_speed_x - 40.0) * 4));
if ((tRInverse[line][nnext] > 0.001 && car->_trkPos.toLeft > nlane2left + 2.0) ||
(tRInverse[line][nnext] < -0.001 && car->_trkPos.toLeft < nlane2left - 2.0))
(tRInverse[line][nnext] < -0.001 && car->_trkPos.toLeft < nlane2left - 2.0))
return MAX(0.2, MIN(1.0, 1.0 - fabs(tRInverse[line][nnext]) * (car->_speed_x - 40.0) * 2));
#endif
// Check and see if we're outside it and turning into a corner,
// in which case we want to correct more to try and get closer to the apex.
if ((tRInverse[line][Next] > 0.001 && tLane[Next] <= tLane[(Next - 5 + Divs) % Divs] && car->_trkPos.toLeft > nlane2left + 2.0) ||
(tRInverse[line][Next] < -0.001 && tLane[Next] >= tLane[(Next - 5 + Divs) % Divs] && car->_trkPos.toLeft < nlane2left - 2.0))
(tRInverse[line][Next] < -0.001 && tLane[Next] >= tLane[(Next - 5 + Divs) % Divs] && car->_trkPos.toLeft < nlane2left - 2.0))
return MAX(1.0, MIN(1.5, 1.0 + fabs(tRInverse[line][Next])));
return 1.0;
@ -3521,9 +3521,9 @@ double LRaceLine::getAvoidSpeed(float distance1, float distance2)
/* Set "savedata" to 1 in the xml file
Not used in race, just for look at */
// saved in your Local directory .torcs/drivers/[module_name]/tracks/[track_name].data
// saved in your Local directory .torcs/drivers/[module_name]/tracks/[track_name].data
//void LRaceLine::storeData( void **carParmHandle )
//void LRaceLine::storeData( void **carParmHandle )
void LRaceLine::StoreData(tTrack* t)
{
int rlLine = 0;
@ -3564,13 +3564,13 @@ void LRaceLine::WriteLine(tTrack* track)
for (i = 0; i < Divs; i++)
{
fprintf(tfile, "%d %f %f %f %f %f %f\n",
i,
tDistance[i],
tLane[rl][i],
tx[rl][i], ty[rl][i],
tRInverse[rl][i],
tSpeed[rl][i]
);
i,
tDistance[i],
tLane[rl][i],
tx[rl][i], ty[rl][i],
tRInverse[rl][i],
tSpeed[rl][i]
);
}
fprintf(tfile, "#End\n");
fprintf(tfile, "#===============\n");