16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-22 23:19:19 +02:00

fixed recognition of train stops.

This commit is contained in:
tmj-fstate
2017-02-05 00:58:24 +01:00
parent 589b6d5301
commit fdb95d3b63
6 changed files with 42 additions and 42 deletions

View File

@@ -160,7 +160,7 @@ void TSpeedPos::CommandCheck()
case cm_PassengerStopPoint: case cm_PassengerStopPoint:
// nie ma dostępu do rozkładu // nie ma dostępu do rozkładu
// przystanek, najwyżej AI zignoruje przy analizie tabelki // przystanek, najwyżej AI zignoruje przy analizie tabelki
if ((iFlags & spPassengerStopPoint) == 0) // if ((iFlags & spPassengerStopPoint) == 0)
fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak fVelNext = 0.0; // TrainParams->IsStop()?0.0:-1.0; //na razie tak
iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem iFlags |= spPassengerStopPoint; // niestety nie da się w tym miejscu współpracować z rozkładem
break; break;
@@ -829,7 +829,8 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
{ // o ile dana pozycja tabelki jest istotna { // o ile dana pozycja tabelki jest istotna
if (sSpeedTable[i].iFlags & spPassengerStopPoint) if (sSpeedTable[i].iFlags & spPassengerStopPoint)
{ // jeśli przystanek, trzeba obsłużyć wg rozkładu { // jeśli przystanek, trzeba obsłużyć wg rozkładu
if (sSpeedTable[i].evEvent->CommandGet() != asNextStop) // first 19 chars of the command is expected to be "PassengerStopPoint:" so we skip them
if ( ToLower(sSpeedTable[i].evEvent->CommandGet()).compare( 19, sizeof(asNextStop), ToLower(asNextStop)) != 0 )
{ // jeśli nazwa nie jest zgodna { // jeśli nazwa nie jest zgodna
if (sSpeedTable[i].fDist < -fLength) // jeśli został przejechany if (sSpeedTable[i].fDist < -fLength) // jeśli został przejechany
sSpeedTable[i].iFlags = sSpeedTable[i].iFlags =
@@ -856,8 +857,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// licznika) ma przesunąć na // licznika) ma przesunąć na
// następny postój // następny postój
TrainParams->UpdateMTable( TrainParams->UpdateMTable(
GlobalTime->hh, GlobalTime->mm, GlobalTime->hh, GlobalTime->mm, asNextStop);
asNextStop.substr(19, asNextStop.length()));
TrainParams->StationIndexInc(); // przejście do następnej TrainParams->StationIndexInc(); // przejście do następnej
asNextStop = asNextStop =
TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania TrainParams->NextStop(); // pobranie kolejnego miejsca zatrzymania
@@ -956,8 +956,7 @@ TCommandType TController::TableUpdate(double &fVelDes, double &fDist, double &fN
// opóźnia również kierownika // opóźnia również kierownika
} }
if (TrainParams->UpdateMTable( if (TrainParams->UpdateMTable(
GlobalTime->hh, GlobalTime->mm, GlobalTime->hh, GlobalTime->mm, asNextStop) )
asNextStop.substr(19, asNextStop.length())))
{ // to się wykona tylko raz po zatrzymaniu na W4 { // to się wykona tylko raz po zatrzymaniu na W4
if (TrainParams->CheckTrainLatency() < 0.0) if (TrainParams->CheckTrainLatency() < 0.0)
iDrivigFlags |= moveLate; // odnotowano spóźnienie iDrivigFlags |= moveLate; // odnotowano spóźnienie
@@ -2438,7 +2437,8 @@ bool TController::IncSpeed()
if (tsGuardSignal->GetStatus() & DSBSTATUS_PLAYING) // jeśli gada, to nie jedziemy if (tsGuardSignal->GetStatus() & DSBSTATUS_PLAYING) // jeśli gada, to nie jedziemy
return false; return false;
bool OK = true; bool OK = true;
if (iDrivigFlags & moveDoorOpened) if ((iDrivigFlags & moveDoorOpened)
&&(mvOccupied->Vel > 0.1)) // added velocity threshold to prevent door shuffle on stop
Doors(false); // zamykanie drzwi - tutaj wykonuje tylko AI (zmienia fActionTime) Doors(false); // zamykanie drzwi - tutaj wykonuje tylko AI (zmienia fActionTime)
if (fActionTime < 0.0) // gdy jest nakaz poczekać z jazdą, to nie ruszać if (fActionTime < 0.0) // gdy jest nakaz poczekać z jazdą, to nie ruszać
return false; return false;
@@ -4184,6 +4184,12 @@ bool TController::UpdateSituation(double dt)
{ // komunikat od kierownika tu, bo musi być wolna droga i odczekany czas { // komunikat od kierownika tu, bo musi być wolna droga i odczekany czas
// stania // stania
iDrivigFlags &= ~moveGuardSignal; // tylko raz nadać iDrivigFlags &= ~moveGuardSignal; // tylko raz nadać
if( iDrivigFlags & moveDoorOpened ) // jeśli drzwi otwarte
if( !mvOccupied
->DoorOpenCtrl ) // jeśli drzwi niesterowane przez maszynistę
Doors( false ); // a EZT zamknie dopiero po odegraniu komunikatu kierownika
tsGuardSignal->Stop(); tsGuardSignal->Stop();
// w zasadzie to powinien mieć flagę, czy jest dźwiękiem radiowym, czy // w zasadzie to powinien mieć flagę, czy jest dźwiękiem radiowym, czy
// bezpośrednim // bezpośrednim
@@ -4207,11 +4213,6 @@ bool TController::UpdateSituation(double dt)
1.0, 0, true, 1.0, 0, true,
pVehicle->GetPosition()); // dźwięk niby przez radio pVehicle->GetPosition()); // dźwięk niby przez radio
} }
if (iDrivigFlags & moveDoorOpened) // jeśli drzwi otwarte
if (!mvOccupied
->DoorOpenCtrl) // jeśli drzwi niesterowane przez maszynistę
Doors(false); // a EZT zamknie dopiero po odegraniu komunikatu
// kierownika
} }
if (mvOccupied->V == 0.0) if (mvOccupied->V == 0.0)
AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego AbsAccS = fAccGravity; // Ra 2014-03: jesli skład stoi, to działa na niego
@@ -5238,19 +5239,24 @@ TCommandType TController::BackwardScan()
std::string TController::NextStop() std::string TController::NextStop()
{ // informacja o następnym zatrzymaniu, wyświetlane pod [F1] { // informacja o następnym zatrzymaniu, wyświetlane pod [F1]
if (asNextStop.length() < 19) if (asNextStop == "[End of route]")
return ""; // nie zawiera nazwy stacji, gdy dojechał do końca return ""; // nie zawiera nazwy stacji, gdy dojechał do końca
// dodać godzinę odjazdu // dodać godzinę odjazdu
if (!TrainParams) if (!TrainParams)
return ""; // tu nie powinno nigdy wejść return ""; // tu nie powinno nigdy wejść
std::string nextstop = asNextStop;
TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex; TMTableLine *t = TrainParams->TimeTable + TrainParams->StationIndex;
if (t->Dh >= 0) // jeśli jest godzina odjazdu if( t->Ah >= 0 ) {
return asNextStop.substr(19, 30) + " " + std::to_string(t->Dh) + ":" + // przyjazd
std::to_string(t->Dm); // odjazd nextstop += " przyj." + std::to_string( t->Ah ) + ":"
else if (t->Ah >= 0) // przyjazd + ( t->Am < 10 ? "0" : "" ) + std::to_string( t->Am );
return asNextStop.substr(19, 30) + " (" + std::to_string(t->Ah) + ":" + }
std::to_string(t->Am) + ")"; // przyjazd if( t->Dh >= 0 ) {
return ""; // jeśli jest godzina odjazdu
nextstop += " odj." + std::to_string( t->Dh ) + ":"
+ ( t->Dm < 10 ? "0" : "" ) + std::to_string( t->Dm );
}
return nextstop;
}; };
//-----------koniec skanowania semaforow //-----------koniec skanowania semaforow

View File

@@ -5910,7 +5910,7 @@ TDynamicObject::ConnectedEnginePowerSource( TDynamicObject const *Caller ) const
// NOTE: the order should be reversed in flipped vehicles, but we ignore this out of laziness // NOTE: the order should be reversed in flipped vehicles, but we ignore this out of laziness
if( ( nullptr != NextConnected ) if( ( nullptr != NextConnected )
&& ( NextConnected != Caller ) && ( NextConnected != Caller )
&& ( MoverParameters->Couplers[1].CouplingFlag & ctrain_controll == ctrain_controll ) ) { && ( ( MoverParameters->Couplers[1].CouplingFlag & ctrain_controll ) == ctrain_controll ) ) {
auto source = NextConnected->ConnectedEnginePowerSource( this ); auto source = NextConnected->ConnectedEnginePowerSource( this );
if( source != TPowerSource::NotDefined ) { if( source != TPowerSource::NotDefined ) {
@@ -5921,7 +5921,7 @@ TDynamicObject::ConnectedEnginePowerSource( TDynamicObject const *Caller ) const
// ...then rear... // ...then rear...
if( ( nullptr != PrevConnected ) if( ( nullptr != PrevConnected )
&& ( PrevConnected != Caller ) && ( PrevConnected != Caller )
&& ( MoverParameters->Couplers[ 0 ].CouplingFlag & ctrain_controll == ctrain_controll ) ) { && ( ( MoverParameters->Couplers[ 0 ].CouplingFlag & ctrain_controll ) == ctrain_controll ) ) {
auto source = PrevConnected->ConnectedEnginePowerSource( this ); auto source = PrevConnected->ConnectedEnginePowerSource( this );
if( source != TPowerSource::NotDefined ) { if( source != TPowerSource::NotDefined ) {

View File

@@ -316,7 +316,7 @@ void TEvent::Load(cParser *parser, vector3 *org)
if (token.substr(0, 19) == "PassengerStopPoint:") if (token.substr(0, 19) == "PassengerStopPoint:")
{ {
if (token.find('#') != std::string::npos) if (token.find('#') != std::string::npos)
token = token.substr(0, token.find('#') - 1); // obcięcie unikatowości token.erase(token.find('#')); // obcięcie unikatowości
bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru bEnabled = false; // nie do kolejki (dla SetVelocity też, ale jak jest do toru
// dowiązany) // dowiązany)
Params[6].asCommand = cm_PassengerStopPoint; Params[6].asCommand = cm_PassengerStopPoint;

View File

@@ -2551,9 +2551,8 @@ void TTrain::UpdateMechPosition(double dt)
// ABu: rzucamy kabina tylko przy duzym FPS! // ABu: rzucamy kabina tylko przy duzym FPS!
// Mala histereza, zeby bez przerwy nie przelaczalo przy FPS~17 // Mala histereza, zeby bez przerwy nie przelaczalo przy FPS~17
// Granice mozna ustalic doswiadczalnie. Ja proponuje 14:20 // Granice mozna ustalic doswiadczalnie. Ja proponuje 14:20
double iVel = DynamicObject->GetVelocity(); double const iVel = std::min(DynamicObject->GetVelocity(), 150.0);
if (iVel > 150.0)
iVel = 150.0;
if (!Global::iSlowMotion // musi być pełna prędkość if (!Global::iSlowMotion // musi być pełna prędkość
&& (pMechOffset.y < 4.0)) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza && (pMechOffset.y < 4.0)) // Ra 15-01: przy oglądaniu pantografu bujanie przeszkadza
{ {
@@ -2561,12 +2560,12 @@ void TTrain::UpdateMechPosition(double dt)
// acceleration-driven base shake // acceleration-driven base shake
shake += 1.5 * MechSpring.ComputateForces( shake += 1.5 * MechSpring.ComputateForces(
vector3( vector3(
-mvControlled->AccN * dt * 7.5, // highlight side sway -mvControlled->AccN * dt * 5.0, // highlight side sway
mvControlled->AccV * dt * 15, mvControlled->AccV * dt,
-mvControlled->AccS * dt ), -mvControlled->AccS * dt * 2.5 ), // accent acceleration/deceleration
pMechShake ); pMechShake );
if( Random( iVel ) > 30.0 ) { if( Random( iVel ) > 25.0 ) {
// extra shake at increased velocity // extra shake at increased velocity
shake += MechSpring.ComputateForces( shake += MechSpring.ComputateForces(
vector3( vector3(
@@ -2576,7 +2575,7 @@ void TTrain::UpdateMechPosition(double dt)
pMechShake ); pMechShake );
// * (( 200 - DynamicObject->MyTrack->iQualityFlag ) * 0.0075 ); // scale to 75-150% based on track quality // * (( 200 - DynamicObject->MyTrack->iQualityFlag ) * 0.0075 ); // scale to 75-150% based on track quality
} }
shake *= 1.35; shake *= 1.25;
} }
vMechVelocity -= (shake + vMechVelocity * 100) * (fMechSpringX + fMechSpringY + fMechSpringZ) / (200); vMechVelocity -= (shake + vMechVelocity * 100) * (fMechSpringX + fMechSpringY + fMechSpringZ) / (200);
// shake *= 0.95 * dt; // shake damping // shake *= 0.95 * dt; // shake damping

View File

@@ -1930,16 +1930,11 @@ TWorld::Render_UI() {
if( Global::iTextMode == VK_F1 ) { // tekst pokazywany po wciśnięciu [F1] if( Global::iTextMode == VK_F1 ) { // tekst pokazywany po wciśnięciu [F1]
// Global::iViewMode=VK_F1; // Global::iViewMode=VK_F1;
glColor3f( 1.0f, 1.0f, 1.0f ); // a, damy białym glColor3f( 1.0f, 1.0f, 1.0f ); // a, damy białym
OutText1 = "Time: " + to_string( (int)GlobalTime->hh ) + ":"; OutText1 =
int i = GlobalTime->mm; // bo inaczej potrafi zrobić "hh:010" "Time: "
if( i < 10 ) + to_string( (int)GlobalTime->hh ) + ":"
OutText1 += "0"; + ( GlobalTime->mm < 10 ? "0" : "" ) + to_string( GlobalTime->mm ) + ":"
OutText1 += to_string( i ); // minuty + ( GlobalTime->mr < 10 ? "0" : "" ) + to_string( std::floor( GlobalTime->mr ) );
OutText1 += ":";
i = floor( GlobalTime->mr ); // bo inaczej potrafi zrobić "hh:mm:010"
if( i < 10 )
OutText1 += "0";
OutText1 += to_string( i );
if( Global::iPause ) if( Global::iPause )
OutText1 += " - paused"; OutText1 += " - paused";
if( Controlled ) if( Controlled )

View File

@@ -59,7 +59,7 @@ double TTrainParameters::WatchMTable(double DistCounter)
std::string TTrainParameters::NextStop() std::string TTrainParameters::NextStop()
{ // pobranie nazwy następnego miejsca zatrzymania { // pobranie nazwy następnego miejsca zatrzymania
if (StationIndex <= StationCount) if (StationIndex <= StationCount)
return "PassengerStopPoint:" + NextStationName; // nazwa następnego przystanku; return NextStationName; // nazwa następnego przystanku;
else else
return "[End of route]"; //że niby koniec return "[End of route]"; //że niby koniec
} }