Skip to content
Snippets Groups Projects
utilities.rs 1.17 KiB
Newer Older
use bevy::ecs::system::Resource;
use bevy::prelude::*;
use bevy_kira_audio::AudioSource;

use crate::music_box::MusicBox;

pub trait SuppliesAudio: Resource {
Louis's avatar
Louis committed
	fn resolve_track_name<T: ToString>(&self, name: T) -> TrackType<String>;
	fn get_audio_track<T: ToString>(&self, name: T) -> Option<Handle<AudioSource>>;
}

Louis's avatar
Louis committed
#[derive(Copy, Clone, Debug)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct AudioSettings {
Louis's avatar
Louis committed
	pub master_volume: f32,
	pub music_volume: f32,
	pub ambiance_volume: f32,
	pub sfx_volume: f32,
	pub ui_volume: f32,
}

impl Default for AudioSettings {
	fn default() -> Self {
		Self {
			master_volume: 1.0,
Louis's avatar
Louis committed
			music_volume: 1.0,
			ambiance_volume: 1.0,
			sfx_volume: 1.0,
			ui_volume: 1.0,
Louis's avatar
Louis committed
pub enum TrackType<T> {
	Single(T),
	WithIntro(T, T),
Louis's avatar
Louis committed
impl SuppliesAudio for AssetServer {
	fn resolve_track_name<T: ToString>(&self, name: T) -> TrackType<String> {
		TrackType::Single(name.to_string())
Louis's avatar
Louis committed

	fn get_audio_track<T: ToString>(&self, name: T) -> Option<Handle<AudioSource>> {
		Some(self.load(&name.to_string()))
	}
Louis's avatar
Louis committed
}

pub fn sync_music_volume<T: SuppliesAudio>(music: MusicBox<T>) {
	music.sync_settings();
}