From 133124408f41ecc8457a4d5082ab8a194755aee4 Mon Sep 17 00:00:00 2001 From: Nelson Earle Date: Sun, 21 Jan 2024 20:48:23 -0600 Subject: [PATCH 01/10] add audio settings --- assets/game.yaml | 1 + assets/locales/en-US/settings.ftl | 4 + src/audio.rs | 164 ++++++++++++++++++++++++ src/audio/music.rs | 101 +++++++++++++++ src/core.rs | 6 +- src/core/audio.rs | 69 ---------- src/core/bullet.rs | 4 +- src/core/elements/crate_item.rs | 6 +- src/core/elements/flappy_jellyfish.rs | 4 +- src/core/elements/grenade.rs | 8 +- src/core/elements/kick_bomb.rs | 8 +- src/core/elements/mine.rs | 6 +- src/core/elements/musket.rs | 6 +- src/core/elements/sproinger.rs | 4 +- src/core/elements/sword.rs | 4 +- src/core/player/state.rs | 6 +- src/core/player/state/states/idle.rs | 4 +- src/core/player/state/states/midair.rs | 4 +- src/core/player/state/states/walk.rs | 4 +- src/main.rs | 6 +- src/music.rs | 170 ------------------------- src/sessions.rs | 4 +- src/settings.rs | 3 + src/ui/main_menu/settings.rs | 10 ++ src/ui/main_menu/settings/audio.rs | 55 ++++++++ 25 files changed, 379 insertions(+), 282 deletions(-) create mode 100644 src/audio.rs create mode 100644 src/audio/music.rs delete mode 100644 src/core/audio.rs delete mode 100644 src/music.rs create mode 100644 src/ui/main_menu/settings/audio.rs diff --git a/assets/game.yaml b/assets/game.yaml index 7d2b8a5834..49b6743bb7 100644 --- a/assets/game.yaml +++ b/assets/game.yaml @@ -30,6 +30,7 @@ main_menu: menu_width: 350 default_settings: + main_volume: 1.0 matchmaking_server: matchmaker.bones.fishfolk.org:65534 player_controls: # Gamepad controls diff --git a/assets/locales/en-US/settings.ftl b/assets/locales/en-US/settings.ftl index 2363951568..1d72e5d5e2 100644 --- a/assets/locales/en-US/settings.ftl +++ b/assets/locales/en-US/settings.ftl @@ -19,6 +19,10 @@ action = Action networking = Networking matchmaking-server = Matchmaking Server +# Audio settings +audio = Audio +main-volume = Main Volume + # Graphics settings graphics = Graphics fullscreen = Fullscreen diff --git a/src/audio.rs b/src/audio.rs new file mode 100644 index 0000000000..2bb8188af5 --- /dev/null +++ b/src/audio.rs @@ -0,0 +1,164 @@ +use std::collections::VecDeque; + +use bones_framework::prelude::kira::{ + sound::{ + static_sound::{StaticSoundHandle, StaticSoundSettings}, + PlaybackState, + }, + tween::{self, Tween}, + Volume, +}; + +use crate::prelude::*; + +pub mod music; + +pub use music::*; + +pub fn game_plugin(game: &mut Game) { + game.init_shared_resource::(); + + let session = game.sessions.create(SessionNames::AUDIO); + + // Audio doesn't do any rendering + session.visible = false; + session + .stages + .add_system_to_stage(First, music_system) + .add_system_to_stage(First, process_audio_events); +} + +#[derive(HasSchema)] +#[schema(no_clone)] +pub struct AudioCenter { + events: VecDeque, + music: Option, +} + +impl Default for AudioCenter { + fn default() -> Self { + Self { + events: VecDeque::with_capacity(16), + music: None, + } + } +} + +impl AudioCenter { + pub fn event(&mut self, event: AudioEvent) { + self.events.push_back(event); + } + + pub fn music_state(&self) -> Option { + self.music.as_ref().map(StaticSoundHandle::state) + } + + pub fn play_sound(&mut self, sound_source: Handle, volume: f64) { + self.events.push_back(AudioEvent::PlaySound { + sound_source, + volume, + }) + } + + pub fn play_music( + &mut self, + sound_source: Handle, + sound_settings: StaticSoundSettings, + ) { + self.events.push_back(AudioEvent::PlayMusic { + sound_source, + sound_settings: Box::new(sound_settings), + }); + } +} + +/// An audio event that may be sent to the [`AudioEvents`] resource. +#[derive(Clone, Debug)] +pub enum AudioEvent { + MainVolumeChange(f64), + PlayMusic { + sound_source: Handle, + sound_settings: Box, + }, + /// Play a sound. + PlaySound { + /// The handle to the sound to play. + sound_source: Handle, + /// The volume to play the sound at. + volume: f64, + }, +} + +#[derive(HasSchema)] +#[schema(no_clone, no_default, opaque)] +#[repr(C)] +pub struct Audio { + handle: StaticSoundHandle, + volume: f64, +} + +fn process_audio_events( + mut audio_manager: ResMut, + mut audio_center: ResMut, + assets: ResInit, + mut entities: ResMut, + mut audios: CompMut