import java.util.LinkedList;

LinkedList spots = new LinkedList();
int maxSpots = 5;
int lastX;
int lastY;

void setup() {
  size(800,600);
  smooth();
  background(180);
  lastX = -1;
  lastY = -1;
}

void draw() {
  if (mousePressed == true) {
    if (lastX == -1) {
      lastX = mouseX;
      lastY = mouseY;
    } else {
      stroke(255,63);
      strokeWeight(2);
      line(mouseX, mouseY, lastX, lastY);
      lastX = mouseX;
      lastY = mouseY;
    }
  }
  if (spots.size() > 1) {
    if (random(0,100) < 10) {
      Spot a = (Spot)spots.get( (int)random(spots.size()) );
      Spot b = (Spot)spots.get( (int)random(spots.size()) );
      int w=20;
      float x1 = a.x + random(-w,w);
      float y1 = a.y + random(-w,w);
      float x2 = b.x + random(-w,w);
      float y2 = b.y + random(-w,w);
      stroke(0,30);
      strokeWeight(1);
      noFill();
      line(x1,y1,x2,y2);
    }
  }
  if (spots.size() > 0 && random(0,100) < 20) {
    Spot a = (Spot)spots.get( (int)random(spots.size()) );
    ellipseMode(CENTER);
    fill(180);
    noStroke();
    ellipse(a.x, a.y, 10, 10);
  }
}

void mousePressed() {
  spots.addFirst(new Spot(mouseX, mouseY));
  if (spots.size() > maxSpots) {
    Spot a = (Spot)spots.getLast();
    ellipseMode(CENTER);
    fill(180);
    noStroke();
    ellipse(a.x, a.y, 10, 10);
    spots.removeLast();
  }
}

void mouseReleased() {
  lastX = -1;
  lastY = -1;
  mousePressed();
}

class Spot {
  float x;
  float y;
  
  Spot(float newX, float newY) {
    x = newX;
    y = newY;
  }
}

void keyPressed() {
  if (key == 's' || key == 'S') { // save an image
    save("CE2-drawing-" + year() +"-"+ month() +"-"+ day() +"-" + hour() +"-" + minute() + ".png");
  } 
  else if (key == ENTER) {
    background(180);
  }
}
