X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.h;h=3ec189bbe9228b93856307516f0d7a84c3503535;hb=b524515944583916655a9f2cf1a667e55e7ed4ce;hp=33b7ac03bf9d069b85c4fef9f1d26a1302ee92ea;hpb=edfad8a1de4efa71a86f7e643a0bcc2a709a8052;p=supertux.git diff --git a/src/badguy.h b/src/badguy.h index 33b7ac03b..3ec189bbe 100644 --- a/src/badguy.h +++ b/src/badguy.h @@ -24,14 +24,21 @@ #define SUPERTUX_BADGUY_H #include "SDL.h" + +#include "utils/lispreader.h" +#include "special/timer.h" +#include "math/physic.h" #include "defines.h" -#include "bitmask.h" -#include "type.h" -#include "timer.h" -#include "texture.h" -#include "physic.h" +#include "special/moving_object.h" #include "collision.h" -#include "sprite.h" +#include "serializable.h" +#include "scene.h" + +using namespace SuperTux; + +/* Timing constants (in ms): */ + +#define KICKING_TIME 200 /* Bad guy kinds: */ enum BadGuyKind { @@ -42,22 +49,26 @@ enum BadGuyKind { BAD_STALACTITE, BAD_FLAME, BAD_FISH, + BAD_FLAMEFISH, BAD_BOUNCINGSNOWBALL, BAD_FLYINGSNOWBALL, BAD_SPIKY, BAD_SNOWBALL, - NUM_BadGuyKinds + BAD_WINGLING, + BAD_WALKINGTREE, + NUM_BadGuyKinds, + + BAD_INVALID }; BadGuyKind badguykind_from_string(const std::string& str); std::string badguykind_to_string(BadGuyKind kind); -void load_badguy_gfx(); -void free_badguy_gfx(); class Player; +class BadGuySpecs; /* Badguy type: */ -class BadGuy : public GameObject +class BadGuy : public MovingObject, public Serializable { public: /* Enemy modes: */ @@ -78,7 +89,10 @@ public: FISH_WAIT, FLY_UP, - FLY_DOWN + FLY_DOWN, + + BGM_BIG, + BGM_SMALL }; public: DyingType dying; @@ -91,25 +105,35 @@ public: bool stay_on_platform; Direction dir; + Vector start_position; + + Timer frozen_timer; // gets frozen when a ice shot hits it private: bool removable; bool seen; int squishcount; /// number of times this enemy was squiched + Vector target; // Target that badguy is aiming for (wingling uses this) Timer timer; Physic physic; + float angle; + + std::string action_left, action_right; - Sprite* sprite_left; - Sprite* sprite_right; + BadGuySpecs* specs; int animation_offset; public: - BadGuy(float x, float y, BadGuyKind kind, bool stay_on_platform); + BadGuy(BadGuyKind kind, float x, float y); + BadGuy(BadGuyKind kind, LispReader& reader); + virtual ~BadGuy(); - void action(double frame_ratio); - void draw(); - std::string type() { return "BadGuy"; }; + virtual void write(LispWriter& writer); + + virtual void action(float frame_ratio); + virtual void draw(DrawingContext& context); + virtual void collision(const MovingObject& other, int type); void collision(void* p_c_object, int c_object, CollisionType type = COLLISION_NORMAL); @@ -119,14 +143,14 @@ public: */ void kill_me(int score); - /** remove ourself from the list of badguys. WARNING! This function will - * invalidate all members. So don't do anything else with member after calling - * this. - */ - void remove_me(); - bool is_removable() const { return removable; } - + /** initializes the badguy (when he appears on screen) */ + void activate(Direction direction); // should only be used by BadGuy's objects + + Surface* get_image(); + private: + void init(); + void action_mriceblock(double frame_ratio); void action_jumpy(double frame_ratio); void action_bomb(double frame_ratio); @@ -138,13 +162,15 @@ private: void action_flyingsnowball(double frame_ratio); void action_spiky(double frame_ratio); void action_snowball(double frame_ratio); + void action_wingling(double frame_ratio); + void action_walkingtree(double frame_ratio); /** handles falling down. disables gravity calculation when we're back on * ground */ void fall(); - /** let the player jump a bit (used when you hit a badguy) */ - void make_player_jump(Player* player); + /** Turn enemy into a bomb. To explode right way pass true */ + void explode(bool right_away); /** check if we're running left or right in a wall and eventually change * direction @@ -156,23 +182,8 @@ private: void squish(Player* player); /** squish ourself, give player score and set dying to DYING_SQICHED */ void squish_me(Player* player); - /** set image of the badguy */ - void set_sprite(Sprite* left, Sprite* right); -}; - -struct BadGuyData -{ - BadGuyKind kind; - int x; - int y; - bool stay_on_platform; - - BadGuyData(BadGuy* pbadguy) : kind(pbadguy->kind), x((int)pbadguy->base.x), y((int)pbadguy->base.y), stay_on_platform(pbadguy->stay_on_platform) {}; - BadGuyData(BadGuyKind kind_, int x_, int y_, bool stay_on_platform_) - : kind(kind_), x(x_), y(y_), stay_on_platform(stay_on_platform_) {} - - BadGuyData() - : kind(BAD_SNOWBALL), x(0), y(0), stay_on_platform(false) {} + /** set sprite's action of the badguy */ + void set_action(std::string action_left, std::string action_right); }; #endif /*SUPERTUX_BADGUY_H*/