X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.cpp;h=690e97aa589384614b3a265fda82d1a58f574c79;hb=3392b0f249cbb2d1151a145ab3a86b9389a0b36e;hp=375441415d2b57b6255b2b08c74cbed309543677;hpb=d46c78c842ab4090a3f46e560c891234167f124b;p=supertux.git diff --git a/src/badguy/badguy.cpp b/src/badguy/badguy.cpp index 375441415..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() @@ -24,8 +25,11 @@ BadGuy::draw(DrawingContext& context) return; if(state == STATE_INIT || state == STATE_INACTIVE) return; - - sprite->draw(context, get_pos(), LAYER_OBJECTS); + if(state == STATE_FALLING) { + sprite->draw(context, get_pos(), LAYER_OBJECTS, VERTICAL_FLIP); + } else { + sprite->draw(context, get_pos(), LAYER_OBJECTS); + } } void @@ -78,7 +82,7 @@ BadGuy::active_action(float elapsed_time) } void -BadGuy::inactive_action(float elapsed_time) +BadGuy::inactive_action(float ) { } @@ -94,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); @@ -115,7 +119,7 @@ BadGuy::collision(GameObject& other, const CollisionHit& hit) } HitResponse -BadGuy::collision_solid(GameObject& other, const CollisionHit& hit) +BadGuy::collision_solid(GameObject& , const CollisionHit& ) { return FORCE_MOVE; } @@ -128,21 +132,29 @@ 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; } HitResponse -BadGuy::collision_badguy(BadGuy& other, const CollisionHit& hit) +BadGuy::collision_badguy(BadGuy& , const CollisionHit& ) { return FORCE_MOVE; } bool -BadGuy::collision_squished(Player& player) +BadGuy::collision_squished(Player& ) { return false; } @@ -152,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); @@ -161,10 +174,11 @@ BadGuy::kill_squished(Player& player) void BadGuy::kill_fall() { + SoundManager::get()->play_sound(IDToSound(SND_FALL), this, + Sector::current()->player->get_pos()); physic.set_velocity_y(0); physic.enable_gravity(true); set_state(STATE_FALLING); - remove_me(); } void @@ -185,11 +199,14 @@ 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; break; + case STATE_FALLING: + flags |= FLAG_NO_COLLDET; + break; default: break; }