use std::io;
use cmaze::gameboard::Maze;
use rand::{seq::SliceRandom, thread_rng};
mod assets_sounds {
pub const MUSIC_EASY: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR",),
"/assets/dist/audio/",
"music_easy-level.",
"mp3",
));
pub const MUSIC_MEDIUM: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR",),
"/assets/dist/audio/",
"music_medium-level.",
"mp3",
));
pub const MUSIC_HARD: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR",),
"/assets/dist/audio/",
"music_hard-level.",
"mp3",
));
pub const MUSIC_MENU: &[u8] = include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR",),
"/assets/dist/audio/",
"music_menu.",
"mp3",
));
}
pub type Track = Box<dyn rodio::Source<Item = i16> + Send>;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MusicTrack {
Easy,
Medium,
Hard,
Menu,
}
impl MusicTrack {
pub fn get_data(&self) -> &'static [u8] {
match self {
MusicTrack::Easy => assets_sounds::MUSIC_EASY,
MusicTrack::Medium => assets_sounds::MUSIC_MEDIUM,
MusicTrack::Hard => assets_sounds::MUSIC_HARD,
MusicTrack::Menu => assets_sounds::MUSIC_MENU,
}
}
pub fn get_track(&self) -> Track {
let data = Self::get_data(self);
let cursor = io::Cursor::new(data);
let source = rodio::Decoder::new(cursor).unwrap();
Box::new(source)
}
pub fn choose_for_maze(_maze: &Maze) -> Self {
use MusicTrack::*;
*[Easy, Medium, Hard].choose(&mut thread_rng()).unwrap()
}
}