From b9cfb78c20fd309929aae98f24acc8ba4a9a7481 Mon Sep 17 00:00:00 2001 From: troido Date: Sun, 9 Feb 2020 23:38:22 +0100 Subject: can now pick up and drop items --- src/systems/take.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 src/systems/take.rs (limited to 'src/systems/take.rs') diff --git a/src/systems/take.rs b/src/systems/take.rs new file mode 100644 index 0000000..95bec1b --- /dev/null +++ b/src/systems/take.rs @@ -0,0 +1,65 @@ + +use std::collections::HashSet; + +use specs::{ + Entities, + ReadStorage, + WriteStorage, + System, + Join, + Write +}; + +use super::super::pos::Pos; + +use super::super::components::{ + Controller, + Position, + Removed, + Inventory, + Item +}; + +use super::super::controls::{Control}; +use super::super::resources::{Ground, NewEntities}; + + + +pub struct Take; +impl <'a> System<'a> for Take { + type SystemData = ( + Entities<'a>, + ReadStorage<'a, Controller>, + WriteStorage<'a, Position>, + Write<'a, Ground>, + WriteStorage<'a, Removed>, + ReadStorage<'a, Item>, + WriteStorage<'a, Inventory>, + Write<'a, NewEntities> + ); + + fn run(&mut self, (entities, controllers, positions, ground, mut removed, items, mut inventories, mut new): Self::SystemData) { + for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ + match &controller.0 { + Control::Take(_rank) => { + let mut ents = ground.cells.get(&position.pos).unwrap_or(&HashSet::new()).clone(); + ents.remove(&ent); + for ent in ents { + if let Some(item) = items.get(ent) { + inventory.items.push(item.clone()); + if let Err(msg) = removed.insert(ent, Removed) { + println!("{:?}", msg); + } + } + } + } + Control::Drop(_rank) => { + if let Some(item) = inventory.items.pop() { + new.templates.push((position.pos, item.ent)); + } + } + _ => {} + } + } + } +} -- cgit