diff options
Diffstat (limited to 'src/systems/growth.rs')
| -rw-r--r-- | src/systems/growth.rs | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/systems/growth.rs b/src/systems/growth.rs new file mode 100644 index 0000000..7472115 --- /dev/null +++ b/src/systems/growth.rs @@ -0,0 +1,48 @@ + +use rand; + +use specs::{ + ReadStorage, + WriteStorage, + Entities, + System, + Join, + Write, + Read +}; + +use crate::{ + components::{ + Position, + Grow, + Removed + }, + resources::{NewEntities, Time} +}; + + +pub struct Growth; +impl <'a> System<'a> for Growth{ + type SystemData = ( + Entities<'a>, + ReadStorage<'a, Position>, + Write<'a, NewEntities>, + WriteStorage<'a, Grow>, + WriteStorage<'a, Removed>, + Read<'a, Time> + ); + + fn run(&mut self, (entities, positions, mut new, mut grows, mut removeds, time): Self::SystemData) { + for (entity, position, grow) in (&entities, &positions, &mut grows).join(){ + if grow.target_time == None { + let duration = grow.delay as f64 * (1.0 + rand::random::<f64>()) / (if rand::random() {1.0} else {2.0}); + grow.target_time = Some(time.time + duration as i64); + } + if grow.target_time.unwrap() <= time.time { + removeds.insert(entity, Removed).unwrap(); + // todo: error handling + new.create(position.pos, grow.into.clone()).unwrap(); + } + } + } +} |
