mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-10-29 23:17:30 +01:00
fix: automatic coupler crashes, horns, compressor start delay, radio and cab lever sounds
- automatic couplers don't catch above the safe collision speed (#86): with crash damage on they couple at a closing speed of 15 km/h at most, a faster hit locks the coupling until the vehicles part and the collision runs its course. On the way: CollisionVelocity() read a head-on 10 + 10 km/h as 14.1 km/h (quaternions turn by half the angle), it's now taken from the touching ends; CollisionDetect() took the other vehicle's speed the wrong way round for vehicles facing each other. Head-on hits now derail sooner, at the intended limit, - a single horn lever can't sound both tones at once (eu07/maszyna#392), - a skid ends once the vehicle stops on locked wheels (eu07/maszyna#479), - electronic destination signs are blanked at the end of the timetable (eu07/maszyna#446), - horns need the air or the voltage to sound (eu07/maszyna#290, #76): HornType=[Pneumatic]|Electric and Horn3Type in Cntrl.; a pneumatic horn needs 0.2 MPa in the main reservoir (or the main pipe without one), an electric one the low voltage; the lever stays where it was put, - compressor start delay (#67): CompressorStartDelay [s] in Brake., counted from the compressor getting its power, after the engine starts say; none by default, - the channel and volume buttons of a radio without power do nothing (eu07/maszyna#429); the power check of the radio is TMoverParameters::RadioPowered(), - a lever moved smoothly sounds the positions it passes (#83). Sonar findings in the functions changed: nesting, nested conditionals, commented-out code, std::format, references to const. Unit tests: test::pair for two vehicles running into each other, test_couplers, test_horn, test_wheelslip, test_compressor, test_radio, test_gauge_positions.
This commit is contained in:
@@ -15,6 +15,7 @@ http://mozilla.org/MPL/2.0/.
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "vehicle/Gauge.h"
|
||||
#include "vehicle/gaugepositions.h"
|
||||
#include "utilities/parser.h"
|
||||
#include "model/Model3d.h"
|
||||
#include "vehicle/DynObj.h"
|
||||
@@ -302,42 +303,37 @@ bool
|
||||
TGauge::UpdateValue( float fNewDesired ) {
|
||||
|
||||
auto const desiredtimes100 = static_cast<int>( std::round( 100.0 * fNewDesired ) );
|
||||
if( desiredtimes100 == static_cast<int>( std::round( 100.0 * m_targetvalue ) ) ) {
|
||||
auto const previoustimes100 = static_cast<int>( std::round( 100.0 * m_targetvalue ) );
|
||||
if( desiredtimes100 == previoustimes100 ) {
|
||||
return true;
|
||||
}
|
||||
m_targetvalue = fNewDesired;
|
||||
// if there's any sound associated with new requested value, play it
|
||||
// check value-specific table first...
|
||||
if( auto const fullinteger { desiredtimes100 % 100 == 0 }; fullinteger ) {
|
||||
// filter out values other than full integers
|
||||
auto const lookup = m_soundfxvalues.find( desiredtimes100 / 100 );
|
||||
if( lookup != m_soundfxvalues.end() ) {
|
||||
lookup->second.play();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if( desiredtimes100 % 100 != 0 ) {
|
||||
// toggle the control to continous range/exclusive sound mode from now on
|
||||
m_soundtype = sound_flags::exclusive;
|
||||
}
|
||||
// if there's any sound associated with a position reached on the way to the new requested value, play it
|
||||
// check value-specific table first...
|
||||
if( auto const reached = gauge_positions::last_reached( m_soundfxvalues, previoustimes100, desiredtimes100 );
|
||||
reached != m_soundfxvalues.end() ) {
|
||||
reached->second.play();
|
||||
return true;
|
||||
}
|
||||
// ...and if there isn't any, fall back on the basic set...
|
||||
// HACK: crude way to discern controls with continuous and quantized value range
|
||||
if( auto const currentvalue = GetValue(); currentvalue < fNewDesired ) {
|
||||
auto const currentvalue = GetValue();
|
||||
if( currentvalue < fNewDesired && false == m_soundfxincrease.empty() ) {
|
||||
// shift up
|
||||
if( false == m_soundfxincrease.empty() ) {
|
||||
m_soundfxincrease.play( m_soundtype );
|
||||
return true;
|
||||
}
|
||||
m_soundfxincrease.play( m_soundtype );
|
||||
return true;
|
||||
}
|
||||
else if( currentvalue > fNewDesired ) {
|
||||
if( currentvalue > fNewDesired && false == m_soundfxdecrease.empty() ) {
|
||||
// shift down
|
||||
if( false == m_soundfxdecrease.empty() ) {
|
||||
m_soundfxdecrease.play( m_soundtype );
|
||||
return true;
|
||||
}
|
||||
m_soundfxdecrease.play( m_soundtype );
|
||||
return true;
|
||||
}
|
||||
return false; // no suitable sound was found
|
||||
};
|
||||
}
|
||||
|
||||
void TGauge::PutValue(float fNewDesired)
|
||||
{ // McZapkie-281102: natychmiastowe wpisanie wartosci
|
||||
|
||||
Reference in New Issue
Block a user