diff options
| -rw-r--r-- | actions.c | 465 | ||||
| -rw-r--r-- | blits.c | 25 | ||||
| -rw-r--r-- | constantes.h | 8 | ||||
| -rw-r--r-- | jouer.c | 75 | ||||
| -rw-r--r-- | magies.c | 48 | ||||
| -rw-r--r-- | prototypes.h | 26 | 
6 files changed, 355 insertions, 292 deletions
| @@ -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;  } @@ -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)\ @@ -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; @@ -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); | 
