melee_combat_system.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. use crate::{CombatStats, Name, SufferDamage, WantsToMelee};
  2. use specs::prelude::*;
  3. pub struct MeleeCombatSystem;
  4. impl<'a> System<'a> for MeleeCombatSystem {
  5. type SystemData = (
  6. Entities<'a>,
  7. WriteStorage<'a, WantsToMelee>,
  8. ReadStorage<'a, Name>,
  9. ReadStorage<'a, CombatStats>,
  10. WriteStorage<'a, SufferDamage>,
  11. );
  12. fn run(&mut self, data: Self::SystemData) {
  13. let (entities, mut wants_melee, names, combat_stats, mut inflict_damage) = data;
  14. for (_entity, wants_melee, name, stats) in
  15. (&entities, &wants_melee, &names, &combat_stats).join()
  16. {
  17. if stats.hp > 0 {
  18. let target_stats = combat_stats.get(wants_melee.target).unwrap();
  19. if target_stats.hp > 0 {
  20. let target_name = names.get(wants_melee.target).unwrap();
  21. let damage = i32::max(0, stats.power - target_stats.defense);
  22. if damage == 0 {
  23. rltk::console::log(&format!(
  24. "{} is unable to hurt {}",
  25. &name.name, &target_name.name
  26. ));
  27. } else {
  28. rltk::console::log(&format!(
  29. "{} hits {}, for {} hp.",
  30. &name.name, &target_name.name, damage
  31. ));
  32. inflict_damage
  33. .insert(wants_melee.target, SufferDamage { amount: damage })
  34. .expect("Unable to do damage");
  35. }
  36. }
  37. }
  38. }
  39. wants_melee.clear();
  40. }
  41. }