X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.h;h=5b944457029bd2f65260da42e21e2d0e1d8011b8;hb=d46c78c842ab4090a3f46e560c891234167f124b;hp=e084571cb354a05c07784618b61ba86bb2fbb543;hpb=84160722392a024dda42bd86ca9bd85b68c49457;p=supertux.git diff --git a/src/badguy.h b/src/badguy.h index e084571cb..5b9444570 100644 --- a/src/badguy.h +++ b/src/badguy.h @@ -24,136 +24,154 @@ #define SUPERTUX_BADGUY_H #include "SDL.h" -#include "bitmask.h" -#include "type.h" + +#include "utils/lispreader.h" #include "timer.h" -#include "texture.h" -#include "physic.h" +#include "math/physic.h" +#include "defines.h" +#include "special/moving_object.h" #include "collision.h" -#include "sprite.h" - -extern Sprite* img_bsod_left; -extern Sprite* img_bsod_right; -extern Sprite* img_laptop_left; - -/* Enemy modes: */ -enum { - NORMAL=0, - FLAT, - KICK, - HELD, - - MONEY_JUMP, - - BOMB_TICKING, - BOMB_EXPLODE, - - STALACTITE_SHAKING, - STALACTITE_FALL, +#include "serializable.h" +#include "scene.h" - FISH_WAIT, +using namespace SuperTux; - FLY_UP, - FLY_DOWN -}; +/* Timing constants */ +#define KICKING_TIME .2 /* Bad guy kinds: */ enum BadGuyKind { - BAD_BSOD, - BAD_LAPTOP, - BAD_MONEY, + BAD_MRICEBLOCK, + BAD_JUMPY, BAD_MRBOMB, BAD_BOMB, BAD_STALACTITE, BAD_FLAME, BAD_FISH, + BAD_FLAMEFISH, BAD_BOUNCINGSNOWBALL, BAD_FLYINGSNOWBALL, BAD_SPIKY, - BAD_SNOWBALL + BAD_SNOWBALL, + 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(); - -struct BadGuyData -{ - BadGuyKind kind; - int x; - int y; - - BadGuyData(BadGuyKind kind_, int x_, int y_) - : kind(kind_), x(x_), y(y_) {} - BadGuyData() - : kind(BAD_BSOD), x(0), y(0) {} -}; +#if 0 class Player; +class BadGuySpecs; /* Badguy type: */ -class BadGuy +class BadGuy : public MovingObject, public Serializable { public: - DyingType dying; - base_type base; - BadGuyKind kind; - int mode; - int dir; + /* Enemy modes: */ + enum BadGuyState { + NORMAL=0, + FLAT, + KICK, + HELD, + + JUMPY_JUMP, + + BOMB_TICKING, + BOMB_EXPLODE, + + STALACTITE_SHAKING, + STALACTITE_FALL, + + FISH_WAIT, + + FLY_UP, + FLY_DOWN, + + BGM_BIG, + BGM_SMALL + }; +public: + DyingType dying; + BadGuyKind kind; + BadGuyState state; + + /** If true the enemy will stay on its current platform, ie. if he + reaches the edge he will turn around and walk into the other + direction, if false the enemy will jump or walk of the edge */ + bool stay_on_platform; + + Direction dir; + Vector start_position; + + Timer frozen_timer; // gets frozen when a ice shot hits it private: bool seen; - base_type old_base; + 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; - Sprite* sprite_left; - Sprite* sprite_right; + std::string action_left, action_right; + + BadGuySpecs* specs; int animation_offset; - size_t animation_length; - float animation_speed; public: - void init(float x, float y, BadGuyKind kind); + BadGuy(BadGuyKind kind, float x, float y); + BadGuy(BadGuyKind kind, LispReader& reader); + virtual ~BadGuy(); + + virtual void write(LispWriter& writer); - void action(float frame_ratio); - void draw(); + 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); + CollisionType type = COLLISION_NORMAL); /** this functions tries to kill the badguy and lets him fall off the * screen. Some badguys like the flame might ignore this. */ - void kill_me(); - + void kill_me(int score); + + /** 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 action_bsod(float frame_ratio); - void action_laptop(float frame_ratio); - void action_money(float frame_ratio); - void action_bomb(float frame_ratio); - void action_mrbomb(float frame_ratio); - void action_stalactite(float frame_ratio); - void action_flame(float frame_ratio); - void action_fish(float frame_ratio); - void action_bouncingsnowball(float frame_ratio); - void action_flyingsnowball(float frame_ratio); - void action_spiky(float frame_ratio); - void action_snowball(float frame_ratio); + void init(); + + void action_mriceblock(double frame_ratio); + void action_jumpy(double frame_ratio); + void action_bomb(double frame_ratio); + void action_mrbomb(double frame_ratio); + void action_stalactite(double frame_ratio); + void action_flame(double frame_ratio); + void action_fish(double frame_ratio); + void action_bouncingsnowball(double frame_ratio); + 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(); - /** 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(); - /** 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 */ @@ -164,14 +182,10 @@ 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, - int animlength = 1, float animspeed = 1); + /** set sprite's action of the badguy */ + void set_action(std::string action_left, std::string action_right); }; -#endif /*SUPERTUX_BADGUY_H*/ - -/* Local Variables: */ -/* mode:c++ */ -/* End: */ +#endif +#endif /*SUPERTUX_BADGUY_H*/