#include #include "structures.h" #include "constantes.h" #include "prototypes.h" #include #include void Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour) { int max; int min; unsigned int continuer = 1; int degats; unsigned int Bdegats=DEGATS; int clan=ENNEMI; int selection = 0; SDL_Event event; int delay=1; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); while(ennemis[selection].etat==MORT) selection++; Fchangercurseurennemis (surfaces,positions,selection,ennemis); while (continuer) { SDL_Flip (surfaces->Pecran); SDL_WaitEvent (&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_a: delay=0; continuer = 0; if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); SDL_Flip (surfaces->Pecran); break; SELECTION_CIBLE() case SDLK_RETURN: case SDLK_f: continuer=0; max=Fcalculerdegats(persos,Vtourallie,&min,ennemis,selection,clan,TYPE_ATTAQUE); degats=(rand()%(max-min+1))+min; if(degats<0) degats=0; if(clan==ENNEMI) // si l'action se fait sur un ennemi { if(Bdegats==DEGATS) // si on inflige des degats ennemis[selection].pv-=degats; // on vire des pv else // si c'est un soin pour x raison ennemis[selection].pv+=degats; // on rajoute des pv if(ennemis[selection].pv<=0) { ennemis[selection].pv=0; ennemis[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionennemis[selection].x+surfaces->Tennemi[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionennemis[selection].y+surfaces->Tennemi[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(ennemis[selection].pv>ennemis[selection].pvinitiaux) ennemis[selection].pv=ennemis[selection].pvinitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else // sinon si on actionne sur un allié { if(Bdegats==DEGATS) persos[selection].pv-=degats; else persos[selection].pv+=degats; if(persos[selection].pv<=0) { persos[selection].pv=0; persos[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionpersos[selection].x+surfaces->Tperso[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionpersos[selection].y+surfaces->Tperso[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(persos[selection].pv>persos[selection].pvinitiaux) persos[selection].pv=persos[selection].pvinitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) Fafficherdegats (surfaces,positions,degats,clan,selection,persos); else Faffichersoins (surfaces,positions,degats,clan,selection,persos); if(clan==ENNEMI) // si l'ennemi est visé { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_Flip (surfaces->Pecran); // on supprime le cadre cible de l'ecran } if (*Vtourallie==2) { inverse_boolean(*Vtour); *Vtourallie=0; } else { (*Vtourallie)++; Fblitterpersos(surfaces,positions,persos); Fblitcoloredselection(surfaces,positions,*Vtourallie,persos); } break; default: break; } break; } } if (delay) SDL_Delay(1000); SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); } int Fcalculerdegats(PERSONNAGES persos[],int *Vtourallie,int *min,ENNEMIS ennemis[],int selection,int camp,int type) { unsigned int degats; int max; int taux; if(type==TYPE_ATTAQUE) { if(camp==ENNEMI) degats=persos[*Vtourallie].force*60-ennemis[selection].defense*50; else degats=persos[*Vtourallie].force*60-persos[selection].defense*50; } else { if(camp==ENNEMI) degats=persos[*Vtourallie].magie*60-ennemis[selection].defensemagique*50; else degats=persos[*Vtourallie].magie*60-persos[selection].defensemagique*50; } taux=degats/4; max=degats+taux; *min=degats-taux; return max; } void Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour) { SDL_Event event; unsigned int continuer=1; int nbactions=5; int page=0; int selection=0; while (continuer) { Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_NOIRE,NULL); SDL_WaitEvent (&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_a: case SDLK_ESCAPE: continuer=0; break; case SDLK_k: case SDLK_UP: if(selection!=0) selection--; else selection=nbactions-1; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_NOIRE,NULL); break; case SDLK_j: case SDLK_DOWN: if (selection!=nbactions-1) selection++; else selection=0; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_NOIRE,NULL); break; case SDLK_f: case SDLK_RETURN: SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); continuer=Fmagieelement(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,selection,Vtour); break; default: break; } } } } void Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour) { int continuer=1; int nbactions=1; int page=0; int selection=0; SDL_Event event; while (continuer) { Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_BLANCHE,NULL); SDL_WaitEvent (&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_a: continuer=0; break; case SDLK_UP: case SDLK_k: if (selection!=0) selection--; else selection=nbactions-1; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_BLANCHE,NULL); break; case SDLK_DOWN: case SDLK_j: if(selection!=nbactions-1) selection++; else selection=0; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_BLANCHE,NULL); break; case SDLK_f: case SDLK_RETURN: SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); if(selection==SOIN) continuer=Fmagiesoin(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,Vtour); break; default: break; } } } } void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int*Vtour) { SDL_Event event; unsigned int continuer=1; int nbactions=4; int page=0; int selection=0; while (continuer) { Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets); SDL_WaitEvent (&event); switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_a: continuer=0; break; case SDLK_UP: case SDLK_k: if(selection!=0) selection--; else selection=nbactions-1; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets); break; case SDLK_DOWN: case SDLK_j: if (selection!=nbactions-1) selection++; else selection=0; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets); break; case SDLK_RETURN: case SDLK_f: SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); if(page==0) { if(selection==POTION) continuer=Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour); else if(selection==ETHER) continuer=Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour); else if(selection==POTIONPLUS) continuer=Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour); } else if(page==1) { if(selection==ETHERPLUS) continuer=Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour); } break; default: break; } } } } int Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int*Vtour) { if(type==POTION&&objets->potions<=0) return 1; else if(type==POTIONPLUS&&objets->potionsplus<=0) return 1; else { int continuer=1; SDL_Event event; int selection=0; int delay=1; int soins=0; int Bdegats=SOINS; int clan=ALLIE; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); while(persos[selection].etat==MORT) selection++; Fchangercurseurpersos (surfaces,positions,selection,persos); while(continuer) { SDL_WaitEvent(&event); switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_a: delay=0; continuer = 0; if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); SDL_Flip (surfaces->Pecran); break; SELECTION_CIBLE() case SDLK_RETURN: case SDLK_f: if(type==POTION) soins=1000; else if(type==POTIONPLUS) soins=4000; if(clan==ENNEMI) { if(Bdegats==DEGATS) ennemis[selection].pv-=soins; else ennemis[selection].pv+=soins; if(ennemis[selection].pv<=0) { ennemis[selection].pv=0; ennemis[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionennemis[selection].x+surfaces->Tennemi[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionennemis[selection].y+surfaces->Tennemi[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(ennemis[selection].pv>ennemis[selection].pvinitiaux) ennemis[selection].pv=ennemis[selection].pvinitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else { if(Bdegats==DEGATS) persos[selection].pv-=soins; else persos[selection].pv+=soins; if(persos[selection].pv<=0) { persos[selection].pv=0; persos[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionpersos[selection].x+surfaces->Tperso[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionpersos[selection].y+surfaces->Tperso[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(persos[selection].pv>persos[selection].pvinitiaux) persos[selection].pv=persos[selection].pvinitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) Fafficherdegats (surfaces,positions,soins,clan,selection,persos); else Faffichersoins (surfaces,positions,soins,clan,selection,persos); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_Flip (surfaces->Pecran); } if (*Vtourallie==2) { *Vtourallie=0; inverse_boolean(*Vtour); } else { Fblitcoloredselection(surfaces,positions,*Vtourallie,persos); (*Vtourallie)++; } continuer=0; if(type==POTION) objets->potions--; else if(type==POTIONPLUS) objets->potionsplus--; break; default: break; } break; } } if (delay) SDL_Delay(1000); SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); return continuer; } } int Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int *Vtour) { if(type==ETHER&&objets->ethers<=0) return 1; else if(type==ETHERPLUS&&objets->ethersplus<=0) return 1; else { int continuer=1; SDL_Event event; int delay=1; int selection=0; int soins=0; int Bdegats=SOINS; int clan=ALLIE; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); while(persos[selection].etat==MORT) selection++; Fchangercurseurpersos (surfaces,positions,selection,persos); while(continuer) { SDL_WaitEvent(&event); switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_a: delay=0; continuer = 0; if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); SDL_Flip (surfaces->Pecran); break; SELECTION_CIBLE() case SDLK_RETURN: case SDLK_f: if(type==ETHER) soins=10; else if(type==ETHERPLUS) soins=40; if(clan==ENNEMI) { if(Bdegats==DEGATS) ennemis[selection].pm-=soins; else ennemis[selection].pm+=soins; if(ennemis[selection].pm<=0) { ennemis[selection].pm=0; ennemis[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionennemis[selection].x+surfaces->Tennemi[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionennemis[selection].y+surfaces->Tennemi[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(ennemis[selection].pm>ennemis[selection].pminitiaux) ennemis[selection].pm=ennemis[selection].pminitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis); } else { if(Bdegats==DEGATS) persos[selection].pm-=soins; else persos[selection].pm+=soins; if(persos[selection].pm<=0) { persos[selection].pm=0; persos[selection].etat=MORT; positions->Vpositionmort.x=positions->Vpositionpersos[selection].x+surfaces->Tperso[selection]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionpersos[selection].y+surfaces->Tperso[selection]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } else if(persos[selection].pm>persos[selection].pminitiaux) persos[selection].pm=persos[selection].pminitiaux; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) Fafficherdegats (surfaces,positions,soins,clan,selection,persos); else Faffichersoins (surfaces,positions,soins,clan,selection,persos); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); SDL_Flip (surfaces->Pecran); } if (*Vtourallie==2) { *Vtourallie=0; inverse_boolean(*Vtour); } else { (*Vtourallie)++; Fblitcoloredselection(surfaces,positions,*Vtourallie,persos); } continuer=0; if(type==ETHER) objets->ethers--; else if(type==ETHERPLUS) objets->ethersplus--; break; default: break; } break; } } if (delay) SDL_Delay(1000); SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); return continuer; } }