From 40e4e9e7a7e2c59a5659d8d4bd2ecfafed967299 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 28 Feb 2020 12:40:52 +0100 Subject: added cooldowns for moving and fighting --- src/systems/controlinput.rs | 14 +++++++------- src/systems/fight.rs | 11 +++++++---- src/systems/mod.rs | 4 +++- src/systems/moving.rs | 15 ++++++++++----- src/systems/take.rs | 2 +- src/systems/updatecooldowns.rs | 33 +++++++++++++++++++++++++++++++++ src/systems/useitem.rs | 2 +- 7 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 src/systems/updatecooldowns.rs (limited to 'src/systems') diff --git a/src/systems/controlinput.rs b/src/systems/controlinput.rs index 71373f5..17bc40f 100644 --- a/src/systems/controlinput.rs +++ b/src/systems/controlinput.rs @@ -8,7 +8,7 @@ use specs::{ Join }; -use crate::components::{Controller, Player}; +use crate::components::{Controller, Player, ControlCooldown}; use crate::resources::{Input}; @@ -18,17 +18,17 @@ impl <'a> System<'a> for ControlInput { Entities<'a>, Write<'a, Input>, WriteStorage<'a, Controller>, - ReadStorage<'a, Player> + ReadStorage<'a, Player>, + ReadStorage<'a, ControlCooldown> ); - fn run(&mut self, (entities, mut input, mut controllers, players): Self::SystemData) { + fn run(&mut self, (entities, mut input, mut controllers, players, cooldowns): Self::SystemData) { controllers.clear(); - for (player, entity) in (&players, &entities).join() { - if let Some(control) = input.actions.get(&player.id){ - let _ = controllers.insert(entity, Controller(control.clone())); + for (player, entity, ()) in (&players, &entities, !&cooldowns).join() { + if let Some(control) = input.actions.remove(&player.id){ + let _ = controllers.insert(entity, Controller{control: control}); } } - input.actions.clear(); } } diff --git a/src/systems/fight.rs b/src/systems/fight.rs index d0342b5..547f5fa 100644 --- a/src/systems/fight.rs +++ b/src/systems/fight.rs @@ -14,7 +14,8 @@ use crate::components::{ Position, Attacked, Fighter, - Health + Health, + ControlCooldown }; use crate::controls::{Control}; @@ -31,17 +32,19 @@ impl <'a> System<'a> for Fight { Read<'a, Ground>, WriteStorage<'a, Attacked>, ReadStorage<'a, Fighter>, - ReadStorage<'a, Health> + ReadStorage<'a, Health>, + WriteStorage<'a, ControlCooldown> ); - fn run(&mut self, (entities, controllers, positions, ground, mut attacked, fighters, healths): Self::SystemData) { + fn run(&mut self, (entities, controllers, positions, ground, mut attacked, fighters, healths, mut cooldowns): Self::SystemData) { for (entity, controller, position, fighter) in (&entities, &controllers, &positions, &fighters).join(){ - match &controller.0 { + match &controller.control { Control::Attack(directions) => { for direction in directions { for ent in ground.cells.get(&(position.pos + direction.to_position())).unwrap_or(&HashSet::new()) { if healths.contains(*ent) && *ent != entity { Attacked::add_attack(&mut attacked, *ent, fighter.attack.clone()); + cooldowns.insert(entity, ControlCooldown{amount: fighter.cooldown}).unwrap(); break; } } diff --git a/src/systems/mod.rs b/src/systems/mod.rs index 28cd128..24ed3df 100644 --- a/src/systems/mod.rs +++ b/src/systems/mod.rs @@ -13,6 +13,7 @@ mod trapping; mod fight; mod heal; mod volate; +mod updatecooldowns; pub use self::{ controlinput::ControlInput, @@ -28,5 +29,6 @@ pub use self::{ trapping::Trapping, fight::Fight, heal::Heal, - volate::Volate + volate::Volate, + updatecooldowns::UpdateCooldowns }; diff --git a/src/systems/moving.rs b/src/systems/moving.rs index daa1eb4..5232076 100644 --- a/src/systems/moving.rs +++ b/src/systems/moving.rs @@ -19,7 +19,9 @@ use crate::{ Position, Floor, Moved, - Entered + Entered, + Movable, + ControlCooldown }, controls::{ Control @@ -42,14 +44,16 @@ impl <'a> System<'a> for Move { Write<'a, Ground>, ReadStorage<'a, Floor>, WriteStorage<'a, Moved>, - WriteStorage<'a, Entered> + WriteStorage<'a, Entered>, + ReadStorage<'a, Movable>, + WriteStorage<'a, ControlCooldown> ); - fn run(&mut self, (entities, controllers, mut positions, size, blocking, mut ground, floor, mut moved, mut entered): Self::SystemData) { + fn run(&mut self, (entities, controllers, mut positions, size, blocking, mut ground, floor, mut moved, mut entered, movables, mut cooldowns): Self::SystemData) { moved.clear(); entered.clear(); - for (ent, controller, mut pos) in (&entities, &controllers, &mut positions.restrict_mut()).join(){ - match &controller.0 { + for (ent, controller, mut pos, movable) in (&entities, &controllers, &mut positions.restrict_mut(), &movables).join(){ + match &controller.control { Control::Move(direction) => { let newpos = (pos.get_unchecked().pos + direction.to_position()).clamp(Pos::new(0, 0), Pos::new(size.width - 1, size.height - 1)); let mut blocked = false; @@ -72,6 +76,7 @@ impl <'a> System<'a> for Move { for ent in ground.cells.get(&newpos).unwrap() { let _ = entered.insert(*ent, Entered); } + cooldowns.insert(ent, ControlCooldown{amount: movable.cooldown}).unwrap(); } } _ => {} diff --git a/src/systems/take.rs b/src/systems/take.rs index 99c66d5..1d139d8 100644 --- a/src/systems/take.rs +++ b/src/systems/take.rs @@ -39,7 +39,7 @@ impl <'a> System<'a> for Take { fn run(&mut self, (entities, controllers, positions, ground, mut removed, items, mut inventories, mut new, visibles): Self::SystemData) { for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ - match &controller.0 { + match &controller.control { Control::Take(rank) if inventory.items.len() < inventory.capacity => { let mut ents = ground.by_height(&position.pos, &visibles, &ent); if let Some(idx) = rank { diff --git a/src/systems/updatecooldowns.rs b/src/systems/updatecooldowns.rs new file mode 100644 index 0000000..73ca770 --- /dev/null +++ b/src/systems/updatecooldowns.rs @@ -0,0 +1,33 @@ + +use specs::{ + WriteStorage, + Entities, + System, + Join +}; + +use crate::components::ControlCooldown; + + +pub struct UpdateCooldowns; +impl <'a> System<'a> for UpdateCooldowns { + type SystemData = ( + Entities<'a>, + WriteStorage<'a, ControlCooldown> + ); + fn run(&mut self, (entities, mut cooldowns): Self::SystemData) { + let mut to_remove = Vec::new(); + for (entity, cooldown) in (&entities, &mut cooldowns).join() { + if cooldown.amount > 0 { + cooldown.amount -= 1; + } + if cooldown.amount <= 0 { + to_remove.push(entity); + } + } + for entity in to_remove { + cooldowns.remove(entity); + } + } +} + diff --git a/src/systems/useitem.rs b/src/systems/useitem.rs index 4414b39..183bd79 100644 --- a/src/systems/useitem.rs +++ b/src/systems/useitem.rs @@ -36,7 +36,7 @@ impl <'a> System<'a> for Use { fn run(&mut self, (entities, controllers, positions, mut inventories, mut new, mut attacked): Self::SystemData) { for (ent, controller, position, inventory) in (&entities, &controllers, &positions, &mut inventories).join(){ - match &controller.0 { + match &controller.control { Control::Use(rank) => { if let Some(item) = inventory.items.get(*rank) { match &item.action { -- cgit