//! The `TowerBehavior` trait (TP tower modifications). The `Tower` entity lives in
//! `crate::tower`.
use crate::{
behavior::{dyn_clone_trait, projectile::HitResponse},
context::{ExpireContext, FireContext, HitContext, TickContext},
enemy::Enemy,
world::Projectile,
};
pub trait TowerBehavior: TowerClone + Send + Sync {
// spawn-shaping: runs once at fire time, can add/modify shots
fn on_fire(&self, _shots: &mut Vec<Projectile>, _ctx: &FireContext) {}
// per-projectile events: &mut self so a behavior carries its own counter
fn on_hit_enemy(
&mut self,
_p: &mut Projectile,
_e: &mut Enemy,
_c: &mut HitContext,
) -> HitResponse {
HitResponse::PASS
}
fn on_hit_wall(&mut self, _p: &mut Projectile, _c: &mut HitContext) -> HitResponse {
HitResponse::PASS
}
fn on_tick(&mut self, _p: &mut Projectile, _c: &mut TickContext) {}
fn on_expire(&mut self, _p: &mut Projectile, _c: &mut ExpireContext) {}
}
dyn_clone_trait!(TowerClone, TowerBehavior);