use std::time::Duration;
use crate::{core::FPS, prelude::*};
pub fn install(session: &mut Session) {
Lifetime::register_schema();
session
.stages
.add_system_to_stage(CoreStage::PostUpdate, lifetime_system)
.add_system_to_stage(CoreStage::PostUpdate, invincibility);
}
#[derive(Copy, Clone, Default, HasSchema)]
#[repr(C)]
pub struct Lifetime {
pub lifetime: f32,
pub age: f32,
}
impl Lifetime {
pub fn new(lifetime: f32) -> Self {
Self {
lifetime,
..default()
}
}
}
fn lifetime_system(mut entities: ResMutInit<Entities>, mut lifetimes: CompMut<Lifetime>) {
let mut to_kill = Vec::new();
for (entity, lifetime) in &mut entities.iter_with(&mut lifetimes) {
lifetime.age += 1.0 / FPS;
if lifetime.age > lifetime.lifetime {
to_kill.push(entity);
}
}
for entity in to_kill {
entities.kill(entity);
}
}
#[derive(Clone, Default, HasSchema, Debug)]
pub struct Invincibility(Timer);
impl Invincibility {
pub fn new(duration: Duration) -> Self {
Self(Timer::new(duration, TimerMode::Once))
}
}
fn invincibility(
time: Res<Time>,
mut commands: Commands,
entities: ResMutInit<Entities>,
mut invincibles: CompMut<Invincibility>,
) {
for (player_ent, invincible) in &mut entities.iter_with(&mut invincibles) {
invincible.0.tick(time.delta());
if invincible.0.finished() {
commands.add(move |mut invincibles: CompMut<Invincibility>| {
invincibles.remove(player_ent);
});
}
}
}