use std::{cell::RefMut, sync::LazyLock}; use super::{ecs::world::World, player::Player}; mod movement; use movement::MovementSystem; macro_rules! enabled_systems { ($($sys:ident;)*) => { static SYSTEMS: LazyLock]>> = LazyLock::new(|| { vec![ $(Box::new($sys::new()) as Box,)* ].into_boxed_slice() }); pub fn tick_systems(world: &mut World, players: &mut [::std::cell::RefMut]) { SYSTEMS.iter().for_each(|system| system.tick(world, players)); } }; } pub trait System: Send + Sync + 'static { fn tick(&self, world: &mut World, players: &mut [RefMut]); } enabled_systems! { MovementSystem; }