diff --git a/AnimModel.cpp b/AnimModel.cpp index 4d299429..2cb80ff8 100644 --- a/AnimModel.cpp +++ b/AnimModel.cpp @@ -567,20 +567,42 @@ void TAnimModel::RaPrepare() for (int i = 0; i < iNumLights; ++i) { auto const lightmode { static_cast( lsLights[ i ] ) }; - switch (lightmode) - { - case ls_Blink: // migotanie - state = ( fBlinkTimer < fOnTime ); - break; - case ls_Dark: // zapalone, gdy ciemno - state = ( - Global.fLuminance <= ( - lsLights[i] == 3.f ? - DefaultDarkThresholdLevel : - ( lsLights[i] - 3.f ) ) ); - break; - default: // zapalony albo zgaszony - state = (lightmode == ls_On); + switch( lightmode ) { + case ls_On: + case ls_Off: { + // zapalony albo zgaszony + state = ( lightmode == ls_On ); + break; + } + case ls_Blink: { + // migotanie + state = ( fBlinkTimer < fOnTime ); + break; + } + case ls_Dark: { + // zapalone, gdy ciemno + state = ( + Global.fLuminance <= ( + lsLights[ i ] == static_cast( ls_Dark ) ? + DefaultDarkThresholdLevel : + ( lsLights[ i ] - static_cast( ls_Dark ) ) ) ); + break; + } + case ls_Home: { + // like ls_dark but off late at night + auto const simulationhour { simulation::Time.data().wHour }; + state = ( + Global.fLuminance <= ( + lsLights[ i ] == static_cast( ls_Home ) ? + DefaultDarkThresholdLevel : + ( lsLights[ i ] - static_cast( ls_Home ) ) ) ); + // force the lights off between 1-5am + state = state && (( simulationhour < 1 ) || ( simulationhour >= 5 )); + break; + } + default: { + break; + } } if (LightsOn[i]) LightsOn[i]->iVisible = state; @@ -757,31 +779,6 @@ void TAnimModel::LightSet(int const n, float const v) if (n >= iMaxNumLights) return; // przekroczony zakres lsLights[ n ] = v; - switch( static_cast( lsLights[ n ] ) ) { - // interpretacja ułamka zależnie od typu - case ls_Off: { - // ustalenie czasu migotania, t<1s (f>1Hz), np. 0.1 => t=0.1 (f=10Hz) - break; - } - case ls_On: { - // ustalenie wypełnienia ułamkiem, np. 1.25 => zapalony przez 1/4 okresu - break; - } - case ls_Blink: { - // ustalenie częstotliwości migotania, f<1Hz (t>1s), np. 2.2 => f=0.2Hz (t=5s) - break; - } - case ls_Dark: { - // zapalenie świateł zależne od oświetlenia scenerii -/* - if( v == 3.f ) { - // standardowy próg zaplania - lsLights[ n ] = 3.f + DefaultDarkThresholdLevel; - } -*/ - break; - } - } }; void TAnimModel::AnimUpdate(double dt) diff --git a/AnimModel.h b/AnimModel.h index 8d24ee03..b2a73536 100644 --- a/AnimModel.h +++ b/AnimModel.h @@ -25,12 +25,12 @@ const int iMaxNumLights = 8; float const DefaultDarkThresholdLevel { 0.325f }; // typy stanu świateł -enum TLightState -{ +enum TLightState { ls_Off = 0, // zgaszone ls_On = 1, // zapalone ls_Blink = 2, // migające - ls_Dark = 3 // Ra: zapalajce się automatycznie, gdy zrobi się ciemno + ls_Dark = 3, // Ra: zapalajce się automatycznie, gdy zrobi się ciemno + ls_Home = 4 // like ls_dark but off late at night }; class TAnimVocaloidFrame diff --git a/Driver.cpp b/Driver.cpp index 78fb1be9..63aed652 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1990,7 +1990,6 @@ bool TController::CheckVehicles(TOrders user) } d = p->DirectionSet(d ? 1 : -1); // zwraca położenie następnego (1=zgodny,0=odwrócony - // względem czoła składu) - p->fScanDist = 300.0; // odległość skanowania w poszukiwaniu innych pojazdów p->ctOwner = this; // dominator oznacza swoje terytorium p = p->Next(); // pojazd podłączony od tyłu (licząc od czoła) } @@ -2005,13 +2004,22 @@ bool TController::CheckVehicles(TOrders user) } else if (OrderCurrentGet() & (Shunt | Connect)) { - Lights( - light::headlight_right, - ( pVehicles[ 1 ]->MoverParameters->CabNo ) ? - 1 : - 0 ); //światła manewrowe (Tb1) na pojeździe z napędem - if (OrderCurrentGet() & Connect) // jeśli łączenie, skanować dalej - pVehicles[0]->fScanDist = 5000.0; // odległość skanowania w poszukiwaniu innych pojazdów + // HACK: the 'front' and 'rear' of the consist is determined by current consist direction + // since direction shouldn't affect Tb1 light configuration, we 'counter' this behaviour by virtually swapping end vehicles + if( mvOccupied->ActiveDir > 0 ) { + Lights( + light::headlight_right, + ( pVehicles[ 1 ]->MoverParameters->CabNo != 0 ? + light::headlight_left : + 0 ) ); //światła manewrowe (Tb1) na pojeździe z napędem + } + else { + Lights( + ( pVehicles[ 1 ]->MoverParameters->CabNo != 0 ? + light::headlight_left : + 0 ), + light::headlight_right ); //światła manewrowe (Tb1) na pojeździe z napędem + } } else if( OrderCurrentGet() == Disconnect ) { if( mvOccupied->ActiveDir > 0 ) { @@ -2746,11 +2754,11 @@ bool TController::IncSpeed() // (if there's only one parallel mode configuration it'll be used regardless of current speed) auto const scndctrl = ( ( mvControlling->StLinFlag ) - && ( mvControlling->RList[ mvControlling->MainCtrlActualPos ].R < 0.01 ) + && ( mvControlling->RList[ mvControlling->MainCtrlPos ].R < 0.01 ) && ( useseriesmode ? - mvControlling->RList[ mvControlling->MainCtrlActualPos ].Bn == 1 : + mvControlling->RList[ mvControlling->MainCtrlPos ].Bn == 1 : ( ( mvOccupied->Vel <= ( ( mvOccupied->BrakeDelayFlag & bdelay_G ) != 0 ? 55 : 45 ) + ( mvControlling->ScndCtrlPos == 0 ? 0 : 5 ) ) ? - mvControlling->RList[ mvControlling->MainCtrlActualPos ].Bn > 1 : + mvControlling->RList[ mvControlling->MainCtrlPos ].Bn > 1 : mvControlling->MainCtrlPos == mvControlling->MainCtrlPosNo ) ) ); double Vs = 99999; @@ -4609,7 +4617,7 @@ TController::UpdateSituation(double dt) { { // jeśli tamten porusza się z niewielką prędkością albo stoi if( OrderCurrentGet() & Connect ) { // jeśli spinanie, to jechać dalej - AccPreferred = std::min( 0.25, AccPreferred ); // nie hamuj + AccPreferred = std::min( 0.35, AccPreferred ); // nie hamuj VelDesired = min_speed( VelDesired, @@ -4661,7 +4669,7 @@ TController::UpdateSituation(double dt) { VelDesired = min_speed( VelDesired, - ( vehicle->fTrackBlock > 150.0 ? + ( vehicle->fTrackBlock > 100.0 ? 20.0 : 4.0 ) ); } @@ -4832,7 +4840,11 @@ TController::UpdateSituation(double dt) { } else { // przy dużej różnicy wysoki stopień (1,00 potrzebnego opoznienia) - if( ( std::max( 100.0, fMaxProximityDist ) + fBrakeDist * braking_distance_multiplier( VelNext ) ) >= ( ActualProximityDist - fMaxProximityDist ) ) { + auto const slowdowndistance { ( + ( OrderCurrentGet() & Connect ) == 0 ? + 100.0 : + 25.0 ) }; + if( ( std::max( slowdowndistance, fMaxProximityDist ) + fBrakeDist * braking_distance_multiplier( VelNext ) ) >= ( ActualProximityDist - fMaxProximityDist ) ) { // don't slow down prematurely; as long as we have room to come to a full stop at a safe distance, we're good // ensure some minimal coasting speed, otherwise a vehicle entering this zone at very low speed will be crawling forever auto const brakingpointoffset = VelNext * braking_distance_multiplier( VelNext ); diff --git a/DynObj.cpp b/DynObj.cpp index 7ae51b33..4b15f23b 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -1745,7 +1745,6 @@ TDynamicObject::TDynamicObject() { smBrakeSet = NULL; // nastawa hamulca (wajcha) smLoadSet = NULL; // nastawa ładunku (wajcha) smWiper = NULL; // wycieraczka (poniekąd też wajcha) - fScanDist = 300.0; // odległość skanowania, zwiększana w trybie łączenia ctOwner = NULL; // na początek niczyj iOverheadMask = 0; // maska przydzielana przez AI pojazdom posiadającym // pantograf, aby wymuszały diff --git a/version.h b/version.h index 9cadb5b3..89a1940a 100644 --- a/version.h +++ b/version.h @@ -1 +1 @@ -#define VERSION_INFO "M7 30.06.2018, based on tmj 5dfbd5b" +#define VERSION_INFO "M7 30.06.2018/2, based on tmj 293787c"