mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-03-22 15:05:03 +01:00
New function for speed comparisons based on Min0R.
Working LimitVelocity.
This commit is contained in:
64
Driver.cpp
64
Driver.cpp
@@ -112,6 +112,7 @@ void TSpeedPos::Clear()
|
||||
{
|
||||
iFlags = 0; // brak flag to brak reakcji
|
||||
fVelNext = -1.0; // prędkość bez ograniczeń
|
||||
fSectionVelocityDist = 0.0; //brak długości
|
||||
fDist = 0.0;
|
||||
vPos = vector3(0, 0, 0);
|
||||
trTrack = NULL; // brak wskaźnika
|
||||
@@ -148,6 +149,7 @@ void TSpeedPos::CommandCheck()
|
||||
case cm_SectionVelocity:
|
||||
// odcinek z ograniczeniem prędkości
|
||||
fVelNext = value1;
|
||||
fSectionVelocityDist = value2;
|
||||
iFlags |= spSectionVel;
|
||||
break;
|
||||
case cm_RoadVelocity:
|
||||
@@ -204,7 +206,7 @@ bool TSpeedPos::Update(vector3 *p, vector3 *dir, double &len)
|
||||
else
|
||||
{
|
||||
iFlags ^= spElapsed; // 32-minięty - będziemy liczyć odległość względem przeciwnego końca
|
||||
// toru (nadal może być z przodu i ogdaniczać)
|
||||
// toru (nadal może być z przodu i ograniczać)
|
||||
if ((iFlags & 0x43) == 3) // tylko jeśli (istotny) tor, bo eventy są punktowe
|
||||
if (trTrack) // może być NULL, jeśli koniec toru (????)
|
||||
vPos =
|
||||
@@ -630,7 +632,7 @@ void TController::TableCheck(double fDistance)
|
||||
sSpeedTable[i].fDist < -fLength)
|
||||
{ // pociąg staje zawsze, a samochód tylko jeśli nie przejedzie całą
|
||||
// długością (może być zaskoczony zmianą)
|
||||
// WriteLog("TableCheck: Event is behind. Delete from table: " + sSpeedTable[i].evEvent->asName);
|
||||
WriteLog("TableCheck: Event is behind. Delete from table: " + sSpeedTable[i].evEvent->asName);
|
||||
sSpeedTable[i].iFlags &= ~1; // degradacja pozycji dla samochodu;
|
||||
// semafory usuwane tylko przy sprawdzaniu,
|
||||
// bo wysyłają komendy
|
||||
@@ -676,8 +678,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
int i, k = iLast - iFirst + 1;
|
||||
if (k < 0)
|
||||
k += iSpeedTableSize; // ilość pozycji do przeanalizowania
|
||||
iDrivigFlags &=
|
||||
~(moveTrackEnd | moveSwitchFound | moveSemaphorFound); // te flagi są ustawiane tutaj, w razie potrzeby
|
||||
iDrivigFlags &= ~(moveTrackEnd | moveSwitchFound | moveSemaphorFound |
|
||||
moveSpeedLimitFound); // 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
|
||||
@@ -1001,11 +1003,46 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
}
|
||||
else if (sSpeedTable[i].iFlags & spSectionVel)
|
||||
{ // 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
|
||||
if (sSpeedTable[i].fDist < 0) // teraz trzeba sprawdzić inne warunki
|
||||
{
|
||||
if (sSpeedTable[i].fSectionVelocityDist == 0.0)
|
||||
{
|
||||
WriteLog("TableUpdate: Event is behind. SVD = 0: " + sSpeedTable[i].evEvent->asName);
|
||||
sSpeedTable[i].iFlags = 0; // jeśli punktowy to kasujemy i nie dajemy ograniczenia na stałe
|
||||
}
|
||||
else if (sSpeedTable[i].fSectionVelocityDist < 0.0)
|
||||
{ // ograniczenie obowiązujące do następnego
|
||||
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
|
||||
sSpeedTable[i].fVelNext != VelLimitLast)
|
||||
{ // jeśli ograniczenie jest mniejsze niż obecne to obowiązuje od zaraz
|
||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||
}
|
||||
else if (sSpeedTable[i].fDist < -fLength)
|
||||
{ // jeśli większe to musi wyjechać za poprzednie
|
||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||
WriteLog("TableUpdate: Event is behind. SVD < 0: " + sSpeedTable[i].evEvent->asName);
|
||||
sSpeedTable[i].iFlags = 0; // wyjechaliśmy poza poprzednie, można skasować
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // jeśli większe to ograniczenie ma swoją długość
|
||||
if (sSpeedTable[i].fVelNext == Global::Min0RSpeed(sSpeedTable[i].fVelNext, VelLimitLast) &&
|
||||
sSpeedTable[i].fVelNext != VelLimitLast)
|
||||
{ // jeśli ograniczenie jest mniejsze niż obecne to obowiązuje od zaraz
|
||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||
}
|
||||
else if (sSpeedTable[i].fDist < -fLength && sSpeedTable[i].fVelNext != VelLimitLast)
|
||||
{ // jeśli większe to musi wyjechać za poprzednie
|
||||
VelLimitLast = sSpeedTable[i].fVelNext;
|
||||
}
|
||||
else if (sSpeedTable[i].fDist < -fLength - sSpeedTable[i].fSectionVelocityDist)
|
||||
{ //
|
||||
VelLimitLast = -1.0;
|
||||
WriteLog("TableUpdate: Event is behind. SVD > 0: " + sSpeedTable[i].evEvent->asName);
|
||||
sSpeedTable[i].iFlags = 0; // wyjechaliśmy poza poprzednie, można skasować
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//sprawdzenie eventów pasywnych przed nami
|
||||
@@ -1046,7 +1083,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
}
|
||||
}
|
||||
}
|
||||
else //jeśli jakiś event pasywny ale nie tarcza manewrowa
|
||||
else if (!(sSpeedTable[i].iFlags & spSectionVel)) //jeśli jakiś event pasywny ale nie ograniczenie
|
||||
if (go == cm_Unknown) // jeśli nie było komendy wcześniej - pierwsza się liczy
|
||||
// - ustawianie VelSignal
|
||||
if (v < 0.0 ? true : v >= 1.0) // bo wartość 0.1 służy do hamowania tylko
|
||||
@@ -1060,9 +1097,10 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
VelSignal = -1.0; // aby stojący ruszył
|
||||
if (sSpeedTable[i].fDist < 0.0) // jeśli przejechany
|
||||
{
|
||||
if (v != 0 ? VelSignal = -1.0 : VelSignal = 0.0); //!!! 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].iFlags & spEvent) // jeśli event
|
||||
if ((sSpeedTable[i].evEvent != eSignSkip) ?
|
||||
true :
|
||||
(sSpeedTable[i].fVelNext != 0.0)) // ale inny niż ten,
|
||||
@@ -1072,6 +1110,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
||||
iDrivigFlags &= ~moveVisibility; // sygnał zezwalający na
|
||||
// jazdę wyłącza jazdę na
|
||||
// widoczność (S1 na SBL)
|
||||
|
||||
// usunąć jeśli nie jest ograniczeniem prędkości
|
||||
sSpeedTable[i].iFlags =
|
||||
0; // to można usunąć (nie mogą być usuwane w skanowaniu)
|
||||
}
|
||||
|
||||
8
EU07.bpr
8
EU07.bpr
@@ -57,9 +57,9 @@
|
||||
IncludeVerInfo=1
|
||||
AutoIncBuild=0
|
||||
MajorVer=15
|
||||
MinorVer=3
|
||||
Release=1169
|
||||
Build=472
|
||||
MinorVer=4
|
||||
Release=1170
|
||||
Build=473
|
||||
Debug=1
|
||||
PreRelease=0
|
||||
Special=0
|
||||
@@ -71,7 +71,7 @@ CodePage=1250
|
||||
[Version Info Keys]
|
||||
CompanyName=EU07 Team
|
||||
FileDescription=MaSzyna EU07-424
|
||||
FileVersion=15.3.1169.472
|
||||
FileVersion=15.4.1170.473
|
||||
InternalName=9th by firleju + Ra + SPKS + MP
|
||||
LegalCopyright=
|
||||
LegalTrademarks=
|
||||
|
||||
10
Globals.cpp
10
Globals.cpp
@@ -839,4 +839,14 @@ AnsiString Global::Bezogonkow(AnsiString str, bool _)
|
||||
return str;
|
||||
}
|
||||
|
||||
double Global::Min0RSpeed(double vel1, double vel2)
|
||||
{ // rozszerzenie funkcji Min0R o wartoœci -1.0
|
||||
if (vel1 == -1.0)
|
||||
vel1 = std::numeric_limits<double>::max();
|
||||
if (vel2 == -1.0)
|
||||
vel2 = std::numeric_limits<double>::max();
|
||||
return Min0R(vel1, vel2);
|
||||
}
|
||||
|
||||
|
||||
#pragma package(smart_init)
|
||||
|
||||
@@ -313,6 +313,7 @@ class Global
|
||||
static bool AddToQuery(TEvent *event, TDynamicObject *who);
|
||||
static bool DoEvents();
|
||||
static AnsiString Bezogonkow(AnsiString str, bool _ = false);
|
||||
static double Min0RSpeed(double vel1, double vel2);
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user