From d733b3ff8f4f79195dec418505a443438b68d7a1 Mon Sep 17 00:00:00 2001
From: ColinDrieu <colin.drieu@insa-rennes.fr>
Date: Thu, 12 May 2016 11:18:19 +0200
Subject: [PATCH] Code de fonctions permettant d'obtenir les ressources pour
 afficher la carte.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

La fonction testControlleurConsole me permet de tester les fonctions,
elle peut aussi être un exemple d'utilisation des fonctions.
---
 src/controleur.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++-
 src/controleur.h |   5 ++
 2 files changed, 130 insertions(+), 2 deletions(-)

diff --git a/src/controleur.c b/src/controleur.c
index 07b8e0b..8f2ca41 100644
--- a/src/controleur.c
+++ b/src/controleur.c
@@ -192,7 +192,7 @@ char ** obtenirDescriptionCarte(){
 }
 
 /*!
- * \fn Case * trouverCase(Carte c, int x, int y)
+ * \fn Case * trouverCase(Carte_Jeu * c, int x, int y)
  * \brief La fonction retourne un pointeur vers la case de coordonnées x,y
  *
  * \param les coordonnées x et y d'une case (pas en pixels mais bien en colonne et ligne), ainsi que la carte utilisée
@@ -256,7 +256,6 @@ int ajouterPersonnage(char * nomClasse, int numTab, int numJoueur){
  * \fn int selectionnerCarte(char * nomCarte)
  * \brief La fonction ajoute la Carte dont le nom est en parrametre à la Partie.
  *        Les Terrains de la Carte sont initialisé à partir des cartes décrites en XML
- *        Les Personnages sont placés à leur position de départ sur la carte.
  *
  * \param Le nom de la Carte décrite en XML.
  * \return 1 si la carte est correctement initialisée, 0 sinon.
@@ -279,6 +278,11 @@ int selectionnerCarte(char * nomCarte){
     return 1;
 }
 
+  /*!
+ * \fn void initPositions()
+ * \brief La fonction initialise les positions des personnages sur la Carte.
+ *        La carte de jeu doit être initialisée avant l'appel à cette fonction.
+ */
 void initPositions(){
     // Positionnement des Personnages sur la Carte_Jeu.
     int i;
@@ -294,6 +298,125 @@ void initPositions(){
     }
 }
 
+  /*!
+ * \fn char * ObtenirRessourceTerrain(int x, int y)
+ * \brief La fonction teste le type d'un Terrain aux coordonnées données et renvoie la ressource à afficher.
+ *        L'utilisation de cette fonction pourrait se faire dans une boucle dans la SDL pour afficher la carte Case par Case.
+ *        Il est d'abbord nécessaire de convertir les coordonnées "pixels" en coordonnées de cases de jeu.
+ *        La carte doit être initialisées avant l'appel à cette fonction.
+ *
+ * \param Les coordonnées de la Case à tester
+ * \return un char * vers la ressource du Terrain de la case.
+ */
+char * ObtenirRessourceTerrain(int x, int y){
+    return get_terrain(trouverCase(getCarte(partieGlobale),x,y))->skin_default;
+}
+
+  /*!
+ * \fn int personnagePresent(int x, int y)
+ * \brief La fonction teste si un Personnage est présent aux coordonnées à tester.
+ *        Les coordonnées doivent être convertir des "pixels" de la SDL en Cases de Jeu.
+ *
+ * \param Les coordonnées de la Case à tester
+ * \return 1 si un Personnage est présent aux coordonnées, 0 sinon.
+ */
+int personnagePresent(int x, int y){
+    return est_occupee(trouverCase(getCarte(partieGlobale),x,y));
+}
+
+  /*!
+ * \fn char * obtenirRessourcePersonnage(int x, int y)
+ * \brief La fonction renvoie la ressource d'un Personnage présent aux coordonnées.
+ *
+ * \param Les coordonnées de la Case à tester
+ * \return la ressource du personnage sur la case, NULL s'il n'y a pas de personnage sur la case ou si le Personnage n'est pas trouvé.
+ */
+char * obtenirRessourcePersonnage(int x, int y){
+    int i;
+    Joueur * actuel = NULL;
+    char * ressource = malloc(TAILLE_CHEMIN*sizeof(char));
+    ressource = NULL;
+    //Test Personnage sur la case.
+    if(!personnagePresent(x,y)){
+        return NULL;
+    }
+
+    else{
+        //sauvegarde du Joueur dont c'est le tour.
+        actuel = getCurrentJoueur(getListJoueur(partieGlobale));
+        //recherche du Personnage sur la case pour le premier Joueur.
+        setOnFirstJoueur(getListJoueur(partieGlobale));
+        for(i=0;i<TAILLE_MAX_GROUPE;i++){
+            if(get_x(getPosition(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))==x){
+                if(get_y(getPosition(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))==y){
+                    //sauvegarde de la ressource du Personnage.
+                    ressource = (getClasse(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))->skins.charac_default;
+                    // On remet le pointeur courant sur le personnage dont c'est le tour.
+                    setOnJoueur(getListJoueur(partieGlobale),actuel);
+                    //retour de la ressource du personnage.
+                    return ressource;
+                }
+            }
+        }
+        //recherche du Personnage sur la case pour le premier Joueur.
+        nextJoueur(getListJoueur(partieGlobale));
+        for(i=0;i<TAILLE_MAX_GROUPE;i++){
+            if(get_x(getPosition(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))==x){
+                if(get_y(getPosition(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))==y){
+                    ressource = (getClasse(getPersonnage(getCurrentJoueur(getListJoueur(partieGlobale)),i)))->skins.charac_default;
+                    setOnJoueur(getListJoueur(partieGlobale),actuel);
+                    return ressource;
+                }
+            }
+        }
+        //Si aucun personnage trouvé.
+        return NULL;
+    }
+}
+
+// Je met ici mes tests réalisés dans le main pour éviter de les réécrire si jamais il y a un problème.
+// Si vous voulez tester aussi, à recopier dans le main avant l'appel à initJeu().
+void testControlleurConsole(){
+    int i,j;
+    EtatsJeu state = SAISIE_JOUEURS;
+    extern Partie * partieGlobale;
+    extern Game_Package packGlobal;
+    initJeu();
+    ajouterUnJoueur("Joueur1",&state);
+    ajouterUnJoueur("Joueur2",&state);
+
+    ajouterPersonnage(packGlobal.Classes_Package[0].nom,0,1);
+    ajouterPersonnage(packGlobal.Classes_Package[1].nom,1,1);
+    ajouterPersonnage(packGlobal.Classes_Package[2].nom,2,1);
+    ajouterPersonnage(packGlobal.Classes_Package[3].nom,0,2);
+    ajouterPersonnage(packGlobal.Classes_Package[4].nom,1,2);
+    ajouterPersonnage(packGlobal.Classes_Package[0].nom,2,2);
+
+    selectionnerCarte(packGlobal.Cartes_Package[1].nom);
+    initPositions();
+
+
+    for(i=0;i<LARG_MAX_CARTE;i++){
+        for(j=0;j<HAUT_MAX_CARTE;j++){
+            printf("%s\n",ObtenirRessourceTerrain(i,j));
+        }
+    }
+
+    for(i=0;i<LARG_MAX_CARTE;i++){
+        for(j=0;j<HAUT_MAX_CARTE;j++){
+            printf("%d ",personnagePresent(i,j));
+        }
+        printf("\n");
+    }
+
+    for(i=0;i<LARG_MAX_CARTE;i++){
+        for(j=0;j<HAUT_MAX_CARTE;j++){
+        printf("%s : Position : %d/%d\n",obtenirRessourcePersonnage(i,j),i,j);
+        }
+    }
+
+}
+
 
 
 
diff --git a/src/controleur.h b/src/controleur.h
index 308acd0..8e6059f 100644
--- a/src/controleur.h
+++ b/src/controleur.h
@@ -29,6 +29,11 @@ int ajouterPersonnage(char * nomClasse, int numTab, int numJoueur);
 int selectionnerCarte(char * nomCarte);
 void initPositions();
 
+char * ObtenirRessourceTerrain(int x, int y);
 
+int personnagePresent(int x, int y);
+char * obtenirRessourcePersonnage(int x, int y);
+
+void testControlleurConsole();
 #endif // CONTROLEUR_H
 
-- 
GitLab