X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fbomb.cpp;h=cbc96c0a09d2b65f227ba585f5e32fb59ab9419a;hb=791b577793d178a35031a6585ebc9a73b94f299c;hp=e765869d8028f0c2cba2f27a9757327157353118;hpb=ed857c9b9d79e963b1443e30cfed9fa0bcdb1cc2;p=supertux.git diff --git a/src/badguy/bomb.cpp b/src/badguy/bomb.cpp index e765869d8..cbc96c0a0 100644 --- a/src/badguy/bomb.cpp +++ b/src/badguy/bomb.cpp @@ -20,20 +20,17 @@ #include #include "bomb.hpp" +#include "random_generator.hpp" +#include "object/explosion.hpp" -static const float TICKINGTIME = 1; -static const float EXPLOSIONTIME = 1; - -Bomb::Bomb(const Vector& pos, Direction dir) - : BadGuy(pos, "images/creatures/mr_bomb/bomb.sprite") +Bomb::Bomb(const Vector& pos, Direction dir, std::string custom_sprite /*= "images/creatures/mr_bomb/mr_bomb.sprite"*/ ) + : BadGuy( pos, dir, custom_sprite ) { state = STATE_TICKING; - timer.start(TICKINGTIME); - this->dir = dir; - sprite->set_action(dir == LEFT ? "ticking-left" : "ticking-right"); + set_action(dir == LEFT ? "ticking-left" : "ticking-right", 1); countMe = false; - ticking.reset(sound_manager->create_sound_source("sounds/ticking.wav")); + ticking.reset(sound_manager->create_sound_source("sounds/fizz.wav")); ticking->set_position(get_pos()); ticking->set_looping(true); ticking->set_gain(2.0); @@ -42,10 +39,10 @@ Bomb::Bomb(const Vector& pos, Direction dir) } Bomb::Bomb(const Bomb& other) - : BadGuy(other), state(other.state), timer(other.timer) + : BadGuy(other), state(other.state) { if (state == STATE_TICKING) { - ticking.reset(sound_manager->create_sound_source("sounds/ticking.wav")); + ticking.reset(sound_manager->create_sound_source("sounds/fizz.wav")); ticking->set_position(get_pos()); ticking->set_looping(true); ticking->set_gain(2.0); @@ -60,65 +57,48 @@ Bomb::write(lisp::Writer& ) // bombs are only temporarily so don't write them out... } -HitResponse -Bomb::collision_solid(GameObject& , const CollisionHit& hit) +void +Bomb::collision_solid(const CollisionHit& hit) { - if(fabsf(hit.normal.y) > .5) + if(hit.bottom) physic.set_velocity_y(0); - - return CONTINUE; } HitResponse -Bomb::collision_player(Player& player, const CollisionHit& ) +Bomb::collision_player(Player& , const CollisionHit& ) { - if(state == STATE_EXPLODING) { - player.kill(false); - } return ABORT_MOVE; } HitResponse -Bomb::collision_badguy(BadGuy& badguy, const CollisionHit& ) +Bomb::collision_badguy(BadGuy& , const CollisionHit& ) { - if(state == STATE_EXPLODING) - badguy.kill_fall(); return ABORT_MOVE; } void Bomb::active_update(float ) { - switch(state) { - case STATE_TICKING: - ticking->set_position(get_pos()); - if(timer.check()) { - explode(); - } - break; - case STATE_EXPLODING: - if(timer.check()) { - remove_me(); - } - break; - } + ticking->set_position(get_pos()); + if(sprite->animation_done()) { + explode(); + } } void Bomb::explode() { ticking->stop(); - state = STATE_EXPLODING; - set_group(COLGROUP_TOUCHABLE); - sprite->set_action("explosion"); - sound_manager->play("sounds/explosion.wav", get_pos()); - timer.start(EXPLOSIONTIME); + + remove_me(); + Explosion* explosion = new Explosion(get_bbox().get_middle()); + Sector::current()->add_object(explosion); + + run_dead_script(); } void Bomb::kill_fall() { - if (state != STATE_EXPLODING) // we don't want it exploding again - explode(); + explode(); } -