1 #pragma once
2 // Description:
3 //   All kinds of particles.
4 //
5 // Copyright (C) 2008 Frank Becker
6 //
7 // This program is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU General Public License as published by the Free Software
9 // Foundation;  either version 2 of the License,  or (at your option) any  later
10 // version.
11 //
12 // This program is distributed in the hope that it will be useful,  but  WITHOUT
13 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
15 //
16 
17 #include <string>
18 
19 #include <Point.hpp>
20 #include <GLBitmapFont.hpp>
21 #include <Model.hpp>
22 #include <ParticleType.hpp>
23 #include <BezierCurve.hpp>
24 
25 class Particles
26 {
27 public:
28     static void Initialize( void);
29 };
30 
31 class BitmapParticleType: public ParticleType
32 {
33 public:
34     BitmapParticleType( const std::string &name);
35     virtual ~BitmapParticleType();
36 
37     virtual void init( ParticleInfo *p) = 0;
38     virtual bool update( ParticleInfo *p) = 0;
39     virtual void draw( ParticleInfo *p) = 0;
40 
bindTexture(void)41     static void bindTexture( void) { _bitmaps->bind();}
42 
43 protected:
44     static GLBitmapCollection *_bitmaps;
45     void LoadBitmaps( void);
46 };
47 
48 class SingleBitmapParticle: public BitmapParticleType
49 {
50 public:
51     SingleBitmapParticle( const std::string &name, const char *bitmapName);
52 
53 protected:
54     float _bmHalfWidth;
55     float _bmHalfHeight;
56     float _radius;
57 
58     int _bmIndex;
59 };
60 
61 class SmokePuff: public SingleBitmapParticle
62 {
63 public:
64     SmokePuff( void);
65     virtual ~SmokePuff();
66 
67     virtual void init( ParticleInfo *p);
68     virtual bool update( ParticleInfo *p);
69     virtual void draw( ParticleInfo *p);
70 
71 private:
72 };
73 
74 class MiniSmoke: public SingleBitmapParticle
75 {
76 public:
77     MiniSmoke( void);
78     virtual ~MiniSmoke();
79 
80     virtual void init( ParticleInfo *p);
81     virtual bool update( ParticleInfo *p);
82     virtual void draw( ParticleInfo *p);
83 
84 private:
85 };
86 
87 class Spark: public SingleBitmapParticle
88 {
89 public:
90     Spark( void);
91     virtual ~Spark();
92 
93     virtual void init( ParticleInfo *p);
94     virtual bool update( ParticleInfo *p);
95     virtual void draw( ParticleInfo *p);
96 
97 private:
98 };
99 
100 class FireSpark: public SingleBitmapParticle
101 {
102 public:
103     FireSpark( const string &sp);
104     virtual ~FireSpark();
105 
106     virtual void init( ParticleInfo *p);
107     virtual bool update( ParticleInfo *p);
108     virtual void draw( ParticleInfo *p);
109 
110 private:
111 };
112 
113 class FlankBurst: public SingleBitmapParticle
114 {
115 public:
116     FlankBurst( const string &sp);
117     virtual ~FlankBurst();
118 
119     virtual void init( ParticleInfo *p);
120     virtual bool update( ParticleInfo *p);
121     virtual void draw( ParticleInfo *p);
122     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
123 
124 private:
125     float _dir;
126 };
127 
128 class BallOfPoison: public SingleBitmapParticle
129 {
130 public:
131     BallOfPoison( void);
132     virtual ~BallOfPoison();
133 
134     virtual void init( ParticleInfo *p);
135     virtual bool update( ParticleInfo *p);
136     virtual void draw( ParticleInfo *p);
137     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
138 
139 private:
140 };
141 
142 class BallOfIce: public SingleBitmapParticle
143 {
144 public:
145     BallOfIce( void);
146     virtual ~BallOfIce();
147 
148     virtual void init( ParticleInfo *p);
149     virtual bool update( ParticleInfo *p);
150     virtual void draw( ParticleInfo *p);
151     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
152 
153 private:
154 };
155 
156 class SwarmLeader: public SingleBitmapParticle
157 {
158 public:
159     SwarmLeader( void);
160     virtual ~SwarmLeader();
161 
162     virtual void init( ParticleInfo *p);
163     virtual bool update( ParticleInfo *p);
164     virtual void draw( ParticleInfo *p);
165 
166 private:
167     BezierCurve<Point3D> _toHero;
168 };
169 
170 class SwarmElement: public ParticleType
171 {
172 public:
173     SwarmElement( void);
174     virtual ~SwarmElement();
175 
176     virtual void init( ParticleInfo *p);
177     virtual bool update( ParticleInfo *p);
178     virtual void draw( ParticleInfo *p);
179     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
180 
181 private:
182 };
183 
184 class Phaser: public SingleBitmapParticle
185 {
186 public:
187     Phaser( void);
188     virtual ~Phaser();
189 
190     virtual void init( ParticleInfo *p);
191     virtual bool update( ParticleInfo *p);
192     virtual void draw( ParticleInfo *p);
193     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
194 
195 private:
196 };
197 
198 class PlasmaBullet: public BitmapParticleType
199 {
200 public:
201     PlasmaBullet( void);
202     virtual ~PlasmaBullet();
203 
204     virtual void init( ParticleInfo *p);
205     virtual bool update( ParticleInfo *p);
206     virtual void draw( ParticleInfo *p);
207     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
208 
209 private:
210     int _bulletIndex0;
211     int _bulletIndex1;
212 
213     float _bmHalfWidth;
214     float _bmHalfHeight;
215 };
216 
217 class BallOfFire: public BitmapParticleType
218 {
219 public:
220     BallOfFire( void);
221     virtual ~BallOfFire();
222 
223     virtual void init( ParticleInfo *p);
224     virtual bool update( ParticleInfo *p);
225     virtual void draw( ParticleInfo *p);
226     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
227 
228 private:
229     int _ballOfFire;
230 
231     float _bmHalfWidth;
232     float _bmHalfHeight;
233 };
234 
235 class StingerTrail: public ParticleType
236 {
237 public:
238     StingerTrail( void);
239     virtual ~StingerTrail();
240 
241     virtual void init( ParticleInfo *p);
242     virtual bool update( ParticleInfo *p);
243     virtual void draw( ParticleInfo *p);
244 
245 protected:
246     Model *_trail;
247 };
248 
249 class HeroStinger: public ParticleType
250 {
251 public:
252     HeroStinger( void);
253     virtual ~HeroStinger();
254 
255     virtual void init( ParticleInfo *p);
256     virtual bool update( ParticleInfo *p);
257     virtual void draw( ParticleInfo *p);
258     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
259 
260 protected:
261     Model *_stinger;
262 };
263 
264 class StatusMessage: public ParticleType
265 {
266 public:
267     StatusMessage( void);
268     virtual ~StatusMessage();
269 
270     virtual void init( ParticleInfo *p);
271     virtual bool update( ParticleInfo *p);
272     virtual void draw( ParticleInfo *p);
273 
274 protected:
275     GLBitmapFont *_smallFont;
276 };
277 
278 class ExplosionPiece: public ParticleType
279 {
280 public:
281     ExplosionPiece( void);
282     virtual ~ExplosionPiece();
283 
284     virtual void init( ParticleInfo *p);
285     virtual bool update( ParticleInfo *p);
286     virtual void draw( ParticleInfo *p);
287 
288 protected:
289     Model *_cloud;
290 };
291 
292 class EnergyBlob: public ParticleType
293 {
294 public:
295     EnergyBlob( void);
296     virtual ~EnergyBlob();
297 
298     virtual void init( ParticleInfo *p);
299     virtual bool update( ParticleInfo *p);
300     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
301     virtual void draw( ParticleInfo *p);
302 
303 protected:
304     Model *_blob;
305 };
306 
307 class ShieldBoost: public ParticleType
308 {
309 public:
310     ShieldBoost( void);
311     virtual ~ShieldBoost();
312 
313     virtual void init( ParticleInfo *p);
314     virtual bool update( ParticleInfo *p);
315     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
316     virtual void draw( ParticleInfo *p);
317 
318 protected:
319     Model *_shield;
320 };
321 
322 class ArmorPierce: public ParticleType
323 {
324 public:
325     ArmorPierce( void);
326     virtual ~ArmorPierce();
327 
328     virtual void init( ParticleInfo *p);
329     virtual bool update( ParticleInfo *p);
330     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
331     virtual void draw( ParticleInfo *p);
332 
333 protected:
334     Model *_armor;
335 };
336 
337 class WeaponUpgrade: public ParticleType
338 {
339 public:
340     WeaponUpgrade( void);
341     virtual ~WeaponUpgrade();
342 
343     virtual void init( ParticleInfo *p);
344     virtual bool update( ParticleInfo *p);
345     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
346     virtual void draw( ParticleInfo *p);
347 
348 protected:
349     Model *_upgrade;
350 };
351 
352 class Bonus1: public ParticleType
353 {
354 public:
355     Bonus1( string modelName, int value);
356     virtual ~Bonus1();
357 
358     virtual void init( ParticleInfo *p);
359     virtual bool update( ParticleInfo *p);
360     virtual void hit( ParticleInfo *p, int damage, int /*radIndex*/);
361     virtual void draw( ParticleInfo *p);
362 
363 protected:
364     int _value;
365     string _scoreName;
366     Model *_bonus;
367 };
368 
369 class ScoreHighlight: public ParticleType
370 {
371 public:
372     ScoreHighlight( void);
373     virtual ~ScoreHighlight();
374 
375     virtual void init( ParticleInfo *p);
376     virtual bool update( ParticleInfo *p);
377     virtual void draw( ParticleInfo *p);
378 
379 protected:
380     vec3 _color;
381     std::string _value;
382     GLBitmapFont *_font;
383 };
384