1
//*****************************************************************************
2
// copyright (c) 1998-2005 TLK Games all rights reserved
3
//-----------------------------------------------------------------------------
4
// file : "ennemis_exection.cpp"
6
// updates : 2005-01-10
7
// id : $Id: ennemis_execution.cpp,v 1.1.1.1 2005/01/25 05:52:39 gurumeditation Exp $
8
//-----------------------------------------------------------------------------
9
// functions : void ennemis_exection()
10
// float Deplacement_Tir_X( float angle, float vitesse, float pos_x )
11
// float Deplacement_Tir_Y( float angle, float vitesse, float pos_y )
12
//-----------------------------------------------------------------------------
13
// This program is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free Software
15
// Foundation; either version 2 of the License, or (at your option) any later
18
// This program is distributed in the hope that it will be useful, but WITHOUT
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
23
// You should have received a copy of the GNU General Public License along with
24
// this program; if not, write to the Free Software Foundation, Inc., 59 Temple
25
// Place - Suite 330, Boston, MA 02111-1307, USA.
27
//*****************************************************************************
28
#include "powermanga.hpp"
29
//..............................................................................
30
extern short nbr_nmis; //nombre d'enemis actuellement geres
31
extern vaisseau_nmi ve[MAX_NMI_ON_SCREEN]; //structure des vaisseaux ennemis
32
extern int liste_ve[MAX_NMI_ON_SCREEN]; //liste de tous les 've' geres actuellement
33
extern int cmpt_nmis; //compteur nombre d'ennemis (dans les boucles)
34
extern curve initial_curve[NBR_CURVE_MAX]; //structure des courbes de bezier
35
extern bool aff_game_over; //1=affichage du game over en cours
36
extern short nbr_boules; //nombre de boules actuellement geres
37
extern str_boule bou[MAX_BOULES_ON_SCREEN]; // structure des boules
38
extern image boule[MAX_TYP_OF_BOULES][NBR_IMAGES_BOULES]; //tableau des boules
39
extern int cmpt_boules; //compteur du nombre de boules (dans les boucles)
40
extern bool player_pause; //1=pause en cours
41
extern tir tirs[NBR_TIRS_MAX]; //tableau de tous les objets tirs
42
extern int etat_menu; //MENU_OFF(false)=menu inactif ; MENU_ON(true)=menu actif
43
extern int new_tir; //indice sur un nouvel objet 'tirs'
44
extern short nbr_tirs; //nombre de tir actuellement geres
45
extern int nbr_onde_choc; //nombre actuel d'onde de choc
46
extern int num_level; //numero du niveau en cours
47
extern int tmp_tsts_x;
48
extern int tmp_tsts_y;
49
extern int tmp_tstd_x;
50
extern int tmp_tstd_y;
51
extern int cmpt_exps; //compteur du nombre d'explosions (dans les boucles)
52
extern image fire[MAX_TYP_OF_TIR][NBR_IMAGES_TIR]; //ableau des diff�rents tirs
53
extern int bonusx; //multiplicateur de points x2 ou x4 (bonus)
54
extern int player_score; //
55
extern int cmpt_canons; // Utilis� dans les bcles pour compter le nombre de canons.
56
extern short nbr_canons; // Indique le nombre de canons actuellement g�r�s.
57
extern int liste_can[MAX_CANONS_ON_SCREEN]; // D�finit la liste de toutes les 'can' que l'on doit g�r�s � chaque VBLs.
58
extern str_boule bou[MAX_BOULES_ON_SCREEN]; // D�claration de la structure des boules.
59
extern image boule[MAX_TYP_OF_BOULES][NBR_IMAGES_BOULES]; // D�finit le tableau des diff�rents ennemis.
60
extern int cmpt_boules; // Utilis� dans les bcles pour compter le nombre de boules.
61
extern short nbr_exps; // Indique le nombre d'explosions actuellement g�r�es.
62
extern int liste_bou[MAX_BOULES_ON_SCREEN]; // D�finit la liste de toutes les 'bou' que l'on doit g�r�s � chaque VBLs.
63
extern str_canon can[MAX_CANONS_ON_SCREEN]; // D�claration de la structure des canons.
64
extern vaisseau vj[NBR_MAX_J]; // declaration de la structure des vaisseaux des joueurs.
65
extern bool game_over_player_one; // true=le joueur vient de perdre son vaisseau.(game over)
67
extern bool bar_nrj_player;
68
extern int new_ve; // Indique l'indice du tableau corespondant � un nouvel objet 've'.
69
extern int gardian_activity;
70
extern bool bar_nrj_guardian;
71
extern image enemi[MAX_TYP_OF_ENEMI + MAX_TYP_OF_S_ENEMI + MAX_TYP_OF_NMI_SPE + MAX_TYP_OF_OBJ_SPE][NBR_IMAGES_MAX]; // D�finit le tableau des diff�rents ennemis.
72
extern short first_value, second_value, compteur, compteur1;
73
extern int iNumeroGardien; // numero du gardien en cours
75
//..............................................................................
76
void ennemis_execution()
78
static int i, k, j, l, m;
80
for(i = 0; i < nbr_nmis; i++)
82
cmpt_nmis = liste_ve[i]; //cmpt_nmis=index sur le tableau "v.........
83
switch (ve[cmpt_nmis].deplacement)
85
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
86
// deplacement=0 : phase courbe
87
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
90
if(!player_pause && etat_menu == MENU_OFF
91
&& _score::getActionExecution() == 0)
93
ve[cmpt_nmis].pos_vaiss[POS_CURVE]++; //change position du vaisseau dans la courbe
94
if(ve[cmpt_nmis].pos_vaiss[POS_CURVE] >=
95
initial_curve[ve[cmpt_nmis].num_courbe].nbr_pnt_curve)
97
Del_Element_Ve(cmpt_nmis, i); //supprimer un vaisseau ennemi du tableau des 've'
99
goto fin_dep_ve_courbe;
101
//nouvelles coordonees
102
ve[cmpt_nmis].spr.coor_x += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_x[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
103
ve[cmpt_nmis].spr.coor_y += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_y[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
105
//donne la valeur de l'image du vaisseau a afficher
106
ve[cmpt_nmis].spr.img_act =
107
initial_curve[ve[cmpt_nmis].num_courbe].angle[ve[cmpt_nmis].
108
pos_vaiss[POS_CURVE]];
109
// Test si on doit ou non afficher le sprite.
110
if(((short)ve[cmpt_nmis].spr.coor_x +
111
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
113
|| ((short)ve[cmpt_nmis].spr.coor_y +
114
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
116
|| (short)ve[cmpt_nmis].spr.coor_y >= DEBUT_ECRAN_Y + HAUT_ECR_RAM
117
|| (short)ve[cmpt_nmis].spr.coor_x >= DEBUT_ECRAN_X + LARG_ECR_RAM)
118
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
119
ve[cmpt_nmis].visible = FALSE;
121
else // Sinon, on doit l'afficher.
123
if(ve[cmpt_nmis].dead) //ennemi est mort ?
125
if(Gere_Invincibilite_Ve(cmpt_nmis)) //vaisseau continue a clignoter ?
126
{ // RAZ de la variable de fin de vie du vaisseau ennemi.
127
ve[cmpt_nmis].dead = FALSE; //enemy's really dead
128
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
129
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
131
goto fin_dep_ve_courbe; // On sort de la bcle directement.
134
else // Sinon, l'ennemi est encore en vie.
135
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
136
ve[cmpt_nmis].visible = TRUE;
137
// Affichage de l'ennemi.
139
// Test s'il y a des ondes de choc en activit�.
141
{ // Test si l'onde de choc est en collision avec l'ennemi actuel.
142
if(Tst_Col_Onde_Choc(cmpt_nmis))
143
{ // On fait clignoter l'ennemi actuel avant de le faire disparaitre.
144
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
145
// On ajoute une explosion � la liste.
146
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
147
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
148
ve[cmpt_nmis].spr.coor_y, 0.25,
149
ve[cmpt_nmis].type, 0);
150
// On ajoute un eclat � la liste des explosions.
151
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
152
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
154
ve[cmpt_nmis].spr.coor_y +
155
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
156
y_cg - 8, 1.0, 4, 0, 1);
157
goto fin_dep_ve_courbe; // Sort de la gestion des vaisseau ennemis.
161
// Test si la pause est activ�e ou pas.
162
if(!player_pause && etat_menu == MENU_OFF
163
&& _score::getActionExecution() == 0)
164
{ // D�compte le temps s�parant deux tirs.
165
ve[cmpt_nmis].cad_tir--;
167
//test si l'ennemi doit ou non lancer un tir ----------------------
168
if(ve[cmpt_nmis].cad_tir <= 0
170
((NBR_TIRS_MAX - 1) -
171
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
173
{ // Met la cadence du tir pour le vaisseau ennemi.
174
ve[cmpt_nmis].cad_tir = ve[cmpt_nmis].cad_tir_initiale; // Corespond au temps qu'il faut au vaisseau avant de pouvoir tirer � nouveau.
177
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
180
((NBR_TIRS_MAX - 1) -
181
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
184
if(nbr_tirs < (NBR_TIRS_MAX - 1)) //reste tirs ?
186
new_tir = new_element_tir(); //demande un tir libre
187
tirs[new_tir].clignote = 1; //1=tir clignote
188
tirs[new_tir].spr.genre = ENNEMI; // Indique que c'est un sprite ennemi.
189
tirs[new_tir].spr.trajectoire = FALSE; // Indique que la trajectoire du sprite est calcul�e une fois pour toute.
190
tirs[new_tir].spr.nbr_img = 32; // Indique le nombre d'images composant le sprite.
191
// Test si le type d'ennemi afin d'attribuer la puissance du tir.
192
switch (ve[cmpt_nmis].type)
193
{ // Cas d'un ennemi de 16x16.
195
tirs[new_tir].spr.pow_of_dest = 2; // Indique la puissance de destruction du sprite.
196
// Donne l'adresse des images du sprite.
197
for(j = 0; j < tirs[new_tir].spr.nbr_img; j++)
198
{ //Donne l'adresse des images du projectile.
199
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P1E][j]; // Corespond au Tir 2 puissance 1.
202
// Cas d'un ennemi de 32x32.
204
tirs[new_tir].spr.pow_of_dest = 4; // Indique la puissance de destruction du sprite.
205
// Donne l'adresse des images du sprite.
206
for(j = 0; j < tirs[new_tir].spr.nbr_img; j++)
207
{ //Donne l'adresse des images du projectile.
208
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P2E][j]; // Corespond au Tir 2 puissance 2.
212
tirs[new_tir].spr.etat_dommages = tirs[new_tir].spr.pow_of_dest; // Indique l'�tat de domages du sprite.
213
//tirs[new_tir].spr.pilote = 0; // Indique par qui est dirig� le sprite.
214
//tirs[new_tir].spr.mode_commande = 0; // Indique le moyen par lequel on fait d�placer le sprite.
215
tirs[new_tir].spr.img_act = 0; // Indique l'image actuelle.
216
tirs[new_tir].spr.nbr_tot_vbl = 1; // Indique le nombre de VBL qu'il faut pour passer � l'image suivante.
217
tirs[new_tir].spr.nbr_vbl_act = 0; // Indique le nombre de VBL compt�es actuellement.
218
// Donne les coordonn�es d'affichage du sprite.
219
tirs[new_tir].img_angle =
220
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
222
tirs[new_tir].img_old_angle = tirs[new_tir].img_angle;
223
tirs[new_tir].spr.coor_x =
224
ve[cmpt_nmis].spr.coor_x +
225
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
227
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->x_cg;
228
tirs[new_tir].spr.coor_y =
229
ve[cmpt_nmis].spr.coor_y +
230
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
232
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->y_cg;
233
tirs[new_tir].tmp_life_tir = 400;
234
// Donne un angle vertical pour le tir.
235
tirs[new_tir].angle_tir =
236
PI_SUR_16 * tirs[new_tir].img_angle;
237
tirs[new_tir].spr.vitesse = 1.0f + (float)num_level / 20.0f; // Donne la vitesse de d�placement du sprite.
242
// Si le joueur n'est pas Game Over.
244
{ // Test les collisions entre les boules et le vaisseau ennemi.
245
// Boucles sur toutes les boules du joueur.
246
for(k = 0; k < nbr_boules; k++)
247
{ // Retourne l'indice dans le tableau 'bou' du ni�me �l�ment de la liste.
248
cmpt_boules = liste_bou[k];
249
// Test si la boule est visible et si oui, on peux tester les collisions.
250
if(bou[cmpt_boules].visible)
251
{ // Boucle sur tous les points de collision de la boule.
254
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
256
{ // Donne les coordonn�e du point de collision actuel de la boule.
258
bou[cmpt_boules].coor_x +
259
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
262
bou[cmpt_boules].coor_y +
263
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
265
// Boucle sur toutes les zones de collisions du vaisseau ennemi.
268
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
270
{ // Test si le point de collision de la boule se trouve � l'int�rieur de la
271
// zone de collision du vaisseau ennemi.
273
(int)ve[cmpt_nmis].spr.coor_x +
274
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
277
(int)ve[cmpt_nmis].spr.coor_y +
278
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
280
// Test s'il le point de collision de la boule se trouve � l'int�rieur de la zone de collision du vaisseau ennemi.
281
if(tmp_tsts_x >= tmp_tstd_x &&
282
tmp_tsts_y >= tmp_tstd_y &&
285
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
289
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
291
{ // On doit d�cr�menter l'�tat des dommages du vaisseau ennemi et de la boule.
292
// Donne le nouvel �tat des dommages du vaisseau ennemi.
293
ve[cmpt_nmis].spr.etat_dommages -=
294
bou[cmpt_boules].pow_of_dest;
295
// Donne le nouvel �tat des dommages de la boule du joueur.
296
bou[cmpt_boules].etat_dommages -=
297
ve[cmpt_nmis].spr.pow_of_dest;
298
// Test si la boule est d�truite.
299
if(bou[cmpt_boules].etat_dommages <= 0)
300
{ // On supprime la boule de la liste.
301
Del_Element_Bou(cmpt_boules, k); // Routine utilis�e pour supprimer une boule du tableau 'bou'.
302
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
304
// Positionnement des boules autour du vaisseau appartenant au joueur.
307
bou[liste_bou[0]].pos_pts_cercle = 0; // Indique la position du pointeur sur le tableau des points du cercle.
311
bou[liste_bou[1]].pos_pts_cercle = 40; // Indique la position du pointeur sur le tableau des points du cercle.
314
bou[liste_bou[1]].pos_pts_cercle = 26; // Indique la position du pointeur sur le tableau des points du cercle.
315
bou[liste_bou[2]].pos_pts_cercle = 53; // Indique la position du pointeur sur le tableau des points du cercle.
318
bou[liste_bou[1]].pos_pts_cercle = 20; // Indique la position du pointeur sur le tableau des points du cercle.
319
bou[liste_bou[2]].pos_pts_cercle = 40; // Indique la position du pointeur sur le tableau des points du cercle.
320
bou[liste_bou[3]].pos_pts_cercle = 60; // Indique la position du pointeur sur le tableau des points du cercle.
323
bou[liste_bou[1]].pos_pts_cercle = 16; // Indique la position du pointeur sur le tableau des points du cercle.
324
bou[liste_bou[2]].pos_pts_cercle = 32; // Indique la position du pointeur sur le tableau des points du cercle.
325
bou[liste_bou[3]].pos_pts_cercle = 48; // Indique la position du pointeur sur le tableau des points du cercle.
326
bou[liste_bou[4]].pos_pts_cercle = 64; // Indique la position du pointeur sur le tableau des points du cercle.
330
// La boule est en d�truite, on peux passer � la boule suivante.
331
goto fin_test_col_bou_nmi_courbe;
334
{ // Si la boule n'est pas d�truite, on indique qu'il faudra l'afficher la prochaine fois en blanc.
335
bou[cmpt_boules].affich_white = TRUE;
337
// On test si le vaisseau ennemi est d�truit.
338
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
339
{ // Test si le vaisseau ennemi �tait une m�t�orite.
340
if(ve[cmpt_nmis].type >= BIGMETEOR
341
&& ve[cmpt_nmis].type <= SMALLMETEOR)
343
//Gene_Bonus_Malus_Meteor(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
344
Gene_Bonus_Malus_Meteor(&ve[cmpt_nmis]);
345
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
346
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
349
ve[cmpt_nmis].spr.coor_y +
350
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
352
y_cg - 8, 1.0, 4, 0, 2);
354
else // Sinon, on appel la routine normale de g�n�ration de bonus, malus.
355
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
356
//Gene_Bonus_Malus(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
357
Gene_Bonus_Malus(&ve[cmpt_nmis]);
359
// On ajoute une explosion � la liste.
360
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
361
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
362
ve[cmpt_nmis].spr.coor_y, 0.25,
363
ve[cmpt_nmis].type, 0);
364
// On ajoute un eclat � la liste des explosions.
365
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
366
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
368
ve[cmpt_nmis].spr.coor_y +
369
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
372
// Mise � jour du score du joueur pour la destruction d'un ennemi.
374
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
375
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
376
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
377
goto fin_dep_ve_courbe;
380
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
381
ve[cmpt_nmis].affich_white = TRUE;
383
// On ajoute une mini explosion � la liste car une boule � eu une collision.
384
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
385
Add_Explosion((float)tmp_tsts_x, (float)tmp_tsts_y,
386
0.3f, MINI_EXPLOSION, 0);
387
// La boule est en collision avec l'ennemi, on peux passer � la boule suivante.
388
goto fin_test_col_bou_nmi_courbe;
393
fin_test_col_bou_nmi_courbe:;
396
// Test les collisions entre les canons et le vaisseau ennemi.
397
// Bcles sur tous les canons du joueur.
398
for(k = 0; k < nbr_canons; k++)
399
{ // Retourne l'indice dans le tableau 'can' du ni�me �l�ment de la liste.
400
cmpt_canons = liste_can[k];
401
// Test si le canon est visible et si oui, on peux tester les collisions.
402
if(can[cmpt_canons].visible)
403
{ // Bcle sur tous les points de collision du canon.
406
can[cmpt_canons].img[can[cmpt_canons].img_act]->
408
{ // Donne les coordonn�e du point de collision actuel du canon.
410
can[cmpt_canons].coor_x +
411
can[cmpt_canons].img[can[cmpt_canons].img_act]->
414
can[cmpt_canons].coor_y +
415
can[cmpt_canons].img[can[cmpt_canons].img_act]->
417
// Bcle sur toutes les zones de collisions du vaisseau ennemi.
420
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
422
{ // Donne les coordon�es du point sup�rieur gauche de la
423
// zone de collision du vaisseau ennemi.
425
(int)ve[cmpt_nmis].spr.coor_x +
426
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
429
(int)ve[cmpt_nmis].spr.coor_y +
430
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
432
// Test s'il le point de collision du canon se trouve � l'int�rieur de la zone de collision du vaisseau ennemi.
433
if(tmp_tsts_x >= tmp_tstd_x &&
434
tmp_tsts_y >= tmp_tstd_y &&
437
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
441
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
443
{ // On doit d�cr�menter l'�tat des dommages du vaisseau ennemi et du canon.
444
// Donne le nouvel �tat des dommages du vaisseau ennemi.
445
ve[cmpt_nmis].spr.etat_dommages -=
446
can[cmpt_canons].pow_of_dest;
447
// Donne le nouvel �tat des dommages du canon.
448
can[cmpt_canons].etat_dommages -=
449
ve[cmpt_nmis].spr.pow_of_dest;
450
// Test si le canon est d�truit.
451
if(can[cmpt_canons].etat_dommages <= 0)
452
{ // On supprime le canon de la liste.
453
Del_Element_Can(cmpt_canons, k); // Routine utilis�e pour supprimer un canon du tableau 'can'.
454
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
456
// Le canon est en d�truit, on peux passer au canon suivant.
457
goto fin_test_col_can_nmi_courbe;
460
{ // Si le canon n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
461
can[cmpt_canons].affich_white = TRUE;
463
// On test si le vaisseau ennemi est d�truit.
464
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
465
{ // Test si le vaisseau ennemi �tait une m�t�orite.
466
if(ve[cmpt_nmis].type >= BIGMETEOR
467
&& ve[cmpt_nmis].type <= SMALLMETEOR)
468
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
469
//Gene_Bonus_Malus_Meteor(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
470
Gene_Bonus_Malus_Meteor(&ve[cmpt_nmis]);
471
// On ajoute un eclat � la liste des explosions.
472
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
473
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
476
ve[cmpt_nmis].spr.coor_y +
477
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
479
y_cg - 8, 1.0, 4, 0, 2);
481
else // Sinon, on appel la routine normale de g�n�ration de bonus, malus.
482
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
483
//Gene_Bonus_Malus(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
484
Gene_Bonus_Malus(&ve[cmpt_nmis]);
486
// On ajoute une explosion � la liste.
487
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
488
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
489
ve[cmpt_nmis].spr.coor_y, 0.25,
490
ve[cmpt_nmis].type, 0);
491
// On ajoute un eclat � la liste des explosions.
492
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
493
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
495
ve[cmpt_nmis].spr.coor_y +
496
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
499
// Mise � jour du score du joueur pour la destruction d'un ennemi.
501
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
502
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
503
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
504
goto fin_dep_ve_courbe;
507
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
508
ve[cmpt_nmis].affich_white = TRUE;
510
// On ajoute une mini explosion � la liste car un canon � eu une collision.
511
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
512
Add_Explosion((float)tmp_tsts_x, (float)tmp_tsts_y,
513
0.3f, MINI_EXPLOSION, 0);
514
// Le canon est en collision avec l'ennemi, on peux passer au caono suivant.
515
goto fin_test_col_can_nmi_courbe;
520
fin_test_col_can_nmi_courbe:;
523
// Test si l'ennemi est en collision avec le joueur.
524
// Bcle sur tous les points de collisions du vaisseau du joueur.
525
for(k = 0; k < vj[J1].spr.img[vj[J1].spr.img_act]->nbr_pts_col;
527
{ // Donne les coordon�es du point de collision du vaisseau appartenant au joueur.
529
(int)vj[J1].spr.coor_x +
530
vj[J1].spr.img[vj[J1].spr.img_act]->xy_pts_col[k][X];
532
(int)vj[J1].spr.coor_y +
533
vj[J1].spr.img[vj[J1].spr.img_act]->xy_pts_col[k][Y];
534
// Bcle sur toutes les zones de collisions du vaisseau ennemi.
537
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
539
{ // Donne les coordon�es de la zone de collision du vaisseau ennemi.
541
(int)ve[cmpt_nmis].spr.coor_x +
542
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
545
(int)ve[cmpt_nmis].spr.coor_y +
546
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
548
// Test si le point de collision du vaisseau du joueur se trouve � l'int�rieur de la
549
// zone de collision du vaisseau ennemi.
550
if(tmp_tsts_x >= tmp_tstd_x &&
551
tmp_tsts_y >= tmp_tstd_y &&
554
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
558
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
560
{ // On doit d�cr�menter l'�tat des dommages des deux vaisseaux.
561
// Donne le nouvel �tat des dommages du vaisseau ennemi.
562
ve[cmpt_nmis].spr.etat_dommages -=
563
(vj[J1].spr.pow_of_dest << 1);
564
// Test si le vaisseau du joueur est invincible dans le but de d�cendre son �nergie.
565
if(!vj[J1].invincible)
566
{ // Test si l'�nergie du joueur �tait au maximum.
567
if(vj[J1].spr.etat_dommages == vj[J1].spr.pow_of_dest)
568
{ // Indique que l'animation d'ouverture de l'option d'energie doit s'effectuer.
569
Init_Anim_Option(1, FALSE);
571
// Donne le nouvel �tat des dommages du vaisseau du joueur.
572
vj[J1].spr.etat_dommages -=
573
ve[cmpt_nmis].spr.pow_of_dest;
575
// Demande un r�affichage de la barre d'�nergie du joueur.
576
bar_nrj_player = TRUE;
577
// Test si le vaisseau du joueur est d�truit.
578
if(vj[J1].spr.etat_dommages <= 0)
579
{ // Indique que le joueur est Game Over.
580
game_over_player_one = TRUE;
583
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
584
vj[J1].affich_white = TRUE;
586
// On ajoute la vitesse de d�placement du vaisseau ennemi � celle du vaisseau ami.
587
vj[J1].vitesse_x += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_x[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
588
vj[J1].vitesse_y += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_y[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
589
// On test si le vaisseau ennemi est d�truit.
590
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
591
{ // On ajoute une explosion � la liste.
592
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
593
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
594
ve[cmpt_nmis].spr.coor_y, 0.25,
595
ve[cmpt_nmis].type, 0);
596
// On ajoute un eclat � la liste des explosions.
597
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
598
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
600
ve[cmpt_nmis].spr.coor_y +
601
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
604
// Mise � jour du score du joueur pour la destruction d'un ennemi
606
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
607
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
608
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
609
goto fin_dep_ve_courbe;
612
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
613
ve[cmpt_nmis].affich_white = TRUE;
615
// Le vaisseau du joueur est entr� en collision avec le vaisseau ennemi, on peux sortir du test.
616
goto fin_tst_col_vnmi_dep_ve_courbe;
619
} // Fin du test pour savoir si le joueur est en collision avec un vaisseau ennemi.
620
fin_tst_col_vnmi_dep_ve_courbe:;
621
} // Fin du test si le joueur est Game Over.
622
} // Fin du test pour savoir si l'ennemi est mort et si on est en train de le faire clignoter.
623
} // Fin du test si on doit afficher le vaisseau ennemi ou non.
628
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
629
// deplacement=1 : phase grille
630
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
632
{ // Test si la pause est activ�e ou pas.
633
if(!player_pause && etat_menu == MENU_OFF
634
&& _score::getActionExecution() == 0)
635
{ // Donne la nouvelle coordon�e X du sprite ennemi.
636
ve[cmpt_nmis].spr.coor_x =
637
grille.coor_x + (ve[cmpt_nmis].pos_vaiss[X] << 4);
638
// Donne la nouvelle coordon�e Y du sprite ennemi.
639
ve[cmpt_nmis].spr.coor_y =
640
grille.coor_y + (ve[cmpt_nmis].pos_vaiss[Y] << 4);
642
// Test si on doit ou non afficher le sprite.
643
if(((short)ve[cmpt_nmis].spr.coor_x +
644
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
646
|| ((short)ve[cmpt_nmis].spr.coor_y +
647
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
649
|| (short)ve[cmpt_nmis].spr.coor_y >= DEBUT_ECRAN_Y + HAUT_ECR_RAM
650
|| (short)ve[cmpt_nmis].spr.coor_x >= DEBUT_ECRAN_X + LARG_ECR_RAM)
651
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
652
ve[cmpt_nmis].visible = FALSE;
653
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
654
if((short)ve[cmpt_nmis].spr.coor_y >= DEBUT_ECRAN_Y + HAUT_ECR_RAM)
655
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
656
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
657
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
661
else // Sinon, on doit l'afficher.
662
{ // Test si le vaisseau ennemi est mort.
663
if(ve[cmpt_nmis].dead)
664
{ // Gestion de l'invincibilit� d'un vaisseau ennemi.
665
// Retourne Vrai si le vaisseau ennemi est d�truit, Faux si on continu � le faire clignoter.
666
if(Gere_Invincibilite_Ve(cmpt_nmis))
667
{ // RAZ de la variable de fin de vie du vaisseau ennemi.
668
ve[cmpt_nmis].dead = FALSE;
669
// On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
670
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
671
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
673
goto fin_dep_ve_grille; // On sort de la bcle directement.
676
else // Sinon, l'ennemi est encore en vie.
677
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
678
ve[cmpt_nmis].visible = TRUE;
679
// Incr�mente le compteur de VBLs pour l'affichage de l'animation.
680
ve[cmpt_nmis].spr.nbr_vbl_act++;
681
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
682
if(ve[cmpt_nmis].spr.nbr_vbl_act >= ve[cmpt_nmis].spr.nbr_tot_vbl)
683
{ // On initialise le compteur de VBLs.
684
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
685
// On passe � l'image suivante.
686
ve[cmpt_nmis].spr.img_act++;
687
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
688
if(ve[cmpt_nmis].spr.img_act >= ve[cmpt_nmis].spr.nbr_img)
689
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
690
ve[cmpt_nmis].spr.img_act = 0;
693
// Affichage de l'ennemi.
695
// Test s'il y a des ondes de choc en activit�.
697
{ // Test si l'onde de choc est en collision avec l'ennemi actuel.
698
if(Tst_Col_Onde_Choc(cmpt_nmis))
699
{ // On fait clignoter l'ennemi actuel avant de le faire disparaitre.
700
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
701
// On ajoute une explosion � la liste.
702
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
703
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
704
ve[cmpt_nmis].spr.coor_y, 0.25,
705
ve[cmpt_nmis].type, 0);
706
// On ajoute un eclat � la liste des explosions.
707
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
708
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
710
ve[cmpt_nmis].spr.coor_y +
711
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
712
y_cg - 8, 1.5, 5, 0, 1);
713
goto fin_dep_ve_grille; // Sort de la gestion des vaisseau ennemis.
716
// Test si la pause est activ�e ou pas.
717
if(!player_pause && etat_menu == MENU_OFF
718
&& _score::getActionExecution() == 0)
719
{ // D�compte le temps s�parant deux tirs.
720
ve[cmpt_nmis].cad_tir--;
721
// Test si l'ennemi doit ou non lancer un tir.
722
if(ve[cmpt_nmis].cad_tir <= 0 && nbr_tirs < (NBR_TIRS_MAX - 1))
723
{ // Met la cadence du tir pour le vaisseau ennemi.
724
ve[cmpt_nmis].cad_tir =
725
grille.freq_tir[ve[cmpt_nmis].pos_vaiss[X]][ve[cmpt_nmis].
727
// Bcle sur tous les points de tirs existants.
730
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
732
{ // Test s'il est possible d'ajouter un nouveau tir � la liste.
733
if(nbr_tirs < (NBR_TIRS_MAX - 1))
734
{ // Recherche d'un nouveau tir.
735
new_tir = new_element_tir();
736
// Remplissage de la structure sprite pour le tir du vaisseau ennemi.
737
tirs[new_tir].clignote = TRUE; // Indique que l'on est en pr�sence d'un sprite ennemi qui doit clignoter.
738
tirs[new_tir].spr.genre = ENNEMI; // Indique que c'est un sprite ennemi.
739
tirs[new_tir].spr.trajectoire = FALSE; // Indique que la trajectoire du sprite est calcul�e une fois pour toute.
740
tirs[new_tir].spr.nbr_img = 32; // Indique le nombre d'images composant le sprite.
741
// Test si le type d'ennemi afin d'attribuer la puissance du tir.
742
switch (ve[cmpt_nmis].type)
743
{ // Cas d'un ennemi de 16x16.
745
tirs[new_tir].spr.pow_of_dest = 2; // Indique la puissance de destruction du sprite.
746
// Donne l'adresse des images du sprite.
747
for(j = 0; j < tirs[new_tir].spr.nbr_img; j++)
748
{ //Donne l'adresse des images du projectile.
749
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P1E][j]; // Corespond au Tir 2 puissance 1.
752
// Cas d'un ennemi de 32x32.
754
tirs[new_tir].spr.pow_of_dest = 4; // Indique la puissance de destruction du sprite.
755
// Donne l'adresse des images du sprite.
756
for(j = 0; j < tirs[new_tir].spr.nbr_img; j++)
757
{ //Donne l'adresse des images du projectile.
758
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P2E][j]; // Corespond au Tir 2 puissance 2.
762
tirs[new_tir].spr.etat_dommages = tirs[new_tir].spr.pow_of_dest; // Indique l'�tat de domages du sprite.
763
//tirs[new_tir].spr.pilote = 0; // Indique par qui est dirig� le sprite.
764
//tirs[new_tir].spr.mode_commande = 0; // Indique le moyen par lequel on fait d�placer le sprite.
765
tirs[new_tir].spr.img_act = 0; // Indique l'image actuelle.
766
tirs[new_tir].spr.nbr_tot_vbl = 1; // Indique le nombre de VBL qu'il faut pour passer � l'image suivante.
767
tirs[new_tir].spr.nbr_vbl_act = 0; // Indique le nombre de VBL compt�es actuellement.
768
// Donne les coordonn�es d'affichage du sprite.
769
tirs[new_tir].img_angle =
770
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
772
tirs[new_tir].img_old_angle = tirs[new_tir].img_angle;
773
tirs[new_tir].spr.coor_x =
774
ve[cmpt_nmis].spr.coor_x +
775
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
777
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->x_cg;
778
tirs[new_tir].spr.coor_y =
779
ve[cmpt_nmis].spr.coor_y +
780
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
782
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->y_cg;
783
tirs[new_tir].tmp_life_tir = 400;
784
// Donne un angle vertical pour le tir.
785
tirs[new_tir].angle_tir =
786
PI_SUR_16 * tirs[new_tir].img_angle;
787
tirs[new_tir].spr.vitesse = 1.0f + (float)num_level / 20.0f; // Donne la vitesse de d�placement du sprite.
792
// Si le joueur n'est pas Game Over.
794
{ // Test les collisions entre les boules et le vaisseau ennemi.
795
// Boucles sur toutes les boules du joueur.
796
for(k = 0; k < nbr_boules; k++)
797
{ // Retourne l'indice dans le tableau 'bou' du ni�me �l�ment de la liste.
798
cmpt_boules = liste_bou[k];
799
// Test si la boule est visible et si oui, on peux tester les collisions.
800
if(bou[cmpt_boules].visible)
801
{ // Boucle sur tous les points de collision de la boule.
804
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
806
{ // Donne les coordonn�e du point de collision actuel de la boule.
808
bou[cmpt_boules].coor_x +
809
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
812
bou[cmpt_boules].coor_y +
813
bou[cmpt_boules].img[bou[cmpt_boules].img_act]->
815
// Boucle sur toutes les zones de collisions du vaisseau ennemi.
818
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
820
{ // Test si le point de collision de la boule se trouve � l'int�rieur de la
821
// zone de collision du vaisseau ennemi.
823
(int)ve[cmpt_nmis].spr.coor_x +
824
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
827
(int)ve[cmpt_nmis].spr.coor_y +
828
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
830
// Test s'il le point de collision de la boule se trouve � l'int�rieur de la zone de collision du vaisseau ennemi.
831
if(tmp_tsts_x >= tmp_tstd_x &&
832
tmp_tsts_y >= tmp_tstd_y &&
835
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
839
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
841
{ // On doit d�cr�menter l'�tat des dommages du vaisseau ennemi et de la boule.
842
// Donne le nouvel �tat des dommages du vaisseau ennemi.
843
ve[cmpt_nmis].spr.etat_dommages -=
844
bou[cmpt_boules].pow_of_dest;
845
// Donne le nouvel �tat des dommages de la boule du joueur.
846
bou[cmpt_boules].etat_dommages -=
847
ve[cmpt_nmis].spr.pow_of_dest;
848
// Test si la boule est d�truite.
849
if(bou[cmpt_boules].etat_dommages <= 0)
850
{ // On supprime la boule de la liste.
851
Del_Element_Bou(cmpt_boules, k); // Routine utilis�e pour supprimer une boule du tableau 'bou'.
852
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
854
// Positionnement des boules autour du vaisseau appartenant au joueur.
857
bou[liste_bou[0]].pos_pts_cercle = 0; // Indique la position du pointeur sur le tableau des points du cercle.
861
bou[liste_bou[1]].pos_pts_cercle = 40; // Indique la position du pointeur sur le tableau des points du cercle.
864
bou[liste_bou[1]].pos_pts_cercle = 26; // Indique la position du pointeur sur le tableau des points du cercle.
865
bou[liste_bou[2]].pos_pts_cercle = 53; // Indique la position du pointeur sur le tableau des points du cercle.
868
bou[liste_bou[1]].pos_pts_cercle = 20; // Indique la position du pointeur sur le tableau des points du cercle.
869
bou[liste_bou[2]].pos_pts_cercle = 40; // Indique la position du pointeur sur le tableau des points du cercle.
870
bou[liste_bou[3]].pos_pts_cercle = 60; // Indique la position du pointeur sur le tableau des points du cercle.
873
bou[liste_bou[1]].pos_pts_cercle = 16; // Indique la position du pointeur sur le tableau des points du cercle.
874
bou[liste_bou[2]].pos_pts_cercle = 32; // Indique la position du pointeur sur le tableau des points du cercle.
875
bou[liste_bou[3]].pos_pts_cercle = 48; // Indique la position du pointeur sur le tableau des points du cercle.
876
bou[liste_bou[4]].pos_pts_cercle = 64; // Indique la position du pointeur sur le tableau des points du cercle.
880
// La boule est en d�truite, on peux passer � la boule suivante.
881
goto fin_test_col_bou_nmi_grille;
884
{ // Si la boule n'est pas d�truite, on indique qu'il faudra l'afficher la prochaine fois en blanc.
885
bou[cmpt_boules].affich_white = TRUE;
887
// On test si le vaisseau ennemi est d�truit.
888
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
889
{ // Test si le vaisseau ennemi �tait une m�t�orite.
890
if(ve[cmpt_nmis].type >= BIGMETEOR
891
&& ve[cmpt_nmis].type <= SMALLMETEOR)
892
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
893
//Gene_Bonus_Malus_Meteor(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
894
Gene_Bonus_Malus_Meteor(&ve[cmpt_nmis]);
895
// On ajoute un eclat � la liste des explosions.
896
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
897
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
900
ve[cmpt_nmis].spr.coor_y +
901
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
903
y_cg - 8, 1.0, 2, 0, 2);
905
else // Sinon, on appel la routine normale de g�n�ration de bonus, malus.
906
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
907
//Gene_Bonus_Malus(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
908
Gene_Bonus_Malus(&ve[cmpt_nmis]);
910
// On ajoute une explosion � la liste.
911
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
912
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
913
ve[cmpt_nmis].spr.coor_y, 0.25,
914
ve[cmpt_nmis].type, 0);
915
// On ajoute un eclat � la liste des explosions.
916
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
917
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
919
ve[cmpt_nmis].spr.coor_y +
920
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
923
// Mise � jour du score du joueur pour la destruction d'un ennemi
925
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
926
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
927
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
928
goto fin_dep_ve_grille;
931
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
932
ve[cmpt_nmis].affich_white = TRUE;
934
// On ajoute une mini explosion � la liste car une boule � eu une collision.
935
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
936
Add_Explosion((float)tmp_tsts_x, (float)tmp_tsts_y,
937
0.3f, MINI_EXPLOSION, 0);
938
// La boule est en collision avec l'ennemi, on peux passer � la boule suivante.
939
goto fin_test_col_bou_nmi_grille;
944
fin_test_col_bou_nmi_grille:;
946
// Test les collisions entre les canons et le vaisseau ennemi.
947
// Bcles sur toutes les canons du joueur.
948
for(k = 0; k < nbr_canons; k++)
949
{ // Retourne l'indice dans le tableau 'can' du ni�me �l�ment de la liste.
950
cmpt_canons = liste_can[k];
951
// Test si le canon est visible et si oui, on peux tester les collisions.
952
if(can[cmpt_canons].visible)
953
{ // Bcle sur tous les points de collision du canon.
956
can[cmpt_canons].img[can[cmpt_canons].img_act]->
958
{ // Donne les coordonn�e du point de collision actuel du canon.
960
can[cmpt_canons].coor_x +
961
can[cmpt_canons].img[can[cmpt_canons].img_act]->
964
can[cmpt_canons].coor_y +
965
can[cmpt_canons].img[can[cmpt_canons].img_act]->
967
// Bcle sur toutes les zones de collisions du vaisseau ennemi.
970
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
972
{ // Donne les coordon�es du coin sup�rieur gauche de la
973
// zone de collision du vaisseau ennemi.
975
(int)ve[cmpt_nmis].spr.coor_x +
976
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
979
(int)ve[cmpt_nmis].spr.coor_y +
980
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
982
// Test s'il le point de collision du canon se trouve � l'int�rieur de la zone de collision du vaisseau ennemi.
983
if(tmp_tsts_x >= tmp_tstd_x &&
984
tmp_tsts_y >= tmp_tstd_y &&
987
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
991
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
993
{ // On doit d�cr�menter l'�tat des dommages du vaisseau ennemi et du canon.
994
// Donne le nouvel �tat des dommages du vaisseau ennemi.
995
ve[cmpt_nmis].spr.etat_dommages -=
996
can[cmpt_canons].pow_of_dest;
997
// Donne le nouvel �tat des dommages du canon du joueur.
998
can[cmpt_canons].etat_dommages -=
999
ve[cmpt_nmis].spr.pow_of_dest;
1000
// Test si le canon est d�truite.
1001
if(can[cmpt_canons].etat_dommages <= 0)
1002
{ // On supprime le canon de la liste.
1003
Del_Element_Can(cmpt_canons, k); // Routine utilis�e pour supprimer un canon du tableau 'can'.
1004
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1006
// Le canon est en d�truit, on peux passer au canon suivant.
1007
goto fin_test_col_can_nmi_grille;
1010
{ // Si le canon n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
1011
can[cmpt_canons].affich_white = TRUE;
1013
// On test si le vaisseau ennemi est d�truit.
1014
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
1015
{ // Test si le vaisseau ennemi �tait une m�t�orite.
1016
if(ve[cmpt_nmis].type >= BIGMETEOR
1017
&& ve[cmpt_nmis].type <= SMALLMETEOR)
1018
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
1019
//Gene_Bonus_Malus_Meteor(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
1020
Gene_Bonus_Malus_Meteor(&ve[cmpt_nmis]);
1022
// On ajoute un eclat � la liste des explosions.
1023
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
1024
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
1027
ve[cmpt_nmis].spr.coor_y +
1028
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
1030
y_cg - 8, 1.0, 2, 0, 2);
1032
else // Sinon, on appel la routine normale de g�n�ration de bonus, malus.
1033
{ // Appel de la routine utilis�e pour g�n�rer soit un bonus soit un malus.
1034
//Gene_Bonus_Malus(ve[cmpt_nmis].spr.coor_x, ve[cmpt_nmis].spr.coor_y);
1035
Gene_Bonus_Malus(&ve[cmpt_nmis]);
1038
// On ajoute une explosion � la liste.
1039
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
1040
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
1041
ve[cmpt_nmis].spr.coor_y, 0.25,
1042
ve[cmpt_nmis].type, 0);
1043
// On ajoute un eclat � la liste des explosions.
1044
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
1045
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1047
ve[cmpt_nmis].spr.coor_y +
1048
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1051
// Mise � jour du score du joueur pour la destruction d'un ennemi
1053
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
1054
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
1055
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
1056
goto fin_dep_ve_grille;
1059
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
1060
ve[cmpt_nmis].affich_white = TRUE;
1062
// On ajoute une mini explosion � la liste car un canon � eu une collision.
1063
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
1064
Add_Explosion((float)tmp_tsts_x, (float)tmp_tsts_y,
1065
0.3f, MINI_EXPLOSION, 0);
1066
// Le canon est en collision avec l'ennemi, on peux passer au canon suivant.
1067
goto fin_test_col_can_nmi_grille;
1072
fin_test_col_can_nmi_grille:;
1075
// Test si l'ennemi est en collision avec le joueur.
1076
// Bcle sur tous les points de collisions du vaisseau du joueur.
1077
for(k = 0; k < vj[J1].spr.img[vj[J1].spr.img_act]->nbr_pts_col;
1079
{ // Donne les coordon�es du point de collision du vaisseau appartenant au joueur.
1081
(int)vj[J1].spr.coor_x +
1082
vj[J1].spr.img[vj[J1].spr.img_act]->xy_pts_col[k][X];
1084
(int)vj[J1].spr.coor_y +
1085
vj[J1].spr.img[vj[J1].spr.img_act]->xy_pts_col[k][Y];
1086
// Bcle sur toutes les zones de collisions du vaisseau ennemi.
1089
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1091
{ // Donne les coordon�es de la zone de collision du vaisseau ennemi.
1093
(int)ve[cmpt_nmis].spr.coor_x +
1094
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1097
(int)ve[cmpt_nmis].spr.coor_y +
1098
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1100
// Test si le point de collision du vaisseau du joueur se trouve � l'int�rieur de la
1101
// zone de collision du vaisseau ennemi.
1102
if(tmp_tsts_x >= tmp_tstd_x &&
1103
tmp_tsts_y >= tmp_tstd_y &&
1106
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1110
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1112
{ // On doit d�cr�menter l'�tat des dommages des deux vaisseaux.
1113
// Donne le nouvel �tat des dommages du vaisseau ennemi.
1114
ve[cmpt_nmis].spr.etat_dommages -=
1115
(vj[J1].spr.pow_of_dest << 1);
1116
// Test si le vaisseau du joueur est invincible dans le but de d�cendre son �nergie.
1117
if(!vj[J1].invincible)
1118
{ // Test si l'�nergie du joueur �tait au maximum.
1119
if(vj[J1].spr.etat_dommages == vj[J1].spr.pow_of_dest)
1120
{ // Indique que l'animation d'ouverture de l'option d'energie doit s'effectuer.
1121
Init_Anim_Option(1, FALSE);
1123
// Donne le nouvel �tat des dommages du vaisseau du joueur.
1124
vj[J1].spr.etat_dommages -=
1125
ve[cmpt_nmis].spr.pow_of_dest;
1127
// Demande un r�affichage de la barre d'�nergie du joueur.
1128
bar_nrj_player = TRUE;
1129
// Test si le vaisseau du joueur est d�truit.
1130
if(vj[J1].spr.etat_dommages <= 0)
1131
{ // Indique que le joueur est Game Over.
1132
game_over_player_one = TRUE;
1135
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
1136
vj[J1].affich_white = TRUE;
1138
// On ajoute la vitesse de d�placement du vaisseau ennemi � celle du vaisseau ami.
1139
// Test le sens de d�placement de la grille.
1140
if(grille.sens_dep == GAUCHE)
1141
{ // Nouvelle vitesse du joueur apr�s la collision avec un des vaisseaux de la grille.
1142
vj[J1].vitesse_x -= grille.vit_dep_x;
1143
vj[J1].vitesse_y += grille.vit_dep_y;
1145
else // Sinon, la grille se d�place vers la droite.
1146
{ // Nouvelle vitesse du joueur apr�s la collision avec un des vaisseaux de la grille.
1147
vj[J1].vitesse_x += grille.vit_dep_x;
1148
vj[J1].vitesse_y += grille.vit_dep_y;
1150
// On test si le vaisseau ennemi est d�truit du fait d'une collision avec le joueur.
1151
if(ve[cmpt_nmis].spr.etat_dommages <= 0)
1152
{ // On ajoute une explosion � la liste.
1153
if(nbr_exps < (MAX_NMI_ON_SCREEN - 1))
1154
Add_Explosion(ve[cmpt_nmis].spr.coor_x,
1155
ve[cmpt_nmis].spr.coor_y, 0.25,
1156
ve[cmpt_nmis].type, 0);
1157
// On ajoute un eclat � la liste des explosions.
1158
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
1159
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1161
ve[cmpt_nmis].spr.coor_y +
1162
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1165
// Mise � jour du score du joueur pour la destruction d'un ennemi
1167
ve[cmpt_nmis].spr.pow_of_dest << 2 << bonusx;
1168
// Indique que le vaisseau ennemi doit clignoter avant de disparaitre.
1169
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
1170
goto fin_dep_ve_grille;
1173
{ // Si le vaisseau n'est pas d�truit, on indique qu'il faudra l'afficher la prochaine fois en blanc.
1174
ve[cmpt_nmis].affich_white = TRUE;
1176
// Le vaisseau du joueur est entr� en collision avec le vaisseau ennemi, on peux sortir du test.
1177
goto fin_tst_col_vnmi_dep_ve_grille;
1180
} // Fin du test pour savoir si le joueur est en collision avec un vaisseau ennemi.
1181
fin_tst_col_vnmi_dep_ve_grille:;
1182
} // Fin du test si le joueur est Game Over.
1183
} // Fin du test pour savoir si l'ennemi est mort et si on est en train de le faire clignoter.
1184
} // Fin du test si on doit afficher le vaisseau ennemi ou non.
1189
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1190
// deplacement=2 : ennemis speciaux
1191
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1192
// Cas des ennemis sp�ciaux qui traversent l'�cran de part en part.
1194
{ // Test le type de vaisseau sp�ciaux.
1195
switch (ve[cmpt_nmis].type)
1196
{ // Vaisseaux se d�placant comme un missile.
1198
{ // Test si la pause est activ�e ou pas.
1199
if(!player_pause && etat_menu == MENU_OFF
1200
&& _score::getActionExecution() == 0)
1201
{ // Calcul du nouvel angle en fonction de l'ancien.
1202
ve[cmpt_nmis].angle_tir =
1203
Calcul_New_Angle(ve[cmpt_nmis].angle_tir,
1204
Calc_Angle_Tir((short)
1205
(ve[cmpt_nmis].spr.coor_x +
1207
img[ve[cmpt_nmis].spr.
1209
(short)(ve[cmpt_nmis].spr.
1212
img[ve[cmpt_nmis].spr.
1214
(short)(vj[J1].spr.coor_x +
1215
vj[J1].spr.img[vj[J1].
1219
(short)(vj[J1].spr.coor_y +
1220
vj[J1].spr.img[vj[J1].
1224
ve[cmpt_nmis].agilite);
1226
// On donne les nouvelles coordon�es du vaisseau ennemi.
1227
ve[cmpt_nmis].spr.coor_x =
1228
Deplacement_Tir_X(ve[cmpt_nmis].angle_tir,
1229
ve[cmpt_nmis].spr.vitesse,
1230
ve[cmpt_nmis].spr.coor_x -
1231
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
1232
img_old_angle]->x_cg);
1233
ve[cmpt_nmis].spr.coor_y =
1234
Deplacement_Tir_Y(ve[cmpt_nmis].angle_tir,
1235
ve[cmpt_nmis].spr.vitesse,
1236
ve[cmpt_nmis].spr.coor_y -
1237
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].
1238
img_old_angle]->y_cg);
1240
// Recherche de l'image � afficher en fonction de l'angle.
1241
if(sign(ve[cmpt_nmis].angle_tir) < 0)
1242
ve[cmpt_nmis].img_angle =
1243
(short)((ve[cmpt_nmis].angle_tir + DEUX_PI) / PI_SUR_16);
1245
ve[cmpt_nmis].img_angle =
1246
(short)(ve[cmpt_nmis].angle_tir / PI_SUR_16);
1247
// Sauvegarde l'angle pour le calcul du prochain angle.
1248
ve[cmpt_nmis].img_old_angle = ve[cmpt_nmis].img_angle;
1249
// Pour �viter un indice de tableau n�gatif.
1250
ve[cmpt_nmis].img_angle = (short)abs(ve[cmpt_nmis].img_angle);
1251
// Pour �viter un angle de tir sup�rieur au nombre d'images du sprite.
1252
if(ve[cmpt_nmis].img_angle >= ve[cmpt_nmis].spr.nbr_img)
1253
ve[cmpt_nmis].img_angle =
1254
(short)(ve[cmpt_nmis].spr.nbr_img - 1);
1256
// Donne la nouvelle coordon�e X du tir.
1257
ve[cmpt_nmis].spr.coor_x +=
1258
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].img_old_angle]->x_cg;
1259
// Donne la nouvelle coordon�e Y du tir.
1260
ve[cmpt_nmis].spr.coor_y +=
1261
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].img_old_angle]->y_cg;
1262
//Donne la valeur de l'image a afficher.
1263
ve[cmpt_nmis].spr.img_act = ve[cmpt_nmis].img_angle;
1267
// Test si on doit ou non afficher le sprite.
1268
if(((short)ve[cmpt_nmis].spr.coor_y +
1269
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1271
|| ((short)ve[cmpt_nmis].spr.coor_x +
1272
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1274
|| (short)ve[cmpt_nmis].spr.coor_y >=
1275
DEBUT_ECRAN_Y + HAUT_ECR_RAM
1276
|| (short)ve[cmpt_nmis].spr.coor_x >=
1277
DEBUT_ECRAN_X + LARG_ECR_RAM)
1278
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1279
ve[cmpt_nmis].visible = FALSE;
1280
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1281
if((short)ve[cmpt_nmis].spr.coor_x < (BANDE_DE_CLIP - 64) ||
1282
(short)ve[cmpt_nmis].spr.coor_y < (BANDE_DE_CLIP - 64) ||
1283
(short)ve[cmpt_nmis].spr.coor_y >
1284
(BANDE_DE_CLIP + HAUT_ECR_RAM + 64)
1285
|| (short)ve[cmpt_nmis].spr.coor_x >
1286
(BANDE_DE_CLIP + LARG_ECR_RAM + 64))
1287
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1288
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1289
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1291
// Le vaisseau est d�truit, on peux sortir de la bcle.
1292
goto fin_dep_ve_speciaux;
1295
else // Sinon, on doit l'afficher.
1296
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1297
ve[cmpt_nmis].visible = TRUE;
1303
// Vaisseaux se d�placant du haut de l'�cran vers le bas et qui remontent.
1309
{ // Test si la pause est activ�e ou pas.
1310
if(!player_pause && etat_menu == MENU_OFF
1311
&& _score::getActionExecution() == 0)
1312
{ // Test si le vaisseau ennemi est dans sa phase de retournement.
1313
if(ve[cmpt_nmis].retournement)
1314
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1315
ve[cmpt_nmis].spr.nbr_vbl_act++;
1316
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1317
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1318
ve[cmpt_nmis].spr.nbr_tot_vbl)
1319
{ // On initialise le compteur de VBLs.
1320
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1321
// On passe � l'image suivante.
1322
ve[cmpt_nmis].spr.img_act++;
1323
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
1324
if(ve[cmpt_nmis].spr.img_act >=
1325
(ve[cmpt_nmis].spr.nbr_img - 1))
1326
{ // On clip l'image de l'animation � afficher.
1327
ve[cmpt_nmis].spr.img_act =
1328
(short)(ve[cmpt_nmis].spr.nbr_img - 1);
1329
// On indique que la phase de retournement du vaiseau ennemi est termin�e.
1330
ve[cmpt_nmis].retournement = FALSE;
1331
// On indique que le vaisseau ennemi vient de changer de direction.
1332
ve[cmpt_nmis].change_dir = TRUE;
1336
else // Sinon, le vaisseau ennemi n'est pas dans sa phase de retournement.
1337
{ // Test si le vaisseau ennemi n'a pas encore chang� de direction.
1338
if(!ve[cmpt_nmis].change_dir)
1339
{ // Test si la vitesse de d�placement est � z�ro.
1340
if(ve[cmpt_nmis].spr.vitesse >= -0.1
1341
&& ve[cmpt_nmis].spr.vitesse <= 0.1)
1342
{ // On indique qu'il faut effectuer le retournement du vaisseau ennemi.
1343
ve[cmpt_nmis].retournement = TRUE;
1347
// On d�cr�mente la vitesse de d�placement du vaisseau.
1348
ve[cmpt_nmis].spr.vitesse -= 0.02f;
1349
// On donne les nouvelles coordon�es du vaisseau ennemi.
1350
ve[cmpt_nmis].spr.coor_y += ve[cmpt_nmis].spr.vitesse;
1352
// Test si on doit ou non afficher le sprite.
1353
if(((short)ve[cmpt_nmis].spr.coor_y +
1354
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1356
|| (short)ve[cmpt_nmis].spr.coor_y >=
1357
DEBUT_ECRAN_Y + HAUT_ECR_RAM)
1358
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1359
ve[cmpt_nmis].visible = FALSE;
1360
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1361
if((short)ve[cmpt_nmis].spr.coor_y < DEBUT_ECRAN_Y
1362
&& ve[cmpt_nmis].change_dir)
1363
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1364
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1365
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1367
// Le vaisseau est d�truit, on peux sortir de la bcle.
1368
goto fin_dep_ve_speciaux;
1371
else // Sinon, on doit l'afficher.
1372
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1373
ve[cmpt_nmis].visible = TRUE;
1378
case ETB_SHURIKY: //(ETB) Ennemi geree au gardien 12 (gardien12.cpp)
1379
// le gardien est mort ???
1380
if(ve[iNumeroGardien].type != KAMEAMEA
1381
|| ve[iNumeroGardien].prev_object == MAX_NMI_ON_SCREEN)
1383
ve[cmpt_nmis].type = SHURIKY;
1386
case SAAKEY: // (ETB) ennemi geree au gardien 14 (gardien14.cpp)
1387
//le gardien est mort ???
1388
if(ve[iNumeroGardien].type != GHOTTEN
1389
|| ve[iNumeroGardien].prev_object == MAX_NMI_ON_SCREEN)
1391
if(ve[cmpt_nmis].spr.img_act >= 31)
1393
for(int _iImage = 0; _iImage < ve[cmpt_nmis].spr.nbr_img;
1395
ve[cmpt_nmis].spr.img[_iImage] =
1396
(image *) & enemi[SAAKAMIN][_iImage];
1397
ve[cmpt_nmis].spr.img_act = 0;
1398
ve[cmpt_nmis].spr.nbr_tot_vbl = 3;
1399
ve[cmpt_nmis].type = SAAKAMIN;
1403
case SAAKAMIN: // (ETB) ennemi geree au gardien 14 (gardien14.cpp)
1404
//le gardien est mort ???
1405
if(ve[iNumeroGardien].type != GHOTTEN
1406
|| ve[iNumeroGardien].prev_object == MAX_NMI_ON_SCREEN)
1408
ve[cmpt_nmis].type = SHURIKY;
1412
// Vaisseaux se d�placant du haut de l'�cran vers le bas.
1436
{ // Test si la pause est activ�e ou pas.
1437
if(!player_pause && etat_menu == MENU_OFF
1438
&& _score::getActionExecution() == 0)
1439
{ // On donne les nouvelles coordon�es du vaisseau ennemi.
1440
ve[cmpt_nmis].spr.coor_y += ve[cmpt_nmis].spr.vitesse;
1442
// Test si on doit ou non afficher le sprite.
1443
if(((short)ve[cmpt_nmis].spr.coor_y +
1444
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1446
|| (short)ve[cmpt_nmis].spr.coor_y >=
1447
DEBUT_ECRAN_Y + HAUT_ECR_RAM)
1448
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1449
ve[cmpt_nmis].visible = FALSE;
1450
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1451
if((short)ve[cmpt_nmis].spr.coor_y >=
1452
DEBUT_ECRAN_Y + HAUT_ECR_RAM)
1453
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1454
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1455
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1457
// Le vaisseau est d�truit, on peux sortir de la bcle.
1458
goto fin_dep_ve_speciaux;
1461
else // Sinon, on doit l'afficher.
1462
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1463
ve[cmpt_nmis].visible = TRUE;
1467
// Vaisseaux se d�placant du bas de l'�cran vers le haut.
1473
{ // Test si la pause est activ�e ou pas.
1474
if(!player_pause && etat_menu == MENU_OFF
1475
&& _score::getActionExecution() == 0)
1476
{ // On donne les nouvelles coordon�es du vaisseau ennemi.
1477
ve[cmpt_nmis].spr.coor_y += ve[cmpt_nmis].spr.vitesse;
1479
// Test si on doit ou non afficher le sprite.
1480
if(((short)ve[cmpt_nmis].spr.coor_y +
1481
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1483
|| (short)ve[cmpt_nmis].spr.coor_y >=
1484
DEBUT_ECRAN_Y + HAUT_ECR_RAM)
1485
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1486
ve[cmpt_nmis].visible = FALSE;
1487
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1488
if((short)ve[cmpt_nmis].spr.coor_y < DEBUT_ECRAN_Y)
1489
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1490
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1491
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1493
// Le vaisseau est d�truit, on peux sortir de la bcle.
1494
goto fin_dep_ve_speciaux;
1497
else // Sinon, on doit l'afficher.
1498
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1499
ve[cmpt_nmis].visible = TRUE;
1503
// Vaisseaux se d�placant horizontalement de la droite vers la gauche.
1508
{ // Test si la pause est activ�e ou pas.
1509
if(!player_pause && etat_menu == MENU_OFF
1510
&& _score::getActionExecution() == 0)
1511
{ // On donne les nouvelles coordon�es du vaisseau ennemi.
1512
ve[cmpt_nmis].spr.coor_x += ve[cmpt_nmis].spr.vitesse;
1514
// Test si on doit ou non afficher le sprite.
1515
if(((short)ve[cmpt_nmis].spr.coor_x +
1516
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1518
|| (short)ve[cmpt_nmis].spr.coor_x >=
1519
DEBUT_ECRAN_X + LARG_ECR_RAM)
1520
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1521
ve[cmpt_nmis].visible = FALSE;
1522
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1523
if(((short)ve[cmpt_nmis].spr.coor_x +
1524
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1526
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1527
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1528
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1530
// Le vaisseau est d�truit, on peux sortir de la bcle.
1531
goto fin_dep_ve_speciaux;
1534
else // Sinon, on doit l'afficher.
1535
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1536
ve[cmpt_nmis].visible = TRUE;
1540
// Vaisseaux se d�placant horizontalement de la gauche vers la droite.
1544
{ // Test si la pause est activ�e ou pas.
1545
if(!player_pause && etat_menu == MENU_OFF
1546
&& _score::getActionExecution() == 0)
1547
{ // On donne les nouvelles coordon�es du vaisseau ennemi.
1548
ve[cmpt_nmis].spr.coor_x += ve[cmpt_nmis].spr.vitesse;
1550
// Test si on doit ou non afficher le sprite.
1551
if(((short)ve[cmpt_nmis].spr.coor_x +
1552
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1554
|| (short)ve[cmpt_nmis].spr.coor_x >=
1555
DEBUT_ECRAN_X + LARG_ECR_RAM)
1556
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1557
ve[cmpt_nmis].visible = FALSE;
1558
// Test si l'ennemi se trouve en dehors des coordon�es de l'�cran.
1559
if((short)ve[cmpt_nmis].spr.coor_x >=
1560
DEBUT_ECRAN_X + LARG_ECR_RAM)
1561
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1562
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1563
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1565
// Le vaisseau est d�truit, on peux sortir de la bcle.
1566
goto fin_dep_ve_speciaux;
1569
else // Sinon, on doit l'afficher.
1570
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1571
ve[cmpt_nmis].visible = TRUE;
1575
// Vaisseaux sp�ciaux se d�placant suivant une courbe.
1581
{ // Test si la pause est activ�e ou pas.
1582
if(!player_pause && etat_menu == MENU_OFF
1583
&& _score::getActionExecution() == 0)
1584
{ // On change la position du vaisseau dans la courbe.
1585
ve[cmpt_nmis].pos_vaiss[POS_CURVE]++;
1586
// Test si on doit ou non supprimer le sprite parce qu'il est sorti de la courbe.
1587
if(ve[cmpt_nmis].pos_vaiss[POS_CURVE] >=
1588
initial_curve[ve[cmpt_nmis].num_courbe].nbr_pnt_curve)
1589
{ // On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1590
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1591
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1593
// Le vaisseau est d�truit, on peux sortir de la bcle.
1594
goto fin_dep_ve_speciaux;
1596
// On donne les nouvelles coordon�es du vaisseau ennemi.
1597
ve[cmpt_nmis].spr.coor_x += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_x[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
1598
ve[cmpt_nmis].spr.coor_y += (float)initial_curve[ve[cmpt_nmis].num_courbe].delta_y[ve[cmpt_nmis].pos_vaiss[POS_CURVE]]; // Donne l'indice de progression du vaisseau soit sur la courbe, soit sur la grille.
1600
// On donne la valeur de l'image du vaisseau � afficher.
1601
ve[cmpt_nmis].spr.img_act =
1602
initial_curve[ve[cmpt_nmis].num_courbe].angle[ve[cmpt_nmis].
1605
// Test si on doit ou non afficher le sprite.
1606
if(((short)ve[cmpt_nmis].spr.coor_x +
1607
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1609
|| (short)ve[cmpt_nmis].spr.coor_x >=
1610
DEBUT_ECRAN_X + LARG_ECR_RAM
1611
|| ((short)ve[cmpt_nmis].spr.coor_y +
1612
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1614
|| (short)ve[cmpt_nmis].spr.coor_y >=
1615
DEBUT_ECRAN_Y + HAUT_ECR_RAM)
1616
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1617
ve[cmpt_nmis].visible = FALSE;
1619
else // Sinon, on doit l'afficher.
1620
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1621
ve[cmpt_nmis].visible = TRUE;
1628
{ //printf("BIGMETEOR START : %i", ve[cmpt_nmis].type) ;
1629
// Test si la pause est activ�e ou pas.
1630
if(!player_pause && etat_menu == MENU_OFF
1631
&& _score::getActionExecution() == 0)
1632
{ // On donne les nouvelles coordon�es du vaisseau ennemi.
1633
ve[cmpt_nmis].spr.coor_x += ve[cmpt_nmis].vitesse_x;
1634
ve[cmpt_nmis].spr.coor_y += ve[cmpt_nmis].vitesse_y;
1635
// On d�compte le temps d'apparition du m�t�or.
1636
ve[cmpt_nmis].temps_apparition--;
1638
// Test si on doit ou non afficher le sprite.
1639
if(((short)ve[cmpt_nmis].spr.coor_y +
1640
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->haut) <
1642
|| (short)ve[cmpt_nmis].spr.coor_y >=
1643
DEBUT_ECRAN_Y + HAUT_ECR_RAM
1644
|| ((short)ve[cmpt_nmis].spr.coor_x +
1645
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->larg) <
1647
|| (short)ve[cmpt_nmis].spr.coor_x >=
1648
DEBUT_ECRAN_X + LARG_ECR_RAM)
1649
{ // Indique que le sprite n'est pas visible, on n'a donc pas besoin de faire de tests de collision avec lui.
1650
ve[cmpt_nmis].visible = FALSE;
1651
// Test si le temps d'apparition de la m�t�orite est �coul� et si oui, elle peut-etre d�truite.
1652
if(ve[cmpt_nmis].temps_apparition < 0)
1653
{ // On enl�ve la m�t�orite de la liste des vaisseaux ennemis.
1654
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1655
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1657
// Le vaisseau est d�truit, on peux sortir de la bcle.
1658
goto fin_dep_ve_speciaux;
1661
else // Sinon, on doit l'afficher.
1662
{ // Indique que le sprite est visible, on devra donc faire les tests de collision avec lui.
1663
ve[cmpt_nmis].visible = TRUE;
1664
// Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1665
ve[cmpt_nmis].spr.nbr_vbl_act++;
1666
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1667
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1668
ve[cmpt_nmis].spr.nbr_tot_vbl)
1669
{ // On initialise le compteur de VBLs.
1670
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1671
// On passe � l'image suivante.
1672
ve[cmpt_nmis].spr.img_act += ve[cmpt_nmis].sens_anim;
1673
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
1674
if(ve[cmpt_nmis].spr.img_act >= ve[cmpt_nmis].spr.nbr_img)
1675
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1676
ve[cmpt_nmis].spr.img_act = 0;
1678
// Test si on doit mettre a jour l'image actuelle
1679
if(ve[cmpt_nmis].spr.img_act < 0)
1680
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1681
ve[cmpt_nmis].spr.img_act = NBR_IMAGES_METEOR - 1;
1688
// Test si le vaisseau ennemi sp�cial est visible.
1689
if(ve[cmpt_nmis].visible == TRUE)
1690
{ // Test si on est en pr�sence de vaisseaux sp�ciaux ayant une animation cyclique sur 32 images.
1691
// Si oui, on met � jour la prochaine image du sprite � afficher.
1692
// Pour cela, on test tous ceux qui n'ont pas une animation cyclique car il y en a moins que les autres.
1693
if(ve[cmpt_nmis].type != BIGMETEOR
1694
&& ve[cmpt_nmis].type != NORMALMETEOR
1695
&& ve[cmpt_nmis].type != SMALLMETEOR
1696
&& ve[cmpt_nmis].type != BLAVIRTHE
1697
&& ve[cmpt_nmis].type != BLEUERCKS
1698
&& ve[cmpt_nmis].type != ROTIES
1699
&& ve[cmpt_nmis].type != STENCHIES
1700
&& ve[cmpt_nmis].type != MADIRIANS
1701
&& ve[cmpt_nmis].type != PERTURBIANS
1702
&& ve[cmpt_nmis].type != HOCKYS && ve[cmpt_nmis].type != BAINIES
1703
&& ve[cmpt_nmis].type != TOUTIES
1704
&& ve[cmpt_nmis].type != VIONIEES
1705
&& ve[cmpt_nmis].type != ANGOUFF
1706
&& ve[cmpt_nmis].type != CLOWNIES && ve[cmpt_nmis].type != EFFIES
1707
&& ve[cmpt_nmis].type != SAPOUCH
1708
&& ve[cmpt_nmis].type != DIMITINIANS
1709
&& ve[cmpt_nmis].type != GAFFIES
1710
&& ve[cmpt_nmis].type != ARCHINIANS
1711
&& ve[cmpt_nmis].type != TODHAIRIES
1712
&& ve[cmpt_nmis].type != DEFECTINIANS
1713
&& ve[cmpt_nmis].type != SOONIEES
1714
&& ve[cmpt_nmis].type != SOUKEE)
1715
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1716
ve[cmpt_nmis].spr.nbr_vbl_act++;
1717
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1718
if(ve[cmpt_nmis].spr.nbr_vbl_act >= ve[cmpt_nmis].spr.nbr_tot_vbl)
1719
{ // On initialise le compteur de VBLs.
1720
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1721
// On passe � l'image suivante.
1722
ve[cmpt_nmis].spr.img_act++;
1723
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
1724
if(ve[cmpt_nmis].spr.img_act >= ve[cmpt_nmis].spr.nbr_img)
1725
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1726
ve[cmpt_nmis].spr.img_act = 0;
1730
// Test si le vaisseau ennemi va de droite vers la gauche et vice-versa.
1731
// Si oui, on met � jour la prochaine image du sprite � afficher.
1732
if(ve[cmpt_nmis].type == DIMITINIANS
1733
|| ve[cmpt_nmis].type == TODHAIRIES
1734
|| ve[cmpt_nmis].type == DEFECTINIANS
1735
|| ve[cmpt_nmis].type == SOONIEES)
1736
{ // Test si le sens de comptage de l'animation est d�croissant.
1737
if(ve[cmpt_nmis].sens_anim)
1738
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1739
ve[cmpt_nmis].spr.nbr_vbl_act++;
1740
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1741
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1742
ve[cmpt_nmis].spr.nbr_tot_vbl)
1743
{ // On initialise le compteur de VBLs.
1744
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1745
// On passe � l'image suivante.
1746
ve[cmpt_nmis].spr.img_act--;
1747
// Test si le num�ro de l'image actuelle n'est pas inf�rieur � z�ro.
1748
if(ve[cmpt_nmis].spr.img_act < 0)
1749
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1750
ve[cmpt_nmis].spr.img_act = 0;
1751
ve[cmpt_nmis].sens_anim = 0; // Donne un sens croissant pour le comptage des images.
1755
else // Le sens de comptage des images de l'animation est croissant.
1756
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1757
ve[cmpt_nmis].spr.nbr_vbl_act++;
1758
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1759
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1760
ve[cmpt_nmis].spr.nbr_tot_vbl)
1761
{ // On initialise le compteur de VBLs.
1762
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1763
// On passe � l'image suivante.
1764
ve[cmpt_nmis].spr.img_act++;
1765
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
1766
if(ve[cmpt_nmis].spr.img_act >= ve[cmpt_nmis].spr.nbr_img)
1767
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1768
ve[cmpt_nmis].spr.img_act =
1769
(short)(ve[cmpt_nmis].spr.nbr_img - 1);
1770
ve[cmpt_nmis].sens_anim = 1; // Donne un sens d�croissant pour le comptage des images.
1775
// Test si on est en pr�sence d'un vaisseau dont le cannon suit le joueur.
1776
// Si oui, on met � jour la prochaine image du sprite � afficher.
1777
if(ve[cmpt_nmis].type == PERTURBIANS ||
1778
ve[cmpt_nmis].type == GAFFIES ||
1779
ve[cmpt_nmis].type == HOCKYS ||
1780
ve[cmpt_nmis].type == BAINIES ||
1781
ve[cmpt_nmis].type == TOUTIES ||
1782
ve[cmpt_nmis].type == ARCHINIANS)
1783
{ // Test si l'ancienne position corespond toujours � la bonne direction de tir.
1784
if(ve[cmpt_nmis].img_angle != ve[cmpt_nmis].spr.img_act)
1785
{ // Test si le sens de comptage de l'animation est d�croissant.
1786
if(ve[cmpt_nmis].sens_anim)
1787
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1788
ve[cmpt_nmis].spr.nbr_vbl_act++;
1789
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1790
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1791
ve[cmpt_nmis].spr.nbr_tot_vbl)
1792
{ // On initialise le compteur de VBLs.
1793
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1794
// On passe � l'image suivante.
1795
ve[cmpt_nmis].spr.img_act--;
1796
// Test si le num�ro de l'image actuelle n'est pas inf�rieur � z�ro.
1797
if(ve[cmpt_nmis].spr.img_act < 0)
1798
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1799
ve[cmpt_nmis].spr.img_act =
1800
(short)(ve[cmpt_nmis].spr.nbr_img - 1);
1804
else // Le sens de comptage des images de l'animation est croissant.
1805
{ // Incr�mente le compteur de VBLs pour l'affichage de l'animation.
1806
ve[cmpt_nmis].spr.nbr_vbl_act++;
1807
// Test si l'on � atteint le nombre de VBLs n�cessaires pour le changement d'image.
1808
if(ve[cmpt_nmis].spr.nbr_vbl_act >=
1809
ve[cmpt_nmis].spr.nbr_tot_vbl)
1810
{ // On initialise le compteur de VBLs.
1811
ve[cmpt_nmis].spr.nbr_vbl_act = 0;
1812
// On passe � l'image suivante.
1813
ve[cmpt_nmis].spr.img_act++;
1814
// Test si le num�ro de l'image actuelle n'est pas sup�rieur au nombre d'images totales.
1815
if(ve[cmpt_nmis].spr.img_act >= ve[cmpt_nmis].spr.nbr_img)
1816
{ // On repositionne l'image actuelle sur la premi�re image de l'animation.
1817
ve[cmpt_nmis].spr.img_act = 0;
1821
// On cherche le sens dans lequel doit tourner le cannon.
1822
// Initialisation du compteur pour la recherche dans le sens croissant.
1823
compteur = ve[cmpt_nmis].spr.img_act;
1825
// Bcle sur toutes les positions d'angle possibles.
1826
for(compteur1 = 0; compteur1 < 32; compteur1++)
1827
{ // Incr�mentation de la premi�re valeur.
1832
// Si le compteur � atteint la bonne valeur, on sort de la bcle.
1833
if(ve[cmpt_nmis].img_angle == compteur)
1836
// Initialisation du compteur pour la recherche dans le sens d�croissant.
1837
compteur = ve[cmpt_nmis].spr.img_act;
1839
// Bcle sur toutes les positions d'angle possibles.
1840
for(compteur1 = 0; compteur1 < 32; compteur1++)
1841
{ // Incr�mentation de la premi�re valeur.
1846
// Si le compteur � atteint la bonne valeur, on sort de la bcle.
1847
if(ve[cmpt_nmis].img_angle == compteur)
1850
// Si la premi�re valeur est plus petite que la seconde, on part dans le sens croissant.
1851
if(first_value < second_value)
1852
ve[cmpt_nmis].sens_anim = 0;
1853
else // Sinon, le sens de comptage des animations du canon sera d�croissant.
1854
ve[cmpt_nmis].sens_anim = 1;
1856
// Recherche du sens dans lequel doit tourner le canon.
1857
// Recherche de la position du canon par rapport � la direction du joueur humain.
1858
float angl_canon_vj =
1859
Calc_Angle_Tir((short)
1860
(ve[cmpt_nmis].spr.coor_x +
1861
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1863
(short)(ve[cmpt_nmis].spr.coor_y +
1864
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1866
(short)(vj[J1].spr.coor_x +
1867
vj[J1].spr.img[vj[J1].spr.img_act]->
1869
(short)(vj[J1].spr.coor_y +
1870
vj[J1].spr.img[vj[J1].spr.img_act]->
1872
// Recherche de l'image � afficher en fonction de l'angle.
1873
if(sign(angl_canon_vj < 0))
1874
ve[cmpt_nmis].img_angle =
1875
(short)((angl_canon_vj + DEUX_PI) / PI_SUR_16);
1877
ve[cmpt_nmis].img_angle = (short)(angl_canon_vj / PI_SUR_16);
1878
// Pour �viter un indice de tableau n�gatif.
1879
ve[cmpt_nmis].img_angle = (short)abs(ve[cmpt_nmis].img_angle);
1880
// Pour �viter un angle de tir sup�rieur au nombre d'images du sprite.
1881
if(ve[cmpt_nmis].img_angle >= ve[cmpt_nmis].spr.nbr_img)
1882
ve[cmpt_nmis].img_angle =
1883
(short)(ve[cmpt_nmis].spr.nbr_img - 1);
1885
// Test si le vaisseau ennemi est mort.
1886
if(ve[cmpt_nmis].dead)
1887
{ // Gestion de l'invincibilit� d'un vaisseau ennemi.
1888
// Retourne Vrai si le vaisseau ennemi est d�truit, Faux si on continu � le faire clignoter.
1889
if(Gere_Invincibilite_Ve(cmpt_nmis))
1890
{ // RAZ de la variable de fin de vie du vaisseau ennemi.
1891
ve[cmpt_nmis].dead = FALSE;
1892
// On enl�ve le vaisseau ennemi de la liste des vaisseaux ennemis.
1893
Del_Element_Ve(cmpt_nmis, i); // Routine utilis�e pour supprimer un vaisseau ennemi du tableau des 've'.
1894
// On se positionne sur le vaisseau ennemi que l'on vient de d�caler.
1896
goto fin_dep_ve_speciaux; // On sort de la bcle directement.
1899
else // Sinon, l'ennemi est encore en vie et visible.
1900
{ // Affichage de l'ennemi.
1902
// Test s'il y a des ondes de choc en activit�.
1904
{ // Test si l'onde de choc est en collision avec l'ennemi actuel.
1905
if(Tst_Col_Onde_Choc(cmpt_nmis))
1906
{ // On fait clignoter l'ennemi actuel avant de le faire disparaitre.
1907
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
1908
// Routine utilis�e pour ajouter une s�rie d'explosion � un gros vaisseau.
1909
Add_Serie_Of_Explosion(cmpt_nmis);
1910
// On ajoute un eclat � la liste des explosions.
1911
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
1912
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1914
ve[cmpt_nmis].spr.coor_y +
1915
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1916
y_cg - 8, 1.0, 4, 0, 1);
1917
goto fin_dep_ve_speciaux; // Sort de la gestion des vaisseau ennemis.
1920
// Test si la pause est activ�e ou pas.
1921
if(!player_pause && etat_menu == MENU_OFF
1922
&& _score::getActionExecution() == 0)
1923
{ // D�compte le temps s�parant deux tirs.
1924
ve[cmpt_nmis].cad_tir--;
1925
// Test si l'ennemi doit ou non lancer un tir.
1926
if(ve[cmpt_nmis].cad_tir <= 0 && nbr_tirs < (NBR_TIRS_MAX - 1))
1927
{ // Test si on est en pr�sence d'un vaisseau dont le cannon suit le joueur.
1928
if(ve[cmpt_nmis].type == PERTURBIANS ||
1929
ve[cmpt_nmis].type == GAFFIES ||
1930
ve[cmpt_nmis].type == HOCKYS ||
1931
ve[cmpt_nmis].type == BAINIES ||
1932
ve[cmpt_nmis].type == TOUTIES ||
1933
ve[cmpt_nmis].type == ARCHINIANS)
1934
{ // Test si la position du canon est dans la direction du joueur humain.
1935
if(ve[cmpt_nmis].img_angle == ve[cmpt_nmis].spr.img_act)
1936
goto Fait_Tirer_Le_Vaiso_Spe;
1938
else // Sinon, on est en pr�sence d'un vaisseau sp�cial tout � fait normal.
1940
Fait_Tirer_Le_Vaiso_Spe:;
1941
// Met la cadence du tir pour le vaisseau ennemi.
1942
ve[cmpt_nmis].cad_tir = ve[cmpt_nmis].cad_tir_initiale;
1943
// Bcle sur tous les points de tirs existants.
1946
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
1948
{ //Test si on est en presence d'un vaisseau qui envoi d'autres vaisseaux.
1949
if(ve[cmpt_nmis].type == NAGGYS)
1952
(int)(ve[cmpt_nmis].spr.coor_x +
1953
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1957
(int)(ve[cmpt_nmis].spr.coor_y +
1958
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.
1961
// Test si le vaisseau que l'on doit creer se trouve a l'interieur de l'ecran visible.
1962
if(tmp_pos_tst_x > DEBUT_ECRAN_X &&
1963
tmp_pos_tst_x < (DEBUT_ECRAN_X + LARG_ECR_RAM - 1)
1964
&& (nbr_nmis < (MAX_NMI_ON_SCREEN - 2)))
1965
{ // On rajoute un Vaisseau sp�cial GOZUKY dans la liste.
1966
new_ve = New_Element_Ve(); // Retourne l'indice dans le tableau 've' d'un nouvel �l�ment de la liste.
1967
// Remplissage de la structure sprite appartenant au vaisseau ennemi.
1968
ve[new_ve].spr.pow_of_dest = (short)((vj[J1].type_vaisseau << 1) + 10); // Indique la puissance de destruction du sprite.
1969
ve[new_ve].spr.etat_dommages = ve[new_ve].spr.pow_of_dest; // Indique l'�tat de domages du sprite.
1970
ve[new_ve].spr.nbr_img = 32; // Indique le nombre d'images composant le sprite.
1971
ve[new_ve].spr.img_act = (short)(((long)rand() % NBR_IMAGES_NMI_S)); // Indique l'image actuelle.
1972
ve[new_ve].spr.nbr_vbl_act = 0; // RAZ du compteur de VBL pour le passage � l'image suivante.
1973
ve[new_ve].spr.nbr_tot_vbl = 1; //2; // Indique le nombre de VBL qu'il faut pour passer � l'image suivante.
1974
// Donne l'adresse des images du sprite.
1975
for(k = 0; k < ve[new_ve].spr.nbr_img; k++)
1977
ve[new_ve].spr.img[k] =
1978
(image *) & enemi[GOZUKY][k];
1980
ve[new_ve].cad_tir_initiale = 6000; // Corespond au temps qu'il faut au vaisseau avant de pouvoir tirer � nouveau.
1981
ve[new_ve].cad_tir = ve[new_ve].cad_tir_initiale; // Initialise la variable utilis�e pour compter le temps qu'il faut au vaisseau avant de pouvoir tirer � nouveau.
1982
ve[new_ve].deplacement = SPECIAUX; // 0 indique une courbe, 1 indique une grille, 2 indique un special, 3 indique un gardien.
1983
// Donne les coordon�es x et y de d�part du vaisseau.
1984
ve[new_ve].spr.coor_x =
1985
(float)(tmp_pos_tst_x -
1986
ve[new_ve].spr.img[0]->x_cg);
1987
ve[new_ve].spr.coor_y =
1988
(float)(tmp_pos_tst_y -
1989
ve[new_ve].spr.img[0]->y_cg);
1990
ve[new_ve].spr.vitesse = 0.2f; // Donne la vitesse de d�placement du vaisseau ennemi sp�cial.
1991
ve[new_ve].type = GOZUKY; // Indique le type de vaisseau sp�cial.
1992
ve[new_ve].dead = FALSE; // Indique que l'ennemi est bien vivant.
1993
ve[new_ve].visible = TRUE; // Indique que l'ennemi est visible, on devra donc l'afficher.
1996
else //Sinon, on est en presence d'un vaisseau qui tire normalement.
1997
{ // Test s'il est possible d'ajouter un nouveau tir � la liste.
1998
if(nbr_tirs < (NBR_TIRS_MAX - 1))
1999
{ // Recherche d'un nouveau tir.
2000
new_tir = new_element_tir();
2001
// Remplissage de la structure sprite pour le tir du vaisseau ennemi.
2002
tirs[new_tir].clignote = TRUE; // Indique que l'on est en pr�sence d'un sprite ennemi qui doit clignoter.
2003
tirs[new_tir].spr.genre = ENNEMI; // Indique que c'est un sprite ennemi.
2004
tirs[new_tir].spr.trajectoire = FALSE; // Indique que la trajectoire du sprite est calcul�e une fois pour toute.
2005
tirs[new_tir].spr.nbr_img = 32; // Indique le nombre d'images composant le sprite.
2006
// Indique la puissance de destruction du sprite.
2007
tirs[new_tir].spr.pow_of_dest = 4;
2008
// Donne l'adresse des images du sprite.
2009
for(j = 0; j < tirs[new_tir].spr.nbr_img; j++)
2010
{ //Donne l'adresse des images du projectile.
2011
if(ve[cmpt_nmis].type == QUIBOULY) //Si c'est un QUIBOULY, on met des projectiles plus petits.
2013
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P1E][j]; // Corespond au Tir 2 puissance 2.
2014
tirs[new_tir].spr.pow_of_dest = 2; // On change aussi la puissance du tir.
2016
else //Sinon, on met des projectiles de taille moyenne.
2017
tirs[new_tir].spr.img[j] = (image *) & fire[TIR1P2E][j]; // Corespond au Tir 2 puissance 2.
2019
tirs[new_tir].spr.etat_dommages = tirs[new_tir].spr.pow_of_dest; // Indique l'�tat de domages du sprite.
2020
//tirs[new_tir].spr.pilote = 0; // Indique par qui est dirig� le sprite.
2021
//tirs[new_tir].spr.mode_commande = 0; // Indique le moyen par lequel on fait d�placer le sprite.
2022
tirs[new_tir].spr.img_act = 0; // Indique l'image actuelle.
2023
tirs[new_tir].spr.nbr_tot_vbl = 1; // Indique le nombre de VBL qu'il faut pour passer � l'image suivante.
2024
tirs[new_tir].spr.nbr_vbl_act = 0; // Indique le nombre de VBL compt�es actuellement.
2025
// Donne les coordonn�es d'affichage du sprite.
2026
tirs[new_tir].img_angle =
2027
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
2029
tirs[new_tir].img_old_angle = tirs[new_tir].img_angle;
2030
tirs[new_tir].spr.coor_x =
2031
ve[cmpt_nmis].spr.coor_x +
2032
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
2034
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->
2036
tirs[new_tir].spr.coor_y =
2037
ve[cmpt_nmis].spr.coor_y +
2038
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
2040
tirs[new_tir].spr.img[tirs[new_tir].img_angle]->
2042
tirs[new_tir].tmp_life_tir = 400;
2043
// Donne un angle vertical pour le tir.
2044
tirs[new_tir].angle_tir =
2045
PI_SUR_16 * tirs[new_tir].img_angle;
2046
tirs[new_tir].spr.vitesse = 1.0f + (float)num_level / 20.0f; // Donne la vitesse de d�placement du sprite.
2052
} // Fin du test pour savoir si la pause est ou non activ�e.
2054
// Si le joueur n'est pas Game Over.
2056
{ // Test les collisions entre les boules du joueur et le vaisseau ennemi.
2057
Test_Col_Bou_With_Nmi(cmpt_nmis);
2058
// Test les collisions entre les canons du joueur et le vaisseau ennemi.
2059
Test_Col_Can_With_Nmi(cmpt_nmis);
2060
// Test des collisions entre le joueur et l'ennemi sp�cial.
2061
Test_Col_Player_With_Spec_Nmi(cmpt_nmis);
2062
} // Fin du test si le joueur est Game Over.
2063
} // Fin du test pour savoir si l'ennemi est mort et si on est en train de le faire clignoter.
2064
} // Fin du test si on doit afficher le vaisseau ennemi ou non.
2065
fin_dep_ve_speciaux:
2066
//printf("fin_dep_ve_speciaux\n") ;
2071
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2072
// deplacement 3 : phase gardiens
2073
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2075
{ if(gardian_activity) //gestion du gardien ?
2077
if(ve[cmpt_nmis].dead) //oui, gardien est mort ?
2079
if(Gere_Invincibilite_Ve(cmpt_nmis)) //oui, il clignote ?
2081
ve[cmpt_nmis].dead = 0; //non, il est vraiment mort
2082
Del_Element_Ve(cmpt_nmis, i); //supprime le gardien de la liste "ve"
2084
bar_nrj_guardian = 1; //1=reaffichage
2085
goto fin_dep_ve_gardien; //on sort de la bcle directement.
2088
else //le gardien est toujours vivant
2090
if(nbr_onde_choc) //il y a des onde(s) de choc ?
2092
if(Tst_Col_Onde_Choc(cmpt_nmis)) //oui, collision gardien/onde(s) de choc
2094
Clignote_Nmi_Avant_Disparition(cmpt_nmis);
2095
Add_Serie_Of_Explosion(cmpt_nmis); //on ajoute des explosions
2096
Add_Eclats(ve[cmpt_nmis].spr.coor_x +
2097
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
2099
ve[cmpt_nmis].spr.coor_y +
2100
ve[cmpt_nmis].spr.img[ve[cmpt_nmis].spr.img_act]->
2101
y_cg - 8, 1.0, 4, 0, 1);
2104
Gere_gardien(cmpt_nmis); //gestion du gardien "gardien.cpp"
2107
fin_dep_ve_gardien:;
2115
float Deplacement_Tir_X(float angle, float vitesse, float pos_x)
2117
pos_x += (float)(cos(angle)) * vitesse;
2120
float Deplacement_Tir_Y(float angle, float vitesse, float pos_y)
2122
pos_y += (float)(sin(angle)) * vitesse;