import processing.core.*; 
import processing.data.*; 
import processing.event.*; 
import processing.opengl.*; 

import processing.sound.*; 

import java.util.HashMap; 
import java.util.ArrayList; 
import java.io.File; 
import java.io.BufferedReader; 
import java.io.PrintWriter; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.IOException; 

public class sketch_211117a extends PApplet {

/** image du jeu **/
PImage over;
PImage rip;
PImage back;
PImage bouttonMenu;
PImage fond;
PImage exit;
PImage stats;
PImage gemme;
PImage shop;
PImage tireLaser;
PImage piece;
PImage imgCommencer;
PImage soucoupe;
PImage playAgain;
PImage meteorited1;
PImage meteorited2;
PImage meteorite1;
PImage imgGemme;
PImage hero;
PImage boutonJouer;
PImage menu;
PImage jeu;

// boutique / shop
PImage choisirImgDestructeur;
PImage choisirImgDeadShoot;
PImage choisirImgBadCops;
PImage repliqueDestructeur;
PImage repliqueDeadShoot;
PImage repliqueBadCops;
PImage shopLogo;
PImage badcops;
PImage deadshoot;
PImage destructeur;
PImage cristaux;
PImage skin1;
PImage skin2;
PImage skin3;
PImage flecheD;
PImage flecheG;
PImage buy;
int skin = 2;
int achatBadCops = 0;
int achatDeadShoot = 0;
int achatDestructeur = 0;
boolean buyDestructeur = false;
boolean buyDeadShoot = false;
boolean buyBadCops = false;
boolean choisirDestructeur = false;
boolean choisirBadCops = false;
boolean choisirDeadShoot = false;
int accepteDestruct = 2;
int accepteBad = 2;
int accepteDead = 2;
int autoriseDest = 0;
int autoriseDead = 0;
int autoriseBad = 0;
float manqueGemme;
boolean retirerMessageB = false;
boolean retirerMessageDead = false;
boolean retirerMessageDest = false;

// Shop Gemmes
PImage tabletteMenu;
PImage tabletteLoading;
PImage tabletteShopGemme;
boolean tabletteMenuAfficher = false;
boolean tabletteLoadingAfficher = false;
boolean tabletteGemmeAfficher = false;

//stats
PImage fondStats;
float statsPieces = 0;
float statsGemme = 0;
float bestScore = 0;
float bestScoreJeu = 0;
int statsPartie = 0;
int xHeroStats = width+600;

/** Player coordonnées et taille variables **/
int playerXCor = 875;
int playerYCor = 675;
int playerWidth = 180;
int playerHeight = 180;

/** variable pour la soucoupe **/
int x = 0;
int y = 0;
int a = 0;
int vitesseV = 2;
int vitesseT = 4;
int xLaser = 0;
int loLaser = 100;
int laLaser = 70;
boolean laserEnCour = false;

/** difficulter et limite de météorite **/
int difficulty = 1;
int limit = 24;

/** score/bestscore et total de pieces **/
float score = 0;
float totalPieces = 0;
float conteurPieces;
float finJeuPieces = 0;
float piecesPartie = 0;
float totalGemme = 0;

// condition pour que le hero ne bouge pas tant que la partie n'est pas lancé.
boolean salon = true;

/** variable météorite et pièces**/
Baddie[] baddies;
boolean isCollided = false;
int ecran = 0;
Piece[] pieces;

// chargement de toute les images et initialisation des météorite et pièces.
public void setup() {
  //
  fullScreen();
  //FPS(60);
  jeu = loadImage("bg1.png");
  menu = loadImage("menu.png");
  boutonJouer = loadImage("boutonP.png");
  hero = loadImage("hero.png");
  imgGemme = loadImage("Score.png");
  meteorite1 = loadImage("meteorite1.png");
  meteorited1 = loadImage("meteorited1.png");
  meteorited2 = loadImage("meteorited2.png");
  playAgain = loadImage("again.png");
  soucoupe = loadImage("soucoupe.png");
  imgCommencer = loadImage("commencer.png");
  piece = loadImage("pieces2.png");
  tireLaser = loadImage("laser.png");
  shop = loadImage("shop.png");
  gemme = loadImage("gemme.png");
  stats = loadImage("stats.png");
  exit = loadImage("exit.png");
  fond = loadImage("fond.jpg");
  bouttonMenu = loadImage("bouttonmenu.png");
  back = loadImage("back.png");
  rip = loadImage("rip.png");
  over = loadImage("gameover.png");
  flecheG = loadImage("flecheg.png");
  flecheD = loadImage("fleched.png");
  buy = loadImage("buy.png");
  skin1 = loadImage("skin1.png");
  skin2 = loadImage("skin2.png");
  skin3 = loadImage("skin3.png");
  cristaux = loadImage("cristaux.png");
  destructeur = loadImage("destructeur.png");
  deadshoot = loadImage("deadshoot.png");
  badcops = loadImage("badcops.png");
  shopLogo = loadImage("shoplogo.png");
  repliqueBadCops = loadImage("repliquebadcops.png");
  repliqueDeadShoot = loadImage("achatrepliquedeadshoot.png");
  repliqueDestructeur  = loadImage("repliquedestructeur.png");
  choisirImgDestructeur = loadImage("choisirdestructeur.png");
  choisirImgBadCops = loadImage("choisirdestructeur.png");
  choisirImgDeadShoot = loadImage("choisirdestructeur.png");
  doigt = loadImage("doigt.png");
  tabletteMenu = loadImage("tablette.png");
  tabletteLoading = loadImage("loadingtablette.png");
  tabletteShopGemme = loadImage("shopgemmetablette.png");
  imgBonus = loadImage("bonus.png");
  coffreOuvert = loadImage("coffreouvert.png");
  coffreFermer = loadImage("coffrefermer.png");
  lapin = loadImage("lapin.png");
  fondAnime = loadImage("fondanime.png");
  dialogueTexte1 = loadImage("dialogue1.png");
  dialogueTexte2 = loadImage("dialogue2.png");
  positif = loadImage("positif.png");
  negatif = loadImage("negatif.png");
  partir = loadImage("partir.png");
  annonce = loadImage("annonce.png");
  annonceDoigt = loadImage("annoncedoigt.png");
  fondAnnonce = loadImage("fondannonce.png");
  annonce2 = loadImage("annonce2.png");
  fondStats = loadImage("statsfond.png");
  initBaddies(-100, width + 20, -250, -80, difficulty);
  initPieces(-100, width + 20, -250, -80, difficulty);
  file = new SoundFile(this, "mjeu.mp3");
  file.amp(0.1f);
  file.play();
  file.loop();
}
/** creation de l'initiation des météorite boucle pour faire apparaitre les météorite, et de nouvelle météorite dans une position aléatoire **/
public void initBaddies(int xMin, int xMax, int yMin, int yMax, int num) {
  baddies = new Baddie[num];

  for (int i = 0; i < baddies.length; i++) {
    int x = (int)random(xMin, xMax);
    int y = (int)random(yMin, yMax);
    baddies[i] = new Baddie(x, y, 30, 15, PApplet.parseInt(random(0, 100))% 3);
  }
}

/** creation de l'initiation des pieces avec une boucle pour faire apparaitre les pièces dans une position aléatoire **/
public void initPieces(int xMin, int xMax, int yMin, int yMax, int num) {
  pieces = new Piece[num];

  yMin = -30;
  yMax = -20;

  for (int i = 0; i < pieces.length; i++) {
    int x = (int)random(xMin, xMax);
    int y = (int)random(yMin, yMax);
    pieces[i] = new Piece(x, y, 30, 15);
  }
}

/** ecran des différents menus **/
public void draw() {
  if (ecran == 0) {
    afficherMenu();
  }
  if (ecran == 1) {
    commencer();
  }
  if (ecran == 2) {
    afficherJeu();
  }
  if (ecran == 3) {
    shop();
  }
  if (ecran == 4) {
    stats();
  }
  if (ecran == 5) {
    gemme();
  }
}

/** configuartion de la page menu **/
public void afficherMenu() {
  image(menu, 0, 0);
  textSize(100);
  fill(255);
  image(boutonJouer, width/2-70, height/2-100, 150, 150);
}

// Onglet d'achat de gemme
public void gemme() {
  image(fond, 0, 0);
  if (tabletteMenuAfficher == false) { // si la tabletteMenuAfficher est égale a false il affiche la tablette
    image(tabletteMenu, 0, 0);
    if (annonceActiver == false) {  // si annonceActiver est égale a true il charge la fonction doit et annonce et leurs images
      doigtTablette();
      annonce();
      image(annonceDoigt, 0, 0);
      image(fondAnnonce, 0, 0);
    }
    if (annonceActiver2 == true) {  // si annonceActiver2 est égale a true il charge les fonction doigtTablette2 et annonce2 et leurs images
      doigtTablette2();
      annonce2();
      image(annonceDoigt, 0, 0);
      image(fondAnnonce, 0, 0);
    }
  }
  if ( afficheJeuBonus == true) {  // si afficheJeuBonus est égale a true il affiche les images des compteur de pieces et de gemme et les image de l'animation du lapin et du background
    image(imgBonus, 0, 0); 
    image(imgGemme, 150, 90);
    image(piece, 165, 170);
    textSize(25);
    fill(255, 255, 255);
    text((int)totalGemme, 275, 132);
    text((int)totalPieces, 225, 200);
    image(coffreFermer, width/2-120, height/2+111);
    lapinAnime();
    image(fondAnime, 0, 0);
  }
  if (tabletteLoadingAfficher == true) {  // si tabletteLoadingAfficher est égale a true il charge son image.
    image(tabletteLoading, 0, 0);
  }
  if (tabletteGemmeAfficher == true) {  // si tabletteGemmeAfficher est égale a true il charge son image et les compteur de gemme et pieces.
    image(tabletteShopGemme, 0, 0);
    text((int)totalPieces, 240, 245);
    text((int)totalGemme, 288, 147);
    if (totalPieces <= 10) {  // si le jouer n'as pas assez de pieces pour l'echange il marque ce text.
      text("Tu n'as pas assez de pièces ! retourne en dehors du bunker pour en recolter d'avantages !", width/2-560, height/2+300);
    }
  }
}

// compteur de gemme
public void compteurGemmes() {
  image(imgGemme, 10, 10);
  fill(255, 255, 255);
  textSize(25);
  text((int)totalGemme, 100, 53);
}

// stats des parties effectuer par le joueur
public void stats() {
  image(fondStats, 0, 0);
  image(back, width/2-130, height/2+400, 275, 125);
  textSize(25);
  text((int)statsPieces, 244, 450);
  text((int)statsGemme, 222, 490);
  text((int)statsPartie, 210, 530);
  if (bestScore <= bestScoreJeu) {
    bestScore = bestScore - bestScore;
    bestScore = bestScore + bestScoreJeu;
  }
  textSize(50);
  text((int)bestScore, 1670, 500);
  image(hero, xHeroStats, height/2-200);
}

// SHOP DU JEU
public void shop() {
  image(fond, 0, 0);
  image(shopLogo, width/2-930, height/2-525);
  image(imgGemme, 10, 10);
  image(piece, 15, 90);
  image(back, width/2-130, height/2+400, 260, 130);
  image(flecheD, width/2+250, height/2, 100, 100);
  image(flecheG, width/2-350, height/2, 100, 100);
  textSize(25);
  fill(255, 255, 255);
  text((int)totalGemme, 100, 53);
  text((int)totalPieces, 80, 120);

  // SKIN DU SHOP DESTRUCTEUR DE MONDE! ACHAT / TRANSITION
  if (skin == 2) 
  {
    skin2();
    image(destructeur, width/2-550, height/2-490, 1200, 850);
    if (totalGemme <=49 && retirerMessageDest == false) {
      textSize(26);
      text("Tu n'as pas assez de gemmes ! il t'en manque "+(int)manqueGemme, width/2-340, height/2+340); 
      image(cristaux, width/2+280, height/2+313, 40, 40);
      manqueGemme = 50 - totalGemme;
      buyDestructeur = true;
    }
    if (buyDestructeur == false) {
      image(buy, width/2-68.75f, height/2+320, 137.5f, 62.5f);
      doigt();
      retirerMessageDest = true;
    }
    if (achatDestructeur >= 4) {
      image(repliqueDestructeur, width/2-900, height/2-570);
      accepteDestruct = 0;
    }
    if (autoriseDest >= 4) {
      achatDestructeur = 0;
      image(choisirImgDestructeur, width/2-920, height/2-490);
      choisirDestructeur = true;
    }
  }

  // SKIN DU SHOP BADCOOPS! ACHAT TRANSITION
  if (skin == 3) 
  {
    skin3();
    image(badcops, width/2-550, height/2-490, 1200, 850);
    if (totalGemme <=9 && retirerMessageB == false) {
      textSize(26);
      text("Tu n'as pas assez de gemmes ! il t'en manque "+(int)manqueGemme, width/2-323, height/2+340); 
      image(cristaux, width/2+290, height/2+313, 40, 40);
      manqueGemme = 10 - totalGemme;
      buyBadCops = true;
    }
    if (buyBadCops == false) {
      image(buy, width/2-68.75f, height/2+320, 137.5f, 62.5f);
      doigt();
      retirerMessageB = true;
    }
    if (achatBadCops >= 4) {
      image(repliqueBadCops, width/2-950, height/2-570);
      accepteBad = 0;
    }
    if (autoriseBad >= 4) {
      achatBadCops = 0;
      image(choisirImgBadCops, width/2-920, height/2-490);
      choisirBadCops = true;
    }
  }

  // SKIN DU SHOP DEADSHOOT! ACHAT TRANSITION
  if (skin == 1) 
  {
    skin1();
    image(deadshoot, width/2-550, height/2-490, 1200, 850);
    if (totalGemme <=24 && retirerMessageDead == false) {
      textSize(26);
      text("Tu n'as pas assez de gemmes ! il t'en manque "+(int)manqueGemme, width/2-338, height/2+340); 
      image(cristaux, width/2+280, height/2+313, 40, 40);
      manqueGemme = 25 - totalGemme;
      buyDeadShoot = true;
    }
    if (buyDeadShoot == false) {
      image(buy, width/2-68.75f, height/2+320, 137.5f, 62.5f);
      doigt();
      retirerMessageDest = true;
    }
    if (achatDeadShoot >= 4) {
      image(repliqueDeadShoot, width/2-950, height/2-570);
      accepteDead = 0;
    }
    if (autoriseDead >= 4) {
      achatDeadShoot = 0;
      image(choisirImgDeadShoot, width/2-920, height/2-490);
      choisirDeadShoot = true;
    }
  }
}

// affichage du skin1 dans le shop
public void skin1() {
  image(skin1, width/2-140.5f, height/2-150, 276, 430);
}

// affichage du skin2 dans le shop
public void skin2() {
  image(skin2, width/2-250, height/2-150, 450, 450);
}

// affichage du skin3 dans le shop
public void skin3() {
  image(skin3, width/2-225, height/2-150, 450, 450);
}

/** création du bouton play par biais d'un écran **/
public void commencer() {
  image(jeu, 0, 0); // Utilisation à la place de background();
  image(imgCommencer, width/2-100, height/2-50);
  drawPlayer();
  image(imgGemme, 10, 10);
  image(piece, 15, 90);
  fill(255, 255, 255);
  text((int)totalPieces, 80, 120);
  textSize(25);
  image(shop, 1060, 910);
  image(gemme, 910, 910);
  image(stats, 760, 910);
  image(exit, 20, 980, 180, 90);
  textSize(25);
  fill(255, 255, 255);
  text((int)totalGemme, 100, 53);
  salon = true;
}

/** configuration de l'écran qui permet de jouer au jeu **/
public void afficherJeu() {
  image(jeu, 0, 0); // Utilisation à la place de background();
  drawPlayer();
  soucoupeVolante();
  compteurGemmes();
  salon = false;

  if (!isCollided) {
    moveBaddies();
    if (score > limit && score < limit + 2) {
      initBaddies(-100, width + 20, -260, -80, difficulty); 
      difficulty += 1; 
      limit += 24;
    }
    movePieces();
    moveLaser();
  }

  /** Score en fin de partie**/
  else {
    image(rip, playerXCor, 675, 200, 200);
    playerYCor = 3000;
    image(over, width/2-150, 50, 300, 150);
    textSize(45);
    fill(124, 252, 0);
    text("Score: "+(int)score, width/2-100, 250);
    text("#1 Anonyme : "+(int)score, 770, 300);
    text("#2 ...............:  ...", 770, 350);
    text("#3 ...............:  ...", 770, 400);
    text("#4 ...............:  ...", 770, 450);
    text("#5 ...............:  ...", 770, 500);
    text("#6 ...............:  ...", 770, 550);
    text("#7 ...............:  ...", 770, 600);
    text("#8 ...............:  ...", 770, 650);
    text("#9 ...............:  ...", 770, 700);
    text("#10 .............:  ...", 770, 750);
    image(playAgain, width/2-140, 920, 270, 80);
    image(bouttonMenu, 0, 960, 250, 125);
    textSize(25);
    fill(255, 255, 255);
    image(piece, 15, 90);
    text((int)piecesPartie, 80, 120);
    if (finJeuPieces <= piecesPartie) {
      finJeuPieces = finJeuPieces +0.1f;
    }
    if (finJeuPieces >=1) {
      image(piece, 1250, 930);
    }
    if (finJeuPieces >=2) {
      image(piece, 1270, 930);
    }
    if (finJeuPieces >=3) {
      image(piece, 1290, 930);
    }
    if (finJeuPieces >=4) {
      image(piece, 1310, 930);
    }
    if (finJeuPieces >=5) {
      image(piece, 1330, 930);
    }
    if (finJeuPieces >=6) {
      image(piece, 1350, 930);
    }
    if (finJeuPieces >=7) {
      image(piece, 1370, 930);
    }
    if (finJeuPieces >=8) {
      image(piece, 1390, 930);
    }
    if (finJeuPieces >=9) {
      image(piece, 1410, 930);
    }
    if (finJeuPieces >=10) {
      image(piece, 1430, 930);
    }
    if (finJeuPieces >=11) {
      image(piece, 1450, 930);
    }
    if (finJeuPieces >=12) {
      image(piece, 1470, 930);
    }
    if (finJeuPieces >=13) {
      image(piece, 1490, 930);
    }
    if (finJeuPieces >=14) {
      image(piece, 1510, 930);
    }
    if (finJeuPieces >=15) {
      image(piece, 1530, 930);
    }
    if (finJeuPieces >=16) {
      image(piece, 1550, 930);
    }
    if (finJeuPieces >=17) {
      image(piece, 1570, 930);
    }
    if (finJeuPieces >=18) {
      image(piece, 1590, 930);
    }
    if (finJeuPieces >=19) {
      image(piece, 1610, 930);
    }
    if (finJeuPieces >=20) {
      image(piece, 1630, 930);
    }
  }
}


/** bouton pour recommencer **/
public void recommencerJeu() {
  playerXCor = 875;
  playerYCor = 675;
  playerWidth = 180;
  playerHeight = 180;
  difficulty = 1;
  limit = 24;
  isCollided = false;
  score = 0;
  initBaddies(-100, width + 20, -260, -80, difficulty);
  initPieces(-100, width + 20, -260, -80, difficulty);
  finJeuPieces = 0;
  piecesPartie = 0;
  bestScoreJeu = bestScoreJeu - bestScoreJeu;
}

/** deplacement meteorite et score**/
public void moveBaddies() {
  for (int i = 0; i < baddies.length; i++) {
    if (baddies[i].yCor > height) {
      baddies[i].yCor = -10;
    }
    baddies[i].display();
    baddies[i].drop(random(1, 10));

    boolean conditionXLeft = baddies[i].xCor + baddies[i].w >= playerXCor;
    boolean conditionXRight = baddies[i].xCor + baddies[i].w <= playerXCor + playerWidth + 4;
    boolean conditionUp =  baddies[i].yCor >= playerYCor;
    boolean conditionDown = baddies[i].yCor + baddies[i].h <= playerYCor + playerHeight;

    if (conditionXLeft && conditionXRight && conditionUp && conditionDown) {
      isCollided = true;
    }
  }

  score += 0.1f;
  bestScoreJeu += 0.1f;

  fill(124, 252, 0);
  text("Score : "+(int)score, 1740, 30);
  textSize(25);
}

/** deplacement pieces et score**/
public void movePieces() {
  for (int i = 0; i < pieces.length; i++ ) {
    if (pieces[i].yCor > height) {
      pieces[i].yCor = -10;
    }
    pieces[i].display();
    pieces[i].drop(random(1, 5));

    boolean conditionXLeft = pieces[i].xCor + pieces[i].w >= playerXCor;
    boolean conditionXRight = pieces[i].xCor + pieces[i].w <= playerXCor + playerWidth + 4;
    boolean conditionUp =  pieces[i].yCor >= playerYCor;
    boolean conditionDown = pieces[i].yCor + pieces[i].h <= playerYCor + playerHeight;

    if (conditionXLeft && conditionXRight && conditionUp && conditionDown) {
      totalPieces += 0.1f;   
      piecesPartie += 0.1f;
      conteurPieces += 0.1f;
      statsPieces += 0.1f;
    }
    if (conteurPieces >= 1) {
      conteurPieces = 0;
      pieces[i] = new Piece(x, y, 30, 15);
      pieces[i].yCor = -10;
    }
  }



  image(piece, 15, 90); 

  fill(255, 255, 255);
  text((int)piecesPartie, 80, 120);
  textSize(25);
}

/** deplacement meteorite et score**/
public void moveLaser() {

  boolean conditionXLeft = xLaser + laLaser >= playerXCor;
  boolean conditionXRight = xLaser + laLaser <= playerXCor + playerWidth + 4;
  boolean conditionUp =  y >= playerYCor -140;
  boolean conditionDown = y + loLaser <= playerYCor + playerHeight;

  if (conditionXLeft && conditionXRight && conditionUp && conditionDown) {
    isCollided = true;
    if (isCollided == true) {
      xLaser = 3000;
    }
  }
}


public void drawPlayer() {
  image(hero, playerXCor, playerYCor, playerWidth, playerHeight);
}


public void mouseClicked() {

  // ecran du jeu
  if ((mouseX>width/2-70)&&(mouseX<width/2+80)&&(mouseY>height/2-100)&&(mouseY<height/2+50) && (ecran == 0)) {
    ecran = 1;
  } else if ((mouseX>width/2-70)&&(mouseX<width/2+80)&&(mouseY>height/2-100)&&(mouseY<height/2+50) && (ecran == 1)) {
    ecran = 2;
    piecesPartie = 0;
    statsPartie = statsPartie + 1;
    recommencerJeu();
  } else if ((mouseX>20)&&(mouseX<200)&&(mouseY>980)&&(mouseY<1070) && (ecran == 1)) {
    exit();
  } else if ((mouseX>1060)&&(mouseX<1170)&&(mouseY>910)&&(mouseY<1015) && (ecran == 1)) {
    ecran = 3;
  } 

  //bouton menu ecran 3
  else if ((mouseX>910)&&(mouseX<1020)&&(mouseY>910)&&(mouseY<1015) && (ecran == 1)) {
    ecran = 5;
  } else if ((mouseX>width/2-93)&&(mouseX<width/2+105)&&(mouseY>height/2+410)&&(mouseY<height/2+490) && (ecran == 4)) {
    ecran = 1;
  } else if ((mouseX>760)&&(mouseX<870)&&(mouseY>910)&&(mouseY<1015) && (ecran == 1)) {
    ecran = 4;
  } 

  // bouton pour recommencer le jeu
  else if ((mouseX>width/2-140)&& (mouseX<width/2+130)&&(mouseY>920)&&(mouseY<1000) && (isCollided)) {
    recommencerJeu();
    statsPartie = statsPartie + 1;
  } else if ((mouseX>40)&& (mouseX<215)&&(mouseY>985)&&(mouseY<1060) && (isCollided)) {
    ecran = 1;
  } 

  // suivant et précédents des personnages dans le shop
  else if ((mouseX>1210)&& (mouseX<1308)&&(mouseY>540)&&(mouseY<635) && (ecran == 3) && (skin == 2)) {
    skin = 3;
  } else if ((mouseX>1210)&& (mouseX<1308)&&(mouseY>540)&&(mouseY<635) && (ecran == 3) && (skin ==1)) {
    skin = 2;
  } else if ((mouseX>1210)&& (mouseX<1308)&&(mouseY>540)&&(mouseY<635) && (ecran == 3) && (skin == 3)) {
    skin = 1;
  } else if ((mouseX>610)&& (mouseX<707)&&(mouseY>538)&&(mouseY<639) && (ecran == 3) && (skin ==3)) {
    skin = 2;
  } else if ((mouseX>610)&& (mouseX<707)&&(mouseY>538)&&(mouseY<639) && (ecran == 3) && (skin ==2)) {
    skin = 1;
  } else if ((mouseX>610)&& (mouseX<707)&&(mouseY>538)&&(mouseY<639) && (ecran == 3) && (skin ==1)) {
    skin = 3;
  } 

  // bouton retour du shop
  else if ((mouseX>width/2-93)&&(mouseX<width/2+105)&&(mouseY>height/2+410)&&(mouseY<height/2+490) && (ecran == 3)) {
    ecran = 1;
    achatDeadShoot = 0;
    achatBadCops = 0;
    achatDestructeur = 0;
  } 

  // achat personnages et transitions
  //ACHAT DE DEADSHOOT!
  else if ((mouseX>904)&& (mouseX<1016)&&(mouseY>865)&&(mouseY<912) && (ecran == 3) && (skin ==1) && (totalGemme >= 25) && (accepteDead >= 2)) {
    hero = skin1;
    playerWidth = 115;
    totalGemme = totalGemme - 25;
    achatDeadShoot = 5;
    buyDeadShoot = true;
    xHeroStats = 820;
  } else if ((mouseX>202)&& (mouseX<1735)&&(mouseY>848)&&(mouseY<926) && (ecran == 3) && (skin ==1) && (achatDeadShoot >= 4)) {
    autoriseDead = 5;
  } else if ((mouseX>848)&& (mouseX<1073)&&(mouseY>852)&&(mouseY<924) && (ecran == 3) && (skin ==1)&& (choisirDeadShoot == true)) {
    hero = skin1;
    playerWidth = 115;
    ecran = 1;
    xHeroStats = 820;
  }

  // ACHAT DU DESTRUTEUR DE MONDE
  else if ((mouseX>904)&& (mouseX<1016)&&(mouseY>865)&&(mouseY<912) && (ecran == 3) && (skin ==2) && (totalGemme >= 50) && (accepteDestruct >= 2)) {
    hero = skin2;
    totalGemme = totalGemme - 50;
    achatDestructeur = 5;
    buyDestructeur = true;
    playerWidth = 180;
    xHeroStats = 710;
  } else if ((mouseX>202)&& (mouseX<1735)&&(mouseY>848)&&(mouseY<926) && (ecran == 3) && (skin ==2) && (achatDestructeur >= 4)) {
    autoriseDest = 5;
  } else if ((mouseX>848)&& (mouseX<1073)&&(mouseY>852)&&(mouseY<924) && (ecran == 3) && (skin ==2) && (choisirDestructeur == true)) {
    hero = skin2;
    playerWidth = 180;
    ecran = 1;
    xHeroStats = 710;
  } 

  // ACHAT DU BADCOOPS!
  else if ((mouseX>904)&& (mouseX<1016)&&(mouseY>865)&&(mouseY<912) && (ecran == 3) && (skin ==3) && (totalGemme >= 10) && (accepteBad >= 2)) {
    hero = skin3;
    totalGemme = totalGemme - 10;
    achatBadCops = 5;
    buyBadCops = true;
    playerWidth = 180;
    xHeroStats = 740;
  } else if ((mouseX>202)&& (mouseX<1735)&&(mouseY>848)&&(mouseY<926) && (ecran == 3) && (skin ==3) && (achatBadCops >= 4)) {
    autoriseBad = 5;
  } else if ((mouseX>848)&& (mouseX<1073)&&(mouseY>852)&&(mouseY<924) && (ecran == 3) && (skin ==3) && (choisirBadCops == true)) {
    hero = skin3;
    playerWidth = 180;
    ecran = 1;
    xHeroStats = 740;
  } 

  // tablette ecran 3 pour echanger des pièces contre gemmes.
  else if ((mouseX>1114)&& (mouseX<1224)&&(mouseY>521)&&(mouseY<622) && (ecran == 5) && (tabletteMenuAfficher == false) && (afficheJeuBonus == false)) {
    tabletteLoadingAfficher = true;
    tabletteMenuAfficher = true;
  } else if ((mouseX>1449)&& (mouseX<1687)&&(mouseY>903)&&(mouseY<982) && (ecran == 5) && (tabletteLoadingAfficher == true) && (afficheJeuBonus == false)) {
    tabletteLoadingAfficher = false;
    tabletteGemmeAfficher = true;
  } else if ((mouseX>1497)&& (mouseX<1720)&&(mouseY>887)&&(mouseY<971) && (ecran == 5) && (tabletteGemmeAfficher == true) && (afficheJeuBonus == false)) {
    ecran = 1;
    tabletteMenuAfficher = false;
    tabletteGemmeAfficher = false;
  } else if ((mouseX>863)&& (mouseX<1021)&&(mouseY>670)&&(mouseY<761) && (ecran == 5) && (tabletteGemmeAfficher == true) && (totalPieces >= 10) && (afficheJeuBonus == false)) {
    totalPieces = totalPieces - 10;
    totalGemme = totalGemme + 1;
    statsGemme += 1;
  }

  // affiche Jeu Bonus.
  else if ((mouseX>1326)&& (mouseX<1442)&&(mouseY>519)&&(mouseY<625) && (ecran == 5) && (afficheJeuBonus == false)) {
    afficheJeuBonus = true;
  } else if ((mouseX>825)&& (mouseX<1535)&&(mouseY>391)&&(mouseY<574) && (ecran == 5) && (afficheJeuBonus == true) && (dialogue1 == true) && (coffreAnime == false)) {
    dialogue2 = true;
    xLapin = -1;
  } else if ((mouseX>840)&& (mouseX<1094)&&(mouseY>734)&&(mouseY<905) && (ecran == 5) && (dialogue2 == true)) {
    coffreAnime = true;
    dialogue2 = false;
  } else if ((mouseX>1547)&& (mouseX<1759)&&(mouseY>912)&&(mouseY<979) && (ecran == 5) && (cadeau == true) && (partirCadeau == true)) {
    ecran = 1;
    tabletteMenuAfficher = false;
    afficheJeuBonus = false;
    annonceActiver = true;
    annonceActiver2 = true;
  }
}


public void mouseDragged() {
  if (isCollided == false && salon == false) {
    if (mouseX >= 0 && mouseX <= width - playerWidth + 1) {
      playerXCor = mouseX;
    }
    if (mouseY >= 680 && mouseY <= height - playerHeight) {
      playerYCor = mouseY;
    }
  }
}
// creation d'une classe pour les météorites.
class Baddie {

  public int xCor;
  public int yCor;
  public int w;  // largeur
  public int h; // hauteur
  public int sens; // sens de la météorite
  PImage meteorite;

  // creation de la variable des météorites.
  Baddie(int xVal, int yVal, int wVal, int hVal, int dSens) {
    xCor = xVal;
    yCor = yVal;
    w = wVal;
    h = hVal;
    sens = dSens;
  } 

  // vitesse de la meteorite
  public void drop(float speed) {
    yCor += speed;
    if (sens == 0) {
      xCor += -speed;
    } else if (sens == 1) {
      xCor += speed;
    }
  }

  // selon le sens de la meteorite l'image se change 
  public void display() {
    if (sens == 0) {
      meteorite = meteorited1;
      image(meteorite, xCor, yCor);
    } else if (sens == 1) {
      meteorite = meteorited2;
      image(meteorite, xCor, yCor);
    } else {
      meteorite = meteorite1;
      image(meteorite, xCor, yCor);
    }
  }
}
// image jeu bonus
PImage curseur;
PImage imgBonus;
PImage coffreOuvert;
PImage coffreFermer;
PImage positif;
PImage negatif;
PImage partir;
PImage fondAnime;
PImage dialogueTexte1;
PImage dialogueTexte2;
PImage lapin;

//boolean du jeu
boolean coffreAnime = false;
boolean afficheDialogue1 = false;
boolean dialogue1 = false;
boolean dialogue2 = false;
boolean cadeau = false;
boolean partirCadeau = false;
boolean afficheJeuBonus = false;

// int du jeu
int cadeauCompteur = 0;
int vitesseL;

// float du jeu
float xCoffre =  0;
float xLapin = 600; 


/** application de noel sur la tablette avec le lapin de noel **/
public void lapinAnime() {
  image(lapin, xLapin, 0);
// vitesse du lapin
  vitesseL = -10;
  if (xLapin <= 0) { // condition si le lapin arrive a la coordonnées 0, vitesse = 0.
    vitesseL = 0;
    dialogue1 = true;
  }
  if (xLapin <= -1) {  // condition si le lapin est inferieur a la coordonnées -1 ou égale il fait apparaitre le premier dialogue.
    dialogue1 = false;
  }
  if (dialogue1 == true) { // condition qui lance le premier dialogue si dialogue1 est égale a true.
    image(dialogueTexte1, 0, 0);
  }
  if (dialogue2 == true) { // si dialogue2 est égale a true le dialogue2 se lance
    image(dialogueTexte2, 0, 0);
  }
  if (coffreAnime == true) { // animation du coffre (ouvert) si coffre anime est égale a true
    coffreFermer = coffreOuvert;
    cadeau = true;
  }
  if (cadeau == true && cadeauCompteur <= 1) {  // si cadeau est égale a true et que le compteur est inférieur a 1 ou égale sa drop un nombre de pieces aléatoire au joueur et ajoute le nombre de pieces qui a été drop dans les stats.
    xCoffre = xCoffre + random(50, 200);
    totalPieces = totalPieces + xCoffre;
    statsPieces = statsPieces + xCoffre;
    cadeauCompteur = cadeauCompteur + 2;
    partirCadeau = true;
  }
  if (xCoffre >= 0 && xCoffre <= 99 && cadeau == true && partirCadeau == true) {  // si le nombre de pieces est positif il charge le message du lapin et affiche une image pour partir
    image(positif, 0, 0);
    text("LE SOSIE DU PÈRE NOËL VOUS A GENTIMENT DONNÉ "+(int)xCoffre+" PIÈCES !", width/2-400, height/2+400);
    image(partir, 0, 0);
  }
    if (xCoffre >= 100 && cadeau == true && partirCadeau == true) {  // si le nombre de pieces est positif il charge le message du lapin et affiche une image pour partir
    image(positif, 0, 0);
    text("JACKPOT !!! LE SOSIE DU PÈRE NOËL VOUS A GENTIMENT DONNÉ "+(int)xCoffre+" PIÈCES !", width/2-400, height/2+400);
    image(partir, 0, 0);
  }
  xLapin = xLapin + vitesseL;  // formule pour la vitesse d'arrivé du lapin
}
// creation d'un laser 
public void  laser() { 
  image(tireLaser, xLaser+65, y+100, laLaser, loLaser);

  vitesseT = 6;  // vitesse du laser

  if (y >= height) { // si le laser depasse la bas de l'écran y = 0 et il apparait en -1000 et laserEnCour est égale a true.
    y= 0;
    laserEnCour = false; 
    xLaser = -1000;
  }

  // Calcul de la nouvelle position
  y = y + vitesseT;
}
// creation de la class piece
class Piece {

  public int xCor;
  public int yCor;
  public int w;
  public int h;
  PImage piece;

// creation de la variable de la piece
  Piece(int xVal, int yVal, int wVal, int hVal) {
    xCor = xVal;
    yCor = yVal;
    w = wVal;
    h = hVal;
  } 

  // vitesse de la piece
  public void drop(float speed) {
    yCor += speed;
  }

  // image de la piece
  public void display() {
    piece = loadImage("pieces2.png");
    image(piece, xCor, yCor);
  }
}
int xAnnonce = 0;
PImage annonce;
PImage fondAnnonce;
PImage annonceDoigt;
int vitesseA = 0;
boolean annonceActiver = false;
PImage annonce2;
int xAnnonce2 = 0;
PImage fondAnnonce2;
int vitesseA2 = 0;
boolean annonceActiver2 = false;

public void annonce() { // creation d'une annonce 
      image(annonce,xAnnonce,0);
        vitesseA = 6;  // vitesse de l'annonce
  if (xAnnonce >= 1450) {  // si xAnnonce est supérieure ou égale a 1450 elle va en -1220
    xAnnonce = -1220;
  }
    xAnnonce = xAnnonce + vitesseA; // vitesse de l'annonce
}

public void annonce2() {
      image(annonce2,xAnnonce2,0);
        vitesseA2 = 6;  // vitesse de l'annonce
  if (xAnnonce2 >= 1450) { // si xAnnonce est supérieure ou égale a 1450 elle va en -1220
    xAnnonce2 = -1220;
  }
    xAnnonce2 = xAnnonce2 + vitesseA2;  // calcule de la vitesse de l'annonce
}
PImage doigt;
int xDoigt =0;
int xDoigt2 =0;
int xDoigt3 =0;
int vitesse = -2;
int yDoigt = 0;
int yDoigt2 = 0;
int yDoigt3 = 0;

public void doigt()  // creation d'un doigt qui sera dans l'écran du shop (ecran 3)
{
  image(doigt, xDoigt, yDoigt, 1440, 810);

  // Choix de la vitesse
  if (yDoigt <= 580 )  // si il est inférieur ou égale a 580, y =630.
  {
    yDoigt = 630;
  }
  if (xDoigt <= 620 )  // si il est inférieur ou égale a 620, x =670.
  {
    xDoigt = 670;
  }

  // Calcul de la nouvelle position
  yDoigt = yDoigt + vitesse;
  xDoigt = xDoigt + vitesse;
}

public void doigtTablette()  // creation d'un doigt qui sera dans la tablette ecran 5
{
  image(doigt, xDoigt2, yDoigt2, 1440, 810);

  // Choix de la vitesse
  if (yDoigt2 <= 270 )  // si il est inférieur ou égale a 270, y =320.
  {
    yDoigt2 = 320;
  }
  if (xDoigt2 <= 1035 ) // si il est inférieur ou égale a 1035, x =1035.
  {
    xDoigt2 = 1085;
  }

  // Calcul de la vitesse x et y
  yDoigt2 = yDoigt2 + vitesse;
  xDoigt2 = xDoigt2 + vitesse;
}

public void doigtTablette2()  // creation d'un doigt qui sera dans la tablette ecran 5
{
  image(doigt, xDoigt3, yDoigt3, 1440, 810);

  // Choix de la vitesse
  if (yDoigt3 <= 270 )  // si il est inférieur ou égale a 270, y =320.
  {
    yDoigt3 = 320;
  }
  if (xDoigt3 <= 820 ) // si il est inférieur ou égale a 820, x =870.
  {
    xDoigt3 = 870;
  }

  // Calcul de la vitesse x et y
  yDoigt3 = yDoigt3 + vitesse;
  xDoigt3 = xDoigt3 + vitesse;
}


SoundFile file;
/** Création de la soucoupe volante **/
public void soucoupeVolante() {
  image(soucoupe, x, 0, 200, 150);
  // Choix de la vitesse
  if (x >= 1720 )  // si x est supérieur ou égale a 1720 la vitesse est égale a -2 et il fait un random laser
  {
    vitesseV = -2;
    xLaser = (int) random(300, 1250);
  }
  if (x <= 0)  // si x est inférieur ou égale a 0 la vitesse est égale a 2 et il fait un random laser
  {
    vitesseV = 2;
    xLaser = (int)random(300, 1400);
  }
  x = x + vitesseV;  // calcule de la vitesse
  if ((abs(x - xLaser) < 6))  // si le laser et la secoupe son aligner d'environ 6 pixels il d'éclanche le tire du laser
  {
    laserEnCour = true;
  }
  if (laserEnCour == true) {
    laser();
  }
}
  public void settings() {  fullScreen(); }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "sketch_211117a" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}
