From 819c183f9120be165d7a7c4335c3157ca6b38c1b Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Mon, 29 Apr 2019 17:24:57 +0200 Subject: [PATCH 1/3] vehicle load visualization model texture source fix, python script data source fix --- DynObj.cpp | 7 +++++++ Train.cpp | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index a759d3ef..9c0bd8e1 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -4927,7 +4927,14 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co if( false == MoverParameters->LoadAttributes.empty() ) { // Ra: tu wczytywanie modelu ładunku jest w porządku + + // bieżąca ścieżka do tekstur to dynamic/... + Global.asCurrentTexturePath = asBaseDir; + mdLoad = LoadMMediaFile_mdload( MoverParameters->LoadType.name ); + + // z powrotem defaultowa sciezka do tekstur + Global.asCurrentTexturePath = std::string( szTexturePath ); } } // models diff --git a/Train.cpp b/Train.cpp index 0555adac..53aef0c1 100644 --- a/Train.cpp +++ b/Train.cpp @@ -450,10 +450,10 @@ dictionary_source *TTrain::GetTrainState() { // reverser dict->insert( "direction", mover->ActiveDir ); // throttle - dict->insert( "mainctrl_pos", mover->MainCtrlPos ); - dict->insert( "main_ctrl_actual_pos", mover->MainCtrlActualPos ); - dict->insert( "scndctrl_pos", mover->ScndCtrlPos ); - dict->insert( "scnd_ctrl_actual_pos", mover->ScndCtrlActualPos ); + dict->insert( "mainctrl_pos", mvControlled->MainCtrlPos ); + dict->insert( "main_ctrl_actual_pos", mvControlled->MainCtrlActualPos ); + dict->insert( "scndctrl_pos", mvControlled->ScndCtrlPos ); + dict->insert( "scnd_ctrl_actual_pos", mvControlled->ScndCtrlActualPos ); dict->insert( "new_speed", mover->NewSpeed); // brakes dict->insert( "manual_brake", ( mvOccupied->ManualBrakePos > 0 ) ); From fbe570950d9439c5ca2fc3eedbddf96f0379c14a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kr=C3=B3lik=20Uszasty?= Date: Sun, 28 Apr 2019 10:49:49 +0200 Subject: [PATCH 2/3] Delayed ED braking for ELF --- DynObj.cpp | 8 ++++++++ DynObj.h | 1 + McZapkie/Mover.cpp | 2 -- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/DynObj.cpp b/DynObj.cpp index 9c0bd8e1..4f39db3a 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2783,6 +2783,8 @@ bool TDynamicObject::Update(double dt, double dt1) auto eimic = Min0R(MoverParameters->eimic, MoverParameters->eimicSpeedCtrl); MoverParameters->eimic_real = eimic; + if (MoverParameters->EIMCtrlType == 2 && MoverParameters->MainCtrlPos == 0) + eimic = -1.0; MoverParameters->SendCtrlToNext("EIMIC", Max0R(0, eimic), MoverParameters->CabNo); auto LBR = Max0R(-eimic, 0); auto eim_lb = (Mechanik->AIControllFlag || !MoverParameters->LocHandleTimeTraxx ? 0 : MoverParameters->eim_localbrake); @@ -2892,6 +2894,10 @@ bool TDynamicObject::Update(double dt, double dt1) && ( MoverParameters->BrakeOpModeFlag & bom_MED ) ) ) { FzadED = std::min( Fzad, FmaxED ); } + if (MoverParameters->EIMCtrlType == 2 && MoverParameters->MainCtrlPos < 2 && MoverParameters->eimic > -0.999) + { + FzadED = std::min(FzadED, MED_oldFED); + } if ((MoverParameters->BrakeCtrlPos == MoverParameters->Handle->GetPos(bh_EB)) && (MoverParameters->eimc[eimc_p_abed] < 0.001)) FzadED = 0; //pętla bezpieczeństwa - bez ED @@ -3069,6 +3075,8 @@ bool TDynamicObject::Update(double dt, double dt1) delete[] FzED; delete[] FzEP; delete[] FmaxEP; + + MED_oldFED = FzadED; } Mechanik->UpdateSituation(dt1); // przebłyski świadomości AI diff --git a/DynObj.h b/DynObj.h index 1bbe000a..4b89c201 100644 --- a/DynObj.h +++ b/DynObj.h @@ -658,6 +658,7 @@ private: double MEDLogTime = 0; double MEDLogInactiveTime = 0; int MEDLogCount = 0; + double MED_oldFED = 0; // vehicle shaking calculations // TBD, TODO: make an object out of it diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 15f84897..74783d83 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6068,8 +6068,6 @@ void TMoverParameters::CheckEIMIC(double dt) switch (MainCtrlPos) { case 0: - eimic = -1.0; - break; case 1: eimic -= clamp(1.0 + eimic, 0.0, dt*0.15); //odejmuj do -1 if (eimic > 0) eimic = 0; From 57f7ac27da4cb9c80c3d6dda00f4b487d9b0ad4b Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Wed, 1 May 2019 03:44:53 +0200 Subject: [PATCH 3/3] build 190430. ai braking logic tweaks --- Driver.cpp | 87 +++++++++++++++++++++++++++----------------- Driver.h | 2 +- McZapkie/hamulce.cpp | 5 +++ McZapkie/hamulce.h | 1 + version.h | 2 +- 5 files changed, 62 insertions(+), 35 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index 2f81de54..04198d18 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -1476,7 +1476,8 @@ TController::braking_distance_multiplier( float const Targetvelocity ) const { if( ( mvOccupied->TrainType == dt_DMU ) && ( mvOccupied->Vel < 40.0 ) && ( Targetvelocity == 0.f ) ) { - return interpolate( 2.f, 1.f, static_cast( mvOccupied->Vel / 40.0 ) ); + auto const multiplier { clamp( 1.f + iVehicles * 0.5f, 2.f, 4.f ) }; + return interpolate( multiplier, 1.f, static_cast( mvOccupied->Vel / 40.0 ) ); } // HACK: cargo trains or trains going downhill with high braking threshold need more distance to come to a full stop if( ( fBrake_a0[ 1 ] > 0.2 ) @@ -2014,7 +2015,7 @@ void TController::AutoRewident() fBrakeReaction = 0.25; } else if( mvOccupied->TrainType == dt_DMU ) { - fNominalAccThreshold = std::max( -0.45, -fBrake_a0[ BrakeAccTableSize ] - 8 * fBrake_a1[ BrakeAccTableSize ] ); + fNominalAccThreshold = std::max( -0.75, -fBrake_a0[ BrakeAccTableSize ] - 8 * fBrake_a1[ BrakeAccTableSize ] ); fBrakeReaction = 0.25; } else if (ustaw > 16) { @@ -2374,7 +2375,7 @@ double TController::BrakeAccFactor() const } /* if (mvOccupied->TrainType == dt_DMU && mvOccupied->Vel > 40 && VelNext<40) - Factor *= 1 + ( (1600 - VelNext * VelNext) / (mvOccupied->Vel * mvOccupied->Vel) ); + Factor *= 1 + 0.25 * ( (1600 - VelNext * VelNext) / (mvOccupied->Vel * mvOccupied->Vel) ); */ return Factor; } @@ -2780,17 +2781,15 @@ bool TController::IncBrake() { if( /*GBH mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.1 ) { OK = /*mvOccupied->*/BrakeLevelAdd( BrakingInitialLevel ); //GBH -/* // HACK: stronger braking to overcome SA134 engine behaviour if( ( mvOccupied->TrainType == dt_DMU ) && ( VelNext == 0.0 ) && ( fBrakeDist < 200.0 ) ) { - mvOccupied->BrakeLevelAdd( + BrakeLevelAdd( fBrakeDist / ActualProximityDist < 0.8 ? - 1.0 : - 3.0 ); + 0.5 : + 1.0 ); } -*/ } else { @@ -2811,7 +2810,9 @@ bool TController::IncBrake() } } if( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition > 0 ) { - mvOccupied->BrakeReleaser( 0 ); + if( mvOccupied->Hamulec->Releaser() ) { + mvOccupied->BrakeReleaser( 0 ); + } } break; } @@ -2865,7 +2866,8 @@ bool TController::IncBrakeEIM() bool TController::DecBrake() { // zmniejszenie siły hamowania bool OK = false; - double deltaAcc = 0; + double deltaAcc = -1.0; + double pos_diff = 1.0; switch (mvOccupied->BrakeSystem) { case TBrakeSystem::Individual: @@ -2875,7 +2877,12 @@ bool TController::DecBrake() OK = mvOccupied->DecLocalBrakeLevel(1 + floor(0.5 + fabs(AccDesired))); break; case TBrakeSystem::Pneumatic: - deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (/*GBH mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition -1.0)*fBrake_a1[0]); + if( ( fBrake_a0[ 0 ] != 0.0 ) + || ( fBrake_a1[ 0 ] != 0.0 ) ) { + if( mvOccupied->TrainType == dt_DMU ) + pos_diff = 0.25; + deltaAcc = -AccDesired*BrakeAccFactor() - (fBrake_a0[0] + 4 * (/*GBH mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition - pos_diff)*fBrake_a1[0]); + } if (deltaAcc < 0) { if (/*GBH mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition > 0) @@ -2894,8 +2901,11 @@ bool TController::DecBrake() if (!OK) { OK = DecBrakeEIM(); } +/* +// NOTE: disabled, duplicate of AI's behaviour in UpdateSituation() if (mvOccupied->PipePress < 3.0) Need_BrakeRelease = true; +*/ break; case TBrakeSystem::ElectroPneumatic: if (mvOccupied->EngineType == TEngineType::ElectricInductionMotor) { @@ -5712,16 +5722,32 @@ TController::UpdateSituation(double dt) { ReactionTime = 0.25; } } - if (mvOccupied->BrakeSystem == TBrakeSystem::Pneumatic) // napełnianie uderzeniowe - if (mvOccupied->BrakeHandle == TBrakeHandle::FV4a || mvOccupied->BrakeHandle == TBrakeHandle::MHZ_6P - || mvOccupied->BrakeHandle == TBrakeHandle::M394) - { + if (mvOccupied->BrakeSystem == TBrakeSystem::Pneumatic) { + // napełnianie uderzeniowe + if( ( mvOccupied->BrakeHandle == TBrakeHandle::FV4a ) + || ( mvOccupied->BrakeHandle == TBrakeHandle::MHZ_6P ) + || ( mvOccupied->BrakeHandle == TBrakeHandle::M394 ) ) { + if( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition == -2 ) { /*mvOccupied->*/BrakeLevelSet( gbh_RP ); } - if( ( mvOccupied->PipePress < 3.0 ) - && ( AccDesired > -0.03 ) ) { - mvOccupied->BrakeReleaser( 1 ); + + // TODO: combine all releaser handling in single decision tree instead of having bits all over the place + if( ( AccDesired > -0.03 ) + && ( false == mvOccupied->Hamulec->Releaser() ) ) { + if( mvOccupied->PipePress < 3.0 ) { + mvOccupied->BrakeReleaser( 1 ); + } + if( ( mvOccupied->BrakePress > 0.4 ) + && ( mvOccupied->Hamulec->GetCRP() > 4.9 ) ) { + // wyluzuj lokomotywę, to szybciej ruszymy + mvOccupied->BrakeReleaser( 1 ); + } + } + if( ( mvOccupied->PipePress > 3.0 ) + && ( mvOccupied->Hamulec->Releaser() ) ) { + // don't overcharge train brake pipe + mvOccupied->BrakeReleaser( 0 ); } if( ( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition == 0 ) @@ -5729,31 +5755,37 @@ TController::UpdateSituation(double dt) { && ( AccDesired > -0.03 ) && ( VelDesired - mvOccupied->Vel > 2.0 ) ) { - if( ( mvOccupied->EqvtPipePress < 4.95 ) + if( ( mvOccupied->EqvtPipePress < 4.5 ) && ( fReady > 0.35 ) - && ( BrakeChargingCooldown >= 0.0 ) ) { + && ( BrakeChargingCooldown >= 0.0 ) + && ( ( ActualProximityDist > 100.0 ) // don't charge if we're about to be braking soon + || ( min_speed( mvOccupied->Vel, VelNext ) == mvOccupied->Vel ) ) ) { if( ( iDrivigFlags & moveOerlikons ) || ( true == IsCargoTrain ) ) { // napełnianie w Oerlikonie /* mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_FS ) ); GBH */ - BrakeLevelSet(gbh_FS); + BrakeLevelSet( gbh_FS ); // don't charge the brakes too often, or we risk overcharging BrakeChargingCooldown = -120.0; } } +/* +// NOTE: disabled, duplicate of release activation in #5732 else if( Need_BrakeRelease ) { Need_BrakeRelease = false; mvOccupied->BrakeReleaser( 1 ); } +*/ } if( ( /*GBH mvOccupied->BrakeCtrlPos*/BrakeCtrlPosition < 0 ) && ( mvOccupied->EqvtPipePress > ( fReady < 0.25 ? 5.1 : 5.2 ) ) ) { /* GBH mvOccupied->BrakeLevelSet( mvOccupied->Handle->GetPos( bh_RP ) ); */ - BrakeLevelSet(gbh_RP); + BrakeLevelSet( gbh_RP ); } } + } #if LOGVELOCITY WriteLog("Dist=" + FloatToStrF(ActualProximityDist, ffFixed, 7, 1) + ", VelDesired=" + FloatToStrF(VelDesired, ffFixed, 7, 1) + @@ -5792,17 +5824,6 @@ TController::UpdateSituation(double dt) { AccDesired > 0.0 ) ) { // on slopes disengage the brakes only if you actually intend to accelerate while( true == DecBrake() ) { ; } // jeśli przyspieszamy, to nie hamujemy - if( ( mvOccupied->BrakePress > 0.4 ) - && ( mvOccupied->Hamulec->GetCRP() > 4.9 ) ) { - // wyluzuj lokomotywę, to szybciej ruszymy - mvOccupied->BrakeReleaser( 1 ); - } - else { - if( mvOccupied->PipePress >= 3.0 ) { - // TODO: combine all releaser handling in single decision tree instead of having bits all over the place - mvOccupied->BrakeReleaser( 0 ); - } - } } } } diff --git a/Driver.h b/Driver.h index 4abade2c..2b0a8053 100644 --- a/Driver.h +++ b/Driver.h @@ -280,7 +280,7 @@ private: int iCoupler = 0; // maska sprzęgu, jaką należy użyć przy łączeniu (po osiągnięciu trybu Connect), 0 gdy jazda bez łączenia int iDriverFailCount = 0; // licznik błędów AI bool Need_TryAgain = false; // true, jeśli druga pozycja w elektryku nie załapała - bool Need_BrakeRelease = true; +// bool Need_BrakeRelease = true; bool IsAtPassengerStop{ false }; // true if the consist is within acceptable range of w4 post double fMinProximityDist = 30.0; // stawanie między 30 a 60 m przed przeszkodą // minimalna oległość do przeszkody, jaką należy zachować double fOverhead1 = 3000.0; // informacja o napięciu w sieci trakcyjnej (0=brak drutu, zatrzymaj!) diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index c6c33e34..59ffb5bb 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -385,6 +385,11 @@ void TBrake::Releaser( int const state ) BrakeStatus = (BrakeStatus & ~b_rls) | ( state * b_rls ); } +bool TBrake::Releaser() const { + + return ( ( BrakeStatus & b_rls ) == b_rls ); +} + void TBrake::SetEPS( double const nEPS ) { } diff --git a/McZapkie/hamulce.h b/McZapkie/hamulce.h index 6ae70eca..814718da 100644 --- a/McZapkie/hamulce.h +++ b/McZapkie/hamulce.h @@ -203,6 +203,7 @@ class TBrake { virtual double GetCRP(); //cisnienie zbiornika sterujacego bool SetBDF( int const nBDF ); //nastawiacz GPRM void Releaser( int const state ); //odluzniacz + bool Releaser() const; virtual void SetEPS( double const nEPS ); //hamulec EP virtual void SetRM( double const RMR ) {}; //ustalenie przelozenia rapida virtual void SetRV( double const RVR) {}; //ustalenie przelozenia rapida diff --git a/version.h b/version.h index 62cba964..7bcb12d5 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 19 -#define VERSION_MINOR 419 +#define VERSION_MINOR 430 #define VERSION_REVISION 0