From 4f9932074a8f0390d5cb6072b4e419c7ab08ffed Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 2 Apr 2020 14:13:18 +0200 Subject: added flags component, and conditions for building --- src/systems/useitem.rs | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'src/systems/useitem.rs') diff --git a/src/systems/useitem.rs b/src/systems/useitem.rs index de9ed29..d96f6ef 100644 --- a/src/systems/useitem.rs +++ b/src/systems/useitem.rs @@ -6,7 +6,8 @@ use specs::{ WriteStorage, System, Join, - Write + Write, + Read }; use crate::{ @@ -16,9 +17,10 @@ use crate::{ Inventory, AttackInbox, AttackMessage, - AttackType + AttackType, + Flags }, - resources::{NewEntities}, + resources::{NewEntities, Ground}, components::item::ItemAction::{None, Build, Eat, Equip}, controls::Control, }; @@ -32,18 +34,23 @@ impl <'a> System<'a> for Use { ReadStorage<'a, Position>, WriteStorage<'a, Inventory>, Write<'a, NewEntities>, - WriteStorage<'a, AttackInbox> + WriteStorage<'a, AttackInbox>, + Read<'a, Ground>, + ReadStorage<'a, Flags> ); - fn run(&mut self, (entities, controllers, positions, mut inventories, mut new, mut attacked): Self::SystemData) { + fn run(&mut self, (entities, controllers, positions, mut inventories, mut new, mut attacked, ground, flags): Self::SystemData) { for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ match &controller.control { Control::Use(rank) => { if let Some(entry) = inventory.items.get_mut(*rank) { match &entry.0.action { - Build(template) => { - new.create(position.pos, template.clone()).unwrap(); - inventory.items.remove(*rank); + Build(template, required_flags, blocking_flags) => { + let ground_flags = ground.flags_on(position.pos, &flags); + if required_flags.is_subset(&ground_flags) && blocking_flags.is_disjoint(&ground_flags){ + new.create(position.pos, template.clone()).unwrap(); + inventory.items.remove(*rank); + } } Eat(health_diff) => { AttackInbox::add_message(&mut attacked, ent, AttackMessage{typ: AttackType::Heal(*health_diff), attacker: Option::None}); -- cgit