diff options
author | Olivier Gayot <duskcoder@gmail.com> | 2014-10-26 18:15:21 +0000 |
---|---|---|
committer | Olivier Gayot <duskcoder@gmail.com> | 2014-10-26 18:15:21 +0000 |
commit | f290b8cd7e40ed8688175fba312697f7da96a34e (patch) | |
tree | b9671094c14db5cd26bf5578dd95e19803eb6560 /actions.c |
game: Add a buildable version of the agme
Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
Diffstat (limited to 'actions.c')
-rw-r--r-- | actions.c | 536 |
1 files changed, 536 insertions, 0 deletions
diff --git a/actions.c b/actions.c new file mode 100644 index 0000000..ebf3af8 --- /dev/null +++ b/actions.c @@ -0,0 +1,536 @@ +#include <SDL/SDL.h>
+#include "structures.h"
+#include "constantes.h"
+#include "prototypes.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+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:
+ 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:
+ 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(Vtour);
+ *Vtourallie=0;
+ }
+ else
+ {
+ (*Vtourallie)++;
+ Fblitterpersos(surfaces,positions,persos);
+ Fblitcoloredselection(surfaces,positions,*Vtourallie,persos);
+ }
+ 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;
+ unsigned int element;
+ 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_ESCAPE:
+ continuer=0;
+ break;
+ 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_DOWN:
+ if (selection!=nbactions-1)
+ selection++;
+ else
+ selection=0;
+ page=selection/3;
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_NOIRE,NULL);
+ break;
+ 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;
+ }
+ }
+ }
+}
+
+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:
+ continuer=0;
+ break;
+ case SDLK_UP:
+ if (selection!=0)
+ selection--;
+ else
+ selection=nbactions-1;
+ page=selection/3;
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_BLANCHE,NULL);
+ break;
+ case SDLK_DOWN:
+ if(selection!=nbactions-1)
+ selection++;
+ else
+ selection=0;
+ page=selection/3;
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,MAGIE_BLANCHE,NULL);
+ break;
+ 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;
+ }
+ }
+ }
+}
+
+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:
+ continuer=0;
+ break;
+ case SDLK_UP:
+ if(selection!=0)
+ selection--;
+ else
+ selection=nbactions-1;
+ page=selection/3;
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets);
+ break;
+ case SDLK_DOWN:
+ if (selection!=nbactions-1)
+ selection++;
+ else
+ selection=0;
+ page=selection/3;
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets);
+ break;
+ case SDLK_RETURN:
+ 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;
+ }
+ }
+ }
+}
+
+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:
+ 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:
+ 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(Vtour);
+ }
+ else
+ {
+ Fblitcoloredselection(surfaces,positions,*Vtourallie,persos);
+ (*Vtourallie)++;
+ }
+ continuer=0;
+ if(type==POTION)
+ objets->potions--;
+ else if(type==POTIONPLUS)
+ objets->potionsplus--;
+ 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:
+ 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:
+ 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(Vtour);
+ }
+ else
+ {
+ (*Vtourallie)++;
+ Fblitcoloredselection(surfaces,positions,*Vtourallie,persos);
+ }
+ continuer=0;
+ if(type==ETHER)
+ objets->ethers--;
+ else if(type==ETHERPLUS)
+ objets->ethersplus--;
+ break;
+ }
+ break;
+ }
+ }
+ if (delay)
+ SDL_Delay(1000);
+ SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
+ SDL_Flip(surfaces->Pecran);
+ return continuer;
+ }
+}
+
+
+
|