boolean boss_d_ou_g = false;
int boss_bouge = 800;
int boss_y = 171;
int boss_vitesse = 8;
boolean collision_laser = false;
float boss_cooldown = 5;
float boss_time;
int boss_stop = 4;
int pv_baseboss = 5;
int boss_pv = pv_baseboss;
int Xa, Xb, Xc, Ya, Yb, Yc, Xd, Yd, Xe, Ye;
float time_game = millis()/1000;
float ABC, DBC, ACB, DCB, EBC, ECB;
int H_jpv = 25, W_jpv = 650, x_jpv, y_jpv = 20;
int largeur_bar_vie_T = W_jpv;
int largeur_bar_vie_cible = W_jpv;
boolean invincible = false, son_Laser = false, clignote = false;
int invisi_time = 1000; // temps de d'invincibilité en millisecondes (2 secondes)
int deta_time, time_inv_boss;
int deta_cligno_time = 150; // temps de clignotage en millisecondes
int time_cligno_boss;

void boss() {
  
  time_game = millis()/1000;
  println("second : "+ time_game);
  println("boss_time + boss_cooldown : " + boss_time + boss_cooldown);
  if (boss_time + boss_cooldown < time_game && !invincible){
    boss_vitesse = 0;
    image(laserboss1, boss_bouge, 380 + boss_y);
    //joue le son du laser une seul fois
    if(!son_Laser){
      son_Laser = true;
      sonLaser_boss.play();
    }
    //calcul dimension laser:
    //coordonnées point haut
    Xa = boss_bouge;
    Ya = -100 + boss_y;
    
    Xb = boss_bouge - 566;
    Yb = -100 + boss_y + 981;
    
    Xc = boss_bouge + 566;
    Yc = Yb;
      
    //triangle(Xa, Ya, Xb, Yb, Xc, Yc);
    
    //coordonnées base du vaisseau:
    Xd = x - 100;
    Yd = y + 100;
    
    Xe = x + 100;
    Ye = Yd;
    
    //calcul des angles
    ABC = acos( ( ((Xc-Xb)*(Xa-Xb)) + ((Yc-Yb)*(Ya-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xa-Xb)+sq(Ya-Yb)) ) );
    ACB = ABC;
    //println("ABC : "+ ABC); 
    //DBC = acos( ( ((Xc-Xb)*(Xd-Xb)) + ((Yc-Yb)*(Yd-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xd-Xb)+sq(Yd-Yb)) ) );
    DCB = acos( ( ((Xb-Xc)*(Xd-Xc)) + ((Yb-Yc)*(Yd-Yc)) )/( sqrt(sq(Xb-Xc)+sq(Yb-Yc)) * sqrt(sq(Xd-Xc)+sq(Yd-Yc)) ) );
    EBC = acos( ( ((Xc-Xb)*(Xe-Xb)) + ((Yc-Yb)*(Ye-Yb)) )/( sqrt(sq(Xc-Xb)+sq(Yc-Yb)) * sqrt(sq(Xe-Xb)+sq(Ye-Yb)) ) );
    //println("DCB : "+ DCB + " /  EBC : "+ EBC);
    
    //line(Xd, Yd, Xe, Ye);
    //println("Xb, Xe : " + Xb + " <> " + Xe);
    //test collisions avec le laser:
    if (EBC > ABC || ACB < DCB) {
      collision_laser = false;
    } else { 
      collision_laser = true;
      ship.collision = true;
      println("collision : " + collision_laser);
    }
  
    
    // boucle fin d'attaque
    if (boss_time + boss_cooldown + boss_stop  < time_game){
      boss_cooldown = random(1, 7);
      boss_vitesse = 8;
      boss_time = time_game;
      son_Laser = false;  
    }
    
    //println("boss_time + boss_cooldown + boss_stop : "+ boss_time + boss_cooldown + boss_stop);
  }
  
  if(!clignote){
    image(imgboss1, boss_bouge, boss_y);
  }
  
  if (boss_d_ou_g == true){ //si le boss vas vers la gauche
    if (boss_bouge > 0){ //si le boss il n'est pas tout a gauche
      boss_bouge -= boss_vitesse; //on le fais aller a gauche
    } else { //sinon
      boss_d_ou_g = false; //on lui dit d'aller a gauche
    }
  }
  
  if (boss_d_ou_g == false && boss_bouge < width){
    boss_bouge += boss_vitesse;
  } else {
    boss_d_ou_g = true;
  }



  
  //largeur en pixels en fonction des pv courants du boss
  largeur_bar_vie_cible = W_jpv * boss_pv / pv_baseboss;
  println ("T : " + largeur_bar_vie_T + "    C : " + largeur_bar_vie_cible);
  
  if (time_inv_boss + deta_time <= millis()){
    if (largeur_bar_vie_T > largeur_bar_vie_cible){
      largeur_bar_vie_T -- ;
      invincible = true;
    } else {  
      invincible = false; 
    } 
    time_inv_boss = millis();
  }
  
  // clignotement :
  if (invincible && time_cligno_boss + deta_cligno_time <= millis()) {
    time_cligno_boss = millis();
    clignote = !clignote;
  } else if (!invincible) {
    clignote = false;
  }
  
  //jauge des pv du boss
  x_jpv = width/2-W_jpv/2;
  fill(255, 255, 255, 40);
  noStroke();
  rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2);
  fill(#AE0202, 230);
  noStroke();
  rect(  
        x_jpv + (W_jpv - largeur_bar_vie_T)/2, // coordonnées X de la bar de vie 
        y_jpv, // coordonnées Y de la bar de vie 
        largeur_bar_vie_T,
        H_jpv, // hauteur de la bar de vie
        H_jpv / 2 // pour arrondir les angles de la bar de vie du boss
      );
  fill(255);
  textSize(H_jpv / 1.5);
  textAlign(CENTER, CENTER);
  text(boss_pv + " / " + pv_baseboss , x_jpv + W_jpv / 2    , y_jpv + H_jpv /2);
  textAlign(LEFT, BOTTOM);
  textSize(12);
  strokeWeight(2);
  stroke(#ffffff);
  noFill();
  rect(x_jpv, y_jpv, W_jpv, H_jpv, H_jpv / 2);  
  fill(255, 255, 255);
  strokeWeight(1);
  stroke(#000000);
  
  if ( dist(ship.x, ship.y, boss_bouge, boss_y) < 200 ) { 
    // en gros le vaisseau éclate quand il touche le boss
    ship.collision = true;
  } else {
    //si le missile est en contact avec le boss et qu'il n'est pas invincible le boss perd un point de vie 
    if ( dist(xm, ym, boss_bouge, boss_y) < 114 && !invincible ){
      boss_pv = boss_pv - 1;
      sonCollision.play(); 
      time_inv_boss = time_cligno_boss = millis();
      //calcul delai en miliseconds pour chaque pixels a supprimer de la bars de vie en fonction du temps d'invincibilité du boss
      // temps / pixels a suprimmer de la barre :
      deta_time = invisi_time / (W_jpv - (W_jpv * boss_pv / pv_baseboss));
      //println("boss_pv : " + boss_pv + "  ::   deta_time : " + deta_time);
      lancermisile = false;
      clignote = false;
    } 
  }   
}
