skullball/rust/src/announcer.rs
2026-07-24 02:13:21 +03:00

63 lines
1.5 KiB
Rust

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<Gd<AudioStreamPlayer>>,
#[export]
#[export_group(name = "Sounds")]
first_blood: Option<Gd<AudioStream>>,
#[export]
#[export_group(name = "Sounds")]
double_kill: Option<Gd<AudioStream>>,
#[export]
#[export_group(name = "Sounds")]
triple_kill: Option<Gd<AudioStream>>,
#[export]
#[export_group(name = "Sounds")]
mega_kill: Option<Gd<AudioStream>>,
base: Base<Node3D>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub enum Announcement {
FirstBlood,
DoubleKill,
TripleKill,
MegaKill,
}
impl Announcer {
pub fn singleton() -> Gd<Announcer> {
get_autoload_by_name::<Announcer>(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();
}
}
}