summaryrefslogtreecommitdiff
path: root/src/systems/growth.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems/growth.rs')
-rw-r--r--src/systems/growth.rs48
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();
+ }
+ }
+ }
+}