From 4794ec07ecfa17388a347f343172a3b193794e70 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Sun, 14 Apr 2019 16:33:48 +0200 Subject: [PATCH 1/3] build 190411. configurable diesel-electric engine momentum, minor bug fixes --- Driver.cpp | 6 ++++-- DynObj.cpp | 11 +++++++---- McZapkie/Mover.cpp | 5 +++-- Train.cpp | 2 +- simulationstateserializer.cpp | 2 +- version.h | 2 +- 6 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index a082ac18..e3201111 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -6625,14 +6625,16 @@ void TController::DirectionForward(bool forward) // do przodu w obecnej kabinie while( ( mvOccupied->ActiveDir <= 0 ) && ( mvOccupied->DirectionForward() ) ) { - ; // all work is done in the header + // force scan table update + iTableDirection = 0; } } else { // do tyłu w obecnej kabinie while( ( mvOccupied->ActiveDir >= 0 ) && ( mvOccupied->DirectionBackward() ) ) { - ; // all work is done in the header + // force scan table update + iTableDirection = 0; } } if( mvOccupied->TrainType == dt_SN61 ) { diff --git a/DynObj.cpp b/DynObj.cpp index 6c93fbb6..a759d3ef 100644 --- a/DynObj.cpp +++ b/DynObj.cpp @@ -2319,7 +2319,9 @@ void TDynamicObject::AttachPrev(TDynamicObject *Object, int iType) { // Ra: doczepia Object na końcu składu (nazwa funkcji może być myląca) // Ra: używane tylko przy wczytywaniu scenerii MoverParameters->Attach( iDirection, Object->iDirection ^ 1, Object->MoverParameters, iType, true, false ); + // update neighbour data for both affected vehicles update_neighbours(); + Object->update_neighbours(); } bool TDynamicObject::UpdateForce(double dt) @@ -4343,10 +4345,6 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co m_materialdata.textures_alpha |= 0x08080008; } } - if( false == MoverParameters->LoadAttributes.empty() ) { - // Ra: tu wczytywanie modelu ładunku jest w porządku - mdLoad = LoadMMediaFile_mdload( MoverParameters->LoadType.name ); - } Global.asCurrentTexturePath = szTexturePath; // z powrotem defaultowa sciezka do tekstur do { token = ""; @@ -4927,6 +4925,11 @@ void TDynamicObject::LoadMMediaFile( std::string const &TypeName, std::string co } while( ( token != "" ) && ( token != "endmodels" ) ); + if( false == MoverParameters->LoadAttributes.empty() ) { + // Ra: tu wczytywanie modelu ładunku jest w porządku + mdLoad = LoadMMediaFile_mdload( MoverParameters->LoadType.name ); + } + } // models else if( token == "sounds:" ) { diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 25875f18..8d81b9c3 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -4406,7 +4406,7 @@ double TMoverParameters::TractionForce( double dt ) { if( enrot != tmp ) { enrot = clamp( - enrot + ( dt / 1.25 ) * ( // TODO: equivalent of dizel_aim instead of fixed inertia + enrot + ( dt / dizel_AIM ) * ( enrot < tmp ? 1.0 : -2.0 ), // NOTE: revolutions drop faster than they rise, maybe? TBD: maybe not @@ -6080,7 +6080,7 @@ void TMoverParameters::CheckEIMIC(double dt) eimic += clamp(UniCtrlList[MainCtrlPos].SetCtrlVal - eimic, 0.0, dt * UniCtrlList[MainCtrlPos].SpeedUp); //dodawaj do X eimic = clamp(eimic, UniCtrlList[MainCtrlPos].MinCtrlVal, UniCtrlList[MainCtrlPos].MaxCtrlVal); } - eimic = clamp(eimic, -1.0, Mains ? 1.0 : 0.0); + eimic = clamp(eimic, -1.0, ( ( true == Mains ) || ( Power == 0.0 ) ) ? 1.0 : 0.0); } void TMoverParameters::CheckSpeedCtrl() @@ -8945,6 +8945,7 @@ void TMoverParameters::LoadFIZ_Engine( std::string const &Input ) { ImaxLo = 1; } extract_value( EngineHeatingRPM, "HeatingRPM", Input, "" ); + extract_value( dizel_AIM, "AIM", Input, "1.25" ); break; } case TEngineType::ElectricInductionMotor: { diff --git a/Train.cpp b/Train.cpp index a38c799c..eb0c4d74 100644 --- a/Train.cpp +++ b/Train.cpp @@ -5221,7 +5221,7 @@ bool TTrain::Update( double const Deltatime ) } bool kier = (DynamicObject->DirectionGet() * mvOccupied->ActiveCab > 0); - TDynamicObject *p = DynamicObject->GetFirstDynamic(mvOccupied->ActiveCab < 0 ? 1 : 0, 4); + TDynamicObject *p = DynamicObject->GetFirstDynamic(mvOccupied->ActiveCab < 0 ? end::rear : end::front, 4); int in = 0; fEIMParams[0][6] = 0; iCarNo = 0; diff --git a/simulationstateserializer.cpp b/simulationstateserializer.cpp index dbf53ff1..e28992a0 100644 --- a/simulationstateserializer.cpp +++ b/simulationstateserializer.cpp @@ -178,7 +178,7 @@ state_serializer::deserialize_atmo( cParser &Input, scene::scratch_data &Scratch Global.fFogEnd = clamp( - Random( fograngestart, fograngeend ), + Random( std::min( fograngestart, fograngeend ), std::max( fograngestart, fograngeend ) ), 100.0, 2000.0 ); } diff --git a/version.h b/version.h index 0f25130e..8f8c33cb 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 19 -#define VERSION_MINOR 406 +#define VERSION_MINOR 411 #define VERSION_REVISION 0 From f0e0cbf6f71b67c1bea203ea38aad7ef0a3f5926 Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Thu, 18 Apr 2019 15:54:35 +0200 Subject: [PATCH 2/3] eimic value calculation fix --- McZapkie/Mover.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 8d81b9c3..3aaa4d88 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -6080,7 +6080,11 @@ void TMoverParameters::CheckEIMIC(double dt) eimic += clamp(UniCtrlList[MainCtrlPos].SetCtrlVal - eimic, 0.0, dt * UniCtrlList[MainCtrlPos].SpeedUp); //dodawaj do X eimic = clamp(eimic, UniCtrlList[MainCtrlPos].MinCtrlVal, UniCtrlList[MainCtrlPos].MaxCtrlVal); } - eimic = clamp(eimic, -1.0, ( ( true == Mains ) || ( Power == 0.0 ) ) ? 1.0 : 0.0); + auto const eimicpowerenabled { + ( ( true == Mains ) || ( Power == 0.0 ) ) + && ( ( Doors.instances[ side::left ].open_permit == false ) + && ( Doors.instances[ side::right ].open_permit == false ) ) }; + eimic = clamp(eimic, -1.0, eimicpowerenabled ? 1.0 : 0.0); } void TMoverParameters::CheckSpeedCtrl() From 111026f700873e714ddfc5d04db8877111bd7afb Mon Sep 17 00:00:00 2001 From: tmj-fstate Date: Fri, 19 Apr 2019 20:29:00 +0200 Subject: [PATCH 3/3] build 190419. radio message volume, drag calculation enhancement, ai acceleration logic tweak, event duplicate scanning fix --- Driver.cpp | 17 ++++++++++++++--- Driver.h | 2 +- Globals.cpp | 8 +++++++- Globals.h | 3 ++- McZapkie/Mover.cpp | 13 ++++++++++++- McZapkie/hamulce.cpp | 2 ++ Train.cpp | 2 +- version.h | 2 +- 8 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Driver.cpp b/Driver.cpp index e3201111..2f81de54 100644 --- a/Driver.cpp +++ b/Driver.cpp @@ -456,7 +456,7 @@ bool TController::TableAddNew() return true; // false gdy się nałoży }; -bool TController::TableNotFound(basic_event const *Event) const +bool TController::TableNotFound(basic_event const *Event, double const Distance ) const { // sprawdzenie, czy nie został już dodany do tabelki (np. podwójne W4 robi problemy) auto lookup = std::find_if( @@ -471,7 +471,11 @@ bool TController::TableNotFound(basic_event const *Event) const WriteLog( "Speed table for " + OwnerName() + " already contains event " + lookup->evEvent->m_name ); } - return lookup == sSpeedTable.end(); + // ignore duplicates which seem to be reasonably apart from each other, on account of looping tracks + // NOTE: since supplied distance is only rough approximation of distance to the event, we're using large safety margin + return ( + ( lookup == sSpeedTable.end() ) + || ( Distance - lookup->fDist > 100.0 ) ); }; void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) @@ -575,7 +579,7 @@ void TController::TableTraceRoute(double fDistance, TDynamicObject *pVehicle) for( auto *pEvent : events ) { if( pEvent != nullptr ) // jeśli jest semafor na tym torze { // trzeba sprawdzić tabelkę, bo dodawanie drugi raz tego samego przystanku nie jest korzystne - if (TableNotFound(pEvent)) // jeśli nie ma + if (TableNotFound(pEvent, fCurrentDistance)) // jeśli nie ma { TableAddNew(); // zawsze jest true @@ -2368,6 +2372,10 @@ double TController::BrakeAccFactor() const || ( mvOccupied->Vel > VelDesired + fVelPlus ) ) ) { Factor += ( fBrakeReaction * ( /*mvOccupied->BrakeCtrlPosR*/BrakeCtrlPosition < 0.5 ? 1.5 : 1 ) ) * mvOccupied->Vel / ( std::max( 0.0, ActualProximityDist ) + 1 ) * ( ( AccDesired - AbsAccS_pub ) / fAccThreshold ); } +/* + if (mvOccupied->TrainType == dt_DMU && mvOccupied->Vel > 40 && VelNext<40) + Factor *= 1 + ( (1600 - VelNext * VelNext) / (mvOccupied->Vel * mvOccupied->Vel) ); +*/ return Factor; } @@ -2984,6 +2992,7 @@ bool TController::IncSpeed() // if it generates enough traction force // to build up speed to 30/40 km/h for passenger/cargo train (10 km/h less if going uphill) auto const sufficienttractionforce { std::abs( mvControlling->Ft ) > ( IsHeavyCargoTrain ? 125 : 100 ) * 1000.0 }; + auto const sufficientacceleration { AbsAccS_pub >= ( IsHeavyCargoTrain ? 0.02 : 0.04 ) }; auto const seriesmodefieldshunting { ( mvControlling->ScndCtrlPos > 0 ) && ( mvControlling->RList[ mvControlling->MainCtrlPos ].Bn == 1 ) }; auto const parallelmodefieldshunting { ( mvControlling->ScndCtrlPos > 0 ) && ( mvControlling->RList[ mvControlling->MainCtrlPos ].Bn > 1 ) }; auto const useseriesmodevoltage { @@ -2995,6 +3004,7 @@ bool TController::IncSpeed() ( mvControlling->Imax > mvControlling->ImaxLo ) || ( fVoltage < useseriesmodevoltage ) || ( ( true == sufficienttractionforce ) + && ( true == sufficientacceleration ) && ( mvOccupied->Vel <= ( IsCargoTrain ? 35 : 25 ) + ( seriesmodefieldshunting ? 5 : 0 ) - ( ( fAccGravity < -0.025 ) ? 10 : 0 ) ) ) ); // when not in series mode use the first available parallel mode configuration until 50/60 km/h for passenger/cargo train // (if there's only one parallel mode configuration it'll be used regardless of current speed) @@ -3004,6 +3014,7 @@ bool TController::IncSpeed() && ( useseriesmode ? mvControlling->RList[ mvControlling->MainCtrlPos ].Bn == 1 : ( ( true == sufficienttractionforce ) + && ( true == sufficientacceleration ) && ( mvOccupied->Vel <= ( IsCargoTrain ? 55 : 45 ) + ( parallelmodefieldshunting ? 5 : 0 ) ) ? mvControlling->RList[ mvControlling->MainCtrlPos ].Bn > 1 : mvControlling->MainCtrlPos == mvControlling->MainCtrlPosNo ) ) ); diff --git a/Driver.h b/Driver.h index d75de7d1..4abade2c 100644 --- a/Driver.h +++ b/Driver.h @@ -363,7 +363,7 @@ private: // Ra: metody obsługujące skanowanie toru std::vector CheckTrackEvent( TTrack *Track, double const fDirection ) const; bool TableAddNew(); - bool TableNotFound( basic_event const *Event ) const; + bool TableNotFound( basic_event const *Event, double const Distance ) const; void TableTraceRoute( double fDistance, TDynamicObject *pVehicle ); void TableCheck( double fDistance ); TCommandType TableUpdate( double &fVelDes, double &fDist, double &fNext, double &fAcc ); diff --git a/Globals.cpp b/Globals.cpp index 41ebbc35..562b6b2c 100644 --- a/Globals.cpp +++ b/Globals.cpp @@ -127,7 +127,13 @@ global_settings::ConfigParse(cParser &Parser) { // selected device for audio renderer Parser.getTokens(); Parser >> AudioVolume; - AudioVolume = clamp( AudioVolume, 0.0f, 2.f ); + AudioVolume = clamp( AudioVolume, 0.f, 2.f ); + } + else if( token == "sound.volume.radio" ) { + // selected device for audio renderer + Parser.getTokens(); + Parser >> RadioVolume; + RadioVolume = clamp( RadioVolume, 0.f, 1.f ); } // else if (str==AnsiString("renderalpha")) //McZapkie-1312302 - dwuprzebiegowe renderowanie // bRenderAlpha=(GetNextSymbol().LowerCase()==AnsiString("yes")); diff --git a/Globals.h b/Globals.h index 2b1f9dd8..9348b9d1 100644 --- a/Globals.h +++ b/Globals.h @@ -133,7 +133,8 @@ struct global_settings { double fFpsMax{ 65.0 }; // górna granica FPS, przy której promień scenerii będzie zwiększany // audio bool bSoundEnabled{ true }; - float AudioVolume{ 1.25f }; + float AudioVolume{ 1.f }; + float RadioVolume{ 0.75f }; std::string AudioRenderer; // input float fMouseXScale{ 1.5f }; diff --git a/McZapkie/Mover.cpp b/McZapkie/Mover.cpp index 3aaa4d88..15f84897 100644 --- a/McZapkie/Mover.cpp +++ b/McZapkie/Mover.cpp @@ -3891,7 +3891,18 @@ void TMoverParameters::ComputeConstans(void) } Ff = TotalMassxg * (BearingF + RollF * V * V / 10.0) / 1000.0; // dorobic liczenie temperatury lozyska! - FrictConst1 = ((TotalMassxg * RollF) / 10000.0) + (Cx * Dim.W * Dim.H); + FrictConst1 = ( TotalMassxg * RollF ) / 10000.0; + // drag calculation + { + // NOTE: draft effect of previous vehicle is simplified and doesn't have much to do with reality + auto const *previousvehicle { Couplers[ ( V >= 0.0 ? end::front : end::rear ) ].Connected }; + auto dragarea { Dim.W * Dim.H }; + if( previousvehicle ) { + dragarea = std::max( 0.0, dragarea - ( 0.85 * previousvehicle->Dim.W * previousvehicle->Dim.H ) ); + } + FrictConst1 += Cx * dragarea; + } + Curvature = abs(RunningShape.R); // zero oznacza nieskończony promień if (Curvature > 0.0) Curvature = 1.0 / Curvature; diff --git a/McZapkie/hamulce.cpp b/McZapkie/hamulce.cpp index 7efb0994..c6c33e34 100644 --- a/McZapkie/hamulce.cpp +++ b/McZapkie/hamulce.cpp @@ -2773,6 +2773,8 @@ double TMHZ_K5P::GetPF(double i_bcp, double PP, double HP, double dt, double ep) void TMHZ_K5P::Init(double Press) { CP = Press; + Time = true; + TimeEP = true; } void TMHZ_K5P::SetReductor(double nAdj) diff --git a/Train.cpp b/Train.cpp index eb0c4d74..0555adac 100644 --- a/Train.cpp +++ b/Train.cpp @@ -6537,7 +6537,7 @@ void TTrain::update_sounds_radio() { auto const volume { ( true == radioenabled ) && ( message.first == iRadioChannel ) ? - 1.0 : + Global.RadioVolume : 0.0 }; message.second->gain( volume ); } diff --git a/version.h b/version.h index 8f8c33cb..62cba964 100644 --- a/version.h +++ b/version.h @@ -1,5 +1,5 @@ #pragma once #define VERSION_MAJOR 19 -#define VERSION_MINOR 411 +#define VERSION_MINOR 419 #define VERSION_REVISION 0