https://git.spwbk.site/swatson/rs-rl/raw/master/src/damage_system.rs
___________________________________
use specs::prelude::*;
use super::{CombatStats, SufferDamage, Player, GameLog, Name, RunState, Position, Map};

pub struct DamageSystem {}

impl<'a> System<'a> for DamageSystem {
   type SystemData = ( WriteStorage<'a, CombatStats>,
                       WriteStorage<'a, SufferDamage>,
                       ReadStorage<'a, Position>,
                       WriteExpect<'a, Map>,
                       Entities<'a> );

   fn run(&mut self, data : Self::SystemData) {
       let (mut stats, mut damage, positions, mut map, entities) = data;

       for (entity, mut stats, damage) in (&entities, &mut stats, &damage).join() {
           stats.hp -= damage.amount.iter().sum::<i32>();
           let pos = positions.get(entity);
           if let Some(pos) = pos {
               let idx = map.xy_idx(pos.x, pos.y);
               map.bloodstains.insert(idx);
           }
       }

       damage.clear();
   }
}

pub fn delete_the_dead(ecs : &mut World) {
   let mut dead : Vec<Entity> = Vec::new();
   // Using a scope to make the borrow checker happy
   {
       let combat_stats = ecs.read_storage::<CombatStats>();
       let players = ecs.read_storage::<Player>();
       let entities = ecs.entities();
       let names = ecs.read_storage::<Name>();
       let mut log = ecs.write_resource::<GameLog>();

       for (entity, stats) in (&entities, &combat_stats).join() {
           if stats.hp < 1 {
               let player = players.get(entity);
               match player {
                   None => {
                       let victim_name = names.get(entity);
                       if let Some(victim_name) = victim_name {
                           log.entries.push(format!("{} is dead", &victim_name.name));
                       }
                       dead.push(entity);
                   },
                   Some(_) => {
                       let mut runstate = ecs.write_resource::<RunState>();
                       *runstate = RunState::GameOver;
                   }
               }
           }
       }
   }

   for victim in dead {
       ecs.delete_entity(victim).expect("Unable to delete");
   }
}