|
|
|
@ -21,13 +21,17 @@ impl Plugin for AudioPlugin {
|
|
|
|
],
|
|
|
|
],
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.init_resource::<AudioVolume>();
|
|
|
|
app.add_systems(OnEnter(GameState::Menu), play_background);
|
|
|
|
app.add_systems(OnEnter(GameState::Menu), play_background);
|
|
|
|
app.add_systems(
|
|
|
|
app.add_systems(
|
|
|
|
Update,
|
|
|
|
Update,
|
|
|
|
(
|
|
|
|
(
|
|
|
|
play_audio.run_if(any_component_added::<AudioSource>),
|
|
|
|
play_audio.run_if(any_component_added::<AudioSource>),
|
|
|
|
audio_trigger.run_if(on_event::<AudioEvent>()),
|
|
|
|
audio_trigger.run_if(on_event::<AudioEvent>()),
|
|
|
|
// play_background.run_if(on_event::<AssetEvent<AudioSettings>>()), TODO: Handle music hot-reload
|
|
|
|
control_volume.run_if(resource_changed::<AudioVolume>()),
|
|
|
|
|
|
|
|
toggle_volume.run_if(|keys: Res<Input<KeyCode>>| -> bool {
|
|
|
|
|
|
|
|
keys.just_pressed(KeyCode::M)
|
|
|
|
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -46,6 +50,15 @@ pub enum AudioEvent {
|
|
|
|
Invalid,
|
|
|
|
Invalid,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Resource, Debug)]
|
|
|
|
|
|
|
|
pub struct AudioVolume(f32);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
impl Default for AudioVolume {
|
|
|
|
|
|
|
|
fn default() -> Self {
|
|
|
|
|
|
|
|
AudioVolume(1.0)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
fn play_background(mut events: EventWriter<AudioEvent>) {
|
|
|
|
fn play_background(mut events: EventWriter<AudioEvent>) {
|
|
|
|
events.send(AudioEvent::MainMusic);
|
|
|
|
events.send(AudioEvent::MainMusic);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -62,6 +75,7 @@ fn audio_trigger(
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
tweaks: Res<Assets<tweak::Tweaks>>,
|
|
|
|
tweaks: Res<Assets<tweak::Tweaks>>,
|
|
|
|
display_state: Res<State<DisplayState>>,
|
|
|
|
display_state: Res<State<DisplayState>>,
|
|
|
|
|
|
|
|
vol: Res<AudioVolume>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
let tweak = tweaks
|
|
|
|
let tweak = tweaks
|
|
|
|
.get(&server.load("martian.tweak.toml"))
|
|
|
|
.get(&server.load("martian.tweak.toml"))
|
|
|
|
@ -85,7 +99,6 @@ fn audio_trigger(
|
|
|
|
if !aud.is_empty() {
|
|
|
|
if !aud.is_empty() {
|
|
|
|
let event_str = format!("event:{}", aud);
|
|
|
|
let event_str = format!("event:{}", aud);
|
|
|
|
if let Ok(event_description) = studio.0.get_event(event_str.as_str()) {
|
|
|
|
if let Ok(event_description) = studio.0.get_event(event_str.as_str()) {
|
|
|
|
let audio_source = AudioSource::new(event_description);
|
|
|
|
|
|
|
|
// We are stopping a playing event
|
|
|
|
// We are stopping a playing event
|
|
|
|
match event {
|
|
|
|
match event {
|
|
|
|
// Find and stop playing instances of idle audio
|
|
|
|
// Find and stop playing instances of idle audio
|
|
|
|
@ -113,6 +126,8 @@ fn audio_trigger(
|
|
|
|
// we are playing a sound
|
|
|
|
// we are playing a sound
|
|
|
|
_ => {
|
|
|
|
_ => {
|
|
|
|
info!("Playing audio {}", event_str);
|
|
|
|
info!("Playing audio {}", event_str);
|
|
|
|
|
|
|
|
let audio_source = AudioSource::new(event_description);
|
|
|
|
|
|
|
|
audio_source.set_volume(vol.0);
|
|
|
|
// TODO: Can we batch spawn all sounds at startup? Then Start/Stop/Reset at runtime?
|
|
|
|
// TODO: Can we batch spawn all sounds at startup? Then Start/Stop/Reset at runtime?
|
|
|
|
commands.spawn((audio_source, event.clone()));
|
|
|
|
commands.spawn((audio_source, event.clone()));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -123,3 +138,22 @@ fn audio_trigger(
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn toggle_volume(
|
|
|
|
|
|
|
|
mut vol: ResMut<AudioVolume>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
if vol.0 > 0.0 {
|
|
|
|
|
|
|
|
vol.0 = 0.0;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
vol.0 = 1.0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fn control_volume(
|
|
|
|
|
|
|
|
vol: Res<AudioVolume>,
|
|
|
|
|
|
|
|
query: Query<&AudioSource>,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
query.iter().for_each(|aud_src| {
|
|
|
|
|
|
|
|
aud_src.set_volume((*vol).0)
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|