From ed84fb58e25efed952d0c874fde5232fbb26f45b Mon Sep 17 00:00:00 2001 From: troido Date: Mon, 13 Apr 2020 17:00:22 +0200 Subject: don't spawn immediately after each other --- src/components/mod.rs | 3 ++- src/componentwrapper.rs | 3 ++- src/systems/spawn.rs | 33 ++++++++++++++++++++++----------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/components/mod.rs b/src/components/mod.rs index 35f757e..6692445 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -181,7 +181,8 @@ pub struct Home { pub struct Spawner { pub amount: usize, pub clan: Clan, - pub template: Template + pub template: Template, + pub saturated: bool } #[derive(Component, Debug, Clone, PartialEq, Eq, Hash)] diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs index 8f493a3..5fe8f1d 100644 --- a/src/componentwrapper.rs +++ b/src/componentwrapper.rs @@ -174,7 +174,8 @@ components!( clan } }, - template: template.unsaved() + template: template.unsaved(), + saturated: false } }; Clan (name: String); diff --git a/src/systems/spawn.rs b/src/systems/spawn.rs index 1698ca5..01dfeee 100644 --- a/src/systems/spawn.rs +++ b/src/systems/spawn.rs @@ -6,7 +6,8 @@ use specs::{ ReadStorage, Write, System, - Join + Join, + Entities }; use crate::{ @@ -16,7 +17,8 @@ use crate::{ Clan, Home, TriggerBox, - Trigger + Trigger, + TimeOffset }, resources::{NewEntities}, componentwrapper::ComponentWrapper @@ -27,30 +29,39 @@ use crate::{ pub struct Spawn; impl <'a> System<'a> for Spawn { type SystemData = ( + Entities<'a>, ReadStorage<'a, Position>, Write<'a, NewEntities>, WriteStorage<'a, Spawner>, ReadStorage<'a, Clan>, - ReadStorage<'a, TriggerBox> + ReadStorage<'a, TriggerBox>, + WriteStorage<'a, TimeOffset> ); - fn run(&mut self, (positions, mut new, mut spawners, clans, triggerboxes): Self::SystemData) { + fn run(&mut self, (entities, positions, mut new, mut spawners, clans, triggerboxes, mut timeoffsets): Self::SystemData) { let mut clan_nums: HashMap<&Clan, usize> = HashMap::new(); for clan in (&clans).join() { let n: usize = *clan_nums.entry(clan).or_insert(0); clan_nums.insert(clan, n+1); } - for (spawner, position, triggerbox) in (&mut spawners, &positions, &triggerboxes).join() { + for (entity, spawner, position, triggerbox) in (&entities, &mut spawners, &positions, &triggerboxes).join() { if triggerbox.has_message(&[Trigger::Spawn]) { if *clan_nums.get(&spawner.clan).unwrap_or(&0) < spawner.amount { - match new.encyclopedia.construct(&spawner.template) { - Ok(mut preent) => { - preent.push(ComponentWrapper::Clan(spawner.clan.clone())); - preent.push(ComponentWrapper::Home(Home{home: position.pos})); - new.to_build.push((position.pos, preent)); + if spawner.saturated { + spawner.saturated = false; + } else { + match new.encyclopedia.construct(&spawner.template) { + Ok(mut preent) => { + preent.push(ComponentWrapper::Clan(spawner.clan.clone())); + preent.push(ComponentWrapper::Home(Home{home: position.pos})); + new.to_build.push((position.pos, preent)); + } + Err(err) => {println!("Error: can not spawn entity from spawner: {}", err);} } - Err(err) => {println!("Error: can not spawn entity from spawner: {}", err);} } + } else { + spawner.saturated = true; + timeoffsets.remove(entity); } } } -- cgit