X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.cpp;h=690e97aa589384614b3a265fda82d1a58f574c79;hb=e80ffba71dffb1c5a98abb1ffb2014d6bf703263;hp=b075dd1f542fecb07095c3326488346be9e1d10e;hpb=a705cb038b55f5d7634c646c134abaa7d16aee2b;p=supertux.git diff --git a/src/badguy/badguy.cpp b/src/badguy/badguy.cpp index b075dd1f5..690e97aa5 100644 --- a/src/badguy/badguy.cpp +++ b/src/badguy/badguy.cpp @@ -1,7 +1,7 @@ #include #include "badguy.h" -#include "camera.h" +#include "object/camera.h" static const float SQUISH_TIME = 2; static const float X_OFFSCREEN_DISTANCE = 1600; @@ -10,6 +10,7 @@ static const float Y_OFFSCREEN_DISTANCE = 1200; BadGuy::BadGuy() : sprite(0), dir(LEFT), state(STATE_INIT) { + hitpoints = 1; } BadGuy::~BadGuy() @@ -97,7 +98,7 @@ BadGuy::collision(GameObject& other, const CollisionHit& hit) return collision_solid(other, hit); BadGuy* badguy = dynamic_cast (&other); - if(badguy) + if(badguy && badguy->state == STATE_ACTIVE) return collision_badguy(*badguy, hit); Player* player = dynamic_cast (&other); @@ -131,8 +132,16 @@ BadGuy::collision_player(Player& player, const CollisionHit& hit) return ABORT_MOVE; } if(hit.normal.y > .9) { + //TODO: fix inaccuracy (tux sometimes dies even if badguy was hit) + // give badguys some invincible time (prevent them from being hit multiple times) + // use hitpoints also when hit by fireball or invincible tux + hitpoints--; if(collision_squished(player)) return ABORT_MOVE; + else if (hitpoints <= 0) { + player.kill(Player::SHRINK); + return FORCE_MOVE; + } } player.kill(Player::SHRINK); return FORCE_MOVE; @@ -155,6 +164,7 @@ BadGuy::kill_squished(Player& player) { SoundManager::get()->play_sound(IDToSound(SND_SQUISH), get_pos(), player.get_pos()); + physic.enable_gravity(true); physic.set_velocity_x(0); physic.set_velocity_y(0); set_state(STATE_SQUISHED); @@ -189,7 +199,7 @@ BadGuy::set_state(State state) break; case STATE_INACTIVE: // was the badguy dead anyway? - if(laststate == STATE_SQUISHED || laststate == STATE_SQUISHED) { + if(laststate == STATE_SQUISHED || laststate == STATE_FALLING) { remove_me(); } flags |= FLAG_NO_COLLDET;