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

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 Univers_7 extends PApplet {

/*Je ne sais pas pour quelle raison mais lorsque j'ai changer d'ordinateur
ça me met qu'il ne trouve pas de librairie "ddf" et je n'est pas réussi à 
corriger l'erreur donc il n'y a pas de musique maleureusement.
//Pour la musique
import ddf.minim.*;
Minim minim;
AudioPlayer uneMusique;*/

  Etoile[] etoiles;
  EtoileY[] etoilesY;
  Meteor[] meteores;
  
PImage vaisseau;

int score = 0;
int piece = 0;
int multiplicateur1 = 0;
int multiplicateur2 = 0;
int multiplicateur3 = 0;

//Vitesse en m/ms
float vitesse = 5;
float speed;

int ecran = 0;
int pixel;


public void couleurEtoile(){
  //Récupération de la couleur du pixel en fonction de la position de la souris
  pixel = get(mouseX, mouseY);            
    //Si le pixel est ressemblant aux pixels de la météorite alors ajouter du score
    if (pixel >= color(210, 25, 20)) {  
     score = score + 101;
     score = score + multiplicateur1 + multiplicateur2 + multiplicateur3;
     piece = piece + 1;
  }
    //Sinon enlever 1 de score
    if (pixel >= color(10, 0, 20)) {  
     score = score - 1;
  }
    //On ne peut pas descendre en dessous 0 de score
    if (score <= 0) {
    score = 0;
  }
}

public void setup(){
         //Taille du jeu en pixels
    
          
  /*Musique
  minim = new Minim(this);
  uneMusique = minim.loadFile("musique.mp3");
  uneMusique.play();*/
  
  etoiles = new Etoile[1800];
  etoilesY = new EtoileY[400];
  meteores = new Meteor[5];
  
  //Les images utilisées 
  espace = loadImage("espace.jpg");
  titre = loadImage("titre.png");
  vaisseau = loadImage("vaisseau.png");
  galaxie = loadImage("galaxie.png");
  
  //Création d'étoiles bleu et jaune, création de météorites
  for (int i = 0; i < etoiles.length; i++){
    etoiles[i] = new Etoile(); 
  }
  for (int i = 0; i < etoilesY.length; i++){
    etoilesY[i] = new EtoileY(); 
  }
  for (int i = 0; i < meteores.length; i++){
    meteores[i] = new Meteor();
  }
}


public void draw(){   
  //Pour le menu
  if (ecran == 0){
    afficherMenu();
  }
  //Pour le jeu
  if (ecran == 1){
    afficherJeu();
  }
  //Pour la page de fin
  if (ecran == 2){
    afficherFin();
  }
  //Pour le magasin
  if (ecran == 3){
    afficherMagasin();
  }
}


public void afficherJeu(){  
  //Vitesse du vaisseau
  speed = vitesse;
  translate(width/2, height/2);
  
  //Niveau 1
  if (vitesse >= 5 && vitesse <= 15){ 
    vitesse = vitesse + 0.005f;
    background(10, 0, 20);
  }
  //Niveau 2
  if (vitesse >= 15 && vitesse <= 25){ 
    vitesse = vitesse + 0.01f;
    background(10, 0, 20);
  }
  //Niveau 3
  if (vitesse >= 25 && vitesse <= 40){ 
    vitesse = vitesse + 0.008f;
    background(10, 0, 20);
  }
  //Niveau ultime
  if (vitesse >= 40){ 
    vitesse = vitesse + 0.011f;
    background(60, 10, 100);
  }
    
  //Ralentir le vaisseau
  if(keyPressed == true){
    if(keyCode == DOWN){
      vitesse = vitesse - 0.01f;
      fill(0, 255, 0);
      rect(70, 415, 20, 20);
    }
    //Accélérer le vaisseau
    if(keyCode == UP){
      vitesse = vitesse + 0.05f;
      fill(255, 0, 255);
      rect(170, 415, 20, 20);
    }
  }
  
  //Malus ralentissement
  if (vitesse < 5){
  delay(500);
  vitesse = 40;
  }
  
  //Fin du jeu à la vitesse de 60m/ms
  if (vitesse >= 60){
    delay(1000);
    ecran = 2;
    vitesse = vitesse - 55;
  }


  //Générer les étoiles et météorites des tableaux
  for (int i = 0; i < etoiles.length; i++){
    etoiles[i].up();
    etoiles[i].st();
  }
  for (int i = 0; i < etoilesY.length; i++){
    etoilesY[i].upy();
    etoilesY[i].sty();
  }
  for (int u = 0; u < meteores.length; u++){
    meteores[u].wp();
    meteores[u].me();
  }

  //visuel vu du vaisseau
  image (vaisseau, -600, -450);
  
  //Affichage du score
  fill(40, 40, 40);
  stroke(0, 255, 255);
  strokeWeight(5.0f);
  rect(-162, 295, 211, 150, 8);
  fill(0, 255, 255, 240);
  textSize(30);
  text(score, -100, 400);
  textSize(40);
  fill(255, 255, 255);
  text("score", -110, 350);
  
  //Affichage de la vitesse
  fill(40, 40, 40);
  stroke(0, 255, 255);
  strokeWeight(5.0f);
  rect(50, 295, 150, 150, 8);
  fill(0, 255, 0, 200);
  textSize(30);
  text(vitesse, 50, 400);
  textSize(40);
  fill(255, 255, 255);
  text("vitesse", 55, 350);
  
  //Affichage des pièces
  fill(0, 0, 0);
  stroke(0, 255, 0);
  strokeWeight(5.0f);
  rect(-480, -450, 100, 100, 8);
  fill(0, 255, 0, 200);
  textSize(30);
  text(piece, -460, -400);
   text("coin", -460, -360);
  
  //Viseur qui suit le mouvement de la souris
  //Viseur avec des droites perpendiculaires turquoise transparent
  stroke(0, 250, 250, 8);
  line(mouseX-600, -900, mouseX-600, height);
  line(-750, mouseY-450, height, mouseY-450);  
  
  //Alerte, nous rentrons dans l'univers 7
  if (vitesse >= 37 && vitesse <= 40){
    fill(0, 255, 255);
    textSize(80);
    text("WARNING", -200, 0);
  }
}

//Redirection lorsque appuie sur les boutons du menu et de la page de fin
public void mouseClicked(){
  //play
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > height/2-37.5f) && (mouseY < height/2+ 37.5f) &&  (ecran == 0)) {
    ecran = 1;
  }
  //shop
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > 525) && (mouseY < 600) && (ecran == 0)) {
    ecran = 3;
  }
  //quitter
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > height/2+180) && (mouseY < height/2+ 255) && (ecran == 0)) {
    exit();
  }
  //Reset du score en fin de partie & recommencer
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > height/2-37.5f) && (mouseY < height/2+ 37.5f) && (ecran == 2)) {
    ecran = 1;
    score = 0;
  }
  //Reset du score en fin de partie & retour au menu
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > height/2+62.5f) && (mouseY < height/2+ 137.5f) && (ecran == 2)) {
    ecran = 0;
    score = 0;
  }
  if((mouseX > width/2-75) && (mouseX < width/2+75) && (mouseY > height/2+277.5f) && (mouseY < height/2+337.5f) && (ecran == 3)) {
    ecran = 0;
    score = 0;
  }
  //bonus 2
  if((mouseX > 500) && (mouseX < 650) && (mouseY > height/2-37.5f) && (mouseY < height/2+ 37.5f) && (ecran == 3)) {
    if(piece>300){
    multiplicateur2 = 100;
    piece = piece-300;
    }
  }
  //bonus 1
  if((mouseX > 250) && (mouseX < 400) && (mouseY > height/2-37.5f) && (mouseY < height/2+ 37.5f) && (ecran == 3)) {
    if(piece>200){
    multiplicateur1 = 50;
    piece = piece-200;
    }
  }
  //bonus 3
  if((mouseX > 750) && (mouseX < 900) && (mouseY > height/2-37.5f) && (mouseY < height/2+ 37.5f) && (ecran == 3)) {
    if(piece>500){
    multiplicateur3 = 300;
    piece = piece-500;
    }
  }
  couleurEtoile();
}
class Etoile{
  float x;
  float y;
  float z;
    
  float pz;
  
  Etoile(){
    //Apparition aléatoire des étoiles bleu
    x = random(-width, width);
    y = random(-height, height);
    z = random(width);
    
    pz = z;
  }
  
  public void up(){
    //Vitesse de déplacement des étoiles
    z = z - speed;
    if (z < 1) {
      z = width;
      x = random(-width, width);
      y = random(-height, height);
      
      pz = z;
    }
  }
  
  public void st(){
    fill(180, 255, 255);
    noStroke();
    
    //effet 3D
    float sx = map(x / z, 0, 1, 0, width);
    float sy = map(y / z, 0, 1, 0, height);
    
    //effet de grossissement quand les étoiles s'approchent
    float r = map(z, 0, width, 16, 0);
    
    //Forme de l'étoile
    ellipse(sx, sy, r, r);

  }  
}
//Idem que  pour les étoiles bleu, mais là les étoiles sont jaune 
//Étoiles également plus petites et moins nombreuses

class EtoileY{
  float x;
  float y;
  float z;
  
  float pz;
  
  EtoileY(){
    x = random(-width, width);
    y = random(-height, height);
    z = random(width);
    
    pz = z;
  }
  
  public void upy(){
    z = z - speed;
    if (z < 1) {
      z = width;
      x = random(-width, width);
      y = random(-height, height);

    pz = z;
    }
  }
  
  public void sty(){
    fill(255, 240, 0, 230);
    noStroke();
    
    float sx = map(x / z, 0, 1, 0, width);
    float sy = map(y / z, 0, 1, 0, height);
    
    float r = map(z, 0, width, 10, 0);
    ellipse(sx, sy, r, r); 
  }
}
PImage galaxie;

public void afficherFin(){
  background(10, 0, 40);
  image(galaxie, 120, -50);
  
  //BOUTON REPLAY
  fill(0, 0, 0, 90);
  //la quatrième valeur du fill correspond à l'opacité
  
  //Forme des boutons
  rect(525, 422.5f, 195, 75, 25);
  stroke(255, 255, 0);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //BOUTON MENU
  fill(0, 0, 0, 90);
  rect(525, 522.5f, 195, 75, 25);
  stroke(255, 255, 0);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //TEXTE REPLAY
  fill(0, 255, 255, 175);
  textSize(40);
  text("REJOUER", 540, 475); 
  
  //TEXTE MENU
  fill(0, 255, 255, 175);
  textSize(40);
  text("MENU", 568, 575);
  
  //TEXTE SCORE
  fill(0, 200, 255, 200);
  textSize(30);
  text("Votre score", 180, 550);
  textSize(40);
  text(score, 170, 600); 
  fill(0, 0, 0, 50);
  stroke(255, 255, 0);
  rect(100, 500, 310, 120);
  
  //TEXTE PIECE
  fill(0, 200, 255, 200);
  textSize(30);
  text("Nombre de pièces", 120, 700);
  textSize(40);
  text(piece, 170, 750); 
  fill(0, 0, 0, 50);
  stroke(255, 255, 0);
  rect(100, 650, 310, 120);
}

public void afficherMagasin(){
  background(10, 20, 40);

  //BOUTON EXIT
  fill(0, 0, 0, 70);
  rect(525, 722.5f ,150, 75, 25);
  stroke(0, 0, 70, 40);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //TEXTE EXIT
  fill(0, 255, 255, 175);
  textSize(40);
  text("MENU", 540, 775);
  
  //TEXTE PIECE
  fill(0, 200, 255, 200);
  textSize(30);
  text("Nombre de pièces", 120, 700);
  textSize(40);
  text(piece, 170, 750); 
  fill(0, 0, 0, 50);
  stroke(255, 255, 0);
  rect(100, 650, 310, 120);
  
  
  //BOUTON Multi11
  fill(0, 0, 0, 70);
  rect(250, 400, 150, 75, 25);
  stroke(255, 255, 0);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //Informations
  fill(0, 255, 255);
  textSize(30);
  text("Chaque bonus de score peut être acheté qu'une seule fois !", 140, 200);
  
  //TEXTE Multi1
  fill(0, 255, 255, 175);
  textSize(30);
  text("Bonus 1", 270, 370);
  fill(0, 255, 255);
  text("+50", 285, 450);
  textSize(25);
  fill(255, 200, 0);
  text("200€", 295, 515);
  
  //BOUTON Multi12
  fill(0, 0, 0, 70);
  rect(500, 400, 150, 75, 25);
  stroke(255, 255, 0);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //TEXTE Multi2
  fill(0, 255, 255, 175);
  textSize(30);
  text("Bonus 2", 520, 370);
  fill(0, 255, 255);
  text("+100", 525, 450);
  textSize(25);
  fill(255, 200, 0);
  text("300€", 545, 515);
  
  //BOUTON Multi13
  fill(0, 0, 0, 70);
  rect(750, 400, 150, 75, 25);
  stroke(255, 255, 0);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //TEXTE Multi3
  fill(0, 255, 255, 175);
  textSize(30);
  text("Bonus 3", 770, 370);
  fill(0, 255, 255);
  text("+300", 775, 450);
  textSize(25);
  fill(255, 200, 0);
  text("500€", 795, 515);
}
PImage espace;
PImage titre;

public void afficherMenu(){
  background(10, 20, 40);
  image(espace, 0, 0);
  image(titre, 330, 200);

  //BOUTON PLAY
  fill(0, 0, 0, 70);
  //la quatrième valeur du fill correspond à l'opacité
  //Forme des boutons
  rect(525, 422.5f ,150, 75, 25);
  stroke(0, 0, 70, 40);
  strokeWeight(2.0f);
  strokeCap(ROUND);
    
  //BOUTON MAGASIN
  fill(0, 0, 0, 70);
  rect(525, 522.5f ,150, 75, 25);
  stroke(0, 0, 70, 40);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //BOUTON EXIT
  fill(0, 0, 0, 70);
  rect(525, 622.5f ,150, 75, 25);
  stroke(0, 0, 70, 40);
  strokeWeight(2.0f);
  strokeCap(ROUND);
  
  //TEXTE PLAY
  fill(0, 255, 255, 175);
  textSize(40);
  text("PLAY", 550, 475); 
  
  //TEXTE MAGASIN
  fill(0, 255, 255, 175);
  textSize(40);
  text("SHOP", 550, 575);
  
  //TEXTE EXIT
  fill(0, 255, 255, 175);
  textSize(40);
  text("EXIT", 560, 675);
}
class Meteor{
  float x;
  float y;
  float z;
  
  Meteor(){
    x = random(-width, width);
    y = random(-height, height);
    z = random(width);
  }
  
  public void wp(){
    z = z - speed/1.5f;
    if (z < 1) {
      z = width;
      x = random(-width, width);
      y = random(-height, height);
      
      x = random(-180, 180);
      y = random(-180, 180);
    }
  }
  
  public void me(){
    //couleur METEORITES
    fill(255, 50, 0);
    //Pas de contour 
    noStroke();
    
    //Apparition aléatoire des météorites
    float sx = map(x / z, 0, 1, 0, width);
    float sy = map(y / z, 0, 1, 0, height);
    
    float r = map(z, 0, width, 260, 0);
    
    //Forme des météorites
    ellipse(sx, sy, r, r); 
  }
}
  public void settings() {  size(1200, 900, P3D); }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "Univers_7" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}
