summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-13 17:00:22 +0200
committertroido <troido@protonmail.com>2020-04-13 17:00:22 +0200
commited84fb58e25efed952d0c874fde5232fbb26f45b (patch)
tree55f06bd07ebf9fa837af830b05ea1242aa7ddc42
parent3cb46c733597c1f825190ad45c93aa3a24158605 (diff)
don't spawn immediately after each other
-rw-r--r--src/components/mod.rs3
-rw-r--r--src/componentwrapper.rs3
-rw-r--r--src/systems/spawn.rs33
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);
}
}
}