From b3295086c84b09353d5e89c6f7c743167b486a49 Mon Sep 17 00:00:00 2001 From: Olivier Gayot Date: Wed, 7 Jan 2015 16:56:21 +0100 Subject: clean the code and fix bugs Signed-off-by: Olivier Gayot --- jouer.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 63 insertions(+), 12 deletions(-) (limited to 'jouer.c') diff --git a/jouer.c b/jouer.c index a1b7b20..d6781e4 100644 --- a/jouer.c +++ b/jouer.c @@ -5,9 +5,49 @@ #include "constantes.h" #include "prototypes.h" +/* TODO remove and attach to the allies */ +OBJET objets_g; + +static int find_next_ally(PERSONNAGES persos[], int current) +{ + for (int i = current + 1; i < 3; ++i) { + if (persos[i].etat != MORT) + return i; + } + + for (int i = 0; i <= current; ++i) { + if (persos[i].etat != MORT) + return i; + } + + return -1; +} + +/* function called after an action has been performed */ +static void update_current_character(SURFACES *surfaces, PERSONNAGES persos[], int *ally_idx, bool *ally_turn) +{ + if (*ally_turn) { + int next; + + unhighlight_prev_character(surfaces, persos, *ally_idx); + + next = find_next_ally(persos, *ally_idx); + + /* if there is no next ally or they are dead */ + if (next <= *ally_idx) { + inverse_boolean(*ally_turn); + } + + *ally_idx = next; + + if (*ally_turn) { + highlight_current_character(surfaces, persos, *ally_idx); + } + } +} + int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEMIS ennemis[]) { - OBJET objets; unsigned int continuer=1; int selection=0; int i; @@ -26,15 +66,18 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM } Finitialiserpositionspersos(surfaces,positions); Fblitterfond(surfaces); // on blit le fond du jeu - Fremplirobjets(&objets); // on monte les variables potions ether, etc + Fremplirobjets(&objets_g); // on monte les variables potions ether, etc Fremplircompetencesallie(persos); // on initialise les pv, pm, xp etc DES PERSOS Vnbennemis=Fcalculernbennemis(); // on tire aléatoirement le nombre d'ennemis présents dans le combat Fchoisirtypeennemis(persos,surfaces,ennemis,Vnbennemis); // on choisit la classe des ennemis comme guerrier gobelin etc Fremplirennemis(surfaces,Vnbennemis,ennemis); - Vtour = rand() % 2; // on détermine aléatoirement si c'est les ennemis ou les persos qui tapent en premier + /* compute whether the allies or the enemies should begin */ + Vtour = rand() % 2; + if (Vtour == ALLIE) { /* the current character will be highlighted in red */ + /* TODO should be generic for an enemy or an ally */ highlight_current_character(surfaces, persos, Vtourallie); } @@ -87,15 +130,23 @@ int Fjouer (SURFACES *surfaces, POSITIONS *positions, PERSONNAGES persos[],ENNEM break; case SDLK_RETURN: case SDLK_f: - if(selection==ATTAQUE) - Fattaquer(surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour); - else if(selection==MAGIE_BLANCHE) - Fselectionnermagieblanche (surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour); - else if(selection==MAGIE_NOIRE) - Fselectionnermagienoire (surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&Vtour); - else if(selection==TECHNIQUES){} - else if(selection==OBJETS) - Fselectionnerobjet(surfaces,positions,persos,&Vtourallie,ennemis,Vnbennemis,&objets,&Vtour); + { + enum action_state_t (*actionp)(SURFACES *, POSITIONS *, PERSONNAGES [], int, ENNEMIS[], int) = NULL; + + switch (selection) { + case ATTAQUE: actionp = Fattaquer; break; + case MAGIE_BLANCHE: actionp = Fselectionnermagieblanche; break; + case MAGIE_NOIRE: actionp = Fselectionnermagienoire; break; + case TECHNIQUES: break; + case OBJETS: actionp = Fselectionnerobjet; break; + default: abort(); break; + } + + if (actionp && (*actionp)(surfaces,positions,persos, Vtourallie,ennemis,Vnbennemis) == ACTION_PERFORMED) { + update_current_character(surfaces, persos, &Vtourallie, (bool *)&Vtour); + Fblitterpersos(surfaces,positions,persos); // on blit les persos sur l'ecran + } + } break; default: break; -- cgit v1.2.3