X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fbadguy.h;h=5b944457029bd2f65260da42e21e2d0e1d8011b8;hb=d46c78c842ab4090a3f46e560c891234167f124b;hp=71cf4d19fa498643a13193d868d558eee07efc8e;hpb=09473c383d4fe5c5e2634e64cc857cf39f0130bd;p=supertux.git diff --git a/src/badguy.h b/src/badguy.h index 71cf4d19f..5b9444570 100644 --- a/src/badguy.h +++ b/src/badguy.h @@ -1,132 +1,191 @@ +// $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 #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 "serializable.h" +#include "scene.h" + +using namespace SuperTux; + +/* Timing constants */ +#define KICKING_TIME .2 + +/* Bad guy kinds: */ +enum BadGuyKind { + 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_WINGLING, + BAD_WALKINGTREE, + NUM_BadGuyKinds, + + BAD_INVALID +}; -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_money_left[2]; +BadGuyKind badguykind_from_string(const std::string& str); +std::string badguykind_to_string(BadGuyKind kind); -/* Enemy modes: */ -enum { +#if 0 + +class Player; +class BadGuySpecs; + +/* Badguy type: */ +class BadGuy : public MovingObject, public Serializable +{ +public: + /* Enemy modes: */ + enum BadGuyState { NORMAL=0, FLAT, KICK, HELD, - MONEY_JUMP, + JUMPY_JUMP, BOMB_TICKING, BOMB_EXPLODE, STALACTITE_SHAKING, - STALACTITE_FALL -}; + STALACTITE_FALL, -/* Bad guy kinds: */ -enum BadGuyKind { - BAD_BSOD, - BAD_LAPTOP, - BAD_MONEY, - BAD_MRBOMB, - BAD_BOMB, - BAD_STALACTITE, - BAD_FLAME -}; + FISH_WAIT, -BadGuyKind badguykind_from_string(const std::string& str); -std::string badguykind_to_string(BadGuyKind kind); -void load_badguy_gfx(); -void free_badguy_gfx(); + FLY_UP, + FLY_DOWN, -struct BadGuyData -{ - BadGuyKind kind; - int x; - int y; + BGM_BIG, + BGM_SMALL + }; +public: + DyingType dying; + BadGuyKind kind; + BadGuyState state; - BadGuyData(BadGuyKind kind_, int x_, int y_) - : kind(kind_), x(x_), y(y_) {} + /** 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; - BadGuyData() - : kind(BAD_BSOD), x(0), y(0) {} -}; + Direction dir; + Vector start_position; -class Player; + Timer frozen_timer; // gets frozen when a ice shot hits it -/* Badguy type: */ -class BadGuy -{ - public: - int mode; - DyingType dying; - BadGuyKind kind; +private: bool seen; - int dir; - base_type base; - base_type old_base; - timer_type timer; - physic_type physic; + 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; - public: - void init(float x, float y, BadGuyKind kind); + std::string action_left, action_right; - void action(); - void draw(); + BadGuySpecs* specs; - void collision(void* p_c_object, int c_object, - CollisionType type = COLLISION_NORMAL); - - private: - void fall(bool dojump=false); - void remove_me(); + int animation_offset; - void action_bsod(); - void draw_bsod(); +public: + BadGuy(BadGuyKind kind, float x, float y); + BadGuy(BadGuyKind kind, LispReader& reader); + virtual ~BadGuy(); - void action_laptop(); - void draw_laptop(); - - void action_money(); - void draw_money(); + virtual void write(LispWriter& writer); - void action_bomb(); - void draw_bomb(); + virtual void action(float frame_ratio); + virtual void draw(DrawingContext& context); + virtual void collision(const MovingObject& other, int type); - void action_mrbomb(); - void draw_mrbomb(); + void collision(void* p_c_object, int c_object, + CollisionType type = COLLISION_NORMAL); - void action_stalactite(); - void draw_stalactite(); + /** 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(int score); - void action_flame(); - void draw_flame(); + /** initializes the badguy (when he appears on screen) */ + void activate(Direction direction); // should only be used by BadGuy's objects - void make_player_jump(Player* player); + Surface* get_image(); + +private: + 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(); + + /** 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 + */ void check_horizontal_bump(bool checkcliff = false); + /** called when we're bumped from below with a block */ void bump(); - void squich(Player* player); + /** 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 sprite's action of the badguy */ + void set_action(std::string action_left, std::string action_right); }; -#endif /*SUPERTUX_BADGUY_H*/ - +#endif +#endif /*SUPERTUX_BADGUY_H*/