summaryrefslogtreecommitdiff
path: root/jouer.c
diff options
context:
space:
mode:
authorOlivier Gayot <duskcoder@gmail.com>2015-01-07 16:56:21 +0100
committerOlivier Gayot <duskcoder@gmail.com>2015-01-07 16:56:21 +0100
commitb3295086c84b09353d5e89c6f7c743167b486a49 (patch)
treefc9dcc035c486d028bf4460c1b2d9e988efed9d4 /jouer.c
parent461a28bb608e117267431eac78b08d3d8a089c0c (diff)
clean the code and fix bugs
Signed-off-by: Olivier Gayot <duskcoder@gmail.com>
Diffstat (limited to 'jouer.c')
-rw-r--r--jouer.c75
1 files changed, 63 insertions, 12 deletions
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;