import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class Maze extends Applet
{

	final int BGTILE=0;
	final int HTILE=1;
	final int VTILE=2;
	final int SQTILE=3;
	final int HEROTILE=4;
	final int BADTILE=5;
	final int TILECOUNT=6;

	final int TILEWIDTH=20;
	final int TILEHEIGHT=20;
	final int TILESACROSS=16;
	final int TILESDOWN=10;

	Image tileImage[]=new Image[8];
	final char tile[][] = {
	{ /* BGTILE */
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	},{ /* HTILE */
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,

		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3,
		3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3,

		3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3,
		3,3,3,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,

		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	},{ /* VTILE */
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,

		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,

		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,

		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,0,0, 0,0,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
	},{ /* SQTILE */
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0,
		0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0,
		0,0,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,0,0,

		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,

		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,
		3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,3,3,

		0,0,3,3,3, 3,3,3,3,3, 3,3,3,3,3, 3,3,3,0,0,
		0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0,
		0,0,0,0,3, 3,3,3,3,3, 3,3,3,3,3, 3,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
		0,0,0,0,0, 3,3,3,3,3, 3,3,3,3,3, 0,0,0,0,0,
	},{ /* HEROTILE */
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,5,5,5, 5,5,5,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,5,5,5,5, 5,5,5,5,0, 0,0,0,0,0,
		0,0,0,0,0, 5,5,5,5,5, 5,5,5,5,5, 0,0,0,0,0,

		0,0,0,0,5, 5,5,5,5,5, 5,5,5,5,5, 5,0,0,0,0,
		0,0,0,5,5, 7,7,5,5,5, 5,7,7,5,5, 5,5,0,0,0,
		0,0,5,5,5, 7,7,7,5,5, 5,7,7,7,5, 5,5,5,0,0,
		0,0,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,0,0,
		0,0,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,0,0,

		0,0,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,0,0,
		0,0,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,0,0,
		0,0,5,5,5, 5,5,5,5,5, 5,5,5,5,5, 5,5,5,0,0,
		0,0,0,5,5, 7,7,5,5,5, 5,5,5,7,7, 5,5,0,0,0,
		0,0,0,0,5, 5,7,7,7,7, 7,7,7,7,5, 5,0,0,0,0,

		0,0,0,0,0, 5,5,7,7,7, 7,7,7,5,5, 0,0,0,0,0,
		0,0,0,0,0, 0,5,5,5,5, 5,5,5,5,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,5,5,5, 5,5,5,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	},{ /* BADGTILE */
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,6,6,6, 6,6,6,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,6,6,6,6, 6,6,6,6,0, 0,0,0,0,0,
		0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 0,0,0,0,0,

		0,0,0,0,6, 6,6,6,6,6, 6,6,6,6,6, 6,0,0,0,0,
		0,0,0,6,6, 7,7,6,6,6, 6,7,7,6,6, 6,6,0,0,0,
		0,0,6,6,6, 7,7,7,6,6, 6,7,7,7,6, 6,6,6,0,0,
		0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0,
		0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0,

		0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0,
		0,0,6,6,6, 6,6,6,6,6, 6,6,6,6,6, 6,6,6,0,0,
		0,0,6,6,6, 6,6,7,7,7, 7,7,7,6,6, 6,6,6,0,0,
		0,0,0,6,6, 7,7,7,7,7, 7,7,7,7,7, 6,6,0,0,0,
		0,0,0,0,6, 6,7,7,7,7, 7,7,7,7,6, 6,0,0,0,0,

		0,0,0,0,0, 6,6,6,6,6, 6,6,6,6,6, 0,0,0,0,0,
		0,0,0,0,0, 0,6,6,6,6, 6,6,6,6,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,6,6,6, 6,6,6,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
		0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
	} };

	final int BACK=0;
	final int HORI=1;
	final int VERT=2;
	final int SQUA=3;
	final int HERO=4;
	final int BADG=5;

	final String maze1[]={
		"+--------------+",
		"|              |",
		"| +---+ +----+ |",
		"| |          | |",
		"| | +------+ | |",
		"| + |      | + |",
		"|   | +--+ |   |",
		"| +-+    | +-+ |",
		"|              |",
		"+--------------+",
	};

	char maze[] = {
		SQUA,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,SQUA,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		VERT,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,BACK,VERT,
		SQUA,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,HORI,SQUA,
	};

	int herox=-1,heroy=-1,badgx=-1,badgy=-1;

	void resetmaze()
	{
		int i,j;

		for(j=0;j<TILESDOWN;j++) {
			for(i=0;i<TILESACROSS;i++) {
				switch(maze1[j].charAt(i)) {
				case '|': maze[j*TILESACROSS+i]=VERT; break;
				case '-': maze[j*TILESACROSS+i]=HORI; break;
				case '+': maze[j*TILESACROSS+i]=SQUA; break;
				default:  maze[j*TILESACROSS+i]=BACK; break;
				}
			}
		}
		badgx=1;
		badgy=1;
		herox=7;
		heroy=5;
	}

	void rendertile(Graphics g,int col,int row,int id)
	{
		int i;
		int x,y;

		x=col*TILEWIDTH;
		y=row*TILEHEIGHT;

		//g.setColor(new Color(palette[id]));
		//g.fillRect(x,y,TILEWIDTH,TILEHEIGHT);
		g.drawImage(tileImage[id],
		  x,y,this);

		//System.out.println("Tile "+col+","+row+": "+id);
	}

	void rendermaze(Graphics g)
	{
		int i,j;
		int id;
		for(j=0;j<TILESDOWN;j++) {
			for(i=0;i<TILESACROSS;i++) {
				id=maze[j*TILESACROSS+i];
				if(j==badgy && i==badgx) {
					id=BADG;
				}
				if(j==heroy && i==herox) {
					id=HERO;
				}
				rendertile(g,i,j,id);
			}
		}
	}

	final int S_STOP=0;
	final int S_RANDWALK=1;
	final int S_SEEK=2;
	final int S_EVADE=3;

	int badgstate=S_STOP;

	int distmap[][]=new int[TILESDOWN][TILESACROSS];

	void mazedist(int x,int y,int dist,int max) {
		int current;
		int result;

		/* Depth first search with itterative deepening */
		/* assert(x>=0 y>=0 x<TILESACROSS y<TILESACROSS) */
		if(maze[y*TILESACROSS+x]!=BACK) {
			/* Walls are a special case */
			return;
		}
		if(dist<max && distmap[y][x]==dist) {
			/* We have a value for this cell */
			mazedist(x+1,y,dist+1,max);
			mazedist(x,y+1,dist+1,max);
			mazedist(x-1,y,dist+1,max);
			mazedist(x,y-1,dist+1,max);
		} 
		/* If this is not the deepest, or this cell already has been calculated, return */
		if(dist!=max || distmap[y][x]!=-1) {
			return;
		}

		/* We are at the max, and so one of our neighbors is valid. */
		distmap[y][x]=dist;
	}

	int calcherobadgdist()
	{
		int i,j;

		for(i=0;i<TILESACROSS;i++) 
			for(j=0;j<TILESDOWN;j++)
				distmap[j][i]=-1;

		distmap[heroy][herox]=0;
		for(i=1;i<50;i++) {
			mazedist(herox,heroy,0,i);
		}
		return distmap[badgy][badgx];
	}

	void nextbadg()
	{
		int r=(int)(Math.random()*3.99);
		int dist,x,y;
		int min,max;

		switch(badgstate) {
		case S_STOP:
			break;
		case S_RANDWALK:
			x=badgx;
			y=badgy;
			if((r&2)==0) {
				x+=(r&1)==1?1:-1;
			} else {
				y+=(r&1)==1?1:-1;
			}
			if(x>=0 && x<TILESACROSS && y>=0 && y<TILESDOWN && 
			   maze[y*TILESACROSS+x]==BACK) {
				badgx=x;
				badgy=y;
			} else {
				/* Try turning 90 degrees */
				x=badgx;
				y=badgy;
				if((r&2)!=0) {
					x+=(r&1)==1?1:-1;
				} else {
					y+=(r&1)==1?1:-1;
				}
				if(x>=0 && x<TILESACROSS && y>=0 && y<TILESDOWN && 
				   maze[y*TILESACROSS+x]==BACK) {
					badgx=x;
					badgy=y;
				}
				/* Didn't work so stay still this round */
			}
			break;
		case S_SEEK:
			dist=calcherobadgdist();
			min=dist;
			x=badgx;
			y=badgy;
			if(distmap[badgy-1][badgx]<min && distmap[badgy-1][badgx]!=-1) {
				x=badgx;
				y=badgy-1;
				min=distmap[y][x];
			}
			if(distmap[badgy+1][badgx]<min && distmap[badgy+1][badgx]!=-1) {
				x=badgx;
				y=badgy+1;
				min=distmap[y][x];
			}
			if(distmap[badgy][badgx-1]<min && distmap[badgy][badgx-1]!=-1) {
				x=badgx-1;
				y=badgy;
				min=distmap[y][x];
			}
			if(distmap[badgy][badgx+1]<min && distmap[badgy][badgx+1]!=-1) {
				x=badgx+1;
				y=badgy;
				min=distmap[y][x];
			}
			badgx=x;
			badgy=y;
			break;
		case S_EVADE:
			dist=calcherobadgdist();
			max=dist;
			x=badgx;
			y=badgy;
			// printf("EVADE: hero (%d,%d); badg (%d,%d)\n",herox,heroy,badgx,badgy);
			{ int m,n;
			for(n=0;n<TILESDOWN;n++) {
				for(m=0;m<TILESACROSS;m++) {
					// printf("%3d",distmap[n][m]);
				}
				// printf("\n");
			} }
			// printf ("EVADE: dist=%d (%d,%d) -> ",dist,x,y);
			if(distmap[badgy-1][badgx]>max && distmap[badgy-1][badgx]!=-1) {
				x=badgx;
				y=badgy-1;
				max=distmap[y][x];
				// printf("down (%d,%d) %d : ",x,y,max);
			}
			if(distmap[badgy+1][badgx]>max && distmap[badgy+1][badgx]!=-1) {
				x=badgx;
				y=badgy+1;
				max=distmap[y][x];
				// printf("up (%d,%d) %d : ",x,y,max);
			}
			if(distmap[badgy][badgx-1]>max && distmap[badgy][badgx-1]!=-1) {
				x=badgx-1;
				y=badgy;
				max=distmap[y][x];
				// printf("left (%d,%d) %d : ",x,y,max);
			}
			if(distmap[badgy][badgx+1]>max && distmap[badgy][badgx+1]!=-1) {
				x=badgx+1;
				y=badgy;
				max=distmap[y][x];
				// printf("right (%d,%d) %d : ",x,y,max);
			}
			// printf("\n");
			badgx=x;
			badgy=y;
			break;
		}
	}

	public void setState(int mode)
	{
		if(mode>=0 && mode<=5) badgstate=mode;
	}

	int oldx,oldy;
	private void nextState(int ch)
	{
		if(ch==-1 || ch==27 || ch=='q') resetmaze();

		if(ch>='0' && ch<='5') badgstate=ch-'0';
		oldx=herox;
		oldy=heroy;
		if(herox>0 && (ch=='h' || ch==Event.LEFT)) herox--;
		if(heroy>0 && (ch=='k' || ch==Event.UP)) heroy--;
		if(herox<TILESACROSS && (ch=='l' || ch==Event.RIGHT)) herox++;
		if(heroy<TILESDOWN && (ch=='j' || ch==Event.DOWN)) heroy++;
		if(maze[heroy*TILESACROSS+herox]!=BACK) {
			herox=oldx;
			heroy=oldy;
		}
		if(oldx!=herox || oldy!=heroy) {
			Graphics g=getGraphics();
			rendertile(g,oldx,oldy,maze[oldy*TILESACROSS+oldx]);
			if(oldx==badgx && oldy==badgy) 
				rendertile(g,badgx,badgy,BADG);
			rendertile(g,herox,heroy,HERO);
		}
		oldx=badgx;
		oldy=badgy;
		nextbadg();
		if(oldx!=badgx || oldy!=badgy) {
			Graphics g=getGraphics();
			rendertile(g,oldx,oldy,maze[oldy*TILESACROSS+oldx]);
			if(oldx==herox && oldy==badgy)
				rendertile(g,herox,heroy,HERO);
			rendertile(g,badgx,badgy,BADG);
		}
	}

	int palette[]={ 0,0xff,0xff00,0xffff,0xff0000,0xff00ff,0xffff00,0xffffff };
	final int PALETTECOUNT=8;

	int tileData[]=new int[TILEWIDTH*TILEHEIGHT*8];
	public void init()
	{
		int i,j;
		resetmaze();

		for(i=0;i<6;i++) {		
			for(j=0;j<TILEWIDTH*TILEHEIGHT;j++) {
				tileData[TILEWIDTH*TILEHEIGHT*i+j]=
				  palette[tile[i][j]]|0xff000000;
			}
			tileImage[i]=createImage(new MemoryImageSource(
			  TILEWIDTH,TILEHEIGHT,tileData,
			  TILEWIDTH*TILEHEIGHT*i,TILEWIDTH));
		}
		
	}

	public void start()
	{
		Graphics g=getGraphics();

		rendermaze(g);
	}

	public void paint(Graphics g)
	{
		rendermaze(g);
	}

	public boolean keyUp(Event e,int key)
	{
		nextState(key);		
		return true;
	}
}
