summaryrefslogtreecommitdiff
path: root/src/systems/useitem.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
committertroido <troido@protonmail.com>2020-04-02 14:13:18 +0200
commit4f9932074a8f0390d5cb6072b4e419c7ab08ffed (patch)
treed83da5cd8b35af25aa6e0b2c9105182920c49bd0 /src/systems/useitem.rs
parentec007f34c4cd984640a235660803b81a739742b3 (diff)
added flags component, and conditions for building
Diffstat (limited to 'src/systems/useitem.rs')
-rw-r--r--src/systems/useitem.rs23
1 files changed, 15 insertions, 8 deletions
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});