Sun sun;
Hero minion;
Gold nugget;

int many=10;
float[] a = new float[many];

Dog dog1;
Dog dog2;

int pack=7;
Dog[] kennel=  new Dog[pack];


Monster blue;
float horizon;
int score=0;
int Mscore=0;


void setup()
{
  size(800, 550);
  horizon=  height / 1.85;
  
  for( int j=0; j<many; j++) {
    a[j]=  random(1000);
  }

  

  smooth();


  sun= new Sun (color(255, 177, 8), 0, height*3, 0);
  minion=new Hero (height/2, width/2); 
  nugget= new Gold(height/2, width/2);
  dog1= new Dog(color(185, 154, 86), 0, 0, 60, 30, 20, 20);
  dog2= new Dog(color(185, 108, 86), 0, 0, 20, 10, 40, 40);

  for (int j=0; j<pack; j++ ) {
    kennel[j]=  new Dog(
      color(random(200), random(200), random(200)), 0, 0, random(30), 10, 40, 40 );
  }


  blue= new Monster(0, 0);
}


void draw()
{
  scene();
  sun.sunmove();

  setting();
  blue.monshow();
  minion.minmove();
  minion.minshow();
  blue.monmove();
  
  hounds();
}

void hounds() {
  dog1.dogshow();
  dog1.dogmove();
  dog2.dogshow();
  dog2.dogmove();

  for (int j=0; j<pack; j++ ) {
    kennel[j].dogshow();
    kennel[j].xDog += j;
    if (kennel[j].xDog > width) kennel[j].xDog=0;
    kennel[j].yDog++;
    if (kennel[j].yDog > height) kennel[j].yDog=0;
}


  nugget.nugshow();
  nugget.nugchase();
  msg();
  out();
  
  text( a[0], 50, 50 );
}


void scene()
{
  background( 150, 120, 255 );              // Sky Purple.
  sun.sunshow();
  spiral();
  fill( 100, 235, 200 );                    // Mint
  noStroke();
  rectMode( CORNER );
  rect( 0, horizon, width, height );
}

void setting()


/////House

{ 
  fill( 250, 100, 0 );                // Orange
  rectMode (CENTER);
  rect( 335, horizon-40, 150, 130, 7 );       
  fill( 129, 3, 26);                // Maroon
  triangle( 235, horizon-100, 435, horizon-100, 335, horizon-200 );
  /////Window 1
  fill(255, 255, 255);                
  rect(290, horizon-70, 40, 40, 7);
  /////Window 2
  fill(255, 255, 255);                
  rect(380, horizon-70, 40, 40, 7);
  /////Door
  fill(0);                
  rect(335, horizon-8, 55, 65, 7);


  /////Trees

  fill(103, 79, 65);                 //Trunk1
  rectMode (CENTER);
  rect(500, horizon-30, 20, 60);

  fill(124, 209, 107);               //Leaf1
  ellipseMode(CENTER);
  ellipse(500, horizon-70, 50, 80); 


  fill(103, 79, 65);                 //Trunk3
  rectMode (CENTER);
  rect(560, horizon-30, 20, 60);

  fill(104, 129, 57);               //Leaf3
  ellipseMode(CENTER);
  ellipse(560, horizon-70, 50, 80); 

  fill(103, 79, 65);                 //Trunk2
  rectMode (CENTER);
  rect(530, horizon-30, 20, 60);

  fill(184, 229, 157);               //Leaf2
  ellipseMode(CENTER);
  ellipse(530, horizon-70, 50, 80); 


  fill(103, 79, 65);                 //Trunk4
  rectMode (CENTER);
  rect(100, horizon-30, 40, 60);

  fill(55, 216, 24);                  //Leaf4
  triangle(50, horizon-55, 100, horizon-125, 150, horizon-55);
  triangle(50, horizon-85, 100, horizon-140, 150, horizon-85);
  triangle(55, horizon-110, 100, horizon-165, 145, horizon-110);
}

void spiral() {


  fill(255, 255, 0);
  int nbr_circles = 100;
  float angle_incr = radians(2 + frameCount/15.0);
  float outer_rad = 120*.45;
  float sm_diameter = 4;

  for (int i = 1; i <= nbr_circles; ++i) {
    float ratio = i/(float)nbr_circles;
    float spiral_rad = ratio * outer_rad;
    float angle = i*angle_incr;
    float x = sun.sunX + cos(angle) * spiral_rad;
    float y = sun.sunY + sin(angle) * spiral_rad;

    // draw tiny circle at x,y
    ellipse(x, y, sm_diameter, sm_diameter);
  }
}

/////Trees


class Sun {

  color c;
  float sunX, sunY;
  float sunset;

  Sun(color tempC, float tempsunX, float tempsunY, float tempsunset) {
    c= tempC;
    sunX= tempsunX;
    sunY= tempsunY;
    sunset= tempsunset;
  }


  void sunshow() {

    ellipseMode(CENTER);                      ///Yellow Sun
    fill(c);
    noStroke();
    ellipse( sunX, sunY, 90, 90 );
  }
  void sunmove() {

    if (sunX > width) {
      sunX=  0;
    }
    sunX=(sunX + 1);
    sunset=(150 + cos(sunX*.007)*125);
    sunY=(sunset);
  }
}

class Hero {

  float xMin; 
  float yMin;
  Hero(float tempxMin, float tempyMin) {
    xMin=tempxMin;
    yMin=tempyMin;
  }  
  void minshow()
  {
    rectMode(CENTER);
    noStroke();
    fill(351, 255, 26);
    rect( xMin, yMin, 75, 100); //body
    arc( xMin, yMin-50, 75, 75, PI, TWO_PI); //head

    noFill();
    stroke(0);
    arc( xMin, yMin, 30, 30, HALF_PI, PI);  //mouth

    fill(255);
    stroke(0);
    ellipse( xMin-15, yMin-50, 30, 30) ;    //eyes
    ellipse( xMin+15, yMin-50, 30, 30);
    fill(0);
    ellipse( xMin-10, yMin-50, 14, 14);     //eye balls
    ellipse( xMin+10, yMin-50, 14, 14);

    textSize(15);                              //name
    fill(106, 255, 234);
    text("Minion", xMin-20, yMin+45);
  }  

  void minmove() {
    minion.xMin=  minion.xMin  +  (nugget.nugX-minion.xMin) / 55;
    minion.yMin=  minion.yMin  +  (nugget.nugY-minion.yMin) / 55;
  }
}
class Gold {
  float nugX;
  float nugY;
  Gold(float tempnugX, float tempnugY) {
    nugX=tempnugX;
    nugY=tempnugY;
  }
  void nugshow()
  {
    float nugR; 
    float nugG; 
    float nugB;
    nugR=random(255);
    nugG=random(255);
    nugB=random(255);
    noStroke();
    ellipseMode(CENTER);
    fill(nugR, nugG, nugB);
    ellipse(nugX, nugY, 25, 25);
    ellipse(nugX-17, nugY, 12, 10);
    ellipse(nugX+17, nugY, 12, 10);
    ellipse(nugX, nugY-17, 10, 12);
    ellipse(nugX, nugY+17, 10, 12);
  }
  void nugchase() {

    if (dist(minion.xMin, minion.yMin, nugX, nugY) < 25) {   ///Minion chasing nugget
      nugX= random(10, 650);
      nugY = random(10, 400);
      score = score+1;
    }
  }
}
class Dog {
  color c;
  float xDog;
  float yDog;
  float dxDog;
  float dyDog;
  float wDog;
  float hDog;

  Dog(color tempC, float tempxDog, float tempyDog, float tempwDog, float temphDog, float tempdxDog, float tempdyDog) {
    c = tempC;
    xDog=tempxDog;
    yDog=tempyDog;
    dxDog=tempdxDog;
    dyDog=tempdyDog;
    wDog=tempwDog;
    hDog=temphDog;
  }

  void dogshow() {
    stroke(0);
    fill(c);
    rectMode(CORNER);
    rect(xDog, yDog, wDog, hDog);
    fill(255, 0, 0);
  }
  void dogmove() {
    xDog=  xDog  +  (minion.xMin-100-xDog) / dxDog;
    yDog=  yDog  +  (minion.yMin-yDog) / dyDog;
    if (xDog < 0) {
      xDog=0;
    }
    if (nugget.nugX-minion.xMin>=0) {
      fill(c);
      rect(xDog+wDog, yDog-hDog/2, wDog/2, hDog);//head
      fill(255, 255, 255);
      ellipse(xDog+wDog+wDog/6, yDog-hDog/4, wDog/6, wDog/6);
      ellipse(xDog+wDog+wDog/3, yDog-hDog/4, wDog/6, wDog/6);
      fill(0);
      line(xDog, yDog, xDog-hDog/1.5, yDog-hDog/2);//tail 
      line(xDog+wDog, yDog+hDog, xDog+wDog/1.5, yDog+hDog*1.5); //1leg
      line(xDog, yDog+hDog, xDog-wDog/3, yDog+hDog*1.5);  //2leg
    }
    if (nugget.nugX-minion.xMin<=0) {
      fill(c);
      rect(xDog-wDog/2, yDog-hDog/2, wDog/2, hDog);//head
      fill(255, 255, 255);
      ellipse(xDog-wDog+wDog*0.85, yDog-hDog/4, wDog/6, wDog/6);
      ellipse(xDog-wDog+wDog/1.5, yDog-hDog/4, wDog/6, wDog/6);
      fill(0);
      line(xDog+wDog, yDog, xDog+hDog*3, yDog-hDog/2);//tail 
      line(xDog+wDog, yDog+hDog, xDog+wDog*1.5, yDog+hDog*1.5); //1leg
      line(xDog, yDog+hDog, xDog+wDog*0.5, yDog+hDog*1.5);  //2leg
    }
  }
}

class Monster {

  float xMon; 
  float yMon;
  Monster(float tempxMon, float tempyMon) {
    xMon=tempxMon;
    yMon=tempyMon;
  }  
  void monshow()
  {
    fill(0);
    ellipse(xMon, yMon, 225, 225);
    fill(20, 100, 150);
    noStroke();
    ellipse(xMon, yMon, 200, 200);

    ellipseMode(CENTER);
    fill(225);
    stroke(0);
    strokeWeight(3);
    ellipse(xMon-30, yMon+45, 15, 25);
    ellipse(xMon-15, yMon+45, 15, 25);
    ellipse(xMon, yMon+45, 15, 25);
    ellipse(xMon+15, yMon+45, 15, 25);
    ellipse(xMon+30, yMon+45, 15, 25);


    strokeWeight(3);
    line(xMon-45, yMon+45, xMon+42, yMon+45);
    line(xMon-45, yMon+45, xMon-55, yMon+60);
    line(xMon+42, yMon+45, xMon+52, yMon+60);
    //block
    noStroke();
    fill(20, 100, 150);
    rect(xMon, yMon+19, 100, 51);
    //chin shadow
    fill(20, 80, 130);
    ellipse(xMon, yMon+75, 80, 10);

    //nose - top
    fill(70);
    triangle(xMon-30, yMon+15, xMon, yMon, xMon+30, yMon+15);
    //main nose
    fill(30);
    triangle(xMon-30, yMon+15, xMon, yMon+40, xMon+30, yMon+15);
    fill(20, 100, 150);
    //bloking
    ellipse(xMon-10, yMon+30, 10, 15);
    ellipse(xMon+10, yMon+30, 10, 15);

    //eyes - shadow
    fill(20, 80, 130);
    ellipse(xMon-40, yMon-35, 80, 80);
    ellipse(xMon+40, yMon-35, 80, 80);
    //eyes
    //stroke(30);
    fill(255);
    ellipse(xMon-40, yMon-35, 60, 60);
    ellipse(xMon+40, yMon-35, 60, 60);
    noStroke();
    fill(20, 150, 100);
    ellipse(xMon-25, yMon-35, 30, 30);
    ellipse(xMon+25, yMon-35, 30, 30);
    //color
    fill(20);
    ellipse(xMon-25, yMon-35, 20, 20);
    ellipse(xMon+25, yMon-35, 20, 20);
    strokeWeight(1);
  }

  void monmove()
  {
    blue.xMon=  blue.xMon  +  (minion.xMin-blue.xMon) / 125;
    blue.yMon=  blue.yMon  +  (minion.yMin-blue.yMon) / 125;

    if (dist(blue.xMon, blue.yMon, minion.xMin, minion.yMin) < 50) {   ///Minion chasing nugget
      constrain(xMon, 0, width);
      constrain(yMon, 0, height);
      xMon= random(10, 750);
      yMon = random(10, 500);
      minion.xMin= random(10, 750);
      minion.yMin = random(10, 500);
      Mscore = Mscore+1;
    }
  }
}

void mousePressed() {          ///nug appears on click
  nugget.nugX= mouseX;
  nugget.nugY= mouseY;
}
void out() {                        //// quit after 10 times the creature eats the nugget
  if (score==20 || Mscore==20 || key=='q') {
    exit();
  }
}
void msg()
{
  textSize(22);
  fill(250, 250, 250);
  text( "Proyect 2.", width/50, 20 );
  text( "=)", width/20, 45 );
  fill( 0, 0, 0 );
  text( "Abel Cruz", 10, height-10 );
  textSize(20);
  fill(250, 50, 0);
  text("Minion "+  score, width-200, horizon-220);
  text("Monster "+  Mscore, width-200, horizon-180);
}  
