use godot::{ classes::{AudioStream, AudioStreamPlayer}, prelude::*, tools::get_autoload_by_name, }; use serde::{Deserialize, Serialize}; pub const ANNOUCER_GLOBAL: &str = "AnnouncerGlobal"; #[derive(GodotClass)] #[class(base=Node3D, init)] pub struct Announcer { #[export] player: Option>, #[export] #[export_group(name = "Sounds")] first_blood: Option>, #[export] #[export_group(name = "Sounds")] double_kill: Option>, #[export] #[export_group(name = "Sounds")] triple_kill: Option>, #[export] #[export_group(name = "Sounds")] mega_kill: Option>, base: Base, } #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub enum Announcement { FirstBlood, DoubleKill, TripleKill, MegaKill, } impl Announcer { pub fn singleton() -> Gd { get_autoload_by_name::(ANNOUCER_GLOBAL) } pub fn announce(&mut self, announcement: Announcement) { let sound = match announcement { Announcement::FirstBlood => &self.first_blood, Announcement::DoubleKill => &self.double_kill, Announcement::TripleKill => &self.triple_kill, Announcement::MegaKill => &self.mega_kill, }; if let Some(sound) = sound && let Some(player) = &mut self.player { player.set_stream(sound); player.play(); } } }