diff --git a/Cargo.lock b/Cargo.lock index 7666376923..6205821c53 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4828,9 +4828,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "simba" 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..79ab2c36f0 100644 --- a/assets/locales/en-US/settings.ftl +++ b/assets/locales/en-US/settings.ftl @@ -19,6 +19,13 @@ action = Action networking = Networking matchmaking-server = Matchmaking Server +# Audio settings +audio = Audio +volume = Volume +volume-main = Main +volume-music = Music +volume-effects = Effects + # Graphics settings graphics = Graphics fullscreen = Fullscreen diff --git a/src/audio.rs b/src/audio.rs new file mode 100644 index 0000000000..fd3882f0f9 --- /dev/null +++ b/src/audio.rs @@ -0,0 +1,210 @@ +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) + .add_system_to_stage(Last, kill_finished_audios); +} + +/// A resource that can be used to control game audios. +#[derive(HasSchema)] +#[schema(no_clone)] +pub struct AudioCenter { + /// Buffer for audio events that have not yet been processed. + events: VecDeque, + /// The handle to the current music. + music: Option