summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--actions.c465
-rw-r--r--blits.c25
-rw-r--r--constantes.h8
-rw-r--r--jouer.c75
-rw-r--r--magies.c48
-rw-r--r--prototypes.h26
6 files changed, 355 insertions, 292 deletions
diff --git a/actions.c b/actions.c
index 8460341..f65535d 100644
--- a/actions.c
+++ b/actions.c
@@ -5,10 +5,14 @@
#include <stdio.h>
#include <stdlib.h>
-void Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour)
+/* TODO remove */
+OBJET objets_g;
+
+enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis)
{
int max;
int min;
+ enum action_state_t ret = ACTION_CANCELED;
unsigned int continuer = 1;
int degats;
unsigned int Bdegats=DEGATS;
@@ -46,7 +50,7 @@ void Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int
case SDLK_RETURN:
case SDLK_f:
continuer=0;
- max=Fcalculerdegats(persos, *Vtourallie,&min,ennemis,selection,clan,TYPE_ATTAQUE);
+ max=Fcalculerdegats(persos, Vtourallie,&min,ennemis,selection,clan,TYPE_ATTAQUE);
degats=(rand()%(max-min+1))+min;
if(degats<0)
degats=0;
@@ -95,17 +99,7 @@ void Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int
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);
- }
+ ret = ACTION_PERFORMED;
break;
default:
break;
@@ -149,10 +143,11 @@ int Fcalculerdegats(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemi
return max;
}
-void Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour)
+enum action_state_t Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis)
{
SDL_Event event;
unsigned int continuer=1;
+ enum action_state_t ret = ACTION_CANCELED;
int nbactions=5;
int page=0;
int selection=0;
@@ -192,17 +187,25 @@ void Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES
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);
+ ret = Fmagieelement(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis,selection);
+
+ if (ret == ACTION_PERFORMED) {
+ continuer = 0;
+ }
+
break;
default:
break;
}
}
}
+
+ return ret;
}
-void Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour)
+enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis)
{
+ enum action_state_t ret = ACTION_CANCELED;
int continuer=1;
int nbactions=1;
int page=0;
@@ -245,17 +248,24 @@ void Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAG
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);
+ ret = Fmagiesoin(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis);
+
+ if (ret == ACTION_PERFORMED) {
+ continuer = 0;
+ }
break;
default:
break;
}
}
}
+
+ return ret;
}
-void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int*Vtour)
+enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis)
{
+ enum action_state_t ret = ACTION_CANCELED;
SDL_Event event;
unsigned int continuer=1;
int nbactions=4;
@@ -264,7 +274,7 @@ void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES pers
while (continuer)
{
- Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets);
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g);
SDL_WaitEvent (&event);
switch (event.type)
{
@@ -282,7 +292,7 @@ void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES pers
else
selection=nbactions-1;
page=selection/3;
- Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets);
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g);
break;
case SDLK_DOWN:
case SDLK_j:
@@ -291,7 +301,7 @@ void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES pers
else
selection=0;
page=selection/3;
- Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,objets);
+ Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g);
break;
case SDLK_RETURN:
case SDLK_f:
@@ -300,265 +310,262 @@ void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES pers
if(page==0)
{
if(selection==POTION)
- continuer=Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour);
+ ret = Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection);
else if(selection==ETHER)
- continuer=Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour);
+ ret = Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection);
else if(selection==POTIONPLUS)
- continuer=Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour);
+ ret = Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection);
+
}
else if(page==1)
{
if(selection==ETHERPLUS)
- continuer=Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,objets,selection,Vtour);
+ ret = Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection);
}
+
+ if (ret == ACTION_PERFORMED) {
+ continuer = 0;
+ }
+
break;
default:
break;
}
}
}
+
+ return ret;
}
-int Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int*Vtour)
+enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type)
{
+ enum action_state_t ret = ACTION_CANCELED;
+ int continuer=1;
+ SDL_Event event;
+ int selection=0;
+ int delay=1;
+ int soins=0;
+ int Bdegats=SOINS;
+ int clan=ALLIE;
+
+ /* since the item does not depend on a specific character .. */
+ (void) Vtourallie;
+
if(type==POTION&&objets->potions<=0)
- return 1;
+ return ACTION_ERROR;
else if(type==POTIONPLUS&&objets->potionsplus<=0)
- return 1;
- else
+ return ACTION_ERROR;
+
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions);
+ while(persos[selection].etat==MORT)
+ selection++;
+ Fchangercurseurpersos (surfaces,positions,selection,persos);
+ while(continuer)
{
- 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)
{
- SDL_WaitEvent(&event);
- switch(event.type)
- {
- case SDL_KEYDOWN:
+ 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)
+ delay=0;
+ continuer = 0;
+ if(clan==ENNEMI)
{
- 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);
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible);
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis);
}
- 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_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies);
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;
+ 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);
+ }
+ continuer=0;
+ ret = ACTION_PERFORMED;
+ if(type==POTION)
+ objets->potions--;
+ else if(type==POTIONPLUS)
+ objets->potionsplus--;
+ break;
default:
- break;
+ break;
}
break;
- }
}
- if (delay)
- SDL_Delay(1000);
- SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
- SDL_Flip(surfaces->Pecran);
- return continuer;
}
+ if (delay)
+ SDL_Delay(1000);
+ SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
+ SDL_Flip(surfaces->Pecran);
+
+ return ret;
}
-int Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int *Vtour)
+enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type)
{
+ enum action_state_t ret = ACTION_CANCELED;
+ int continuer=1;
+ SDL_Event event;
+ int delay=1;
+ int selection=0;
+ int soins=0;
+ int Bdegats=SOINS;
+ int clan=ALLIE;
+
+ (void) Vtourallie;
+
if(type==ETHER&&objets->ethers<=0)
- return 1;
+ return ACTION_ERROR;
else if(type==ETHERPLUS&&objets->ethersplus<=0)
- return 1;
- else
+ return ACTION_ERROR;
+
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions);
+ while(persos[selection].etat==MORT)
+ selection++;
+ Fchangercurseurpersos (surfaces,positions,selection,persos);
+ while(continuer)
{
- 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)
{
- SDL_WaitEvent(&event);
- switch(event.type)
- {
- case SDL_KEYDOWN:
+ 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)
+ delay=0;
+ continuer = 0;
+ if(clan==ENNEMI)
{
- 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);
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible);
+ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis);
}
- 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_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies);
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;
+ 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);
+ }
+ continuer=0;
+ ret = ACTION_PERFORMED;
+ if(type==ETHER)
+ objets->ethers--;
+ else if(type==ETHERPLUS)
+ objets->ethersplus--;
+ break;
default:
- break;
+ break;
}
break;
- }
}
- if (delay)
- SDL_Delay(1000);
- SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
- SDL_Flip(surfaces->Pecran);
- return continuer;
}
+ if (delay)
+ SDL_Delay(1000);
+ SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
+ SDL_Flip(surfaces->Pecran);
+
+ return ret;
}
diff --git a/blits.c b/blits.c
index d7b14e1..696228e 100644
--- a/blits.c
+++ b/blits.c
@@ -26,12 +26,8 @@ void Fblitterpersos (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES perso
int i;
for(i=0;i<3;i++)
{
- if(persos[i].classe==PALADIN)
- SDL_BlitSurface(surfaces->Ppaladin,NULL,surfaces->Pecran,&positions->Vpositionpersos[i]);
- else if(persos[i].classe==PRETRE)
- SDL_BlitSurface (surfaces->Ppretre,NULL,surfaces->Pecran,&positions->Vpositionpersos[i]);
- else if(persos[i].classe==VOLEUR)
- SDL_BlitSurface(surfaces->Pvoleur,NULL,surfaces->Pecran,&positions->Vpositionpersos[i]);
+ SDL_BlitSurface(surfaces->Tperso[i], NULL, surfaces->Pecran, &positions->Vpositionpersos[i]);
+
if(persos[i].etat==MORT)
{
positions->Vpositionmort.x=positions->Vpositionpersos[i].x+surfaces->Tperso[i]->w/2-surfaces->Pmort->w/2;
@@ -378,6 +374,23 @@ void highlight_current_character(SURFACES* surfaces, PERSONNAGES persos[], int c
}
}
+void unhighlight_prev_character(SURFACES *surfaces, PERSONNAGES persos[], int character_idx)
+{
+ switch (persos[character_idx].classe) {
+ case PALADIN:
+ surfaces->Tperso[character_idx] = surfaces->Ppaladin;
+ break;
+ case PRETRE:
+ surfaces->Tperso[character_idx] = surfaces->Ppretre;
+ break;
+ case VOLEUR:
+ surfaces->Tperso[character_idx] = surfaces->Pvoleur;
+ break;
+ default:
+ abort();
+ }
+}
+
void Fblitcoloredselection (SURFACES surfaces[],POSITIONS positions[],int Vtourallie,PERSONNAGES persos[])
{
SDL_BlitSurface(surfaces->Tperso[Vtourallie],NULL,surfaces->Pecran,&positions->Vpositionpersos[Vtourallie]);
diff --git a/constantes.h b/constantes.h
index b3f9335..68872ab 100644
--- a/constantes.h
+++ b/constantes.h
@@ -49,6 +49,14 @@
#define TYPE_ATTAQUE 0
#define TYPE_MAGIE 1
+enum action_state_t {
+ ACTION_PERFORMED,
+ ACTION_CANCELED,
+ ACTION_ERROR,
+
+ ACTION_COUNT,
+};
+
#define SELECTION(nb,nb2) if (selection == nb)\
{\
if(nb2==ALLIE)\
diff --git a/jouer.c b/jouer.c
index a1b7b20..d6781e4 100644
--- a/jouer.c
+++ b/jouer.c
@@ -5,9 +5,49 @@
#include "constantes.h"
#include "prototypes.h"
+/* TODO remove and attach to the allies */
+OBJET objets_g;
+
+static int find_next_ally(PERSONNAGES persos[], int current)
+{
+ for (int i = current + 1; i < 3; ++i) {
+ if (persos[i].etat != MORT)
+ return i;
+ }
+
+ for (int i = 0; i <= current; ++i) {
+ if (persos[i].etat != MORT)
+ return i;
+ }
+
+ return -1;
+}
+
+/* function called after an action has been performed */
+static void update_current_character(SURFACES *surfaces, PERSONNAGES persos[], int *ally_idx, bool *ally_turn)
+{
+ if (*ally_turn) {
+ int next;
+
+ unhighlight_prev_character(surfaces, persos, *ally_idx);
+
+ next = find_next_ally(persos, *ally_idx);
+
+ /* if there is no next ally or they are dead */
+ if (next <= *ally_idx) {
+ inverse_boolean(*ally_turn);
+ }
+
+ *ally_idx = next;
+
+ if (*ally_turn) {
+ highlight_current_character(surfaces, persos, *ally_idx);
+ }
+ }
+}
+
int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEMIS ennemis[])
{
- OBJET objets;
unsigned int continuer=1;
int selection=0;
int i;
@@ -26,15 +66,18 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM
}
Finitialiserpositionspersos(surfaces,positions);
Fblitterfond(surfaces); // on blit le fond du jeu
- Fremplirobjets(&objets); // on monte les variables potions ether, etc
+ Fremplirobjets(&objets_g); // on monte les variables potions ether, etc
Fremplircompetencesallie(persos); // on initialise les pv, pm, xp etc DES PERSOS
Vnbennemis=Fcalculernbennemis(); // on tire aléatoirement le nombre d'ennemis présents dans le combat
Fchoisirtypeennemis(persos,surfaces,ennemis,Vnbennemis); // on choisit la classe des ennemis comme guerrier gobelin etc
Fremplirennemis(surfaces,Vnbennemis,ennemis);
- Vtour = rand() % 2; // on détermine aléatoirement si c'est les ennemis ou les persos qui tapent en premier
+ /* compute whether the allies or the enemies should begin */
+ Vtour = rand() % 2;
+
if (Vtour == ALLIE) {
/* the current character will be highlighted in red */
+ /* TODO should be generic for an enemy or an ally */
highlight_current_character(surfaces, persos, Vtourallie);
}
@@ -87,15 +130,23 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM
break;
case SDLK_RETURN:
case SDLK_f:
- if(selection==ATTAQUE)
- Fattaquer(surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour);
- else if(selection==MAGIE_BLANCHE)
- Fselectionnermagieblanche (surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour);
- else if(selection==MAGIE_NOIRE)
- Fselectionnermagienoire (surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour);
- else if(selection==TECHNIQUES){}
- else if(selection==OBJETS)
- Fselectionnerobjet(surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&objets,&Vtour);
+ {
+ enum action_state_t (*actionp)(SURFACES *, POSITIONS *, PERSONNAGES [], int, ENNEMIS[], int) = NULL;
+
+ switch (selection) {
+ case ATTAQUE: actionp = Fattaquer; break;
+ case MAGIE_BLANCHE: actionp = Fselectionnermagieblanche; break;
+ case MAGIE_NOIRE: actionp = Fselectionnermagienoire; break;
+ case TECHNIQUES: break;
+ case OBJETS: actionp = Fselectionnerobjet; break;
+ default: abort(); break;
+ }
+
+ if (actionp && (*actionp)(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis) == ACTION_PERFORMED) {
+ update_current_character(surfaces, persos, &Vtourallie, (bool *)&Vtour);
+ Fblitterpersos(surfaces,positions,persos); // on blit les persos sur l'ecran
+ }
+ }
break;
default:
break;
diff --git a/magies.c b/magies.c
index a52e8b4..ef68677 100644
--- a/magies.c
+++ b/magies.c
@@ -5,8 +5,9 @@
#include "constantes.h"
#include "prototypes.h"
-int Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element,int *Vtour)
+enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element)
{
+ enum action_state_t ret = ACTION_CANCELED;
int max;
int min;
unsigned int continuer = 1;
@@ -45,7 +46,7 @@ int Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],
case SDLK_RETURN:
case SDLK_f:
continuer=0;
- max=Fcalculerdegats(persos, *Vtourallie,&min,ennemis,selection,clan,TYPE_MAGIE);
+ max=Fcalculerdegats(persos, Vtourallie,&min,ennemis,selection,clan,TYPE_MAGIE);
degats=(rand()%(max-min+1))+min;
if(degats<0)
degats=0;
@@ -105,17 +106,7 @@ int Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],
SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible);
SDL_Flip (surfaces->Pecran);
}
- if (*Vtourallie==2)
- {
- inverse_boolean(*Vtour);
- *Vtourallie=0;
- }
- else
- {
- (*Vtourallie)++;
- Fblitterpersos(surfaces,positions,persos);
- Fblitcoloredselection(surfaces,positions,*Vtourallie,persos);
- }
+ ret = ACTION_PERFORMED;
break;
default:
break;
@@ -127,12 +118,13 @@ int Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],
SDL_Delay(1000);
SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
SDL_Flip(surfaces->Pecran);
- return continuer;
- return 0;
+
+ return ret;
}
-int Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour)
+enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis)
{
+ enum action_state_t ret = ACTION_CANCELED;
unsigned int continuer=1;
SDL_Event event;
int max;
@@ -169,7 +161,7 @@ int Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int
SELECTION_CIBLE()
case SDLK_RETURN:
case SDLK_f:
- max=Fcalculersoins(persos,Vtourallie,&min,ennemis,selection);
+ max=Fcalculersoins(persos, Vtourallie,&min,ennemis,selection);
soins=(rand()%(max-min+1))+min;
if(soins<0)
soins=0;
@@ -218,17 +210,7 @@ int Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int
SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible);
SDL_Flip (surfaces->Pecran);
}
- if (*Vtourallie==2)
- {
- *Vtourallie=0;
- inverse_boolean(*Vtour);
- }
- else
- {
- (*Vtourallie)++;
- Fblitterpersos(surfaces,positions,persos);
- Fblitcoloredselection(surfaces,positions,*Vtourallie,persos);
- }
+ ret = ACTION_PERFORMED;
continuer=0;
break;
default:
@@ -241,10 +223,10 @@ int Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int
SDL_Delay(1000);
SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats);
SDL_Flip(surfaces->Pecran);
- return continuer;
+ return ret;
}
-int Fcalculersoins(PERSONNAGES persos[],int *Vtourallie,int *min,ENNEMIS ennemis[],int selection)
+int Fcalculersoins(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemis[],int selection)
{
unsigned int soins;
int max;
@@ -254,14 +236,10 @@ int Fcalculersoins(PERSONNAGES persos[],int *Vtourallie,int *min,ENNEMIS ennemis
(void) ennemis;
(void) selection;
- soins=persos[*Vtourallie].magie*20;
+ soins=persos[Vtourallie].magie*20;
taux=soins/4;
max=soins+taux;
*min=soins-taux;
return max;
}
-
-
-
-
diff --git a/prototypes.h b/prototypes.h
index 6b97c03..3bd511a 100644
--- a/prototypes.h
+++ b/prototypes.h
@@ -1,6 +1,8 @@
#ifndef PROTOTYPES_H
#define PROTOTYPES_H
+#include "constantes.h"
+
void Fmenuprincipal (SURFACES *surfaces, POSITIONS *positions);
void Fchangersurlignage (int Vmode, SURFACES *surfaces, POSITIONS *positions);
int Fentrermode (int Vmode, SURFACES *surfaces, POSITIONS *positions);
@@ -16,36 +18,40 @@ void Fdechargerimages (SURFACES *surfaces);
void Finitialiserpositions (POSITIONS *positions, SURFACES *surfaces);
void Fblitterennemis (SURFACES *surfaces, POSITIONS *positions,ENNEMIS ennemis[],int Vnbennemis);
void Finitialiserpositionsennemis (SURFACES *surfaces, POSITIONS *positions,int Vnbennemis);
-void Fattaquer (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int*Vtour);
+
+/* actions */
+enum action_state_t Fattaquer (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int Vtourallie,ENNEMIS ennemis[],int Vnbennemis);
+enum action_state_t Fselectionnermagienoire (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis);
+enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis);
+enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int Vtourallie,ENNEMIS ennemis[],int Vnbennemis);
+enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element);
+enum action_state_t Fmagiesoin (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis);
+enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type);
+enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type);
+
void Fremplircompetencesallie (PERSONNAGES persos[]);
int Fcalculernbennemis ();
void Fchoisirtypeennemis (PERSONNAGES persos[],SURFACES *surfaces,ENNEMIS ennemis[],int Vnbennemis);
void Fremplirennemis (SURFACES *surfaces,int Vnbennemis,ENNEMIS ennemis[]);
int Fcalculerdegats(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemis[],int selection,int camp,int type);
-int Fcalculersoins(PERSONNAGES persos[],int *Vtourallie,int *min,ENNEMIS ennemis[],int selection);
+int Fcalculersoins(PERSONNAGES persos[],int Vtourallie,int *min,ENNEMIS ennemis[],int selection);
void Fchangercurseur (SURFACES *surfaces, POSITIONS *positions,int selection,ENNEMIS ennemis[]);
void Fchangercurseurennemis (SURFACES *surfaces, POSITIONS *positions,int selection,ENNEMIS ennemis[]);
void Fchangercurseurpersos (SURFACES *surfaces, POSITIONS *positions,int selection,PERSONNAGES persos[]);
void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int camp, int cible,PERSONNAGES persos[]);
-void Fremplircompetencesennemis (ENNEMIS ennemis[],int Vnbennemis);
-void Fselectionnermagienoire (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int*Vtour);
-int Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element,int *Vtour);
void Fblitteractivedesactive (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[],int selection);
void Fchangeractionselectionnee(SURFACES *surfaces, POSITIONS *positions,int selection,int page,int nbactions,int type,OBJET *objets);
+void Fremplircompetencesennemis (ENNEMIS ennemis[],int Vnbennemis);
void Fblitterpvcible (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[],int selection);
void Fblitterpmcible (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[],int selection);
void Fchangermagienoireselectionnee(SURFACES *surfaces,POSITIONS *positions,int selection,int page,int nbactions);
-void Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour);
void Fchangermagieblancheselectionnee(SURFACES *surfaces, POSITIONS *positions,int selection,int page,int nbactions);
void Fblitterpmpvpersos(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int selection);
-int Fmagiesoin (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,int *Vtour);
void Faffichersoins (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible,PERSONNAGES persos[]);
void Fremplirobjets(OBJET *objets);
-void Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int*Vtour);
-int Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int*Vtour);
-int Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int *Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type,int *Vtour);
void Fblitterfond(SURFACES* surfaces);
void highlight_current_character(SURFACES *surfs, PERSONNAGES persos[], int character_idx);
+void unhighlight_prev_character(SURFACES *surfs, PERSONNAGES persos[], int character_idx);
void Fblitcoloredselection (SURFACES surfaces[],POSITIONS positions[],int Vtourallie,PERSONNAGES persos[]);
Uint32 obtenirPixel(SDL_Surface *surface, int x, int y);
void definirPixel(SDL_Surface *surface, int x, int y, Uint32 pixel);