damage_system.rs 1.2 KB

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