X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.hpp;h=51521397abba69f5d83cdf64a45cc94581d95a34;hb=d84d73b701cc7fa2bd74f3490b9be1bf8b6f705a;hp=8b759df3764cedc5b300956f93aa704a7068db5e;hpb=5b7f9214cb929399f1a855ef5807018a9447d510;p=supertux.git diff --git a/src/badguy/badguy.hpp b/src/badguy/badguy.hpp index 8b759df37..51521397a 100644 --- a/src/badguy/badguy.hpp +++ b/src/badguy/badguy.hpp @@ -1,7 +1,7 @@ // $Id$ -// +// // SuperTux -// Copyright (C) 2005 Matthias Braun +// Copyright (C) 2006 Matthias Braun // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -12,19 +12,18 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -// 02111-1307, USA. +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #ifndef __BADGUY_H__ #define __BADGUY_H__ // 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,13 +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, public Serializable { public: - 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 @@ -58,14 +57,29 @@ 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); /** Set the badguy to kill/falling state, which makes him falling of the * screen (his sprite is turned upside-down) */ virtual void kill_fall(); + /** Writes out the badguy into the included lisp::Writer. Useful e.g. when + * converting an old-format level to the new format. + */ + 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; @@ -89,20 +103,20 @@ protected: }; /** 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); + /** Called when the badguy collided with a bullet */ + virtual HitResponse collision_bullet(Bullet& bullet, const CollisionHit& hit); + /** called each frame when the badguy is activated. */ virtual void active_update(float elapsed_time); /** called each frame when the badguy is not activated. */ @@ -123,13 +137,10 @@ protected: { return state; } /** - * returns a pointer to the player, try to avoid this function to avoid - * problems later when we have multiple players or no player in scripted - * sequence. + * returns a pointer to the nearest player or 0 if no player is available */ - Player* get_player(); + Player* get_nearest_player(); - Sprite* sprite; Physic physic; /// is the enemy activated @@ -139,15 +150,47 @@ protected: * after being deactivated. */ bool is_offscreen(); - + /** + * Returns true if we might soon fall at least @c height pixels. Minimum + * value for height is 1 pixel + */ + bool might_fall(int height = 1); + Vector start_position; + /** + * The direction we currently face in + */ Direction dir; + + /** + * 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. + */ + 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(); + private: void try_activate(); State state; Timer state_timer; + bool on_ground_flag; }; #endif