use crate::zombies::zombie_trait::ZombieTrait;
use ggez::graphics::Image; use crate::core::resources::Resources;
use crate::zombies::normal_zombie::NormalZombie;
const INITIAL_HEALTH: i32 = 370; const NORMAL_ZOMBIE_HEALTH: i32 = 200;
const SPEED: f32 = 0.017;
const ATTACK_DAMAGE: i32 = 100;
const ATTACK_INTERVAL: u64 = 1000;
pub struct ConeheadZombie {
transformed_to_normal: bool,
normal_zombie: NormalZombie,
current_health: i32,
}
impl ConeheadZombie {
pub fn new() -> Self {
ConeheadZombie {
transformed_to_normal: false,
normal_zombie: NormalZombie::new(),
current_health: INITIAL_HEALTH,
}
}
}
impl ZombieTrait for ConeheadZombie {
fn get_initial_health(&self) -> i32 {
INITIAL_HEALTH
}
fn get_speed(&self) -> f32 {
SPEED
}
fn get_attack_damage(&self) -> i32 {
ATTACK_DAMAGE
}
fn get_attack_interval(&self) -> u64 {
ATTACK_INTERVAL
}
fn get_walk_frame_count(&self) -> usize {
if self.transformed_to_normal {
self.normal_zombie.get_walk_frame_count()
} else {
21
}
}
fn get_attack_frame_count(&self) -> usize {
if self.transformed_to_normal {
self.normal_zombie.get_attack_frame_count()
} else {
11
}
}
fn get_walk_image<'a>(&self, resources: &'a Resources, frame: usize) -> &'a Image {
if self.transformed_to_normal {
self.normal_zombie.get_walk_image(resources, frame)
} else {
let cone_walk_images = &resources.cone_zombie_walk_images;
let frame_count = cone_walk_images.len();
if frame_count > 0 {
&cone_walk_images[frame % frame_count]
} else {
self.normal_zombie.get_walk_image(resources, frame)
}
}
}
fn get_attack_image<'a>(&self, resources: &'a Resources, frame: usize) -> &'a Image {
if self.transformed_to_normal {
self.normal_zombie.get_attack_image(resources, frame)
} else {
let cone_attack_images = &resources.cone_zombie_attack_images;
let frame_count = cone_attack_images.len();
if frame_count > 0 {
&cone_attack_images[frame % frame_count]
} else {
self.normal_zombie.get_attack_image(resources, frame)
}
}
}
fn has_special_ability(&self) -> bool {
!self.transformed_to_normal
}
fn handle_damage(&mut self, damage: i32) -> bool {
if self.transformed_to_normal {
return false;
}
self.current_health -= damage;
if self.current_health <= NORMAL_ZOMBIE_HEALTH {
println!("路障僵尸的路障被打掉了,变成了普通僵尸!");
self.transformed_to_normal = true;
return true; }
false }
fn transform_health(&self) -> Option<i32> {
if self.transformed_to_normal {
Some(NORMAL_ZOMBIE_HEALTH)
} else {
None
}
}
}