PImage breastpic[] = new PImage[100];

HashSet breasts = new HashSet();
int WIN = 100;

int BEFOREGAME = 0;
int DURINGGAME = 1;
int AFTERGAME = 2;

int gamestate = BEFOREGAME;



float PADDLESIZE = 60;
float PADDLETOP = 260;
float PADDLEHEIGHT = 20;

float counter;
float counterresetval = 40;
int lives;
int score = 0;




void setup(){
  size(300,300);
  for(int i = 1; i <= 100; i++){
    breastpic[i-1] = loadImage("Image"+i+".jpg");
  }

  textFont(loadFont("Arial-Black-14.vlw"),14);
  textAlign(CENTER);
  framerate(60);
}


void addBreast(){
  breasts.add(new breastclass(150,0,random(4)-2,random(5)+.5)); 
}

void mouseReleased(){
   if(gamestate == BEFOREGAME || gamestate == AFTERGAME){
      score = 0;
      lives = 3;
      counterresetval = 40;
      gamestate = DURINGGAME;
        breasts.clear();
        addBreast();
        
   } 
   
}

void draw(){
  background(255); 


  if(gamestate == DURINGGAME){

    PADDLETOP = mouseY;
    if(PADDLETOP < 200) PADDLETOP = 200;

    counter--;
    if(counter <= 0){
      counter = counterresetval;
      //counterresetval -= 1;
      addBreast();
    }

    Iterator i = breasts.iterator();
    while(i.hasNext()){
      breastclass breast = (breastclass)i.next();
      breast.move();
      breast.checksides();
      breast.checkhit();
      breast.show();
      
      if(breast.toolow()){
        i.remove();
                  lives--; 
      }
      if(breast.toohigh()){
        i.remove();
      }
    }

    /*
     */
    noStroke();
    fill(0);
    rect(mouseX - (PADDLESIZE/2), PADDLETOP, PADDLESIZE, PADDLEHEIGHT);

    text("score:"+score+"    lives"+lives, 150,290);
  
    if(score >= WIN || lives <= 0){
       gamestate = AFTERGAME; 
    }
  
  }

  


  if(gamestate==BEFOREGAME){
     fill(0);
     
     text("BREASTPONG",150,100);
     text("score 100 points,",150,200);
     text("see 100 breasts!",150,220);
     
     text("click to play!",150,270);
     

  }
  if(gamestate==AFTERGAME){

    if(score < WIN){
      fill(0);
      text("YOU LOSE!!!!",150,100);

      text("click to try again",150,220);
    } else {
      for(int i = 0; i < 100; i++){
     image(breastpic[i], 30*(i / 10), 30*(i % 10));
     }
    }
  }
}
//----------------------------------------------------------------
class breastclass{
  boolean up = false;
  float x,y,xs,ys;
  PImage img;
  breastclass(float px, float py, float pxs,float pys){
    int number =  int(random(100))+1;
    String imagefile = "Image"+number+".jpg";
    img = loadImage(imagefile);
    x = px;
    y = py;
    xs = pxs;
    ys = pys;
  }

  void show(){
    image(img,x,y);
  }

  boolean checkhit(){
    if(
    overlap(x,x+30,mouseX - (PADDLESIZE/2),mouseX + (PADDLESIZE/2))
      &&
      overlap(y,y+30,PADDLETOP,PADDLETOP+PADDLEHEIGHT)
      ){
      ys = -1 * abs(ys);
      if(!up){
        up = true;
        score++; 
      }
      return true; 
    }
    return false;
  }

boolean toohigh(){
   return y < -30; 
}
boolean toolow(){
   return y > 300; 
}

  void checksides(){
    if(x < 0){
      x = 0;
      xs *= -1;        
    } 
    if(x > 270){
      x = 270;
      xs *= -1;        
    } 
  }

  void move(){
    x+=xs;
    y+=ys;
  } 


}



boolean overlap(float line1val1,float line1val2,float line2val1,float line2val2){
  float line1min = (line1val1 < line1val2)?line1val1:line1val2;
  float line1max = (line1val1 > line1val2)?line1val1:line1val2;
  float line2min = (line1val1 < line2val2)?line2val1:line2val2;
  float line2max = (line1val1 > line2val2)?line2val1:line2val2;

  if(line1min < line2min && line1max < line2min){
    return false; 
  }
  if(line1min > line2max && line1max > line2max){
    return false; 
  }  


  return true;
}