63 lines
1.5 KiB
Rust
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();
|
|
}
|
|
}
|
|
}
|