#include "premier.h"

SDL_Surface* affichage;
Mix_Music *music,*music2;
int pmx=400,pmy=450;
int taillepm=18, vitesse=4, couleurpacman;
int score=0, ancienscore=0, scoremax=0;
int direction=6,directionaux=0;
int murefface=0;
int murcree=0;
int verslafin=0;
int niveau=1;
int lumieres[1000][3];
int lumiere_en_construction=0,taillelumieres=2,taillelumieresevolution=1;
//fantomes[n] = [x],[y],[couleur],[mangeable],[direction]
int fantomes[1000][5];int taillefantome=8;
int fantome_en_construction=0,mangeables=0,vitessefantomes=4;
int murs[200][2][2];
int mur_en_construction=0;
int getfleur=0;
int temps=2000;
TTF_Font *font;

SDL_Surface *fantomenoir,*fantomebleu,*fantomejaune,*fantomeblanc;
SDL_Surface *fantomeorange,*fantomerouge,*fantomevert,*fantomegris;
SDL_Surface *fleurcactus,*fleurrose;
SDL_Surface *pacwoman;

int main(int argc, char** argv){
  initSDL();
  couleurpacman=JAUNE;
  chargementimages();
  musique();
  plateau();
  presentation();
  attendreTouche();
  afficherstage();
  effacer();
  plateau();
  dessiner_stage(niveau);
  dessinerpacman(pmx,pmy,couleurpacman);
  ecrirescoremax();
  actualiser();
  addscore(0);
  
  while(1)jeu();
  
  return EXIT_SUCCESS;
}

void chargementimages(){
  fantomenoir = SDL_LoadBMP("noir.bmp");
  fantomebleu= SDL_LoadBMP("fantomebleu.bmp");
  fantomerouge= SDL_LoadBMP("fantomerouge.bmp");
  fantomevert= SDL_LoadBMP("fantomevert.bmp");
  fantomeblanc= SDL_LoadBMP("fantomeblanc.bmp");
  fantomeorange= SDL_LoadBMP("fantomeorange.bmp");
  fantomejaune= SDL_LoadBMP("fantomejaune.bmp");
  fantomegris= SDL_LoadBMP("fantomegris.bmp");
  fleurcactus= SDL_LoadBMP("fleurcactus.bmp");
  fleurrose= SDL_LoadBMP("fleurrose.bmp");
  pacwoman= SDL_LoadBMP("pacwoman.bmp");
}

void fin(void){
  dessinerimage(250,250,0,0,"Aurevoir.bmp");
  system("sleep 2");//sleep(2000);
  exit(0);
}

void gagner(){
  if(niveau!=5)niveau++;
  else{
    niveau=1;
    if(score>scoremax)scoremax=score;
  }
  effacer();
  dessinerimage(250,250,0,0,"gagner.bmp");
  font=TTF_OpenFont("Arial.ttf", 30);
  if(getfleur==0){
    ecrire("Pas de fleurs ? Quelle d�eption ! -100 pts",130,400,255,255,255);
    score-=100;
  }
  else{
    if(getfleur==1){
      ecrire("Un bouquet de cactus ? Je m'attendais �mieux !",130,400,255,255,255);
    }
    else{
      ecrire("Ho le joli bouquet de roses ! I Loooooove You",130,400,255,255,255);
    }
  }
  font=TTF_OpenFont("Arial.ttf", 12);
  actualiser();
  ancienscore=score;
  system("sleep 2");//sleep(2000);
  nouvellepartie();
}

void afficherstage(void){
  effacer();
  font=TTF_OpenFont("Arial.ttf", 70);
  char chainestage [20];
  sprintf(chainestage,"Stage %d/5",niveau);
  ecrire(chainestage,280,250,255,255,255);
  font=TTF_OpenFont("Arial.ttf", 12);
  actualiser();
  system("sleep 2");
  //_sleep(2000);
}

void perdre(void){
  dessinerimage(250,250,0,0,"Perdu.bmp");
  system("sleep 2");//sleep(2000);
  nouvellepartie();
}

void reinitialiser(void){
  effacer();
  if(niveau!=5){
    pmx=400;
    pmy=450;
    taillepm=18;vitesse=4;
    vitessefantomes=4;
  }
  else{
    pmy=537;
    pmx=725;
    taillepm=8;vitesse=8;
    vitessefantomes=8;
  }
  score=ancienscore;
  lumiere_en_construction=0;
  taillelumieres=2;taillelumieresevolution=1;
  murefface=0;
  murcree=0;
  getfleur=0;
  temps=2000;
  fantome_en_construction=0;mangeables=0;
  mur_en_construction=0;
}
void nouvellepartie(void){
  reinitialiser();
  if(niveau==1){
    score=0;
    plateau();
    presentation();
    attendreTouche();
  }
  afficherstage();
  effacer();
  plateau();
  dessinerpacman(pmx,pmy,couleurpacman);
  dessiner_stage(niveau);
  ecrirescoremax();
  actualiser();
}

void ecrirescoremax(void){
  SDL_Rect rect={50,1,150,48};
  SDL_FillRect(affichage,&rect, NOIR);
  char chaine_scoremax [30];
  sprintf(chaine_scoremax,"Meilleur score : %d",scoremax);
  ecrire(chaine_scoremax,50,20,255,0,0);
}
  
void changer_vitesse(int a){
  vitesse=a;
}

void changer_taille(int a){
  dessinerpacman(pmx,pmy,NOIR);
  taillepm=a;
  dessinerpacman(pmx,pmy,couleurpacman);
  actualiser();
}

void addscore(int a){
  score+=a;
  SDL_Rect rect={326,500,148,49};
  SDL_FillRect(affichage,&rect, NOIR);
  char chaine_score [20];
  ecrire("Score :",370,490,0,255,0);
  font=TTF_OpenFont("Arial.ttf", 24);
  sprintf(chaine_score,"%d",score);
  ecrire(chaine_score,370,510,0,255,0);
  font=TTF_OpenFont("Arial.ttf", 12);
  if(score==0)actualiser();
}

void decompte(void){
  temps--;
  SDL_Rect rect={600,35,100,14};
  SDL_FillRect(affichage,&rect, NOIR);
  char chaine_temps [20];
  ecrire("Temps: ",600,35,250,0,0);
  sprintf(chaine_temps,"%d",temps);
  ecrire(chaine_temps,670,35,0,255,0);
//  actualiser();
}

void presentation(void){
  dessinerimage(100,100,0,0,"Presentation.bmp");
}

void effacer(void){
  SDL_FillRect(affichage, NULL, NOIR);
  actualiser();
}

void musique(void){
  if(SDL_Init(SDL_INIT_AUDIO)==-1)printf("erreur - initialisation du son 1\n");;
  if(Mix_OpenAudio(44100,MIX_DEFAULT_FORMAT,2,2048)==-1)printf("erreur - initialisation du son 2\n");
  music2=Mix_LoadMUS("eatemup.ogg");
  music=Mix_LoadMUS("pacman.mp3");
  if(Mix_PlayMusic(music, 20)==-1)printf("erreur - initialisation du son3\n");;
  if(Mix_VolumeMusic(SDL_MIX_MAXVOLUME)==-1)printf("erreur - initialisation du son4\n");;
}

void effacerlederniermur(){
     system("sleep 0.1");//sleep(100);
     int x=murs[mur_en_construction-1][0][0];
     int y=murs[mur_en_construction-1][0][1];
     int xx=murs[mur_en_construction-1][1][0];
     int yy=murs[mur_en_construction-1][1][1];
     while(y!=yy){
       setPixelVerif(x,y,NOIR);
       y++;
       system("sleep 0.04");//sleep(40);
       actualiser();
     }
     mur_en_construction--;
}

void tests(){
  lumiere();
  if(mangeables!=0){
    if(mangeables<200)
      mangeables++;
    else fantomes_mangeables(0);
  }
  fantome();
  bouger_fantomes();
  if(pmx>651&&pmx<690&&pmy>76&&pmy<99&&murefface==0&&taillepm==8){murefface=1;effacerlederniermur();}
  if(pmx>675&&pmx<690&&pmy>151&&pmy<175&&murcree==0){
    mur_en_construction--;
    construire_mur(650,150,650,175,FLEURCACTUS);
    construire_mur(650,76,650,99,FLEURCACTUS);
    murcree=1;
  }
  if(pmx<130&&pmx>100&&pmy<100&&pmy>75&&verslafin==0){
    verslafin=1;construire_mur(150,75,150,100,FLEURCACTUS);
  }
  if(pmx<100&&pmx>75&&pmy<115&&pmy>100)gagner();
  
  if(temps==0)perdre();
}

void jeu(void){
  SDL_Event e;
  while(SDL_PollEvent(&e)==0){
    switch(e.type){
  	  case SDL_KEYDOWN:
        tests();
        decompte();
  			switch(e.key.keysym.sym){
  				case SDLK_ESCAPE:
            fin(); break;
  				case SDLK_F2:
            niveau=1;nouvellepartie(); SDL_WaitEvent(&e);break;
          /*faire bugger pacman
  				case SDLK_F4:
            reinitialiser(); SDL_WaitEvent(&e);break;*/
  				case SDLK_LEFT:
            bouger(4); break;
  				case SDLK_RIGHT:
            bouger(6); break;
  				case SDLK_UP:
            bouger(8); break;
  				case SDLK_DOWN:
            bouger(2); break;
  				case SDLK_1:
          	Mix_PlayMusic(music, 1);
            SDL_WaitEvent(&e);
            break;
  				case SDLK_2:
            Mix_PlayMusic(music2, 1);
            SDL_WaitEvent(&e);
            break;
  				case SDLK_SPACE:
            if(Mix_PausedMusic()==0)
              Mix_PauseMusic();
            else
              Mix_ResumeMusic();
            SDL_WaitEvent(&e); break;
  				case SDLK_a:
            changer_vitesse(vitesse+=2);
            SDL_WaitEvent(&e); break;
          case SDLK_q:
            changer_vitesse(vitesse-=2);
            SDL_WaitEvent(&e); break;
          case SDLK_z:
            changer_taille(taillepm+1);
            SDL_WaitEvent(&e); break;
          case SDLK_s:
            changer_taille(taillepm-1);
            SDL_WaitEvent(&e); break;
          case SDLK_x:
            while(taillepm!=0)
            changer_taille(taillepm-1);
            SDL_WaitEvent(&e); break;
          case SDLK_w:
            changer_taille(12);
            SDL_WaitEvent(&e); break;
          default: break;//SDL_WaitEvent(&e);break;
  			} break;
      default: break;
  	}
  }
}

void initSDL(void){
  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    fprintf(stderr, "Erreur �l'initialisation de la SDL : %s\n", SDL_GetError());
    exit(EXIT_FAILURE);
  }
  atexit(SDL_Quit);
  affichage = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);//SDL_FULLSCREEN);
  if (affichage == NULL) {
    fprintf(stderr, "Impossible d'activer le mode graphique : %s\n", SDL_GetError());
    exit(EXIT_FAILURE);
  }
  SDL_ShowCursor(SDL_DISABLE);
  SDL_EventState(SDL_KEYUP, SDL_IGNORE);
  srand(time(NULL));
  //SDL_WM_SetCaption("Pacman", NULL);
  if(TTF_Init()==-1) {
    printf("TTF_Init: %s\n", TTF_GetError());
    exit(2);
  }
  font=TTF_OpenFont("Arial.ttf", 12);
  if(!font)printf("TTF_OpenFont: %s\n", TTF_GetError());
}

void attendreTouche(void){
  SDL_Event event;
  do
    SDL_WaitEvent(&event);
  while (event.type != SDL_QUIT && event.type != SDL_KEYDOWN && event.type != SDL_MOUSEBUTTONDOWN);
}

void setPixel(int x, int y, Uint32 coul){
  *((Uint32*)(affichage->pixels) + x + y * affichage->w) = coul;
}

void actualiser(void){
  SDL_UpdateRect(affichage, 0, 0, 0, 0);
}

void echangerEntiers(int* x, int* y){
  int t = *x;
  *x = *y;
  *y = t;
}

void setPixelVerif(int x, int y, Uint32 coul){
  if (x >= 0 && x < affichage->w && y >= 0 && y < affichage->h)
    setPixel(x, y, coul);
}

void drawline(int x1, int y1, int x2, int y2, Uint32 coul){
  int d, dx, dy, aincr, bincr, xincr, yincr, x, y;
  if (abs(x2 - x1) < abs(y2 - y1)) {
    /* parcours par l'axe vertical */
    if (y1 > y2) {
      echangerEntiers(&x1, &x2);
      echangerEntiers(&y1, &y2);
    }
    xincr = x2 > x1 ? 1 : -1;
    dy = y2 - y1;
    dx = abs(x2 - x1);
    d = 2 * dx - dy;
    aincr = 2 * (dx - dy);
    bincr = 2 * dx;
    x = x1;
    y = y1;
    setPixelVerif(x, y, coul);
    for (y = y1+1; y <= y2; ++y) {
      if (d >= 0) {
        x += xincr;
        d += aincr;
      }else d += bincr;
      setPixelVerif(x, y, coul);
    }
  } else {
    /* parcours par l'axe horizontal */
    if (x1 > x2) {
      echangerEntiers(&x1, &x2);
      echangerEntiers(&y1, &y2);
    }
    yincr = y2 > y1 ? 1 : -1;
    dx = x2 - x1;
    dy = abs(y2 - y1);
    d = 2 * dy - dx;
    aincr = 2 * (dy - dx);
    bincr = 2 * dy;
    x = x1;
    y = y1;
    setPixelVerif(x, y, coul);
    for (x = x1+1; x <= x2; ++x) {
      if (d >= 0) {
        y += yincr;
      	d += aincr;
      } else d += bincr;
      setPixelVerif(x, y, coul);
    }
  }
}
/*
void patienter(int sec){
	time_t temps0, temps;
	temps0=time(0);
	do
	{
		temps=time(0);
	} while (temps<temps0+sec);
}
*/
void ligne(int * a, int * b, int coul){
  drawline(a[0],a[1],b[0],b[1],coul);
}

void construire_mur(int x, int y, int xx, int yy, int coul){
  murs[mur_en_construction][0][0]=x;
  murs[mur_en_construction][0][1]=y;
  murs[mur_en_construction][1][0]=xx;
  murs[mur_en_construction][1][1]=yy;
  ligne(murs[mur_en_construction][0],murs[mur_en_construction][1],coul);
  mur_en_construction++;
}

void plateau(void){
  construire_mur(50,50,750,50,ROUGE);
  construire_mur(50,50,50,550,VERT);
  construire_mur(50,550,750,550,JAUNE);
  construire_mur(750,50,750,550,BLEU);
  dessinerimage(288,10,0,0,"Pacman.bmp");
  ecrire("F2 - Nouvelle partie",350,553,255,255,255);
  ecrire("1 et 2 - changer la musique",350,570,255,255,255);
  ecrire("ESPACE - pause/relance la musique",510,553,255,255,255);
  ecrire("ECHAP - Quitter                P - Pause",510,570,255,255,255);
}

void ligneHorizontale(int x, int y, int w, Uint32 coul){
  SDL_Rect r={x,y,w,1};
  SDL_FillRect(affichage, &r, coul);
}

void disque(int cx, int cy, int rayon, int coul){
  int d, y, x;
  d = 3 - (2 * rayon);
  x = 0;
  y = rayon;
  while (y >= x) {
    ligneHorizontale(cx - x, cy - y, 2 * x + 1, coul);
    ligneHorizontale(cx - x, cy + y, 2 * x + 1, coul);
    ligneHorizontale(cx - y, cy - x, 2 * y + 1, coul);
    ligneHorizontale(cx - y, cy + x, 2 * y + 1, coul);
    if (d < 0)
      d = d + (4 * x) + 6;
    else {
      d = d + 4 * (x - y) + 10;
      y--;
    }
    x++;
  }
}

void dessinerpacman(int cx, int cy, int coul){
  disque(cx,cy,taillepm,coul);
  if(direction==2)disque(cx+taillepm/2,cy,taillepm/6,NOIR);
  if(direction==4)disque(cx,cy-taillepm/2,taillepm/6,NOIR);
  if(direction==6)disque(cx,cy-taillepm/2,taillepm/6,NOIR);
  if(direction==8)disque(cx-taillepm/2,cy,taillepm/6,NOIR);
  int a=cx,b=cy,c=cx,d=cy;
  if(taillelumieresevolution==1&&directionaux!=5){
    for(int i=0;i<=taillepm;i++){
      drawline(a,b,c,d,NOIR);
      if(direction==2){b++;if(i%2==0)a++;d++;if(i%2==0)c--;}
      if(direction==4){a--;if(i%2==0)b--;c--;if(i%2==0)d++;}
      if(direction==6){a++;if(i%2==0)b--;c++;if(i%2==0)d++;}
      if(direction==8){b--;if(i%2==0)a--;d--;if(i%2==0)c++;}
    }
  }
  else{
    if(direction==2)drawline(cx,cy,cx,cy+taillepm+1,NOIR);
    if(direction==4)drawline(cx,cy,cx-taillepm-1,cy,NOIR);
    if(direction==6)drawline(cx,cy,cx+taillepm+1,cy,NOIR);
    if(direction==8)drawline(cx,cy,cx,cy-taillepm-1,NOIR);
  }
}

//2bas,4gauche,6droite,8haut
void bouger(int dir){
    direction=dir;
    dessinerpacman(pmx,pmy,NOIR);
    int pmxx=pmx;
    int pmyy=pmy;
    int dirx=1,diry=1,dirx2=1,diry2=1,dirx3=1,diry3=1,dirx4=1,diry4=1,dx=0,dy=0;
    if(dir==2) {pmy+=vitesse;dirx2=-1;dirx3=-1;diry3=-1;diry4=-1;dy=1;}
    if(dir==4) {pmx-=vitesse;dirx=-1;dirx2=-1;diry2=-1;diry3=-1;dx=-1;}
    if(dir==6) {pmx+=vitesse;diry2=-1;dirx3=-1;diry3=-1;dirx4=-1;dx=1;}
    if(dir==8) {pmy-=vitesse;diry=-1;dirx2=-1;diry2=-1;dirx3=-1;dy=-1;}

    if(     mur(pmx+(taillepm+1)*dirx,pmy+(taillepm+1)*diry,pmx+(taillepm+1)*dirx2,pmy+(taillepm+1)*diry2)||
            mur(pmx,pmy,pmx+(2+taillepm)*dx,pmy+(2+taillepm)*dy)||
            mur(pmx+(taillepm+1)*dirx2,pmy+(taillepm+1)*diry2,pmx+(taillepm+1)*dirx3,pmy+(taillepm+1)*diry3)||
            mur(pmx+(taillepm+1)*dirx,pmy+(taillepm+1)*diry,pmx+(taillepm+1)*dirx4,pmy+(taillepm+1)*diry4)||
            mur(pmx+(taillepm+1)*dirx3,pmy+(taillepm+1)*diry3,pmx+(taillepm+1)*dirx4,pmy+(taillepm+1)*diry4)){
      dessinerpacman(pmxx,pmyy,couleurpacman);
      pmx=pmxx;
      pmy=pmyy;
      directionaux=5;
    }
    else {directionaux=dir;dessinerpacman(pmx,pmy,couleurpacman);}
    actualiser();
    system("sleep 0.03");//sleep(30);
}

void bouger_fantomes(void){
  int taille=taillefantome;
  for(int i=0;i<fantome_en_construction;i++){
    int x=fantomes[i][0];
    int y=fantomes[i][1];
    int couleur=fantomes[i][2];
    int dir=fantomes[i][4];
    dessiner_fantome(x,y,NOIR);
    int xx=x;
    int yy=y;
    int dirx=1,diry=1,dirx2=1,diry2=1,dirx3=1,diry3=1,dirx4=1,diry4=1,dx=0,dy=0;
    if(dir==2) {y+=vitessefantomes;dirx2=-1;dirx3=-1;diry3=-1;diry4=-1;dy=1;}
    if(dir==4) {x-=vitessefantomes;dirx=-1;dirx2=-1;diry2=-1;diry3=-1;dx=-1;}
    if(dir==6) {x+=vitessefantomes;diry2=-1;dirx3=-1;diry3=-1;dirx4=-1;dx=1;}
    if(dir==8) {y-=vitessefantomes;diry=-1;dirx2=-1;diry2=-1;dirx3=-1;dy=-1;}
    
    if(mur(x+(taille+1)*dirx,y+(taille+1)*diry,x+(taille+1)*dirx2,y+(taille+1)*diry2)||
            mur(x,y,x+(2+taille)*dx,y+(2+taille)*dy)||
            mur(x+(taille+1)*dirx2,y+(taille+1)*diry2,x+(taille+1)*dirx3,y+(taille+1)*diry3)||
            mur(x+(taille+1)*dirx,y+(taille+1)*diry,x+(taille+1)*dirx4,y+(taille+1)*diry4)||
            mur(x,y,xx,yy)){
      if(fantomes[i][3]==1){
        if(couleur!=FLEURROSE&&couleur!=FLEURCACTUS)
          dessiner_fantome(xx,yy,BLEU);
        else dessiner_fantome(xx,yy,FLEURROSE);
      }
      else
        dessiner_fantome(xx,yy,couleur);
      int direction_au_hazard=((rand() % (4))+1)*2;  
      fantomes[i][4]=direction_au_hazard;
    }
    else {
      if(couleur!=FLEURROSE&&couleur!=FLEURCACTUS){
        fantomes[i][0]=x;
        fantomes[i][1]=y;
      }
      if(fantomes[i][3]==1){
        if(couleur!=FLEURROSE&&couleur!=FLEURCACTUS)
          dessiner_fantome(x,y,BLEU);
        else dessiner_fantome(x,y,FLEURROSE);
      }
      else{
        if(couleur==FLEURROSE||couleur==FLEURCACTUS){
          dessiner_fantome(xx,yy,couleur);
        }
        else dessiner_fantome(x,y,couleur);
      }
    }
  }
}

bool mur(int x, int y, int xx, int yy){
  for(int i=0;i<mur_en_construction;i++){
    if(intersection(x,y,xx,yy,murs[i][0][0],murs[i][0][1],murs[i][1][0],murs[i][1][1])==1)return 1;
  }
  return 0;
}

int cote(int ax, int ay, int bx, int by, int cx, int cy){
	int det = (ax-bx)*(cy-by)-(ay-by)*(cx-bx);
	if(det<0)return -1;
	if(det>0)return 1;
	if(det==0){
		if(bx<=cx){
			if(by<=cy){
				if(bx<=ax && ax<=cx && by<=ay && ay<=cy) return 2;
			}
			else{
				if(bx<=ax && ax<=cx && by>=ay && ay>=cy) return 2;
			}
		}
		else{
			if(by<=cy){
				if(bx>=ax && ax>=cx && by<=ay && ay<=cy) return 2;
			}
			else{
				if(bx>=ax && ax>=cx && by>=ay && ay>=cy) return 2;
			}
		}
	}
	return 0;
}

int intersection(int ax, int ay, int bx, int by, int cx, int cy, int dx, int dy){
	int a = cote(ax,ay,cx,cy,dx,dy);
	int b = cote(bx,by,cx,cy,dx,dy);
	int c = cote(cx,cy,ax,ay,bx,by);
	int d = cote(dx,dy,ax,ay,bx,by);
	
	if(a==2 || b==2 || c==2 || d==2)return 1;
	if(a==0){
		if(b!=2) return 0;
	}
	if(b==0){
		if(a!=2) return 0;
	}
	if(c==0){
		if(d!=2) return 0;
	}
	if(d==0){
		if(c!=2) return 0;
	}
	if(a*b>0 || c*d>0) return 0;
 	return 1;
}

bool interieur(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4, int x, int y){
  if(cote(x,y,x1,y1,x2,y2)!=cote(x,y,x4,y4,x3,y3)&&cote(x,y,x1,y1,x4,y4)!=cote(x,y,x2,y2,x3,y3))return 1;
  else return 0;
}

void ecrire(char*texte,int x,int y,int r,int v,int b){
  SDL_Color color = {r,v,b};
  SDL_Rect rectangle = {x,y};
  SDL_Surface* text_surface;
  text_surface = TTF_RenderText_Blended(font,texte,color);
  SDL_BlitSurface(text_surface,NULL,affichage,&rectangle);
  SDL_FreeSurface(text_surface);
}

bool lumiere(){
  int res=0;
  for(int i=0;i<lumiere_en_construction;i++){
    if(lumieres[i][2]!=JAUNE)
      disque(lumieres[i][0],lumieres[i][1],taillelumieres+1,NOIR);
    else disque(lumieres[i][0],lumieres[i][1],2,NOIR);
    if(lumieres[i][0]!=0 || lumieres[i][1]!=0){
      if(interieur(pmx+taillepm,pmy+taillepm,pmx-taillepm,pmy+taillepm,pmx-taillepm,pmy-taillepm,pmx+taillepm,pmy-taillepm,
          lumieres[i][0],lumieres[i][1])){
        if(lumieres[i][2]==JAUNE)addscore(10);
        if(lumieres[i][2]==ROUGE)addscore(20);
        if(lumieres[i][2]==GRIS){addscore(20);vitesse*=-1;}
        if(lumieres[i][2]==BLEU){addscore(30);fantomes_mangeables(1);}
        if(lumieres[i][2]==ORANGE){addscore(40);
          while(taillepm>2)changer_taille(taillepm-1);}
        if(lumieres[i][2]==VERT){addscore(50);
          if(taillepm>8)
            while(taillepm!=8)changer_taille(taillepm-1);
          else
            while(taillepm!=8)changer_taille(taillepm+1);}
        lumieres[i][0]=0;
        lumieres[i][1]=0;
        res=1;
      }
      else{
        if(lumieres[i][2]!=JAUNE)
          disque(lumieres[i][0],lumieres[i][1],taillelumieres,lumieres[i][2]);
        else disque(lumieres[i][0],lumieres[i][1],2,lumieres[i][2]);
      }
    }
  }
  if(taillelumieresevolution==1)
    taillelumieres++;
  else
    taillelumieres--;
  if(taillelumieres==5)taillelumieresevolution=0;
  if(taillelumieres==1)taillelumieresevolution=1;
  return res;
}

void construire_lumiere(int x, int y, int coul){
  lumieres[lumiere_en_construction][0]=x;
  lumieres[lumiere_en_construction][1]=y;
  lumieres[lumiere_en_construction][2]=coul;
  disque(x,y,2,coul);
  lumiere_en_construction++;
}

void fantomes_mangeables(int a){
  mangeables=a;
  for(int i=0;i<fantome_en_construction;i++){
    fantomes[i][3]=a;
  }
}

void dessinerimage(int x, int y, int w, int h, char * nom){
  SDL_Rect rect={x,y,w,h};
  SDL_Surface *image = SDL_LoadBMP(nom);
  SDL_BlitSurface(image,NULL,affichage,&rect);
  actualiser();
}
  

bool fantome(void){
  int res=0;
  int a=pmx+taillepm,b=pmx-taillepm,c=pmy+taillepm,d=pmy-taillepm;
  for(int i=0;i<fantome_en_construction;i++){
    int x=fantomes[i][0],y=fantomes[i][1],coul=fantomes[i][2];
    if(coul!=FLEURCACTUS&&coul!=FLEURROSE){
      dessiner_fantome(x,y,NOIR);
      if(interieur(a,c,b,c,b,d,a,d,x+taillefantome,y+taillefantome)||
        interieur(a,c,b,c,b,d,a,d,x-taillefantome,y+taillefantome)||
        interieur(a,c,b,c,b,d,a,d,x+taillefantome,y-taillefantome)||
        interieur(a,c,b,c,b,d,a,d,x-taillefantome,y-taillefantome)){
        if(fantomes[i][3]==1)addscore(200);
        else {
          perdre();
          return 1;
        }
        fantomes[i][0]=375;
        fantomes[i][1]=300;
        fantomes[i][3]=0;
        res=1;
      }
      else{
        if(fantomes[i][3]==1)
          dessiner_fantome(x,y,BLEU);
        else
          dessiner_fantome(x,y,coul);
      }
    }
    else{
      a=fantomes[i][0]+taillefantome;
      b=fantomes[i][0]-taillefantome;
      c=fantomes[i][1]+taillefantome;
      d=fantomes[i][1]-taillefantome;
      if(interieur(a,c,b,c,b,d,a,d,pmx,pmy)){
        if(fantomes[i][3]==1){
          ecrire("Je vais pouvoir conqu�ir le coeur ",50,553,255,255,255);
          ecrire("de ma belle avec ce joli bouquet !",50,570,255,255,255);
          addscore(500);
          getfleur=2;
        }
        else {
          ecrire("Un bouquet de cactus !",50,553,255,255,255);
          ecrire("Je craind sa r�ction...",50,570,255,255,255);
          addscore(100);
          getfleur=1;
        }
        SDL_Rect rect={652,102,48,48};
        SDL_FillRect(affichage,&rect, NOIR);
        fantome_en_construction--;
        res=1;
      }
      else{
        if(fantomes[i][3]==1){
          SDL_Rect rect={652,102,48,48};
          SDL_FillRect(affichage,&rect, NOIR);
          dessiner_fantome(x,y,FLEURROSE);
        }
        else{
          SDL_Rect rect={652,102,48,48};
          SDL_FillRect(affichage,&rect, NOIR);
          dessiner_fantome(x,y,FLEURCACTUS);
        }
      }
    a=pmx+taillepm,b=pmx-taillepm,c=pmy+taillepm,d=pmy-taillepm;
    }
  }
  return res;
}

void construire_fantome(int x, int y, int coul){
  fantomes[fantome_en_construction][0]=x;
  fantomes[fantome_en_construction][1]=y;
  fantomes[fantome_en_construction][2]=coul;
  fantomes[fantome_en_construction][3]=0;
  int direction_au_hazard=((rand() % (4))+1)*2;  
  fantomes[fantome_en_construction][4]=direction_au_hazard;
  dessiner_fantome(x,y,coul);
  fantome_en_construction++;
}

void dessiner_fantome(int x, int y, int coul){
  SDL_Rect rect={x-taillefantome,y-taillefantome,0,0};
  if(coul==BLANC)SDL_BlitSurface(fantomeblanc,NULL,affichage,&rect);
  if(coul==BLEU)SDL_BlitSurface(fantomebleu,NULL,affichage,&rect);
  if(coul==JAUNE)SDL_BlitSurface(fantomejaune,NULL,affichage,&rect);
  if(coul==ORANGE)SDL_BlitSurface(fantomeorange,NULL,affichage,&rect);
  if(coul==ROUGE)SDL_BlitSurface(fantomerouge,NULL,affichage,&rect);
  if(coul==VERT)SDL_BlitSurface(fantomevert,NULL,affichage,&rect);
  if(coul==NOIR)SDL_BlitSurface(fantomenoir,NULL,affichage,&rect);
  if(coul==GRIS)SDL_BlitSurface(fantomegris,NULL,affichage,&rect);
  if(coul==FLEURCACTUS)SDL_BlitSurface(fleurcactus,NULL,affichage,&rect);
  if(coul==FLEURROSE)SDL_BlitSurface(fleurrose,NULL,affichage,&rect);
}

void dessiner_stage(int stage){
  SDL_Rect pwm={102,102,0,0};
  SDL_BlitSurface(pacwoman,NULL,affichage,&pwm);

  FILE * fichier;
  if(stage!=5){
    fichier = fopen ("stage1.purk","r");
  }
  else{
    fichier = fopen ("stage5.purk","r");
  }
  char c = fgetc(fichier);
  char data[3];
  int mur[5];
  int cpt=0,i=0;
  while(c != EOF){
    if(c!='\n'){
      if(c != ','){
        data[i++]=c;
        if(i==3 && cpt != 4)mur[cpt]=atoi(data);
        else if(cpt==4)mur[cpt]=c;
      }
      else{
        cpt++;
        i=0;
        //fprintf(stderr,"\n");
        //free(data);
      }
    }
    else {
      cpt=0;
      int coul=0;
      if(mur[4]=='R')coul=ROUGE;
      if(mur[4]=='V')coul=VERT;
      if(mur[4]=='B')coul=BLEU;
      if(mur[4]=='Y')coul=JAUNE;
      if(mur[4]=='W')coul=BLANC;
      if(mur[4]=='G')coul=GRIS;
      if(mur[4]=='O')coul=ORANGE;
      construire_mur(mur[0],mur[1],mur[2],mur[3],coul);
    }
    c=fgetc(fichier);
  }
  fclose(fichier);

  if(stage!=5){
    for(int i=62;i<739;i+=25)
      for(int j=62;j<539;j+=25)
        if(!(i>325&&i<475&&j>475)&&!(i>650&&i<750&&j>100&&j<150)
        &&!(i>50&&i<150&&j>100&&j<150))
          construire_lumiere(i,j,JAUNE);
    construire_lumiere(250,262,ROUGE);
    construire_lumiere(725,250,ROUGE);
    construire_lumiere(400,400,BLEU);
    construire_lumiere(710,450,BLEU);
    construire_lumiere(700,162,ORANGE);
    construire_lumiere(100,87,ORANGE);
    construire_lumiere(740,450,VERT);
    construire_lumiere(700,85,VERT);
    construire_lumiere(712,200,GRIS);
    construire_lumiere(88,200,GRIS);
    if(stage>=1){
      construire_fantome(62,62,ROUGE);
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
    }
    if(stage>=2){
      construire_fantome(62,62,ROUGE);
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
      construire_fantome(62,62,ROUGE);
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
      construire_fantome(62,62,ROUGE);
    }
    if(stage>=3){
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
      construire_fantome(62,62,ROUGE);
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
      construire_fantome(62,62,ROUGE);
    }
    if(stage>=4){
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
      construire_fantome(62,62,ROUGE);
      construire_fantome(738,62,BLANC);
      construire_fantome(425,300,VERT);
      construire_fantome(425,300,JAUNE);
      construire_fantome(425,300,ORANGE);
  
      construire_fantome(150,475,ROUGE);
      construire_fantome(300,450,GRIS);
      construire_fantome(500,450,BLANC);
      construire_fantome(650,475,VERT);
      construire_fantome(275,175,ORANGE);
      construire_fantome(525,175,JAUNE);
    }
  }
  else{
      vitessefantomes=8;
      vitesse=8;
      taillepm=8;
      pmy=537;
      pmx=725;
      construire_lumiere(700,162,ORANGE);
      construire_lumiere(700,85,VERT);
      construire_lumiere(700,86,VERT);
      construire_lumiere(700,87,VERT);
      construire_lumiere(100,87,ORANGE);
      
      for(int m=200;m<550;m+=25){
        construire_mur(50,m,75,m,JAUNE);
        construire_fantome(65,m-12,ROUGE);
        construire_mur(725,m,750,m,JAUNE);
        construire_fantome(735,m-12,ROUGE);
      }
      for(int m=150;m<675;m+=25){
        construire_mur(m,50,m,75,JAUNE);
        if(m!=650)construire_fantome(m+12,70,ROUGE);
        construire_mur(m,525,m,550,JAUNE);
        if(!(m>=325&&m<=475)){
          construire_fantome(m+12,530,ROUGE);
        }
      }
  }
  construire_fantome(675,125,FLEURCACTUS);
  construire_mur(650,76,650,99,FLEURCACTUS);
}

