summaryrefslogtreecommitdiff
path: root/src/systems/spawn.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems/spawn.rs')
-rw-r--r--src/systems/spawn.rs33
1 files changed, 22 insertions, 11 deletions
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);
}
}
}