//// Dymon Harris CST 112

/// Globals 

String title= " MidtermM2";
String help= "Click to shoot cue ball. \n 'r' key to reset, 'q to quit. \n 'w' to remove wall. hold 'm' for mouse. \n 'c' to change color of table. click any ball to reset it.";
String news= help;
String author= "Dymon Harris";

int score=0,m=0,k=0;
int r,g,b;
float button1X=150, button1Y=40, button1W=80, button1H=40;
float button2X=600, button2Y=40, button2W=80, button2H=40;
float button3X=450, button3Y=40, button3W=80, button3H=40;
float button0X=28, button0Y=20, button0W=55, button0H=40;
float up, right, down, left;
float center;
float mright, mleft;

float whiteX, whiteY, whiteDX, whiteDY;
float blueX, blueY, blueDX, blueDY;
float redX, redY, redDX, redDY;
float orangeX, orangeY, orangeDX, orangeDY;
float greenX, greenY, greenDX, greenDY;

boolean wall=true;



/// Values
void setup() {
  size( 700, 500 );
  right= width-94;
  left=  105;
  up=  120;
  down= height-80;
  center= left + (right-left) / 2;
  mleft= 370;
  mright= 340;
  
  reset();
}


void reset() {
  whiteX= left + (right-left) / 4;
  whiteY= up + (down-up) / 2;
  whiteDX= whiteDY=0;
  mleft= 370;
  mright= 340;
  wall = true;
  r= 0;
  g= 150;
  b= 100;
  
  blueX= random( center,right );  blueY= random( up, down );
  redX= random( center,right );  redY= random( up, down );
  orangeX= random( center,right );  orangeY=random( up, down );
  greenX= random( center,right );  greenY= random( up, down );
  whiteX= random( mright,left );  whiteY= random( up, down );
  
  blueDX= random( 1,3 );  blueDY= random( 1,3 );
  redDX= random ( 1,3 );  redDY= random( 1,3 );
  orangeDX= random ( 1,3 );  orangeDY= random( 1,3 );
  greenDX= random ( 1,3 );  greenDY= random( 1,3 );
  whiteDX= random( 1,3 );  whiteDY= random( 1,3 );
}

void whitereset() {
  whiteX= random( mright,left );  whiteY= random( up, down );
  whiteDX= random( 1,3 );  whiteDY= random( 1,3 );
}

void bluereset() {
  blueX= random( center,right );  blueY= random( up, down );
  blueDX= random( 1,3 );  blueDY= random( 1,3 );
}

void redreset() {
  redX= random( center,right );  redY= random( up, down );
  redDX= random ( 1,3 );  redDY= random( 1,3 );
}

void orangereset() {
  orangeX= random( center,right );  orangeY=random( up, down );
  orangeDX= random ( 1,3 );  orangeDY= random( 1,3 );
}

void greenreset() {
  greenX= random( center,right );  greenY= random( up, down );
  greenDX= random ( 1,3 );  greenDY= random( 1,3 );
}

//// NEXT FRAME:  table, bounce off walls, collisions, show all
void draw() {
  background ( 150,200,250 );
  rectMode(CENTER);
  table ( left, up, right, down );
  bounce();
  collisions();
  show();
  messages();
   fill( 170,200,255 );
  showButton( "Reset", button1X, button1Y, button1W, button1H );
   fill( 170,200,255 );
  showButton( "Color", button2X, button2Y, button2W, button2H );
   fill( 170,200,255 );
  showButton( "Wall", button3X, button3Y, button3W, button3H );
   fill( 170,200,255 );
  showButton( "Quit", button0X, button0Y, button0W, button0H );
}


//// SCENE:  draw the table with walls
void table( float left, float up, float right, float down ) {
  fill( r,g,b );
  strokeWeight(15);
  stroke( 200,200,200 );
  rect( 355,270,545,345 );
  stroke(0);
  strokeWeight(8);


    if (!wall) {
    float center= left + (right-left) / 2;    
    line( 0,0,0,0 );
  }
  
    if (wall) {
    float center= left + (right-left) / 2;    
     line( 355,415,355,125 );
  }
}
void showButton( String s, float x, float y, float w, float h ) {
  rect ( x,y, w,h );
  fill(0);
  text( s, x-15, y+5 );
}
//// ACTION:  bounce off walls, collisions
void bounce() {
// Blue Ball Collision w. wall
   blueX += blueDX;  if ( blueX<mleft || blueX>right ) blueDX *= -1;
  blueY += blueDY;  if ( blueY<up || blueY>down ) blueDY *=  -1;
//  Red Ball Collision w. wall
  redX += redDX;  if ( redX<mleft || redX>right ) redDX *= -1;
  redY += redDY;  if ( redY<up || redY>down ) redDY *=  -1;
//  Orange Ball Collision w. wall
  orangeX += orangeDX;  if ( orangeX<mleft || orangeX>right ) orangeDX *= -1;
  orangeY += orangeDY;  if ( orangeY<up || orangeY>down ) orangeDY *=  -1;
//  Green Ball Collision w. wall
  greenX += greenDX;  if ( greenX<mleft || greenX>right ) greenDX *= -1;
  greenY += greenDY;  if ( greenY<up || greenY>down ) greenDY *=  -1;
//  White Ball Collision w. wall
  whiteX += whiteDX;  if ( whiteX<left || whiteX>mright ) whiteDX *= -1;
  whiteY += whiteDY;  if ( whiteY<up || whiteY>down ) whiteDY *=  -1;
}



/// Collisions between other balls
void collisions() {
  float right,left;
  
  if  (dist( blueX, blueY, redX, redY ) < 30 ) {
    right=redDX;  redDX=blueDX;  blueDX=right;
    left=redDY;  redDY=blueDY; blueDY=left;
  }
  
  if (dist( blueX, blueY, orangeX, orangeY ) < 30 ) {
    float orangeY=orangeDX;  orangeDX=blueDX; blueDX=orangeY;
    float redY=orangeDY;  orangeDY=blueDY;  blueDY=redY;
  }
  
  if (dist( blueX, blueY, greenX, greenY ) < 30 ) {
    float greenY=greenDX;  greenDX=blueDX; blueDX=greenY;
    float redY= greenDY;  greenDY= blueDY;  blueDY=redY;
  }
  
  if  (dist( whiteX, whiteY, blueX, blueY ) < 30 ) {
    right=blueDX;  blueDX=whiteDX;  whiteDX=right;
    left=blueDY;  blueDY=whiteDY; whiteDY=left;
  }
  
   if  (dist( whiteX, whiteY, redX, redY ) < 30 ) {
    right=redDX;  redDX=whiteDX;  whiteDX=right;
    left=redDY;  redDY=whiteDY; whiteDY=left;
  }
  
   if  (dist( whiteX, whiteY, orangeX, orangeY ) < 30 ) {
    right=orangeDX;  orangeDX=whiteDX;  whiteDX=right;
    left=orangeDY;  orangeDY=whiteDY; whiteDY=left;
  }
  
   if  (dist( whiteX, whiteY, greenX, greenY ) < 30 ) {
    right=greenDX;  greenDX=whiteDX;  whiteDX=right;
    left=greenDY;  greenDY=whiteDY; whiteDY=left;
  }
  
    if  (dist( redX, redY, orangeX, orangeY ) < 30 ) {
    right=orangeDX;  orangeDX=redDX;  redDX=right;
    left=orangeDY;  orangeDY=redDY; redDY=left;
  }
  
  if  (dist( redX, redY, greenX, greenY ) < 30 ) {
    right=greenDX;  greenDX=redDX;  redDX=right;
    left=greenDY;  greenDY=redDY; redDY=left;
  }
  
  if  (dist( orangeX, orangeY, greenX, greenY ) < 30 ) {
    right=greenDX;  greenDX=orangeDX;  orangeDX=right;
    left=greenDY;  greenDY=orangeDY; orangeDY=left;
  }
}
  
 
  
 /* 
 float tmp,up,down,blueX=0;
  if (dist( whiteX, whiteY, blueX, blueY ) < 60 ) {
    up=blueDX;  blueDX=whiteDX;  whiteDX=up;
    down=blueDY;  blueDY=whiteDY;  whiteDY=down;
  }
  
  if (dist( whiteX, whiteY, redX, redY ) < 59 ) {
    blueX=redDX;  redDX=whiteDX;  whiteDX=blueX;
    blueX=redDY;  redDY=whiteDY;  whiteDY=blueX;
  }
  
  if (dist( whiteX, whiteY, orangeX, orangeY ) < 61 ) {
    tmp=orangeDX;  orangeDX=whiteDX;  whiteDX=tmp;
    tmp=orangeDY;  orangeDY=whiteDY;  whiteDY=tmp;
  }
}
*/



//// SHOW:  balls, messages
void show() {
  strokeWeight(1);
  fill( 0,0,200 );    ellipse( blueX,blueY, 30,30 );
  fill( 150,0,0 );  ellipse( redX,redY, 30,30 );
  fill( 225,100,0 );    ellipse( orangeX,orangeY, 30,30 );
  fill( 255 );    ellipse( whiteX,whiteY, 30,30 );
  fill(0,150,0);  ellipse( greenX,greenY, 30,30);

}
void messages() {
  fill(0);
  text( title, width/3, 20 );
  text( news, width/3, 42 );
  text( author, 10, height-11 );
}

int mx=0;


void leg( float x, float y, float toe ) {
      line( x,y, x+toe,y+10 );
}
void rat( float mx ) {
    
    fill(110);
    noStroke();
    ellipse( mx+70,height-60, 40,18 );
    ellipse( mx+90,height-70, 20,10 );

    strokeWeight(3);
    stroke(0);
    line( mx+55,height-65, mx+45,height-80 );    // Tail.

    
    // LEGS....
    float toe=5;
    if (k/15 % 2 > 0) toe=  -5;
    leg( mx+56,height-52, toe);                    // animated legs!
    leg( mx+64,height-52, toe);
    leg( mx+80,height-52, toe);
    leg( mx+88,height-52, toe);
    strokeWeight(1);
}  
//// HANDLERS:  keys, click
void keyPressed() {
  if (key == 'r') {
    reset();
  }
  if (key == '+') { blueDX *=2; blueDY *=2; }
  if (key == '-') { blueDX /=2; blueDY /=2; }
  
  if (key == 'c') {  r= int( random(100,255)); 
                     g= int( random(100,200)); 
                     b= int( random(100,230));}
                     
  if (key == 'w') { mleft = left; mright = right; wall = false; }
  if (key == 'q') {
    exit();
  }
  if (key == 'm') { 
    mx += 7;
    if (mx>width) mx=8;    
    rat( mx );
  }
}

void mousePressed() {
 float force=  dist( mouseX,mouseY, whiteX,whiteY ) / 20;

  
   if ( hit( mouseX,mouseY, button1X,button1Y, button1W,button1H ) ) {
      reset();
   }
   if ( hit( mouseX,mouseY, button2X,button2Y, button2W,button2H ) ) {
       r= int( random(100,255)); 
       g= int( random(100,200)); 
       b= int( random(100,230));
   }
  
  if ( hit( mouseX,mouseY, button3X,button3Y, button3W,button3H ) ) {
  { mleft = left; mright = right; wall = false; }
  }
  if ( hit( mouseX,mouseY, button0X,button0Y, button0W,button0H ) ) {
      exit();
   }
   if ( hit( mouseX,mouseY, whiteX,whiteY, 30,30  ) ) {  whitereset(); }
   if ( hit( mouseX,mouseY, blueX,blueY, 30,30  ) ) {  bluereset(); }
   if ( hit( mouseX,mouseY, redX,redY, 30,30  ) ) {  redreset(); }
   if ( hit( mouseX,mouseY, orangeX,orangeY, 30,30  ) ) { orangereset(); }
   if ( hit( mouseX,mouseY, greenX,greenY, 30,30  ) ) {  greenreset(); }
}


boolean hit( float x1, float y1, float x2, float y2, float w, float h ) {
  boolean result;

  // +++++ STUB ALWAYS RETURNS TRUE!
  if ( abs(x1-x2) < w && abs(y1-y2)<h ) {
    result=  true;
  } else {
    result=false;
  }
  return result;
}





