var xT=0;var ctx,CV;var qT=[];const TW=21;const TH=17;const FPS=30;const TBOMB=60;const TFEU=30;function $(id){return document.getElementById(id);}
function msg(txt){$("txt").innerHTML="<h1>"+txt+"</h1>";setTimeout(function(){$("txt").innerHTML="";},2000);}
String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,'');};function getKeys(id){var l=localStorage.getItem(id);if(l==null)
return null;else{return l.split(",");}}
var wT=[];wT.timer_loop=null;wT.timer_end=null;wT.init=function(){ var nb=""+((""+document.location).split("?")).slice(-1);if(nb=="2"||nb=="3"||nb=="4")
nb=parseInt(nb);else
nb=2;CV=$('canvas');ctx=CV.getContext('2d');CV.focus();ctx.font="bold 32px sans-serif";ctx.fillStyle="white";if(wT.timer_loop)clearInterval(wT.timer_loop);document.onkeydown=null;document.onkeyup=null;var keys1=getKeys("keys1");var keys2=getKeys("keys2");var keys3=getKeys("keys3");var keys4=getKeys("keys4");if(keys1==null)keys1=[38,40,37,39,32]; if(keys2==null)keys2=[90,83,81,68,16]; if(keys3==null)keys3=[104,101,100,102,96] 
while(wT.pop()); wT.push(new Player(1,keys1));wT.push(new Player(2,keys2));if(nb==3||nb==4)wT.push(new Player(3,keys3));if(nb==4)wT.push(new Player(4,keys4));xT=-1;wT.next();}
wT.next=function(){xT++;getRound(xT,wT.start);}
wT.start=function(level){msg(level["motto"]);wT.timer_end=null;qT=[];yT.init(level);for(var i=0;i<wT.length;i++){var xy=yT.positions[i];wT[i].reset(xy[0],xy[1]);}
$("control").innerHTML="<h3>Round: "+(xT+1)+"</h3><h2>"+level["name"]+"</h21>";for(var i=0;i<wT.length;i++){var p=wT[i];$("control").innerHTML+="<li><img src='"+IMG["p"+p.n+"d1"].src+"'/> : <span class='score'>"+p.score+"</span> <a class='btn' href='setkeys.html?keys"+p.n+"' title='Configure keyboard'>cfg</a></li>";}
wT.timer_loop=setInterval(wT.loop,1000/FPS);document.onkeydown=function(e){ if(!e)e=window.event;if(e.keyCode==121){msg("skip");wT.end(1);}
if(e.keyCode!=122){qT[e.keyCode]=true;return false;}}
document.onkeyup=function(e){ if(!e)e=window.event;if(e.keyCode!=122){qT[e.keyCode]=false;return false;}}}
wT.end=function(timeout){ if(timeout==null)
timeout=1000;if(wT.timer_end==null){ wT.timer_end=setTimeout(function(){wT.timer_end=null; var p=[];for(var i=0;i<wT.length;i++){if(wT[i].life)p.push(wT[i]);}
if(p.length==1){p[0].score++; msg("+1");}
else
msg("no winners ;-)");if(wT.timer_loop)clearInterval(wT.timer_loop);document.onkeydown=null;document.onkeyup=null;setTimeout(function(){wT.next();},timeout);},timeout);}}
wT.test=function(){t1=new Date();for(var i=0;i<300;i++)wT.loop();t2=new Date();aff(t2-t1);}
wT.loop=function(){yT.draw();yT.bombfeu();for(var i=0;i<wT.length;i++)
wT[i].undraw();var cpt=0;for(var i=0;i<wT.length;i++){if(wT[i].life){wT[i].draw();wT[i].play(qT);cpt++;}}
if(cpt<2){ wT.end();}}
function shake(t){$("tablo").style.left=t.pop()+"px";if(t.length>0){setTimeout(function(){shake(t);},20);}}
var yT=[];var rT=null;var bT=null;var FEU=null;var CADO=null;var IMG=[];var zT=[];var pT=[];yT.init=function(level){CV.width=TW*32;CV.height=TH*32;$("c_terre").src="abdata/worlds/"+level["world"]+"/c_terre.png";$("c_terrec").src="abdata/worlds/"+level["world"]+"/c_terre_creux.png";$("c_wall").src="abdata/worlds/"+level["world"]+"/c_wall.png";$("c_wall1").src="abdata/worlds/"+level["world"]+"/c_wall1.png";$("c_wall2").src="abdata/worlds/"+level["world"]+"/c_wall2.png";$("c_wall3").src="abdata/worlds/"+level["world"]+"/c_wall3.png";rT=new Array(TH*TW);bT=new Array(TH*TW);FEU=new Array(TH*TW);CADO=new Array(TH*TW);yT.positions=[0,0,0,0];yT.gift_percent=level["params"]["gift"];
zT=[]; pT=[];var div_tablo=$("tablo"); if(div_tablo.hasChildNodes()){while(div_tablo.childNodes.length>=1)
div_tablo.removeChild(div_tablo.firstChild);} 
for(var y=0;y<TH;y++){ var ligne=[];var vligne=[];for(var x=0;x<TW;x++){var i=new Image();i.src="";i.style.position="absolute";i.style.left=x*32+"px";i.style.top=y*32+"px";div_tablo.appendChild(i);ligne.push(i);vligne.push(null);}
zT.push(ligne);pT.push(vligne);} 
var ll=$("ressources").childNodes;for(var i=0;i<ll.length;i++){if(ll[i].tagName=="IMG")
IMG[ll[i].id]=$(ll[i].id);} 
for(var y=0;y<TH;y++){ var ligne=[];for(var x=0;x<TW;x++){ligne.push(" ");}
yT.push(ligne);} 
var lines=level["content"];for(var y in lines){ var ligne=lines[y];for(var x=0;x<ligne.length;x+=1){var c=ligne[x];yT[y][x]=c;}}
for(var y=0;y<TH;y++){var ligne=[];for(var x=0;x<TW;x++){switch(yT[y][x]){case".": yT[y][x]=" ";break;case" ": var hasard=parseInt(Math.random()*100);if(hasard<level["params"]["sand"]){hasard=parseInt(Math.random()*100);if(hasard<level["params"]["fakesand"])
yT[y][x]="t";else
yT[y][x]="T";}
else
yT[y][x]=" ";break;case"1": yT.positions[0]=[x,y];yT[y][x]=" ";break;case"2": yT.positions[1]=[x,y];yT[y][x]=" ";break;case"3": yT.positions[2]=[x,y];yT[y][x]=" ";break;case"4": yT.positions[3]=[x,y];yT[y][x]=" ";break;}}} 
if(!(yT.positions[0]&&yT.positions[1]&&yT.positions[2]&&yT.positions[3]))
alert("a player is not positionned ;-)");}
yT.draw=function(){for(var y=0;y<TH;y++){for(var x=0;x<TW;x++){if(pT[y][x]!=yT[y][x]){switch(yT[y][x]){case"1": case"2": case"3": case"4": zT[y][x].src=IMG["c_tomb"].src;break;case"T": zT[y][x].src=IMG["c_terre"].src;break;case"t": zT[y][x].src=IMG["c_terrec"].src;break;case"X": zT[y][x].src=IMG["c_wall"].src;break;case"Y": zT[y][x].src=IMG["c_wall1"].src;break;case"W": zT[y][x].src=IMG["c_wall2"].src;break;case"Z": zT[y][x].src=IMG["c_wall3"].src;break;case"b": zT[y][x].src=IMG["c_bomb"].src;break;case"p": zT[y][x].src=IMG["c_power"].src;break;case"m": zT[y][x].src=IMG["c_mine"].src;break;case"o": zT[y][x].src=IMG["c_bomb1"].src;break;case"F": zT[y][x].src=IMG["c_feu1"].src;break;case" ": zT[y][x].src="abdata/1pixel.gif";break;}
pT[y][x]=yT[y][x];}}}}
borne=function(i,di,max){return(i+di+max)%max}
function explose(x,y,p){yT.initexplose(x,y);shake([10,8,12,5,15]);doex(x,y,1,0,p);doex(x,y,-1,0,p);doex(x,y,0,1,p);doex(x,y,0,-1,p);}
yT.initexplose=function(x,y){var idx=y*TW+x;yT[y][x]="F";FEU[idx]=TFEU;}
function doex(x,y,dx,dy,p){x=borne(x,dx,TW);y=borne(y,dy,TH);switch(yT[y][x])
{case"X": return;case"Y": yT[y][x]="W";return;case"W": yT[y][x]="Z";return;case"o": var idx=y*TW+x;rT[idx]=2;return;case"m": explose(x,y,p);return;case"Z": case"t": case"T": yT.initexplose(x,y);var idx=y*TW+x;var hasard=parseInt(Math.random()*100);if(hasard<yT.gift_percent){var cado=parseInt(Math.random()*3);CADO[idx]="pbm"[cado];}
else
CADO[idx]=" ";return;default: yT.initexplose(x,y);if(p>1)
doex(x,y,dx,dy,p-1);}}
yT.bombfeu=function(){for(var y=0;y<TH;y++){for(var x=0;x<TW;x++){var idx=y*TW+x;if(yT[y][x]=="o"){if(!rT[idx])
rT[idx]=TBOMB;else{rT[idx]--;if(rT[idx]<1){rT[idx]=0;if(bT[idx]){var p=bT[idx][0];bT[idx][1].nbbomb++;}
else{var p=2;}
explose(x,y,p);}}}
else if(yT[y][x]=="F"){ if(FEU[idx]>0)
FEU[idx]--;else{yT[y][x]=CADO[idx]?CADO[idx]:" ";CADO[idx]=" ";}}}}}
yT.poseBomb=function(x,y,player){if(yT[y][x]==" "){yT[y][x]="o";var idx=y*TW+x;player.nbbomb--; bT[idx]=[player.puiss,player];}}
function Player(n,keys){this.n=n; this.keys=keys;this.score=0;this.reset(0,0)
}
Player.prototype.reset=function(x,y){this.X=x*32;this.Y=y*32;this.puiss=2; this.nbbomb=2; this.v=6; this.dir="d"; this.occ=0;this.life=1;this.oldx=this.X;this.oldy=this.Y;}
Player.prototype.play=function(qT){corr=function(x){return parseInt((x+16)/32)*32;};var kup=qT[this.keys[0]];var kdown=qT[this.keys[1]];var kleft=qT[this.keys[2]];var kright=qT[this.keys[3]];var kpose=qT[this.keys[4]];var xy=this.coords()
var x=xy[0];var y=xy[1];var cup=yT[borne(y,-1,TH)][x];var cdo=yT[borne(y,+1,TH)][x];var cle=yT[y][borne(x,-1,TW)];var cri=yT[y][borne(x,+1,TW)];var cbloque="WYZXTo"; if(kup){this.X=corr(this.X);this.dir="u";this.occ++;if(cbloque.indexOf(cup)<0||this.Y>y*32){this.Y-=this.v;if(this.Y<-16)this.Y+=TH*32;}}
if(kdown){this.X=corr(this.X);this.dir="d";this.occ++;if(cbloque.indexOf(cdo)<0||this.Y<y*32){this.Y+=this.v;if(this.Y>TH*32-16)this.Y-=TH*32;}}
if(kleft){this.Y=corr(this.Y);this.dir="l";this.occ++;if(cbloque.indexOf(cle)<0||this.X>x*32){this.X-=this.v;if(this.X<-16)this.X+=TW*32;}}
if(kright){this.Y=corr(this.Y);this.dir="r";this.occ++;if(cbloque.indexOf(cri)<0||this.X<x*32){this.X+=this.v;if(this.X>TW*32-16)this.X-=TW*32;}}
if(this.nbbomb>0&&kpose){var xy=this.coords();yT.poseBomb(x,y,this);}
switch(yT[y][x]){case"p": this.puiss+=1;yT[y][x]=" ";break;case"b": this.nbbomb+=1;yT[y][x]=" ";break;case"1": case"2": case"3": case"4": var player_tomb=wT[parseInt(yT[y][x])-1];this.puiss+=player_tomb.puiss;this.nbbomb+=player_tomb.nbbomb;yT[y][x]=" ";break;case"m":explose(x,y,this.puiss); break;case"F": msg("R.I.P");var idx=y*TW+x;CADO[idx]=""+this.n; this.life=0;break;}}
Player.prototype.undraw=function(){ctx.clearRect(this.oldx,this.oldy,32,32);}
Player.prototype.draw=function()
{ this.occ=this.occ%9;var o=1+parseInt(this.occ/3);ctx.drawImage(IMG["p"+this.n+this.dir+o],this.X,this.Y);this.oldx=this.X;this.oldy=this.Y;}
Player.prototype.coords=function(){var x=borne(parseInt((this.X+16)/32),0,TW);var y=borne(parseInt((this.Y+16)/32),0,TH);return[x,y];}
GAME=wT;
