audio intensity

main
Elijah C. Voigt 2 years ago
parent 1a056277c9
commit 6e2d96a17b

@ -130,6 +130,8 @@ font = "fonts/Neothic/Neothic.ttf"
### ###
[audio.music] [audio.music]
main = "/Music/Main Track2" main = "/Music/Main Track2"
intensity_min = 0.0
intensity_max = 400.0
### ###
# Menu SFX # Menu SFX

@ -27,6 +27,7 @@ impl Plugin for AudioPlugin {
audio_trigger.run_if(on_event::<AudioEvent>()), audio_trigger.run_if(on_event::<AudioEvent>()),
control_volume.run_if(resource_changed::<AudioVolume>), control_volume.run_if(resource_changed::<AudioVolume>),
toggle_volume.run_if(just_pressed(KeyCode::KeyM)), toggle_volume.run_if(just_pressed(KeyCode::KeyM)),
set_intensity.run_if(in_state(GameState::Play).and_then(resource_exists::<tweak::GameTweaks>.and_then(resource_changed::<game::Board>))),
), ),
); );
} }
@ -145,3 +146,35 @@ fn toggle_volume(mut vol: ResMut<AudioVolume>) {
fn control_volume(vol: Res<AudioVolume>, query: Query<&AudioSource>) { fn control_volume(vol: Res<AudioVolume>, query: Query<&AudioSource>) {
query.iter().for_each(|aud_src| aud_src.set_volume(vol.0)); query.iter().for_each(|aud_src| aud_src.set_volume(vol.0));
} }
fn set_intensity(
mut query: Query<(&mut AudioSource, &AudioEvent)>,
board: Res<game::Board>,
tweaks_file: Res<tweak::GameTweaks>,
tweaks: Res<Assets<Tweaks>>,
) {
let tweak = tweaks
.get(tweaks_file.handle.clone())
.expect("Load tweakfile");
let value = {
let intensity_min = tweak.get::<f32>("audio_music_intensity_min").unwrap();
let intensity_max = tweak.get::<f32>("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");
});
}

@ -377,7 +377,6 @@ impl Board {
} }
/// Show all pieces on one side of the 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)> { pub(crate) fn on(&self, side: Side) -> Vec<(&Piece, BoardIndex)> {
match side { match side {
Side::A => { Side::A => {

Loading…
Cancel
Save