From 4da652cd5adfd2b0d36f99df33f5289fc064c7c8 Mon Sep 17 00:00:00 2001
From: Henri Montjoie <henri.montjoie@insa-rennes.fr>
Date: Fri, 22 Apr 2016 00:27:24 +0200
Subject: [PATCH] =?UTF-8?q?cr=C3=A9ation=20du=20controleur=20pour=20l'affi?=
 =?UTF-8?q?chage=20en=20SDL=20et=20controle=20a=20la=20souris?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 src/Classes_XML_log  |  52 +++++++++
 src/SDL.c            | 255 +++++--------------------------------------
 src/SDL.h            |  10 +-
 src/Terrains_XML_log |  43 ++++++++
 src/affichage.c      |   0
 src/affichage.h      |   6 -
 src/case.c           |   3 +-
 src/case.h           |   2 +-
 src/controleurSDL.c  |  98 +++++++++++++++++
 src/controleurSDL.h  |  28 +++++
 src/controlleur.c    |   1 -
 src/deplacements.c   |  10 +-
 src/deplacements.h   |   4 +-
 src/main.c           |   2 +-
 src/personnage.c     |   8 +-
 15 files changed, 271 insertions(+), 251 deletions(-)
 create mode 100644 src/Classes_XML_log
 create mode 100644 src/Terrains_XML_log
 delete mode 100644 src/affichage.c
 delete mode 100644 src/affichage.h
 create mode 100644 src/controleurSDL.c
 create mode 100644 src/controleurSDL.h
 delete mode 100644 src/controlleur.c

diff --git a/src/Classes_XML_log b/src/Classes_XML_log
new file mode 100644
index 0000000..e2cc38a
--- /dev/null
+++ b/src/Classes_XML_log
@@ -0,0 +1,52 @@
+Fichier decrivant le deroulement de la procedure d'aquisition des classes
+
+I) Chargement du fichier XML - Definition des noeuds
+Le fichier contient 5 classes
+II) Chargement des classes
+1) Memoire allouee avec succes 
+La memoire allouee fait 80 octets
+
+Chargement de la classe numero 1
+Id : C_MAGE
+Nom : Mage
+PV : 100
+PM : 150
+MV : 2
+DESC : Le feu, ça brûle 
+Insertion de la classe 1 dans le tableau
+
+Chargement de la classe numero 2
+Id : C_WAR
+Nom : Guerrier
+PV : 200
+PM : 150
+MV : 2
+DESC : Aime beaucoup le street art
+Insertion de la classe 2 dans le tableau
+
+Chargement de la classe numero 3
+Id : C_HEAL
+Nom : Guerrisseur
+PV : 100
+PM : 150
+MV : 2
+DESC : Heal est des notres
+Insertion de la classe 3 dans le tableau
+
+Chargement de la classe numero 4
+Id : C_ROGUE
+Nom : Voleur
+PV : 100
+PM : 150
+MV : 2
+DESC : 60 minutes, ça vaut l'heure
+Insertion de la classe 4 dans le tableau
+
+Chargement de la classe numero 5
+Id : C_ARCHER
+Nom : Archer
+PV : 100
+PM : 150
+MV : 2
+DESC : Gérard, de son prénom
+Insertion de la classe 5 dans le tableau
diff --git a/src/SDL.c b/src/SDL.c
index 0e09f12..684eb41 100644
--- a/src/SDL.c
+++ b/src/SDL.c
@@ -1,23 +1,26 @@
 #include <stdlib.h>
 #include <SDL/SDL.h>
-
-#define LARGEUR_CARTE 16
-#define HAUTEUR_CARTE 10
-#define LARGEUR_CASE 53
-#define HAUTEUR_CASE 71
-#define NB_PERSO 1
+#include "structures.h"
+#include "partie.h"
+#include "joueur.h"
+#include "joueurList.h"
+#include "personnage.h"
+#include "case.h"
+#include "deplacements.h"
+#include "SDL.h"
+#include "controleurSDL.h"
 
 /*!
 * \file SDL.c
 * \brief Fichier contenant le code des fonctions liees à l'affichage par la SDL.
 */
 
+
 int main_SDL()
 {
-    int i;
-    int j;
-    SDL_Event event;
+    int i,j;
     SDL_Surface* ecran=NULL;
+    SDL_Event event;
     SDL_Surface* perso[NB_PERSO]={NULL};
     SDL_Surface* Case=NULL;
     SDL_Rect Position_Case[LARGEUR_CARTE*HAUTEUR_CARTE];
@@ -29,15 +32,15 @@ int main_SDL()
         printf( "Unable to init SDL: %s\n", SDL_GetError() );
         return 1;
     }
+
     ecran = SDL_SetVideoMode(LARGEUR_CARTE*(LARGEUR_CASE+1), HAUTEUR_CARTE*(HAUTEUR_CASE+2), 32, SDL_HWSURFACE|SDL_DOUBLEBUF);
     if (ecran == NULL) // Si l'ouverture a échoué, on le note et on arrête
     {
         fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
         exit(EXIT_FAILURE);
     }
-    SDL_WM_SetCaption("Elder Internal Ignition",NULL);
 
-    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
+    SDL_WM_SetCaption("Elder Internal Ignition",NULL);
 
     perso[0] = SDL_LoadBMP("../resources/personnage.bmp");
         if (!perso[0])
@@ -58,19 +61,21 @@ int main_SDL()
     {
         for(j=0;j<HAUTEUR_CARTE;j++)
             {
-                Position_Case[i*HAUTEUR_CARTE+j].x=LARGEUR_CASE*i;
-                Position_Case[i*HAUTEUR_CARTE+j].y=HAUTEUR_CASE*j;
+                Position_Case[j*LARGEUR_CARTE+i].x=LARGEUR_CASE*i;
+                Position_Case[j*LARGEUR_CARTE+i].y=HAUTEUR_CASE*j;
             }
     }
     for(i=1;i<LARGEUR_CARTE;i+=2)
     {
         for(j=0;j<HAUTEUR_CARTE;j++)
             {
-                Position_Case[i*HAUTEUR_CARTE+j].x=LARGEUR_CASE*i;
-                Position_Case[i*HAUTEUR_CARTE+j].y=HAUTEUR_CASE*j+(HAUTEUR_CASE/2);
+                Position_Case[j*LARGEUR_CARTE+i].x=LARGEUR_CASE*i;
+                Position_Case[j*LARGEUR_CARTE+i].y=HAUTEUR_CASE*j+(HAUTEUR_CASE/2);
             }
     }
-    Position_Perso[0]=Position_Case[0];
+
+    init_controleur(Position_Case);
+
     while(quitter==0)
     {
         SDL_WaitEvent(&event);
@@ -79,36 +84,11 @@ int main_SDL()
             case SDL_QUIT: /* Si c'est un événement de type "Quitter" */
                 quitter=1;
                 break;
+            case SDL_MOUSEBUTTONDOWN:
+                deplacement_personnage(0,event.button.x,event.button.y);
+                break;
             case SDL_KEYDOWN:/* Si c'est un événement de type "touche pressée" */
                 switch(event.key.keysym.sym){
-                    case SDLK_KP7:
-                        if(Position_Perso[0].y>0&&Position_Perso[0].x>0)
-                            {Position_Perso[0].y-=HAUTEUR_CASE/2;
-                            Position_Perso[0].x-=LARGEUR_CASE;}
-                        break;
-                    case SDLK_KP8:
-                        if(Position_Perso[0].y>0)
-                            Position_Perso[0].y-=HAUTEUR_CASE;
-                        break;
-                    case SDLK_KP9:
-                        if((Position_Perso[0].y>0)&&(Position_Perso[0].x<LARGEUR_CASE*(LARGEUR_CARTE-1)))
-                            {Position_Perso[0].y-=HAUTEUR_CASE/2;
-                            Position_Perso[0].x+=LARGEUR_CASE;}
-                        break;
-                    case SDLK_KP1:
-                        if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1)&&Position_Perso[0].x>0)
-                            {Position_Perso[0].y+=HAUTEUR_CASE/2;
-                            Position_Perso[0].x-=LARGEUR_CASE;}
-                        break;
-                    case SDLK_KP2:
-                        if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1))
-                            Position_Perso[0].y+=HAUTEUR_CASE;
-                        break;
-                    case SDLK_KP3:
-                        if(Position_Perso[0].y<HAUTEUR_CASE*(HAUTEUR_CARTE-1)&&Position_Perso[0].x<LARGEUR_CASE*(LARGEUR_CARTE-1))
-                            {Position_Perso[0].y+=HAUTEUR_CASE/2;
-                            Position_Perso[0].x+=LARGEUR_CASE;}
-                        break;
                     case SDLK_ESCAPE:
                         quitter=1;
                         break;
@@ -117,6 +97,8 @@ int main_SDL()
                 }
              break;
         }
+        Position_Perso[0].x=get_position_perso_x(0);
+        Position_Perso[0].y=get_position_perso_y(0);
         SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
         for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++)
         {
@@ -133,188 +115,3 @@ int main_SDL()
 }
 
 
-
-
-
-int main_Open_Classrooms ()
-{
-    int i;
-    SDL_Event event;
-    int continuer=0;
-    SDL_Surface* ecran=NULL;
-    SDL_Surface* rectangle=NULL;
-    SDL_Surface* image=NULL;
-    SDL_Rect position_image;
-    SDL_Rect position[256];
-
-    for(i=0;i<256;i++)
-    {
-        position[i].x=0;
-        position[i].y=i;
-    }
-
-
-    SDL_Surface* degrade[256]={NULL};
-
-    // initialize SDL video
-    if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
-    {
-        printf( "Unable to init SDL: %s\n", SDL_GetError() );
-        return 1;
-    }
-
-    // create a new window
-
-    ecran = SDL_SetVideoMode(800, 256, 16,SDL_HWSURFACE|SDL_DOUBLEBUF);
-    if (ecran == NULL) // Si l'ouverture a échoué, on le note et on arrête
-    {
-        fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
-        exit(EXIT_FAILURE);
-    }
-    SDL_WM_SetCaption("fenetre de test",NULL);
-
-
-
-    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,200,89,3));
-    SDL_Flip(ecran);
-
-    while(continuer==0)
-    {
-        SDL_WaitEvent(&event);
-        switch(event.type) /* Test du type d'événement */
-        {
-            case SDL_QUIT: /* Si c'est un événement de type "Quitter" */
-            SDL_Quit();
-            exit(0);
-            break;
-            case SDL_KEYDOWN:
-            continuer=1;
-            break;
-        }
-    }
-
-    continuer=0;
-    rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE,400,256,16,0,0,0,0);
-    SDL_FillRect(rectangle,NULL,SDL_MapRGB(ecran->format,0,127,255));
-    SDL_BlitSurface(rectangle,NULL,ecran,&position[0]);
-    SDL_Flip(ecran);
-
-    while(continuer==0)
-    {
-        SDL_WaitEvent(&event);
-        switch(event.type) /* Test du type d'événement */
-        {
-            case SDL_QUIT: /* Si c'est un événement de type "Quitter" */
-            SDL_FreeSurface(rectangle);
-            SDL_Quit();
-            exit(0);
-            break;
-            case SDL_KEYDOWN:
-            continuer=1;
-            break;
-        }
-    }
-    continuer=0;
-     for(i=0;i<256;i++)
-    {
-        degrade[i]=SDL_CreateRGBSurface(SDL_HWSURFACE,800,1,16,0,0,0,0);
-        SDL_FillRect(degrade[i],NULL,SDL_MapRGB(ecran->format,i,i,i));
-    }
-
-    for(i=0;i<256;i++)
-    {
-        SDL_BlitSurface(degrade[i],NULL,ecran,&position[i]);
-    }
-    SDL_Flip(ecran);
-
-    while(continuer==0)
-    {
-        SDL_WaitEvent(&event);
-        switch(event.type) /* Test du type d'événement */
-        {
-            case SDL_QUIT: /* Si c'est un événement de type "Quitter" */
-                for(i=0;i<256;i++)
-                {
-                    SDL_FreeSurface(degrade[i]);
-                }
-                SDL_FreeSurface(rectangle);
-                SDL_Quit();
-                exit(0);
-                break;
-            case SDL_KEYDOWN:
-                continuer=1;
-                break;
-        }
-    }
-    continuer=0;
-    for(i=0;i<256;i++)
-    {
-        SDL_FreeSurface(degrade[i]);
-    }
-    SDL_FreeSurface(rectangle);
-
-
-
-    // load an image
-    image = SDL_LoadBMP("montagnes1.bmp");
-    if (!image)
-    {
-        printf("Unable to load bitmap: %s\n", SDL_GetError());
-        return 1;
-    }
-    SDL_BlitSurface(image,NULL,ecran,&position[0]);
-    SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,120,250,120));
-    position_image=position[0];
-    SDL_Flip(ecran);
-
-    SDL_EnableKeyRepeat(10, 10);
-     while(1)
-    {
-        SDL_WaitEvent(&event);
-        switch(event.type) /* Test du type d'événement */
-        {
-            case SDL_QUIT: /* Si c'est un événement de type "Quitter" */
-                SDL_FreeSurface(image);
-                SDL_Quit();
-                exit(0);
-                break;
-            case SDL_MOUSEBUTTONDOWN:
-                position_image.x=event.button.x;
-                position_image.y=event.button.y;
-                break;
-            case SDL_KEYDOWN:/* Si c'est un événement de type "touche pressée" */
-                switch(event.key.keysym.sym){
-                    case SDLK_UP:
-                        if(position_image.y>0)
-                        position_image.y--;
-                        break;
-                    case SDLK_DOWN:
-                        if(position_image.y<256)
-                        position_image.y++;
-                        break;
-                    case SDLK_LEFT:
-                        if(position_image.x>0)
-                        position_image.x--;
-                        break;
-                    case SDLK_RIGHT:
-                        if(position_image.x<800)
-                        position_image.x++;
-                        break;
-                    case SDLK_ESCAPE:
-                        SDL_FreeSurface(image);
-                        SDL_Quit();
-                        exit(0);
-                        break;
-                    default:
-                         ;
-                }
-             break;
-         }
-         SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,120,250,120));
-         SDL_BlitSurface(image,NULL,ecran,&position_image);
-         SDL_Flip(ecran);
-    }
-
-
-    return 0;
-}
diff --git a/src/SDL.h b/src/SDL.h
index 2724b33..d1d7ade 100644
--- a/src/SDL.h
+++ b/src/SDL.h
@@ -1,5 +1,5 @@
 /*!
-* \file AffichageConsole.h
+* \file SDL.h
 * \brief Fichier contenant les signatures des fonctions liees a l'affichage par SDL.
 */
 
@@ -7,7 +7,13 @@
 #ifndef SDL_H_INCLUDED
 #define SDL_H_INCLUDED
 
+#define LARGEUR_CARTE 16
+#define HAUTEUR_CARTE 10
+#define LARGEUR_CASE 53
+#define HAUTEUR_CASE 71
+#define NB_PERSO 1
+
 int main_SDL();
-int main_Open_Classrooms ();
+
 
 #endif
diff --git a/src/Terrains_XML_log b/src/Terrains_XML_log
new file mode 100644
index 0000000..716eba7
--- /dev/null
+++ b/src/Terrains_XML_log
@@ -0,0 +1,43 @@
+Fichier decrivant le deroulement de la procedure d'aquisition des Terrains
+
+I) Chargement du fichier Terrains XML  - Definition des noeuds
+Le fichier contient 4 terrains
+II) Chargement des terrains
+1) Memoire allouee avec succes 
+La memoire allouee fait 64 octets
+
+Chargement du terrain numero 1
+Id : G_PLAIN
+Nom : Plaine
+FR : 1
+FRS : 1
+PDR : 1
+DESC : Plaine de bon sens
+Insertion du terrain 1 dans le tableau
+
+Chargement du terrain numero 2
+Id : G_RIVER
+Nom : Riviere
+FR : 0
+FRS : 1
+PDR : 1
+DESC : River, arrete de river
+Insertion du terrain 2 dans le tableau
+
+Chargement du terrain numero 3
+Id : G_FOREST
+Nom : Foret
+FR : 1
+FRS : 1
+PDR : 2
+DESC : Le frère de Fopart
+Insertion du terrain 3 dans le tableau
+
+Chargement du terrain numero 4
+Id : G_MOUNT
+Nom : Montagne
+FR : 0
+FRS : 0
+PDR : 0
+DESC : Montagne est plus haut que tontagne
+Insertion du terrain 4 dans le tableau
diff --git a/src/affichage.c b/src/affichage.c
deleted file mode 100644
index e69de29..0000000
diff --git a/src/affichage.h b/src/affichage.h
deleted file mode 100644
index e0db11a..0000000
--- a/src/affichage.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef AFFICHAGE_H_INCLUDED
-#define AFFICHAGE_H_INCLUDED
-
-
-
-#endif // AFFICHAGE_H_INCLUDED
diff --git a/src/case.c b/src/case.c
index f3f0789..a8622e5 100644
--- a/src/case.c
+++ b/src/case.c
@@ -75,6 +75,7 @@ int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur){
  * \param Les coordonnees a tester
  * \return Un pointeur vers la Case qui possede les coordonnees en entree, NULL s'il n'y a pas de Case avec ces coordonnees.
  */
+ /*
 Case * trouverCase(Carte * c, int x, int y){
     if((x<0)||(x>=LARG_MAX_CARTE)){
         return NULL;
@@ -85,4 +86,4 @@ Case * trouverCase(Carte * c, int x, int y){
     else{
         return c[(x*LARG_MAX_CARTE)+y];
     }
-}
+} */
diff --git a/src/case.h b/src/case.h
index a26b52e..50035c9 100644
--- a/src/case.h
+++ b/src/case.h
@@ -36,7 +36,7 @@ Terrain* get_terrain(Case *c);
 
 int init_carte(Carte* c,unsigned short int largeur, unsigned short int hauteur);
 
-Case * trouverCase(Carte * c, int x, int y);
+/*Case * trouverCase(Carte * c, int x, int y);*/
 
 
 #endif
diff --git a/src/controleurSDL.c b/src/controleurSDL.c
new file mode 100644
index 0000000..c92b880
--- /dev/null
+++ b/src/controleurSDL.c
@@ -0,0 +1,98 @@
+#include <stdlib.h>
+#include <SDL/SDL.h>
+#include "structures.h"
+#include "partie.h"
+#include "joueur.h"
+#include "joueurList.h"
+#include "personnage.h"
+#include "case.h"
+#include "deplacements.h"
+#include "SDL.h"
+#include "controleurSDL.h"
+
+/*!
+* \file controleurSDL.c
+* \brief Fichier contenant le code des fonctions du controleur pour l'affichage avec SDL
+*/
+
+
+Carte Carte_actuelle;
+Personnage ListePersos[NB_PERSO];
+
+
+void init_controleur(SDL_Rect Position_Case[])
+{
+    int i;
+    for(i=0;i<LARGEUR_CARTE*HAUTEUR_CARTE;i++)
+     {
+       init_case(&Carte_actuelle[i],Position_Case[i].x,Position_Case[i].y,NULL);
+     }
+    init_personnage(&ListePersos[0],NULL,&Carte_actuelle[0]);
+}
+
+int x_case_cliquee(int x_pixel, int y_pixel)
+{
+    return x_pixel/LARGEUR_CASE;
+}
+
+int y_case_cliquee(int x_pixel, int y_pixel)
+{
+    int i, x_case, y_case;
+    x_case = x_pixel/LARGEUR_CASE;
+    y_case = y_pixel/HAUTEUR_CASE;
+    for(i=1;i<LARGEUR_CARTE;i+=2)
+    {
+           if(x_case==i)
+            {
+                y_case=(y_pixel-HAUTEUR_CASE/2)/HAUTEUR_CASE;
+            }
+    }
+    return y_case;
+}
+
+Case * trouverCase(Carte c, int x, int y)
+{
+    if((x<0)||(x>=LARGEUR_CARTE)){
+        return NULL;
+    }
+    else if((y<0)||(y>=HAUTEUR_CARTE)){
+        return NULL;
+    }
+    else{
+        return &c[(y*LARGEUR_CARTE)+x];
+    }
+}
+
+
+void deplacement_personnage(int num, int x, int y)
+{
+    if(x<LARGEUR_CARTE*LARGEUR_CASE&&y<HAUTEUR_CARTE*HAUTEUR_CASE)
+    {
+        Case* case_cliquee = trouverCase(Carte_actuelle,x_case_cliquee(x,y),y_case_cliquee(x,y));
+        Personnage* perso = &ListePersos[num];
+        if (case_a_cote(perso,case_cliquee,HAUTEUR_CASE,LARGEUR_CASE)==vrai)
+        {
+            deplacer_personnage(perso, case_cliquee);
+        }
+    }
+}
+
+Case* get_case_perso(int num)
+{
+    Personnage* perso = &ListePersos[num];
+    return getPosition(perso);
+}
+
+int get_position_perso_x(int num)
+{
+    Case* case_perso = get_case_perso(num);
+    return get_x(case_perso);
+}
+
+int get_position_perso_y(int num)
+{
+    Case* case_perso = get_case_perso(num);
+    return get_y(case_perso);
+}
+
+
diff --git a/src/controleurSDL.h b/src/controleurSDL.h
new file mode 100644
index 0000000..71d6d9c
--- /dev/null
+++ b/src/controleurSDL.h
@@ -0,0 +1,28 @@
+/*!
+* \file controleurSDL.h
+* \brief Fichier contenant les signatures des fonctions du controleur pour l'affichage avec SDL.
+*/
+
+
+#ifndef CONTROLEUR_SDL_H_INCLUDED
+#define CONTROLEUR_SDL_H_INCLUDED
+
+int y_case_cliquee(int x_pixel, int y_pixel);
+
+int x_case_cliquee(int x_pixel, int y_pixel);
+
+Case * trouverCase(Carte c, int x, int y);
+
+void deplacement_personnage(int num, int x, int y);
+
+Case* get_case_perso(int num);
+
+int get_position_perso_x(int num);
+
+int get_position_perso_y(int num);
+
+void init_controleur();
+
+
+#endif
+
diff --git a/src/controlleur.c b/src/controlleur.c
deleted file mode 100644
index 8b13789..0000000
--- a/src/controlleur.c
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/src/deplacements.c b/src/deplacements.c
index 117b810..cbfeecc 100644
--- a/src/deplacements.c
+++ b/src/deplacements.c
@@ -10,18 +10,18 @@
 * \brief Fichier contenant le code des fonctions liees aux déplacements des personnages.
 */
 
-boolean case_a_cote(Personnage * perso, Case * destination){ /* vérifie que la case hexagonale "destination" est contigue à la case du personnage */
+boolean case_a_cote(Personnage * perso, Case * destination,int hauteur_case , int largeur_case){ /* vérifie que la case hexagonale "destination" est contigue à la case du personnage */
     Case *depart = getPosition(perso);
-    if (get_x(depart)>get_x(destination)+1||get_x(depart)<get_x(destination)-1||get_y(depart)>get_y(destination)+1||get_y(depart)>get_y(destination)-1){
+    if (get_x(depart)>get_x(destination)+largeur_case||get_x(depart)<get_x(destination)-largeur_case||get_y(depart)>get_y(destination)+hauteur_case||get_y(depart)<get_y(destination)-hauteur_case){
         return faux;
     }
-    if (get_y(depart)==get_y(destination)+1&&get_x(depart)!=get_x(destination)){
+    if (get_y(depart)==get_y(destination)+hauteur_case&&get_x(depart)!=get_x(destination)){
         return faux;
     }
     return vrai;
 }
 
-int deplacement_unitaire(Personnage *perso,Case * destination){ /*déplace un personnage sur une case située à côté de la sienne, si cela est possible */
+int deplacement_unitaire(Personnage *perso,Case * destination, int hauteur_case , int largeur_case){ /*déplace un personnage sur une case située à côté de la sienne, si cela est possible */
     if (est_occupee(destination)){
         printf("déplacement impossible : case déjà occupée par un personnage");
         return 1;
@@ -30,7 +30,7 @@ int deplacement_unitaire(Personnage *perso,Case * destination){ /*d
         printf("déplacement impossible : case infranchissable");
         return 1;
     }
-    if (case_a_cote(perso,destination)==vrai){
+    if (case_a_cote(perso,destination, hauteur_case, largeur_case)==vrai){
        return deplacer_personnage(perso, destination);
     }
     printf("déplacement impossible : case non contigue");
diff --git a/src/deplacements.h b/src/deplacements.h
index 0db414b..da5923c 100644
--- a/src/deplacements.h
+++ b/src/deplacements.h
@@ -6,9 +6,9 @@
 #ifndef DEPLACEMENTS_H_INCLUDED
 #define DEPLACEMENTS_H_INCLUDED
 
-boolean case_a_cote(Personnage *perso,Case *destination);
+boolean case_a_cote(Personnage *perso,Case *destination,int hauteur_case, int largeur_case);
 
-int deplacement_unitaire(Personnage *perso,Case *destination);
+int deplacement_unitaire(Personnage *perso,Case * destination, int hauteur_case , int largeur_case);
 
 
 #endif
diff --git a/src/main.c b/src/main.c
index 02143c5..558af27 100644
--- a/src/main.c
+++ b/src/main.c
@@ -67,7 +67,7 @@ int main()
 
 
 
-    init_jeu("../resources/Init_jeu.xml");
+ init_jeu("../resources/Init_jeu.xml");
 
     main_SDL();
 
diff --git a/src/personnage.c b/src/personnage.c
index 830a115..5022edb 100644
--- a/src/personnage.c
+++ b/src/personnage.c
@@ -12,9 +12,11 @@
 
 Personnage* init_personnage(Personnage *perso, Classe *c, Case *casedepart){
     perso->classe=c;
-    perso->points_deplacement=c->points_deplacement_max;
-    perso->PV=c->PV_max;
-    perso->mana=c->mana_max;
+    if(c!=NULL){
+        perso->points_deplacement=c->points_deplacement_max;
+        perso->PV=c->PV_max;
+        perso->mana=c->mana_max;
+    }
     perso->position=casedepart;
     marquer_occupee(casedepart);
     return perso;
-- 
GitLab