use std::collections::HashMap;
pub struct AudioSystem {
music_volume: f32,
sfx_volume: f32,
current_music: Option<String>,
sounds: HashMap<String, Vec<u8>>,
}
impl AudioSystem {
pub fn new() -> Self {
Self {
music_volume: 1.0,
sfx_volume: 1.0,
current_music: None,
sounds: HashMap::new(),
}
}
pub fn set_music_volume(&mut self, volume: f32) {
self.music_volume = volume.clamp(0.0, 1.0);
}
pub fn set_sfx_volume(&mut self, volume: f32) {
self.sfx_volume = volume.clamp(0.0, 1.0);
}
pub fn load_sound(&mut self, key: &str, path: &str) -> Result<(), String> {
match std::fs::read(path) {
Ok(data) => {
self.sounds.insert(key.to_string(), data);
Ok(())
}
Err(e) => Err(format!("Falha ao carregar som {}: {}", path, e)),
}
}
pub fn play_sfx(&self, key: &str) {
if let Some(_data) = self.sounds.get(key) {
println!("🔊 Tocando SFX: {} (volume: {})", key, self.sfx_volume);
}
}
pub fn play_music(&mut self, key: &str, looping: bool) {
if self.sounds.contains_key(key) {
self.current_music = Some(key.to_string());
println!("🎵 Tocando música: {} (loop: {}, volume: {})", key, looping, self.music_volume);
}
}
pub fn stop_music(&mut self) {
if let Some(music) = &self.current_music {
println!("⏹️ Parando música: {}", music);
self.current_music = None;
}
}
pub fn pause_music(&self) {
if let Some(music) = &self.current_music {
println!("⏸️ Pausando música: {}", music);
}
}
pub fn resume_music(&self) {
if let Some(music) = &self.current_music {
println!("▶️ Retomando música: {}", music);
}
}
pub fn unload_sound(&mut self, key: &str) -> bool {
self.sounds.remove(key).is_some()
}
pub fn clear(&mut self) {
self.sounds.clear();
self.current_music = None;
}
}
impl Default for AudioSystem {
fn default() -> Self {
Self::new()
}
}