diff --git a/.gitignore b/.gitignore index f8a3ef25..6087a4c1 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,4 @@ MaSzyna.sdf MaSzyna.sln MaSzyna.vcxproj MaSzyna.vcxproj.filters +*.suo diff --git a/Driver.cpp b/Driver.cpp index 3d3c5ff3..099e3054 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -659,7 +659,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN if (k < 0) k += iSpeedTableSize; // ilość pozycji do przeanalizowania iDrivigFlags &= - ~(moveTrackEnd | moveSwitchFound); // te flagi są ustawiane tutaj, w razie potrzeby + ~(moveTrackEnd | moveSwitchFound | moveSemaphorFound); // te flagi są ustawiane tutaj, w razie potrzeby for (i = iFirst; k > 0; --k, i = (i + 1) % iSpeedTableSize) { // sprawdzenie rekordów od (iFirst) do (iLast), o ile są istotne if (sSpeedTable[i].iFlags & spEnabled) // badanie istotności @@ -971,8 +971,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } else if (sSpeedTable[i].iFlags & spSemaphor) { // to semaphor - if (sSpeedTable[i].fDist < 0) - VelSignalLast = sSpeedTable[i].fVelNext; //minięty daje prędkość obowiązującą + if (sSpeedTable[i].fDist < 0) + VelSignalLast = sSpeedTable[i].fVelNext; //minięty daje prędkość obowiązującą + else + iDrivigFlags |= moveSemaphorFound; //jeśli z przodu to dajemy falgę, że jest } else if (sSpeedTable[i].iFlags & spRoadVel) { // to W6 @@ -983,9 +985,12 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN { // to W27 if (sSpeedTable[i].fDist < 0) VelLimitLast = sSpeedTable[i].fVelNext; + if (sSpeedTable[i].evEvent->ValueGet(1) > 0.0 && + sSpeedTable[i].fDist + sSpeedTable[i].evEvent->ValueGet(1) > -fLength) + iDrivigFlags |= moveSpeedLimitFound; // jeśli jesteśmy w ograniczeniu } - //sprawdzenie eventów pasywnych przed nami + //sprawdzenie eventów pasywnych przed nami if ((mvOccupied->CategoryFlag & 1) ? sSpeedTable[i].fDist > pVehicles[0]->fTrackBlock - 20.0 : false) // jak sygnał jest dalej niż zawalidroga @@ -1034,10 +1039,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN // VelSignal=v; //nie do końca tak, to jest druga prędkość; -1 nie // wpisywać... if (VelSignal == 0.0) - VelSignal = v; // aby stojący ruszył + VelSignal = -1.0; // aby stojący ruszył if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany { - VelSignal = v; //!!! ustawienie, gdy przejechany jest lepsze niż + if (v != 0 ? VelSignal = -1.0 : VelSignal = 0.0); //!!! ustawienie, gdy przejechany jest lepsze niż // wcale, ale to jeszcze nie to if (sSpeedTable[i].iFlags & 0x100) // jeśli semafor if ((sSpeedTable[i].evEvent != eSignSkip) ? @@ -1134,12 +1139,17 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN } } // if (sSpeedTable[i].iFlags&1) } // for + + if (VelSignalLast >= 0.0 && !(iDrivigFlags & (moveSemaphorFound | moveSwitchFound)) && + (OrderCurrentGet() & Obey_train)) + VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami if (fVelDes > VelSignalLast) //analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego fVelDes = VelSignalLast; - else if (fVelDes > VelLimitLast) + if (fVelDes > VelLimitLast) fVelDes = VelLimitLast; - else if (fVelDes > VelRoad) + if (fVelDes > VelRoad) fVelDes = VelRoad; + // nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5 return go; }; @@ -3950,9 +3960,10 @@ bool TController::UpdateSituation(double dt) VelDesired = 0.0; // jak ma czekać, to nie ma jazdy // else if (VelSignal<0) // VelDesired=fVelMax; //ile fabryka dala (Ra: uwzględione wagony) - else if (VelSignal >= 0) // VelSignal>0 jest ograniczeniem prędkości (z semafora) + else if (VelSignal >= 0) // jeśli skład był zatrzymany na początku i teraz już może jechać VelDesired = Min0R(VelDesired, VelSignal); - if (mvOccupied->RunningTrack.Velmax >= + + if (mvOccupied->RunningTrack.Velmax >= 0) // ograniczenie prędkości z trajektorii ruchu VelDesired = Min0R(VelDesired, diff --git a/Driver.h b/Driver.h index c169cf43..4fbbb717 100644 --- a/Driver.h +++ b/Driver.h @@ -227,11 +227,12 @@ class TController double VelDesired; // predkość, z jaką ma jechać, wynikająca z analizy tableki; <=VelSignal double fAccDesiredAv; // uśrednione przyspieszenie z kolejnych przebłysków świadomości, żeby // ograniczyć migotanie - private: + public: double VelforDriver; // prędkość, używana przy zmianie kierunku (ograniczenie przy nieznajmości // szlaku?) double VelSignal; // ograniczenie prędkości z kompilacji znaków i sygnałów double VelLimit; // predkość zadawana przez event jednokierunkowego ograniczenia prędkości + public: double VelSignalLast; // prędkość zadana na ostatnim semaforze double VelLimitLast; // prędkość zadana przez ograniczenie double VelRoad; // aktualna prędkość drogowa (ze znaku W27) diff --git a/World.cpp b/World.cpp index 41ec5c47..89b18e45 100644 --- a/World.cpp +++ b/World.cpp @@ -2010,12 +2010,15 @@ bool TWorld::Update() if (tmp->Mechanik->DrivigFlags() & j) // jak bit ustawiony flags[i + 1] ^= 0x20; // to zmiana na wielką literę OutText4 = flags; - OutText4 += - AnsiString("Driver: Vd=") + - FloatToStrF(tmp->Mechanik->VelDesired, ffFixed, 4, 0) + AnsiString(" ad=") + - FloatToStrF(tmp->Mechanik->AccDesired, ffFixed, 5, 2) + AnsiString(" Pd=") + - FloatToStrF(tmp->Mechanik->ActualProximityDist, ffFixed, 4, 0) + - AnsiString(" Vn=") + FloatToStrF(tmp->Mechanik->VelNext, ffFixed, 4, 0); + OutText4 += + AnsiString("Driver: Vd=") + + FloatToStrF(tmp->Mechanik->VelDesired, ffFixed, 4, 0) + AnsiString(" ad=") + + FloatToStrF(tmp->Mechanik->AccDesired, ffFixed, 5, 2) + AnsiString(" Pd=") + + FloatToStrF(tmp->Mechanik->ActualProximityDist, ffFixed, 4, 0) + + AnsiString(" Vn=") + FloatToStrF(tmp->Mechanik->VelNext, ffFixed, 4, 0) + + AnsiString(" VSm=") + FloatToStrF(tmp->Mechanik->VelSignalLast, ffFixed, 4, 0) + + AnsiString(" VLm=") + FloatToStrF(tmp->Mechanik->VelLimitLast, ffFixed, 4, 0) + + AnsiString(" VRd=") + FloatToStrF(tmp->Mechanik->VelRoad, ffFixed, 4, 0); if (tmp->Mechanik->VelNext == 0.0) if (tmp->Mechanik->eSignNext) { // jeśli ma zapamiętany event semafora @@ -2050,7 +2053,7 @@ bool TWorld::Update() { // ekran drugi, czyli tabelka skanowania AI if (tmp->Mechanik) //żeby była tabelka, musi być AI { // tabelka jest na użytek testujących scenerie, więc nie musi być "ładna" - glColor3f(0.0f, 1.0f, 0.0f); // a, damy zielony + glColor3f(1.0f, 1.0f, 1.0f); // a, damy zielony. GF: jednak biały // glTranslatef(0.0f,0.0f,-0.50f); glRasterPos2f(-0.25f, 0.20f); // OutText1="Scan distance: "+AnsiString(tmp->Mechanik->scanmax)+", back: @@ -2081,7 +2084,11 @@ bool TWorld::Update() FloatToStrF(tmp->Mechanik->VelDesired, ffFixed, 4, 0) + AnsiString(" ad=") + FloatToStrF(tmp->Mechanik->AccDesired, ffFixed, 5, 2) + AnsiString(" Pd=") + FloatToStrF(tmp->Mechanik->ActualProximityDist, ffFixed, 4, 0) + - AnsiString(" Vn=") + FloatToStrF(tmp->Mechanik->VelNext, ffFixed, 4, 0); + AnsiString(" Vn=") + FloatToStrF(tmp->Mechanik->VelNext, ffFixed, 4, 0) + + AnsiString("\n VSm=") + FloatToStrF(tmp->Mechanik->VelSignalLast, ffFixed, 4, 0) + + AnsiString(" VLm=") + FloatToStrF(tmp->Mechanik->VelLimitLast, ffFixed, 4, 0) + + AnsiString(" VRd=") + FloatToStrF(tmp->Mechanik->VelRoad, ffFixed, 4, 0) + + AnsiString(" VSig=") + FloatToStrF(tmp->Mechanik->VelSignal, ffFixed, 4, 0); if (tmp->Mechanik->VelNext == 0.0) if (tmp->Mechanik->eSignNext) { // jeśli ma zapamiętany event semafora