boolean chase;
float midX, midY;
int i;
final static int SIZE=300;
final static int HOWMANY=20;

final static int DARK = 32;
final static int LIGHT = 222;


int bg = DARK;

fairysnake fs[] = new fairysnake[HOWMANY];
void setup(){
  size(300,300); //SIZE
  midX = SIZE/2;
  midY = SIZE / 2;
    
   for(int i = 1; i < HOWMANY; i++){
    fs[i] = new fairysnake(i,random(SIZE/6, SIZE*5/6),random(SIZE/6, SIZE*5/6),i - 1);//(int)random(HOWMANY)
    
   }
  fs[0] =  new fairysnake(-1,random(SIZE/6, SIZE*5/6),random(SIZE/6, SIZE*5/6),HOWMANY-1);
}

void loop(){
  background(64);
  for(int i = 0; i < HOWMANY; i++){
    fs[i].move();
    fs[i].show();
   }
}

void mousePressed(){
   midX = mouseX;
    midY = mouseY;
    chase = true;  
}
void mouseReleased(){
  chase = false;  
}

void mouseDragged(){
  if(mousePressed) {
    midX = mouseX;
    midY = mouseY;
  
    }

}


class fairysnake {
  final static int SEGCOUNT = 30;
  final static float SPEEDVAL = .3;
    float x[] = new float[SEGCOUNT]; 
  float y[] = new float[SEGCOUNT]; 
  float xspeed, yspeed;
  float mR,mG,mB;
  
  public float getPointX(){
      return x[SEGCOUNT-1];
  }
  public float getPointY(){
      return y[SEGCOUNT-1];
  }
  int  loverid;
  int id; 
  fairysnake(int inid, float inx, float  iny, int  inloverid){
  id = inid;
        loverid = inloverid;
        for(int i = 0; i < SEGCOUNT; i++){
      x[i] = inx;
      y[i] = iny;
  
      mR = random(128,255);  
      mG = random(128,255);  
      mB = random(128,255);  
     }
  }
  
  void move(){
    for(i = SEGCOUNT - 1; i >= 1; i--){
      x[i] = x[i-1];
      y[i] = y[i-1];
    }
//    xspeed += random(-SPEEDVAL,SPEEDVAL);  
//    yspeed += random(-SPEEDVAL,SPEEDVAL);  
    



  
    if(x[0] < midX){
      xspeed += SPEEDVAL;
    } else{
      xspeed -= SPEEDVAL;
    }
    if(y[0] < midY){
      yspeed += SPEEDVAL;
    } else{
      yspeed -= SPEEDVAL;
    }
  
  
  if(! chase){
    if(x[0] < fs[loverid].getPointX()){
      xspeed += SPEEDVAL;
    } else{
      xspeed -= SPEEDVAL;
    }
    if(y[0] < fs[loverid].getPointY()){
      yspeed += SPEEDVAL;
    } else{
      yspeed -= SPEEDVAL;
    }
  }


        
    x[0] += xspeed;
    y[0] += yspeed;
    
    if(x[0] < 0){
      x[0] = 0;
      xspeed *= -.5;
    }
    if(y[0] < 0){
      y[0] = 0;
      yspeed *= -.5;
    }
    if(x[0] > SIZE-1){
      x[0] = SIZE-1;
      xspeed *= -.5;
    }
    if(y[0] > SIZE-1){
      y[0] = SIZE-1;
      yspeed *= -.5;
    }
    
    
  }

  void show(){

    for(i = 0; i < SEGCOUNT - 1; i++){
    //stroke(255 - (i * (255/SEGCOUNT)));
    strokeWeight(SEGCOUNT - i); //not 
        stroke(
      mR - (i * (mR/SEGCOUNT)),
      mG - (i * (mG/SEGCOUNT)),
      mB - (i * (mB/SEGCOUNT))
    );

//      println(i+"::"+x[i] +"," + y[i]+"---" + x[i+1] +"," + y[i+1]);
      line(x[i],y[i],x[i+1],y[i+1]);
    }
//    println("----");
  }

}