#include #include #include #include "structures.h" #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[]) { unsigned int continuer=1; int selection=0; int i; SDL_Event event; int Vtourallie=0; int Vtourennemi=0; int Vtour; 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 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); /* 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); } Fblitterpersos(surfaces,positions,persos); // 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 while (continuer) { if(Vtour==ALLIE) //si un player joue { while (persos[Vtourallie].etat==MORT) //si le perso selectionné est mort { if(Vtourallie<2) // si ce n'est pas le dernier Vtourallie++; // on prend le perso suivant else // sinon si c'est le dernier Vtourallie=0; // on reprend le 1er } Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,ACTIONS,NULL); SDL_WaitEvent(&event); switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.unicode) { case SDLK_ESCAPE: case SDLK_a: continuer=0; break; } switch (event.key.keysym.sym) { case SDLK_UP: case SDLK_k: if (selection!=0) selection--; else selection=nbactions-1; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,ACTIONS,NULL); break; case SDLK_DOWN: case SDLK_j: if (selection!=nbactions-1) selection++; else selection=0; page=selection/3; Fchangeractionselectionnee(surfaces,positions,selection,page,nbactions,ACTIONS,NULL); break; case SDLK_RETURN: case SDLK_f: { 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; } break; } } else if(Vtour==ENNEMI) // sinon si c'est le cpu qui joue { while (ennemis[Vtourennemi].etat == MORT) { if (Vtourennemi < Vnbennemis) { Vtourennemi++; } else if (Vtourennemi == Vnbennemis) { Vtourennemi = 0; } } Factionennemi(&Vtourennemi,surfaces,positions,ennemis,persos,Vnbennemis,&Vtour,Vtourallie); } // les actions sont faites // on vérifie à présent si on a gagné ou si on a perdu ! gagne=1; perdu=1; for(i=0;i<=Vnbennemis;i++) { if(ennemis[i].etat==VIE) gagne=0; } for(i=0;i<3;i++) { if(persos[i].etat==VIE) perdu=0; } // la y'a des trucs a mettre pour si on gagne ou on perd parce que sa fait assez pitié :p if(perdu) { SDL_Delay(2000); continuer=0; } else if(gagne) { SDL_Delay(2000); continuer=0; } } 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) { positions->Vpositionennemis[0].x=XWIN-20-surfaces->Tennemi[0]->w; positions->Vpositionennemis[0].y=YWIN/2-surfaces->Tennemi[0]->h/2; } if (Vnbennemis==1) { positions->Vpositionennemis[0].x = XWIN - 20 - surfaces->Tennemi[0]->w; positions->Vpositionennemis[0].y = YWIN/3 - surfaces->Tennemi[0]->h/2; positions->Vpositionennemis[1].x = XWIN - 20 - surfaces->Tennemi[2]->w; positions->Vpositionennemis[1].y = YWIN/3*2 - surfaces->Tennemi[1]->h/2; } else if (Vnbennemis==2) { positions->Vpositionennemis[1].x = XWIN - 20 - surfaces->Tennemi[1]->w; positions->Vpositionennemis[1].y = YWIN/2 - surfaces->Tennemi[1]->h/2; positions->Vpositionennemis[0].x = XWIN - 20 - surfaces->Tennemi[0]->w; positions->Vpositionennemis[0].y = YWIN/4 - surfaces->Tennemi[1]->h/2; positions->Vpositionennemis[2].x = XWIN - 20 - surfaces->Tennemi[2]->w; positions->Vpositionennemis[2].y = YWIN/4*3 - surfaces->Tennemi[2]->h/2; } else if (Vnbennemis==3) { positions->Vpositionennemis[1].x = XWIN - 20 - surfaces->Tennemi[1]->w; positions->Vpositionennemis[1].y = YWIN/5*2 - surfaces->Tennemi[1]->h/2; positions->Vpositionennemis[2].x = XWIN - 20 - surfaces->Tennemi[2]->w; positions->Vpositionennemis[2].y = YWIN/5*3 - surfaces->Tennemi[2]->h/2; positions->Vpositionennemis[0].x = XWIN - surfaces->Tennemi[1]->w - surfaces->Tennemi[0]->w/2; positions->Vpositionennemis[0].y = YWIN/5 -surfaces->Tennemi[0]->h/2; positions->Vpositionennemis[3].x = XWIN - surfaces->Tennemi[2]->w - surfaces->Tennemi[3]->w/2; positions->Vpositionennemis[3].y = YWIN/5*4 - surfaces->Tennemi[3]->h/2; } else if (Vnbennemis==4) { positions->Vpositionennemis[2].x = XWIN - 20 - surfaces->Tennemi[2]->w; positions->Vpositionennemis[2].y = YWIN/2 - surfaces->Tennemi[2]->h/2; positions->Vpositionennemis[1].x = XWIN - surfaces->Tennemi[2]->w - surfaces->Tennemi[1]->w/2; positions->Vpositionennemis[1].y = YWIN/6*2 - surfaces->Tennemi[1]->h/2; positions->Vpositionennemis[3].x = XWIN - surfaces->Tennemi[2]->w - surfaces->Tennemi[3]->w/2; positions->Vpositionennemis[3].y = YWIN/6*4 - surfaces->Tennemi[3]->h/2; positions->Vpositionennemis[0].x = XWIN - surfaces->Tennemi[2]->w - surfaces->Tennemi[1]->w - surfaces->Tennemi[0]->w/2; positions->Vpositionennemis[0].y = YWIN/6 - surfaces->Tennemi[0]->h/2; positions->Vpositionennemis[4].x = XWIN - surfaces->Tennemi[2]->w - surfaces->Tennemi[3]->w - surfaces->Tennemi[4]->w/2; positions->Vpositionennemis[4].y = YWIN/6*5 - surfaces->Tennemi[4]->h/2; } } void Fremplirobjets(OBJET *objets) { objets->potions=10; objets->ethers=10; objets->potionsplus=5; objets->ethersplus=5; }