use godot::{ classes::{CharacterBody3D, class_macros::private::virtuals::ZipReader::Color}, obj::DynGd, }; use crate::player::IPlayer; #[derive(Debug, Clone)] pub struct Buffs { buffs: Vec, } 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, }