|
|
|
@ -2,15 +2,15 @@
|
|
|
|
/// TODO: Custom Asset: FmodEventMapper
|
|
|
|
/// TODO: Custom Asset: FmodEventMapper
|
|
|
|
///
|
|
|
|
///
|
|
|
|
use crate::prelude::*;
|
|
|
|
use crate::prelude::*;
|
|
|
|
use bevy_fmod::prelude::AudioSource;
|
|
|
|
|
|
|
|
use bevy_fmod::prelude::*;
|
|
|
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
|
|
|
use bevy::{
|
|
|
|
use bevy::{
|
|
|
|
asset::{AssetLoader, LoadContext, LoadedAsset},
|
|
|
|
asset::{AssetLoader, LoadContext, LoadedAsset},
|
|
|
|
prelude::*,
|
|
|
|
prelude::*,
|
|
|
|
reflect::{TypePath, TypeUuid},
|
|
|
|
reflect::{TypePath, TypeUuid},
|
|
|
|
utils::BoxedFuture,
|
|
|
|
utils::BoxedFuture,
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
use bevy_fmod::prelude::AudioSource;
|
|
|
|
|
|
|
|
use bevy_fmod::prelude::*;
|
|
|
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
|
|
|
|
|
|
|
pub(crate) struct AudioPlugin;
|
|
|
|
pub(crate) struct AudioPlugin;
|
|
|
|
|
|
|
|
|
|
|
|
@ -28,7 +28,8 @@ impl Plugin for AudioPlugin {
|
|
|
|
"./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank",
|
|
|
|
"./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank",
|
|
|
|
],
|
|
|
|
],
|
|
|
|
});
|
|
|
|
});
|
|
|
|
app.add_asset::<AudioSettings>().init_asset_loader::<AudioSettingsLoader>();
|
|
|
|
app.add_asset::<AudioSettings>()
|
|
|
|
|
|
|
|
.init_asset_loader::<AudioSettingsLoader>();
|
|
|
|
|
|
|
|
|
|
|
|
app.add_systems(OnEnter(GameState::Menu), play_background);
|
|
|
|
app.add_systems(OnEnter(GameState::Menu), play_background);
|
|
|
|
app.add_systems(
|
|
|
|
app.add_systems(
|
|
|
|
@ -42,23 +43,22 @@ impl Plugin for AudioPlugin {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Event, Debug)]
|
|
|
|
#[derive(Event, Debug, PartialEq)]
|
|
|
|
pub enum AudioEvent {
|
|
|
|
pub enum AudioEvent {
|
|
|
|
MainMusic,
|
|
|
|
MainMusic,
|
|
|
|
|
|
|
|
StopMainMusic,
|
|
|
|
MenuSelect,
|
|
|
|
MenuSelect,
|
|
|
|
PickUp,
|
|
|
|
PickUp,
|
|
|
|
PutDown,
|
|
|
|
PutDown,
|
|
|
|
Idle,
|
|
|
|
Idle,
|
|
|
|
|
|
|
|
StopIdle,
|
|
|
|
Invalid,
|
|
|
|
Invalid,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[derive(Resource)]
|
|
|
|
#[derive(Resource)]
|
|
|
|
struct AudioTweakfile(Handle<AudioSettings>);
|
|
|
|
struct AudioTweakfile(Handle<AudioSettings>);
|
|
|
|
|
|
|
|
|
|
|
|
fn load_tweakfile(
|
|
|
|
fn load_tweakfile(server: Res<AssetServer>, mut commands: Commands) {
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
|
|
|
|
mut commands: Commands,
|
|
|
|
|
|
|
|
) {
|
|
|
|
|
|
|
|
let handle: Handle<AudioSettings> = server.load("audio/martian.audio.tweak");
|
|
|
|
let handle: Handle<AudioSettings> = server.load("audio/martian.audio.tweak");
|
|
|
|
commands.insert_resource(AudioTweakfile(handle));
|
|
|
|
commands.insert_resource(AudioTweakfile(handle));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -73,18 +73,21 @@ fn play_audio(mut events: Query<&AudioSource, Added<AudioSource>>) {
|
|
|
|
|
|
|
|
|
|
|
|
fn audio_trigger(
|
|
|
|
fn audio_trigger(
|
|
|
|
mut events: EventReader<AudioEvent>,
|
|
|
|
mut events: EventReader<AudioEvent>,
|
|
|
|
|
|
|
|
sources: Query<&AudioSource>,
|
|
|
|
studio: Res<FmodStudio>,
|
|
|
|
studio: Res<FmodStudio>,
|
|
|
|
mut commands: Commands,
|
|
|
|
mut commands: Commands,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
server: Res<AssetServer>,
|
|
|
|
audio_settings: Res<Assets<AudioSettings>>,
|
|
|
|
audio_settings: Res<Assets<AudioSettings>>,
|
|
|
|
display_state: Res<State<DisplayState>>,
|
|
|
|
display_state: Res<State<DisplayState>>,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
let tweak = audio_settings.get(&server.load("audio/martian.audio.tweak")).expect("Load audio tweakfile");
|
|
|
|
let tweak = audio_settings
|
|
|
|
|
|
|
|
.get(&server.load("audio/martian.audio.tweak"))
|
|
|
|
|
|
|
|
.expect("Load audio tweakfile");
|
|
|
|
debug!("Audio tweaks: {:?}", tweak);
|
|
|
|
debug!("Audio tweaks: {:?}", tweak);
|
|
|
|
let state = display_state.get();
|
|
|
|
let state = display_state.get();
|
|
|
|
events.iter().for_each(|event| {
|
|
|
|
events.iter().for_each(|event| {
|
|
|
|
let aud = match event {
|
|
|
|
let aud = match event {
|
|
|
|
AudioEvent::MainMusic => tweak.music.main.clone(),
|
|
|
|
AudioEvent::MainMusic | AudioEvent::StopMainMusic => tweak.music.main.clone(),
|
|
|
|
AudioEvent::MenuSelect => tweak.menu.select.clone(),
|
|
|
|
AudioEvent::MenuSelect => tweak.menu.select.clone(),
|
|
|
|
AudioEvent::PickUp => match state {
|
|
|
|
AudioEvent::PickUp => match state {
|
|
|
|
DisplayState::Display2d => tweak.display2d.pick_up.clone(),
|
|
|
|
DisplayState::Display2d => tweak.display2d.pick_up.clone(),
|
|
|
|
@ -94,7 +97,7 @@ fn audio_trigger(
|
|
|
|
DisplayState::Display2d => tweak.display2d.put_down.clone(),
|
|
|
|
DisplayState::Display2d => tweak.display2d.put_down.clone(),
|
|
|
|
DisplayState::Display3d => tweak.display3d.put_down.clone(),
|
|
|
|
DisplayState::Display3d => tweak.display3d.put_down.clone(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
AudioEvent::Idle => match state {
|
|
|
|
AudioEvent::Idle | AudioEvent::StopIdle => match state {
|
|
|
|
DisplayState::Display2d => tweak.display2d.idle.clone(),
|
|
|
|
DisplayState::Display2d => tweak.display2d.idle.clone(),
|
|
|
|
DisplayState::Display3d => tweak.display3d.idle.clone(),
|
|
|
|
DisplayState::Display3d => tweak.display3d.idle.clone(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
@ -103,11 +106,27 @@ fn audio_trigger(
|
|
|
|
DisplayState::Display3d => tweak.display3d.invalid.clone(),
|
|
|
|
DisplayState::Display3d => tweak.display3d.invalid.clone(),
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
// There is an event for this
|
|
|
|
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()) {
|
|
|
|
info!("Playing FMOD {:?}", event_str);
|
|
|
|
let audio_source = AudioSource::new(event_description);
|
|
|
|
commands.spawn(AudioSource::new(event_description));
|
|
|
|
// We are stopping a playing event
|
|
|
|
|
|
|
|
if *event == AudioEvent::StopIdle || *event == AudioEvent::StopMainMusic {
|
|
|
|
|
|
|
|
info!("Stopping audio {}", event_str);
|
|
|
|
|
|
|
|
// TODO: Find and stop playing instances of this audio
|
|
|
|
|
|
|
|
sources
|
|
|
|
|
|
|
|
.iter()
|
|
|
|
|
|
|
|
.filter(|source| {
|
|
|
|
|
|
|
|
format!("{:?}", source.event_instance)
|
|
|
|
|
|
|
|
== format!("{:?}", audio_source.event_instance)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
.for_each(|source| source.stop());
|
|
|
|
|
|
|
|
// we are playing a sound
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
info!("Playing audoi {}", event_str);
|
|
|
|
|
|
|
|
commands.spawn(audio_source);
|
|
|
|
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
warn!("Music not found for {:?}", event_str);
|
|
|
|
warn!("Music not found for {:?}", event_str);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|