X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.h;h=7ec03e3252a984202bdc525425c6c68e97a2f8ea;hb=63934f5f4c15f059c9b60499575870ebb7c923a0;hp=07034c3c50d656a2a72ec9eb2f0d5966a72141ae;hpb=29df1d22e0057ae181a51d4aab971963fbda1dbf;p=supertux.git diff --git a/src/badguy.h b/src/badguy.h index 07034c3c5..7ec03e325 100644 --- a/src/badguy.h +++ b/src/badguy.h @@ -1,14 +1,24 @@ +// $Id$ +// +// SuperTux +// Copyright (C) 2000 Bill Kendrick +// Copyright (C) 2004 Tobias Glaesser +// Copyright (C) 2004 Matthias Braun // -// Interface: badguy -// -// Description: -// -// -// Author: Tobias Glaesser (C) 2003 -// -// Copyright: See COPYING file that comes with this distribution -// +// 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 distributed in the hope that it will be useful, +// 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. #ifndef SUPERTUX_BADGUY_H #define SUPERTUX_BADGUY_H @@ -20,69 +30,155 @@ #include "texture.h" #include "physic.h" #include "collision.h" +#include "sprite.h" -/* Enemy modes: */ -#define NORMAL 0 -#define FLAT 1 -#define KICK 2 -#define HELD 3 +extern Sprite* img_bsod_left; +extern Sprite* img_bsod_right; +extern Sprite* img_laptop_left; /* Bad guy kinds: */ enum BadGuyKind { BAD_BSOD, BAD_LAPTOP, - BAD_MONEY + BAD_MONEY, + BAD_MRBOMB, + BAD_BOMB, + BAD_STALACTITE, + BAD_FLAME, + BAD_FISH, + BAD_BOUNCINGSNOWBALL, + BAD_FLYINGSNOWBALL, + BAD_SPIKY, + BAD_SNOWBALL }; -/* Badguy type: */ -struct bad_guy_type +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 { - int mode; - DyingType dying; BadGuyKind kind; - bool seen; - int dir; - int frame; - base_type base; - base_type old_base; - timer_type timer; - physic_type physic; -}; - -extern texture_type img_bsod_squished_left; -extern texture_type img_bsod_squished_right; -extern texture_type img_bsod_falling_left; -extern texture_type img_bsod_falling_right; -extern texture_type img_laptop_flat_left; -extern texture_type img_laptop_flat_right; -extern texture_type img_laptop_falling_left; -extern texture_type img_laptop_falling_right; -extern texture_type img_bsod_left[4]; -extern texture_type img_bsod_right[4]; -extern texture_type img_laptop_left[3]; -extern texture_type img_laptop_right[3]; -extern texture_type img_money_left[2]; -extern texture_type img_money_right[2]; + int x; + int y; + bool stay_on_platform; -extern bitmask *bm_bsod; + BadGuyData(BadGuyKind kind_, int x_, int y_, bool stay_on_platform_) + : kind(kind_), x(x_), y(y_), stay_on_platform(stay_on_platform_) {} -void badguy_create_bitmasks(); + BadGuyData() + : kind(BAD_BSOD), x(0), y(0), stay_on_platform(false) {} +}; -void badguy_init(bad_guy_type* pbad, float x, float y, BadGuyKind kind); +class Player; -void badguy_action(bad_guy_type* pbad); -void badguy_draw(bad_guy_type* pbad); +/* Badguy type: */ +class BadGuy +{ +public: + /* Enemy modes: */ + enum BadGuyMode { + NORMAL=0, + FLAT, + KICK, + HELD, + + MONEY_JUMP, + + BOMB_TICKING, + BOMB_EXPLODE, + + STALACTITE_SHAKING, + STALACTITE_FALL, + + FISH_WAIT, + + FLY_UP, + FLY_DOWN + }; +public: + DyingType dying; + base_type base; + BadGuyKind kind; + BadGuyMode mode; -void badguy_action_bsod(bad_guy_type* pbad); -void badguy_action_laptop(bad_guy_type* pbad); -void badguy_action_money(bad_guy_type* pbad); + /** 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; -void badguy_draw_bsod(bad_guy_type* pbad); -void badguy_draw_laptop(bad_guy_type* pbad); -void badguy_draw_money(bad_guy_type* pbad); + Direction dir; -void badguy_collision(bad_guy_type* pbad, void* p_c_object, int c_object); +private: + bool seen; + base_type old_base; + Timer timer; + Physic physic; + + Sprite* sprite_left; + Sprite* sprite_right; + + int animation_offset; + size_t animation_length; + float animation_speed; + +public: + void init(float x, float y, BadGuyKind kind); + + void action(float frame_ratio); + void draw(); + + void collision(void* p_c_object, int c_object, + 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(); + +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); + + /** 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); + /** check if we're running left or right in a wall and eventually change + * direction + */ + void check_horizontal_bump(bool checkcliff = false); + /** called when we're bumped from below with a block */ + void bump(); + /** called when a player jumped on the badguy from above */ + 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); +}; #endif /*SUPERTUX_BADGUY_H*/ +/* Local Variables: */ +/* mode:c++ */ +/* End: */