Skip to content

Instantly share code, notes, and snippets.

@gaborbata
Last active August 29, 2015 14:10
Show Gist options
  • Save gaborbata/12c34793632368d64f8e to your computer and use it in GitHub Desktop.
Save gaborbata/12c34793632368d64f8e to your computer and use it in GitHub Desktop.
BoxBot4k - Sokoban game in 4 kB of JavaScript (for pouët.net)
<!DOCTYPE html><html><title>B4K</title><canvas id="c" width="448" height="384"></canvas><script>function D(t){var x,o=t.split("|"),e=o.shift();for(x=o[N];x--;)e=e.replace(RegExp(o[x].charAt(0),"g"),o[x].substring(1));return e}function g(t,x,o,e){for(e=o[N];e--;)o[e]=t.charCodeAt(x*o[N]+e)-Z}function l(x,o){for(0>v?v=49:v>49&&(v=0),m=0,h=0,f=!1,g(L,v,t),x=W;x--;)for(o=H;o--;)4==t[W*o+x]&&(t[W*o+x]=1,u.x=x,u.y=o)}function p(x,o,e){for(x=3;x--;){for(o=W;o--;)for(e=H;e--;)q?2!=x||t[W*e+o]>2?1==x&&t[W*e+o]>2?w[M](z[8],o*Z+4,e*Z+4):0==x&&t[W*e+o]>2&&w[M](z[t[W*e+o]],o*Z,e*Z):w[M](z[t[W*e+o]],o*Z,e*Z):w[M](z[0],o*Z,e*Z);1==x&&q?w[M](z[7],u.x*Z+4,u.y*Z+4):0==x&&q&&w[M](z[4],u.x*Z,u.y*Z)}if(w.font="bold 14px sans-serif",w[S]="rgba(255,255,255,.4)",w.textAlign="center",q)f&&w[F](E[0],C,19),w[F](E[11]+(v+1)+E[10]+E[12]+m+E[10]+E[13]+h,C,376);else{for(x=1;x<E[N]-5;x++)w[F](E[x],C,19*x+106);w[F](E[9],C,376)}}function B(x,o,e,r,n,y){for(w=O.c[X]("2d"),z=Array(P[N]),o=Array(256),x=z[N];x--;){for(g(I,P[x][3],o),e=document.createElement("canvas"),e.width=Z,e.height=Z,r=e[X]("2d"),n=16;n--;)for(y=16;y--;)r[S]=P[x][o[16*y+n]],r.fillRect(2*n,2*y,2,2);z[x]=e}t=Array(W*H),v=0,u={x:0,y:0},q=!1,b=!1,l(),p(),O[A]("keydown",function(x,o,e,r,n){if(!b){if(b=!0,q){switch(n={x:0,y:0},x.keyCode){case 38:n.y=-1;break;case 40:n.y=1;break;case 37:n.x=-1;break;case 39:n.x=1;break;case 33:v++,l();break;case 34:v--,l();break;case 8:l();break;case 13:f&&(v++,l());break;default:return}if((0!=n.x||0!=n.y)&&!f){for(o=W*(u.y+n.y)+u.x+n.x,e=W*(u.y+2*n.y)+u.x+2*n.x,1==t[o]||2==t[o]?(u.x+=n.x,u.y+=n.y,m++):5!=t[o]&&6!=t[o]||1!=t[e]&&2!=t[e]||(t[o]=5==t[o]?1:2,t[e]=1==t[e]?5:6,u.x+=n.x,u.y+=n.y,m++,h++),e=!0,r=t[N];r--;)5==t[r]&&(e=!1);f=e}}else q=!0;x.preventDefault(),p()}}),O[A]("keyup",function(){b=!1})}var W=14,H=12,Z=32,C=224,A="addEventListener",F="fillText",M="drawImage",S="fillStyle",X="getContext",N="length",O=window,R="transparent",Q="rgba(0,0,0,.3)",P=[["#21285c","#19204c","#303378",2],["#5c3c20","#4c3018","#785830",2],["#74060c","#640305","#8e1618",2],["#a29b79","#cec491","#7f7543",3],[R,"#ccc","#888",0],["#c4a864","#a88448","#6f4e2a",1],["#c47865","#a85449","#6f2c2b",1],[R,Q,Q,0],[Q,Q,Q,1]],E=D("~ COMPLETED! PRzS ENTER TO CONTINUE.,BOXBOT4K,,GAME CONTROLS:,ARROW KEYS - MOVE,BACKSPACE - RzTART ~,PGUP/PGDN - NEXT/PREVIOUS ~,,PRzS ANY KEY TO START.,(C) 2014 GABOR BATA, ,~: ,MOVz: ,PUSHz: |~LEVEL|zES").split(","),L=D('uu~vpY,j-#WWPF!"=R`wN%$:&hb;mv`jwNkV&JNT8NwsSpjjYt$wEkbZ"Vdfg"#9NTbhkDYR oGCP"&&%$nC=xYd pDb"I":x:FDY0pD8sl"Bt#2EkNkbhws0wpai7w!HCn6"2a%twy;0pgxGCPU#kLxkspTY0fcottwOxeq!/lWt/1hl/pT-xYSfprp$%Z4&lcl%hAoxYMpjpX3X$%kaxwbhjYSobx"EJ8#Q!xbkTsl5S fnplnJ&q!HexaTx>dpYJ$jwEqEhNwsdvoQlXktHtxhPZtL%JkaFwa0ow@"Xp"L!lnxtknxT%Hxx>mOpDori#2ciI"4w!%"co;Mos tTwXlL%"&tne"&qPx_iVz~ `Y#%$YJ%wQ"WH1lAC!co;z~pjw:Fbh#9Q"W7"tXl@#QxYz~K_6xpOtkeq/x"$3/wkeprthh>R`-x"&hPkk$nlG#d owahh"yltaxkE9N$gd`5l#X$%kXtta"3>d pY1D#7W@!Q%t5"2gSf>%tHx%$kPin#UhBMwp8N"%wpOw&"Wqc#2%lc6-ROoB!3ne&%tP#F!nxhBRKBUU$Axk#k4Wk4#lcwpRvpyo!$<%kXhkQ"h5doG1$ZPkWL&#&_i!@!<pySowX3<%U>%&_eF!nC=dpD8#XtU7I$Qtts x"gd oQl7I$aUh#@VdKbl:FQ!k#7&!:,N"5S`spk#<Wa$#&hHx&ZLiVz~vo>Fahk"<kHwtB!W@!aZwaS`#g$hgU9Ek8Vd`BtZn#$IWnl,npZ5dpjjpXU&!L!ITnlG;mOfw<"kprw!"tkP"e$LZk<pymv`-iTA1&"%&!c6#Wn#lwadvGoxnlU%Ae$tkcw%"3nx6=Mfs t#9QUTX&"kXe#@VmvwY JoaUZXttprl%k$cwx%kQ;mKGxw!"c#lW49k"cl#TA,6=dfbl_eIkPU"hL!TwaMoGJh$UnxIk=!orC!ci!k4oAouu|~ |z####~~~~~~~|y#~ |x#!!|w##|v |u~~~|t#!|sy |rv |q!!|pw#|oww|n#~|mzu|lx!|k%!|jyvx|ixq|h"!|gs #|fos l|et%|dmu|c#r|bs#|ay#|` pj|_p~|Z"q|Yyv|Xyt|W%q|Vsw|U""|T$!|Sm~|Rd~~|Qyw|Pnt|Ov |Nsx|MS~r|Lnw|K o|J#"|I%%|Hw~|Go~|F$q|Ese|DVx|Ciq|B_w|Awr|@yi|>yp|=no|<yx|;lg|:st|9%#|8si|7ye|6#x|5#b|4cx|3Z!|2$"|1t"|0mr|/#O|-w_|,#h'),I=D('~jynttnyynhnyynivtumtumthomthomouhliol~trntrtv ytjtlz"rz"lllwouoywrujpggggssssp"ll~wouoywrujp"v uy ffxiel!v uuyyvelkffxi uyl~uy!jky!vdkdvoyr"!vzq ize~w!jy qykd!r"qyrd~"qqq"!roq!rzkzq z"rze~wukqy!v"!royvokz!vz zriz |~ |z"""|y!!|xzz !~~! |w" y|v~~ |uyyy|t!"|swwwwww|r |q!~"|pzzzzz"|o""|nt~v|mtt~ |l~~|k! |jry|izz|h!z|g"~|fxx|e !|d"y'),z,t,w,m,h,f,v,u,q,b;B();</script></html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment