class Enemy extends Twofer{
  PImage img0;
  PImage img1;
  PImage currImg;
  int speed;
  int thisguy;
  int moveCounter;
  Ladder homeLadder;
  boolean grabbing = false;
  
  Treasure wantedTreasure;
   Enemy(int px, int py, Ladder pLadder, int level){
     super(px,py);
     thisguy = round(random(1,16));
     img0 = loadImage("enemies/e_"+thisguy+"_0.png");
     img1 = loadImage("enemies/e_"+thisguy+"_1.png");
     currImg = img0;
     
     float lowerSpeedRange = 40 - 7 * level;
     if(lowerSpeedRange < 3) lowerSpeedRange = 3;

     float higherSpeedRange = 40 - 2 * level;
     if(lowerSpeedRange < 10) lowerSpeedRange = 10;
     
     
     speed = round(random(lowerSpeedRange/2,higherSpeedRange/2)); //lower the faster
     
     moveCounter = round(random(1,speed));
     homeLadder = pLadder;
     
     if(treasures.size() > 0){
          int r = int(random(treasures.size()));
          wantedTreasure = treasures.get(r);
     }
  }

  void draw(){
      image(currImg, (x * SQUARESIZE)-3,(y * SQUARESIZE));
  }
  
  void eaten(){
    if(grabbing) wantedTreasure.grabbed = false;
    grabbing = false; 
  }
 
   void tryToMove(){
     moveCounter--; 
     if(moveCounter <= 0){
          moveCounter = speed;
          
          // reset the current image value so that it looks animated.
          if (currImg == img0) {
            currImg = img1;
          }
          else {
            currImg = img0;
          }

          int wantDir = int(random(4)) + 37;
          
          ArrayList<Integer> greedWays = new ArrayList<Integer>();
          if(grabbing){
               if(x < homeLadder.x) greedWays.add(new Integer(RIGHT));
               if(x > homeLadder.x) greedWays.add(new Integer(LEFT));
               if(y < homeLadder.y) greedWays.add(new Integer(DOWN));
               if(y > homeLadder.y) greedWays.add(new Integer(UP));
          } else {
            if(wantedTreasure != null && ! wantedTreasure.grabbed){
               if(x < wantedTreasure.x) greedWays.add(new Integer(RIGHT));
               if(x > wantedTreasure.x) greedWays.add(new Integer(LEFT));
               if(y < wantedTreasure.y) greedWays.add(new Integer(DOWN));
               if(y > wantedTreasure.y) greedWays.add(new Integer(UP));
            } else {
               if(x < GRIDSIZE/2) greedWays.add(new Integer(RIGHT));
               if(x > GRIDSIZE/2) greedWays.add(new Integer(LEFT));
               if(y < GRIDSIZE/2) greedWays.add(new Integer(DOWN));
               if(y > GRIDSIZE/2) greedWays.add(new Integer(UP));
              
            }
        }
      
          //pick a greedy way to go if we have some
            if(greedWays.size() > 0 && random(100) < 90){
              int r = int(random(greedWays.size()));
              Integer IntDir = greedWays.get(r);
              wantDir = IntDir.intValue();
             }
          
          if(canMove(wantDir)){
            xy offset = dirToXY(wantDir);
            x += offset.x;
            y += offset.y;
          } 
          
          if(grabbing){
            wantedTreasure.x = x;
            wantedTreasure.y = y+1;
          }
          
          
          if(grabbing){
           if(x == homeLadder.x && y == homeLadder.y){
             fxGemLoss();
              happyRobbers.add(this); 
           }
          } else {
            //see if they have grabbed the treasure!!!)
             if(wantedTreasure != null &&  ! wantedTreasure.grabbed){
                if(isIn(wantedTreasure.x,wantedTreasure.y)){
                    wantedTreasure.x = x + 1; 
                    grabbing = true;
                    fxHaha();
                }
             }
          }
        }
       
   }
    
    
  boolean canMove(int dir){
     xy p1 = null;
     xy p2 = null;
     
     switch(dir){
       case UP:
         p1 = new xy(x,y-1);  
         p2 = new xy(x+1,y-1);  
       break;
       case DOWN:
         p1 = new xy(x,y+2);  
         p2 = new xy(x+1,y+2);         
       break;
       case LEFT:
         p1 = new xy(x-1,y);  
         p2 = new xy(x-1,y+1);         
       break;
       case RIGHT:
         p1 = new xy(x+2,y);  
         p2 = new xy(x+2,y+1);         
       break;
       

     }
       if(p1 != null && p2 != null){
      /*  fill(200,0,0,100);
        rect(p1.x*SQUARESIZE,p1.y*SQUARESIZE,SQUARESIZE,SQUARESIZE);
        rect(p2.x*SQUARESIZE,p2.y*SQUARESIZE,SQUARESIZE,SQUARESIZE);*/
        
        if(snake.isOnSnake(p1) || snake.isOnSnake(p2)){
           return false; 
        }
        if(wallThere(p1.x,p1.y) || wallThere(p2.x,p2.y) ){
          
          boolean itsOkItsALadder = false;
          for(Ladder test : ladders){
             if(test.isIn(p1.x,p1.y)&& test.isIn(p2.x,p2.y)){
               itsOkItsALadder = true;
             }
          } 
          if(! itsOkItsALadder) {
              return false; 
          }
        }
        for(Enemy e: enemies){
          if(e.isIn(p1.x,p1.y) || e.isIn(p2.x,p2.y) ){
            return false;
          }
        }

    }     
     
   return true;
  }

}






abstract class Twofer{
  int x, y;
  Twofer(int px, int py){
     x = px;
     y = py;
  } 
  
  void draw(){
     fill(200,200);
     noStroke();
    rect(x*SQUARESIZE,y*SQUARESIZE,2*SQUARESIZE,2*SQUARESIZE); 
  }
  
  boolean isIn(int px, int py){
    for(int a = 0; a < 2; a++){
       for(int b = 0; b < 2; b++){
          if(x + a  == px && y + b == py){
             return true; 
          }
       }
    }
  
    return false;
  }  
}