From 6e2d96a17b3d6773419885525cb5f9b58cdd4fed Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Fri, 19 Apr 2024 21:52:12 -0700 Subject: [PATCH] audio intensity --- assets/martian.tweak.toml | 2 ++ src/audio.rs | 33 +++++++++++++++++++++++++++++++++ src/game.rs | 1 - 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/assets/martian.tweak.toml b/assets/martian.tweak.toml index e5792d5..608fc81 100644 --- a/assets/martian.tweak.toml +++ b/assets/martian.tweak.toml @@ -130,6 +130,8 @@ font = "fonts/Neothic/Neothic.ttf" ### [audio.music] main = "/Music/Main Track2" +intensity_min = 0.0 +intensity_max = 400.0 ### # Menu SFX diff --git a/src/audio.rs b/src/audio.rs index 5088256..9349853 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -27,6 +27,7 @@ impl Plugin for AudioPlugin { audio_trigger.run_if(on_event::()), control_volume.run_if(resource_changed::), toggle_volume.run_if(just_pressed(KeyCode::KeyM)), + set_intensity.run_if(in_state(GameState::Play).and_then(resource_exists::.and_then(resource_changed::))), ), ); } @@ -145,3 +146,35 @@ fn toggle_volume(mut vol: ResMut) { fn control_volume(vol: Res, query: Query<&AudioSource>) { query.iter().for_each(|aud_src| aud_src.set_volume(vol.0)); } + +fn set_intensity( + mut query: Query<(&mut AudioSource, &AudioEvent)>, + board: Res, + tweaks_file: Res, + tweaks: Res>, +) { + let tweak = tweaks + .get(tweaks_file.handle.clone()) + .expect("Load tweakfile"); + let value = { + let intensity_min = tweak.get::("audio_music_intensity_min").unwrap(); + let intensity_max = tweak.get::("audio_music_intensity_max").unwrap(); + let intensity_range = intensity_max - intensity_min; + + let count_side_a = board.on(Side::A).len(); + let count_side_b = board.on(Side::B).len(); + let min_side = count_side_a.min(count_side_b); + let max_side_size = 16; + + let intensity_ratio = ((max_side_size as f32) - (min_side as f32)) / (max_side_size as f32); + + (intensity_ratio * intensity_range) + intensity_min + }; + + query.iter_mut() + .filter(|(_, event)| **event == AudioEvent::MainMusic) + .for_each(|(mut source, _)| { + info!("Setting music intensity to {:?}", value); + source.event_instance.set_parameter_by_name("Intensity", value, true).expect("Set intensity parameter"); + }); +} \ No newline at end of file diff --git a/src/game.rs b/src/game.rs index ea587f2..01d69f7 100644 --- a/src/game.rs +++ b/src/game.rs @@ -377,7 +377,6 @@ impl Board { } /// Show all pieces on one side of the board - /// OPTIMIZE: This is only used to tell if a side is empty, so it is more work than we need to do. pub(crate) fn on(&self, side: Side) -> Vec<(&Piece, BoardIndex)> { match side { Side::A => {