> show canvas only <


/* built with Studio Sketchpad: 
 *   https://sketchpad.cc
 * 
 * observe the evolution of this sketch: 
 *   https://studio.sketchpad.cc/sp/pad/view/ro.qG4qR9RwqPa/rev.154
 * 
 * authors: 
 *   Nikhil S
 *   
 *   

 * license (unless otherwise specified): 
 *   creative commons attribution-share alike 3.0 license.
 *   https://creativecommons.org/licenses/by-sa/3.0/ 
 */ 



float posX;
float posY;

float[] eX;
float[] eY;
int numberEnemies;

float[] pX;
float[] pY;

float speed;
float angle;

boolean dead = true;

PFont font;
int score;

boolean powerup = false;
boolean pickedPowerup = false;
int numberPowerups = 20;
int[] powerupType;
int pickedPowerupType;

boolean killMode = false;
int startKillTime;
PVector enemyColour = new PVector(0,0,0);

float FPS;
int ticks;
float FPSinterval1, FPSinterval2;

public void setup() {

  background(0);
    size(480,320);
  posX = width/2;
  posY = height/2;

  fill(0, 0, 0, 100);
  font = loadFont("Arial.vlw"); 
  textFont(font, 20); 

numberEnemies = 0;

  speed = 2.3f;
 enemyColour = new PVector(0,0,0);

  if (!dead) {
    generateEnemies();
  }

}

public void generateEnemies() {
    numberEnemies += 10;
  eX = new float[numberEnemies];
  eY = new float[numberEnemies];

  for (int i = 0; i < numberEnemies; i+=1) {
    {
      eX[i] = int(random(-1000, 1000));
      eY[i] = int(random(-1000, 1000));
      while (abs (eX[i] - posX) < 150) {
        eX[i] = int(random(-1000, 1000));
        eY[i] = int(random(-1000, 1000));
      }
    }
  }

  generatePowerups();
}

public void generatePowerups() {
  pX = new float[numberPowerups];
  pY = new float[numberPowerups];
  powerupType= new int[numberPowerups];

  for (int i = 0; i < numberPowerups; i+=1) {
    {
      powerupType[i] = int(random(0, 3));
      if (powerupType[i] >2) {
        powerupType[i] = 2;
      }
      pX[i] = int(random(-800, 600));
      pY[i] = int(random(-800, 600));
    }
  }
}

public void draw() {

  strokeWeight(6);
  stroke(0);
  if (!dead) {

    if(millis() % 1000 == 0){
ticks = 0;
    }
    else
    {
  ticks+=1;
    }

    
    FPS = ticks/millis();
    imageMode(CENTER);
    background(255);

    //ORANGE background(255,140,20);
    fill(0, 0, 0, 40);
    text("score: "+score, 15, 50);
    //text(FPS+"FPS", 15, 70); 
    //text(pickedPowerupType, 15, 100);
    fill(170);
    stroke(240,140,20);
    ellipse(posX, posY, 10, 10);


      stroke(200, 0, 0, sqrt(sq(mouseX - posX) + sq(mouseY - posY)));
      line(posX, posY, mouseX, mouseY);
      stroke(0);

    if (pickedPowerup) {
      fill(240, 0, 0, 80);
    }
    rect(0, height -50, 50, 50);


    fill(enemyColour.x, enemyColour.y, enemyColour.z);

    for (int i = 0; i < numberEnemies; i+=1) { //DRAWING THE ENEMIES
      {
          stroke((sqrt(sq(eX[i]-posX)+sq(eY[i]-posY))),0,0);
        ellipse(eX[i], eY[i], 10, 10);
        stroke(0);
      }
    } 
    controller();
    powerups();
    if (killMode) {
      killModeRun();
    }
    collisions();
    enemyMovement();
     if (score % 1000 == 0) {
    generateEnemies();
  }
    score++;
  }
  else
  {
    background(245);
    menu();
  }
}

public void controller() {
      if (posY < mouseY) {
        posX += speed * sin(atan((mouseX - posX)/(mouseY - posY)));
        posY += speed * cos(atan((mouseX - posX)/(mouseY - posY)));
  
      }
      if (posY > mouseY) {
        posX -= speed * sin(atan((mouseX - posX)/(mouseY - posY)));
        posY -= speed * cos(atan((mouseX - posX)/(mouseY - posY)));
  
      }

      if (keyPressed) {
        if (keyCode == SHIFT)
        {
          if (pickedPowerup) {
            powerup =true;
            width = 1000;
          }
        }
     }




}

public void powerups() {

  //GENERATING POWERUPSSSSS
  if (score % 300 == 0) {
    generatePowerups();
  }

  for (int i = 0; i < numberPowerups; i+=1) {//DRAW POWERUPS
    {
      switch(powerupType[i])
      {
      case 0:
        fill(240, 140, 20);
        stroke(240, 140, 20,50);
        ellipse(pX[i], pY[i], 6, 6);
        fill(0);
        break;
      case 1:
        fill(20, 140, 240);
        stroke(20, 140, 240,50);
        ellipse(pX[i], pY[i], 6, 6);
        fill(0);
        break;
      case 2:
        fill(0, 240, 20);
        stroke(0, 240, 20, 50);
        ellipse(pX[i], pY[i], 6, 6);
        fill(0);
        break;
      }
    }
  } 

  if (powerup) {
    //GENERATE BLAST
    switch(pickedPowerupType) {
    case 0:
      fill(240, 140, 20, 40);
      ellipse(posX, posY, 200, 200);
      generateEnemies();
      score += 50;
      powerup = false;
      pickedPowerup = false;
      break;
    case 1:
      killMode = true;
      startKillTime = score;
      powerup = false;
      pickedPowerup = false;
      break;
    case 2:
      fill(0, 240, 20, 40);
      ellipse(posX, posY, 200, 200);
      generateEnemies();
      score += 50;
      powerup = false;
      pickedPowerup = false;
      break;
    case 3:
      break;
    }
  }
}

public void killModeRun() {
  if (score < startKillTime + 300) {
    enemyColour = new PVector(250, 0, 0);
    enemyColour.z = abs(-(startKillTime + 300) + score);
    powerup = false;
    pickedPowerup = false;
  }
  else
  {
    killMode = false;
     enemyColour = new PVector(0, 0, 0);
    pickedPowerupType = 0;
  }
}

public void enemyMovement() {
  if (!killMode) {
    for (int i = 0; i < numberEnemies; i+=1) {
      if (eY[i] < posY) {
        eX[i] += speed * 0.85f * sin(atan((posX - eX[i])/(posY - eY[i])));
        eY[i] += speed* 0.85f * cos(atan((posX - eX[i])/(posY - eY[i])));
      }
      if (eY[i] > posY) {
        eX[i] -= speed * 0.85f * sin(atan((posX - eX[i])/(posY - eY[i])));
        eY[i] -= speed * 0.85f * cos(atan((posX - eX[i])/(posY - eY[i])));
      }
    }
  }
  else
  {
    for (int i = 0; i < numberEnemies; i+=1) {
      if (eY[i] < posY) {
        eX[i] -= speed * 0.25f * sin(atan((posX - eX[i])/(posY - eY[i])));
        eY[i] -= speed* 0.25f * cos(atan((posX - eX[i])/(posY - eY[i])));
      }
      if (eY[i] > posY) {
        eX[i] += speed * 0.25f * sin(atan((posX - eX[i])/(posY - eY[i])));
        eY[i] += speed * 0.25f * cos(atan((posX - eX[i])/(posY - eY[i])));
      }
    }
  }
}

public void collisions() {
  if (!killMode) {
    for (int i = 0; i < numberEnemies; i+=1) {//ENEMIEHS
      {
        if (eX[i] > posX-5 & eX[i] < posX+5) {
          if (eY[i] > posY-5 & eY[i] < posY+5) {
            dead = true;
          }
        }
      }
    }
  }
  else
  {
    for (int i = 0; i < numberEnemies; i+=1) {//KILL MODE!!!!!!!!!!!!!!!
      {
        if (eX[i] > posX-10 & eX[i] < posX+10) {
          if (eY[i] > posY-10 & eY[i] < posY+10) {
            eX[i] = random(-1000, 1000);
            eY[i] = random(-1000, 1000);
            score += 150;
          }
        }
      }
    }
  }
  //BOUNDING THE PLAYER
  if (posX<0) {
    posX=2;
  }
  if (posY<0) {
    posY=2;
  }
  if (posX>width) {
    posX=width-2;
  }
  if (posY>height) {
    posY=height-2;
  }

  //PICKUPS
  for (int i = 0; i < numberPowerups; i+=1) {
    {
      if (pX[i] > posX-6 & pX[i] < posX+6) {
        if (pY[i] > posY-6 & pY[i] < posY+6) {
          pickedPowerup = true;
          pickedPowerupType = powerupType[i];
          generatePowerups();
        }
      }
    }
  }
}

public void menu() {
  background(255);
  fill(0);
  textFont(font, 126);
  text("dont", 0, 100);
  fill(150, 0, 0);
  text("die.", 0, 226);
  textFont(font, 20);
  fill(0, 0, 0, 50);
  textFont(font, 45);
  fill(0);
  text("START", 0, (height-20));
  textFont(font, 20);
  fill(50);
  text("previous score: ", 0, height);
  textFont(font, 64);
  fill(0);
  text(score, width/3, height);
  textFont(font, 20);
  fill(0);

if(mousePressed) {
 if(mouseX < 300 && mouseY > (height-50) && mouseY < height) {
   dead = false;
   score = 0;
   posX = width/2;
   posY = height/2;
   numberEnemies= 0;
   generateEnemies();
 } 
}
}