- added standard copyright header to every file
[supertux.git] / src / badguy.h
1 //  $Id$
2 // 
3 //  SuperTux
4 //  Copyright (C) 2000 Bill Kendrick <bill@newbreedsoftware.com>
5 //  Copyright (C) 2004 Tobias Glaesser <tobi.web@gmx.de>
6 //  Copyright (C) 2004 Matthias Braun <matze@braunis.de>
7 //
8 //  This program is free software; you can redistribute it and/or
9 //  modify it under the terms of the GNU General Public License
10 //  as published by the Free Software Foundation; either version 2
11 //  of the License, or (at your option) any later version.
12 //
13 //  This program is distributed in the hope that it will be useful,
14 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
15 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 //  GNU General Public License for more details.
17 // 
18 //  You should have received a copy of the GNU General Public License
19 //  along with this program; if not, write to the Free Software
20 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
21 //  02111-1307, USA.
22
23 #ifndef SUPERTUX_BADGUY_H
24 #define SUPERTUX_BADGUY_H
25
26 #include "SDL.h"
27 #include "bitmask.h"
28 #include "type.h"
29 #include "timer.h"
30 #include "texture.h"
31 #include "physic.h"
32 #include "collision.h"
33 #include "sprite.h"
34
35 extern Sprite* img_bsod_left;
36 extern Sprite* img_bsod_right;
37 extern Sprite* img_laptop_left;
38
39 /* Enemy modes: */
40 enum {
41     NORMAL=0,
42     FLAT,
43     KICK,
44     HELD,
45
46     MONEY_JUMP,
47
48     BOMB_TICKING,
49     BOMB_EXPLODE,
50
51     STALACTITE_SHAKING,
52     STALACTITE_FALL,
53
54     FISH_WAIT,
55
56     FLY_UP,
57     FLY_DOWN
58 };
59
60 /* Bad guy kinds: */
61 enum BadGuyKind {
62   BAD_BSOD,
63   BAD_LAPTOP,
64   BAD_MONEY,
65   BAD_MRBOMB,
66   BAD_BOMB,
67   BAD_STALACTITE,
68   BAD_FLAME,
69   BAD_FISH,
70   BAD_BOUNCINGSNOWBALL,
71   BAD_FLYINGSNOWBALL,
72   BAD_SPIKY,
73   BAD_SNOWBALL
74 };
75
76 BadGuyKind  badguykind_from_string(const std::string& str);
77 std::string badguykind_to_string(BadGuyKind kind);
78 void load_badguy_gfx();
79 void free_badguy_gfx();
80
81 struct BadGuyData
82 {
83   BadGuyKind kind;
84   int x;
85   int y;
86
87   BadGuyData(BadGuyKind kind_, int x_, int y_) 
88     : kind(kind_), x(x_), y(y_) {}
89
90   BadGuyData()
91     : kind(BAD_BSOD), x(0), y(0) {}
92 };
93
94 class Player;
95
96 /* Badguy type: */
97 class BadGuy
98 {
99 public:
100   DyingType dying;
101   base_type base;
102   BadGuyKind kind;
103   int mode;
104   int dir;
105
106 private:
107   bool seen;
108   base_type old_base;
109   Timer timer;
110   Physic physic;
111
112   Sprite*   sprite_left;
113   Sprite*   sprite_right;
114
115   int animation_offset;
116   size_t animation_length;
117   float animation_speed;
118
119 public:
120   void init(float x, float y, BadGuyKind kind);
121
122   void action(float frame_ratio);
123   void draw();
124
125   void collision(void* p_c_object, int c_object,
126           CollisionType type = COLLISION_NORMAL);
127
128   /** this functions tries to kill the badguy and lets him fall off the
129    * screen. Some badguys like the flame might ignore this.
130    */
131   void kill_me();
132   
133 private:
134   void action_bsod(float frame_ratio);
135   void action_laptop(float frame_ratio);
136   void action_money(float frame_ratio); 
137   void action_bomb(float frame_ratio);
138   void action_mrbomb(float frame_ratio);
139   void action_stalactite(float frame_ratio);
140   void action_flame(float frame_ratio);
141   void action_fish(float frame_ratio);
142   void action_bouncingsnowball(float frame_ratio);
143   void action_flyingsnowball(float frame_ratio);
144   void action_spiky(float frame_ratio);
145   void action_snowball(float frame_ratio);
146
147   /** handles falling down. disables gravity calculation when we're back on
148    * ground */
149   void fall();
150   /** remove ourself from the list of badguys. WARNING! This function will
151    * invalidate all members. So don't do anything else with member after calling
152    * this.
153    */
154   void remove_me();  
155   /** let the player jump a bit (used when you hit a badguy) */
156   void make_player_jump(Player* player);
157   /** check if we're running left or right in a wall and eventually change
158    * direction
159    */
160   void check_horizontal_bump(bool checkcliff = false);
161   /** called when we're bumped from below with a block */
162   void bump();
163   /** called when a player jumped on the badguy from above */
164   void squish(Player* player);
165   /** squish ourself, give player score and set dying to DYING_SQICHED */
166   void squish_me(Player* player);
167   /** set image of the badguy */
168   void set_sprite(Sprite* left, Sprite* right,
169         int animlength = 1, float animspeed = 1);
170 };
171
172 #endif /*SUPERTUX_BADGUY_H*/
173
174 /* Local Variables: */
175 /* mode:c++ */
176 /* End: */
177