X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.hpp;h=a6f0197979ff0115b83d8fe43496b52118cbaf04;hb=4587bd9c8fc5cbb20f1e442de76bc06571ab56ba;hp=e9f68333b5092bd5a734a6764a4a5abc1f763a0f;hpb=58eb3364f724b2100859fd39da9bba5a9a09cafc;p=supertux.git diff --git a/src/badguy/badguy.hpp b/src/badguy/badguy.hpp index e9f68333b..a6f019797 100644 --- a/src/badguy/badguy.hpp +++ b/src/badguy/badguy.hpp @@ -23,8 +23,7 @@ // moved them here to make it less typing when implementing new badguys #include #include "timer.hpp" -#include "moving_object.hpp" -#include "sprite/sprite.hpp" +#include "object/moving_sprite.hpp" #include "physic.hpp" #include "object/player.hpp" #include "serializable.hpp" @@ -38,14 +37,13 @@ #include "video/drawing_context.hpp" #include "audio/sound_manager.hpp" #include "audio/sound_source.hpp" -#include "sprite/sprite_manager.hpp" -class BadGuy : public MovingObject, public Serializable +class BadGuy : public MovingSprite, protected UsesPhysic, public Serializable { public: - BadGuy(); - BadGuy(const BadGuy& badguy); - ~BadGuy(); + BadGuy(const Vector& pos, const std::string& sprite_name, int layer = LAYER_OBJECTS); + BadGuy(const Vector& pos, Direction direction, const std::string& sprite_name, int layer = LAYER_OBJECTS); + BadGuy(const lisp::Lisp& reader, const std::string& sprite_name, int layer = LAYER_OBJECTS); /** Called when the badguy is drawn. The default implementation simply draws * the badguy sprite on screen @@ -59,8 +57,7 @@ public: * implemetnation calls collision_player, collision_solid, collision_badguy * and collision_squished */ - virtual HitResponse collision(GameObject& other, - const CollisionHit& hit); + virtual HitResponse collision(GameObject& other, const CollisionHit& hit); /** Called when a collision with tile with special attributes occured */ virtual void collision_tile(uint32_t tile_attributes); @@ -75,6 +72,14 @@ public: */ virtual void save(lisp::Writer& writer); + /** + * True if this badguy can break bricks or open bonusblocks in his current form. + */ + virtual bool can_break() + { + return false; + } + Vector get_start_position() const { return start_position; @@ -83,12 +88,44 @@ public: { start_position = vec; } - + /** Count this badguy to the statistics? This value should not be changed * during runtime. */ bool countMe; - virtual BadGuy* clone() const = 0; + /** + * Called when hit by a fire bullet, and is_flammable() returns true + */ + virtual void ignite(); + + /** + * Called to revert a badguy when is_ignited() returns true + */ + virtual void extinguish(); + + /** + * Returns whether to call ignite() when a badguy gets hit by a fire bullet + */ + virtual bool is_flammable() const; + + /** + * Returns whether this badguys is currently on fire + */ + bool is_ignited() const; + + /** + * Called when hit by an ice bullet, and is_freezable() returns true. + */ + virtual void freeze(); + + /** + * Called to unfreeze the badguy. + */ + virtual void unfreeze(); + + virtual bool is_freezable() const; + + bool is_frozen() const; protected: enum State { @@ -98,25 +135,21 @@ protected: STATE_SQUISHED, STATE_FALLING }; - + /** Called when the badguy collided with a player */ - virtual HitResponse collision_player(Player& player, - const CollisionHit& hit); + virtual HitResponse collision_player(Player& player, const CollisionHit& hit); /** Called when the badguy collided with solid ground */ - virtual HitResponse collision_solid(GameObject& other, - const CollisionHit& hit); + virtual void collision_solid(const CollisionHit& hit); /** Called when the badguy collided with another badguy */ - virtual HitResponse collision_badguy(BadGuy& other, - const CollisionHit& hit); - + virtual HitResponse collision_badguy(BadGuy& other, const CollisionHit& hit); + /** Called when the player hit the badguy from above. You should return true * if the badguy was squished, false if squishing wasn't possible */ - virtual bool collision_squished(Player& player); + virtual bool collision_squished(GameObject& object); /** Called when the badguy collided with a bullet */ - virtual HitResponse collision_bullet(Bullet& bullet, - const CollisionHit& hit); + virtual HitResponse collision_bullet(Bullet& bullet, const CollisionHit& hit); /** called each frame when the badguy is activated. */ virtual void active_update(float elapsed_time); @@ -131,19 +164,16 @@ protected: /** called when the badguy has been deactivated */ virtual void deactivate(); - void kill_squished(Player& player); + void kill_squished(GameObject& object); void set_state(State state); State get_state() const { return state; } - + /** * returns a pointer to the nearest player or 0 if no player is available */ Player* get_nearest_player(); - - Sprite* sprite; - Physic physic; /// is the enemy activated bool activated; @@ -160,20 +190,52 @@ protected: Vector start_position; + /** + * The direction we currently face in + */ Direction dir; /** - * z-position at which to draw the sprite. - * e.g. LAYER_OBJECTS, LAYER_OBJECTS - 1, LAYER_FLOATINGOBJECTS + * The direction we initially faced in + */ + Direction start_dir; + + /** + * Get Direction from String. + */ + Direction str2dir( std::string dir_str ); + + /** + * Update on_ground_flag judging by solid collision @c hit. + * This gets called from the base implementation of collision_solid, so call this when overriding collision_solid's default behaviour. */ - int layer; + void update_on_ground_flag(const CollisionHit& hit); + + /** + * Returns true if we touched ground in the past frame + * This only works if update_on_ground_flag() gets called in collision_solid. + */ + bool on_ground(); + + /** + * Returns floor normal stored the last time when update_on_ground_flag was called and we touched something solid from above. + */ + Vector get_floor_normal(); + + bool frozen; + bool ignited; /**< true if this badguy is currently on fire */ + + std::string dead_script; /**< script to execute when badguy is killed */ + bool draw_dead_script_hint; /**< whether to draw a visual indication that this Badguy triggers a script */ private: void try_activate(); - + State state; Timer state_timer; + bool on_ground_flag; /**< true if we touched something solid from above and update_on_ground_flag was called last frame */ + Vector floor_normal; /**< floor normal stored the last time when update_on_ground_flag was called and we touched something solid from above */ + }; #endif -