From 5d6c274431eac3708f299706ce55a3a413c12508 Mon Sep 17 00:00:00 2001 From: remarkablemark <10594555+remarkablemark@users.noreply.github.com> Date: Wed, 22 Jan 2025 04:38:10 +0000 Subject: [PATCH] build: deploy d1674bd516b8f8def6ea4c5361b6268609cd41d4 to gh-pages --- assets/index-BhFjL2tD.css | 1 + assets/index-CggOGxW4.js | 56 +++++++++++++++++++++++++++++++++++++ index.html | 7 +++++ logo.png | Bin 0 -> 5791 bytes manifest.json | 15 ++++++++++ sounds/score.mp3 | Bin 0 -> 1480 bytes sprites/apple.png | Bin 0 -> 512 bytes sprites/bag.png | Bin 0 -> 630 bytes sprites/bean.png | Bin 0 -> 708 bytes sprites/bobo.png | Bin 0 -> 606 bytes sprites/boom.png | Bin 0 -> 1778 bytes sprites/btfly.png | Bin 0 -> 647 bytes sprites/bubbie.png | Bin 0 -> 23981 bytes sprites/cloud.png | Bin 0 -> 426 bytes sprites/coin.png | Bin 0 -> 309 bytes sprites/cursor_default.png | Bin 0 -> 263 bytes sprites/cursor_pointer.png | Bin 0 -> 266 bytes sprites/dino.png | Bin 0 -> 965 bytes sprites/door.png | Bin 0 -> 569 bytes sprites/egg.png | Bin 0 -> 430 bytes sprites/egg_crack.png | Bin 0 -> 491 bytes sprites/ghosty.png | Bin 0 -> 586 bytes sprites/gigagantrum.png | Bin 0 -> 1239 bytes sprites/grape.png | Bin 0 -> 562 bytes sprites/grass.png | Bin 0 -> 543 bytes sprites/gun.png | Bin 0 -> 359 bytes sprites/heart.png | Bin 0 -> 368 bytes sprites/jumpy.png | Bin 0 -> 694 bytes sprites/k.png | Bin 0 -> 895 bytes sprites/ka.png | Bin 0 -> 1562 bytes sprites/key.png | Bin 0 -> 433 bytes sprites/lightening.png | Bin 0 -> 361 bytes sprites/mark.png | Bin 0 -> 557 bytes sprites/meat.png | Bin 0 -> 687 bytes sprites/moon.png | Bin 0 -> 480 bytes sprites/mushroom.png | Bin 0 -> 563 bytes sprites/note.png | Bin 0 -> 439 bytes sprites/pineapple.png | Bin 0 -> 510 bytes sprites/pokey.png | Bin 0 -> 27901 bytes sprites/portal.png | Bin 0 -> 778 bytes sprites/spike.png | Bin 0 -> 370 bytes sprites/steel.png | Bin 0 -> 599 bytes sprites/sun.png | Bin 0 -> 523 bytes sprites/sword.png | Bin 0 -> 315 bytes sprites/watermelon.png | Bin 0 -> 550 bytes 45 files changed, 79 insertions(+) create mode 100644 assets/index-BhFjL2tD.css create mode 100644 assets/index-CggOGxW4.js create mode 100644 index.html create mode 100644 logo.png create mode 100644 manifest.json create mode 100644 sounds/score.mp3 create mode 100644 sprites/apple.png create mode 100644 sprites/bag.png create mode 100644 sprites/bean.png create mode 100644 sprites/bobo.png create mode 100644 sprites/boom.png create mode 100644 sprites/btfly.png create mode 100644 sprites/bubbie.png create mode 100644 sprites/cloud.png create mode 100644 sprites/coin.png create mode 100644 sprites/cursor_default.png create mode 100644 sprites/cursor_pointer.png create mode 100644 sprites/dino.png create mode 100644 sprites/door.png create mode 100644 sprites/egg.png create mode 100644 sprites/egg_crack.png create mode 100644 sprites/ghosty.png create mode 100644 sprites/gigagantrum.png create mode 100644 sprites/grape.png create mode 100644 sprites/grass.png create mode 100644 sprites/gun.png create mode 100644 sprites/heart.png create mode 100644 sprites/jumpy.png create mode 100644 sprites/k.png create mode 100644 sprites/ka.png create mode 100644 sprites/key.png create mode 100644 sprites/lightening.png create mode 100644 sprites/mark.png create mode 100644 sprites/meat.png create mode 100644 sprites/moon.png create mode 100644 sprites/mushroom.png create mode 100644 sprites/note.png create mode 100644 sprites/pineapple.png create mode 100644 sprites/pokey.png create mode 100644 sprites/portal.png create mode 100644 sprites/spike.png create mode 100644 sprites/steel.png create mode 100644 sprites/sun.png create mode 100644 sprites/sword.png create mode 100644 sprites/watermelon.png diff --git a/assets/index-BhFjL2tD.css b/assets/index-BhFjL2tD.css new file mode 100644 index 0000000..b1cc58c --- /dev/null +++ b/assets/index-BhFjL2tD.css @@ -0,0 +1 @@ +*{border:0;margin:0;padding:0}html,body{width:100%;height:100%;overflow:hidden} diff --git a/assets/index-CggOGxW4.js b/assets/index-CggOGxW4.js new file mode 100644 index 0000000..4ef1e90 --- /dev/null +++ b/assets/index-CggOGxW4.js @@ -0,0 +1,56 @@ +var bl=Object.defineProperty;var El=(t,e,r)=>e in t?bl(t,e,{enumerable:true,configurable:true,writable:true,value:r}):t[e]=r;var b=(t,e,r)=>El(t,typeof e!=="symbol"?e+"":e,r);(function t(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload")){return}for(const n of document.querySelectorAll('link[rel="modulepreload"]')){s(n)}new MutationObserver(n=>{for(const i of n){if(i.type!=="childList"){continue}for(const o of i.addedNodes){if(o.tagName==="LINK"&&o.rel==="modulepreload")s(o)}}}).observe(document,{childList:true,subtree:true});function r(n){const i={};if(n.integrity)i.integrity=n.integrity;if(n.referrerPolicy)i.referrerPolicy=n.referrerPolicy;if(n.crossOrigin==="use-credentials")i.credentials="include";else if(n.crossOrigin==="anonymous")i.credentials="omit";else i.credentials="same-origin";return i}function s(n){if(n.ep)return;n.ep=true;const i=r(n);fetch(n.href,i)}})();var Ml=Object.defineProperty;var a=(t,e)=>Ml(t,"name",{value:e,configurable:true});var Sl=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return r=>{for(var s=r.length,n=new Uint8Array((s-(r[s-1]=="=")-(r[s-2]=="="))*3/4|0),i=0,o=0;i>4,n[o++]=l<<4|u>>2,n[o++]=u<<6|f}return n}})();var Z;var X=(Z=class{constructor(e,r,s){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=Ne(e,0,255),this.g=Ne(r,0,255),this.b=Ne(s,0,255)}static fromArray(e){return new Z(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new Z(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!r)throw new Error("Invalid hex color format");return new Z(parseInt(r[1],16),parseInt(r[2],16),parseInt(r[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,r,s){if(r==0)return new Z(255*s,255*s,255*s);let n=a((f,x,h)=>(h<0&&(h+=1),h>1&&(h-=1),h<1/6?f+(x-f)*6*h:h<1/2?x:h<2/3?f+(x-f)*(2/3-h)*6:f),"hue2rgb"),i=s<.5?s*(1+r):s+r-s*r,o=2*s-i,d=n(o,i,e+1/3),l=n(o,i,e),u=n(o,i,e-1/3);return new Z(Math.round(d*255),Math.round(l*255),Math.round(u*255))}clone(){return new Z(this.r,this.g,this.b)}lighten(e){return new Z(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new Z(255-this.r,255-this.g,255-this.b)}mult(e){return new Z(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,r){return new Z(be(this.r,e.r,r),be(this.g,e.g,r),be(this.b,e.b,r))}toHSL(){let e=this.r/255,r=this.g/255,s=this.b/255,n=Math.max(e,r,s),i=Math.min(e,r,s),o=(n+i)/2,d=o,l=o;if(n==i)o=d=0;else{let u=n-i;switch(d=l>.5?u/(2-n-i):u/(n+i),n){case e:o=(r-s)/u+(rX.fromHSL(t,e,r),"hsl2rgb");function de(t){return t*Math.PI/180}a(de,"deg2rad");function gt(t){return t*180/Math.PI}a(gt,"rad2deg");function Ne(t,e,r){return e>r?Ne(t,r,e):Math.min(Math.max(t,e),r)}a(Ne,"clamp");function be(t,e,r){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*r;if(t instanceof C&&e instanceof C)return t.lerp(e,r);if(t instanceof X&&e instanceof X)return t.lerp(e,r);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}a(be,"lerp");function Le(t,e,r,s,n){return s+(t-e)/(r-e)*(n-s)}a(Le,"map");function ui(t,e,r,s,n){return Ne(Le(t,e,r,s,n),s,n)}a(ui,"mapc");var te;var C=(te=class{constructor(e=0,r=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=r}static fromAngle(e){let r=de(e);return new te(Math.cos(r),Math.sin(r))}static fromArray(e){return new te(e[0],e[1])}clone(){return new te(this.x,this.y)}add(...e){let r=E(...e);return new te(this.x+r.x,this.y+r.y)}sub(...e){let r=E(...e);return new te(this.x-r.x,this.y-r.y)}scale(...e){let r=E(...e);return new te(this.x*r.x,this.y*r.y)}dist(...e){let r=E(...e);return this.sub(r).len()}sdist(...e){let r=E(...e);return this.sub(r).slen()}static sdist(e,r){let s=e.x-r.x,n=e.y-r.y;return s*s+n*n}len(){return Math.sqrt(this.dot(this))}slen(){return this.dot(this)}unit(){let e=this.len();return e===0?new te(0):this.scale(1/e)}normal(){return new te(this.y,-this.x)}reflect(e){return this.sub(e.scale(2*this.dot(e)))}project(e){return e.scale(e.dot(this)/e.len())}reject(e){return this.sub(this.project(e))}dot(e){return this.x*e.x+this.y*e.y}static dot(e,r){return e.x*e.x+e.y*e.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,r){return e.x*r.y-e.y*r.x}angle(...e){let r=E(...e);return gt(Math.atan2(this.y-r.y,this.x-r.x))}angleBetween(...e){let r=E(...e);return gt(Math.atan2(this.cross(r),this.dot(r)))}lerp(e,r){return new te(be(this.x,e.x,r),be(this.y,e.y,r))}slerp(e,r){let s=this.dot(e),n=this.cross(e),i=Math.atan2(n,s);return this.scale(Math.sin((1-r)*i)).add(e.scale(Math.sin(r*i))).scale(1/n)}isZero(){return this.x===0&&this.y===0}toFixed(e){return new te(Number(this.x.toFixed(e)),Number(this.y.toFixed(e)))}transform(e){return e.multVec2(this)}eq(e){return this.x===e.x&&this.y===e.y}bbox(){return new ie(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},a(te,"Vec2"),b(te,"ZERO",new te(0,0)),b(te,"ONE",new te(1,1)),b(te,"LEFT",new te(-1,0)),b(te,"RIGHT",new te(1,0)),b(te,"UP",new te(0,-1)),b(te,"DOWN",new te(0,1)),te);function E(...t){if(t.length===1){if(t[0]instanceof C)return new C(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new C(...t[0])}return new C(...t)}a(E,"vec2");var ht;var oe=(ht=class{constructor(e,r,s,n){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=r,this.w=s,this.h=n}scale(e){return new ht(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new C(this.x,this.y)}clone(){return new ht(this.x,this.y,this.w,this.h)}eq(e){return this.x===e.x&&this.y===e.y&&this.w===e.w&&this.h===e.h}toString(){return`quad(${this.x}, ${this.y}, ${this.w}, ${this.h})`}},a(ht,"Quad"),ht);function he(t,e,r,s){return new oe(t,e,r,s)}a(he,"quad");var Oe;var es=(Oe=class{constructor(e,r,s,n){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=r,this.c=s,this.d=n}mul(e){return new Oe(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return E(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new Oe(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new Oe(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,r=this.det,s=e+Math.sqrt(e*e-r),n=e-Math.sqrt(e*e-r);return[s,n]}eigenvectors(e,r){return this.c!=0?[[e-this.d,this.c],[r-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,r-this.a]]:Math.abs(this.transform(E(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return gt(Math.PI/2-(this.m[5]>0?Math.acos(-this.m[4]/e):-Math.acos(this.m[4]/e)))}else return 0}getSkew(){if(this.m[0]!=0||this.m[1]!=0){let e=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new C(Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e),0)}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new C(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new C(0,0)}invert(){let e=[],r=this.m[10]*this.m[15]-this.m[14]*this.m[11],s=this.m[9]*this.m[15]-this.m[13]*this.m[11],n=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],o=this.m[8]*this.m[14]-this.m[12]*this.m[10],d=this.m[8]*this.m[13]-this.m[12]*this.m[9],l=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],f=this.m[5]*this.m[14]-this.m[13]*this.m[6],x=this.m[4]*this.m[15]-this.m[12]*this.m[7],h=this.m[4]*this.m[14]-this.m[12]*this.m[6],y=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[4]*this.m[13]-this.m[12]*this.m[5],S=this.m[6]*this.m[11]-this.m[10]*this.m[7],g=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],R=this.m[4]*this.m[11]-this.m[8]*this.m[7],P=this.m[4]*this.m[10]-this.m[8]*this.m[6],O=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*r-this.m[6]*s+this.m[7]*n,e[4]=-(this.m[4]*r-this.m[6]*i+this.m[7]*o),e[8]=this.m[4]*s-this.m[5]*i+this.m[7]*d,e[12]=-(this.m[4]*n-this.m[5]*o+this.m[6]*d),e[1]=-(this.m[1]*r-this.m[2]*s+this.m[3]*n),e[5]=this.m[0]*r-this.m[2]*i+this.m[3]*o,e[9]=-(this.m[0]*s-this.m[1]*i+this.m[3]*d),e[13]=this.m[0]*n-this.m[1]*o+this.m[2]*d,e[2]=this.m[1]*l-this.m[2]*u+this.m[3]*f,e[6]=-(this.m[0]*l-this.m[2]*x+this.m[3]*h),e[10]=this.m[0]*y-this.m[1]*x+this.m[3]*p,e[14]=-(this.m[0]*f-this.m[1]*h+this.m[2]*p),e[3]=-(this.m[1]*S-this.m[2]*g+this.m[3]*w),e[7]=this.m[0]*S-this.m[2]*R+this.m[3]*P,e[11]=-(this.m[0]*g-this.m[1]*R+this.m[3]*O),e[15]=this.m[0]*w-this.m[1]*P+this.m[2]*O;let T=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let A=0;A<4;A++)for(let v=0;v<4;v++)e[A*4+v]*=1/T;return new Ae(e)}clone(){return new Ae([...this.m])}toString(){return this.m.toString()}},a(Ae,"Mat4"),Ae);function Xs(t,e,r,s=n=>-Math.cos(n)){return t+(s(r)+1)/2*(e-t)}a(Xs,"wave");var Cl=1103515245;var Bl=12345;var si=2147483648;var Vt;var hi=(Vt=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(Cl*this.seed+Bl)%si,this.seed/si}genNumber(e,r){return e+this.gen()*(r-e)}genVec2(e,r){return new C(this.genNumber(e.x,r.x),this.genNumber(e.y,r.y))}genColor(e,r){return new X(this.genNumber(e.r,r.r),this.genNumber(e.g,r.g),this.genNumber(e.b,r.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof C)return this.genVec2(E(0,0),e[0]);if(e[0]instanceof X)return this.genColor(_(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof C&&e[1]instanceof C)return this.genVec2(e[0],e[1]);if(e[0]instanceof X&&e[1]instanceof X)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},a(Vt,"RNG"),Vt);var Ts=new hi(Date.now());function di(t){return t!=null&&(Ts.seed=t),Ts.seed}a(di,"randSeed");function fe(...t){return Ts.genAny(...t)}a(fe,"rand");function zs(...t){return Math.floor(fe(...t.length>0?t:[2]))}a(zs,"randi");function ci(t){return fe()<=t}a(ci,"chance");function Ws(t){for(let e=t.length-1;e>0;e--){let r=Math.floor(Math.random()*(e+1));[t[e],t[r]]=[t[r],t[e]]}return t}a(Ws,"shuffle");function fi(t,e){return t.length<=e?t.slice():Ws(t.slice()).slice(0,e)}a(fi,"chooseMultiple");function gi(t){return t[zs(t.length)]}a(gi,"choose");function Zs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||n<0||n>1?null:s}a(pi,"testLineLineT");function fs(t,e){let r=pi(t,e);return r?E(t.p1.x+r*(t.p2.x-t.p1.x),t.p1.y+r*(t.p2.y-t.p1.y)):null}a(fs,"testLineLine");function gs(t,e){let r=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY;if(r.x!=0){let i=(t.pos.x-e.p1.x)/r.x,o=(t.pos.x+t.width-e.p1.x)/r.x;s=Math.max(s,Math.min(i,o)),n=Math.min(n,Math.max(i,o))}if(r.y!=0){let i=(t.pos.y-e.p1.y)/r.y,o=(t.pos.y+t.height-e.p1.y)/r.y;s=Math.max(s,Math.min(i,o)),n=Math.min(n,Math.max(i,o))}return n>=s&&n>=0&&s<=1}a(gs,"testRectLine");function Tr(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return false;let n=r.dot(s)/s.dot(s);return n>=0&&n<=1}a(ps,"testLinePoint");function fr(t,e){let r=t.p2.sub(t.p1),s=r.dot(r),n=t.p1.sub(e.center),i=2*r.dot(n),o=n.dot(n)-e.radius*e.radius,d=i*i-4*s*o;if(s<=Number.EPSILON||d<0)return false;if(d==0){let l=-i/(2*s);if(l>=0&&l<=1)return true}else{let l=(-i+Math.sqrt(d))/(2*s),u=(-i-Math.sqrt(d))/(2*s);if(l>=0&&l<=1||u>=0&&u<=1)return true}return Dr(e,t.p1)}a(fr,"testLineCircle");function ms(t,e){if(tt(e,t.p1)||tt(e,t.p2))return true;for(let r=0;rtt(e,r))||e.pts.some(r=>tt(t,r)))}a(_s,"testPolygonPolygon");function tt(t,e){let r=false,s=t.pts;for(let n=0,i=s.length-1;ne.y!=s[i].y>e.y&&e.x<(s[i].x-s[n].x)*(e.y-s[n].y)/(s[i].y-s[n].y)+s[n].x&&(r=!r);return r}a(tt,"testPolygonPoint");function ws(t,e){e=e.sub(t.center);let r=de(t.angle),s=Math.cos(r),n=Math.sin(r),i=e.x*s+e.y*n,o=-e.x*n+e.y*s;return i*i/(t.radiusX*t.radiusX)+o*o/(t.radiusY*t.radiusY)<1}a(ws,"testEllipsePoint");function Er(t,e){let r=e.center.sub(t.center),s=de(t.angle),n=Math.cos(s),i=Math.sin(s),o=r.x*n+r.y*i,d=-r.x*i+r.y*n;return ws(new rt(E(),t.radiusX+e.radius,t.radiusY+e.radius,0),E(o,d))}a(Er,"testEllipseCircle");function en(t,e){let r=t.toMat2().inverse;return e=new ke(r.transform(e.p1.sub(t.center)),r.transform(e.p2.sub(t.center))),fr(e,new Re(E(),1))}a(en,"testEllipseLine");function wi(t,e){if(t.radiusX===t.radiusY)return Er(e,new Re(t.center,t.radiusX));if(e.radiusX===e.radiusY)return Er(t,new Re(e.center,e.radiusX));let r=new xr(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),s=new xr(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),n=t.center.x,i=t.center.y,o=e.center.x,d=e.center.y,l=de(t.angle),u=de(e.angle),f=new xr(Math.cos(l),-Math.sin(l),n,Math.sin(l),Math.cos(l),i,0,0,1),x=new xr(Math.cos(u),-Math.sin(u),o,Math.sin(u),Math.cos(u),d,0,0,1),h=f.inverse,y=x.inverse,p=h.transpose.mul(r).mul(h),S=y.transpose.mul(s).mul(y),g=p.m11,w=p.m12,R=p.m13,P=p.m21,O=p.m22,T=p.m23,A=p.m31,v=p.m32,M=p.m33,k=S.m11,I=S.m12,D=S.m13,U=S.m21,N=S.m22,j=S.m23,z=S.m31,V=S.m32,Y=S.m33,ee=g*O*M-g*T*v-w*P*M+w*T*A+R*P*v-R*O*A,J=(g*O*Y-g*T*V-g*v*j+g*M*N-w*P*Y+w*T*z+w*A*j-w*M*U+R*P*V-R*O*z-R*A*N+R*v*U+P*v*D-P*M*I-O*A*D+O*M*k+T*A*I-T*v*k)/ee,W=(g*N*Y-g*j*V-w*U*Y+w*j*z+R*U*V-R*N*z-P*I*Y+P*D*V+O*k*Y-O*D*z-T*k*V+T*I*z+A*I*j-A*D*N-v*k*j+v*D*U+M*k*N-M*I*U)/ee,le=(k*N*Y-k*j*V-I*U*Y+I*j*z+D*U*V-D*N*z)/ee;if(J>=0){let G=-3*W+J**2,Xe=3*J*le+W*J**2-4*W**2,nt=-27*le**2+18*le*J*W+J**2*W**2-4*J**3*le-4*W**3;return!(G>0&&Xe<0&&nt>0)}else{let G=-3*W+J**2,Xe=-27*le**2+18*le*J*W+J**2*W**2-4*J**3*le-4*W**3;return!(G>0&&Xe>0)}}a(wi,"testEllipseEllipse");function tn(t,e){return ys(t,new Ee(e.points()))}a(tn,"testEllipseRect");function ys(t,e){let r=t.toMat2().inverse;return e=new Ee(e.pts.map(s=>r.transform(s.sub(t.center)))),Or(new Re(E(),1),e)}a(ys,"testEllipsePolygon");function yi(t,e){return t.x===e.x&&t.y===e.y}a(yi,"testPointPoint");function Ai(t,e){return e instanceof C?yi(e,t.pt):e instanceof Re?Dr(e,t.pt):e instanceof ke?ps(e,t.pt):e instanceof ie?Tr(e,t.pt):e instanceof Ee?tt(e,t.pt):e instanceof rt?ws(e,t.pt):false}a(Ai,"testPointShape");function xi(t,e){return e instanceof C?ps(t,e):e instanceof Re?fr(t,e):e instanceof ke?fs(t,e)!=null:e instanceof ie?gs(e,t):e instanceof Ee?ms(t,e):e instanceof rt?en(e,t):false}a(xi,"testLineShape");function vi(t,e){return e instanceof C?Dr(t,e):e instanceof Re?mi(t,e):e instanceof ke?fr(e,t):e instanceof ie?Js(e,t):e instanceof Ee?Or(t,e):e instanceof rt?Er(e,t):false}a(vi,"testCircleShape");function bi(t,e){return e instanceof C?Tr(t,e):e instanceof Re?Js(t,e):e instanceof ke?gs(t,e):e instanceof ie?Zs(t,e):e instanceof Ee?$s(t,e):e instanceof rt?tn(e,t):false}a(bi,"testRectShape");function Ei(t,e){return e instanceof C?tt(t,e):e instanceof Re?Or(e,t):e instanceof ke?ms(e,t):e instanceof ie?$s(e,t):e instanceof Ee?_s(e,t):e instanceof rt?ys(e,t):false}a(Ei,"testPolygonShape");function Mi(t,e){return e instanceof C?ws(t,e):e instanceof Re?Er(t,e):e instanceof ke?en(t,e):e instanceof ie?tn(t,e):e instanceof Ee?ys(t,e):e instanceof rt?wi(e,t):false}a(Mi,"testEllipseShape");function rn(t,e,r){let s=t,n=r.p1,i=r.p2,o=e,d=i.sub(n),l=o.cross(d);if(Math.abs(l)=1)return null;let x=u.cross(o)/l;if(x<=0||x>=1)return null;let h=d.normal().unit();return e.dot(h)>0&&(h.x*=-1,h.y*=-1),{point:s.add(o.scale(f)),normal:h,fraction:f}}a(rn,"raycastLine");function Si(t,e,r){let s=Number.NEGATIVE_INFINITY,n=Number.POSITIVE_INFINITY,i;if(t.x!=0){let o=(r.pos.x-t.x)/e.x,d=(r.pos.x+r.width-t.x)/e.x;i=E(-Math.sign(e.x),0),s=Math.max(s,Math.min(o,d)),n=Math.min(n,Math.max(o,d))}if(t.y!=0){let o=(r.pos.y-t.y)/e.y,d=(r.pos.y+r.height-t.y)/e.y;Math.min(o,d)>s&&(i=E(0,-Math.sign(e.y))),s=Math.max(s,Math.min(o,d)),n=Math.min(n,Math.max(o,d))}return n>=s&&s>=0&&s<=1?{point:t.add(e.scale(s)),normal:i,fraction:s}:null}a(Si,"raycastRect");function sn(t,e,r){let s=t,n=r.center,i=e,o=i.dot(i),d=s.sub(n),l=2*i.dot(d),u=d.dot(d)-r.radius*r.radius,f=l*l-4*o*u;if(o<=Number.EPSILON||f<0)return null;if(f==0){let x=-l/(2*o);if(x>=0&&x<=1){let h=s.add(i.scale(x));return{point:h,normal:h.sub(n),fraction:x}}}else{let x=(-l+Math.sqrt(f))/(2*o),h=(-l-Math.sqrt(f))/(2*o),y=null;if(x>=0&&x<=1&&(y=x),h>=0&&h<=1&&(y=Math.min(h,y??h)),y!=null){let p=s.add(i.scale(y));return{point:p,normal:p.sub(n).unit(),fraction:y}}}return null}a(sn,"raycastCircle");function qi(t,e,r){let s=r.pts,n=null,i=s[s.length-1];for(let o=0;ol.fraction)&&(n=l),i=d}return n}a(qi,"raycastPolygon");function Ci(t,e,r){let s=r.toMat2(),n=s.inverse,i=n.transform(t.sub(r.center)),o=n.transform(e),d=sn(i,o,new Re(E(),1));if(d){let l=es.rotation(de(-r.angle)),u=es.scale(r.radiusX,r.radiusY).transform(d.point),f=s.transform(d.point).add(r.center),x=f.dist(t)/e.len();return{point:f,normal:l.transform(E(r.radiusY**2*u.x,r.radiusX**2*u.y)).unit(),fraction:x}}return d}a(Ci,"raycastEllipse");function Bi(t,e,r,s=64){let n=t,i=e.len(),o=e.scale(1/i),d=0,l=E(Math.floor(t.x),Math.floor(t.y)),u=E(o.x>0?1:-1,o.y>0?1:-1),f=E(Math.abs(1/o.x),Math.abs(1/o.y)),x=E(u.x>0?l.x+1-t.x:t.x-l.x,u.y>0?l.y+1-t.y:t.y-l.y),h=E(f.x<1/0?f.x*x.x:1/0,f.y<1/0?f.y*x.y:1/0),y=-1;for(;d<=s;){let p=r(l);if(p===true)return{point:n.add(o.scale(d)),normal:E(y===0?-u.x:0,y===1?-u.y:0),fraction:d/i,gridPos:l};if(p)return p;h.xe.multVec2(r)))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new ft(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let r=this.pos,s=this.pos.add(this.width,this.height),n=Math.max(r.x-e.x,0,e.x-s.x),i=Math.max(r.y-e.y,0,e.y-s.y);return n*n+i*i}collides(e){return bi(this,e)}contains(e){return this.collides(e)}raycast(e,r){return Si(e,r,this)}random(){return this.pos.add(fe(this.width),fe(this.height))}},a(ft,"Rect"),ft);var Et;var Re=(Et=class{constructor(e,r){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=r}transform(e){return new rt(this.center,this.radius,this.radius).transform(e)}bbox(){return ie.fromPoints(this.center.sub(E(this.radius)),this.center.add(E(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Et(this.center,this.radius)}collides(e){return vi(this,e)}contains(e){return this.collides(e)}raycast(e,r){return sn(e,r,this)}random(){return this.center.add(C.fromAngle(fe(360)).scale(fe(this.radius)))}},a(Et,"Circle"),Et);var Ue;var rt=(Ue=class{constructor(e,r,s,n=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=r,this.radiusY=s,this.angle=n}static fromMat2(e){let r=e.inverse,s=r.transpose.mul(r),[n,i]=s.eigenvalues,[o,d]=s.eigenvectors(n,i),[l,u]=[1/Math.sqrt(n),1/Math.sqrt(i)];return l>u?new Ue(E(),l,u,gt(Math.atan2(-o[1],o[0]))):new Ue(E(),u,l,gt(Math.atan2(-d[1],d[0])))}toMat2(){let e=de(this.angle),r=Math.cos(e),s=Math.sin(e);return new es(r*this.radiusX,-s*this.radiusY,s*this.radiusX,r*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new Ue(e.multVec2(this.center),e.m[0]*this.radiusX,e.m[5]*this.radiusY);{let r=this.toMat2(),s=e.getRotation(),n=e.getScale();r=xr.fromMat2(r).scale(n.x,n.y).rotate(s).toMat2();let i=Ue.fromMat2(r);return i.center=e.multVec2(this.center),i}}bbox(){if(this.angle==0)return ie.fromPoints(this.center.sub(E(this.radiusX,this.radiusY)),this.center.add(E(this.radiusX,this.radiusY)));{let e=de(this.angle),r=Math.cos(e),s=Math.sin(e),n=this.radiusX*r,i=this.radiusX*s,o=this.radiusY*s,d=this.radiusY*r,l=Math.sqrt(n*n+o*o),u=Math.sqrt(i*i+d*d);return ie.fromPoints(this.center.sub(E(l,u)),this.center.add(E(l,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new Ue(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Mi(this,e)}contains(e){e=e.sub(this.center);let r=de(this.angle),s=Math.cos(r),n=Math.sin(r),i=e.x*s+e.y*n,o=-e.x*n+e.y*s;return i*i/(this.radiusX*this.radiusX)+o*o/(this.radiusY*this.radiusY)<1}raycast(e,r){return Ci(e,r,this)}random(){return this.center}},a(Ue,"Ellipse"),Ue);function Ri(t,e,r,s){let n=e.sub(t),i=s.sub(r),o=n.cross(i);return o<1e-5&&o>-1e-5||(o=r.sub(t).cross(i)/o,o<0||o>1)?null:t.add(n.scale(o))}a(Ri,"segmentLineIntersection");var Ke;var Ee=(Ke=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new Ke(this.pts.map(r=>e.multVec2(r)))}bbox(){let e=E(Number.MAX_VALUE),r=E(-Number.MAX_VALUE);for(let s of this.pts)e.x=Math.min(e.x,s.x),r.x=Math.max(r.x,s.x),e.y=Math.min(e.y,s.y),r.y=Math.max(r.y,s.y);return ie.fromPoints(e,r)}area(){let e=0,r=this.pts.length;for(let s=0;se.clone()))}collides(e){return Ei(this,e)}contains(e){return this.collides(e)}raycast(e,r){return qi(e,r,this)}random(){return E()}cut(e,r){new ke(e,r);let s=[],n=[],i=r.sub(e),o=this.pts[this.pts.length-1],d=o.sub(e),l=i.cross(d)>0;return this.pts.forEach(u=>{d=u.sub(e);let f=i.cross(d)>0;if(l!=f){let x=Ri(o,u,e,r);s.push(x),n.push(x),l=f}(f?s:n).push(u),o=u}),[s.length?new Ke(s):null,n.length?new Ke(n):null]}},a(Ke,"Polygon"),Ke);function Pi(t,e,r,s){let n=s*s,i=1-s,o=i*i;return t.scale(o).add(e.scale(2*i*s)).add(r.scale(n))}a(Pi,"evaluateQuadratic");function ki(t,e,r,s){let n=1-s;return e.sub(t).scale(2*n).add(r.sub(e).scale(2*s))}a(ki,"evaluateQuadraticFirstDerivative");function Ii(t,e,r,s){return r.sub(e.scale(2)).add(t).scale(2)}a(Ii,"evaluateQuadraticSecondDerivative");function As(t,e,r,s,n){let i=n*n,o=i*n,d=1-n,l=d*d,u=l*d;return t.scale(u).add(e.scale(3*l*n)).add(r.scale(3*d*i)).add(s.scale(o))}a(As,"evaluateBezier");function Fi(t,e,r,s,n){let i=n*n,o=1-n,d=o*o;return e.sub(t).scale(3*d).add(r.sub(e).scale(6*o*n)).add(s.sub(r).scale(3*i))}a(Fi,"evaluateBezierFirstDerivative");function Ti(t,e,r,s,n){let i=1-n;return r.sub(e.scale(2)).add(t).scale(6*i).add(s.sub(r.scale(2)).add(e).scale(6*n))}a(Ti,"evaluateBezierSecondDerivative");function Di(t,e,r,s,n){let i=.5*(((-n+2)*n-1)*n),o=.5*((3*n-5)*n*n+2),d=.5*(((-3*n+4)*n+1)*n),l=.5*((n-1)*n*n);return t.scale(i).add(e.scale(o)).add(r.scale(d)).add(s.scale(l))}a(Di,"evaluateCatmullRom");function Oi(t,e,r,s,n){let i=.5*((-3*n+4)*n-1),o=.5*((9*n-10)*n),d=.5*((-9*n+8)*n+1),l=.5*((3*n-2)*n);return t.scale(i).add(e.scale(o)).add(r.scale(d)).add(s.scale(l))}a(Oi,"evaluateCatmullRomFirstDerivative");function Ui(t){let e=nn(t),r=e(1);return s=>{let n=s*r,i=e(n,true);return t(i)}}a(Ui,"normalizedCurve");function nn(t,e=10,r=10){let s=[0],n=[0],i=1/(e-1)/r,o=0,d=t(0),l=0;for(let u=1;u{if(f){let x=u;if(x<=0)return 0;if(x>=o)return 1;let h=0;for(;s[h+1]=1)return s[e-1];let x=0;for(;n[x+1]{let u=l*l,f=u*l;return n*f+i*u+o*l+d}}a(gr,"hermite");function an(t,e,r,s,n,i=gr){let o=i(e.x,(1-n)*(r.x-t.x),(1-n)*(s.x-e.x),r.x),d=i(e.y,(1-n)*(r.y-t.y),(1-n)*(s.y-e.y),r.y);return l=>new C(o(l),d(l))}a(an,"cardinal");function Mr(t,e,r,s,n=gr){return an(t,e,r,s,.5,n)}a(Mr,"catmullRom");function Li(t,e,r,s,n=gr){return Mr(s.add(t.sub(e).scale(6)),t,s,t.add(s.sub(r).scale(6)),n)}a(Li,"bezier");function Ni(t,e,r,s,n,i,o,d=gr){let l=d(e.x,.5*(1-n)*(1+o)*(1+i)*(e.x-t.x)+.5*(1-n)*(1-o)*(1-i)*(r.x-e.x),.5*(1-n)*(1+o)*(1-i)*(r.x-e.x)+.5*(1-n)*(1-o)*(1+i)*(s.x-r.x),r.x),u=d(e.y,.5*(1-n)*(1+o)*(1+i)*(e.y-t.y)+.5*(1-n)*(1-o)*(1-i)*(r.y-e.y),.5*(1-n)*(1+o)*(1-i)*(r.y-e.y)+.5*(1-n)*(1-o)*(1+i)*(s.y-r.y),r.y);return f=>new C(l(f),u(f))}a(Ni,"kochanekBartels");function Gi(t,e,r,s){let n=2*t+e-2*s+r,i=-3*t+3*s-2*e+r,o=e;return d=>{let l=d*d;return 3*n*l+2*i*d+o}}a(Gi,"hermiteFirstDerivative");function Ot(t){return 0<=t&&t<=1}a(Ot,"inZeroOneDomain");function Zr(t,e){return Math.abs(t-e)<=Number.EPSILON}a(Zr,"approximately");function Ut(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}a(Ut,"cubeRoot");function Hi(t,e,r,s){let n=3*t-6*e+3*r,i=-3*t+3*e,o=t,d=-t+3*e-3*r+s;if(Zr(d,0)){if(Zr(n,0))return Zr(i,0)?[]:[-o/i].filter(Ot);let g=Math.sqrt(i*i-4*n*o),w=2*n;return[(g-i)/w,(-i-g)/w].filter(Ot)}n/=d,i/=d,o/=d;let l=(3*i-n*n)/3,u=l/3,f=(2*n*n*n-9*n*i+27*o)/27,x=f/2,h=x*x+u*u*u;if(h<0){let g=-l/3,w=g*g*g,R=Math.sqrt(w),P=-f/(2*R),O=P<-1?-1:P>1?1:P,T=Math.acos(O),A=2*Ut(R),v=A*Math.cos(T/3)-n/3,M=A*Math.cos((T+2*Math.PI)/3)-n/3,k=A*Math.cos((T+4*Math.PI)/3)-n/3;return[v,M,k].filter(Ot)}if(h===0){let g=x<0?Ut(-x):-Ut(x),w=2*g-n/3,R=-g-n/3;return[w,R].filter(Ot)}let y=Math.sqrt(h),p=Ut(y-x),S=Ut(y+x);return[p-S-n/3].filter(Ot)}a(Hi,"getCubicRoots");function ji(t,e,r,s,n){let i=Hi(t.x-n,e.x-n,r.x-n,s.x-n);return i.length>0?As(t,e,r,s,i[0]).y:NaN}a(ji,"cubicBezierYforX");function Vi(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return r=>{if(r<=0||t.length==1||r<=t[0].x)return t[0].y;for(let s=0;s=r)return Le(r,t[s-1].x,t[s].x,t[s-1].y,t[s].y);return t[t.length-1].y}}a(Vi,"easingLinear");function Ki(t,e){return r=>ji(E(0,0),t,e,E(1,1),r)}a(Ki,"easingCubicBezier");function Yi(t,e="jump-end"){let r=1/t,s=e=="jump-start"||e=="jump-both",n=e=="jump-end"||e=="jump-both",i=1/(t+(n?1:0)),o=s?i:0;return d=>{let l=Math.floor(d/r);return o+l*i}}a(Yi,"easingSteps");function Qi(t,e){let r=Number.MAX_VALUE,s={normal:E(0),distance:0};for(let n of[t,e])for(let i=0;i=0}a(on,"isOrientedCcw");function Xi(t){let e=0,r=t[t.length-1];for(let s=0;s=0}a(Jr,"onSameSide");function zi(t,e,r,s){return Jr(t,e,r,s)&&Jr(t,r,e,s)&&Jr(t,s,e,r)}a(zi,"pointInTriangle");function Wi(t,e,r,s){for(let n of t)if(n!==e&&n!==r&&n!==s&&zi(n,e,r,s))return true;return false}a(Wi,"someInTriangle");function Zi(t,e,r,s){return on(t,e,r)&&!Wi(s,t,e,r)}a(Zi,"isEar");function ln(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],r=[],s=0;for(let x=0;x3;){u=e[d],f=r[d];let x=t[f],h=t[d],y=t[u];if(Zi(x,h,y,n))i.push([x,h,y]),e[f]=u,r[u]=f,n.splice(n.indexOf(h),1),--o,l=0;else if(++l>o)return[];d=u}return u=e[d],f=r[d],i.push([t[f],t[d],t[u]]),i}a(ln,"triangulate");function Ji(t){if(t.length<3)return false;let e=t.length-2,r=t.length-1,s=0,n=t[r].sub(t[e]),i=t[s].sub(t[r]),o=n.cross(i);for(;s+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";var xs="topleft";var Pl="monospace";var ts="monospace";var Ds="linear";var un=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}];var kl=un.reduce((t,e)=>t+e.size,0);var _i=2048;var Il=_i*4*kl;var Fl=_i*6;var Tl=` +attribute vec2 a_pos; +attribute vec2 a_uv; +attribute vec4 a_color; + +varying vec2 v_pos; +varying vec2 v_uv; +varying vec4 v_color; + +vec4 def_vert() { + return vec4(a_pos, 0.0, 1.0); +} + +{{user}} + +void main() { + vec4 pos = vert(a_pos, a_uv, a_color); + v_pos = a_pos; + v_uv = a_uv; + v_color = a_color; + gl_Position = pos; +} +`;var Dl=` +precision mediump float; + +varying vec2 v_pos; +varying vec2 v_uv; +varying vec4 v_color; + +uniform sampler2D u_tex; + +vec4 def_frag() { + vec4 texColor = texture2D(u_tex, v_uv); + return vec4((v_color.rgb * texColor.rgb), texColor.a) * v_color.a; +} + +{{user}} + +void main() { + gl_FragColor = frag(v_pos, v_uv, v_color, u_tex); + if (gl_FragColor.a == 0.0) { + discard; + } +} +`;var Os=` +vec4 vert(vec2 pos, vec2 uv, vec4 color) { + return def_vert(); +} +`;var Us=` +vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { + return def_frag(); +} +`;var Ol=new Set(["id","require"]);var Ul=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]);var Ll=200;var Nl=640;var Gl=65536;var ea=Symbol.for("kaplay.cancel");var Kt;var ta=(Kt=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(r){let s=this.lastID;return this.set(s,r),this.lastID++,s}pushd(r){let s=this.push(r);return()=>this.delete(s)}},a(Kt,"Registry"),Kt);var Mt;var Bt=(Mt=class{constructor(e){b(this,"paused",false);b(this,"cancel");this.cancel=e}static join(e){let r=new Mt(()=>e.forEach(s=>s.cancel()));return Object.defineProperty(r,"paused",{get:a(()=>e[0].paused,"get"),set:a(s=>e.forEach(n=>n.paused=s),"set")}),r.paused=false,r}static replace(e,r){return e.cancel=()=>r.cancel(),r.paused=e.paused,Object.defineProperty(e,"paused",{get:a(()=>r.paused,"get"),set:a(s=>r.paused=s,"set")}),e}},a(Mt,"KEventController"),Mt);var Yt;var xe=(Yt=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new ta)}add(e){function r(...i){if(!n.paused)return e(...i)}a(r,"handler");let s=this.handlers.pushd(r),n=new Bt(s);return this.cancellers.set(r,s),n}addOnce(e){let r=this.add((...s)=>{r.cancel(),e(...s)});return r}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(r=>{let s=r(...e),n;s===ea&&(n=this.cancellers.get(r))&&n()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},a(Yt,"KEvent"),Yt);var Qt;var Sr=(Qt=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,r){return this.handlers[e]||(this.handlers[e]=new xe),this.handlers[e].add(r)}onOnce(e,r){let s=this.on(e,(...n)=>{s.cancel(),r(...n)});return s}next(e){return new Promise(r=>{this.onOnce(e,(...s)=>r(s[0]))})}trigger(e,...r){this.handlers[e]&&this.handlers[e].trigger(...r)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var r;return((r=this.handlers[e])==null?void 0:r.numListeners())??0}},a(Qt,"KEventHandler"),Qt);var Hl=a(t=>t[0]instanceof X,"arrayIsColor");var jl=a(t=>t[0]instanceof C,"arrayIsVec2");var Vl=a(t=>typeof t[0]=="number","arrayIsNumber");var Xt;var ra=(Xt=class{constructor(e=(r,s)=>r0;){let r=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[r])&&this._items[e]>=this._items[r])break;this.swap(e,r),e=r}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL");var Kl=a(t=>t.split(".").slice(0,-1).join("."),"getFileName");function bs(t,e){if(t===e)return true;let r=typeof t,s=typeof e;if(r!==s)return false;if(r==="object"&&s==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return false;let n=Object.keys(t),i=Object.keys(e);if(n.length!==i.length)return false;for(let o of n){let d=t[o],l=e[o];if(!bs(d,l))return false}return true}return false}a(bs,"deepEq");var ni=new Set;var Yl=a(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function oa(t){ni.has(t)||(ni.add(t),console.warn(t))}a(oa,"warn");function Rt(t,e){oa(`${t} is deprecated. Use ${e} instead.`)}a(Rt,"deprecateMsg");function rs(t,e){return Number(t.toFixed(e))}a(rs,"toFixed");function ne(t,e){return(...r)=>{let s=r.length;if(s===t.length)return t(...r);if(s===e.length)return e(...r)}}a(ne,"overload2");var Ql=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function la(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],r=0,s=0;for(;r=e&&t<=r}a(xt,"betweenInclusive");var Fe=a((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes");var je=a((t,e)=>Array.isArray(e)?e.some(r=>t.has(r)):t.has(e),"setHasOrIncludes");var Qr=a((t,e,r)=>{var s;t.has(e)?(s=t.get(e))==null?void 0:s.push(r):t.set(e,[r])},"mapAddOrPush");var Xl=(()=>{let t=0;return()=>t++})();var zl={"Joy-Con L+R (STANDARD GAMEPAD Vendor: 057e Product: 200e)":{buttons:{"0":"south","1":"east","2":"west","3":"north","4":"lshoulder","5":"rshoulder","6":"ltrigger","7":"rtrigger","8":"select","9":"start","10":"lstick","11":"rstick","12":"dpad-up","13":"dpad-down","14":"dpad-left","15":"dpad-right","16":"home","17":"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},"Joy-Con (L) (STANDARD GAMEPAD Vendor: 057e Product: 2006)":{buttons:{"0":"south","1":"east","2":"west","3":"north","4":"lshoulder","5":"rshoulder","9":"select","10":"lstick","16":"start"},sticks:{left:{x:0,y:1}}},"Joy-Con (R) (STANDARD GAMEPAD Vendor: 057e Product: 2007)":{buttons:{"0":"south","1":"east","2":"west","3":"north","4":"lshoulder","5":"rshoulder","9":"start","10":"lstick","16":"select"},sticks:{left:{x:0,y:1}}},"Pro Controller (STANDARD GAMEPAD Vendor: 057e Product: 2009)":{buttons:{"0":"south","1":"east","2":"west","3":"north","4":"lshoulder","5":"rshoulder","6":"ltrigger","7":"rtrigger","8":"select","9":"start","10":"lstick","11":"rstick","12":"dpad-up","13":"dpad-down","14":"dpad-left","15":"dpad-right","16":"home","17":"capture"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}},default:{buttons:{"0":"south","1":"east","2":"west","3":"north","4":"lshoulder","5":"rshoulder","6":"ltrigger","7":"rtrigger","8":"select","9":"start","10":"lstick","11":"rstick","12":"dpad-up","13":"dpad-down","14":"dpad-left","15":"dpad-right","16":"home"},sticks:{left:{x:0,y:1},right:{x:2,y:3}}}};var Wl=a(()=>bt.lastInputDevice,"getLastInputDeviceType");var Zl=a(()=>{let t=bt.buttons;for(let e in t){let r=t[e].keyboard&&[t[e].keyboard].flat(),s=t[e].keyboardCode&&[t[e].keyboardCode].flat(),n=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();r&&r.forEach(o=>{Qr(bt.buttonsByKey,o,e)}),s&&s.forEach(o=>{Qr(bt.buttonsByKeyCode,o,e)}),n&&n.forEach(o=>{Qr(bt.buttonsByGamepad,o,e)}),i&&i.forEach(o=>{Qr(bt.buttonsByMouse,o,e)})}},"parseButtonBindings");var zt;var vr=(zt=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},a(zt,"ButtonState"),zt);var Wt;var Jl=(Wt=class{constructor(){b(this,"buttonState",new vr);b(this,"stickState",new Map)}},a(Wt,"GamepadState"),Wt);var Zt;var $l=(Zt=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((r,s)=>r+s)/this.dts.length)),this.dts=[])}},a(Zt,"FPSCounter"),Zt);var bt;var ii=zl;var _l=a(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:false,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new $l,timeScale:1,skipTime:false,isHidden:false,numFrames:0,mousePos:new C(0),mouseDeltaPos:new C(0),keyState:new vr,mouseState:new vr,mergedGamepadState:new Jl,gamepadStates:new Map,lastInputDevice:null,buttonState:new vr,gamepads:[],charInputted:[],isMouseMoved:false,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new Sr}},"initAppState");var eu=a(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=_l(t);bt=e,Zl();function r(){return e.dt*e.timeScale}a(r,"dt");function s(){return e.fixedDt*e.timeScale}a(s,"fixedDt");function n(){return e.restDt*e.timeScale}a(n,"restDt");function i(){return e.isHidden}a(i,"isHidden");function o(){return e.time}a(o,"time");function d(){return e.fpsCounter.fps}a(d,"fps");function l(){return e.numFrames}a(l,"numFrames");function u(){return e.canvas.toDataURL()}a(u,"screenshot");function f(m){e.canvas.style.cursor=m}a(f,"setCursor");function x(){return e.canvas.style.cursor}a(x,"getCursor");function h(m){if(m)try{let q=e.canvas.requestPointerLock();q.catch&&q.catch(B=>console.error(B))}catch(q){console.error(q)}else document.exitPointerLock()}a(h,"setCursorLocked");function y(){return!!document.pointerLockElement}a(y,"isCursorLocked");function p(m){m.requestFullscreen?m.requestFullscreen():m.webkitRequestFullscreen&&m.webkitRequestFullscreen()}a(p,"enterFullscreen");function S(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}a(S,"exitFullscreen");function g(m=true){m?p(e.canvas):S()}a(g,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}a(w,"isFullscreen");function R(){e.stopped=true;let m=Object.entries(Se),q=Object.entries(Is),B=Object.entries(Yr);for(let[F,H]of m)e.canvas.removeEventListener(F,H);for(let[F,H]of q)document.removeEventListener(F,H);for(let[F,H]of B)window.removeEventListener(F,H);ri.disconnect()}a(R,"quit");function P(m,q){e.loopID!==null&&cancelAnimationFrame(e.loopID);let B=0,F=0,H=a(se=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(H);return}let me=se/1e3,ue=Math.min(me-e.realTime,.25),Ze=t.maxFPS?1/t.maxFPS:0;if(e.realTime=me,F+=ue,F>Ze){if(!e.skipTime){for(B+=F,e.dt=e.fixedDt,e.restDt=0;B>e.fixedDt;)B-=e.fixedDt,B0}a(O,"isTouchscreen");function T(){return e.mousePos.clone()}a(T,"mousePos");function A(){return e.mouseDeltaPos.clone()}a(A,"mouseDeltaPos");function v(m="left"){return e.mouseState.pressed.has(m)}a(v,"isMousePressed");function M(m="left"){return e.mouseState.down.has(m)}a(M,"isMouseDown");function k(m="left"){return e.mouseState.released.has(m)}a(k,"isMouseReleased");function I(){return e.isMouseMoved}a(I,"isMouseMoved");function D(m){return m===void 0?e.keyState.pressed.size>0:je(e.keyState.pressed,m)}a(D,"isKeyPressed");function U(m){return m===void 0?e.keyState.pressedRepeat.size>0:je(e.keyState.pressedRepeat,m)}a(U,"isKeyPressedRepeat");function N(m){return m===void 0?e.keyState.down.size>0:je(e.keyState.down,m)}a(N,"isKeyDown");function j(m){return m===void 0?e.keyState.released.size>0:je(e.keyState.released,m)}a(j,"isKeyReleased");function z(m){return m===void 0?e.mergedGamepadState.buttonState.pressed.size>0:je(e.mergedGamepadState.buttonState.pressed,m)}a(z,"isGamepadButtonPressed");function V(m){return m===void 0?e.mergedGamepadState.buttonState.down.size>0:je(e.mergedGamepadState.buttonState.down,m)}a(V,"isGamepadButtonDown");function Y(m){return m===void 0?e.mergedGamepadState.buttonState.released.size>0:je(e.mergedGamepadState.buttonState.released,m)}a(Y,"isGamepadButtonReleased");function ee(m){return m===void 0?e.buttonState.pressed.size>0:je(e.buttonState.pressed,m)}a(ee,"isButtonPressed");function J(m){return m===void 0?e.buttonState.down.size>0:je(e.buttonState.down,m)}a(J,"isButtonDown");function W(m){return m===void 0?e.buttonState.released.size>0:je(e.buttonState.released,m)}a(W,"isButtonReleased");function le(m){var q;return(q=e.buttons)==null?void 0:q[m]}a(le,"getButton");function G(m,q){e.buttons[m]={...e.buttons[m],...q}}a(G,"setButton");function Xe(m){e.buttonState.press(m),e.events.trigger("buttonPress",m)}a(Xe,"pressButton");function nt(m){e.buttonState.release(m),e.events.trigger("buttonRelease",m)}a(nt,"releaseButton");function It(m){return e.events.on("resize",m)}a(It,"onResize");let pr=ne(m=>e.events.on("keyDown",m),(m,q)=>e.events.on("keyDown",B=>Fe(m,B)&&q(B))),mr=ne(m=>e.events.on("keyPress",q=>m(q)),(m,q)=>e.events.on("keyPress",B=>Fe(m,B)&&q(B))),Gr=ne(m=>e.events.on("keyPressRepeat",m),(m,q)=>e.events.on("keyPressRepeat",B=>Fe(m,B)&&q(B))),Hr=ne(m=>e.events.on("keyRelease",m),(m,q)=>e.events.on("keyRelease",B=>Fe(m,B)&&q(B))),Ft=ne(m=>e.events.on("mouseDown",q=>m(q)),(m,q)=>e.events.on("mouseDown",B=>Fe(m,B)&&q(B))),Ge=ne(m=>e.events.on("mousePress",q=>m(q)),(m,q)=>e.events.on("mousePress",B=>Fe(m,B)&&q(B))),jr=ne(m=>e.events.on("mouseRelease",q=>m(q)),(m,q)=>e.events.on("mouseRelease",B=>B===m&&q(B)));function vt(m){return e.events.on("mouseMove",()=>m(T(),A()))}a(vt,"onMouseMove");function L(m){return e.events.on("charInput",m)}a(L,"onCharInput");function K(m){return e.events.on("touchStart",m)}a(K,"onTouchStart");function Q(m){return e.events.on("touchMove",m)}a(Q,"onTouchMove");function re(m){return e.events.on("touchEnd",m)}a(re,"onTouchEnd");function ce(m){return e.events.on("scroll",m)}a(ce,"onScroll");function $(m){return e.events.on("hide",m)}a($,"onHide");function ye(m){return e.events.on("show",m)}a(ye,"onShow");let it=ne(m=>e.events.on("gamepadButtonPress",(q,B)=>m(q,B)),(m,q)=>e.events.on("gamepadButtonPress",(B,F)=>Fe(m,B)&&q(B,F))),Rs=ne(m=>e.events.on("gamepadButtonDown",(q,B)=>m(q,B)),(m,q)=>e.events.on("gamepadButtonDown",(B,F)=>Fe(m,B)&&q(B,F))),Ps=ne(m=>e.events.on("gamepadButtonRelease",(q,B)=>m(q,B)),(m,q)=>e.events.on("gamepadButtonRelease",(B,F)=>Fe(m,B)&&q(B,F)));function Vr(m,q){return e.events.on("gamepadStick",(B,F,H)=>B===m&&q(F,H))}a(Vr,"onGamepadStick");function Kr(m){e.events.on("gamepadConnect",m)}a(Kr,"onGamepadConnect");function wr(m){e.events.on("gamepadDisconnect",m)}a(wr,"onGamepadDisconnect");function De(m){return e.mergedGamepadState.stickState.get(m)||new C(0)}a(De,"getGamepadStick");function ze(){return[...e.charInputted]}a(ze,"charInputted");function Tt(){return[...e.gamepads]}a(Tt,"getGamepads");let Ie=ne(m=>e.events.on("buttonPress",q=>m(q)),(m,q)=>e.events.on("buttonPress",B=>Fe(m,B)&&q(B))),yr=ne(m=>e.events.on("buttonDown",q=>m(q)),(m,q)=>e.events.on("buttonDown",B=>Fe(m,B)&&q(B))),We=ne(m=>e.events.on("buttonRelease",q=>m(q)),(m,q)=>e.events.on("buttonRelease",B=>Fe(m,B)&&q(B)));function Ar(){e.events.trigger("input"),e.keyState.down.forEach(m=>e.events.trigger("keyDown",m)),e.mouseState.down.forEach(m=>e.events.trigger("mouseDown",m)),e.buttonState.down.forEach(m=>{e.events.trigger("buttonDown",m)}),$n()}a(Ar,"processInput");function Zn(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((m,q)=>{e.mergedGamepadState.stickState.set(q,new C(0))}),e.charInputted=[],e.isMouseMoved=false,e.mouseDeltaPos=new C(0),e.gamepadStates.forEach(m=>{m.buttonState.update(),m.stickState.forEach((q,B)=>{m.stickState.set(B,new C(0))})})}a(Zn,"resetInput");function ks(m){let q={index:m.index,isPressed:a(B=>{var F;return((F=e.gamepadStates.get(m.index))==null?void 0:F.buttonState.pressed.has(B))||false},"isPressed"),isDown:a(B=>{var F;return((F=e.gamepadStates.get(m.index))==null?void 0:F.buttonState.down.has(B))||false},"isDown"),isReleased:a(B=>{var F;return((F=e.gamepadStates.get(m.index))==null?void 0:F.buttonState.released.has(B))||false},"isReleased"),getStick:a(B=>{var F;return((F=e.gamepadStates.get(m.index))==null?void 0:F.stickState.get(B))||E()},"getStick")};return e.gamepads.push(q),e.gamepadStates.set(m.index,{buttonState:new vr,stickState:new Map([["left",new C(0)],["right",new C(0)]])}),q}a(ks,"registerGamepad");function Jn(m){e.gamepads=e.gamepads.filter(q=>q.index!==m.index),e.gamepadStates.delete(m.index)}a(Jn,"removeGamepad");function $n(){var m,q;for(let B of navigator.getGamepads())B&&!e.gamepadStates.has(B.index)&&ks(B);for(let B of e.gamepads){let F=navigator.getGamepads()[B.index];if(!F)continue;let H=(t.gamepads??{})[F.id]||ii[F.id]||ii.default,se=e.gamepadStates.get(B.index);if(se){for(let me=0;me{e.buttonState.press(Je),e.events.trigger("buttonPress",Je)})),e.mergedGamepadState.buttonState.press(ue),se.buttonState.press(ue),e.events.trigger("gamepadButtonPress",ue,B)}else se.buttonState.down.has(ue)&&(He&&((q=e.buttonsByGamepad.get(ue))==null?void 0:q.forEach(Je=>{e.buttonState.release(Je),e.events.trigger("buttonRelease",Je)})),e.mergedGamepadState.buttonState.release(ue),se.buttonState.release(ue),e.events.trigger("gamepadButtonRelease",ue,B))}for(let me in H.sticks){let ue=H.sticks[me];if(!ue)continue;let Ze=new C(F.axes[ue.x],F.axes[ue.y]);se.stickState.set(me,Ze),e.mergedGamepadState.stickState.set(me,Ze),e.events.trigger("gamepadStick",me,Ze,B)}}}}a($n,"processGamepad");let Se={},Is={},Yr={},_n=t.pixelDensity||1;Se.mousemove=m=>{let q=new C(m.offsetX,m.offsetY),B=new C(m.movementX,m.movementY);if(w()){let F=e.canvas.width/_n,H=e.canvas.height/_n,se=window.innerWidth,me=window.innerHeight,ue=se/me,Ze=F/H;if(ue>Ze){let He=me/H,Je=(se-F*He)/2;q.x=Le(m.offsetX-Je,0,F*He,0,F),q.y=Le(m.offsetY,0,H*He,0,H)}else{let He=se/F,Je=(me-H*He)/2;q.x=Le(m.offsetX,0,F*He,0,F),q.y=Le(m.offsetY-Je,0,H*He,0,H)}}e.events.onOnce("input",()=>{e.isMouseMoved=true,e.mousePos=q,e.mouseDeltaPos=B,e.events.trigger("mouseMove")})};let ei=["left","middle","right","back","forward"];Se.mousedown=m=>{e.events.onOnce("input",()=>{var B;let q=ei[m.button];q&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(q)&&((B=e.buttonsByMouse.get(q))==null?void 0:B.forEach(F=>{e.buttonState.press(F),e.events.trigger("buttonPress",F)})),e.mouseState.press(q),e.events.trigger("mousePress",q))})},Se.mouseup=m=>{e.events.onOnce("input",()=>{var B;let q=ei[m.button];q&&(e.buttonsByMouse.has(q)&&((B=e.buttonsByMouse.get(q))==null?void 0:B.forEach(F=>{e.buttonState.release(F),e.events.trigger("buttonRelease",F)})),e.mouseState.release(q),e.events.trigger("mouseRelease",q))})};let vl=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),ti={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};Se.keydown=m=>{vl.has(m.key)&&m.preventDefault(),e.events.onOnce("input",()=>{var F,H;let q=ti[m.key]||m.key.toLowerCase(),B=m.code;if(q===void 0)throw new Error(`Unknown key: ${m.key}`);q.length===1?(e.events.trigger("charInput",q),e.charInputted.push(q)):q==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),m.repeat?(e.keyState.pressRepeat(q),e.events.trigger("keyPressRepeat",q)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(q)&&((F=e.buttonsByKey.get(q))==null?void 0:F.forEach(se=>{e.buttonState.press(se),e.events.trigger("buttonPress",se)})),e.buttonsByKeyCode.has(B)&&((H=e.buttonsByKeyCode.get(B))==null?void 0:H.forEach(se=>{e.buttonState.press(se),e.events.trigger("buttonPress",se)})),e.keyState.press(q),e.events.trigger("keyPressRepeat",q),e.events.trigger("keyPress",q))})},Se.keyup=m=>{e.events.onOnce("input",()=>{var F,H;let q=ti[m.key]||m.key.toLowerCase(),B=m.code;e.buttonsByKey.has(q)&&((F=e.buttonsByKey.get(q))==null?void 0:F.forEach(se=>{e.buttonState.release(se),e.events.trigger("buttonRelease",se)})),e.buttonsByKeyCode.has(B)&&((H=e.buttonsByKeyCode.get(B))==null?void 0:H.forEach(se=>{e.buttonState.release(se),e.events.trigger("buttonRelease",se)})),e.keyState.release(q),e.events.trigger("keyRelease",q)})},Se.touchstart=m=>{m.preventDefault(),e.events.onOnce("input",()=>{var F;let q=[...m.changedTouches],B=e.canvas.getBoundingClientRect();t.touchToMouse!==false&&(e.mousePos=new C(q[0].clientX-B.x,q[0].clientY-B.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((F=e.buttonsByMouse.get("left"))==null?void 0:F.forEach(H=>{e.buttonState.press(H),e.events.trigger("buttonPress",H)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),q.forEach(H=>{e.events.trigger("touchStart",new C(H.clientX-B.x,H.clientY-B.y),H)})})},Se.touchmove=m=>{m.preventDefault(),e.events.onOnce("input",()=>{let q=[...m.changedTouches],B=e.canvas.getBoundingClientRect();if(t.touchToMouse!==false){let F=e.mousePos;e.mousePos=new C(q[0].clientX-B.x,q[0].clientY-B.y),e.mouseDeltaPos=e.mousePos.sub(F),e.events.trigger("mouseMove")}q.forEach(F=>{e.events.trigger("touchMove",new C(F.clientX-B.x,F.clientY-B.y),F)})})},Se.touchend=m=>{e.events.onOnce("input",()=>{var F;let q=[...m.changedTouches],B=e.canvas.getBoundingClientRect();t.touchToMouse!==false&&(e.mousePos=new C(q[0].clientX-B.x,q[0].clientY-B.y),e.mouseDeltaPos=new C(0,0),e.buttonsByMouse.has("left")&&((F=e.buttonsByMouse.get("left"))==null?void 0:F.forEach(H=>{e.buttonState.release(H),e.events.trigger("buttonRelease",H)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),q.forEach(H=>{e.events.trigger("touchEnd",new C(H.clientX-B.x,H.clientY-B.y),H)})})},Se.touchcancel=m=>{e.events.onOnce("input",()=>{let q=[...m.changedTouches],B=e.canvas.getBoundingClientRect();t.touchToMouse!==false&&(e.mousePos=new C(q[0].clientX-B.x,q[0].clientY-B.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),q.forEach(F=>{e.events.trigger("touchEnd",new C(F.clientX-B.x,F.clientY-B.y),F)})})},Se.wheel=m=>{m.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new C(m.deltaX,m.deltaY))})},Se.contextmenu=m=>m.preventDefault(),Is.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=true,e.isHidden=false,e.events.trigger("show")):(e.isHidden=true,e.events.trigger("hide"))},Yr.gamepadconnected=m=>{let q=ks(m.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",q)})},Yr.gamepaddisconnected=m=>{let q=Tt().filter(B=>B.index===m.gamepad.index)[0];Jn(m.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",q)})};for(let[m,q]of Object.entries(Se))e.canvas.addEventListener(m,q);for(let[m,q]of Object.entries(Is))document.addEventListener(m,q);for(let[m,q]of Object.entries(Yr))window.addEventListener(m,q);let ri=new ResizeObserver(m=>{for(let q of m)if(q.target===e.canvas){if(e.lastWidth===e.canvas.offsetWidth&&e.lastHeight===e.canvas.offsetHeight)return;e.lastWidth=e.canvas.offsetWidth,e.lastHeight=e.canvas.offsetHeight,e.events.onOnce("input",()=>{e.events.trigger("resize")})}});return ri.observe(e.canvas),{state:e,dt:r,fixedDt:s,restDt:n,time:o,run:P,canvas:e.canvas,fps:d,numFrames:l,quit:R,isHidden:i,setFullscreen:g,isFullscreen:w,setCursor:f,screenshot:u,getGamepads:Tt,getCursor:x,setCursorLocked:h,isCursorLocked:y,isTouchscreen:O,mousePos:T,mouseDeltaPos:A,isKeyDown:N,isKeyPressed:D,isKeyPressedRepeat:U,isKeyReleased:j,isMouseDown:M,isMousePressed:v,isMouseReleased:k,isMouseMoved:I,isGamepadButtonPressed:z,isGamepadButtonDown:V,isGamepadButtonReleased:Y,getGamepadStick:De,isButtonPressed:ee,isButtonDown:J,isButtonReleased:W,setButton:G,getButton:le,pressButton:Xe,releaseButton:nt,charInputted:ze,onResize:It,onKeyDown:pr,onKeyPress:mr,onKeyPressRepeat:Gr,onKeyRelease:Hr,onMouseDown:Ft,onMousePress:Ge,onMouseRelease:jr,onMouseMove:vt,onCharInput:L,onTouchStart:K,onTouchMove:Q,onTouchEnd:re,onScroll:ce,onHide:$,onShow:ye,onGamepadButtonDown:Rs,onGamepadButtonPress:it,onGamepadButtonRelease:Ps,onGamepadStick:Vr,onGamepadConnect:Kr,onGamepadDisconnect:wr,onButtonPress:Ie,onButtonDown:yr,onButtonRelease:We,getLastInputDeviceType:Wl,events:e.events}},"initApp");function ge(){return c.app.dt()}a(ge,"dt");function ss(){return c.app.fixedDt()}a(ss,"fixedDt");function ns(){return c.app.restDt()}a(ns,"restDt");var tu=new C(-1,-1);var ru=new C(0,-1);var su=new C(1,-1);var nu=new C(-1,0);var iu=new C(0,0);var au=new C(1,0);var ou=new C(-1,1);var lu=new C(0,1);var uu=new C(1,1);function Pt(t){switch(t){case"topleft":return tu;case"top":return ru;case"topright":return su;case"left":return nu;case"center":return iu;case"right":return au;case"botleft":return ou;case"bot":return lu;case"botright":return uu;default:return t}}a(Pt,"anchorPt");function ya(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}a(ya,"alignPt");function Aa(t){return t.createBuffer(1,1,44100)}a(Aa,"createEmptyAudioBuffer");var Xr=2.5949095;var ai=1.70158+1;var oi=2*Math.PI/3;var li=2*Math.PI/4.5;var $r={linear:a(t=>t,"linear"),easeInSine:a(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:a(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:a(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:a(t=>t*t,"easeInQuad"),easeOutQuad:a(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:a(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:a(t=>t*t*t,"easeInCubic"),easeOutCubic:a(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:a(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:a(t=>t*t*t*t,"easeInQuart"),easeOutQuart:a(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:a(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:a(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:a(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:a(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:a(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:a(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:a(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:a(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:a(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:a(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:a(t=>ai*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:a(t=>1+ai*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:a(t=>t<.5?Math.pow(2*t,2)*((Xr+1)*2*t-Xr)/2:(Math.pow(2*t-2,2)*((Xr+1)*(t*2-2)+Xr)+2)/2,"easeInOutBack"),easeInElastic:a(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*oi),"easeInElastic"),easeOutElastic:a(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*oi)+1,"easeOutElastic"),easeInOutElastic:a(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*li))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*li)/2+1,"easeInOutElastic"),easeInBounce:a(t=>1-$r.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:a(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:a(t=>t<.5?(1-$r.easeOutBounce(1-2*t))/2:(1+$r.easeOutBounce(2*t-1))/2,"easeInOutBounce")};var qr=$r;function xa(t,e,r){let s=[],n=e;for(s.push(n);n!==t;){if(n=r.get(n),n==null)return null;s.push(n)}return s.reverse()}a(xa,"buildPath");function va(t,e,r){var o;let s=new ra((d,l)=>d.coste.y!=s.a.y>e.y&&e.x<(s.a.x-s.b.x)*(e.y-s.b.y)/(s.a.y-s.b.y)+s.b.x&&(r=!r);return r}},a($t,"NavPolygon"),$t);var _t;var cu=(_t=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let r=this._pointCache[`${e.x}_${e.y}`];return r||(r=e.clone(),this._pointCache[`${e.x}_${e.y}`]=r,r)}_addEdge(e){let r=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[r]=e,e}_findEdge(e,r){let s=`${e.x}_${e.y}-${r.x}_${r.y}`;return this._edgeCache[s]}_findCommonEdge(e,r){for(let s of e.edges){let n=this._findEdge(s.b,s.a);if(n&&n.polygon.deref().id===r.id)return n}return null}addPolygon(e){let r=new du(this._polygons.length),s=e.map((n,i)=>new hu(n,e[(i+1)%e.length],r));r.edges=s,this._polygons.push(r);for(let n of r.edges)this._addEdge(n);return r}addRect(e,r){let s=this._addPoint(e),n=this._addPoint(e.add(r.x,0)),i=this._addPoint(e.add(r)),o=this._addPoint(e.add(0,r.y));return this.addPolygon([s,n,i,o])}_getLocation(e){for(let r of this._polygons)if(r.contains(e))return r;return null}getNeighbours(e){let r=[];for(let s of this._polygons[e].edges){let n=this._findEdge(s.b,s.a);if(n){let i=n.polygon.deref();i&&r.push(i.id)}}return r}getCost(e,r){return 1}getHeuristic(e,r){let s=this._polygons[e],n=this._polygons[r],i=s.centroid.x-n.centroid.x,o=s.centroid.y-n.centroid.y;return Math.sqrt(i*i+o*o)}getPath(e,r){return e===void 0||r===void 0?[]:e===r?[e,r]:va(this,e,r)}getWaypointPath(e,r,s){let n=(s==null?void 0:s.type)||"centroids",i=this._getLocation(e),o=this._getLocation(r);if(i===void 0||o===void 0)return[];let d=this.getPath(i.id,o.id);if(!d)return[];if(n==="edges"){let l=[];for(let u=1;uthis._polygons[l].centroid),r]}},a(_t,"NavMesh"),_t);function Gt(t){let e=new Qe;return t.pos&&e.translate(t.pos),t.scale&&e.scale(t.scale),t.angle&&e.rotate(t.angle),t.parent?e.mult(t.parent.transform):e}a(Gt,"calcTransform");function ba(t){return new C(t.x/pe()*2-1,-t.y/we()*2+1)}a(ba,"screen2ndc");function Lt(t,e,r,s,n,i=1){s=de(s%360),n=de(n%360),n<=s&&(n+=Math.PI*2);let o=[],d=Math.ceil((n-s)/de(8)*i),l=(n-s)/d,u=E(Math.cos(s),Math.sin(s)),f=E(Math.cos(l),Math.sin(l));for(let x=0;x<=d;x++)o.push(t.add(e*u.x,r*u.y)),u=E(u.x*f.x-u.y*f.y,u.x*f.y+u.y*f.x);return o}a(Lt,"getArcPts");function Ea(...t){let e=_(...t),r=t[3]??1;c.gfx.bgColor=e,c.gfx.bgAlpha=r,c.gfx.ggl.gl.clearColor(e.r/255,e.g/255,e.b/255,r)}a(Ea,"setBackground");function Ma(){var t,e;return((e=(t=c.gfx.bgColor)==null?void 0:t.clone)==null?void 0:e.call(t))??null}a(Ma,"getBackground");function ae(...t){if(t[0]===void 0)return;let e=E(...t);e.x===0&&e.y===0||c.gfx.transform.translate(e)}a(ae,"pushTranslate");function qe(){c.gfx.transformStack.push(c.gfx.transform.clone())}a(qe,"pushTransform");function Sa(t){c.gfx.transform=t.clone()}a(Sa,"pushMatrix");function dr(...t){if(t[0]===void 0)return;let e=E(...t);e.x===1&&e.y===1||c.gfx.transform.scale(e)}a(dr,"pushScale");function Ct(t){t&&c.gfx.transform.rotate(t)}a(Ct,"pushRotate");function ve(){c.gfx.transformStack.length>0&&(c.gfx.transform=c.gfx.transformStack.pop())}a(ve,"popTransform");function Ce(){c.gfx.renderer.flush()}a(Ce,"flush");function pe(){return c.gfx.width}a(pe,"width");function we(){return c.gfx.height}a(we,"height");function dn(){return(c.gfx.viewport.width+c.gfx.viewport.height)/(c.gfx.width+c.gfx.height)}a(dn,"getViewportScale");function qa(t){return new C(t.x*c.gfx.viewport.width/c.gfx.width,t.y*c.gfx.viewport.height/c.gfx.height)}a(qa,"contentToView");function Ca(t){return new C((t.x-c.gfx.viewport.x)*pe()/c.gfx.viewport.width,(t.y-c.gfx.viewport.y)*we()/c.gfx.viewport.height)}a(Ca,"windowToContent");function cn(){return Ca(c.app.mousePos())}a(cn,"mousePos");function Cr(){return E(pe()/2,we()/2)}a(Cr,"center");var er;var fu=(er=class{constructor(e,r,s,n){b(this,"lastTextureId",0);b(this,"textures",[]);b(this,"bigTextures",[]);b(this,"texturesPosition",new Map);b(this,"canvas");b(this,"c2d");b(this,"x",0);b(this,"y",0);b(this,"curHeight",0);b(this,"gfx");b(this,"padding");this.gfx=e,this.canvas=document.createElement("canvas"),this.canvas.width=r,this.canvas.height=s,this.textures=[lt.fromImage(e,this.canvas)],this.bigTextures=[],this.padding=n;let i=this.canvas.getContext("2d");if(!i)throw new Error("Failed to get 2d context");this.c2d=i}add(e){let r=e.width+this.padding*2,s=e.height+this.padding*2;if(r>this.canvas.width||s>this.canvas.height){let o=lt.fromImage(this.gfx,e);return this.bigTextures.push(o),[o,new oe(0,0,1,1),0]}this.x+r>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+s>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(lt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let n=this.textures[this.textures.length-1],i=new C(this.x+this.padding,this.y+this.padding);return this.x+=r,s>this.curHeight&&(this.curHeight=s),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),n.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new C(e.width,e.height),texture:n}),this.lastTextureId++,[n,new oe(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}},a(er,"TexPacker"),er);function Pe(t){return typeof t!="string"||aa(t)?t:c.assets.urlPrefix+t}a(Pe,"fixURL");var St;var Te=(St=class{constructor(e){b(this,"loaded",false);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new xe);b(this,"onErrorEvents",new xe);b(this,"onFinishEvents",new xe);e.then(r=>{this.loaded=true,this.data=r,this.onLoadEvents.trigger(r)}).catch(r=>{if(this.error=r,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(r);else throw r}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=true})}static loaded(e){let r=new St(Promise.resolve(e));return r.data=e,r.loaded=true,r}onLoad(e){return this.loaded&&this.data?e(this.data):this.onLoadEvents.add(e),this}onError(e){return this.loaded&&this.error?e(this.error):this.onErrorEvents.add(e),this}onFinish(e){return this.loaded?e():this.onFinishEvents.add(e),this}then(e){return this.onLoad(e)}catch(e){return this.onError(e)}finally(e){return this.onFinish(e)}},a(St,"Asset"),St);var tr;var Dt=(tr=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,r){let s=e??this.lastUID+++"",n=new Te(r);return this.assets.set(s,n),n}addLoaded(e,r){let s=e??this.lastUID+++"",n=Te.loaded(r);return this.assets.set(s,n),n}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(r=>{r.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},a(tr,"AssetBucket"),tr);function Ms(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}a(Ms,"fetchURL");function Ur(t){return Ms(t).then(e=>e.json())}a(Ur,"fetchJSON");function Ba(t){return Ms(t).then(e=>e.text())}a(Ba,"fetchText");function Ra(t){return Ms(t).then(e=>e.arrayBuffer())}a(Ra,"fetchArrayBuffer");function Pa(t){return t!==void 0&&(c.assets.urlPrefix=t),c.assets.urlPrefix}a(Pa,"loadRoot");function ka(t,e){return c.assets.custom.add(t,Ur(Pe(e)))}a(ka,"loadJSON");function Lr(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((r,s)=>{e.onload=()=>r(e),e.onerror=()=>s(new Error(`Failed to load image from "${t}"`))})}a(Lr,"loadImg");function pt(){let t=[c.assets.sprites,c.assets.sounds,c.assets.shaders,c.assets.fonts,c.assets.bitmapFonts,c.assets.custom];return t.reduce((e,r)=>e+r.progress(),0)/t.length}a(pt,"loadProgress");function fn(){return[c.assets.sprites,c.assets.sounds,c.assets.shaders,c.assets.fonts,c.assets.bitmapFonts,c.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}a(fn,"getFailedAssets");function Ia(t){return c.assets.custom.get(t)??null}a(Ia,"getAsset");function is(t){return c.assets.custom.add(null,t)}a(is,"load");var gu=a((t,e)=>({urlPrefix:"",sprites:new Dt,fonts:new Dt,bitmapFonts:new Dt,sounds:new Dt,shaders:new Dt,custom:new Dt,music:{},packer:new fu(t,2048,2048,e),loaded:false}),"initAssets");var pu="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD0AAAA1CAYAAADyMeOEAAAAAXNSR0IArs4c6QAAAoVJREFUaIHdm7txwkAQhheGAqACiCHzOKQDQrqgILpwSAeEDBnEUAF0gCMxZ7G72qce/mec2Lpf9+3unaS78wgSNZ8uX5729+d1FNWXUuGmXlBOUUEIMckEpeQJgBu6C+BSFngztBR2vd+ovY+7g+p6LbgaWgJrAeUkDYIUXgXdBBwNi6kpABJwMTQH3AZsXRR8GHTfgEth8E3gjdAUcNewpbTgY85sCMCUuOokozE0YM0YRzM9NGAAXd8+omAF5h4lnmBRvpSnZHyLoLEbaN+aKB9KWv/KWw0tAbbANnlG+UvB2dm77NxxdwgBpjrF/d7rW9cbmpvio2A5z8iAYpVU8pGZlo6/2+MSco2lHfd3rv9jAP038e1xef9o2mjvYb2OqpqKE81028/jeietlSEVO5FRWsxWsJit1G3aFpW8iWe5RwpiCZAk25QvV6nz6fIlynRGuTd5WqpJ4guAlDfVKBK87hXljflgv1ON6fV+4+5gVlA17SfeG0heKqQd4l4jI/wrmaA9N9R4ar+wpHJDZyrrfcH0nB66PqAzPi76pn+faSyJk/vzOorYhGurQrzj/P68jtBMawHaHBIR9xoD5O34dy0qQOSYHvqExq2TpT2nf76+w7y251OYF0CRaU+J920TwLUa6inx6OxE6g80lu2ux7Y2eJLF/rCXE6zEPdnenk9o+4ih9AEdnW2q81HXl5LuU6OTl2fXUhqganbXAGq3g6jJOWV/OnoesO6YqqEB/GdNsjf7uHtwj2DzmRNpp7iOZfm6D9oAxB6Yi1gC4oIYeo4MIPdopEQRB+cAko5J1tW386HpB2Kz1eop4Epdwls/kgZ1sh8gZsEjdcWkr//D8Qu3Z3l5Nl1NtAAAAABJRU5ErkJggg==";var Ye;var mt=(Ye=class{constructor(e,r,s={},n=null){b(this,"tex");b(this,"frames",[new oe(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);this.tex=e,r&&(this.frames=r),this.anims=s,this.slice9=n}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,r={}){return typeof e=="string"?Ye.fromURL(e,r):Promise.resolve(Ye.fromImage(e,r))}static fromImage(e,r={}){let[s,n]=c.assets.packer.add(e),i=r.frames?r.frames.map(o=>new oe(n.x+o.x*n.w,n.y+o.y*n.h,o.w*n.w,o.h*n.h)):pn(r.sliceX||1,r.sliceY||1,n.x,n.y,n.w,n.h);return new Ye(s,i,r.anims,r.slice9)}static fromURL(e,r={}){return Lr(e).then(s=>Ye.fromImage(s,r))}},a(Ye,"SpriteData"),Ye);function br(t){if(typeof t=="string"){let e=gn(t);if(e)return e;if(pt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof mt)return Te.loaded(t);if(t instanceof Te)return t;throw new Error(`Invalid sprite: ${t}`)}}a(br,"resolveSprite");function gn(t){return c.assets.sprites.get(t)??null}a(gn,"getSprite");function Ht(t,e,r={sliceX:1,sliceY:1,anims:{}}){return e=Pe(e),Array.isArray(e)?e.some(s=>typeof s=="string")?c.assets.sprites.add(t,Promise.all(e.map(s=>typeof s=="string"?Lr(s):Promise.resolve(s))).then(s=>Gs(s,r))):c.assets.sprites.addLoaded(t,Gs(e,r)):typeof e=="string"?c.assets.sprites.add(t,mt.from(e,r)):c.assets.sprites.addLoaded(t,mt.fromImage(e,r))}a(Ht,"loadSprite");function pn(t=1,e=1,r=0,s=0,n=1,i=1){let o=[],d=n/t,l=i/e;for(let u=0;u{d instanceof ImageData?i.putImageData(d,l*s,0):i.drawImage(d,l*s,0)});let o=i.getImageData(0,0,t.length*s,n);return mt.fromImage(o,{...e,sliceX:t.length,sliceY:1})}a(Gs,"createSpriteSheet");function Fa(t="bean"){return Ht(t,pu)}a(Fa,"loadBean");function Ta(t,e,r){e=Pe(e),r=Pe(r),typeof e=="string"&&!r&&(r=Kl(e)+".json");let s=typeof r=="string"?Ur(r):Promise.resolve(r);return c.assets.sprites.add(t,s.then(n=>{let i=n.meta.size,o=n.frames.map(l=>new oe(l.frame.x/i.w,l.frame.y/i.h,l.frame.w/i.w,l.frame.h/i.h)),d={};for(let l of n.meta.frameTags)l.from===l.to?d[l.name]=l.from:d[l.name]={from:l.from,to:l.to,speed:10,loop:true,pingpong:l.direction==="pingpong"};return mt.from(e,{frames:o,anims:d})}))}a(Ta,"loadAseprite");var rr;var _r=(rr=class{constructor(e,r={}){b(this,"fontface");b(this,"filter",Ds);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=r.filter??Ds,this.size=r.size??64,this.size>256)throw new Error(`Max font size: ${256}`);r.outline&&(this.outline={width:1,color:_(0,0,0)},typeof r.outline=="number"?this.outline.width=r.outline:typeof r.outline=="object"&&(r.outline.width&&(this.outline.width=r.outline.width),r.outline.color&&(this.outline.color=r.outline.color)))}},a(rr,"FontData"),rr);function mn(t){if(!t)return mn(c.globalOpt.font??Pl);if(typeof t=="string"){let e=yn(t),r=wn(t);if(e)return e.data??e;if(r)return r.data??r;if(document.fonts.check(`${64}px ${t}`))return t;if(pt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof Te)return t.data?t.data:t;return t}a(mn,"resolveFont");function wn(t){return c.assets.fonts.get(t)??null}a(wn,"getFont");function Da(t,e,r={}){let s=Pe(e),n=new FontFace(t,typeof e=="string"?`url(${s})`:s);return document.fonts.add(n),c.assets.fonts.add(t,n.load().catch(i=>{throw new Error(`Failed to load font from "${s}": ${i}`)}).then(i=>new _r(i,r)))}a(Da,"loadFont");function Oa(t,e,r,s){let n=t.width/e,i={},o=s.split("").entries();for(let[d,l]of o)i[l]=new oe(d%n*e,Math.floor(d/n)*r,e,r);return{tex:t,map:i,size:r}}a(Oa,"makeFont");function yn(t){return c.assets.bitmapFonts.get(t)??null}a(yn,"getBitmapFont");function Ua(t,e,r,s,n={}){let i=Pe(e);return c.assets.bitmapFonts.add(t,Lr(i).then(o=>Oa(lt.fromImage(c.gfx.ggl,o,n),r,s,n.chars??$i)))}a(Ua,"loadBitmapFont");function La(t,e){return e=Pe(e),c.assets.sprites.add(t,new Promise(async r=>{let s=typeof e=="string"?await Ur(e):e,n=await Promise.all(s.frames.map(Lr)),i=document.createElement("canvas");i.width=s.width,i.height=s.height*s.frames.length;let o=i.getContext("2d");if(!o)throw new Error("Failed to create canvas context");n.forEach((l,u)=>{o.drawImage(l,0,u*s.height)});let d=await Ht(null,i,{sliceY:s.frames.length,anims:s.anims});r(d)}))}a(La,"loadPedit");var sr;var mu=(sr=class{constructor(e,r,s,n){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,o=i.createShader(i.VERTEX_SHADER),d=i.createShader(i.FRAGMENT_SHADER);if(!o||!d)throw new Error("Failed to create shader");i.shaderSource(o,r),i.shaderSource(d,s),i.compileShader(o),i.compileShader(d);let l=i.createProgram();if(this.glProgram=l,i.attachShader(l,o),i.attachShader(l,d),n.forEach((u,f)=>i.bindAttribLocation(l,f,u)),i.linkProgram(l),!i.getProgramParameter(l,i.LINK_STATUS)){let u=i.getShaderInfoLog(o);if(u)throw new Error("VERTEX SHADER "+u);let f=i.getShaderInfoLog(d);if(f)throw new Error("FRAGMENT SHADER "+f)}i.deleteShader(o),i.deleteShader(d)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let r=this.ctx.gl;for(let s in e){let n=e[s],i=r.getUniformLocation(this.glProgram,s);if(typeof n=="number")r.uniform1f(i,n);else if(n instanceof Qe)r.uniformMatrix4fv(i,false,new Float32Array(n.m));else if(n instanceof X)r.uniform3f(i,n.r,n.g,n.b);else if(n instanceof C)r.uniform2f(i,n.x,n.y);else if(Array.isArray(n)){n[0];Vl(n)?r.uniform1fv(i,n):jl(n)?r.uniform2fv(i,n.map(o=>[o.x,o.y]).flat()):Hl(n)&&r.uniform3fv(i,n.map(o=>[o.r,o.g,o.b]).flat())}else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},a(sr,"Shader"),sr);function Ss(t,e=Os,r=Us){let s=Tl.replace("{{user}}",e??Os),n=Dl.replace("{{user}}",r??Us);try{return new mu(t,s,n,un.map(i=>i.name))}catch(i){let o=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,d=Yl(i).match(o);if(!(d==null?void 0:d.groups))throw i;let l=Number(d.groups.line)-14,u=d.groups.msg.trim(),f=d.groups.type.toLowerCase();throw new Error(`${f} shader line ${l}: ${u}`)}}a(Ss,"makeShader");function Na(t){if(!t)return c.gfx.defShader;if(typeof t=="string"){let e=An(t);if(e)return e.data??e;if(pt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof Te)return t.data?t.data:t;return t}a(Na,"resolveShader");function An(t){return c.assets.shaders.get(t)??null}a(An,"getShader");function Ga(t,e,r){return c.assets.shaders.addLoaded(t,Ss(c.gfx.ggl,e,r))}a(Ga,"loadShader");function Ha(t,e,r){e=Pe(e),r=Pe(r);let s=a(i=>i?Ba(i):Promise.resolve(null),"resolveUrl"),n=Promise.all([s(e),s(r)]).then(([i,o])=>Ss(c.gfx.ggl,i,o));return c.assets.shaders.add(t,n)}a(Ha,"loadShaderURL");var _e;var Br=(_e=class{constructor(e){b(this,"buf");this.buf=e}static fromArrayBuffer(e){return new Promise((r,s)=>c.audio.ctx.decodeAudioData(e,r,s)).then(r=>new _e(r))}static fromURL(e){return aa(e)?_e.fromArrayBuffer(na(e)):Ra(e).then(r=>_e.fromArrayBuffer(r))}},a(_e,"SoundData"),_e);function ja(t){if(typeof t=="string"){let e=xn(t);if(e)return e;if(pt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof Br)return Te.loaded(t);if(t instanceof Te)return t;throw new Error(`Invalid sound: ${t}`)}}a(ja,"resolveSound");function xn(t){return c.assets.sounds.get(t)??null}a(xn,"getSound");function Va(t,e){return e=Pe(e),c.assets.sounds.add(t,typeof e=="string"?Br.fromURL(e):Br.fromArrayBuffer(e))}a(Va,"loadSound");function Ka(t,e){let r=Pe(e),s=new Audio(r);return s.preload="auto",c.assets.music[t]=r}a(Ka,"loadMusic");function vn(t,e){return t=Pe(t),typeof e=="string"?is(new Promise((r,s)=>{Ur(e).then(n=>{vn(t,n).then(r).catch(s)})})):is(mt.from(t).then(r=>{let s={};for(let n in e){let i=e[n],o=r.frames[0],d=2048*o.w,l=2048*o.h,u=i.frames?i.frames.map(x=>new oe(o.x+(i.x+x.x)/d*o.w,o.y+(i.y+x.y)/l*o.h,x.w/d*o.w,x.h/l*o.h)):pn(i.sliceX||1,i.sliceY||1,o.x+i.x/d*o.w,o.y+i.y/l*o.h,i.width/d*o.w,i.height/l*o.h),f=new mt(r.tex,u,i.anims);c.assets.sprites.addLoaded(n,f),s[n]=f}return s}))}a(vn,"loadSpriteAtlas");function st(t,e,r=false,s,n,i={}){let o=s??c.gfx.defTex,d=n??c.gfx.defShader,l=Na(d);if(!l||l instanceof Te)return;let u=c.gfx.fixed||r?c.gfx.transform:c.game.cam.transform.mult(c.gfx.transform),f=[];for(let x of t){let h=ba(u.multVec2(x.pos));f.push(h.x,h.y,x.uv.x,x.uv.y,x.color.r/255,x.color.g/255,x.color.b/255,x.opacity)}c.gfx.renderer.push(c.gfx.ggl.gl.TRIANGLES,f,e,l,o,i)}a(st,"drawRaw");function et(t){if(!t.pts)throw new Error('drawPolygon() requires property "pts".');let e=t.pts.length;if(!(e<3)){if(qe(),ae(t.pos),dr(t.scale),Ct(t.angle),ae(t.offset),t.fill!==false){let r=t.color??X.WHITE,s=t.pts.map((i,o)=>({pos:new C(i.x,i.y),uv:t.uv?t.uv[o]:new C(0,0),color:t.colors&&t.colors[o]?t.colors[o].mult(r):r,opacity:t.opacity??1})),n;t.triangulate?n=ln(t.pts).map(i=>i.map(o=>t.pts.indexOf(o))).flat():n=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),st(s,t.indices??n,t.fixed,t.uv?t.tex:c.gfx.defTex,t.shader,t.uniform??void 0)}t.outline&&qs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),ve()}}a(et,"drawPolygon");function bn(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,r=t.end??360,s=Pt(t.anchor??"center").scale(new C(-t.radiusX,-t.radiusY)),n=Lt(s,t.radiusX,t.radiusY,e,r,t.resolution);n.unshift(s);let i=Object.assign({},t,{pts:n,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(n.length-1).fill(t.gradient[1])]}:{}});if(r-e>=360&&t.outline){t.fill!==false&&et(Object.assign({},i,{outline:null})),et(Object.assign({},i,{pts:n.slice(1),fill:false}));return}et(i)}a(bn,"drawEllipse");function kt(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&bn(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}a(kt,"drawCircle");function Nt(t){let{p1:e,p2:r}=t;if(!e||!r)throw new Error('drawLine() requires properties "p1" and "p2".');let s=t.width||1,n=r.sub(e).unit().normal().scale(s*.5),i=[e.sub(n),e.add(n),r.add(n),r.sub(n)].map(o=>({pos:new C(o.x,o.y),uv:new C(0),color:t.color??X.WHITE,opacity:t.opacity??1}));st(i,[0,1,3,1,2,3],t.fixed,c.gfx.defTex,t.shader,t.uniform??void 0)}a(Nt,"drawLine");function Ya(t){let e=t.pts,r=[],s=(t.width||1)*.5,n=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||E(0,0),o;n?o=e[0].sub(e[e.length-2]):o=e[1].sub(e[0]);let d=o.len(),l=o.normal().scale(-s/d),u,f=e[0];if(!n)switch(t.cap){case"square":{let p=o.scale(-s/d);r.push(f.add(p).add(l)),r.push(f.add(p).sub(l));break}case"round":{let p=Math.max(s,10),S=Math.PI/p,g=l.scale(-1),w=Math.cos(S),R=Math.sin(S);for(let P=0;P0?(r.push(u.add(O)),r.push(u.sub(l)),r.push(u.add(O)),r.push(u.sub(w))):(r.push(u.add(l)),r.push(u.sub(O)),r.push(u.add(w)),r.push(u.sub(O))),o=S,d=g,l=w}if(!n)switch(r.push(f.add(l)),r.push(f.sub(l)),t.cap){case"square":{let p=o.scale(s/d);r.push(f.add(p).add(l)),r.push(f.add(p).sub(l));break}case"round":{let p=Math.max(s,10),S=Math.PI/p,g=l.scale(1),w=Math.cos(S),R=Math.sin(S);for(let P=0;P({pos:i.add(p),uv:E(),color:t.color||X.WHITE,opacity:t.opacity??1})),h=[],y=0;for(let p=0;p0){let T=u.add(O),A=Math.max(s,10),v=de(l.angleBetween(w)/A),M=l,k=Math.cos(v),I=Math.sin(v);for(let D=0;D({pos:i.add(p),uv:E(),color:t.color||X.WHITE,opacity:t.opacity??1})),h=[],y=0;for(let p=0;p({pos:i.add(p),uv:E(),color:t.color||X.WHITE,opacity:t.opacity??1})),h=[],y=0;for(let p=0;p2)switch(t.join){case"bevel":return Ya(t);case"round":return Qa(t);case"miter":return Xa(t)}if(t.radius&&e.length>=3){Nt(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let s=1;sAs(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}a(za,"drawBezier");var qt;var lt=(qt=class{constructor(e,r,s,n={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,o=e.gl.createTexture();if(!o)throw new Error("Failed to create texture");this.glTex=o,e.onDestroy(()=>this.free()),this.width=r,this.height=s;let d={linear:i.LINEAR,nearest:i.NEAREST}[n.filter??e.opts.texFilter??"nearest"],l={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[n.wrap??"clampToEdge"];this.bind(),r&&s&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,r,s,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,d),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,d),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,l),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,l),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,true),this.unbind()}static fromImage(e,r,s={}){let n=new qt(e,r.width,r.height,s);return n.update(r),n.src=r,n}update(e,r=0,s=0){let n=this.ctx.gl;this.bind(),n.texSubImage2D(n.TEXTURE_2D,0,r,s,n.RGBA,n.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},a(qt,"Texture"),qt);var nr;var as=(nr=class{constructor(e,r,s,n={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new lt(e,r,s,n);let o=i.createFramebuffer(),d=i.createRenderbuffer();if(!o||!d)throw new Error("Failed to create framebuffer");this.glFramebuffer=o,this.glRenderbuffer=d,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,r,s),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,r=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,r),this.unbind();let s=this.width*4,n=new Uint8Array(s);for(let i=0;i<(this.height/2|0);i++){let o=i*s,d=(this.height-i-1)*s;n.set(r.subarray(o,o+s)),r.copyWithin(o,d,d+s),r.set(n,d)}return new ImageData(r,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),r=e.getContext("2d");if(e.width=this.width,e.height=this.height,!r)throw new Error("Failed to get 2d context");return r.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},a(nr,"FrameBuffer"),nr);var ir;var wu=(ir=class{constructor(e,r,s,n){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",{});let i=e.gl;this.vertexFormat=r,this.ctx=e,this.stride=r.reduce((d,l)=>d+l.size,0),this.maxVertices=s,this.maxIndices=n;let o=i.createBuffer();if(!o)throw new Error("Failed to create vertex buffer");this.glVBuf=o,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,n*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,r,s,n,i=null,o={}){(e!==this.curPrimitive||i!==this.curTex||n!==this.curShader||!bs(this.curUniform,o)||this.vqueue.length+r.length*this.stride>this.maxVertices||this.iqueue.length+s.length>this.maxIndices)&&this.flush();let d=this.vqueue.length/this.stride;for(let l of r)this.vqueue.push(l);for(let l of s)this.iqueue.push(l+d);this.curPrimitive=e,this.curShader=n,this.curTex=i,this.curUniform=o}flush(){var r,s;if(!this.curPrimitive||!this.curShader||this.vqueue.length===0||this.iqueue.length===0)return;let e=this.ctx.gl;this.ctx.pushArrayBuffer(this.glVBuf),e.bufferSubData(e.ARRAY_BUFFER,0,new Float32Array(this.vqueue)),this.ctx.pushElementArrayBuffer(this.glIBuf),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,new Uint16Array(this.iqueue)),this.ctx.setVertexFormat(this.vertexFormat),this.curShader.bind(),this.curShader.send(this.curUniform),(r=this.curTex)==null?void 0:r.bind(),e.drawElements(this.curPrimitive,this.iqueue.length,e.UNSIGNED_SHORT,0),(s=this.curTex)==null?void 0:s.unbind(),this.curShader.unbind(),this.ctx.popArrayBuffer(),this.ctx.popElementArrayBuffer(),this.vqueue=[],this.iqueue=[],this.numDraws++}free(){let e=this.ctx.gl;e.deleteBuffer(this.glVBuf),e.deleteBuffer(this.glIBuf)}},a(ir,"BatchRenderer"),ir);function at(t){let e=[],r=a(i=>{e.push(i),t(i)},"push"),s=a(()=>{e.pop(),t(n()??null)},"pop"),n=a(()=>e[e.length-1],"cur");return[r,s,n]}a(at,"genStack");function Wa(t,e={}){let r=[];function s(T){r.push(T)}a(s,"onDestroy");function n(){r.forEach(A=>A());let T=t.getExtension("WEBGL_lose_context");T&&T.loseContext()}a(n,"destroy");let i=null;function o(T){if(bs(T,i))return;i=T;let A=T.reduce((v,M)=>v+M.size,0);T.reduce((v,M,k)=>(t.vertexAttribPointer(k,M.size,t.FLOAT,false,A*4,v),t.enableVertexAttribArray(k),v+M.size*4),0)}a(o,"setVertexFormat");let[d,l]=at(T=>t.bindTexture(t.TEXTURE_2D,T)),[u,f]=at(T=>t.bindBuffer(t.ARRAY_BUFFER,T)),[x,h]=at(T=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,T)),[y,p]=at(T=>t.bindFramebuffer(t.FRAMEBUFFER,T)),[S,g]=at(T=>t.bindRenderbuffer(t.RENDERBUFFER,T)),[w,R]=at(T=>{if(!T)return;let{x:A,y:v,w:M,h:k}=T;t.viewport(A,v,M,k)}),[P,O]=at(T=>t.useProgram(T));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:s,destroy:n,pushTexture2D:d,popTexture2D:l,pushArrayBuffer:u,popArrayBuffer:f,pushElementArrayBuffer:x,popElementArrayBuffer:h,pushFramebuffer:y,popFramebuffer:p,pushRenderbuffer:S,popRenderbuffer:g,pushViewport:w,popViewport:R,pushProgram:P,popProgram:O,setVertexFormat:o}}a(Wa,"initGfx");var Fs={};function Hs(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(E(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}a(Hs,"applyCharTransform");function os(t){let e={},r="",s=[],n=String(t),i=a(o=>{s.length>0&&(e[r.length]=s.slice()),r+=o},"emit");for(;n!=="";){if(n[0]==="\\"){if(n.length===1)throw new Error("Styled text error: \\ at end of string");i(n[1]),n=n.slice(2);continue}if(n[0]==="["){let o=/^\[(\/)?(\w+?)\]/.exec(n);if(!o){i(n[0]),n=n.slice(1);continue}let[d,l,u]=o;if(l!==void 0){let f=s.pop();if(f!==u)throw f!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${f}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else s.push(u);n=n.slice(d.length);continue}i(n[0]),n=n.slice(1)}if(s.length>0)throw new Error(`Styled text error: unclosed tags ${s}`);return{charStyleMap:e,text:r}}a(os,"compileStyledText");function wt(t){var P,O,T;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=mn(t.font);if(!t.text||t.text===""||e instanceof Te||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:r,text:s}=os(t.text+""),n=la(s);if(e instanceof _r||typeof e=="string"){let A=e instanceof _r?e.fontface.family:e,v=e instanceof _r?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ds},M=Fs[A]??{font:{tex:new lt(c.gfx.ggl,2048,2048,{filter:v.filter}),map:{},size:64},cursor:new C(0),maxHeight:0,outline:v.outline};Fs[A]||(Fs[A]=M),e=M.font;for(let k of n)if(!M.font.map[k]){let I=c.fontCacheC2d;if(!I)throw new Error("fontCacheC2d is not defined.");if(!c.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");I.clearRect(0,0,c.fontCacheCanvas.width,c.fontCacheCanvas.height),I.font=`${e.size}px ${A}`,I.textBaseline="top",I.textAlign="left",I.fillStyle="#ffffff";let D=I.measureText(k),U=Math.ceil(D.width);if(!U)continue;let N=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(I.lineJoin="round",I.lineWidth=M.outline.width*2,I.strokeStyle=M.outline.color.toHex(),I.strokeText(k,M.outline.width,M.outline.width),U+=M.outline.width*2,N+=M.outline.width*3),I.fillText(k,((P=M.outline)==null?void 0:P.width)??0,((O=M.outline)==null?void 0:O.width)??0);let j=I.getImageData(0,0,U,N);if(M.cursor.x+U>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(j,M.cursor.x,M.cursor.y),e.map[k]=new oe(M.cursor.x,M.cursor.y,U,N),M.cursor.x+=U+1,M.maxHeight=Math.max(M.maxHeight,N)}}let i=t.size||e.size,o=E(t.scale??1).scale(i/e.size),d=t.lineSpacing??0,l=t.letterSpacing??0,u=0,f=0,x=0,h=[],y=[],p=0,S=null,g=0,w;for(;pt.width&&(x+=i+d,S!=null&&(p-=y.length-S,A=n[p],v=e.map[A],M=v.w*o.x,y=y.slice(0,S-1),u=g),S=null,g=0,h.push({width:u-l,chars:y}),u=w??0,y=[]),y.push({tex:e.tex,width:v.w,height:v.h,quad:new oe(v.x/e.tex.width,v.y/e.tex.height,v.w/e.tex.width,v.h/e.tex.height),ch:A,pos:new C(u,x),opacity:t.opacity??1,color:t.color??X.WHITE,scale:E(o),angle:0}),A===" "&&(S=y.length,g=u),t.indentAll&&w===void 0&&/\S/.test(A)&&(w=u),u+=M,f=Math.max(f,u),u+=l}}p++}h.push({width:u-l,chars:y}),x+=i,t.width&&(f=t.width);let R=[];for(let A=0;A{cr({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),ve()}a(yt,"drawFormattedText");function Be(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,r=t.height,s=Pt(t.anchor||xs).add(1,1).scale(new C(e,r).scale(-.5)),n=[new C(0,0),new C(e,0),new C(e,r),new C(0,r)];if(t.radius){let i=Math.min(e,r)/2,o=Array.isArray(t.radius)?t.radius.map(d=>Math.min(i,d)):new Array(4).fill(Math.min(i,t.radius));n=[new C(o[0],0),...o[1]?Lt(new C(e-o[1],o[1]),o[1],o[1],270,360):[E(e,0)],...o[2]?Lt(new C(e-o[2],r-o[2]),o[2],o[2],0,90):[E(e,r)],...o[3]?Lt(new C(o[3],r-o[3]),o[3],o[3],90,180):[E(0,r)],...o[0]?Lt(new C(o[0],o[0]),o[0],o[0],180,270):[]]}et(Object.assign({},t,{offset:s,pts:n,...t.gradient?{colors:t.horizontal?[t.gradient[0],t.gradient[1],t.gradient[1],t.gradient[0]]:[t.gradient[0],t.gradient[0],t.gradient[1],t.gradient[1]]}:{}}))}a(Be,"drawRect");function $e(t){Ce();let e=c.gfx.width,r=c.gfx.height;c.gfx.width=c.gfx.viewport.width,c.gfx.height=c.gfx.viewport.height,t(),Ce(),c.gfx.width=e,c.gfx.height=r}a($e,"drawUnscaled");function js(t,e){$e(()=>{let r=E(8);qe(),ae(t);let s=wt({text:e,font:ts,size:16,pos:r,color:_(255,255,255),fixed:true}),n=s.width+r.x*2,i=s.height+r.x*2;t.x+n>=pe()&&ae(E(-n,0)),t.y+i>=we()&&ae(E(0,-i)),Be({width:n,height:i,color:_(0,0,0),radius:4,opacity:.8,fixed:true}),yt(s),ve()})}a(js,"drawInspectText");function Mn(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return et(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}a(Mn,"drawTriangle");function Za(){if(c.debug.inspect){let t=null;for(let e of c.game.root.get("*",{recursive:true}))if(e.c("area")&&e.isHovering()){t=e;break}if(c.game.root.drawInspect(),t){let e=[],r=t.inspect();for(let s in r)r[s]?e.push(`${r[s]}`):e.push(`${s}`);js(qa(cn()),e.join(` +`))}js(E(8),`FPS: ${c.debug.fps()}`)}c.debug.paused&&$e(()=>{qe(),ae(pe(),0),ae(-8,8);let t=32;Be({width:t,height:t,anchor:"topright",color:_(0,0,0),opacity:.8,radius:4,fixed:true});for(let e=1;e<=2;e++)Be({width:4,height:t*.6,anchor:"center",pos:E(-t/3*e,t*.5),color:_(255,255,255),radius:2,fixed:true});ve()}),c.debug.timeScale!==1&&$e(()=>{qe(),ae(pe(),we()),ae(-8,-8);let t=8,e=wt({text:c.debug.timeScale.toFixed(1),font:ts,size:16,color:_(255,255,255),pos:E(-t),anchor:"botright",fixed:true});Be({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:_(0,0,0),opacity:.8,radius:4,fixed:true});for(let r=0;r<2;r++){let s=c.debug.timeScale<1;Mn({p1:E(-e.width-t*(s?2:3.5),-t),p2:E(-e.width-t*(s?2:3.5),-t-e.height),p3:E(-e.width-t*(s?3.5:2),-t-e.height/2),pos:E(-r*t*1+(s?-t*.5:0),0),color:_(255,255,255),fixed:true})}yt(e),ve()}),c.debug.curRecording&&$e(()=>{qe(),ae(0,we()),ae(24,-24),kt({radius:12,color:_(255,0,0),opacity:Xs(0,1,c.app.time()*4),fixed:true}),ve()}),c.debug.showLog&&c.game.logs.length>0&&$e(()=>{qe(),ae(0,we()),ae(8,-8);let t=8,e=[];for(let s of c.game.logs){let n="",i=s.msg instanceof Error?"error":"info";n+=`[time]${s.time.toFixed(2)}[/time]`,n+=" ",n+=`[${i}]${ls(s.msg)}[/${i}]`,e.push(n)}c.game.logs=c.game.logs.filter(s=>c.app.time()-s.time<(c.globalOpt.logTime||4));let r=wt({text:e.join(` +`),font:ts,pos:E(t,-t),anchor:"botleft",size:16,width:pe()*.6,lineSpacing:t/2,fixed:true,styles:{time:{color:_(127,127,127)},info:{color:_(255,255,255)},error:{color:_(255,0,127)}}});Be({width:r.width+t*2,height:r.height+t*2,anchor:"botleft",color:_(0,0,0),radius:4,opacity:.8,fixed:true}),yt(r),ve()})}a(Za,"drawDebug");function ls(t,e=false,r=new Set){if(r.has(t))return"";var s="",n;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(s=["[",t.map(i=>ls(i,true,r.union(new Set([t])))).join(", "),"]"].join(""),t=s),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(s+=t.constructor.name+" "),s+=["{",(n=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${ls(t[i],true,r.union(new Set([t])))}`).join(", "))?` ${n} `:"","}"].join(""),t=s),String(t).replaceAll(new RegExp("(?0?c.game.events.trigger("loading",t):$e(()=>{let e=pe()/2,r=24,s=E(pe()/2,we()/2).sub(E(e/2,r/2));Be({pos:E(0),width:pe(),height:we(),color:_(0,0,0)}),Be({pos:s,width:e,height:r,fill:false,outline:{width:4}}),Be({pos:s,width:e*t,height:r})})}a($a,"drawLoadScreen");function Sn(t,e,r){let s=c.gfx.ggl.gl;Ce(),s.clear(s.STENCIL_BUFFER_BIT),s.enable(s.STENCIL_TEST),s.stencilFunc(s.NEVER,1,255),s.stencilOp(s.REPLACE,s.REPLACE,s.REPLACE),e(),Ce(),s.stencilFunc(r,1,255),s.stencilOp(s.KEEP,s.KEEP,s.KEEP),t(),Ce(),s.disable(s.STENCIL_TEST)}a(Sn,"drawStenciled");function _a(t,e){let r=c.gfx.ggl.gl;Sn(t,e,r.EQUAL)}a(_a,"drawMasked");function Rr(t){var i,o;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new oe(0,0,1,1),r=t.tex.width*e.w,s=t.tex.height*e.h,n=new C(1);if(t.tiled){let d=Pt(t.anchor||xs);(((i=t.pos)==null?void 0:i.x)||0)-(d.x+1)*.5*(t.width||r);(((o=t.pos)==null?void 0:o.y)||0)-(d.y+1)*.5*(t.height||s);let l=(t.width||r)/r,u=(t.height||s)/s,f=Math.floor(l),x=Math.floor(u),h=l-f,y=u-x,p=(f+h?1:0)*(x+y?1:0),S=new Array(p*6),g=new Array(p*4),w=0,R=a((P,O,T,A,v)=>{S[w*6+0]=w*4+0,S[w*6+1]=w*4+1,S[w*6+2]=w*4+3,S[w*6+3]=w*4+1,S[w*6+4]=w*4+2,S[w*6+5]=w*4+3,g[w*4+0]={pos:new C(P-d.x,O-d.y),uv:new C(v.x,v.y),color:t.color||X.WHITE,opacity:t.opacity||1},g[w*4+1]={pos:new C(P+T-d.x,O-d.y),uv:new C(v.x+v.w,v.y),color:t.color||X.WHITE,opacity:t.opacity||1},g[w*4+2]={pos:new C(P+T-d.x,O+A-d.y),uv:new C(v.x+v.w,v.y+v.h),color:t.color||X.WHITE,opacity:t.opacity||1},g[w*4+3]={pos:new C(P-d.x,O+A-d.y),uv:new C(v.x,v.y+v.h),color:t.color||X.WHITE,opacity:t.opacity||1},w++},"addQuad");for(let P=0;P{let r=Ss(e,Os,Us),s=t.pixelDensity??1,n=t.scale??1,{gl:i}=e,o=lt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),d=t.width&&t.height?new as(e,t.width*s*n,t.height*s*n):new as(e,i.drawingBufferWidth,i.drawingBufferHeight),l=null,u=1;t.background&&(typeof t.background=="string"?l=_(t.background):(l=_(...t.background),u=t.background[3]??1),i.clearColor(l.r/255,l.g/255,l.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let f=new wu(e,un,Il,Fl),x=lt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"});return{lastDrawCalls:0,ggl:e,defShader:r,defTex:o,frameBuffer:d,postShader:null,postShaderUniform:null,renderer:f,transform:new Qe,transformStack:[],bgTex:x,bgColor:l,bgAlpha:u,width:t.width??i.drawingBufferWidth/s/n,height:t.height??i.drawingBufferHeight/s/n,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:false}},"initAppGfx");function qn(){let t=c.pixelDensity,e=c.gfx.ggl.gl.drawingBufferWidth/t,r=c.gfx.ggl.gl.drawingBufferHeight/t;if(c.globalOpt.letterbox){if(!c.globalOpt.width||!c.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let s=e/r,n=c.globalOpt.width/c.globalOpt.height;if(s>n){let i=r*n,o=(e-i)/2;c.gfx.viewport={x:o,y:0,width:i,height:r}}else{let i=e/n,o=(r-i)/2;c.gfx.viewport={x:0,y:o,width:e,height:i}}return}if(c.globalOpt.stretch&&(!c.globalOpt.width||!c.globalOpt.height))throw new Error("Stretching requires width and height defined.");c.gfx.viewport={x:0,y:0,width:e,height:r}}a(qn,"updateViewport");function ut(t){return t.fixed?true:t.parent?ut(t.parent):false}a(ut,"isFixed");function At(t){return{color:t.color,opacity:t.opacity,anchor:t.anchor,outline:t.outline,shader:t.shader,uniform:t.uniform}}a(At,"getRenderProps");function ro(t,e={}){return{id:"circle",radius:t,draw(){kt(Object.assign(At(this),{radius:this.radius,fill:e.fill}))},renderArea(){return new ie(new C(this.anchor?0:-this.radius),this.radius*2,this.radius*2)},inspect(){return`radius: ${Math.ceil(this.radius)}`}}}a(ro,"circle");function Cn(...t){return{id:"color",color:_(...t),inspect(){return`color: ${this.color.toString()}`}}}a(Cn,"color");function so(t){return{add(){this.canvas=t}}}a(so,"drawon");function no(t=1){let e,r=0,s=false;return{require:["opacity"],add(){e=this.opacity,this.opacity=0},update(){s||(r+=ge(),this.opacity=Le(r,0,t,0,e),r>=t&&(this.opacity=e,s=true))}}}a(no,"fadeIn");function io(t="intersect"){return{id:"mask",mask:t}}a(io,"mask");function Bn(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,r=c.k.easings.linear){return c.game.root.tween(0,this.opacity,e,s=>this.opacity=s,r)},fadeOut(e=1,r=c.k.easings.linear){return c.game.root.tween(this.opacity,0,e,s=>this.opacity=s,r)},inspect(){return`opacity: ${rs(this.opacity,1)}`}}}a(Bn,"opacity");function ao(t=1,e=_(0,0,0),r=1,s="miter",n=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:r,join:s,miterLimit:n,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}a(ao,"outline");var ar;var Au=(ar=class{constructor(){b(this,"pos",E(0));b(this,"vel",E(0));b(this,"acc",E(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t");b(this,"lt",null);b(this,"gc");this.t=0,this.gc=true}get progress(){return this.lt?this.t/this.lt:this.t}},a(ar,"Particle"),ar);function oo(t,e){let r=e.lifetime,s=[],n=t.colors||[X.WHITE],i=t.opacities||[1],o=t.quads||[new oe(0,0,1,1)],d=t.scales||[1],l=t.lifeTime,u=e.direction,f=e.spread,x=t.speed||[0,0],h=t.angle||[0,0],y=t.angularVelocity||[0,0],p=t.acceleration||[E(0),E(0)],S=t.damping||[0,0],g=[],w=new Array(t.max),R=0,P=0;for(let A=0;A=v.lt){v.gc=true,R--;continue}v.vel=v.vel.add(v.acc.scale(A)).scale(1-v.damping*A),v.pos=v.pos.add(v.vel.scale(A)),v.angle+=v.angularVelocity*A}for(r!==void 0&&(r-=A,r<=0&&O.trigger()),P+=A;Re.rate;)this.emit(1),R++,P-=e.rate},draw(){if(!(r!==void 0&&r<=0)){for(let A=0;A`[${r.x},${r.y}]`).join(",")}`}}}a(lo,"polygon");function Rn(t,e,r){let s;return c.game.root.get("area").forEach(n=>{if(r&&r.some(o=>n.is(o)))return;let i=n.worldArea().raycast(t,e);i&&(s?i.fractionA.x+A.y*n,"tile2Hash"),f=a(A=>E(Math.floor(A%n),Math.floor(A/n)),"hash2Tile"),x=a(()=>{i=[];for(let A of r.children)h(A)},"createSpatialMap"),h=a(A=>{let v=u(A.tilePos);i[v]?i[v].push(A):i[v]=[A]},"insertIntoSpatialMap"),y=a(A=>{let v=u(A.tilePos);if(i[v]){let M=i[v].indexOf(A);M>=0&&i[v].splice(M,1)}},"removeFromSpatialMap"),p=a(()=>{let A=false;for(let v of r.children){let M=r.pos2Tile(v.pos);(v.tilePos.x!=M.x||v.tilePos.y!=M.y)&&(A=true,y(v),v.tilePos.x=M.x,v.tilePos.y=M.y,h(v))}A&&r.trigger("spatialMapChanged")},"updateSpatialMap"),S=a(()=>{let A=r.getSpatialMap(),v=r.numRows()*r.numColumns();o?o.length=v:o=new Array(v),o.fill(1,0,v);for(let M=0;M{let A=r.getSpatialMap(),v=r.numRows()*r.numColumns();d?d.length=v:d=new Array(v),d.fill(15,0,v);for(let M=0;M{let A=r.numRows()*r.numColumns(),v=a((k,I)=>{let D=[];for(D.push(k);D.length>0;){let U=D.pop();O(U).forEach(N=>{l[N]<0&&(l[N]=I,D.push(N))})}},"traverse");l?l.length=A:l=new Array(A),l.fill(-1,0,A);let M=0;for(let k=0;k=0){M++;continue}v(k,M),M++}},"createConnectivityMap"),R=a((A,v)=>o[v],"getCost"),P=a((A,v)=>{let M=f(A),k=f(v);return M.dist(k)},"getHeuristic"),O=a((A,v)=>{let M=[],k=Math.floor(A%n),I=k>0&&d[A]&1&&o[A-1]!==1/0,D=A>=n&&d[A]&2&&o[A-n]!==1/0,U=k{if(typeof A=="string"){if(e.tiles[A]){if(typeof e.tiles[A]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[A](M)}else if(e.wildcardTile)return e.wildcardTile(A,M)}else{if(Array.isArray(A))return A;throw new Error("Expected a symbol or a component list")}})();if(!k)return null;let I=false,D=false;for(let N of k)N.id==="tile"&&(D=true),N.id==="pos"&&(I=true);I||k.push(Pr(this.tile2Pos(M))),D||k.push(Yn());let U=r.add(k);return I&&(U.tilePosOffset=U.pos.clone()),U.tilePos=M,U.transform=Gt(U),i&&(h(U),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),U},numColumns(){return n},numRows(){return s},levelWidth(){return n*this.tileWidth()},levelHeight(){return s*this.tileHeight()},tile2Pos(...A){return E(...A).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...A){let v=E(...A);return E(Math.floor(v.x/this.tileWidth()),Math.floor(v.y/this.tileHeight()))},getSpatialMap(){return i||x(),i},removeFromSpatialMap:y,insertIntoSpatialMap:h,onSpatialMapChanged(A){return this.on("spatialMapChanged",A)},onNavigationMapInvalid(A){return this.on("navigationMapInvalid",A)},getAt(A){i||x();let v=u(A);return i[v]||[]},raycast(A,v){let M=this.toWorld(A),k=this.toWorld(A.add(v)).sub(M),I=1/this.tileWidth(),D=A.scale(I),U=Bi(D,v,N=>{let j=this.getAt(N);if(j.some(V=>V.isObstacle))return true;let z=null;for(let V of j)if(V.has("area")){let Y=V.worldArea().raycast(M,k);Y&&(z?Y.fraction=n||A.y<0||A.y>=s||v.x<0||v.x>=n||v.y<0||v.y>=s)return null;let k=u(A),I=u(v);if(o[I]===1/0)return null;if(k===I)return[];if(l[k]!=-1&&l[k]!==l[I])return null;let D=new ra((ee,J)=>ee.costU.scale(k,I).add(k/2,I/2)),v]:null}};return r.use(T),r.onNavigationMapInvalid(()=>{r.invalidateNavigationMap(),r.trigger("navigationMapChanged")}),t.forEach((A,v)=>{let M=A.split("");n=Math.max(M.length,n),M.forEach((k,I)=>{r.spawn(k,E(I,v))})}),r}a(ho,"addLevel");function Me(t,e,r){return c.game.objEvents.registers[t]||(c.game.objEvents.registers[t]=new ta),c.game.objEvents.on(t,(s,...n)=>{s.is(e)&&r(s,...n)})}a(Me,"on");var xu=a((t,e,...r)=>{for(let s of c.game.root.children)s.is(e)&&s.trigger(t)},"trigger");var vu=ne(t=>{let e=c.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:a(()=>e.destroy(),"cancel")}},(t,e)=>Me("fixedUpdate",t,e));var bu=ne(t=>{let e=c.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(r){e.paused=r},cancel:a(()=>e.destroy(),"cancel")}},(t,e)=>Me("update",t,e));var Eu=ne(t=>{let e=c.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(r){e.hidden=r},cancel:a(()=>e.destroy(),"cancel")}},(t,e)=>Me("draw",t,e));var co=ne(t=>c.game.events.on("add",t),(t,e)=>Me("add",t,e));var Mu=ne(t=>c.game.events.on("destroy",t),(t,e)=>Me("destroy",t,e));var Su=ne(t=>c.game.events.on("use",t),(t,e)=>Me("use",t,e));var qu=ne(t=>c.game.events.on("unuse",t),(t,e)=>Me("unuse",t,e));var fo=ne(t=>c.game.events.on("tag",t),(t,e)=>Me("tag",t,e));var Cu=ne(t=>c.game.events.on("untag",t),(t,e)=>Me("untag",t,e));function po(t,e,r){return Me("collide",t,(s,n,i)=>n.is(e)&&r(s,n,i))}a(po,"onCollide");function mo(t,e,r){return Me("collideUpdate",t,(s,n,i)=>n.is(e)&&r(s,n,i))}a(mo,"onCollideUpdate");function wo(t,e,r){return Me("collideEnd",t,(s,n,i)=>n.is(e)&&r(s,n,i))}a(wo,"onCollideEnd");function Nr(t,e){c.game.root.get(t,{recursive:true}).forEach(e),co(t,e),fo((r,s)=>{s===t&&e(r)})}a(Nr,"forAllCurrentAndFuture");var Bu=ne(t=>c.app.onMousePress(t),(t,e)=>{let r=[];return Nr(t,s=>{if(!s.area)throw new Error("onClick() requires the object to have area() component");r.push(s.onClick(()=>e(s)))}),Bt.join(r)});function yo(t,e){let r=[];return Nr(t,s=>{if(!s.area)throw new Error("onHover() requires the object to have area() component");r.push(s.onHover(()=>e(s)))}),Bt.join(r)}a(yo,"onHover");function Ao(t,e){let r=[];return Nr(t,s=>{if(!s.area)throw new Error("onHoverUpdate() requires the object to have area() component");r.push(s.onHoverUpdate(()=>e(s)))}),Bt.join(r)}a(Ao,"onHoverUpdate");function xo(t,e){let r=[];return Nr(t,s=>{if(!s.area)throw new Error("onHoverEnd() requires the object to have area() component");r.push(s.onHoverEnd(()=>e(s)))}),Bt.join(r)}a(xo,"onHoverEnd");function vo(t){c.game.events.on("loading",t)}a(vo,"onLoading");function bo(t){c.app.onResize(t)}a(bo,"onResize");function Eo(t){c.game.events.on("error",t)}a(Eo,"onError");function Cs(t){c.assets.loaded?t():c.game.events.on("load",t)}a(Cs,"onLoad");function Mo(t){if(c.assets.loaded)fn().forEach(e=>t(...e));else return c.game.events.on("loadError",t)}a(Mo,"onLoadError");function kn(...t){c.game.cam.pos=E(...t)}a(kn,"setCamPos");function In(){return c.game.cam.pos?c.game.cam.pos.clone():Cr()}a(In,"getCamPos");function Fn(...t){c.game.cam.scale=E(...t)}a(Fn,"setCamScale");function Tn(){return c.game.cam.scale.clone()}a(Tn,"getCamScale");function Dn(t){c.game.cam.angle=t}a(Dn,"setCamRot");function On(){return c.game.cam.angle}a(On,"getCamRot");function So(){return c.game.cam.transform.clone()}a(So,"getCamTransform");function Un(t=_(255,255,255),e=1){let r=c.game.root.add([Pn(pe(),we()),Cn(t),Bn(1),Wn()]),s=r.fadeOut(e);return s.onEnd(()=>Kn(r)),s}a(Un,"flash");function qo(){return c.game.cam.transform.clone()}a(qo,"camTransform");function Co(t=12){c.game.cam.shake+=t}a(Co,"shake");function us(t){return c.game.cam.transform.multVec2(t)}a(us,"toScreen");function Ln(t){return c.game.cam.transform.invert().multVec2(t)}a(Ln,"toWorld");function Bo(...t){return Rt("camPos","setCamPos / getCamPos"),t.length>0&&kn(...t),In()}a(Bo,"camPos");function Ro(...t){return Rt("camScale","setCamScale / getCamScale"),t.length>0&&Fn(...t),Tn()}a(Ro,"camScale");function Po(t){return Rt("camRot","setCamRot / getCamRot"),t!==void 0&&Dn(t),On()}a(Po,"camRot");function ko(t=_(255,255,255),e=1){return Rt("camFlash","flash"),Un(t,e)}a(ko,"camFlash");function Bs(t=[]){let e=new Map,r=[],s={},n=new Sr,i=[],o=new Set("*"),d=c.globalOpt.tagsAsComponents,l=null,u=false,f={id:Xl(),hidden:false,transform:new Qe,children:[],parent:null,set paused(h){if(h!==u){u=h;for(let y of i)y.paused=h}},get paused(){return u},get tags(){return Array.from(o)},add(h){let y=Array.isArray(h)?Bs(h):h;if(y.parent)throw new Error("Cannot add a game obj that already has a parent.");return y.parent=this,y.transform=Gt(y),this.children.push(y),y.trigger("add",y),c.game.events.trigger("add",y),y},readd(h){let y=this.children.indexOf(h);return y!==-1&&(this.children.splice(y,1),this.children.push(h)),h},remove(h){let y=this.children.indexOf(h);if(y!==-1){h.parent=null,this.children.splice(y,1);let p=a(S=>{S.trigger("destroy"),c.game.events.trigger("destroy",S),S.children.forEach(g=>p(g))},"trigger");p(h)}},removeAll(h){if(h)this.get(h).forEach(y=>this.remove(y));else for(let y of[...this.children])this.remove(y)},fixedUpdate(){this.paused||(this.children.forEach(h=>h.fixedUpdate()),this.trigger("fixedUpdate"))},update(){this.paused||(this.children.forEach(h=>h.update()),this.trigger("update"))},draw(){if(this.hidden)return;this.canvas&&(Ce(),this.canvas.bind());let h=c.gfx.fixed;this.fixed&&(c.gfx.fixed=true),qe(),ae(this.pos),dr(this.scale),Ct(this.angle);let y=this.children.sort((p,S)=>{let g=p.layerIndex??c.game.defaultLayerIndex,w=S.layerIndex??c.game.defaultLayerIndex;return g-w||(p.z??0)-(S.z??0)});if(this.mask){let p={intersect:c.k.drawMasked,subtract:c.k.drawSubtracted}[this.mask];if(!p)throw new Error(`Invalid mask func: "${this.mask}"`);p(()=>{y.forEach(S=>S.draw())},()=>{this.trigger("draw")})}else this.trigger("draw"),y.forEach(p=>p.draw());ve(),c.gfx.fixed=h,this.canvas&&(Ce(),this.canvas.unbind())},drawInspect(){this.hidden||(qe(),ae(this.pos),dr(this.scale),Ct(this.angle),this.children.forEach(h=>h.drawInspect()),this.trigger("drawInspect"),ve())},use(h){var S;if(typeof h=="string")return o.add(h);if(!h||typeof h!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof h}"`);let y=[];h.id?(this.unuse(h.id),s[h.id]=[],y=s[h.id],e.set(h.id,h),d&&o.add(h.id)):r.push(h);for(let g in h){if(Ol.has(g))continue;let w=Object.getOwnPropertyDescriptor(h,g);if(w)if(typeof w.value=="function"&&(h[g]=h[g].bind(this)),w.set&&Object.defineProperty(h,g,{set:w.set.bind(this)}),w.get&&Object.defineProperty(h,g,{get:w.get.bind(this)}),Ul.has(g)){let R=g==="add"?()=>{var P;l=a(O=>y.push(O),"onCurCompCleanup"),(P=h[g])==null?void 0:P.call(h),l=null}:h[g];y.push(this.on(g,R).cancel)}else if(this[g]===void 0)Object.defineProperty(this,g,{get:a(()=>h[g],"get"),set:a(R=>h[g]=R,"set"),configurable:true,enumerable:true}),y.push(()=>delete this[g]);else{let R=(S=e.values().find(P=>P[g]!==void 0))==null?void 0:S.id;throw new Error(`Duplicate component property: "${g}" while adding component "${h.id}"`+(R?` (originally added by "${R}")`:""))}}let p=a(()=>{if(h.require){for(let g of h.require)if(!this.c(g))throw new Error(`Component "${h.id}" requires component "${g}"`)}},"checkDeps");h.destroy&&y.push(h.destroy.bind(this)),this.exists()?(p(),h.add&&(l=a(g=>y.push(g),"onCurCompCleanup"),h.add.call(this),l=null),h.id&&(this.trigger("use",h.id),c.game.events.trigger("use",this,h.id))):h.require&&y.push(this.on("add",p).cancel)},unuse(h){if(e.has(h)){for(let y of e.values())if(y.require&&y.require.includes(h))throw new Error(`Can't unuse. Component "${y.id}" requires component "${h}"`);e.delete(h),this.trigger("unuse",h),c.game.events.trigger("unuse",this,h)}else d&&o.has(h)&&o.delete(h);s[h]&&(s[h].forEach(y=>y()),delete s[h])},c(h){return e.get(h)??null},get(h,y={}){let p=a((g,w)=>y.only==="comps"?g.has(w):y.only==="tags"?g.is(w):g.is(w)||g.has(w),"checkTagsOrComps"),S=y.recursive?this.children.flatMap(a(function g(w){return[w,...w.children.flatMap(g)]},"recurse")):this.children;if(S=S.filter(g=>h?p(g,h):true),y.liveUpdate){let g=a(R=>y.recursive?this.isAncestorOf(R):R.parent===this,"isChild"),w=[];w.push(c.k.onAdd(R=>{g(R)&&p(R,h)&&S.push(R)})),w.push(c.k.onDestroy(R=>{if(g(R)&&p(R,h)){let P=S.findIndex(O=>O.id===R.id);P!==-1&&S.splice(P,1)}})),this.onDestroy(()=>{for(let R of w)R.cancel()})}return S},query(h){let y=h.hierarchy||"children",p=h.include,S=h.exclude,g=[];switch(y){case"children":g=this.children;break;case"siblings":g=this.parent?this.parent.children.filter(R=>R!==this):[];break;case"ancestors":let w=this.parent;for(;w;)g.push(w),w=w.parent;break;case"descendants":g=this.children.flatMap(a(function R(P){return[P,...P.children.flatMap(R)]},"recurse"));break}if(p&&((h.includeOp||"and")==="and"||!Array.isArray(h.include)?g=g.filter(w=>w.is(p)):g=g.filter(w=>h.include.some(R=>w.is(R)))),S&&((h.includeOp||"and")==="and"||!Array.isArray(h.include)?g=g.filter(w=>!w.is(S)):g=g.filter(w=>!h.exclude.some(R=>w.is(R)))),h.visible===true&&(g=g.filter(w=>w.visible)),h.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let w=h.distanceOp||"near",R=h.distance*h.distance;w==="near"?g=g.filter(P=>P.pos&&this.pos.sdist(P.pos)<=R):g=g.filter(P=>P.pos&&this.pos.sdist(P.pos)>R)}return h.name&&(g=g.filter(w=>w.name===h.name)),g},isAncestorOf(h){return h.parent?h.parent===this||this.isAncestorOf(h.parent):false},exists(){return c.game.root.isAncestorOf(this)},is(h,y="and"){return Array.isArray(h)?y==="and"?h.every(p=>o.has(p)):h.some(p=>o.has(p)):o.has(h)},tag(h){if(Array.isArray(h))for(let y of h)o.add(y),this.trigger("tag",y),c.game.events.trigger("tag",this,y);else o.add(h),this.trigger("tag",h),c.game.events.trigger("tag",this,h)},untag(h){if(Array.isArray(h))for(let y of h)o.delete(y),this.trigger("untag",y),c.game.events.trigger("untag",this,y);else o.delete(h),this.trigger("untag",h),c.game.events.trigger("untag",this,h)},has(h,y="and"){return Array.isArray(h)?y==="and"?h.every(p=>e.has(p)):h.some(p=>e.has(p)):e.has(h)},on(h,y){let p=n.on(h,y.bind(this));return l&&l(()=>p.cancel()),p},trigger(h,...y){n.trigger(h,...y),c.game.objEvents.trigger(h,this,...y)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var y;let h={};for(let[p,S]of e)h[p]=((y=S.inspect)==null?void 0:y.call(S))??null;for(let[p,S]of r.entries()){if(S.inspect){h[p]=S.inspect();continue}for(let[g,w]of Object.entries(S))typeof w!="function"&&(h[g]=`${g}: ${w}`)}return h},onAdd(h){return this.on("add",h)},onFixedUpdate(h){return this.on("fixedUpdate",h)},onUpdate(h){return this.on("update",h)},onDraw(h){return this.on("draw",h)},onDestroy(h){return this.on("destroy",h)},onUse(h){return this.on("use",h)},onUnuse(h){return this.on("unuse",h)},clearEvents(){n.clear()}},x=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let h of x)f[h]=(...y)=>{var S,g;let p=(g=(S=c.app)[h])==null?void 0:g.call(S,...y);return i.push(p),f.onDestroy(()=>p.cancel()),f.on("sceneEnter",()=>{var R,P;i.splice(i.indexOf(p),1);let w=(P=(R=c.app)[h])==null?void 0:P.call(R,...y);Bt.replace(p,w),i.push(p)}),p};for(let h of t)f.use(h);return f}a(Bs,"make");var Ru=a(()=>({events:new Sr,objEvents:new Sr,root:Bs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new C(1),angle:0,shake:0,transform:new Qe}}),"initGame");function Io(t){c.game.gravity=t?(c.game.gravity||E(0,1)).unit().scale(t):null}a(Io,"setGravity");function Fo(){return c.game.gravity?c.game.gravity.len():0}a(Fo,"getGravity");function To(t){c.game.gravity=t.unit().scale(c.game.gravity?c.game.gravity.len():1)}a(To,"setGravityDirection");function jt(){return c.game.gravity?c.game.gravity.unit():E(0,1)}a(jt,"getGravityDirection");var Pu=Sl("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");var ku=a(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let r=new Br(Aa(t));return t.decodeAudioData(Pu.buffer.slice(0)).then(s=>{r.buf=s}).catch(s=>{console.error("Failed to load burp: ",s)}),{ctx:t,masterNode:e,burpSnd:r}})(),"initAudio");function Do(t,e={}){let r=new xe,s=new Audio(t);s.crossOrigin="anonymous",s.loop=!!e.loop,c.audio.ctx.createMediaElementSource(s).connect(c.audio.masterNode);function n(){c.debug.paused||c.app.isHidden()&&!c.globalOpt.backgroundAudio||c.audio.ctx.resume()}a(n,"resumeAudioCtx");function i(){n(),s.play()}return a(i,"play"),e.paused||i(),s.onended=()=>r.trigger(),{play(){i()},seek(o){s.currentTime=o},stop(){s.pause(),this.seek(0)},set loop(o){s.loop=o},get loop(){return s.loop},set paused(o){o?s.pause():i()},get paused(){return s.paused},time(){return s.currentTime},duration(){return s.duration},set volume(o){s.volume=Ne(o,0,1)},get volume(){return s.volume},set speed(o){s.playbackRate=Math.max(o,0)},get speed(){return s.playbackRate},set detune(o){},get detune(){return 0},onEnd(o){return r.add(o)},then(o){return this.onEnd(o)}}}a(Do,"playMusic");function Oo(t,e={}){if(typeof t=="string"&&c.assets.music[t])return Do(c.assets.music[t],e);let r=c.audio.ctx,s=e.paused??false,n=r.createBufferSource(),i=new xe,o=r.createGain(),d=r.createStereoPanner(),l=e.seek??0,u=0,f=0,x=false;n.loop=!!e.loop,n.detune.value=e.detune??0,n.playbackRate.value=e.speed??1,n.connect(d),n.onended=()=>{var g;p()>=(((g=n.buffer)==null?void 0:g.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},d.pan.value=e.pan??0,d.connect(o),o.connect(c.audio.masterNode),o.gain.value=e.volume??1;let h=a(g=>{n.buffer=g.buf,s||(u=r.currentTime,n.start(0,l),x=true)},"start"),y=ja(t);y instanceof Te&&y.onLoad(h);let p=a(()=>{if(!n.buffer)return 0;let g=s?f-u:r.currentTime-u,w=n.buffer.duration;return n.loop?g%w:Math.min(g,w)},"getTime"),S=a(g=>{let w=r.createBufferSource();return w.buffer=g.buffer,w.loop=g.loop,w.playbackRate.value=g.playbackRate.value,w.detune.value=g.detune.value,w.onended=g.onended,w.connect(d),w},"cloneNode");return{stop(){this.paused=true,this.seek(0)},set paused(g){if(s!==g)if(s=g,g)x&&(n.stop(),x=false),f=r.currentTime;else{n=S(n);let w=f-u;n.start(0,w),x=true,u=r.currentTime-w,f=0}},get paused(){return s},play(g=0){this.seek(g),this.paused=false},seek(g){var w;((w=n.buffer)==null?void 0:w.duration)&&(g>n.buffer.duration||(s?(n=S(n),u=f-g):(n.stop(),n=S(n),u=r.currentTime-g,n.start(0,g),x=true,f=0)))},set speed(g){n.playbackRate.value=g},get speed(){return n.playbackRate.value},set detune(g){n.detune.value=g},get detune(){return n.detune.value},set volume(g){o.gain.value=Math.max(g,0)},get volume(){return o.gain.value},set pan(g){d.pan.value=g},get pan(){return d.pan.value},set loop(g){n.loop=g},get loop(){return n.loop},duration(){var g;return((g=n.buffer)==null?void 0:g.duration)??0},time(){return p()%this.duration()},onEnd(g){return i.add(g)},then(g){return this.onEnd(g)}}}a(Oo,"play");function Nn(t){return c.k.play(c.audio.burpSnd,t)}a(Nn,"burp");function Gn(t){c.audio.masterNode.gain.value=t}a(Gn,"setVolume");function Hn(){return c.audio.masterNode.gain.value}a(Hn,"getVolume");function Uo(t){return Rt("volume","setVolume / getVolume"),t!==void 0&&Gn(t),Hn()}a(Uo,"volume");function jn(){c.app.onHide(()=>{c.globalOpt.backgroundAudio||c.audio.ctx.suspend()}),c.app.onShow(()=>{!c.globalOpt.backgroundAudio&&!c.debug.paused&&c.audio.ctx.resume()}),c.app.onResize(()=>{if(c.app.isFullscreen())return;let t=c.globalOpt.width&&c.globalOpt.height;t&&!c.globalOpt.stretch&&!c.globalOpt.letterbox||(c.canvas.width=c.canvas.offsetWidth*c.pixelDensity,c.canvas.height=c.canvas.offsetHeight*c.pixelDensity,qn(),t||(c.gfx.frameBuffer.free(),c.gfx.frameBuffer=new as(c.gfx.ggl,c.gfx.ggl.gl.drawingBufferWidth,c.gfx.ggl.gl.drawingBufferHeight),c.gfx.width=c.gfx.ggl.gl.drawingBufferWidth/c.pixelDensity/c.gscale,c.gfx.height=c.gfx.ggl.gl.drawingBufferHeight/c.pixelDensity/c.gscale))}),c.globalOpt.debug!==false&&(c.app.onKeyPress(c.globalOpt.debugKey??"f1",()=>c.debug.inspect=!c.debug.inspect),c.app.onKeyPress("f2",()=>c.debug.clearLog()),c.app.onKeyPress("f8",()=>c.debug.paused=!c.debug.paused),c.app.onKeyPress("f7",()=>{c.debug.timeScale=rs(Ne(c.debug.timeScale-.2,0,2),1)}),c.app.onKeyPress("f9",()=>{c.debug.timeScale=rs(Ne(c.debug.timeScale+.2,0,2),1)}),c.app.onKeyPress("f10",()=>c.debug.stepFrame())),c.globalOpt.burp&&c.app.onKeyPress("b",()=>Nn())}a(jn,"initEvents");function Lo(t,e={}){let r=c.game.root.add([Pr(t),zn()]),s=(e.speed||1)*5,n=e.scale||1;r.add([hs(c.boomSprite),kr(0),cs("center"),Ys(s,n),...e.comps??[]]);let i=r.add([hs(c.kaSprite),kr(0),cs("center"),ds(),...e.comps??[]]);return i.wait(.4/s,()=>i.use(Ys(s,n))),i.onDestroy(()=>r.destroy()),r}a(Lo,"addKaboom");function Vn(t,e){if(c.game.layers)throw Error("Layers can only be assigned once.");let r=t.indexOf(e);if(r==-1)throw Error("The default layer name should be present in the layers list.");c.game.layers=t,c.game.defaultLayerIndex=r}a(Vn,"setLayers");function No(){return c.game.layers}a(No,"getLayers");function Go(){var t;return((t=c.game.layers)==null?void 0:t[c.game.defaultLayerIndex])??null}a(Go,"getDefaultLayer");function Ho(t,e){Rt("layers","setLayers"),Vn(t,e)}a(Ho,"layers");function Kn(t){t.destroy()}a(Kn,"destroy");function jo(){return c.game.root}a(jo,"getTreeRoot");function Vo(t,e){c.game.scenes[t]=e}a(Vo,"scene");function Ko(t,...e){if(!c.game.scenes[t])throw new Error(`Scene not found: ${t}`);c.game.events.onOnce("frameEnd",()=>{c.game.events.trigger("sceneLeave",t),c.app.events.clear(),c.game.events.clear(),c.game.objEvents.clear(),[...c.game.root.children].forEach(r=>{!r.stay||r.scenesToStay&&!r.scenesToStay.includes(t)?c.game.root.remove(r):r.trigger("sceneEnter",t)}),c.game.root.clearEvents(),jn(),c.game.cam={pos:null,scale:E(1),angle:0,shake:0,transform:new Qe},c.game.scenes[t](...e)}),c.game.currentScene=t}a(Ko,"go");function Yo(t){return c.game.events.on("sceneLeave",t)}a(Yo,"onSceneLeave");function Qo(){return c.game.currentScene}a(Qo,"getSceneName");function hs(t,e={}){let r=null,s=null,n=null,i=new xe;if(!t)throw new Error("Please pass the resource name or data to sprite()");let o=a((l,u,f,x)=>{let h=E(1,1);return f&&x?(h.x=f/(l.width*u.w),h.y=x/(l.height*u.h)):f?(h.x=f/(l.width*u.w),h.y=h.x):x&&(h.y=x/(l.height*u.h),h.x=h.y),h},"calcTexScale"),d=a((l,u)=>{if(!u)return;let f=u.frames[0].clone();e.quad&&(f=f.scale(e.quad));let x=o(u.tex,f,e.width,e.height);l.width=u.tex.width*f.w*x.x,l.height=u.tex.height*f.h*x.y,e.anim&&l.play(e.anim),r=u,i.trigger(r)},"setSpriteData");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new oe(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??false,flipY:e.flipY??false,get sprite(){return t.toString()},set sprite(l){let u=br(l);u&&u.onLoad(f=>d(this,f))},get animFrame(){if(!r||!s||n===null)return this.frame;let l=r.anims[s.name];return typeof l=="number"?l:this.frame-Math.min(l.from,l.to)},draw(){if(!r)return;let l=r.frames[this.frame??0];if(!l)throw new Error(`Frame not found: ${this.frame??0}`);if(r.slice9){let{left:u,right:f,top:x,bottom:h}=r.slice9,y=r.tex.width*l.w,p=r.tex.height*l.h,S=this.width-u-f,g=this.height-x-h,w=u/y,R=f/y,P=1-w-R,O=x/p,T=h/p,A=1-O-T,v=[he(0,0,w,O),he(w,0,P,O),he(w+P,0,R,O),he(0,O,w,A),he(w,O,P,A),he(w+P,O,R,A),he(0,O+A,w,T),he(w,O+A,P,T),he(w+P,O+A,R,T),he(0,0,u,x),he(u,0,S,x),he(u+S,0,f,x),he(0,x,u,g),he(u,x,S,g),he(u+S,x,f,g),he(0,x+g,u,h),he(u,x+g,S,h),he(u+S,x+g,f,h)];for(let M=0;M<9;M++){let k=v[M],I=v[M+9];Rr(Object.assign(At(this),{pos:I.pos(),tex:r.tex,quad:l.scale(k),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:I.w,height:I.h}))}}else Rr(Object.assign(At(this),{tex:r.tex,quad:l.scale(this.quad??new oe(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let l=br(t);l?l.onLoad(u=>d(this,u)):Cs(()=>d(this,br(t).data))},update(){if(!r||!s||n===null)return;let l=r.anims[s.name];if(typeof l=="number"){this.frame=l;return}if(l.speed===0)throw new Error("Sprite anim speed cannot be 0");s.timer+=ge()*this.animSpeed,s.timer>=1/s.speed&&(s.timer=0,this.frame+=n,(this.frameMath.max(l.from,l.to))&&(s.loop?s.pingpong?(this.frame-=n,n*=-1,this.frame+=n):this.frame=l.from:s.pingpong?n===Math.sign(l.to-l.from)?(this.frame=l.to,n*=-1,this.frame+=n):(this.frame=l.from,s.onEnd(),this.stop()):(this.frame=l.to,s.onEnd(),this.stop())))},play(l,u={}){if(!r){i.add(()=>this.play(l,u));return}let f=r.anims[l];if(f===void 0)throw new Error(`Anim not found: ${l}`);s&&this.stop(),s=typeof f=="number"?{name:l,timer:0,loop:false,pingpong:false,speed:0,onEnd:a(()=>{},"onEnd")}:{name:l,timer:0,loop:u.loop??f.loop??false,pingpong:u.pingpong??f.pingpong??false,speed:u.speed??f.speed??10,onEnd:u.onEnd??(()=>{})},n=typeof f=="number"?null:f.fromr(this))},draw(){yt(r(this))},renderArea(){return new ie(E(0),this.width,this.height)}};return r(s),s}a(Xo,"text");function zo(t,e){return{id:"rect",width:t,height:e,draw(){cr(Object.assign(At(this),{width:this.width,height:this.height}))},renderArea(){return new ie(E(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}a(zo,"uvquad");function Wo(t={}){let e=null,r=null,s=null,n=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??true,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return r&&s?r[s]:null},getPath(){return r?r.slice():null},getTarget(){return e},isNavigationFinished(){return r?s===null:true},isTargetReachable(){return r!==null},isTargetReached(){return e?this.pos.eq(e):true},setTarget(i){e=i,r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),s=r?0:null,r&&s!==null?(n||(n=this.getLevel().onNavigationMapChanged(()=>{e&&r&&s!==null&&(r=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r?(s=0,this.trigger("navigationNext",this,r[s])):(s=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>n==null?void 0:n.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,r[s])):this.trigger("navigationEnded",this)},update(){if(e&&r&&s!==null){if(this.pos.sdist(r[s])<2)if(s===r.length-1){this.pos=e.clone(),s=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else s++,this.trigger("navigationNext",this,r[s]);this.moveTo(r[s],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(r)})}}}a(Wo,"agent");function Zo(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(r){var s;return(s=this.graph)==null?void 0:s.getWaypointPath(this.pos,r,t.navigationOpt)},get graph(){if(e)return e;let r=this.parent;for(;r;){if(r.has("pathfinderMap"))return r.graph;r=r.parent}},set graph(r){e=r}}}a(Zo,"pathfinder");function Jo(t={}){let e=t.waypoints,r=t.speed||100,s=t.endBehavior||"stop",n=0,i=e!=null;return{id:"patrol",require:["pos"],get patrolSpeed(){return r},set patrolSpeed(o){r=o},get waypoints(){return e},set waypoints(o){e=o,n=0,i=false},get nextLocation(){return e?e[n]:void 0},update(){let o=this.nextLocation;if(!(!e||!o||i)&&(this.moveTo(o,r),this.pos.sdist(o)<9))switch(s){case"loop":n=(n+1)%e.length;break;case"ping-pong":n=n+1,n==e.length&&(e.reverse(),n=0);break;case"stop":n=Math.min(n+1,e.length-1),n==e.length-1&&(i=true,this.trigger("patrolFinished"));break}},onPatrolFinished(o){return this.on("patrolFinished",o)}}}a(Jo,"patrol");function $o(t,e={}){let r=typeof t=="function"?t:()=>c.game.root.query(t),s=e.checkFrequency||1,n=typeof e.direction=="number"?C.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?C.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(o){this.direction=o!==void 0?C.fromAngle(o):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(o,d,l){let u=(typeof d=="number"?C.fromAngle(d):d)||n,f=l||e.fieldOfView;if(!u||!f||f>=360)return true;let x=f/2;return o.pos&&u.angleBetween(o.pos.sub(this.pos))<=x},hasLineOfSight(o){let d=Rn(this.pos,o.pos.sub(this.pos),e.raycastExclude);return d!=null&&d.object===o},update(){if(i+=ge(),i>s){i-=s;let o=r();if(o.length&&n&&this.fieldOfView&&this.fieldOfView<360){let d=this.fieldOfView/2;o=o.filter(l=>l.pos&&n.angleBetween(l.pos.sub(this.pos))<=d)}o.length&&e.lineOfSight&&(o=o.filter(d=>d.pos&&this.hasLineOfSight(d))),o.length>0&&(this.spotted=o,this.trigger("objectSpotted",o))}},onObjectsSpotted(o){return this.on("objectSpotted",o)}}}a($o,"sentry");function Yn(t={}){let e=E(0),r=t.isObstacle??false,s=t.cost??0,n=t.edges??[],i=a(()=>{let d={left:1,top:2,right:4,bottom:8};return n.map(l=>d[l]||0).reduce((l,u)=>l|u,0)},"getEdgeMask"),o=i();return{id:"tile",tilePosOffset:t.offset??E(0),set tilePos(d){let l=this.getLevel();e=d.clone(),this.pos=E(this.tilePos.x*l.tileWidth(),this.tilePos.y*l.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(d){r!==d&&(r=d,this.getLevel().invalidateNavigationMap())},get isObstacle(){return r},set cost(d){s!==d&&(s=d,this.getLevel().invalidateNavigationMap())},get cost(){return s},set edges(d){n=d,o=i(),this.getLevel().invalidateNavigationMap()},get edges(){return n},get edgeMask(){return o},getLevel(){return this.parent},tileMove(d){let l=this.getLevel();l.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(d),l.insertIntoSpatialMap(this),l.trigger("spatialMapChanged")},moveLeft(){this.tileMove(E(-1,0))},moveRight(){this.tileMove(E(1,0))},moveUp(){this.tileMove(E(0,-1))},moveDown(){this.tileMove(E(0,1))}}}a(Yn,"tile");var or;var Qn=(or=class{constructor(e,r,s){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=r.duration,this.loops=r.loops||0,this.direction=r.direction||"forward",this.easing=r.easing||qr.linear,this.interpolation=r.interpolation||"linear",this.isFinished=false,this.timing=r.timing,this.easings=r.easings,this.relative=s}update(e,r){return true}getLowerKeyIndexAndRelativeTime(e,r,s){let n=r-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[n,0,true];let o=Math.trunc(i);if(i-=o,(this.direction=="reverse"||this.direction=="ping-pong"&&o&1)&&(i=1-i),s){let d=0;for(;s[d+1]!==void 0&&s[d+1]=n?[n,0,true]:[d,(i-s[d])/(s[d+1]-s[d]),false]}else{let d=Math.floor((r-1)*i);return[d,(i-d/n)*n,false]}}setValue(e,r,s){if(this.relative)switch(r){case"pos":e.pos=e.base.pos.add(s);break;case"angle":e.angle=e.base.angle+s;break;case"scale":e.scale=e.base.scale.scale(s);break;case"opacity":e.opacity=e.base.opacity*s;break;default:e[r]=s}else e[r]=s}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=qr.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(r=>this.easing.name)),e}},a(or,"AnimateChannel"),or);function Ks(t,e){return e.add(e.sub(t))}a(Ks,"reflect");var lr;var Iu=(lr=class extends Qn{constructor(r,s,n,i){super(r,n,i);b(this,"keys");this.keys=s}update(r,s){let[n,i,o]=this.getLowerKeyIndexAndRelativeTime(s,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(r,this.name,this.keys[n]);else{let d=this.easings?this.easings[n]:this.easing;this.setValue(r,this.name,be(this.keys[n],this.keys[n+1],d(i)))}return o}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},a(lr,"AnimateChannelNumber"),lr);var ur;var Fu=(ur=class extends Qn{constructor(r,s,n,i,o){var d;super(r,n,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=s,this.interpolation==="spline"){this.curves=[],o&&(this.dcurves=[]);for(let l=0;l0?this.keys[l-1]:Ks(x,u),y=f[r.x,r.y])})}},a(ur,"AnimateChannelVec2"),ur);var hr;var Tu=(hr=class extends Qn{constructor(r,s,n,i){super(r,n,i);b(this,"keys");this.keys=s}update(r,s){let[n,i,o]=this.getLowerKeyIndexAndRelativeTime(s,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(r,this.name,this.keys[n]);else{let d=this.easings?this.easings[n]:this.easing;this.setValue(r,this.name,this.keys[n].lerp(this.keys[n+1],d(i)))}return o}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},a(hr,"AnimateChannelColor"),hr);function _o(t={}){let e=[],r=0,s=false;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:E(0,0),angle:0,scale:E(1,1),opacity:1},animation:{paused:false,seek(n){r=Ne(n,0,this.duration),e.forEach(i=>{i.isFinished=false}),s=false},get duration(){return e.reduce((n,i)=>Math.max(i.duration,n),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let n=true,i;r+=ge();for(let o of e)i=o.update(this,r),i&&!o.isFinished&&(o.isFinished=true,this.trigger("animateChannelFinished",o.name)),n&&(n=i);n&&!s&&(s=true,this.trigger("animateFinished"))},animate(n,i,o){s=false,this.unanimate(n),typeof i[0]=="number"?e.push(new Iu(n,i,o,t.relative||false)):i[0]instanceof C?e.push(new Fu(n,i,o,t.relative||false,n==="pos"&&(t.followMotion||false))):i[0]instanceof X&&e.push(new Tu(n,i,o,t.relative||false))},unanimate(n){let i=e.findIndex(o=>o.name===n);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(n){return this.on("animateFinished",n)},onAnimateChannelFinished(n){return this.on("animateChannelFinished",n)},serializeAnimationChannels(){return e.reduce((n,i)=>(n[i.name]=i.serialize(),n),{})},serializeAnimationOptions(){let n={};return t.followMotion&&(n.followMotion=true),t.relative&&(n.relative=true),n}}}a(_o,"animate");function Xn(t,e){let r={name:t.name};return t.has("animate")&&(r.channels=t.serializeAnimationChannels(),Object.assign(r,t.serializeAnimationOptions())),t.children.length>0&&(r.children=t.children.filter(s=>s.has("named")).map(s=>Xn(s,s.name))),r}a(Xn,"serializeAnimation");function Ys(t=2,e=1){let r=0;return{require:["scale"],update(){let s=Math.sin(r*t)*e;s<0&&this.destroy(),this.scale=E(s),r+=ge()}}}a(Ys,"boom");function el(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(r=1){this.setHP(t-r),this.trigger("hurt",r)},heal(r=1){let s=t;this.setHP(t+r),this.trigger("heal",t-s)},hp(){return t},maxHP(){return e??null},setMaxHP(r){e=r},setHP(r){t=e?Math.min(e,r):r,t<=0&&this.trigger("death")},onHurt(r){return this.on("hurt",r)},onHeal(r){return this.on("heal",r)},onDeath(r){return this.on("death",r)},inspect(){return`health: ${t}`}}}a(el,"health");function tl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let r=e.fade??0;return{id:"lifespan",require:["opacity"],add(){c.game.root.wait(t,()=>{this.opacity=this.opacity??1,r>0?c.game.root.tween(this.opacity,0,r,s=>this.opacity=s,qr.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}a(tl,"lifespan");function rl(t){return{id:"named",name:t}}a(rl,"named");function sl(t,e,r){if(!t)throw new Error("state() requires an initial state");let s={};function n(l){s[l]||(s[l]={enter:new xe,end:new xe,update:new xe,draw:new xe})}a(n,"initStateEvents");function i(l,u,f){return n(u),s[u][l].add(f)}a(i,"on");function o(l,u,...f){n(u),s[u][l].trigger(...f)}a(o,"trigger");let d=false;return{id:"state",state:t,enterState(l,...u){if(d=true,e&&!e.includes(l))throw new Error(`State not found: ${l}`);let f=this.state;if(r){if(!(r==null?void 0:r[f]))return;let x=typeof r[f]=="string"?[r[f]]:r[f];if(!x.includes(l))throw new Error(`Cannot transition state from "${f}" to "${l}". Available transitions: ${x.map(h=>`"${h}"`).join(", ")}`)}o("end",f,...u),this.state=l,o("enter",l,...u),o("enter",`${f} -> ${l}`,...u)},onStateTransition(l,u,f){return i("enter",`${l} -> ${u}`,f)},onStateEnter(l,u){return i("enter",l,u)},onStateUpdate(l,u){return i("update",l,u)},onStateDraw(l,u){return i("draw",l,u)},onStateEnd(l,u){return i("end",l,u)},update(){d||(o("enter",t),d=true),o("update",this.state)},draw(){o("draw",this.state)},inspect(){return`state: ${this.state}`}}}a(sl,"state");function zn(t){return{id:"stay",stay:true,scenesToStay:t}}a(zn,"stay");function nl(t=true,e){let r,s;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let n=a(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");r=c.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),n()})},destroy(){r.cancel(),s.cancel()}}}a(nl,"textInput");function ds(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,r,s=-1,n=false){let i=n?0:e,o=new xe,d=this.onUpdate(()=>{i+=c.app.state.dt;for(let l=0;i>=e&&l{}),1,true)},tween(e,r,s,n,i=qr.linear){let o=0,d=[],l=this.onUpdate(()=>{o+=c.app.state.dt;let u=Math.min(o/s,1);n(be(e,r,i(u))),u===1&&(l.cancel(),n(r),d.forEach(f=>f()))});return{get paused(){return l.paused},set paused(u){l.paused=u},onEnd(u){d.push(u)},then(u){return this.onEnd(u),this},cancel(){l.cancel()},finish(){l.cancel(),n(r),d.forEach(u=>u())}}}}}a(ds,"timer");var Qs=0;function il(){return Qs>0}a(il,"usesArea");function al(t={}){let e={},r=new Set,s=[];return{id:"area",collisionIgnore:t.collisionIgnore??[],add(){Qs++,this.area.cursor&&s.push(this.onHover(()=>c.app.setCursor(this.area.cursor))),s.push(this.onCollideUpdate((n,i)=>{if(!n.id)throw new Error("area() requires the object to have an id");e[n.id]||this.trigger("collide",n,i),i&&(e[n.id]=i,r.add(n.id))}))},destroy(){Qs--;for(let n of s)n.cancel()},fixedUpdate(){for(let n in e)r.has(Number(n))||(this.trigger("collideEnd",e[n].target),delete e[n]);r.clear()},drawInspect(){let n=this.localArea();qe(),ae(this.area.offset);let i={outline:{width:4/dn(),color:_(0,0,255)},anchor:this.anchor,fill:false,fixed:ut(this)};n instanceof ie?Be({...i,pos:n.pos,width:n.width*this.area.scale.x,height:n.height*this.area.scale.y}):n instanceof Ee?et({...i,pts:n.pts,scale:this.area.scale}):n instanceof Re&&kt({...i,pos:n.center,radius:n.radius}),ve()},area:{shape:t.shape??null,scale:t.scale?E(t.scale):E(1),offset:t.offset??E(0),cursor:t.cursor??null},isClicked(){return c.app.isMousePressed()&&this.isHovering()},isHovering(){let n=ut(this)?c.k.mousePos():c.k.toWorld(c.k.mousePos());return this.hasPoint(n)},checkCollision(n){if(!n.id)throw new Error("checkCollision() requires the object to have an id");return e[n.id]??null},getCollisions(){return Object.values(e)},isColliding(n){if(!n.id)throw new Error("isColliding() requires the object to have an id");return!!e[n.id]},isOverlapping(n){if(!n.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[n.id];return i&&i.hasOverlap()},onClick(n,i="left"){let o=c.app.onMousePress(i,()=>{this.isHovering()&&n()});return s.push(o),o},onHover(n){let i=false;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=true,n())})},onHoverUpdate(n){return this.onUpdate(()=>{this.isHovering()&&n()})},onHoverEnd(n){let i=false;return this.onUpdate(()=>{i?this.isHovering()||(i=false,n()):i=this.isHovering()})},onCollide(n,i){if(typeof n=="function"&&i===void 0)return this.on("collide",n);if(typeof n=="string")return this.onCollide((o,d)=>{o.is(n)&&(i==null?void 0:i(o,d))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(n,i){if(typeof n=="function"&&i===void 0)return this.on("collideUpdate",n);if(typeof n=="string")return this.on("collideUpdate",(o,d)=>o.is(n)&&(i==null?void 0:i(o,d)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(n,i){if(typeof n=="function"&&i===void 0)return this.on("collideEnd",n);if(typeof n=="string")return this.on("collideEnd",o=>o.is(n)&&(i==null?void 0:i(o)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(n){return tt(this.worldArea(),n)},resolveCollision(n){let i=this.checkCollision(n);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=true)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let n=this.localArea();if(!(n instanceof Ee||n instanceof ie))throw new Error("Only support polygon and rect shapes for now");let i=this.transform.clone().translate(this.area.offset).scale(E(this.area.scale??1));if(n instanceof ie){let o=Pt(this.anchor||xs).add(1,1).scale(-.5).scale(n.width,n.height);i.translate(o)}return n.transform(i)},screenArea(){let n=this.worldArea();return ut(this)?n:n.transform(c.game.cam.transform)},inspect(){var n,i,o,d,l,u,f;return((n=this.area.scale)==null?void 0:n.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(d=(o=this.area.scale)==null?void 0:o.x)==null?void 0:d.toFixed(1)}x`:`area: (${(u=(l=this.area.scale)==null?void 0:l.x)==null?void 0:u.toFixed(1)}x, ${(f=this.area.scale.y)==null?void 0:f.toFixed(1)}y)`}}}a(al,"area");function ol(t={}){let e=null,r=null,s=false,n=E(0),i=null,o=null,d;return{id:"body",require:["pos"],vel:E(0),drag:t.drag??0,jumpForce:t.jumpForce??Nl,gravityScale:t.gravityScale??1,isStatic:t.isStatic??false,mass:t.mass??1,add(){if(i=this.pos.clone(),o=this.pos.clone(),d=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((l,u)=>{if(!u||!l.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let f=u.reverse();if(l.trigger("beforePhysicsResolve",f),!(u.resolved||f.resolved)&&!(this.isStatic&&l.isStatic)){if(!this.isStatic&&!l.isStatic){let x=this.mass+l.mass;this.pos=this.pos.add(u.displacement.scale(l.mass/x)),l.pos=l.pos.add(u.displacement.scale(-this.mass/x)),this.transform=Gt(this),l.transform=Gt(l)}else{let x=!this.isStatic&&l.isStatic?u:u.reverse();x.source.pos=x.source.pos.add(x.displacement),x.source.transform=Gt(x.source)}u.resolved=true,this.trigger("physicsResolve",u),l.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(l=>{if(c.game.gravity)if(l.isBottom()&&this.isFalling()){this.vel=this.vel.reject(c.game.gravity.unit());let u=e;e=l.target,u!=e&&(r=l.target.pos),s?s=false:u||(this.trigger("ground",e),l.target.trigger("land",this))}else l.isTop()&&this.isJumping()&&(this.vel=this.vel.reject(c.game.gravity.unit()),this.trigger("headbutt",l.target),l.target.trigger("headbutted",this))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(r&&!e.pos.eq(r)&&t.stickToPlatform!==false&&this.moveBy(e.pos.sub(r)),r=e.pos);let l=ns();l&&(this.pos.x==d.x&&(this.pos.x=be(i.x,o.x,l/ss()),d.x=this.pos.x),this.pos.y==d.y&&(this.pos.y=be(i.y,o.y,l/ss()),d.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==d.x&&(this.pos.x=i.x),this.pos.y==d.y&&(this.pos.y=i.y),i=null),c.game.gravity&&!this.isStatic){s&&(e=null,r=null,this.trigger("fallOff"),s=false),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(s=true);let l=this.vel.clone();this.vel=this.vel.add(c.game.gravity.scale(this.gravityScale*ge()));let u=t.maxVelocity??Gl;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),l.dot(c.game.gravity)<0&&this.vel.dot(c.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=n.x*ge(),this.vel.y+=n.y*ge(),this.vel.x*=1-this.drag*ge(),this.vel.y*=1-this.drag*ge(),this.move(this.vel),ns()){i=this.pos.clone();let l=this.vel.add(n.scale(ge()));o=this.pos.add(l.scale(ge())),d=this.pos.clone()}n.x=0,n.y=0},onPhysicsResolve(l){return this.on("physicsResolve",l)},onBeforePhysicsResolve(l){return this.on("beforePhysicsResolve",l)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(jt())>0},isJumping(){return this.vel.dot(jt())<0},applyImpulse(l){this.isStatic||(this.vel=this.vel.add(l))},addForce(l){this.isStatic||(n.x+=l.x/this.mass,n.y+=l.y/this.mass)},jump(l){this.isStatic||(e=null,r=null,this.vel=jt().scale(-l||-this.jumpForce))},onGround(l){return this.on("ground",l)},onFall(l){return this.on("fall",l)},onFallOff(l){return this.on("fallOff",l)},onHeadbutt(l){return this.on("headbutt",l)},onLand(l){return this.on("land",l)},onHeadbutted(l){return this.on("headbutted",l)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}a(ol,"body");function ll(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(r){e<=0||(e{var o;let s=r==null?void 0:r.normal.normal(),n=e.vel.project(s),i=(o=s==null?void 0:s.scale(this.speed))==null?void 0:o.sub(n);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}a(ul,"surfaceEffector");function hl(t){return{id:"areaEffector",require:["area"],useGlobalAngle:t.useGlobalAngle||false,forceAngle:t.forceAngle,forceMagnitude:t.forceMagnitude,forceVariation:t.forceVariation??0,linearDrag:t.linearDrag??0,add(){this.onCollideUpdate("body",(e,r)=>{if(!e.has("body"))return;let s=C.fromAngle(this.forceAngle).scale(this.forceMagnitude);e.addForce(s),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}a(hl,"areaEffector");function dl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,forceVariation:t.forceVariation??0,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate("body",(e,r)=>{let s=this.pos.sub(e.pos),n=s.len(),i=n*this.distanceScale/10,o=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,d=s.scale(this.forceMagnitude*o/n);e.addForce(d),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}a(dl,"pointEffector");function cl(t){return{id:"constantForce",require:["body"],force:t.force,update(){this.force&&this.addForce(this.force)}}}a(cl,"constantForce");function fl(t){return{id:"platformEffector",require:["area","body"],surfaceArc:t.surfaceArc??180,useOneWay:t.useOneWay??false,add(){this.onBeforePhysicsResolve(e=>{let r=e.target.vel,s=jt().scale(-1).angleBetween(r);Math.abs(s)>this.surfaceArc/2&&e.preventResolution()})}}}a(fl,"platformEffector");function gl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate("body",(e,r)=>{let s=e,n=s.worldArea(),[i,o]=n.cut(E(-100,this.surfaceLevel),E(100,this.surfaceLevel));i&&(this.applyBuoyancy(s,i),this.applyDrag(s,i)),this.flowMagnitude&&s.addForce(C.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,r){let s=this.density*r.area(),n=E(0,1).scale(-s);e.addForce(n)},applyDrag(e,r){let s=e.vel,n=this.density*this.linearDrag,i=s.scale(-n);e.addForce(i)}}}a(gl,"buoyancyEffector");function cs(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}a(cs,"anchor");function Wn(){return{id:"fixed",fixed:true}}a(Wn,"fixed");function pl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??E(0)},add(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))},update(){t.exists()&&(this.pos=this.follow.obj.pos.add(this.follow.offset))}}}a(pl,"follow");function ml(t){var r;let e=(r=c.game.layers)==null?void 0:r.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var s;return e?((s=c.game.layers)==null?void 0:s[e])??null:null},set layer(s){var n;if(e=(n=c.game.layers)==null?void 0:n.indexOf(s),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}a(ml,"layer");function wl(t,e){let r=typeof t=="number"?C.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(r.scale(e))}}}a(wl,"move");function yl(t={}){let e=t.distance??Ll,r=false;return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return false;let n=new ie(E(0),pe(),we());return!Tr(n,s)&&n.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},update(){this.isOffScreen()?(r||(this.trigger("exitView"),r=true),t.hide&&(this.hidden=true),t.pause&&(this.paused=true),t.destroy&&this.destroy()):(r&&(this.trigger("enterView"),r=false),t.hide&&(this.hidden=false),t.pause&&(this.paused=false))}}}a(yl,"offscreen");function Pr(...t){return{id:"pos",pos:E(...t),moveBy(...e){this.pos=this.pos.add(E(...e))},move(...e){this.moveBy(E(...e).scale(ge()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(E(e[0],e[1]),e[2]);let r=e[0],s=e[1];if(s===void 0){this.pos=E(r);return}let n=r.sub(this.pos);if(n.len()<=s*ge()){this.pos=E(r);return}this.move(n.unit().scale(s))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.multVec2(this.pos):this.pos},toWorld(e){return this.parent?this.parent.transform.multVec2(this.pos.add(e)):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.invert().multVec2(e).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let r=this.worldPos();return r?ut(this)?r:us(r):null}},toScreen(e){let r=this.toWorld(e);return ut(this)?r:us(r)},fromScreen(e){return ut(this)?this.fromWorld(e):this.fromWorld(Ln(e))},toOther(e,r){return e.fromWorld(this.toWorld(r))},fromOther(e,r){return e.toOther(this,r)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){kt({color:_(255,0,0),radius:4/dn()})}}}a(Pr,"pos");function Al(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}a(Al,"rotate");function kr(...t){if(t.length===0)return kr(1);let e=E(...t);return{id:"scale",set scale(r){if(!(r instanceof C))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=E(r)},get scale(){return e},scaleTo(...r){e=E(...r)},scaleBy(...r){e=e.scale(E(...r))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}a(kr,"scale");function xl(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}a(xl,"z");var Du="data:image/png;base64,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";var Ou="data:image/png;base64,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";var Uu="3001.0.0";var c={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null};var Lu=a((t={tagsAsComponents:true})=>{c.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),c.k.quit()),c.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let r=t.canvas??e.appendChild(document.createElement("canvas"));c.canvas=r;let s=t.scale??1;c.gscale=s;let n=t.width&&t.height&&!t.stretch&&!t.letterbox;n?(r.width=t.width*s,r.height=t.height*s):(r.width=r.parentElement.offsetWidth,r.height=r.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(n){let L=r.width,K=r.height;i.push(`width: ${L}px`),i.push(`height: ${K}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),r.style.cssText=i.join(";");let o=t.pixelDensity||1;c.pixelDensity=o,r.width*=o,r.height*=o,r.tabIndex=0;let d=document.createElement("canvas");d.width=256,d.height=256,c.fontCacheCanvas=d;let l=d.getContext("2d",{willReadFrequently:true});c.fontCacheC2d=l;let u=eu({canvas:r,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});c.app=u;let f=[],x=u.canvas.getContext("webgl",{antialias:true,depth:true,stencil:true,alpha:true,preserveDrawingBuffer:true});if(!x)throw new Error("WebGL not supported");let h=x,y=Wa(h,{texFilter:t.texFilter}),p=yu(t,y);c.gfx=p;let S=ku();c.audio=S;let g=gu(y,t.spriteAtlasPadding??0);c.assets=g;let w=Ru();c.game=w,w.root.use(ds());function R(L,K){let Q=new as(y,L,K);return{clear:a(()=>Q.clear(),"clear"),free:a(()=>Q.free(),"free"),toDataURL:a(()=>Q.toDataURL(),"toDataURL"),toImageData:a(()=>Q.toImageData(),"toImageData"),width:Q.width,height:Q.height,draw:a(re=>{Ce(),Q.bind(),re(),Ce(),Q.unbind()},"draw"),get fb(){return Q}}}a(R,"makeCanvas");function P(){h.clear(h.COLOR_BUFFER_BIT),p.frameBuffer.bind(),h.clear(h.COLOR_BUFFER_BIT),p.bgColor||$e(()=>{cr({width:pe(),height:we(),quad:new oe(0,0,pe()/64,we()/64),tex:p.bgTex,fixed:true})}),p.renderer.numDraws=0,p.fixed=false,p.transformStack.length=0,p.transform=new Qe}a(P,"frameStart");function O(L,K){p.postShader=L,p.postShaderUniform=K??null}a(O,"usePostEffect");function T(){Ce(),p.lastDrawCalls=p.renderer.numDraws,p.frameBuffer.unbind(),h.viewport(0,0,h.drawingBufferWidth,h.drawingBufferHeight);let L=p.width,K=p.height;p.width=h.drawingBufferWidth/o,p.height=h.drawingBufferHeight/o,Rr({flipY:true,tex:p.frameBuffer.tex,pos:new C(p.viewport.x,p.viewport.y),width:p.viewport.width,height:p.viewport.height,shader:p.postShader,uniform:typeof p.postShaderUniform=="function"?p.postShaderUniform():p.postShaderUniform,fixed:true}),Ce(),p.width=L,p.height=K}a(T,"frameEnd");let A=false,v={inspect:false,timeScale:1,showLog:true,fps:a(()=>u.fps(),"fps"),numFrames:a(()=>u.numFrames(),"numFrames"),stepFrame:nt,drawCalls:a(()=>p.lastDrawCalls,"drawCalls"),clearLog:a(()=>w.logs=[],"clearLog"),log:a((...L)=>{let K=t.logMax??8,Q=L.length>1?L.concat(" ").join(" "):L[0];w.logs.unshift({msg:Q,time:u.time()}),w.logs.length>K&&(w.logs=w.logs.slice(0,K))},"log"),error:a(L=>v.log(new Error(L.toString?L.toString():L)),"error"),curRecording:null,numObjects:a(()=>V("*",{recursive:true}).length,"numObjects"),get paused(){return A},set paused(L){A=L,L?S.ctx.suspend():S.ctx.resume()}};c.debug=v;function M(L,K){try{return JSON.parse(window.localStorage[L])}catch{return K?(k(L,K),K):null}}a(M,"getData");function k(L,K){window.localStorage[L]=JSON.stringify(K)}a(k,"setData");function I(L,...K){let Q=L(Ge),re;typeof Q=="function"?re=Q(...K)(Ge):re=Q;for(let ce in re)Ge[ce]=re[ce],t.global!==false&&(window[ce]=re[ce]);return Ge}a(I,"plug");function D(L){let K=u.canvas.captureStream(L),Q=S.ctx.createMediaStreamDestination();S.masterNode.connect(Q);let re=new MediaRecorder(K),ce=[];return re.ondataavailable=$=>{$.data.size>0&&ce.push($.data)},re.onerror=()=>{S.masterNode.disconnect(Q),K.getTracks().forEach($=>$.stop())},re.start(),{resume(){re.resume()},pause(){re.pause()},stop(){return re.stop(),S.masterNode.disconnect(Q),K.getTracks().forEach($=>$.stop()),new Promise($=>{re.onstop=()=>{$(new Blob(ce,{type:"video/mp4"}))}})},download($="kaboom.mp4"){this.stop().then(ye=>Ls($,ye))}}}a(D,"record");function U(){return document.activeElement===u.canvas}a(U,"isFocused");let N=w.root.add.bind(w.root),j=w.root.readd.bind(w.root),z=w.root.removeAll.bind(w.root),V=w.root.get.bind(w.root),Y=w.root.wait.bind(w.root),ee=w.root.loop.bind(w.root),J=w.root.query.bind(w.root),W=w.root.tween.bind(w.root),le=Ht(null,Ou),G=Ht(null,Du);c.kaSprite=le,c.boomSprite=G;function Xe(){w.root.fixedUpdate()}a(Xe,"fixedUpdateFrame");function nt(){w.root.update()}a(nt,"updateFrame");const vt=class vt{constructor(K,Q,re,ce,$=false){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",false);this.source=K,this.target=Q,this.normal=re,this.distance=ce,this.resolved=$}get displacement(){return this.normal.scale(this.distance)}reverse(){return new vt(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||E(0,1))>0}isRight(){return this.displacement.cross(w.gravity||E(0,1))<0}isTop(){return this.displacement.dot(w.gravity||E(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||E(0,1))<0}preventResolution(){this.resolved=true}};a(vt,"Collision");let It=vt;function pr(){if(!il())return;let L={},K=t.hashGridSize||64,Q=new Qe,re=[];function ce($){if(re.push(Q.clone()),$.pos&&Q.translate($.pos),$.scale&&Q.scale($.scale),$.angle&&Q.rotate($.angle),$.transform=Q.clone(),$.c("area")&&!$.paused){let ye=$,it=ye.worldArea().bbox(),Rs=Math.floor(it.pos.x/K),Ps=Math.floor(it.pos.y/K),Vr=Math.ceil((it.pos.x+it.width)/K),Kr=Math.ceil((it.pos.y+it.height)/K),wr=new Set;for(let De=Rs;De<=Vr;De++)for(let ze=Ps;ze<=Kr;ze++)if(!L[De])L[De]={},L[De][ze]=[ye];else if(!L[De][ze])L[De][ze]=[ye];else{let Tt=L[De][ze];e:for(let Ie of Tt){if(Ie.paused||!Ie.exists()||wr.has(Ie.id))continue;for(let We of ye.collisionIgnore)if(Ie.is(We))continue e;for(let We of Ie.collisionIgnore)if(ye.is(We))continue e;let yr=Qi(ye.worldArea(),Ie.worldArea());if(yr){let We=new It(ye,Ie,yr.normal,yr.distance);ye.trigger("collideUpdate",Ie,We);let Ar=We.reverse();Ar.resolved=We.resolved,Ie.trigger("collideUpdate",ye,Ar)}wr.add(Ie.id)}Tt.push(ye)}}$.children.forEach(ce),Q=re.pop()}a(ce,"checkObj"),ce(w.root)}a(pr,"checkFrame");function mr(L){console.error(L),S.ctx.suspend();let K=L.message??String(L)??"Unknown error, check console for more info";u.run(()=>{},()=>{P(),$e(()=>{let Q=pe(),re=we(),ce={size:36,width:Q-32*2,letterSpacing:4,lineSpacing:4,font:ts,fixed:true};Be({width:Q,height:re,color:_(0,0,255),fixed:true});let $=wt({...ce,text:"Error",pos:E(32),color:_(255,128,0),fixed:true});yt($),Vs({...ce,text:K,pos:E(32,32+$.height+16),fixed:true}),ve(),w.events.trigger("error",L)}),T()})}a(mr,"handleErr");function Gr(L){f.push(L)}a(Gr,"onCleanup");function Hr(){w.events.onOnce("frameEnd",()=>{u.quit(),h.clear(h.COLOR_BUFFER_BIT|h.DEPTH_BUFFER_BIT|h.STENCIL_BUFFER_BIT);let L=h.getParameter(h.MAX_TEXTURE_IMAGE_UNITS);for(let K=0;KK())})}a(Hr,"quit");let Ft=true;u.run(()=>{try{g.loaded&&(v.paused||Xe(),pr())}catch(L){mr(L)}},(L,K)=>{try{L(),g.loaded||pt()===1&&!Ft&&(g.loaded=true,fn().forEach(Q=>w.events.trigger("loadError",...Q)),w.events.trigger("load")),!g.loaded&&t.loadingScreen!==false||Ft?(P(),$a(),T()):(v.paused||nt(),pr(),P(),Ja(),t.debug!==false&&Za(),T()),Ft&&(Ft=false),w.events.trigger("frameEnd"),K()}catch(Q){mr(Q)}}),qn(),jn();let Ge={_k:c,VERSION:Uu,loadRoot:Pa,loadProgress:pt,loadSprite:Ht,loadSpriteAtlas:vn,loadSound:Va,loadMusic:Ka,loadBitmapFont:Ua,loadFont:Da,loadShader:Ga,loadShaderURL:Ha,loadAseprite:Ta,loadPedit:La,loadBean:Fa,loadJSON:ka,load:is,getSound:xn,getFont:wn,getBitmapFont:yn,getSprite:gn,getShader:An,getAsset:Ia,Asset:Te,SpriteData:mt,SoundData:Br,width:pe,height:we,center:Cr,dt:ge,fixedDt:ss,restDt:ns,time:u.time,screenshot:u.screenshot,record:D,isFocused:U,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:Cs,onLoadError:Mo,onLoading:vo,onResize:bo,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:Eo,onCleanup:Gr,flash:Un,setCamPos:kn,getCamPos:In,setCamRot:Dn,getCamRot:On,setCamScale:Fn,getCamScale:Tn,getCamTransform:So,camPos:Bo,camScale:Ro,camFlash:ko,camRot:Po,camTransform:qo,shake:Co,toScreen:us,toWorld:Ln,setGravity:Io,getGravity:Fo,setGravityDirection:To,getGravityDirection:jt,setBackground:Ea,getBackground:Ma,getGamepads:u.getGamepads,getTreeRoot:jo,add:N,make:Bs,destroy:Kn,destroyAll:z,get:V,query:J,readd:j,pos:Pr,scale:kr,rotate:Al,color:Cn,opacity:Bn,anchor:cs,area:al,sprite:hs,text:Xo,polygon:lo,rect:Pn,circle:ro,uvquad:zo,outline:ao,particles:oo,body:ol,platformEffector:fl,surfaceEffector:ul,areaEffector:hl,pointEffector:dl,buoyancyEffector:gl,constantForce:cl,doubleJump:ll,shader:uo,textInput:nl,timer:ds,fixed:Wn,stay:zn,health:el,lifespan:tl,named:rl,state:sl,z:xl,layer:ml,move:wl,offscreen:yl,follow:pl,fadeIn:no,mask:io,drawon:so,raycast:Rn,tile:Yn,animate:_o,serializeAnimation:Xn,agent:Wo,sentry:$o,patrol:Jo,pathfinder:Zo,trigger:xu,on:Me,onFixedUpdate:vu,onUpdate:bu,onDraw:Eu,onAdd:co,onDestroy:Mu,onTag:fo,onUntag:Cu,onUse:Su,onUnuse:qu,onClick:Bu,onCollide:po,onCollideUpdate:mo,onCollideEnd:wo,onHover:yo,onHoverUpdate:Ao,onHoverEnd:xo,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cn,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ee,wait:Y,play:Oo,setVolume:Gn,getVolume:Hn,volume:Uo,burp:Nn,audioCtx:S.ctx,Line:ke,Rect:ie,Circle:Re,Ellipse:rt,Point:Rl,Polygon:Ee,Vec2:C,Color:X,Mat4:Qe,Quad:oe,RNG:hi,rand:fe,randi:zs,randSeed:di,vec2:E,rgb:_,hsl2rgb:ql,quad:he,choose:gi,chooseMultiple:fi,shuffle:Ws,chance:ci,lerp:be,tween:W,easings:qr,map:Le,mapc:ui,wave:Xs,deg2rad:de,rad2deg:gt,clamp:Ne,evaluateQuadratic:Pi,evaluateQuadraticFirstDerivative:ki,evaluateQuadraticSecondDerivative:Ii,evaluateBezier:As,evaluateBezierFirstDerivative:Fi,evaluateBezierSecondDerivative:Ti,evaluateCatmullRom:Di,evaluateCatmullRomFirstDerivative:Oi,curveLengthApproximation:nn,normalizedCurve:Ui,hermite:gr,cardinal:an,catmullRom:Mr,bezier:Li,kochanekBartels:Ni,easingSteps:Yi,easingLinear:Vi,easingCubicBezier:Ki,testLineLine:fs,testRectRect:Zs,testRectLine:gs,testRectPoint:Tr,testCirclePolygon:Or,testLinePoint:ps,testLineCircle:fr,isConvex:Ji,triangulate:ln,NavMesh:cu,drawSprite:eo,drawText:Vs,formatText:wt,drawRect:Be,drawLine:Nt,drawLines:qs,drawTriangle:Mn,drawCircle:kt,drawEllipse:bn,drawUVQuad:cr,drawPolygon:et,drawCurve:En,drawBezier:za,drawFormattedText:yt,drawMasked:_a,drawSubtracted:to,pushTransform:qe,popTransform:ve,pushTranslate:ae,pushScale:dr,pushRotate:Ct,pushMatrix:Sa,usePostEffect:O,makeCanvas:R,debug:v,scene:Vo,getSceneName:Qo,go:Ko,onSceneLeave:Yo,layers:Ho,getLayers:No,setLayers:Vn,getDefaultLayer:Go,addLevel:ho,getData:M,setData:k,download:vs,downloadJSON:ia,downloadText:hn,downloadBlob:Ls,plug:I,ASCII_CHARS:$i,canvas:u.canvas,addKaboom:Lo,LEFT:C.LEFT,RIGHT:C.RIGHT,UP:C.UP,DOWN:C.DOWN,RED:X.RED,GREEN:X.GREEN,BLUE:X.BLUE,YELLOW:X.YELLOW,MAGENTA:X.MAGENTA,CYAN:X.CYAN,WHITE:X.WHITE,BLACK:X.BLACK,quit:Hr,KEvent:xe,KEventHandler:Sr,KEventController:Bt,cancel:a(()=>ea,"cancel")};c.k=Ge;let jr=t.plugins;if(jr&&jr.forEach(I),t.global!==false)for(let L in Ge)window[L]=Ge[L];return t.focus!==false&&u.canvas.focus(),Ge},"kaplay");var Nu=Lu;Nu();var Ir=(t=>{t["Game"]="Game";t["Preload"]="Preload";return t})(Ir||{});var ot=(t=>{t["Bean"]="Bean";t["Bubbie"]="Bubbie";t["Ghosty"]="Ghosty";t["Pokey"]="Pokey";return t})(ot||{});var Fr=(t=>{t["Bullet"]="Bullet";t["Enemy"]="Enemy";t["Player"]="Player";return t})(Fr||{});const Gu=200;const Hu=20;function ju(t){const e=add([pos(t.pos),move(Vu(t),Gu),circle(30),area(),offscreen({destroy:true}),anchor("center"),color(0,0,255),Fr.Bullet]);e.onCollide(Fr.Enemy,r=>{e.destroy();const s=r;s.hurt(Hu)});return e}function Vu(t){const e=mousePos();const r=t.screenPos();const s=Math.atan2(e.y-r.y,e.x-r.x);const n=s*180/Math.PI;return n}function Ku(t,e,r){const s=rand(100,300);const n=[ot.Bubbie,ot.Pokey];const i=add([sprite(n[randi(n.length)]),pos(t,e),anchor("center"),health(100),opacity(1),area(),Fr.Enemy,{speed:s}]);i.onUpdate(()=>{const o=r.pos.sub(i.pos).unit();i.move(o.scale(i.speed))});i.onHurt(()=>{i.opacity=i.hp()/100});i.onDeath(()=>{i.destroy();addKaboom(i.pos)});return i}function Yu(t){const e=new Qu(t);onClick(()=>{if(e.canAttack()){e.update();ju(t)}})}class Qu{constructor(e){this.attackDelay=1;this.lastAttacked=0;this.player=e}update(){this.lastAttacked=time()}canAttack(){return!this.lastAttacked?true:this.lastAttacked+this.attackDelay{switch(e){case"left":case"a":t.move(-zr,0);Wr(t);break;case"right":case"d":t.move(zr,0);Wr(t);break;case"up":case"w":t.move(0,-zr);Wr(t);break;case"down":case"s":t.move(0,zr);Wr(t);break}})}function Wr(t){setCamPos(t.worldPos())}function zu(t=center().x,e=center().y){const r=add([sprite(ot.Bean),pos(t,e),rotate(0),anchor("center"),area(),Fr.Player]);Xu(r);Yu(r);return r}function Wu(){return Boolean(randi(2))}function Zu(t,e){const r=width()/2;const s=height()/2;const n=Wu()?1:-1;return{x:t+r*n,y:e+s*n}}scene(Ir.Game,()=>{const t=zu();add([text("Press arrow keys",{width:width()/2}),pos(12,12)]);loop(5,()=>{const{x:e,y:r}=Zu(t.pos.x,t.pos.y);Ku(e,r,t)})});scene(Ir.Preload,()=>{[[ot.Bean,"sprites/bean.png"],[ot.Bubbie,"sprites/bubbie.png"],[ot.Ghosty,"sprites/ghosty.png"],[ot.Pokey,"sprites/pokey.png"]].forEach(([t,e])=>{loadSprite(t,e)});go(Ir.Game)});function Ju(){go(Ir.Preload)}Ju(); diff --git a/index.html b/index.html new file mode 100644 index 0000000..c767858 --- /dev/null +++ b/index.html @@ -0,0 +1,7 @@ +Kiki and Boba | remarkablegames \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ef312992cab0a0fe349b8632439ff7294a403fe3 GIT binary patch literal 5791 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 literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..24a695d --- /dev/null +++ b/manifest.json @@ -0,0 +1,15 @@ +{ + "short_name": "Kiki and Boba", + "name": "Kiki and Boba", + "icons": [ + { + "src": "logo.png", + "type": "image/png", + "sizes": "72x72" + } + ], + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/sounds/score.mp3 b/sounds/score.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..e068db0011f7fce825e6a48e6c0ca5473bc5253f GIT binary patch literal 1480 zcmeZtF=k-^0p*b3U{@f`&%nU!lUSB!YN2Otre|ni0G5Ri|9?9iK;lA}o_T5cKo(FR z0~-Sa>ud&BG?0Z3CZK_>=-?JQ_>TraHUk}*40NQSF^B^LDohO!ChKg@%l2=H9UZ=+hH}p5p;d$_!Q)1`bocBjLoCI3b zEoRg(GaPvI*2(;TpuvLz3yFUL0xXLC2bt%8sFAEc01-t z=9Cc6e}C&Hdl>4U=o5Z%uJOXHC(P=)Gd$lU2nsvrGS^=$}XPH=W<5_4C8+Rpv|gCd*$q6W{&6ZeMF|9=M^VQb)i@G<|-w+6wg`FS;;O)oh~d!8(n*V7bKVJ37qbif;)~${8z9iq?<*9jd%m1xY z3P0~Zz3cwVyZ?jtzpgAX2u*cO-?U}HR*@xoDH>lBlY%w5o-$tf>iqMJn)bMmVTIHGQtx18EQmq$F+>WN5`~Urk(-Gb|*)~gWf1UMN z?YaHAtN&iv-*=j`oq^3&;0&Wt&{vR$SR1%QErkY$u^C#O_TTHv@k9S355fP7(1%kSS&ack8B7yFlWz9 zXC`)DJD1l7oF46ewExZd`c?1$zjikJ|Nobh(^elxUsq#LJ_scqfIK9{e1L&*2`~XF vFff=jFfgzXuN_GxIkqEdrxp|Bp$e*ah*~b9&>WD57B*8OhA4ChwX_2O2~kgT literal 0 HcmV?d00001 diff --git a/sprites/apple.png b/sprites/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..a7d81ff68a6faa23d9727aa785e4c882b1df9de0 GIT binary patch literal 512 zcmV+b0{{JqP)Px$x=BPqRA_({zrUF4aL))Q(GoC)s|Y1AQlR1{f=OrvKHsk9`dr#bv;=^|IN~9p84$zA z5i6@qQATG&D*@n~kthj(4SZT!!lo!oq~6Iol~;?5m@Bn*t*7JpF3E@@YYHsm;AGe~ zl0~Az#X}l;PrEB0PZ#pq>-QIW9?J|WLP=1SQWa8g!E4K2%KZDmWkFN9BxDhg$|Xg5 zCAdnhWoXNt%djFnmCq~gmB7lZRG9<7c!?3uTPab!(+IGaQ{$gJvf&N(i9HO6*(E48 zIs3(4_9jIzc9CrCBH7qQvhg5dU0Y8rlzO0fATw-6vdM5O z#Iih*6=}_0s0&;H(P&~&?`y5K;A+~}s*Kti>ZN<95kTHD^%9akBdRTn4LnLn(+;=} zN!3$j*fNrORdtuUmWsx30000JP)Px%FiAu~RA_uNf$d-mqXQbC4>*Skpab@l9j_xj!?$*sBW?lI@LcFtz^R}Dn80(uy`W=J1=vV} zc|lVPns!c>^SwfIa>%()I!}T303DB$t0*Fg%)kkJrln}caW<+w%Ax4J-wA( z@F+m(!-Epl=spy_7iV*M%-?B?0Jc5$+)Mfvv{YOJv_^G%hbNV$01J4|!~Pc1z(~iu zob%M>Cn><@_PDNcH#()RTfT6JbD{F)|DG-$E@N=Psfj=e<>Wh|+dd7x1YpPLy#BES|Vx(4I=Y4-aAKj&yIP z+||T0f#*)9jl*qgZp`eT6D$&;#&F}*+$F0253i(MHQ-cUam=EsN+#-2zdTqto?zIc QZ2$lO07*qoM6N<$f&eol?f?J) literal 0 HcmV?d00001 diff --git a/sprites/bean.png b/sprites/bean.png new file mode 100644 index 0000000000000000000000000000000000000000..66637b6b328e245821c82ae745027d58e520bb81 GIT binary patch literal 708 zcmV;#0z3VQP)Px%en~_@RA_qFA% zc@O_HPVC!%_mi~u*j-nUsM%!k^t8V{E>+Z6N`;$xK{-VQA;csTl#(X^Zs;z6OIhH} z&{EjdZmsq{Z1<|`wcu)K39JQ_lQalYcolRLa5OBYrT|F5#n2pZ8?bdz@L|w>11^QZ zH-R@oQ@~xrmePWcII|%DQ{t+VjKHNFi&mq@X+Hrs9#yh8byNFy`sD^ zAMAIkIlbDg-2==Ds;2$e+kxbzLOLMsH8R5gB@?u#Lyf2Q3ri|Dbf&W27fjFTq3Z)W z*-PTw4|5o#(g5r9v~U1!!|hMD#TR$lLMnT2z3@IX(0n8n;fC z_MHCt`VRBjoQ`2$07a%fCEmA90M}}$r^KVP6RAJYShl;K+uGns7W>0qPOuX9WP5Wu zqU|H5(g$>OwyD8KU0+JNPmSKZJiC^e(?Po(MBSWI_NSx4tvjY_XaN6NlkCktt`F`J zY(8@$9TYdPEMNCQ8-Q*O%yHs^7SRAa%z{Viib-GphvOIYsB?MJLaLAe0000Px%7)eAyRA_A*RywXAoZ zJ8KhuDN+>dnf>PB%$NrLfi~;ypt=5fJ2%`l>;+3m3yO&fz{7xh!KT9C9|F780KnVpyUBJHaBWWml$W?R0Fxe14=verB+?EfT&81LvVI4i%T)NAGyvMZ#+1Tb z`c4JN`5a4~>q%?RmW-aUJfQ)UJ-%6Q2Pyz14>Yd;N$sov^yQfgfJcd!!fOU1a)6=6 zJ^;TxI<_xeHey)<)&NWaJQfD&VKBR1rJwV0y`7t;#z3~OvzfJ&<=fSb27$)VfBP8G=SkI(VcrK-(t z90chZR4*Gn9&WKw&5OjGtsF3xeW}pb%hEpQpo66U-%tDF#3q$#O8~GPL)_z1TJ|`O?|GJ@M@HGPUyk7an-V?&;9)vC3Qxuj#7C9q2wH@r*Ww>OiTDy sf!BauO5$1lnVUKtKc7)da`<(z^8f$<07*qoM6N<$g7<|HM*si- literal 0 HcmV?d00001 diff --git a/sprites/boom.png b/sprites/boom.png new file mode 100644 index 0000000000000000000000000000000000000000..62898761d2dec71fcea2e931eb7c5f6ea0dc2ba3 GIT binary patch literal 1778 zcmVPx*tVu*cRCt{2olSBSIS@wE1P9;->{&W|6VBMH%Dr2JCv zt-#T4S4n!6sh^Ub4B!`^KYjUe|FeJp`{!xJwSXA~4`y~O<_!d0!^hPZ0Bbpu64t^K zaZ_rgBzn$=0^g9zSBD&$Up%i5L+r5p*3CZW2nxtW9Cf9t(<`WBIW90-%r2 zpT7JUDdyGRcKt$l2Twj>W=cu)oKKq3+T9jzmx$>dDPb-t8f{H_r7r5K6xNLBIUD&t zXKlZyrjHhlm13TuTAtBKlh)RvHjz#myB{)*^9YY8wt}FM#AM!c9`b4J5j71pdP;V6 zeXq|iQzItPc^+xg+R{bbW`6{T^yH5eElW}BDnv)RAdebw>srwp5gM0*n2g+xM>ef( zNk>Z>^y<-E1u@Tv-c3+KR?b#R8}^DurX=Rsbs(q@Y5SaKygt7arMR>DqEY8BqYy#% z73sQU|KL$&dA@OR#E1$~ik3%|POU@`%##_i%E@_F$*qleg`k2q#5 zT3f=c5qOO1W*5_}d<6XVS-3_ja(a%^)=(Q2YDXz)tg(m?HO-K-iV>+BV#Xqhm}ZFv zgl6FV1_)xtB9fS92_omJ2Hq1zkuo09#55yvHq#nK5i=eU#WWL&oU8krC0tc1GF$mzfEFUBvTq@+g{@E#(@aFpZ0`cX8kEE| z6Oj|37d0`>kP|jQQA{&|c}|7-O^A!Cm}W#y*qF#-njt47M*UnDNjXVr;Rb0wtC^0dRTmjS zI!0>Yo|XY11wjuZX9NlFK}zr>;%Vmhd^C$EBO<~qB1`(TN=yU-;< z1o%ZXN#A`bf&#>m^sg^NP=G(IT(?^#rx}96o~)4c@Rt!3;Fy_`KKvyF1vsZx)LKbT zKU}i34@qHXMn=-h4AtVL(NspvWL%c*$ zfI4a(IY899n<7AtK0t;Nns~i z=0AtLBuW$o=-;bo*ftA9QP>I31ADutQc6Hj$i$2jv%41|)IypI3amV?{%HB$l*4mx ze>mEKNdRW^r7V4AEX=X<0JB&TAzOAsn6`U0J1f8{X3FTf17C4CC|7SKqPWHhC6(R`vmZ5SYCPXKikZ)O@)&k5VvW)k981=W{nt*uCR!LMilc5FKMIP&lyD* zxI#?D=vYD|L0blXBGMwP!hLng>Dh>~%6PPx%K}keGRA_ zn(88=Dfvbfs<%^F5*Xe>lpl+TdN{33TT8lAem`H+;1bcTBne7hTJE4_*ZzERpWZ#x zl5O>i0y-J>GVZc0kSYCxVy{^e<7;$?w2kL$8ZefzEQB@ETXbttfLXKDr3y=7BNhtW zd?9%)T#Qi<*a%r+yIC1Y^tjzgU{vf|S9SCEq8XpHs4N6Qdq~^2+#G}CwZ_iFvI|fu zZM}fI0F_7zi>18#R?78qYL>S|n;=~haXxI}Yg#qnneYGr002ovPDHLkV1iQuB5MEu literal 0 HcmV?d00001 diff --git a/sprites/bubbie.png b/sprites/bubbie.png new file mode 100644 index 0000000000000000000000000000000000000000..913458a3686a1f725bc1716f74ff85aee91b83a3 GIT binary patch literal 23981 zcmV(`K-0g8P)J^TgFm)F@uir^T;~JL(J{fxvp*W=M+l@e7)pZ*)VM~r$KVdHeB8#56J~F zM?N7(O%6!Db#=+(H<$Asf4OXCQVW3J?J4A2SZZOpVCv*aazxk4a$_F%OM*&qCCxm_ zGX@JOBoK!H31w_TgN+z-kvnVeo2vVkQKCoYZJ+{^jywwVMyZzBRbf`CD||Fm+`a$b zr=`wJd)rkXTOi_v>}X?#HANg5ky^nI)V|CvW7jRG2X+a0!XR*N~?YIm3efuIrz zMjjh&MtTt)ttXW!aem<(Isw9^y6BdgF+c#~*>bGCh-hA~nw6%3ggaj%nLxMi9 z(qL4$n8rIFE5Luo;iPdRjZeF>GEKAR%^fpg>U7=gQ|F<&dK`+1ONh=(WbH}lbUN_? zRaM1nJGX5`b5j$Zd*U%|ct{PUsvUiigbKcATP0*Is(|i`U;UPgRo&y~RzV#qMy(R-0`+ zy^$5kOhcdH%1qMf%qEjr$uBHKduuCNTbdCGhc)`%AiXC_=iNb{{|t?Wj}_qL9H-N` zS8p)be|XO?To+z+nK3Ind&uhbbVp{Al0JQB>;_mV*z)yyJ(&3glOvU&ucwEE*jvAJ z=G=lvENLPnkzJXYQbtAw#*Q7U<&}()4Mw9l--L-1#X0%2-JPBA`FwchpN}CJ2!Iqu z>+0z6(%+v=qg3GIK=Z^OZ_sGZ&dnXz)zz)`##OB^krX4S62+$@nN0mW(&1NApW)B9 z`T|-lHE8=lG%()uey4OOtLFrl;Q6&(09h^wHW;^ zrl!!KvA!PvbLACiY}m`^3nb!kjxYu&5_+p>T$;sUP#GCJ)N${+&0$AxTj1q?Y|Dg^RGQW55@RINo!?OM?WD**f z*qKQ9>@HZa{5pS@qX~yj5#KZXh>`;M=v?7Y2wOIOfE%v(B)lFE)I=g`&CP`xi|OT9 zSW6^Si8zLoI;F}~q&Ji)&@Wr-|Evuz6DZN*u+d1_xzx1JdOR!vQ~ z3Qm7vV0yJ}-Pf)e-{KF(my^s)mt1pQdFhxj3R@%##55Yqr}xI`!^{C<+DPH2{w#xd z1tk8dPa*f9Lh7X{$7?M37>OLPXqaxJN4TC5gpI2g3V zqY;o~qn-ixc{J(l%<+~d-0Lw`ypvy4Vu;68)3}<+*%Xoq3)M-ouu>Kv|9&6}Fw}<_ zrlr9+;0SQYal+y5sOKMOV2{}^rz`4gC~Gnlh%R*SK;v{ZNM!bL)0 zZ2Sfe_0odjpPI08qTmG0QMUR+D8}&|?9}6F $SWl%n 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 Y00000007cclK=n!07*qoM6N<$f+5IsO#lD@ literal 0 HcmV?d00001 diff --git a/sprites/cloud.png b/sprites/cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..05f93c9820cabfe697bedd52a508838a09d4efb0 GIT binary patch literal 426 zcmV;b0agBqP)Px$WJyFpRA_hBs?AqS{D0Xd6pf|89I*0@kg%HuV>r|2d`2+@S zlu)|1U-sVnoj(osTJ(in91(7VH9?dCsl*#FCWtT~wQ!e^5ycG%i65td)Yj|y2LFRh z(4;3YLKPpo2QnI!07^tD71-DA9^pQqG`Rf>b~fiylvBLHX9C)QoXZi1ctgwtZw*LU zmEE>D#beq=jSjZ4SQX|LZwRFTwF->Wfa)l<3Ui2$u}VP7PKMHOwCz1WDJZrNkTCj6 zSyLc&L__zM5Dz_5DM8gNgb|qwmwTNkFaQA+oOmuA$NlesDZQnrIub z=K)--43IohxwsQx|G@0uYvWEp=?;|UHlTC|O0zNGYK2f!&hcx+I|XV@flt?EY5+8- z|M)}4;b-3-$Bycw2H2d%49pZZwJ&-sUL$tlC%qY}0rr=pQh=8GPx#?@2^KR7i>Kmq88!Aq+(edH@&hjdAA%Jdo$|Kwe;W#?0QuT)^lGgG~D=6g4sY z)r10%-(i^I2xzm~KTtf?I1LWP#b7B&17#a6AOxH>v;axKWe#+?9c1Htc8!MlnWDRTx$A!wfz3=#i9kY=*naPqR;3FOk`&;^G-Ll00000NkvXX Hu0mjf^7MYV literal 0 HcmV?d00001 diff --git a/sprites/cursor_default.png b/sprites/cursor_default.png new file mode 100644 index 0000000000000000000000000000000000000000..1a741a478701ff63f3a5ebffc04b8c0a72c6b775 GIT binary patch literal 263 zcmV+i0r>ujP)Px#!AV3xR7i>KmP-;qFc3sh4!{XmbN{2T<^7|&wo)$@}s;DTF zYHncYrtp2XpDX*m3z&jZvKTReEk<0y5(8Plhye(^9m{Kc>}NAv1^y~!gn~EG3Q*gz zB+aS7XtWXoE*)z`f-M^ZnhxACGNEL(XOEgoj|EHPrn-&IA?lcmQWEj4R$KuBQ;9`8 zriyQvrpu?2-%)d5s81&g99@*~%8kJ_8;Px##7RU!R7i>Cma!3lAPhy-33LLjb^lSY)(Lb2th|#LLI@#+{t6Iy2}kfZ&EM2g zAIE<7aBM$Ua!oN9gKEOj4JfD+` zflE~#9Lw4yV+_s)V`a4+E*OV>O0Q=RMklS~X;^|jd}6cM{Aw zHpzTe#?!E52auB3`e5~q1sAhOBD0sHY_JBLGK4IrCQJ! Q7XSbN07*qoM6N<$g1Q}O9RL6T literal 0 HcmV?d00001 diff --git a/sprites/dino.png b/sprites/dino.png new file mode 100644 index 0000000000000000000000000000000000000000..edee6547cd154d0dbe6f12c3b8f83117e093e607 GIT binary patch literal 965 zcmV;$13LVPP)Px&e@R3^RCt`_n>%hBF%X9THFN;y1Wu672Amu~HxP1x6lvT9?o#CpsoV)^(xk`* z4Bfy7umxD1;pha>4V)sNKy&$+8P1R^=K~DbYw_{VaE8O(70`f_&mJr#BsFo4 zM_YUI`ex*AYJheMSmQ%TDaOI}*kt^!rzK-}vw1I(9;(Y2e)6?+a+160RONjz0_3aT-< z22e>FoPF9CT@n=BpHi`$GdcN#R8Lc5*2xT;2XIvqnXdf*DXgqwR^uHg3(s53>Lu!DW zhqbrR?QS#7YCHb${v80|`t}Y0FaF&mq+{1Gq%w9m>6o{jXonM@BkY&@^tISAlTqbH zS=G`P)Px$^GQTORCt{2nY(erFbqIRp9jze>ea>PO*}wG$z_xb;7xo^=iVE51Epe)VMq!D zK>?8Xx;U~7JbdVnH7ha>(_H$T=j&lx#Nudrb4Y6;{5S|;y9C4x)< zH1Y3`FVOwoKHnFwp^!i#AeTHe;T$;`wGyfYv`*e9C89<`m4G#qcTh_}3rHp3D)Eq* z2#kaS=Eb>_Pk}jsij7H1o?;w|1V~EWQ7Zv80zTYrU;Fyt4v1BsJ9!`MQUrB?^yF)( z9swy}3xX1$rTUO#aZ$ippYABY6ecTR3$wpez|HIcEXiX+bM;G(#NBrQSb&!58xxN; zwF{yGG;RJ`{>_Ev*$;v2g1!TmF3?(iV_>oW5wNG(ckFHi!Xh7Y7fWq_f4N~|9EWLk z%g~1Z@c))3VCmPQRJ^&<;CBS1&p+g+veY%XLaNvSkmO6Rbp=lfkkgD80a8#%h<1Rq1=unkH6s9(P$Fv_raAjo zSQ;+5*jbP55^Ie7x4@Ky^3;q#D-K#u04jP1gb!?a{$unG;0}PBE`U1#Zn^;O0J!M_ zxC7v(3*Zibn=XJm0B*Vf?f|&4{R@$uvwH#2Z-w{5^YySlu_nTX#(;SL00000NkvXX Hu0mjf9)A4Z literal 0 HcmV?d00001 diff --git a/sprites/egg.png b/sprites/egg.png new file mode 100644 index 0000000000000000000000000000000000000000..f37a3642df8e05876adad01d993c33e8f9374471 GIT binary patch literal 430 zcmV;f0a5;mP)Px$Xh}ptRA_UZ$XzDd=Sidf5p|E22HYt{p!?>;A1nJA8E~ML#?c4Ce(rebxU%ktfefdJDO>)t~K24*0mk$rRj!t#w*+XKMPwV*%nVq YKhiX!=@9Qkga7~l07*qoM6N<$g71>L=Kufz literal 0 HcmV?d00001 diff --git a/sprites/egg_crack.png b/sprites/egg_crack.png new file mode 100644 index 0000000000000000000000000000000000000000..7192a747ad1c76aa10c6ee86175201cfd48a986a GIT binary patch literal 491 zcmVPx$rAb6VRA_kN+)v|z^0WENk*R47Bce<)EJxCLv z$2ks?NC(v*ORqx-&I=;7?@4vg0v7?|Vk8$u2d&OUQtIiC1@xwMWV*X!(0Wk>Bxg(m z$ThOwF)H1)%nn-RNuR~VqMh`1n2C`DcaX@J(w>WjJE#RC;VgnW7@bzM^CF`!>1W*2czN6$IB<|AbL8HR3hVV)SrTjhs}e?)YfVM zEgeN3j-r~fl4KMH9F@{LJ@Lq|$(+Qw?#jhC~A&P#2mu5AIDrz^s0NSv7#O z_IaGRzW487w0|E zgtXL48rQT3dDNayx@j(p>?9p697dpOnE{D%1;og(kXE!%tqv`1xrLWwJ%SdrS7l*` hf3r}l2aDJ#{R2FR<9ky2SfT&`002ovPDHLkV1gL8-LU`w literal 0 HcmV?d00001 diff --git a/sprites/ghosty.png b/sprites/ghosty.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2f3be8338e65403790fa14722a417a3b3b9609 GIT binary patch literal 586 zcmV-Q0=4~#P)Px%1W80eRA_^8CbE-1-4 zl&g>vlELBFqChzgl(3H}meM`<@cDSg=SHfmR(q-`he_fvrVS9bI-QSW(2>XU4(B5; zy}0!$5=AKFNX)sK0|Y<-$~i4iZ8-yki4-9TRLn;EI7Lo5jw4uIDHLXRI$U0zziih$ zkW%+3&be~P@+eapgSYEGq@f06T@A>(8jy80AnR&C*42QlOMKcceH~m%A|UKN#+74W zl=mU-;ILDUb8(1W2bb;-fC;2^3tF<@>^D~bli=Pz10VxYzHgRnOFA%bw`_}nq|woC zt3}AV{wI+3XT*}K9wBYO%|7Ix!?^p;yiA+>@|sZ^LJrh)qU4edAV@ii15_tV!vK5( zX*ht@<-$-i=4TGAI|!wqWHdD*uvQ3CwZmLV4ybRnvChlXnT`+uJxVUU%>x18Q0uw+ Y1vL}@FQf2gXaE2J07*qoM6N<$f_l6Eu>b%7 literal 0 HcmV?d00001 diff --git a/sprites/gigagantrum.png b/sprites/gigagantrum.png new file mode 100644 index 0000000000000000000000000000000000000000..039dc9f756b88e7c7b42c8e030a218c62eb96b65 GIT binary patch literal 1239 zcmV;|1StE7P)Px(kx4{BRCt{2oxyS2Fc3u{O$v}Jkk4{QxupmlJSo5j)n}jW3hWM)6JuHe34quI z{$l@|$srz@0`%~gAPCC4K(aX=PS@L?eSE#`dbFh!6OC+5Oz0XGWdG{j00c_KTEwMj z4`OfG_ijK7j)&8A{;%d(FXwag_%+9D!LW&z`0!&=tpY!ZD5XYliP-1M<;VZgCuBn; zdW&4?v>p$qE3$0ZhAq)5u{qqPIt1KgLpExT#^gy7E3%24`HR#vs%7pa7I7p)~ZB{T=EcJz=9QMx60zFb5kPsbXC zu8EdRv!;~VWFw>+D$$6NN1>Z&smqO&+f39CDOg=mnD;{y$Uu7uaVet?K)N3 zw+b)*CDg4xTG!IOZcwcCXN&BjUr0&reb+`>HgbPTWoN(G$~GU3#f_dU^+!dt70Gi- zgd_K3qISJJ`9h15N2E5{t1qHtENWygE|^d<9yOnRbRnjhoRU=UQ!gN6u$X9;Z5!mKnx%UHa%Asg zKO|!?_sT>MLh4i--5l6+j}+$yI&@3)(o>Ioj%qt=A?YGIC6lt{n9kEppS_~Me(YP# zxJxBl9~6=gU5A#O9g8=A2}XQS5eUjUz}zME!nY4WHHg&l2OZdZNFOuf%l^U z(HPWfqH9O0g_18-#af)NMMR^PRq~BWqAjFRgPMM8r@C6S*EDPNTT`}pqP?aWohs2x z^EXlhTr1U^MSGQO717e|wQNiGTjO)wB-(SDd-Xl{eV6WWi|rX>n&pq1yN@ns5EP64 z{rAsZ1H4LZ&GY3_^yThzic5FT-I~2m8Li)6Y6kxC^|mwp$5VQPT*+?RRxMhyvnA&# zvhIS3HcUy#C>osGsPK$ZdZixcomyQ{32? z+Xc$W;x^z#v(m@_FPg|e(N3UfCs4E#DB1}W?F5Q;0!2H)q-d^=m19ygDaV9pE`!!% zLNuv|qMbm|PM~NfP_z>$+6ffx1d6V}(sN-HU4Z4kvPaQQplByhv=b=W2^8%Figp4; zJHgBiebmJXE1M#iXeUs#6HJty3AFNUrEG@~!aqihWP2^+`D*|G002ovPDHLkV1iNT BQ-A;f literal 0 HcmV?d00001 diff --git a/sprites/grape.png b/sprites/grape.png new file mode 100644 index 0000000000000000000000000000000000000000..1427dd4d315429a4c2bf90b72423e4669fe3d59f GIT binary patch literal 562 zcmV-20?qx2P)Px$>`6pHR9J<@n9Fg)AP|N@lLFE~?m47_bdU~GLB<7TT!A}q2d=;e-PM6QNKR-F zUf6$M)_=1s!N$VsWU*Z05C|I0dO?bz^#97InVIQ9cAOf4zcOC*d|k_C*>%lcH4(SqV zJ*#~Q@284P8?sbCAK$y*=ljJv$EVfP&mqh;?~7mWxg72s{ix?(zvjmTU>u? zQ7*K`)UwXm1SJug5JMxsMc72@nKT%i7DMP$5m8wRV}HJhl`{A}GntiKQ14Uug9L zp9^@&g501ug+iqy2MfE&YlVV^-+59(Zk46_2UpAzz5(@a-~a#s07*qoM6N<$g3tc> A8UO$Q literal 0 HcmV?d00001 diff --git a/sprites/grass.png b/sprites/grass.png new file mode 100644 index 0000000000000000000000000000000000000000..342993e855683703edd99f39ba195dabab2ec9ff GIT binary patch literal 543 zcmV+)0^t3LP)Px$*-1n}RCt{2n=NueF%(AgI$b~onhIP!4vS(Z?4T=P2kZn@i>t>~P+h?eT6LKa zLYmwp@4GL#M?Km}xZj!lGV=yw@%r-iYdYY3ISurDedr}TK@tXI`U_8-FQ;MXH9Ya` z{$aJ>AnF*6u&tfGz;d-8n!K?w%cjdwvlqASJl3O^OUr zQ{cEgu)_QLiN$*t82dO}B6J8lkNaK0%TR3*vB7uiW$^#+AD>bEtoEBU0o158F~R=} z?ITu%P11EZS4OSiE-50|zXznq7%R9-jEFk{yY-Sal(^Ig?h?x56%f;~1Y?AEaWe%E zLR4UB5s2WAh&lu&tfGz-y3P2ZtzEeO2NVrqLM*teA010;r_)lW!J4LfoAa-$WQb5Y$+N6LKniP<- zxWX5~TEs4{O^$#RR6vPN(C7IavIR&u&*z|1Ah!bv=lL9pY=ct_PIUj`q`o>!A9|B; h^YS#&iv;`i`9JQnoGu~Wrpo{T002ovPDHLkV1i~?<;ws7 literal 0 HcmV?d00001 diff --git a/sprites/gun.png b/sprites/gun.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d32bc6c4d5c3c37e405b9679ad374b5652cf6e GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^dO$48!3HF+hR2xzDaPU;cPEB*=VV?2*@~Vnjv*1P z$tey@pO~WlC%$QyUuS5eQUhy|=r@mfJ|1M*z^bLJ*Ljd*f^(fm ziv^DYyMc05#`fvcj0}K4B02+1&#^6>t6^t);Ob|7NeLj>!uvGvi1zN?fj{`|W0GAs z3ui25mv$(hzNg{Zf5pim7i9a5SMs~p!^!JBPbRUu_Ui4AfKT&(AW zG)qbtOqMfEEPx$DoI2^R9J=8n86i-Fbsy%J_m3E@7|oqQFxBRMBKQu0UPK^U&SO%(gf;%gI9h& z(vUVyu!An=>r*mrS?5$ z6izE|sJFp|J8Xhx{-$Zc;#<&Q=G6}g`D1E*a(Bh`20BsY)g8YU zQWANpTA0sDTHD4N7ytwJR@6>eQd>pE*Aq}v@WlhYPL4D(EnC*ZK&@W8ACii@%CUd| O0000Px%a7jc#RCt{2TQPRRFbsA2%HA6^b0;=#(XO1LuSek)?FzSG>r&=$19paX63-;I z6IrsP)cKQv#P zR|>2#AeV%HkF*GE0%($;z{D=#yPUN9nb`%f#KFp_f|;-YEI8dw%>w!vnRCv)ete71 zgUte_`tf164w8r8q`~R}-SIj~ehktgh`0cj6kIRi5=Dbx%G?3n*IV-b;604nW-$S# z5C`(PB5>pkMFhxMbzcx{e-y9_keY0Yq<;;zUkZXju-&ZC<~2qf1Gv83?gwLV2gZQ~ zKxT!>u%doCVa2iFwgj>Zq{vet;SMALN|N{c3iZb&Lbd=B%pE<`>Bst8#{ z(a@k0h>A^?#7bgV zGEx?W5UW0M6`e>gsbW2wO#{KbgKD)SZGtwmV*<4|uaEi*u}WY-?93 zh**M%1z^lyI-i(@3zUR;0ZMPZ<^?E?MF8yyXd_Dit@At~Q0Iacz|v6|j=6~ZIojXb zHA-hOs2q^6P&@%FL9j%pbEq2t&@KRvme7uYqi!G}WL6BI{4a0KI+hrqJppZq3t%aW zbWT_R?ktkyu#}mz!nrVeN-PA;Q{gd)TYweffTRUj3s@yk{fm>!tF!Q-HWBV#o(9w+ cg8%ybALa!diCWBQr2qf`07*qoM6N<$g0Mw4xc~qF literal 0 HcmV?d00001 diff --git a/sprites/k.png b/sprites/k.png new file mode 100644 index 0000000000000000000000000000000000000000..20d23b2895103c8ef4a5cf298f4476a387e707a4 GIT binary patch literal 895 zcmV-_1AzRAP)Px&IY~r8RCt{2Tgz?3Fbrji4v-CuqPHB2ZqgAlS4Ze3L5{f+QlSA25Q1ryfEOke^cY%DGBj_EdpfR9~%QeK{J=?Ea90IT+?7}boa~(ni$Z;x`h(C zc%YRjxf78x2E+oS!CB5=P7c~Xl2x(R^=h|z7VGf)%i)nDNfGRgY2OZjJ$+ALGxtfiQ*I-L>CHb5M z6nBG*E9@vk0*ddS0*z-na}D{QHJ&4e^>hik3i`{(FB^T>p$3Gmz>^fLPxY67-; z#Z_yGDgwN>$2phyIG?JNLoKx_26&h!w-)ePc)ag`WBYaXbEtj zMs|Z{w>(JNt4WQ>(H95N0&)i;=U8n43w~ROdQ#z)9sZD zSTA+8`OH|jqW<@;?+~uCSH&h97u<=odY2 V>a2q!%hvz^002ovPDHLkV1h2LPZ|V!_w0ioiZeO9(k^XxIDz{JS<@|kN2WyhjUuZ?NYmTPJ!p%f zEf;N9-O6iaJCe7cgbMO>1GNqB6N5nDF>m+NAzAoEf#8k6VMl&U#~euTaC>@H$MJBE zBvR*UQS#d;6%Wn+-@R_`NyJK(Rg}t6=8Efjwgb#orLD35E0gCbT%#|68!}NUYgTLxD@1lw zANRhkEA(&}5SLWsMQ6}e#U+pr)z?UrUd1C52{y2c?MbBoB zRc6dDuVIF%ucCs32y%8*5a|;JV8qBYUf9RA^)Pn5E?lx*N@*3N-{{IPb1-hiJf3?g zF@O1`PRqK~k#lZ(aw$}fj}qTv7W5kRQ6rv?)Qs|t61`S39ZX7HG8LP#C6l(S=0c$V zCWLHZ)qMM{hgz<#!G$TkJ~0>J^O{0v;TE5i+%cEM9q}#lOG# zXwSVAi=#=QCuv3Wt_+)`<6+K<(JXx;>}R)veRaN0`&yhyBV=GZ4`|NR!kF8fRXdIRNJjYV7Wg zZOorU6t#+xFC7oPL!n*BISv4i7#ZzM*RDqj4!)9}9|>r;98*n|evga17ev%`n%Zv~ zCl=J@^@on`jW@Qg$aSIU-$38xeAGO0%>TjC(l^~K4cLgC&!hND3Z0G-PL~s5*WXrD zCSYQE2{Jw14^BW(K$ZOYD?mOjgJ8%y)CZ(?=YDFiG~H{{+f?h9+8K{%;jjCaJRRF_YMgCpvJztvPY1(r~nz{LD$QxH=qEn%*5UK{zAvcth+2 z%pUMwCTAn78+vdA0Kf{tPrgP8P%Gz4UNZDfA_$DzrdU{=MXEW&TFH?VGQx!qrEGhn z73SVk=D6+jPx$Ye_^wR9J=8n9&i!APj~B=KyZt_4?*o&egU0=6T(q8|Z^ar4W)3sL=mWlaLQW z($)Z@+x7nDYybe3bv6>ae~U~?3g@dgP&640n6I87qeM#KeDwgjOMrrVz8>iB<1mp6 zw1(UkPr;?YLiGwt0!rb0aiB*l+(-jZ56-DIB)|_;42UI7Z9*@QD4+x`WgDtBC<`b_ zu%w)8DV3+KG51=Z62Nzpv5mHvA*I%HEmsksL}!A$3=t$6->B z826tPG%C?BxFk@{SmA7>4NGcgCHIMf)WB(MwL(i2E1{BE=QdG0l9qKgm@ilA0Lm_! z5_Tefg=o63^U-#0n{w`9c!$zJZYNj@$(^1yMyc2_QPR>SI=WJJfYfEqRgI^e8Zn|K zb97?T__ZDf(JrbDzO1v6_;NPd^|4B01NHW0J7<ulI2bEY>3OjQScPuhKSI-9sM b^{eg!aWmEjliz?j00000NkvXXu0mjfMt{6j literal 0 HcmV?d00001 diff --git a/sprites/lightening.png b/sprites/lightening.png new file mode 100644 index 0000000000000000000000000000000000000000..8645c7b44c7796244c0c250626e9e91d55a31578 GIT binary patch literal 361 zcmV-v0ha!WP)Px$BS}O-R9J<**v$>XFboA?w_<>9P$6zzi@8{f8$xWr25@Q>mBjUXe!(|>+Ap@# zBw&_^d0Ia6w0xLrhYVW2e!cI|y+#Gf1Pm)s3RVRKtFnb)B^rj+Xc*qd<9Y25_sI4T zuA#MT(Z$1sJ@j(Ep-v2rW-5n!qgA-qWO8A)#LQqfINMirZ*KP3L%q+U_=tQN!H@1a zC>|Z}xo#~kRhYri0Ssn-sg>E61K37!)Dw02f9n6Q?5mAeX5Yfy?JS#p3$2zK89)n< z%UhhdW`Uon=*|_Lh;)xxa1F_< zX3o|0%9TOQ5~XIrHJTTD*=A8QqQ?r<3@Eh<3`ORDtfTk>@TsJKRtCpZ00000NkvXX Hu0mjfS)Zg7 literal 0 HcmV?d00001 diff --git a/sprites/mark.png b/sprites/mark.png new file mode 100644 index 0000000000000000000000000000000000000000..7c57042cbed455ca0370566d4deb03c31280be53 GIT binary patch literal 557 zcmV+|0@D47P)Px$=Sf6CRA_<=@HF)T3Z`|Ian?W3jJ{kmw|svGVBmP-Sw0vrLCN&+eZ^aT6;J3oJ)ju&xzE+iYU z1(!PPr4~2`viZOWuv`|w*_jY{+vyxkz{2i5EKH~=xG=O*v>o{S*ZNRJWs*1;ORs9>AkA{gCasZ5K^4Eg}h zt`FesngWoU4px)xsIsJkxBGPo4d{{Ih6a?VG#Ft4DTgIl7P}_Hab)yEEI9vn*{9!fsVM<~>EIGf>!g5x~uD1Px%X-PyuRA_5eFzIDC@FDnp=!Ct2rVoq`3vstm(Qv0lh(Il`0h5 zwH>Eq=9iFws%gIXl^7}zs;S$Fx;BhmB^_rAi6+AV1(gK0IuQv_P$^(Qd0C~YYT$+MnV+y;;V=}p8)cmW5 z_W?2J=kuMscDh_2K2w%5CyFpRkK;TCVv#7NbDK%2D{Tb?peVj6U|OKlFc|mr!4I(%pE0G39*MQfcqiQ z(g?MJQOb6nlDea{zyi?V*;~u0ai)o-pzJ*g&%V3_Xc)Vy=*EjyVevMDTC-M)MVI#$ z@vpB~(!W5&S}w+)b3e(xusA4>q*7GhkCL_!7iTFC6_+T2q(vKZ*J7an*1@Rw`vn-~ VOMBn0f#d)H002ovPDHLkV1n$$F=7A! literal 0 HcmV?d00001 diff --git a/sprites/moon.png b/sprites/moon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd36c166ec4c23b98f28c6aea1e668478b7834bf GIT binary patch literal 480 zcmV<60U!Q}P)Px$nn^@KRA_yn2F%K%0{%;4r$IAsg_Jh^ z@?w(M?SugBcc-V+_L#3z#4`Y(xg!l!Qtbd%fhCnfuL?`@LZ`sq?&sg%$HT?lmjxXX z{1!0D1FivYO2JxmyPw%XETx52*s}8e5DN;>o#q@)g9UuRfDHW(90m*I19y#CP12y2 z286=4ZmrfV4C5?`115LVVM{gzOX08)rz|NPh6@8p``zjJHL$?I&T^qJEG(yg*er#^ zMr00>(w+4lWIX!2VUQUDK(e!uApiuzX1fY>&TdP@oz}kQ5B8X^Q!{LatCE^vd&KEd z)vyw1gsW0^u`TULb2DrDDf=jLb`8*_OlLiD840Q-m|HIpryg#;RAfd1wbJ&g)u4x? zz-L<&%N{0000Px$?MXyIRA_- zJ|LY`I5I_%A}z5%Z%Ud()|nD5sqCPT{qAs+e1DvVuJl@5*cXs?o{ObqwxP8oI7mgw zFSiuI$jPA}N+doXpUBUT*9*5P5t!KG4>^%s=ebx&#zJfvD+vw~(Yer_j0X{noLmt4 zm63{U&nEx?_|z-yv2hx@p88=LV8xmVW6naR^)p37mB`de7@O5vj;N9K zszfG7?m>xxtppY_Yc1JRSSAN?WJ>O04aRBcdTf)Eiq0A-wj?>E`j<=q$Lpn9nzl*~ z;w?a{rGEg6%3?nQ;CFKtp!PBV!ZUzYQdEXbZkq$%j+iL2G5~)=D0@0H$E#54Fpzcp z=|!sOM3W*G`}%m1HbL_6{C4+Va^CD>p=pIk#>;R^p^A+45Yysnn8ou&iYpl{u4SbE zIdd%|U%<7e|J*rW7c>F#-CX%oUdN4c{cU3=02u*Q~$ru-m-w{n#k|hTaO=pS$DZ%eS_&0*VmV%IMu#2 zZ2e-RQnr<8-ol$Y?LrF}g+H8{Tg!WR4a3_t1}zQK98bR4?hyIv;=@Z;sVVEW0z`g*Tv1jE}duJE3f2J8LE0*nM=vI}#=z8Fu*L0KjjMaMjmoyUIKXrYS z9iX4k;vawH0oRRRKB2`-+tgStFnV3UND#_Ht;z-j%)bMtsWb1WvxH?e)savAEupB-|L~Fem%eKZ-n!K TmGxhMF~Q*J>gTe~DWM4fu;RL7 literal 0 HcmV?d00001 diff --git a/sprites/pineapple.png b/sprites/pineapple.png new file mode 100644 index 0000000000000000000000000000000000000000..894063bf523f44461af3fa59a614e667228aa064 GIT binary patch literal 510 zcmVPx$xJg7oR9J=0m@!fVF$_h2HXI-YeTJdS1!%Yd$DrdtbR2^l(BuN?7$$v+T!0Cc z2gfT}`nJsSt4+qMeJjbbRzR?}o84u**R?z_Y@8kL4vOkRiU=#w;0{{es!ve@d zqJ>L@U}D?rh2#0Kni=;PO;Ei6$yQTNXxs4d^@#=mgv9i2t0({wq8GpeQ@*G>;ga!> zmvTC{FhoC0>uj#PothDRhf^BvsHq zhmf>5gzLM5tqU!6qzb{-1#7)_qAnf|z<^-u0=qu-6lR@Z>q653M&B_&Gl*Jm*rS@= zE>H9v>sLLd)Pj4w!E9g4-oMC+YRhl+7G--cN%BJJeflWR#XejD0GwZ7Ot)pl-!&v@ z1@R>Fq94T8z-9Poz%%g~HmPC8P3A%tq-ECi0~lQH+>d$6ga7~l07*qoM6N<$f&dEU A^#A|> literal 0 HcmV?d00001 diff --git a/sprites/pokey.png b/sprites/pokey.png new file mode 100644 index 0000000000000000000000000000000000000000..aedab376d069612cb2a61f5b12776ff7e49dff4d GIT binary patch literal 27901 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 literal 0 HcmV?d00001 diff --git a/sprites/portal.png b/sprites/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..49b52eb5f267a37f93a5a504f1ff9ece1d4fc8d3 GIT binary patch literal 778 zcmV+l1NHogP)Px%#7RU!RA_bxWg%7O`jNDz~gbFDerzCEko4~oEuUvLmw6fB5Z2owh-!A!Y}9*D`wxf`P8cT$#& zKs+l{#1XCysU2zXI3Gu0LZhKU99$odu6?dHqJ1eY<&YHH``}HfS{y(v1SkT-&Jjyd zh{4XX<95+=+VZMsPAL>*~R{!Bm_oF zbvU&=(a;>%fTZ@2^kPAfNv=U4LhVq6mS0I;=Qw*S#iT)oK(be=QW2P1r$_VcEHcr# zj%tUl4(~=b45^K% zp?{FSrhkx3wcbOBehEanF}A1+h{sVb8t6tvsWgzC#A=!n%$*Pk=y#-Le! zVfnZSKc>8_#}ALaB2deWh_pv5MFkyY$qtD&x5qW@QDL=UyeWljc#l%cqtDewdzZ0HX_l^qwPqw6L{4^i!>2w5NN+sBEERSk$WdTqSlBGzPs-u8jRN| z%f9YQE1K>=(5P@7c%1Xvp)w;9g^?UZBZth5a`2&w6;ZsB8&OK3N4i03k;z=qqHVd# z(?q!?>QWkjyM|aRa`GVp(+WXkOm^)#EV2lA?L8-nQced&qLY2{A@#gg)^=;^Srkd= z?tK)h%jqCVKXDYWRP%W)OMmHXW7^wc52*Arjb61vMP9$Z0MU+oY3|Kt)Bpeg07*qo IM6N<$g2BIA;s5{u literal 0 HcmV?d00001 diff --git a/sprites/spike.png b/sprites/spike.png new file mode 100644 index 0000000000000000000000000000000000000000..94d814edb76754b121c7f87335a07a9a5392e491 GIT binary patch literal 370 zcmV-&0ge8NP)Px$EJ;K`R9J=Wmc0>!Fbsv|Ouz>8?3W@Fq+maKHedr%Dd!md%a=PsUX}C3pPrwv zpny^1Fzxtz-IikA_bpyjroy#ZRK|2~UPfwB$}GxjT4F_b9Mi+Oc?)XAd;HhRI85R}7 zdm%dXG}GR}De-!++7MFT0RXb8$XkQs^kTJ*F4Q6x^{7odW4LBz4=&9r049KFQ7qQ0 zTfHP*h0w%4qqq>#GvLe`hiN|q@Qd9C;Lk-~fh+0KR{-E20RJ6u1+CjsUV{*{Px%5lKWrRCt{2o4ZxRKomqJ4h7JGa~#nG4bTCF(E$xmffFA`wqteR4j_6yk}R$E z^JdfzWqdd*MaH?b7$Hh8I20AN+iO zS@@vo{o`|T|77GN8$AFx9Z^3;)ju28jMRkHXK}huyJqqLi zLBm7RFlY%utL)@?fCU82GF2u*ObFU#sm%l#5D;akPKA*WQ14b>3m}Xl!9o^8nugI$ z3$_~6FwW>#pv&Qu0IZP(z8?@1ggLBIHbi^_`R?Lqinb%P70hZ{P2Cb(3u(EgpzjIJ z!&wFrz^J%!>@85Q83lmXmz&N<;8B;U>uAuW;!4w66Z#WAGZ~&p9*tG!) zASDP30t|pg00smI08Qg)2qU%~hbRC!gcqewor3}76n?B&UqJwJ4KIrE=M5nD@S;$kUI0o7FADLy z381v_BHzx@382*QV{K(v1yDnHkt@q0fSSUK)-pW+s4=`~DO;8Q77tPL0GdBI`G0g) lZd!vdIXo?D1;Y6F{2%SxCn0zfvLpZi002ovPDHLkV1kga^;Q4? literal 0 HcmV?d00001 diff --git a/sprites/sun.png b/sprites/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..3628ee7526e980a52878d5a2d7b787d8fbe1286a GIT binary patch literal 523 zcmV+m0`&cfP)Px$#Ysd#RA_&Fhj%7xZirbfYl#cYC9!2An1*wO}Yi)8;O7ST6 z4r`RB*+w+yEdrKh;0*HT_ttFd`t{xPoD>!cN&&2?1TTRlznFtW0mjO~s)1@j9zw#p z%#1h^f%f!f$v$_rZw9qW15vPSkM{N^S}x`&Vo+Ux=0pu&H=t6l&LNCZU`DA_A(?W2 zjC9bZsMPOu*>*RfE7g<>Q?H?0>i6S$zs$7Oz*Q?jOPY?@`v;Jm5JdJ+F}Ij)VVZTyXBpF_#}1%oqz@!&PDm1y5!~eGuz{S@6JP(MTV%qkgu=4k4sXpq&Ou6{1-oD!M0@?kEP)Px$;7LS5RA_hNk}VUn|W^rZ18sQ$IJ8U4>P&d-{Uez#-qYw#*_D=tN2>@)DP)qP}Rv9;TF773S3PnE1@RS4DL1! z6AZu$w6x7IB~)-U85MG|29w3O%-g}Csiu-sWw;hOE;A{NGlZLEQU#YmSu+w%T1jKs zYEhfQnItg~TSJ_xqyglWfEiepGDTX3HQCZYJmQ^M2_+Yy2Ex|CRe z6P7fE^r=j-E;rE(a}G%Yh(EM>x<-#<9ffjO51}svo+*BEXgt!kYtsFje+&i zh^6AK6Uu(#!5pLp#$E?4F9@yIN=-~y^n5Laln~hsL6OrPzRbg2_h&pJtW3&eBA+ki(`RIM9h!vrFfFndl oZm5|D$`qctg&H>SfB6T&FUqeHt~>aBH~;_u07*qoM6N<$f?>JwhyVZp literal 0 HcmV?d00001