diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..447ad6c8ab9632d1615dfefa0ce8906f179ca264
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+
+# for holding API keys for TinyPNG
+.env
diff --git a/build/aimerthing.png b/build/aimerthing.png
new file mode 100644
index 0000000000000000000000000000000000000000..008e6b6e80db33849d27736bfc8fd4b031af8045
Binary files /dev/null and b/build/aimerthing.png differ
diff --git a/build/arw.png b/build/arw.png
new file mode 100644
index 0000000000000000000000000000000000000000..f509667c3b90a211bad7a0c9ad450b281f67e4fe
Binary files /dev/null and b/build/arw.png differ
diff --git a/build/code.js b/build/code.js
new file mode 100644
index 0000000000000000000000000000000000000000..8301409b3f7edf507642dfb74c6c41ddd03bf55d
--- /dev/null
+++ b/build/code.js
@@ -0,0 +1 @@
+var lzs=function(){function e(e,o){if(!i[e]){i[e]={};for(var t=0;t<e.length;t++)i[e][e.charAt(t)]=t}return i[e][o]}var o=String.fromCharCode,t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",i={},l={compressToBase64:function(e){if(null==e)return"";var o=l._compress(e,6,(function(e){return t.charAt(e)}));switch(o.length%4){default:case 0:return o;case 1:return o+"===";case 2:return o+"==";case 3:return o+"="}},decompressFromBase64:function(o){return null==o?"":""==o?null:l._decompress(o.length,32,(function(r){return e(t,o.charAt(r))}))},compressToUTF16:function(e){return null==e?"":l._compress(e,15,(function(e){return o(e+32)}))+" "},decompressFromUTF16:function(e){return null==e?"":""==e?null:l._decompress(e.length,16384,(function(o){return e.charCodeAt(o)-32}))},compressToUint8Array:function(e){for(var o=l.compress(e),t=new Uint8Array(2*o.length),r=0,i=o.length;i>r;r++){var a=o.charCodeAt(r);t[2*r]=a>>>8,t[2*r+1]=a%256}return t},decompressFromUint8Array:function(e){if(null==e)return l.decompress(e);for(var t=new Array(e.length/2),r=0,i=t.length;i>r;r++)t[r]=256*e[2*r]+e[2*r+1];var a=[];return t.forEach((function(e){a.push(o(e))})),l.decompress(a.join(""))},compressToEncodedURIComponent:function(e){return null==e?"":l._compress(e,6,(function(e){return r.charAt(e)}))},decompressFromEncodedURIComponent:function(o){return null==o?"":""==o?null:(o=o.replace(/ /g,"+"),l._decompress(o.length,32,(function(t){return e(r,o.charAt(t))})))},compress:function(e){return l._compress(e,16,(function(e){return o(e)}))},_compress:function(e,o,t){if(null==e)return"";var r,i,l,a={},s={},c="",m="",n="",d=2,p=3,h=2,g=[],y=0,f=0;for(l=0;l<e.length;l+=1)if(c=e.charAt(l),Object.prototype.hasOwnProperty.call(a,c)||(a[c]=p++,s[c]=!0),m=n+c,Object.prototype.hasOwnProperty.call(a,m))n=m;else{if(Object.prototype.hasOwnProperty.call(s,n)){if(n.charCodeAt(0)<256){for(r=0;h>r;r++)y<<=1,f==o-1?(f=0,g.push(t(y)),y=0):f++;for(i=n.charCodeAt(0),r=0;8>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1}else{for(i=1,r=0;h>r;r++)y=y<<1|i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i=0;for(i=n.charCodeAt(0),r=0;16>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1}0==--d&&(d=Math.pow(2,h),h++),delete s[n]}else for(i=a[n],r=0;h>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1;0==--d&&(d=Math.pow(2,h),h++),a[m]=p++,n=String(c)}if(""!==n){if(Object.prototype.hasOwnProperty.call(s,n)){if(n.charCodeAt(0)<256){for(r=0;h>r;r++)y<<=1,f==o-1?(f=0,g.push(t(y)),y=0):f++;for(i=n.charCodeAt(0),r=0;8>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1}else{for(i=1,r=0;h>r;r++)y=y<<1|i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i=0;for(i=n.charCodeAt(0),r=0;16>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1}0==--d&&(d=Math.pow(2,h),h++),delete s[n]}else for(i=a[n],r=0;h>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1;0==--d&&(d=Math.pow(2,h),h++)}for(i=2,r=0;h>r;r++)y=y<<1|1&i,f==o-1?(f=0,g.push(t(y)),y=0):f++,i>>=1;for(;;){if(y<<=1,f==o-1){g.push(t(y));break}f++}return g.join("")},decompress:function(e){return null==e?"":""==e?null:l._decompress(e.length,32768,(function(o){return e.charCodeAt(o)}))},_decompress:function(e,t,r){var i,l,a,s,c,m,n,d=[],p=4,h=4,g=3,y="",f=[],w={val:r(0),position:t,index:1};for(i=0;3>i;i+=1)d[i]=i;for(a=0,c=Math.pow(2,2),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;switch(a){case 0:for(a=0,c=Math.pow(2,8),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;n=o(a);break;case 1:for(a=0,c=Math.pow(2,16),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;n=o(a);break;case 2:return""}for(d[3]=n,l=n,f.push(n);;){if(w.index>e)return"";for(a=0,c=Math.pow(2,g),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;switch(n=a){case 0:for(a=0,c=Math.pow(2,8),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;d[h++]=o(a),n=h-1,p--;break;case 1:for(a=0,c=Math.pow(2,16),m=1;m!=c;)s=w.val&w.position,w.position>>=1,0==w.position&&(w.position=t,w.val=r(w.index++)),a|=(s>0?1:0)*m,m<<=1;d[h++]=o(a),n=h-1,p--;break;case 2:return f.join("")}if(0==p&&(p=Math.pow(2,g),g++),d[n])y=d[n];else{if(n!==h)return null;y=l+l.charAt(0)}f.push(y),d[h++]=l+y.charAt(0),l=y,0==--p&&(p=Math.pow(2,g),g++)}}};return l}();"function"==typeof define&&define.amd?define((function(){return lzs})):"undefined"!=typeof module&&null!=module&&(module.exports=lzs);const A=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1]],B=[[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1]],C=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1],[,1,1],[,1,1],[,1,1,,,1,1],[,,1,1,1,1]],D=[[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1]],E=[[,,1,1,1,1,1],[,1,1,1,1,1,1],[,1,1],[,1,1,1,1,1],[,1,1],[,1,1,1,1,1,1],[,,1,1,1,1,1]],F=[[,,1,1,1,1,1],[,1,1,1,1,1,1],[,1,1],[,1,1,1,1,1],[,1,1],[,1,1],[,1,1]],G=[[,,1,1,1,1,1],[,1,1,1,1,1,1],,[,1,1],[,1,1,,1,1,1],[,1,1,,,1,1],[,1,1,1,1,1,1],[,,1,1,1,1]],H=[[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1]],I=[[,1,1,1,1,1,1],[,1,1,1,1,1,1],[,,,1,1],[,,,1,1],[,,,1,1],[,1,1,1,1,1,1],[,1,1,1,1,1,1]],J=[[,,1,1,1,1,1],[,,,,,1,1],[,,,,,1,1],[,,,,,1,1],[,,,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],K=[[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,1,1],[,1,1,1,1],[,1,1,,1,1],[,1,1,,,1,1],[,1,1,,,1,1]],L=[[,1,1],[,1,1],[,1,1],[,1,1],[,1,1],[,1,1,1,1,1,1],[,1,1,1,1,1,1]],M=[[,1,1,,,,1],[,1,1,1,,1,1],[,1,1,,1,,1],[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1]],N=[[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,,1,1],[,1,1,1,1,1,1],[,1,1,,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1]],O=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],P=[[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1],[,1,1],[,1,1],[,1,1]],Q=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,1,1,1],[,1,1,,,1,1],[,,1,1,1,1,,1]],R=[[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1]],S=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1],[,,1,1,1,1],[,,,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],T=[[,1,1,1,1,1,1],[,1,1,1,1,1,1],[,,,1,1],[,,,1,1],[,,,1,1],[,,,1,1],[,,,1,1]],U=[[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,1,1,1,1],[,,1,1,1,1]],V=[[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1],[,,1,1,,1],[,,,1,1]],W=[[,1,1,,,,1],[,1,1,,,,1],[,1,1,,,,1],[,1,1,,1,,1],[,1,1,,1,,1],[,1,1,,1,,1],[,,,1,,1]],X=[[,1,,,,,1],[,1,1,,,1,1],[,,1,1,1,1],[,,,1,1],[,,1,1,1,1],[,1,1,,,1,1],[,1,,,,,1]],Y=[[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1,1],[,,,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],Z=[[,1,1,1,1,1,1],[,,,,,1,1],[,,,,1,1],[,,,1,1],[,,1,1],[,1,1],[,1,1,1,1,1,1],,],one=[[,,,1,1],[,,1,1,1],[,,,1,1],[,,,1,1],[,,,1,1],[,,,1,1],[,1,1,1,1,1,1]],two=[[,,1,1,1,1],[,1,1,,,1,1],[,,,,,1,1],[,,,,1,1],[,,,1,1],[,,1,1],[,1,1,1,1,1,1]],thr=[[,,1,1,1,1],[,1,1,,,1,1],[,,,,,1,1],[,,,,1,1],[,,,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],fou=[[,,,,1,1,1],[,,,1,1,1,1],[,,1,1,,1,1],[,1,1,,,1,1],[,1,1,1,1,1,1],[,,,,,1,1],[,,,,,1,1]],fiv=[[,1,1,1,1,1,1],[,1,1],[,1,1],[,1,1,1,1,1],[,,,,,1,1],[,,,,,1,1],[,1,1,1,1,1]],six=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1],[,1,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],sev=[[,1,1,1,1,1,1],[,1,1,1,1,1,1],[,,,,1,1],[,,,,1,1],[,,,1,1],[,,,1,1],[,,,1,1]],eig=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],nin=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,,1,1,1,1,1],[,,,,,1,1],[,,,,,1,1],[,,,,,1,1]],zer=[[,,1,1,1,1],[,1,1,,,1,1],[,1,1,,,1,1],[,1,1,,1,1,1],[,1,1,1,,1,1],[,1,1,,,1,1],[,,1,1,1,1]],Slash=[[],[,,,,,,1],[,,,,,1],[,,,,1],[,,,1],[,,1],[,1]],Colon=[[,1,1],[,1,1],[],[],[],[,1,1],[,1,1]],Dot=[[],[],[],[],[],[,1,1],[,1,1]],Neg=[[],[],[],[,1,1,1,1,1,1],[],[],[]],Exclaim=[[,,1,1],[,,1,1],[,,1,1],[,1,1,1],[,1,1],[],[,1,1]],fI={A:A,B:B,C:C,D:D,E:E,F:F,G:G,H:H,I:I,J:J,K:K,L:L,M:M,N:N,O:O,P:P,Q:Q,R:R,S:S,T:T,U:U,V:V,W:W,X:X,Y:Y,Z:Z,1:one,2:two,3:thr,4:fou,5:fiv,6:six,7:sev,8:eig,9:nin,0:zer,"/":Slash,":":Colon,".":Dot,"-":Neg,"!":Exclaim};let id=0;const pi=Math.PI;let pause=0,lP="bye_dbh_";const gPar=e=>{let o=window.location.search;return new URLSearchParams(o).get(e)};let lS=localStorage,gS=e=>lS.getItem(e),sS=(e,o,t={})=>{t.c&&(o=lzs.compress(o)),lS.setItem(`${lP}${e}`,`${o}`)},o={};for(let e of Object.keys(lS))if(console.log(e),e.startsWith(`${lP}o_`)){switch(gS(e)){case"true":o[e.slice(10)]=1;break;case"false":o[e.slice(10)]=0}break}const cLV=gPar("lv");class Canvas{constructor(e){this.c=document.getElementById(e),this.ctx=this.c.getContext("2d"),this.w=this.c.width,this.h=this.c.height,this.tW=this.c.offsetWidth,this.tH=this.c.offsetHeight,this.cam={x:0,y:0},this.mPos={x:0,y:0}}fill(e){this.ctx.fillStyle=e,this.ctx.fillRect(0,0,this.w,this.h)}gMP(e){const o=this.c.getBoundingClientRect(),t=this.c.width/o.width,r=this.c.height/o.height;return this.mPos.x=(e.clientX-o.left)*t+this.cam.x,this.mPos.y=(e.clientY-o.top)*r+this.cam.y,{x:(e.clientX-o.left)*t,y:(e.clientY-o.top)*r}}translate(e,o){this.ctx.translate(e,o)}rotate(e){this.ctx.rotate(e)}dImg(e,o,t,r,i,l=0,a=o+r/2,s=t+i/2){this.ctx.save(),this.ctx.translate(a-this.cam.x,s-this.cam.y),this.ctx.rotate(l*pi/180),this.ctx.drawImage(e,-r/2,-i/2,r,i),this.ctx.restore()}sImg(e,o,t,r,i,l,a,s,c,m=0){this.ctx.save(),this.ctx.translate(o+r/2-this.cam.x,t+i/2-this.cam.y),this.ctx.rotate(m*pi/180),this.ctx.drawImage(e,l,a,s,c,-r/2,-i/2,r,i),this.ctx.drawImage(e,l,a,s,c,-r/2,-i/2,r,i),this.ctx.restore()}dI(e,o,t,r,i,l=0){this.dImg(e,o,t,r,i,l)}dR(e,o,t,r,i="white"){this.ctx.fillStyle=i,this.ctx.fillRect(e-this.cam.x,o-this.cam.y,t,r)}sR(e,o,t,r,i){this.ctx.strokeStyle=i,this.ctx.strokeRect(e-this.cam.x,o-this.cam.y,t,r)}dT(e,o,t,r,i,l,a="",s="top"){let c=(e=e.toUpperCase()).split(""),m=0;c.length%2==1&&(m=1);let n=(7*c.length-m)*i,d=7*r;switch(d%2==1&&(d+=1),"middle"===a?o-=n/2:"end"===a&&(o-=n),s){case"middle":case"center":t-=d/2;break;case"bottom":t-=d}let p=0,h=7*i;for(let e of c){this.ctx.fillStyle=l;let a=0,s=0,c=h;if(e=fI[e],null==e);else for(let l in e){s=0;for(let m of e[l])1==m&&this.ctx.fillRect(o+s*i+p*c-this.cam.x,t+a*r-this.cam.y,i,r),s++;a++}p++,h=7*i}return{w:n,h:d}}sC(e,o){this.cam.x=e,this.cam.y=o}}class Entity{constructor(e,o,t,r){this.name=e,this.x=o,this.y=t,this.sprite=r}step(){console.log(`${this.name} is stepping`),console.log(`${this.name} is at ${this.x}, ${this.y}`)}draw(){}intersects(e){return this.x<e.x+e.w&&this.x+this.w>e.x&&this.y<e.y+e.h&&this.y+this.h>e.y}}class Room{constructor(e){this.id=id,id+=1,this.name=e,this.objects=[],this.background="#111",this.w=c.w,this.h=c.h}spawn(e){this.objects.push(e)}step(){for(let e of this.objects)e.step()}draw(){for(let e of this.objects)e.draw()}dGUI(){}kD(e){}kH(e){}click(e,o){}start(){c.cam={x:0,y:0}}}let c=new Canvas("gameCanvas");gameCtx=c.ctx,c.fill("#151f1f"),gameCtx.imageSmoothingEnabled=!1;let dPM=e=>{c.ctx.globalAlpha=.7,c.fill("#000"),c.ctx.globalAlpha=.85,c.dR(c.w/2-150+c.cam.x,120+c.cam.y,300,120,"#000"),c.ctx.globalAlpha=1,c.dT("paused",c.w/2+c.cam.x,c.h/2-30+c.cam.y,3,3,"#fff","middle","middle");for(let e in gameRoom.pseo){let o=c.dT(gameRoom.pseo[e].t,c.w/2+c.cam.x,c.h/2+9*e+c.cam.y,1,1,"#fff","middle");if(e==gameRoom.pses){let t=img.i.a;c.dImg(t,c.w/2+c.cam.x-o.w/2-8,c.h/2+9*e+c.cam.y,6,7)}}};c.dT("Death By Hamster",c.w/2,c.h/2-40,2,2,"white","middle");let lErrT,img={i:{ingame:"./aimerthing.png",cursor:"./cursor.png",tileset:"./t.png",human:"./human.png",car:"./hamster.png",gun:"./gun.png",a:"./arw.png"}},loader=new Room("loader"),lText="Loading...",lErr=0;loader.dGUI=()=>{c.dT(lText,c.w/2,c.h/2,2,2,"white","middle"),lErr&&c.dT(lErrT,c.w/2,c.h/2+20,1,1,"red","middle")};let rooms=[],limg=0,timg=0;for(let e in img)for(let o in img[e])timg++;lText="Loading...",lText=`Loading images (${limg} / ${timg})`;for(let e in img)for(let o in img[e]){let t=new Image;t.addEventListener("load",(()=>{limg++,lText=`Loading images (${limg} / ${timg})`,limg==timg&&(loader.step=()=>{cRoom=rooms[1]},lText="Loaded! Please wait...")})),t.addEventListener("error",(e=>{lErr=1,lErrT=`Error loading image ${e.target.src}`})),t.src=img[e][o],img[e][o]=t,lText=`Loading images (${limg} / ${timg})`}let levels=["NrCMBoIJgXXNLgMx2AVkQFlRXqrgAMy+R4s8BxoqmZhqGED8GVjyRHdL64AbF1bgMvDAHYhwQQA4p0EvAhJFCOiiUDVESRoSSK+yDi01NbE4MMQMem8c10za8qgCc5V5pXXOzhc6SxNjCBCEIcnbgcuE64LHgHglyaCYeqZqSGQgeUXK+ggmgwSbFIqXE-GkCJnJV8IKC2YKS9dIi8ahZ5fCtNb3RDu0egYle7WWGkmV6tp3CdOEEkuIcoMprBHqCoCp6BLvzwAcq2Sf9x5Aqq5RX0aSHbqSSMs+JXeDTvHKHxZuQYkguEBZT+whGgJ+vAgclemjkT3hn2qNwQZVRuB0pQgbUxRzx2VwYVKBFxkAIhPJyM0oAIcLRBERaIgTLx9NBxHZYy5HlZAPeMCAA","NrCsBoGZwBgXXMALLWCzgIxsRATDsAJzgF7qYEry7gQ0YBshEA7C+ABwckMSYwOmbAwKDMFKFknRyibAQnys05QvRVVwTXO2pdzSoQFZBuxYo1YyVo5EnCoD9WuxLgb8ZJLvsJXX5OaoL2ytyhHuDsEdgQMeDM8fiS7AFcpBQozGn8koYpWtjcvlLxBPHYEWJBeigR7ChI6BAQTbTMbRgNzemdECR9puCDjp2ORp2G0J2K0KC20IxWgjOo84jVSxtY0Kw9Rpz7RfuCh7QkZxjcl2xcPRA3Ko8EjyiP0I-Ml8Uf6OynyyiMmGkioDhBajooKhyjmkhQ60ii3hCRRe1hQOUBHRkQIW0i2HxbkxkRaeRhkXYiKKFMC1KG9McjIIzNRamxzhJni5QyJ4BIfJIOJpwvSfPY4p5zGFgmYfIg8q5KEcSzgQA","NrCMBoCZwFgXXGcBmcBWBTX0dCPg91MiA2E8CAdkwlRsTRXAA5Mno3ErLXapiiCNHJCBDMDGaiwwlBWiQFlTFOgAGds02NY4HcCZMDTUvq0tzunifABOK4crrHTUBFugNW0Kk9SDM1BjTB4pAiNYLTMI8DD+HgxEenAZdzi+XSkuJyYc00zCDIl8OP4pNJdTcsEkI34zJKQzNNSysSYS5lB+VCVdVGRMGPkxNRqejpUhKqh+JiGxM0XmuaXppB5JzbWdlYhLfdZdg42IB23zk-tRpFAXI-vrp8vKCFf0x6r+L3a7itoLlAUiaeSiugcsSeUPwPmgBCC2AovlqKJRMjcqHyb0Kbk4Phc2Ic2MsOVOTVOXUsrQcFJuNL+7xcJSBLla6XZ1B+Im5qJxdJRXWBfzc2UwlmChTwnWR1VwlHq8slBGlu1VK1V2wuwl5H0UvMegx+fWNZ0oUg+Uke4zEwoI70s-SKoB4TrwWx+Ep+F2RPEeh29tyCkORtNClAcGKgbK0kAgUcgPLEib5KftUGgRxTTo4eH4kCB4bjZuLFItDidwhclejtyr4KQBdR1dhybo+Z1iEdqBkZkgqG2ihN8v7tyHDfHoMolgIW3iiAtNmGUA8PksngctibBgt8jgQA"];hamsterRef={file:img.i.car,nl:{x:0,y:0,w:32,h:16}};let lRef={file:img.i.tileset,default:{x:0,y:0,w:32,h:32,type:"blank"},tiles:[{},{x:32,type:"floor"},{x:64,type:"wall"},{x:96,type:"wall"},{x:128,type:"wall"},{x:160,type:"wall"},{x:192,type:"wall"},{x:224,type:"wall"},{x:256,type:"wall"},{x:32,type:"floor"},{x:32,type:"floor"},{x:352,type:"wall"},{x:384,type:"wall"},{x:416,type:"wall"},{x:448,type:"vent"}]};for(let e of lRef.tiles)for(let o in lRef.default)e[o]||(e[o]=lRef.default[o]);console.debug(img);let targFPS=60,frame=0,menu=new Room("menu");menu.s=0,menu.o=[{t:"Play",a:e=>{setRoom(4)}},{t:"Editor",a:e=>{setRoom(3)}},{t:"Settings",a:e=>{setRoom(5)}}],menu.dGUI=()=>{c.dT("Death by Hamster",c.w/2,c.h/2-25,4,4,"white","middle","middle"),c.dT("W/Up or S/Down to select",c.w/2,c.h/2,1,1,"gray","middle","middle"),c.dT("Space or ENTER to activate",c.w/2,c.h/2+8,1,1,"gray","middle","middle");for(let e in menu.o){let o=c.dT(`${menu.o[e].t}`,c.w/2,c.h/2+50+20*e,2,2,"#fff","middle","top");if(menu.s==e){let t=img.i.a,r=c.w/2-o.w/2-t.width-4,i=c.w/2+o.w/2+t.width-4;c.dImg(t,r,c.h/2+50+20*e,2*t.width,2*t.height),c.dImg(t,i,c.h/2+50+20*e,2*t.width,2*t.height,180)}}};const nextRoom=()=>{roomI++,roomI>=rooms.length&&(roomI=0),cRoom=rooms[roomI],cRoom.start()},prevRoom=()=>{roomI--,roomI<0&&(roomI=rooms.length-1),cRoom=rooms[roomI],cRoom.start()},setRoom=e=>{cRoom=rooms[e],cRoom.start()};menu.kD=e=>{"ArrowUp"!=e&&"KeyW"!=e||(menu.s-=1,menu.s<0&&(menu.s=menu.o.length-1)),"ArrowDown"!=e&&"KeyS"!=e||(menu.s+=1,menu.s>menu.o.length-1&&(menu.s=0)),"Space"!=e&&"Enter"!=e||menu.o[menu.s].a()};let gameRoom=new Room("Game"),lvlS=new Room("Level Select");lvlS.s=0,lvlS.o=levels,gameRoom.humans=0,gameRoom.li=0;let player=new Entity("Player",0,0);player.speed=0,player.maxSpeed=20,player.direction=0,player.sprite=img.i.car,player.crop=hamsterRef.nl,player.x=0,player.y=0,player.w=2*player.crop.w,player.h=2*player.crop.h,gameRoom.o=[{t:"Next Level",a:e=>{lvlS.s+=1,lvlS.kD("Space"),gameRoom.tutorial=0}},{t:"Level Select",a:e=>{setRoom(4)}},{t:"Menu",a:e=>{setRoom(1)}}],gameRoom.s=0,gameRoom.pseo=[{t:"Back to Menu",a:e=>{setRoom(1)}},{t:"Level Select",a:e=>{setRoom(4)}}],gameRoom.pses=0,player.oldDir=0,player.step=e=>{player.x+=player.speed*Math.cos(player.direction*pi/180),player.y+=player.speed*Math.sin(player.direction*pi/180),player.checkpoints=[];for(let e=0;e<9;e++){let o=player.x+player.w/2,t=player.y+player.h/2,r=0,i=0;switch(e){case 0:r=-32;break;case 1:r=32;break;case 2:r=-30,i=-15;break;case 3:r=-30,i=15;break;case 4:r=30,i=-15;break;case 5:r=30,i=15;break;case 6:r=20;break;case 7:r=-20}let l=o-r*Math.cos(player.direction*pi/180)-i*Math.sin(player.direction*pi/180),a=t-r*Math.sin(player.direction*pi/180)+i*Math.cos(player.direction*pi/180);player.checkpoints.push({x:l,y:a}),player.speed*=.9}for(let e of player.checkpoints){let o=e.x/64,t=e.y/64;gameRoom.checkwall(o,t)&&(player.direction=player.oldDir,player.x=player.xy[0],player.y=player.xy[1],player.speed-=.1)}c.sC(player.x-c.w/2,player.y-c.h/2),player.oldDir=player.direction,player.xy=[player.x,player.y]},console.log(player),player.draw=e=>{c.sImg(player.sprite,player.x,player.y,player.w,player.h,player.crop.x,player.crop.y,player.crop.w,player.crop.h,player.direction);let o=img.i.gun,t=player.x+player.w/2,r=player.y+player.h/2,i=t-13*Math.cos(player.direction*pi/180)-0*Math.sin(player.direction*pi/180),l=r-13*Math.sin(player.direction*pi/180)+0*Math.cos(player.direction*pi/180);player.gx=i,player.gy=l,pause||gameRoom.finish||(player.aim=180*Math.atan2(c.mPos.y-l,c.mPos.x-i)/pi),c.dImg(o,i,l,2*o.width,2*o.height,player.aim,i,l);for(let e of player.checkpoints)c.dR(e.x,e.y,1,1,"black")},player.shoot=()=>{let e=new Entity("Bullet",player.gx,player.gy);e.speed=20,e.direction=player.aim,e.w=2,e.h=2,e.step=()=>{for(let o=0;o<cRoom.objects.length;o++){let t=cRoom.objects[o];if(t!=e&&t.intersects(e)&&(console.log(t),t!=player))return cRoom.objects.splice(o,1),cRoom.objects.splice(cRoom.objects.indexOf(e),1),void(gameRoom.humans-=1)}gameRoom.checkwall(e.x/64,e.y/64)&&cRoom.objects.splice(cRoom.objects.indexOf(e),1),e.x+=e.speed*Math.cos(e.direction*pi/180),e.y+=e.speed*Math.sin(e.direction*pi/180)},e.draw=()=>{c.dR(e.x,e.y,e.w,e.h,"#2f2f2f")},cRoom.spawn(e)},gameRoom.kD=e=>{if(!pause&&!gameRoom.finish&&("ArrowUp"!=e&&"KeyW"!=e||(player.speed+=player.accel,player.speed>player.maxSpeed&&(player.speed=player.maxSpeed)),"ArrowDown"!=e&&"KeyS"!=e||(player.speed-=.8*player.accel,player.speed<-player.maxSpeed&&(player.speed=-player.maxSpeed)),"ArrowLeft"!=e&&"KeyA"!=e||(player.direction-=2.5,player.direction<0&&(player.direction=360)),"ArrowRight"!=e&&"KeyD"!=e||(player.direction+=2.5,player.direction>360&&(player.direction=0)),"Space"==e&&player.shoot(),"ShiftLeft"==e)){console.log("Triggered!");for(let e=6;e<9;e++){let o=Math.floor(player.checkpoints[e].x/64),t=Math.floor(player.checkpoints[e].y/64);for(let e of gameRoom.level)if("vent"==lRef.tiles[e[0]].type&&e[1]==o&&e[2]==t)for(let e of gameRoom.level)"vent"==lRef.tiles[e[0]].type&&e[1]!=o&&e[2]!=t&&(console.log(o,t),console.log(e[1],e[2]),player.x=64*e[1],player.y=64*e[2]+16,player.speed=0)}}gameRoom.finish||("KeyP"!=e&&"Escape"!=e||(pause=!pause),pause&&("ArrowUp"!=e&&"KeyW"!=e||(gameRoom.pses-=1,gameRoom.pses<0&&(gameRoom.pses=gameRoom.pseo.length-1)),"ArrowDown"!=e&&"KeyS"!=e||(gameRoom.pses+=1,gameRoom.pses>gameRoom.pseo.length-1&&(gameRoom.pses=0)),"Space"!=e&&"Enter"!=e||(pause=0,gameRoom.tutorial=0,gameRoom.pseo[gameRoom.pses].a()))),gameRoom.finish&&("ArrowUp"!=e&&"KeyW"!=e||(gameRoom.s-=1,gameRoom.s<0&&(gameRoom.s=gameRoom.o.length-1)),"ArrowDown"!=e&&"KeyS"!=e||(gameRoom.s+=1,gameRoom.s>gameRoom.o.length-1&&(gameRoom.s=0)),"Space"!=e&&"Enter"!=e||(gameRoom.finish=0,gameRoom.tutorial=0,gameRoom.o[gameRoom.s].a()))},gameRoom.kH=e=>{pause||gameRoom.finish||("ArrowUp"!=e&&"KeyW"!=e||(player.speed+=player.accel,player.speed>player.maxSpeed&&(player.speed=player.maxSpeed)),"ArrowDown"!=e&&"KeyS"!=e||(player.speed-=1.1*player.accel,player.speed<-player.maxSpeed&&(player.speed=-player.maxSpeed)),"ArrowLeft"!=e&&"KeyA"!=e||(player.direction-=2.5,player.direction<0&&(player.direction=360)),"ArrowRight"!=e&&"KeyD"!=e||(player.direction+=2.5,player.direction>360&&(player.direction=0)))},gameRoom.click=e=>{pause||gameRoom.finish||player.shoot()},gameRoom.checkwall=(e,o)=>{e=Math.floor(e),o=Math.floor(o);for(let t of gameRoom.level)if("wall"==lRef.tiles[t[0]].type&&t[1]==e&&t[2]==o)return!0;return!1},gameRoom.start=()=>{cLV&&(gameRoom.level=cLV),gameRoom.li&&(gameRoom.level=JSON.parse(lzs.decompressFromEncodedURIComponent(levels[gameRoom.li-1]))),gameRoom.finish=0,gameRoom.objects=[],gameRoom.humans=0,gameRoom.spawn(player),gameRoom.tutorial?player.accel=.8:player.accel=1.5;for(let e of gameRoom.level)if(9===e[0]&&(player.x=64*e[1]+32,player.y=64*e[2]+32),10===e[0]){let o=new Entity("Human",64*e[1],64*e[2],img.i.human);o.w=52,o.h=32,o.bh=Math.floor(3*Math.random()),o.bb=Math.floor(3*Math.random()),o.getT=e=>{o.tX=Math.floor((o.x+o.w)/64),o.tY=Math.floor((o.y+o.h)/64)},o.step=e=>{let t=[o.x,o.y];if(o.timer<=0){let e=Math.floor(4*Math.random());if(o.direction=90*e,0===e&&(o.y-=o.h),1===e&&(o.x+=o.w),2===e&&(o.y+=o.w),3===e&&(o.x-=o.h),o.getT(),gameRoom.checkwall(o.tX,o.tY))return o.x=t[0],o.y=t[1],void o.step();o.timer=Math.floor(60*Math.random())+60}o.timer--},o.draw=e=>{c.sImg(o.sprite,o.x,o.y,o.w,o.h,o.bb*o.w/2,0,o.w/2,o.h/2,o.direction),c.sImg(o.sprite,o.x,o.y,o.w,o.h,o.bh*o.w/2,o.h/2,o.w/2,o.h/2,o.direction)},o.timer=90,gameRoom.spawn(o),gameRoom.humans+=1}},gameRoom.step=e=>{if(lvlS.s+1>=lvlS.o.length&&(gameRoom.o[0]={t:"you killed them all!",a:e=>{alert("well done!!!")}}),!pause&&!gameRoom.finish){gameRoom.humans<=0&&(gameRoom.tutorial=0,gameRoom.finish=!0);for(let e of gameRoom.objects)e.step()}},gameRoom.draw=e=>{for(let e of gameRoom.level)c.sImg(lRef.file,32*e[1]*2,32*e[2]*2,64,64,lRef.tiles[e[0]].x,0,32,32);gameRoom.tutorial&&(c.dT("Welcome to",192,79,1,1,"black"),c.dT("Death by Hamster",224,89,2,2,"black","middle"),c.dT("Use WASD/arrows to move",128,128,1,1,"black"),c.dT("Aim with the mouse and click to shoot!",128,138,1,1,"black"),c.dT("As a member of the hamster uprising,",384,217,1,1,"black"),c.dT("you might want to kill any humans",384,227,1,1,"black"),c.dT("you find!",624,237,1,1,"black","end"));for(let e=0;e<cRoom.objects.length;e++)cRoom.objects[e].draw()},gameRoom.dGUI=e=>{if(c.dT(`Humans:${gameRoom.humans}`,c.w-10+c.cam.x,10+c.cam.y,2,2,"#fff","end"),pause&&dPM(gameRoom),gameRoom.finish){c.ctx.globalAlpha=.7,c.fill("#000"),c.ctx.globalAlpha=.85,c.dR(c.w/2-150+c.cam.x,120+c.cam.y,300,150,"#000"),c.ctx.globalAlpha=1,c.dT("You Won!",c.w/2+c.cam.x,c.h/2-30+c.cam.y,3,3,"#fff","middle","middle");for(let e in gameRoom.o){let o=c.dT(gameRoom.o[e].t,c.w/2+c.cam.x,c.h/2+9*e+c.cam.y,1,1,"#fff","middle");if(e==gameRoom.s){let t=img.i.a;c.dImg(t,c.w/2+c.cam.x-o.w/2-8,c.h/2+9*e+c.cam.y,6,7)}}}};let editor=new Room("Editor");editor.i=0,editor.t=lRef,editor.l=[],editor.saving=!1,editor.sa=0,editor.start=e=>{editor.dPos=[15,65]},editor.draw=e=>{for(let e of editor.l)c.sImg(lRef.file,32*e[1]+editor.dPos[0],32*e[2]+editor.dPos[1],32,32,32*e[0],0,32,32),c.dR(editor.dPos[0],editor.dPos[1],1,1,"red")},editor.step=e=>{editor.i<0&&(editor.i=lRef.tiles.length-1),editor.i>lRef.tiles.length-1&&(editor.i=0)},editor.generate=e=>{editor.saving=1;for(let e of editor.l)0==e[0]&&editor.l.splice(editor.l.indexOf(e));let o=lzs.compressToEncodedURIComponent(JSON.stringify(editor.l));console.log(o),o!=editor.data&&(document.getElementById("leveltext").innerText=o,document.getElementById("levelLink").innerHTML=`<a href="/?lv=${o}&goto=2">Play</a>`),editor.data=o,editor.saving=0,editor.sa=1},editor.click=(e,o)=>{if(o<50)e>516&&o<50&&(editor.saving||editor.generate(),editor.saveclick=!0);else{e=Math.floor((e-editor.dPos[0])/32),o=Math.floor((o-editor.dPos[1])/32);for(let t in editor.l)if(editor.l[t][1]==e&&editor.l[t][2]==o)return void(editor.l[t]=[editor.i,e,o]);editor.l.push([editor.i,e,o]),editor.sa=0}},editor.kH=e=>{switch(e){case"KeyW":case"ArrowUp":editor.dPos[1]+=4;break;case"KeyS":case"ArrowDown":editor.dPos[1]-=4;break;case"KeyA":case"ArrowLeft":editor.dPos[0]+=4;break;case"KeyD":case"ArrowRight":editor.dPos[0]-=4}},editor.dGUI=e=>{c.dR(0,0,c.w,50,"gray"),c.dT(`DBH Editor::${editor.n}`,15,25,2,2,"#fff","start","middle");let o=c.dT("Save",c.w-15,25,2,2,"#fff","end","middle");c.mPos.x>c.w-30-o.w&&c.mPos.y<50&&c.dT("Save",c.w-15,25,2,2,"#e5e5e5","end","middle"),editor.sa&&c.dT("Save",c.w-15,25,2,2,"#1fdc2f","end","middle"),editor.saving&&c.dT("Save",c.w-15,25,2,2,"#1fccdc","end","middle"),c.sImg(editor.t.file,c.mPos.x+16,c.mPos.y+16,32,32,32*editor.i,0,32,32)},lvlS.dGUI=()=>{c.dT("Death by Hamster",c.w/2,25,2,2,"white","middle","top"),c.dT("Level Select",c.w/2,44,1,1,"gray","middle","middle");for(let e in lvlS.o){let o=parseInt(e)+1;c.dT(`${o}`,20+32*o,70,2,2,"#fff","middle","middle"),e==lvlS.s&&c.sR(6+32*o,54,32,32,"#fff")}},lvlS.kD=e=>{"ArrowUp"!=e&&"ArrowRight"!=e&&"KeyW"!=e&&"KeyD"!=e||(lvlS.s-=1,lvlS.s<0&&(lvlS.s=lvlS.o.length-1)),"ArrowDown"!=e&&"ArrowLeft"!=e&&"KeyS"!=e&&"KeyA"!=e||(lvlS.s+=1,lvlS.s>lvlS.o.length-1&&(lvlS.s=0)),"Space"!=e&&"Enter"!=e||(gameRoom.li=lvlS.s+1,0===lvlS.s&&(gameRoom.tutorial=1),setRoom(2)),"KeyE"==e&&(editor.l=JSON.parse(lzs.decompressFromEncodedURIComponent(lvlS.o[lvlS.s].data)),setRoom(3))};let options=new Room("Settings");options.s=0,options.ops=o,options.o=[{t:"Show FPS",a:e=>{o.showFPS=!o.showFPS,sS("o_showFPS",o.showFPS)},v:"showFPS"},{t:"Menu",a:e=>{setRoom(0)}}],options.dGUI=()=>{c.dT("Settings",c.w/2,25,2,2,"#fff","middle","top");for(let e in options.o){let o=options.o[e];c.dT(`${options.o[e].t}`,150,50+20*e,2,2,"#fff","left","top");if(options.s==e){let o=img.i.a;c.dImg(o,136,50+20*e,2*o.width,2*o.height)}let t=options.ops[o.v];null!=t&&c.dT(`${t}`,450,50+20*e,2,2,"#fff","end")}},options.kD=e=>{"ArrowUp"!=e&&"ArrowRight"!=e&&"KeyW"!=e||(options.s-=1,options.s<0&&(options.s=options.o.length-1)),"ArrowDown"!=e&&"ArrowLeft"!=e&&"KeyS"!=e||(options.s+=1,options.s>options.o.length-1&&(options.s=0)),"Space"!=e&&"Enter"!=e||options.o[options.s].a&&options.o[options.s].a()},rooms.push(loader),rooms.push(menu),rooms.push(gameRoom),rooms.push(editor),rooms.push(lvlS),rooms.push(options);let roomI=gPar("goto")?gPar("goto"):0,cRoom=rooms[roomI],keysPressed={},keysLastPressed={};document.addEventListener("keydown",(e=>{keysPressed[e.code]=!0})),document.addEventListener("keyup",(e=>{keysPressed[e.code]=!1,keysLastPressed[e.code]=!1}));let lastTime=0,mse={x:0,y:0},lastClick={x:0,y:0},leftclicked=!1,rightclicked=!1;c.c.addEventListener("mousemove",(e=>{mse=c.gMP(e)})),c.c.addEventListener("mousedown",(e=>{switch(e.preventDefault(),lastClick=c.gMP(e),mse=c.gMP(e),e.button){case 0:leftclicked=1;break;case 1:rightclicked=1}})),c.c.addEventListener("mouseup",(e=>{lastClick=c.gMP(e),mse=c.gMP(e)})),c.c.oncontextmenu=e=>0,window.onwheel=e=>{e.deltaY>0&&(editor.i+=1),e.deltaY<0&&(editor.i-=1)};try{cRoom.start(),setInterval((()=>{c.tW=c.c.offsetWidth,c.tH=c.c.offsetHeight,c.scale=c.tW/c.w,frame++,c.fill(cRoom.background);for(let e in keysPressed)keysPressed[e]&&(keysLastPressed[e]?keysLastPressed[e]&&cRoom.kH(e):(cRoom.kD(e),keysLastPressed[e]=!0));switch(leftclicked&&(cRoom.click(lastClick.x,lastClick.y),leftclicked=0),cRoom.step(),cRoom.draw(),cRoom.dGUI(),o.showFPS&&c.dT(`FPS:${Math.round(1e3/(Date.now()-lastTime))}`,0+c.cam.x,0+c.cam.y,1,1,"#fafafa","left","top"),cRoom.name){case"menu":case"Editor":c.ctx.drawImage(img.i.cursor,Math.round(mse.x),Math.round(mse.y),2*img.i.cursor.width,2*img.i.cursor.height);break;case"Game":c.ctx.drawImage(img.i.ingame,Math.round(mse.x)-16,Math.round(mse.y)-16,32,32)}lastTime=Date.now()}),1e3/targFPS)}catch(e){c.fill("#1c1c1c"),c.dT("Death By Hamster",c.w/2,c.h/2-40,2,2,"white","middle"),c.dT(`${e}`,c.w/2,c.h/2,1,1,"red","middle"),c.dT("pls let Bye know by emailing him via",c.w/2,c.h/2+40,1,1,"white","middle"),c.dT("bye at byecorps.com",c.w/2,c.h/2+60,2,2,"white","middle")}
\ No newline at end of file
diff --git a/build/cursor.png b/build/cursor.png
new file mode 100644
index 0000000000000000000000000000000000000000..ca76e84e80889ed8e2719e377c1aaeeb957afde9
Binary files /dev/null and b/build/cursor.png differ
diff --git a/build/gun.png b/build/gun.png
new file mode 100644
index 0000000000000000000000000000000000000000..0f28c2665e4de59a860284bd4a7312eb7e791d67
Binary files /dev/null and b/build/gun.png differ
diff --git a/build/hamster.png b/build/hamster.png
new file mode 100644
index 0000000000000000000000000000000000000000..834ee79bc38517ef490430e06796ff2ffcad8c4b
Binary files /dev/null and b/build/hamster.png differ
diff --git a/build/human.png b/build/human.png
new file mode 100644
index 0000000000000000000000000000000000000000..24c301b490aa74e9c2c3fdf0311fb1927a3140b0
Binary files /dev/null and b/build/human.png differ
diff --git a/build/index.html b/build/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..9a65fc600a19cb047c29a27b1a0db5f1e8381191
--- /dev/null
+++ b/build/index.html
@@ -0,0 +1,40 @@
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Death by Hamster</title>
+<style>
+    body {
+        background:rgb(22, 22, 22);
+    }
+    #gameCanvas {
+        display: block;
+        margin: auto;
+        width: 1200px;
+        height: 800px;
+        image-rendering: -moz-crisp-edges;
+        image-rendering: -webkit-crisp-edges;
+        image-rendering: pixelated;
+        cursor: none;
+    }
+    /* if the canvas can't fit the screen, shrink it, maintaining the aspect ratio */
+
+    aside {
+        float:left;
+    }
+    aside pre {
+        color: white;
+    }
+
+    @media screen and (max-height: 800px) {
+        #gameCanvas {
+            width: auto;
+            height: 100%;
+        }
+    }
+
+</style>
+<aside >
+    <pre id="leveltext"></pre>
+    <p id="levelLink"></p>
+</aside>
+<canvas width="600" height="400" id="gameCanvas">
+</canvas>
+<script src="./code.js"></script>
\ No newline at end of file
diff --git a/build/t.png b/build/t.png
new file mode 100644
index 0000000000000000000000000000000000000000..46fbe3975400da32fe707105c497f65adadb40f5
Binary files /dev/null and b/build/t.png differ
diff --git a/game.js b/game.js
index 0bdc46f0ea9184554843952f26c95ba429080129..86e16ee5443982f5eed3e9e57654334a355b3d6c 100644
--- a/game.js
+++ b/game.js
@@ -7,7 +7,7 @@
 let id = 0;
 const pi = Math.PI;
 let pause = 0;
-let lPrefix = "bye_dbh_" // this is for JS13K's shared localStorage
+let lP = "bye_dbh_" // this is for JS13K's shared localStorage
 const gPar = (key) => {
 
     // Address of the current window
@@ -21,22 +21,24 @@ const gPar = (key) => {
     return parameterList.get(key)
 };
 
-let getStore = (o) => {
-    return localStorage.getItem(o);
+let lS = localStorage
+
+let gS = (o) => {
+    return lS.getItem(o);
 }
-let setStore = (o, v, ops={}) => {
+let sS = (o, v, ops={}) => {
     if (ops.c) { // compression
         v = lzs.compress(v);
     }
-    localStorage.setItem(`${lPrefix}${o}`, `${v}`);
+    lS.setItem(`${lP}${o}`, `${v}`);
 }
 let o = {
 }
 
-for (let i of Object.keys(localStorage)) {
+for (let i of Object.keys(lS)) {
     console.log(i)
-    if (i.startsWith(`${lPrefix}o_`)) {
-        switch(getStore(i)) {
+    if (i.startsWith(`${lP}o_`)) {
+        switch(gS(i)) {
             case "true":
                 o[i.slice(10)] = 1
                 break;
@@ -48,7 +50,7 @@ for (let i of Object.keys(localStorage)) {
     }
 }
 
-const customLv = gPar("lv");
+const cLV = gPar("lv");
 
 class Canvas {
     constructor(id) {
@@ -59,9 +61,9 @@ class Canvas {
         // get the width and height of the canvas from CSS
         this.tW = this.c.offsetWidth;
         this.tH = this.c.offsetHeight;
-        this.camera = {x: 0, y: 0};
+        this.cam = {x: 0, y: 0};
 
-        this.mousePos = {x: 0, y: 0};
+        this.mPos = {x: 0, y: 0};
 
     }
 
@@ -71,13 +73,13 @@ class Canvas {
     }
 
     // Mouse position crap
-    getMousePos(evt) {
+    gMP(evt) {
         const rect = this.c.getBoundingClientRect(), // abs. size of element
             scaleX = this.c.width / rect.width,    // relationship bitmap vs. element for x
             scaleY = this.c.height / rect.height;  // relationship bitmap vs. element for y
 
-        this.mousePos.x = ((evt.clientX - rect.left) * scaleX) + this.camera.x;
-        this.mousePos.y = ((evt.clientY - rect.top) * scaleY) + this.camera.y;
+        this.mPos.x = ((evt.clientX - rect.left) * scaleX) + this.cam.x;
+        this.mPos.y = ((evt.clientY - rect.top) * scaleY) + this.cam.y;
 
         return {
         x: (evt.clientX - rect.left) * scaleX,   // scale mouse coordinates after they have
@@ -94,16 +96,16 @@ class Canvas {
     }
 
     // Drawing
-    drawImg(img, x,y,w,h, direction=0, originx=x+w/2, originy=y+h/2) {
+    dImg(img, x, y, w, h, direction=0, originx=x+w/2, originy=y+h/2) {
         this.ctx.save();
-        this.ctx.translate(originx-this.camera.x, originy-this.camera.y);
+        this.ctx.translate(originx-this.cam.x, originy-this.cam.y);
         this.ctx.rotate(direction * pi/180);
         this.ctx.drawImage(img, (-w/2), -h/2, w, h);
         this.ctx.restore();
     }
-    sliceImage(img, x, y, w, h, cropX, cropY, cropW, cropH, direction=0) {
+    sImg(img, x, y, w, h, cropX, cropY, cropW, cropH, direction=0) {
         this.ctx.save();
-        this.ctx.translate((x+w/2)-this.camera.x, (y+h/2)-this.camera.y);
+        this.ctx.translate((x+w/2)-this.cam.x, (y+h/2)-this.cam.y);
         this.ctx.rotate(direction * pi/180);
         this.ctx.drawImage(img, cropX, cropY, cropW, cropH, -w/2, -h/2, w, h);
         this.ctx.drawImage(img, cropX, cropY, cropW, cropH, -w/2, -h/2, w, h);
@@ -111,27 +113,22 @@ class Canvas {
         // console.log(`${x}, ${y}, ${w}, ${h}, ${cropX}, ${cropY}, ${cropW}, ${cropH}`);
     }
 
-    drawImage(img, x, y, w, h, direction=0) {
+    dI(img, x, y, w, h, direction=0) {
         // alias for drawImg
-        this.drawImg(img, x, y, w, h, direction);
+        this.dImg(img, x, y, w, h, direction);
     }
 
-    drawRect(x, y, w, h, color="white") {
+    dR(x, y, w, h, color="white") {
         this.ctx.fillStyle = color;
-        this.ctx.fillRect(x-this.camera.x, y-this.camera.y, w, h);
+        this.ctx.fillRect(x-this.cam.x, y-this.cam.y, w, h);
     }
 
-    strokeRect(x, y, w, h, color) {
+    sR(x, y, w, h, color) {
         this.ctx.strokeStyle = color;
-        this.ctx.strokeRect(x-this.camera.x, y-this.camera.y, w, h);
+        this.ctx.strokeRect(x-this.cam.x, y-this.cam.y, w, h);
     }
 
-    dT(string, x, y, scaley, scalex, color, align="start", vAliign="top", ops={}) {
-
-        // console.log(ops);
-
-        // console.log(string)
-
+    dT(string, x, y, scaley, scalex, color, align="", vAliign="top") {
         string = string.toUpperCase();
         let chars = string.split("");
         // console.log(chars);
@@ -150,16 +147,12 @@ class Canvas {
             strHeight += 1;
         }
 
-        switch(align) {
-            case "center":
-            case "middle":
-                x = x - strLength/2;
-                break;
-            case "end":
-            case "right":
-                x = x - strLength;
-                break;
+        if (align === "middle") {
+            x = x - strLength / 2;
+        } else if (align === "end") {
+            x = x - strLength;
         }
+        
         switch(vAliign) {
             case "middle":
             case "center":
@@ -173,8 +166,6 @@ class Canvas {
 
         let charI = 0;
         let nextOffset = (7 * scalex);
-        let lastWasFull = false;
-
         for (let char of chars) {
 
             this.ctx.fillStyle = color;
@@ -183,17 +174,6 @@ class Canvas {
             // offset is the amount of pixels to offset the character by. you can calculate this by multiplying the current character (they're all the same size) by the scalex and scaley
             let offset = nextOffset;
 
-            if (lastWasFull) {
-                offset -= (0.5 * scalex);
-                lastWasFull = false;
-            }
-
-            if(ops.shortFullStop) {
-                if(char == ".") {
-                    lastWasFull = true;
-                }
-            }
-
             char = fI[char];
             if (char == undefined) {
                 // leave a blank space
@@ -203,7 +183,7 @@ class Canvas {
                     // for each pixel in the row
                     for (let c of char[cRow]) {
                         if (c == 1) {
-                            this.ctx.fillRect((x + (col * scalex) + (charI * offset)) - this.camera.x,( y + (row * scaley)) - this.camera.y, scalex, scaley);
+                            this.ctx.fillRect((x + (col * scalex) + (charI * offset)) - this.cam.x,( y + (row * scaley)) - this.cam.y, scalex, scaley);
 
                         }
                         col++;
@@ -220,32 +200,15 @@ class Canvas {
         }
 
         return {
-            "w": strLength
+            "w": strLength,
+            "h": strHeight
         }
 
     }
 
-    setFont(fontStack, size="10") {
-        this.ctx.font = `${size}px ${fontStack}`
-    }
-
-    drawLine(x1, y1, x2, y2, color) {
-        this.ctx.strokeStyle = color;
-        this.ctx.beginPath();
-        this.ctx.moveTo(x1-this.camera.x, y1-this.camera.y);
-        this.ctx.lineTo(x2, y2);
-        this.ctx.stroke();
-    }
-
-    // Camera stuff
-    mvCamera(x, y) {
-        this.camera.x += x;
-        this.camera.y += y;
-    }
-
-    setCamera(x, y, s=1) {
-        this.camera.x = x;
-        this.camera.y = y;
+    sC(x, y) {
+        this.cam.x = x;
+        this.cam.y = y;
     }
 
 }
@@ -277,7 +240,7 @@ class Room {
         id += 1;
         this.name = name;
         this.objects = [];
-        this.background = "#252525";
+        this.background = "#111";
         this.w = c.w;
         this.h = c.h;
     }
@@ -300,36 +263,28 @@ class Room {
         }
     }
 
-    drawGUI() {
+    dGUI() {
 
     }
 
-    keyDown(key) {
+    kD(key) {
         // console.log(key);
     }
-    keyHeld(key) {
+    kH(key) {
         // console.log(key);
     }
     click(x, y) {
         // console.log(x, y);
     }
-    mHeld(x,y){
-
-    }
 
     start() {
-        c.camera = {x:0,y:0}
+        c.cam = {x:0,y:0}
     }
 
 }
 
 // INIT CANVAS
-let fI = fntINDEX; // in letters.js
 let c = new Canvas('gameCanvas');
-// check if the canvas is supported
-if(!c.ctx) {
-    alert("Your browser does not support the canvas element");
-}
 gameCtx = c.ctx;
 c.fill("#151f1f");
 gameCtx.imageSmoothingEnabled = false;
@@ -338,14 +293,14 @@ let dPM = _=>{
     c.ctx.globalAlpha = .7;
     c.fill("#000");
     c.ctx.globalAlpha = .85;
-    c.drawRect((c.w/2-150)+c.camera.x,120+c.camera.y, 300,120, "#000")
+    c.dR((c.w/2-150)+c.cam.x,120+c.cam.y, 300,120, "#000")
     c.ctx.globalAlpha = 1;
-    c.dT("paused", c.w/2+c.camera.x,c.h/2-30+c.camera.y, 3,3,"#fff", "middle","middle");
+    c.dT("paused", c.w/2+c.cam.x,c.h/2-30+c.cam.y, 3,3,"#fff", "middle","middle");
     for (let o in gameRoom.pseo) {
-        let t = c.dT(gameRoom.pseo[o].t, c.w/2+c.camera.x, c.h/2+(o*9)+c.camera.y, 1,1,"#fff", "middle");
+        let t = c.dT(gameRoom.pseo[o].t, c.w/2+c.cam.x, c.h/2+(o*9)+c.cam.y, 1,1,"#fff", "middle");
         if (o == gameRoom.pses) {
-            let a = images.ui.a;
-            c.drawImg(a, ((c.w/2+c.camera.x)-t.w/2)-8, c.h/2+(o*9)+c.camera.y, 6,7)
+            let a = img.i.a;
+            c.dImg(a, ((c.w/2+c.cam.x)-t.w/2)-8, c.h/2+(o*9)+c.cam.y, 6,7)
         }
     }
 }
@@ -353,77 +308,72 @@ let dPM = _=>{
 c.dT("Death By Hamster", c.w / 2, c.h / 2 - 40, 2, 2, "white", "middle");
 
 // Load images
-let images = {
-    "mouse": {
+let img = {
+    "i": {
         "ingame": "./aimerthing.png",
-        "cursor": "./cursor.png"
-    },
-    "level": {
+        "cursor": "./cursor.png",
         "tileset": "./t.png",
-        "human": "./human.png"
-    },
-    "player": {
+        "human": "./human.png",
         "car": "./hamster.png",
         "gun": "./gun.png",
-    },
-    "ui": {
         "a": "./arw.png" // arrow
     }
 };
 
 let loader = new Room("loader");
-let loadingText = "Loading...";
-let loadingError = 0;
-loader.drawGUI = () => {
-    c.dT(loadingText, c.w / 2, c.h / 2, 2, 2, "white", "middle");
-    if (loadingError) {
-        c.dT(loadingErrorText, c.w / 2, c.h / 2 + 20, 1, 1, "red", "middle");
+let lText = "Loading...";
+let lErr = 0;
+let lErrT;
+loader.dGUI = () => {
+    c.dT(lText, c.w / 2, c.h / 2, 2, 2, "white", "middle");
+    if (lErr) {
+        c.dT(lErrT, c.w / 2, c.h / 2 + 20, 1, 1, "red", "middle");
     }
 }
 let rooms = [];
 
-let loadedImages = 0;
-let totalImages = 0;
+let limg = 0;
+let timg = 0;
 
 // count the total number of images to load
-for (let key in images) {
-    for (let subkey in images[key]) {
-        totalImages++;
+for (let key in img) {
+    for (let subkey in img[key]) {
+        timg++;
     }
 }
 
-loadingText = `Loading...`;
+lText = `Loading...`;
 
-loadingText = `Loading images (${loadedImages} / ${totalImages})`
+lText = `Loading images (${limg} / ${timg})`
 
 
 // after all images are loaded, and no errors occured, start the game
-for (let key in images) {
-    for (let subkey in images[key]) {
+for (let key in img) {
+    for (let subkey in img[key]) {
 
         // attempt to load the image
         let IMG = new Image();
         IMG.addEventListener('load', () => {
-            loadedImages++;
-            loadingText = `Loading images (${loadedImages} / ${totalImages})`
-            if (loadedImages == totalImages) {
+            limg++;
+            lText = `Loading images (${limg} / ${timg})`
+            if (limg == timg) {
                 loader.step = () => {
                     cRoom = rooms[1];
                 }
-                loadingText = "Loaded! Please wait...";
+                lText = "Loaded! Please wait...";
             }
         });
         IMG.addEventListener('error', (e) => {
-            loadingError = 1;
-            loadingErrorText = `Error loading image ${e.target.src}`;
+            lErr = 1;
+            lErrT = `Error loading image ${e.target.src}`;
         } );
-        IMG.src = images[key][subkey];
+        IMG.src = img[key][subkey];
 
         // add the image to the images object
-        images[key][subkey] = IMG;
+        img[key][subkey] = IMG;
 
         // draw the loading text by drawing a rectangle over the previous text, and drawing the new text
-        loadingText = `Loading images (${loadedImages} / ${totalImages})`
+        lText = `Loading images (${limg} / ${timg})`
 
     }
 }
@@ -435,35 +385,17 @@ let levels = [
 ]
 
 hamsterRef = {
-    "file": images.player.car,
+    "file": img.i.car,
     "nl": {
-        "x": 1,
-        "y": 1,
-        "w": 32,
-        "h": 16,
-    },
-    "b": {
-        "x": 35,
-        "y": 1,
-        "w": 32,
-        "h": 16,
-    },
-    "br": {
-        "x": 1,
-        "y": 20,
-        "w": 32,
-        "h": 16,
-    },
-    "r": {
-        "x": 35,
-        "y": 20,
+        "x": 0,
+        "y": 0,
         "w": 32,
         "h": 16,
     }
 }
 
-let levelRef = {
-    "file": images.level.tileset,
+let lRef = {
+    "file": img.i.tileset,
     "default": {
         "x": 0,
         "y": 0,
@@ -535,16 +467,16 @@ let levelRef = {
 }
 
 
-for (let tile of levelRef.tiles) {
+for (let tile of lRef.tiles) {
     // if the tile is missing properties from the default, add them
-    for (let key in levelRef.default) {
+    for (let key in lRef.default) {
         if (!tile[key]) {
-            tile[key] = levelRef.default[key];
+            tile[key] = lRef.default[key];
         }
     }
 }
 
-console.debug(images)
+console.debug(img)
 let targFPS = 60;
 let frame = 0;
 
@@ -568,18 +500,18 @@ menu.o = [
 ]
 
 
-menu.drawGUI = () => {
+menu.dGUI = () => {
     c.dT("Death by Hamster", c.w/2, c.h/2-25, 4, 4, "white", "middle", "middle");
     c.dT("W/Up or S/Down to select", c.w/2, c.h/2, 1,1,"gray","middle","middle");
     c.dT("Space or ENTER to activate", c.w/2, c.h/2+8, 1,1,"gray","middle","middle")
     for (let o in menu.o) {
         let txt = c.dT(`${menu.o[o].t}`, c.w/2, (c.h/2+50)+(o*20), 2,2,"#fff","middle","top");
         if (menu.s == o) {
-            let a = images.ui.a;
+            let a = img.i.a;
             let ap = ((c.w/2)-(txt.w/2))-a.width-4;
             let ap2 = ((c.w/2)+(txt.w/2))+a.width-4;
-            c.drawImg(a, ap, (c.h/2+50)+(o*20), a.width*2, a.height*2)
-            c.drawImg(a, ap2, (c.h/2+50)+(o*20), a.width*2, a.height*2, 180)
+            c.dImg(a, ap, (c.h/2+50)+(o*20), a.width*2, a.height*2)
+            c.dImg(a, ap2, (c.h/2+50)+(o*20), a.width*2, a.height*2, 180)
         }
     }
 }
@@ -608,7 +540,7 @@ const setRoom = (roomI) => {
     cRoom = rooms[roomI];
     cRoom.start();
 }
-menu.keyDown = (key) => {
+menu.kD = (key) => {
     if (key == "ArrowUp" || key == "KeyW") {
         menu.s -= 1
         if (menu.s < 0) {
@@ -636,13 +568,13 @@ let player   = new Entity("Player", 0,0);
 player.speed = 0;
 player.maxSpeed = 20;
 player.direction = 0;
-player.sprite = images.player.car;
+player.sprite = img.i.car;
 player.crop = hamsterRef.nl;
 player.x = 0;
 player.y = 0;
 player.w = player.crop.w*2;
 player.h = player.crop.h*2;
-gameRoom.o = [{t:"Next Level",a:_=>{lvlS.s += 1; lvlS.keyDown("Space"); gameRoom.tutorial=0}}, {t:"Level Select",a:_=>{setRoom(4)}}, {t:"Menu", a:_=>{setRoom(1)}}]
+gameRoom.o = [{t:"Next Level",a:_=>{lvlS.s += 1; lvlS.kD("Space"); gameRoom.tutorial=0}}, {t:"Level Select",a: _=>{setRoom(4)}}, {t:"Menu", a: _=>{setRoom(1)}}]
 
 gameRoom.s = 0
 gameRoom.pseo = [{t:"Back to Menu", a:_=>{setRoom(1)}},{t:"Level Select",a:_=>{setRoom(4)}}]
@@ -713,7 +645,7 @@ player.step = _=> {
     }
 
     // keep the camera centered on the player
-    c.setCamera(player.x - c.w/2, player.y - c.h/2);
+    c.sC(player.x - c.w/2, player.y - c.h/2);
 
     player.oldDir = player.direction;
     player.xy = [player.x, player.y]
@@ -724,11 +656,11 @@ console.log(player);
 
 player.draw = _=> {
     // draw this.sprite at this.x, this.y
-    c.sliceImage(player.sprite, player.x, player.y, player.w, player.h, player.crop.x, player.crop.y, player.crop.w, player.crop.h, player.direction);
+    c.sImg(player.sprite, player.x, player.y, player.w, player.h, player.crop.x, player.crop.y, player.crop.w, player.crop.h, player.direction);
     // c.dT(`${player.x/64} ${player.y/64}`, player.x, player.y, 1,1,"white","middle","middle");
     // canvas.strokeRect(player.x, player.y, player.w, player.h, "white");
 
-    let gun = images.player.gun;
+    let gun = img.i.gun;
     let gunOx = 13;
     let gunOy = 0;
 
@@ -744,16 +676,16 @@ player.draw = _=> {
     if (!pause&&!gameRoom.finish) {
 
         // get the angle between the gun and the mouse
-        player.aim = Math.atan2(c.mousePos.y - guny, c.mousePos.x - gunx) * 180 / pi;
+        player.aim = Math.atan2(c.mPos.y - guny, c.mPos.x - gunx) * 180 / pi;
 
     }
 
     // canvas.drawText(`Width${gun.width} Height${gun.height}`, gunx, guny-15, 1, 1, "green", "middle", "middle");
-    c.drawImg(gun, gunx, guny, gun.width*2, gun.height*2, player.aim, gunx, guny); // these two vars at the end are where the gun's center is placed
+    c.dImg(gun, gunx, guny, gun.width*2, gun.height*2, player.aim, gunx, guny); // these two vars at the end are where the gun's center is placed
     // canvas.drawRect(gunx, guny, 1,1, "red");
 
     for (let checkpoint of player.checkpoints) {
-        c.drawRect(checkpoint.x, checkpoint.y, 1,1, "black");
+        c.dR(checkpoint.x, checkpoint.y, 1,1, "black");
 
     }
 
@@ -791,14 +723,14 @@ player.shoot = () => {
         bullet.y += bullet.speed * Math.sin(bullet.direction * pi / 180);
     }
     bullet.draw = () => {
-        c.drawRect(bullet.x, bullet.y, bullet.w,bullet.h, "#2f2f2f");
+        c.dR(bullet.x, bullet.y, bullet.w,bullet.h, "#2f2f2f");
     }
     cRoom.spawn(bullet);
 }
 
 
 
-gameRoom.keyDown = (key) => {
+gameRoom.kD = (key) => {
     if (!pause&&!gameRoom.finish){
         if (key == "ArrowUp" || key == "KeyW") {
             player.speed += player.accel;
@@ -835,8 +767,8 @@ gameRoom.keyDown = (key) => {
                 let y = Math.floor(player.checkpoints[i].y / 64);
 
                 for (let tile of gameRoom.level) {
-                    if (levelRef.tiles[tile[0]].type == "vent" && tile[1] == x && tile[2] == y) {
-                        for (let tile of gameRoom.level) if (levelRef.tiles[tile[0]].type == "vent" && !(tile[1] == x) && !(tile[2] == y)) {
+                    if (lRef.tiles[tile[0]].type == "vent" && tile[1] == x && tile[2] == y) {
+                        for (let tile of gameRoom.level) if (lRef.tiles[tile[0]].type == "vent" && !(tile[1] == x) && !(tile[2] == y)) {
                             console.log (x,y)
                             console.log(tile[1], tile[2])
                             player.x = tile[1]*64;
@@ -894,7 +826,7 @@ gameRoom.keyDown = (key) => {
         }
     }
 }
-gameRoom.keyHeld = (key) => {
+gameRoom.kH = (key) => {
     if (!pause&&!gameRoom.finish){
         if (key == "ArrowUp" || key == "KeyW") {
             player.speed += player.accel;
@@ -931,7 +863,7 @@ gameRoom.checkwall = (tx,ty) => {
     tx = Math.floor(tx);
     ty = Math.floor(ty);
     for (let tile of gameRoom.level) {
-        if (levelRef.tiles[tile[0]].type == "wall" && tile[1] == tx && tile[2] == ty) {
+        if (lRef.tiles[tile[0]].type == "wall" && tile[1] == tx && tile[2] == ty) {
             return true;
         }
     }
@@ -940,8 +872,8 @@ gameRoom.checkwall = (tx,ty) => {
 
 gameRoom.start = () =>{
 
-    if (customLv) {
-        gameRoom.level = customLv
+    if (cLV) {
+        gameRoom.level = cLV
     }
 
     if (gameRoom.li) {
@@ -972,7 +904,7 @@ gameRoom.start = () =>{
         }
         if(tile[0]===10){
 
-            let pooman = new Entity("Human", (tile[1]*64),(tile[2]*64), images.level.human)
+            let pooman = new Entity("Human", (tile[1]*64),(tile[2]*64), img.i.human)
             pooman.w = 26*2
             pooman.h = 16*2
             pooman.bh = Math.floor(Math.random()*3);
@@ -1011,8 +943,8 @@ gameRoom.start = () =>{
                 pooman.timer--;
             }
             pooman.draw = _=>{
-                c.sliceImage(pooman.sprite, pooman.x, pooman.y, pooman.w, pooman.h, pooman.bb*pooman.w/2, 0, pooman.w/2, pooman.h/2, pooman.direction);
-                c.sliceImage(pooman.sprite, pooman.x, pooman.y, pooman.w, pooman.h, pooman.bh*pooman.w/2, pooman.h/2, pooman.w/2, pooman.h/2, pooman.direction);
+                c.sImg(pooman.sprite, pooman.x, pooman.y, pooman.w, pooman.h, pooman.bb*pooman.w/2, 0, pooman.w/2, pooman.h/2, pooman.direction);
+                c.sImg(pooman.sprite, pooman.x, pooman.y, pooman.w, pooman.h, pooman.bh*pooman.w/2, pooman.h/2, pooman.w/2, pooman.h/2, pooman.direction);
                 // c.dT(`${pooman.timer} :: ${pooman.direction}`, pooman.x, pooman.y, 1, 1, "white", "middle", "middle");
             }
             pooman.timer = 90;
@@ -1042,7 +974,7 @@ gameRoom.draw = _=> {
 
     for (let tile of gameRoom.level) {
         // [index, x, y]
-        c.sliceImage(levelRef.file, (tile[1]*32)*2, (tile[2]*32)*2, 32*2,32*2, levelRef.tiles[tile[0]].x, 0, 32, 32);
+        c.sImg(lRef.file, (tile[1]*32)*2, (tile[2]*32)*2, 32*2,32*2, lRef.tiles[tile[0]].x, 0, 32, 32);
     }
 
     if (gameRoom.tutorial) {
@@ -1054,7 +986,7 @@ gameRoom.draw = _=> {
 
         c.dT("As a member of the hamster uprising,", 6*64, 3*64+25, 1,1, "black");
         c.dT("you might want to kill any humans", 6*64, 3*64+35, 1,1, "black");
-        c.dT("you find!", 10*64-16, 3*64+45, 1,1, "black", "right");
+        c.dT("you find!", 10*64-16, 3*64+45, 1,1, "black", "end");
 
 
     }
@@ -1063,8 +995,8 @@ gameRoom.draw = _=> {
     }
 }
 
-gameRoom.drawGUI = _=>{
-    c.dT(`Humans:${gameRoom.humans}`, (c.w-10)+c.camera.x, 10+c.camera.y, 2,2,"#fff", "end")
+gameRoom.dGUI = _=>{
+    c.dT(`Humans:${gameRoom.humans}`, (c.w-10)+c.cam.x, 10+c.cam.y, 2,2,"#fff", "end")
 
     if (pause) {
         dPM(gameRoom);
@@ -1073,16 +1005,16 @@ gameRoom.drawGUI = _=>{
         c.ctx.globalAlpha = .7;
         c.fill("#000");
         c.ctx.globalAlpha = .85;
-        c.drawRect((c.w/2-150)+c.camera.x,120+c.camera.y, 300,150, "#000")
+        c.dR((c.w/2-150)+c.cam.x,120+c.cam.y, 300,150, "#000")
         c.ctx.globalAlpha = 1;
 
 
-        c.dT("You Won!", c.w/2+c.camera.x,c.h/2-30+c.camera.y, 3,3,"#fff", "middle","middle");
+        c.dT("You Won!", c.w/2+c.cam.x,c.h/2-30+c.cam.y, 3,3,"#fff", "middle","middle");
         for (let o in gameRoom.o) {
-            let t = c.dT(gameRoom.o[o].t, c.w/2+c.camera.x, c.h/2+(o*9)+c.camera.y, 1,1,"#fff", "middle");
+            let t = c.dT(gameRoom.o[o].t, c.w/2+c.cam.x, c.h/2+(o*9)+c.cam.y, 1,1,"#fff", "middle");
             if (o == gameRoom.s) {
-                let a = images.ui.a;
-                c.drawImg(a, ((c.w/2+c.camera.x)-t.w/2)-8, c.h/2+(o*9)+c.camera.y, 6,7)
+                let a = img.i.a;
+                c.dImg(a, ((c.w/2+c.cam.x)-t.w/2)-8, c.h/2+(o*9)+c.cam.y, 6,7)
             }
         }
     }
@@ -1090,7 +1022,7 @@ gameRoom.drawGUI = _=>{
 
 let editor = new Room("Editor");
 editor.i = 0;
-editor.t = levelRef;
+editor.t = lRef;
 editor.l = []
 editor.saving = false
 editor.sa = 0
@@ -1101,15 +1033,15 @@ editor.start = _=>{
 editor.draw = _=>{
     for (let tile of editor.l) {
         // [index, x, y]
-        c.sliceImage(levelRef.file, (tile[1]*32)+editor.dPos[0], tile[2]*32+editor.dPos[1], 32,32, tile[0]*32, 0, 32, 32);
-        c.drawRect(editor.dPos[0], editor.dPos[1], 1,1, "red")
+        c.sImg(lRef.file, (tile[1]*32)+editor.dPos[0], tile[2]*32+editor.dPos[1], 32,32, tile[0]*32, 0, 32, 32);
+        c.dR(editor.dPos[0], editor.dPos[1], 1,1, "red")
     }
 }
 editor.step = _=>{
     if (editor.i < 0) {
-        editor.i = levelRef.tiles.length-1;
+        editor.i = lRef.tiles.length-1;
     }
-    if (editor.i > levelRef.tiles.length-1) {
+    if (editor.i > lRef.tiles.length-1) {
         editor.i = 0;
     }
 }
@@ -1153,7 +1085,7 @@ editor.click = (x,y)=>{
         editor.sa = 0
     }
 }
-editor.keyHeld = (key) => {
+editor.kH = (key) => {
     switch (key) {
         case "KeyW":
         case "ArrowUp":
@@ -1174,11 +1106,11 @@ editor.keyHeld = (key) => {
     }
 }
 
-editor.drawGUI = _=>{
-    c.drawRect(0,0,c.w,50,"gray")
+editor.dGUI = _=>{
+    c.dR(0,0,c.w,50,"gray")
     c.dT(`DBH Editor::${editor.n}`, 15,25,2,2,"#fff","start","middle");
     let s = c.dT(`Save`, c.w-15,25,2,2,"#fff","end","middle");
-    if (c.mousePos.x > (c.w-30)-s.w && c.mousePos.y < 50) {
+    if (c.mPos.x > (c.w-30)-s.w && c.mPos.y < 50) {
         // console.debug((c.w-30)-s.w)
         c.dT(`Save`, c.w-15,25,2,2,"#e5e5e5","end","middle");
     }
@@ -1188,24 +1120,24 @@ editor.drawGUI = _=>{
         c.dT(`Save`, c.w-15,25,2,2,"#1fccdc","end","middle");
     }
 
-    c.sliceImage(editor.t.file, c.mousePos.x+16,c.mousePos.y+16,32,32,32*editor.i,0,32,32);
+    c.sImg(editor.t.file, c.mPos.x+16,c.mPos.y+16,32,32,32*editor.i,0,32,32);
 }
 
 
 
-lvlS.drawGUI = () => {
+lvlS.dGUI = () => {
     c.dT("Death by Hamster", c.w/2, 25, 2, 2, "white", "middle", "top");
     c.dT("Level Select", c.w/2, 44, 1,1,"gray","middle","middle");
     for (let o in lvlS.o) {
         let n = parseInt(o)+1
         c.dT(`${n}`, (20)+(32*n), 70, 2, 2, "#fff", "middle", "middle")
         if (o == lvlS.s) {
-            c.strokeRect((20-14)+(32*n), 70-16, 32, 32, "#fff")
+            c.sR((20-14)+(32*n), 70-16, 32, 32, "#fff")
         }
     }
 }
 
-lvlS.keyDown = (key) => {
+lvlS.kD = (key) => {
     if (key == "ArrowUp"||key=="ArrowRight"||key == "KeyW"||key=="KeyD") {
         lvlS.s -= 1
         if (lvlS.s < 0) {
@@ -1236,31 +1168,31 @@ options.s = 0
 options.ops = o;
 options.o = [{
     "t": "Show FPS",
-    "a": _=>{ o.showFPS = !o.showFPS; setStore("o_showFPS", o.showFPS) },
+    "a": _=>{ o.showFPS = !o.showFPS; sS("o_showFPS", o.showFPS) },
     "v": "showFPS"
 }, {
     "t": "Menu",
     "a": _=>{ setRoom(0) }
 }]
 
-options.drawGUI = () => {
+options.dGUI = () => {
     c.dT("Settings", c.w/2, 25, 2, 2, "#fff", "middle", "top");
     for (let o in options.o) {
         let s = options.o[o]
         let txt = c.dT(`${options.o[o].t}`, 150, 50+(o*20), 2,2,"#fff","left","top");
         if (options.s == o) {
-            let a = images.ui.a;
-            c.drawImg(a, 136, 50 + (o * 20), a.width * 2, a.height * 2)
+            let a = img.i.a;
+            c.dImg(a, 136, 50 + (o * 20), a.width * 2, a.height * 2)
         }
         let v = options.ops[s.v]
         if (!(v==undefined)){
-            c.dT(`${v}`, 450, 50+(o*20), 2,2,"#fff", "right");
+            c.dT(`${v}`, 450, 50+(o*20), 2,2,"#fff", "end");
 
         }
     }
 }
 
-options.keyDown = (key) => {
+options.kD = (key) => {
     if (key == "ArrowUp"||key=="ArrowRight"||key == "KeyW") {
         options.s -= 1
         if (options.s < 0) {
@@ -1311,14 +1243,14 @@ let leftclicked = false;
 let rightclicked = false
 
 c.c.addEventListener('mousemove', (e) => {
-    mse = c.getMousePos(e);
+    mse = c.gMP(e);
 } );
 
 c.c.addEventListener("mousedown", (e) => {
     // console.log(e);
     e.preventDefault()
-    lastClick = c.getMousePos(e);
-    mse = c.getMousePos(e);
+    lastClick = c.gMP(e);
+    mse = c.gMP(e);
     switch (e.button) {
         case 0: // left
             leftclicked=1;
@@ -1330,8 +1262,8 @@ c.c.addEventListener("mousedown", (e) => {
 });
 c.c.addEventListener("mouseup", (e)=>{
     // console.log(e);
-    lastClick = c.getMousePos(e);
-    mse = c.getMousePos(e);
+    lastClick = c.gMP(e);
+    mse = c.gMP(e);
 })
 c.c.oncontextmenu = _=>{return 0;}
 
@@ -1357,10 +1289,10 @@ try {
         for (let key in keysPressed) {
             if (keysPressed[key]) {
                 if (!keysLastPressed[key]) {
-                    cRoom.keyDown(key);
+                    cRoom.kD(key);
                     keysLastPressed[key] = true;
                 } else if (keysLastPressed[key]) {
-                    cRoom.keyHeld(key);
+                    cRoom.kH(key);
                 }
             }
         }
@@ -1371,19 +1303,19 @@ try {
 
         cRoom.step();
         cRoom.draw();
-        cRoom.drawGUI();
+        cRoom.dGUI();
 
         if (o.showFPS){
-            c.dT(`FPS:${Math.round(1000 / (Date.now() - lastTime))}`, 0+c.camera.x, 0+c.camera.y, 1, 1, "#fafafa", "left", "top");
+            c.dT(`FPS:${Math.round(1000 / (Date.now() - lastTime))}`, 0+c.cam.x, 0+c.cam.y, 1, 1, "#fafafa", "left", "top");
         }
 
         switch (cRoom.name) {
             case "menu":
             case "Editor":
-                c.ctx.drawImage(images.mouse.cursor, Math.round(mse.x), Math.round(mse.y), images.mouse.cursor.width*2, images.mouse.cursor.height*2);
+                c.ctx.drawImage(img.i.cursor, Math.round(mse.x), Math.round(mse.y), img.i.cursor.width*2, img.i.cursor.height*2);
                 break;
             case "Game":
-                c.ctx.drawImage(images.mouse.ingame, Math.round(mse.x)-16, Math.round(mse.y)-16, 32, 32);
+                c.ctx.drawImage(img.i.ingame, Math.round(mse.x)-16, Math.round(mse.y)-16, 32, 32);
                 break;
         }
         lastTime = Date.now();
diff --git a/hamster.png b/hamster.png
index 743bef16f7d55716e0f4cb1b3c42b6ef91825347..9d98d454d27cd7de5cae0902b5ff29878e2fc6a5 100644
Binary files a/hamster.png and b/hamster.png differ
diff --git a/letters.js b/letters.js
index 9b0347c4d022bbb56e8d82d8c6339caccb05e211..56052c11aaa02d54bafe67b6100ed75f46abe27f 100644
--- a/letters.js
+++ b/letters.js
@@ -1,7 +1,7 @@
 // Inspired by https://github.com/PaulBGD/PixelFont
 
 
-const fntA = [
+const A = [
     [, , 1, 1, 1, 1], 
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
@@ -11,7 +11,7 @@ const fntA = [
     [, 1, 1, , , 1, 1], 
 ];
 
-const fntB = [
+const B = [
     [, 1, 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
@@ -22,7 +22,7 @@ const fntB = [
     
 ];
 
-const fntC = [
+const C = [
     [, , 1, 1, 1, 1], 
     [, 1, 1, , , 1, 1],
     [, 1, 1],
@@ -33,7 +33,7 @@ const fntC = [
     
 ];
 
-const fntD = [
+const D = [
     [, 1, 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
@@ -44,7 +44,7 @@ const fntD = [
     
 ];
 
-const fntE = [
+const E = [
     
     [, , 1, 1, 1, 1, 1], 
     [, 1, 1, 1, 1, 1, 1],
@@ -56,7 +56,7 @@ const fntE = [
     
 ];
 
-const fntF = [
+const F = [
     
     [, , 1, 1, 1, 1, 1], 
     [, 1, 1, 1, 1, 1, 1],
@@ -68,7 +68,7 @@ const fntF = [
     
 ];
 
-const fntG = [
+const G = [
     [, , 1, 1, 1, 1, 1], 
     [, 1, 1, 1, 1, 1, 1], , 
     [, 1, 1],
@@ -79,7 +79,7 @@ const fntG = [
     
 ];
 
-const fntH = [
+const H = [
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
@@ -90,7 +90,7 @@ const fntH = [
     
 ];
 
-const fntI = [
+const I = [
     [, 1, 1, 1, 1, 1, 1],
     [, 1, 1, 1, 1, 1, 1],
     [, , , 1, 1],
@@ -100,7 +100,7 @@ const fntI = [
     [, 1, 1, 1, 1, 1, 1],
 ];
 
-const fntJ = [
+const J = [
     
     [, , 1, 1, 1, 1, 1],  
     [, , , , , 1, 1],
@@ -112,7 +112,7 @@ const fntJ = [
     
  ];
 
- const fntK = [
+ const K = [
 
     [, 1, 1, , , 1,1],
     [, 1, 1, , , 1,1],
@@ -124,7 +124,7 @@ const fntJ = [
     
  ];
 
- const fntL = [
+ const L = [
 
     [, 1, 1],
     [, 1, 1],
@@ -136,7 +136,7 @@ const fntJ = [
     
  ];
 
- const fntM = [
+ const M = [
 
     [, 1, 1, , , , 1], 
     [, 1, 1, 1, , 1, 1],
@@ -148,7 +148,7 @@ const fntJ = [
 
  ];
 
- const fntN = [
+ const N = [
 
     [, 1, 1, , , 1, 1], 
     [, 1, 1, , , 1, 1], 
@@ -160,7 +160,7 @@ const fntJ = [
     
  ];
 
- const fntO = [
+ const O = [
 
     [, , 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
@@ -172,7 +172,7 @@ const fntJ = [
     
  ];
 
- const fntP = [
+ const P = [
     [, 1, 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
     [, 1, 1, , , 1, 1],
@@ -183,7 +183,7 @@ const fntJ = [
     
  ];
 
- const fntQ = [
+ const Q = [
 
     [, , 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
@@ -195,7 +195,7 @@ const fntJ = [
     
  ];
 
- const fntR = [
+ const R = [
 
     [, 1, 1, 1, 1, 1],
     [, 1, 1, , , 1, 1],
@@ -207,7 +207,7 @@ const fntJ = [
     
  ];
 
- const fntS = [
+ const S = [
 
     [, , 1, 1, 1, 1], 
     [, 1, 1, , , 1, 1], 
@@ -219,7 +219,7 @@ const fntJ = [
     
  ];
 
- const fntT = [
+ const T = [
 
     [, 1, 1, 1, 1, 1, 1], 
     [, 1, 1, 1, 1, 1, 1],
@@ -231,7 +231,7 @@ const fntJ = [
     
  ];
 
- const fntU = [
+ const U = [
 
     [, 1, 1, , , 1, 1], 
     [, 1, 1, , , 1, 1], 
@@ -243,7 +243,7 @@ const fntJ = [
     
  ];
 
- const fntV = [
+ const V = [
 
     [, 1, 1, , , , 1], 
     [, 1, 1, , , , 1], 
@@ -255,7 +255,7 @@ const fntJ = [
     
  ];
 
- const fntW = [
+ const W = [
 
     [, 1, 1, , , , 1],  
     [, 1, 1, , , , 1],  
@@ -267,7 +267,7 @@ const fntJ = [
     
  ];
 
- const fntX = [
+ const X = [
 
     [, 1, , , , , 1], 
     [, 1, 1, , , 1, 1],  
@@ -279,7 +279,7 @@ const fntJ = [
     
  ];
 
- const fntY = [
+ const Y = [
 
     [, 1, 1, , , 1, 1],  
     [, 1, 1, , , 1, 1],  
@@ -291,7 +291,7 @@ const fntJ = [
     
  ];
 
- const fntZ = [
+ const Z = [
 
     [,1, 1, 1, 1, 1, 1],
     [, , , , , 1, 1],
@@ -303,7 +303,7 @@ const fntJ = [
     
  ];
 
- const fnt1 = [
+ const one = [
    [, , , 1, 1],
    [, , 1, 1, 1],
    [, , , 1, 1],
@@ -314,7 +314,7 @@ const fntJ = [
 ];
 
 
-const fnt2 = [
+const two = [
    [, , 1, 1, 1, 1],
    [, 1, 1, , , 1, 1],
    [, , , , , 1, 1],
@@ -324,7 +324,7 @@ const fnt2 = [
    [, 1, 1, 1, 1, 1, 1],
 ];
 
-const fnt3 = [
+const thr = [
    [, , 1, 1, 1, 1],
    [, 1, 1, , , 1, 1],
    [, , , , , 1, 1],
@@ -335,7 +335,7 @@ const fnt3 = [
 ];
 
 
-const fnt4 = [
+const fou = [
    [, , , , 1, 1, 1],
    [, , , 1, 1, 1, 1],
    [, , 1, 1, , 1, 1],
@@ -345,7 +345,7 @@ const fnt4 = [
    [, , , , , 1, 1],
 ];
 
-const fnt5 = [
+const fiv = [
    [, 1, 1, 1, 1, 1, 1],
    [, 1, 1],
    [, 1, 1],
@@ -355,7 +355,7 @@ const fnt5 = [
    [, 1, 1, 1, 1, 1,],
 ];
 
-const fnt6 = [
+const six = [
       [, , 1, 1, 1, 1],
       [, 1, 1, , , 1, 1],
       [, 1, 1],
@@ -365,7 +365,7 @@ const fnt6 = [
       [, , 1, 1, 1, 1],
 ];
 
-const fnt7 = [
+const sev = [
    [, 1, 1, 1, 1, 1, 1],
    [, 1, 1, 1, 1, 1, 1],
    [, , , , 1, 1],
@@ -375,7 +375,7 @@ const fnt7 = [
    [, , , 1, 1],
 ];
 
-const fnt8 = [
+const eig = [
    [, , 1, 1, 1, 1],
    [, 1, 1, , , 1, 1],
    [, 1, 1, , , 1, 1],
@@ -385,7 +385,7 @@ const fnt8 = [
    [, , 1, 1, 1, 1],
 ];
 
-const fnt9 = [
+const nin = [
    [, , 1, 1, 1, 1],
    [, 1, 1, , , 1, 1],
    [, 1, 1, , , 1, 1],
@@ -396,7 +396,7 @@ const fnt9 = [
 ];
 
 
-const fnt0 = [
+const zer = [
    [, , 1, 1, 1, 1],
    [, 1, 1, , , 1, 1],
    [, 1, 1, , , 1, 1],
@@ -406,7 +406,7 @@ const fnt0 = [
    [, , 1, 1, 1, 1],
 ];
 
-const fntSlash = [
+const Slash = [
    [],
    [, , , , , , 1],
    [, , , , , 1],
@@ -416,7 +416,7 @@ const fntSlash = [
    [, 1],
 ];
 
-const fntColon = [
+const Colon = [
    [, 1,1],
    [, 1,1],
    [],
@@ -426,7 +426,7 @@ const fntColon = [
    [, 1,1],
 ];
 
-const fntDot = [
+const Dot = [
    [],
    [],
    [],
@@ -437,7 +437,7 @@ const fntDot = [
    [, 1,1],
 ]
 
-const fntNeg = [
+const Neg = [
    [],
    [],
    [],
@@ -447,7 +447,7 @@ const fntNeg = [
    [],
 ];
 
-const fntExclaim = [
+const Exclaim = [
     [, , 1, 1],
     [, , 1, 1],
     [, , 1, 1],
@@ -459,13 +459,13 @@ const fntExclaim = [
 
 
 
-const fntINDEX = {
-   'A': fntA, 'B': fntB, 'C': fntC, 'D': fntD, 'E': fntE, 'F': fntF,
-   'G': fntG, 'H': fntH, 'I': fntI, 'J': fntJ, 'K': fntK, 'L': fntL,
-   'M': fntM, 'N': fntN, 'O': fntO, 'P': fntP, 'Q': fntQ, 'R': fntR,
-   'S': fntS, 'T': fntT, 'U': fntU, 'V': fntV, 'W': fntW, 'X': fntX,
-   'Y': fntY, 'Z': fntZ, '1': fnt1, '2': fnt2, '3': fnt3, '4': fnt4,
-   '5': fnt5, '6': fnt6, '7': fnt7, '8': fnt8, '9': fnt9, '0': fnt0,
-   '/': fntSlash, ':': fntColon, '.': fntDot, '-': fntNeg, '!': fntExclaim
+const fI = {
+   'A': A, 'B': B, 'C': C, 'D': D, 'E': E, 'F': F,
+   'G': G, 'H': H, 'I': I, 'J': J, 'K': K, 'L': L,
+   'M': M, 'N': N, 'O': O, 'P': P, 'Q': Q, 'R': R,
+   'S': S, 'T': T, 'U': U, 'V': V, 'W': W, 'X': X,
+   'Y': Y, 'Z': Z, '1': one, '2': two, '3': thr, '4': fou,
+   '5': fiv, '6': six, '7': sev, '8': eig, '9': nin, '0': zer,
+   '/': Slash, ':': Colon, '.': Dot, '-': Neg, '!': Exclaim
 }
 
diff --git a/lzs.js b/lzs.js
index 0226a2959ac891884124dcf4bba70aa54d749536..a9dedd9e81e696c3dbd0e22acab258639739c3a1 100644
--- a/lzs.js
+++ b/lzs.js
@@ -1 +1 @@
-var lzs=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return lzs}):"undefined"!=typeof module&&null!=module&&(module.exports=lzs);
+    var lzs=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return lzs}):"undefined"!=typeof module&&null!=module&&(module.exports=lzs);
diff --git a/minify.py b/minify.py
index 9c7ad88d91e2373b378eee3e4a080d8904ddc6af..a697a36864de00ca3ce69d8ccf66f6fbc9e5b479 100644
--- a/minify.py
+++ b/minify.py
@@ -1,5 +1,23 @@
-import os
+import os, requests, tinify
+from dotenv import load_dotenv
+
+load_dotenv()
+
+tinify.key = os.environ.get("tinify_key")
+
+output_dir = "build/"
+
+blacklist = [
+    "logothing.png"
+]
 
 for ff in os.listdir():
     if (ff.endswith(".png")):
+        if (ff == "logothing.png"):
+            continue
         print(ff)
+        source = tinify.from_file(ff)
+        source.to_file(f'{output_dir}{ff}')
+
+os.system(f"terser lzs.js letters.js game.js --mangle --compress -o {output_dir}code.js")
+os.system(f"advzip {output_dir}dbh.zip --add build --shrink-insane -4")
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..2e01ac3712b8248102efbf81824b00362b71115c
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+# for compiling
+requests
+python-dotenv
+tinify
\ No newline at end of file