damage_system.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. extern crate specs;
  2. use super::{CombatStats, Player, SufferDamage};
  3. use rltk::console;
  4. use specs::prelude::*;
  5. pub struct DamageSystem;
  6. impl<'a> System<'a> for DamageSystem {
  7. type SystemData = (
  8. WriteStorage<'a, CombatStats>,
  9. WriteStorage<'a, SufferDamage>,
  10. );
  11. fn run(&mut self, data: Self::SystemData) {
  12. let (mut stats, mut damage) = data;
  13. for (mut stats, damage) in (&mut stats, &damage).join() {
  14. stats.hp -= damage.amount;
  15. }
  16. damage.clear();
  17. }
  18. }
  19. pub struct CleanupDead;
  20. impl<'a> System<'a> for CleanupDead {
  21. type SystemData = (
  22. Entities<'a>,
  23. ReadStorage<'a, CombatStats>,
  24. ReadStorage<'a, Player>,
  25. );
  26. fn run(&mut self, (entities, stats, player): Self::SystemData) {
  27. let mut dead = Vec::new();
  28. for (entity, stats) in (&entities, &stats).join() {
  29. if stats.hp < 1 {
  30. if player.contains(entity) {
  31. console::log("You are dead");
  32. } else {
  33. dead.push(entity)
  34. }
  35. }
  36. }
  37. for e in dead {
  38. entities.delete(e).expect("Unable to delete");
  39. }
  40. }
  41. }