1 /**
2  * @file enemies.h
3  * @brief handle enemies
4  * @created 2006-11-19
5  * @date 2009-01-11
6  * @author Jean-Michel Martin de Santero
7  * @author Bruno Ethvignot
8  */
9 /*
10  * copyright (c) 1998-2015 TLK Games all rights reserved
11  * $Id: enemies.h,v 1.40 2012/06/03 17:06:15 gurumeditation Exp $
12  *
13  * Powermanga is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * Powermanga is distributed in the hope that it will be useful, but
19  * WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software
25  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
26  * MA  02110-1301, USA.
27  */
28 #ifndef __ENEMIES__
29 #define __ENEMIES__
30 
31 #ifdef __cplusplus
32 extern "C"
33 {
34 #endif
35 
36 /** Maximum of enemies active at any time */
37 #define MAX_OF_ENEMIES 180
38 /** Maxinum number of types of small enemy */
39 #define ENEMIES_MAX_SMALL_TYPES 21
40 /** Maxium number of types of bloodsucker enemy */
41 #define ENEMIES_MAX_BLOODSUCKER_TYPES 21
42 /** Maximum number of types of lonely foes */
43 #define LONELY_FOES_MAX_OF 40
44 /* Number of images of bloodsucker */
45 #define ENEMIES_MAX_SPECIAL_TYPES 8
46 #define ENEMIES_MAX_OF_TYPES ENEMIES_MAX_SMALL_TYPES + ENEMIES_MAX_BLOODSUCKER_TYPES + LONELY_FOES_MAX_OF + ENEMIES_MAX_SPECIAL_TYPES
47 /* Number of images of bloodsucker */
48 #define BLOODSUCKER_NUM_OF_IMAGES 8
49 /* Number of animation images of a lonely foe, guardian or special ennemy */
50 #define ENEMIES_SPECIAL_NUM_OF_IMAGES 32
51 
52   extern Sint32 num_of_enemies;
53 
54   /** Defined the types of displacements that exist */
55   typedef enum
56   { DISPLACEMENT_CURVE,
57     DISPLACEMENT_GRID,
58     DISPLACEMENT_LONELY_FOE,
59     DISPLACEMENT_GUARDIAN
60   }
61   DISPLACEMENTS;
62 
63   /** Type of enemies vessels */
64   enum TYPE_VAIS_E
65   {
66     /* standards */
67     BOONIES, MOOARCKS, ACHEES, EVILIANS, RAGOONS, FLABBIES, BOWANS,
68     HIJACKERS, DISTASIANS, BRITTERS, SICKIES, ARIANS, STINCKIES, BZEURCKS,
69     WEAKIES,
70     MASKIES, SCRAPIES, SCROLLIANS, SHAMISTEES, FOOLINIANS, GLAMOOSH,
71     BIGBOONIES, BIGMOOARCKS, BIGACHEES, BIGEVILIANS, BIGRAGOONS,
72     BIGFLABBIES, BIGBOWANS, BIGHIJACKERS, BIGDISTASIANS, BIGBRITTERS,
73     BIGSICKIES, BIGARIANS, BIGSTINCKIES, BIGBZEURCKS, BIGWEAKIES,
74     BIGMASKIES, BIGSCRAPIES, BIGSCROLLIANS, BIGSHAMISTEES, BIGFOOLINIANS,
75     BIGGLAMOOSH,
76     /* lonely foe */
77     SUBJUGANEERS, MILLOUZ, SWORDINIANS, TOUBOUG, DISGOOSTEES, EARTHINIANS,
78     BIRIANSTEES, BELCHOUTIES, VIONIEES, HOCKYS, TODHAIRIES, DEFECTINIANS,
79     BLAVIRTHE, SOONIEES, ANGOUFF, GAFFIES, BITTERIANS, BLEUERCKS, ARCHINIANS,
80     CLOWNIES, DEMONIANS, TOUTIES, FIDGETINIANS, EFFIES, DIMITINIANS,
81     PAINIANS, ENSLAVEERS, FEABILIANS, DIVERTIZERS, SAPOUCH, HORRIBIANS,
82     CARRYONIANS, DEVILIANS, ROUGHLEERS, ABASCUSIANS, ROTIES, STENCHIES,
83     PERTURBIANS, MADIRIANS, BAINIES,
84     /* special */
85     SHURIKY, NAGGYS, GOZUKY, SOUKEE, QUIBOULY, TOURNADEE, SAAKEY, SAAKAMIN,
86     BIGMETEOR, NORMALMETEOR, SMALLMETEOR,
87     /* guards */
88     THANIKEE, BARYBOOG, PIKKIOU, NEGDEIS, FLASHY, MEECKY, TYPYBOON, MATHYDEE,
89     OVYDOON, GATLEENY, NAUTEE, KAMEAMEA, SUPRALIS, GHOTTEN
90   };
91 
92   /** Data structure of the images's enemy */
93   extern image enemi[ENEMIES_MAX_SMALL_TYPES + ENEMIES_MAX_BLOODSUCKER_TYPES +
94                      LONELY_FOES_MAX_OF +
95                      ENEMIES_MAX_SPECIAL_TYPES][IMAGES_MAXOF];
96   typedef struct enemy
97   {
98     /** Sprite structure */
99     sprite spr;
100     /** TRUE if ennemy is dead */
101     bool dead;
102     /** TRUE if enemy is still visible but inactive */
103     bool visible_dead;
104     /** Index of the mask color table (fade-out effect) */
105     Sint16 dead_color_index;
106     /** TRUE if display ennemy's white mask */
107     bool is_white_mask_displayed;
108     /** TRUE if display the sprite enemy */
109     bool visible;
110     /** Time during which vessel's invincible */
111     Sint16 invincible;
112     bool retournement;
113     /* TRUE if enemy change of direction */
114     bool change_dir;
115     /** Delay value before next shot */
116     Sint32 fire_rate_count;
117     /** Counter of delay between two shots */
118     Sint32 fire_rate;
119     /** Type of displacement: 0 = curve, 1 = grid,
120      * 3 = lonely foe, 2 = guardian */
121     Sint16 displacement;
122     /** Curve or grid index */
123     Sint16 pos_vaiss[2];
124     /** Curve number used */
125     Sint16 num_courbe;
126     /** Type of enemy: 0 = 16x16 size, 1 = 32*32 size, 2 = lonely foes */
127     Sint32 type;
128     /** Anim index offset (0 = increase, 1 = decreasing) */
129     Sint32 sens_anim;
130     /** Horizontal speed */
131     float x_speed;
132     /** Vertical speed */
133     float y_speed;
134     /** Timelife of the metor, delay counter before destruction */
135     Sint32 timelife;
136     /** Angle displacement (ex. SOUKEE into guardian phase) */
137     float angle_tir;
138     Sint16 img_angle;
139     Sint16 img_old_angle;
140     /** Angle offset */
141     float agilite;
142     struct enemy *previous;
143     struct enemy *next;
144     bool is_enabled;
145     Uint32 id;
146   } enemy;
147 
148   bool enemies_once_init (void);
149   void enemies_init (void);
150 #ifdef PNG_EXPORT_ENABLE
151   bool enemies_extract (void);
152 #endif
153   void enemies_kill (void);
154   void enemies_free (void);
155   void enemies_handle (void);
156   void enemy_set_fadeout (enemy * foe);
157   enemy *enemy_get (void);
158   enemy *enemy_get_first (void);
159   void enemy_draw (enemy * foe);
160   void enemy_guns_collisions (enemy * foe);
161   void enemy_satellites_collisions (enemy * foe);
162   void enemy_spaceship_collision (enemy * foe);
163 #ifdef __cplusplus
164 }
165 #endif
166 #endif
167