Add new var sSemNextStop which looks at first semaphor which have Vel=0 and is proper for train mode.

sSemNext always look at first semaphor which is proper for train mode.
This commit is contained in:
firleju
2016-01-30 21:33:49 +01:00
parent c84bf7319b
commit 9e31c8a9eb
2 changed files with 34 additions and 15 deletions

View File

@@ -473,21 +473,20 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
}
// znaleziono semafor lub tarczę lub tor z prędkością zero
// trzeba sprawdzić czy to nadał semafor
// WriteLog("TableTraceRoute: check semaphor");
// WriteLog("TableTraceRoute: "+OwnerName()+" check semaphor... ");
// if (sSemNext)
// WriteLog(sSemNext->TableText());
if (sSemNext &&
sSemNext->fVelNext ==
if (sSemNextStop &&
sSemNextStop->fVelNext ==
0.0) // jeśli jest następny semafor to sprawdzamy czy to on nadał zero
{
// WriteLog("TableTraceRoute: "+sSemNext->TableText());
if ((OrderCurrentGet() & Obey_train) && (sSemNext->iFlags & spSemaphor))
if ((OrderCurrentGet() & Obey_train) && (sSemNextStop->iFlags & spSemaphor))
return;
else if ((OrderCurrentGet() < 0x40) &&
(sSemNext->iFlags & (spSemaphor | spShuntSemaphor | spOutsideStation)))
(sSemNextStop->iFlags & (spSemaphor | spShuntSemaphor | spOutsideStation)))
return;
}
pTrack = sSpeedTable[iLast].trTrack; // ostatnio sprawdzony tor
if (!pTrack)
return; // koniec toru, to nie ma co sprawdzać (nie ma prawa tak być)
@@ -526,10 +525,12 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle)
{
fDistance = fCurrentDistance; // jeśli sygnał stop, to nie ma
// potrzeby dalej skanować
sSemNext = &sSpeedTable[iLast];
sSemNextStop = &sSpeedTable[iLast];
if (!sSemNext)
sSemNext = &sSpeedTable[iLast];
WriteLog("Signal stop. Next Semaphor ", false);
if (sSemNext)
WriteLog(sSemNext->GetName());
if (sSemNextStop)
WriteLog(sSemNextStop->GetName());
else
WriteLog("none");
}
@@ -701,6 +702,8 @@ void TController::TableCheck(double fDistance)
sSpeedTable[j].iFlags = 0;
if (&sSpeedTable[j] == sSemNext)
sSemNext = NULL; // przy kasowaniu tabelki zrzucamy także semafor
if (&sSpeedTable[j] == sSemNextStop)
sSemNextStop = NULL; // przy kasowaniu tabelki zrzucamy także semafor
}
WriteLog("TableCheck: Delete entries OK.");
WriteLog("TableCheck: New last element: " + sSpeedTable[i].GetName());
@@ -1049,21 +1052,31 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// sprawdzanie eventów pasywnych miniętych
if (sSpeedTable[i].fDist < 0.0 && sSemNext == &sSpeedTable[i])
{
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed");
WriteLog("TableUpdate: semaphor " + sSemNext->GetName() + " passed by " + OwnerName());
sSemNext = NULL; // jeśli minęliśmy semafor od ograniczenia to go kasujemy ze
// zmiennej sprawdzającej dla skanowania w przód
}
if (sSpeedTable[i].fDist < 0.0 && sSemNextStop == &sSpeedTable[i])
{
WriteLog("TableUpdate: semaphor " + sSemNextStop->GetName() + " passed by " + OwnerName());
sSemNextStop = NULL; // jeśli minęliśmy semafor od ograniczenia to go kasujemy ze
// zmiennej sprawdzającej dla skanowania w przód
}
if (sSpeedTable[i].fDist > 0.0 &&
sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()) &&
(!sSemNext ||
(sSemNext && sSemNext->fVelNext != 0 && sSpeedTable[i].fVelNext == 0)))
sSpeedTable[i].IsProperSemaphor(OrderCurrentGet()))
{
if (!sSemNext)
{
sSemNext = &sSpeedTable[i]; // jeśli jest mienięty poprzedni
// semafor a wcześniej
// byl nowy to go dorzucamy do zmiennej, żeby cały
// czas widział najbliższy
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName());
WriteLog("TableUpdate: Next semaphor: " + sSemNext->GetName() + " by " + OwnerName());
}
if (!sSemNextStop || (sSemNextStop && sSemNextStop->fVelNext != 0 &&
sSpeedTable[i].fVelNext == 0))
sSemNextStop = &sSpeedTable[i];
}
if (sSpeedTable[i].iFlags & spOutsideStation)
{ // jeśli W5, to reakcja zależna od trybu jazdy
if (OrderCurrentGet() & Obey_train)
@@ -1354,6 +1367,8 @@ void TController::TablePurger()
sSpeedTable[i] = sSpeedTable[(i + 1) % iSpeedTableSize]; // skopiowanie
if (&sSpeedTable[(i + 1) % iSpeedTableSize] == sSemNext)
sSemNext = &sSpeedTable[i]; // przeniesienie znacznika o semaforze
if (&sSpeedTable[(i + 1) % iSpeedTableSize] == sSemNextStop)
sSemNextStop = &sSpeedTable[i]; // przeniesienie znacznika o semaforze
}
WriteLog("Odtykacz usuwa pozycję");
iLast = (iLast - 1 + iSpeedTableSize) % iSpeedTableSize; // cofnięcie z zawinięciem
@@ -1370,6 +1385,8 @@ void TController::TablePurger()
t[++j] = sSpeedTable[i];
if (&sSpeedTable[i] == sSemNext)
sSemNext = &t[j]; // przeniesienie znacznika o semaforze
if (&sSpeedTable[i] == sSemNextStop)
sSemNextStop = &t[j]; // przeniesienie znacznika o semaforze
i = (i + 1) % iSpeedTableSize; // kolejna pozycja mogą być zawinięta
}
iFirst = 0; // teraz będzie od zera
@@ -1479,6 +1496,7 @@ TController::TController(bool AI, TDynamicObject *NewControll, bool InitPsyche,
fMass = 0.0; //[kg]
eSignNext = NULL; // sygnał zmieniający prędkość, do pokazania na [F2]
sSemNext = NULL; // pierwszy semafor w przebiegu
sSemNextStop = NULL; // pierwszy semafor z sygnałem stój
fShuntVelocity = 40; // domyślna prędkość manewrowa
fStopTime = 0.0; // czas postoju przed dalszą jazdą (np. na przystanku)
iDrivigFlags = moveStopPoint; // podjedź do W4 możliwie blisko
@@ -4191,7 +4209,7 @@ bool TController::UpdateSituation(double dt)
TrainParams
->TTVmax); // jesli nie spozniony to nie przekraczać rozkladowej
if (VelDesired > 0.0)
if (VelNext > 0.0 || (iDrivigFlags & moveStopHere)==0)
if ((sSemNext && sSemNext->fVelNext != 0.0) || (iDrivigFlags & moveStopHere)==0)
{ // jeśli można jechać, to odpalić dźwięk kierownika oraz zamknąć drzwi w
// składzie, jeśli nie mamy czekać na sygnał też trzeba odpalić
if (iDrivigFlags & moveGuardSignal)

View File

@@ -171,6 +171,7 @@ class TController
TTrack *tLast; // ostatni analizowany tor
TEvent *eSignSkip; // można pominąć ten SBL po zatrzymaniu
TSpeedPos *sSemNext; // następny semafor na drodze zależny od trybu jazdy
TSpeedPos *sSemNextStop; // następny semafor na drodze zależny od trybu jazdy i na stój
private: // parametry aktualnego składu
double fLength; // długość składu (do wyciągania z ograniczeń)
double fMass; // całkowita masa do liczenia stycznej składowej grawitacji