X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fbadguy%2Fbadguy.hpp;h=092ff54c84099338cbf7d4bdc733e58d9e4d7732;hb=092556fd403b1464402c741f949c48f04f628ee8;hp=a6f0197979ff0115b83d8fe43496b52118cbaf04;hpb=4587bd9c8fc5cbb20f1e442de76bc06571ab56ba;p=supertux.git diff --git a/src/badguy/badguy.hpp b/src/badguy/badguy.hpp index a6f019797..092ff54c8 100644 --- a/src/badguy/badguy.hpp +++ b/src/badguy/badguy.hpp @@ -1,12 +1,10 @@ -// $Id$ -// // SuperTux // 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 -// as published by the Free Software Foundation; either version 2 -// of the License, or (at your option) any later version. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -14,67 +12,53 @@ // 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. +// along with this program. If not, see . -#ifndef __BADGUY_H__ -#define __BADGUY_H__ +#ifndef HEADER_SUPERTUX_BADGUY_BADGUY_HPP +#define HEADER_SUPERTUX_BADGUY_BADGUY_HPP -// moved them here to make it less typing when implementing new badguys -#include -#include "timer.hpp" #include "object/moving_sprite.hpp" -#include "physic.hpp" -#include "object/player.hpp" -#include "serializable.hpp" -#include "resources.hpp" -#include "sector.hpp" -#include "direction.hpp" -#include "object_factory.hpp" -#include "lisp/parser.hpp" -#include "lisp/lisp.hpp" -#include "lisp/writer.hpp" -#include "video/drawing_context.hpp" -#include "audio/sound_manager.hpp" -#include "audio/sound_source.hpp" - -class BadGuy : public MovingSprite, protected UsesPhysic, public Serializable +#include "supertux/direction.hpp" +#include "supertux/physic.hpp" +#include "supertux/timer.hpp" + +class Player; +class Bullet; + +/** Base class for moving sprites that can hurt the Player. */ +class BadGuy : public MovingSprite { public: 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); + BadGuy(const Reader& 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 - */ + /** Called when the badguy is drawn. The default implementation + simply draws the badguy sprite on screen */ virtual void draw(DrawingContext& context); - /** Called each frame. The default implementation checks badguy state and - * calls active_update and inactive_update - */ + + /** Called each frame. The default implementation checks badguy + state and calls active_update and inactive_update */ virtual void update(float elapsed_time); - /** Called when a collision with another object occured. The default - * implemetnation calls collision_player, collision_solid, collision_badguy - * and collision_squished - */ + + /** Called when a collision with another object occurred. The + default implementation calls collision_player, collision_solid, + collision_badguy and collision_squished */ virtual HitResponse collision(GameObject& other, const CollisionHit& hit); - /** Called when a collision with tile with special attributes occured */ + /** Called when a collision with tile with special attributes + occurred */ 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) - */ + /** 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); + /** Call this, if you use custom kill_fall() or kill_squashed(GameObject& object) */ + virtual void run_dead_script(); - /** - * True if this badguy can break bricks or open bonusblocks in his current form. - */ + /** True if this badguy can break bricks or open bonusblocks in his + current form. */ virtual bool can_break() { return false; @@ -84,49 +68,36 @@ public: { return start_position; } + void set_start_position(const Vector& vec) { start_position = vec; } - /** Count this badguy to the statistics? This value should not be changed - * during runtime. */ - bool countMe; - - /** - * Called when hit by a fire bullet, and is_flammable() returns true - */ + /** 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 - */ + /** 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 - */ + /** 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 - */ + + /** Returns whether this badguys is currently on fire */ bool is_ignited() const; - /** - * Called when hit by an ice bullet, and is_freezable() returns true. - */ + /** Called when hit by an ice bullet, and is_freezable() returns true. */ virtual void freeze(); - /** - * Called to unfreeze the badguy. - */ + /** Called to unfreeze the badguy. */ virtual void unfreeze(); virtual bool is_freezable() const; bool is_frozen() const; + bool is_in_water() const; + protected: enum State { STATE_INIT, @@ -136,16 +107,19 @@ protected: STATE_FALLING }; +protected: /** Called when the badguy collided with a player */ virtual HitResponse collision_player(Player& player, const CollisionHit& hit); + /** Called when the badguy collided with solid ground */ virtual void collision_solid(const CollisionHit& hit); + /** Called when the badguy collided with another badguy */ 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 - */ + /** 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(GameObject& object); /** Called when the badguy collided with a bullet */ @@ -153,14 +127,18 @@ protected: /** called each frame when the badguy is activated. */ virtual void active_update(float elapsed_time); + /** called each frame when the badguy is not activated. */ virtual void inactive_update(float elapsed_time); - /** - * called when the badguy has been activated. (As a side effect the dir - * variable might have been changed so that it faces towards the player. - */ + /** called immediately before the first call to initialize */ + virtual void initialize(); + + /** called when the badguy has been activated. (As a side effect the + dir variable might have been changed so that it faces towards + the player. */ virtual void activate(); + /** called when the badguy has been deactivated */ virtual void deactivate(); @@ -170,72 +148,101 @@ protected: State get_state() const { return state; } - /** - * returns a pointer to the nearest player or 0 if no player is available - */ + bool check_state_timer() { + return state_timer.check(); + } + + /** returns a pointer to the nearest player or 0 if no player is available */ Player* get_nearest_player(); - /// is the enemy activated - bool activated; - /** - * initial position of the enemy. Also the position where enemy respawns when - * after being deactivated. - */ + /** initial position of the enemy. Also the position where enemy + respawns when 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; + /** 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); - /** - * Get Direction from String. - */ + /** 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. - */ + /** 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. - */ + /** 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. - */ + /** 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(); + /** Returns true if we were in STATE_ACTIVE at the beginning of the + last call to update() */ + bool is_active(); + + /** changes colgroup_active. Also calls set_group when badguy is in STATE_ACTIVE */ + void set_colgroup_active(CollisionGroup group); + +private: + void try_activate(); + +protected: + Physic physic; + +public: + /** Count this badguy to the statistics? This value should not be + changed during runtime. */ + bool countMe; + +protected: + /** true if initialize() has already been called */ + bool is_initialized; + + Vector start_position; + + /** The direction we currently face in */ + Direction dir; + + /** The direction we initially faced in */ + Direction start_dir; + bool frozen; bool ignited; /**< true if this badguy is currently on fire */ - + bool in_water; /** < true if the badguy is currently in water */ + 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; + + /** true if state was STATE_ACTIVE at the beginning of the last call + to update() */ + bool is_active_flag; + 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 */ + /** true if we touched something solid from above and + update_on_ground_flag was called last frame */ + bool on_ground_flag; + + /** floor normal stored the last time when update_on_ground_flag was + called and we touched something solid from above */ + Vector floor_normal; + + /** CollisionGroup the badguy should be in while active */ + CollisionGroup colgroup_active; + +private: + BadGuy(const BadGuy&); + BadGuy& operator=(const BadGuy&); }; #endif + +/* EOF */