use audio::program::Track; use std::{fs, rc::Rc}; macro_rules! load_asm { ($path:tt) => {{ let res = if cfg!(any(feature = "static", target_arch = "wasm32")) { let src = include_str!(concat!("../../", $path)); Track::parse(src) } else { let src = fs::read_to_string($path)?; Track::parse(&src) }; res.map_err(|mut err| { err.file = Some(String::from($path)); err })? }}; ($first:tt, $($arg:tt),*) => { load_asm!($first)$(.merge(&load_asm!($arg)))* }; } pub struct Sound { pub track: Rc, pub looping: bool, pub priority: u32, } impl Sound { fn new(track: Track, looping: bool, priority: u32) -> Self { Self { track: Rc::new(track), looping, priority, } } } pub struct Music { pub attack: Sound, pub discover: Sound, pub background: Sound, pub game_over: Sound, pub speak: Sound, pub use_potion: Sound, pub use_bomb: Sound, pub drop_item: Sound, pub pickup_item: Sound, } impl Music { pub fn load() -> crate::Result { // TODO: create REAL audio files let attack = load_asm!("assets/asm/attack.asm"); let discover = load_asm!("assets/asm/discover.asm"); let background = load_asm!("assets/asm/placeholder.asm"); let game_over = load_asm!("assets/asm/placeholder.asm"); let speak = load_asm!("assets/asm/speak.asm"); let use_potion = load_asm!("assets/asm/use_potion.asm"); let use_bomb = load_asm!("assets/asm/use_bomb.asm"); let drop_item = load_asm!("assets/asm/drop_item.asm"); let pickup_item = load_asm!("assets/asm/pickup_item.asm"); Ok(Self { attack: Sound::new(attack, false, 2), discover: Sound::new(discover, false, 3), background: Sound::new(background, true, 1), game_over: Sound::new(game_over, true, 1), speak: Sound::new(speak, false, 2), use_potion: Sound::new(use_potion, false, 2), use_bomb: Sound::new(use_bomb, false, 2), drop_item: Sound::new(drop_item, false, 2), pickup_item: Sound::new(pickup_item, false, 2), }) } }