123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- use crate::{CombatStats, Name, SufferDamage, WantsToMelee};
- use specs::prelude::*;
- pub struct MeleeCombatSystem;
- impl<'a> System<'a> for MeleeCombatSystem {
- type SystemData = (
- Entities<'a>,
- WriteStorage<'a, WantsToMelee>,
- ReadStorage<'a, Name>,
- ReadStorage<'a, CombatStats>,
- WriteStorage<'a, SufferDamage>,
- );
- fn run(&mut self, data: Self::SystemData) {
- let (entities, mut wants_melee, names, combat_stats, mut inflict_damage) = data;
- for (_entity, wants_melee, name, stats) in
- (&entities, &wants_melee, &names, &combat_stats).join()
- {
- if stats.hp > 0 {
- let target_stats = combat_stats.get(wants_melee.target).unwrap();
- if target_stats.hp > 0 {
- let target_name = names.get(wants_melee.target).unwrap();
- let damage = i32::max(0, stats.power - target_stats.defense);
- if damage == 0 {
- rltk::console::log(&format!(
- "{} is unable to hurt {}",
- &name.name, &target_name.name
- ));
- } else {
- rltk::console::log(&format!(
- "{} hits {}, for {} hp.",
- &name.name, &target_name.name, damage
- ));
- inflict_damage
- .insert(wants_melee.target, SufferDamage { amount: damage })
- .expect("Unable to do damage");
- }
- }
- }
- }
- wants_melee.clear();
- }
- }
|