57 lines
131 KiB
JavaScript
57 lines
131 KiB
JavaScript
(()=>{var Xn=Object.defineProperty,n=(r,e)=>Xn(r,"name",{value:e,configurable:!0}),Wn=(()=>{for(var r=new Uint8Array(128),e=0;e<64;e++)r[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return h=>{for(var u=h.length,f=new Uint8Array((u-(h[u-1]=="=")-(h[u-2]=="="))*3/4|0),A=0,P=0;A<u;){var C=r[h.charCodeAt(A++)],Y=r[h.charCodeAt(A++)],V=r[h.charCodeAt(A++)],re=r[h.charCodeAt(A++)];f[P++]=C<<2|Y>>4,f[P++]=Y<<4|V>>2,f[P++]=V<<6|re}return f}})();function Ge(r){return r*Math.PI/180}n(Ge,"deg2rad");function Bt(r){return r*180/Math.PI}n(Bt,"rad2deg");function je(r,e,h){return e>h?je(r,h,e):Math.min(Math.max(r,e),h)}n(je,"clamp");function Qe(r,e,h){if(typeof r=="number"&&typeof e=="number")return r+(e-r)*h;if(r instanceof E&&e instanceof E||r instanceof ee&&e instanceof ee)return r.lerp(e,h);throw new Error(`Bad value for lerp(): ${r}, ${e}. Only number, Vec2 and Color is supported.`)}n(Qe,"lerp");function $e(r,e,h,u,f){return u+(r-e)/(h-e)*(f-u)}n($e,"map");function Ws(r,e,h,u,f){return je($e(r,e,h,u,f),u,f)}n(Ws,"mapc");var E=class be{static{n(this,"Vec2")}x=0;y=0;constructor(e=0,h=e){this.x=e,this.y=h}static fromAngle(e){let h=Ge(e);return new be(Math.cos(h),Math.sin(h))}static LEFT=new be(-1,0);static RIGHT=new be(1,0);static UP=new be(0,-1);static DOWN=new be(0,1);clone(){return new be(this.x,this.y)}add(...e){let h=M(...e);return new be(this.x+h.x,this.y+h.y)}sub(...e){let h=M(...e);return new be(this.x-h.x,this.y-h.y)}scale(...e){let h=M(...e);return new be(this.x*h.x,this.y*h.y)}dist(...e){let h=M(...e);return this.sub(h).len()}sdist(...e){let h=M(...e);return this.sub(h).slen()}len(){return Math.sqrt(this.dot(this))}slen(){return this.dot(this)}unit(){let e=this.len();return e===0?new be(0):this.scale(1/e)}normal(){return new be(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}cross(e){return this.x*e.y-this.y*e.x}angle(...e){let h=M(...e);return Bt(Math.atan2(this.y-h.y,this.x-h.x))}angleBetween(...e){let h=M(...e);return Bt(Math.atan2(this.cross(h),this.dot(h)))}lerp(e,h){return new be(Qe(this.x,e.x,h),Qe(this.y,e.y,h))}slerp(e,h){let u=this.dot(e),f=this.cross(e),A=Math.atan2(f,u);return this.scale(Math.sin((1-h)*A)).add(e.scale(Math.sin(h*A))).scale(1/f)}isZero(){return this.x===0&&this.y===0}toFixed(e){return new be(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 ye(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}};function M(...r){if(r.length===1){if(r[0]instanceof E)return new E(r[0].x,r[0].y);if(Array.isArray(r[0])&&r[0].length===2)return new E(...r[0])}return new E(...r)}n(M,"vec2");var ee=class ue{static{n(this,"Color")}r=255;g=255;b=255;constructor(e,h,u){this.r=je(e,0,255),this.g=je(h,0,255),this.b=je(u,0,255)}static fromArray(e){return new ue(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ue(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let h=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return new ue(parseInt(h[1],16),parseInt(h[2],16),parseInt(h[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,h,u){if(h==0)return new ue(255*u,255*u,255*u);let f=n((re,b,j)=>(j<0&&(j+=1),j>1&&(j-=1),j<1/6?re+(b-re)*6*j:j<1/2?b:j<2/3?re+(b-re)*(2/3-j)*6:re),"hue2rgb"),A=u<.5?u*(1+h):u+h-u*h,P=2*u-A,C=f(P,A,e+1/3),Y=f(P,A,e),V=f(P,A,e-1/3);return new ue(Math.round(C*255),Math.round(Y*255),Math.round(V*255))}static RED=new ue(255,0,0);static GREEN=new ue(0,255,0);static BLUE=new ue(0,0,255);static YELLOW=new ue(255,255,0);static MAGENTA=new ue(255,0,255);static CYAN=new ue(0,255,255);static WHITE=new ue(255,255,255);static BLACK=new ue(0,0,0);clone(){return new ue(this.r,this.g,this.b)}lighten(e){return new ue(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ue(255-this.r,255-this.g,255-this.b)}mult(e){return new ue(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,h){return new ue(Qe(this.r,e.r,h),Qe(this.g,e.g,h),Qe(this.b,e.b,h))}toHSL(){let e=this.r/255,h=this.g/255,u=this.b/255,f=Math.max(e,h,u),A=Math.min(e,h,u),P=(f+A)/2,C=P,Y=P;if(f==A)P=C=0;else{let V=f-A;switch(C=Y>.5?V/(2-f-A):V/(f+A),f){case e:P=(h-u)/V+(h<u?6:0);break;case h:P=(u-e)/V+2;break;case u:P=(e-h)/V+4;break}P/=6}return[P,C,Y]}eq(e){return this.r===e.r&&this.g===e.g&&this.b===e.b}toString(){return`rgb(${this.r}, ${this.g}, ${this.b})`}toHex(){return"#"+((1<<24)+(this.r<<16)+(this.g<<8)+this.b).toString(16).slice(1)}};function Z(...r){if(r.length===0)return new ee(255,255,255);if(r.length===1){if(r[0]instanceof ee)return r[0].clone();if(typeof r[0]=="string")return ee.fromHex(r[0]);if(Array.isArray(r[0])&&r[0].length===3)return ee.fromArray(r[0])}return new ee(...r)}n(Z,"rgb");var Zn=n((r,e,h)=>ee.fromHSL(r,e,h),"hsl2rgb"),me=class ai{static{n(this,"Quad")}x=0;y=0;w=1;h=1;constructor(e,h,u,f){this.x=e,this.y=h,this.w=u,this.h=f}scale(e){return new ai(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new E(this.x,this.y)}clone(){return new ai(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})`}};function he(r,e,h,u){return new me(r,e,h,u)}n(he,"quad");var Le=class Ye{static{n(this,"Mat4")}m=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];constructor(e){e&&(this.m=e)}static translate(e){return new Ye([1,0,0,0,0,1,0,0,0,0,1,0,e.x,e.y,0,1])}static scale(e){return new Ye([e.x,0,0,0,0,e.y,0,0,0,0,1,0,0,0,0,1])}static rotateX(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([1,0,0,0,0,h,-u,0,0,u,h,0,0,0,0,1])}static rotateY(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([h,0,u,0,0,1,0,0,-u,0,h,0,0,0,0,1])}static rotateZ(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e);return new Ye([h,-u,0,0,u,h,0,0,0,0,1,0,0,0,0,1])}translate(e){return this.m[12]+=this.m[0]*e.x+this.m[4]*e.y,this.m[13]+=this.m[1]*e.x+this.m[5]*e.y,this.m[14]+=this.m[2]*e.x+this.m[6]*e.y,this.m[15]+=this.m[3]*e.x+this.m[7]*e.y,this}scale(e){return this.m[0]*=e.x,this.m[4]*=e.y,this.m[1]*=e.x,this.m[5]*=e.y,this.m[2]*=e.x,this.m[6]*=e.y,this.m[3]*=e.x,this.m[7]*=e.y,this}rotate(e){e=Ge(-e);let h=Math.cos(e),u=Math.sin(e),f=this.m[0],A=this.m[1],P=this.m[4],C=this.m[5];return this.m[0]=f*h+A*u,this.m[1]=-f*u+A*h,this.m[4]=P*h+C*u,this.m[5]=-P*u+C*h,this}mult(e){let h=[];for(let u=0;u<4;u++)for(let f=0;f<4;f++)h[u*4+f]=this.m[0*4+f]*e.m[u*4+0]+this.m[1*4+f]*e.m[u*4+1]+this.m[2*4+f]*e.m[u*4+2]+this.m[3*4+f]*e.m[u*4+3];return new Ye(h)}multVec2(e){return new E(e.x*this.m[0]+e.y*this.m[4]+this.m[12],e.x*this.m[1]+e.y*this.m[5]+this.m[13])}getTranslation(){return new E(this.m[12],this.m[13])}getScale(){if(this.m[0]!=0||this.m[1]!=0){let e=this.m[0]*this.m[5]-this.m[1]*this.m[4],h=Math.sqrt(this.m[0]*this.m[0]+this.m[1]*this.m[1]);return new E(h,e/h)}else if(this.m[4]!=0||this.m[5]!=0){let e=this.m[0]*this.m[5]-this.m[1]*this.m[4],h=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return new E(e/h,h)}else return new E(0,0)}getRotation(){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 Bt(this.m[1]>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 Bt(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 E(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 E(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new E(0,0)}invert(){let e=[],h=this.m[10]*this.m[15]-this.m[14]*this.m[11],u=this.m[9]*this.m[15]-this.m[13]*this.m[11],f=this.m[9]*this.m[14]-this.m[13]*this.m[10],A=this.m[8]*this.m[15]-this.m[12]*this.m[11],P=this.m[8]*this.m[14]-this.m[12]*this.m[10],C=this.m[8]*this.m[13]-this.m[12]*this.m[9],Y=this.m[6]*this.m[15]-this.m[14]*this.m[7],V=this.m[5]*this.m[15]-this.m[13]*this.m[7],re=this.m[5]*this.m[14]-this.m[13]*this.m[6],b=this.m[4]*this.m[15]-this.m[12]*this.m[7],j=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],W=this.m[4]*this.m[13]-this.m[12]*this.m[5],de=this.m[6]*this.m[11]-this.m[10]*this.m[7],te=this.m[5]*this.m[11]-this.m[9]*this.m[7],U=this.m[5]*this.m[10]-this.m[9]*this.m[6],fe=this.m[4]*this.m[11]-this.m[8]*this.m[7],S=this.m[4]*this.m[10]-this.m[8]*this.m[6],Be=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*h-this.m[6]*u+this.m[7]*f,e[4]=-(this.m[4]*h-this.m[6]*A+this.m[7]*P),e[8]=this.m[4]*u-this.m[5]*A+this.m[7]*C,e[12]=-(this.m[4]*f-this.m[5]*P+this.m[6]*C),e[1]=-(this.m[1]*h-this.m[2]*u+this.m[3]*f),e[5]=this.m[0]*h-this.m[2]*A+this.m[3]*P,e[9]=-(this.m[0]*u-this.m[1]*A+this.m[3]*C),e[13]=this.m[0]*f-this.m[1]*P+this.m[2]*C,e[2]=this.m[1]*Y-this.m[2]*V+this.m[3]*re,e[6]=-(this.m[0]*Y-this.m[2]*b+this.m[3]*j),e[10]=this.m[0]*y-this.m[1]*b+this.m[3]*W,e[14]=-(this.m[0]*re-this.m[1]*j+this.m[2]*W),e[3]=-(this.m[1]*de-this.m[2]*te+this.m[3]*U),e[7]=this.m[0]*de-this.m[2]*fe+this.m[3]*S,e[11]=-(this.m[0]*te-this.m[1]*fe+this.m[3]*Be),e[15]=this.m[0]*U-this.m[1]*S+this.m[2]*Be;let K=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let Se=0;Se<4;Se++)for(let we=0;we<4;we++)e[Se*4+we]*=1/K;return new Ye(e)}clone(){return new Ye([...this.m])}toString(){return this.m.toString()}};function hi(r,e,h,u=f=>-Math.cos(f)){return r+(u(h)+1)/2*(e-r)}n(hi,"wave");var _n=1103515245,$n=12345,Ns=2147483648,Zs=class{static{n(this,"RNG")}seed;constructor(r){this.seed=r}gen(){return this.seed=(_n*this.seed+$n)%Ns,this.seed/Ns}genNumber(r,e){return r+this.gen()*(e-r)}genVec2(r,e){return new E(this.genNumber(r.x,e.x),this.genNumber(r.y,e.y))}genColor(r,e){return new ee(this.genNumber(r.r,e.r),this.genNumber(r.g,e.g),this.genNumber(r.b,e.b))}genAny(...r){if(r.length===0)return this.gen();if(r.length===1){if(typeof r[0]=="number")return this.genNumber(0,r[0]);if(r[0]instanceof E)return this.genVec2(M(0,0),r[0]);if(r[0]instanceof ee)return this.genColor(Z(0,0,0),r[0])}else if(r.length===2){if(typeof r[0]=="number"&&typeof r[1]=="number")return this.genNumber(r[0],r[1]);if(r[0]instanceof E&&r[1]instanceof E)return this.genVec2(r[0],r[1]);if(r[0]instanceof ee&&r[1]instanceof ee)return this.genColor(r[0],r[1])}}},li=new Zs(Date.now());function _s(r){return r!=null&&(li.seed=r),li.seed}n(_s,"randSeed");function hr(...r){return li.genAny(...r)}n(hr,"rand");function wi(...r){return Math.floor(hr(...r))}n(wi,"randi");function $s(r){return hr()<=r}n($s,"chance");function en(r){return r[wi(r.length)]}n(en,"choose");function tn(r,e){return r.pos.x+r.width>e.pos.x&&r.pos.x<e.pos.x+e.width&&r.pos.y+r.height>e.pos.y&&r.pos.y<e.pos.y+e.height}n(tn,"testRectRect");function rn(r,e){if(r.p1.x===r.p2.x&&r.p1.y===r.p2.y||e.p1.x===e.p2.x&&e.p1.y===e.p2.y)return null;let h=(e.p2.y-e.p1.y)*(r.p2.x-r.p1.x)-(e.p2.x-e.p1.x)*(r.p2.y-r.p1.y);if(h===0)return null;let u=((e.p2.x-e.p1.x)*(r.p1.y-e.p1.y)-(e.p2.y-e.p1.y)*(r.p1.x-e.p1.x))/h,f=((r.p2.x-r.p1.x)*(r.p1.y-e.p1.y)-(r.p2.y-r.p1.y)*(r.p1.x-e.p1.x))/h;return u<0||u>1||f<0||f>1?null:u}n(rn,"testLineLineT");function Tt(r,e){let h=rn(r,e);return h?M(r.p1.x+h*(r.p2.x-r.p1.x),r.p1.y+h*(r.p2.y-r.p1.y)):null}n(Tt,"testLineLine");function sn(r,e){if(lr(r,e.p1)||lr(r,e.p2))return!0;let h=r.points();return!!Tt(e,new Pt(h[0],h[1]))||!!Tt(e,new Pt(h[1],h[2]))||!!Tt(e,new Pt(h[2],h[3]))||!!Tt(e,new Pt(h[3],h[0]))}n(sn,"testRectLine");function lr(r,e){return e.x>r.pos.x&&e.x<r.pos.x+r.width&&e.y>r.pos.y&&e.y<r.pos.y+r.height}n(lr,"testRectPoint");function nn(r,e){let h=e.sub(r.p1),u=r.p2.sub(r.p1);if(Math.abs(h.cross(u))>Number.EPSILON)return!1;let f=h.dot(u)/u.dot(u);return f>=0&&f<=1}n(nn,"testLinePoint");function Ai(r,e){let h=r.p2.sub(r.p1),u=h.dot(h),f=r.p1.sub(e.center),A=2*h.dot(f),P=f.dot(f)-e.radius*e.radius,C=A*A-4*u*P;if(u<=Number.EPSILON||C<0)return!1;if(C==0){let Y=-A/(2*u);if(Y>=0&&Y<=1)return!0}else{let Y=(-A+Math.sqrt(C))/(2*u),V=(-A-Math.sqrt(C))/(2*u);if(Y>=0&&Y<=1||V>=0&&V<=1)return!0}return Vi(e,r.p1)}n(Ai,"testLineCircle");function Vi(r,e){return r.center.sdist(e)<r.radius*r.radius}n(Vi,"testCirclePoint");function on(r,e){let h=e.pts[e.pts.length-1];for(let u of e.pts){if(Ai(new Pt(h,u),r))return!0;h=u}return Vi(r,e.pts[0])?!0:vi(e,r.center)}n(on,"testCirclePolygon");function vi(r,e){let h=!1,u=r.pts;for(let f=0,A=u.length-1;f<u.length;A=f++)u[f].y>e.y!=u[A].y>e.y&&e.x<(u[A].x-u[f].x)*(e.y-u[f].y)/(u[A].y-u[f].y)+u[f].x&&(h=!h);return h}n(vi,"testPolygonPoint");var Pt=class ui{static{n(this,"Line")}p1;p2;constructor(e,h){this.p1=e.clone(),this.p2=h.clone()}transform(e){return new ui(e.multVec2(this.p1),e.multVec2(this.p2))}bbox(){return ye.fromPoints(this.p1,this.p2)}area(){return this.p1.dist(this.p2)}clone(){return new ui(this.p1,this.p2)}},ye=class di{static{n(this,"Rect")}pos;width;height;constructor(e,h,u){this.pos=e.clone(),this.width=h,this.height=u}static fromPoints(e,h){return new di(e.clone(),h.x-e.x,h.y-e.y)}center(){return new E(this.pos.x+this.width/2,this.pos.y+this.height/2)}points(){return[this.pos,this.pos.add(this.width,0),this.pos.add(this.width,this.height),this.pos.add(0,this.height)]}transform(e){return new sr(this.points().map(h=>e.multVec2(h)))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new di(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let h=this.pos,u=this.pos.add(this.width,this.height),f=Math.max(h.x-e.x,0,e.x-u.x),A=Math.max(h.y-e.y,0,e.y-u.y);return f*f+A*A}},Us=class an{static{n(this,"Circle")}center;radius;constructor(e,h){this.center=e.clone(),this.radius=h}transform(e){return new eo(this.center,this.radius,this.radius).transform(e)}bbox(){return ye.fromPoints(this.center.sub(M(this.radius)),this.center.add(M(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new an(this.center,this.radius)}},eo=class ci{static{n(this,"Ellipse")}center;radiusX;radiusY;constructor(e,h,u){this.center=e.clone(),this.radiusX=h,this.radiusY=u}transform(e){return new ci(e.multVec2(this.center),e.m[0]*this.radiusX,e.m[5]*this.radiusY)}bbox(){return ye.fromPoints(this.center.sub(M(this.radiusX,this.radiusY)),this.center.add(M(this.radiusX,this.radiusY)))}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new ci(this.center,this.radiusX,this.radiusY)}},sr=class fi{static{n(this,"Polygon")}pts;constructor(e){if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new fi(this.pts.map(h=>e.multVec2(h)))}bbox(){let e=M(Number.MAX_VALUE),h=M(-Number.MAX_VALUE);for(let u of this.pts)e.x=Math.min(e.x,u.x),h.x=Math.max(h.x,u.x),e.y=Math.min(e.y,u.y),h.y=Math.max(h.y,u.y);return ye.fromPoints(e,h)}area(){let e=0,h=this.pts.length;for(let u=0;u<h;u++){let f=this.pts[u],A=this.pts[(u+1)%h];e+=f.x*A.y*.5,e-=A.x*f.y*.5}return Math.abs(e)}clone(){return new fi(this.pts.map(e=>e.clone()))}};function hn(r,e){let h=Number.MAX_VALUE,u=M(0);for(let f of[r,e])for(let A=0;A<f.pts.length;A++){let P=f.pts[A],C=f.pts[(A+1)%f.pts.length].sub(P).normal().unit(),Y=Number.MAX_VALUE,V=-Number.MAX_VALUE;for(let y=0;y<r.pts.length;y++){let W=r.pts[y].dot(C);Y=Math.min(Y,W),V=Math.max(V,W)}let re=Number.MAX_VALUE,b=-Number.MAX_VALUE;for(let y=0;y<e.pts.length;y++){let W=e.pts[y].dot(C);re=Math.min(re,W),b=Math.max(b,W)}let j=Math.min(V,b)-Math.max(Y,re);if(j<0)return null;if(j<Math.abs(h)){let y=b-Y,W=re-V;h=Math.abs(y)<Math.abs(W)?y:W,u=C.scale(h)}}return u}n(hn,"sat");var ln=class extends Map{static{n(this,"Registry")}lastID;constructor(...r){super(...r),this.lastID=0}push(r){let e=this.lastID;return this.set(e,r),this.lastID++,e}pushd(r){let e=this.push(r);return()=>this.delete(e)}},Mt=class un{static{n(this,"EventController")}paused=!1;cancel;constructor(e){this.cancel=e}static join(e){let h=new un(()=>e.forEach(u=>u.cancel()));return Object.defineProperty(h,"paused",{get:()=>e[0].paused,set:u=>e.forEach(f=>f.paused=u)}),h.paused=!1,h}},ke=class{static{n(this,"Event")}handlers=new ln;add(r){let e=this.handlers.pushd((...u)=>{h.paused||r(...u)}),h=new Mt(e);return h}addOnce(r){let e=this.add((...h)=>{e.cancel(),r(...h)});return e}next(){return new Promise(r=>this.addOnce(r))}trigger(...r){this.handlers.forEach(e=>e(...r))}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},nr=class{static{n(this,"EventHandler")}handlers={};on(r,e){return this.handlers[r]||(this.handlers[r]=new ke),this.handlers[r].add(e)}onOnce(r,e){let h=this.on(r,(...u)=>{h.cancel(),e(...u)});return h}next(r){return new Promise(e=>{this.onOnce(r,(...h)=>e(h[0]))})}trigger(r,...e){this.handlers[r]&&this.handlers[r].trigger(...e)}remove(r){delete this.handlers[r]}clear(){this.handlers={}}numListeners(r){return this.handlers[r]?.numListeners()??0}};function Dr(r,e){if(r===e)return!0;let h=typeof r,u=typeof e;if(h!==u)return!1;if(h==="object"&&u==="object"&&r!==null&&e!==null){if(Array.isArray(r)!==Array.isArray(e))return!1;let f=Object.keys(r),A=Object.keys(e);if(f.length!==A.length)return!1;for(let P of f){let C=r[P],Y=e[P];if(!Dr(C,Y))return!1}return!0}return!1}n(Dr,"deepEq");function dn(r){let e=window.atob(r),h=e.length,u=new Uint8Array(h);for(let f=0;f<h;f++)u[f]=e.charCodeAt(f);return u.buffer}n(dn,"base64ToArrayBuffer");function cn(r){return dn(r.split(",")[1])}n(cn,"dataURLToArrayBuffer");function Cr(r,e){let h=document.createElement("a");h.href=e,h.download=r,h.click()}n(Cr,"download");function yi(r,e){Cr(r,"data:text/plain;charset=utf-8,"+e)}n(yi,"downloadText");function fn(r,e){yi(r,JSON.stringify(e))}n(fn,"downloadJSON");function pi(r,e){let h=URL.createObjectURL(e);Cr(r,h),URL.revokeObjectURL(h)}n(pi,"downloadBlob");var Ls=n(r=>r.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),to=n(r=>r.split(".").slice(0,-1).join("."),"getFileName");function Pe(r,e){return(...h)=>{let u=h.length;if(u===r.length)return r(...h);if(u===e.length)return e(...h)}}n(Pe,"overload2");var ro=(()=>{let r=0;return()=>r++})(),io=n(r=>r instanceof Error?r.message:String(r),"getErrorMessage"),so=class{static{n(this,"BinaryHeap")}_items;_compareFn;constructor(r=(e,h)=>e<h){this._compareFn=r,this._items=[]}insert(r){this._items.push(r),this.moveUp(this._items.length-1)}remove(){if(this._items.length===0)return null;let r=this._items[0],e=this._items.pop();return this._items.length!==0&&(this._items[0]=e,this.moveDown(0)),r}clear(){this._items.splice(0,this._items.length)}moveUp(r){for(;r>0;){let e=Math.floor((r-1)/2);if(!this._compareFn(this._items[r],this._items[e])&&this._items[r]>=this._items[e])break;this.swap(r,e),r=e}}moveDown(r){for(;r<Math.floor(this._items.length/2);){let e=2*r+1;if(e<this._items.length-1&&!this._compareFn(this._items[e],this._items[e+1])&&++e,this._compareFn(this._items[r],this._items[e]))break;this.swap(r,e),r=e}}swap(r,e){[this._items[r],this._items[e]]=[this._items[e],this._items[r]]}get length(){return this._items.length}},no=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function pn(r){if(typeof r!="string")throw new TypeError("string cannot be undefined or null");let e=[],h=0,u=0;for(;h<r.length;){if(u+=gn(h+u,r),xn(r[h+u])&&u++,Vn(r[h+u])&&u++,vn(r[h+u])&&u++,En(r[h+u])){u++;continue}e.push(r.substring(h,h+u)),h+=u,u=0}return e}n(pn,"runes");function gn(r,e){let h=e[r];if(!mn(h)||r===e.length-1)return 1;let u=h+e[r+1],f=e.substring(r+2,r+5);return gi(u)&&gi(f)?4:wn(u)&&yn(f)?e.slice(r).indexOf(String.fromCodePoint(917631))+2:An(f)?4:2}n(gn,"nextUnits");function mn(r){return r&&et(r[0].charCodeAt(0),55296,56319)}n(mn,"isFirstOfSurrogatePair");function gi(r){return et(kr(r),127462,127487)}n(gi,"isRegionalIndicator");function wn(r){return et(kr(r),127988,127988)}n(wn,"isSubdivisionFlag");function An(r){return et(kr(r),127995,127999)}n(An,"isFitzpatrickModifier");function Vn(r){return typeof r=="string"&&et(r.charCodeAt(0),65024,65039)}n(Vn,"isVariationSelector");function vn(r){return typeof r=="string"&&et(r.charCodeAt(0),8400,8447)}n(vn,"isDiacriticalMark");function yn(r){let e=r.codePointAt(0);return typeof r=="string"&&typeof e=="number"&&et(e,917504,917631)}n(yn,"isSupplementarySpecialpurposePlane");function xn(r){return typeof r=="string"&&no.includes(r.charCodeAt(0))}n(xn,"isGrapheme");function En(r){return typeof r=="string"&&r.charCodeAt(0)===8205}n(En,"isZeroWidthJoiner");function kr(r){let e=r.charCodeAt(0)-55296,h=r.charCodeAt(1)-56320;return(e<<10)+h+65536}n(kr,"codePointFromSurrogatePair");function et(r,e,h){return r>=e&&r<=h}n(et,"betweenInclusive");var Gs={"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}}}},Fr=class{static{n(this,"ButtonState")}pressed=new Set([]);pressedRepeat=new Set([]);released=new Set([]);down=new Set([]);update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(r){this.pressed.add(r),this.pressedRepeat.add(r),this.down.add(r)}pressRepeat(r){this.pressedRepeat.add(r)}release(r){this.down.delete(r),this.pressed.delete(r),this.released.add(r)}},oo=class{static{n(this,"GamepadState")}buttonState=new Fr;stickState=new Map},ao=class{static{n(this,"FPSCounter")}dts=[];timer=0;fps=0;tick(r){this.dts.push(r),this.timer+=r,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((e,h)=>e+h)/this.dts.length)),this.dts=[])}},ho=n(r=>{if(!r.canvas)throw new Error("Please provide a canvas");let e={canvas:r.canvas,loopID:null,stopped:!1,dt:0,time:0,realTime:0,fpsCounter:new ao,timeScale:1,skipTime:!1,numFrames:0,mousePos:new E(0),mouseDeltaPos:new E(0),keyState:new Fr,mouseState:new Fr,mergedGamepadState:new oo,gamepadStates:new Map,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:r.canvas.offsetWidth,lastHeight:r.canvas.offsetHeight,events:new nr};function h(){return e.dt*e.timeScale}n(h,"dt");function u(){return e.time}n(u,"time");function f(){return e.fpsCounter.fps}n(f,"fps");function A(){return e.numFrames}n(A,"numFrames");function P(){return e.canvas.toDataURL()}n(P,"screenshot");function C(c){e.canvas.style.cursor=c}n(C,"setCursor");function Y(){return e.canvas.style.cursor}n(Y,"getCursor");function V(c){if(c)try{let v=e.canvas.requestPointerLock();v.catch&&v.catch(R=>console.error(R))}catch(v){console.error(v)}else document.exitPointerLock()}n(V,"setCursorLocked");function re(){return!!document.pointerLockElement}n(re,"isCursorLocked");function b(c){c.requestFullscreen?c.requestFullscreen():c.webkitRequestFullscreen&&c.webkitRequestFullscreen()}n(b,"enterFullscreen");function j(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}n(j,"exitFullscreen");function y(){return document.fullscreenElement||document.webkitFullscreenElement}n(y,"getFullscreenElement");function W(c=!0){c?b(e.canvas):j()}n(W,"setFullscreen");function de(){return!!y()}n(de,"isFullscreen");function te(){e.stopped=!0;for(let c in ie)e.canvas.removeEventListener(c,ie[c]);for(let c in le)document.removeEventListener(c,le[c]);for(let c in ne)window.removeEventListener(c,ne[c]);Ae.disconnect()}n(te,"quit");function U(c){e.loopID!==null&&cancelAnimationFrame(e.loopID);let v=0,R=n(q=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(R);return}let Q=q/1e3,ce=Q-e.realTime,Re=r.maxFPS?1/r.maxFPS:0;e.realTime=Q,v+=ce,v>Re&&(e.skipTime||(e.dt=v,e.time+=h(),e.fpsCounter.tick(e.dt)),v=0,e.skipTime=!1,e.numFrames++,ot(),c(),zt()),e.loopID=requestAnimationFrame(R)},"frame");R(0)}n(U,"run");function fe(){return"ontouchstart"in window||navigator.maxTouchPoints>0}n(fe,"isTouchscreen");function S(){return e.mousePos.clone()}n(S,"mousePos");function Be(){return e.mouseDeltaPos.clone()}n(Be,"mouseDeltaPos");function K(c="left"){return e.mouseState.pressed.has(c)}n(K,"isMousePressed");function Se(c="left"){return e.mouseState.down.has(c)}n(Se,"isMouseDown");function we(c="left"){return e.mouseState.released.has(c)}n(we,"isMouseReleased");function Ee(){return e.isMouseMoved}n(Ee,"isMouseMoved");function ze(c){return c===void 0?e.keyState.pressed.size>0:e.keyState.pressed.has(c)}n(ze,"isKeyPressed");function kt(c){return c===void 0?e.keyState.pressedRepeat.size>0:e.keyState.pressedRepeat.has(c)}n(kt,"isKeyPressedRepeat");function pt(c){return c===void 0?e.keyState.down.size>0:e.keyState.down.has(c)}n(pt,"isKeyDown");function gt(c){return c===void 0?e.keyState.released.size>0:e.keyState.released.has(c)}n(gt,"isKeyReleased");function mt(c){return c===void 0?e.mergedGamepadState.buttonState.pressed.size>0:e.mergedGamepadState.buttonState.pressed.has(c)}n(mt,"isGamepadButtonPressed");function Oe(c){return c===void 0?e.mergedGamepadState.buttonState.down.size>0:e.mergedGamepadState.buttonState.down.has(c)}n(Oe,"isGamepadButtonDown");function Nt(c){return c===void 0?e.mergedGamepadState.buttonState.released.size>0:e.mergedGamepadState.buttonState.released.has(c)}n(Nt,"isGamepadButtonReleased");function Ut(c){return e.events.on("resize",c)}n(Ut,"onResize");let fr=Pe(c=>e.events.on("keyDown",c),(c,v)=>e.events.on("keyDown",R=>R===c&&v(c))),pr=Pe(c=>e.events.on("keyPress",c),(c,v)=>e.events.on("keyPress",R=>R===c&&v(c))),gr=Pe(c=>e.events.on("keyPressRepeat",c),(c,v)=>e.events.on("keyPressRepeat",R=>R===c&&v(c))),mr=Pe(c=>e.events.on("keyRelease",c),(c,v)=>e.events.on("keyRelease",R=>R===c&&v(c))),Lt=Pe(c=>e.events.on("mouseDown",v=>c(v)),(c,v)=>e.events.on("mouseDown",R=>R===c&&v(R))),Gt=Pe(c=>e.events.on("mousePress",v=>c(v)),(c,v)=>e.events.on("mousePress",R=>R===c&&v(R))),Ot=Pe(c=>e.events.on("mouseRelease",v=>c(v)),(c,v)=>e.events.on("mouseRelease",R=>R===c&&v(R)));function wt(c){return e.events.on("mouseMove",()=>c(S(),Be()))}n(wt,"onMouseMove");function At(c){return e.events.on("charInput",c)}n(At,"onCharInput");function qt(c){return e.events.on("touchStart",c)}n(qt,"onTouchStart");function rt(c){return e.events.on("touchMove",c)}n(rt,"onTouchMove");function Ht(c){return e.events.on("touchEnd",c)}n(Ht,"onTouchEnd");function Kt(c){return e.events.on("scroll",c)}n(Kt,"onScroll");function Vt(c){return e.events.on("hide",c)}n(Vt,"onHide");function Yt(c){return e.events.on("show",c)}n(Yt,"onShow");function vt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonDown",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonDown",R=>R===c&&v(c))}n(vt,"onGamepadButtonDown");function yt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonPress",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonPress",R=>R===c&&v(c))}n(yt,"onGamepadButtonPress");function jt(c,v){if(typeof c=="function")return e.events.on("gamepadButtonRelease",c);if(typeof c=="string"&&typeof v=="function")return e.events.on("gamepadButtonRelease",R=>R===c&&v(c))}n(jt,"onGamepadButtonRelease");function it(c,v){return e.events.on("gamepadStick",(R,q)=>R===c&&v(q))}n(it,"onGamepadStick");function Qt(c){e.events.on("gamepadConnect",c)}n(Qt,"onGamepadConnect");function st(c){e.events.on("gamepadDisconnect",c)}n(st,"onGamepadDisconnect");function Fe(c){return e.mergedGamepadState.stickState.get(c)||new E(0)}n(Fe,"getGamepadStick");function nt(){return[...e.charInputted]}n(nt,"charInputted");function xt(){return[...e.gamepads]}n(xt,"getGamepads");function ot(){e.events.trigger("input"),e.keyState.down.forEach(c=>e.events.trigger("keyDown",c)),e.mouseState.down.forEach(c=>e.events.trigger("mouseDown",c)),Ne()}n(ot,"processInput");function zt(){e.keyState.update(),e.mouseState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((c,v)=>{e.mergedGamepadState.stickState.set(v,new E(0))}),e.charInputted=[],e.isMouseMoved=!1,e.gamepadStates.forEach(c=>{c.buttonState.update(),c.stickState.forEach((v,R)=>{c.stickState.set(R,new E(0))})})}n(zt,"resetInput");function Et(c){let v={index:c.index,isPressed:R=>e.gamepadStates.get(c.index).buttonState.pressed.has(R),isDown:R=>e.gamepadStates.get(c.index).buttonState.down.has(R),isReleased:R=>e.gamepadStates.get(c.index).buttonState.released.has(R),getStick:R=>e.gamepadStates.get(c.index).stickState.get(R)};return e.gamepads.push(v),e.gamepadStates.set(c.index,{buttonState:new Fr,stickState:new Map([["left",new E(0)],["right",new E(0)]])}),v}n(Et,"registerGamepad");function $(c){e.gamepads=e.gamepads.filter(v=>v.index!==c.index),e.gamepadStates.delete(c.index)}n($,"removeGamepad");function Ne(){for(let c of navigator.getGamepads())c&&!e.gamepadStates.has(c.index)&&Et(c);for(let c of e.gamepads){let v=navigator.getGamepads()[c.index],R=(r.gamepads??{})[v.id]??Gs[v.id]??Gs.default,q=e.gamepadStates.get(c.index);for(let Q=0;Q<v.buttons.length;Q++)v.buttons[Q].pressed?(q.buttonState.down.has(R.buttons[Q])||(e.mergedGamepadState.buttonState.press(R.buttons[Q]),q.buttonState.press(R.buttons[Q]),e.events.trigger("gamepadButtonPress",R.buttons[Q])),e.events.trigger("gamepadButtonDown",R.buttons[Q])):q.buttonState.down.has(R.buttons[Q])&&(e.mergedGamepadState.buttonState.release(R.buttons[Q]),q.buttonState.release(R.buttons[Q]),e.events.trigger("gamepadButtonRelease",R.buttons[Q]));for(let Q in R.sticks){let ce=R.sticks[Q],Re=new E(v.axes[ce.x],v.axes[ce.y]);q.stickState.set(Q,Re),e.mergedGamepadState.stickState.set(Q,Re),e.events.trigger("gamepadStick",Q,Re)}}}n(Ne,"processGamepad");let ie={},le={},ne={},Ue=r.pixelDensity||window.devicePixelRatio||1;ie.mousemove=c=>{let v=new E(c.offsetX,c.offsetY),R=new E(c.movementX,c.movementY);if(de()){let q=e.canvas.width/Ue,Q=e.canvas.height/Ue,ce=window.innerWidth,Re=window.innerHeight,Jt=ce/Re,Xt=q/Q;if(Jt>Xt){let De=Re/Q,Me=(ce-q*De)/2;v.x=$e(c.offsetX-Me,0,q*De,0,q),v.y=$e(c.offsetY,0,Q*De,0,Q)}else{let De=ce/q,Me=(Re-Q*De)/2;v.x=$e(c.offsetX,0,q*De,0,q),v.y=$e(c.offsetY-Me,0,Q*De,0,Q)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=v,e.mouseDeltaPos=R,e.events.trigger("mouseMove")})};let Je=["left","middle","right","back","forward"];ie.mousedown=c=>{e.events.onOnce("input",()=>{let v=Je[c.button];v&&(e.mouseState.press(v),e.events.trigger("mousePress",v))})},ie.mouseup=c=>{e.events.onOnce("input",()=>{let v=Je[c.button];v&&(e.mouseState.release(v),e.events.trigger("mouseRelease",v))})};let wr=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),qe={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};ie.keydown=c=>{wr.has(c.key)&&c.preventDefault(),e.events.onOnce("input",()=>{let v=qe[c.key]||c.key.toLowerCase();v.length===1?(e.events.trigger("charInput",v),e.charInputted.push(v)):v==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),c.repeat?(e.keyState.pressRepeat(v),e.events.trigger("keyPressRepeat",v)):(e.keyState.press(v),e.events.trigger("keyPressRepeat",v),e.events.trigger("keyPress",v))})},ie.keyup=c=>{e.events.onOnce("input",()=>{let v=qe[c.key]||c.key.toLowerCase();e.keyState.release(v),e.events.trigger("keyRelease",v)})},ie.touchstart=c=>{c.preventDefault(),e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.press("left"),e.events.trigger("mousePress","left")),v.forEach(q=>{e.events.trigger("touchStart",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchmove=c=>{c.preventDefault(),e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.events.trigger("mouseMove")),v.forEach(q=>{e.events.trigger("touchMove",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchend=c=>{e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),v.forEach(q=>{e.events.trigger("touchEnd",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.touchcancel=c=>{e.events.onOnce("input",()=>{let v=[...c.changedTouches],R=e.canvas.getBoundingClientRect();r.touchToMouse!==!1&&(e.mousePos=new E(v[0].clientX-R.x,v[0].clientY-R.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),v.forEach(q=>{e.events.trigger("touchEnd",new E(q.clientX-R.x,q.clientY-R.y),q)})})},ie.wheel=c=>{c.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new E(c.deltaX,c.deltaY))})},ie.contextmenu=c=>c.preventDefault(),le.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.events.trigger("show")):e.events.trigger("hide")},ne.gamepadconnected=c=>{let v=Et(c.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",v)})},ne.gamepaddisconnected=c=>{let v=xt().filter(R=>R.index===c.gamepad.index)[0];$(c.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",v)})};for(let c in ie)e.canvas.addEventListener(c,ie[c]);for(let c in le)document.addEventListener(c,le[c]);for(let c in ne)window.addEventListener(c,ne[c]);let Ae=new ResizeObserver(c=>{for(let v of c)if(v.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 Ae.observe(e.canvas),{dt:h,time:u,run:U,canvas:e.canvas,fps:f,numFrames:A,quit:te,setFullscreen:W,isFullscreen:de,setCursor:C,screenshot:P,getGamepads:xt,getCursor:Y,setCursorLocked:V,isCursorLocked:re,isTouchscreen:fe,mousePos:S,mouseDeltaPos:Be,isKeyDown:pt,isKeyPressed:ze,isKeyPressedRepeat:kt,isKeyReleased:gt,isMouseDown:Se,isMousePressed:K,isMouseReleased:we,isMouseMoved:Ee,isGamepadButtonPressed:mt,isGamepadButtonDown:Oe,isGamepadButtonReleased:Nt,getGamepadStick:Fe,charInputted:nt,onResize:Ut,onKeyDown:fr,onKeyPress:pr,onKeyPressRepeat:gr,onKeyRelease:mr,onMouseDown:Lt,onMousePress:Gt,onMouseRelease:Ot,onMouseMove:wt,onCharInput:At,onTouchStart:qt,onTouchMove:rt,onTouchEnd:Ht,onScroll:Kt,onHide:Vt,onShow:Yt,onGamepadButtonDown:vt,onGamepadButtonPress:yt,onGamepadButtonRelease:jt,onGamepadStick:it,onGamepadConnect:Qt,onGamepadDisconnect:st,events:e.events}},"default"),ut=class bn{static{n(this,"Texture")}ctx;src=null;glTex;width;height;constructor(e,h,u,f={}){this.ctx=e;let A=e.gl;this.glTex=e.gl.createTexture(),e.onDestroy(()=>this.free()),this.width=h,this.height=u;let P={linear:A.LINEAR,nearest:A.NEAREST}[f.filter??e.opts.texFilter]??A.NEAREST,C={repeat:A.REPEAT,clampToEadge:A.CLAMP_TO_EDGE}[f.wrap]??A.CLAMP_TO_EDGE;this.bind(),h&&u&&A.texImage2D(A.TEXTURE_2D,0,A.RGBA,h,u,0,A.RGBA,A.UNSIGNED_BYTE,null),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MIN_FILTER,P),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_MAG_FILTER,P),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_S,C),A.texParameteri(A.TEXTURE_2D,A.TEXTURE_WRAP_T,C),this.unbind()}static fromImage(e,h,u={}){let f=new bn(e,h.width,h.height,u);return f.update(h),f.src=h,f}update(e,h=0,u=0){let f=this.ctx.gl;this.bind(),f.texSubImage2D(f.TEXTURE_2D,0,h,u,f.RGBA,f.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},br=class{static{n(this,"FrameBuffer")}ctx;tex;glFramebuffer;glRenderbuffer;constructor(r,e,h,u={}){this.ctx=r;let f=r.gl;r.onDestroy(()=>this.free()),this.tex=new ut(r,e,h,u),this.glFramebuffer=f.createFramebuffer(),this.glRenderbuffer=f.createRenderbuffer(),this.bind(),f.renderbufferStorage(f.RENDERBUFFER,f.DEPTH_STENCIL,e,h),f.framebufferTexture2D(f.FRAMEBUFFER,f.COLOR_ATTACHMENT0,f.TEXTURE_2D,this.tex.glTex,0),f.framebufferRenderbuffer(f.FRAMEBUFFER,f.DEPTH_STENCIL_ATTACHMENT,f.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let r=this.ctx.gl,e=new Uint8ClampedArray(this.width*this.height*4);this.bind(),r.readPixels(0,0,this.width,this.height,r.RGBA,r.UNSIGNED_BYTE,e),this.unbind();let h=this.width*4,u=new Uint8Array(h);for(let f=0;f<(this.height/2|0);f++){let A=f*h,P=(this.height-f-1)*h;u.set(e.subarray(A,A+h)),e.copyWithin(A,P,P+h),e.set(u,P)}return new ImageData(e,this.width,this.height)}toDataURL(){let r=document.createElement("canvas"),e=r.getContext("2d");return r.width=this.width,r.height=this.height,e.putImageData(this.toImageData(),0,0),r.toDataURL()}draw(r){this.bind(),r(),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 r=this.ctx.gl;r.deleteFramebuffer(this.glFramebuffer),r.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},lo=class{static{n(this,"Shader")}ctx;glProgram;constructor(r,e,h,u){this.ctx=r,r.onDestroy(()=>this.free());let f=r.gl,A=f.createShader(f.VERTEX_SHADER),P=f.createShader(f.FRAGMENT_SHADER);f.shaderSource(A,e),f.shaderSource(P,h),f.compileShader(A),f.compileShader(P);let C=f.createProgram();if(this.glProgram=C,f.attachShader(C,A),f.attachShader(C,P),u.forEach((Y,V)=>f.bindAttribLocation(C,V,Y)),f.linkProgram(C),!f.getProgramParameter(C,f.LINK_STATUS)){let Y=f.getShaderInfoLog(A);if(Y)throw new Error("VERTEX SHADER "+Y);let V=f.getShaderInfoLog(P);if(V)throw new Error("FRAGMENT SHADER "+V)}f.deleteShader(A),f.deleteShader(P)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(r){let e=this.ctx.gl;for(let h in r){let u=r[h],f=e.getUniformLocation(this.glProgram,h);typeof u=="number"?e.uniform1f(f,u):u instanceof Le?e.uniformMatrix4fv(f,!1,new Float32Array(u.m)):u instanceof ee?e.uniform3f(f,u.r,u.g,u.b):u instanceof E&&e.uniform2f(f,u.x,u.y)}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},uo=class{static{n(this,"BatchRenderer")}ctx;glVBuf;glIBuf;vqueue=[];iqueue=[];stride;maxVertices;maxIndices;vertexFormat;numDraws=0;curPrimitive=null;curTex=null;curShader=null;curUniform={};constructor(r,e,h,u){let f=r.gl;this.vertexFormat=e,this.ctx=r,this.stride=e.reduce((A,P)=>A+P.size,0),this.maxVertices=h,this.maxIndices=u,this.glVBuf=f.createBuffer(),r.pushArrayBuffer(this.glVBuf),f.bufferData(f.ARRAY_BUFFER,h*4,f.DYNAMIC_DRAW),r.popArrayBuffer(),this.glIBuf=f.createBuffer(),r.pushElementArrayBuffer(this.glIBuf),f.bufferData(f.ELEMENT_ARRAY_BUFFER,u*4,f.DYNAMIC_DRAW),r.popElementArrayBuffer()}push(r,e,h,u,f=null,A={}){(r!==this.curPrimitive||f!==this.curTex||u!==this.curShader||!Dr(this.curUniform,A)||this.vqueue.length+e.length*this.stride>this.maxVertices||this.iqueue.length+h.length>this.maxIndices)&&this.flush();let P=this.vqueue.length/this.stride;for(let C of e)this.vqueue.push(C);for(let C of h)this.iqueue.push(C+P);this.curPrimitive=r,this.curShader=u,this.curTex=f,this.curUniform=A}flush(){if(!this.curPrimitive||!this.curShader||this.vqueue.length===0||this.iqueue.length===0)return;let r=this.ctx.gl;this.ctx.pushArrayBuffer(this.glVBuf),r.bufferSubData(r.ARRAY_BUFFER,0,new Float32Array(this.vqueue)),this.ctx.pushElementArrayBuffer(this.glIBuf),r.bufferSubData(r.ELEMENT_ARRAY_BUFFER,0,new Uint16Array(this.iqueue)),this.ctx.setVertexFormat(this.vertexFormat),this.curShader.bind(),this.curShader.send(this.curUniform),this.curTex?.bind(),r.drawElements(this.curPrimitive,this.iqueue.length,r.UNSIGNED_SHORT,0),this.curTex?.unbind(),this.curShader.unbind(),this.ctx.popArrayBuffer(),this.ctx.popElementArrayBuffer(),this.vqueue=[],this.iqueue=[],this.numDraws++}free(){let r=this.ctx.gl;r.deleteBuffer(this.glVBuf),r.deleteBuffer(this.glIBuf)}};function _e(r){let e=[],h=n(A=>{e.push(A),r(A)},"push"),u=n(()=>{e.pop(),r(f()??null)},"pop"),f=n(()=>e[e.length-1],"cur");return[h,u,f]}n(_e,"genStack");function Sn(r,e={}){let h=[];function u(K){h.push(K)}n(u,"onDestroy");function f(){h.forEach(K=>K()),r.getExtension("WEBGL_lose_context").loseContext()}n(f,"destroy");let A=null;function P(K){if(Dr(K,A))return;A=K;let Se=K.reduce((we,Ee)=>we+Ee.size,0);K.reduce((we,Ee,ze)=>(r.vertexAttribPointer(ze,Ee.size,r.FLOAT,!1,Se*4,we),r.enableVertexAttribArray(ze),we+Ee.size*4),0)}n(P,"setVertexFormat");let[C,Y]=_e(K=>r.bindTexture(r.TEXTURE_2D,K)),[V,re]=_e(K=>r.bindBuffer(r.ARRAY_BUFFER,K)),[b,j]=_e(K=>r.bindBuffer(r.ELEMENT_ARRAY_BUFFER,K)),[y,W]=_e(K=>r.bindFramebuffer(r.FRAMEBUFFER,K)),[de,te]=_e(K=>r.bindRenderbuffer(r.RENDERBUFFER,K)),[U,fe]=_e(({x:K,y:Se,w:we,h:Ee})=>{r.viewport(K,Se,we,Ee)}),[S,Be]=_e(K=>r.useProgram(K));return U({x:0,y:0,w:r.drawingBufferWidth,h:r.drawingBufferHeight}),{gl:r,opts:e,onDestroy:u,destroy:f,pushTexture2D:C,popTexture2D:Y,pushArrayBuffer:V,popArrayBuffer:re,pushElementArrayBuffer:b,popElementArrayBuffer:j,pushFramebuffer:y,popFramebuffer:W,pushRenderbuffer:de,popRenderbuffer:te,pushViewport:U,popViewport:fe,pushProgram:S,popProgram:Be,setVertexFormat:P}}n(Sn,"initGfx");var Ie=class Rn{static{n(this,"Asset")}loaded=!1;data=null;error=null;onLoadEvents=new ke;onErrorEvents=new ke;onFinishEvents=new ke;constructor(e){e.then(h=>{this.data=h,this.onLoadEvents.trigger(h)}).catch(h=>{if(this.error=h,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(h);else throw h}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let h=new Rn(Promise.resolve(e));return h.data=e,h.loaded=!0,h}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)}},Rt=class{static{n(this,"AssetBucket")}assets=new Map;lastUID=0;add(r,e){let h=r??this.lastUID+++"",u=new Ie(e);return this.assets.set(h,u),u}addLoaded(r,e){let h=r??this.lastUID+++"",u=Ie.loaded(e);return this.assets.set(h,u),u}get(r){return this.assets.get(r)}progress(){if(this.assets.size===0)return 1;let r=0;return this.assets.forEach(e=>{e.loaded&&r++}),r/this.assets.size}};function Nr(r){return fetch(r).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${r}"`);return e})}n(Nr,"fetchURL");function or(r){return Nr(r).then(e=>e.json())}n(or,"fetchJSON");function Mn(r){return Nr(r).then(e=>e.text())}n(Mn,"fetchText");function Tn(r){return Nr(r).then(e=>e.arrayBuffer())}n(Tn,"fetchArrayBuffer");function ar(r){let e=new Image;return e.crossOrigin="anonymous",e.src=r,new Promise((h,u)=>{e.onload=()=>h(e),e.onerror=()=>u(new Error(`Failed to load image from "${r}"`))})}n(ar,"loadImg");var Sr=2.5949095,Os=1.70158+1,qs=2*Math.PI/3,Hs=2*Math.PI/4.5,Ir={linear:r=>r,easeInSine:r=>1-Math.cos(r*Math.PI/2),easeOutSine:r=>Math.sin(r*Math.PI/2),easeInOutSine:r=>-(Math.cos(Math.PI*r)-1)/2,easeInQuad:r=>r*r,easeOutQuad:r=>1-(1-r)*(1-r),easeInOutQuad:r=>r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2,easeInCubic:r=>r*r*r,easeOutCubic:r=>1-Math.pow(1-r,3),easeInOutCubic:r=>r<.5?4*r*r*r:1-Math.pow(-2*r+2,3)/2,easeInQuart:r=>r*r*r*r,easeOutQuart:r=>1-Math.pow(1-r,4),easeInOutQuart:r=>r<.5?8*r*r*r*r:1-Math.pow(-2*r+2,4)/2,easeInQuint:r=>r*r*r*r*r,easeOutQuint:r=>1-Math.pow(1-r,5),easeInOutQuint:r=>r<.5?16*r*r*r*r*r:1-Math.pow(-2*r+2,5)/2,easeInExpo:r=>r===0?0:Math.pow(2,10*r-10),easeOutExpo:r=>r===1?1:1-Math.pow(2,-10*r),easeInOutExpo:r=>r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2,easeInCirc:r=>1-Math.sqrt(1-Math.pow(r,2)),easeOutCirc:r=>Math.sqrt(1-Math.pow(r-1,2)),easeInOutCirc:r=>r<.5?(1-Math.sqrt(1-Math.pow(2*r,2)))/2:(Math.sqrt(1-Math.pow(-2*r+2,2))+1)/2,easeInBack:r=>Os*r*r*r-1.70158*r*r,easeOutBack:r=>1+Os*Math.pow(r-1,3)+1.70158*Math.pow(r-1,2),easeInOutBack:r=>r<.5?Math.pow(2*r,2)*((Sr+1)*2*r-Sr)/2:(Math.pow(2*r-2,2)*((Sr+1)*(r*2-2)+Sr)+2)/2,easeInElastic:r=>r===0?0:r===1?1:-Math.pow(2,10*r-10)*Math.sin((r*10-10.75)*qs),easeOutElastic:r=>r===0?0:r===1?1:Math.pow(2,-10*r)*Math.sin((r*10-.75)*qs)+1,easeInOutElastic:r=>r===0?0:r===1?1:r<.5?-(Math.pow(2,20*r-10)*Math.sin((20*r-11.125)*Hs))/2:Math.pow(2,-20*r+10)*Math.sin((20*r-11.125)*Hs)/2+1,easeInBounce:r=>1-Ir.easeOutBounce(1-r),easeOutBounce:r=>r<1/2.75?7.5625*r*r:r<2/2.75?7.5625*(r-=1.5/2.75)*r+.75:r<2.5/2.75?7.5625*(r-=2.25/2.75)*r+.9375:7.5625*(r-=2.625/2.75)*r+.984375,easeInOutBounce:r=>r<.5?(1-Ir.easeOutBounce(1-2*r))/2:(1+Ir.easeOutBounce(2*r-1))/2},Rr=Ir,co=class{static{n(this,"TexPacker")}textures=[];canvas;c2d;x=0;y=0;curHeight=0;gfx;constructor(r,e,h){this.gfx=r,this.canvas=document.createElement("canvas"),this.canvas.width=e,this.canvas.height=h,this.textures=[ut.fromImage(r,this.canvas)],this.c2d=this.canvas.getContext("2d")}add(r){if(r.width>this.canvas.width||r.height>this.canvas.height)throw new Error(`Texture size (${r.width} x ${r.height}) exceeds limit (${this.canvas.width} x ${this.canvas.height})`);this.x+r.width>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+r.height>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(ut.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let e=this.textures[this.textures.length-1],h=new E(this.x,this.y);return this.x+=r.width,r.height>this.curHeight&&(this.curHeight=r.height),r instanceof ImageData?this.c2d.putImageData(r,h.x,h.y):this.c2d.drawImage(r,h.x,h.y),e.update(this.canvas),[e,new me(h.x/this.canvas.width,h.y/this.canvas.height,r.width/this.canvas.width,r.height/this.canvas.height)]}free(){for(let r of this.textures)r.free()}},fo="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==",po=Wn("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L5QNSqT5iiySS9Ja2SV//5ME0ak//+4KgAAABgQBAADAMDgYCAEgCteQ0fZH6+ICXA357+MPfhR/+ywRf/U///LVTEFNRTMuMTAwVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+5JknQAFoWhGLm5gBClBmT3GiAAAAAGkHAAAIAAANIOAAARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV"),go="data:image/png;base64,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",mo="data:image/png;base64,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",wo="3000.1.17",Ks=" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",Mr="topleft",Ys=64,Ao="monospace",Tr="monospace",Vo=36,Pr=64,Br=256,js=2048,Qs=2048,zs=2048,Js=2048,Xs=.1,vo=64,si="linear",yo=8,xo=4,mi=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],Eo=mi.reduce((r,e)=>r+e.size,0),Pn=2048,bo=Pn*4*Eo,So=Pn*6,Ro=`
|
|
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;
|
|
}
|
|
`,Mo=`
|
|
precision mediump float;
|
|
|
|
varying vec2 v_pos;
|
|
varying vec2 v_uv;
|
|
varying vec4 v_color;
|
|
|
|
uniform sampler2D u_tex;
|
|
|
|
vec4 def_frag() {
|
|
return v_color * texture2D(u_tex, v_uv);
|
|
}
|
|
|
|
{{user}}
|
|
|
|
void main() {
|
|
gl_FragColor = frag(v_pos, v_uv, v_color, u_tex);
|
|
if (gl_FragColor.a == 0.0) {
|
|
discard;
|
|
}
|
|
}
|
|
`,ni=`
|
|
vec4 vert(vec2 pos, vec2 uv, vec4 color) {
|
|
return def_vert();
|
|
}
|
|
`,oi=`
|
|
vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) {
|
|
return def_frag();
|
|
}
|
|
`,To=new Set(["id","require"]),Po=new Set(["add","update","draw","destroy","inspect","drawInspect"]);function lt(r){switch(r){case"topleft":return new E(-1,-1);case"top":return new E(0,-1);case"topright":return new E(1,-1);case"left":return new E(-1,0);case"center":return new E(0,0);case"right":return new E(1,0);case"botleft":return new E(-1,1);case"bot":return new E(0,1);case"botright":return new E(1,1);default:return r}}n(lt,"anchorPt");function Bn(r){switch(r){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}n(Bn,"alignPt");function Fn(r){return r.createBuffer(1,1,44100)}n(Fn,"createEmptyAudioBuffer");var In=n((r={})=>{let e=r.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 h=r.canvas??(()=>{let t=document.createElement("canvas");return e.appendChild(t),t})(),u=r.scale??1,f=r.width&&r.height&&!r.stretch&&!r.letterbox;f?(h.width=r.width*u,h.height=r.height*u):(h.width=h.parentElement.offsetWidth,h.height=h.parentElement.offsetHeight);let A=["outline: none","cursor: default"];if(f){let t=h.width,i=h.height;A.push(`width: ${t}px`),A.push(`height: ${i}px`)}else A.push("width: 100%"),A.push("height: 100%");r.crisp&&(A.push("image-rendering: pixelated"),A.push("image-rendering: crisp-edges")),h.style.cssText=A.join(";");let P=r.pixelDensity||window.devicePixelRatio;h.width*=P,h.height*=P,h.tabIndex=0;let C=document.createElement("canvas");C.width=Br,C.height=Br;let Y=C.getContext("2d",{willReadFrequently:!0}),V=ho({canvas:h,touchToMouse:r.touchToMouse,gamepads:r.gamepads,pixelDensity:r.pixelDensity,maxFPS:r.maxFPS}),re=[],b=V.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0}),j=Sn(b,{texFilter:r.texFilter}),y=(()=>{let t=it(ni,oi),i=ut.fromImage(j,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),s=r.width&&r.height?new br(j,r.width*P*u,r.height*P*u):new br(j,b.drawingBufferWidth,b.drawingBufferHeight),a=null,o=1;r.background&&(a=Z(r.background),o=Array.isArray(r.background)?r.background[3]:1,b.clearColor(a.r/255,a.g/255,a.b/255,o??1)),b.enable(b.BLEND),b.blendFuncSeparate(b.SRC_ALPHA,b.ONE_MINUS_SRC_ALPHA,b.ONE,b.ONE_MINUS_SRC_ALPHA);let l=new uo(j,mi,bo,So),p=ut.fromImage(j,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,defShader:t,defTex:i,frameBuffer:s,postShader:null,postShaderUniform:null,renderer:l,transform:new Le,transformStack:[],bgTex:p,bgColor:a,bgAlpha:o,width:r.width??b.drawingBufferWidth/P/u,height:r.height??b.drawingBufferHeight/P/u,viewport:{x:0,y:0,width:b.drawingBufferWidth,height:b.drawingBufferHeight},fixed:!1}})();class W{static{n(this,"SpriteData")}tex;frames=[new me(0,0,1,1)];anims={};slice9=null;constructor(i,s,a={},o=null){this.tex=i,s&&(this.frames=s),this.anims=a,this.slice9=o}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(i,s={}){return typeof i=="string"?W.fromURL(i,s):Promise.resolve(W.fromImage(i,s))}static fromImage(i,s={}){let[a,o]=U.packer.add(i),l=s.frames?s.frames.map(p=>new me(o.x+p.x*o.w,o.y+p.y*o.h,p.w*o.w,p.h*o.h)):pt(s.sliceX||1,s.sliceY||1,o.x,o.y,o.w,o.h);return new W(a,l,s.anims,s.slice9)}static fromURL(i,s={}){return ar(i).then(a=>W.fromImage(a,s))}}class de{static{n(this,"SoundData")}buf;constructor(i){this.buf=i}static fromArrayBuffer(i){return new Promise((s,a)=>te.ctx.decodeAudioData(i,s,a)).then(s=>new de(s))}static fromURL(i){return Ls(i)?de.fromArrayBuffer(cn(i)):Tn(i).then(s=>de.fromArrayBuffer(s))}}let te=(()=>{let t=new(window.AudioContext||window.webkitAudioContext),i=t.createGain();i.connect(t.destination);let s=new de(Fn(t));return t.decodeAudioData(po.buffer.slice(0)).then(a=>{s.buf=a}).catch(a=>{console.error("Failed to load burp: ",a)}),{ctx:t,masterNode:i,burpSnd:s}})(),U={urlPrefix:"",sprites:new Rt,fonts:new Rt,bitmapFonts:new Rt,sounds:new Rt,shaders:new Rt,custom:new Rt,packer:new co(j,zs,Js),loaded:!1};function fe(t){return typeof t!="string"||Ls(t)?t:U.urlPrefix+t}n(fe,"fixURL");let S={events:new nr,objEvents:new nr,root:Ar([]),gravity:0,scenes:{},logs:[],cam:{pos:null,scale:new E(1),angle:0,shake:0,transform:new Le}};S.root.use(yr());function Be(t){return U.custom.add(null,t)}n(Be,"load");function K(){let t=[U.sprites,U.sounds,U.shaders,U.fonts,U.bitmapFonts,U.custom];return t.reduce((i,s)=>i+s.progress(),0)/t.length}n(K,"loadProgress");function Se(t){return t!==void 0&&(U.urlPrefix=t),U.urlPrefix}n(Se,"loadRoot");function we(t,i){return U.custom.add(t,or(i))}n(we,"loadJSON");class Ee{static{n(this,"FontData")}fontface;filter=si;outline=null;size=Pr;constructor(i,s={}){if(this.fontface=i,this.filter=s.filter??si,this.size=s.size??Pr,this.size>Br)throw new Error(`Max font size: ${Br}`);s.outline&&(this.outline={width:1,color:Z(0,0,0)},typeof s.outline=="number"?this.outline.width=s.outline:typeof s.outline=="object"&&(s.outline.width&&(this.outline.width=s.outline.width),s.outline.color&&(this.outline.color=s.outline.color)))}}function ze(t,i,s={}){let a=new FontFace(t,typeof i=="string"?`url(${i})`:i);return document.fonts.add(a),U.fonts.add(t,a.load().catch(o=>{throw new Error(`Failed to load font from "${i}": ${o}`)}).then(o=>new Ee(o,s)))}n(ze,"loadFont");function kt(t,i,s,a,o={}){return U.bitmapFonts.add(t,ar(i).then(l=>Qt(ut.fromImage(j,l,o),s,a,o.chars??Ks)))}n(kt,"loadBitmapFont");function pt(t=1,i=1,s=0,a=0,o=1,l=1){let p=[],w=o/t,g=l/i;for(let d=0;d<i;d++)for(let m=0;m<t;m++)p.push(new me(s+m*w,a+d*g,w,g));return p}n(pt,"slice");function gt(t,i){return t=fe(t),Be(typeof i=="string"?new Promise((s,a)=>{or(i).then(o=>{gt(t,o).then(s).catch(a)})}):W.from(t).then(s=>{let a={};for(let o in i){let l=i[o],p=s.frames[0],w=zs*p.w,g=Js*p.h,d=l.frames?l.frames.map(T=>new me(p.x+(l.x+T.x)/w*p.w,p.y+(l.y+T.y)/g*p.h,T.w/w*p.w,T.h/g*p.h)):pt(l.sliceX||1,l.sliceY||1,p.x+l.x/w*p.w,p.y+l.y/g*p.h,l.width/w*p.w,l.height/g*p.h),m=new W(s.tex,d,l.anims);U.sprites.addLoaded(o,m),a[o]=m}return a}))}n(gt,"loadSpriteAtlas");function mt(t,i={}){let s=document.createElement("canvas"),a=t[0].width,o=t[0].height;s.width=a*t.length,s.height=o;let l=s.getContext("2d");t.forEach((w,g)=>{w instanceof ImageData?l.putImageData(w,g*a,0):l.drawImage(w,g*a,0)});let p=l.getImageData(0,0,t.length*a,o);return W.fromImage(p,{...i,sliceX:t.length,sliceY:1})}n(mt,"createSpriteSheet");function Oe(t,i,s={sliceX:1,sliceY:1,anims:{}}){return i=fe(i),Array.isArray(i)?i.some(a=>typeof a=="string")?U.sprites.add(t,Promise.all(i.map(a=>typeof a=="string"?ar(a):Promise.resolve(a))).then(a=>mt(a,s))):U.sprites.addLoaded(t,mt(i,s)):typeof i=="string"?U.sprites.add(t,W.from(i,s)):U.sprites.addLoaded(t,W.fromImage(i,s))}n(Oe,"loadSprite");function Nt(t,i){return i=fe(i),U.sprites.add(t,new Promise(async s=>{let a=typeof i=="string"?await or(i):i,o=await Promise.all(a.frames.map(ar)),l=document.createElement("canvas");l.width=a.width,l.height=a.height*a.frames.length;let p=l.getContext("2d");o.forEach((g,d)=>{p.drawImage(g,0,d*a.height)});let w=await Oe(null,l,{sliceY:a.frames.length,anims:a.anims});s(w)}))}n(Nt,"loadPedit");function Ut(t,i,s){i=fe(i),s=fe(s),typeof i=="string"&&!s&&(s=to(i)+".json");let a=typeof s=="string"?or(s):Promise.resolve(s);return U.sprites.add(t,a.then(o=>{let l=o.meta.size,p=o.frames.map(g=>new me(g.frame.x/l.w,g.frame.y/l.h,g.frame.w/l.w,g.frame.h/l.h)),w={};for(let g of o.meta.frameTags)g.from===g.to?w[g.name]=g.from:w[g.name]={from:g.from,to:g.to,speed:10,loop:!0,pingpong:g.direction==="pingpong"};return W.from(i,{frames:p,anims:w})}))}n(Ut,"loadAseprite");function fr(t,i,s){return U.shaders.addLoaded(t,it(i,s))}n(fr,"loadShader");function pr(t,i,s){i=fe(i),s=fe(s);let a=n(l=>l?Mn(l):Promise.resolve(null),"resolveUrl"),o=Promise.all([a(i),a(s)]).then(([l,p])=>it(l,p));return U.shaders.add(t,o)}n(pr,"loadShaderURL");function gr(t,i){return i=fe(i),U.sounds.add(t,typeof i=="string"?de.fromURL(i):de.fromArrayBuffer(i))}n(gr,"loadSound");function mr(t="bean"){return Oe(t,fo)}n(mr,"loadBean");function Lt(t){return U.sprites.get(t)}n(Lt,"getSprite");function Gt(t){return U.sounds.get(t)}n(Gt,"getSound");function Ot(t){return U.fonts.get(t)}n(Ot,"getFont");function wt(t){return U.bitmapFonts.get(t)}n(wt,"getBitmapFont");function At(t){return U.shaders.get(t)}n(At,"getShader");function qt(t){return U.custom.get(t)}n(qt,"getAsset");function rt(t){if(typeof t=="string"){let i=Lt(t);if(i)return i;if(K()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof W)return Ie.loaded(t);if(t instanceof Ie)return t;throw new Error(`Invalid sprite: ${t}`)}}n(rt,"resolveSprite");function Ht(t){if(typeof t=="string"){let i=Gt(t);if(i)return i;if(K()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof de)return Ie.loaded(t);if(t instanceof Ie)return t;throw new Error(`Invalid sound: ${t}`)}}n(Ht,"resolveSound");function Kt(t){if(!t)return y.defShader;if(typeof t=="string"){let i=At(t);if(i)return i.data??i;if(K()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof Ie)return t.data?t.data:t;return t}n(Kt,"resolveShader");function Vt(t){if(!t)return Vt(r.font??Ao);if(typeof t=="string"){let i=wt(t),s=Ot(t);if(i)return i.data??i;if(s)return s.data??s;if(document.fonts.check(`${Pr}px ${t}`))return t;if(K()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof Ie)return t.data?t.data:t;return t}n(Vt,"resolveFont");function Yt(t){return t!==void 0&&(te.masterNode.gain.value=t),te.masterNode.gain.value}n(Yt,"volume");function vt(t,i={}){let s=te.ctx,a=i.paused??!1,o=s.createBufferSource(),l=new ke,p=s.createGain(),w=i.seek??0,g=0,d=0,m=!1;o.loop=!!i.loop,o.detune.value=i.detune??0,o.playbackRate.value=i.speed??1,o.connect(p),o.onended=()=>{L()>=o.buffer?.duration&&l.trigger()},p.connect(te.masterNode),p.gain.value=i.volume??1;let T=n(D=>{o.buffer=D.buf,a||(g=s.currentTime,o.start(0,w),m=!0)},"start"),B=Ht(t);B instanceof Ie&&B.onLoad(T);let L=n(()=>{if(!o.buffer)return 0;let D=a?d-g:s.currentTime-g,N=o.buffer.duration;return o.loop?D%N:Math.min(D,N)},"getTime"),G=n(D=>{let N=s.createBufferSource();return N.buffer=D.buffer,N.loop=D.loop,N.playbackRate.value=D.playbackRate.value,N.detune.value=D.detune.value,N.onended=D.onended,N.connect(p),N},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(D){if(a!==D)if(a=D,D)m&&(o.stop(),m=!1),d=s.currentTime;else{o=G(o);let N=d-g;o.start(0,N),m=!0,g=s.currentTime-N,d=0}},get paused(){return a},play(D=0){this.seek(D),this.paused=!1},seek(D){o.buffer?.duration&&(D>o.buffer.duration||(a?(o=G(o),g=d-D):(o.stop(),o=G(o),g=s.currentTime-D,o.start(0,D),m=!0,d=0)))},set speed(D){o.playbackRate.value=D},get speed(){return o.playbackRate.value},set detune(D){o.detune.value=D},get detune(){return o.detune.value},set volume(D){p.gain.value=Math.max(D,0)},get volume(){return p.gain.value},set loop(D){o.loop=D},get loop(){return o.loop},duration(){return o.buffer?.duration??0},time(){return L()%this.duration()},onEnd(D){return l.add(D)},then(D){return this.onEnd(D)}}}n(vt,"play");function yt(t){return vt(te.burpSnd,t)}n(yt,"burp");function jt(t,i){return new br(j,t,i)}n(jt,"makeCanvas");function it(t=ni,i=oi){let s=Ro.replace("{{user}}",t??ni),a=Mo.replace("{{user}}",i??oi);try{return new lo(j,s,a,mi.map(o=>o.name))}catch(o){let l=/(?<type>^\w+) SHADER ERROR: 0:(?<line>\d+): (?<msg>.+)/,p=io(o).match(l),w=Number(p.groups.line)-14,g=p.groups.msg.trim(),d=p.groups.type.toLowerCase();throw new Error(`${d} shader line ${w}: ${g}`)}}n(it,"makeShader");function Qt(t,i,s,a){let o=t.width/i,l={},p=a.split("").entries();for(let[w,g]of p)l[g]=new me(w%o*i,Math.floor(w/o)*s,i,s);return{tex:t,map:l,size:s}}n(Qt,"makeFont");function st(t,i,s,a=y.defTex,o=y.defShader,l={}){let p=Kt(o);if(!p||p instanceof Ie)return;let w=y.fixed||s?y.transform:S.cam.transform.mult(y.transform),g=[];for(let d of t){let m=zt(w.multVec2(d.pos));g.push(m.x,m.y,d.uv.x,d.uv.y,d.color.r/255,d.color.g/255,d.color.b/255,d.opacity)}y.renderer.push(b.TRIANGLES,g,i,p,a,l)}n(st,"drawRaw");function Fe(){y.renderer.flush()}n(Fe,"flush");function nt(){b.clear(b.COLOR_BUFFER_BIT),y.frameBuffer.bind(),b.clear(b.COLOR_BUFFER_BIT),y.bgColor||Me(()=>{Ue({width:Ve(),height:ve(),quad:new me(0,0,Ve()/Ys,ve()/Ys),tex:y.bgTex,fixed:!0})}),y.renderer.numDraws=0,y.fixed=!1,y.transformStack.length=0,y.transform=new Le}n(nt,"frameStart");function xt(t,i){y.postShader=t,y.postShaderUniform=i??null}n(xt,"usePostEffect");function ot(){Fe(),y.lastDrawCalls=y.renderer.numDraws,y.frameBuffer.unbind(),b.viewport(0,0,b.drawingBufferWidth,b.drawingBufferHeight);let t=y.width,i=y.height;y.width=b.drawingBufferWidth/P,y.height=b.drawingBufferHeight/P,Je({flipY:!0,tex:y.frameBuffer.tex,pos:new E(y.viewport.x,y.viewport.y),width:y.viewport.width,height:y.viewport.height,shader:y.postShader,uniform:typeof y.postShaderUniform=="function"?y.postShaderUniform():y.postShaderUniform,fixed:!0}),Fe(),y.width=t,y.height=i}n(ot,"frameEnd");function zt(t){return new E(t.x/Ve()*2-1,-t.y/ve()*2+1)}n(zt,"screen2ndc");function Et(t){y.transform=t.clone()}n(Et,"pushMatrix");function $(...t){if(t[0]===void 0)return;let i=M(...t);i.x===0&&i.y===0||y.transform.translate(i)}n($,"pushTranslate");function Ne(...t){if(t[0]===void 0)return;let i=M(...t);i.x===1&&i.y===1||y.transform.scale(i)}n(Ne,"pushScale");function ie(t){t&&y.transform.rotate(t)}n(ie,"pushRotate");function le(){y.transformStack.push(y.transform.clone())}n(le,"pushTransform");function ne(){y.transformStack.length>0&&(y.transform=y.transformStack.pop())}n(ne,"popTransform");function Ue(t){if(t.width===void 0||t.height===void 0)throw new Error('drawUVQuad() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let i=t.width,s=t.height,a=lt(t.anchor||Mr).scale(new E(i,s).scale(-.5)),o=t.quad||new me(0,0,1,1),l=t.color||Z(255,255,255),p=t.opacity??1,w=t.tex?Xs/t.tex.width:0,g=t.tex?Xs/t.tex.height:0,d=o.x+w,m=o.y+g,T=o.w-w*2,B=o.h-g*2;le(),$(t.pos),ie(t.angle),Ne(t.scale),$(a),st([{pos:new E(-i/2,s/2),uv:new E(t.flipX?d+T:d,t.flipY?m:m+B),color:l,opacity:p},{pos:new E(-i/2,-s/2),uv:new E(t.flipX?d+T:d,t.flipY?m+B:m),color:l,opacity:p},{pos:new E(i/2,-s/2),uv:new E(t.flipX?d:d+T,t.flipY?m+B:m),color:l,opacity:p},{pos:new E(i/2,s/2),uv:new E(t.flipX?d:d+T,t.flipY?m:m+B),color:l,opacity:p}],[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform),ne()}n(Ue,"drawUVQuad");function Je(t){if(!t.tex)throw new Error('drawTexture() requires property "tex".');let i=t.quad??new me(0,0,1,1),s=t.tex.width*i.w,a=t.tex.height*i.h,o=new E(1);if(t.tiled){let l=Math.ceil((t.width||s)/s),p=Math.ceil((t.height||a)/a),w=lt(t.anchor||Mr).add(new E(1,1)).scale(.5).scale(l*s,p*a);for(let g=0;g<l;g++)for(let d=0;d<p;d++)Ue(Object.assign({},t,{pos:(t.pos||new E(0)).add(new E(s*g,a*d)).sub(w),scale:o.scale(t.scale||new E(1)),tex:t.tex,quad:i,width:s,height:a,anchor:"topleft"}))}else t.width&&t.height?(o.x=t.width/s,o.y=t.height/a):t.width?(o.x=t.width/s,o.y=o.x):t.height&&(o.y=t.height/a,o.x=o.y),Ue(Object.assign({},t,{scale:o.scale(t.scale||new E(1)),tex:t.tex,quad:i,width:s,height:a}))}n(Je,"drawTexture");function wr(t){if(!t.sprite)throw new Error('drawSprite() requires property "sprite"');let i=rt(t.sprite);if(!i||!i.data)return;let s=i.data.frames[t.frame??0];if(!s)throw new Error(`Frame not found: ${t.frame??0}`);Je(Object.assign({},t,{tex:i.data.tex,quad:s.scale(t.quad??new me(0,0,1,1))}))}n(wr,"drawSprite");function qe(t,i,s,a,o,l=1){a=Ge(a%360),o=Ge(o%360),o<=a&&(o+=Math.PI*2);let p=[],w=Math.ceil((o-a)/Ge(8)*l),g=(o-a)/w;for(let d=a;d<o;d+=g)p.push(t.add(i*Math.cos(d),s*Math.sin(d)));return p.push(t.add(i*Math.cos(o),s*Math.sin(o))),p}n(qe,"getArcPts");function Ae(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 i=t.width,s=t.height,a=lt(t.anchor||Mr).add(1,1).scale(new E(i,s).scale(-.5)),o=[new E(0,0),new E(i,0),new E(i,s),new E(0,s)];if(t.radius){let l=Math.min(Math.min(i,s)/2,t.radius);o=[new E(l,0),new E(i-l,0),...qe(new E(i-l,l),l,l,270,360),new E(i,l),new E(i,s-l),...qe(new E(i-l,s-l),l,l,0,90),new E(i-l,s),new E(l,s),...qe(new E(l,s-l),l,l,90,180),new E(0,s-l),new E(0,l),...qe(new E(l,l),l,l,180,270)]}ce(Object.assign({},t,{offset:a,pts:o,...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]]}:{}}))}n(Ae,"drawRect");function c(t){let{p1:i,p2:s}=t;if(!i||!s)throw new Error('drawLine() requires properties "p1" and "p2".');let a=t.width||1,o=s.sub(i).unit().normal().scale(a*.5),l=[i.sub(o),i.add(o),s.add(o),s.sub(o)].map(p=>({pos:new E(p.x,p.y),uv:new E(0),color:t.color??ee.WHITE,opacity:t.opacity??1}));st(l,[0,1,3,1,2,3],t.fixed,y.defTex,t.shader,t.uniform)}n(c,"drawLine");function v(t){let i=t.pts;if(!i)throw new Error('drawLines() requires property "pts".');if(!(i.length<2))if(t.radius&&i.length>=3){let s=i[0].sdist(i[1]);for(let o=1;o<i.length-1;o++)s=Math.min(i[o].sdist(i[o+1]),s);let a=Math.min(t.radius,Math.sqrt(s)/2);c(Object.assign({},t,{p1:i[0],p2:i[1]}));for(let o=1;o<i.length-2;o++){let l=i[o],p=i[o+1];c(Object.assign({},t,{p1:l,p2:p}))}c(Object.assign({},t,{p1:i[i.length-2],p2:i[i.length-1]}))}else for(let s=0;s<i.length-1;s++)c(Object.assign({},t,{p1:i[s],p2:i[s+1]})),t.join!=="none"&&q(Object.assign({},t,{pos:i[s],radius:t.width/2}))}n(v,"drawLines");function R(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return ce(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}n(R,"drawTriangle");function q(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&Q(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}n(q,"drawCircle");function Q(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 i=t.start??0,s=t.end??360,a=lt(t.anchor??"center").scale(new E(-t.radiusX,-t.radiusY)),o=qe(a,t.radiusX,t.radiusY,i,s,t.resolution);o.unshift(a);let l=Object.assign({},t,{pts:o,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(o.length-1).fill(t.gradient[1])]}:{}});if(s-i>=360&&t.outline){t.fill!==!1&&ce(Object.assign(l,{outline:null})),ce(Object.assign(l,{pts:o.slice(1),fill:!1}));return}ce(l)}n(Q,"drawEllipse");function ce(t){if(!t.pts)throw new Error('drawPolygon() requires property "pts".');let i=t.pts.length;if(!(i<3)){if(le(),$(t.pos),Ne(t.scale),ie(t.angle),$(t.offset),t.fill!==!1){let s=t.color??ee.WHITE,a=t.pts.map((l,p)=>({pos:new E(l.x,l.y),uv:new E(0,0),color:t.colors&&t.colors[p]?t.colors[p].mult(s):s,opacity:t.opacity??1})),o=[...Array(i-2).keys()].map(l=>[0,l+1,l+2]).flat();st(a,t.indices??o,t.fixed,y.defTex,t.shader,t.uniform)}t.outline&&v({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}),ne()}}n(ce,"drawPolygon");function Re(t,i,s){Fe(),b.clear(b.STENCIL_BUFFER_BIT),b.enable(b.STENCIL_TEST),b.stencilFunc(b.NEVER,1,255),b.stencilOp(b.REPLACE,b.REPLACE,b.REPLACE),i(),Fe(),b.stencilFunc(s,1,255),b.stencilOp(b.KEEP,b.KEEP,b.KEEP),t(),Fe(),b.disable(b.STENCIL_TEST)}n(Re,"drawStenciled");function Jt(t,i){Re(t,i,b.EQUAL)}n(Jt,"drawMasked");function Xt(t,i){Re(t,i,b.NOTEQUAL)}n(Xt,"drawSubtracted");function De(){return(y.viewport.width+y.viewport.height)/(y.width+y.height)}n(De,"getViewportScale");function Me(t){Fe();let i=y.width,s=y.height;y.width=y.viewport.width,y.height=y.viewport.height,t(),Fe(),y.width=i,y.height=s}n(Me,"drawUnscaled");function Ur(t,i){i.pos&&(t.pos=t.pos.add(i.pos)),i.scale&&(t.scale=t.scale.scale(M(i.scale))),i.angle&&(t.angle+=i.angle),i.color&&t.ch.length===1&&(t.color=t.color.mult(i.color)),i.opacity&&(t.opacity*=i.opacity)}n(Ur,"applyCharTransform");let Si=/\[(?<style>\w+)\](?<text>.*?)\[\/\k<style>\]/g;function Ri(t){let i={},s=t.replace(Si,"$2"),a=0;for(let o of t.matchAll(Si)){let l=o.index-a;for(let p=0;p<o.groups.text.length;p++)i[p+l]=[o.groups.style];a+=o[0].length-o.groups.text.length}return{charStyleMap:i,text:s}}n(Ri,"compileStyledText");let Lr={};function Xe(t){if(t.text===void 0)throw new Error('formatText() requires property "text".');let i=Vt(t.font);if(t.text===""||i instanceof Ie||!i)return{width:0,height:0,chars:[],opt:t};let{charStyleMap:s,text:a}=Ri(t.text+""),o=pn(a);if(i instanceof Ee||typeof i=="string"){let z=i instanceof Ee?i.fontface.family:i,J=i instanceof Ee?{outline:i.outline,filter:i.filter}:{outline:null,filter:si},O=Lr[z]??{font:{tex:new ut(j,js,Qs,{filter:J.filter}),map:{},size:Pr},cursor:new E(0),outline:J.outline};Lr[z]||(Lr[z]=O),i=O.font;for(let pe of o)if(!O.font.map[pe]){let x=Y;x.clearRect(0,0,C.width,C.height),x.font=`${i.size}px ${z}`,x.textBaseline="top",x.textAlign="left",x.fillStyle="#ffffff";let F=x.measureText(pe),I=Math.ceil(F.width),k=i.size;O.outline&&(x.lineJoin="round",x.lineWidth=O.outline.width*2,x.strokeStyle=O.outline.color.toHex(),x.strokeText(pe,O.outline.width,O.outline.width),I+=O.outline.width*2,k+=O.outline.width*3),x.fillText(pe,O.outline?.width??0,O.outline?.width??0);let X=x.getImageData(0,0,I,k);if(O.cursor.x+I>js&&(O.cursor.x=0,O.cursor.y+=k,O.cursor.y>Qs))throw new Error("Font atlas exceeds character limit");i.tex.update(X,O.cursor.x,O.cursor.y),i.map[pe]=new me(O.cursor.x,O.cursor.y,I,k),O.cursor.x+=I}}let l=t.size||i.size,p=M(t.scale??1).scale(l/i.size),w=t.lineSpacing??0,g=t.letterSpacing??0,d=0,m=0,T=0,B=[],L=[],G=0,D=null,N=null;for(;G<o.length;){let z=o[G];if(z===`
|
|
`)T+=l+w,B.push({width:d-g,chars:L}),D=null,N=null,d=0,L=[];else{let J=i.map[z];if(J){let O=J.w*p.x;t.width&&d+O>t.width&&(T+=l+w,D!=null&&(G-=L.length-D,z=o[G],J=i.map[z],O=J.w*p.x,L=L.slice(0,D-1),d=N),D=null,N=null,B.push({width:d-g,chars:L}),d=0,L=[]),L.push({tex:i.tex,width:J.w,height:J.h,quad:new me(J.x/i.tex.width,J.y/i.tex.height,J.w/i.tex.width,J.h/i.tex.height),ch:z,pos:new E(d,T),opacity:t.opacity??1,color:t.color??ee.WHITE,scale:M(p),angle:0}),z===" "&&(D=L.length,N=d),d+=O,m=Math.max(m,d),d+=g}}G++}B.push({width:d-g,chars:L}),T+=l,t.width&&(m=t.width);let Te=[];for(let z of B){let J=(m-z.width)*Bn(t.align??"left");for(let O of z.chars){let pe=i.map[O.ch],x=Te.length;if(O.pos=O.pos.add(J,0).add(pe.w*p.x*.5,pe.h*p.y*.5),t.transform){let F=typeof t.transform=="function"?t.transform(x,O.ch):t.transform;F&&Ur(O,F)}if(s[x]){let F=s[x];for(let I of F){let k=t.styles[I],X=typeof k=="function"?k(x,O.ch):k;X&&Ur(O,X)}}Te.push(O)}}return{width:m,height:T,chars:Te,opt:t}}n(Xe,"formatText");function Gr(t){We(Xe(t))}n(Gr,"drawText");function We(t){le(),$(t.opt.pos),ie(t.opt.angle),$(lt(t.opt.anchor??"topleft").add(1,1).scale(t.width,t.height).scale(-.5)),t.chars.forEach(i=>{Ue({tex:i.tex,width:i.width,height:i.height,pos:i.pos,scale:i.scale,angle:i.angle,color:i.color,opacity:i.opacity,quad:i.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),ne()}n(We,"drawFormattedText");function Ve(){return y.width}n(Ve,"width");function ve(){return y.height}n(ve,"height");function Mi(t){return new E((t.x-y.viewport.x)*Ve()/y.viewport.width,(t.y-y.viewport.y)*ve()/y.viewport.height)}n(Mi,"windowToContent");function Ti(t){return new E(t.x*y.viewport.width/y.width,t.y*y.viewport.height/y.height)}n(Ti,"contentToView");function Wt(){return Mi(V.mousePos())}n(Wt,"mousePos");let Pi=!1,se={inspect:!1,timeScale:1,showLog:!0,fps:()=>V.fps(),numFrames:()=>V.numFrames(),stepFrame:Wr,drawCalls:()=>y.lastDrawCalls,clearLog:()=>S.logs=[],log:t=>{let i=r.logMax??yo;S.logs.unshift({msg:t,time:V.time()}),S.logs.length>i&&(S.logs=S.logs.slice(0,i))},error:t=>se.log(new Error(t.toString?t.toString():t)),curRecording:null,numObjects:()=>zr("*",{recursive:!0}).length,get paused(){return Pi},set paused(t){Pi=t,t?te.ctx.suspend():te.ctx.resume()}};function Ce(){return V.dt()*se.timeScale}n(Ce,"dt");function Bi(...t){return t.length>0&&(S.cam.pos=M(...t)),S.cam.pos?S.cam.pos.clone():tr()}n(Bi,"camPos");function Fi(...t){return t.length>0&&(S.cam.scale=M(...t)),S.cam.scale.clone()}n(Fi,"camScale");function Ii(t){return t!==void 0&&(S.cam.angle=t),S.cam.angle}n(Ii,"camRot");function Di(t=12){S.cam.shake+=t}n(Di,"shake");function Or(t){return S.cam.transform.multVec2(t)}n(Or,"toScreen");function qr(t){return S.cam.transform.invert().multVec2(t)}n(qr,"toWorld");function Zt(t){let i=new Le;return t.pos&&i.translate(t.pos),t.scale&&i.scale(t.scale),t.angle&&i.rotate(t.angle),t.parent?i.mult(t.parent.transform):i}n(Zt,"calcTransform");function Ar(t=[]){let i=new Map,s={},a=new nr,o=[],l=null,p=!1,w={id:ro(),hidden:!1,transform:new Le,children:[],parent:null,set paused(d){if(d!==p){p=d;for(let m of o)m.paused=d}},get paused(){return p},add(d=[]){let m=Array.isArray(d)?Ar(d):d;if(m.parent)throw new Error("Cannot add a game obj that already has a parent.");return m.parent=this,m.transform=Zt(m),this.children.push(m),m.trigger("add",m),S.events.trigger("add",m),m},readd(d){let m=this.children.indexOf(d);return m!==-1&&(this.children.splice(m,1),this.children.push(d)),d},remove(d){let m=this.children.indexOf(d);if(m!==-1){d.parent=null,this.children.splice(m,1);let T=n(B=>{B.trigger("destroy"),S.events.trigger("destroy",B),B.children.forEach(L=>T(L))},"trigger");T(d)}},removeAll(d){if(d)this.get(d).forEach(m=>this.remove(m));else for(let m of[...this.children])this.remove(m)},update(){this.paused||(this.children.sort((d,m)=>(d.z??0)-(m.z??0)).forEach(d=>d.update()),this.trigger("update"))},draw(){if(this.hidden)return;this.canvas&&this.canvas.bind();let d=y.fixed;this.fixed&&(y.fixed=!0),le(),$(this.pos),Ne(this.scale),ie(this.angle);let m=this.children.sort((T,B)=>(T.z??0)-(B.z??0));if(this.mask){let T={intersect:Jt,subtract:Xt}[this.mask];if(!T)throw new Error(`Invalid mask func: "${this.mask}"`);T(()=>{m.forEach(B=>B.draw())},()=>{this.trigger("draw")})}else this.trigger("draw"),m.forEach(T=>T.draw());ne(),y.fixed=d,this.canvas&&this.canvas.unbind()},drawInspect(){this.hidden||(le(),$(this.pos),Ne(this.scale),ie(this.angle),this.children.sort((d,m)=>(d.z??0)-(m.z??0)).forEach(d=>d.drawInspect()),this.trigger("drawInspect"),ne())},use(d){if(!d)return;if(typeof d=="string")return this.use({id:d});let m=[];d.id&&(this.unuse(d.id),s[d.id]=[],m=s[d.id],i.set(d.id,d));for(let B in d){if(To.has(B))continue;let L=Object.getOwnPropertyDescriptor(d,B);if(typeof L.value=="function"&&(d[B]=d[B].bind(this)),L.set&&Object.defineProperty(d,B,{set:L.set.bind(this)}),L.get&&Object.defineProperty(d,B,{get:L.get.bind(this)}),Po.has(B)){let G=B==="add"?()=>{l=n(D=>m.push(D),"onCurCompCleanup"),d[B](),l=null}:d[B];m.push(this.on(B,G).cancel)}else if(this[B]===void 0)Object.defineProperty(this,B,{get:()=>d[B],set:G=>d[B]=G,configurable:!0,enumerable:!0}),m.push(()=>delete this[B]);else throw new Error(`Duplicate component property: "${B}"`)}let T=n(()=>{if(d.require){for(let B of d.require)if(!this.c(B))throw new Error(`Component "${d.id}" requires component "${B}"`)}},"checkDeps");d.destroy&&m.push(d.destroy.bind(this)),this.exists()?(T(),d.add&&(l=n(B=>m.push(B),"onCurCompCleanup"),d.add.call(this),l=null)):d.require&&m.push(this.on("add",T).cancel)},unuse(d){s[d]&&(s[d].forEach(m=>m()),delete s[d]),i.has(d)&&i.delete(d)},c(d){return i.get(d)},get(d,m={}){let T=m.recursive?this.children.flatMap(n(function B(L){return[L,...L.children.flatMap(B)]},"recurse")):this.children;if(T=T.filter(B=>d?B.is(d):!0),m.liveUpdate){let B=n(G=>m.recursive?this.isAncestorOf(G):G.parent===this,"isChild"),L=[];L.push(Hr(G=>{B(G)&&G.is(d)&&T.push(G)})),L.push(Ci(G=>{if(B(G)&&G.is(d)){let D=T.findIndex(N=>N.id===G.id);D!==-1&&T.splice(D,1)}})),this.onDestroy(()=>{for(let G of L)G.cancel()})}return T},isAncestorOf(d){return d.parent?d.parent===this||this.isAncestorOf(d.parent):!1},exists(){return S.root.isAncestorOf(this)},is(d){if(d==="*")return!0;if(Array.isArray(d)){for(let m of d)if(!this.c(m))return!1;return!0}else return this.c(d)!=null},on(d,m){let T=a.on(d,m.bind(this));return l&&l(()=>T.cancel()),T},trigger(d,...m){a.trigger(d,...m),S.objEvents.trigger(d,this,...m)},destroy(){this.parent&&this.parent.remove(this)},inspect(){let d={};for(let[m,T]of i)d[m]=T.inspect?T.inspect():null;return d},onAdd(d){return this.on("add",d)},onUpdate(d){return this.on("update",d)},onDraw(d){return this.on("draw",d)},onDestroy(d){return this.on("destroy",d)},clearEvents(){a.clear()}},g=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick"];for(let d of g)w[d]=(...m)=>{let T=V[d](...m);return o.push(T),w.onDestroy(()=>T.cancel()),T};for(let d of t)w.use(d);return w}n(Ar,"make");function He(t,i,s){return S.objEvents[t]||(S.objEvents[t]=new ln),S.objEvents.on(t,(a,...o)=>{a.is(i)&&s(a,...o)})}n(He,"on");let Nn=Pe(t=>{let i=rr([{update:t}]);return{get paused(){return i.paused},set paused(s){i.paused=s},cancel:()=>i.destroy()}},(t,i)=>He("update",t,i)),Un=Pe(t=>{let i=rr([{draw:t}]);return{get paused(){return i.hidden},set paused(s){i.hidden=s},cancel:()=>i.destroy()}},(t,i)=>He("draw",t,i)),Hr=Pe(t=>S.events.on("add",t),(t,i)=>He("add",t,i)),Ci=Pe(t=>S.events.on("destroy",t),(t,i)=>He("destroy",t,i));function ki(t,i,s){return He("collide",t,(a,o,l)=>o.is(i)&&s(a,o,l))}n(ki,"onCollide");function Ni(t,i,s){return He("collideUpdate",t,(a,o,l)=>o.is(i)&&s(a,o,l))}n(Ni,"onCollideUpdate");function Ui(t,i,s){return He("collideEnd",t,(a,o,l)=>o.is(i)&&s(a,o,l))}n(Ui,"onCollideEnd");function _t(t,i){zr(t,{recursive:!0}).forEach(i),Hr(t,i)}n(_t,"forAllCurrentAndFuture");let Ln=Pe(t=>V.onMousePress(t),(t,i)=>{let s=[];return _t(t,a=>{if(!a.area)throw new Error("onClick() requires the object to have area() component");s.push(a.onClick(()=>i(a)))}),Mt.join(s)});function Li(t,i){let s=[];return _t(t,a=>{if(!a.area)throw new Error("onHover() requires the object to have area() component");s.push(a.onHover(()=>i(a)))}),Mt.join(s)}n(Li,"onHover");function Gi(t,i){let s=[];return _t(t,a=>{if(!a.area)throw new Error("onHoverUpdate() requires the object to have area() component");s.push(a.onHoverUpdate(()=>i(a)))}),Mt.join(s)}n(Gi,"onHoverUpdate");function Oi(t,i){let s=[];return _t(t,a=>{if(!a.area)throw new Error("onHoverEnd() requires the object to have area() component");s.push(a.onHoverEnd(()=>i(a)))}),Mt.join(s)}n(Oi,"onHoverEnd");function qi(t){S.gravity=t}n(qi,"setGravity");function Hi(){return S.gravity}n(Hi,"getGravity");function Ki(...t){t.length===1||t.length===2?(y.bgColor=Z(t[0]),t[1]&&(y.bgAlpha=t[1])):(t.length===3||t.length===4)&&(y.bgColor=Z(t[0],t[1],t[2]),t[3]&&(y.bgAlpha=t[3])),b.clearColor(y.bgColor.r/255,y.bgColor.g/255,y.bgColor.b/255,y.bgAlpha)}n(Ki,"setBackground");function Yi(){return y.bgColor.clone()}n(Yi,"getBackground");function $t(...t){return{id:"pos",pos:M(...t),moveBy(...i){this.pos=this.pos.add(M(...i))},move(...i){this.moveBy(M(...i).scale(Ce()))},moveTo(...i){if(typeof i[0]=="number"&&typeof i[1]=="number")return this.moveTo(M(i[0],i[1]),i[2]);let s=i[0],a=i[1];if(a===void 0){this.pos=M(s);return}let o=s.sub(this.pos);if(o.len()<=a*Ce()){this.pos=M(s);return}this.move(o.unit().scale(a))},worldPos(){return this.parent?this.parent.transform.multVec2(this.pos):this.pos},screenPos(){let i=this.worldPos();return St(this)?i:Or(i)},inspect(){return`(${Math.round(this.pos.x)}, ${Math.round(this.pos.y)})`},drawInspect(){q({color:Z(255,0,0),radius:4/De()})}}}n($t,"pos");function er(...t){return t.length===0?er(1):{id:"scale",scale:M(...t),scaleTo(...i){this.scale=M(...i)},scaleBy(...i){this.scale.scale(M(...i))},inspect(){return`(${bt(this.scale.x,2)}, ${bt(this.scale.y,2)})`}}}n(er,"scale");function ji(t){return{id:"rotate",angle:t??0,rotateBy(i){this.angle+=i},rotateTo(i){this.angle=i},inspect(){return`${Math.round(this.angle)}`}}}n(ji,"rotate");function Qi(...t){return{id:"color",color:Z(...t),inspect(){return this.color.toString()}}}n(Qi,"color");function bt(t,i){return Number(t.toFixed(i))}n(bt,"toFixed");function zi(t){return{id:"opacity",opacity:t??1,inspect(){return`${bt(this.opacity,1)}`},fadeOut(i=1,s=Rr.linear){return Jr(this.opacity,0,i,a=>this.opacity=a,s)}}}n(zi,"opacity");function Vr(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?this.anchor:this.anchor.toString()}}}n(Vr,"anchor");function Ji(t){return{id:"z",z:t,inspect(){return`${this.z}`}}}n(Ji,"z");function Xi(t,i){return{id:"follow",require:["pos"],follow:{obj:t,offset:i??M(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))}}}n(Xi,"follow");function Wi(t,i){let s=typeof t=="number"?E.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(s.scale(i))}}}n(Wi,"move");let Gn=200;function Zi(t={}){let i=t.distance??Gn,s=!1;return{id:"offscreen",require:["pos"],isOffScreen(){let a=this.screenPos(),o=new ye(M(0),Ve(),ve());return!lr(o,a)&&o.sdistToPoint(a)>i*i},onExitScreen(a){return this.on("exitView",a)},onEnterScreen(a){return this.on("enterView",a)},update(){this.isOffScreen()?(s||(this.trigger("exitView"),s=!0),t.hide&&(this.hidden=!0),t.pause&&(this.paused=!0),t.destroy&&this.destroy()):(s&&(this.trigger("enterView"),s=!1),t.hide&&(this.hidden=!1),t.pause&&(this.paused=!1))}}}n(Zi,"offscreen");function St(t){return t.fixed?!0:t.parent?St(t.parent):!1}n(St,"isFixed");function _i(t={}){let i={},s=new Set;return{id:"area",collisionIgnore:t.collisionIgnore??[],add(){this.area.cursor&&this.onHover(()=>V.setCursor(this.area.cursor)),this.onCollideUpdate((a,o)=>{i[a.id]||this.trigger("collide",a,o),i[a.id]=o,s.add(a.id)})},update(){for(let a in i)s.has(Number(a))||(this.trigger("collideEnd",i[a].target),delete i[a]);s.clear()},drawInspect(){let a=this.localArea();le(),Ne(this.area.scale),$(this.area.offset);let o={outline:{width:4/De(),color:Z(0,0,255)},anchor:this.anchor,fill:!1,fixed:St(this)};a instanceof ye?Ae({...o,pos:a.pos,width:a.width,height:a.height}):a instanceof sr?ce({...o,pts:a.pts}):a instanceof Us&&q({...o,pos:a.center,radius:a.radius}),ne()},area:{shape:t.shape??null,scale:t.scale?M(t.scale):M(1),offset:t.offset??M(0),cursor:t.cursor??null},isClicked(){return V.isMousePressed()&&this.isHovering()},isHovering(){let a=St(this)?Wt():qr(Wt());return this.hasPoint(a)},checkCollision(a){return i[a.id]??null},getCollisions(){return Object.values(i)},isColliding(a){return!!i[a.id]},isOverlapping(a){let o=i[a.id];return o&&o.hasOverlap()},onClick(a){let o=V.onMousePress("left",()=>{this.isHovering()&&a()});return this.onDestroy(()=>o.cancel()),o},onHover(a){let o=!1;return this.onUpdate(()=>{o?o=this.isHovering():this.isHovering()&&(o=!0,a())})},onHoverUpdate(a){return this.onUpdate(()=>{this.isHovering()&&a()})},onHoverEnd(a){let o=!1;return this.onUpdate(()=>{o?this.isHovering()||(o=!1,a()):o=this.isHovering()})},onCollide(a,o){if(typeof a=="function"&&o===void 0)return this.on("collide",a);if(typeof a=="string")return this.onCollide((l,p)=>{l.is(a)&&o(l,p)})},onCollideUpdate(a,o){if(typeof a=="function"&&o===void 0)return this.on("collideUpdate",a);if(typeof a=="string")return this.on("collideUpdate",(l,p)=>l.is(a)&&o(l,p))},onCollideEnd(a,o){if(typeof a=="function"&&o===void 0)return this.on("collideEnd",a);if(typeof a=="string")return this.on("collideEnd",l=>l.is(a)&&o(l))},hasPoint(a){return vi(this.worldArea(),a)},resolveCollision(a){let o=this.checkCollision(a);o&&!o.resolved&&(this.pos=this.pos.add(o.displacement),o.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let a=this.localArea();if(!(a instanceof sr||a instanceof ye))throw new Error("Only support polygon and rect shapes for now");let o=this.transform.clone().scale(M(this.area.scale??1)).translate(this.area.offset);if(a instanceof ye){let l=lt(this.anchor||Mr).add(1,1).scale(-.5).scale(a.width,a.height);o.translate(l)}return a.transform(o)},screenArea(){let a=this.worldArea();return St(this)?a:a.transform(S.cam.transform)}}}n(_i,"area");function Ze(t){return{color:t.color,opacity:t.opacity,anchor:t.anchor,outline:t.outline,shader:t.shader,uniform:t.uniform}}n(Ze,"getRenderProps");function vr(t,i={}){let s=null,a=null,o=null,l=new ke;if(!t)throw new Error("Please pass the resource name or data to sprite()");let p=n((w,g,d,m)=>{let T=M(1,1);return d&&m?(T.x=d/(w.width*g.w),T.y=m/(w.height*g.h)):d?(T.x=d/(w.width*g.w),T.y=T.x):m&&(T.y=m/(w.height*g.h),T.x=T.y),T},"calcTexScale");return{id:"sprite",width:0,height:0,frame:i.frame||0,quad:i.quad||new me(0,0,1,1),animSpeed:i.animSpeed??1,flipX:i.flipX??!1,flipY:i.flipY??!1,draw(){if(!s)return;let w=s.frames[this.frame??0];if(!w)throw new Error(`Frame not found: ${this.frame??0}`);if(s.slice9){let{left:g,right:d,top:m,bottom:T}=s.slice9,B=s.tex.width*w.w,L=s.tex.height*w.h,G=this.width-g-d,D=this.height-m-T,N=g/B,Te=d/B,z=1-N-Te,J=m/L,O=T/L,pe=1-J-O,x=[he(0,0,N,J),he(N,0,z,J),he(N+z,0,Te,J),he(0,J,N,pe),he(N,J,z,pe),he(N+z,J,Te,pe),he(0,J+pe,N,O),he(N,J+pe,z,O),he(N+z,J+pe,Te,O),he(0,0,g,m),he(g,0,G,m),he(g+G,0,d,m),he(0,m,g,D),he(g,m,G,D),he(g+G,m,d,D),he(0,m+D,g,T),he(g,m+D,G,T),he(g+G,m+D,d,T)];for(let F=0;F<9;F++){let I=x[F],k=x[F+9];Je(Object.assign(Ze(this),{pos:k.pos(),tex:s.tex,quad:w.scale(I),flipX:this.flipX,flipY:this.flipY,tiled:i.tiled,width:k.w,height:k.h}))}}else Je(Object.assign(Ze(this),{tex:s.tex,quad:w.scale(this.quad??new me(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:i.tiled,width:this.width,height:this.height}))},add(){let w=n(d=>{let m=d.frames[0].clone();i.quad&&(m=m.scale(i.quad));let T=p(d.tex,m,i.width,i.height);this.width=d.tex.width*m.w*T.x,this.height=d.tex.height*m.h*T.y,i.anim&&this.play(i.anim),s=d,l.trigger(s)},"setSpriteData"),g=rt(t);g?g.onLoad(w):xr(()=>w(rt(t).data))},update(){if(!a)return;let w=s.anims[a.name];if(typeof w=="number"){this.frame=w;return}if(w.speed===0)throw new Error("Sprite anim speed cannot be 0");a.timer+=Ce()*this.animSpeed,a.timer>=1/a.speed&&(a.timer=0,this.frame+=o,(this.frame<Math.min(w.from,w.to)||this.frame>Math.max(w.from,w.to))&&(a.loop?a.pingpong?(this.frame-=o,o*=-1,this.frame+=o):this.frame=w.from:(this.frame=w.to,a.onEnd(),this.stop())))},play(w,g={}){if(!s){l.add(()=>this.play(w,g));return}let d=s.anims[w];if(d===void 0)throw new Error(`Anim not found: ${w}`);a&&this.stop(),a=typeof d=="number"?{name:w,timer:0,loop:!1,pingpong:!1,speed:0,onEnd:()=>{}}:{name:w,timer:0,loop:g.loop??d.loop??!1,pingpong:g.pingpong??d.pingpong??!1,speed:g.speed??d.speed??10,onEnd:g.onEnd??(()=>{})},o=typeof d=="number"?null:d.from<d.to?1:-1,this.frame=typeof d=="number"?d:d.from,this.trigger("animStart",w)},stop(){if(!a)return;let w=a.name;a=null,this.trigger("animEnd",w)},numFrames(){return s?.frames.length??0},curAnim(){return a?.name},onAnimEnd(w){return this.on("animEnd",w)},onAnimStart(w){return this.on("animStart",w)},renderArea(){return new ye(M(0),this.width,this.height)},inspect(){if(typeof t=="string")return`"${t}"`}}}n(vr,"sprite");function $i(t,i={}){function s(o){let l=Xe(Object.assign(Ze(o),{text:o.text+"",size:o.textSize,font:o.font,width:i.width&&o.width,align:o.align,letterSpacing:o.letterSpacing,lineSpacing:o.lineSpacing,transform:o.textTransform,styles:o.textStyles}));return i.width||(o.width=l.width/(o.scale?.x||1)),o.height=l.height/(o.scale?.y||1),l}n(s,"update");let a={id:"text",set text(o){t=o,s(this)},get text(){return t},textSize:i.size??Vo,font:i.font,width:i.width??0,height:0,align:i.align,lineSpacing:i.lineSpacing,letterSpacing:i.letterSpacing,textTransform:i.transform,textStyles:i.styles,add(){xr(()=>s(this))},draw(){We(s(this))},renderArea(){return new ye(M(0),this.width,this.height)}};return s(a),a}n($i,"text");function es(t,i={}){if(t.length<3)throw new Error(`Polygon's need more than two points, ${t.length} points provided`);return{id:"polygon",pts:t,colors:i.colors,radius:i.radius,draw(){ce(Object.assign(Ze(this),{pts:this.pts,colors:this.colors,radius:this.radius,fill:i.fill}))},renderArea(){return new sr(this.pts)},inspect(){return this.pts.map(s=>`[${s.x},${s.y}]`).join(",")}}}n(es,"polygon");function ts(t,i,s={}){return{id:"rect",width:t,height:i,radius:s.radius||0,draw(){Ae(Object.assign(Ze(this),{width:this.width,height:this.height,radius:this.radius,fill:s.fill}))},renderArea(){return new ye(M(0),this.width,this.height)},inspect(){return`${Math.ceil(this.width)}, ${Math.ceil(this.height)}`}}}n(ts,"rect");function rs(t,i){return{id:"rect",width:t,height:i,draw(){Ue(Object.assign(Ze(this),{width:this.width,height:this.height}))},renderArea(){return new ye(M(0),this.width,this.height)},inspect(){return`${Math.ceil(this.width)}, ${Math.ceil(this.height)}`}}}n(rs,"uvquad");function is(t,i={}){return{id:"circle",radius:t,draw(){q(Object.assign(Ze(this),{radius:this.radius,fill:i.fill}))},renderArea(){return new ye(new E(this.anchor?0:-this.radius),this.radius*2,this.radius*2)},inspect(){return`${Math.ceil(this.radius)}`}}}n(is,"circle");function ss(t=1,i=Z(0,0,0)){return{id:"outline",outline:{width:t,color:i}}}n(ss,"outline");function yr(){return{id:"timer",wait(t,i){let s=[];i&&s.push(i);let a=0,o=this.onUpdate(()=>{a+=Ce(),a>=t&&(s.forEach(l=>l()),o.cancel())});return{get paused(){return o.paused},set paused(l){o.paused=l},cancel:o.cancel,onEnd(l){s.push(l)},then(l){return this.onEnd(l),this}}},loop(t,i){let s=null,a=n(()=>{s=this.wait(t,a),i()},"newAction");return s=this.wait(0,a),{get paused(){return s.paused},set paused(o){s.paused=o},cancel:()=>s.cancel()}},tween(t,i,s,a,o=Rr.linear){let l=0,p=[],w=this.onUpdate(()=>{l+=Ce();let g=Math.min(l/s,1);a(Qe(t,i,o(g))),g===1&&(w.cancel(),a(i),p.forEach(d=>d()))});return{get paused(){return w.paused},set paused(g){w.paused=g},onEnd(g){p.push(g)},then(g){return this.onEnd(g),this},cancel(){w.cancel()},finish(){w.cancel(),a(i),p.forEach(g=>g())}}}}}n(yr,"timer");let On=640,qn=65536;function ns(t={}){let i=null,s=null,a=!1;return{id:"body",require:["pos","area"],vel:new E(0),jumpForce:t.jumpForce??On,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(this.mass===0)throw new Error("Can't set body mass to 0");this.onCollideUpdate((o,l)=>{if(o.is("body")&&!l.resolved&&(this.trigger("beforePhysicsResolve",l),o.trigger("beforePhysicsResolve",l.reverse()),!l.resolved&&!(this.isStatic&&o.isStatic))){if(!this.isStatic&&!o.isStatic){let p=this.mass+o.mass;this.pos=this.pos.add(l.displacement.scale(o.mass/p)),o.pos=o.pos.add(l.displacement.scale(-this.mass/p)),this.transform=Zt(this),o.transform=Zt(o)}else{let p=!this.isStatic&&o.isStatic?l:l.reverse();p.source.pos=p.source.pos.add(p.displacement),p.source.transform=Zt(p.source)}l.resolved=!0,this.trigger("physicsResolve",l),o.trigger("physicsResolve",l.reverse())}}),this.onPhysicsResolve(o=>{S.gravity&&(o.isBottom()&&this.isFalling()?(this.vel.y=0,i=o.target,s=o.target.pos,a?a=!1:this.trigger("ground",i)):o.isTop()&&this.isJumping()&&(this.vel.y=0,this.trigger("headbutt",o.target)))})},update(){if(!S.gravity||this.isStatic)return;if(a&&(i=null,s=null,this.trigger("fallOff"),a=!1),i)if(!this.isColliding(i)||!i.exists()||!i.is("body"))a=!0;else{!i.pos.eq(s)&&t.stickToPlatform!==!1&&this.moveBy(i.pos.sub(s)),s=i.pos;return}let o=this.vel.y;this.vel.y+=S.gravity*this.gravityScale*Ce(),this.vel.y=Math.min(this.vel.y,t.maxVelocity??qn),o<0&&this.vel.y>=0&&this.trigger("fall"),this.move(this.vel)},onPhysicsResolve(o){return this.on("physicsResolve",o)},onBeforePhysicsResolve(o){return this.on("beforePhysicsResolve",o)},curPlatform(){return i},isGrounded(){return i!==null},isFalling(){return this.vel.y>0},isJumping(){return this.vel.y<0},jump(o){i=null,s=null,this.vel.y=-o||-this.jumpForce},onGround(o){return this.on("ground",o)},onFall(o){return this.on("fall",o)},onFallOff(o){return this.on("fallOff",o)},onHeadbutt(o){return this.on("headbutt",o)}}}n(ns,"body");function os(t=2){let i=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{i=this.numJumps})},doubleJump(s){i<=0||(i<this.numJumps&&this.trigger("doubleJump"),i--,this.jump(s))},onDoubleJump(s){return this.on("doubleJump",s)},inspect(){return`${i}`}}}n(os,"doubleJump");function as(t,i){return{id:"shader",shader:t,...typeof i=="function"?{uniform:i(),update(){this.uniform=i()}}:{uniform:i}}}n(as,"shader");function hs(){return{id:"fixed",fixed:!0}}n(hs,"fixed");function Kr(t){return{id:"stay",stay:!0,scenesToStay:t}}n(Kr,"stay");function ls(t,i){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(s=1){this.setHP(t-s),this.trigger("hurt",s)},heal(s=1){let a=t;this.setHP(t+s),this.trigger("heal",t-a)},hp(){return t},maxHP(){return i??null},setMaxHP(s){i=s},setHP(s){t=i?Math.min(i,s):s,t<=0&&this.trigger("death")},onHurt(s){return this.on("hurt",s)},onHeal(s){return this.on("heal",s)},onDeath(s){return this.on("death",s)},inspect(){return`${t}`}}}n(ls,"health");function us(t,i={}){if(t==null)throw new Error("lifespan() requires time");let s=i.fade??0;return{id:"lifespan",async add(){await bs(t),s>0&&this.opacity&&await Jr(this.opacity,0,s,a=>this.opacity=a,Rr.linear),this.destroy()}}}n(us,"lifespan");function ds(t,i,s){if(!t)throw new Error("state() requires an initial state");let a={};function o(g){a[g]||(a[g]={enter:new ke,end:new ke,update:new ke,draw:new ke})}n(o,"initStateEvents");function l(g,d,m){return o(d),a[d][g].add(m)}n(l,"on");function p(g,d,...m){o(d),a[d][g].trigger(...m)}n(p,"trigger");let w=!1;return{id:"state",state:t,enterState(g,...d){if(w=!0,i&&!i.includes(g))throw new Error(`State not found: ${g}`);let m=this.state;if(s){if(!s?.[m])return;let T=typeof s[m]=="string"?[s[m]]:s[m];if(!T.includes(g))throw new Error(`Cannot transition state from "${m}" to "${g}". Available transitions: ${T.map(B=>`"${B}"`).join(", ")}`)}p("end",m,...d),this.state=g,p("enter",g,...d),p("enter",`${m} -> ${g}`,...d)},onStateTransition(g,d,m){return l("enter",`${g} -> ${d}`,m)},onStateEnter(g,d){return l("enter",g,d)},onStateUpdate(g,d){return l("update",g,d)},onStateDraw(g,d){return l("draw",g,d)},onStateEnd(g,d){return l("end",g,d)},update(){w||(p("enter",t),w=!0),p("update",this.state)},draw(){p("draw",this.state)},inspect(){return this.state}}}n(ds,"state");function cs(t=1){let i=0,s=!1;return{require:["opacity"],add(){this.opacity=0},update(){s||(i+=Ce(),this.opacity=$e(i,0,t,0,1),i>=t&&(this.opacity=1,s=!0))}}}n(cs,"fadeIn");function fs(t="intersect"){return{id:"mask",mask:t}}n(fs,"mask");function ps(t){return{add(){this.canvas=t}}}n(ps,"drawon");function xr(t){U.loaded?t():S.events.on("load",t)}n(xr,"onLoad");function gs(t,i){S.scenes[t]=i}n(gs,"scene");function ms(t,...i){if(!S.scenes[t])throw new Error(`Scene not found: ${t}`);S.events.onOnce("frameEnd",()=>{S.events.trigger("sceneLeave",t),V.events.clear(),S.events.clear(),S.objEvents.clear(),[...S.root.children].forEach(s=>{(!s.stay||s.scenesToStay&&!s.scenesToStay.includes(t))&&S.root.remove(s)}),S.root.clearEvents(),ei(),S.cam={pos:null,scale:M(1),angle:0,shake:0,transform:new Le},S.scenes[t](...i)})}n(ms,"go");function ws(t){return S.events.on("sceneLeave",t)}n(ws,"onSceneLeave");function As(t,i){try{return JSON.parse(window.localStorage[t])}catch{return i?(Yr(t,i),i):null}}n(As,"getData");function Yr(t,i){window.localStorage[t]=JSON.stringify(i)}n(Yr,"setData");function jr(t,...i){let s=t(at),a;typeof s=="function"?a=s(...i)(at):a=s;for(let o in a)at[o]=a[o],r.global!==!1&&(window[o]=a[o]);return at}n(jr,"plug");function tr(){return M(Ve()/2,ve()/2)}n(tr,"center");let Hn;(t=>(t[t.None=0]="None",t[t.Left=1]="Left",t[t.Top=2]="Top",t[t.LeftTop=3]="LeftTop",t[t.Right=4]="Right",t[t.Horizontal=5]="Horizontal",t[t.RightTop=6]="RightTop",t[t.HorizontalTop=7]="HorizontalTop",t[t.Bottom=8]="Bottom",t[t.LeftBottom=9]="LeftBottom",t[t.Vertical=10]="Vertical",t[t.LeftVertical=11]="LeftVertical",t[t.RightBottom=12]="RightBottom",t[t.HorizontalBottom=13]="HorizontalBottom",t[t.RightVertical=14]="RightVertical",t[t.All=15]="All"))(Hn||={});function Qr(t={}){let i=M(0),s=t.isObstacle??!1,a=t.cost??0,o=t.edges??[],l=n(()=>{let w={left:1,top:2,right:4,bottom:8};return o.map(g=>w[g]||0).reduce((g,d)=>g|d,0)},"getEdgeMask"),p=l();return{id:"tile",tilePosOffset:t.offset??M(0),set tilePos(w){let g=this.getLevel();i=w.clone(),this.pos=M(this.tilePos.x*g.tileWidth(),this.tilePos.y*g.tileHeight()).add(this.tilePosOffset)},get tilePos(){return i},set isObstacle(w){s!==w&&(s=w,this.getLevel().invalidateNavigationMap())},get isObstacle(){return s},set cost(w){a!==w&&(a=w,this.getLevel().invalidateNavigationMap())},get cost(){return a},set edges(w){o=w,p=l(),this.getLevel().invalidateNavigationMap()},get edges(){return o},get edgeMask(){return p},getLevel(){return this.parent},moveLeft(){this.tilePos=this.tilePos.add(M(-1,0))},moveRight(){this.tilePos=this.tilePos.add(M(1,0))},moveUp(){this.tilePos=this.tilePos.add(M(0,-1))},moveDown(){this.tilePos=this.tilePos.add(M(0,1))}}}n(Qr,"tile");function Vs(t,i){if(!i.tileWidth||!i.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let s=rr([$t(i.pos??M(0))]),a=t.length,o=0,l=null,p=null,w=null,g=null,d=n(x=>x.x+x.y*o,"tile2Hash"),m=n(x=>M(Math.floor(x%o),Math.floor(x/o)),"hash2Tile"),T=n(()=>{l=[];for(let x of s.children)B(x)},"createSpatialMap"),B=n(x=>{let F=d(x.tilePos);l[F]?l[F].push(x):l[F]=[x]},"insertIntoSpatialMap"),L=n(x=>{let F=d(x.tilePos);if(l[F]){let I=l[F].indexOf(x);I>=0&&l[F].splice(I,1)}},"removeFromSpatialMap"),G=n(()=>{let x=!1;for(let F of s.children){let I=s.pos2Tile(F.pos);(F.tilePos.x!=I.x||F.tilePos.y!=I.y)&&(x=!0,L(F),F.tilePos.x=I.x,F.tilePos.y=I.y,B(F))}x&&s.trigger("spatial_map_changed")},"updateSpatialMap"),D=n(()=>{let x=s.getSpatialMap(),F=s.numRows()*s.numColumns();p?p.length=F:p=new Array(F),p.fill(1,0,F);for(let I=0;I<x.length;I++){let k=x[I];if(k){let X=0;for(let _ of k)if(_.isObstacle){X=1/0;break}else X+=_.cost;p[I]=X||1}}},"createCostMap"),N=n(()=>{let x=s.getSpatialMap(),F=s.numRows()*s.numColumns();w?w.length=F:w=new Array(F),w.fill(15,0,F);for(let I=0;I<x.length;I++){let k=x[I];if(k){let X=k.length,_=15;for(let ae=0;ae<X;ae++)_|=k[ae].edgeMask;w[I]=_}}},"createEdgeMap"),Te=n(()=>{let x=s.numRows()*s.numColumns(),F=n((k,X)=>{let _=[];for(_.push(k);_.length>0;){let ae=_.pop();O(ae).forEach(ge=>{g[ge]<0&&(g[ge]=X,_.push(ge))})}},"traverse");g?g.length=x:g=new Array(x),g.fill(-1,0,x);let I=0;for(let k=0;k<p.length;k++){if(g[k]>=0){I++;continue}F(k,I),I++}},"createConnectivityMap"),z=n((x,F)=>p[F],"getCost"),J=n((x,F)=>{let I=m(x),k=m(F);return I.dist(k)},"getHeuristic"),O=n((x,F)=>{let I=[],k=Math.floor(x%o),X=k>0&&w[x]&1&&p[x-1]!==1/0,_=x>=o&&w[x]&2&&p[x-o]!==1/0,ae=k<o-1&&w[x]&4&&p[x+1]!==1/0,ge=x<o*a-o-1&&w[x]&8&&p[x+o]!==1/0;return F?(X&&(_&&I.push(x-o-1),I.push(x-1),ge&&I.push(x+o-1)),_&&I.push(x-o),ae&&(_&&I.push(x-o+1),I.push(x+1),ge&&I.push(x+o+1)),ge&&I.push(x+o)):(X&&I.push(x-1),_&&I.push(x-o),ae&&I.push(x+1),ge&&I.push(x+o)),I},"getNeighbours"),pe={id:"level",tileWidth(){return i.tileWidth},tileHeight(){return i.tileHeight},spawn(x,...F){let I=M(...F),k=(()=>{if(typeof x=="string"){if(i.tiles[x]){if(typeof i.tiles[x]!="function")throw new Error("Level symbol def must be a function returning a component list");return i.tiles[x](I)}else if(i.wildcardTile)return i.wildcardTile(x,I)}else{if(Array.isArray(x))return x;throw new Error("Expected a symbol or a component list")}})();if(!k)return null;let X=!1,_=!1;for(let ge of k)ge.id==="tile"&&(_=!0),ge.id==="pos"&&(X=!0);X||k.push($t()),_||k.push(Qr());let ae=s.add(k);return X&&(ae.tilePosOffset=ae.pos.clone()),ae.tilePos=I,l&&(B(ae),this.trigger("spatial_map_changed"),this.trigger("navigation_map_invalid")),ae},numColumns(){return o},numRows(){return a},levelWidth(){return o*this.tileWidth()},levelHeight(){return a*this.tileHeight()},tile2Pos(...x){return M(...x).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...x){let F=M(...x);return M(Math.floor(F.x/this.tileWidth()),Math.floor(F.y/this.tileHeight()))},getSpatialMap(){return l||T(),l},onSpatialMapChanged(x){return this.on("spatial_map_changed",x)},onNavigationMapInvalid(x){return this.on("navigation_map_invalid",x)},getAt(x){l||T();let F=d(x);return l[F]||[]},update(){l&&G()},invalidateNavigationMap(){p=null,w=null,g=null},onNavigationMapChanged(x){return this.on("navigation_map_changed",x)},getTilePath(x,F,I={}){if(p||D(),w||N(),g||Te(),x.x<0||x.x>=o||x.y<0||x.y>=a||F.x<0||F.x>=o||F.y<0||F.y>=a)return null;let k=d(x),X=d(F);if(p[X]===1/0)return null;if(k===X)return[];if(g[k]!=-1&&g[k]!==g[X])return null;let _=new so((Ke,ri)=>Ke.cost<ri.cost);_.insert({cost:0,node:k});let ae=new Map;ae.set(k,k);let ge=new Map;for(ge.set(k,0);_.length!==0;){let Ke=_.remove()?.node;if(Ke===X)break;let ri=O(Ke,I.allowDiagonals);for(let ht of ri){let ii=(ge.get(Ke)||0)+z(Ke,ht)+J(ht,X);(!ge.has(ht)||ii<ge.get(ht))&&(ge.set(ht,ii),_.insert({cost:ii,node:ht}),ae.set(ht,Ke))}}let ti=[],ir=X,Jn=m(ir);for(ti.push(Jn);ir!==k;){ir=ae.get(ir);let Ke=m(ir);ti.push(Ke)}return ti.reverse()},getPath(x,F,I={}){let k=this.tileWidth(),X=this.tileHeight(),_=this.getTilePath(this.pos2Tile(x),this.pos2Tile(F),I);return _?[x,..._.slice(1,-1).map(ae=>ae.scale(k,X).add(k/2,X/2)),F]:null}};return s.use(pe),s.onNavigationMapInvalid(()=>{s.invalidateNavigationMap(),s.trigger("navigation_map_changed")}),t.forEach((x,F)=>{let I=x.split("");o=Math.max(I.length,o),I.forEach((k,X)=>{s.spawn(k,M(X,F))})}),s}n(Vs,"addLevel");function vs(t={}){let i=null,s=null,a=null,o=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return i?this.pos.dist(i):0},getNextLocation(){return s&&a?s[a]:null},getPath(){return s?s.slice():null},getTarget(){return i},isNavigationFinished(){return s?a===null:!0},isTargetReachable(){return s!==null},isTargetReached(){return i?this.pos.eq(i):!0},setTarget(l){i=l,s=this.getLevel().getPath(this.pos,i,{allowDiagonals:this.allowDiagonals}),a=s?0:null,s?(o||(o=this.getLevel().onNavigationMapChanged(()=>{s&&a!==null&&(s=this.getLevel().getPath(this.pos,i,{allowDiagonals:this.allowDiagonals}),a=s?0:null,s?this.trigger("navigation-next",this,s[a]):this.trigger("navigation-ended",this))}),this.onDestroy(()=>o.cancel())),this.trigger("navigation-started",this),this.trigger("navigation-next",this,s[a])):this.trigger("navigation-ended",this)},update(){if(s&&a!==null){if(this.pos.sdist(s[a])<2)if(a===s.length-1){this.pos=i.clone(),a=null,this.trigger("navigation-ended",this),this.trigger("target-reached",this);return}else a++,this.trigger("navigation-next",this,s[a]);this.moveTo(s[a],this.agentSpeed)}},onNavigationStarted(l){return this.on("navigation-started",l)},onNavigationNext(l){return this.on("navigation-next",l)},onNavigationEnded(l){return this.on("navigation-ended",l)},onTargetReached(l){return this.on("target-reached",l)},inspect(){return JSON.stringify({target:JSON.stringify(i),path:JSON.stringify(s)})}}}n(vs,"agent");function ys(t){let i=V.canvas.captureStream(t),s=te.ctx.createMediaStreamDestination();te.masterNode.connect(s);let a=new MediaRecorder(i),o=[];return a.ondataavailable=l=>{l.data.size>0&&o.push(l.data)},a.onerror=()=>{te.masterNode.disconnect(s),i.getTracks().forEach(l=>l.stop())},a.start(),{resume(){a.resume()},pause(){a.pause()},stop(){return a.stop(),te.masterNode.disconnect(s),i.getTracks().forEach(l=>l.stop()),new Promise(l=>{a.onstop=()=>{l(new Blob(o,{type:"video/mp4"}))}})},download(l="kaboom.mp4"){this.stop().then(p=>pi(l,p))}}}n(ys,"record");function xs(){return document.activeElement===V.canvas}n(xs,"isFocused");function Es(t){t.destroy()}n(Es,"destroy");let rr=S.root.add.bind(S.root),Kn=S.root.readd.bind(S.root),Yn=S.root.removeAll.bind(S.root),zr=S.root.get.bind(S.root),bs=S.root.wait.bind(S.root),jn=S.root.loop.bind(S.root),Jr=S.root.tween.bind(S.root);function Xr(t=2,i=1){let s=0;return{require:["scale"],update(){let a=Math.sin(s*t)*i;a<0&&this.destroy(),this.scale=M(a),s+=Ce()}}}n(Xr,"boom");let Qn=Oe(null,go),zn=Oe(null,mo);function Ss(t,i={}){let s=rr([$t(t),Kr()]),a=(i.speed||1)*5,o=i.scale||1;s.add([vr(zn),er(0),Vr("center"),Xr(a,o),...i.comps??[]]);let l=s.add([vr(Qn),er(0),Vr("center"),yr(),...i.comps??[]]);return l.wait(.4/a,()=>l.use(Xr(a,o))),l.onDestroy(()=>s.destroy()),s}n(Ss,"addKaboom");function Wr(){S.root.update()}n(Wr,"updateFrame");class Zr{static{n(this,"Collision")}source;target;displacement;resolved=!1;constructor(i,s,a,o=!1){this.source=i,this.target=s,this.displacement=a,this.resolved=o}reverse(){return new Zr(this.target,this.source,this.displacement.scale(-1),this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.x>0}isRight(){return this.displacement.x<0}isTop(){return this.displacement.y>0}isBottom(){return this.displacement.y<0}preventResolution(){this.resolved=!0}}function Rs(){let t={},i=r.hashGridSize||vo,s=new Le,a=[];function o(l){if(a.push(s.clone()),l.pos&&s.translate(l.pos),l.scale&&s.scale(l.scale),l.angle&&s.rotate(l.angle),l.transform=s.clone(),l.c("area")&&!l.paused){let p=l,w=p.worldArea().bbox(),g=Math.floor(w.pos.x/i),d=Math.floor(w.pos.y/i),m=Math.ceil((w.pos.x+w.width)/i),T=Math.ceil((w.pos.y+w.height)/i),B=new Set;for(let L=g;L<=m;L++)for(let G=d;G<=T;G++)if(!t[L])t[L]={},t[L][G]=[p];else if(!t[L][G])t[L][G]=[p];else{let D=t[L][G];e:for(let N of D){if(N.paused||!N.exists()||B.has(N.id))continue;for(let z of p.collisionIgnore)if(N.is(z))continue e;for(let z of N.collisionIgnore)if(p.is(z))continue e;let Te=hn(p.worldArea(),N.worldArea());if(Te){let z=new Zr(p,N,Te);p.trigger("collideUpdate",N,z);let J=z.reverse();J.resolved=z.resolved,N.trigger("collideUpdate",p,J)}B.add(N.id)}D.push(p)}}l.children.forEach(o),s=a.pop()}n(o,"checkObj"),o(S.root)}n(Rs,"checkFrame");function Ms(){let t=S.cam,i=E.fromAngle(hr(0,360)).scale(t.shake);t.shake=Qe(t.shake,0,5*Ce()),t.transform=new Le().translate(tr()).scale(t.scale).rotate(t.angle).translate((t.pos??tr()).scale(-1).add(i)),S.root.draw(),Fe()}n(Ms,"drawFrame");function Ts(){let t=K();S.events.numListeners("loading")>0?S.events.trigger("loading",t):Me(()=>{let i=Ve()/2,s=24,a=M(Ve()/2,ve()/2).sub(M(i/2,s/2));Ae({pos:M(0),width:Ve(),height:ve(),color:Z(0,0,0)}),Ae({pos:a,width:i,height:s,fill:!1,outline:{width:4}}),Ae({pos:a,width:i*t,height:s})})}n(Ts,"drawLoadScreen");function _r(t,i){Me(()=>{let s=M(8);le(),$(t);let a=Xe({text:i,font:Tr,size:16,pos:s,color:Z(255,255,255),fixed:!0}),o=a.width+s.x*2,l=a.height+s.x*2;t.x+o>=Ve()&&$(M(-o,0)),t.y+l>=ve()&&$(M(0,-l)),Ae({width:o,height:l,color:Z(0,0,0),radius:4,opacity:.8,fixed:!0}),We(a),ne()})}n(_r,"drawInspectText");function Ps(){if(se.inspect){let t=null;for(let i of S.root.get("*",{recursive:!0}))if(i.c("area")&&i.isHovering()){t=i;break}if(S.root.drawInspect(),t){let i=[],s=t.inspect();for(let a in s)s[a]?i.push(`${a}: ${s[a]}`):i.push(`${a}`);_r(Ti(Wt()),i.join(`
|
|
`))}_r(M(8),`FPS: ${se.fps()}`)}se.paused&&Me(()=>{le(),$(Ve(),0),$(-8,8);let t=32;Ae({width:t,height:t,anchor:"topright",color:Z(0,0,0),opacity:.8,radius:4,fixed:!0});for(let i=1;i<=2;i++)Ae({width:4,height:t*.6,anchor:"center",pos:M(-t/3*i,t*.5),color:Z(255,255,255),radius:2,fixed:!0});ne()}),se.timeScale!==1&&Me(()=>{le(),$(Ve(),ve()),$(-8,-8);let t=8,i=Xe({text:se.timeScale.toFixed(1),font:Tr,size:16,color:Z(255,255,255),pos:M(-t),anchor:"botright",fixed:!0});Ae({width:i.width+t*2+t*4,height:i.height+t*2,anchor:"botright",color:Z(0,0,0),opacity:.8,radius:4,fixed:!0});for(let s=0;s<2;s++){let a=se.timeScale<1;R({p1:M(-i.width-t*(a?2:3.5),-t),p2:M(-i.width-t*(a?2:3.5),-t-i.height),p3:M(-i.width-t*(a?3.5:2),-t-i.height/2),pos:M(-s*t*1+(a?-t*.5:0),0),color:Z(255,255,255),fixed:!0})}We(i),ne()}),se.curRecording&&Me(()=>{le(),$(0,ve()),$(24,-24),q({radius:12,color:Z(255,0,0),opacity:hi(0,1,V.time()*4),fixed:!0}),ne()}),se.showLog&&S.logs.length>0&&Me(()=>{le(),$(0,ve()),$(8,-8);let t=8,i=[];for(let a of S.logs){let o="",l=a.msg instanceof Error?"error":"info";o+=`[time]${a.time.toFixed(2)}[/time]`,o+=" ",o+=`[${l}]${a.msg?.toString?a.msg.toString():a.msg}[/${l}]`,i.push(o)}S.logs=S.logs.filter(a=>V.time()-a.time<(r.logTime||xo));let s=Xe({text:i.join(`
|
|
`),font:Tr,pos:M(t,-t),anchor:"botleft",size:16,width:Ve()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:Z(127,127,127)},info:{color:Z(255,255,255)},error:{color:Z(255,0,127)}}});Ae({width:s.width+t*2,height:s.height+t*2,anchor:"botleft",color:Z(0,0,0),radius:4,opacity:.8,fixed:!0}),We(s),ne()})}n(Ps,"drawDebug");function Bs(t){S.events.on("loading",t)}n(Bs,"onLoading");function Fs(t){V.onResize(t)}n(Fs,"onResize");function Is(t){S.events.on("error",t)}n(Is,"onError");function Ds(t){console.error(t),te.ctx.suspend(),V.run(()=>{nt(),Me(()=>{let i=Ve(),s=ve(),a={size:36,width:i-32*2,letterSpacing:4,lineSpacing:4,font:Tr,fixed:!0};Ae({width:i,height:s,color:Z(0,0,255),fixed:!0});let o=Xe({...a,text:"Error",pos:M(32),color:Z(255,128,0),fixed:!0});We(o),Gr({...a,text:t.message,pos:M(32,32+o.height+16),fixed:!0}),ne(),S.events.trigger("error",t)}),ot()})}n(Ds,"handleErr");function Cs(t){re.push(t)}n(Cs,"onCleanup");function ks(){S.events.onOnce("frameEnd",()=>{V.quit(),b.clear(b.COLOR_BUFFER_BIT|b.DEPTH_BUFFER_BIT|b.STENCIL_BUFFER_BIT);let t=b.getParameter(b.MAX_TEXTURE_IMAGE_UNITS);for(let i=0;i<t;i++)b.activeTexture(b.TEXTURE0+i),b.bindTexture(b.TEXTURE_2D,null),b.bindTexture(b.TEXTURE_CUBE_MAP,null);b.bindBuffer(b.ARRAY_BUFFER,null),b.bindBuffer(b.ELEMENT_ARRAY_BUFFER,null),b.bindRenderbuffer(b.RENDERBUFFER,null),b.bindFramebuffer(b.FRAMEBUFFER,null),j.destroy(),re.forEach(i=>i())})}n(ks,"quit");let Er=!0;V.run(()=>{try{U.loaded||K()===1&&!Er&&(U.loaded=!0,S.events.trigger("load")),!U.loaded&&r.loadingScreen!==!1||Er?(nt(),Ts(),ot()):(se.paused||Wr(),Rs(),nt(),Ms(),r.debug!==!1&&Ps(),ot()),Er&&(Er=!1),S.events.trigger("frameEnd")}catch(t){Ds(t)}});function $r(){let t=P,i=b.drawingBufferWidth/t,s=b.drawingBufferHeight/t;if(r.letterbox){if(!r.width||!r.height)throw new Error("Letterboxing requires width and height defined.");let a=i/s,o=r.width/r.height;if(a>o){let l=s*o,p=(i-l)/2;y.viewport={x:p,y:0,width:l,height:s}}else{let l=i/o,p=(s-l)/2;y.viewport={x:0,y:p,width:i,height:l}}return}if(r.stretch&&(!r.width||!r.height))throw new Error("Stretching requires width and height defined.");y.viewport={x:0,y:0,width:i,height:s}}n($r,"updateViewport");function ei(){V.onHide(()=>{r.backgroundAudio||te.ctx.suspend()}),V.onShow(()=>{!r.backgroundAudio&&!se.paused&&te.ctx.resume()}),V.onResize(()=>{if(V.isFullscreen())return;let t=r.width&&r.height;t&&!r.stretch&&!r.letterbox||(h.width=h.offsetWidth*P,h.height=h.offsetHeight*P,$r(),t||(y.frameBuffer.free(),y.frameBuffer=new br(j,b.drawingBufferWidth,b.drawingBufferHeight),y.width=b.drawingBufferWidth/P,y.height=b.drawingBufferHeight/P))}),r.debug!==!1&&(V.onKeyPress("f1",()=>se.inspect=!se.inspect),V.onKeyPress("f2",()=>se.clearLog()),V.onKeyPress("f8",()=>se.paused=!se.paused),V.onKeyPress("f7",()=>{se.timeScale=bt(je(se.timeScale-.2,0,2),1)}),V.onKeyPress("f9",()=>{se.timeScale=bt(je(se.timeScale+.2,0,2),1)}),V.onKeyPress("f10",()=>se.stepFrame())),r.burp&&V.onKeyPress("b",()=>yt())}n(ei,"initEvents"),$r(),ei();let at={VERSION:wo,loadRoot:Se,loadProgress:K,loadSprite:Oe,loadSpriteAtlas:gt,loadSound:gr,loadBitmapFont:kt,loadFont:ze,loadShader:fr,loadShaderURL:pr,loadAseprite:Ut,loadPedit:Nt,loadBean:mr,loadJSON:we,load:Be,getSprite:Lt,getSound:Gt,getFont:Ot,getBitmapFont:wt,getShader:At,getAsset:qt,Asset:Ie,SpriteData:W,SoundData:de,width:Ve,height:ve,center:tr,dt:Ce,time:V.time,screenshot:V.screenshot,record:ys,isFocused:xs,setCursor:V.setCursor,getCursor:V.getCursor,setCursorLocked:V.setCursorLocked,isCursorLocked:V.isCursorLocked,setFullscreen:V.setFullscreen,isFullscreen:V.isFullscreen,isTouchscreen:V.isTouchscreen,onLoad:xr,onLoading:Bs,onResize:Fs,onGamepadConnect:V.onGamepadConnect,onGamepadDisconnect:V.onGamepadDisconnect,onError:Is,onCleanup:Cs,camPos:Bi,camScale:Fi,camRot:Ii,shake:Di,toScreen:Or,toWorld:qr,setGravity:qi,getGravity:Hi,setBackground:Ki,getBackground:Yi,getGamepads:V.getGamepads,add:rr,make:Ar,destroy:Es,destroyAll:Yn,get:zr,readd:Kn,pos:$t,scale:er,rotate:ji,color:Qi,opacity:zi,anchor:Vr,area:_i,sprite:vr,text:$i,polygon:es,rect:ts,circle:is,uvquad:rs,outline:ss,body:ns,doubleJump:os,shader:as,timer:yr,fixed:hs,stay:Kr,health:ls,lifespan:us,z:Ji,move:Wi,offscreen:Zi,follow:Xi,state:ds,fadeIn:cs,mask:fs,drawon:ps,tile:Qr,agent:vs,on:He,onUpdate:Nn,onDraw:Un,onAdd:Hr,onDestroy:Ci,onClick:Ln,onCollide:ki,onCollideUpdate:Ni,onCollideEnd:Ui,onHover:Li,onHoverUpdate:Gi,onHoverEnd:Oi,onKeyDown:V.onKeyDown,onKeyPress:V.onKeyPress,onKeyPressRepeat:V.onKeyPressRepeat,onKeyRelease:V.onKeyRelease,onMouseDown:V.onMouseDown,onMousePress:V.onMousePress,onMouseRelease:V.onMouseRelease,onMouseMove:V.onMouseMove,onCharInput:V.onCharInput,onTouchStart:V.onTouchStart,onTouchMove:V.onTouchMove,onTouchEnd:V.onTouchEnd,onScroll:V.onScroll,onHide:V.onHide,onShow:V.onShow,onGamepadButtonDown:V.onGamepadButtonDown,onGamepadButtonPress:V.onGamepadButtonPress,onGamepadButtonRelease:V.onGamepadButtonRelease,onGamepadStick:V.onGamepadStick,mousePos:Wt,mouseDeltaPos:V.mouseDeltaPos,isKeyDown:V.isKeyDown,isKeyPressed:V.isKeyPressed,isKeyPressedRepeat:V.isKeyPressedRepeat,isKeyReleased:V.isKeyReleased,isMouseDown:V.isMouseDown,isMousePressed:V.isMousePressed,isMouseReleased:V.isMouseReleased,isMouseMoved:V.isMouseMoved,isGamepadButtonPressed:V.isGamepadButtonPressed,isGamepadButtonDown:V.isGamepadButtonDown,isGamepadButtonReleased:V.isGamepadButtonReleased,getGamepadStick:V.getGamepadStick,charInputted:V.charInputted,loop:jn,wait:bs,play:vt,volume:Yt,burp:yt,audioCtx:te.ctx,Line:Pt,Rect:ye,Circle:Us,Polygon:sr,Vec2:E,Color:ee,Mat4:Le,Quad:me,RNG:Zs,rand:hr,randi:wi,randSeed:_s,vec2:M,rgb:Z,hsl2rgb:Zn,quad:he,choose:en,chance:$s,lerp:Qe,tween:Jr,easings:Rr,map:$e,mapc:Ws,wave:hi,deg2rad:Ge,rad2deg:Bt,clamp:je,testLineLine:Tt,testRectRect:tn,testRectLine:sn,testRectPoint:lr,testCirclePolygon:on,testLinePoint:nn,testLineCircle:Ai,drawSprite:wr,drawText:Gr,formatText:Xe,drawRect:Ae,drawLine:c,drawLines:v,drawTriangle:R,drawCircle:q,drawEllipse:Q,drawUVQuad:Ue,drawPolygon:ce,drawFormattedText:We,drawMasked:Jt,drawSubtracted:Xt,pushTransform:le,popTransform:ne,pushTranslate:$,pushScale:Ne,pushRotate:ie,pushMatrix:Et,usePostEffect:xt,makeCanvas:jt,debug:se,scene:gs,go:ms,onSceneLeave:ws,addLevel:Vs,getData:As,setData:Yr,download:Cr,downloadJSON:fn,downloadText:yi,downloadBlob:pi,plug:jr,ASCII_CHARS:Ks,canvas:V.canvas,addKaboom:Ss,LEFT:E.LEFT,RIGHT:E.RIGHT,UP:E.UP,DOWN:E.DOWN,RED:ee.RED,GREEN:ee.GREEN,BLUE:ee.BLUE,YELLOW:ee.YELLOW,MAGENTA:ee.MAGENTA,CYAN:ee.CYAN,WHITE:ee.WHITE,BLACK:ee.BLACK,quit:ks,Event:ke,EventHandler:nr,EventController:Mt};if(r.plugins&&r.plugins.forEach(jr),r.global!==!1)for(let t in at)window[t]=at[t];return r.focus!==!1&&V.canvas.focus(),at},"default");var tt=10,ft=20,Dt=8,dt=tt*Dt,Ct=ft*Dt,H=In({width:dt,height:Ct,background:[0,0,0],scale:1});H.loadSprite("white_block","img/white.png");var Dn=[[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]],[[1,1],[1,1]],[[0,1,0],[1,1,1],[0,0,0]],[[0,1,1],[1,1,0],[0,0,0]],[[1,1,0],[0,1,1],[0,0,0]],[[1,0,0],[1,1,1],[0,0,0]],[[0,0,1],[1,1,1],[0,0,0]]];function Bo(){let r=[0,0,0],e=Math.floor(Math.random()*3);r[e]=255;let h=[0,1,2].filter(u=>u!==e);return r[h[0]]=Math.floor(Math.random()*256),r[h[1]]=Math.floor(Math.random()*256),r}var ct=Array.from({length:ft},()=>Array(tt).fill(0)),xe,oe,Fo,kn,Ei=0;function Io(){let r=Dn[Math.floor(Math.random()*Dn.length)];return JSON.parse(JSON.stringify(r))}function Cn(){xe=Io(),kn=Bo(),oe={x:Math.floor((tt-xe[0].length)/2),y:0},Fo=0,It(xe,oe.x,oe.y)||H.go("gameover",{score:Ei})}function It(r,e,h){for(let u=0;u<r.length;u++)for(let f=0;f<r[u].length;f++)if(r[u][f]){let A=e+f,P=h+u;if(A<0||A>=tt||P>=ft||P>=0&&ct[P][A])return!1}return!0}function Do(){for(let r=0;r<xe.length;r++)for(let e=0;e<xe[r].length;e++)if(xe[r][e]){let h=oe.x+e,u=oe.y+r;u>=0&&(ct[u][h]=1)}}function Co(r){return r[0].map((e,h)=>r.map(u=>u[h]).reverse())}function ko(){for(let r=ft-1;r>=0;r--)ct[r].every(e=>e)&&(ct.splice(r,1),ct.unshift(Array(tt).fill(0)),Ei+=tt,r++)}function Ft(){H.destroyAll("block");for(let r=0;r<ft;r++)for(let e=0;e<tt;e++)ct[r][e]&&H.add([H.sprite("white_block"),H.pos(e*Dt,r*Dt),H.area(),"block"]);for(let r=0;r<xe.length;r++)for(let e=0;e<xe[r].length;e++)if(xe[r][e]){let h=oe.x+e,u=oe.y+r;u>=0&&u<ft&&H.add([H.sprite("white_block"),H.pos(h*Dt,u*Dt),H.area(),H.color(...kn),"block"])}}var ur=0,dr=0,cr=0,xi=.2;H.scene("main",()=>{ct=Array.from({length:ft},()=>Array(tt).fill(0)),Ei=0,Cn(),Ft();let r=0,e=.5;ur=0,dr=0,cr=0,H.onUpdate(()=>{r+=H.dt(),ur>0&&(ur-=H.dt()),dr>0&&(dr-=H.dt()),cr>0&&(cr-=H.dt()),r>e&&(r=0,It(xe,oe.x,oe.y+1)?oe.y++:(Do(),ko(),Cn()),Ft())}),H.onKeyDown("left",()=>{dr<=0&&(It(xe,oe.x-1,oe.y)&&(oe.x--,Ft()),dr=xi)}),H.onKeyDown("right",()=>{cr<=0&&(It(xe,oe.x+1,oe.y)&&(oe.x++,Ft()),cr=xi)}),H.onKeyDown("down",()=>{It(xe,oe.x,oe.y+1)&&(oe.y++,Ft())}),H.onKeyDown("up",()=>{if(ur<=0){let h=Co(xe);It(h,oe.x,oe.y)&&(xe=h,Ft()),ur=xi}})});H.scene("gameover",({score:r})=>{H.add([H.rect(dt,Ct),H.color(0,0,0),H.opacity(.75),H.pos(0,0),"overlay"]),H.add([H.text("GAME OVER",{size:24,width:dt,align:"center"}),H.pos(dt/2,Ct/2),H.anchor("center"),"gameover-text"]),H.add([H.text(`Score
|
|
${r}`,{size:12,width:dt,align:"center"}),H.pos(dt/2,Ct/2-50),H.anchor("center"),"score-text"]);function e(){H.go("main")}H.onKeyPress(e),H.onClick(e)});H.go("main");function bi(){let r=document.querySelector("canvas");if(!r)return;let e=window.innerHeight/Ct;r.style.width=`${dt*e}px`,r.style.height=`${Ct*e}px`,r.style.display="block",r.style.margin="0 auto"}window.addEventListener("resize",bi);window.addEventListener("DOMContentLoaded",bi);bi();})();
|