td

impact.rs at [1c4f2f89eb]
Login

impact.rs at [1c4f2f89eb]

File src/weapons/impact.rs artifact 429bd96cce part of check-in 1c4f2f89eb


//! 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
    }
}