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 greedWays = new ArrayList(); 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; } }