diff options
| author | troido <troido@protonmail.com> | 2020-04-13 14:36:03 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-04-13 14:36:03 +0200 |
| commit | 2d4cabc768968a215556f7a4ed81a728d3b6e120 (patch) | |
| tree | 3e2190d9b72320cec4bb889a1bd10f2b43d9751b | |
| parent | ee200f3003acdfdfde1a746246a7a4669188eb18 (diff) | |
checking for specific messages is easier because of TriggerBox::has_message
| -rw-r--r-- | src/components/messages.rs | 15 | ||||
| -rw-r--r-- | src/systems/building.rs | 17 | ||||
| -rw-r--r-- | src/systems/die.rs | 19 | ||||
| -rw-r--r-- | src/systems/droploot.rs | 15 | ||||
| -rw-r--r-- | src/systems/spawn.rs | 18 |
5 files changed, 39 insertions, 45 deletions
diff --git a/src/components/messages.rs b/src/components/messages.rs index 2c0ffd5..5e27cc6 100644 --- a/src/components/messages.rs +++ b/src/components/messages.rs @@ -11,7 +11,7 @@ use super::equipment::Stat; -pub trait Message: Send + Sync + Any {} +pub trait Message: Send + Sync + Any + PartialEq {} #[derive(Debug, Clone, Default)] pub struct Inbox<M: Message> { @@ -32,6 +32,17 @@ impl <M: Message> Inbox<M> { .messages .push(message); } + + pub fn has_message(&self, messages: &[M]) -> bool { + for message in self.messages.iter() { + for asked in messages { + if message == asked { + return true; + } + } + } + false + } } @@ -56,7 +67,7 @@ impl AttackType { } } -#[derive(Debug, Clone)] +#[derive(Debug, Clone, PartialEq)] pub struct AttackMessage { pub attacker: Option<Entity>, pub typ: AttackType diff --git a/src/systems/building.rs b/src/systems/building.rs index 0f23467..e7924b4 100644 --- a/src/systems/building.rs +++ b/src/systems/building.rs @@ -31,18 +31,13 @@ impl <'a> System<'a> for Building{ fn run(&mut self, (positions, mut new, triggerboxes, builds, time_offsets): Self::SystemData) { for (position, triggerbox, build, time_offset) in (&positions, &triggerboxes, &builds, (&time_offsets).maybe()).join(){ - for message in triggerbox.messages.iter() { - match message { - Trigger::Build | Trigger::Change => { - // todo: better error handling - let mut preent = new.encyclopedia.construct(&build.obj).unwrap(); - if let Some(time) = time_offset { - preent.push(ComponentWrapper::TimeOffset(time.clone())); - } - new.to_build.push((position.pos, preent)); - } - _ => {} + if triggerbox.has_message(&[Trigger::Build, Trigger::Change]) { + // todo: better error handling + let mut preent = new.encyclopedia.construct(&build.obj).unwrap(); + if let Some(time) = time_offset { + preent.push(ComponentWrapper::TimeOffset(time.clone())); } + new.to_build.push((position.pos, preent)); } } } diff --git a/src/systems/die.rs b/src/systems/die.rs index 021448e..755ac7f 100644 --- a/src/systems/die.rs +++ b/src/systems/die.rs @@ -27,18 +27,13 @@ impl <'a> System<'a> for Die { ); fn run(&mut self, (entities, triggerboxes, mut removeds, mut emigration, players): Self::SystemData) { for (entity, triggerbox) in (&entities, &triggerboxes).join() { - for trigger in triggerbox.messages.iter() { - match trigger { - Trigger::Die | Trigger::Remove | Trigger::Change => { - if let Some(player) = players.get(entity) { - // players move to purgatory when dead - emigration.emigrants.push((player.id.clone(), purgatory::purgatory_id(), RoomPos::Unknown)); - } else { - // npcs etc get removed when dead - removeds.insert(entity, Removed).unwrap(); - } - } - _ => {} + if triggerbox.has_message(&[Trigger::Die, Trigger::Remove, Trigger::Change]){ + if let Some(player) = players.get(entity) { + // players move to purgatory when dead + emigration.emigrants.push((player.id.clone(), purgatory::purgatory_id(), RoomPos::Unknown)); + } else { + // npcs etc get removed when dead + removeds.insert(entity, Removed).unwrap(); } } } diff --git a/src/systems/droploot.rs b/src/systems/droploot.rs index 33e71c0..2b0281d 100644 --- a/src/systems/droploot.rs +++ b/src/systems/droploot.rs @@ -30,17 +30,12 @@ impl <'a> System<'a> for DropLoot{ fn run(&mut self, (positions, mut new, triggerboxes, loots): Self::SystemData) { for (position, triggerbox, loot) in (&positions, &triggerboxes, &loots).join(){ - for message in triggerbox.messages.iter() { - match message { - Trigger::Die | Trigger::Loot => { - for (template, chance) in &loot.loot { - if *chance > rand::thread_rng().gen_range(0.0, 1.0) { - // todo: better error handling - new.create(position.pos, &template).unwrap(); - } - } + if triggerbox.has_message(&[Trigger::Die, Trigger::Loot]) { + for (template, chance) in &loot.loot { + if *chance > rand::thread_rng().gen_range(0.0, 1.0) { + // todo: better error handling + new.create(position.pos, &template).unwrap(); } - _ => {} } } } diff --git a/src/systems/spawn.rs b/src/systems/spawn.rs index ad9e8c1..1698ca5 100644 --- a/src/systems/spawn.rs +++ b/src/systems/spawn.rs @@ -41,17 +41,15 @@ impl <'a> System<'a> for Spawn { clan_nums.insert(clan, n+1); } for (spawner, position, triggerbox) in (&mut spawners, &positions, &triggerboxes).join() { - for message in triggerbox.messages.iter() { - if *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)); - } - Err(err) => {println!("Error: can not spawn entity from spawner: {}", err);} + 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)); } + Err(err) => {println!("Error: can not spawn entity from spawner: {}", err);} } } } |
