// Graal v1.3 NPC by Stefan Knorr
if (created) {
  // Initialize the attributes
  showcharacter;
  setcharprop #3,head3.gif;
  setcharprop #8,body4.png;
  setcharprop #C0,darkred;
  setcharprop #C1,blue;
  setcharprop #C2,gray;
  setcharprop #C3,brown;
  setcharprop #C4,lightblue;
  setcharprop #2,compus-shield.gif;
  shieldpower = 1;
  dir = 2;
  swordpower = 1;
  hurtdx = 0;
  hurtdy = 0;
  hearts = 4;
}

if (playerenters || wasthrown) {
  // Initialize the this. variables
  message;
  this.huntspeed = 0.4;
  dirgo = {0,-1,-1,0,0,1,1,0};
  timeout = 0.05;
  if (hearts<=0) {
    this.mode = 5; // RESPAWN
    this.runcounter = 0;
    timeout = 5;
  } else {
    this.mode = 0;
    sprite = 0;
    this.runcounter = int(random(10,40));
  }
}

// Sword attacking stuff
if (timeout && (this.mode==0 || this.mode==2)) {
  // Look for players
  mindist = 1000;
  for (i=0; i<playerscount; i++)
      if (players[i].hearts>0 && players[i].id>=0) {
    dx = players[i].x - x;
    dy = players[i].y - y;
    if (abs(dx)>abs(dy)) {
      if (dx>0) pdir=3; else pdir=1;
    } else {
      if (dy>0) pdir=2; else pdir=0;
    }
    if (pdir==dir) {
      dist = (dx*dx+dy*dy)^0.5;
      if (dist<mindist) {
        cansee = 1;
        if (abs(dx)>abs(dy)) k = int(abs(dx));
        else k = int(abs(dy));
        for (j=0; j<=k-2; j++)
          if (onwall(x+1.5+dx*j/k,y+2+dy*j/k)) cansee = 0;
        if (cansee!=0) {
          mindist = dist;
          aimplayer = i;
          this.aimx = players[i].x;
          this.aimy = players[i].y;
        }
      }
    }
  }
  if (mindist<=3) {
    this.runcounter = -1;
    this.mode = 3; // SLAYING
    sprite = 9;
    timeout = 0.05;
  } else if (mindist<20) {
    if (this.mode!=2) message Halt!;
    this.runcounter = 100;
    this.mode = 2; // HUNTING
  } else timeout = 0.05;
}
if (timeout && this.mode==3) { // SLAYING
  this.runcounter++;
  if (this.runcounter>4) {
    this.runcounter = 100;
    this.mode = 2; // HUNTING
    sprite = 0;
  } else {
    sprite = 9+this.runcounter;
  }
  message;
  timeout = 0.05;
}
if (timeout && this.mode==2) { // HUNTING
  sprite = (sprite%8)+1;
  this.runcounter--;
  if (this.runcounter>0 && aimplayer<playerscount && players[aimplayer].hearts>0) {
    // Get new direction
    dx = players[aimplayer].x-x;
    dy = players[aimplayer].y-y;
    if (abs(dx)>abs(dy)) {
      if (dx>0) dir=3; else dir=1;
    } else {
      if (dy>0) dir=2; else dir=0;
    }

    // Test if we can do a step
    dx = this.aimx-x;
    dy = this.aimy-y;
    if (abs(dx)<=1 && abs(dy)<=1) {
      this.aimx = players[aimplayer].x;;
      this.aimy = players[aimplayer].y;
      dx = this.aimx-x;
      dy = this.aimy-y;
    }
    if (abs(dx)>abs(dy)) {
      if (dx>0) testdir=3; else testdir=1;
    } else {
      if (dy>0) testdir=2; else testdir=0;
    }
    len = (dx*dx+dy*dy)^0.5;
    addx = (dx/len)*this.huntspeed;
    addy = (dy/len)*this.huntspeed;
    testx = x + 1.5;
    testy = y + 2;
    if (!onwall(testx+addx,testy+addy)) {
      // Do a step
      x += addx;
      y += addy;
   } else if (!onwall(testx+addx,testy)) x += addx;
   else if (!onwall(testx,testy+addy)) y += addy;
  } else {
    this.mode = 0; // WALKING
    this.walkmode = 1; // RANDOM
    this.runcounter = int(random(10,40));
    sprite = 0;
    dir = (dir+2)%4;
    message;
  }
  timeout = 0.05;
}

// Hurting stuff
if (washit && this.mode!=1 && hearts>0) {
  dx = x-playerx;
  dy = y-playery;
  len = (dx*dx+dy*dy)^0.5;
  hurtdx = dx/len;
  hurtdy = dy/len;
  sprite = 39;
  hideimg 1;
  hearts -= playerswordpower/2;
}
if ((exploded || waspelt || wasshot) &&
    this.mode!=1 && hearts>0 && isleader) {
  hurtdx = -dirgo[dir*2]*0.2;
  hurtdy = -dirgo[dir*2+1]*0.2;
  sprite = 39;
  if (peltwithsign || peltwithvase || peltwithstone || peltwithnpc) hearts -= 1;
  else if (peltwithblackstone) hearts -= 1.5;
  else hearts -= 0.5;
}
if ((hurtdx!=0 || hurtdy!=0) && isleader && this.mode!=4) {
  this.hurtdx = hurtdx;
  this.hurtdy = hurtdy;
  hurtdx = 0;
  hurtdy = 0;
  this.mode = 1; // HURTED
  this.runcounter = 20;
  sprite = 39;
  if (hearts<=0) {
    this.mode = 4; // DYING
    this.runcounter = 24;
    sprite = 0;
  }
  timeout = 0.05;
}
if (timeout && this.mode==1) { // HURTED
  this.runcounter--;
  if (this.runcounter>10) {
    testx = x + 1.5 + this.hurtdx*2;
    testy = y + 2+ this.hurtdy*2;
    if (!onwall(testx,testy)) {
      x += this.hurtdx;
      y += this.hurtdy;
    }
  }
  if (this.runcounter<=0) {
    if (swordpower>0) this.mode = 2; // HUNTING
    else this.mode = 0; // WALKING
    this.runcounter = 100;
    sprite = 0;
  }
  timeout = 0.05;
}
if (timeout && this.mode==4) { // DYING
  if (this.runcounter>0) {
    message;
    if ((this.runcounter%2)==0) dir = (dir+3)%4;
    this.runcounter--;
    if (this.runcounter<=0) {
      sprite = 40;
      play compudead.wav;
      dontblock;
      i = random(0,100);
      if (i<10) lay greenrupee;
      else if (i<15) lay bluerupee;
      else if (i<30) lay heart;
      sleep 3;
      destroy;
    } else timeout = 0.05;
  }
}
