|
|
|
|
@ -3,14 +3,16 @@
|
|
|
|
|
///
|
|
|
|
|
use crate::prelude::*;
|
|
|
|
|
use bevy::{
|
|
|
|
|
asset::{AssetLoader, LoadContext, LoadedAsset},
|
|
|
|
|
asset::{io::Reader, AssetLoader, AsyncReadExt, LoadContext},
|
|
|
|
|
prelude::*,
|
|
|
|
|
reflect::{TypePath, TypeUuid},
|
|
|
|
|
utils::thiserror,
|
|
|
|
|
utils::BoxedFuture,
|
|
|
|
|
};
|
|
|
|
|
use bevy_fmod::prelude::AudioSource;
|
|
|
|
|
use bevy_fmod::prelude::*;
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
use thiserror::Error;
|
|
|
|
|
|
|
|
|
|
pub(crate) struct AudioPlugin;
|
|
|
|
|
|
|
|
|
|
@ -28,8 +30,8 @@ impl Plugin for AudioPlugin {
|
|
|
|
|
"./assets/audio/Martian Chess Audio/Build/Desktop/SFX.bank",
|
|
|
|
|
],
|
|
|
|
|
});
|
|
|
|
|
app.add_asset::<AudioSettings>()
|
|
|
|
|
.init_asset_loader::<AudioSettingsLoader>();
|
|
|
|
|
app.register_asset_loader(AudioSettingsLoader)
|
|
|
|
|
.init_asset::<AudioSettings>();
|
|
|
|
|
|
|
|
|
|
app.add_systems(OnEnter(GameState::Menu), play_background);
|
|
|
|
|
app.add_systems(
|
|
|
|
|
@ -85,7 +87,7 @@ fn audio_trigger(
|
|
|
|
|
.expect("Load audio tweakfile");
|
|
|
|
|
debug!("Audio tweaks: {:?}", tweak);
|
|
|
|
|
let state = display_state.get();
|
|
|
|
|
events.iter().for_each(|event| {
|
|
|
|
|
events.read().for_each(|event| {
|
|
|
|
|
let aud = match event {
|
|
|
|
|
AudioEvent::MainMusic | AudioEvent::StopMainMusic => tweak.music.main.clone(),
|
|
|
|
|
AudioEvent::MenuSelect => tweak.menu.select.clone(),
|
|
|
|
|
@ -136,9 +138,9 @@ fn audio_trigger(
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Deserialize, TypeUuid, TypePath)]
|
|
|
|
|
#[derive(Debug, Deserialize, TypeUuid, TypePath, Asset)]
|
|
|
|
|
#[uuid = "5c7a67ee-56a9-4fe9-9e91-1a709fbc3cf0"]
|
|
|
|
|
pub(crate) struct AudioSettings {
|
|
|
|
|
pub struct AudioSettings {
|
|
|
|
|
#[serde(default)]
|
|
|
|
|
display2d: PlaySettings,
|
|
|
|
|
#[serde(default)]
|
|
|
|
|
@ -173,20 +175,36 @@ struct PlaySettings {
|
|
|
|
|
invalid: String,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Error)]
|
|
|
|
|
pub enum AudioSettingsLoadError {
|
|
|
|
|
#[error("Could not read audio setting: {0}")]
|
|
|
|
|
LoadError(#[from] std::io::Error),
|
|
|
|
|
#[error("Could not load audio setting: {0}")]
|
|
|
|
|
ReadError(#[from] std::str::Utf8Error),
|
|
|
|
|
#[error("Could not parse audio settings: {0}")]
|
|
|
|
|
ParseError(#[from] toml::de::Error),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[derive(Default)]
|
|
|
|
|
pub struct AudioSettingsLoader;
|
|
|
|
|
|
|
|
|
|
impl AssetLoader for AudioSettingsLoader {
|
|
|
|
|
type Asset = AudioSettings;
|
|
|
|
|
type Settings = ();
|
|
|
|
|
type Error = AudioSettingsLoadError;
|
|
|
|
|
|
|
|
|
|
fn load<'a>(
|
|
|
|
|
&'a self,
|
|
|
|
|
bytes: &'a [u8],
|
|
|
|
|
load_context: &'a mut LoadContext,
|
|
|
|
|
) -> BoxedFuture<'a, Result<(), bevy::asset::Error>> {
|
|
|
|
|
reader: &'a mut Reader,
|
|
|
|
|
_settings: &'a Self::Settings,
|
|
|
|
|
_load_context: &'a mut LoadContext,
|
|
|
|
|
) -> BoxedFuture<'a, Result<Self::Asset, Self::Error>> {
|
|
|
|
|
Box::pin(async move {
|
|
|
|
|
let s = std::str::from_utf8(bytes)?;
|
|
|
|
|
let custom_asset = toml::from_str::<AudioSettings>(s)?;
|
|
|
|
|
load_context.set_default_asset(LoadedAsset::new(custom_asset));
|
|
|
|
|
Ok(())
|
|
|
|
|
let mut bytes = Vec::new();
|
|
|
|
|
reader.read_to_end(&mut bytes).await?;
|
|
|
|
|
let s = std::str::from_utf8(bytes.as_slice())?;
|
|
|
|
|
let custom_asset: AudioSettings = toml::from_str(s)?;
|
|
|
|
|
Ok(custom_asset)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|