mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 10:29:19 +02:00
build 170825. tweaks and fixes to AI brake handling, scan table distance calculation fix
This commit is contained in:
216
Driver.cpp
216
Driver.cpp
@@ -222,8 +222,8 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len )
|
|||||||
// może być NULL, jeśli koniec toru (????)
|
// może być NULL, jeśli koniec toru (????)
|
||||||
vPos =
|
vPos =
|
||||||
(iFlags & spReverse) ?
|
(iFlags & spReverse) ?
|
||||||
trTrack->CurrentSegment()->FastGetPoint_0() :
|
trTrack->CurrentSegment()->FastGetPoint_1() : // drugi koniec istotny
|
||||||
trTrack->CurrentSegment()->FastGetPoint_1(); // drugi koniec istotny
|
trTrack->CurrentSegment()->FastGetPoint_0();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1250,11 +1250,15 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
else {
|
else {
|
||||||
// przyspieszenie: ujemne, gdy trzeba hamować
|
// przyspieszenie: ujemne, gdy trzeba hamować
|
||||||
a = ( v * v - mvOccupied->Vel * mvOccupied->Vel ) / ( 25.92 * d );
|
a = ( v * v - mvOccupied->Vel * mvOccupied->Vel ) / ( 25.92 * d );
|
||||||
auto const brakingdistance = fBrakeDist * braking_distance_multiplier( v );
|
if( ( mvOccupied->Vel < v )
|
||||||
if( brakingdistance > 0.0 ) {
|
|| ( v == 0.0 ) ) {
|
||||||
// maintain desired acc while we have enough room to brake safely, when close enough start paying attention
|
// if we're going slower than the target velocity and there's enough room for safe stop, speed up
|
||||||
// try to make a smooth transition instead of sharp change
|
auto const brakingdistance = fBrakeDist * braking_distance_multiplier( v );
|
||||||
a = interpolate( a, AccPreferred, clamp( ( d - brakingdistance ) / brakingdistance, 0.0, 1.0 ) );
|
if( brakingdistance > 0.0 ) {
|
||||||
|
// maintain desired acc while we have enough room to brake safely, when close enough start paying attention
|
||||||
|
// try to make a smooth transition instead of sharp change
|
||||||
|
a = interpolate( a, AccPreferred, clamp( ( d - brakingdistance ) / brakingdistance, 0.0, 1.0 ) );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if( ( d < fMinProximityDist )
|
if( ( d < fMinProximityDist )
|
||||||
&& ( v < fVelDes ) ) {
|
&& ( v < fVelDes ) ) {
|
||||||
@@ -3850,6 +3854,12 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// na jaką odleglość i z jaką predkością ma podjechać
|
// na jaką odleglość i z jaką predkością ma podjechać
|
||||||
fMinProximityDist = 5.0;
|
fMinProximityDist = 5.0;
|
||||||
fMaxProximityDist = 10.0; //[m]
|
fMaxProximityDist = 10.0; //[m]
|
||||||
|
if( pVehicles[ 0 ] != pVehicles[ 1 ] ) {
|
||||||
|
// for larger consists increase margins to account for slower braking etc
|
||||||
|
// NOTE: this will affect also multi-unit vehicles TBD: is this what we want?
|
||||||
|
fMinProximityDist *= 2.0;
|
||||||
|
fMaxProximityDist *= 2.0;
|
||||||
|
}
|
||||||
fVelPlus = 2.0; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
fVelPlus = 2.0; // dopuszczalne przekroczenie prędkości na ograniczeniu bez hamowania
|
||||||
// margines prędkości powodujący załączenie napędu
|
// margines prędkości powodujący załączenie napędu
|
||||||
// były problemy z jazdą np. 3km/h podczas ładowania wagonów
|
// były problemy z jazdą np. 3km/h podczas ładowania wagonów
|
||||||
@@ -4062,10 +4072,11 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// no chyba żeby to uwzgldnić już w (ActualProximityDist)
|
// no chyba żeby to uwzgldnić już w (ActualProximityDist)
|
||||||
VelDesired = fVelMax; // wstępnie prędkość maksymalna dla pojazdu(-ów), będzie
|
VelDesired = fVelMax; // wstępnie prędkość maksymalna dla pojazdu(-ów), będzie
|
||||||
// następnie ograniczana
|
// następnie ograniczana
|
||||||
if (TrainParams) // jeśli ma rozkład
|
if( ( TrainParams )
|
||||||
if (TrainParams->TTVmax > 0.0) // i ograniczenie w rozkładzie
|
&& ( TrainParams->TTVmax > 0.0 ) ) {
|
||||||
VelDesired = Global::Min0RSpeed(VelDesired,
|
// jeśli ma rozkład i ograniczenie w rozkładzie to nie przekraczać rozkladowej
|
||||||
TrainParams->TTVmax); // to nie przekraczać rozkladowej
|
VelDesired = Global::Min0RSpeed( VelDesired, TrainParams->TTVmax );
|
||||||
|
}
|
||||||
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
SetDriverPsyche(); // ustawia AccPreferred (potrzebne tu?)
|
||||||
// Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki prędkosci
|
// Ra: odczyt (ActualProximityDist), (VelNext) i (AccPreferred) z tabelki prędkosci
|
||||||
AccDesired = AccPreferred; // AccPreferred wynika z osobowości mechanika
|
AccDesired = AccPreferred; // AccPreferred wynika z osobowości mechanika
|
||||||
@@ -4131,14 +4142,11 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// i dopiero wtedy zmienić kierunek jazdy, oczekując podania
|
// i dopiero wtedy zmienić kierunek jazdy, oczekując podania
|
||||||
// prędkości >0.5
|
// prędkości >0.5
|
||||||
if (comm == cm_Command) // jeśli komenda Shunt
|
if (comm == cm_Command) // jeśli komenda Shunt
|
||||||
iDrivigFlags |=
|
iDrivigFlags |= moveStopHere; // to ją odbierz bez przemieszczania się (np.
|
||||||
moveStopHere; // to ją odbierz bez przemieszczania się (np.
|
|
||||||
// odczep wagony po dopchnięciu do końca toru)
|
// odczep wagony po dopchnięciu do końca toru)
|
||||||
iDirectionOrder = -iDirection; // zmiana kierunku jazdy
|
iDirectionOrder = -iDirection; // zmiana kierunku jazdy
|
||||||
OrderList[OrderPos] = TOrders(OrderList[OrderPos] |
|
// zmiana kierunku bez psucia kolejnych komend
|
||||||
Change_direction); // zmiana kierunku
|
OrderList[OrderPos] = TOrders(OrderList[OrderPos] | Change_direction);
|
||||||
// bez psucia
|
|
||||||
// kolejnych komend
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
double vel = mvOccupied->Vel; // prędkość w kierunku jazdy
|
double vel = mvOccupied->Vel; // prędkość w kierunku jazdy
|
||||||
@@ -4297,11 +4305,11 @@ bool TController::UpdateSituation(double dt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (mvOccupied->V == 0.0)
|
if( mvOccupied->V == 0.0 ) {
|
||||||
AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego
|
// Ra 2014-03: jesli skład stoi, to działa na niego składowa styczna grawitacji
|
||||||
// składowa styczna grawitacji
|
AbsAccS = fAccGravity;
|
||||||
else
|
}
|
||||||
{
|
else {
|
||||||
AbsAccS = 0;
|
AbsAccS = 0;
|
||||||
TDynamicObject *d = pVehicles[0]; // pojazd na czele składu
|
TDynamicObject *d = pVehicles[0]; // pojazd na czele składu
|
||||||
while (d)
|
while (d)
|
||||||
@@ -4310,15 +4318,9 @@ bool TController::UpdateSituation(double dt)
|
|||||||
d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
|
d = d->Next(); // kolejny pojazd, podłączony od tyłu (licząc od czoła)
|
||||||
}
|
}
|
||||||
AbsAccS /= fMass;
|
AbsAccS /= fMass;
|
||||||
//AbsAccS = iDirection * mvOccupied->AccS; // przyspieszenie chwilowe, liczone
|
|
||||||
}
|
}
|
||||||
AbsAccS_pub = AbsAccS;
|
AbsAccS_pub = AbsAccS;
|
||||||
// jako różnica skierowanej prędkości w
|
|
||||||
// czasie
|
|
||||||
// if (mvOccupied->V<0.0) AbsAccS=-AbsAccS; //Ra 2014-03: to trzeba przemyśleć
|
|
||||||
// if (vel<0) //jeżeli się stacza w tył; 2014-03: to jest bez sensu, bo vel>=0
|
|
||||||
// AbsAccS=-AbsAccS; //to przyspieszenie też działa wtedy w nieodpowiednią stronę
|
|
||||||
// AbsAccS+=fAccGravity; //wypadkowe przyspieszenie (czy to ma sens?)
|
|
||||||
#if LOGVELOCITY
|
#if LOGVELOCITY
|
||||||
// WriteLog("VelDesired="+AnsiString(VelDesired)+",
|
// WriteLog("VelDesired="+AnsiString(VelDesired)+",
|
||||||
// VelSignal="+AnsiString(VelSignal));
|
// VelSignal="+AnsiString(VelSignal));
|
||||||
@@ -4343,10 +4345,11 @@ bool TController::UpdateSituation(double dt)
|
|||||||
// jeśli jedzie
|
// jeśli jedzie
|
||||||
if( ( vel < VelNext )
|
if( ( vel < VelNext )
|
||||||
&& ( ActualProximityDist > fMaxProximityDist * ( 1.0 + 0.1 * vel ) ) ) {
|
&& ( ActualProximityDist > fMaxProximityDist * ( 1.0 + 0.1 * vel ) ) ) {
|
||||||
// dojedz do semafora/przeszkody
|
|
||||||
// jeśli jedzie wolniej niż można i jest wystarczająco daleko, to można przyspieszyć
|
// jeśli jedzie wolniej niż można i jest wystarczająco daleko, to można przyspieszyć
|
||||||
if (AccPreferred > 0.0) // jeśli nie ma zawalidrogi
|
if( AccPreferred > 0.0 ) {
|
||||||
|
// jeśli nie ma zawalidrogi dojedz do semafora/przeszkody
|
||||||
AccDesired = AccPreferred;
|
AccDesired = AccPreferred;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (ActualProximityDist > fMinProximityDist) {
|
else if (ActualProximityDist > fMinProximityDist) {
|
||||||
// jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze jest daleko
|
// jedzie szybciej, niż trzeba na końcu ActualProximityDist, ale jeszcze jest daleko
|
||||||
@@ -4360,84 +4363,27 @@ bool TController::UpdateSituation(double dt)
|
|||||||
AccDesired = std::min( AccDesired, fAccThreshold );
|
AccDesired = std::min( AccDesired, fAccThreshold );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((vel < VelNext + fVelPlus)||((vel<VelNext+2*fVelPlus)&&
|
|
||||||
(vel*vel<(VelNext + fVelPlus)*(VelNext + fVelPlus)-12.96*ActualProximityDist*std::min(0.0,AbsAccS)))) // jeśli niewielkie przekroczenie
|
|
||||||
{ // AccDesired=0.0;
|
|
||||||
AccDesired = 0.01; // proteza trochę: to
|
|
||||||
}
|
|
||||||
else if( (mvControlling->CategoryFlag == 1) && (ActualProximityDist*25.92*fBrake_a0[0] > 2*vel*vel))
|
|
||||||
{ // jeśli ma stanąć, a mieści się w drodze hamowania
|
|
||||||
AccDesired = AccPreferred;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
else if ((vel < VelNext + 20.0)&&(false)) // dwustopniowe hamowanie - niski przy małej różnicy
|
|
||||||
{ // jeśli jedzie wolniej niż VelNext+35km/h //Ra: 40, żeby nie
|
|
||||||
// kombinował na zwrotnicach
|
|
||||||
if (VelNext == 0.0)
|
|
||||||
{ // jeśli ma się zatrzymać, musi być to robione precyzyjnie i skutecznie
|
|
||||||
if (ActualProximityDist > fBrakeDist)
|
|
||||||
{ // jeśli ma stanąć, a mieści się w drodze hamowania
|
|
||||||
if (vel < 10.0) // jeśli prędkość jest łatwa do zatrzymania
|
|
||||||
{ // tu jest trochę problem, bo do punktu zatrzymania dobija
|
|
||||||
// na raty
|
|
||||||
// AccDesired=AccDesired<0.0?0.0:0.1*AccPreferred;
|
|
||||||
AccDesired = AccPreferred; // proteza trochę; jak tu
|
|
||||||
// wychodzi 0.05, to loki
|
|
||||||
// mają problem utrzymać
|
|
||||||
// takie przyspieszenie
|
|
||||||
}
|
|
||||||
else if (vel <= 30.0) // trzymaj 30 km/h
|
|
||||||
AccDesired = Min0R(0.5 * AccDesired,
|
|
||||||
AccPreferred); // jak jest tu 0.5, to
|
|
||||||
// samochody się
|
|
||||||
// dobijają do siebie
|
|
||||||
else
|
|
||||||
AccDesired = 0.0;
|
|
||||||
}
|
|
||||||
else // 25.92 (=3.6*3.6*2) - przelicznik z km/h na m/s
|
|
||||||
// niech nie hamuje, chyba że coś z przodu
|
|
||||||
AccDesired = -(vel * vel) /
|
|
||||||
(25.92 * (ActualProximityDist +
|
|
||||||
0.1-0.5*(fMinProximityDist+fMaxProximityDist))); //-fMinProximityDist));//-0.1;
|
|
||||||
////mniejsze opóźnienie przy małej różnicy
|
|
||||||
ReactionTime = 0.1; // i orientuj się szybciej, jak masz stanąć
|
|
||||||
}
|
|
||||||
else if (vel < VelNext + fVelPlus) // jeśli niewielkie
|
|
||||||
// przekroczenie, ale ma jechać
|
|
||||||
AccDesired = std::min( 0.0, AccPreferred ); // to olej (zacznij luzować)
|
|
||||||
else
|
|
||||||
{ // jeśli większe przekroczenie niż fVelPlus [km/h], ale ma jechać
|
|
||||||
// Ra 2F1I: jak było (VelNext+fVelPlus) tu, to hamował zbyt
|
|
||||||
// późno przed 40, a potem zbyt mocno i zwalniał do 30
|
|
||||||
AccDesired = (VelNext * VelNext - vel * vel) /
|
|
||||||
(25.92 * ActualProximityDist +
|
|
||||||
0.1); // mniejsze opóźnienie przy małej różnicy
|
|
||||||
if( ActualProximityDist < fMaxProximityDist ) {
|
|
||||||
// i orientuj się szybciej, jeśli w krytycznym przedziale
|
|
||||||
ReactionTime = 0.1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
else {
|
else {
|
||||||
// przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia)
|
// przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia)
|
||||||
double dist = 0;// (VelNext * VelNext - (VelNext + 20) * (VelNext + 20)) / (25.92)*(-1 / fBrake_a0[0] - 1 / fAccThreshold);
|
|
||||||
// ensure some minimal coasting speed, otherwise a vehicle entering this zone at very low speed will be crawling forever
|
// ensure some minimal coasting speed, otherwise a vehicle entering this zone at very low speed will be crawling forever
|
||||||
AccDesired =
|
auto const brakingpointoffset = VelNext * braking_distance_multiplier( VelNext );
|
||||||
|
AccDesired = std::min(
|
||||||
|
AccDesired,
|
||||||
( VelNext * VelNext - vel * vel )
|
( VelNext * VelNext - vel * vel )
|
||||||
/ ( 25.92
|
/ ( 25.92
|
||||||
* std::max(
|
* std::max(
|
||||||
ActualProximityDist - VelNext - dist,
|
ActualProximityDist - brakingpointoffset,
|
||||||
std::min(
|
std::min(
|
||||||
ActualProximityDist,
|
ActualProximityDist,
|
||||||
VelNext + dist ) )
|
brakingpointoffset ) )
|
||||||
+ 0.1 ); // najpierw hamuje mocniej, potem zluzuje
|
+ 0.1 ) ); // najpierw hamuje mocniej, potem zluzuje
|
||||||
}
|
}
|
||||||
AccDesired = std::min( AccDesired, AccPreferred );
|
AccDesired = std::min( AccDesired, AccPreferred );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// jest bliżej niż fMinProximityDist
|
// jest bliżej niż fMinProximityDist
|
||||||
VelDesired = Global::Min0RSpeed( VelDesired, VelNext ); // utrzymuj predkosc bo juz blisko
|
// utrzymuj predkosc bo juz blisko
|
||||||
|
VelDesired = Global::Min0RSpeed( VelDesired, VelNext );
|
||||||
if( vel <= VelNext + fVelPlus ) {
|
if( vel <= VelNext + fVelPlus ) {
|
||||||
// jeśli niewielkie przekroczenie, ale ma jechać
|
// jeśli niewielkie przekroczenie, ale ma jechać
|
||||||
AccDesired = std::max( 0.0, AccPreferred ); // to olej (zacznij luzować)
|
AccDesired = std::max( 0.0, AccPreferred ); // to olej (zacznij luzować)
|
||||||
@@ -4474,21 +4420,38 @@ bool TController::UpdateSituation(double dt)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // gdy jedzie wolniej niż potrzeba, albo nie ma przeszkód na drodze
|
else {
|
||||||
AccDesired = (VelDesired != 0.0 ? AccPreferred : -0.01); // normalna jazda
|
// gdy jedzie wolniej niż potrzeba, albo nie ma przeszkód na drodze
|
||||||
|
// normalna jazda
|
||||||
|
AccDesired = (
|
||||||
|
VelDesired != 0.0 ?
|
||||||
|
AccPreferred :
|
||||||
|
-0.01 );
|
||||||
|
}
|
||||||
// koniec predkosci nastepnej
|
// koniec predkosci nastepnej
|
||||||
if ((VelDesired >= 0.0) &&
|
|
||||||
(vel > VelDesired)) // jesli jedzie za szybko do AKTUALNEGO
|
if( vel > VelDesired ) {
|
||||||
if (VelDesired == 0.0) // jesli stoj, to hamuj, ale i tak juz za pozno :)
|
// jesli jedzie za szybko do AKTUALNEGO
|
||||||
AccDesired = std::min(AccDesired,-0.9); // hamuj solidnie
|
if( VelDesired == 0.0 ) {
|
||||||
else if ((vel < VelDesired + fVelPlus)) // o 5 km/h to olej
|
// jesli stoj, to hamuj, ale i tak juz za pozno :)
|
||||||
{
|
AccDesired = std::min( AccDesired, -0.9 ); // hamuj solidnie
|
||||||
if ((AccDesired > 0.0))
|
|
||||||
AccDesired = 0.0;
|
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
AccDesired = std::min(AccDesired,fBrake_a0[0]); // hamuj tak średnio
|
// slow down, not full stop
|
||||||
|
if( vel > ( VelDesired + fVelPlus ) ) {
|
||||||
|
// hamuj tak średnio
|
||||||
|
AccDesired = std::min( AccDesired, -fBrake_a0[ 0 ] * 0.5 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// o 5 km/h to olej (zacznij luzować)
|
||||||
|
AccDesired = std::min(
|
||||||
|
AccDesired, // but don't override decceleration for VelNext
|
||||||
|
std::max( 0.0, AccPreferred ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// koniec predkosci aktualnej
|
// koniec predkosci aktualnej
|
||||||
|
|
||||||
#ifdef DEBUGFAC
|
#ifdef DEBUGFAC
|
||||||
if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie
|
if (fAccThreshold > -0.3) // bez sensu, ale dla towarowych korzystnie
|
||||||
{ // Ra 2014-03: to nie uwzględnia odległości i zaczyna hamować, jak tylko zobaczy
|
{ // Ra 2014-03: to nie uwzględnia odległości i zaczyna hamować, jak tylko zobaczy
|
||||||
@@ -4736,26 +4699,23 @@ bool TController::UpdateSituation(double dt)
|
|||||||
} // type & dt_ezt
|
} // type & dt_ezt
|
||||||
else {
|
else {
|
||||||
// a stara wersja w miarę dobrze działa na składy wagonowe
|
// a stara wersja w miarę dobrze działa na składy wagonowe
|
||||||
if( ( VelNext == 0.0 )
|
if( ( ( fAccGravity < -0.05 ) && ( vel < 0.0 ) )
|
||||||
|| ( vel > VelNext + fVelPlus ) ) {
|
|| ( ( AccDesired < fAccGravity - 0.1 ) && ( AbsAccS > AccDesired + fBrake_a1[ 0 ] ) ) ) {
|
||||||
if( ( ( fAccGravity < -0.05 ) && ( vel < 0.0 ) )
|
// u góry ustawia się hamowanie na fAccThreshold
|
||||||
|| ( ( AccDesired < fAccGravity - 0.1 ) && ( AbsAccS > AccDesired + fBrake_a1[ 0 ] ) ) ) {
|
if( ( fBrakeTime < 0.0 )
|
||||||
// u góry ustawia się hamowanie na fAccThreshold
|
|| ( AccDesired < fAccGravity - 0.5 )
|
||||||
if( ( fBrakeTime < 0.0 )
|
|| ( mvOccupied->BrakeCtrlPos <= 0 ) ) {
|
||||||
|| ( AccDesired < fAccGravity - 0.3 )
|
// jeśli upłynął czas reakcji hamulca, chyba że nagłe albo luzował
|
||||||
|| ( mvOccupied->BrakeCtrlPos <= 0 ) ) {
|
if( true == IncBrake() ) {
|
||||||
// jeśli upłynął czas reakcji hamulca, chyba że nagłe albo luzował
|
fBrakeTime =
|
||||||
if( true == IncBrake() ) {
|
3.0
|
||||||
fBrakeTime =
|
+ 0.5 * ( (
|
||||||
3.0
|
mvOccupied->BrakeDelayFlag > bdelay_G ?
|
||||||
+ 0.5 * ( (
|
mvOccupied->BrakeDelay[ 1 ] :
|
||||||
mvOccupied->BrakeDelayFlag > bdelay_G ?
|
mvOccupied->BrakeDelay[ 3 ] )
|
||||||
mvOccupied->BrakeDelay[ 1 ] :
|
- 3.0 );
|
||||||
mvOccupied->BrakeDelay[ 3 ] )
|
// Ra: ten czas należy zmniejszyć, jeśli czas dojazdu do zatrzymania jest mniejszy
|
||||||
- 3.0 );
|
fBrakeTime *= 0.5; // Ra: tymczasowo, bo przeżyna S1
|
||||||
// Ra: ten czas należy zmniejszyć, jeśli czas dojazdu do zatrzymania jest mniejszy
|
|
||||||
fBrakeTime *= 0.5; // Ra: tymczasowo, bo przeżyna S1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
11
Driver.h
11
Driver.h
@@ -397,12 +397,11 @@ public:
|
|||||||
int StationCount();
|
int StationCount();
|
||||||
int StationIndex();
|
int StationIndex();
|
||||||
bool IsStop();
|
bool IsStop();
|
||||||
bool Primary()
|
inline
|
||||||
{
|
bool Primary() const {
|
||||||
return this ? ((iDrivigFlags & movePrimary) != 0) : false;
|
return ( ( iDrivigFlags & movePrimary ) != 0 ); };
|
||||||
};
|
inline
|
||||||
int inline DrivigFlags()
|
int DrivigFlags() const {
|
||||||
{
|
|
||||||
return iDrivigFlags;
|
return iDrivigFlags;
|
||||||
};
|
};
|
||||||
void MoveTo(TDynamicObject *to);
|
void MoveTo(TDynamicObject *to);
|
||||||
|
|||||||
66
TrkFoll.cpp
66
TrkFoll.cpp
@@ -114,15 +114,20 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
{ // omijamy cały ten blok, gdy tor nie ma on żadnych eventów (większość nie ma)
|
{ // omijamy cały ten blok, gdy tor nie ma on żadnych eventów (większość nie ma)
|
||||||
if (fDistance < 0)
|
if (fDistance < 0)
|
||||||
{
|
{
|
||||||
if (SetFlag(iEventFlag, -1)) // zawsze zeruje flagę sprawdzenia, jak mechanik
|
if( SetFlag( iEventFlag, -1 ) ) {
|
||||||
// dosiądzie, to się nie wykona
|
// zawsze zeruje flagę sprawdzenia, jak mechanik dosiądzie, to się nie wykona
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if( ( Owner->Mechanik != nullptr )
|
||||||
// if (TestFlag(iEventFlag,1)) //McZapkie-280503: wyzwalanie event tylko dla
|
&& ( Owner->Mechanik->Primary() ) ) {
|
||||||
// pojazdow z obsada
|
// tylko dla jednego członu
|
||||||
if (bPrimary && pCurrentTrack->evEvent1 &&
|
// McZapkie-280503: wyzwalanie event tylko dla pojazdow z obsada
|
||||||
(!pCurrentTrack->evEvent1->iQueued))
|
if( ( bPrimary )
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent1, Owner); // dodanie do
|
&& ( pCurrentTrack->evEvent1 )
|
||||||
// kolejki
|
&& ( !pCurrentTrack->evEvent1->iQueued ) ) {
|
||||||
|
// dodanie do kolejki
|
||||||
|
Global::AddToQuery( pCurrentTrack->evEvent1, Owner );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event1); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
// if (TestFlag(iEventallFlag,1))
|
// if (TestFlag(iEventallFlag,1))
|
||||||
@@ -136,31 +141,42 @@ bool TTrackFollower::Move(double fDistance, bool bPrimary)
|
|||||||
}
|
}
|
||||||
else if (fDistance > 0)
|
else if (fDistance > 0)
|
||||||
{
|
{
|
||||||
if (SetFlag(iEventFlag, -2)) // zawsze ustawia flagę sprawdzenia, jak mechanik
|
if( SetFlag( iEventFlag, -2 ) ) {
|
||||||
|
// zawsze ustawia flagę sprawdzenia, jak mechanik
|
||||||
// dosiądzie, to się nie wykona
|
// dosiądzie, to się nie wykona
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if( ( Owner->Mechanik != nullptr )
|
||||||
// if (TestFlag(iEventFlag,2)) //sprawdzanie jest od razu w pierwszym
|
&& ( Owner->Mechanik->Primary() ) ) {
|
||||||
// warunku
|
// tylko dla jednego członu
|
||||||
if (bPrimary && pCurrentTrack->evEvent2 &&
|
if( ( bPrimary )
|
||||||
(!pCurrentTrack->evEvent2->iQueued))
|
&& ( pCurrentTrack->evEvent2 )
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent2, Owner);
|
&& ( !pCurrentTrack->evEvent2->iQueued ) ) {
|
||||||
|
Global::AddToQuery( pCurrentTrack->evEvent2, Owner );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event2); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
// if (TestFlag(iEventallFlag,2))
|
// if (TestFlag(iEventallFlag,2))
|
||||||
if (SetFlag(iEventallFlag,
|
if( SetFlag( iEventallFlag, -2 ) ) {
|
||||||
-2)) // sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
|
// sprawdza i zeruje na przyszłość, true jeśli zmieni z 2 na 0
|
||||||
if (bPrimary && pCurrentTrack->evEventall2 &&
|
if( ( bPrimary )
|
||||||
(!pCurrentTrack->evEventall2->iQueued))
|
&& ( pCurrentTrack->evEventall2 )
|
||||||
Global::AddToQuery(pCurrentTrack->evEventall2, Owner);
|
&& ( !pCurrentTrack->evEventall2->iQueued ) ) {
|
||||||
|
Global::AddToQuery( pCurrentTrack->evEventall2, Owner );
|
||||||
|
}
|
||||||
|
}
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać
|
// Owner->RaAxleEvent(pCurrentTrack->Eventall2); //Ra: dynamic zdecyduje, czy dodać
|
||||||
// do kolejki
|
// do kolejki
|
||||||
}
|
}
|
||||||
else // if (fDistance==0) //McZapkie-140602: wyzwalanie zdarzenia gdy pojazd stoi
|
else // if (fDistance==0) //McZapkie-140602: wyzwalanie zdarzenia gdy pojazd stoi
|
||||||
{
|
{
|
||||||
if (Owner->Mechanik->Primary()) // tylko dla jednego członu
|
if( ( Owner->Mechanik != nullptr )
|
||||||
if (pCurrentTrack->evEvent0)
|
&& ( Owner->Mechanik->Primary() ) ) {
|
||||||
if (!pCurrentTrack->evEvent0->iQueued)
|
// tylko dla jednego członu
|
||||||
Global::AddToQuery(pCurrentTrack->evEvent0, Owner);
|
if( pCurrentTrack->evEvent0 )
|
||||||
|
if( !pCurrentTrack->evEvent0->iQueued )
|
||||||
|
Global::AddToQuery( pCurrentTrack->evEvent0, Owner );
|
||||||
|
}
|
||||||
// Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do
|
// Owner->RaAxleEvent(pCurrentTrack->Event0); //Ra: dynamic zdecyduje, czy dodać do
|
||||||
// kolejki
|
// kolejki
|
||||||
if (pCurrentTrack->evEventall0)
|
if (pCurrentTrack->evEventall0)
|
||||||
|
|||||||
@@ -1314,7 +1314,7 @@ TWorld::Update_UI() {
|
|||||||
else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; }
|
else if( mover->ActiveDir < 0 ) { uitextline2 += " R"; }
|
||||||
else { uitextline2 += " N"; }
|
else { uitextline2 += " N"; }
|
||||||
|
|
||||||
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos );
|
uitextline3 = "Brakes:" + to_string( mover->fBrakeCtrlPos, 1, 5 ) + "+" + std::to_string( mover->LocalBrakePos ) + ( mover->SlippingWheels ? " !" : " " );
|
||||||
|
|
||||||
if( Global::iScreenMode[ Global::iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
if( Global::iScreenMode[ Global::iTextMode - GLFW_KEY_F1 ] == 1 ) {
|
||||||
// detail mode on second key press
|
// detail mode on second key press
|
||||||
@@ -1324,7 +1324,7 @@ TWorld::Update_UI() {
|
|||||||
+ ", next limit: " + std::to_string( static_cast<int>( std::floor( Controlled->Mechanik->VelNext ) ) ) + " km/h"
|
+ ", next limit: " + std::to_string( static_cast<int>( std::floor( Controlled->Mechanik->VelNext ) ) ) + " km/h"
|
||||||
+ " in " + to_string( Controlled->Mechanik->ActualProximityDist * 0.001, 1 ) + " km)";
|
+ " in " + to_string( Controlled->Mechanik->ActualProximityDist * 0.001, 1 ) + " km)";
|
||||||
uitextline3 +=
|
uitextline3 +=
|
||||||
" Pressure: " + to_string( mover->BrakePress * 100.0, 2 ) + " kPa"
|
" Pressure: " + to_string( mover->BrakePress * 100.0, 2 ) + " kPa"
|
||||||
+ " (train pipe: " + to_string( mover->PipePress * 100.0, 2 ) + " kPa)";
|
+ " (train pipe: " + to_string( mover->PipePress * 100.0, 2 ) + " kPa)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1342,7 +1342,7 @@ TWorld::Update_UI() {
|
|||||||
if( tmp == nullptr ) { break; }
|
if( tmp == nullptr ) { break; }
|
||||||
// if the nearest located vehicle doesn't have a direct driver, try to query its owner
|
// if the nearest located vehicle doesn't have a direct driver, try to query its owner
|
||||||
auto const owner = (
|
auto const owner = (
|
||||||
tmp->Mechanik != nullptr ?
|
( ( tmp->Mechanik != nullptr ) && ( tmp->Mechanik->Primary() ) ) ?
|
||||||
tmp->Mechanik :
|
tmp->Mechanik :
|
||||||
tmp->ctOwner );
|
tmp->ctOwner );
|
||||||
if( owner == nullptr ){ break; }
|
if( owner == nullptr ){ break; }
|
||||||
|
|||||||
Reference in New Issue
Block a user