#include "allegro.h" #include "ga2.h" #include "pmask.h" #include "pmask.c" #define MOVESPEED 1 #define GAMEDELAY 10 #define FRAMECHANGELOOPS 15 #define BSPEED 3 #define MAXPROJPERP 10 #define STDBULCOOL 15 #define BAR_H 7 /* hauteur zone inatteignable en haut de l'écran */ #define EXT_R SCREEN_W - 30 /* bordure droite extrême de l'écran */ #define EXT_L -6 /* bordure gauche */ #define DEFNBUL 3 /* variables à usages multiples */ int i,j,k; /*structures*/ struct bullet { int live; /* 0: non, 1: oui */ int xpos; int ypos; int damage; int dirflag; int dirvflag; int movehoriz; BITMAP *graph; }; struct plyr { int score; int health; int xpos; int ypos; int dirflag; /* 1: droite, -1: gauche */ int dirvflag; /* 0: pas de dir verticale, 1: bas, -1: haut */ int movehoriz; /* flag spécial pour permettre les tirs verticaux, lorsque movehoriz=0. On doit utiliser ça puisque dirflag, le flag d'orientation horizontal, ne sera jamais nul puisqu'il sert a decider quelle fonction entre drawsprite et drawsprite_flip_h qu'on utilise. C'est laid mais ça marche */ int framechange; /* compteur decroissant pour savoir quand changer de frame */ int shieldbool; /* 0: pas de shield, n>0: temps restant pour le shield */ int speedmodif; /* changement de vitesse pour les curses et boosts */ int clip; /* type de munition. 0=normal autres: pas implémentés */ int movflag; int nbb; /* nombre alloué de balles */ int nbbpresent; /* nombre présent de balles */ int bspeedmodif; /* vitesse des balles */ int bcool; /* délai entre chaque balle (compteur décroissant) */ int bcoolmodif; /* modificateur de délai entre balles */ int lastdir; /* dernière direction pour tirer lorsque pas en mouvement. 0:devant 1: bas droite, 2: bas, 3: bas gauche, 4: gauche, 5: haut gauche, 6: haut, 7: haut droite */ int diagbuffer; /* Permet de laisser compter le déplacement diagonal plus longtemps pour qu'on puisse tirer dans ces directions une fois immobilisé */ BITMAP *graph[6]; }; struct plyr blue; /* déclaration des joueurs et balles */ struct plyr red; struct bullet bluebul[MAXPROJPERP]; struct bullet redbul[MAXPROJPERP]; struct PMASK *bluemask[5], *redmask[5], *bluebulmask[MAXPROJPERP], *redbulmask[MAXPROJPERP]; PALETTE the_palette; BITMAP *ecran; DATAFILE *datafile; /* Déclarations des fonctions */ void check_victory(); void draw_health(); void move_stuff(); void projectiles(); void reset_player(struct plyr *pt); void reset_playerpos(); void load_normal_blue_graphs(); void load_normal_red_graphs(); void reset_bullet(); void destroy_sprite_masks(); void create_sprite_masks(); /* PROCÉDURES et FONCTIONS */ void check_victory() { if(blue.health==0) { red.score++; while(key[KEY_R]==0) { clear_bitmap(ecran); draw_health(); textprintf(ecran,font,0,0,2,"%d",blue.score); textprintf_right(ecran,font,SCREEN_W-4,0,6,"%d",red.score); draw_sprite(ecran,red.graph[5],red.xpos,red.ypos); blit(ecran,screen,0,0,0,0,SCREEN_W,SCREEN_H); rest(GAMEDELAY); } reset_player(&blue); reset_player(&red); reset_playerpos; } else if(red.health==0) { blue.score++; while(key[KEY_R]==0) { clear_bitmap(ecran); draw_health(); textprintf(ecran,font,0,0,2,"%d",blue.score); textprintf_right(ecran,font,SCREEN_W-4,0,6,"%d",red.score); draw_sprite(ecran,blue.graph[5],blue.xpos,blue.ypos); blit(ecran,screen,0,0,0,0,SCREEN_W,SCREEN_H); rest(GAMEDELAY); } reset_player(&blue); reset_player(&red); reset_playerpos; } } void create_sprite_masks() { int tempboucle; for(tempboucle=0;tempboucle<5;tempboucle++) { bluemask[tempboucle]=create_allegro_pmask(blue.graph[tempboucle]); redmask[tempboucle]=create_allegro_pmask(red.graph[tempboucle]); } for(tempboucle=0;tempbouclehealth=100; pt->movflag=0; pt->dirvflag=0; pt->framechange=FRAMECHANGELOOPS; pt->shieldbool=0; pt->speedmodif=0; pt->clip=0; pt->speedmodif=0; pt->nbb=DEFNBUL; pt->bspeedmodif=0; pt->bcool=STDBULCOOL; pt->bcoolmodif=0; pt->movehoriz=0; } void reset_bullet() { /* met le projectile de base dans les bitmaps des munitions. pour changer de munitions, il ne faut pas oublier de clearer les bitmaps et en fabriquer d'autres avec les bonnes dimensions */ for(i=0;i0) blue.bcool--; if(red.bcool>0) red.bcool--; if(key[KEY_LCONTROL] && blue.nbbpresentEXT_R || bluebul[i].xposSCREEN_H) { bluebul[i].live=0; bluebul[i].ypos=SCREEN_H/2; blue.nbbpresent--; } } for(i=0;iEXT_R || redbul[i].xposSCREEN_H) { redbul[i].live=0; redbul[i].ypos=SCREEN_W/2; red.nbbpresent--; } } /* collisions */ for(i=0;i0) blue.diagbuffer--; if(joy[0].stick[0].axis[0].pos>20 && joy[0].stick[0].axis[1].pos>-20 && joy[0].stick[0].axis[1].pos<20) red.lastdir=0; if(joy[0].stick[0].axis[0].pos>20 && joy[0].stick[0].axis[1].pos>20) { red.diagbuffer=8; red.lastdir=1; } if(joy[0].stick[0].axis[1].pos>20 && joy[0].stick[0].axis[0].pos>-20 && joy[0].stick[0].axis[0].pos<20) red.lastdir=2; if(joy[0].stick[0].axis[0].pos<-20 && joy[0].stick[0].axis[1].pos>20) { red.diagbuffer=8; red.lastdir=3; } if(joy[0].stick[0].axis[0].pos<-20 && joy[0].stick[0].axis[1].pos<20 && joy[0].stick[0].axis[1].pos>-20) red.lastdir=4; if(joy[0].stick[0].axis[0].pos<-20 && joy[0].stick[0].axis[1].pos<-20) { red.diagbuffer=8; red.lastdir=5; } if(joy[0].stick[0].axis[1].pos<-20 && joy[0].stick[0].axis[0].pos<20 && joy[0].stick[0].axis[0].pos>-20) red.lastdir=6; if(joy[0].stick[0].axis[0].pos>20 && joy[0].stick[0].axis[1].pos<-20) { red.diagbuffer=8; red.lastdir=7; } if(red.diagbuffer>0) red.diagbuffer--; if(!key[KEY_RIGHT] && !key[KEY_LEFT]) { blue.movehoriz=0; if(!key[KEY_UP] && !key[KEY_DOWN]) { blue.movflag=0; blue.dirvflag=0; } } if(!key[KEY_UP] && !key[KEY_DOWN]) { blue.dirvflag=0; if(!key[KEY_RIGHT] && !key[KEY_LEFT]) { blue.movehoriz=0; blue.movflag=0; } } if(joy[0].stick[0].axis[1].pos>20) { red.ypos += MOVESPEED+red.speedmodif; red.dirvflag=1; red.framechange--; if(red.movflag==0) red.movflag=1; } else if(joy[0].stick[0].axis[1].pos<-20) { red.ypos -= MOVESPEED+red.speedmodif; red.dirvflag=-1; red.framechange--; if(red.movflag==0) red.movflag=1; } if(joy[0].stick[0].axis[0].pos<-20) { red.xpos -= MOVESPEED+red.speedmodif; red.dirflag=-1; red.framechange--; if(red.movflag==0) red.movflag=1; red.movehoriz=1; } else if(joy[0].stick[0].axis[0].pos>20) { red.xpos += MOVESPEED+red.speedmodif; red.dirflag=1; red.framechange--; if(red.movflag==0) red.movflag=1; red.movehoriz=1; } if(joy[0].stick[0].axis[0].pos>-20 && joy[0].stick[0].axis[0].pos<20) { red.movehoriz=0; if(joy[0].stick[0].axis[1].pos<20 && joy[0].stick[0].axis[1].pos>-20) { red.movflag=0; red.dirvflag=0; } } if(joy[0].stick[0].axis[1].pos<20 && joy[0].stick[0].axis[1].pos>-20) { red.dirvflag=0; if(joy[0].stick[0].axis[0].pos>-20 && joy[0].stick[0].axis[0].pos<20) { red.movehoriz=0; red.movflag=0; } } if(blue.xpos>EXT_R) blue.xpos=EXT_L; if(blue.xposSCREEN_H-30) blue.ypos=BAR_H; if(blue.yposEXT_R) red.xpos=EXT_L; if(red.xposSCREEN_H-30) red.ypos=BAR_H; if(red.ypos