forked from speed-dreams/speed-dreams-code
- Update Shadow's driver (bug with damages for pit stop)
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@6366 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 0acbd20405063f2bb79808830954752865121176 Former-commit-id: b6c4b98fc78a64b28a1dad6a9cc9cbdeabba6f09
This commit is contained in:
parent
055981fb62
commit
449fd0a073
2 changed files with 30 additions and 22 deletions
|
@ -76,6 +76,7 @@
|
|||
#define PRV_FUELPERMETERS "fuel per meters"
|
||||
#define PRV_FUELPERLAPS "fuel per lap"
|
||||
#define PRV_RESERVE "reserve"
|
||||
#define PRV_DAMAGE "damage"
|
||||
#define PRV_FULL_FUEL "full fuel"
|
||||
#define PRV_VERBOSE "strategyverbose"
|
||||
#define PRV_NEED_SIN "use sin long"
|
||||
|
|
|
@ -25,12 +25,13 @@
|
|||
|
||||
#include "Strategy.h"
|
||||
|
||||
|
||||
SimpleStrategy::SimpleStrategy()
|
||||
{
|
||||
MAX_FUEL_PER_METER = 0.00068f; // [liter/m] max fuel consumtion.
|
||||
MAX_FUEL_TANK = 83.0f; // [Kg] Fuel: Car Tank capacity.(for car3-trb1)
|
||||
PIT_DAMMAGE = 5000; // [-] max damage before test_Pitstop
|
||||
MAX_DAMAGE = 8000; // [-] max damage limit in the last five laps before the pit stop.
|
||||
MAX_DAMAGE = 4000; // [-] max damage limit in the last five laps before the pit stop.
|
||||
fuel_Strat = 1; // [-] Pit refuel strategy for Short(1) or Long(2) track.
|
||||
|
||||
needRepair = false; // [-] Need to repair (amount of damage)
|
||||
|
@ -42,6 +43,7 @@ SimpleStrategy::SimpleStrategy()
|
|||
m_checkFuel = false; // [-] Needed fuel checked.
|
||||
strategy_verbose = 0; // [-] Display information about refuel and repair.
|
||||
|
||||
FuelperMeters = 0.0f;
|
||||
fuelPerLap = 0.0f; // [Kg] The maximum amount of fuel we needed for a lap.
|
||||
lastPitFuel = 0.0f; // [Kg] Amount refueled, special case when we refuel.
|
||||
fuelSum = 0.0f; // [Kg] All the fuel used.
|
||||
|
@ -66,13 +68,18 @@ void SimpleStrategy::setFuelAtRaceStart(tTrack* t, void **carParmHandle, tSituat
|
|||
{
|
||||
Track = t;
|
||||
TrackLength = Track->length;
|
||||
LogSHADOW.info("Strategy Track Lengh = %.2f\n", TrackLength);
|
||||
RaceDistance = TrackLength * s->_totLaps;
|
||||
LogSHADOW.info("Strategy Race Distance = %.2f\n", RaceDistance);
|
||||
/* Trivial strategy: fill in as much fuel as required for the whole race, or if the tank is
|
||||
too small fill the tank completely. */
|
||||
// Load and set parameters.
|
||||
maxFuel = (tdble)(GfParmGetNum(*carParmHandle, SECT_CAR, PRM_TANK, (char*)NULL, (tdble) MAX_FUEL_TANK));
|
||||
fuelPerMeter = GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_FUELPERMETERS, (char*)NULL, MAX_FUEL_PER_METER);
|
||||
fuelPerLap = GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_FUELPERLAPS, (char*)NULL, t->length * fuelPerMeter);
|
||||
LogSHADOW.info("Strategy max fuel = %.2f\n", maxFuel);
|
||||
FuelperMeters = GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_FUELPERMETERS, (char*)NULL, (tdble) MAX_FUEL_PER_METER);
|
||||
LogSHADOW.info("Strategy fuel per meters = %.5f\n", FuelperMeters);
|
||||
fuelPerLap = TrackLength * FuelperMeters;
|
||||
LogSHADOW.info("Strategy fuel per lap = %.2f\n", fuelPerLap);
|
||||
fullfuel = GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_FULL_FUEL, (char*)NULL, 0.0);
|
||||
fuel_Strat = (int)GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_PITSTRAT, (char*)NULL, 0.0);
|
||||
test_Pitstop = (GfParmGetNum(*carParmHandle, SECT_PRIV, PRV_PITSTOP, (char*)NULL, 0.0) != 0);
|
||||
|
@ -96,7 +103,7 @@ void SimpleStrategy::setFuelAtRaceStart(tTrack* t, void **carParmHandle, tSituat
|
|||
int raceLaps = s->_totLaps + 1;
|
||||
//raceDist = raceLaps * t->length;
|
||||
//fuelForRace = raceDist * fuelPerMeter;
|
||||
fuelForRace = s->_totLaps * fuelPerLap;
|
||||
fuelForRace = raceLaps * fuelPerLap;
|
||||
numPitstop = (tdble) fabs(fuelForRace / maxFuel);
|
||||
if ( numPitstop < fuelForRace / maxFuel )
|
||||
{
|
||||
|
@ -107,10 +114,10 @@ void SimpleStrategy::setFuelAtRaceStart(tTrack* t, void **carParmHandle, tSituat
|
|||
|
||||
if (shortTrack)
|
||||
{
|
||||
m_fuel = fuelPerLap * 2.0;
|
||||
m_fuel = fuelPerLap * 1.2;
|
||||
} else
|
||||
{
|
||||
m_fuel = fuelPerLap * 1.4;
|
||||
m_fuel = fuelPerLap * 1.3;
|
||||
}
|
||||
|
||||
if ( index == 1 )
|
||||
|
@ -228,7 +235,7 @@ void SimpleStrategy::updateFuelStrategy(tCarElt* car, tSituation *s)
|
|||
if (!m_checkFuel && requiredfuel <= 0.0f && car->_remainingLaps <= 5)
|
||||
{
|
||||
// We have enough fuel to end the race, no further stop required.
|
||||
GfOut("%s No Pitstop required > carFuel:%.2f, remLap:%d\n", car->_name,car->_fuel, car->_remainingLaps);
|
||||
LogSHADOW.debug("%s No Pitstop required > carFuel:%.2f, remLap:%d\n", car->_name,car->_fuel, car->_remainingLaps);
|
||||
m_checkFuel = true;
|
||||
return;
|
||||
}
|
||||
|
@ -236,7 +243,7 @@ void SimpleStrategy::updateFuelStrategy(tCarElt* car, tSituation *s)
|
|||
// We don't have enough fuel to end the race need at least one stop.
|
||||
if (!m_checkFuel && requiredfuel > 0.0f && car->_fuel < fuelPerLap * 3.0)
|
||||
{
|
||||
GfOut("%s Pitstop needed to refuel >> reqFuel: %.2f, carFuel: %.2f, remLap: %d\n",
|
||||
LogSHADOW.debug("%s Pitstop needed to refuel >> reqFuel: %.2f, carFuel: %.2f, remLap: %d\n",
|
||||
car->_name, requiredfuel, car->_fuel, car->_remainingLaps);
|
||||
m_checkFuel = true;
|
||||
}
|
||||
|
@ -249,7 +256,7 @@ bool SimpleStrategy::needPitstop(tCarElt* car, tSituation *s)
|
|||
int m_maxDamage = PIT_DAMMAGE;
|
||||
float attvalue = 0.0f;
|
||||
// load defined value in xml file of Max Dammage before pitstops for this track
|
||||
//attvalue = GfParmGetNum(car->_carHandle, BT_SECT_PRIV, BT_ATT_MAXDAMMAGE, (char*) NULL, PIT_DAMMAGE);
|
||||
attvalue = GfParmGetNum(car->_carHandle, SECT_PRIV, PRV_DAMAGE, (char*) NULL, PIT_DAMMAGE);
|
||||
m_maxDamage = (int)attvalue;
|
||||
// Estimated average fuel per lap
|
||||
//m_Fuel = GfParmGetNum(car->_carHandle, BT_SECT_PRIV, BT_ATT_FUELPERLAP, (char*) NULL, m_expectedfuelperlap);
|
||||
|
@ -281,7 +288,7 @@ bool SimpleStrategy::needPitstop(tCarElt* car, tSituation *s)
|
|||
{
|
||||
if (!m_checkFuel)
|
||||
{
|
||||
GfOut("%s Go to Pit the next lap to refuel: reqFuel=%.2f, carFuel=%.2f, remLap=%d\n",
|
||||
LogSHADOW.debug("%s Go to Pit the next lap to refuel: reqFuel=%.2f, carFuel=%.2f, remLap=%d\n",
|
||||
car->_name, reqfuel, car->_fuel, car->_remainingLaps);
|
||||
m_checkFuel = true;
|
||||
}
|
||||
|
@ -297,7 +304,7 @@ bool SimpleStrategy::needPitstop(tCarElt* car, tSituation *s)
|
|||
{
|
||||
if (!m_checkDamage)
|
||||
{
|
||||
GfOut("%s >> Max_damage: %d Car_damage: %d Laps_toGo: %d\n",
|
||||
LogSHADOW.debug("%s >> Max_damage: %d Car_damage: %d Laps_toGo: %d\n",
|
||||
car->_name, m_maxDamage, car->_dammage, laps_to_go(car));
|
||||
m_checkDamage = true;
|
||||
}
|
||||
|
@ -312,7 +319,7 @@ bool SimpleStrategy::needPitstop(tCarElt* car, tSituation *s)
|
|||
{
|
||||
if (!m_checkDamage)
|
||||
{
|
||||
GfOut("%s Dont Stop At Pit!> Laps_toGo:%d Car_damage: %d Max_damage: %d\n",
|
||||
LogSHADOW.debug("%s Dont Stop At Pit!> Laps_toGo:%d Car_damage: %d Max_damage: %d\n",
|
||||
car->_name, laps_to_go(car), car->_dammage, m_maxDamage);
|
||||
m_checkDamage = true;
|
||||
needRepair = false;
|
||||
|
@ -356,7 +363,7 @@ int SimpleStrategy::pitRepair(tCarElt* car, tSituation *s)
|
|||
needRepair = false;
|
||||
}
|
||||
|
||||
fprintf(stderr,"# %s repairing %d dammage\n", car->_name, damRepair);
|
||||
LogSHADOW.debug("# %s repairing %d dammage\n", car->_name, damRepair);
|
||||
return damRepair;
|
||||
}
|
||||
|
||||
|
@ -392,9 +399,9 @@ float SimpleStrategy::pitRefuel(tCarElt* car, tSituation *s)
|
|||
/* Long track strategy eg Spring*/
|
||||
if (strategy_verbose)
|
||||
{
|
||||
fprintf(stderr,">> [PitStrat 2] ");
|
||||
LogSHADOW.debug(">> [PitStrat 2] ");
|
||||
}
|
||||
fprintf(stderr," %s in Pit to refuel < PitStop %d >\n", car->_name, countPitStop);
|
||||
LogSHADOW.debug(" %s in Pit to refuel < PitStop %d >\n", car->_name, countPitStop);
|
||||
|
||||
m_fuelperstint = (tdble)((fuelToEnd / num_remStops) + addFuel);
|
||||
|
||||
|
@ -415,7 +422,7 @@ float SimpleStrategy::pitRefuel(tCarElt* car, tSituation *s)
|
|||
/* Strategy for short track and track length less than 5000m*/
|
||||
if (strategy_verbose)
|
||||
{
|
||||
fprintf(stderr,">> [PitStrat 1] ");
|
||||
LogSHADOW.debug(">> [PitStrat 1] ");
|
||||
}
|
||||
|
||||
if (m_remainingstops >= 1)
|
||||
|
@ -427,7 +434,7 @@ float SimpleStrategy::pitRefuel(tCarElt* car, tSituation *s)
|
|||
}
|
||||
|
||||
fuel = MIN(m_fuelperstint - car->_fuel, car->_tank - car->_fuel);
|
||||
fprintf(stderr," %s in Pit to refuel %.2fl < PitStop %d >\n", car->_name, fuel, countPitStop);
|
||||
LogSHADOW.debug(" %s in Pit to refuel %.2fl < PitStop %d >\n", car->_name, fuel, countPitStop);
|
||||
}
|
||||
|
||||
|
||||
|
@ -441,21 +448,21 @@ float SimpleStrategy::pitRefuel(tCarElt* car, tSituation *s)
|
|||
#ifdef STRAT_DEBUG
|
||||
double totalFuel = s->_totLaps * fuelPerLap;
|
||||
double fuelPerPitStop = totalFuel / 4;
|
||||
fprintf(stderr,"[%s()] totalFuel=%.2f fuelPerPitStop=%.2f inLap=%d lapsToEnd=%d m_fuelperstint=%.2f car_fuel=%.2f fuel=%.2f\n",
|
||||
LogSHADOW.debug("[%s()] totalFuel=%.2f fuelPerPitStop=%.2f inLap=%d lapsToEnd=%d m_fuelperstint=%.2f car_fuel=%.2f fuel=%.2f\n",
|
||||
__FUNCTION__, totalFuel, fuelPerPitStop, inLap, lapsToEnd, m_fuelperstint, car->_fuel, fuel);
|
||||
#endif
|
||||
|
||||
if (strategy_verbose) {
|
||||
if (!m_remainingstops) {
|
||||
fprintf(stderr,"# Last Pitstop for %s: LapsToEnd: %d, LapsBehindLeader: %d, fuelToEnd: %.2f, FuelperLap: %.2f\n",
|
||||
LogSHADOW.debug("# Last Pitstop for %s: LapsToEnd: %d, LapsBehindLeader: %d, fuelToEnd: %.2f, FuelperLap: %.2f\n",
|
||||
car->_name, lapsToEnd, car->_lapsBehindLeader, fuelToEnd, fuelPerLap);
|
||||
} else {
|
||||
fprintf(stderr,"# [%s()] LapsToEnd: %d, LapsBehindLeader: %d, FuelToEnd: %.2f, FuelperLap: %.2f,\n", __FUNCTION__,
|
||||
LogSHADOW.debug("# [%s()] LapsToEnd: %d, LapsBehindLeader: %d, FuelToEnd: %.2f, FuelperLap: %.2f,\n", __FUNCTION__,
|
||||
lapsToEnd, car->_lapsBehindLeader, fuelToEnd, fuelPerLap);
|
||||
}
|
||||
fprintf(stderr,">> %s ReFueling %.2f, Fuel needed = %.2f, carFuel= %.2f, remPitStop= %d\n",
|
||||
LogSHADOW.debug(">> %s ReFueling %.2f, Fuel needed = %.2f, carFuel= %.2f, remPitStop= %d\n",
|
||||
car->_name, fuel, m_fuelperstint, car->_fuel, m_remainingstops);
|
||||
fprintf(stderr," \n");
|
||||
LogSHADOW.debug(" \n");
|
||||
}
|
||||
|
||||
lastPitFuel = fuel;
|
||||
|
|
Loading…
Reference in a new issue