Hi! Great AI code! But it's not Actionscript, although the langauge is VERY similar. It's also VERY long. Tell me if you have problems with anything, and tell me what you think abotu the code.

Let me explain a few things:

"%" stands for mod which works like this a%b and returns the remainder of a / b. eg. 10%3 = 1

Built for a level that is 64 by 64, but that can be changed

the random works like this random(a,b), it returns a floating point >= a and < b.

playerscount is the ammount of players in the room.

onwall is like a hit detection for walls.
the command is:
if (onwall(x,y)) {
blah();
}

"^" is equal to power
eg. 9^.5=3

setcharani is a command that set the characters animation. This can easily be changed to gotoAndStop("moving") or whatever.

The properties are set up like this:
players[index].property,the properties used in this code are id (which is either 0 or 1, if it's 0 it's a baddy, of it's 1 it's a human player), and hearts (how many hearts the player has). The properties of the NPC that has the code are simply x, y, dir (ranges from 0 to 3), ect.

Timeout is a countdown (makes a very good loop)
eg.
if (playerenters) {
timeout = 0.05;
}
if (timeout) {
stuff();
timeout = 0.05;
}

There are many flags there are set by the game, ie playerenters, playertouchsme, wasthrown, ect. They're pretty self explanatory.

the message command print something above the NPCs head.

Well.... here we go!

Code:
if (created) {
  // Initialize the attributes
  showcharacter;
  setcharprop #3,head735.gif;
  setcharprop #C0,orange;
  setcharprop #C1,white;
  setcharprop #C2,blue;
  setcharprop #C3,red;
  setcharprop #C4,black;
  setcharprop #2,shield1.gif;
  shieldpower = 1;
  dir = 2;
  swordpower = 1;
  hurtdx = 0;
  hurtdy = 0;
  hearts = 3;
}
if (playerenters || wasthrown) {
  // Initialize the this. variables
  message;
  this.huntspeed = 0.5;
  dirgo = {0,-1,-1,0,0,1,1,0};
  timeout = 0.05;
  this.walkmode = 1;
  if (wasthrown && this.walkmode>1) this.walkmode = 1;
  this.x1 = 0;
  this.x2 = 63;
  this.y1 = 0;
  this.y2 = 63;
  this.speed = 0.4;
  if (hearts<=0) {
    this.mode = 5; // RESPAWN
    this.runcounter = 0;
    timeout = 5;
  } else {
    this.mode = 0;
    setcharani idle,;
    this.runcounter = int(random(10,40));
  }
}

// Walking stuff
if (timeout && this.mode==0) { // WALKING
  setcharani walk,;
  newx = x + dirgo[dir*2] * this.speed;
  newy = y + dirgo[dir*2+1] * this.speed;
  this.runcounter--;
  if (this.walkmode==1) { // RANDOM
    if (this.runcounter>0) {
      testx = newx + 1.5 + dirgo[dir*2];
      testy = newy + 2+ dirgo[dir*2+1];
      if (onwall(testx,testy)) {
        dir = (dir+2)%4;
        this.runcounter = int(random(0,60));
      } else {
        x = newx;
        y = newy;
      }
    } else {
      this.runcounter = int(random(10,40));
      dir = (dir+1+int(random(0,2))*2)%4;
    }
  } else if (this.walkmode==2) { // LEFTRIGHT
    if (dir!=1 && dir!=3) dir = 3;
    else {
      x = newx;
      y = newy;
      if ((dir==1 && x<=this.x1) || (dir==3 && x>=this.x2))
        dir = (dir+2)%4;
    }
  } else if (this.walkmode==3) { // UPDOWN
    if (dir!=0 && dir!=2) dir = 2;
    else {
      x = newx;
      y = newy;
      if ((dir==0 && y<=this.y1) || (dir==2 && y>=this.y2))
        dir = (dir+2)%4;
    }
  } else if (this.walkmode==4) { // RECTANGLE
    x = newx;
    y = newy;
    if ((dir==0 && y<=this.y1) || (dir==1 && x<=this.x1) ||
        (dir==2 && y>=this.y2) || (dir==3 && x>=this.x2))
      dir = (dir+3)%4;
  }
  if (this.walkmode>1 && this.runcounter<=0)
    this.runcounter = 20;
  message;
  timeout = 0.05;
}

// Sword attacking stuff
if (timeout && (this.mode==0 || this.mode==2)) {
  // Look for players
  mindist = 1000;
  for (index=0; index<playerscount; index++)
      if (players[index].hearts>0 && players[index].id>=0) {
    dx = players[index].x - x;
    dy = players[index].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 = index;
          this.aimx = players[index].x;
          this.aimy = players[index].y;
        }
      }
    }
  }
  if (mindist<=3) {
    this.runcounter = -1;
    this.mode = 3; // SLAYING
    setcharani sword,;
    timeout = 0.05;
  } else if (mindist<20) {
    if (this.mode!=2) message Stop!;
    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
    setcharani idle,;
  }
  message;
  timeout = 0.05;
}
if (timeout && this.mode==2) { // HUNTING
  setcharani walk,;
  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));
    setcharani idle,;
    dir = (dir+2)%4;
    message;
  }
  timeout = 0.05;
}

// Hurting stuff
if (wa**** && this.mode!=1 && hearts>0) {
  dx = x-playerx;
  dy = y-playery;
  len = (dx*dx+dy*dy)^0.5;
  hurtdx = dx/len;
  hurtdy = dy/len;
  setcharani hurt,;
  hideimg 1;
  hearts -= playerswordpower/2;
}
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;
  setcharani hurt,;
  if (hearts<=0) {
    this.mode = 4; // DYING
    this.runcounter = 24;
    setcharani dead,;
  }
  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;
    setcharani idle,;
  }
  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) {
      gift = random(0,100);
      if (gift<10) lay greenrupee;
      else if (gift<15) lay bluerupee;
      else if (gift<30) lay heart;
    } else timeout = 0.05;
  }
}
Hope you liked it,
Somar
[Edited by Somar on 06-12-2001 at 06:13 PM]