melee_combat_system.rs 1.7 KB

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