#![allow(dead_code)]
use stecs::{
prelude::*,
storage::arena::{Arena, ArenaId},
};
#[derive(SplitFields)]
#[split(debug, clone)] struct Monster {
position: (f32, f32),
health: f32,
tick: usize,
damage: Option<f32>,
}
#[derive(SplitFields)]
struct Corpse {
#[split(nested)]
monster: Monster,
time: f32,
}
struct World {
monsters: StructOf<Arena<Monster>>,
corpses: StructOf<Arena<Corpse>>,
}
fn main() {
let mut world = World {
monsters: Default::default(),
corpses: Default::default(),
};
let id = world.monsters.insert(Monster {
position: (0.0, 0.0),
health: 10.0,
tick: 7,
damage: None,
});
let monster: Monster = world.monsters.remove(id).unwrap();
world.monsters.insert(monster);
world.monsters.insert(Monster {
position: (1.0, 3.0),
health: 5.0,
tick: 5,
damage: Some(1.0),
});
world.corpses.insert(Corpse {
monster: Monster {
position: (-5.0, 0.0),
health: 0.0,
tick: 10,
damage: None,
},
time: 5.0,
});
for (id, position, damage) in query!(world.monsters, (id, &mut position, &damage.Get.Some)) {
println!("[{:?}] at {:?}, dealing {} damage", id, position, damage);
}
#[derive(Debug)]
struct MonsterRef<'a> {
id: ArenaId,
position: &'a (f32, f32),
damage: &'a f32,
}
for monster in query!(
world.monsters,
MonsterRef {
id,
position,
damage: &damage.Get.Some,
}
) {
println!("{:?}", monster);
}
for (time, position) in query!(world.corpses, (&time, &monster.position)) {
println!("{} - {:?}", time, position)
}
}