// Copyright AI SOFTWARE aisoftware.ro 2008
var g_START_DATE=new Date();
var g_START_TICK=g_START_DATE.getTime();

var g_NOVANO_DIM=64;
var g_NOVANO_DIM2=32;
var g_NOVANO_REZ=30;
var g_RAD_DEGREE=180/Math.PI;
var g_DEGREE_RAD=Math.PI/180;

var g_TANK_MAXSPEED=60;
var g_TURRET_MAXSPEED=120;
var g_TARGET_MAXSPEED=Math.PI/2;
var g_FIRE_LIVE=3;
//tank
var g_tanks=new Array();
var g_maxtanks=0;
var g_targets=new Array();
var g_maxtargets=0;
var g_fires=new Array();
var g_maxfires=0;
var g_stones=new Array();
var g_maxstones=0;

var WORLD_VERSION=-1;
var WORLD_SERVER_VERSION=-1;
var WORLD_MAX_STEP=10;
var WORLD_STEP=16;
var WORLD_NEXT_STEP=0.04;
var WORLD_PAUSED=false;
var WORLD_REALTIME=getTimeNova();

var NEXT_WORLD_UPDATE=getTimeNova();

function nextNova(cur)
{
	cur++;
	return cur%g_NOVANO_DIM;
}
function prevNova(cur)
{
	cur+=g_NOVANO_DIM-1;
	return cur%g_NOVANO_DIM;
}
function opositeNova(cur)
{
	cur+=g_NOVANO_DIM2;
	return cur%g_NOVANO_DIM;
}

//time
function updateUserWorldForNextRound()
{
	for(i=0;i<g_maxtanks;i++)
	{
		if(g_tanks[i].active && !g_tanks[i].rest)
		{
			if(!g_tanks[i].usercontrolled && !g_tanks[i].botcontrolled)
			{
				//updateTankImageNova(g_tanks[i]);
				if(g_tanks[i].t_active)
				{
					g_tanks[i].posx=g_tanks[i].t_posx;
					g_tanks[i].posy=g_tanks[i].t_posy;
					g_tanks[i].curori=g_tanks[i].t_ori;
					g_tanks[i].curori=correctOriNova(g_tanks[i].curori);
					g_tanks[i].curorit=g_tanks[i].t_orit;
					g_tanks[i].curorit=correctOriNova(g_tanks[i].curorit);
					setTankOri(g_tanks[i]);
					g_tanks[i].t_active=false;
				}
			}
			else
			{
				moveTheTankNova(g_tanks[i].tid);
			}
		}
	}
}
function updateUserWorld()
{
	var tnova;
	var passed;
	tnova=getTimeNova();
	//passed=tnova-t.lastupdate;
	var topass=(NEXT_WORLD_UPDATE-tnova)/receiveMedTime;
	if(topass<0) topass=0;
	var i;
	for(i=0;i<g_maxtanks;i++)
	{
		if(g_tanks[i].active && !g_tanks[i].rest)
		{
			if(!g_tanks[i].usercontrolled && !g_tanks[i].botcontrolled)
			{
				//updateTankImageNova(g_tanks[i]);
				if(g_tanks[i].t_active)
				{
					g_tanks[i].posx=g_tanks[i].t_posx+(g_tanks[i].t_oldposx-g_tanks[i].t_posx)*topass;
					g_tanks[i].posy=g_tanks[i].t_posy+(g_tanks[i].t_oldposy-g_tanks[i].t_posy)*topass;
					g_tanks[i].curori=g_tanks[i].t_ori-getShortOriNova(g_tanks[i].t_oldori,g_tanks[i].t_ori)*topass;
					g_tanks[i].curori=correctOriNova(g_tanks[i].curori);
					g_tanks[i].curorit=g_tanks[i].t_orit-getShortOriNova(g_tanks[i].t_oldorit,g_tanks[i].t_orit)*topass;
					g_tanks[i].curorit=correctOriNova(g_tanks[i].curorit);

					setTankOri(g_tanks[i]);
					if(!g_tanks[i].shadow)
						updateTankImageNova(g_tanks[i]);
				}
			}
			else
			{
				moveTheTankNova(g_tanks[i].tid);
			}
		}
	}
	var i;
	for(i=0;i<g_maxfires;i++)
	{
		if(g_fires[i].active)
		{
			if(moveTheFireNova(i))
			{
				$("#fire_"+g_fires[i].tid)
				.css("left",""+(g_fires[i].posx-8))
				.css("top",""+(g_fires[i].posy-8))
				;
			}
		}
	}
	setTimeout("updateUserWorld()",WORLD_NEXT_STEP*1000-1);
}

function getTimeNova()
{
	var g_START_DATE=new Date();
	return (g_START_DATE.getTime()-g_START_TICK)/1000;
}

function updateTankNova(t)
{
	var tnova;
	var passed;
	tnova=getTimeNova();
	passed=tnova-t.lastupdate;
	
	//update orientation
	if(t.target!=false)
	{
		t.curori+=t.turnto*g_TARGET_MAXSPEED*passed;
		t.curori=correctOriNova(t.curori);
		t.ori=(parseInt(Math.round(t.curori*64/360)))%64;
	}
	if(t.targett!=false)
	{
		t.curorit+=t.turntot*g_TARGET_MAXSPEED*passed;
		t.curorit=correctOriNova(t.curorit);
		t.orit=(parseInt(Math.round(t.curorit*64/360))+32)%64;
	}

	t.speed+=t.acc*passed;

	//make tank max speed
	t.acc=t.maxspeed-t.speed;

	t.posx+=Math.cos(t.curori*g_DEGREE_RAD)*t.speed*passed;
	t.posy-=Math.sin(t.curori*g_DEGREE_RAD)*t.speed*passed;
	
	t.lastupdate=tnova;
	if(t.speed<0.1)
	{
		t.speed=0;
		if(t.acc<0.1 && Math.abs(t.turnto)<5 && Math.abs(t.turntot)<5) {t.acc=0; return false;}
	}
	
	//$("#debug").html(debugTankNova(t));
	
	return true;
}

function moveTheTankNova(tid)
{
	var t=g_tanks[tid];
	
	if(t.target!=false)
	{
		//follow target
		t.orirad=getOriNova(t,t.target);
		t.orirad=correctOriNova(t.orirad);
		t.turnto=getShortOriNova(t.curori,t.orirad);
		
		var d=getDist2Nova(t,t.target);
		if(t.fallow)
		{
			if(d<9096)
				setTankNove(t,0);
			else
				setTankTarget(t,t.target);
		}
		else if(d<4096)
		{
			//slow down and stop
			t.target=false;
			setTankNove(t,0);
		}
	}
	if(t.targett!=false)
	{
		//follow target
		t.oritrad=getOriNova(t,t.targett);
		t.oritrad=correctOriNova(t.oritrad);
		t.turntot=getShortOriNova(t.curorit,t.oritrad);
	}
	
	if(updateTankNova(t)){
		updateTankImageNova(t);
	}
	else{
		if(!t.fallow)
		{
			if(tankRestInPeace)
				tankRestInPeace(t);
			t.rest=true;
			updateTankImageNova(t);
		}
	}
}

function setTankNove(t,acc)
{
	t.maxspeed=acc;
	t.acc=t.maxspeed-t.speed;
	t.lastupdate=WORLD_REALTIME;
	if(t.usercontrolled || t.botcontrolled) t.lastupdate=getTimeNova();
	t.rest=false;
}
function setTankTarget(t,tt)
{
	t.target=tt;

	if(tt!=false)
	{
		t.orirad=getOriNova(t,t.target);
		t.orirad=correctOriNova(t.orirad);
		
		t.turnto=getShortOriNova(t.curori,t.orirad);
		setTankNove(t,g_TANK_MAXSPEED);
	}	
}
function setTurretTarget(t,tt)
{
	t.targett=tt;

	if(tt!=false)
	{
		t.oritrad=getOriNova(t,t.targett);
		t.oritrad=correctOriNova(t.oritrad);
		
		t.turntot=getShortOriNova(t.curorit,t.oritrad);
		setTankNove(t,t.maxspeed);
	}	
}
function setTankOri(t)
{
	t.ori=(parseInt(Math.round(t.curori*64/360)))%64;
	t.orit=(parseInt(Math.round(t.curorit*64/360))+32)%64;
	t.rest=false;
}
function updateTankImageNova(t)
{
	$("#tank_"+t.tid)
		.css("left",""+(t.posx-33))
		.css("top",""+(t.posy-33))
		.css("background-position",""+(-1-(t.ori%8)*67)+"px "+(-1-parseInt(t.ori/8)*67)+"px")
		;
	$("#teava_"+t.tid)
		.css("left",""+(t.posx-33))
		.css("top",""+(t.posy-33))
		.css("background-position",""+(-1-(t.orit%8)*67)+"px "+(-1-parseInt(t.orit/8)*67)+"px")
		;
	$("#select_"+t.tid)
		.css("left",""+(t.posx-33))
		.css("top",""+(t.posy-33))
		.css("background-position",""+(-1-(t.ori%8)*67)+"px "+(-1-parseInt(t.ori/8)*67)+"px")
		;
}

function moveTheFireNova(fid)
{	
	var f=g_fires[fid];
	var tnova;
	var passed;
	tnova=getTimeNova();
	passed=tnova-f.lastupdate;

	f.posx+=Math.cos(f.curorit*g_DEGREE_RAD)*g_TURRET_MAXSPEED*passed;
	f.posy-=Math.sin(f.curorit*g_DEGREE_RAD)*g_TURRET_MAXSPEED*passed;

	//check stones
	var closeid=false;
	for(i=0;i<g_maxstones;i++)
	{
		var dx=g_stones[i].posx-f.posx;
		var dy=g_stones[i].posy-f.posy;
		if(dx*dx+dy*dy<889)
		{
			closeid=true;
			break;
		}
	}
	//check tanks
	if(!closeid)
	for(i=0;i<g_maxtanks;i++)
	{
		if(g_tanks[i].active && !g_tanks[i].shadow && (g_tanks[i].usercontrolled!=f.usercontrolled || g_tanks[i].botcontrolled!=f.botcontrolled))// && !g_tanks[i].botcontrolled
		{
			var dx=g_tanks[i].posx-f.posx;
			var dy=g_tanks[i].posy-f.posy;
			if(dx*dx+dy*dy<1089)
			{
				tankIsDestroyed(g_tanks[i]);

				closeid=true;
				
				g_tanks[i].active=0;
				$("#tank_"+g_tanks[i].tid).remove();
				$("#teava_"+g_tanks[i].tid).remove();
				$("#select_"+g_tanks[i].tid).remove();
			
				break;
			}
		}
	}
	
	f.lastupdate=tnova;
	if(f.initupdate<f.lastupdate || closeid)
	{
		f.active=0;
		$("#fire_"+f.tid).remove();
		return false;
	}
	return true;
}
function fireTurret(t)
{
	if(t.active)
	{
		var f=createBlankFire(t.posx+Math.cos(t.curorit*g_DEGREE_RAD)*39,t.posy-Math.sin(t.curorit*g_DEGREE_RAD)*39,t.curorit);
		f.usercontrolled=t.usercontrolled;
		f.botcontrolled=t.botcontrolled;
		$(document.body).append(
			'<div id=fire_'+f.tid+' style="position:absolute;top:'+(f.posy-8)+'px;left:'+(f.posx-8)+'px;width:16px;height:16px;background-image:url(images/allutils.gif);background-repeat: no-repeat;background-position: -250px -180px ;z-index:12"></div>'
		);
		return f;
	}
}

function debugTankNova(t)
{
	var d="";
	return d;
}

// Returns the angle between the vector and the argument (also a vector)
function getDist2Nova(t,tt)
{	 
	var d;
	d1=t.posx-tt.posx;
	d2=t.posy-tt.posy;
	d=d1*d1+d2*d2;
	return d;
}
function getOriNova(t,tt)
{	 
	 var d,d1,d2,alpha;
	 d1=t.posx-tt.posx;
	 d2=t.posy-tt.posy;
	 d=Math.sqrt(d1*d1+d2*d2);
	 alpha=0;
	 if(d>0.0001)
	 {
		if(d1>d) d1=d;
		alpha=Math.acos(d1/d)*180/Math.PI;
		if(t.posy-tt.posy<0.0)
		{
			if(t.posx-tt.posx<0.0)
			{
				alpha=180.0+alpha;
			}
			else
			{
				alpha=180.0+alpha;
			}
		}
		else
		{
			if(t.posx-tt.posx<0.0)
			{
				alpha=180.0-alpha;
			}
			else
			{
				alpha=180.0-alpha;
			}
		}
	}

	return alpha;
}
function getShortOriNova(rad1,rad2)
{
	if(rad1<rad2)
	{
		if(rad2-rad1>180)
			return -(360+rad1-rad2);
		return rad2-rad1;
	}

	if(rad1-rad2>180)
		return 360+rad2-rad1;
	return -(rad1-rad2);
}
function correctOriNova(rad)
{
	rad%=360;
	if(rad<0) rad+=360;
	return rad;
}
function createBlankNova()
{
	var i;
	for(i=0;i<g_maxtanks;i++)
	{
		if(!g_tanks[i].active)
		{
			g_tanks[i].active=1;
			g_tanks[i].rest=true;
			g_tanks[i].speed=0;
			g_tanks[i].acc=0;
			g_tanks[i].maxspeed=0;
			g_tanks[i].lastupdate=0;
			g_tanks[i].t_active=false;
			g_tanks[i].usercontrolled=false;
			g_tanks[i].botcontrolled=false;
			g_tanks[i].shadow=false;
			return g_tanks[i];
		}
	}
	var t=g_tanks[g_maxtanks]={tid:g_maxtanks,posx:-80,posy:-80,
	curori:0,ori:0,orirad:0,turnto:0,
	curorit:180,orit:0,oritrad:0,turntot:0,
	speed:0,acc:0,maxspeed:0,
	coolt:0,level:0,target:false,targett:false,fallow:false,
	lastupdate:0, active:1, rest: true,
	t_active:false,t_posx:0,t_posy:0,t_ori:0,t_orit:0,t_oldposx:0,t_oldposy:0,t_oldori:0,t_oldorit:0,
	usercontrolled:false,botcontrolled:false,shadow:false
	};
	g_maxtanks++;
	return t;
}
function createBlankTarget(x,y)
{
	var i;
	for(i=0;i<g_maxtargets;i++)
	{
		if(!g_targets[i].active)
		{
			g_targets[i].active=1;
			g_targets[i].posx=x;
			g_targets[i].posy=y;
			return g_targets[i];
		}
	}
	var ttt=g_targets[g_maxtargets]={tid:g_maxtargets,posx:x,posy:y,active:1};
	g_maxtargets++;
	return ttt;
}
function createBlankFire(x,y,orit)
{
	var i;
	for(i=0;i<g_maxfires;i++)
	{
		if(!g_fires[i].active)
		{
			g_fires[i].active=1;
			g_fires[i].posx=x;
			g_fires[i].posy=y;
			g_fires[i].curorit=orit;
			g_fires[i].lastupdate=getTimeNova();
			g_fires[i].initupdate=getTimeNova()+g_FIRE_LIVE;
			return g_fires[i];
		}
	}
	var ttt=g_fires[g_maxfires]={tid:g_maxfires,posx:x,posy:y,curorit:orit,active:1,lastupdate:getTimeNova(),initupdate:getTimeNova()+g_FIRE_LIVE};
	g_maxfires++;
	return ttt;
}

function createStone(x,y)
{
	var t=g_stones[g_maxstones]={tid:g_maxstones,posx:x,posy:y};
	g_maxstones++;

	$(document.body).append(
		'<div id=stone_'+t.tid+' style="position:absolute;top:'+(t.posy-35)+'px;left:'+(t.posx-35)+'px;width:70px;height:70px;background-image:url(images/allutils.gif);background-repeat: no-repeat;background-position: -227px -0px ;z-index:8"></div>'
	);
	return t;
}

function createBush(x,y)
{
	$(document.body).append(
		'<div style="position:absolute;top:'+(y-110)+'px;left:'+(x-100)+'px;width:220px;height:220px;background-image:url(images/allutils.gif);background-repeat: no-repeat;background-position: 0px 0px ;z-index:15"></div>'
	);
}

function createTankNova(t,ti)
{
	if(ti=='' || ti=='1') ti="images/alltank.gif";
	if(ti=='2') ti="images/alltank2.gif";
	$(document.body).append(
		'<div id=tank_'+t.tid+' style="position:absolute;top:'+(t.posy-33)+'px;left:'+(t.posx-33)+'px;width:66px;height:66px;background-image:url('+ti+');background-repeat: no-repeat;background-position: -1px -1px;z-index:10"></div>'+
		'<div id=teava_'+t.tid+' style="position:absolute;top:'+(t.posy-33)+'px;left:'+(t.posx-33)+'px;width:66px;height:66px;background-image:url(images/allteava.gif);background-repeat: no-repeat;background-position: -1px -1px;z-index:11"></div>'+
		'<div id=select_'+t.tid+' style="display:none;position:absolute;top:'+(t.posy-33)+'px;left:'+(t.posx-33)+'px;width:66px;height:66px;background-image:url(images/allsel.gif);background-repeat: no-repeat;background-position: -1px -1px;z-index:9"></div>'
	);
}

//start world
setTimeout("updateUserWorld()",WORLD_NEXT_STEP*1000-1);

