use crate::entities::pea::Pea;
use crate::plants::Plant;
use crate::zombies::Zombie;
use ggez::{Context, timer};
pub struct CollisionManager;
impl CollisionManager {
pub fn handle_pea_zombie_collision(peas: &mut Vec<Pea>, zombies: &mut Vec<Zombie>) {
let mut inactive_peas = Vec::new();
for (pea_idx, pea) in peas.iter_mut().enumerate() {
if !pea.active {
inactive_peas.push(pea_idx);
continue;
}
for zombie in zombies.iter_mut() {
if zombie.is_dying {
continue;
}
if pea.row != zombie.row {
continue;
}
if pea.x + 20.0 >= zombie.x {
let zombie_rect = zombie.get_rect();
let pea_rect = pea.get_rect();
if pea_rect.overlaps(&zombie_rect) {
zombie.take_damage(pea.damage);
pea.active = false;
inactive_peas.push(pea_idx);
break; }
}
}
}
inactive_peas.sort_by(|a, b| b.cmp(a));
for idx in inactive_peas {
peas.remove(idx);
}
zombies.retain(|zombie| !zombie.death_animation_complete);
}
pub fn handle_zombie_plant_interaction(zombies: &mut Vec<Zombie>, plants: &mut Vec<Plant>, ctx: &mut Context) {
for zombie in zombies {
if zombie.is_dying {
continue;
}
let mut is_attacking = false;
let mut target_index = None;
for (i, plant) in plants.iter_mut().enumerate() {
if plant.is_dead {
continue;
}
if zombie.has_plant_in_front(plant.grid_x, plant.grid_y) {
is_attacking = true;
target_index = Some(i);
zombie.attack_plant(&mut plant.health, timer::delta(ctx).as_millis() as u64);
if plant.health <= 0 {
plant.is_dead = true;
}
break; }
}
zombie.set_attacking(is_attacking, target_index);
}
plants.retain(|plant| !plant.is_dead);
}
}