td

Artifact [2e944f954b]
Login

Artifact [2e944f954b]

Artifact 2e944f954b60a9c5bebdd92d5ad6a5ae52ca23c4e0d4e51a04fdd6b0c6ce2a53:


//! The `EnemyBehavior` trait and its on-death dispatch runner. The `Enemy` entity lives in
//! `crate::enemy`.

use crate::{
    behavior::{dyn_clone_trait, projectile::BehaviorPriority},
    context::{DeathContext, TickContext},
    enemy::Enemy,
};

pub trait EnemyBehavior: EnemyClone + Send + Sync {
    fn on_death(&mut self, _e: &mut Enemy, _c: &mut DeathContext) {}
    fn on_tick(&mut self, _e: &mut Enemy, _c: &mut TickContext) {}
    fn priority(&mut self) -> i32 {
        BehaviorPriority::DEFAULT
    }
}

dyn_clone_trait!(EnemyClone, EnemyBehavior);

pub fn dispatch_death(e: &mut Enemy, c: &mut DeathContext) {
    let mut behaviors = std::mem::take(&mut e.behaviors);
    for b in behaviors.iter_mut() {
        b.on_death(e, c);
    }
    e.behaviors = behaviors;
}

pub fn dispatch_enemy_tick(e: &mut Enemy, c: &mut TickContext) {
    let mut behaviors = std::mem::take(&mut e.behaviors);
    for b in behaviors.iter_mut() {
        b.on_tick(e, c);
    }
    e.behaviors = behaviors
}