16
0
mirror of https://github.com/MaSzyna-EU07/maszyna.git synced 2026-07-18 20:29:17 +02:00

tmj merge (broken)

This commit is contained in:
milek7
2018-01-24 22:48:41 +01:00
26 changed files with 539 additions and 408 deletions

204
Train.cpp
View File

@@ -322,7 +322,6 @@ TTrain::TTrain() {
pMechOffset = vector3(0, 0, 0);
fBlinkTimer = 0;
fHaslerTimer = 0;
keybrakecount = 0;
DynamicSet(NULL); // ustawia wszystkie mv*
iCabLightFlag = 0;
// hunter-091012
@@ -470,6 +469,7 @@ PyObject *TTrain::GetTrainState() {
PyDict_SetItemString( dict, "shp", PyGetBool( TestFlag( mvOccupied->SecuritySystem.Status, s_active ) ) );
PyDict_SetItemString( dict, "pantpress", PyGetFloat( mvControlled->PantPress ) );
PyDict_SetItemString( dict, "universal3", PyGetBool( InstrumentLightActive ) );
PyDict_SetItemString( dict, "radio_channel", PyGetInt( iRadioChannel ) );
// movement data
PyDict_SetItemString( dict, "velocity", PyGetFloat( mover->Vel ) );
PyDict_SetItemString( dict, "tractionforce", PyGetFloat( mover->Ft ) );
@@ -551,6 +551,24 @@ bool TTrain::is_eztoer() const {
&& ( mvControlled->ActiveDir != 0 ) ); // od yB
}
// moves train brake lever to specified position, potentially emits switch sound if conditions are met
void TTrain::set_train_brake( double const Position ) {
auto const originalbrakeposition { static_cast<int>( 100.0 * mvOccupied->fBrakeCtrlPos ) };
mvOccupied->BrakeLevelSet( Position );
if( static_cast<int>( 100.0 * mvOccupied->fBrakeCtrlPos ) == originalbrakeposition ) { return; }
if( ( true == is_eztoer() )
&& ( false == (
( ( originalbrakeposition / 100 == 0 ) || ( originalbrakeposition / 100 >= 5 ) )
&& ( ( mvOccupied->BrakeCtrlPos == 0 ) || ( mvOccupied->BrakeCtrlPos >= 5 ) ) ) ) ) {
// sound feedback if the lever movement activates one of the switches
dsbPneumaticSwitch.play();
}
}
// locates nearest vehicle belonging to the consist
TDynamicObject *
TTrain::find_nearest_consist_vehicle() const {
@@ -799,14 +817,7 @@ void TTrain::OnCommand_trainbrakeincrease( TTrain *Train, command_data const &Co
Train->mvOccupied->BrakeLevelAdd( Global::fBrakeStep * Command.time_delta );
}
else {
if( Train->mvOccupied->BrakeLevelAdd( Global::fBrakeStep * Command.time_delta ) ) {
// nieodpowiedni warunek; true, jeśli można dalej kręcić
Train->keybrakecount = 0;
if( ( Train->is_eztoer() ) && ( Train->mvOccupied->BrakeCtrlPos < 3 ) ) {
// Ra: uzależnić dźwięk od zmiany stanu EP, nie od klawisza
Train->dsbPneumaticSwitch.play();
}
}
Train->set_train_brake( Train->mvOccupied->fBrakeCtrlPos + Global::fBrakeStep * Command.time_delta );
}
}
}
@@ -819,21 +830,7 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co
Train->mvOccupied->BrakeLevelAdd( -Global::fBrakeStep * Command.time_delta );
}
else {
// nową wersję dostarczył ZiomalCl ("fixed looped sound in ezt when using NUM_9 key")
if( ( Train->mvOccupied->BrakeCtrlPos > -1 )
|| ( Train->keybrakecount > 1 ) ) {
if( ( Train->is_eztoer() )
&& ( Train->mvControlled->Mains )
&& ( Train->mvOccupied->BrakeCtrlPos != -1 ) ) {
// Ra: uzależnić dźwięk od zmiany stanu EP, nie od klawisza
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelAdd( -Global::fBrakeStep * Command.time_delta );
}
else
Train->keybrakecount += 1;
// koniec wersji dostarczonej przez ZiomalCl
Train->set_train_brake( Train->mvOccupied->BrakeCtrlPos - Global::fBrakeStep * Command.time_delta );
}
}
else if (Command.action == GLFW_RELEASE) {
@@ -841,15 +838,9 @@ void TTrain::OnCommand_trainbrakedecrease( TTrain *Train, command_data const &Co
if( ( Train->mvOccupied->BrakeCtrlPos == -1 )
&& ( Train->mvOccupied->BrakeHandle == FVel6 )
&& ( Train->DynamicObject->Controller != AIdriver )
&& ( Global::iFeedbackMode != 4 ) ) {
&& ( Global::iFeedbackMode < 3 ) ) {
// Odskakiwanie hamulce EP
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPos + 1 );
Train->keybrakecount = 0;
if( ( Train->mvOccupied->TrainType == dt_EZT )
&& ( Train->mvControlled->Mains )
&& ( Train->mvControlled->ActiveDir != 0 ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->set_train_brake( 0 );
}
}
}
@@ -858,29 +849,16 @@ void TTrain::OnCommand_trainbrakecharging( TTrain *Train, command_data const &Co
if( Command.action != GLFW_RELEASE ) {
// press or hold
// sound feedback
if( ( Train->is_eztoer() )
&& ( Train->mvControlled->Mains )
&& ( Train->mvOccupied->BrakeCtrlPos != -1 ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelSet( -1 );
Train->set_train_brake( -1 );
}
else {
// release
if( ( Train->mvOccupied->BrakeCtrlPos == -1 )
&& ( Train->mvOccupied->BrakeHandle == FVel6 )
&& ( Train->DynamicObject->Controller != AIdriver )
&& ( Global::iFeedbackMode != 4 ) ) {
&& ( Global::iFeedbackMode < 3 ) ) {
// Odskakiwanie hamulce EP
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPos + 1 );
Train->keybrakecount = 0;
if( ( Train->mvOccupied->TrainType == dt_EZT )
&& ( Train->mvControlled->Mains )
&& ( Train->mvControlled->ActiveDir != 0 ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->set_train_brake( 0 );
}
}
}
@@ -889,14 +867,7 @@ void TTrain::OnCommand_trainbrakerelease( TTrain *Train, command_data const &Com
if( Command.action == GLFW_PRESS ) {
// sound feedback
if( ( Train->is_eztoer() )
&& ( ( Train->mvOccupied->BrakeCtrlPos == 1 )
|| ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelSet( 0 );
Train->set_train_brake( 0 );
}
}
@@ -904,14 +875,7 @@ void TTrain::OnCommand_trainbrakefirstservice( TTrain *Train, command_data const
if( Command.action == GLFW_PRESS ) {
// sound feedback
if( ( Train->is_eztoer() )
&& ( Train->mvControlled->Mains )
&& ( Train->mvOccupied->BrakeCtrlPos != 1 ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelSet( 1 );
Train->set_train_brake( 1 );
}
}
@@ -919,19 +883,11 @@ void TTrain::OnCommand_trainbrakeservice( TTrain *Train, command_data const &Com
if( Command.action == GLFW_PRESS ) {
// sound feedback
if( ( Train->is_eztoer() )
&& ( Train->mvControlled->Mains )
&& ( ( Train->mvOccupied->BrakeCtrlPos == 1 )
|| ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelSet(
Train->set_train_brake( (
Train->mvOccupied->BrakeCtrlPosNo / 2
+ ( Train->mvOccupied->BrakeHandle == FV4a ?
1 :
0 ) );
1 :
0 ) ) );
}
}
@@ -939,14 +895,7 @@ void TTrain::OnCommand_trainbrakefullservice( TTrain *Train, command_data const
if( Command.action == GLFW_PRESS ) {
// sound feedback
if( ( Train->is_eztoer() )
&& ( Train->mvControlled->Mains )
&& ( ( Train->mvOccupied->BrakeCtrlPos == 1 )
|| ( Train->mvOccupied->BrakeCtrlPos == -1 ) ) ) {
Train->dsbPneumaticSwitch.play();
}
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->BrakeCtrlPosNo - 1 );
Train->set_train_brake( Train->mvOccupied->BrakeCtrlPosNo - 1 );
}
}
@@ -954,7 +903,7 @@ void TTrain::OnCommand_trainbrakehandleoff( TTrain *Train, command_data const &C
if( Command.action == GLFW_PRESS ) {
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_NP ) );
Train->set_train_brake( Train->mvOccupied->Handle->GetPos( bh_NP ) );
}
}
@@ -962,7 +911,7 @@ void TTrain::OnCommand_trainbrakeemergency( TTrain *Train, command_data const &C
if( Command.action == GLFW_PRESS ) {
Train->mvOccupied->BrakeLevelSet( Train->mvOccupied->Handle->GetPos( bh_EB ) );
Train->set_train_brake( Train->mvOccupied->Handle->GetPos( bh_EB ) );
/*
if( Train->mvOccupied->BrakeCtrlPosNo <= 0.1 ) {
// hamulec bezpieczeństwa dla wagonów
@@ -3213,6 +3162,13 @@ void TTrain::OnCommand_radiochannelincrease( TTrain *Train, command_data const &
if( Command.action == GLFW_PRESS ) {
Train->iRadioChannel = clamp( Train->iRadioChannel + 1, 1, 10 );
// visual feedback
Train->ggRadioChannelSelector.UpdateValue( Train->iRadioChannel - 1 );
Train->ggRadioChannelNext.UpdateValue( 1.0 );
}
else if( Command.action == GLFW_RELEASE ) {
// visual feedback
Train->ggRadioChannelNext.UpdateValue( 0.0 );
}
}
@@ -3220,6 +3176,13 @@ void TTrain::OnCommand_radiochanneldecrease( TTrain *Train, command_data const &
if( Command.action == GLFW_PRESS ) {
Train->iRadioChannel = clamp( Train->iRadioChannel - 1, 1, 10 );
// visual feedback
Train->ggRadioChannelSelector.UpdateValue( Train->iRadioChannel - 1 );
Train->ggRadioChannelPrevious.UpdateValue( 1.0 );
}
else if( Command.action == GLFW_RELEASE ) {
// visual feedback
Train->ggRadioChannelPrevious.UpdateValue( 0.0 );
}
}
@@ -3417,9 +3380,7 @@ bool TTrain::Update( double const Deltatime )
}
if (DynamicObject->mdKabina)
{ // Ra: TODO: odczyty klawiatury/pulpitu nie
// powinny być uzależnione od istnienia modelu
// kabiny
{ // Ra: TODO: odczyty klawiatury/pulpitu nie powinny być uzależnione od istnienia modelu kabiny
tor = DynamicObject->GetTrack(); // McZapkie-180203
// McZapkie: predkosc wyswietlana na tachometrze brana jest z obrotow kol
float maxtacho = 3;
@@ -3441,9 +3402,10 @@ bool TTrain::Update( double const Deltatime )
if (fTachoCount < maxtacho)
fTachoCount += Deltatime * 3; // szybciej zacznij stukac
}
else if (fTachoCount > 0)
fTachoCount -= Deltatime * 0.66; // schodz powoli - niektore haslery to ze 4
// sekundy potrafia stukac
else if( fTachoCount > 0 ) {
// schodz powoli - niektore haslery to ze 4 sekundy potrafia stukac
fTachoCount -= Deltatime * 0.66;
}
// Ra 2014-09: napięcia i prądy muszą być ustalone najpierw, bo wysyłane są ewentualnie na PoKeys
if ((mvControlled->EngineType != DieselElectric)
@@ -4056,6 +4018,9 @@ bool TTrain::Update( double const Deltatime )
btLampkaForward.Turn(mvControlled->ActiveDir > 0); // jazda do przodu
btLampkaBackward.Turn(mvControlled->ActiveDir < 0); // jazda do tyłu
btLampkaED.Turn(mvControlled->DynamicBrakeFlag); // hamulec ED
btLampkaBrakeProfileG.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_G ) );
btLampkaBrakeProfileP.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_P ) );
btLampkaBrakeProfileR.Turn( TestFlag( mvOccupied->BrakeDelayFlag, bdelay_R ) );
// light indicators
// NOTE: sides are hardcoded to deal with setups where single cab is equipped with all indicators
btLampkaUpperLight.Turn( ( mvOccupied->iLights[ side::front ] & light::headlight_upper ) != 0 );
@@ -4073,6 +4038,9 @@ bool TTrain::Update( double const Deltatime )
{ // gdy bateria wyłączona
btLampkaHamienie.Turn( false );
btLampkaBrakingOff.Turn( false );
btLampkaBrakeProfileG.Turn( false );
btLampkaBrakeProfileP.Turn( false );
btLampkaBrakeProfileR.Turn( false );
btLampkaMaxSila.Turn( false );
btLampkaPrzekrMaxSila.Turn( false );
btLampkaRadio.Turn( false );
@@ -4246,7 +4214,7 @@ bool TTrain::Update( double const Deltatime )
else // wylaczone
{
btLampkaCzuwaka.Turn( false );
btLampkaSHP.Turn( true );
btLampkaSHP.Turn( false );
}
// przelaczniki
// ABu030405 obsluga lampki uniwersalnej:
@@ -4280,6 +4248,9 @@ bool TTrain::Update( double const Deltatime )
ggConverterFuseButton.Update();
ggStLinOffButton.Update();
ggRadioButton.Update();
ggRadioChannelSelector.Update();
ggRadioChannelPrevious.Update();
ggRadioChannelNext.Update();
ggDepartureSignalButton.Update();
ggPantFrontButton.Update();
@@ -4582,12 +4553,27 @@ TTrain::update_sounds( double const Deltatime ) {
&& ( false == Global::CabWindowOpen )
&& ( DynamicObject->GetVelocity() > 0.5 ) ) {
volume = rsRunningNoise.m_amplitudeoffset + rsRunningNoise.m_amplitudefactor * mvOccupied->Vel;
auto frequency { rsRunningNoise.m_frequencyoffset + rsRunningNoise.m_frequencyfactor * mvOccupied->Vel };
// frequency calculation
auto const normalizer { (
true == rsRunningNoise.is_combined() ?
mvOccupied->Vmax * 0.01f :
1.f ) };
auto const frequency {
rsRunningNoise.m_frequencyoffset
+ rsRunningNoise.m_frequencyfactor * mvOccupied->Vel * normalizer };
// volume calculation
volume =
rsRunningNoise.m_amplitudeoffset
+ rsRunningNoise.m_amplitudefactor * mvOccupied->Vel;
if( std::abs( mvOccupied->nrot ) > 0.01 ) {
// hamulce wzmagaja halas
volume *= 1 + 0.25 * ( mvOccupied->UnitBrakeForce / ( 1 + mvOccupied->MaxBrakeForce ) );
auto const brakeforceratio { (
clamp(
mvOccupied->UnitBrakeForce / std::max( 1.0, mvOccupied->BrakeForceR( 1.0, mvOccupied->Vel ) / ( mvOccupied->NAxles * std::max( 1, mvOccupied->NBpA ) ) ),
0.0, 1.0 ) ) };
volume *= 1 + 0.125 * brakeforceratio;
}
// scale volume by track quality
volume *= ( 20.0 + DynamicObject->MyTrack->iDamageFlag ) / 21;
@@ -4599,10 +4585,16 @@ TTrain::update_sounds( double const Deltatime ) {
clamp(
mvOccupied->Vel / 40.0,
0.0, 1.0 ) );
rsRunningNoise
.pitch( frequency )
.gain( volume )
.play( sound_flags::exclusive | sound_flags::looping );
if( volume > 0.05 ) {
rsRunningNoise
.pitch( frequency )
.gain( volume )
.play( sound_flags::exclusive | sound_flags::looping );
}
else {
rsRunningNoise.stop();
}
}
else {
// don't play the optional ending sound if the listener switches views
@@ -5257,6 +5249,10 @@ void TTrain::clear_cab_controls()
ggFuseButton.Clear();
ggConverterFuseButton.Clear();
ggStLinOffButton.Clear();
ggRadioButton.Clear();
ggRadioChannelSelector.Clear();
ggRadioChannelPrevious.Clear();
ggRadioChannelNext.Clear();
ggDoorLeftButton.Clear();
ggDoorRightButton.Clear();
ggDepartureSignalButton.Clear();
@@ -5335,6 +5331,9 @@ void TTrain::clear_cab_controls()
btLampkaRadiotelefon.Clear();
btLampkaHamienie.Clear();
btLampkaBrakingOff.Clear();
btLampkaBrakeProfileG.Clear();
btLampkaBrakeProfileP.Clear();
btLampkaBrakeProfileR.Clear();
btLampkaSprezarka.Clear();
btLampkaSprezarkaB.Clear();
btLampkaSprezarkaOff.Clear();
@@ -5391,6 +5390,7 @@ void TTrain::set_cab_controls() {
if( true == mvOccupied->Radio ) {
ggRadioButton.PutValue( 1.0 );
}
ggRadioChannelSelector.PutValue( iRadioChannel - 1 );
// pantographs
if( mvOccupied->PantSwitchType != "impulse" ) {
ggPantFrontButton.PutValue(
@@ -5612,6 +5612,9 @@ bool TTrain::initialize_button(cParser &Parser, std::string const &Label, int co
{ "i-braking:", btLampkaHamienie },
{ "i-brakingoff:", btLampkaBrakingOff },
{ "i-dynamicbrake:", btLampkaED },
{ "i-brakeprofileg:", btLampkaBrakeProfileG },
{ "i-brakeprofilep:", btLampkaBrakeProfileP },
{ "i-brakeprofiler:", btLampkaBrakeProfileR },
{ "i-braking-ezt:", btLampkaHamowanie1zes },
{ "i-braking-ezt2:", btLampkaHamowanie2zes },
{ "i-compressor:", btLampkaSprezarka },
@@ -5719,6 +5722,9 @@ bool TTrain::initialize_gauge(cParser &Parser, std::string const &Label, int con
{ "converteroff_sw:", ggConverterOffButton },
{ "main_sw:", ggMainButton },
{ "radio_sw:", ggRadioButton },
{ "radiochannel_sw:", ggRadioChannelSelector },
{ "radiochannelprev_sw:", ggRadioChannelPrevious },
{ "radiochannelnext_sw:", ggRadioChannelNext },
{ "pantfront_sw:", ggPantFrontButton },
{ "pantrear_sw:", ggPantRearButton },
{ "pantfrontoff_sw:", ggPantFrontButtonOff },