From 3362af9a43201121a6d00c2017b989ee31033c9f Mon Sep 17 00:00:00 2001
From: ColinDrieu <colin.drieu@insa-rennes.fr>
Date: Tue, 17 May 2016 16:32:45 +0200
Subject: [PATCH] =?UTF-8?q?Ajout=20d'une=20fonction=20permettant=20de=20de?=
 =?UTF-8?q?terminer=20si=20une=20case=20est=20=C3=A0=20port=C3=A9e.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

J'ai modifié Terrains.xml de maniere à ce que les forets ne soient pas franchissables par les sorts.
---
 resources/Terrains.xml |  2 +-
 src/case.c             | 72 ++++++++++++++++++++++++++++++++++++++++++
 src/case.h             |  2 ++
 src/controleur.c       | 29 +++++++++++++++--
 src/personnage.h       |  2 ++
 5 files changed, 104 insertions(+), 3 deletions(-)

diff --git a/resources/Terrains.xml b/resources/Terrains.xml
index d159420..10456bd 100644
--- a/resources/Terrains.xml
+++ b/resources/Terrains.xml
@@ -4,7 +4,7 @@
 	</Terrain>
 	<Terrain id="G_RIVER"  name="Riviere" FR="0"  FRS="1"  PDR="1"  Desc="River, arrete de river" f_default="../resources/Skins/eau.bmp">
 	</Terrain>
-	<Terrain id="G_FOREST"  name="Foret"  FR="1"  FRS="1"  PDR="2"  Desc="Le frère de Fopart" f_default="../resources/Skins/foret.bmp">
+	<Terrain id="G_FOREST"  name="Foret"  FR="1"  FRS="0"  PDR="2"  Desc="Le frère de Fopart" f_default="../resources/Skins/foret.bmp">
 	</Terrain>
 	<Terrain id="G_MOUNT"  name="Montagne" FR="0"  FRS="0"  PDR="0"  Desc="Montagne est plus haut que tontagne" f_default="../resources/Skins/montagne.bmp">
 	</Terrain>
diff --git a/src/case.c b/src/case.c
index 6733b2e..4e2ab4f 100644
--- a/src/case.c
+++ b/src/case.c
@@ -5,6 +5,7 @@
 #include "structures.h"
 #include "personnage.h"
 #include "deplacements.h"
+#include "partie.h"
 
 /*!
 * \file case.c
@@ -124,3 +125,74 @@ int initCarte(Carte_A * sourceXML, Carte_Jeu * destination, Game_Package * pack)
     }
     return 1;
 }
+
+  /*!
+ * \fn int adjacente(Case * depart, Case * cible)
+ * \brief La fonction teste si la case cible est adjacente à la case départ.
+ *
+ * \param un pointeur vers la case de départ, un pointeur vers la case à tester
+ * \return 1 si la case est adjacente, 0 sinon.
+ */
+int adjacente(Case * depart, Case * cible){
+    if(get_x(cible)==get_x(depart)){
+        if((get_y(cible)==get_y(depart)-1)||(get_y(cible)==get_y(depart)+1)){
+            return 1;
+        }
+        else{
+            return 0;
+        }
+    }
+    else if((get_x(cible)==(get_x(depart)-1))||(get_x(cible)==(get_x(depart)+1))){
+        if(get_x(depart)%2==1){
+            if((get_y(cible)==get_y(depart))||(get_y(cible)==get_y(depart)-1)){
+                return 1;
+            }
+            else{
+                return 0;
+            }
+        }
+        else{
+            if((get_y(cible)==get_y(depart))||(get_y(cible)==get_y(depart)+1)){
+                return 1;
+            }
+            else{
+                return 0;
+            }
+        }
+    }
+    else{
+        return 0;
+    }
+}
+
+  /*!
+ * \fn APorteeRecursif(Carte_Jeu * c, Case * depart, Case * cible,int portee)
+ * \brief La fonction teste si la case cible est a portée de la case de départ.
+ *
+ * \param La carte sur laquelle on fait le test, un pointeur vers la case de départ, un pointeur vers la case à tester, un entier representant la portée
+ * \return 1 si la case est à portée, 0 sinon.
+ */
+int APorteeRecursif(Carte_Jeu * c, Case * depart, Case * cible,int portee){
+    int i,j;
+
+    if(depart==cible){
+        return (cible->terrain->franchissable_sorts==vrai);
+    }
+
+    else if((portee==1)&&(adjacente(depart,cible))){
+        return (cible->terrain->franchissable_sorts==vrai);
+    }
+    else{
+        portee--;
+        for((i=get_x(depart)-portee);((i<LARG_MAX_CARTE)&&(i<=get_x(depart)+portee));i++){
+            for((j=get_y(depart)-portee);((j<HAUT_MAX_CARTE)&&(j<=get_y(depart)+portee));j++){
+                if(adjacente(getCase(c,i,j),depart)){
+                    if(APorteeRecursif(c,getCase(c,i,j),cible,portee)){
+                        return (cible->terrain->franchissable_sorts==vrai);
+                    }
+                }
+            }
+        }
+    return 0;
+    }
+}
diff --git a/src/case.h b/src/case.h
index 7dd05df..7d40b27 100644
--- a/src/case.h
+++ b/src/case.h
@@ -46,6 +46,8 @@ int initCarte(Carte_A * sourceXML, Carte_Jeu * destination, Game_Package * pack)
 
 /*Case * trouverCase(Carte * c, int x, int y);*/
 
+int adjacente(Case * depart, Case * cible);
+int APorteeRecursif(Carte_Jeu *c, Case * depart, Case * cible,int portee);
 
 #endif
 
diff --git a/src/controleur.c b/src/controleur.c
index 3f65b18..d4fe9d8 100644
--- a/src/controleur.c
+++ b/src/controleur.c
@@ -854,7 +854,7 @@ void testControlleurConsole(){
     ajouterPersonnage(packGlobal.Classes_Package[4].nom,1,2);
     ajouterPersonnage(packGlobal.Classes_Package[0].nom,2,2);
 
-    selectionnerCarte(packGlobal.Cartes_Package[2].nom);
+    selectionnerCarte(packGlobal.Cartes_Package[4].nom);
     initPositions();
 
 
@@ -865,11 +865,37 @@ void testControlleurConsole(){
     }
 
     for(i=0;i<LARG_MAX_CARTE;i++){
+        if(i%2){
+            printf(" ");
+        }
         for(j=0;j<HAUT_MAX_CARTE;j++){
             printf("%d ",personnagePresent(i,j));
         }
         printf("\n");
     }
+    printf("\n");
+    for(i=0;i<LARG_MAX_CARTE;i++){
+        if(i%2==0){
+            printf(" ");
+        }
+        for(j=0;j<HAUT_MAX_CARTE;j++){
+            printf("%d ",adjacente(getCase(getCarte(partieGlobale),7,4),getCase(getCarte(partieGlobale),i,j)));
+        }
+        printf("\n");
+    }
+    printf("\n");
+
+    printf("A portee :\n");
+    for(i=0;i<LARG_MAX_CARTE;i++){
+        if(i%2==0){
+            printf(" ");
+        }
+        for(j=0;j<HAUT_MAX_CARTE;j++){
+            printf("%d ",APorteeRecursif(getCarte(partieGlobale),getCase(getCarte(partieGlobale),7,4),getCase(getCarte(partieGlobale),i,j),3));
+        }
+        printf("\n");
+    }
+    printf("\n");
 
     for(i=0;i<LARG_MAX_CARTE;i++){
         for(j=0;j<HAUT_MAX_CARTE;j++){
@@ -902,7 +928,6 @@ void testControlleurConsole(){
             }
         }
     }
-
 }
 
 
diff --git a/src/personnage.h b/src/personnage.h
index 5aeaf06..075d536 100644
--- a/src/personnage.h
+++ b/src/personnage.h
@@ -39,6 +39,8 @@ void retraitPD(Personnage * p, int n);
 int personnageKO(Personnage * p);
 int manaSuffisant(Personnage * p, int mana);
 
+int APortee(Personnage * depart, Personnage * cible, int portee);
+
 Classe * getClasse(Personnage *p);
 
 char * getNomPersonnage(Personnage * p);
-- 
GitLab