X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fkugelblitz.cpp;h=94be0586410866d2090203f6a9ac2e61edf7d2a9;hb=9890da50f82d286c67e72feefcc423d1bc9076c3;hp=485cd745051e50a3631a7987cc2ebf589d0dcb20;hpb=b082ae906660850212f258bfc4edce5b49029212;p=supertux.git diff --git a/src/badguy/kugelblitz.cpp b/src/badguy/kugelblitz.cpp index 485cd7450..94be05864 100644 --- a/src/badguy/kugelblitz.cpp +++ b/src/badguy/kugelblitz.cpp @@ -20,20 +20,23 @@ #include #include "kugelblitz.hpp" +#include "object/tilemap.hpp" +#include "tile.hpp" -static const float JUMPSPEED=600; -static const float Kugelblitz_MID_TOLERANCE=4; -static const float Kugelblitz_LOW_TOLERANCE=2; +#define LIFETIME 5 +#define MOVETIME 0.75 +#define BASE_SPEED 200 +#define RAND_SPEED 150 Kugelblitz::Kugelblitz(const lisp::Lisp& reader) : groundhit_pos_set(false) { reader.get("x", start_position.x); start_position.y = 0; //place above visible area - bbox.set_size(63.8, 127.8); + bbox.set_size(63.8, 63.8); sprite = sprite_manager->create("kugelblitz"); sprite->set_action("falling"); - physic.enable_gravity(true); + physic.enable_gravity(false); } void @@ -51,6 +54,9 @@ void Kugelblitz::activate() { physic.set_velocity_y(-300); + physic.set_velocity_x(-20); //fall a little to the left + direction = 1; + dying = false; } HitResponse @@ -60,8 +66,31 @@ Kugelblitz::collision_solid(GameObject& , const CollisionHit& chit) } HitResponse +Kugelblitz::collision_player(Player& player, const CollisionHit& ) +{ + if(player.is_invincible()) { + explode(); + return ABORT_MOVE; + } + // hit from above? + if(player.get_movement().y - get_movement().y > 0 && player.get_bbox().p2.y < + (get_bbox().p1.y + get_bbox().p2.y) / 2) { + // if it's not is it possible to squish us, then this will hurt + if(!collision_squished(player)) + player.kill(Player::SHRINK); + explode(); + return FORCE_MOVE; + } + player.kill(Player::SHRINK); + explode(); + return FORCE_MOVE; +} + +HitResponse Kugelblitz::collision_badguy(BadGuy& other , const CollisionHit& chit) { + //Let the Kugelblitz explode, too? The problem with that is that + //two Kugelblitzes would cancel each other out on contact... other.kill_fall(); return hit(chit); } @@ -76,10 +105,14 @@ Kugelblitz::hit(const CollisionHit& chit) pos_groundhit = get_pos(); groundhit_pos_set = true; } - bbox.set_size(63.8, 63.8); sprite->set_action("flying"); physic.set_velocity_y(0); - physic.set_velocity_x(100); + //Set random initial speed and direction + if ((rand() % 2) == 1) direction = 1; else direction = -1; + int speed = (BASE_SPEED + (rand() % RAND_SPEED)) * direction; + physic.set_velocity_x(speed); + movement_timer.start(MOVETIME); + lifetime.start(LIFETIME); } else if(chit.normal.y < .5) { // bumped on roof physic.set_velocity_y(0); @@ -91,7 +124,42 @@ Kugelblitz::hit(const CollisionHit& chit) void Kugelblitz::active_update(float elapsed_time) { - BadGuy::active_update(elapsed_time); + if (lifetime.check()) { + explode(); + } + else { + if (groundhit_pos_set) { + if (movement_timer.check()) { + if (direction == 1) direction = -1; else direction = 1; + int speed = (BASE_SPEED + (rand() % RAND_SPEED)) * direction; + physic.set_velocity_x(speed); + movement_timer.start(MOVETIME); + } + } + if (Sector::current()->solids->get_tile_at(get_pos())->getAttributes() == 16) { + //HIT WATER + Sector::current()->add_object(new Electrifier(75,1421,1.5)); + Sector::current()->add_object(new Electrifier(76,1422,1.5)); + explode(); + } + } + BadGuy::active_update(elapsed_time); +} + +void +Kugelblitz::kill_fall() +{ +} + +void +Kugelblitz::explode() +{ + if (!dying) { + sprite->set_action("pop"); + lifetime.start(0.2); + dying = true; + } + else remove_me(); } IMPLEMENT_FACTORY(Kugelblitz, "kugelblitz")