diff --git a/src/actor.rs b/src/actor.rs index 16d312a..fc71686 100644 --- a/src/actor.rs +++ b/src/actor.rs @@ -152,7 +152,7 @@ pub struct Engine { pub reaction_wheels: f32, pub engine_type: EngineType, pub warmup_seconds: f32, - pub current_warmup: f32, + pub current_warmup: f32, // between 0.0 and 1.0 } impl Default for Engine { fn default() -> Self { diff --git a/src/audio.rs b/src/audio.rs index 3555e4f..54136a9 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -79,6 +79,7 @@ pub fn setup( source: asset_server.load(ASSET_THRUSTER), settings: PlaybackSettings { mode: PlaybackMode::Loop, + volume: Volume::new(0.0), paused: true, ..default() }, @@ -90,6 +91,7 @@ pub fn setup( source: asset_server.load(ASSET_ROCKET), settings: PlaybackSettings { mode: PlaybackMode::Loop, + volume: Volume::new(0.0), paused: true, ..default() }, @@ -101,6 +103,7 @@ pub fn setup( source: asset_server.load(ASSET_ION), settings: PlaybackSettings { mode: PlaybackMode::Loop, + volume: Volume::new(0.0), paused: true, ..default() }, diff --git a/src/camera.rs b/src/camera.rs index 51565ca..2582901 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -350,25 +350,39 @@ pub fn apply_input_to_player( } } } - if let Ok(sink) = thruster_sound_controller.get_single() { - if play_thruster_sound && !settings.mute_sfx && engine.engine_type == actor::EngineType::Monopropellant { - sink.play() - } else { - sink.pause() - } - } - if let Ok(sink) = rocket_sound_controller.get_single() { - if play_thruster_sound && !settings.mute_sfx && engine.engine_type == actor::EngineType::Rocket { - sink.play() - } else { - sink.pause() - } - } - if let Ok(sink) = ion_sound_controller.get_single() { - if play_thruster_sound && !settings.mute_sfx && engine.engine_type == actor::EngineType::Ion { - sink.play() - } else { - sink.pause() + let sinks = vec![ + (1.2, actor::EngineType::Monopropellant, thruster_sound_controller.get_single()), + (1.0, actor::EngineType::Rocket, rocket_sound_controller.get_single()), + (1.4, actor::EngineType::Ion, ion_sound_controller.get_single()), + ]; + let seconds_to_max_vol = 0.05; + let seconds_to_min_vol = 0.05; + for sink_data in sinks { + if let (vol_boost, engine_type, Ok(sink)) = sink_data { + if settings.mute_sfx { + sink.pause(); + } + else { + let volume = sink.volume(); + if engine.engine_type == engine_type { + if play_thruster_sound { + sink.play(); + if volume < 1.0 { + let maxvol = vol_boost; + //let maxvol = engine.current_warmup * vol_boost; + sink.set_volume((volume + dt / seconds_to_max_vol).clamp(0.0, maxvol)); + } + } else { + sink.set_volume((volume - dt / seconds_to_min_vol).clamp(0.0, 1.0)); + } + } + else if volume > 0.0 { + sink.set_volume((volume - dt / seconds_to_min_vol).clamp(0.0, 1.0)); + } + if volume < 0.0001 { + sink.pause(); + } + } } } }