X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.cpp;h=690e97aa589384614b3a265fda82d1a58f574c79;hb=3392b0f249cbb2d1151a145ab3a86b9389a0b36e;hp=25825a4c3767e819aa41855ce9d0ac6a5458aaac;hpb=6f801c22d97251799740317fb1d0caf2e744b321;p=supertux.git diff --git a/src/badguy/badguy.cpp b/src/badguy/badguy.cpp index 25825a4c3..690e97aa5 100644 --- a/src/badguy/badguy.cpp +++ b/src/badguy/badguy.cpp @@ -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;