var size=8;
var selfX=-1;
var selfY=-1;
var board;
var gameOver=true;
var levelDone=false;
var robotX=new Array(size);
var robotY=new Array(size);
var robotAlive=new Array(size);
var robotAmount=12;
var EMPTY='.';
var points=0;
var blastToX=-1;
var blastToY=-1;
var lastRandomNumber;
var levelMoveArray=new Array();
var totalMoveArray=new Array();
var blasts=1;
var level=0;
var teleports=3;
var seed=228416;
var hiScore='0';
var hiSeed='';

function randomize(init){
	//init should be an integer between 1 and 999.999
	if (1*init<1 || 1*init>999999) init='228416';
	while (init.length<6) {init='0'+init;}
	nr='0.'+init+'3';
	lastRandomNumber=1*nr;
	;
}

function getRandomNumber(){
	lastRandomNumber=lastRandomNumber*997-Math.floor(lastRandomNumber*997);
	return lastRandomNumber;
}

function initialize(){
	totalMoveArray=new Array();
	//lastRandomNumber=0.5284163
	seed=Math.floor(Math.random()*1000000);
	do {
		seed=prompt('Seed, 1<=seed<=999999',seed);
	} while (1*seed<1 || 1*seed>999999)
	
	randomize(seed);
	points=0;
	level=0;
	teleports=3;
	size=8;
	levelDone=false;
	// read highscore from cookie
	if (document.cookie!="") {
		var cookieTabel=document.cookie.split(";");
		var cookieFoundAt=-1;
		for (i=0;i<cookieTabel.length;i++) {
			if (cookieTabel[i].split("=")[0]=='hiScore') {
				cookieFoundAt=i;
			}
		}
		if (cookieFoundAt>-1) {
			var cookieValue=cookieTabel[cookieFoundAt].split("=")[1];
			hiScore=cookieValue.split(",")[0];
			hiSeed=cookieValue.split(",")[1];
		}
	}
	prepareNextLevel();
}

function prepareNextLevel(){
	levelMoveArray=new Array();
	board=new Array(size);
	level++;
	if (levelDone) {
		size++;
	}
	levelDone=false;
	gameOver=false;
	robotAmount=level*3+6;
	blasts=1;
	blastToX=-1;
	blastToY=-1;
	//place Self
	selfX=Math.floor(getRandomNumber()*(size-2))+1;
	selfY=Math.floor(getRandomNumber()*(size-2))+1;
	
	for (x=0;x<size;x++) {
		board[x]=new Array(size);
		for (y=0;y<size;y++) {
			if (selfX==x && selfY==y) {board[x][y]='@' }
			else if (Math.abs(selfX-x)<=1 && Math.abs(selfY-y)<=1) {board[x][y]='x' }
			else {board[x][y]='.' }
		}
	}
	
	//place robots
	robots=0;
	do {
		x=Math.floor(getRandomNumber()*(size));
		y=Math.floor(getRandomNumber()*(size));
		if (board[x][y]=='.') {
			board[x][y]='r';
			robotX[robots]=x;
			robotY[robots]=y;
			robotAlive[robots]=true;
			robots++;
		} 
	} while (robots<robotAmount) 
	
	for (i=selfX-1;i<=selfX+1;i++) {
		for (j=selfY-1;j<=selfY+1;j++) {
			if (board[i][j]=='x') {board[i][j]='.';}
		}
	}
	drawBoard();
}

function move(command){
	if (command!='T' && command!='P') {
		if (document.f1.moveType[1].checked) command='B'+command;
		if (document.f1.moveType[2].checked) command='Z'+command;
		if (document.f1.moveType[3].checked) command='J'+command;
	}
	document.f1.moveType[0].checked=true;
	if (!gameOver){
		var didMove=false;
		if (command.indexOf('Z')==0) {
			board[selfX][selfY]='.';
		}
		if (teleports>0 || (command.substr(0,1)!='J' && command.substr(0,1)!='Z')) {
			didMove=moveSelf(command);
		}
		if (didMove) {
			levelMoveArray.push(command);
			if (command.indexOf('Z')<0) {moveRobots();}
			if (teleports>0 && (command.substr(0,1)=='J' || command.substr(0,1)=='Z' || command.substr(0,1)=='T')) {
				teleports--;
			}
		}
		if (command.indexOf('Z')==0) {board[selfX][selfY]='@';}
		drawBoard();
	} 
	else {
		alert('Game Over. Please press Start to begin a new game.');
	}
}

function moveSelf(command){
	//alert (command+' '+ command.substr(0,1));
	if (command=='P') return true;
	if (command=='T'){
		do {
			targetX=Math.floor(Math.random()*(size-2))+1;
			targetY=Math.floor(Math.random()*(size-2))+1;
		} while (board[targetX][targetY]!=EMPTY || teleports>0 &&
		(board[targetX-1][targetY]=='r' ||
		board[targetX+1][targetY]=='r' ||
		board[targetX-1][targetY-1]=='r' ||
		board[targetX-1][targetY+1]=='r' ||
		board[targetX][targetY-1]=='r' ||
		board[targetX][targetY+1]=='r' ||
		board[targetX+1][targetY-1]=='r' ||
		board[targetX+1][targetY+1]=='r' ))
		selfX=targetX;
		selfY=targetY;
		return true;
	}
	jumplength=1;
	if (command.substr(0,1)=='J') {
		jumplength=5;
	}
	targetX=selfX;
	targetY=selfY;
	if (command.indexOf('N')>-1) {targetX-=jumplength;}
	if (command.indexOf('S')>-1) {targetX+=jumplength;}
	if (command.indexOf('W')>-1) {targetY-=jumplength;}
	if (command.indexOf('E')>-1) {targetY+=jumplength;}
	
	if (targetX<0 || targetX>=size || targetY<0 || targetY>=size) {
		return false;
	}
	
	if (command.substr(0,1)=='B') {
		if (blasts>0){
				
			for (j=0;j<robotAmount;j++) {
				if(robotX[j]== targetX && robotY[j]==targetY && robotAlive[j]==true) {
					robotAlive[j]=false;
					points++;
				}
			}
			
			
			
			blastToX=targetX;
			blastToY=targetY;
			blasts--;
			return true;
		}
	}
	
	if (command.substr(0,1)!='B') {
		if (board[targetX][targetY]==EMPTY) {
			selfX=targetX;
			selfY=targetY;
			return true;
		}
	}
	return false;
	
}
	
function moveRobots(){
	newBoard=new Array();
	for (i=0;i<size;i++) {
		newBoard[i]=new Array();
		for (j=0;j<size;j++) {
			newBoard[i][j]='.';
		}
	}
	newBoard[selfX][selfY]='@';
	
	if (blastToX>-1){
		newBoard[blastToX][blastToY]='#';
	}
	
	for (i=0;i<robotAmount;i++) {
		if (robotAlive[i]==false) {
			newBoard[robotX[i]][robotY[i]]='#';
		}
	}
	for (i=0;i<robotAmount;i++) {
		if (robotAlive[i]==true) {
			if (robotX[i]<selfX) {robotX[i]++;}
			if (robotY[i]<selfY) {robotY[i]++;}
			if (robotX[i]>selfX) {robotX[i]--;}
			if (robotY[i]>selfY) {robotY[i]--;}
			if (newBoard[robotX[i]][robotY[i]]=='@') {
				gameOver=true;
				//alert ('Game Over');
			}
			if (newBoard[robotX[i]][robotY[i]]=='.') {
				newBoard[robotX[i]][robotY[i]]='r';
			}
			
			else {
				newBoard[robotX[i]][robotY[i]]='#';
				robotAlive[i]=false;
				points++;
				//see if another robot was killed
				for (j=0;j<i;j++) {
					if(robotX[j]== robotX[i] && robotY[j]==robotY[i] && robotAlive[j]==true) {
						robotAlive[j]=false;
						points++;
					}
				}
			}
		}		
	}
	if (newBoard[selfX][selfY]!='@') newBoard[selfX][selfY]='X';
	//alert(robotX+ ' '+robotY);
	board=newBoard;
	if (!gameOver){
		isOver=true;
		for (i=0;i<robotAmount;i++) {
			if(robotAlive[i]==true) {
				isOver=false;
				break;
			}
		}
		levelDone=isOver;
	} else {
		if (points>1*hiScore) {
			expireDate=new Date;
			expireDate.setYear(expireDate.getYear()+2)
			document.cookie="hiScore="+points+','+seed+";expires="+expireDate.toGMTString();
		}
	}
	
}

