outfly/src/audio.rs

161 lines
5.3 KiB
Rust
Raw Normal View History

2024-03-16 19:53:57 +00:00
use bevy::prelude::*;
2024-03-16 23:41:06 +00:00
use bevy::audio::PlaybackMode;
use crate::settings;
2024-03-16 19:53:57 +00:00
2024-03-18 01:24:52 +00:00
const ASSET_CLICK: &str = "sounds/click-button-140881-crop.ogg";
const ASSET_SWITCH: &str = "sounds/typosonic-typing-192811-crop.ogg";
const ASSET_INCOMING_MESSAGE: &str = "tmp/multi-pop-2-188167.mp3.ogg";
const ASSET_RADIO: &str = "tmp/LP - Girls Go Wild (Official Music Video)-M7XRN0oHGIM.ogg";
const ASSET_BGM: &str = "tmp/FTL - Faster Than Light (2012) OST - 12 - Void (Explore)-edQw2yYXQJM.ogg";
2024-03-18 01:15:44 +00:00
2024-03-17 23:04:23 +00:00
pub struct AudioPlugin;
impl Plugin for AudioPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, setup);
app.add_systems(Update, toggle_bgm);
2024-03-18 01:15:44 +00:00
app.add_systems(PostUpdate, play_sfx);
app.add_systems(PostUpdate, update_music);
app.add_event::<PlaySfxEvent>();
app.add_event::<ToggleMusicEvent>();
2024-03-17 23:04:23 +00:00
}
}
pub enum Sfx {
IncomingChatMessage,
Click,
Switch,
}
2024-03-18 00:52:41 +00:00
#[derive(Event)] pub struct PlaySfxEvent(pub Sfx);
#[derive(Event)] pub struct ToggleMusicEvent();
#[derive(Component)] pub struct ComponentBGM;
#[derive(Component)] pub struct ComponentRadio;
#[derive(Component)] pub struct ComponentThrusterSound;
#[derive(Component)] struct SoundBGM(Handle<AudioSource>);
#[derive(Component)] pub struct SoundRadio(Handle<AudioSource>);
#[derive(Resource)] pub struct SoundClick(Handle<AudioSource>);
#[derive(Resource)] pub struct SoundSwitch(Handle<AudioSource>);
#[derive(Resource)] pub struct SoundIncomingMessage(Handle<AudioSource>);
2024-03-18 01:15:44 +00:00
2024-03-16 19:53:57 +00:00
pub fn setup(
mut commands: Commands,
settings: Res<settings::Settings>,
2024-03-16 19:53:57 +00:00
asset_server: Res<AssetServer>,
) {
commands.spawn((
ComponentBGM,
2024-03-16 19:53:57 +00:00
AudioBundle {
source: SoundBGM(asset_server.load(ASSET_BGM)).0.clone(),
settings: PlaybackSettings {
mode: PlaybackMode::Loop,
2024-03-18 03:10:08 +00:00
paused: settings.hud_active || settings.mute_music,
..default()
},
},
));
commands.spawn((
ComponentRadio,
AudioBundle {
source: SoundBGM(asset_server.load(ASSET_RADIO)).0.clone(),
settings: PlaybackSettings {
mode: PlaybackMode::Loop,
2024-03-18 03:10:08 +00:00
paused: !settings.hud_active || settings.mute_music,
..default()
},
2024-03-16 19:53:57 +00:00
},
));
2024-03-18 02:45:46 +00:00
if !settings.mute_sfx {
commands.spawn((
AudioBundle {
source: asset_server.load("sounds/wakeup.ogg"),
settings: PlaybackSettings::DESPAWN,
},
));
}
2024-03-16 23:41:06 +00:00
commands.spawn((
ComponentThrusterSound,
AudioBundle {
source: asset_server.load("tmp/loopingthrust-95548.ogg"),
2024-03-16 23:41:06 +00:00
settings: PlaybackSettings {
mode: PlaybackMode::Loop,
paused: true,
..default()
},
},
));
2024-03-18 01:15:44 +00:00
commands.insert_resource(SoundClick(asset_server.load(ASSET_CLICK)));
commands.insert_resource(SoundSwitch(asset_server.load(ASSET_SWITCH)));
commands.insert_resource(SoundIncomingMessage(asset_server.load(ASSET_INCOMING_MESSAGE)));
2024-03-16 19:53:57 +00:00
}
pub fn toggle_bgm(
keyboard_input: Res<ButtonInput<KeyCode>>,
mut evwriter_toggle: EventWriter<ToggleMusicEvent>,
mut evwriter_sfx: EventWriter<PlaySfxEvent>,
mut settings: ResMut<settings::Settings>,
2024-03-16 19:53:57 +00:00
) {
if keyboard_input.just_pressed(KeyCode::KeyT) {
settings.mute_music ^= true;
evwriter_sfx.send(PlaySfxEvent(Sfx::Click));
evwriter_toggle.send(ToggleMusicEvent());
2024-03-16 19:53:57 +00:00
}
2024-03-18 03:10:08 +00:00
if keyboard_input.just_pressed(KeyCode::KeyM) {
settings.mute_sfx ^= true;
evwriter_sfx.send(PlaySfxEvent(Sfx::Click));
2024-03-18 03:10:08 +00:00
evwriter_toggle.send(ToggleMusicEvent());
}
2024-03-16 19:53:57 +00:00
}
2024-03-18 00:52:41 +00:00
2024-03-18 01:15:44 +00:00
pub fn play_sfx(
2024-03-18 00:52:41 +00:00
mut commands: Commands,
2024-03-18 02:45:46 +00:00
settings: Res<settings::Settings>,
mut events_sfx: EventReader<PlaySfxEvent>,
2024-03-18 01:15:44 +00:00
sound_click: Res<SoundClick>,
sound_switch: Res<SoundSwitch>,
sound_incoming_message: Res<SoundIncomingMessage>,
2024-03-18 00:52:41 +00:00
) {
if settings.mute_sfx && !events_sfx.is_empty() {
events_sfx.clear();
2024-03-18 01:15:44 +00:00
}
for sfx in events_sfx.read() {
commands.spawn(AudioBundle {
source: match sfx.0 {
Sfx::Switch => sound_switch.0.clone(),
Sfx::Click => sound_click.0.clone(),
Sfx::IncomingChatMessage => sound_incoming_message.0.clone(),
},
settings: PlaybackSettings::DESPAWN,
});
2024-03-18 00:52:41 +00:00
}
}
pub fn update_music(
mut events: EventReader<ToggleMusicEvent>,
bgm_controller: Query<&AudioSink, With<ComponentBGM>>,
radio_controller: Query<&AudioSink, With<ComponentRadio>>,
settings: Res<settings::Settings>,
) {
if !events.is_empty() {
events.clear();
if let Ok(bgm_sink) = bgm_controller.get_single() {
if let Ok(radio_sink) = radio_controller.get_single() {
if settings.mute_music {
radio_sink.pause();
bgm_sink.pause();
}
else {
if settings.hud_active {
radio_sink.play();
bgm_sink.pause();
println!("pausing");
} else {
radio_sink.pause();
bgm_sink.play();
println!("playing");
}
}
}
}
}
}