diff options
author | Olivier Gayot <duskcoder@gmail.com> | 2015-01-07 21:43:18 +0100 |
---|---|---|
committer | Olivier Gayot <duskcoder@gmail.com> | 2015-01-07 23:29:49 +0100 |
commit | 45d54652a8005ccae2466a0e4757017c7b337e3b (patch) | |
tree | 5d13f930c82edeea16d490c39017973e0a85007c | |
parent | b3295086c84b09353d5e89c6f7c743167b486a49 (diff) |
use a team / character model instead of an array of personnages
Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
-rw-r--r-- | actions.c | 134 | ||||
-rw-r--r-- | blits.c | 138 | ||||
-rw-r--r-- | competences.c | 52 | ||||
-rw-r--r-- | constantes.h | 51 | ||||
-rw-r--r-- | ia.c | 7 | ||||
-rw-r--r-- | jouer.c | 117 | ||||
-rw-r--r-- | magies.c | 54 | ||||
-rw-r--r-- | map.c | 8 | ||||
-rw-r--r-- | menuchoixpersos.c | 88 | ||||
-rw-r--r-- | players.c | 26 | ||||
-rw-r--r-- | players.h | 66 | ||||
-rw-r--r-- | prototypes.h | 43 | ||||
-rw-r--r-- | structures.h | 13 |
13 files changed, 442 insertions, 355 deletions
@@ -5,10 +5,7 @@ #include <stdio.h> #include <stdlib.h> -/* TODO remove */ -OBJET objets_g; - -enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) +enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) { int max; int min; @@ -50,7 +47,7 @@ enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGE case SDLK_RETURN: case SDLK_f: continuer=0; - max=Fcalculerdegats(persos, Vtourallie,&min,ennemis,selection,clan,TYPE_ATTAQUE); + max=Fcalculerdegats(ally, Vtourallie,&min,ennemis,selection,clan,TYPE_ATTAQUE); degats=(rand()%(max-min+1))+min; if(degats<0) degats=0; @@ -74,26 +71,28 @@ enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGE } else // sinon si on actionne sur un allié { + struct character_t *chr = &ally->chrs[selection]; + if(Bdegats==DEGATS) - persos[selection].pv-=degats; + chr->hp -= degats; else - persos[selection].pv+=degats; - if(persos[selection].pv<=0) + chr->hp += degats; + if(chr->hp <= 0) { - persos[selection].pv=0; - persos[selection].etat=MORT; + chr->hp = 0; + chr->alive = false; 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; + else if (chr->hp > chr->max_hp) + chr->hp = chr->max_hp; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) - Fafficherdegats (surfaces,positions,degats,clan,selection,persos); + Fafficherdegats (surfaces,positions,degats,clan,selection, ally); else - Faffichersoins (surfaces,positions,degats,clan,selection,persos); + Faffichersoins (surfaces,positions,degats,clan,selection, ally); if(clan==ENNEMI) // si l'ennemi est visé { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); @@ -116,7 +115,26 @@ enum action_state_t Fattaquer(SURFACES *surfaces,POSITIONS *positions,PERSONNAGE return ret; } -int Fcalculerdegats(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemis[],int selection,int camp,int type) +int compute_damages(struct character_t *src, struct character_t *dest, + enum damages_type_t type) +{ + int avg; + int min; + int max; + + if (type == DAMAGES_PHYSICAL) { + avg = src->strength * 60 - dest->defense * 50; + } else if (type == DAMAGES_MAGICAL) { + avg = src->magic * 60 - dest->spirit * 50; + } + + min = avg - avg / 4; + max = avg + avg / 4; + + return rand() % (max - min + 1) + min; +} + +int Fcalculerdegats(struct team_t *ally, int Vtourallie,int *min,ENNEMIS ennemis[],int selection,int camp,int type) { unsigned int degats; int max; @@ -125,16 +143,16 @@ int Fcalculerdegats(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemi if(type==TYPE_ATTAQUE) { if(camp==ENNEMI) - degats=persos[Vtourallie].force*60-ennemis[selection].defense*50; + degats=ally->chrs[Vtourallie].strength*60-ennemis[selection].defense*50; else - degats=persos[Vtourallie].force*60-persos[selection].defense*50; + degats=ally->chrs[Vtourallie].strength*60-ally->chrs[selection].defense*50; } else { if(camp==ENNEMI) - degats=persos[Vtourallie].magie*60-ennemis[selection].defensemagique*50; + degats=ally->chrs[Vtourallie].magic*60-ennemis[selection].defensemagique*50; else - degats=persos[Vtourallie].magie*60-persos[selection].defensemagique*50; + degats=ally->chrs[Vtourallie].magic*60-ally->chrs[selection].spirit*50; } taux=degats/4; max=degats+taux; @@ -143,7 +161,7 @@ int Fcalculerdegats(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemi return max; } -enum action_state_t Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) +enum action_state_t Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) { SDL_Event event; unsigned int continuer=1; @@ -187,7 +205,7 @@ enum action_state_t Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positi case SDLK_RETURN: SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); - ret = Fmagieelement(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis,selection); + ret = Fmagieelement(surfaces,positions, ally, Vtourallie,ennemis,Vnbennemis,selection); if (ret == ACTION_PERFORMED) { continuer = 0; @@ -203,7 +221,7 @@ enum action_state_t Fselectionnermagienoire(SURFACES *surfaces,POSITIONS *positi return ret; } -enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) +enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) { enum action_state_t ret = ACTION_CANCELED; int continuer=1; @@ -248,7 +266,7 @@ enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *posi SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); SDL_Flip(surfaces->Pecran); if(selection==SOIN) - ret = Fmagiesoin(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis); + ret = Fmagiesoin(surfaces,positions, ally, Vtourallie,ennemis,Vnbennemis); if (ret == ACTION_PERFORMED) { continuer = 0; @@ -263,7 +281,7 @@ enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *posi return ret; } -enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) +enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) { enum action_state_t ret = ACTION_CANCELED; SDL_Event event; @@ -274,7 +292,7 @@ enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,P while (continuer) { - Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g); + Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS, &ally->objects); SDL_WaitEvent (&event); switch (event.type) { @@ -292,7 +310,7 @@ enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,P else selection=nbactions-1; page=selection/3; - Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g); + Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS, &ally->objects); break; case SDLK_DOWN: case SDLK_j: @@ -301,7 +319,7 @@ enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,P else selection=0; page=selection/3; - Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS,&objets_g); + Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,OBJETS, &ally->objects); break; case SDLK_RETURN: case SDLK_f: @@ -310,17 +328,17 @@ enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,P if(page==0) { if(selection==POTION) - ret = Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection); + ret = Fpotion(surfaces,positions, ally,Vtourallie,ennemis,Vnbennemis, &ally->objects,selection); else if(selection==ETHER) - ret = Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection); + ret = Fether(surfaces,positions, ally,Vtourallie,ennemis,Vnbennemis, &ally->objects,selection); else if(selection==POTIONPLUS) - ret = Fpotion(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection); + ret = Fpotion(surfaces,positions, ally,Vtourallie,ennemis,Vnbennemis, &ally->objects,selection); } else if(page==1) { if(selection==ETHERPLUS) - ret = Fether(surfaces,positions,persos,Vtourallie,ennemis,Vnbennemis,&objets_g,selection); + ret = Fether(surfaces,positions, ally,Vtourallie,ennemis,Vnbennemis, &ally->objects,selection); } if (ret == ACTION_PERFORMED) { @@ -337,7 +355,7 @@ enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions,P return ret; } -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 Fpotion(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type) { enum action_state_t ret = ACTION_CANCELED; int continuer=1; @@ -357,9 +375,9 @@ enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES return ACTION_ERROR; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); - while(persos[selection].etat==MORT) + while (!ally->chrs[selection].alive) selection++; - Fchangercurseurpersos (surfaces,positions,selection,persos); + Fchangercurseurpersos (surfaces,positions,selection); while(continuer) { SDL_WaitEvent(&event); @@ -408,26 +426,26 @@ enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES } else { - if(Bdegats==DEGATS) - persos[selection].pv-=soins; + struct character_t *chr = &ally->chrs[selection]; + + if (Bdegats == DEGATS) + chr->hp -= soins; else - persos[selection].pv+=soins; - if(persos[selection].pv<=0) - { - persos[selection].pv=0; - persos[selection].etat=MORT; + chr->hp+=soins; + if (chr->hp <= 0) { + chr->hp = 0; + chr->alive = false; 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; + } else if (chr->hp > chr->max_hp) + chr->hp = chr->max_hp; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) - Fafficherdegats (surfaces,positions,soins,clan,selection,persos); + Fafficherdegats (surfaces,positions,soins,clan,selection, ally); else - Faffichersoins (surfaces,positions,soins,clan,selection,persos); + Faffichersoins (surfaces,positions,soins,clan,selection, ally); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); @@ -454,7 +472,7 @@ enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES return ret; } -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 Fether(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type) { enum action_state_t ret = ACTION_CANCELED; int continuer=1; @@ -473,9 +491,9 @@ enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES p return ACTION_ERROR; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); - while(persos[selection].etat==MORT) + while (!ally->chrs[selection].alive) selection++; - Fchangercurseurpersos (surfaces,positions,selection,persos); + Fchangercurseurpersos (surfaces,positions,selection); while(continuer) { SDL_WaitEvent(&event); @@ -524,26 +542,26 @@ enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES p } else { + struct character_t *chr = &ally->chrs[selection]; if(Bdegats==DEGATS) - persos[selection].pm-=soins; + chr->mp-=soins; else - persos[selection].pm+=soins; - if(persos[selection].pm<=0) + chr->mp+=soins; + if(chr->mp<=0) { - persos[selection].pm=0; - persos[selection].etat=MORT; + chr->mp=0; 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; + else if(chr->mp > chr->max_mp) + chr->mp = chr->max_mp; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) - Fafficherdegats (surfaces,positions,soins,clan,selection,persos); + Fafficherdegats (surfaces,positions,soins,clan,selection, ally); else - Faffichersoins (surfaces,positions,soins,clan,selection,persos); + Faffichersoins (surfaces,positions,soins,clan,selection, ally); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); @@ -21,20 +21,55 @@ void Fblitterennemis (SURFACES *surfaces, POSITIONS *positions,ENNEMIS ennemis[] SDL_Flip (surfaces->Pecran); } -void Fblitterpersos (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[]) +static void blit_chr_infos(SURFACES *surfaces, struct character_t *chr) { - int i; - for(i=0;i<3;i++) - { - SDL_BlitSurface(surfaces->Tperso[i], NULL, surfaces->Pecran, &positions->Vpositionpersos[i]); + TTF_Font *police=NULL; + SDL_Color fg={132,215,107,0},bg={100,0,0,0}; + char string[256]; - if(persos[i].etat==MORT) - { + SDL_Surface *surf_hp; + SDL_Surface *surf_mp; + + police=TTF_OpenFont("TIMESBI.TTF",18); + sprintf(string, "PV %d/%d ", chr->hp, chr->max_hp); + surf_hp = TTF_RenderText_Shaded(police, string, fg, bg); + sprintf(string, "PM %d/%d ", chr->mp, chr->max_mp); + surf_mp = TTF_RenderText_Shaded(police, string, fg, bg); + + chr->pos_hp.x = chr->pos.x + chr->def_surf->w / 2 - surf_hp->w / 2; + chr->pos_mp.x = chr->pos.x + chr->def_surf->w / 2 - surf_mp->w / 2; + chr->pos_hp.y = chr->pos.y + chr->def_surf->h - surf_hp->h - surf_mp->h; + chr->pos_mp.y = chr->pos_hp.y + surf_mp->h; + + SDL_BlitSurface(surf_hp, NULL, surfaces->Pecran, &chr->pos_hp); + SDL_BlitSurface(surf_mp, NULL, surfaces->Pecran, &chr->pos_mp); + + chr->pos_hp.w = surf_hp->w; + chr->pos_hp.h = surf_hp->h; + chr->pos_mp.w = surf_mp->w; + chr->pos_mp.h = surf_mp->h; + + SDL_FreeSurface(surf_hp); + SDL_FreeSurface(surf_mp); + + TTF_CloseFont(police); +} + +void blit_ally_team(SURFACES *surfaces, POSITIONS *positions, struct team_t *team) +{ + for (int i = 0; i < team->chr_cnt; i++) { + struct character_t *chr = &team->chrs[i]; + + /* TODO blit either default or red surf */ + SDL_BlitSurface(chr->def_surf, NULL, surfaces->Pecran, &positions->Vpositionpersos[i]); + + + if (!chr->alive) { positions->Vpositionmort.x=positions->Vpositionpersos[i].x+surfaces->Tperso[i]->w/2-surfaces->Pmort->w/2; positions->Vpositionmort.y=positions->Vpositionpersos[i].y+surfaces->Tperso[i]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } - Fblitterpmpvpersos(surfaces,positions,persos,i); + blit_chr_infos(surfaces, chr); } } @@ -68,11 +103,8 @@ void Fchangercurseurennemis (SURFACES *surfaces, POSITIONS *positions,int select TTF_CloseFont(police); } -void Fchangercurseurpersos (SURFACES *surfaces, POSITIONS *positions,int selection,PERSONNAGES persos[]) +void Fchangercurseurpersos (SURFACES *surfaces, POSITIONS *positions,int selection) { - /* TODO undestand if this is needed or not */ - (void) persos; - SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); SDL_Flip (surfaces->Pecran); SELECTION (0,ALLIE) @@ -179,7 +211,7 @@ void Fchangeractionselectionnee(SURFACES *surfaces, POSITIONS *positions,int sel TTF_CloseFont (police); } -void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible,PERSONNAGES persos[]) +void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible, struct team_t *ally) { char chaine[10]; TTF_Font *police = NULL; @@ -204,7 +236,7 @@ void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int c positions->Vpositiondegats.x=positions->Vpositionpersos[cible].x+surfaces->Tperso[cible]->w+30; positions->Vpositiondegats.y=positions->Vpositionpersos[cible].y+surfaces->Tperso[cible]->h/2-surfaces->Pnbdegats->h/2; SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositionpvpersos[cible],surfaces->Pecran,&positions->Vpositionpvpersos[cible]); - Fblitterpersos(surfaces,positions,persos); + blit_ally_team(surfaces, positions, ally); } positions->Vpositiondegats.w=surfaces->Pnbdegats->w; positions->Vpositiondegats.h=surfaces->Pnbdegats->h; @@ -213,12 +245,11 @@ void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int c TTF_CloseFont (police); } -void Faffichersoins (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible,PERSONNAGES persos[]) +void Faffichersoins (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible, struct team_t *ally) { char chaine[10]; - - /* TODO understand if this is needed or not */ - (void) persos; + + (void) ally; TTF_Font *police = NULL; SDL_Color fg = {80,255,80,0}; @@ -323,30 +354,6 @@ void Fblitterpmcible (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[], TTF_CloseFont (police); } -void Fblitterpmpvpersos(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int selection) -{ - TTF_Font *police=NULL; - SDL_Color fg={132,215,107,0},bg={100,0,0,0}; - char chaine[2][50]; - police=TTF_OpenFont("TIMESBI.TTF",18); - sprintf(chaine[0],"PV %d/%d ",persos[selection].pv,persos[selection].pvinitiaux); - surfaces->Ppvpersos=TTF_RenderText_Shaded(police,chaine[0],fg,bg); - sprintf(chaine[1],"PM %d/%d ",persos[selection].pm,persos[selection].pminitiaux); - surfaces->Ppmpersos=TTF_RenderText_Shaded(police,chaine[1],fg,bg); - positions->Vpositionpvpersos[selection].x=(positions->Vpositionpersos[selection].x+surfaces->Tperso[selection]->w/2-surfaces->Ppvpersos->w/2); - positions->Vpositionpmpersos[selection].x=(positions->Vpositionpersos[selection].x+surfaces->Tperso[selection]->w/2-surfaces->Ppmpersos->w/2); - positions->Vpositionpvpersos[selection].y=(positions->Vpositionpersos[selection].y+surfaces->Tperso[selection]->h-surfaces->Ppvpersos->h-surfaces->Ppmpersos->h); - positions->Vpositionpmpersos[selection].y=(positions->Vpositionpersos[selection].y+surfaces->Tperso[selection]->h-surfaces->Ppmpersos->h); - SDL_BlitSurface(surfaces->Ppvpersos,NULL,surfaces->Pecran,&positions->Vpositionpvpersos[selection]); - SDL_BlitSurface(surfaces->Ppmpersos,NULL,surfaces->Pecran,&positions->Vpositionpmpersos[selection]); - positions->Vpositionpvpersos[selection].w=surfaces->Ppvpersos->w; - positions->Vpositionpvpersos[selection].h=surfaces->Ppvpersos->h; - positions->Vpositionpmpersos[selection].w=surfaces->Ppmpersos->w; - positions->Vpositionpmpersos[selection].h=surfaces->Ppmpersos->h; - - TTF_CloseFont(police); -} - void Fblitterfond(SURFACES* surfaces) { SDL_Rect position; @@ -356,50 +363,3 @@ void Fblitterfond(SURFACES* surfaces) SDL_BlitSurface(surfaces->Pfondjeu,NULL,surfaces->Pecran,&position); SDL_Flip(surfaces->Pecran); } - -void highlight_current_character(SURFACES* surfaces, PERSONNAGES persos[], int character_idx) -{ - switch (persos[character_idx].classe) { - case PALADIN: - surfaces->Tperso[character_idx] = surfaces->red_paladin; - break; - case PRETRE: - surfaces->Tperso[character_idx] = surfaces->red_priest; - break; - case VOLEUR: - surfaces->Tperso[character_idx] = surfaces->red_thief; - break; - default: - abort(); - } -} - -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]); - Fblitterpmpvpersos(surfaces,positions,persos,Vtourallie); - SDL_Flip(surfaces->Pecran); -} - - - - - - diff --git a/competences.c b/competences.c index e25acf1..7acd8b9 100644 --- a/competences.c +++ b/competences.c @@ -66,55 +66,3 @@ void Fremplircompetencesennemis (ENNEMIS ennemis[],int Vnbennemis) } } } - -void Fremplircompetencesallie (PERSONNAGES persos[]) -{ - int i; - - for(i=0;i<3;i++) - { - if(persos[i].classe==PALADIN) - { - persos[i].xp = 0; - persos[i].nv = 0; - persos[i].force = 20; - persos[i].magie = 5; - persos[i].defense = 15; - persos[i].defensemagique = 10; - persos[i].pv = 1500; - persos[i].pvinitiaux = 1500; - persos[i].pminitiaux = 40; - persos[i].pm = 40; - persos[i].etat = VIE; - } - else if (persos[i].classe == PRETRE) - { - persos[i].xp = 0; - persos[i].nv = 0; - persos[i].force = 5; - persos[i].magie = 20; - persos[i].defense = 10; - persos[i].defensemagique = 20; - persos[i].pv = 1000; - persos[i].pvinitiaux = 1000; - persos[i].pminitiaux = 40; - persos[i].pm = 40; - persos[i].etat = VIE; - } - else if (persos[i].classe == VOLEUR) - { - persos[i].xp = 0; - persos[i].nv = 0; - persos[i].force = 14; - persos[i].magie = 11; - persos[i].defense = 15; - persos[i].defensemagique = 15; - persos[i].pv = 1250; - persos[i].pvinitiaux = 1250; - persos[i].pminitiaux = 40; - persos[i].pm = 40; - persos[i].etat = VIE; - } - } -} - diff --git a/constantes.h b/constantes.h index 68872ab..1178eca 100644 --- a/constantes.h +++ b/constantes.h @@ -5,10 +5,32 @@ #define QUITTER 2 #define XWIN 1024 #define YWIN 768 -#define PALADIN 0 -#define PRETRE 1 -#define VOLEUR 2 -#define GUERRIER_GOBELIN 10 + +enum character_class_t { + CLASS_INVAL = -1, + + CLASS_PALADIN, +#define PALADIN CLASS_PALADIN + CLASS_PRIEST, +#define PRETRE CLASS_PRIEST + CLASS_THIEF, +#define VOLEUR CLASS_THIEF + /* XXX add new ally classes here + * -> + */ + + CLASS_ALLY_CNT, + + CLASS_WARRIOR_GOBELIN = CLASS_ALLY_CNT, +#define GUERRIER_GOBELIN CLASS_WARRIOR_GOBELIN + /* XXX add new enemy classes here + * -> + */ + + CLASS_CNT, + CLASS_ENEMY_CNT = CLASS_CNT - CLASS_ALLY_CNT, +}; + #define VIE 1 #define MORT 0 @@ -46,8 +68,13 @@ #define SOINS 1 #define ALLIE 1 #define ENNEMI 0 -#define TYPE_ATTAQUE 0 -#define TYPE_MAGIE 1 + +enum damages_type_t { + DAMAGES_PHYSICAL, +#define TYPE_ATTAQUE DAMAGES_PHYSICAL + DAMAGES_MAGICAL, +#define TYPE_MAGIE DAMAGES_MAGICAL +}; enum action_state_t { ACTION_PERFORMED, @@ -104,11 +131,11 @@ if(clan==ENNEMI)\ {\ SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible);\ selection=0;\ - while(persos[selection].etat==MORT)\ + while (!ally->chrs[selection].alive)\ selection++;\ inverse_boolean(clan);\ SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositioncurseurennemis,surfaces->Pecran,&positions->Vpositioncurseurennemis);\ - Fchangercurseurpersos(surfaces,positions,selection,persos);\ + Fchangercurseurpersos(surfaces,positions,selection);\ }\ break;\ case SDLK_UP:\ @@ -134,14 +161,14 @@ else\ selection--;\ else\ selection=2;\ - while(persos[selection].etat==MORT)\ + while (!ally->chrs[selection].alive)\ {\ if(selection!=0)\ selection--;\ else\ selection=2;\ }\ - Fchangercurseurpersos(surfaces,positions,selection,persos);\ + Fchangercurseurpersos(surfaces,positions,selection); \ }\ break;\ case SDLK_DOWN:\ @@ -167,14 +194,14 @@ else\ selection++;\ else\ selection=0;\ - while(persos[selection].etat==MORT)\ + while (!ally->chrs[selection].alive) \ {\ if(selection!=2)\ selection++;\ else\ selection=0;\ }\ - Fchangercurseurpersos(surfaces,positions,selection,persos);\ + Fchangercurseurpersos(surfaces,positions,selection); \ }\ break; @@ -6,7 +6,7 @@ #include "prototypes.h" #include <time.h> -void Factionennemi(int* Vtourennemi,SURFACES* surfaces,POSITIONS* positions, ENNEMIS ennemis[], PERSONNAGES persos[],int Vnbennemis,int*Vtour,int Vtourallie) +void Factionennemi(int* Vtourennemi,SURFACES* surfaces,POSITIONS* positions, ENNEMIS ennemis[], PERSONNAGES persos[],int Vnbennemis,int*Vtour) { int target,degats; @@ -31,11 +31,12 @@ void Factionennemi(int* Vtourennemi,SURFACES* surfaces,POSITIONS* positions, ENN positions->Vpositionmort.y=positions->Vpositionpersos[target].y+surfaces->Tperso[target]->h/2-surfaces->Pmort->h/2; SDL_BlitSurface(surfaces->Pmort,NULL,surfaces->Pecran,&positions->Vpositionmort); } + /* TODO re-enable */ +#if 0 Fafficherdegats(surfaces,positions,degats,ALLIE,target,persos); +#endif SDL_Delay(1000); SDL_BlitSurface(surfaces->Pfondjeu,&positions->Vpositiondegats,surfaces->Pecran,&positions->Vpositiondegats); - if(*Vtour==ALLIE) - Fblitcoloredselection(surfaces,positions,Vtourallie,persos); SDL_Flip(surfaces->Pecran); } @@ -5,18 +5,55 @@ #include "constantes.h" #include "prototypes.h" -/* TODO remove and attach to the allies */ -OBJET objets_g; +static inline void highlight_current_character(struct team_t *ally, int character_idx) +{ + struct character_t *chr = &ally->chrs[character_idx]; + + chr->surf = chr->red_surf; +} + +static inline void unhighlight_prev_character(struct team_t *ally, int character_idx) +{ + struct character_t *chr = &ally->chrs[character_idx]; + + chr->surf = chr->def_surf; +} + +static void generate_enemy_types(struct team_t *ally_team, ENNEMIS ennemis[], int Vnbennemis) +{ + int avg = 0; + + for (int i = 0; i < ally_team->chr_cnt; i++) { + avg += ally_team->chrs[i].ally.nv; + } + + avg /= ally_team->chr_cnt; + + if (avg < 5) + { + /* easy */ + for (int i=0; i <= Vnbennemis; i++) { + ennemis[i].classe=GUERRIER_GOBELIN; + } + } else { + /* XXX should not happen for now since we do not change the levels */ + abort(); + } +} -static int find_next_ally(PERSONNAGES persos[], int current) +static int find_next_ally(const struct team_t *ally, int current) { - for (int i = current + 1; i < 3; ++i) { - if (persos[i].etat != MORT) + for (int i = current + 1; i < ally->chr_cnt; ++i) { + const struct character_t *chr = &ally->chrs[i]; + + if (chr->alive) return i; } for (int i = 0; i <= current; ++i) { - if (persos[i].etat != MORT) + const struct character_t *chr = &ally->chrs[i]; + + if (chr->alive) return i; } @@ -24,14 +61,14 @@ static int find_next_ally(PERSONNAGES persos[], int current) } /* function called after an action has been performed */ -static void update_current_character(SURFACES *surfaces, PERSONNAGES persos[], int *ally_idx, bool *ally_turn) +static void update_current_character(struct team_t *ally, int *ally_idx, bool *ally_turn) { if (*ally_turn) { int next; - unhighlight_prev_character(surfaces, persos, *ally_idx); + unhighlight_prev_character(ally, *ally_idx); - next = find_next_ally(persos, *ally_idx); + next = find_next_ally(ally, *ally_idx); /* if there is no next ally or they are dead */ if (next <= *ally_idx) { @@ -41,12 +78,12 @@ static void update_current_character(SURFACES *surfaces, PERSONNAGES persos[], i *ally_idx = next; if (*ally_turn) { - highlight_current_character(surfaces, persos, *ally_idx); + highlight_current_character(ally, *ally_idx); } } } -int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEMIS ennemis[]) +int Fjouer (SURFACES *surfaces, POSITIONS *positions, struct team_t *ally,ENNEMIS ennemis[]) { unsigned int continuer=1; int selection=0; @@ -58,18 +95,17 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM int Vnbennemis=0; int page=0; int nbactions=5; + unsigned int gagne,perdu; if(surfaces->Pfondjeu!=NULL) { SDL_FreeSurface(surfaces->Pfondjeu); surfaces->Pfondjeu=NULL; } - Finitialiserpositionspersos(surfaces,positions); Fblitterfond(surfaces); // on blit le fond du jeu - Fremplirobjets(&objets_g); // on monte les variables potions ether, etc - Fremplircompetencesallie(persos); // on initialise les pv, pm, xp etc DES PERSOS + Fremplirobjets(&ally->objects); // on monte les variables potions ether, etc 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 + generate_enemy_types(ally, ennemis,Vnbennemis); // on choisit la classe des ennemis comme guerrier gobelin etc Fremplirennemis(surfaces,Vnbennemis,ennemis); /* compute whether the allies or the enemies should begin */ @@ -78,10 +114,10 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM 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); + highlight_current_character(ally, Vtourallie); } - Fblitterpersos(surfaces,positions,persos); // on blit les persos sur l'ecran + blit_ally_team(surfaces,positions, ally); // on blit les persos sur l'ecran Fblitterennemis(surfaces,positions,ennemis,Vnbennemis); // idem pour les ennemis Fremplircompetencesennemis(ennemis,Vnbennemis); // on initialise les pv, pm, exp, etc DES ENNEMIS @@ -89,7 +125,7 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM { if(Vtour==ALLIE) //si un player joue { - while (persos[Vtourallie].etat==MORT) //si le perso selectionné est mort + while (!ally->chrs[Vtourallie].alive) //si le perso selectionné est mort { if(Vtourallie<2) // si ce n'est pas le dernier Vtourallie++; // on prend le perso suivant @@ -131,7 +167,7 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM case SDLK_RETURN: case SDLK_f: { - enum action_state_t (*actionp)(SURFACES *, POSITIONS *, PERSONNAGES [], int, ENNEMIS[], int) = NULL; + enum action_state_t (*actionp)(SURFACES *, POSITIONS *, struct team_t *ally, int, ENNEMIS[], int) = NULL; switch (selection) { case ATTAQUE: actionp = Fattaquer; break; @@ -142,9 +178,9 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM 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 + if (actionp && (*actionp)(surfaces,positions, ally, Vtourallie,ennemis,Vnbennemis) == ACTION_PERFORMED) { + update_current_character(ally, &Vtourallie, (bool *)&Vtour); + blit_ally_team(surfaces, positions, ally); } } break; @@ -163,7 +199,10 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM Vtourennemi = 0; } } +/* TODO reactivate */ +#if 0 Factionennemi(&Vtourennemi,surfaces,positions,ennemis,persos,Vnbennemis,&Vtour,Vtourallie); +#endif } // les actions sont faites @@ -175,9 +214,8 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM if(ennemis[i].etat==VIE) gagne=0; } - for(i=0;i<3;i++) - { - if(persos[i].etat==VIE) + for (i = 0; i < ally->chr_cnt; i++) { + if (ally->chrs[i].alive) perdu=0; } @@ -196,35 +234,6 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM return 0; } -void Fchoisirtypeennemis (PERSONNAGES persos[],SURFACES *surfaces,ENNEMIS ennemis[],int Vnbennemis) -{ - int moyenne=0; - int i; - - /* TODO understand why this is needed */ - (void) surfaces; - - for (i=0;i<3;i++) - moyenne+=persos[i].nv; - moyenne/=3; - if(moyenne<5) - { - for (i=0;i<=Vnbennemis;i++) - ennemis[i].classe=GUERRIER_GOBELIN; // pour l'instant pas d'autres choix xD - } -} - -void Finitialiserpositionspersos (SURFACES *surfaces,POSITIONS *positions) -{ - int i; - - for (i=0;i<3;i++) - positions->Vpositionpersos[i].x=20; - positions->Vpositionpersos[1].y=YWIN/2-(surfaces->Tperso[1]->h/2); - positions->Vpositionpersos[0].y=positions->Vpositionpersos[1].y/2-surfaces->Tperso[0]->h/2; - positions->Vpositionpersos[2].y=YWIN-(20+surfaces->Tperso[2]->h); -} - void Finitialiserpositionsennemis(SURFACES *surfaces,POSITIONS *positions,int Vnbennemis) { if (Vnbennemis==0) @@ -5,7 +5,7 @@ #include "constantes.h" #include "prototypes.h" -enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element) +enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element) { enum action_state_t ret = ACTION_CANCELED; int max; @@ -46,7 +46,7 @@ enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSO case SDLK_RETURN: case SDLK_f: continuer=0; - max=Fcalculerdegats(persos, Vtourallie,&min,ennemis,selection,clan,TYPE_MAGIE); + max=Fcalculerdegats(ally, Vtourallie,&min,ennemis,selection,clan,TYPE_MAGIE); degats=(rand()%(max-min+1))+min; if(degats<0) degats=0; @@ -81,26 +81,28 @@ enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSO } else { + struct character_t *chr = &ally->chrs[selection]; + if(Bdegats==DEGATS) - persos[selection].pv-=degats; + chr->hp-=degats; else - persos[selection].pv+=degats; - if(persos[selection].pv<=0) + chr->hp+=degats; + if(chr->hp<=0) { - persos[selection].pv=0; - persos[selection].etat=MORT; + chr->hp=0; + chr->alive = false; 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; + else if(chr->hp>chr->max_hp) + chr->hp=chr->max_hp; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) - Fafficherdegats (surfaces,positions,degats,clan,selection,persos); + Fafficherdegats (surfaces,positions,degats,clan,selection, ally); else - Faffichersoins (surfaces,positions,degats,clan,selection,persos); + Faffichersoins (surfaces,positions,degats,clan,selection, ally); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); @@ -122,7 +124,7 @@ enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions,PERSO return ret; } -enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[], int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) +enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis) { enum action_state_t ret = ACTION_CANCELED; unsigned int continuer=1; @@ -135,9 +137,9 @@ enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAG int selection=0; int Bdegats=SOINS; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadreactions,surfaces->Pecran,&positions->Vpositioncadreactions); - while(persos[selection].etat==MORT) + while(!ally->chrs[selection].alive) selection++; - Fchangercurseurpersos (surfaces,positions,selection,persos); + Fchangercurseurpersos (surfaces,positions,selection); while(continuer) { SDL_WaitEvent(&event); @@ -161,7 +163,7 @@ enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAG SELECTION_CIBLE() case SDLK_RETURN: case SDLK_f: - max=Fcalculersoins(persos, Vtourallie,&min,ennemis,selection); + max=Fcalculersoins(ally, Vtourallie,&min,ennemis,selection); soins=(rand()%(max-min+1))+min; if(soins<0) soins=0; @@ -186,25 +188,25 @@ enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAG else { if(Bdegats==DEGATS) - persos[selection].pv-=soins; + ally->chrs[selection].hp-=soins; else - persos[selection].pv+=soins; - if(persos[selection].pv<=0) + ally->chrs[selection].hp+=soins; + if(ally->chrs[selection].hp<=0) { - persos[selection].pv=0; - persos[selection].etat=MORT; + ally->chrs[selection].hp=0; + ally->chrs[selection].alive = false; 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; + else if(ally->chrs[selection].hp>ally->chrs[selection].max_hp) + ally->chrs[selection].hp=ally->chrs[selection].max_hp; SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncurseurallies,surfaces->Pecran,&positions->Vpositioncurseurallies); } if(Bdegats==DEGATS) - Fafficherdegats (surfaces,positions,soins,clan,selection,persos); + Fafficherdegats (surfaces,positions,soins,clan,selection, ally); else - Faffichersoins (surfaces,positions,soins,clan,selection,persos); + Faffichersoins (surfaces,positions,soins,clan,selection, ally); if(clan==ENNEMI) { SDL_BlitSurface (surfaces->Pfondjeu,&positions->Vpositioncadrecible,surfaces->Pecran,&positions->Vpositioncadrecible); @@ -226,7 +228,7 @@ enum action_state_t Fmagiesoin(SURFACES *surfaces,POSITIONS *positions,PERSONNAG return ret; } -int Fcalculersoins(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemis[],int selection) +int Fcalculersoins(struct team_t *ally, int Vtourallie,int *min,ENNEMIS ennemis[],int selection) { unsigned int soins; int max; @@ -236,7 +238,7 @@ int Fcalculersoins(PERSONNAGES persos[], int Vtourallie,int *min,ENNEMIS ennemis (void) ennemis; (void) selection; - soins=persos[Vtourallie].magie*20; + soins=ally->chrs[Vtourallie].magic*20; taux=soins/4; max=soins+taux; *min=soins-taux; @@ -1,12 +1,12 @@ -#include <SDL/SDL.h> #include <stdio.h> #include <stdlib.h> +#include <SDL/SDL.h> +#include <SDL/SDL_image.h> #include "constantes.h" #include "structures.h" #include "prototypes.h" -#include <SDL/SDL_image.h> -void Fmap (SURFACES*surfaces, POSITIONS* positions,PERSONNAGES persos[],ENNEMIS ennemis[]) +void Fmap (SURFACES*surfaces, POSITIONS* positions, struct team_t *ally,ENNEMIS ennemis[]) { int map[15][11]; int continuer=1; @@ -24,7 +24,7 @@ void Fmap (SURFACES*surfaces, POSITIONS* positions,PERSONNAGES persos[],ENNEMIS { case SDLK_RETURN: case SDLK_f: - continuer=Fjouer(surfaces,positions,persos,ennemis); + continuer=Fjouer(surfaces,positions, ally,ennemis); break; case SDLK_ESCAPE: case SDLK_a: diff --git a/menuchoixpersos.c b/menuchoixpersos.c index 7790255..05e1a0a 100644 --- a/menuchoixpersos.c +++ b/menuchoixpersos.c @@ -6,6 +6,63 @@ #include "prototypes.h" #include <SDL/SDL_image.h> #include <SDL/SDL_ttf.h> +#include "players.h" + +static +struct team_t *new_ally_team(SURFACES *surfaces, + const enum character_class_t *classes, int cnt) +{ + struct team_t *team = malloc(sizeof(struct team_t)); + + team->name = "Team Player"; + team->cpu = false; + team->chr_cnt = cnt; + team->chrs = malloc(sizeof(struct character_t) * team->chr_cnt); + + for (int i = 0; i < team->chr_cnt; i++) { + struct character_t *chr = &team->chrs[i]; + + chr->name = "Player"; + chr->cpu = false; + chr->team = team; + chr->class_ = classes[i]; + chr->alive = true; + + switch (chr->class_) { + case CLASS_PALADIN: + chr->def_surf = surfaces->Ppaladin; + chr->red_surf = surfaces->red_paladin; + break; + case CLASS_PRIEST: + chr->def_surf = surfaces->Ppretre; + chr->red_surf = surfaces->red_priest; + break; + case CLASS_THIEF: + chr->def_surf = surfaces->Pvoleur; + chr->red_surf = surfaces->red_thief; + break; + default: + abort(); + } + + chr->surf = chr->def_surf; + + chr->hp = base_stats_g[chr->class_].hp; + chr->max_hp = base_stats_g[chr->class_].hp; + chr->mp = base_stats_g[chr->class_].mp; + chr->max_mp = base_stats_g[chr->class_].mp; + chr->magic = base_stats_g[chr->class_].magic; + chr->strength = base_stats_g[chr->class_].strength; + chr->defense = base_stats_g[chr->class_].defense; + chr->spirit = base_stats_g[chr->class_].spirit; + + /* set its position */ + chr->pos.x = 20; + chr->pos.y = (YWIN / (cnt + 1)) * (i + 1) - chr->def_surf->h / 2; + } + + return team; +} void Fmenuchoixpersos (SURFACES *surfaces, POSITIONS *positions) { @@ -13,7 +70,8 @@ void Fmenuchoixpersos (SURFACES *surfaces, POSITIONS *positions) int Vchoix = PALADIN; SDL_Color vert; bool continuer = true; - PERSONNAGES persos[3]; + struct team_t *ally_team; + enum character_class_t chr_classes[3]; ENNEMIS ennemis[5]; SDL_Event event; int Vnbperso = 0; @@ -84,7 +142,7 @@ void Fmenuchoixpersos (SURFACES *surfaces, POSITIONS *positions) break; case SDLK_RETURN: case SDLK_f: - persos[Vnbperso++].classe = Vchoix; + chr_classes[Vnbperso++] = Vchoix; continuer = false; break; default: @@ -96,8 +154,8 @@ void Fmenuchoixpersos (SURFACES *surfaces, POSITIONS *positions) } TTF_CloseFont (police); SDL_Flip(surfaces->Pecran); - Fremplirpersos2 (surfaces,persos); - Fmap(surfaces,positions,persos,ennemis); + ally_team = new_ally_team(surfaces, chr_classes, 3); + Fmap(surfaces,positions, ally_team,ennemis); } void Fchangersurlignage2 (int Vchoix, SURFACES *surfaces, POSITIONS *positions) @@ -115,28 +173,6 @@ void Fchangersurlignage2 (int Vchoix, SURFACES *surfaces, POSITIONS *positions) SDL_Flip (surfaces->Pecran); } -void Fremplirpersos2 (SURFACES *surfaces, PERSONNAGES persos[]) -{ - - int i; - - for (i = 0; i < 3; i++) { - switch (persos[i].classe) { - case PALADIN: - surfaces->Tperso[i] = surfaces->Ppaladin; - break; - case PRETRE: - surfaces->Tperso[i] = surfaces->Ppretre; - break; - case VOLEUR: - surfaces->Tperso[i] = surfaces->Pvoleur; - break; - default: - abort(); - } - } -} - void Fremplirennemis (SURFACES *surfaces,int Vnbennemis,ENNEMIS ennemis[]) { diff --git a/players.c b/players.c new file mode 100644 index 0000000..12aae80 --- /dev/null +++ b/players.c @@ -0,0 +1,26 @@ +#include "players.h" + +struct stats_base_class_t base_stats_g[CLASS_CNT] = { + [CLASS_PALADIN] = { + .hp = 1500, + .mp = 40, + .strength = 20, + .magic = 5, + .defense = 15, + .spirit = 15, + }, [CLASS_PRIEST] = { + .hp = 1000, + .mp = 60, + .strength = 5, + .magic = 20, + .defense = 10, + .spirit = 20, + }, [CLASS_THIEF] = { + .hp = 1250, + .mp = 40, + .strength = 14, + .magic = 11, + .defense = 15, + .spirit = 15, + }, +}; diff --git a/players.h b/players.h new file mode 100644 index 0000000..7d7b42c --- /dev/null +++ b/players.h @@ -0,0 +1,66 @@ +#ifndef PLAYERS_H +#define PLAYERS_H + +#include <stdbool.h> +#include <SDL/SDL.h> + +#include "constantes.h" +#include "structures.h" + +struct character_t { + struct team_t *team; + + enum character_class_t class_; + + char *name; + bool cpu; + + union { + struct ally_t ally; + struct enemy_t enemy; + }; + + SDL_Surface *def_surf; + SDL_Surface *red_surf; + + SDL_Surface *surf; + + SDL_Rect pos; + SDL_Rect pos_hp; + SDL_Rect pos_mp; + + bool alive; + + int hp; + int max_hp; + int mp; + int max_mp; + int magic; + int strength; + int defense; + int spirit; +}; + +struct team_t { + bool cpu; + int chr_cnt; + + char *name; + + struct character_t *chrs; + + struct objects_t objects; +}; + +struct stats_base_class_t { + int hp; + int mp; + int magic; + int strength; + int defense; + int spirit; +}; + +extern struct stats_base_class_t base_stats_g[CLASS_CNT]; + +#endif /* PLAYERS_H */ diff --git a/prototypes.h b/prototypes.h index 3bd511a..069438d 100644 --- a/prototypes.h +++ b/prototypes.h @@ -2,6 +2,7 @@ #define PROTOTYPES_H #include "constantes.h" +#include "players.h" void Fmenuprincipal (SURFACES *surfaces, POSITIONS *positions); void Fchangersurlignage (int Vmode, SURFACES *surfaces, POSITIONS *positions); @@ -9,9 +10,8 @@ int Fentrermode (int Vmode, SURFACES *surfaces, POSITIONS *positions); void Fmenuchoixpersos (SURFACES *surfaces, POSITIONS *positions); void Fchangersurlignage2 (int Vperso, SURFACES *surfaces, POSITIONS *positions); void Fremplirpersos2 (SURFACES *surfaces, PERSONNAGES persos[]); -int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEMIS ennemis[]); -void Fblitterpersos (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[]); -void Finitialiserpositionspersos (SURFACES *surfaces,POSITIONS *positions); +int Fjouer (SURFACES *surfaces, POSITIONS *positions, struct team_t *ally,ENNEMIS ennemis[]); +void blit_ally_team(SURFACES *surfaces, POSITIONS *positions, struct team_t *); void Finitialisersurfaces (SURFACES *surfaces); int Fchargerimages (SURFACES *surfaces); void Fdechargerimages (SURFACES *surfaces); @@ -20,25 +20,23 @@ void Fblitterennemis (SURFACES *surfaces, POSITIONS *positions,ENNEMIS ennemis[] void Finitialiserpositionsennemis (SURFACES *surfaces, POSITIONS *positions,int Vnbennemis); /* 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); +enum action_state_t Fattaquer (SURFACES *surfaces,POSITIONS *positions, struct team_t *ally,int Vtourallie,ENNEMIS ennemis[],int Vnbennemis); +enum action_state_t Fselectionnermagienoire (SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis); +enum action_state_t Fselectionnermagieblanche(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis); +enum action_state_t Fselectionnerobjet(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally,int Vtourallie,ENNEMIS ennemis[],int Vnbennemis); +enum action_state_t Fmagieelement (SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis, int element); +enum action_state_t Fmagiesoin (SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis); +enum action_state_t Fpotion(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, int Vtourallie,ENNEMIS ennemis[],int Vnbennemis,OBJET *objets,int type); +enum action_state_t Fether(SURFACES *surfaces,POSITIONS *positions, struct team_t *ally, 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 Fcalculerdegats(struct team_t *ally, int Vtourallie,int *min,ENNEMIS ennemis[],int selection,int camp,int type); +int Fcalculersoins(struct team_t *ally, 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 Fchangercurseurpersos (SURFACES *surfaces, POSITIONS *positions,int selection); +void Fafficherdegats (SURFACES *surfaces, POSITIONS *positions, int degats,int camp, int cible, struct team_t *ally); 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); @@ -46,20 +44,17 @@ void Fblitterpvcible (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[], void Fblitterpmcible (SURFACES *surfaces,POSITIONS *positions,ENNEMIS ennemis[],int selection); void Fchangermagienoireselectionnee(SURFACES *surfaces,POSITIONS *positions,int selection,int page,int nbactions); void Fchangermagieblancheselectionnee(SURFACES *surfaces, POSITIONS *positions,int selection,int page,int nbactions); -void Fblitterpmpvpersos(SURFACES *surfaces,POSITIONS *positions,PERSONNAGES persos[],int selection); -void Faffichersoins (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible,PERSONNAGES persos[]); +void Faffichersoins (SURFACES *surfaces, POSITIONS *positions, int degats,int clan, int cible, struct team_t *ally); void Fremplirobjets(OBJET *objets); 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); int Fgeneratedegats(PERSONNAGES persos[],ENNEMIS ennemis[],int Vtourennemi,int target); int Fchoosetargetallie(PERSONNAGES persos[]); -void Factionennemi(int* Vtourennemi,SURFACES* surfaces,POSITIONS* positions, ENNEMIS ennemis[], PERSONNAGES persos[],int Vnbennemis,int*Vtour,int Vtourallie); +void Factionennemi(int* Vtourennemi,SURFACES* surfaces,POSITIONS* positions, ENNEMIS ennemis[], PERSONNAGES persos[],int Vnbennemis,int*Vtour); void Fgetmap (int map[][11]); -void Fmap (SURFACES*surfaces, POSITIONS* positions,PERSONNAGES persos[],ENNEMIS ennemis[]); +void Fmap (SURFACES*surfaces, POSITIONS* positions, struct team_t *ally,ENNEMIS ennemis[]); void Fchargersurfaces_map (SURFACES *surfaces,POSITIONS*positions); void Fblittermap (SURFACES*surfaces,POSITIONS*positions,int map[][11]); void Fdechargersurfaces_map(SURFACES*surfaces); diff --git a/structures.h b/structures.h index 2679bfd..1339a5f 100644 --- a/structures.h +++ b/structures.h @@ -82,10 +82,9 @@ struct positions SDL_Rect Vpositionmap_item[15][11]; }; -typedef struct personnages PERSONNAGES; -struct personnages +typedef struct ally_t PERSONNAGES; +struct ally_t { - int classe; int nv; int pv; int pm; @@ -99,8 +98,8 @@ struct personnages int pminitiaux; }; -typedef struct ennemis ENNEMIS; -struct ennemis +typedef struct enemy_t ENNEMIS; +struct enemy_t { int classe; int pv; @@ -118,8 +117,8 @@ struct ennemis int pminitiaux; }; -typedef struct objets OBJET; -struct objets +typedef struct objects_t OBJET; +struct objects_t { int potions; int ethers; |