mod music;
mod sfx;
pub use music::{FadingOut, Music, drive_music, fade_music, rotate_music, toggle_mute};
pub use sfx::{
Sounds, play_chime, play_count, play_denied, play_events, play_final_seconds, play_lose,
play_win,
};
use bevy::audio::SpatialListener;
use bevy::prelude::*;
use music::MusicPlaylist;
#[derive(Resource, Default)]
pub struct Muted(pub bool);
pub(crate) fn sfx_gain(settings: &crate::app::settings::GameSettings, muted: &Muted) -> f32 {
if muted.0 { 0.0 } else { settings.sfx_gain() }
}
pub fn load_sounds(mut commands: Commands, assets: Res<AssetServer>) {
commands.spawn(SpatialListener::new(sfx::EAR_GAP));
commands.insert_resource(MusicPlaylist::new(
vec![
assets.load("sounds/theme.wav"),
assets.load("sounds/theme_b.ogg"),
assets.load("sounds/theme_c.ogg"),
assets.load("sounds/theme_d.ogg"),
assets.load("sounds/theme_e.ogg"),
assets.load("sounds/theme_f.ogg"),
assets.load("sounds/theme_g.ogg"),
assets.load("sounds/theme_h.ogg"),
assets.load("sounds/theme_i.ogg"),
assets.load("sounds/theme_j.ogg"),
],
vec![
assets.load("sounds/theme_k.ogg"),
assets.load("sounds/theme_l.ogg"),
assets.load("sounds/theme_m.ogg"),
assets.load("sounds/theme_n.ogg"),
assets.load("sounds/theme_o.ogg"),
assets.load("sounds/theme_p.ogg"),
],
crate::app::effects::VisualRng::from_clock(),
));
commands.insert_resource(Sounds {
place: assets.load("sounds/place.wav"),
remove: assets.load("sounds/remove.wav"),
bank: assets.load("sounds/bank.wav"),
eat: assets.load("sounds/eat.wav"),
raid: assets.load("sounds/raid.wav"),
win: assets.load("sounds/win.wav"),
lose: assets.load("sounds/lose.wav"),
takeoff: assets.load("sounds/takeoff.wav"),
screech: assets.load("sounds/screech.wav"),
event: assets.load("sounds/event.wav"),
golden: assets.load("sounds/golden.wav"),
tier: assets.load("sounds/tier.wav"),
surge: assets.load("sounds/surge.wav"),
horn: assets.load("sounds/horn.wav"),
denied: assets.load("sounds/denied.wav"),
evict: assets.load("sounds/evict.wav"),
lure: assets.load("sounds/lure.wav"),
count: assets.load("sounds/count.wav"),
go: assets.load("sounds/go.wav"),
tick: assets.load("sounds/tick.wav"),
});
}
#[cfg(test)]
mod tests {
use super::*;
use crate::app::settings::GameSettings;
#[test]
fn the_master_mute_silences_the_effects_too() {
let settings = GameSettings {
sfx_on: true,
sfx_volume: 80,
..GameSettings::default()
};
assert!(sfx_gain(&settings, &Muted(false)) > 0.0, "heard by default");
assert_eq!(sfx_gain(&settings, &Muted(true)), 0.0, "M silences them");
let off = GameSettings {
sfx_on: false,
..settings.clone()
};
assert_eq!(sfx_gain(&off, &Muted(false)), 0.0, "switched off");
assert_eq!(off.sfx_volume, 80, "the slider is where it was left");
}
}