skullball/rust/src/player/buffs.rs

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,
}