62 lines
1.3 KiB
Rust
62 lines
1.3 KiB
Rust
use godot::{
|
|
classes::{CharacterBody3D, class_macros::private::virtuals::ZipReader::Color},
|
|
obj::DynGd,
|
|
};
|
|
|
|
use crate::player::IPlayer;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct Buffs {
|
|
buffs: Vec<Buff>,
|
|
}
|
|
|
|
impl Default for Buffs {
|
|
fn default() -> Self {
|
|
let mut buffs = Vec::new();
|
|
buffs.push(Buff {
|
|
time_remaining: 5.,
|
|
kind: BuffKind::SpawnProtection,
|
|
});
|
|
|
|
Self { buffs }
|
|
}
|
|
}
|
|
|
|
impl Buffs {
|
|
pub fn update(&mut self, delta: f64) -> bool {
|
|
for buff in &mut self.buffs {
|
|
buff.update(delta);
|
|
}
|
|
let prev_length = self.buffs.len();
|
|
self.buffs.retain(|b| b.time_remaining >= 0.);
|
|
prev_length != self.buffs.len()
|
|
}
|
|
|
|
pub fn update_effects(self, player: &mut dyn IPlayer) {
|
|
let mut new_bubble_color = Color::BLACK.with_alpha(0.);
|
|
for buff in &self.buffs {
|
|
match buff.kind {
|
|
BuffKind::SpawnProtection => new_bubble_color = Color::BLUE,
|
|
}
|
|
}
|
|
player.set_bubble_color(new_bubble_color);
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct Buff {
|
|
time_remaining: f64,
|
|
kind: BuffKind,
|
|
}
|
|
|
|
impl Buff {
|
|
pub fn update(&mut self, delta: f64) {
|
|
self.time_remaining -= delta;
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum BuffKind {
|
|
SpawnProtection,
|
|
}
|