mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-07-22 02:29:17 +02:00
passenger stop ai logic tweaks, engine turbo sound volume change rate unification
This commit is contained in:
114
Driver.cpp
114
Driver.cpp
@@ -797,6 +797,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
double v; // prędkość
|
double v; // prędkość
|
||||||
double d; // droga
|
double d; // droga
|
||||||
double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI
|
double d_to_next_sem = 10000.0; //ustaiwamy na pewno dalej niż widzi AI
|
||||||
|
bool isatpassengerstop { false }; // true if the consist is within acceptable range of w4 post
|
||||||
TCommandType go = cm_Unknown;
|
TCommandType go = cm_Unknown;
|
||||||
eSignNext = NULL;
|
eSignNext = NULL;
|
||||||
// te flagi są ustawiane tutaj, w razie potrzeby
|
// te flagi są ustawiane tutaj, w razie potrzeby
|
||||||
@@ -852,8 +853,20 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
continue; // nie analizować prędkości
|
continue; // nie analizować prędkości
|
||||||
}
|
}
|
||||||
} // koniec obsługi przelotu na W4
|
} // koniec obsługi przelotu na W4
|
||||||
else
|
else {
|
||||||
{ // zatrzymanie na W4
|
// zatrzymanie na W4
|
||||||
|
isatpassengerstop = (
|
||||||
|
// Ra 2F1I: odległość plus długość pociągu musi być mniejsza od długości
|
||||||
|
// peronu, chyba że pociąg jest dłuższy, to wtedy minimalna.
|
||||||
|
// jeśli długość peronu ((sSpeedTable[i].evEvent->ValueGet(2)) nie podana,
|
||||||
|
// przyjąć odległość fMinProximityDist
|
||||||
|
( iDrivigFlags & moveStopCloser ) ?
|
||||||
|
( sSpeedTable[ i ].fDist + fLength ) <=
|
||||||
|
std::max(
|
||||||
|
sSpeedTable[ i ].evEvent->ValueGet( 2 ),
|
||||||
|
2.0 * fMaxProximityDist + fLength ) : // fmaxproximitydist typically equals ~50 m
|
||||||
|
sSpeedTable[ i ].fDist < d_to_next_sem );
|
||||||
|
|
||||||
if( !eSignNext ) {
|
if( !eSignNext ) {
|
||||||
//jeśli nie widzi następnego sygnału ustawia dotychczasową
|
//jeśli nie widzi następnego sygnału ustawia dotychczasową
|
||||||
eSignNext = sSpeedTable[ i ].evEvent;
|
eSignNext = sSpeedTable[ i ].evEvent;
|
||||||
@@ -862,17 +875,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
// jeśli jedzie (nie trzeba czekać, aż się drgania wytłumią - drzwi zamykane od 1.0) to będzie zatrzymanie
|
// jeśli jedzie (nie trzeba czekać, aż się drgania wytłumią - drzwi zamykane od 1.0) to będzie zatrzymanie
|
||||||
sSpeedTable[ i ].fVelNext = 0;
|
sSpeedTable[ i ].fVelNext = 0;
|
||||||
}
|
}
|
||||||
else if ((iDrivigFlags & moveStopCloser) ?
|
else if( true == isatpassengerstop ) {
|
||||||
sSpeedTable[i].fDist + fLength <=
|
// jeśli się zatrzymał przy W4, albo stał w momencie zobaczenia W4
|
||||||
std::max(
|
|
||||||
sSpeedTable[i].evEvent->ValueGet(2),
|
|
||||||
2.0 * fMaxProximityDist + fLength) : // fmaxproximitydist typically equals ~50 m
|
|
||||||
sSpeedTable[i].fDist < d_to_next_sem)
|
|
||||||
// Ra 2F1I: odległość plus długość pociągu musi być mniejsza od długości
|
|
||||||
// peronu, chyba że pociąg jest dłuższy, to wtedy minimalna
|
|
||||||
// jeśli długość peronu ((sSpeedTable[i].evEvent->ValueGet(2)) nie podana,
|
|
||||||
// przyjąć odległość fMinProximityDist
|
|
||||||
{ // jeśli się zatrzymał przy W4, albo stał w momencie zobaczenia W4
|
|
||||||
if( !AIControllFlag ) {
|
if( !AIControllFlag ) {
|
||||||
// w razie przełączenia na AI ma nie podciągać do W4, gdy użytkownik zatrzymał za daleko
|
// w razie przełączenia na AI ma nie podciągać do W4, gdy użytkownik zatrzymał za daleko
|
||||||
iDrivigFlags &= ~moveStopCloser;
|
iDrivigFlags &= ~moveStopCloser;
|
||||||
@@ -881,8 +885,9 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
if( ( iDrivigFlags & moveDoorOpened ) == 0 ) {
|
if( ( iDrivigFlags & moveDoorOpened ) == 0 ) {
|
||||||
// drzwi otwierać jednorazowo
|
// drzwi otwierać jednorazowo
|
||||||
iDrivigFlags |= moveDoorOpened; // nie wykonywać drugi raz
|
iDrivigFlags |= moveDoorOpened; // nie wykonywać drugi raz
|
||||||
Doors( true, static_cast<int>( std::floor( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) % 10 );
|
Doors( true, static_cast<int>( std::floor( std::abs( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) ) % 10 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TrainParams->UpdateMTable( simulation::Time, asNextStop) ) {
|
if (TrainParams->UpdateMTable( simulation::Time, asNextStop) ) {
|
||||||
// to się wykona tylko raz po zatrzymaniu na W4
|
// to się wykona tylko raz po zatrzymaniu na W4
|
||||||
if( TrainParams->StationIndex < TrainParams->StationCount ) {
|
if( TrainParams->StationIndex < TrainParams->StationCount ) {
|
||||||
@@ -892,7 +897,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
|
|
||||||
// perform loading/unloading
|
// perform loading/unloading
|
||||||
auto const platformside = static_cast<int>( std::floor( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) % 10;
|
auto const platformside = static_cast<int>( std::floor( std::abs( sSpeedTable[ i ].evEvent->ValueGet( 2 ) ) ) ) % 10;
|
||||||
auto const exchangetime = simulation::Station.update_load( pVehicles[ 0 ], *TrainParams, platformside );
|
auto const exchangetime = simulation::Station.update_load( pVehicles[ 0 ], *TrainParams, platformside );
|
||||||
WaitingSet( std::max( -fStopTime, exchangetime ) ); // na końcu rozkładu się ustawia 60s i tu by było skrócenie
|
WaitingSet( std::max( -fStopTime, exchangetime ) ); // na końcu rozkładu się ustawia 60s i tu by było skrócenie
|
||||||
|
|
||||||
@@ -936,29 +941,21 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (OrderCurrentGet() == Shunt)
|
|
||||||
{
|
if (OrderCurrentGet() == Shunt) {
|
||||||
OrderNext(Obey_train); // uruchomić jazdę pociągową
|
OrderNext(Obey_train); // uruchomić jazdę pociągową
|
||||||
CheckVehicles(); // zmienić światła
|
CheckVehicles(); // zmienić światła
|
||||||
}
|
}
|
||||||
if (TrainParams->StationIndex < TrainParams->StationCount)
|
|
||||||
{ // jeśli są dalsze stacje, czekamy do godziny odjazdu
|
if (TrainParams->StationIndex < TrainParams->StationCount) {
|
||||||
if (TrainParams->IsTimeToGo(simulation::Time.data().wHour, simulation::Time.data().wMinute))
|
// jeśli są dalsze stacje, czekamy do godziny odjazdu
|
||||||
{ // z dalszą akcją czekamy do godziny odjazdu
|
if (TrainParams->IsTimeToGo(simulation::Time.data().wHour, simulation::Time.data().wMinute)) {
|
||||||
/* potencjalny problem z ruszaniem z w4
|
// z dalszą akcją czekamy do godziny odjazdu
|
||||||
if (TrainParams->CheckTrainLatency() < 0)
|
isatpassengerstop = false;
|
||||||
WaitingSet(20); //Jak spóźniony to czeka 20s
|
// przy jakim dystansie (stanie licznika) ma przesunąć na następny postój
|
||||||
*/
|
fLastStopExpDist = mvOccupied->DistCounter + 0.050 + 0.001 * fLength;
|
||||||
// iDrivigFlags|=moveLate1; //oflagować, gdy odjazd ze
|
|
||||||
// spóźnieniem, będzie jechał forsowniej
|
|
||||||
fLastStopExpDist =
|
|
||||||
mvOccupied->DistCounter + 0.050 +
|
|
||||||
0.001 * fLength; // przy jakim dystansie (stanie licznika)
|
|
||||||
// ma przesunąć na następny postój
|
|
||||||
// Controlled-> //zapisać odległość do przejechania
|
|
||||||
TrainParams->StationIndexInc(); // przejście do następnej
|
TrainParams->StationIndexInc(); // przejście do następnej
|
||||||
asNextStop = TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
asNextStop = TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
|
||||||
// TableClear(); //aby od nowa sprawdziło W4 z inną nazwą już - to nie jest dobry pomysł
|
|
||||||
#if LOGSTOPS
|
#if LOGSTOPS
|
||||||
WriteLog(
|
WriteLog(
|
||||||
pVehicle->asName + " as " + TrainParams->TrainName
|
pVehicle->asName + " as " + TrainParams->TrainName
|
||||||
@@ -990,8 +987,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
continue; // nie analizować prędkości
|
continue; // nie analizować prędkości
|
||||||
} // koniec startu z zatrzymania
|
} // koniec startu z zatrzymania
|
||||||
} // koniec obsługi początkowych stacji
|
} // koniec obsługi początkowych stacji
|
||||||
else
|
else {
|
||||||
{ // jeśli dojechaliśmy do końca rozkładu
|
// jeśli dojechaliśmy do końca rozkładu
|
||||||
#if LOGSTOPS
|
#if LOGSTOPS
|
||||||
WriteLog(
|
WriteLog(
|
||||||
pVehicle->asName + " as " + TrainParams->TrainName
|
pVehicle->asName + " as " + TrainParams->TrainName
|
||||||
@@ -1026,7 +1023,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
continue; // nie analizować prędkości
|
continue; // nie analizować prędkości
|
||||||
}
|
}
|
||||||
} // koniec obsługi W4
|
} // koniec obsługi W4
|
||||||
v = sSpeedTable[i].fVelNext; // odczyt prędkości do zmiennej pomocniczej
|
v = sSpeedTable[ i ].fVelNext; // odczyt prędkości do zmiennej pomocniczej
|
||||||
if( sSpeedTable[ i ].iFlags & spSwitch ) {
|
if( sSpeedTable[ i ].iFlags & spSwitch ) {
|
||||||
// zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich
|
// zwrotnice są usuwane z tabelki dopiero po zjechaniu z nich
|
||||||
iDrivigFlags |= moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz
|
iDrivigFlags |= moveSwitchFound; // rozjazd z przodu/pod ogranicza np. sens skanowania wstecz
|
||||||
@@ -1190,12 +1187,13 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
{ // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał
|
{ // zawalidrogi nie ma (albo pojazd jest samochodem), sprawdzić sygnał
|
||||||
if (sSpeedTable[i].iFlags & spShuntSemaphor) // jeśli Tm - w zasadzie to sprawdzić komendę!
|
if (sSpeedTable[i].iFlags & spShuntSemaphor) // jeśli Tm - w zasadzie to sprawdzić komendę!
|
||||||
{ // jeśli podana prędkość manewrowa
|
{ // jeśli podana prędkość manewrowa
|
||||||
if ((OrderCurrentGet() & Obey_train) ? v == 0.0 : false)
|
if( ( v == 0.0 ) && ( true == TestFlag( OrderCurrentGet(), Obey_train ) ) ) {
|
||||||
{ // jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0
|
// jeśli tryb pociągowy a tarcze ma ShuntVelocity 0 0
|
||||||
v = -1; // ignorować, chyba że prędkość stanie się niezerowa
|
v = -1; // ignorować, chyba że prędkość stanie się niezerowa
|
||||||
if (sSpeedTable[i].iFlags & spElapsed) // a jak przejechana
|
if( true == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) {
|
||||||
sSpeedTable[i].iFlags = 0; // to można usunąć, bo podstawowy automat
|
// a jak przejechana to można usunąć, bo podstawowy automat usuwa tylko niezerowe
|
||||||
// usuwa tylko niezerowe
|
sSpeedTable[ i ].iFlags = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (go == cm_Unknown) // jeśli jeszcze nie ma komendy
|
else if (go == cm_Unknown) // jeśli jeszcze nie ma komendy
|
||||||
if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie
|
if (v != 0.0) // komenda jest tylko gdy ma jechać, bo stoi na podstawie
|
||||||
@@ -1269,19 +1267,19 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
}
|
}
|
||||||
} // jeśli nie ma zawalidrogi
|
} // jeśli nie ma zawalidrogi
|
||||||
} // jeśli event
|
} // jeśli event
|
||||||
if (v >= 0.0)
|
|
||||||
{ // pozycje z prędkością -1 można spokojnie pomijać
|
if (v >= 0.0) {
|
||||||
|
// pozycje z prędkością -1 można spokojnie pomijać
|
||||||
d = sSpeedTable[i].fDist;
|
d = sSpeedTable[i].fDist;
|
||||||
if( ( d > 0.0 )
|
if( ( d > 0.0 )
|
||||||
&& ( false == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) ) {
|
&& ( false == TestFlag( sSpeedTable[ i ].iFlags, spElapsed ) ) ) {
|
||||||
// sygnał lub ograniczenie z przodu (+32=przejechane)
|
// sygnał lub ograniczenie z przodu (+32=przejechane)
|
||||||
// 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
|
// 2014-02: jeśli stoi, a ma do przejechania kawałek, to niech jedzie
|
||||||
if( ( mvOccupied->Vel == 0.0 )
|
if( ( mvOccupied->Vel < 0.01 )
|
||||||
&& ( d > fMaxProximityDist )
|
&& ( true == TestFlag( sSpeedTable[ i ].iFlags, ( spEnabled | spEvent | spPassengerStopPoint ) ) )
|
||||||
&& ( true == TestFlag( sSpeedTable[ i ].iFlags, ( spEnabled | spEvent | spPassengerStopPoint ) ) ) ) {
|
&& ( false == isatpassengerstop ) ) {
|
||||||
// ma podjechać bliżej - czy na pewno w tym miejscu taki warunek?
|
// ma podjechać bliżej - czy na pewno w tym miejscu taki warunek?
|
||||||
a = (
|
a = ( iDrivigFlags & moveStopCloser ?
|
||||||
iDrivigFlags & moveStopCloser ?
|
|
||||||
fAcc :
|
fAcc :
|
||||||
0.0 );
|
0.0 );
|
||||||
}
|
}
|
||||||
@@ -1351,14 +1349,16 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
|
|||||||
VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami
|
VelSignalLast = -1.0; // jeśli mieliśmy ograniczenie z semafora i nie ma przed nami
|
||||||
|
|
||||||
//analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego
|
//analiza spisanych z tabelki ograniczeń i nadpisanie aktualnego
|
||||||
if (VelSignalLast >= 0.0)
|
if( ( true == isatpassengerstop ) && ( mvOccupied->Vel < 0.01 ) ) {
|
||||||
fVelDes = Min0R(fVelDes, VelSignalLast);
|
// if stopped at a valid passenger stop, hold there
|
||||||
if (VelLimitLast >= 0.0)
|
fVelDes = 0.0;
|
||||||
fVelDes = Min0R(fVelDes, VelLimitLast);
|
}
|
||||||
if (VelRoad >= 0.0)
|
else {
|
||||||
fVelDes = Min0R(fVelDes, VelRoad);
|
fVelDes = min_speed( fVelDes, VelSignalLast );
|
||||||
if( VelRestricted >= 0.0 )
|
fVelDes = min_speed( fVelDes, VelLimitLast );
|
||||||
fVelDes = Min0R( fVelDes, VelRestricted );
|
fVelDes = min_speed( fVelDes, VelRoad );
|
||||||
|
fVelDes = min_speed( fVelDes, VelRestricted );
|
||||||
|
}
|
||||||
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
// nastepnego semafora albo zwrotnicy to uznajemy, że mijamy W5
|
||||||
FirstSemaphorDist = d_to_next_sem; // przepisanie znalezionej wartosci do zmiennej
|
FirstSemaphorDist = d_to_next_sem; // przepisanie znalezionej wartosci do zmiennej
|
||||||
return go;
|
return go;
|
||||||
@@ -4443,6 +4443,8 @@ TController::UpdateSituation(double dt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( VelNext == 0.0 ) {
|
if( VelNext == 0.0 ) {
|
||||||
|
|||||||
37
DynObj.cpp
37
DynObj.cpp
@@ -6117,40 +6117,31 @@ TDynamicObject::powertrain_sounds::render( TMoverParameters const &Vehicle, doub
|
|||||||
if( Vehicle.TurboTest > 0 ) {
|
if( Vehicle.TurboTest > 0 ) {
|
||||||
// udawanie turbo:
|
// udawanie turbo:
|
||||||
auto const goalpitch { std::max( 0.025, ( engine_volume + engine_turbo.m_frequencyoffset ) * engine_turbo.m_frequencyfactor ) };
|
auto const goalpitch { std::max( 0.025, ( engine_volume + engine_turbo.m_frequencyoffset ) * engine_turbo.m_frequencyfactor ) };
|
||||||
auto const goalvolume { std::max( 0.0, ( engine_turbo_pitch + engine_turbo.m_amplitudeoffset ) * engine_turbo.m_amplitudefactor ) };
|
auto const goalvolume { (
|
||||||
|
( ( Vehicle.MainCtrlPos >= Vehicle.TurboTest ) && ( Vehicle.enrot > 0.1 ) ) ?
|
||||||
|
std::max( 0.0, ( engine_turbo_pitch + engine_turbo.m_amplitudeoffset ) * engine_turbo.m_amplitudefactor ) :
|
||||||
|
0.0 ) };
|
||||||
auto const currentvolume { engine_turbo.gain() };
|
auto const currentvolume { engine_turbo.gain() };
|
||||||
auto const changerate { 0.4 * Deltatime };
|
auto const changerate { 0.4 * Deltatime };
|
||||||
|
|
||||||
if( ( Vehicle.MainCtrlPos >= Vehicle.TurboTest )
|
engine_turbo_pitch = (
|
||||||
&& ( Vehicle.enrot > 0.1 ) ) {
|
engine_turbo_pitch > goalpitch ?
|
||||||
|
std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 ) :
|
||||||
|
std::min( goalpitch, engine_turbo_pitch + changerate ) );
|
||||||
|
|
||||||
engine_turbo_pitch = (
|
volume = (
|
||||||
engine_turbo_pitch > goalpitch ?
|
currentvolume > goalvolume ?
|
||||||
std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 ) :
|
std::max( goalvolume, currentvolume - changerate ) :
|
||||||
std::min( goalpitch, engine_turbo_pitch + changerate ) );
|
std::min( goalvolume, currentvolume + changerate ) );
|
||||||
|
|
||||||
volume = (
|
|
||||||
currentvolume > goalvolume ?
|
|
||||||
std::max( goalvolume, currentvolume - changerate ) :
|
|
||||||
std::min( goalvolume, currentvolume + changerate ) );
|
|
||||||
|
|
||||||
|
if( volume > 0.05 ) {
|
||||||
engine_turbo
|
engine_turbo
|
||||||
.pitch( 0.4 + engine_turbo_pitch * 0.4 )
|
.pitch( 0.4 + engine_turbo_pitch * 0.4 )
|
||||||
.gain( volume )
|
.gain( volume )
|
||||||
.play( sound_flags::exclusive | sound_flags::looping );
|
.play( sound_flags::exclusive | sound_flags::looping );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
engine_turbo_pitch = std::max( goalpitch, engine_turbo_pitch - changerate * 0.5 );
|
engine_turbo.stop();
|
||||||
volume = std::max( 0.0, engine_turbo.gain() - 2.0 * Deltatime );
|
|
||||||
if( volume > 0.05 ) {
|
|
||||||
engine_turbo
|
|
||||||
.pitch( 0.4 + engine_turbo_pitch * 0.4 )
|
|
||||||
.gain( volume );
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
engine_turbo.stop();
|
|
||||||
engine_turbo_pitch = goalpitch;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user