// ajouter le son ?
boolean son = true;
boolean boss_start = false;


     // ----------------------- \\


// Importation librairies pour la gestion du sons
import processing.sound.*;
SoundFile sonLancemissile;
SoundFile sonExposion;
SoundFile sonCollision;
SoundFile sonLaser_boss;

int largeur = 1600;
int hauteur = 900;
PImage space, img_ship, misile, mechant, imgGameover, imgWin, imgboss1, laserboss1;
String misileMechant1 = "data/images/misile - mechant.png";
int x = largeur/2; 
int y = hauteur-100;
int xm = x;
int ym = y;
int timerGameOver = 1500; // milliseconds d'attente avant affichage "Gameover"
int timer = 0;
int win; 
float time;
boolean lancermisile = false;
String touchePresse = null;

Ship ship;

boolean[] level = new boolean[3]; 

int nombreEnemi = 20;
int nombreEnemiReste = nombreEnemi;
Alien [] a = new Alien[nombreEnemi];
Misile [] b = new Misile[nombreEnemi];

//Etat de deplacement: 0 = aucun deplacement en cours
int moveXp = 0; // 1 si deplacement vers le bas
int moveXn = 0; // 1 si deplacement vers le haut
int moveYp = 0; // 1 si deplacement vers la droite
int moveYn = 0; // 1 si deplacement vers la gauche
int moveBoost = 1;

boolean pause = false;



void setup() {

  stroke(#000000);
  strokeWeight(1);
  textAlign(LEFT, TOP);
  textSize(12);
  size(1600, 900);
  imageMode(CENTER);


  //là, ça charge les image dans leur varible
  space = loadImage("data/images/space.jpg");
  img_ship  = loadImage("data/images/redfighter_200x200.png");
  misile = loadImage("data/images/misile.png");
                               //2 pour le skin 2
  mechant = loadImage("data/images/mechant_rouge_150x150.png");
  imgGameover = loadImage("data/images/gameover.png");
  imgWin = loadImage("data/images/Win_game.png");
  imgboss1 = loadImage("data/images/vaiseau_enemi.png");
  laserboss1 = loadImage("data/images/laser_boss1.png");
  //on crée le ship
  ship = new Ship(x, y, 3, img_ship);

    //on crée des ennemis
    for (int i = 0; i<nombreEnemi; i++) {
      int j;
      int k;
      if (i > 9) {
        j = i-10;
        k =2;
      } else {
        j = i;
        k =1;
      }
      a[i] = new Alien (100+(j*150), k*100, 3, mechant);
    }

    //on crée des misiles
    for (int i = 0; i<nombreEnemi; i++) {
      int j;
      int k;
      if (i > 9) {
        j = i-10;
        k =2;
      } else {
        j = i;
        k =1;
      }
      b[i] = new Misile (100+(j*150), k*100, misileMechant1, time);
    }

    // Sons
    if (son) {
      sonLancemissile = new SoundFile(this, "data/sons/lancemissile.mp3");
      sonExposion = new SoundFile(this, "data/sons/SFB-explosion2.mp3");
      sonCollision = new SoundFile(this, "data/sons/collision avec le vaisseau.mp3");
      sonLaser_boss = new SoundFile(this, "data/sons/Laser_boss.mp3");
    }

    //Vitesse : frame par seconde
    frameRate(60);
  }

  void draw() {
    
  //  if ( nombreEnemiReste == 0 && ship.pv > 0)  {
  //    
  //   
  //  }
  //debug:
  //println(nombreEnemiReste);
       

    miseAJourDuDeplacement();
    
     float d = random (1, 100);

    //Affiche l'image de fond (l'espace)
    background(space);

    // Si un missile du ship est en cours (actif)
    if (lancermisile) {
      //on le fait avencer
      ym = ym - 20;
      // Si le missile sort en haut de l'écran
      if (ym < 0) {
        ym = y;
        xm = x;
        lancermisile = false;
      } 
      // Affiche l'image du missile
      image(misile, xm, ym);
    } else {
      //Sinon (missile non actif)
      //on le affiche en dessous du vaiseau si encore vivant
      if (ship.show) { 
        ym = y; 
        xm = x;
      }
    }

    // Fait une boucle sur tout le tableau d'ennemies
    for ( int i = 0; i<nombreEnemi; i++) {
      //fait la mise a jour du missile que si l'ennemi est encore vivant ou missile en cours
      if (a[i].show || b[i].show) {
        b[i].affiche_et_mets_a_jour_le_missile();
      }
      //fait la mise a jour du mechant que si il est encore vivant
      if (a[i].NUMEROXEPLO < 50) {
        a[i].affiche_et_mets_a_jour_les_mechants();
      }
    }

    // Affiche l'image du vaiseau
    ship.affiche_et_mets_a_jour_le_ship(x, y);    
    
    
    //Affiche le boss Du niveau 1
    if ( nombreEnemiReste == 0 && boss_pv > 0)  {
       // image(imgWin, largeur/2, hauteur/2);
       if (boss_start == false) {
         boss_start = true;
         boss_time = millis()/1000;
       }
       boss();     
    }
    
    // Mise à jour du texte de l'écran :
    text("frame: " + frameCount, 10, 20);
    text("Time: " + millis() / 1000, 10, 35);
    text("PV: " + ship.pv, width - 60, 20);

    if (ship.pv == - 0) {
      // Installation du timer
      if (timer == 0) timer = millis() + timerGameOver;

      // Vérification du temps par rapport au timer
      //println(millis() + " /  timer : " + timer);
      if ( millis() > timer ) {
        image(imgGameover, largeur/2, hauteur/2);
        println("GAME OVER");
        noLoop();           
        
      }
    }
    
    //Affiche le "WIN" Du niveau 1
    if ( nombreEnemiReste == 0 && boss_pv == 0)  {
      //image(imgWin, largeur/2, hauteur/2); 
    }
    
    
  

    if ( nombreEnemiReste == 0 && boss_pv == 0)  {
       //on load la deuxièmme vague de vaisseau 
        //on crée des ennemis
        // Fait une boucle sur tout le tableau d'ennemies
      //for ( int i = 0; i<nombreEnemi; i++) {
      //  //on ressucite les ennemis avec 4 pv
      //  a[i].enemypv = 4;
      //  nombreEnemiReste = nombreEnemi;
      //}
      //on crée des ennemis
      
       // Fait une boucle sur tout le tableau d'ennemies
    for ( int i = 0; i<nombreEnemi; i++) {
      //fait la mise a jour du missile que si l'ennemi est encore vivant ou missile en cours
      if (a[i].show || b[i].show) {
        b[i].affiche_et_mets_a_jour_le_missile();
      }
      //fait la mise a jour du mechant que si il est encore vivant
      if (a[i].NUMEROXEPLO < 50) {
        a[i].affiche_et_mets_a_jour_les_mechants();
      }
    }
    
    for (int i = 0; i<nombreEnemi; i++) {
      int j;
      int k;
      if (i > 9) {
        j = i-10;
        k =2;
      } else {
        j = i;
        k =1;
      }
      a[i] = new Alien (100+(j*150), k*100, 3, mechant);
    }

    //on crée des misiles
    for (int i = 0; i<nombreEnemi; i++) {
      int j;
      int k;
      if (i > 9) {
        j = i-10;
        k =2;
      } else {
        j = i;
        k =1;
      }
      b[i] = new Misile (100+(j*150), k*100, misileMechant1, time);
    }
    }
        
      // Fait une boucle sur tout le tableau d'ennemies
    for ( int i = 0; i<nombreEnemi; i++) {
      //fait la mise a jour du missile que si l'ennemi est encore vivant ou missile en cours
      if (a[i].show || b[i].show) {
        b[i].affiche_et_mets_a_jour_le_missile();
      }
      //fait la mise a jour du mechant que si il est encore vivant
      if (a[i].NUMEROXEPLO < 50) {
        a[i].affiche_et_mets_a_jour_les_mechants();
      }
    }
    
  }
     
  //ça verifie tout le tenps si une touche utilise est preser
  void keyPressed() {
    
    //
    if (key == 'f' ) { touchePresse = "f"; }
    if (key == 'z' && touchePresse == "f") {
      //on tue tous les ennemis
      for (int i = 0; i<nombreEnemi; i++) {
        a[i].enemypv = 0;
        boss_pv = 0;
      }

      touchePresse = null;
    }
    
    if (key == ' ' && ship.show) {
      lancermisile = true;
      //Joue le son...
      if (son && ym == y) sonLancemissile.play();
    }

    //pour mettre en pause/continuer
    if (key == 'p') {
      pause = !pause;

      
      //Met en pause ou countinue
      if (pause) noLoop();
      else loop();
    }

    if (key == CODED) {
      if (keyCode == UP) { 
        moveYn = 1;
      }
      if (keyCode == DOWN) { 
        moveYp = 1;
      }
      if (keyCode == LEFT) { 
        moveXn = 1;
      } 
      if (keyCode == RIGHT) { 
        moveXp = 1;
      }
      if (keyCode == SHIFT) { 
        moveBoost = 2;
      }
    }
  }

  //ça verifie tout le tenps si une touche utilise est relacher
  void keyReleased() {

    if (key == CODED) {
      if (keyCode == UP) { 
        moveYn = 0;
      }
      if (keyCode == DOWN) { 
        moveYp = 0;
      }
      if (keyCode == LEFT) { 
        moveXn = 0;
      } 
      if (keyCode == RIGHT) { 
        moveXp = 0;
      }
      if (keyCode == SHIFT) { 
        moveBoost = 1;
      }
    }
  }

  //on calcule et on met a jour les coordonnées du vaisau 
  void miseAJourDuDeplacement() {

    int deplacement = 10*moveBoost;

    if (moveYp - moveYn == -1) {
      y = y - deplacement;
      if (y < 100) y = 100;
    }

    if (moveYp - moveYn == 1) {
      y = y + deplacement;
      if (y > height - 100 ) y = height - 100;
    }

    if (moveXp - moveXn == -1) {
      x = x- deplacement;
      if (x < 100) x = 100;
    }

    if (moveXp - moveXn == 1) {
      x = x+ deplacement;
      if (x  > width - 100 ) x = width - 100;
    }
  }

  //Truc a faire à la fin...
  void stop() {
  }
