//! Impact — the base hit. Seeded as the tower's default loadout; reads the `HitContext`
//! damage accumulator so modifiers that ran earlier in the pipeline scale its damage.
use crate::{
behavior::projectile::{BehaviorPriority, HitResponse, ProjectileBehavior},
context::HitContext,
enemy::Enemy,
registry::DamageID,
world::Projectile,
};
#[derive(Clone)]
pub struct TowerBaseWeapon {
tier: u32,
base_damage: f32,
pct_bonus: f32,
damage_type: DamageID,
}
impl TowerBaseWeapon {
pub fn create(tier: u32, damage_type: DamageID) -> Box<dyn ProjectileBehavior> {
Box::new(Self {
tier,
base_damage: tier as f32,
pct_bonus: 0.01 * (tier - 1) as f32,
damage_type,
})
}
}
impl ProjectileBehavior for TowerBaseWeapon {
fn priority(&self) -> i32 {
BehaviorPriority::IMPACT
}
fn on_hit_enemy(
&mut self,
_p: &mut Projectile,
_e: &mut Enemy,
c: &mut HitContext,
) -> HitResponse {
c.damage.flat(self.damage_type, self.base_damage);
c.damage.increased(self.damage_type, self.pct_bonus);
HitResponse::PASS
}
}