Haywire::Haywire(const Reader& reader) :
WalkingBadguy(reader, "images/creatures/haywire/haywire.sprite", "left", "right"),
is_exploding(false),
- is_stunned(false)
+ time_until_explosion(0.0f),
+ is_stunned(false),
+ time_stunned(0.0f),
+ ticking(),
+ grunting()
{
walk_speed = 80;
max_drop_height = 16;
sprite = sprite_manager->create( sprite_name );
}
-/* Haywire created by a dispenser always gets default sprite atm.*/
-Haywire::Haywire(const Vector& pos, Direction d) :
- WalkingBadguy(pos, d, "images/creatures/haywire/haywire.sprite", "left", "right"),
- is_exploding(false),
- is_stunned(false)
-{
- walk_speed = 80;
- max_drop_height = 16;
- sound_manager->preload("sounds/explosion.wav");
-}
-
HitResponse
Haywire::collision(GameObject& object, const CollisionHit& hit)
{
}
if (is_stunned) {
- player->bounce (*this);
+ if (player)
+ player->bounce (*this);
return true;
}
+
+ if(WalkingBadguy::is_frozen()) {
+ WalkingBadguy::unfreeze();
+ }
if (!is_exploding) {
set_action ((dir == LEFT) ? "ticking-left" : "ticking-right", /* loops = */ -1);
set_walk_speed (160);
time_until_explosion = TIME_EXPLOSION;
is_exploding = true;
+
+ ticking.reset(sound_manager->create_sound_source("sounds/fizz.wav"));
+ ticking->set_position(get_pos());
+ ticking->set_looping(true);
+ ticking->set_reference_distance(32);
+ ticking->play();
+ grunting.reset(sound_manager->create_sound_source("sounds/grunts.ogg"));
+ grunting->set_position(get_pos());
+ grunting->set_looping(true);
+ grunting->set_reference_distance(32);
+ grunting->play();
}
time_stunned = TIME_STUNNED;
is_stunned = true;
+ physic.set_velocity_x (0.0);
+ physic.set_acceleration_x (0.0);
+
+ if (player)
+ player->bounce (*this);
- player->bounce (*this);
return true;
}
Haywire::active_update(float elapsed_time)
{
if (is_exploding) {
+ ticking->set_position(get_pos());
+ grunting->set_position(get_pos());
if (elapsed_time >= time_until_explosion) {
kill_fall ();
return;
}
}
- if (is_exploding && !turn_around_timer.started()) {
- Player *p = Sector::current()->get_nearest_player (this->get_bbox ());
+ if (is_exploding) {
+ Player *p = this->get_nearest_player ();
+ float target_velocity = 0.0;
if (p) {
- Direction player_dir = LEFT;
-
+ /* Player is on the right */
if (p->get_pos ().x > this->get_pos ().x)
- player_dir = RIGHT;
+ target_velocity = walk_speed;
+ else /* player in on the left */
+ target_velocity = (-1.0) * walk_speed;
+ } /* if (player) */
- if (player_dir != dir)
- turn_around ();
- }
+ WalkingBadguy::active_update(elapsed_time, target_velocity);
+ }
+ else {
+ WalkingBadguy::active_update(elapsed_time);
}
-
- WalkingBadguy::active_update(elapsed_time);
}
void
Haywire::kill_fall()
{
+ if(is_exploding) {
+ ticking->stop();
+ grunting->stop();
+ }
if(is_valid()) {
remove_me();
Explosion* explosion = new Explosion(get_bbox().get_middle());
run_dead_script();
}
-void
-Haywire::freeze()
-{
- WalkingBadguy::freeze();
- sprite->set_action(dir == LEFT ? "iced-left" : "iced-right");
-}
-
bool
Haywire::is_freezable() const
{