/* Fonctions qui prend en argument le plateau de jeu et le modifie en fonction des déplacements du serpent

   Written by Yann KERAUDREN and Titouan LERICHE */


#include <stdlib.h>
#include <stdio.h>
#include <graph.h> 
#include "plateau_init.h"
#include "supp_queue.h"
#include "deplacement.h"





unsigned char deplacement (struct adresse* pointeur, unsigned char* sens, unsigned char* retard, short int* compteur, unsigned long* acceleration, int numsprite)  {


  int** plateau = pointeur -> plateau;

  unsigned char* tete = pointeur -> tete;

  int** corps_serpent = pointeur -> corps_serpent;

  unsigned short* indice_queue = pointeur -> indice_queue; 

  int touche;

  couleur green, yellow;

  green = CouleurParComposante(50,205,50);
  
  yellow = CouleurParComposante(255,255,0);




  
		
  /* affectations des commandes aux touches du jeu */

  if (ToucheEnAttente() == 1)  {

    touche = Touche();

    if (touche == XK_Left) {


      
      /* test de dépassement des limites du plateau de jeu */
      if ( tete[1] == 0)  {

	return 0;

      }


      /* modificaton du plateau de jeu et affichage de la tête */ 
      else{
      


	tete[1] = tete[1] - 1;



	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1)  {

	  return 0;


	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */

	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;


	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);


	  *sens = GAUCHE;

	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);

	  plateau[tete[0]][tete[1]] = 1;

      

	  return 1;

	}
	
      }

    }





    

    if (touche == XK_Right)  {


      
      /* test de dépassement des limites du plateau de jeu */
      if (tete[1] == COLONNES - 1)  {

	return 0;

      }


      else{


	tete[1] = tete[1] + 1;


	
	/* test si le serpent se rentre dedans */
	if ( plateau[tete[0]][tete[1]] == 1)  {

	  return 0;


	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */
	  
	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;

	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);


	  *sens = DROITE;

	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);

	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}
      }

    }

    

    if (touche == XK_Up)  {

      
      
      /* test de dépassement des limites du plateau de jeu */
      if (tete[0] == 0)  {

	return 0;

      }


      else{ 


	tete[0] = tete[0] - 1;
	

	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1)  {

	  return 0;


	}else{
	  

	  /* modificaton du plateau de jeu et affichage de la tête */

	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;

	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);


	  *sens = HAUT;

	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);

	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}
      }
    }


    

    if (touche == XK_Down)  {

      

      /* test de dépassement des limites du plateau de jeu */
      if (tete[0] == LIGNES - 1)  {

	return 0;

      }


      
      else{


	tete[0] = tete[0] + 1;


	
	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1) {

	  return 0;
	

	  

	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */
	  
	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;

	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);


	  *sens = BAS;

	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);

	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}

      }

    }


    /* pour quiiter directement le jeu */

    if ( touche == XK_Escape)  {

      return 0;

    }





    
    /* pour mette le jeu pause puis soit reprendere le jeu soit quiiter le jeu */
    
    if (touche == XK_space)  {

      touche = Touche();

      if ( touche == XK_space)  {

	return 1;

      }

      if ( touche == XK_Escape)  {

	return 0;
      }
    }

 
  }






  


    

  else {

    if ( *sens == BAS)  {


      /* test de dépassement des limites du plateau de jeu */
      if ( tete[0] == LIGNES - 1 )  {


	return 0;
	
      }


      
      else {
	
	
      
	tete[0] = tete[0] + 1;

	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1) {

	  return 0;

	  
	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */

	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;

	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);

      
	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);
	  
	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}
	
      }
    }

    if ( *sens == HAUT)  {


      /* test de dépassement des limites du plateau de jeu */
      if ( tete[0] == 0)  {

	return 0;

      }


       
      else{

      
	tete[0] = tete[0] - 1;

	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1) {

	  return 0;
	
	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */

	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;

	  
	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);
	
      
	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);
	  
	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}
      }
      
    }

  

    if ( *sens == DROITE)  {


      /* test de dépassement des limites du plateau de jeu */
      if ( tete[1] == COLONNES - 1)  {

	return 0;

      }

       
      else{
      
      
	tete[1] = tete[1] + 1;


	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1) {

	  return 0;
	
	}else{

	  /* modificaton du plateau de jeu et affichage de la tête */

	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;
	  
	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);
      
      
	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);
	  
	  plateau[tete[0]][tete[1]] = 1;

	  return 1;

	}
      }
      
    }
    
    if ( *sens == GAUCHE)  {


      /* test de dépassement des limites du plateau de jeu */
      if (tete[1] == 0) {

	return 0;

      }

       
      else {
      
     
      
	tete[1] = tete[1] - 1;


	/* test si le serpent se rentre dedans */
	if (plateau[tete[0]][tete[1]] == 1) {

	  return 0;
	
	}else{
      
	  /* modificaton du plateau de jeu et affichage de la tête */
	  
	  plateau[corps_serpent[*indice_queue][0]][corps_serpent[*indice_queue][1]] = 0;
	  
	  ChoisirCouleurDessin(yellow);
	  RemplirRectangle(20*(tete[1]+1),20*(tete[0]+1),20,20);
	
	
	  supp_queue(pointeur, retard, compteur, acceleration, numsprite);
	  
	  plateau[tete[0]][tete[1]] = 1;
	
	  return 1;

	}
      }
    }
    
  }
	
}