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

import ddf.minim.*; 

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

Personnage pers1;


Minim minim;
AudioPlayer flipflop;

Bot [] tabBot = new Bot[100];

int compteur = 0;
int compteurBot = 0;

PImage theme;
PImage menu;
PImage fin;

float ecran = 0;
float chrono = 0;
float chrono2 = 0;


public void setup ()
{
  

// loadImage me permet de charger les fond d'écran 
//resize pour les mettre en plein écrans
  theme = loadImage ("fond.png");
  theme.resize ( width, height);
  menu = loadImage ("Menu.png");
  menu.resize (width, height);
  fin = loadImage ("ecranfin.png");
  fin.resize (width, height);

// La fonctionnalité minim me permet de mettre la musique de fond
  minim = new Minim (this);
  flipflop = minim.loadFile ("1 Hour - YV - Lune NCS Release.mp3");
  pers1 = new Personnage();
  flipflop.play();
 
// C'est la fonction qui permet de faire créé des wejdenes 
  for ( int i = 0; i < tabBot.length; i = i+1) {
    
    tabBot [i] = new Bot();
  }
  
}


public void draw ()
{

//  Ceci est l'écran d'accueil
  if ( ecran == 0 ) {
    image ( menu, 0, 0);    
    
  }
  
// Ceci est l'écran de jeu
  if ( ecran == 1 ) {
    image (theme, 0, 0);

//affichage du chrono au milieu de l'écran
    chrono ++;
    textAlign ( CENTER,CENTER );
    fill ( 136, 0, 27 );
    textSize ( 40 );
    text ( chrono/60, width/2, height/2); 
    
    pers1.afficherPersonnage();
    
    for ( int i = 0; i < compteurBot; i = i+1) {
      tabBot[i].afficherBot();
      tabBot[i].deplacementBot();
      tabBot[i].orientationBot();
      
// C'est la fonction qui permet de faire la collision entre wejdene et m.salle
      float r = collision(tabBot[i].xBot, tabBot[i].yBot, pers1.xPers, pers1.yPers);
    
      if(r < 80)
      {
        ecran = 2; 
      }
    }
    
    if ( chrono2 < 60 ){
      chrono2 ++;
      
    }
    else {
      chrono2 = 0;
      for ( int i = 0; i < tabBot.length; i = i+1)
        tabBot[i].vitesseBot =  tabBot[i].vitesseBot + 0.07f;
    }
  }


 
// Ceci est l'écran de mort
  if ( ecran == 2) {
    image ( fin, 0, 0);
    fill (136, 0, 27);
    textSize(21);
    text ( chrono/60, 1142, height/2);
    for ( int i = 0; i < compteurBot; i = i+1){
    
      tabBot[i].remise0();    
    }
    compteurBot = 1;
  }

// Cela permet de faire bouger un wejdene toutes les 120s
  compteur = compteur + 1;
    if (( compteur > 120 ) && ( ecran == 1 )){
      compteur = 0;
      compteurBot = compteurBot + 1;
    }
}
  
// keyPressed permet de faire bouger m.salle avec les touches zqsd ou les flèches directionnelles 
public void keyPressed() {
 if ( (keyCode == 'Z') || ( keyCode == UP ) ){

   pers1.avant();
 }
 
 if ( ( keyCode == 'S') || ( keyCode == DOWN ) ){
   
   pers1.arriere();
 }
 
 if ( ( keyCode == 'D') || ( keyCode == RIGHT ) ){ 
   
   pers1.droite();
 }
 
 if ( ( keyCode == 'Q') || ( keyCode == LEFT ) ){  
   
   pers1.gauche();
 }
 
// Si on appui sur entrer alors le jeu commence
 if (( key == ENTER ) && (ecran == 0)) {
   ecran = 1;
 }
 
// Si on appui sur r alors le jeu recommence
 if ( ecran == 2 ){
   if (key == 'r'){
   ecran = 0;
   chrono = 0;
   }
}
}
class Bot{
  // Variable pour le Bot
  float xBot;
  float yBot;
  
  float angleBot;
  float vitesseBot;
  
  PImage wejdene;
  
  int numero;
  
  
  Bot(){
    xBot = random(-50, width + 50);
    vitesseBot = 0.5f;
    angleBot = 0;
    wejdene = loadImage ("zombie_wejdene.V2.png"); 
    
    
    
    if ( xBot < 0 ){
      yBot = random( 0, height);
    }
    
    if ((xBot > 0) && (xBot < width)){
      
      int x = PApplet.parseInt (random ( 0, 10));
      if ( x < 5 ){
        yBot = random ( -50, 0);
      }
      else{
        yBot = random ( height, height + 50);
      }
    }
  
    if ( xBot > width ){
     yBot = random ( 0, height);
    }
    
  }
    public void remise0 () {
      
      xBot = random(-50, width + 50);
    vitesseBot = 1;
    angleBot = 0;
    
    
    
    if ( xBot < 0 ){
      yBot = random( 0, height);
    }
    
    if ((xBot > 0) && (xBot < width)){
      
      int x = PApplet.parseInt (random ( 0, 10));
      if ( x < 5 ){
        yBot = random ( -50, 0);
      }
      else{
        yBot = random ( height, height + 50);
      }
    }
  
    if ( xBot > width ){
     yBot = random ( 0, height);
    }
    
    
    
    
    }
  
    public void afficherBot ()
  {
      imageMode(CENTER);
      pushMatrix(); // Toute information du repère
      translate(xBot, yBot); 
      //rotate(radians(angleBot) - PI/2); // orientation du robot sur le personnage
      image ( wejdene, 0, 0);
      popMatrix(); // restaure les information du repère
      imageMode(CORNER);

  }
  
    public void orientationBot ()
  {
    if (yBot < pers1.yPers)
    {
      angleBot = 90-atan((xBot - pers1.xPers) / (yBot - pers1.yPers))*180/PI; // Au dessus du Bot
    }
    else
    {
      angleBot = 270-atan((xBot - pers1.xPers) / (yBot - pers1.yPers))*180/PI; // En dessous du Bot
    }
  
  }
  public void deplacementBot()
  {
    xBot += cos(PI * angleBot / 180)*vitesseBot;
    yBot += sin(PI * angleBot / 180)*vitesseBot;
  }
}
public float collision(float posxbot, float posybot, float posxpers, float posypers)
{
  float r = dist(posxbot, posybot, posxpers, posypers);
  return r;
}
class Personnage {

  float xPers;
  float yPers;
  
  float anglePers;
  float vitessePers;
  
  PImage prof;
  
  Personnage(){
    xPers = PApplet.parseInt ( random ( 1, width -1 ));
    yPers = PApplet.parseInt ( random ( 1, height - 1 ));
    vitessePers = 8;
    anglePers = 0;
    prof = loadImage ("david_salle_v2.png");
  }
  
  public void avant ()
    {
   
      if ( yPers - 80 > 0 ) {          
         yPers -= vitessePers; 
      }

   }
  
  public void arriere  ()
    {
      if ( yPers < height - 78) {
        yPers += vitessePers;
      }
   }
   
  public void gauche ()
    {
      if ( xPers - 59 > 0 ) {
        xPers -= vitessePers;
      }
  }
  
  public void droite ()
    {
      if ( xPers <= width - 70) {
        xPers += vitessePers;
      }
  }
  
  public void afficherPersonnage (){
    
    imageMode(CENTER);
    image ( prof, xPers, yPers);
     
   }


}
  public void settings() {  fullScreen (); }
  static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "jeux_aide_salle_a_fuir_wejdene" };
    if (passedArgs != null) {
      PApplet.main(concat(appletArgs, passedArgs));
    } else {
      PApplet.main(appletArgs);
    }
  }
}
