diff --git a/game/src/scenes/game.js b/game/src/scenes/game.js index e359f1d..cd00c46 100644 --- a/game/src/scenes/game.js +++ b/game/src/scenes/game.js @@ -16,8 +16,6 @@ import { ICON_START_Y } from "../constants.js"; import { - toggleCapsLock, - shouldUppercase, preventError, shuffle, makeBlink @@ -286,6 +284,8 @@ const gameScene = (params) => { } function resetGameStats() { + errorCharsIndexes.length = 0; + Object.keys(errorCharsReplaces).forEach(k => delete errorCharsReplaces[k]); playerStartedTyping = false; completedBlocks = 0; startTime = 0; @@ -298,8 +298,8 @@ const gameScene = (params) => { totalTypedCharacters = 0; totalCorrectlines = 0; rivalSpeed = EASY_RIVAL_SPEED; - errorCharsIndexes = []; - errorCharsReplaces = {}; + currentBlockIndex = -1; + window.removeEventListener("keydown", keydownHandler); } function updateTitleTexts() { const titleTexts = k.get("menuItem"); @@ -789,34 +789,33 @@ const gameScene = (params) => { eventBuffer[idx]++; } - let capsLockActive = false; - k.onKeyPress("capslock", () => { - toggleCapsLock(); - }); + const keydownHandler = (event) => { - k.onKeyPress((keyPressed) => { + const keyPressed = event.key; const prevChar = playerState.cursorPos > 0 ? fixedText[playerState.cursorPos] : ''; if (prevChar === "\n") return; const correctChar = fixedText[playerState.cursorPos]; - const shouldUpper = shouldUppercase(k); let key = keyPressed; let errorKey; let isCorrect = false; - if (key === "backspace" || key === "enter" || key === "shift") return; + if (key === "Backspace" || key === "Enter" || key === "Shift") return; - if (key.length === 1) { - key = shouldUpper ? key.toUpperCase() : key.toLowerCase(); - errorKey = key; - } else if (key === "space") { + if (errorCharsIndexes.length > maxMistakes) { + event.preventDefault(); + return preventError(k, settings); + } + + if (key === " ") { key = " "; errorKey = "_"; + } else if (key.length === 1) { + errorKey = key; } else { return; } - totalTypedCharacters++; isCorrect = key === correctChar; @@ -836,9 +835,14 @@ const gameScene = (params) => { if (!settings.mute) k.play("wrong_typing"); totalIcorrectCorrectChars++; } + if (!playerStartedTyping && (totalCorrectChars > 0 || totalIcorrectCorrectChars > 0)) { playerStartedTyping = true; } + }; + window.addEventListener("keydown", keydownHandler); + k.onDestroy(() => { + window.removeEventListener("keydown", keydownHandler); }); // Line jump k.onKeyPress("enter", () => { diff --git a/game/src/scenes/selectionScene.js b/game/src/scenes/selectionScene.js index a1969dd..2e4f4ea 100644 --- a/game/src/scenes/selectionScene.js +++ b/game/src/scenes/selectionScene.js @@ -1,7 +1,6 @@ import { escapeBackslashes, preventError, - setCapsLockActive } from "../data/utilities.js"; import { getMute, saveMute } from "../systems/preferences.js"; import { resizablePos } from "../components/resizablePos.js"; @@ -431,14 +430,12 @@ k.scene("selection", () => { case "interview": if (stage === 3) { window.removeEventListener("keydown", handleKeydown); - setCapsLockActive(settings.isCapsOn); k.go("game"); } break; case "practice": if (stage === 3) { settings.practiceMode = true; - setCapsLockActive(settings.isCapsOn); window.removeEventListener("keydown", handleKeydown); k.go("game"); } @@ -489,6 +486,7 @@ k.scene("selection", () => { function setupKeyboardInput() { handleKeydown = (e) => { + e.preventDefault(); if (e.getModifierState && typeof e.getModifierState === "function") { settings.isCapsOn = e.getModifierState("CapsLock"); } @@ -502,14 +500,6 @@ k.scene("selection", () => { k.play("code_sound"); } } - - if (e.key === " ") { - e.preventDefault(); - previousInput = rawInput; - rawInput += " "; - name.text = escapeBackslashes(rawInput); - handleInputUpdate(rawInput); - } }; window.addEventListener("keydown", handleKeydown); @@ -522,13 +512,6 @@ k.scene("selection", () => { handleInputUpdate(rawInput); }); - k.onKeyPress("space", () => { - previousInput = rawInput; - rawInput += " "; - name.text = escapeBackslashes(rawInput); - handleInputUpdate(rawInput); - }); - k.onKeyDown("escape", () => { ResetGame(); }); diff --git a/website/public/game/game.js b/website/public/game/game.js index 1cdc95b..aa69da2 100644 --- a/website/public/game/game.js +++ b/website/public/game/game.js @@ -1,4 +1,4 @@ -var _u=Object.defineProperty;var $u=(t,e,n)=>e in t?_u(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>$u(t,typeof e!="symbol"?e+"":e,n);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();var eh=Object.defineProperty,o=(t,e)=>eh(t,"name",{value:e,configurable:!0}),th=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return n=>{for(var r=n.length,s=new Uint8Array((r-(n[r-1]=="=")-(n[r-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|g}return s}})(),Aa={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},ae,se=(ae=class{constructor(e,n,r){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=lt(e,0,255),this.g=lt(n,0,255),this.b=lt(r,0,255)}static fromArray(e){return new ae(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new ae(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!n)throw new Error("Invalid hex color format");return new ae(parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,n,r){if(n==0)return new ae(255*r,255*r,255*r);let s=o((g,y,m)=>(m<0&&(m+=1),m>1&&(m-=1),m<1/6?g+(y-g)*6*m:m<1/2?y:m<2/3?g+(y-g)*(2/3-m)*6:g),"hue2rgb"),i=r<.5?r*(1+n):r+n-r*n,l=2*r-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new ae(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let n=Aa[e];if(!n)throw new Error("Can't use an invalid CSS color");return ae.fromHex(n)}clone(){return new ae(this.r,this.g,this.b)}lighten(e){return new ae(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new ae(255-this.r,255-this.g,255-this.b)}mult(e){return new ae(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,n){return new ae(Oe(this.r,e.r,n),Oe(this.g,e.g,n),Oe(this.b,e.b,n))}toHSL(){let e=this.r/255,n=this.g/255,r=this.b/255,s=Math.max(e,n,r),i=Math.min(e,n,r),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(n-r)/u+(nse.fromHSL(t,e,n),"hsl2rgb");function ye(t){return t*Math.PI/180}o(ye,"deg2rad");function Tt(t){return t*180/Math.PI}o(Tt,"rad2deg");function lt(t,e,n){return e>n?lt(t,n,e):Math.min(Math.max(t,e),n)}o(lt,"clamp");function Oe(t,e,n){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*n;if(t instanceof q&&e instanceof q||t instanceof se&&e instanceof se)return t.lerp(e,n);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Oe,"lerp");function ot(t,e,n,r,s){return r+(t-e)/(n-e)*(s-r)}o(ot,"map");function va(t,e,n,r,s){return lt(ot(t,e,n,r,s),r,s)}o(va,"mapc");var _,q=(_=class{constructor(e=0,n=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=n}static fromAngle(e){let n=ye(e);return new _(Math.cos(n),Math.sin(n))}static fromArray(e){return new _(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?_.LEFT:_.RIGHT:this.y<0?_.UP:_.DOWN}clone(){return new _(this.x,this.y)}static copy(e,n){return n.x=e.x,n.y=e.y,n}add(...e){let n=P(...e);return new _(this.x+n.x,this.y+n.y)}static addScaled(e,n,r,s){return s.x=e.x+n.x*r,s.y=e.y+n.y*r,s}static addc(e,n,r,s){return s.x=e.x+n,s.y=e.y+r,s}static add(e,n,r){return r.x=e.x+n.x,r.y=e.y+n.y,r}sub(...e){let n=P(...e);return new _(this.x-n.x,this.y-n.y)}static subc(e,n,r,s){return s.x=e.x-n,s.y=e.y-r,s}static sub(e,n,r){return r.x=e.x-n.x,r.y=e.y-n.y,r}scale(...e){let n=P(...e);return new _(this.x*n.x,this.y*n.y)}static scale(e,n,r){return r.x=e.x*n,r.y=e.y*n,r}static scalec(e,n,r,s){return s.x=e.x*n,s.y=e.y*r,s}static scalev(e,n,r){return r.x=e.x*n.x,r.y=e.y*n.y,r}invScale(...e){let n=P(...e);return new _(this.x/n.x,this.y/n.y)}dist(...e){let n=P(...e);return this.sub(n).len()}static dist(e,n){let r=e.x-n.x,s=e.y-n.y;return Math.sqrt(r*r+s*s)}sdist(...e){let n=P(...e);return this.sub(n).slen()}static sdist(e,n){let r=e.x-n.x,s=e.y-n.y;return r*r+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new _(0):this.scale(1/e)}static unit(e,n){let r=_.len(e);return n.x=e.x/r,n.y=e.y/r,n}normal(){return new _(this.y,-this.x)}static normal(e,n){return n.x=e.y,n.y=-e.x,n}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))}rotate(e){if(e instanceof _)return new _(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let n=ye(e),r=Math.cos(n),s=Math.sin(n);return new _(this.x*r-this.y*s,this.x*s+this.y*r)}}static rotate(e,n,r){let s=e.x;return r.x=e.x*n.x-e.y*n.y,r.y=s*n.y+e.y*n.x,r}static rotateByAngle(e,n,r){let s=Math.cos(n),i=Math.sin(n),l=e.x;return r.x=e.x*s-e.y*i,r.y=l*i+e.y*s,r}invRotate(e){return e instanceof _?this.rotate(new _(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,n,r){let s=e.x;return r.x=e.x*n.x+e.y*n.y,r.y=-s*n.y+e.y*n.x,r}dot(e){return this.x*e.x+this.y*e.y}static dot(e,n){return e.x*n.x+e.y*n.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,n){return e.x*n.y-e.y*n.x}angle(...e){let n=P(...e);return Tt(Math.atan2(this.y-n.y,this.x-n.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let n=P(...e);return Tt(Math.atan2(this.cross(n),this.dot(n)))}static angleBetween(e,n){return Math.atan2(_.cross(e,n),_.dot(e,n))}lerp(e,n){return new _(Oe(this.x,e.x,n),Oe(this.y,e.y,n))}static lerp(e,n,r,s){return s.x=e.x*(n.x-e.x)*r,s.y=e.y*(n.y-e.y)*r,s}slerp(e,n){let r=this.dot(e),s=this.cross(e),i=Math.atan2(s,r);return this.scale(Math.sin((1-n)*i)).add(e.scale(Math.sin(n*i))).scale(1/s)}static slerp(e,n,r,s){let i=_.dot(e,n),l=_.cross(e,n),c=Math.atan2(l,i),h=Math.sin((1-r)*c),u=Math.sin(r*c),g=1/l;return s.x=(e.x*h+n.x*u)*g,s.y=(e.y*h+n.y*u)*g,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new _(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 we(this,0,0)}toString(){return`vec2(${this.x.toFixed(2)}, ${this.y.toFixed(2)})`}toArray(){return[this.x,this.y]}},o(_,"Vec2"),b(_,"ZERO",new _(0,0)),b(_,"ONE",new _(1,1)),b(_,"LEFT",new _(-1,0)),b(_,"RIGHT",new _(1,0)),b(_,"UP",new _(0,-1)),b(_,"DOWN",new _(0,1)),_);function P(...t){if(t.length===1){if(t[0]instanceof q)return new q(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new q(...t[0])}return new q(...t)}o(P,"vec2");var Ot,xe=(Ot=class{constructor(e,n,r,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=n,this.w=r,this.h=s}scale(e){return new Ot(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new q(this.x,this.y)}clone(){return new Ot(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})`}},o(Ot,"Quad"),Ot);function ve(t,e,n,r){return new xe(t,e,n,r)}o(ve,"quad");var it,rr=(it=class{constructor(e,n,r,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=n,this.c=r,this.d=s}mul(e){return new it(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return P(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new it(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new it(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,n=this.det,r=e+Math.sqrt(e*e-n),s=e-Math.sqrt(e*e-n);return[r,s]}eigenvectors(e,n){return this.c!=0?[[e-this.d,this.c],[n-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,n-this.a]]:Math.abs(this.transform(P(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return Tt(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 q(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 q(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new q(0,0)}invert(){let e=[],n=this.m[10]*this.m[15]-this.m[14]*this.m[11],r=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=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],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[5]*this.m[14]-this.m[13]*this.m[6],y=this.m[4]*this.m[15]-this.m[12]*this.m[7],m=this.m[4]*this.m[14]-this.m[12]*this.m[6],E=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[4]*this.m[13]-this.m[12]*this.m[5],T=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],C=this.m[4]*this.m[10]-this.m[8]*this.m[6],I=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*n-this.m[6]*r+this.m[7]*s,e[4]=-(this.m[4]*n-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*r-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*n-this.m[2]*r+this.m[3]*s),e[5]=this.m[0]*n-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*r-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*g,e[6]=-(this.m[0]*h-this.m[2]*y+this.m[3]*m),e[10]=this.m[0]*E-this.m[1]*y+this.m[3]*p,e[14]=-(this.m[0]*g-this.m[1]*m+this.m[2]*p),e[3]=-(this.m[1]*T-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*T-this.m[2]*S+this.m[3]*C,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*I),e[15]=this.m[0]*w-this.m[1]*C+this.m[2]*I;let k=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let x=0;x<4;x++)for(let v=0;v<4;v++)e[x*4+v]*=1/k;return new je(e)}clone(){return new je([...this.m])}toString(){return this.m.toString()}},o(je,"Mat4"),je);function Ks(t,e,n,r=s=>-Math.cos(s)){return t+(r(n)+1)/2*(e-t)}o(Ks,"wave");var rh=1103515245,sh=12345,ea=2147483648,An,ba=(An=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(rh*this.seed+sh)%ea,this.seed/ea}genNumber(e,n){return e+this.gen()*(n-e)}genVec2(e,n){return new q(this.genNumber(e.x,n.x),this.genNumber(e.y,n.y))}genColor(e,n){return new se(this.genNumber(e.r,n.r),this.genNumber(e.g,n.g),this.genNumber(e.b,n.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof q)return this.genVec2(P(0,0),e[0]);if(e[0]instanceof se)return this.genColor(ue(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof q&&e[1]instanceof q)return this.genVec2(e[0],e[1]);if(e[0]instanceof se&&e[1]instanceof se)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(An,"RNG"),An),Ss=new ba(Date.now());function Ea(t){return t!=null&&(Ss.seed=t),Ss.seed}o(Ea,"randSeed");function ke(...t){return Ss.genAny(...t)}o(ke,"rand");function Ws(...t){return Math.floor(ke(...t.length>0?t:[2]))}o(Ws,"randi");function Sa(t){return ke()<=t}o(Sa,"chance");function Ys(t){for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}o(Ys,"shuffle");function Ma(t,e){return t.length<=e?t.slice():Ys(t.slice()).slice(0,e)}o(Ma,"chooseMultiple");function ka(t){return t[Ws(t.length)]}o(ka,"choose");function Xs(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:r}o(Pa,"testLineLineT");function Jr(t,e){let n=Pa(t,e);return n?P(t.p1.x+n*(t.p2.x-t.p1.x),t.p1.y+n*(t.p2.y-t.p1.y)):null}o(Jr,"testLineLine");function Ca(t,e,n){let r=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(r.x!=0){let l=(t.pos.x-e.p1.x)/r.x,c=(t.pos.x+t.width-e.p1.x)/r.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let l=(t.pos.y-e.p1.y)/r.y,c=(t.pos.y+t.height-e.p1.y)/r.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(q.addScaled(e.p1,r,Math.max(s,0),n.p1),q.addScaled(e.p1,r,Math.min(i,1),n.p2),!0):!1}o(Ca,"clipLineToRect");function Qr(t,e){let n=e.p2.sub(e.p1),r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(n.x!=0){let i=(t.pos.x-e.p1.x)/n.x,l=(t.pos.x+t.width-e.p1.x)/n.x;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let i=(t.pos.y-e.p1.y)/n.y,l=(t.pos.y+t.height-e.p1.y)/n.y;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=r&&s>=0&&r<=1}o(Qr,"testRectLine");function fr(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=n.dot(r)/r.dot(r);return s>=0&&s<=1}o(Zr,"testLinePoint");function qa(t,e,n){let r=e.p2.sub(e.p1),s=r.dot(r),i=e.p1.sub(t.center),l=2*r.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,u,n.p2)):(q.addScaled(e.p1,r,u,n.p1),q.copy(e.p2,n.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),g=(-l-Math.sqrt(h))/(2*s),y=u>=0&&u<=1,m=g>=0&&g<=1;if(y&&m)return q.addScaled(e.p1,r,u,n.p1),q.addScaled(e.p1,r,g,n.p2),!0;if(y||m){let E=y?u:g;return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,E,n.p2)):(q.addScaled(e.p1,r,E,n.p1),q.copy(e.p2,n.p2)),!0}}return Ft(t,e.p1)?(q.copy(e.p1,n.p1),q.copy(e.p2,n.p2),!0):!1}o(qa,"clipLineToCircle");function Qn(t,e){let n=t.p2.sub(t.p1),r=n.dot(n),s=t.p1.sub(e.center),i=2*n.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*r*l;if(r<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*r);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*r),u=(-i-Math.sqrt(c))/(2*r);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Ft(e,t.p1)}o(Qn,"testLineCircle");function _r(t,e){if(Ut(e,t.p1)||Ut(e,t.p2))return!0;for(let n=0;nUt(e,n))||e.pts.some(n=>Ut(t,n)))}o(Zs,"testPolygonPolygon");function Ut(t,e){let n=!1,r=t.pts;for(let s=0,i=r.length-1;se.y!=r[i].y>e.y&&e.x<(r[i].x-r[s].x)*(e.y-r[s].y)/(r[i].y-r[s].y)+r[s].x&&(n=!n);return n}o(Ut,"testPolygonPoint");function $r(t,e){e=e.sub(t.center);let n=ye(t.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o($r,"testEllipsePoint");function sr(t,e){let n=e.center.sub(t.center),r=ye(t.angle),s=Math.cos(r),i=Math.sin(r),l=n.x*s+n.y*i,c=-n.x*i+n.y*s;return $r(new ht(P(),t.radiusX+e.radius,t.radiusY+e.radius,0),P(l,c))}o(sr,"testEllipseCircle");function _s(t,e){let n=t.toMat2().inverse;return e=new Xe(n.transform(e.p1.sub(t.center)),n.transform(e.p2.sub(t.center))),Qn(e,new Le(P(),1))}o(_s,"testEllipseLine");function Ia(t,e){if(t.radiusX===t.radiusY)return sr(e,new Le(t.center,t.radiusX));if(e.radiusX===e.radiusY)return sr(t,new Le(e.center,e.radiusX));let n=new _n(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),r=new _n(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=ye(t.angle),u=ye(e.angle),g=new _n(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),y=new _n(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),m=g.inverse,E=y.inverse,p=m.transpose.mul(n).mul(m),T=E.transpose.mul(r).mul(E),f=p.m11,w=p.m12,S=p.m13,C=p.m21,I=p.m22,k=p.m23,x=p.m31,v=p.m32,M=p.m33,R=T.m11,L=T.m12,D=T.m13,O=T.m21,z=T.m22,te=T.m23,H=T.m31,$=T.m32,Q=T.m33,ne=f*I*M-f*k*v-w*C*M+w*k*x+S*C*v-S*I*x,Y=(f*I*Q-f*k*$-f*v*te+f*M*z-w*C*Q+w*k*H+w*x*te-w*M*O+S*C*$-S*I*H-S*x*z+S*v*O+C*v*D-C*M*L-I*x*D+I*M*R+k*x*L-k*v*R)/ne,ee=(f*z*Q-f*te*$-w*O*Q+w*te*H+S*O*$-S*z*H-C*L*Q+C*D*$+I*R*Q-I*D*H-k*R*$+k*L*H+x*L*te-x*D*z-v*R*te+v*D*O+M*R*z-M*L*O)/ne,W=(R*z*Q-R*te*$-L*O*Q+L*te*H+D*O*$-D*z*H)/ne;if(Y>=0){let De=-3*ee+Y**2,He=3*Y*W+ee*Y**2-4*ee**2,Ie=-27*W**2+18*W*Y*ee+Y**2*ee**2-4*Y**3*W-4*ee**3;return!(De>0&&He<0&&Ie>0)}else{let De=-3*ee+Y**2,He=-27*W**2+18*W*Y*ee+Y**2*ee**2-4*Y**3*W-4*ee**3;return!(De>0&&He>0)}}o(Ia,"testEllipseEllipse");function $s(t,e){return es(t,new Re(e.points()))}o($s,"testEllipseRect");function es(t,e){let n=t.toMat2().inverse;return e=new Re(e.pts.map(r=>n.transform(r.sub(t.center)))),gr(new Le(P(),1),e)}o(es,"testEllipsePolygon");function Ba(t,e){return t.x===e.x&&t.y===e.y}o(Ba,"testPointPoint");function Ra(t,e){return e instanceof q?Ba(e,t.pt):e instanceof Le?Ft(e,t.pt):e instanceof Xe?Zr(e,t.pt):e instanceof we?fr(e,t.pt):e instanceof Re?Ut(e,t.pt):e instanceof ht?$r(e,t.pt):!1}o(Ra,"testPointShape");function Fa(t,e){return e instanceof q?Zr(t,e):e instanceof Le?Qn(t,e):e instanceof Xe?Jr(t,e)!=null:e instanceof we?Qr(e,t):e instanceof Re?_r(t,e):e instanceof ht?_s(e,t):!1}o(Fa,"testLineShape");function Oa(t,e){return e instanceof q?Ft(t,e):e instanceof Le?Ta(t,e):e instanceof Xe?Qn(e,t):e instanceof we?Js(e,t):e instanceof Re?gr(t,e):e instanceof ht?sr(e,t):!1}o(Oa,"testCircleShape");function La(t,e){return e instanceof q?fr(t,e):e instanceof Le?Js(t,e):e instanceof Xe?Qr(t,e):e instanceof we?Xs(t,e):e instanceof Re?Qs(t,e):e instanceof ht?$s(e,t):!1}o(La,"testRectShape");function Da(t,e){return e instanceof q?Ut(t,e):e instanceof Le?gr(e,t):e instanceof Xe?_r(e,t):e instanceof we?Qs(e,t):e instanceof Re?Zs(e,t):e instanceof ht?es(e,t):!1}o(Da,"testPolygonShape");function Na(t,e){return e instanceof q?$r(t,e):e instanceof Le?sr(t,e):e instanceof Xe?_s(t,e):e instanceof we?$s(t,e):e instanceof Re?es(t,e):e instanceof ht?Ia(e,t):!1}o(Na,"testEllipseShape");function ei(t,e,n){let r=t,s=n.p1,i=n.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let y=u.cross(l)/h;if(y<=0||y>=1)return null;let m=c.normal().unit();return e.dot(m)>0&&(m.x*=-1,m.y*=-1),{point:r.add(l.scale(g)),normal:m,fraction:g}}o(ei,"raycastLine");function Ua(t,e,n){let r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(n.pos.x-t.x)/e.x,c=(n.pos.x+n.width-t.x)/e.x;i=P(-Math.sign(e.x),0),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(n.pos.y-t.y)/e.y,c=(n.pos.y+n.height-t.y)/e.y;Math.min(l,c)>r&&(i=P(0,-Math.sign(e.y))),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=r&&r>=0&&r<=1?{point:t.add(e.scale(r)),normal:i,fraction:r}:null}o(Ua,"raycastRect");function ti(t,e,n){let r=t,s=n.center,i=e,l=i.dot(i),c=r.sub(s),h=2*i.dot(c),u=c.dot(c)-n.radius*n.radius,g=h*h-4*l*u;if(l<=Number.EPSILON||g<0)return null;if(g==0){let y=-h/(2*l);if(y>=0&&y<=1){let m=r.add(i.scale(y));return{point:m,normal:m.sub(s),fraction:y}}}else{let y=(-h+Math.sqrt(g))/(2*l),m=(-h-Math.sqrt(g))/(2*l),E=null;if(y>=0&&y<=1&&(E=y),m>=0&&m<=1&&(E=Math.min(m,E??m)),E!=null){let p=r.add(i.scale(E));return{point:p,normal:p.sub(s).unit(),fraction:E}}}return null}o(ti,"raycastCircle");function ja(t,e,n){let r=n.pts,s=null,i=r[r.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(ja,"raycastPolygon");function za(t,e,n){let r=n.toMat2(),s=r.inverse,i=s.transform(t.sub(n.center)),l=s.transform(e),c=ti(i,l,new Le(P(),1));if(c){let h=rr.rotation(ye(-n.angle)),u=rr.scale(n.radiusX,n.radiusY).transform(c.point),g=r.transform(c.point).add(n.center),y=g.dist(t)/e.len();return{point:g,normal:h.transform(P(n.radiusY**2*u.x,n.radiusX**2*u.y)).unit(),fraction:y}}return c}o(za,"raycastEllipse");function Va(t,e,n,r=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=P(Math.floor(t.x),Math.floor(t.y)),u=P(l.x>0?1:-1,l.y>0?1:-1),g=P(Math.abs(1/l.x),Math.abs(1/l.y)),y=P(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),m=P(g.x<1/0?g.x*y.x:1/0,g.y<1/0?g.y*y.y:1/0),E=-1;for(;c<=r;){let p=n(h);if(p===!0)return{point:s.add(l.scale(c)),normal:P(E===0?-u.x:0,E===1?-u.y:0),fraction:c/i,gridPos:h};if(p)return p;m.xe.transformPoint(n,P())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Nt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let n=this.pos,r=this.pos.add(this.width,this.height),s=Math.max(n.x-e.x,0,e.x-r.x),i=Math.max(n.y-e.y,0,e.y-r.y);return s*s+i*i}collides(e){return La(this,e)}contains(e){return this.collides(e)}raycast(e,n){return Ua(e,n,this)}random(){return this.pos.add(ke(this.width),ke(this.height))}},o(Nt,"Rect"),Nt),Zt,Le=(Zt=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=n}transform(e){return new ht(this.center,this.radius,this.radius).transform(e)}bbox(){return we.fromPoints(this.center.sub(P(this.radius)),this.center.add(P(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Zt(this.center,this.radius)}collides(e){return Oa(this,e)}contains(e){return this.collides(e)}raycast(e,n){return ti(e,n,this)}random(){return this.center.add(q.fromAngle(ke(360)).scale(ke(this.radius)))}},o(Zt,"Circle"),Zt),at,ht=(at=class{constructor(e,n,r,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=n,this.radiusY=r,this.angle=s}static fromMat2(e){let n=e.inverse,r=n.transpose.mul(n),[s,i]=r.eigenvalues,[l,c]=r.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new at(P(),h,u,Tt(Math.atan2(-l[1],l[0]))):new at(P(),u,h,Tt(Math.atan2(-c[1],c[0])))}toMat2(){let e=ye(this.angle),n=Math.cos(e),r=Math.sin(e);return new rr(n*this.radiusX,-r*this.radiusY,r*this.radiusX,n*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new at(e.transformPoint(this.center,P()),e.a*this.radiusX,e.d*this.radiusY);{let n=this.toMat2(),r=e.getRotation(),s=e.getScale();n=_n.fromMat2(n).scale(s.x,s.y).rotate(r).toMat2();let i=at.fromMat2(n);return i.center=e.transformPoint(this.center,P()),i}}bbox(){if(this.angle==0)return we.fromPoints(this.center.sub(P(this.radiusX,this.radiusY)),this.center.add(P(this.radiusX,this.radiusY)));{let e=ye(this.angle),n=Math.cos(e),r=Math.sin(e),s=this.radiusX*n,i=this.radiusX*r,l=this.radiusY*r,c=this.radiusY*n,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return we.fromPoints(this.center.sub(P(h,u)),this.center.add(P(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new at(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Na(this,e)}contains(e){e=e.sub(this.center);let n=ye(this.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,n){return za(e,n,this)}random(){return this.center}},o(at,"Ellipse"),at);function Ga(t,e,n,r){let s=e.sub(t),i=r.sub(n),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=n.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Ga,"segmentLineIntersection");var mt,Re=(mt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new mt(this.pts.map(n=>e.transformPoint(n,P())))}bbox(){let e=P(Number.MAX_VALUE),n=P(-Number.MAX_VALUE);for(let r of this.pts)e.x=Math.min(e.x,r.x),n.x=Math.max(n.x,r.x),e.y=Math.min(e.y,r.y),n.y=Math.max(n.y,r.y);return we.fromPoints(e,n)}area(){let e=0,n=this.pts.length;for(let r=0;re.clone()))}collides(e){return Da(this,e)}contains(e){return this.collides(e)}raycast(e,n){return ja(e,n,this)}random(){return P()}cut(e,n,r,s){new Xe(e,n);let i=[],l=[],c=n.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),g=c.cross(u)>0;return this.pts.forEach((y,m)=>{u=y.sub(e);let E=c.cross(u)>0;if(g!=E){let p=Ga(h,y,e,n);if(i.push(p),l.push(p),r&&s){let T=r[m===0?r.length-1:m-1],f=r[m],w=y.sub(h),S=p.sub(h).dot(w)/w.dot(w),C=Oe(T,f,S);s[0].push(C),s[1].push(C)}g=E}(E?i:l).push(y),r&&s&&(E?s[0]:s[1]).push(r[m]),h=y}),[i.length?new mt(i):null,l.length?new mt(l):null]}},o(mt,"Polygon"),mt);function Ha(t,e,n,r){let s=r*r,i=1-r,l=i*i;return t.scale(l).add(e.scale(2*i*r)).add(n.scale(s))}o(Ha,"evaluateQuadratic");function Ka(t,e,n,r){let s=1-r;return e.sub(t).scale(2*s).add(n.sub(e).scale(2*r))}o(Ka,"evaluateQuadraticFirstDerivative");function Wa(t,e,n,r){return n.sub(e.scale(2)).add(t).scale(2)}o(Wa,"evaluateQuadraticSecondDerivative");function ts(t,e,n,r,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(n.scale(3*c*i)).add(r.scale(l))}o(ts,"evaluateBezier");function Ya(t,e,n,r,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(n.sub(e).scale(6*l*s)).add(r.sub(n).scale(3*i))}o(Ya,"evaluateBezierFirstDerivative");function Xa(t,e,n,r,s){let i=1-s;return n.sub(e.scale(2)).add(t).scale(6*i).add(r.sub(n.scale(2)).add(e).scale(6*s))}o(Xa,"evaluateBezierSecondDerivative");function Ja(t,e,n,r,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Ja,"evaluateCatmullRom");function Qa(t,e,n,r,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Qa,"evaluateCatmullRomFirstDerivative");function Za(t){let e=ni(t),n=e(1);return r=>{let s=r*n,i=e(s,!0);return t(i)}}o(Za,"normalizedCurve");function ni(t,e=10,n=10){let r=[0],s=[0],i=1/(e-1)/n,l=0,c=t(0),h=0;for(let u=1;u{if(g){let y=u;if(y<=0)return 0;if(y>=l)return 1;let m=0;for(;r[m+1]=1)return r[e-1];let y=0;for(;s[y+1]{let u=h*h,g=u*h;return s*g+i*u+l*h+c}}o(Zn,"hermite");function ri(t,e,n,r,s,i=Zn){let l=i(e.x,(1-s)*(n.x-t.x),(1-s)*(r.x-e.x),n.x),c=i(e.y,(1-s)*(n.y-t.y),(1-s)*(r.y-e.y),n.y);return h=>new q(l(h),c(h))}o(ri,"cardinal");function ir(t,e,n,r,s=Zn){return ri(t,e,n,r,.5,s)}o(ir,"catmullRom");function _a(t,e,n,r,s=Zn){return ir(r.add(t.sub(e).scale(6)),t,r,t.add(r.sub(n).scale(6)),s)}o(_a,"bezier");function $a(t,e,n,r,s,i,l,c=Zn){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(n.x-e.x),.5*(1-s)*(1+l)*(1-i)*(n.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(r.x-n.x),n.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(n.y-e.y),.5*(1-s)*(1+l)*(1-i)*(n.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(r.y-n.y),n.y);return g=>new q(h(g),u(g))}o($a,"kochanekBartels");function eo(t,e,n,r){let s=2*t+e-2*r+n,i=-3*t+3*r-2*e+n,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o(eo,"hermiteFirstDerivative");function fn(t){return 0<=t&&t<=1}o(fn,"inZeroOneDomain");function Tr(t,e){return Math.abs(t-e)<=Number.EPSILON}o(Tr,"approximately");function gn(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(gn,"cubeRoot");function to(t,e,n,r){let s=3*t-6*e+3*n,i=-3*t+3*e,l=t,c=-t+3*e-3*n+r;if(Tr(c,0)){if(Tr(s,0))return Tr(i,0)?[]:[-l/i].filter(fn);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(fn)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,g=(2*s*s*s-9*s*i+27*l)/27,y=g/2,m=y*y+u*u*u;if(m<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),C=-g/(2*S),I=C<-1?-1:C>1?1:C,k=Math.acos(I),x=2*gn(S),v=x*Math.cos(k/3)-s/3,M=x*Math.cos((k+2*Math.PI)/3)-s/3,R=x*Math.cos((k+4*Math.PI)/3)-s/3;return[v,M,R].filter(fn)}if(m===0){let f=y<0?gn(-y):-gn(y),w=2*f-s/3,S=-f-s/3;return[w,S].filter(fn)}let E=Math.sqrt(m),p=gn(E-y),T=gn(E+y);return[p-T-s/3].filter(fn)}o(to,"getCubicRoots");function no(t,e,n,r,s){let i=to(t.x-s,e.x-s,n.x-s,r.x-s);return i.length>0?ts(t,e,n,r,i[0]).y:NaN}o(no,"cubicBezierYforX");function ro(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return n=>{if(n<=0||t.length==1||n<=t[0].x)return t[0].y;for(let r=0;r=n)return ot(n,t[r-1].x,t[r].x,t[r-1].y,t[r].y);return t[t.length-1].y}}o(ro,"easingLinear");function so(t,e){return n=>no(P(0,0),t,e,P(1,1),n)}o(so,"easingCubicBezier");function io(t,e="jump-end"){let n=1/t,r=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=r?i:0;return c=>{let h=Math.floor(c/n);return l+h*i}}o(io,"easingSteps");function si(t,e,n){return(e.x-t.x)*(n.y-t.y)-(e.y-t.y)*(n.x-t.x)>=0}o(si,"isOrientedCcw");function ao(t){let e=0,n=t[t.length-1];for(let r=0;r=0}o(Ir,"onSameSide");function oo(t,e,n,r){return Ir(t,e,n,r)&&Ir(t,n,e,r)&&Ir(t,r,e,n)}o(oo,"pointInTriangle");function lo(t,e,n,r){for(let s of t)if(s!==e&&s!==n&&s!==r&&oo(s,e,n,r))return!0;return!1}o(lo,"someInTriangle");function uo(t,e,n,r){return si(t,e,n)&&!lo(r,t,e,n)}o(uo,"isEar");function ii(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],n=[],r=0;for(let y=0;y3;){u=e[c],g=n[c];let y=t[g],m=t[c],E=t[u];if(uo(y,m,E,s))i.push([y,m,E]),e[g]=u,n[u]=g,s.splice(s.indexOf(m),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],g=n[c],i.push([t[g],t[c],t[u]]),i}o(ii,"triangulate");function ho(t){if(t.length<3)return!1;let e=t.length-2,n=t.length-1,r=0,s=t[n].sub(t[e]),i=t[r].sub(t[n]),l=s.cross(i);for(;r+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",ns="topleft",ah="monospace",Dr="monospace",Ms="linear",ai=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],oh=ai.reduce((t,e)=>t+e.size,0),fo=2048,lh=fo*4*oh,uh=fo*6,hh=` +var Zu=Object.defineProperty;var _u=(t,e,n)=>e in t?Zu(t,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[e]=n;var b=(t,e,n)=>_u(t,typeof e!="symbol"?e+"":e,n);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const l of i.addedNodes)l.tagName==="LINK"&&l.rel==="modulepreload"&&r(l)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();var $u=Object.defineProperty,o=(t,e)=>$u(t,"name",{value:e,configurable:!0}),eh=(()=>{for(var t=new Uint8Array(128),e=0;e<64;e++)t[e<26?e+65:e<52?e+71:e<62?e-4:e*4-205]=e;return n=>{for(var r=n.length,s=new Uint8Array((r-(n[r-1]=="=")-(n[r-2]=="="))*3/4|0),i=0,l=0;i>4,s[l++]=h<<4|u>>2,s[l++]=u<<6|g}return s}})(),xa={black:"#000000",silver:"#c0c0c0",gray:"#808080",white:"#ffffff",maroon:"#800000",red:"#ff0000",purple:"#800080",fuchsia:"#ff00ff",green:"#008000",lime:"#00ff00",olive:"#808000",yellow:"#ffff00",navy:"#000080",blue:"#0000ff",teal:"#008080",aqua:"#00ffff",aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"},oe,ie=(oe=class{constructor(e,n,r){b(this,"r",255);b(this,"g",255);b(this,"b",255);this.r=ot(e,0,255),this.g=ot(n,0,255),this.b=ot(r,0,255)}static fromArray(e){return new oe(e[0],e[1],e[2])}static fromHex(e){if(typeof e=="number")return new oe(e>>16&255,e>>8&255,e>>0&255);if(typeof e=="string"){let n=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);if(!n)throw new Error("Invalid hex color format");return new oe(parseInt(n[1],16),parseInt(n[2],16),parseInt(n[3],16))}else throw new Error("Invalid hex color format")}static fromHSL(e,n,r){if(n==0)return new oe(255*r,255*r,255*r);let s=o((g,y,m)=>(m<0&&(m+=1),m>1&&(m-=1),m<1/6?g+(y-g)*6*m:m<1/2?y:m<2/3?g+(y-g)*(2/3-m)*6:g),"hue2rgb"),i=r<.5?r*(1+n):r+n-r*n,l=2*r-i,c=s(l,i,e+1/3),h=s(l,i,e),u=s(l,i,e-1/3);return new oe(Math.round(c*255),Math.round(h*255),Math.round(u*255))}static fromCSS(e){let n=xa[e];if(!n)throw new Error("Can't use an invalid CSS color");return oe.fromHex(n)}clone(){return new oe(this.r,this.g,this.b)}lighten(e){return new oe(this.r+e,this.g+e,this.b+e)}darken(e){return this.lighten(-e)}invert(){return new oe(255-this.r,255-this.g,255-this.b)}mult(e){return new oe(this.r*e.r/255,this.g*e.g/255,this.b*e.b/255)}lerp(e,n){return new oe(Fe(this.r,e.r,n),Fe(this.g,e.g,n),Fe(this.b,e.b,n))}toHSL(){let e=this.r/255,n=this.g/255,r=this.b/255,s=Math.max(e,n,r),i=Math.min(e,n,r),l=(s+i)/2,c=l,h=l;if(s==i)l=c=0;else{let u=s-i;switch(c=h>.5?u/(2-s-i):u/(s+i),s){case e:l=(n-r)/u+(nie.fromHSL(t,e,n),"hsl2rgb");function me(t){return t*Math.PI/180}o(me,"deg2rad");function qt(t){return t*180/Math.PI}o(qt,"rad2deg");function ot(t,e,n){return e>n?ot(t,n,e):Math.min(Math.max(t,e),n)}o(ot,"clamp");function Fe(t,e,n){if(typeof t=="number"&&typeof e=="number")return t+(e-t)*n;if(t instanceof q&&e instanceof q||t instanceof ie&&e instanceof ie)return t.lerp(e,n);throw new Error(`Bad value for lerp(): ${t}, ${e}. Only number, Vec2 and Color is supported.`)}o(Fe,"lerp");function at(t,e,n,r,s){return r+(t-e)/(n-e)*(s-r)}o(at,"map");function Aa(t,e,n,r,s){return ot(at(t,e,n,r,s),r,s)}o(Aa,"mapc");var _,q=(_=class{constructor(e=0,n=e){b(this,"x",0);b(this,"y",0);this.x=e,this.y=n}static fromAngle(e){let n=me(e);return new _(Math.cos(n),Math.sin(n))}static fromArray(e){return new _(e[0],e[1])}toAxis(){return Math.abs(this.x)>Math.abs(this.y)?this.x<0?_.LEFT:_.RIGHT:this.y<0?_.UP:_.DOWN}clone(){return new _(this.x,this.y)}static copy(e,n){return n.x=e.x,n.y=e.y,n}add(...e){let n=P(...e);return new _(this.x+n.x,this.y+n.y)}static addScaled(e,n,r,s){return s.x=e.x+n.x*r,s.y=e.y+n.y*r,s}static addc(e,n,r,s){return s.x=e.x+n,s.y=e.y+r,s}static add(e,n,r){return r.x=e.x+n.x,r.y=e.y+n.y,r}sub(...e){let n=P(...e);return new _(this.x-n.x,this.y-n.y)}static subc(e,n,r,s){return s.x=e.x-n,s.y=e.y-r,s}static sub(e,n,r){return r.x=e.x-n.x,r.y=e.y-n.y,r}scale(...e){let n=P(...e);return new _(this.x*n.x,this.y*n.y)}static scale(e,n,r){return r.x=e.x*n,r.y=e.y*n,r}static scalec(e,n,r,s){return s.x=e.x*n,s.y=e.y*r,s}static scalev(e,n,r){return r.x=e.x*n.x,r.y=e.y*n.y,r}invScale(...e){let n=P(...e);return new _(this.x/n.x,this.y/n.y)}dist(...e){let n=P(...e);return this.sub(n).len()}static dist(e,n){let r=e.x-n.x,s=e.y-n.y;return Math.sqrt(r*r+s*s)}sdist(...e){let n=P(...e);return this.sub(n).slen()}static sdist(e,n){let r=e.x-n.x,s=e.y-n.y;return r*r+s*s}len(){return Math.sqrt(this.dot(this))}static len(e){return Math.sqrt(e.x*e.x+e.y*e.y)}slen(){return this.dot(this)}static slen(e){return e.x*e.x+e.y*e.y}unit(){let e=this.len();return e===0?new _(0):this.scale(1/e)}static unit(e,n){let r=_.len(e);return n.x=e.x/r,n.y=e.y/r,n}normal(){return new _(this.y,-this.x)}static normal(e,n){return n.x=e.y,n.y=-e.x,n}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))}rotate(e){if(e instanceof _)return new _(this.x*e.x-this.y*e.y,this.x*e.y+this.y*e.x);{let n=me(e),r=Math.cos(n),s=Math.sin(n);return new _(this.x*r-this.y*s,this.x*s+this.y*r)}}static rotate(e,n,r){let s=e.x;return r.x=e.x*n.x-e.y*n.y,r.y=s*n.y+e.y*n.x,r}static rotateByAngle(e,n,r){let s=Math.cos(n),i=Math.sin(n),l=e.x;return r.x=e.x*s-e.y*i,r.y=l*i+e.y*s,r}invRotate(e){return e instanceof _?this.rotate(new _(e.x,-e.y)):this.rotate(-e)}static inverseRotate(e,n,r){let s=e.x;return r.x=e.x*n.x+e.y*n.y,r.y=-s*n.y+e.y*n.x,r}dot(e){return this.x*e.x+this.y*e.y}static dot(e,n){return e.x*n.x+e.y*n.y}cross(e){return this.x*e.y-this.y*e.x}static cross(e,n){return e.x*n.y-e.y*n.x}angle(...e){let n=P(...e);return qt(Math.atan2(this.y-n.y,this.x-n.x))}static toAngle(e){return Math.atan2(e.y,e.x)}angleBetween(...e){let n=P(...e);return qt(Math.atan2(this.cross(n),this.dot(n)))}static angleBetween(e,n){return Math.atan2(_.cross(e,n),_.dot(e,n))}lerp(e,n){return new _(Fe(this.x,e.x,n),Fe(this.y,e.y,n))}static lerp(e,n,r,s){return s.x=e.x*(n.x-e.x)*r,s.y=e.y*(n.y-e.y)*r,s}slerp(e,n){let r=this.dot(e),s=this.cross(e),i=Math.atan2(s,r);return this.scale(Math.sin((1-n)*i)).add(e.scale(Math.sin(n*i))).scale(1/s)}static slerp(e,n,r,s){let i=_.dot(e,n),l=_.cross(e,n),c=Math.atan2(l,i),h=Math.sin((1-r)*c),u=Math.sin(r*c),g=1/l;return s.x=(e.x*h+n.x*u)*g,s.y=(e.y*h+n.y*u)*g,s}isZero(){return this.x===0&&this.y===0}toFixed(e){return new _(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)})`}toArray(){return[this.x,this.y]}},o(_,"Vec2"),b(_,"ZERO",new _(0,0)),b(_,"ONE",new _(1,1)),b(_,"LEFT",new _(-1,0)),b(_,"RIGHT",new _(1,0)),b(_,"UP",new _(0,-1)),b(_,"DOWN",new _(0,1)),_);function P(...t){if(t.length===1){if(t[0]instanceof q)return new q(t[0].x,t[0].y);if(Array.isArray(t[0])&&t[0].length===2)return new q(...t[0])}return new q(...t)}o(P,"vec2");var Ft,we=(Ft=class{constructor(e,n,r,s){b(this,"x",0);b(this,"y",0);b(this,"w",1);b(this,"h",1);this.x=e,this.y=n,this.w=r,this.h=s}scale(e){return new Ft(this.x+this.w*e.x,this.y+this.h*e.y,this.w*e.w,this.h*e.h)}pos(){return new q(this.x,this.y)}clone(){return new Ft(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})`}},o(Ft,"Quad"),Ft);function ve(t,e,n,r){return new we(t,e,n,r)}o(ve,"quad");var st,ar=(st=class{constructor(e,n,r,s){b(this,"a");b(this,"b");b(this,"c");b(this,"d");this.a=e,this.b=n,this.c=r,this.d=s}mul(e){return new st(this.a*e.a+this.b*e.c,this.a*e.b+this.b*e.d,this.c*e.a+this.d*e.c,this.c*e.b+this.d*e.d)}transform(e){return P(this.a*e.x+this.b*e.y,this.c*e.x+this.d*e.y)}get inverse(){let e=this.det;return new st(this.d/e,-this.b/e,-this.c/e,this.a/e)}get transpose(){return new st(this.a,this.c,this.b,this.d)}get eigenvalues(){let e=this.trace/2,n=this.det,r=e+Math.sqrt(e*e-n),s=e-Math.sqrt(e*e-n);return[r,s]}eigenvectors(e,n){return this.c!=0?[[e-this.d,this.c],[n-this.d,this.c]]:this.b!=0?[[this.b,e-this.a],[this.b,n-this.a]]:Math.abs(this.transform(P(1,0)).x-e)0?Math.acos(this.m[0]/e):-Math.acos(this.m[0]/e))}else if(this.m[4]!=0||this.m[5]!=0){let e=Math.sqrt(this.m[4]*this.m[4]+this.m[5]*this.m[5]);return qt(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 q(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 q(0,Math.atan(this.m[0]*this.m[4]+this.m[1]*this.m[5])/(e*e))}else return new q(0,0)}invert(){let e=[],n=this.m[10]*this.m[15]-this.m[14]*this.m[11],r=this.m[9]*this.m[15]-this.m[13]*this.m[11],s=this.m[9]*this.m[14]-this.m[13]*this.m[10],i=this.m[8]*this.m[15]-this.m[12]*this.m[11],l=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],h=this.m[6]*this.m[15]-this.m[14]*this.m[7],u=this.m[5]*this.m[15]-this.m[13]*this.m[7],g=this.m[5]*this.m[14]-this.m[13]*this.m[6],y=this.m[4]*this.m[15]-this.m[12]*this.m[7],m=this.m[4]*this.m[14]-this.m[12]*this.m[6],E=this.m[5]*this.m[15]-this.m[13]*this.m[7],p=this.m[4]*this.m[13]-this.m[12]*this.m[5],T=this.m[6]*this.m[11]-this.m[10]*this.m[7],f=this.m[5]*this.m[11]-this.m[9]*this.m[7],w=this.m[5]*this.m[10]-this.m[9]*this.m[6],S=this.m[4]*this.m[11]-this.m[8]*this.m[7],C=this.m[4]*this.m[10]-this.m[8]*this.m[6],I=this.m[4]*this.m[9]-this.m[8]*this.m[5];e[0]=this.m[5]*n-this.m[6]*r+this.m[7]*s,e[4]=-(this.m[4]*n-this.m[6]*i+this.m[7]*l),e[8]=this.m[4]*r-this.m[5]*i+this.m[7]*c,e[12]=-(this.m[4]*s-this.m[5]*l+this.m[6]*c),e[1]=-(this.m[1]*n-this.m[2]*r+this.m[3]*s),e[5]=this.m[0]*n-this.m[2]*i+this.m[3]*l,e[9]=-(this.m[0]*r-this.m[1]*i+this.m[3]*c),e[13]=this.m[0]*s-this.m[1]*l+this.m[2]*c,e[2]=this.m[1]*h-this.m[2]*u+this.m[3]*g,e[6]=-(this.m[0]*h-this.m[2]*y+this.m[3]*m),e[10]=this.m[0]*E-this.m[1]*y+this.m[3]*p,e[14]=-(this.m[0]*g-this.m[1]*m+this.m[2]*p),e[3]=-(this.m[1]*T-this.m[2]*f+this.m[3]*w),e[7]=this.m[0]*T-this.m[2]*S+this.m[3]*C,e[11]=-(this.m[0]*f-this.m[1]*S+this.m[3]*I),e[15]=this.m[0]*w-this.m[1]*C+this.m[2]*I;let k=this.m[0]*e[0]+this.m[1]*e[4]+this.m[2]*e[8]+this.m[3]*e[12];for(let x=0;x<4;x++)for(let v=0;v<4;v++)e[x*4+v]*=1/k;return new Ue(e)}clone(){return new Ue([...this.m])}toString(){return this.m.toString()}},o(Ue,"Mat4"),Ue);function Hs(t,e,n,r=s=>-Math.cos(s)){return t+(r(n)+1)/2*(e-t)}o(Hs,"wave");var nh=1103515245,rh=12345,$i=2147483648,An,va=(An=class{constructor(e){b(this,"seed");this.seed=e}gen(){return this.seed=(nh*this.seed+rh)%$i,this.seed/$i}genNumber(e,n){return e+this.gen()*(n-e)}genVec2(e,n){return new q(this.genNumber(e.x,n.x),this.genNumber(e.y,n.y))}genColor(e,n){return new ie(this.genNumber(e.r,n.r),this.genNumber(e.g,n.g),this.genNumber(e.b,n.b))}genAny(...e){if(e.length===0)return this.gen();if(e.length===1){if(typeof e[0]=="number")return this.genNumber(0,e[0]);if(e[0]instanceof q)return this.genVec2(P(0,0),e[0]);if(e[0]instanceof ie)return this.genColor(he(0,0,0),e[0])}else if(e.length===2){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.genNumber(e[0],e[1]);if(e[0]instanceof q&&e[1]instanceof q)return this.genVec2(e[0],e[1]);if(e[0]instanceof ie&&e[1]instanceof ie)return this.genColor(e[0],e[1])}throw new Error("More than 2 arguments not supported")}},o(An,"RNG"),An),Es=new va(Date.now());function ba(t){return t!=null&&(Es.seed=t),Es.seed}o(ba,"randSeed");function ke(...t){return Es.genAny(...t)}o(ke,"rand");function Ks(...t){return Math.floor(ke(...t.length>0?t:[2]))}o(Ks,"randi");function Ea(t){return ke()<=t}o(Ea,"chance");function Ws(t){for(let e=t.length-1;e>0;e--){let n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}o(Ws,"shuffle");function Sa(t,e){return t.length<=e?t.slice():Ws(t.slice()).slice(0,e)}o(Sa,"chooseMultiple");function Ma(t){return t[Ks(t.length)]}o(Ma,"choose");function Ys(t,e){return t.pos.x+t.width>e.pos.x&&t.pos.xe.pos.y&&t.pos.y1||s<0||s>1?null:r}o(ka,"testLineLineT");function Jr(t,e){let n=ka(t,e);return n?P(t.p1.x+n*(t.p2.x-t.p1.x),t.p1.y+n*(t.p2.y-t.p1.y)):null}o(Jr,"testLineLine");function Pa(t,e,n){let r=e.p2.sub(e.p1),s=Number.NEGATIVE_INFINITY,i=Number.POSITIVE_INFINITY;if(r.x!=0){let l=(t.pos.x-e.p1.x)/r.x,c=(t.pos.x+t.width-e.p1.x)/r.x;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.xt.pos.x+t.width)return!1;if(r.y!=0){let l=(t.pos.y-e.p1.y)/r.y,c=(t.pos.y+t.height-e.p1.y)/r.y;s=Math.max(s,Math.min(l,c)),i=Math.min(i,Math.max(l,c))}else if(e.p1.yt.pos.y+t.height)return!1;return i>=s&&i>=0&&s<=1?(q.addScaled(e.p1,r,Math.max(s,0),n.p1),q.addScaled(e.p1,r,Math.min(i,1),n.p2),!0):!1}o(Pa,"clipLineToRect");function Qr(t,e){let n=e.p2.sub(e.p1),r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY;if(n.x!=0){let i=(t.pos.x-e.p1.x)/n.x,l=(t.pos.x+t.width-e.p1.x)/n.x;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.xt.pos.x+t.width)return!1;if(n.y!=0){let i=(t.pos.y-e.p1.y)/n.y,l=(t.pos.y+t.height-e.p1.y)/n.y;r=Math.max(r,Math.min(i,l)),s=Math.min(s,Math.max(i,l))}else if(e.p1.yt.pos.y+t.height)return!1;return s>=r&&s>=0&&r<=1}o(Qr,"testRectLine");function pr(t,e){return e.x>t.pos.x&&e.xt.pos.y&&e.yNumber.EPSILON)return!1;let s=n.dot(r)/r.dot(r);return s>=0&&s<=1}o(Zr,"testLinePoint");function Ca(t,e,n){let r=e.p2.sub(e.p1),s=r.dot(r),i=e.p1.sub(t.center),l=2*r.dot(i),c=i.dot(i)-t.radius*t.radius,h=l*l-4*s*c;if(s<=Number.EPSILON||h<0)return!1;if(h==0){let u=-l/(2*s);if(u>=0&&u<=1)return Rt(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,u,n.p2)):(q.addScaled(e.p1,r,u,n.p1),q.copy(e.p2,n.p2)),!0}else{let u=(-l+Math.sqrt(h))/(2*s),g=(-l-Math.sqrt(h))/(2*s),y=u>=0&&u<=1,m=g>=0&&g<=1;if(y&&m)return q.addScaled(e.p1,r,u,n.p1),q.addScaled(e.p1,r,g,n.p2),!0;if(y||m){let E=y?u:g;return Rt(t,e.p1)?(q.copy(e.p1,n.p1),q.addScaled(e.p1,r,E,n.p2)):(q.addScaled(e.p1,r,E,n.p1),q.copy(e.p2,n.p2)),!0}}return Rt(t,e.p1)?(q.copy(e.p1,n.p1),q.copy(e.p2,n.p2),!0):!1}o(Ca,"clipLineToCircle");function Qn(t,e){let n=t.p2.sub(t.p1),r=n.dot(n),s=t.p1.sub(e.center),i=2*n.dot(s),l=s.dot(s)-e.radius*e.radius,c=i*i-4*r*l;if(r<=Number.EPSILON||c<0)return!1;if(c==0){let h=-i/(2*r);if(h>=0&&h<=1)return!0}else{let h=(-i+Math.sqrt(c))/(2*r),u=(-i-Math.sqrt(c))/(2*r);if(h>=0&&h<=1||u>=0&&u<=1)return!0}return Rt(e,t.p1)}o(Qn,"testLineCircle");function _r(t,e){if(Nt(e,t.p1)||Nt(e,t.p2))return!0;for(let n=0;nNt(e,n))||e.pts.some(n=>Nt(t,n)))}o(Qs,"testPolygonPolygon");function Nt(t,e){let n=!1,r=t.pts;for(let s=0,i=r.length-1;se.y!=r[i].y>e.y&&e.x<(r[i].x-r[s].x)*(e.y-r[s].y)/(r[i].y-r[s].y)+r[s].x&&(n=!n);return n}o(Nt,"testPolygonPoint");function $r(t,e){e=e.sub(t.center);let n=me(t.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(t.radiusX*t.radiusX)+l*l/(t.radiusY*t.radiusY)<1}o($r,"testEllipsePoint");function or(t,e){let n=e.center.sub(t.center),r=me(t.angle),s=Math.cos(r),i=Math.sin(r),l=n.x*s+n.y*i,c=-n.x*i+n.y*s;return $r(new ut(P(),t.radiusX+e.radius,t.radiusY+e.radius,0),P(l,c))}o(or,"testEllipseCircle");function Zs(t,e){let n=t.toMat2().inverse;return e=new Ye(n.transform(e.p1.sub(t.center)),n.transform(e.p2.sub(t.center))),Qn(e,new Oe(P(),1))}o(Zs,"testEllipseLine");function Ta(t,e){if(t.radiusX===t.radiusY)return or(e,new Oe(t.center,t.radiusX));if(e.radiusX===e.radiusY)return or(t,new Oe(e.center,e.radiusX));let n=new er(1/t.radiusX**2,0,0,0,1/t.radiusY**2,0,0,0,-1),r=new er(1/e.radiusX**2,0,0,0,1/e.radiusY**2,0,0,0,-1),s=t.center.x,i=t.center.y,l=e.center.x,c=e.center.y,h=me(t.angle),u=me(e.angle),g=new er(Math.cos(h),-Math.sin(h),s,Math.sin(h),Math.cos(h),i,0,0,1),y=new er(Math.cos(u),-Math.sin(u),l,Math.sin(u),Math.cos(u),c,0,0,1),m=g.inverse,E=y.inverse,p=m.transpose.mul(n).mul(m),T=E.transpose.mul(r).mul(E),f=p.m11,w=p.m12,S=p.m13,C=p.m21,I=p.m22,k=p.m23,x=p.m31,v=p.m32,M=p.m33,R=T.m11,L=T.m12,D=T.m13,O=T.m21,z=T.m22,te=T.m23,W=T.m31,$=T.m32,Q=T.m33,ne=f*I*M-f*k*v-w*C*M+w*k*x+S*C*v-S*I*x,Y=(f*I*Q-f*k*$-f*v*te+f*M*z-w*C*Q+w*k*W+w*x*te-w*M*O+S*C*$-S*I*W-S*x*z+S*v*O+C*v*D-C*M*L-I*x*D+I*M*R+k*x*L-k*v*R)/ne,ee=(f*z*Q-f*te*$-w*O*Q+w*te*W+S*O*$-S*z*W-C*L*Q+C*D*$+I*R*Q-I*D*W-k*R*$+k*L*W+x*L*te-x*D*z-v*R*te+v*D*O+M*R*z-M*L*O)/ne,H=(R*z*Q-R*te*$-L*O*Q+L*te*W+D*O*$-D*z*W)/ne;if(Y>=0){let Le=-3*ee+Y**2,Ge=3*Y*H+ee*Y**2-4*ee**2,Te=-27*H**2+18*H*Y*ee+Y**2*ee**2-4*Y**3*H-4*ee**3;return!(Le>0&&Ge<0&&Te>0)}else{let Le=-3*ee+Y**2,Ge=-27*H**2+18*H*Y*ee+Y**2*ee**2-4*Y**3*H-4*ee**3;return!(Le>0&&Ge>0)}}o(Ta,"testEllipseEllipse");function _s(t,e){return es(t,new Be(e.points()))}o(_s,"testEllipseRect");function es(t,e){let n=t.toMat2().inverse;return e=new Be(e.pts.map(r=>n.transform(r.sub(t.center)))),mr(new Oe(P(),1),e)}o(es,"testEllipsePolygon");function Ia(t,e){return t.x===e.x&&t.y===e.y}o(Ia,"testPointPoint");function Ba(t,e){return e instanceof q?Ia(e,t.pt):e instanceof Oe?Rt(e,t.pt):e instanceof Ye?Zr(e,t.pt):e instanceof ye?pr(e,t.pt):e instanceof Be?Nt(e,t.pt):e instanceof ut?$r(e,t.pt):!1}o(Ba,"testPointShape");function Ra(t,e){return e instanceof q?Zr(t,e):e instanceof Oe?Qn(t,e):e instanceof Ye?Jr(t,e)!=null:e instanceof ye?Qr(e,t):e instanceof Be?_r(t,e):e instanceof ut?Zs(e,t):!1}o(Ra,"testLineShape");function Fa(t,e){return e instanceof q?Rt(t,e):e instanceof Oe?qa(t,e):e instanceof Ye?Qn(e,t):e instanceof ye?Xs(e,t):e instanceof Be?mr(t,e):e instanceof ut?or(e,t):!1}o(Fa,"testCircleShape");function Oa(t,e){return e instanceof q?pr(t,e):e instanceof Oe?Xs(t,e):e instanceof Ye?Qr(t,e):e instanceof ye?Ys(t,e):e instanceof Be?Js(t,e):e instanceof ut?_s(e,t):!1}o(Oa,"testRectShape");function La(t,e){return e instanceof q?Nt(t,e):e instanceof Oe?mr(e,t):e instanceof Ye?_r(e,t):e instanceof ye?Js(e,t):e instanceof Be?Qs(e,t):e instanceof ut?es(e,t):!1}o(La,"testPolygonShape");function Da(t,e){return e instanceof q?$r(t,e):e instanceof Oe?or(t,e):e instanceof Ye?Zs(t,e):e instanceof ye?_s(t,e):e instanceof Be?es(t,e):e instanceof ut?Ta(e,t):!1}o(Da,"testEllipseShape");function $s(t,e,n){let r=t,s=n.p1,i=n.p2,l=e,c=i.sub(s),h=l.cross(c);if(Math.abs(h)=1)return null;let y=u.cross(l)/h;if(y<=0||y>=1)return null;let m=c.normal().unit();return e.dot(m)>0&&(m.x*=-1,m.y*=-1),{point:r.add(l.scale(g)),normal:m,fraction:g}}o($s,"raycastLine");function Na(t,e,n){let r=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,i;if(t.x!=0){let l=(n.pos.x-t.x)/e.x,c=(n.pos.x+n.width-t.x)/e.x;i=P(-Math.sign(e.x),0),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}if(t.y!=0){let l=(n.pos.y-t.y)/e.y,c=(n.pos.y+n.height-t.y)/e.y;Math.min(l,c)>r&&(i=P(0,-Math.sign(e.y))),r=Math.max(r,Math.min(l,c)),s=Math.min(s,Math.max(l,c))}return s>=r&&r>=0&&r<=1?{point:t.add(e.scale(r)),normal:i,fraction:r}:null}o(Na,"raycastRect");function ei(t,e,n){let r=t,s=n.center,i=e,l=i.dot(i),c=r.sub(s),h=2*i.dot(c),u=c.dot(c)-n.radius*n.radius,g=h*h-4*l*u;if(l<=Number.EPSILON||g<0)return null;if(g==0){let y=-h/(2*l);if(y>=0&&y<=1){let m=r.add(i.scale(y));return{point:m,normal:m.sub(s),fraction:y}}}else{let y=(-h+Math.sqrt(g))/(2*l),m=(-h-Math.sqrt(g))/(2*l),E=null;if(y>=0&&y<=1&&(E=y),m>=0&&m<=1&&(E=Math.min(m,E??m)),E!=null){let p=r.add(i.scale(E));return{point:p,normal:p.sub(s).unit(),fraction:E}}}return null}o(ei,"raycastCircle");function Ua(t,e,n){let r=n.pts,s=null,i=r[r.length-1];for(let l=0;lh.fraction)&&(s=h),i=c}return s}o(Ua,"raycastPolygon");function ja(t,e,n){let r=n.toMat2(),s=r.inverse,i=s.transform(t.sub(n.center)),l=s.transform(e),c=ei(i,l,new Oe(P(),1));if(c){let h=ar.rotation(me(-n.angle)),u=ar.scale(n.radiusX,n.radiusY).transform(c.point),g=r.transform(c.point).add(n.center),y=g.dist(t)/e.len();return{point:g,normal:h.transform(P(n.radiusY**2*u.x,n.radiusX**2*u.y)).unit(),fraction:y}}return c}o(ja,"raycastEllipse");function za(t,e,n,r=64){let s=t,i=e.len(),l=e.scale(1/i),c=0,h=P(Math.floor(t.x),Math.floor(t.y)),u=P(l.x>0?1:-1,l.y>0?1:-1),g=P(Math.abs(1/l.x),Math.abs(1/l.y)),y=P(u.x>0?h.x+1-t.x:t.x-h.x,u.y>0?h.y+1-t.y:t.y-h.y),m=P(g.x<1/0?g.x*y.x:1/0,g.y<1/0?g.y*y.y:1/0),E=-1;for(;c<=r;){let p=n(h);if(p===!0)return{point:s.add(l.scale(c)),normal:P(E===0?-u.x:0,E===1?-u.y:0),fraction:c/i,gridPos:h};if(p)return p;m.xe.transformPoint(n,P())))}bbox(){return this.clone()}area(){return this.width*this.height}clone(){return new Dt(this.pos.clone(),this.width,this.height)}distToPoint(e){return Math.sqrt(this.sdistToPoint(e))}sdistToPoint(e){let n=this.pos,r=this.pos.add(this.width,this.height),s=Math.max(n.x-e.x,0,e.x-r.x),i=Math.max(n.y-e.y,0,e.y-r.y);return s*s+i*i}collides(e){return Oa(this,e)}contains(e){return this.collides(e)}raycast(e,n){return Na(e,n,this)}random(){return this.pos.add(ke(this.width),ke(this.height))}},o(Dt,"Rect"),Dt),Qt,Oe=(Qt=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e.clone(),this.radius=n}transform(e){return new ut(this.center,this.radius,this.radius).transform(e)}bbox(){return ye.fromPoints(this.center.sub(P(this.radius)),this.center.add(P(this.radius)))}area(){return this.radius*this.radius*Math.PI}clone(){return new Qt(this.center,this.radius)}collides(e){return Fa(this,e)}contains(e){return this.collides(e)}raycast(e,n){return ei(e,n,this)}random(){return this.center.add(q.fromAngle(ke(360)).scale(ke(this.radius)))}},o(Qt,"Circle"),Qt),it,ut=(it=class{constructor(e,n,r,s=0){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e.clone(),this.radiusX=n,this.radiusY=r,this.angle=s}static fromMat2(e){let n=e.inverse,r=n.transpose.mul(n),[s,i]=r.eigenvalues,[l,c]=r.eigenvectors(s,i),[h,u]=[1/Math.sqrt(s),1/Math.sqrt(i)];return h>u?new it(P(),h,u,qt(Math.atan2(-l[1],l[0]))):new it(P(),u,h,qt(Math.atan2(-c[1],c[0])))}toMat2(){let e=me(this.angle),n=Math.cos(e),r=Math.sin(e);return new ar(n*this.radiusX,-r*this.radiusY,r*this.radiusX,n*this.radiusY)}transform(e){if(this.angle==0&&e.getRotation()==0)return new it(e.transformPoint(this.center,P()),e.a*this.radiusX,e.d*this.radiusY);{let n=this.toMat2(),r=e.getRotation(),s=e.getScale();n=er.fromMat2(n).scale(s.x,s.y).rotate(r).toMat2();let i=it.fromMat2(n);return i.center=e.transformPoint(this.center,P()),i}}bbox(){if(this.angle==0)return ye.fromPoints(this.center.sub(P(this.radiusX,this.radiusY)),this.center.add(P(this.radiusX,this.radiusY)));{let e=me(this.angle),n=Math.cos(e),r=Math.sin(e),s=this.radiusX*n,i=this.radiusX*r,l=this.radiusY*r,c=this.radiusY*n,h=Math.sqrt(s*s+l*l),u=Math.sqrt(i*i+c*c);return ye.fromPoints(this.center.sub(P(h,u)),this.center.add(P(h,u)))}}area(){return this.radiusX*this.radiusY*Math.PI}clone(){return new it(this.center,this.radiusX,this.radiusY,this.angle)}collides(e){return Da(this,e)}contains(e){e=e.sub(this.center);let n=me(this.angle),r=Math.cos(n),s=Math.sin(n),i=e.x*r+e.y*s,l=-e.x*s+e.y*r;return i*i/(this.radiusX*this.radiusX)+l*l/(this.radiusY*this.radiusY)<1}raycast(e,n){return ja(e,n,this)}random(){return this.center}},o(it,"Ellipse"),it);function Va(t,e,n,r){let s=e.sub(t),i=r.sub(n),l=s.cross(i);return l<1e-5&&l>-1e-5||(l=n.sub(t).cross(i)/l,l<0||l>1)?null:t.add(s.scale(l))}o(Va,"segmentLineIntersection");var mt,Be=(mt=class{constructor(e){b(this,"pts");if(e.length<3)throw new Error("Polygons should have at least 3 vertices");this.pts=e}transform(e){return new mt(this.pts.map(n=>e.transformPoint(n,P())))}bbox(){let e=P(Number.MAX_VALUE),n=P(-Number.MAX_VALUE);for(let r of this.pts)e.x=Math.min(e.x,r.x),n.x=Math.max(n.x,r.x),e.y=Math.min(e.y,r.y),n.y=Math.max(n.y,r.y);return ye.fromPoints(e,n)}area(){let e=0,n=this.pts.length;for(let r=0;re.clone()))}collides(e){return La(this,e)}contains(e){return this.collides(e)}raycast(e,n){return Ua(e,n,this)}random(){return P()}cut(e,n,r,s){new Ye(e,n);let i=[],l=[],c=n.sub(e),h=this.pts[this.pts.length-1],u=h.sub(e),g=c.cross(u)>0;return this.pts.forEach((y,m)=>{u=y.sub(e);let E=c.cross(u)>0;if(g!=E){let p=Va(h,y,e,n);if(i.push(p),l.push(p),r&&s){let T=r[m===0?r.length-1:m-1],f=r[m],w=y.sub(h),S=p.sub(h).dot(w)/w.dot(w),C=Fe(T,f,S);s[0].push(C),s[1].push(C)}g=E}(E?i:l).push(y),r&&s&&(E?s[0]:s[1]).push(r[m]),h=y}),[i.length?new mt(i):null,l.length?new mt(l):null]}},o(mt,"Polygon"),mt);function Ga(t,e,n,r){let s=r*r,i=1-r,l=i*i;return t.scale(l).add(e.scale(2*i*r)).add(n.scale(s))}o(Ga,"evaluateQuadratic");function Ha(t,e,n,r){let s=1-r;return e.sub(t).scale(2*s).add(n.sub(e).scale(2*r))}o(Ha,"evaluateQuadraticFirstDerivative");function Ka(t,e,n,r){return n.sub(e.scale(2)).add(t).scale(2)}o(Ka,"evaluateQuadraticSecondDerivative");function ts(t,e,n,r,s){let i=s*s,l=i*s,c=1-s,h=c*c,u=h*c;return t.scale(u).add(e.scale(3*h*s)).add(n.scale(3*c*i)).add(r.scale(l))}o(ts,"evaluateBezier");function Wa(t,e,n,r,s){let i=s*s,l=1-s,c=l*l;return e.sub(t).scale(3*c).add(n.sub(e).scale(6*l*s)).add(r.sub(n).scale(3*i))}o(Wa,"evaluateBezierFirstDerivative");function Ya(t,e,n,r,s){let i=1-s;return n.sub(e.scale(2)).add(t).scale(6*i).add(r.sub(n.scale(2)).add(e).scale(6*s))}o(Ya,"evaluateBezierSecondDerivative");function Xa(t,e,n,r,s){let i=.5*(((-s+2)*s-1)*s),l=.5*((3*s-5)*s*s+2),c=.5*(((-3*s+4)*s+1)*s),h=.5*((s-1)*s*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Xa,"evaluateCatmullRom");function Ja(t,e,n,r,s){let i=.5*((-3*s+4)*s-1),l=.5*((9*s-10)*s),c=.5*((-9*s+8)*s+1),h=.5*((3*s-2)*s);return t.scale(i).add(e.scale(l)).add(n.scale(c)).add(r.scale(h))}o(Ja,"evaluateCatmullRomFirstDerivative");function Qa(t){let e=ti(t),n=e(1);return r=>{let s=r*n,i=e(s,!0);return t(i)}}o(Qa,"normalizedCurve");function ti(t,e=10,n=10){let r=[0],s=[0],i=1/(e-1)/n,l=0,c=t(0),h=0;for(let u=1;u{if(g){let y=u;if(y<=0)return 0;if(y>=l)return 1;let m=0;for(;r[m+1]=1)return r[e-1];let y=0;for(;s[y+1]{let u=h*h,g=u*h;return s*g+i*u+l*h+c}}o(Zn,"hermite");function ni(t,e,n,r,s,i=Zn){let l=i(e.x,(1-s)*(n.x-t.x),(1-s)*(r.x-e.x),n.x),c=i(e.y,(1-s)*(n.y-t.y),(1-s)*(r.y-e.y),n.y);return h=>new q(l(h),c(h))}o(ni,"cardinal");function lr(t,e,n,r,s=Zn){return ni(t,e,n,r,.5,s)}o(lr,"catmullRom");function Za(t,e,n,r,s=Zn){return lr(r.add(t.sub(e).scale(6)),t,r,t.add(r.sub(n).scale(6)),s)}o(Za,"bezier");function _a(t,e,n,r,s,i,l,c=Zn){let h=c(e.x,.5*(1-s)*(1+l)*(1+i)*(e.x-t.x)+.5*(1-s)*(1-l)*(1-i)*(n.x-e.x),.5*(1-s)*(1+l)*(1-i)*(n.x-e.x)+.5*(1-s)*(1-l)*(1+i)*(r.x-n.x),n.x),u=c(e.y,.5*(1-s)*(1+l)*(1+i)*(e.y-t.y)+.5*(1-s)*(1-l)*(1-i)*(n.y-e.y),.5*(1-s)*(1+l)*(1-i)*(n.y-e.y)+.5*(1-s)*(1-l)*(1+i)*(r.y-n.y),n.y);return g=>new q(h(g),u(g))}o(_a,"kochanekBartels");function $a(t,e,n,r){let s=2*t+e-2*r+n,i=-3*t+3*r-2*e+n,l=e;return c=>{let h=c*c;return 3*s*h+2*i*c+l}}o($a,"hermiteFirstDerivative");function fn(t){return 0<=t&&t<=1}o(fn,"inZeroOneDomain");function Ir(t,e){return Math.abs(t-e)<=Number.EPSILON}o(Ir,"approximately");function gn(t){return t<0?-Math.pow(-t,1/3):Math.pow(t,1/3)}o(gn,"cubeRoot");function eo(t,e,n,r){let s=3*t-6*e+3*n,i=-3*t+3*e,l=t,c=-t+3*e-3*n+r;if(Ir(c,0)){if(Ir(s,0))return Ir(i,0)?[]:[-l/i].filter(fn);let f=Math.sqrt(i*i-4*s*l),w=2*s;return[(f-i)/w,(-i-f)/w].filter(fn)}s/=c,i/=c,l/=c;let h=(3*i-s*s)/3,u=h/3,g=(2*s*s*s-9*s*i+27*l)/27,y=g/2,m=y*y+u*u*u;if(m<0){let f=-h/3,w=f*f*f,S=Math.sqrt(w),C=-g/(2*S),I=C<-1?-1:C>1?1:C,k=Math.acos(I),x=2*gn(S),v=x*Math.cos(k/3)-s/3,M=x*Math.cos((k+2*Math.PI)/3)-s/3,R=x*Math.cos((k+4*Math.PI)/3)-s/3;return[v,M,R].filter(fn)}if(m===0){let f=y<0?gn(-y):-gn(y),w=2*f-s/3,S=-f-s/3;return[w,S].filter(fn)}let E=Math.sqrt(m),p=gn(E-y),T=gn(E+y);return[p-T-s/3].filter(fn)}o(eo,"getCubicRoots");function to(t,e,n,r,s){let i=eo(t.x-s,e.x-s,n.x-s,r.x-s);return i.length>0?ts(t,e,n,r,i[0]).y:NaN}o(to,"cubicBezierYforX");function no(t){if(!t||t.length==0)throw new Error("Need at least one point for easingLinear.");let e=t.length;return n=>{if(n<=0||t.length==1||n<=t[0].x)return t[0].y;for(let r=0;r=n)return at(n,t[r-1].x,t[r].x,t[r-1].y,t[r].y);return t[t.length-1].y}}o(no,"easingLinear");function ro(t,e){return n=>to(P(0,0),t,e,P(1,1),n)}o(ro,"easingCubicBezier");function so(t,e="jump-end"){let n=1/t,r=e=="jump-start"||e=="jump-both",s=e=="jump-end"||e=="jump-both",i=1/(t+(s?1:0)),l=r?i:0;return c=>{let h=Math.floor(c/n);return l+h*i}}o(so,"easingSteps");function ri(t,e,n){return(e.x-t.x)*(n.y-t.y)-(e.y-t.y)*(n.x-t.x)>=0}o(ri,"isOrientedCcw");function io(t){let e=0,n=t[t.length-1];for(let r=0;r=0}o(Br,"onSameSide");function ao(t,e,n,r){return Br(t,e,n,r)&&Br(t,n,e,r)&&Br(t,r,e,n)}o(ao,"pointInTriangle");function oo(t,e,n,r){for(let s of t)if(s!==e&&s!==n&&s!==r&&ao(s,e,n,r))return!0;return!1}o(oo,"someInTriangle");function lo(t,e,n,r){return ri(t,e,n)&&!oo(r,t,e,n)}o(lo,"isEar");function si(t){if(t.length<3)return[];if(t.length==3)return[t];let e=[],n=[],r=0;for(let y=0;y3;){u=e[c],g=n[c];let y=t[g],m=t[c],E=t[u];if(lo(y,m,E,s))i.push([y,m,E]),e[g]=u,n[u]=g,s.splice(s.indexOf(m),1),--l,h=0;else if(++h>l)return[];c=u}return u=e[c],g=n[c],i.push([t[g],t[c],t[u]]),i}o(si,"triangulate");function uo(t){if(t.length<3)return!1;let e=t.length-2,n=t.length-1,r=0,s=t[n].sub(t[e]),i=t[r].sub(t[n]),l=s.cross(i);for(;r+1?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~",ns="topleft",ih="monospace",Nr="monospace",Ss="linear",ii=[{name:"a_pos",size:2},{name:"a_uv",size:2},{name:"a_color",size:4}],ah=ii.reduce((t,e)=>t+e.size,0),co=2048,oh=co*4*ah,lh=co*6,uh=` attribute vec2 a_pos; attribute vec2 a_uv; attribute vec4 a_color; @@ -26,7 +26,7 @@ void main() { v_color = a_color; gl_Position = pos; } -`,ch=` +`,hh=` precision mediump float; varying vec2 v_pos; @@ -48,18 +48,18 @@ void main() { discard; } } -`,ks=` +`,Ms=` vec4 vert(vec2 pos, vec2 uv, vec4 color) { return def_vert(); } -`,Ps=` +`,ks=` vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { return def_frag(); } -`,dh=new Set(["id","require"]),fh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),gh=200,ph=640,mh=65536,go=Symbol.for("kaplay.cancel"),vn,yh=(vn=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(n){let r=this.lastID;return this.set(r,n),this.lastID++,r}pushd(n){let r=this.push(n);return()=>this.delete(r)}},o(vn,"Registry"),vn),_t,sn=(_t=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let n=new _t(()=>e.forEach(r=>r.cancel()));return Object.defineProperty(n,"paused",{get:o(()=>e[0].paused,"get"),set:o(r=>e.forEach(s=>s.paused=r),"set")}),n.paused=!1,n}static replace(e,n){return e.cancel=()=>n.cancel(),n.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>n.paused,"get"),set:o(r=>n.paused=r,"set")}),e}},o(_t,"KEventController"),_t),bn,Te=(bn=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new yh)}add(e){function n(...i){if(!s.paused)return e(...i)}o(n,"handler");let r=this.handlers.pushd(n),s=new sn(r);return this.cancellers.set(n,r),s}addOnce(e){let n=this.add((...r)=>{n.cancel(),e(...r)});return n}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(n=>{let r=n(...e),s;r===go&&(s=this.cancellers.get(n))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(bn,"KEvent"),bn),En,rs=(En=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,n){return this.handlers[e]||(this.handlers[e]=new Te),this.handlers[e].add(n)}onOnce(e,n){let r=this.on(e,(...s)=>{r.cancel(),n(...s)});return r}next(e){return new Promise(n=>{this.onOnce(e,(...r)=>n(r[0]))})}trigger(e,...n){this.handlers[e]&&this.handlers[e].trigger(...n)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var n;return((n=this.handlers[e])==null?void 0:n.numListeners())??0}},o(En,"KEventHandler"),En),wh=o(t=>t[0]instanceof se,"arrayIsColor"),xh=o(t=>t[0]instanceof q,"arrayIsVec2"),Ah=o(t=>typeof t[0]=="number","arrayIsNumber"),Sn,po=(Sn=class{constructor(e=(n,r)=>n0;){let n=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[n])&&this._items[e]>=this._items[n])break;this.swap(e,n),e=n}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),vh=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function is(t,e){if(t===e)return!0;let n=typeof t,r=typeof e;if(n!==r)return!1;if(n==="object"&&r==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!is(c,h))return!1}return!0}return!1}o(is,"deepEq");var ta=new Set,bh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function Ao(t){ta.has(t)||(ta.add(t),console.warn(t))}o(Ao,"warn");function Ht(t,e){Ao(`${t} is deprecated. Use ${e} instead.`)}o(Ht,"deprecateMsg");function Nr(t,e){return Number(t.toFixed(e))}o(Nr,"toFixed");function pe(t,e){return(...n)=>{let r=n.length;if(r===t.length)return t(...n);if(r===e.length)return e(...n)}}o(pe,"overload2");var Eh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function vo(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],n=0,r=0;for(;n=e&&t<=n}o(Kt,"betweenInclusive");var _e=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),ft=o((t,e)=>Array.isArray(e)?e.some(n=>t.has(n)):t.has(e),"setHasOrIncludes"),br=o((t,e,n)=>{var r;t.has(e)?(r=t.get(e))==null||r.push(n):t.set(e,[n])},"mapAddOrPush"),Sh=(()=>{let t=0;return()=>t++})(),Mh={"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}}}},kh=o(()=>Xt.lastInputDevice,"getLastInputDeviceType"),Ph=o(()=>{let t=Xt.buttons;for(let e in t){let n=t[e].keyboard&&[t[e].keyboard].flat(),r=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();n&&n.forEach(l=>{br(Xt.buttonsByKey,l,e)}),r&&r.forEach(l=>{br(Xt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{br(Xt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{br(Xt.buttonsByMouse,l,e)})}},"parseButtonBindings"),Mn,er=(Mn=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Mn,"ButtonState"),Mn),kn,Ch=(kn=class{constructor(){b(this,"buttonState",new er);b(this,"stickState",new Map)}},o(kn,"GamepadState"),kn),Pn,qh=(Pn=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((n,r)=>n+r)/this.dts.length)),this.dts=[])}},o(Pn,"FPSCounter"),Pn),Xt,na=Mh,Th=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new qh,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new q(0),mouseDeltaPos:new q(0),keyState:new er,mouseState:new er,mergedGamepadState:new Ch,gamepadStates:new Map,lastInputDevice:null,buttonState:new er,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new rs}},"initAppState"),Ih=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=Th(t);Xt=e,Ph();function n(){return e.dt*e.timeScale}o(n,"dt");function r(){return e.fixedDt*e.timeScale}o(r,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function g(A){e.canvas.style.cursor=A}o(g,"setCursor");function y(){return e.canvas.style.cursor}o(y,"getCursor");function m(A){if(A)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(m,"setCursorLocked");function E(){return!!document.pointerLockElement}o(E,"isCursorLocked");function p(A){A.requestFullscreen?A.requestFullscreen():A.webkitRequestFullscreen&&A.webkitRequestFullscreen()}o(p,"enterFullscreen");function T(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(T,"exitFullscreen");function f(A=!0){A?p(e.canvas):T()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let A=Object.entries(qe),B=Object.entries(gs),F=Object.entries(vr);for(let[j,Z]of A)e.canvas.removeEventListener(j,Z);for(let[j,Z]of B)document.removeEventListener(j,Z);for(let[j,Z]of F)window.removeEventListener(j,Z);$i.disconnect()}o(S,"quit");function C(A,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,j=0,Z=o(ge=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Z);return}let Be=ge/1e3,Ae=Math.min(Be-e.realTime,.25),vt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Be,j+=Ae,j>vt){if(!e.skipTime){for(F+=j,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(I,"isTouchscreen");function k(){return e.mousePos.clone()}o(k,"mousePos");function x(){return e.mouseDeltaPos.clone()}o(x,"mouseDeltaPos");function v(A="left"){return e.mouseState.pressed.has(A)}o(v,"isMousePressed");function M(A="left"){return e.mouseState.down.has(A)}o(M,"isMouseDown");function R(A="left"){return e.mouseState.released.has(A)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(A){return A===void 0?e.keyState.pressed.size>0:ft(e.keyState.pressed,A)}o(D,"isKeyPressed");function O(A){return A===void 0?e.keyState.pressedRepeat.size>0:ft(e.keyState.pressedRepeat,A)}o(O,"isKeyPressedRepeat");function z(A){return A===void 0?e.keyState.down.size>0:ft(e.keyState.down,A)}o(z,"isKeyDown");function te(A){return A===void 0?e.keyState.released.size>0:ft(e.keyState.released,A)}o(te,"isKeyReleased");function H(A){return A===void 0?e.mergedGamepadState.buttonState.pressed.size>0:ft(e.mergedGamepadState.buttonState.pressed,A)}o(H,"isGamepadButtonPressed");function $(A){return A===void 0?e.mergedGamepadState.buttonState.down.size>0:ft(e.mergedGamepadState.buttonState.down,A)}o($,"isGamepadButtonDown");function Q(A){return A===void 0?e.mergedGamepadState.buttonState.released.size>0:ft(e.mergedGamepadState.buttonState.released,A)}o(Q,"isGamepadButtonReleased");function ne(A){return A===void 0?e.buttonState.pressed.size>0:ft(e.buttonState.pressed,A)}o(ne,"isButtonPressed");function Y(A){return A===void 0?e.buttonState.down.size>0:ft(e.buttonState.down,A)}o(Y,"isButtonDown");function ee(A){return A===void 0?e.buttonState.released.size>0:ft(e.buttonState.released,A)}o(ee,"isButtonReleased");function W(A){var B;return(B=e.buttons)==null?void 0:B[A]}o(W,"getButton");function De(A,B){e.buttons[A]={...e.buttons[A],...B}}o(De,"setButton");function He(A){e.buttonState.press(A),e.events.trigger("buttonPress",A)}o(He,"pressButton");function Ie(A){e.buttonState.release(A),e.events.trigger("buttonRelease",A)}o(Ie,"releaseButton");function Ne(A){return e.events.on("resize",A)}o(Ne,"onResize");let Je=pe(A=>e.events.on("keyDown",A),(A,B)=>e.events.on("keyDown",F=>_e(A,F)&&B(F))),K=pe(A=>e.events.on("keyPress",B=>A(B)),(A,B)=>e.events.on("keyPress",F=>_e(A,F)&&B(F))),oe=pe(A=>e.events.on("keyPressRepeat",A),(A,B)=>e.events.on("keyPressRepeat",F=>_e(A,F)&&B(F))),ce=pe(A=>e.events.on("keyRelease",A),(A,B)=>e.events.on("keyRelease",F=>_e(A,F)&&B(F))),Fe=pe(A=>e.events.on("mouseDown",B=>A(B)),(A,B)=>e.events.on("mouseDown",F=>_e(A,F)&&B(F))),Se=pe(A=>e.events.on("mousePress",B=>A(B)),(A,B)=>e.events.on("mousePress",F=>_e(A,F)&&B(F))),tt=pe(A=>e.events.on("mouseRelease",B=>A(B)),(A,B)=>e.events.on("mouseRelease",F=>F===A&&B(F)));function Qe(A){return e.events.on("mouseMove",()=>A(k(),x()))}o(Qe,"onMouseMove");function nt(A){return e.events.on("charInput",A)}o(nt,"onCharInput");function Ce(A){return e.events.on("touchStart",A)}o(Ce,"onTouchStart");function he(A){return e.events.on("touchMove",A)}o(he,"onTouchMove");function Ue(A){return e.events.on("touchEnd",A)}o(Ue,"onTouchEnd");function N(A){return e.events.on("scroll",A)}o(N,"onScroll");function V(A){return e.events.on("hide",A)}o(V,"onHide");function X(A){return e.events.on("show",A)}o(X,"onShow");let ie=pe(A=>e.events.on("gamepadButtonPress",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonPress",(F,j)=>_e(A,F)&&B(F,j))),Me=pe(A=>e.events.on("gamepadButtonDown",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonDown",(F,j)=>_e(A,F)&&B(F,j))),be=pe(A=>e.events.on("gamepadButtonRelease",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonRelease",(F,j)=>_e(A,F)&&B(F,j)));function rt(A,B){return e.events.on("gamepadStick",(F,j,Z)=>F===A&&B(j,Z))}o(rt,"onGamepadStick");function ln(A){return e.events.on("gamepadConnect",A)}o(ln,"onGamepadConnect");function un(A){return e.events.on("gamepadDisconnect",A)}o(un,"onGamepadDisconnect");function xr(A){return e.mergedGamepadState.stickState.get(A)||new q(0)}o(xr,"getGamepadStick");function U(){return[...e.charInputted]}o(U,"charInputted");function G(){return[...e.gamepads]}o(G,"getGamepads");let J=pe(A=>e.events.on("buttonPress",B=>A(B)),(A,B)=>e.events.on("buttonPress",F=>_e(A,F)&&B(F))),le=pe(A=>e.events.on("buttonDown",B=>A(B)),(A,B)=>e.events.on("buttonDown",F=>_e(A,F)&&B(F))),me=pe(A=>e.events.on("buttonRelease",B=>A(B)),(A,B)=>e.events.on("buttonRelease",F=>_e(A,F)&&B(F)));function Ze(){e.events.trigger("input"),e.keyState.down.forEach(A=>e.events.trigger("keyDown",A)),e.mouseState.down.forEach(A=>e.events.trigger("mouseDown",A)),e.buttonState.down.forEach(A=>{e.events.trigger("buttonDown",A)}),fe()}o(Ze,"processInput");function At(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((A,B)=>{e.mergedGamepadState.stickState.set(B,new q(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new q(0),e.gamepadStates.forEach(A=>{A.buttonState.update(),A.stickState.forEach((B,F)=>{A.stickState.set(F,new q(0))})})}o(At,"resetInput");function ct(A){let B={index:A.index,isPressed:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.stickState.get(F))||P()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(A.index,{buttonState:new er,stickState:new Map([["left",new q(0)],["right",new q(0)]])}),B}o(ct,"registerGamepad");function Ar(A){e.gamepads=e.gamepads.filter(B=>B.index!==A.index),e.gamepadStates.delete(A.index)}o(Ar,"removeGamepad");function fe(){var A,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&ct(F);for(let F of e.gamepads){let j=navigator.getGamepads()[F.index];if(!j)continue;let Z=(t.gamepads??{})[j.id]||na[j.id]||na.default,ge=e.gamepadStates.get(F.index);if(ge){for(let Be=0;Be{e.buttonState.press(bt),e.events.trigger("buttonPress",bt)})),e.mergedGamepadState.buttonState.press(Ae),ge.buttonState.press(Ae),e.events.trigger("gamepadButtonPress",Ae,F)}else ge.buttonState.down.has(Ae)&&(dt&&((B=e.buttonsByGamepad.get(Ae))==null||B.forEach(bt=>{e.buttonState.release(bt),e.events.trigger("buttonRelease",bt)})),e.mergedGamepadState.buttonState.release(Ae),ge.buttonState.release(Ae),e.events.trigger("gamepadButtonRelease",Ae,F))}for(let Be in Z.sticks){let Ae=Z.sticks[Be];if(!Ae)continue;let vt=new q(j.axes[Ae.x],j.axes[Ae.y]);ge.stickState.set(Be,vt),e.mergedGamepadState.stickState.set(Be,vt),e.events.trigger("gamepadStick",Be,vt,F)}}}}o(fe,"processGamepad");let qe={},gs={},vr={},Qi=t.pixelDensity||1;qe.mousemove=A=>{let B=new q(A.offsetX,A.offsetY),F=new q(A.movementX,A.movementY);if(w()){let j=e.canvas.width/Qi,Z=e.canvas.height/Qi,ge=window.innerWidth,Be=window.innerHeight,Ae=ge/Be,vt=j/Z;if(Ae>vt){let dt=Be/Z,bt=(ge-j*dt)/2;B.x=ot(A.offsetX-bt,0,j*dt,0,j),B.y=ot(A.offsetY,0,Z*dt,0,Z)}else{let dt=ge/j,bt=(Be-Z*dt)/2;B.x=ot(A.offsetX,0,j*dt,0,j),B.y=ot(A.offsetY-bt,0,Z*dt,0,Z)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Zi=["left","middle","right","back","forward"];qe.mousedown=A=>{e.events.onOnce("input",()=>{var F;let B=Zi[A.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.press(j),e.events.trigger("buttonPress",j)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},qe.mouseup=A=>{e.events.onOnce("input",()=>{var F;let B=Zi[A.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.release(j),e.events.trigger("buttonRelease",j)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Zu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),_i={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};qe.keydown=A=>{Zu.has(A.key)&&A.preventDefault(),e.events.onOnce("input",()=>{var j,Z;let B=_i[A.key]||A.key.toLowerCase(),F=A.code;if(B===void 0)throw new Error(`Unknown key: ${A.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),A.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},qe.keyup=A=>{e.events.onOnce("input",()=>{var j,Z;let B=_i[A.key]||A.key.toLowerCase(),F=A.code;e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},qe.touchstart=A=>{A.preventDefault(),e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.press(Z),e.events.trigger("buttonPress",Z)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Z=>{e.events.trigger("touchStart",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},qe.touchmove=A=>{A.preventDefault(),e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let j=e.mousePos;e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(j),e.events.trigger("mouseMove")}B.forEach(j=>{e.events.trigger("touchMove",new q(j.clientX-F.x,j.clientY-F.y),j)})})},qe.touchend=A=>{e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new q(0,0),e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.release(Z),e.events.trigger("buttonRelease",Z)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Z=>{e.events.trigger("touchEnd",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},qe.touchcancel=A=>{e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(j=>{e.events.trigger("touchEnd",new q(j.clientX-F.x,j.clientY-F.y),j)})})},qe.wheel=A=>{A.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new q(A.deltaX,A.deltaY))})},qe.contextmenu=A=>A.preventDefault(),gs.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},vr.gamepadconnected=A=>{let B=ct(A.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},vr.gamepaddisconnected=A=>{let B=G().filter(F=>F.index===A.gamepad.index)[0];Ar(A.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[A,B]of Object.entries(qe))e.canvas.addEventListener(A,B);for(let[A,B]of Object.entries(gs))document.addEventListener(A,B);for(let[A,B]of Object.entries(vr))window.addEventListener(A,B);let $i=new ResizeObserver(A=>{for(let B of A)if(B.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 $i.observe(e.canvas),{state:e,dt:n,fixedDt:r,restDt:s,time:l,run:C,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:g,screenshot:u,getGamepads:G,getCursor:y,setCursorLocked:m,isCursorLocked:E,isTouchscreen:I,mousePos:k,mouseDeltaPos:x,isKeyDown:z,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:te,isMouseDown:M,isMousePressed:v,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:H,isGamepadButtonDown:$,isGamepadButtonReleased:Q,getGamepadStick:xr,isButtonPressed:ne,isButtonDown:Y,isButtonReleased:ee,setButton:De,getButton:W,pressButton:He,releaseButton:Ie,charInputted:U,onResize:Ne,onKeyDown:Je,onKeyPress:K,onKeyPressRepeat:oe,onKeyRelease:ce,onMouseDown:Fe,onMousePress:Se,onMouseRelease:tt,onMouseMove:Qe,onCharInput:nt,onTouchStart:Ce,onTouchMove:he,onTouchEnd:Ue,onScroll:N,onHide:V,onShow:X,onGamepadButtonDown:Me,onGamepadButtonPress:ie,onGamepadButtonRelease:be,onGamepadStick:rt,onGamepadConnect:ln,onGamepadDisconnect:un,onButtonPress:J,onButtonDown:le,onButtonRelease:me,getLastInputDeviceType:kh,events:e.events}},"initApp"),Io=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(Io||{}),Bh=new q(-1,-1),Rh=new q(0,-1),Fh=new q(1,-1),Oh=new q(-1,0),Lh=new q(0,0),Dh=new q(1,0),Nh=new q(-1,1),Uh=new q(0,1),jh=new q(1,1);function an(t){switch(t){case"topleft":return Bh;case"top":return Rh;case"topright":return Fh;case"left":return Oh;case"center":return Lh;case"right":return Dh;case"botleft":return Nh;case"bot":return Uh;case"botright":return jh;default:return t}}o(an,"anchorPt");function Bo(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Bo,"alignPt");var Er=2.5949095,ra=1.70158+1,sa=2*Math.PI/3,ia=2*Math.PI/4.5,Br={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>ra*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+ra*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Er+1)*2*t-Er)/2:(Math.pow(2*t-2,2)*((Er+1)*(t*2-2)+Er)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*sa),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*sa)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*ia))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*ia)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Br.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Br.easeOutBounce(1-2*t))/2:(1+Br.easeOutBounce(2*t-1))/2,"easeInOutBounce")},ar=Br,Cn,zh=(Cn=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e,this.radius=n}support(e){let n=new q(e.x,e.y);return q.unit(n,n),q.scale(n,this.radius,n),q.add(n,this.center,n),n}},o(Cn,"CircleCollider"),Cn),qn,Vh=(qn=class{constructor(e,n,r,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=n,this.radiusY=r,this.angle=s}support(e){if(this.angle===0){let n=new q(e.x,e.y);return q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.add(n,this.center,n),n}else{let n=new q(e.x,e.y);return q.rotateByAngle(n,-this.angle,n),q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.rotateByAngle(n,this.angle,n),q.add(n,this.center,n),n}}},o(qn,"EllipseCollider"),qn),Tn,ps=(Tn=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let n,r=Number.NEGATIVE_INFINITY,s;for(let i=0;ir&&(r=l,n=s)}return n}},o(Tn,"PolygonCollider"),Tn);function li(t,e,n){let r=new q(-n.x,-n.y),s=t.support(n),i=e.support(r);return new q(s.x-i.x,s.y-i.y)}o(li,"calculateSupport");function Ro(t,e,n,r){var s=li(e,n,r);return t.push(s),r.dot(s)>=0}o(Ro,"addSupport");function Rr(t,e,n){let r=t.x*e.y-t.y*e.x;return new q(-r*n.y,r*n.x)}o(Rr,"tripleProduct");function ui(t,e,n,r){switch(t.length){case 0:{r.x=n.center.x-e.center.x,r.y=n.center.y-e.center.y;break}case 1:{r.x=r.x*=-1,r.y=r.y*=-1;break}case 2:{let l=new q(t[1].x-t[0].x,t[1].y-t[0].y),c=new q(-t[0].x,-t[0].y),h=Rr(l,c,l);r.x=h.x,r.y=h.y;break}case 3:{let l=new q(-t[2].x,-t[2].y),c=new q(t[1].x-t[2].x,t[1].y-t[2].y),h=new q(t[0].x-t[2].x,t[0].y-t[2].y);var s=Rr(h,c,c),i=Rr(c,h,h);if(s.dot(l)>0)t.splice(0,1),r.x=s.x,r.y=s.y;else if(i.dot(l)>0)t.splice(1,1),r.x=i.x,r.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return Ro(t,e,n,r)?2:0}o(ui,"evolveSimplex");function Fo(t,e){let n=[],r=new q;for(var s=2;s===2;)s=ui(n,t,e,r);return s===1}o(Fo,"gjkIntersects");function Oo(t,e){let n=Number.POSITIVE_INFINITY,r=new q,s=0,i=new q,l=new q;for(let h=0;h=t.length&&(u=0),q.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}q.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new q;for(let m=0;mc.coste.y!=r.a.y>e.y&&e.x<(r.a.x-r.b.x)*(e.y-r.b.y)/(r.a.y-r.b.y)+r.b.x&&(n=!n);return n}},o(Bn,"NavPolygon"),Bn),Rn,Wh=(Rn=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let n=this._pointCache[`${e.x}_${e.y}`];return n||(n=e.clone(),this._pointCache[`${e.x}_${e.y}`]=n,n)}_addEdge(e){let n=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[n]=e,e}_findEdge(e,n){let r=`${e.x}_${e.y}-${n.x}_${n.y}`;return this._edgeCache[r]}_findCommonEdge(e,n){for(let r of e.edges){let s=this._findEdge(r.b,r.a);if(s&&s.polygon.deref().id===n.id)return s}return null}addPolygon(e){let n=new Kh(this._polygons.length),r=e.map((s,i)=>new Hh(s,e[(i+1)%e.length],n));n.edges=r,this._polygons.push(n);for(let s of n.edges)this._addEdge(s);return n}addRect(e,n){let r=this._addPoint(e),s=this._addPoint(e.add(n.x,0)),i=this._addPoint(e.add(n)),l=this._addPoint(e.add(0,n.y));return this.addPolygon([r,s,i,l])}_getLocation(e){for(let n of this._polygons)if(n.contains(e))return n;return null}getNeighbours(e){let n=[];for(let r of this._polygons[e].edges){let s=this._findEdge(r.b,r.a);if(s){let i=s.polygon.deref();i&&n.push(i.id)}}return n}getCost(e,n){return 1}getHeuristic(e,n){let r=this._polygons[e],s=this._polygons[n],i=r.centroid.x-s.centroid.x,l=r.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,n){return e===void 0||n===void 0?[]:e===n?[e,n]:jo(this,e,n)}getWaypointPath(e,n,r){let s=(r==null?void 0:r.type)||"centroids",i=this._getLocation(e),l=this._getLocation(n);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),n]}},o(Rn,"NavMesh"),Rn);function Jt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Jt,"calcTransform");function mn(t,e,n,r,s,i=1){r=ye(r%360),s=ye(s%360),s<=r&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-r)/ye(8)*i),h=(s-r)/c,u=P(Math.cos(r),Math.sin(r)),g=P(Math.cos(h),Math.sin(h));for(let y=0;y<=c;y++)l.push(t.add(e*u.x,n*u.y)),u=P(u.x*g.x-u.y*g.y,u.x*g.y+u.y*g.x);return l}o(mn,"getArcPts");var Fn,aa=(Fn=class{constructor(e,n){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=n}},o(Fn,"Edge"),Fn),On,Yh=(On=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let n=new aa(e,!0),r=new aa(e,!1);this.edges.push(n),this.edges.push(r),this.objects.set(e,[n,r])}remove(e){let n=this.objects.get(e);n&&(this.edges.splice(this.edges.indexOf(n[0]),1),this.edges.splice(this.edges.indexOf(n[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,n]of this.objects.entries()){Jt(e,e.transform);let r=e.worldArea().bbox();n[0].x=r.pos.x,n[1].x=r.pos.x+r.width}for(let e=1;e=0&&!(this.edges[n].x=t&&(this.opacity=e,r=!0))}}}o(Yo,"fadeIn");function Xo(t="intersect"){return{id:"mask",mask:t}}o(Xo,"mask");function ci(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,n=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,r=>this.opacity=r,n)},fadeOut(e=1,n=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,r=>this.opacity=r,n)},inspect(){return`opacity: ${Nr(this.opacity,1)}`}}}o(ci,"opacity");function Jo(t=1,e=ue(0,0,0),n=1,r="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:n,join:r,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Jo,"outline");var Ln,Xh=(Ln=class{constructor(){b(this,"pos",P(0));b(this,"vel",P(0));b(this,"acc",P(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Ln,"Particle"),Ln);function Qo(t,e){let n=e.lifetime,r=new Array(t.max),s=t.colors||[se.WHITE],i=t.opacities||[1],l=t.quads||[new xe(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,g=t.speed||[0,0],y=t.angle||[0,0],m=t.angularVelocity||[0,0],E=t.acceleration||[P(0),P(0)],p=t.damping||[0,0],T=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let k=0;k=v.lt){v.gc=!0,w--;continue}v.vel=v.vel.add(v.acc.scale(k)).scale(1-v.damping*k),v.pos=v.pos.add(v.vel.scale(k)),v.angle+=v.angularVelocity*k}}for(n!==void 0&&(n-=k,n<=0&&C.trigger()),S+=k;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(n!==void 0&&n<=0||w==0)){for(let k=0;k`[${n.x},${n.y}]`).join(",")}`}}}o(_o,"polygon");function di(t,e,n){let r;return d.game.root.get("area").forEach(s=>{if(n&&n.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(r?i.fractionthis.canvas.width||r>this.canvas.height)&&this.add_single(e),this.x+n>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+r>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Ct.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new q(this.x+this.padding,this.y+this.padding);return this.x+=n,r>this.curHeight&&(this.curHeight=r),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new q(e.width,e.height),texture:s}),this.lastTextureId++,[s,new xe(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let n=this.texturesPosition.get(e);if(!n)throw new Error("Texture with packer id not found");this.c2d.clearRect(n.position.x,n.position.y,n.size.x,n.size.y),n.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=n.size.x}},o(Dn,"TexPacker"),Dn);function et(t){return typeof t!="string"||xo(t)?t:d.assets.urlPrefix+t}o(et,"fixURL");var $t,ut=($t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new Te);b(this,"onErrorEvents",new Te);b(this,"onFinishEvents",new Te);e.then(n=>{this.loaded=!0,this.data=n,this.onLoadEvents.trigger(n)}).catch(n=>{if(this.error=n,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(n);else throw n}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let n=new $t(Promise.resolve(e));return n.data=e,n.loaded=!0,n}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)}},o($t,"Asset"),$t),Nn,hn=(Nn=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,n){let r=e??this.lastUID+++"",s=new ut(n);return this.assets.set(r,s),s}addLoaded(e,n){let r=e??this.lastUID+++"",s=ut.loaded(n);return this.assets.set(r,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(n=>{n.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Nn,"AssetBucket"),Nn);function os(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(os,"fetchURL");function pr(t){return os(t).then(e=>e.json())}o(pr,"fetchJSON");function el(t){return os(t).then(e=>e.text())}o(el,"fetchText");function tl(t){return os(t).then(e=>e.arrayBuffer())}o(tl,"fetchArrayBuffer");function nl(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(nl,"loadRoot");function rl(t,e){return d.assets.custom.add(t,pr(et(e)))}o(rl,"loadJSON");function mr(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((n,r)=>{e.onload=()=>n(e),e.onerror=()=>r(new Error(`Failed to load image from "${t}"`))})}o(mr,"loadImg");function jt(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,n)=>e+n.progress(),0)/t.length}o(jt,"loadProgress");function gi(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(gi,"getFailedAssets");function sl(t){return d.assets.custom.get(t)??null}o(sl,"getAsset");function Ur(t){return d.assets.custom.add(null,t)}o(Ur,"load");var Qh=o((t,e)=>({urlPrefix:"",sprites:new hn,fonts:new hn,bitmapFonts:new hn,sounds:new hn,shaders:new hn,custom:new hn,music:{},packer:new Jh(t,2048,2048,e),loaded:!1}),"initAssets");function il(t,e,n){e=et(e),n=et(n),typeof e=="string"&&!n&&(n=vh(e)+".json");let r=typeof n=="string"?pr(n):Promise.resolve(n);return d.assets.sprites.add(t,r.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new xe(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return nn.from(e,{frames:l,anims:c})}))}o(il,"loadAseprite");var Zh="data:image/png;base64,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",Un,Fr=(Un=class{constructor(e,n={}){b(this,"fontface");b(this,"filter",Ms);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=n.filter??Ms,this.size=n.size??64,this.size>256)throw new Error("Max font size: 256");n.outline&&(this.outline={width:1,color:ue(0,0,0)},typeof n.outline=="number"?this.outline.width=n.outline:typeof n.outline=="object"&&(n.outline.width&&(this.outline.width=n.outline.width),n.outline.color&&(this.outline.color=n.outline.color)))}},o(Un,"FontData"),Un);function pi(t){if(!t)return pi(d.globalOpt.font??ah);if(typeof t=="string"){let e=yi(t),n=mi(t);if(e)return e.data??e;if(n)return n.data??n;if(document.fonts.check(`64px ${t}`))return t;if(jt()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof ut)return t.data?t.data:t;return t}o(pi,"resolveFont");function mi(t){return d.assets.fonts.get(t)??null}o(mi,"getFont");function al(t,e,n={}){let r=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(r),d.assets.fonts.add(t,r.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new Fr(s,n)))}o(al,"loadFont");function ol(t,e,n,r){let s=t.width/e,i={},l=r.split("").entries();for(let[c,h]of l)i[h]=new xe(c%s*e,Math.floor(c/s)*n,e,n);return{tex:t,map:i,size:n}}o(ol,"makeFont");function yi(t){return d.assets.bitmapFonts.get(t)??null}o(yi,"getBitmapFont");function wi(t,e,n,r,s={}){let i=et(e);return d.assets.bitmapFonts.add(t,mr(i).then(l=>ol(Ct.fromImage(d.gfx.ggl,l,s),n,r,s.chars??co)))}o(wi,"loadBitmapFont");var _h=o((t="happy",e)=>wi(t,Zh,28,36,e),"loadHappy");function ll(t,e){return e=et(e),d.assets.sprites.add(t,new Promise(async n=>{let r=typeof e=="string"?await pr(e):e,s=await Promise.all(r.frames.map(mr)),i=document.createElement("canvas");i.width=r.width,i.height=r.height*r.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*r.height)});let c=await xn(null,i,{sliceY:r.frames.length,anims:r.anims});n(c)}))}o(ll,"loadPedit");var jn,$h=(jn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,n),i.shaderSource(c,r),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,g)=>i.bindAttribLocation(h,g,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let g=i.getShaderInfoLog(c);if(g)throw new Error("FRAGMENT SHADER "+g)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let n=this.ctx.gl;for(let r in e){let s=e[r],i=n.getUniformLocation(this.glProgram,r);if(typeof s=="number")n.uniform1f(i,s);else if(s instanceof Xr)n.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof tn)n.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof se)n.uniform3f(i,s.r,s.g,s.b);else if(s instanceof q)n.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],Ah(s)?n.uniform1fv(i,s):xh(s)?n.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):wh(s)&&n.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(jn,"Shader"),jn);function ls(t,e=ks,n=Ps){let r=hh.replace("{{user}}",e??ks),s=ch.replace("{{user}}",n??Ps);try{return new $h(t,r,s,ai.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=bh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),g=c.groups.type.toLowerCase();throw new Error(`${g} shader line ${h}: ${u}`)}}o(ls,"makeShader");function ul(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=xi(t);if(e)return e.data??e;if(jt()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof ut)return t.data?t.data:t;return t}o(ul,"resolveShader");function xi(t){return d.assets.shaders.get(t)??null}o(xi,"getShader");function hl(t,e,n){return d.assets.shaders.addLoaded(t,ls(d.gfx.ggl,e,n))}o(hl,"loadShader");function cl(t,e,n){e=et(e),n=et(n);let r=o(i=>i?el(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([r(e),r(n)]).then(([i,l])=>ls(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(cl,"loadShaderURL");var yt,wn=(yt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new yt(e)}static fromArrayBuffer(e){return new Promise((n,r)=>d.audio.ctx.decodeAudioData(e,n,r)).then(n=>new yt(n))}static fromURL(e){return xo(e)?yt.fromArrayBuffer(yo(e)):tl(e).then(n=>yt.fromArrayBuffer(n))}},o(yt,"SoundData"),yt);function dl(t){if(typeof t=="string"){let e=Ai(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof wn)return ut.loaded(t);if(t instanceof ut)return t;throw new Error(`Invalid sound: ${t}`)}}o(dl,"resolveSound");function Ai(t){return d.assets.sounds.get(t)??null}o(Ai,"getSound");function fl(t,e){let n=et(e),r;return typeof n=="string"?r=wn.fromURL(n):n instanceof ArrayBuffer?r=wn.fromArrayBuffer(n):r=Promise.resolve(wn.fromAudioBuffer(n)),d.assets.sounds.add(t,r)}o(fl,"loadSound");function gl(t,e){let n=et(e),r=new Audio(n);return r.preload="auto",d.assets.music[t]=n}o(gl,"loadMusic");function vi(t,e){return t=et(t),Ur(typeof e=="string"?new Promise((n,r)=>{pr(e).then(s=>{vi(t,s).then(n).catch(r)})}):nn.from(t).then(n=>{let r={};for(let s in e){let i=e[s],l=n.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(y=>new xe(l.x+(i.x+y.x)/c*l.w,l.y+(i.y+y.y)/h*l.h,y.w/c*l.w,y.h/h*l.h)):Ei(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),g=new nn(n.tex,u,i.anims);d.assets.sprites.addLoaded(s,g),r[s]=g}return r}))}o(vi,"loadSpriteAtlas");var ec="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==",wt,nn=(wt=class{constructor(e,n,r={},s=null,i=null){b(this,"tex");b(this,"frames",[new xe(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,n&&(this.frames=n),this.anims=r,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,n={}){return typeof e=="string"?wt.fromURL(e,n):Promise.resolve(wt.fromImage(e,n))}static fromImage(e,n={}){let[r,s,i]=n.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=n.frames?n.frames.map(c=>new xe(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):Ei(n.sliceX||1,n.sliceY||1,s.x,s.y,s.w,s.h);return new wt(r,l,n.anims,n.slice9,i)}static fromURL(e,n={}){return mr(e).then(r=>wt.fromImage(r,n))}},o(wt,"SpriteData"),wt);function tr(t){if(typeof t=="string"){let e=bi(t);if(e)return e;if(jt()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof ut)return t;throw new Error(`Invalid sprite: ${t}`)}}o(tr,"resolveSprite");function bi(t){return d.assets.sprites.get(t)??null}o(bi,"getSprite");function xn(t,e,n={sliceX:1,sliceY:1,anims:{}}){return e=et(e),Array.isArray(e)?e.some(r=>typeof r=="string")?d.assets.sprites.add(t,Promise.all(e.map(r=>typeof r=="string"?mr(r):Promise.resolve(r))).then(r=>Is(r,n))):d.assets.sprites.addLoaded(t,Is(e,n)):typeof e=="string"?d.assets.sprites.add(t,nn.from(e,n)):d.assets.sprites.addLoaded(t,nn.fromImage(e,n))}o(xn,"loadSprite");function Ei(t=1,e=1,n=0,r=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*r,0):i.drawImage(c,h*r,0)});let l=i.getImageData(0,0,t.length*r,s);return nn.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Is,"createSpriteSheet");function pl(t="bean"){return xn(t,ec)}o(pl,"loadBean");function jr(t,e={}){let n=null,r=null,s=null,i=new Te;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,g,y,m)=>{let E=P(1,1);return y&&m?(E.x=y/(u.width*g.w),E.y=m/(u.height*g.h)):y?(E.x=y/(u.width*g.w),E.y=E.x):m&&(E.y=m/(u.height*g.h),E.x=E.y),E},"calcTexScale"),c=o((u,g)=>{if(!g)return;let y=g.frames[0].clone();e.quad&&(y=y.scale(e.quad));let m=l(g.tex,y,e.width,e.height);if(u.width=g.tex.width*y.w*m.x,u.height=g.tex.height*y.h*m.y,g.anims)for(let E in g.anims){let p=g.anims[E];typeof p!="number"&&(p.frames=h(p))}n=g,i.trigger(n),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let g=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let y=Math.abs(u.to-u.from)+1;for(let m=0;m0;m--)g.push(g[m]);return g},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new xe(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let g=tr(u);g&&g.onLoad(y=>c(this,y))},get animFrame(){if(!n||!r||s===null)return this.frame;let u=n.anims[r.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?r.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!n)return;let u=n.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(n.slice9){let{left:g,right:y,top:m,bottom:E}=n.slice9,p=n.tex.width*u.w,T=n.tex.height*u.h,f=this.width-g-y,w=this.height-m-E,S=g/p,C=y/p,I=1-S-C,k=m/T,x=E/T,v=1-k-x,M=[ve(0,0,S,k),ve(S,0,I,k),ve(S+I,0,C,k),ve(0,k,S,v),ve(S,k,I,v),ve(S+I,k,C,v),ve(0,k+v,S,x),ve(S,k+v,I,x),ve(S+I,k+v,C,x),ve(0,0,g,m),ve(g,0,f,m),ve(g+f,0,y,m),ve(0,m,g,w),ve(g,m,f,w),ve(g+f,m,y,w),ve(0,m+w,g,E),ve(g,m+w,f,E),ve(g+f,m+w,y,E)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];cr(Object.assign(xt(this),{pos:D.pos(),tex:n.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else cr(Object.assign(xt(this),{tex:n.tex,quad:u.scale(this.quad??new xe(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=tr(t);u?u.onLoad(g=>c(this,g)):us(()=>c(this,tr(t).data))},update(){if(!n||!r||s===null)return;let u=n.anims[r.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(r.timer+=d.k.dt()*this.animSpeed,r.timer>=1/r.speed){r.timer=0,r.frameIndex+=s;let g=u.frames;if(r.frameIndex>=g.length)if(r.pingpong&&!u.pingpong)s=-1,r.frameIndex=g.length-2;else if(r.loop)r.frameIndex=0;else{this.frame=g.at(-1),r.onEnd(),this.stop();return}else if(r.frameIndex<0)if(r.pingpong&&r.loop)s=1,r.frameIndex=1;else if(r.loop)r.frameIndex=g.length-1;else{this.frame=g[0],r.onEnd(),this.stop();return}this.frame=g[r.frameIndex]}},play(u,g={}){if(!n){i.add(()=>this.play(u,g));return}let y=n.anims[u];if(y===void 0)throw new Error(`Anim not found: ${u}`);r&&this.stop(),r=typeof y=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:g.loop??y.loop??!1,pingpong:g.pingpong??y.pingpong??!1,speed:g.speed??y.speed??10,frameIndex:0,onEnd:g.onEnd??(()=>{})},s=typeof y=="number"?null:1,this.frame=typeof y=="number"?y:y.frames[0],this.trigger("animStart",u)},stop(){if(!r)return;let u=r.name;r=null,this.trigger("animEnd",u)},numFrames(){return(n==null?void 0:n.frames.length)??0},getCurAnim(){return r},curAnim(){return r==null?void 0:r.name},getAnim(u){return(n==null?void 0:n.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new we(P(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(jr,"sprite");function ml(t,e={}){function n(s){var l,c;let i=Vt(Object.assign(xt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(n,"update");let r={id:"text",set text(s){t=s,n(this),this.renderedText=Kr(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Kr(t).text:"",add(){us(()=>n(this))},draw(){Gt(n(this))},renderArea(){return new we(P(0),this.width,this.height)}};return n(r),r}o(ml,"text");function yl(t,e){return{id:"rect",width:t,height:e,draw(){zt(Object.assign(xt(this),{width:this.width,height:this.height}))},renderArea(){return new we(P(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(yl,"uvquad");function wl(t,e){let n=document.createElement("video"),r=!1,s=!1,i=!1,l=new Ct(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return n.currentTime},set currentTime(c){n.currentTime=c},get duration(){return n.duration},play(){n.play()},pause(){n.pause()},get mute(){return n.muted},set mute(c){n.muted=c},add(){n.playsInline=!0,n.loop=!0,n.autoplay=!1,n.crossOrigin="anonymous",n.addEventListener("playing",()=>{r=!0,c()},!0),n.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{n.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),n.src=t);function c(){console.log(`${r} ${s}`),r&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,n),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?zt({width:this.width,height:this.height,tex:l}):Ve({width:this.width,height:this.height})},renderArea(){return new we(P(0),this.width,this.height)}}}o(wl,"video");function xl(t={}){let e=null,n=null,r=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return n&&r?n[r]:null},getPath(){return n?n.slice():null},getTarget(){return e},isNavigationFinished(){return n?r===null:!0},isTargetReachable(){return n!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r=n?0:null,n&&r!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&n&&r!==null&&(n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n?(r=0,this.trigger("navigationNext",this,n[r])):(r=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,n[r])):this.trigger("navigationEnded",this)},update(){if(e&&n&&r!==null){if(this.pos.sdist(n[r])<2)if(r===n.length-1){this.pos=e.clone(),r=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else r++,this.trigger("navigationNext",this,n[r]);this.moveTo(n[r],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(n)})}}}o(xl,"agent");function Al(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(n){var r;return(r=this.graph)==null?void 0:r.getWaypointPath(this.pos,n,t.navigationOpt)},get graph(){if(e)return e;let n=this.parent;for(;n;){if(n.has("pathfinderMap"))return n.graph;n=n.parent}},set graph(n){e=n}}}o(Al,"pathfinder");function vl(t={}){let e=t.waypoints,n=t.speed||100,r=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return n},set patrolSpeed(l){n=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,n),this.pos.sdist(l)<9))switch(r){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(vl,"patrol");function bl(t,e={}){let n=typeof t=="function"?t:()=>d.game.root.query(t),r=e.checkFrequency||1,s=typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?q.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?q.fromAngle(c):c)||s,g=h||e.fieldOfView;if(!u||!g||g>=360)return!0;let y=g/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=y},hasLineOfSight(l){let c=di(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>r){i-=r;let l=n();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(bl,"sentry");function Si(t={}){let e=P(0),n=t.isObstacle??!1,r=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??P(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=P(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return n},set cost(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get cost(){return r},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(P(-1,0))},moveRight(){this.tileMove(P(1,0))},moveUp(){this.tileMove(P(0,-1))},moveDown(){this.tileMove(P(0,1))}}}o(Si,"tile");var zn,Mi=(zn=class{constructor(e,n,r){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=n.duration,this.loops=n.loops||0,this.direction=n.direction||"forward",this.easing=n.easing||ar.linear,this.interpolation=n.interpolation||"linear",this.isFinished=!1,this.timing=n.timing,this.easings=n.easings,this.relative=r}update(e,n){return!0}getLowerKeyIndexAndRelativeTime(e,n,r){let s=n-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),r){let c=0;for(;r[c+1]!==void 0&&r[c+1]=s?[s,0,!0]:[c,(i-r[c])/(r[c+1]-r[c]),!1]}else{let c=Math.floor((n-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,n,r){if(this.relative)switch(n){case"pos":e.pos=e.base.pos.add(r);break;case"angle":e.angle=e.base.angle+r;break;case"scale":e.scale=e.base.scale.scale(r);break;case"opacity":e.opacity=e.base.opacity*r;break;default:e[n]=r}else e[n]=r}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=ar.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(n=>this.easing.name)),e}},o(zn,"AnimateChannel"),zn);function Bs(t,e){return e.add(e.sub(t))}o(Bs,"reflect");var Vn,tc=(Vn=class extends Mi{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,Oe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Vn,"AnimateChannelNumber"),Vn),Gn,nc=(Gn=class extends Mi{constructor(n,r,s,i,l){var c;super(n,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=r,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:Bs(y,u),E=g[n.x,n.y])})}},o(Gn,"AnimateChannelVec2"),Gn),Hn,rc=(Hn=class extends Mi{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Hn,"AnimateChannelColor"),Hn);function El(t={}){let e=[],n=0,r=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:P(0,0),angle:0,scale:P(1,1),opacity:1},animation:{paused:!1,seek(s){n=lt(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),r=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;n+=d.k.dt();for(let l of e)i=l.update(this,n),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!r&&(r=!0,this.trigger("animateFinished"))},animate(s,i,l){r=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new tc(s,i,l,t.relative||!1)):i[0]instanceof q?e.push(new nc(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof se&&e.push(new rc(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(El,"animate");function ki(t,e){let n={name:t.name};return t.has("animate")&&(n.channels=t.serializeAnimationChannels(),Object.assign(n,t.serializeAnimationOptions())),t.children.length>0&&(n.children=t.children.filter(r=>r.has("named")).map(r=>ki(r,r.name))),n}o(ki,"serializeAnimation");function Rs(t=2,e=1){let n=0;return{require:["scale"],update(){let r=Math.sin(n*t)*e;r<0&&this.destroy(),this.scale=P(r),n+=d.k.dt()}}}o(Rs,"boom");var sc=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=cs())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(n){this.on("press",n)},onRelease(n){this.on("release",n)}}},"fakeMouse");function Sl(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(n=1){this.setHP(t-n),this.trigger("hurt",n)},heal(n=1){let r=t;this.setHP(t+n),this.trigger("heal",t-r)},hp(){return t},maxHP(){return e??null},setMaxHP(n){e=n},setHP(n){t=e?Math.min(e,n):n,t<=0&&this.trigger("death")},onHurt(n){return this.on("hurt",n)},onHeal(n){return this.on("heal",n)},onDeath(n){return this.on("death",n)},inspect(){return`health: ${t}`}}}o(Sl,"health");function Ml(t,e={}){if(t==null)throw new Error("lifespan() requires time");let n=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,n>0?d.game.root.tween(this.opacity,0,n,r=>this.opacity=r,ar.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(Ml,"lifespan");function kl(t){return{id:"named",name:t}}o(kl,"named");function Pl(t,e,n){if(!t)throw new Error("state() requires an initial state");let r={};function s(h){r[h]||(r[h]={enter:new Te,end:new Te,update:new Te,draw:new Te})}o(s,"initStateEvents");function i(h,u,g){return s(u),r[u][h].add(g)}o(i,"on");function l(h,u,...g){s(u),r[u][h].trigger(...g)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let g=this.state;if(n){if(!(n!=null&&n[g]))return;let y=typeof n[g]=="string"?[n[g]]:n[g];if(!y.includes(h))throw new Error(`Cannot transition state from "${g}" to "${h}". Available transitions: ${y.map(m=>`"${m}"`).join(", ")}`)}l("end",g,...u),this.state=h,l("enter",h,...u),l("enter",`${g} -> ${h}`,...u)},onStateTransition(h,u,g){return i("enter",`${h} -> ${u}`,g)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(Pl,"state");function Pi(t){return{id:"stay",stay:!0,scenesToStay:t}}o(Pi,"stay");function Cl(t=!0,e){let n,r;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");n=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){n.cancel(),r.cancel()}}}o(Cl,"textInput");function zr(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,n,r=-1,s=!1){let i=s?0:e,l=new Te,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,n,r,s,i=ar.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/r,1);s(Oe(e,n,i(u))),u===1&&(h.cancel(),s(n),c.forEach(g=>g()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(n),c.forEach(u=>u())}}}}}o(zr,"timer");var Fs=0;function Os(){return Fs>0}o(Os,"usesArea");var Et=null,oa=!1;function ql(t={}){let e={},n=new Set,r=[];return!Et&&!oa&&(Et=d.k.get("fakeMouse")[0],oa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Fs++,this.area.cursor&&r.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),r.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,n.add(s.id))}))},destroy(){Fs--;for(let s of r)s.cancel()},fixedUpdate(){for(let s in e)n.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);n.clear()},drawInspect(){let s=this.localArea();We(),st(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Gi(),color:ue(0,0,255)},anchor:this.anchor,fill:!1,fixed:kt(this)};s instanceof we?Ve({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Re?qt({...i,pts:s.pts,scale:this.area.scale}):s instanceof Le&&on({...i,pos:s.center,radius:s.radius}),ze()},area:{shape:t.shape??null,scale:t.scale?P(t.scale):P(1),offset:t.offset??P(0),cursor:t.cursor??null},isClicked(){return Et?Et.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(Et){let i=kt(this)?Et.pos:d.k.toWorld(Et.pos);return this.hasPoint(i)}let s=kt(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){Et&&Et.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return r.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(P(this.area.scale??1));if(s instanceof we){let l=an(this.anchor||ns).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return kt(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,g;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(g=this.area.scale.y)==null?void 0:g.toFixed(1)}y)`}}}o(ql,"area");function Tl(t={}){let e=null,n=null,r=!1,s=P(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:P(0),damping:t.damping??0,jumpForce:t.jumpForce??ph,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let g=u.reverse();if(h.trigger("beforePhysicsResolve",g),!(u.resolved||g.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let y=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/y)),h.pos=h.pos.add(u.displacement.scale(-this.mass/y)),Jt(this,this.transform),Jt(h,h.transform)}else{let y=!this.isStatic&&h.isStatic?u:u.reverse();y.source.pos=y.source.pos.add(y.displacement),Jt(y.source,y.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let E=e;e=h.target,E!=e&&(n=h.target.pos),r?r=!1:E||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),g=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),y=this.vel.project(h.normal),m=this.vel.sub(y);this.vel.dot(h.normal)<0&&(this.vel=m.sub(y.scale(u))),g!=0&&(this.vel=this.vel.sub(m.scale(g)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(n&&!e.pos.eq(n)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(n)),n=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Oe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Oe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){r&&(e=null,n=null,this.trigger("fallOff"),r=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(r=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??mh;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(nr())>0},isJumping(){return this.vel.dot(nr())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,n=null,this.vel=nr().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(Tl,"body");function Il(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(n){e<=0||(e{var l;if(!e.has("body"))return;let r=n==null?void 0:n.normal.normal(),s=e.vel.project(r),i=(l=r==null?void 0:r.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Bl,"surfaceEffector");function Rl(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(Rl,"areaEffector");function Fl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=this.pos.sub(e.pos),s=r.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=r.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(Fl,"pointEffector");function Ol(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Ol,"constantForce");function Ll(t={}){return t.ignoreSides??(t.ignoreSides=[q.UP]),t.shouldCollide??(t.shouldCollide=(e,n)=>{var r;return((r=t.ignoreSides)==null?void 0:r.findIndex(s=>s.sdist(n){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Ll,"platformEffector");function Dl(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=e,s=r.worldArea(),i=s instanceof Re?s:new Re(s.bbox().points()),[l,c]=i.cut(P(-100,this.surfaceLevel),P(100,this.surfaceLevel));l&&(this.applyBuoyancy(r,l),this.applyDrag(r,l)),this.flowMagnitude&&r.addForce(q.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,n){let r=this.density*n.area(),s=P(0,1).scale(-r);e.addForce(s)},applyDrag(e,n){let r=e.vel,s=this.density*this.linearDrag,i=r.scale(-s);e.addForce(i)}}}o(Dl,"buoyancyEffector");function Vr(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(Vr,"anchor");function Ci(){return{id:"fixed",fixed:!0}}o(Ci,"fixed");function Nl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??P(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))}}}o(Nl,"follow");function Ul(t){var n;let e=(n=d.game.layers)==null?void 0:n.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var r;return e?((r=d.game.layers)==null?void 0:r[e])??null:null},set layer(r){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(r),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Ul,"layer");function jl(t,e){let n=typeof t=="number"?q.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(n.scale(e))}}}o(jl,"move");function zl(t={}){let e=t.distance??gh,n=!1,r=o(s=>{s.isOffScreen()?(n||(s.trigger("exitView"),n=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(n&&(s.trigger("enterView"),n=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new we(P(0),Ee(),Pe());return!fr(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?Kl(()=>r(this)):this.onUpdate(()=>r(this))}}}o(zl,"offscreen");function lr(...t){return{id:"pos",pos:P(...t),moveBy(...e){this.pos=this.pos.add(P(...e))},move(...e){this.moveBy(P(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(P(e[0],e[1]),e[2]);let n=e[0],r=e[1];if(r===void 0){this.pos=P(n);return}let s=n.sub(this.pos);if(s.len()<=r*d.k.dt()){this.pos=P(n);return}this.move(s.unit().scale(r))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,P()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),P()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,P()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let n=this.worldPos();return n?kt(this)?n:Gr(n):null}},toScreen(e){let n=this.toWorld(e);return kt(this)?n:Gr(n)},fromScreen(e){return kt(this)?this.fromWorld(e):this.fromWorld(Li(e))},toOther(e,n){return e.fromWorld(this.toWorld(n))},fromOther(e,n){return e.toOther(this,n)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){on({color:ue(255,0,0),radius:4/Gi()})}}}o(lr,"pos");function Vl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(Vl,"rotate");function ur(...t){if(t.length===0)return ur(1);let e=P(...t);return{id:"scale",set scale(n){if(!(n instanceof q))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=P(n)},get scale(){return e},scaleTo(...n){e=P(...n)},scaleBy(...n){e=e.scale(P(...n))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(ur,"scale");function Gl(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Gl,"z");function Hl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let n=d.game.root.add([lr(e.pos??P(0))]),r=t.length,s=0,i=null,l=null,c=null,h=null,u=o(x=>x.x+x.y*s,"tile2Hash"),g=o(x=>P(Math.floor(x%s),Math.floor(x/s)),"hash2Tile"),y=o(()=>{i=[];for(let x of n.children)m(x)},"createSpatialMap"),m=o(x=>{let v=u(x.tilePos);i[v]?i[v].push(x):i[v]=[x]},"insertIntoSpatialMap"),E=o(x=>{let v=u(x.tilePos);if(i[v]){let M=i[v].indexOf(x);M>=0&&i[v].splice(M,1)}},"removeFromSpatialMap"),p=o(()=>{let x=!1;for(let v of n.children){let M=n.pos2Tile(v.pos);(v.tilePos.x!=M.x||v.tilePos.y!=M.y)&&(x=!0,E(v),v.tilePos.x=M.x,v.tilePos.y=M.y,m(v))}x&&n.trigger("spatialMapChanged")},"updateSpatialMap"),T=o(()=>{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();l?l.length=v:l=new Array(v),l.fill(1,0,v);for(let M=0;M{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();c?c.length=v:c=new Array(v),c.fill(15,0,v);for(let M=0;M{let x=n.numRows()*n.numColumns(),v=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();I(O).forEach(z=>{h[z]<0&&(h[z]=L,D.push(z))})}},"traverse");h?h.length=x:h=new Array(x),h.fill(-1,0,x);let M=0;for(let R=0;R=0){M++;continue}v(R,M),M++}},"createConnectivityMap"),S=o((x,v)=>l[v],"getCost"),C=o((x,v)=>{let M=g(x),R=g(v);return M.dist(R)},"getHeuristic"),I=o((x,v)=>{let M=[],R=Math.floor(x%s),L=R>0&&c[x]&1&&l[x-1]!==1/0,D=x>=s&&c[x]&2&&l[x-s]!==1/0,O=R{if(typeof x=="string"){if(e.tiles[x]){if(typeof e.tiles[x]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[x](M)}else if(e.wildcardTile)return e.wildcardTile(x,M)}else{if(Array.isArray(x))return x;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let z of R)z.id==="tile"&&(D=!0),z.id==="pos"&&(L=!0);L||R.push(lr(this.tile2Pos(M))),D||R.push(Si());let O=n.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Jt(O,O.transform),i&&(m(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return r},levelWidth(){return s*this.tileWidth()},levelHeight(){return r*this.tileHeight()},tile2Pos(...x){return P(...x).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...x){let v=P(...x);return P(Math.floor(v.x/this.tileWidth()),Math.floor(v.y/this.tileHeight()))},getSpatialMap(){return i||y(),i},removeFromSpatialMap:E,insertIntoSpatialMap:m,onSpatialMapChanged(x){return this.on("spatialMapChanged",x)},onNavigationMapInvalid(x){return this.on("navigationMapInvalid",x)},getAt(x){i||y();let v=u(x);return i[v]||[]},raycast(x,v){let M=this.toWorld(x),R=this.toWorld(x.add(v)).sub(M),L=1/this.tileWidth(),D=x.scale(L),O=Va(D,v,z=>{let te=this.getAt(z);if(te.some($=>$.isObstacle))return!0;let H=null;for(let $ of te)if($.has("area")){let Q=$.worldArea().raycast(M,R);Q&&(H?Q.fraction=s||x.y<0||x.y>=r||v.x<0||v.x>=s||v.y<0||v.y>=r)return null;let R=u(x),L=u(v);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new po((ne,Y)=>ne.costO.scale(R,L).add(R/2,L/2)),v]:null}};return n.use(k),n.onNavigationMapInvalid(()=>{n.invalidateNavigationMap(),n.trigger("navigationMapChanged")}),t.forEach((x,v)=>{let M=x.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{n.spawn(R,P(L,v))})}),n}o(Hl,"addLevel");function Ge(t,e,n){let r=!1,s=new Map,i=o(h=>{let u=h.on(t,(...g)=>{n(h,...g)});u.paused=r,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return r},set paused(h){r=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(Ge,"on");var ic=o((t,e,...n)=>{for(let r of d.game.root.children)r.is(e)&&r.trigger(t,n)},"trigger"),ac=pe(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("fixedUpdate",t,e)),Kl=pe(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("update",t,e)),oc=pe(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(n){e.hidden=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ge("draw",t,e)),Ls=pe(t=>d.game.events.on("add",t),(t,e)=>Ge("add",t,e)),la=pe(t=>d.game.events.on("destroy",t),(t,e)=>Ge("destroy",t,e)),ua=pe(t=>d.game.events.on("use",t),(t,e)=>Ge("use",t,e)),ha=pe(t=>d.game.events.on("unuse",t),(t,e)=>Ge("unuse",t,e)),Wl=pe(t=>d.game.events.on("tag",t),(t,e)=>Ge("tag",t,e)),lc=pe(t=>d.game.events.on("untag",t),(t,e)=>Ge("untag",t,e));function Yl(t,e,n){return Ge("collide",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Yl,"onCollide");function Xl(t,e,n){return Ge("collideUpdate",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Xl,"onCollideUpdate");function Jl(t,e,n){return Ge("collideEnd",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Jl,"onCollideEnd");function yr(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Ls(t,e),Wl((n,r)=>{r===t&&e(n)})}o(yr,"forAllCurrentAndFuture");var uc=pe(t=>d.app.onMousePress(t),(t,e)=>{let n=[];return yr(t,r=>{if(!r.area)throw new Error("onClick() requires the object to have area() component");n.push(r.onClick(()=>e(r)))}),sn.join(n)});function Ql(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHover() requires the object to have area() component");n.push(r.onHover(()=>e(r)))}),sn.join(n)}o(Ql,"onHover");function Zl(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHoverUpdate() requires the object to have area() component");n.push(r.onHoverUpdate(()=>e(r)))}),sn.join(n)}o(Zl,"onHoverUpdate");function _l(t,e){let n=[];return yr(t,r=>{if(!r.area)throw new Error("onHoverEnd() requires the object to have area() component");n.push(r.onHoverEnd(()=>e(r)))}),sn.join(n)}o(_l,"onHoverEnd");function $l(t){return d.game.events.on("loading",t)}o($l,"onLoading");function eu(t){return d.app.onResize(t)}o(eu,"onResize");function tu(t){return d.game.events.on("error",t)}o(tu,"onError");function us(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(us,"onLoad");function nu(t){if(d.assets.loaded)gi().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(nu,"onLoadError");function qi(...t){d.game.cam.pos=P(...t)}o(qi,"setCamPos");function Ti(){return d.game.cam.pos?d.game.cam.pos.clone():hr()}o(Ti,"getCamPos");function Ii(...t){d.game.cam.scale=P(...t)}o(Ii,"setCamScale");function Bi(){return d.game.cam.scale.clone()}o(Bi,"getCamScale");function Ri(t){d.game.cam.angle=t}o(Ri,"setCamRot");function Fi(){return d.game.cam.angle}o(Fi,"getCamRot");function wr(){return d.game.cam.transform.clone()}o(wr,"getCamTransform");function Oi(t=ue(255,255,255),e=1){let n=d.game.root.add([fi(Ee(),Pe()),hi(t),ci(1),Ci()]),r=n.fadeOut(e);return r.onEnd(()=>Vi(n)),r}o(Oi,"flash");function ru(t=12){d.game.cam.shake+=t}o(ru,"shake");function Gr(t){return d.game.cam.transform.transformPoint(t,P())}o(Gr,"toScreen");function Li(t){return d.game.cam.transform.inverse.transformPoint(t,P())}o(Li,"toWorld");function su(...t){return Ht("camPos","setCamPos / getCamPos"),t.length>0&&qi(...t),Ti()}o(su,"camPos");function iu(...t){return Ht("camScale","setCamScale / getCamScale"),t.length>0&&Ii(...t),Bi()}o(iu,"camScale");function au(t){return Ht("camRot","setCamRot / getCamRot"),t!==void 0&&Ri(t),Fi()}o(au,"camRot");function ou(t=ue(255,255,255),e=1){return Ht("camFlash","flash"),Oi(t,e)}o(ou,"camFlash");function lu(){return Ht("camTransform","getCamTransform"),wr()}o(lu,"camTransform");var uu=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(uu||{});function hs(t=[]){let e=new Map,n=[],r={},s=new rs,i=new Te,l=new Te,c=new Te,h=[],u=new Set("*"),g=d.globalOpt.tagsAsComponents,y=null,m=!1,E,p={id:Sh(),hidden:!1,transform:new tn,children:[],get parent(){return E},set parent(f){if(E===f)return;let w=E?E.children.indexOf(this):-1;w!==-1&&E.children.splice(w,1),E=f,f&&f.children.push(this)},setParent(f,w){if(E===f)return;let S=E.transform,C=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),C.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=C.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(C.getScale()))),this.parent=f},set paused(f){if(f!==m){m=f;for(let w of h)w.paused=f}},get paused(){return m},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?hs(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Jt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(C=>w(C))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(Ye(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),We(),$e(this.pos),Jn(this.scale),rn(this.angle);let w=this.children.sort((S,C)=>{let I=S.layerIndex??d.game.defaultLayerIndex,k=C.layerIndex??d.game.defaultLayerIndex;return I-k||(S.z??0)-(C.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let C=0;C{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),ze())},use(f){var C;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),r[f.id]=[],w=r[f.id],e.set(f.id,f),g&&u.add(f.id)):n.push(f);let S=o(()=>{if(f.require)try{for(let I of f.require)if(!this.c(I))throw new Error(`Component "${f.id}" requires component "${I}"`)}catch(I){d.handleErr(I)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(y=o(I=>w.push(I),"onCurCompCleanup"),f.add.call(this),y=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let I in f){if(dh.has(I))continue;let k=Object.getOwnPropertyDescriptor(f,I);if(k)if(typeof k.value=="function"&&(f[I]=f[I].bind(this)),k.set&&Object.defineProperty(f,I,{set:k.set.bind(this)}),k.get&&Object.defineProperty(f,I,{get:k.get.bind(this)}),fh.has(I)){let x=I==="add"?()=>{var v;y=o(M=>w.push(M),"onCurCompCleanup"),(v=f[I])==null||v.call(f),y=null}:f[I];w.push(this.on(I,x).cancel)}else if(this[I]===void 0)Object.defineProperty(this,I,{get:o(()=>f[I],"get"),set:o(x=>f[I]=x,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[I]);else{let x=(C=e.values().find(v=>v[I]!==void 0))==null?void 0:C.id;throw new Error(`Duplicate component property: "${I}" while adding component "${f.id}"`+(x?` (originally added by "${x}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else g&&u.has(f)&&u.delete(f);r[f]&&(r[f].forEach(w=>w()),delete r[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((I,k)=>w.only==="comps"?I.has(k):w.only==="tags"?I.is(k):I.is(k)||I.has(k),"checkTagsOrComps"),C=w.recursive?this.children.flatMap(o(function I(k){return[k,...k.children.flatMap(I)]},"recurse")):this.children;if(C=C.filter(I=>f?S(I,f):!0),w.liveUpdate){let I=o(x=>w.recursive?this.isAncestorOf(x):x.parent===this,"isChild"),k=[];k.push(d.k.onAdd(x=>{I(x)&&S(x,f)&&C.push(x)})),k.push(d.k.onDestroy(x=>{if(S(x,f)){let v=C.findIndex(M=>M.id===x.id);v!==-1&&C.splice(v,1)}})),(g||w.only!=="tags")&&(k.push(d.k.onUse((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUnuse((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),!g&&w.only!=="comps"&&(k.push(d.k.onTag((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUntag((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),this.onDestroy(()=>{for(let x of k)x.cancel()})}return C},query(f){let w=f.hierarchy||"children",S=f.include,C=f.exclude,I=[];switch(w){case"children":I=this.children;break;case"siblings":I=this.parent?this.parent.children.filter(x=>x!==this):[];break;case"ancestors":let k=this.parent;for(;k;)I.push(k),k=k.parent;break;case"descendants":I=this.children.flatMap(o(function x(v){return[v,...v.children.flatMap(x)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>k.is(S)):I=I.filter(k=>f.include.some(x=>k.is(x)))),C&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>!k.is(C)):I=I.filter(k=>!f.exclude.some(x=>k.is(x)))),f.visible===!0&&(I=I.filter(k=>k.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let k=f.distanceOp||"near",x=f.distance*f.distance;k==="near"?I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)<=x):I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)>x)}return f.name&&(I=I.filter(k=>k.name===f.name)),I},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(C=>{switch(f){case"fixedUpdate":return i.add(C);case"update":return l.add(C);case"draw":return c.add(C);default:return s.on(f,C)}})(w.bind(this));return y&&y(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,C]of e)f[S]=((w=C.inspect)==null?void 0:w.call(C))??null;for(let[S,C]of n.entries()){if(C.inspect){f[S]=C.inspect();continue}for(let[I,k]of Object.entries(C))typeof k!="function"&&(f[I]=`${I}: ${k}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},T=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of T)p[f]=(...w)=>{var C,I;let S=(I=(C=d.app)[f])==null?void 0:I.call(C,...w);return h.push(S),p.onDestroy(()=>S.cancel()),p.on("sceneEnter",()=>{var x,v;h.splice(h.indexOf(S),1);let k=(v=(x=d.app)[f])==null?void 0:v.call(x,...w);sn.replace(S,k),h.push(S)}),S};for(let f of t)p.use(f);return p}o(hs,"make");var hc=o(()=>({events:new rs,root:hs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new q(1),angle:0,shake:0,transform:new tn}}),"initGame");function hu(t){d.game.gravity=t?(d.game.gravity||P(0,1)).unit().scale(t):null}o(hu,"setGravity");function cu(){return d.game.gravity?d.game.gravity.len():0}o(cu,"getGravity");function du(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(du,"setGravityDirection");function nr(){return d.game.gravity?d.game.gravity.unit():P(0,1)}o(nr,"getGravityDirection");var cc=th("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");function fu(t){return t.createBuffer(1,1,44100)}o(fu,"createEmptyAudioBuffer");var dc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let n=new wn(fu(t));return t.decodeAudioData(cc.buffer.slice(0)).then(r=>{n.buf=r}).catch(r=>{console.error("Failed to load burp: ",r)}),{ctx:t,masterNode:e,burpSnd:n}})(),"initAudio");function gu(t,e={}){let n=new Te,r=new Audio(t);r.crossOrigin="anonymous",r.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(r);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),r.play()}return o(l,"play"),e.paused||l(),r.onended=()=>n.trigger(),{play(){l()},seek(c){r.currentTime=c},stop(){r.pause(),this.seek(0)},set loop(c){r.loop=c},get loop(){return r.loop},set paused(c){c?r.pause():l()},get paused(){return r.paused},time(){return r.currentTime},duration(){return r.duration},set volume(c){r.volume=lt(c,0,1)},get volume(){return r.volume},set speed(c){r.playbackRate=Math.max(c,0)},get speed(){return r.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return n.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(gu,"playMusic");function pu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return gu(d.assets.music[t],e);let n=d.audio.ctx,r=e.paused??!1,s=n.createBufferSource(),i=new Te,l=n.createGain(),c=n.createStereoPanner(),h=e.seek??0,u=0,g=0,y=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;p()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let m=o(f=>{s.buffer=f.buf,r||(u=n.currentTime,s.start(0,h),y=!0)},"start"),E=dl(t);E instanceof ut&&E.onLoad(m);let p=o(()=>{if(!s.buffer)return 0;let f=r?g-u:n.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),T=o(f=>{let w=n.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(r!==f)if(r=f,f)y&&(s.stop(),y=!1),g=n.currentTime;else{s=T(s);let w=g-u;s.start(0,w),y=!0,u=n.currentTime-w,g=0}},get paused(){return r},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(r?(s=T(s),u=g-f):(s.stop(),s=T(s),u=n.currentTime-f,s.start(0,f),y=!0,g=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return p()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(pu,"play");function Di(t){return d.k.play(d.audio.burpSnd,t)}o(Di,"burp");function Ni(t){d.audio.masterNode.gain.value=t}o(Ni,"setVolume");function Ui(){return d.audio.masterNode.gain.value}o(Ui,"getVolume");function mu(t){return Ht("volume","setVolume / getVolume"),t!==void 0&&Ni(t),Ui()}o(mu,"volume");function ji(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Ji(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Hr(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Nr(lt(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Nr(lt(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Di())}o(ji,"initEvents");function yu(t,e={}){let n=d.game.root.add([lr(t),Pi()]),r=(e.speed||1)*5,s=e.scale||1;n.add([jr(d.boomSprite),ur(0),Vr("center"),Rs(r,s),...e.comps??[]]);let i=n.add([jr(d.kaSprite),ur(0),Vr("center"),zr(),...e.comps??[]]);return i.wait(.4/r,()=>i.use(Rs(r,s))),i.onDestroy(()=>n.destroy()),n}o(yu,"addKaboom");function zi(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let n=t.indexOf(e);if(n==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=n}o(zi,"setLayers");function wu(){return d.game.layers}o(wu,"getLayers");function xu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(xu,"getDefaultLayer");function Au(t,e){Ht("layers","setLayers"),zi(t,e)}o(Au,"layers");function Vi(t){t.destroy()}o(Vi,"destroy");function vu(){return d.game.root}o(vu,"getTreeRoot");function bu(t,e){d.game.scenes[t]=e}o(bu,"scene");function Eu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(n=>{!n.stay||n.scenesToStay&&!n.scenesToStay.includes(t)?d.game.root.remove(n):n.trigger("sceneEnter",t)}),d.game.root.clearEvents(),ji(),d.game.cam={pos:null,scale:P(1),angle:0,shake:0,transform:new tn},d.game.scenes[t](...e)}),d.game.currentScene=t}o(Eu,"go");function Ds(t){return d.game.events.on("sceneLeave",t)}o(Ds,"onSceneLeave");function Su(){return d.game.currentScene}o(Su,"getSceneName");function $e(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o($e,"pushTranslateV");function st(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(st,"pushTranslate");function We(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(We,"pushTransform");function Mu(t){d.gfx.transform.setMat23(t)}o(Mu,"pushMatrix");function Jn(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Jn,"pushScaleV");function rn(t){t&&d.gfx.transform.rotateSelf(t)}o(rn,"pushRotate");function ze(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(ze,"popTransform");function Ye(){d.gfx.renderer.flush(Ee(),Pe())}o(Ye,"flush");function Ee(){return d.gfx.width}o(Ee,"width");function Pe(){return d.gfx.height}o(Pe,"height");function Gi(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Gi,"getViewportScale");function ku(t){return new q(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(ku,"contentToView");function Pu(t){return new q((t.x-d.gfx.viewport.x)*Ee()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Pe()/d.gfx.viewport.height)}o(Pu,"windowToContent");function cs(){return Pu(d.app.mousePos())}o(cs,"mousePos");function hr(){return P(Ee()/2,Pe()/2)}o(hr,"center");var Kn,Hi=(Kn=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Kn,"Picture"),Kn),fc=new Xr;function Ki(t,e){let n=Ee(),r=Pe();d.gfx.renderer.flush(n,r);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let g=null,y=null;for(let m of t.commands){let E=m.material.tex??d.gfx.defTex,p=m.material.shader??d.gfx.defShader;m.material.blend&&d.gfx.renderer.setBlend(m.material.blend),p!=g&&(g==null||g.unbind(),p.bind(),g=p,p.send({width:n,height:r,camera:e.fixed?fc:wr(),transform:s})),m.material.uniform&&(p==null||p.send(m.material.uniform)),E!=y&&(y==null||y.unbind(),E==null||E.bind(),y=E),l.drawElements(l.TRIANGLES,m.count,l.UNSIGNED_SHORT,m.index*2)}g==null||g.unbind(),y==null||y.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(Ki,"drawPicture");function Cu(t){t??(t=new Hi),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Cu,"beginPicture");function qu(t){t??(t=new Hi),d.gfx.renderer.picture=t}o(qu,"appendToPicture");function Tu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new pc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(Tu,"endPicture");var en,Ct=(en=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=n,this.height=r;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),n&&r&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,n,r,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,n,r={}){let s=new en(e,n.width,n.height,r);return s.update(n),s.src=n,s}update(e,n=0,r=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,n,r,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o(en,"Texture"),en),ca=new Xr,Wn,gc=(Wn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=n,this.ctx=e,this.stride=n.reduce((c,h)=>c+h.size,0),this.maxVertices=r,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,r*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,n,r,s,i=null,l=null,c,h,u,g){if(this.picture){let E=this.picture.indices.length,p=r.length,T=this.picture.vertices.length/this.stride,f=n.length;for(let C=0;Cthis.maxVertices||this.iqueue.length+r.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let y=this.vqueue.length/this.stride,m=n.length;for(let E=0;E{e.push(i),t(i)},"push"),r=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[n,r,s]}o(Rt,"genStack");function Iu(t,e={}){let n=[];function r(k){n.push(k)}o(r,"onDestroy");function s(){n.forEach(x=>x());let k=t.getExtension("WEBGL_lose_context");k&&k.loseContext()}o(s,"destroy");let i=null;function l(k){if(is(k,i))return;i=k;let x=k.reduce((v,M)=>v+M.size,0);k.reduce((v,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,x*4,v),v+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Rt(k=>t.bindTexture(t.TEXTURE_2D,k)),[u,g]=Rt(k=>t.bindBuffer(t.ARRAY_BUFFER,k)),[y,m]=Rt(k=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,k)),[E,p]=Rt(k=>t.bindFramebuffer(t.FRAMEBUFFER,k)),[T,f]=Rt(k=>t.bindRenderbuffer(t.RENDERBUFFER,k)),[w,S]=Rt(k=>{if(!k)return;let{x,y:v,w:M,h:R}=k;t.viewport(x,v,M,R)}),[C,I]=Rt(k=>t.useProgram(k));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:r,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:g,pushElementArrayBuffer:y,popElementArrayBuffer:m,pushFramebuffer:E,popFramebuffer:p,pushRenderbuffer:T,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:C,popProgram:I,setVertexFormat:l}}o(Iu,"initGfx");var Xn,Hr=(Xn=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Ct(e,n,r,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,n,r),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,n=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,n),this.unbind();let r=this.width*4,s=new Uint8Array(r);for(let i=0;i<(this.height/2|0);i++){let l=i*r,c=(this.height-i-1)*r;s.set(n.subarray(l,l+r)),n.copyWithin(l,c,c+r),n.set(s,c)}return new ImageData(n,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),n=e.getContext("2d");if(e.width=this.width,e.height=this.height,!n)throw new Error("Failed to get 2d context");return n.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Xn,"FrameBuffer"),Xn),cn=new q;function It(t,e,n=!1,r,s,i,l){let c=r??d.gfx.defTex,h=s??d.gfx.defShader,u=ul(h);if(!u||u instanceof ut)return;let g=d.gfx.transform,y=t.pos.length/2,m=new Array(y*8),E=0;for(let p=0;pi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),It(r,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),ze()}}o(qt,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,n=t.end??360,r=an(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=mn(r,t.radiusX,t.radiusY,e,n,t.resolution);s.unshift(r);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(n-e>=360&&t.outline){t.fill!==!1&&qt(Object.assign({},i,{outline:null})),qt(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}qt(i)}o(ds,"drawEllipse");function on(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(on,"drawCircle");function yn(t){let{p1:e,p2:n}=t;if(!e||!n)throw new Error('drawLine() requires properties "p1" and "p2".');let r=t.width||1,s=n.sub(e).unit().normal().scale(r*.5),i=t.color??se.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,n.x+s.x,n.y+s.y,n.x-s.x,n.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};It(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(yn,"drawLine");function Bu(t){let e=t.pts,n=[],r=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||P(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-r/c),u,g=e[0];if(!s)switch(t.cap){case"square":{let p=l.scale(-r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(-1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0?(n.push(u.add(I)),n.push(u.sub(h)),n.push(u.add(I)),n.push(u.sub(w))):(n.push(u.add(h)),n.push(u.sub(I)),n.push(u.add(w)),n.push(u.sub(I))),l=T,c=f,h=w}if(!s)switch(n.push(g.add(h)),n.push(g.sub(h)),t.cap){case"square":{let p=l.scale(r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0){let k=u.add(I),x=Math.max(r,10),v=ye(h.angleBetween(w)/x),M=h,R=Math.cos(v),L=Math.sin(v);for(let D=0;D({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p({pos:i.add(p),uv:P(),color:t.color||se.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p2)switch(t.join){case"bevel":return Bu(t);case"round":return Ru(t);case"miter":return Fu(t)}if(t.radius&&e.length>=3){yn(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let r=1;rts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Ou,"drawBezier");function zt(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 e=t.width,n=t.height,r=an(t.anchor||ns),s=r.x*e*-.5,i=r.y*n*-.5,l=t.quad||new xe(0,0,1,1),c=t.color||se.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,g=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+g,E=l.w-u*2,p=l.h-g*2;We(),$e(t.pos),rn(t.angle),Jn(t.scale),st(s,i),It({pos:[-e/2,n/2,-e/2,-n/2,e/2,-n/2,e/2,n/2],uv:[t.flipX?y+E:y,t.flipY?m:m+p,t.flipX?y+E:y,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m:m+p],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),ze()}o(zt,"drawUVQuad");function Lu(t){let e=t.canvas.fb;zt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Lu,"drawCanvas");var ms={};function Ns(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(P(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Ns,"applyCharTransform");function Kr(t){let e={},n="",r=[],s=String(t),i=o(l=>{r.length>0&&(e[n.length]=r.slice()),n+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let g=r.pop();if(g!==u)throw g!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${g}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else r.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(r.length>0)throw new Error(`Styled text error: unclosed tags ${r}`);return{charStyleMap:e,text:n}}o(Kr,"compileStyledText");function Vt(t){var C,I,k;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=pi(t.font);if(!t.text||t.text===""||e instanceof ut||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:n,text:r}=Kr(t.text+""),s=vo(r);if(e instanceof Fr||typeof e=="string"){let x=e instanceof Fr?e.fontface.family:e,v=e instanceof Fr?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ms},M=ms[x]??{font:{tex:new Ct(d.gfx.ggl,2048,2048,{filter:v.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:v.outline};ms[x]||(ms[x]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${x}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let z=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,z+=M.outline.width*3),L.fillText(R,((C=M.outline)==null?void 0:C.width)??0,((I=M.outline)==null?void 0:I.width)??0);let te=L.getImageData(0,0,O,z);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(te,M.cursor.x,M.cursor.y),e.map[R]=new xe(M.cursor.x,M.cursor.y,O,z),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,z)}}let i=t.size||e.size,l=P(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,g=0,y=0,m=[],E=[],p=0,T=null,f=0,w;for(;pt.width&&(y+=i+c,T!=null&&(p-=E.length-T,x=s[p],v=e.map[x],M=v.w*l.x,E=E.slice(0,T-1),u=f),T=null,f=0,m.push({width:u-h,chars:E}),u=w??0,E=[]),E.push({tex:e.tex,width:v.w,height:v.h,quad:new xe(v.x/e.tex.width,v.y/e.tex.height,v.w/e.tex.width,v.h/e.tex.height),ch:x,pos:new q(u,y),opacity:t.opacity??1,color:t.color??se.WHITE,scale:P(l),angle:0}),x===" "&&(T=E.length,f=u),t.indentAll&&w===void 0&&/\S/.test(x)&&(w=u),u+=M,g=Math.max(g,u),u+=h}}p++}m.push({width:u-h,chars:E}),y+=i,t.width&&(g=t.width);let S=[];for(let x=0;x{zt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),ze()}o(Gt,"drawFormattedText");function Ve(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=an(t.anchor||ns).add(1,1).scale(new q(e,n).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,n),new q(0,n)];if(t.radius){let i=Math.min(e,n)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?mn(new q(e-l[1],l[1]),l[1],l[1],270,360):[P(e,0)],...l[2]?mn(new q(e-l[2],n-l[2]),l[2],l[2],0,90):[P(e,n)],...l[3]?mn(new q(l[3],n-l[3]),l[3],l[3],90,180):[P(0,n)],...l[0]?mn(new q(l[0],l[0]),l[0],l[0],180,270):[]]}qt(Object.assign({},t,{offset:r,pts:s,...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]]}:{}}))}o(Ve,"drawRect");function Pt(t){Ye();let e=d.gfx.width,n=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),Ye(),d.gfx.width=e,d.gfx.height=n}o(Pt,"drawUnscaled");function Us(t,e){Pt(()=>{let n=P(8);We(),$e(t);let r=Vt({text:e,font:Dr,size:16,pos:n,color:ue(255,255,255),fixed:!0}),s=r.width+n.x*2,i=r.height+n.x*2;t.x+s>=Ee()&&$e(P(-s,0)),t.y+i>=Pe()&&$e(P(0,-i)),Ve({width:s,height:i,color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(r),ze()})}o(Us,"drawInspectText");function Yi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return qt(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Yi,"drawTriangle");function Du(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],n=t.inspect();for(let r in n)n[r]?e.push(n[r]):e.push(r);e.push(...t.tags.map(r=>`tag: ${r}`)),Us(ku(cs()),e.join(` -`))}Us(P(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&Pt(()=>{We(),st(Ee(),0),st(-8,8);let t=32;Ve({width:t,height:t,anchor:"topright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)Ve({width:4,height:t*.6,anchor:"center",pos:P(-t/3*e,t*.5),color:ue(255,255,255),radius:2,fixed:!0});ze()}),d.debug.timeScale!==1&&Pt(()=>{We(),st(Ee(),Pe()),st(-8,-8);let t=8,e=Vt({text:d.debug.timeScale.toFixed(1),font:Dr,size:16,color:ue(255,255,255),pos:P(-t),anchor:"botright",fixed:!0});Ve({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:ue(0,0,0),opacity:.8,radius:4,fixed:!0});for(let n=0;n<2;n++){let r=d.debug.timeScale<1;Yi({p1:P(-e.width-t*(r?2:3.5),-t),p2:P(-e.width-t*(r?2:3.5),-t-e.height),p3:P(-e.width-t*(r?3.5:2),-t-e.height/2),pos:P(-n*t*1+(r?-t*.5:0),0),color:ue(255,255,255),fixed:!0})}Gt(e),ze()}),d.debug.curRecording&&Pt(()=>{We(),st(0,Pe()),st(24,-24),on({radius:12,color:ue(255,0,0),opacity:Ks(0,1,d.app.time()*4),fixed:!0}),ze()}),d.debug.showLog&&d.game.logs.length>0&&Pt(()=>{We(),st(0,Pe()),st(8,-8);let t=8,e=[];for(let r of d.game.logs){let s="",i=r.msg instanceof Error?"error":"info";s+=`[time]${r.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Wr(r.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(r=>d.app.time()-r.time<(d.globalOpt.logTime||4));let n=Vt({text:e.join(` -`),font:Dr,pos:P(t,-t),anchor:"botleft",size:16,width:Ee()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:ue(127,127,127)},info:{color:ue(255,255,255)},error:{color:ue(255,0,127)}}});Ve({width:n.width+t*2,height:n.height+t*2,anchor:"botleft",color:ue(0,0,0),radius:4,opacity:.8,fixed:!0}),Gt(n),ze()})}o(Du,"drawDebug");function Wr(t,e=!1,n=new Set){if(n.has(t))return"";var r="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(r=["[",t.map(i=>Wr(i,!0,n.union(new Set([t])))).join(", "),"]"].join(""),t=r),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(r+=t.constructor.name+" "),r+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Wr(t[i],!0,n.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=r),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):Pt(()=>{let e=Ee()/2,n=24,r=P(Ee()/2,Pe()/2).sub(P(e/2,n/2));Ve({pos:P(0),width:Ee(),height:Pe(),color:ue(0,0,0)}),Ve({pos:r,width:e,height:n,fill:!1,outline:{width:4}}),Ve({pos:r,width:e*t,height:n})})}o(Uu,"drawLoadScreen");function Xi(t,e,n){let r=d.gfx.ggl.gl;Ye(),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST),r.stencilFunc(r.NEVER,1,255),r.stencilOp(r.REPLACE,r.REPLACE,r.REPLACE),e(),Ye(),r.stencilFunc(n,1,255),r.stencilOp(r.KEEP,r.KEEP,r.KEEP),t(),Ye(),r.disable(r.STENCIL_TEST)}o(Xi,"drawStenciled");function ju(t,e){let n=d.gfx.ggl.gl;Xi(t,e,n.EQUAL)}o(ju,"drawMasked");function cr(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new xe(0,0,1,1),n=t.tex.width*e.w,r=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=an(t.anchor||ns),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||n),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||r),g=(t.width||n)/n,y=(t.height||r)/r,m=Math.floor(g),E=Math.floor(y),p=g-m,T=y-E,f=(m+p?1:0)*(E+T?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},C=0,I=t.color||se.WHITE,k=t.opacity||1,x=o((v,M,R,L,D)=>{w[C*6+0]=C*4+0,w[C*6+1]=C*4+1,w[C*6+2]=C*4+3,w[C*6+3]=C*4+1,w[C*6+4]=C*4+2,w[C*6+5]=C*4+3;let O=C*4;S.pos[O*2]=v+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,C++},"addQuad");for(let v=0;v{let n=ls(e,ks,Ps),r=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Hr(e,t.width*r*s,t.height*r*s):new Hr(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=ue(t.background):(h=ue(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let g=new gc(e,ai,lh,uh),y=Ct.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(E=>new tn);return{lastDrawCalls:0,ggl:e,defShader:n,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:g,transform:new tn,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/r/s,height:t.height??i.drawingBufferHeight/r/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Ji(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,n=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let r=e/n,s=d.globalOpt.width/d.globalOpt.height;if(r>s){let i=n*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:n}}else{let i=e/s,l=(n-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:n}}o(Ji,"updateViewport");var da=o((t,e,n)=>{let r=d.systems,s=r.findIndex(l=>l.name===t);if(s!=-1){let l=r[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:n};for(let l of n)d.systemsByEvent[l].push(i);r.push({name:t,run:e,when:n})},"system"),yc="data:image/png;base64,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",wc="data:image/png;base64,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",xc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},fa=!1,Ac=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let n=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=n;let r=t.scale??1;d.gscale=r;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(n.width=t.width*r,n.height=t.height*r):(n.width=n.parentElement.offsetWidth,n.height=n.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=n.width,V=n.height;i.push(`width: ${N}px`),i.push(`height: ${V}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),n.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,n.width*=l,n.height*=l,n.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Ih({canvas:n,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let g=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,E=Iu(m,{texFilter:t.texFilter}),p=mc(t,E);d.gfx=p;let T=dc();d.audio=T;let f=Qh(E,t.spriteAtlasPadding??0);d.assets=f;let w=hc();d.game=w,w.root.use(zr()),da("collision",Fe,[4,3]);function S(N,V){let X=new Hr(E,N,V);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ie=>{Ye(),X.bind(),ie(),Ye(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function C(){m.clear(m.COLOR_BUFFER_BIT),p.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),p.bgColor||Pt(()=>{zt({width:Ee(),height:Pe(),quad:new xe(0,0,Ee()/64,Pe()/64),tex:p.bgTex,fixed:!0})}),p.renderer.numDraws=0,p.fixed=!1,p.transformStackIndex=-1,p.transform.setIdentity()}o(C,"frameStart");function I(N,V){p.postShader=N,p.postShaderUniform=V??null}o(I,"usePostEffect");function k(){Ye(),p.lastDrawCalls=p.renderer.numDraws,p.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let N=p.width,V=p.height;p.width=m.drawingBufferWidth/l,p.height=m.drawingBufferHeight/l,cr({flipY:!0,tex:p.frameBuffer.tex,pos:new q(p.viewport.x,p.viewport.y),width:p.viewport.width,height:p.viewport.height,shader:p.postShader,uniform:typeof p.postShaderUniform=="function"?p.postShaderUniform():p.postShaderUniform,fixed:!0}),Ye(),p.width=N,p.height=V}o(k,"frameEnd");let x=!1,v={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Ie,drawCalls:o(()=>p.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let V=t.logMax??8,X=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>V&&(w.logs=w.logs.slice(0,V))},"log"),error:o(N=>v.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>$("*",{recursive:!0}).length,"numObjects"),get paused(){return x},set paused(N){x=N,N?T.ctx.suspend():T.ctx.resume()}};d.debug=v;function M(N,V){try{return JSON.parse(window.localStorage[N])}catch{return V?(R(N,V),V):null}}o(M,"getData");function R(N,V){window.localStorage[N]=JSON.stringify(V)}o(R,"setData");function L(N,...V){let X=N(Ce),ie;typeof X=="function"?ie=X(...V)(Ce):ie=X;for(let Me in ie)Ce[Me]=ie[Me],t.global!==!1&&(window[Me]=ie[Me]);return Ce}o(L,"plug");function D(N){let V=u.canvas.captureStream(N),X=T.ctx.createMediaStreamDestination();T.masterNode.connect(X);let ie=new MediaRecorder(V),Me=[];return ie.ondataavailable=be=>{be.data.size>0&&Me.push(be.data)},ie.onerror=()=>{T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop())},ie.start(),{resume(){ie.resume()},pause(){ie.pause()},stop(){return ie.stop(),T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop()),new Promise(be=>{ie.onstop=()=>{be(new Blob(Me,{type:"video/mp4"}))}})},download(be="kaboom.mp4"){this.stop().then(rt=>Cs(be,rt))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let z=w.root.add.bind(w.root),te=w.root.readd.bind(w.root),H=w.root.removeAll.bind(w.root),$=w.root.get.bind(w.root),Q=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),Y=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),W=xn(null,wc),De=xn(null,yc);d.kaSprite=W,d.boomSprite=De;function He(){w.root.fixedUpdate()}o(He,"fixedUpdateFrame");function Ie(){w.root.update()}o(Ie,"updateFrame");const Ue=class Ue{constructor(V,X,ie,Me,be=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=V,this.target=X,this.normal=ie,this.distance=Me,this.resolved=be}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Ue(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||P(0,1))>0}isRight(){return this.displacement.cross(w.gravity||P(0,1))<0}isTop(){return this.displacement.dot(w.gravity||P(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||P(0,1))<0}preventResolution(){this.resolved=!0}};o(Ue,"Collision");let Ne=Ue;function Je(N,V){if(V.paused||!V.exists())return!1;for(let ie of N.collisionIgnore)if(V.is(ie))return!1;for(let ie of V.collisionIgnore)if(N.is(ie))return!1;let X=Ts(N.worldArea(),V.worldArea());if(X){let ie=new Ne(N,V,X.normal,X.distance);N.trigger("collideUpdate",V,ie);let Me=ie.reverse();Me.resolved=ie.resolved,V.trigger("collideUpdate",N,Me)}return!0}o(Je,"narrowPhase");let K=new Yh,oe=!1;function ce(){if(Os()){if(!oe){oe=!0,Ls(N=>{N.has("area")&&K.add(N)}),la(N=>{K.remove(N)}),ua((N,V)=>{V==="area"&&K.add(N)}),ha((N,V)=>{V==="area"&&K.remove(N)}),Ds(N=>{oe=!1,K.clear()});for(let N of $("*",{recursive:!0}))N.has("area")&&K.add(N)}K.update();for(let[N,V]of K)Je(N,V)}}o(ce,"broadPhase");function Fe(){if(Os())return ce()}o(Fe,"checkFrame");function Se(N){if(fa)return;fa=!0,console.error(N),T.ctx.suspend();let V=N.message??String(N)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,C(),Pt(()=>{let ie=Ee(),Me=Pe(),be={size:36,width:ie-32*2,letterSpacing:4,lineSpacing:4,font:Dr,fixed:!0};Ve({width:ie,height:Me,color:ue(0,0,255),fixed:!0});let rt=Vt({...be,text:"Error",pos:P(32),color:ue(255,128,0),fixed:!0});Gt(rt),js({...be,text:V,pos:P(32,32+rt.height+16),fixed:!0}),ze(),w.events.trigger("error",N)}),k())})}o(Se,"handleErr"),d.handleErr=Se;function tt(N){g.push(N)}o(tt,"onCleanup");function Qe(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let N=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let V=0;VV())})}o(Qe,"quit");let nt=!0;u.run(()=>{try{if(f.loaded&&!v.paused){for(let N of d.systemsByEvent[1])N.run();He();for(let N of d.systemsByEvent[4])N.run()}}catch(N){Se(N)}},(N,V)=>{try{if(N(),f.loaded||jt()===1&&!nt&&(f.loaded=!0,gi().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||nt)C(),Uu(),k();else{if(!v.paused){for(let X of d.systemsByEvent[0])X.run();Ie();for(let X of d.systemsByEvent[3])X.run()}C();for(let X of d.systemsByEvent[2])X.run();Nu(),t.debug!==!1&&Du();for(let X of d.systemsByEvent[5])X.run();k()}nt&&(nt=!1),w.events.trigger("frameEnd"),V()}catch(X){Se(X)}}),Ji(),ji();let Ce={_k:d,VERSION:xc,loadRoot:nl,loadProgress:jt,loadSprite:xn,loadSpriteAtlas:vi,loadSound:fl,loadMusic:gl,loadBitmapFont:wi,loadFont:al,loadShader:hl,loadShaderURL:cl,loadAseprite:il,loadPedit:ll,loadBean:pl,loadHappy:_h,loadJSON:rl,load:Ur,getSound:Ai,getFont:mi,getBitmapFont:yi,getSprite:bi,getShader:xi,getAsset:sl,Asset:ut,SpriteData:nn,SoundData:wn,width:Ee,height:Pe,center:hr,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:nu,onLoading:$l,onResize:eu,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:tu,onCleanup:tt,flash:Oi,setCamPos:qi,getCamPos:Ti,setCamRot:Ri,getCamRot:Fi,setCamScale:Ii,getCamScale:Bi,getCamTransform:wr,camPos:su,camScale:iu,camFlash:ou,camRot:au,camTransform:lu,shake:ru,toScreen:Gr,toWorld:Li,setGravity:hu,getGravity:cu,setGravityDirection:du,getGravityDirection:nr,setBackground:zo,getBackground:Vo,getGamepads:u.getGamepads,getTreeRoot:vu,add:z,make:hs,destroy:Vi,destroyAll:H,get:$,query:Y,readd:te,pos:lr,scale:ur,rotate:Vl,color:hi,blend:Go,opacity:ci,anchor:Vr,area:ql,sprite:jr,text:ml,polygon:_o,rect:fi,circle:Ho,ellipse:Wo,uvquad:yl,video:wl,picture:Zo,outline:Jo,particles:Qo,body:Tl,surfaceEffector:Bl,areaEffector:Rl,pointEffector:Fl,buoyancyEffector:Dl,platformEffector:Ll,constantForce:Ol,doubleJump:Il,shader:$o,textInput:Cl,timer:zr,fixed:Ci,stay:Pi,health:Sl,lifespan:Ml,named:kl,state:Pl,z:Gl,layer:Ul,move:jl,offscreen:zl,follow:Nl,fadeIn:Yo,mask:Xo,drawon:Ko,raycast:di,tile:Si,animate:El,serializeAnimation:ki,agent:xl,sentry:bl,patrol:vl,pathfinder:Al,fakeMouse:sc,trigger:ic,on:Ge,onFixedUpdate:ac,onUpdate:Kl,onDraw:oc,onAdd:Ls,onDestroy:la,onUse:ua,onUnuse:ha,onTag:Wl,onUntag:lc,onClick:uc,onCollide:Yl,onCollideUpdate:Xl,onCollideEnd:Jl,onHover:Ql,onHoverUpdate:Zl,onHoverEnd:_l,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:Q,play:pu,setVolume:Ni,getVolume:Ui,volume:mu,burp:Di,audioCtx:T.ctx,Line:Xe,Rect:we,Circle:Le,Ellipse:ht,Point:ih,Polygon:Re,Vec2:q,Color:se,Mat4:Xr,Mat23:tn,Quad:xe,RNG:ba,rand:ke,randi:Ws,randSeed:Ea,vec2:P,rgb:ue,hsl2rgb:nh,quad:ve,choose:ka,chooseMultiple:Ma,shuffle:Ys,chance:Sa,lerp:Oe,tween:ee,easings:ar,map:ot,mapc:va,wave:Ks,deg2rad:ye,rad2deg:Tt,clamp:lt,evaluateQuadratic:Ha,evaluateQuadraticFirstDerivative:Ka,evaluateQuadraticSecondDerivative:Wa,evaluateBezier:ts,evaluateBezierFirstDerivative:Ya,evaluateBezierSecondDerivative:Xa,evaluateCatmullRom:Ja,evaluateCatmullRomFirstDerivative:Qa,curveLengthApproximation:ni,normalizedCurve:Za,hermite:Zn,cardinal:ri,catmullRom:ir,bezier:_a,kochanekBartels:$a,easingSteps:io,easingLinear:ro,easingCubicBezier:so,testLineLine:Jr,testRectRect:Xs,testRectLine:Qr,testRectPoint:fr,testCirclePolygon:gr,testLinePoint:Zr,testLineCircle:Qn,clipLineToRect:Ca,clipLineToCircle:qa,gjkShapeIntersects:No,gjkShapeIntersection:Ts,isConvex:ho,triangulate:ii,NavMesh:Wh,drawSprite:zu,drawText:js,formatText:Vt,drawRect:Ve,drawLine:yn,drawLines:fs,drawTriangle:Yi,drawCircle:on,drawEllipse:ds,drawUVQuad:zt,drawPolygon:qt,drawCurve:Wi,drawBezier:Ou,drawFormattedText:Gt,drawMasked:ju,drawSubtracted:Vu,beginPicture:Cu,appendToPicture:qu,endPicture:Tu,drawPicture:Ki,pushTransform:We,popTransform:ze,pushTranslate:$e,pushScale:Jn,pushRotate:rn,pushMatrix:Mu,usePostEffect:I,makeCanvas:S,drawCanvas:Lu,Picture:Hi,debug:v,scene:bu,getSceneName:Su,go:Eu,onSceneLeave:Ds,layers:Au,getLayers:wu,setLayers:zi,getDefaultLayer:xu,addLevel:Hl,getData:M,setData:R,download:ss,downloadJSON:wo,downloadText:oi,downloadBlob:Cs,plug:L,system:da,ASCII_CHARS:co,canvas:u.canvas,addKaboom:yu,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:se.RED,GREEN:se.GREEN,BLUE:se.BLUE,YELLOW:se.YELLOW,MAGENTA:se.MAGENTA,CYAN:se.CYAN,WHITE:se.WHITE,BLACK:se.BLACK,quit:Qe,KEvent:Te,KEventHandler:rs,KEventController:sn,KeepFlags:uu,cancel:o(()=>go,"cancel"),BlendMode:Io};d.k=Ce;let he=t.plugins;if(he&&he.forEach(L),t.global!==!1)for(let N in Ce)window[N]=Ce[N];return t.focus!==!1&&u.canvas.focus(),Ce},"kaplay"),vc=Ac;const bc="G-2GKHT76YTG";function Ec(t,e){if(window.gtag){e&&e();return}const n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,n.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(n)}function Sc(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function Mc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Gu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const kc=Gu()?640:1920,Pc=Gu()?480:1080,a=vc({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:kc,height:Pc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Cc=[{id:1,title:"twoSum",language:"javascript",blocks:[`var twoSum = function(nums, target) { +`,ch=new Set(["id","require"]),dh=new Set(["add","fixedUpdate","update","draw","destroy","inspect","drawInspect"]),fh=200,gh=640,ph=65536,fo=Symbol.for("kaplay.cancel"),vn,mh=(vn=class extends Map{constructor(){super(...arguments);b(this,"lastID",0)}push(n){let r=this.lastID;return this.set(r,n),this.lastID++,r}pushd(n){let r=this.push(n);return()=>this.delete(r)}},o(vn,"Registry"),vn),Zt,rn=(Zt=class{constructor(e){b(this,"paused",!1);b(this,"cancel");this.cancel=e}static join(e){let n=new Zt(()=>e.forEach(r=>r.cancel()));return Object.defineProperty(n,"paused",{get:o(()=>e[0].paused,"get"),set:o(r=>e.forEach(s=>s.paused=r),"set")}),n.paused=!1,n}static replace(e,n){return e.cancel=()=>n.cancel(),n.paused=e.paused,Object.defineProperty(e,"paused",{get:o(()=>n.paused,"get"),set:o(r=>n.paused=r,"set")}),e}},o(Zt,"KEventController"),Zt),bn,qe=(bn=class{constructor(){b(this,"cancellers",new WeakMap);b(this,"handlers",new mh)}add(e){function n(...i){if(!s.paused)return e(...i)}o(n,"handler");let r=this.handlers.pushd(n),s=new rn(r);return this.cancellers.set(n,r),s}addOnce(e){let n=this.add((...r)=>{n.cancel(),e(...r)});return n}next(){return new Promise(e=>this.addOnce(e))}trigger(...e){this.handlers.forEach(n=>{let r=n(...e),s;r===fo&&(s=this.cancellers.get(n))&&s()})}numListeners(){return this.handlers.size}clear(){this.handlers.clear()}},o(bn,"KEvent"),bn),En,rs=(En=class{constructor(){b(this,"handlers",{});b(this,"registers",{})}on(e,n){return this.handlers[e]||(this.handlers[e]=new qe),this.handlers[e].add(n)}onOnce(e,n){let r=this.on(e,(...s)=>{r.cancel(),n(...s)});return r}next(e){return new Promise(n=>{this.onOnce(e,(...r)=>n(r[0]))})}trigger(e,...n){this.handlers[e]&&this.handlers[e].trigger(...n)}remove(e){delete this.handlers[e]}clear(){this.handlers={}}numListeners(e){var n;return((n=this.handlers[e])==null?void 0:n.numListeners())??0}},o(En,"KEventHandler"),En),yh=o(t=>t[0]instanceof ie,"arrayIsColor"),wh=o(t=>t[0]instanceof q,"arrayIsVec2"),xh=o(t=>typeof t[0]=="number","arrayIsNumber"),Sn,go=(Sn=class{constructor(e=(n,r)=>n0;){let n=Math.floor((e-1)/2);if(!this._compareFn(this._items[e],this._items[n])&&this._items[e]>=this._items[n])break;this.swap(e,n),e=n}}moveDown(e){for(;et.match(/^data:\w+\/\w+;base64,.+/),"isDataURL"),Ah=o(t=>t.split(".").slice(0,-1).join("."),"getFileName");function is(t,e){if(t===e)return!0;let n=typeof t,r=typeof e;if(n!==r)return!1;if(n==="object"&&r==="object"&&t!==null&&e!==null){if(Array.isArray(t)!==Array.isArray(e))return!1;let s=Object.keys(t),i=Object.keys(e);if(s.length!==i.length)return!1;for(let l of s){let c=t[l],h=e[l];if(!is(c,h))return!1}return!0}return!1}o(is,"deepEq");var ea=new Set,vh=o(t=>t instanceof Error?t.message:String(t),"getErrorMessage");function xo(t){ea.has(t)||(ea.add(t),console.warn(t))}o(xo,"warn");function Gt(t,e){xo(`${t} is deprecated. Use ${e} instead.`)}o(Gt,"deprecateMsg");function Ur(t,e){return Number(t.toFixed(e))}o(Ur,"toFixed");function pe(t,e){return(...n)=>{let r=n.length;if(r===t.length)return t(...n);if(r===e.length)return e(...n)}}o(pe,"overload2");var bh=Object.freeze([776,2359,2367,2984,3007,3021,3633,3635,3648,3657,4352,4449,4520]);function Ao(t){if(typeof t!="string")throw new TypeError("string cannot be undefined or null");let e=[],n=0,r=0;for(;n=e&&t<=n}o(Ht,"betweenInclusive");var Ze=o((t,e)=>Array.isArray(t)?t==null?void 0:t.includes(e):t===e,"isEqOrIncludes"),dt=o((t,e)=>Array.isArray(e)?e.some(n=>t.has(n)):t.has(e),"setHasOrIncludes"),Sr=o((t,e,n)=>{var r;t.has(e)?(r=t.get(e))==null||r.push(n):t.set(e,[n])},"mapAddOrPush"),Eh=(()=>{let t=0;return()=>t++})(),Sh={"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}}}},Mh=o(()=>Yt.lastInputDevice,"getLastInputDeviceType"),kh=o(()=>{let t=Yt.buttons;for(let e in t){let n=t[e].keyboard&&[t[e].keyboard].flat(),r=t[e].keyboardCode&&[t[e].keyboardCode].flat(),s=t[e].gamepad&&[t[e].gamepad].flat(),i=t[e].mouse&&[t[e].mouse].flat();n&&n.forEach(l=>{Sr(Yt.buttonsByKey,l,e)}),r&&r.forEach(l=>{Sr(Yt.buttonsByKeyCode,l,e)}),s&&s.forEach(l=>{Sr(Yt.buttonsByGamepad,l,e)}),i&&i.forEach(l=>{Sr(Yt.buttonsByMouse,l,e)})}},"parseButtonBindings"),Mn,nr=(Mn=class{constructor(){b(this,"pressed",new Set([]));b(this,"pressedRepeat",new Set([]));b(this,"released",new Set([]));b(this,"down",new Set([]))}update(){this.pressed.clear(),this.released.clear(),this.pressedRepeat.clear()}press(e){this.pressed.add(e),this.pressedRepeat.add(e),this.down.add(e)}pressRepeat(e){this.pressedRepeat.add(e)}release(e){this.down.delete(e),this.pressed.delete(e),this.released.add(e)}},o(Mn,"ButtonState"),Mn),kn,Ph=(kn=class{constructor(){b(this,"buttonState",new nr);b(this,"stickState",new Map)}},o(kn,"GamepadState"),kn),Pn,Ch=(Pn=class{constructor(){b(this,"dts",[]);b(this,"timer",0);b(this,"fps",0)}tick(e){this.dts.push(e),this.timer+=e,this.timer>=1&&(this.timer=0,this.fps=Math.round(1/(this.dts.reduce((n,r)=>n+r)/this.dts.length)),this.dts=[])}},o(Pn,"FPSCounter"),Pn),Yt,ta=Sh,qh=o(t=>{let e=t.buttons??{};return{canvas:t.canvas,buttons:e,buttonsByKey:new Map,buttonsByMouse:new Map,buttonsByGamepad:new Map,buttonsByKeyCode:new Map,loopID:null,stopped:!1,dt:0,fixedDt:1/50,restDt:0,time:0,realTime:0,fpsCounter:new Ch,timeScale:1,skipTime:!1,isHidden:!1,numFrames:0,mousePos:new q(0),mouseDeltaPos:new q(0),keyState:new nr,mouseState:new nr,mergedGamepadState:new Ph,gamepadStates:new Map,lastInputDevice:null,buttonState:new nr,gamepads:[],charInputted:[],isMouseMoved:!1,lastWidth:t.canvas.offsetWidth,lastHeight:t.canvas.offsetHeight,events:new rs}},"initAppState"),Th=o(t=>{if(!t.canvas)throw new Error("Please provide a canvas");let e=qh(t);Yt=e,kh();function n(){return e.dt*e.timeScale}o(n,"dt");function r(){return e.fixedDt*e.timeScale}o(r,"fixedDt");function s(){return e.restDt*e.timeScale}o(s,"restDt");function i(){return e.isHidden}o(i,"isHidden");function l(){return e.time}o(l,"time");function c(){return e.fpsCounter.fps}o(c,"fps");function h(){return e.numFrames}o(h,"numFrames");function u(){return e.canvas.toDataURL()}o(u,"screenshot");function g(A){e.canvas.style.cursor=A}o(g,"setCursor");function y(){return e.canvas.style.cursor}o(y,"getCursor");function m(A){if(A)try{let B=e.canvas.requestPointerLock();B!=null&&B.catch&&B.catch(F=>console.error(F))}catch(B){console.error(B)}else document.exitPointerLock()}o(m,"setCursorLocked");function E(){return!!document.pointerLockElement}o(E,"isCursorLocked");function p(A){A.requestFullscreen?A.requestFullscreen():A.webkitRequestFullscreen&&A.webkitRequestFullscreen()}o(p,"enterFullscreen");function T(){document.exitFullscreen?document.exitFullscreen():document.webkitExitFullScreen&&document.webkitExitFullScreen()}o(T,"exitFullscreen");function f(A=!0){A?p(e.canvas):T()}o(f,"setFullscreen");function w(){return document.fullscreenElement===e.canvas||document.webkitFullscreenElement===e.canvas}o(w,"isFullscreen");function S(){e.stopped=!0;let A=Object.entries(se),B=Object.entries(Kt),F=Object.entries(Er);for(let[j,Z]of A)e.canvas.removeEventListener(j,Z);for(let[j,Z]of B)document.removeEventListener(j,Z);for(let[j,Z]of F)window.removeEventListener(j,Z);_i.disconnect()}o(S,"quit");function C(A,B){e.loopID!==null&&cancelAnimationFrame(e.loopID);let F=0,j=0,Z=o(ge=>{if(e.stopped)return;if(document.visibilityState!=="visible"){e.loopID=requestAnimationFrame(Z);return}let Ie=ge/1e3,Ae=Math.min(Ie-e.realTime,.25),vt=t.maxFPS?1/t.maxFPS:0;if(e.realTime=Ie,j+=Ae,j>vt){if(!e.skipTime){for(F+=j,e.dt=e.fixedDt,e.restDt=0;F>e.fixedDt;)F-=e.fixedDt,F0}o(I,"isTouchscreen");function k(){return e.mousePos.clone()}o(k,"mousePos");function x(){return e.mouseDeltaPos.clone()}o(x,"mouseDeltaPos");function v(A="left"){return e.mouseState.pressed.has(A)}o(v,"isMousePressed");function M(A="left"){return e.mouseState.down.has(A)}o(M,"isMouseDown");function R(A="left"){return e.mouseState.released.has(A)}o(R,"isMouseReleased");function L(){return e.isMouseMoved}o(L,"isMouseMoved");function D(A){return A===void 0?e.keyState.pressed.size>0:dt(e.keyState.pressed,A)}o(D,"isKeyPressed");function O(A){return A===void 0?e.keyState.pressedRepeat.size>0:dt(e.keyState.pressedRepeat,A)}o(O,"isKeyPressedRepeat");function z(A){return A===void 0?e.keyState.down.size>0:dt(e.keyState.down,A)}o(z,"isKeyDown");function te(A){return A===void 0?e.keyState.released.size>0:dt(e.keyState.released,A)}o(te,"isKeyReleased");function W(A){return A===void 0?e.mergedGamepadState.buttonState.pressed.size>0:dt(e.mergedGamepadState.buttonState.pressed,A)}o(W,"isGamepadButtonPressed");function $(A){return A===void 0?e.mergedGamepadState.buttonState.down.size>0:dt(e.mergedGamepadState.buttonState.down,A)}o($,"isGamepadButtonDown");function Q(A){return A===void 0?e.mergedGamepadState.buttonState.released.size>0:dt(e.mergedGamepadState.buttonState.released,A)}o(Q,"isGamepadButtonReleased");function ne(A){return A===void 0?e.buttonState.pressed.size>0:dt(e.buttonState.pressed,A)}o(ne,"isButtonPressed");function Y(A){return A===void 0?e.buttonState.down.size>0:dt(e.buttonState.down,A)}o(Y,"isButtonDown");function ee(A){return A===void 0?e.buttonState.released.size>0:dt(e.buttonState.released,A)}o(ee,"isButtonReleased");function H(A){var B;return(B=e.buttons)==null?void 0:B[A]}o(H,"getButton");function Le(A,B){e.buttons[A]={...e.buttons[A],...B}}o(Le,"setButton");function Ge(A){e.buttonState.press(A),e.events.trigger("buttonPress",A)}o(Ge,"pressButton");function Te(A){e.buttonState.release(A),e.events.trigger("buttonRelease",A)}o(Te,"releaseButton");function De(A){return e.events.on("resize",A)}o(De,"onResize");let Xe=pe(A=>e.events.on("keyDown",A),(A,B)=>e.events.on("keyDown",F=>Ze(A,F)&&B(F))),K=pe(A=>e.events.on("keyPress",B=>A(B)),(A,B)=>e.events.on("keyPress",F=>Ze(A,F)&&B(F))),le=pe(A=>e.events.on("keyPressRepeat",A),(A,B)=>e.events.on("keyPressRepeat",F=>Ze(A,F)&&B(F))),de=pe(A=>e.events.on("keyRelease",A),(A,B)=>e.events.on("keyRelease",F=>Ze(A,F)&&B(F))),Re=pe(A=>e.events.on("mouseDown",B=>A(B)),(A,B)=>e.events.on("mouseDown",F=>Ze(A,F)&&B(F))),Se=pe(A=>e.events.on("mousePress",B=>A(B)),(A,B)=>e.events.on("mousePress",F=>Ze(A,F)&&B(F))),et=pe(A=>e.events.on("mouseRelease",B=>A(B)),(A,B)=>e.events.on("mouseRelease",F=>F===A&&B(F)));function Je(A){return e.events.on("mouseMove",()=>A(k(),x()))}o(Je,"onMouseMove");function tt(A){return e.events.on("charInput",A)}o(tt,"onCharInput");function Ce(A){return e.events.on("touchStart",A)}o(Ce,"onTouchStart");function ce(A){return e.events.on("touchMove",A)}o(ce,"onTouchMove");function Ne(A){return e.events.on("touchEnd",A)}o(Ne,"onTouchEnd");function N(A){return e.events.on("scroll",A)}o(N,"onScroll");function V(A){return e.events.on("hide",A)}o(V,"onHide");function X(A){return e.events.on("show",A)}o(X,"onShow");let ae=pe(A=>e.events.on("gamepadButtonPress",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonPress",(F,j)=>Ze(A,F)&&B(F,j))),Me=pe(A=>e.events.on("gamepadButtonDown",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonDown",(F,j)=>Ze(A,F)&&B(F,j))),be=pe(A=>e.events.on("gamepadButtonRelease",(B,F)=>A(B,F)),(A,B)=>e.events.on("gamepadButtonRelease",(F,j)=>Ze(A,F)&&B(F,j)));function nt(A,B){return e.events.on("gamepadStick",(F,j,Z)=>F===A&&B(j,Z))}o(nt,"onGamepadStick");function on(A){return e.events.on("gamepadConnect",A)}o(on,"onGamepadConnect");function ln(A){return e.events.on("gamepadDisconnect",A)}o(ln,"onGamepadDisconnect");function vr(A){return e.mergedGamepadState.stickState.get(A)||new q(0)}o(vr,"getGamepadStick");function un(){return[...e.charInputted]}o(un,"charInputted");function U(){return[...e.gamepads]}o(U,"getGamepads");let G=pe(A=>e.events.on("buttonPress",B=>A(B)),(A,B)=>e.events.on("buttonPress",F=>Ze(A,F)&&B(F))),J=pe(A=>e.events.on("buttonDown",B=>A(B)),(A,B)=>e.events.on("buttonDown",F=>Ze(A,F)&&B(F))),ue=pe(A=>e.events.on("buttonRelease",B=>A(B)),(A,B)=>e.events.on("buttonRelease",F=>Ze(A,F)&&B(F)));function xe(){e.events.trigger("input"),e.keyState.down.forEach(A=>e.events.trigger("keyDown",A)),e.mouseState.down.forEach(A=>e.events.trigger("mouseDown",A)),e.buttonState.down.forEach(A=>{e.events.trigger("buttonDown",A)}),br()}o(xe,"processInput");function Qe(){e.keyState.update(),e.mouseState.update(),e.buttonState.update(),e.mergedGamepadState.buttonState.update(),e.mergedGamepadState.stickState.forEach((A,B)=>{e.mergedGamepadState.stickState.set(B,new q(0))}),e.charInputted=[],e.isMouseMoved=!1,e.mouseDeltaPos=new q(0),e.gamepadStates.forEach(A=>{A.buttonState.update(),A.stickState.forEach((B,F)=>{A.stickState.set(F,new q(0))})})}o(Qe,"resetInput");function ht(A){let B={index:A.index,isPressed:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.pressed.has(F))||!1},"isPressed"),isDown:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.down.has(F))||!1},"isDown"),isReleased:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.buttonState.released.has(F))||!1},"isReleased"),getStick:o(F=>{var j;return((j=e.gamepadStates.get(A.index))==null?void 0:j.stickState.get(F))||P()},"getStick")};return e.gamepads.push(B),e.gamepadStates.set(A.index,{buttonState:new nr,stickState:new Map([["left",new q(0)],["right",new q(0)]])}),B}o(ht,"registerGamepad");function At(A){e.gamepads=e.gamepads.filter(B=>B.index!==A.index),e.gamepadStates.delete(A.index)}o(At,"removeGamepad");function br(){var A,B;for(let F of navigator.getGamepads())F&&!e.gamepadStates.has(F.index)&&ht(F);for(let F of e.gamepads){let j=navigator.getGamepads()[F.index];if(!j)continue;let Z=(t.gamepads??{})[j.id]||ta[j.id]||ta.default,ge=e.gamepadStates.get(F.index);if(ge){for(let Ie=0;Ie{e.buttonState.press(bt),e.events.trigger("buttonPress",bt)})),e.mergedGamepadState.buttonState.press(Ae),ge.buttonState.press(Ae),e.events.trigger("gamepadButtonPress",Ae,F)}else ge.buttonState.down.has(Ae)&&(ct&&((B=e.buttonsByGamepad.get(Ae))==null||B.forEach(bt=>{e.buttonState.release(bt),e.events.trigger("buttonRelease",bt)})),e.mergedGamepadState.buttonState.release(Ae),ge.buttonState.release(Ae),e.events.trigger("gamepadButtonRelease",Ae,F))}for(let Ie in Z.sticks){let Ae=Z.sticks[Ie];if(!Ae)continue;let vt=new q(j.axes[Ae.x],j.axes[Ae.y]);ge.stickState.set(Ie,vt),e.mergedGamepadState.stickState.set(Ie,vt),e.events.trigger("gamepadStick",Ie,vt,F)}}}}o(br,"processGamepad");let se={},Kt={},Er={},Ji=t.pixelDensity||1;se.mousemove=A=>{let B=new q(A.offsetX,A.offsetY),F=new q(A.movementX,A.movementY);if(w()){let j=e.canvas.width/Ji,Z=e.canvas.height/Ji,ge=window.innerWidth,Ie=window.innerHeight,Ae=ge/Ie,vt=j/Z;if(Ae>vt){let ct=Ie/Z,bt=(ge-j*ct)/2;B.x=at(A.offsetX-bt,0,j*ct,0,j),B.y=at(A.offsetY,0,Z*ct,0,Z)}else{let ct=ge/j,bt=(Ie-Z*ct)/2;B.x=at(A.offsetX,0,j*ct,0,j),B.y=at(A.offsetY-bt,0,Z*ct,0,Z)}}e.events.onOnce("input",()=>{e.isMouseMoved=!0,e.mousePos=B,e.mouseDeltaPos=F,e.events.trigger("mouseMove")})};let Qi=["left","middle","right","back","forward"];se.mousedown=A=>{e.events.onOnce("input",()=>{var F;let B=Qi[A.button];B&&(e.lastInputDevice="mouse",e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.press(j),e.events.trigger("buttonPress",j)})),e.mouseState.press(B),e.events.trigger("mousePress",B))})},se.mouseup=A=>{e.events.onOnce("input",()=>{var F;let B=Qi[A.button];B&&(e.buttonsByMouse.has(B)&&((F=e.buttonsByMouse.get(B))==null||F.forEach(j=>{e.buttonState.release(j),e.events.trigger("buttonRelease",j)})),e.mouseState.release(B),e.events.trigger("mouseRelease",B))})};let Qu=new Set([" ","ArrowLeft","ArrowRight","ArrowUp","ArrowDown","Tab"]),Zi={ArrowLeft:"left",ArrowRight:"right",ArrowUp:"up",ArrowDown:"down"," ":"space"};se.keydown=A=>{Qu.has(A.key)&&A.preventDefault(),e.events.onOnce("input",()=>{var j,Z;let B=Zi[A.key]||A.key.toLowerCase(),F=A.code;if(B===void 0)throw new Error(`Unknown key: ${A.key}`);B.length===1?(e.events.trigger("charInput",B),e.charInputted.push(B)):B==="space"&&(e.events.trigger("charInput"," "),e.charInputted.push(" ")),A.repeat?(e.keyState.pressRepeat(B),e.events.trigger("keyPressRepeat",B)):(e.lastInputDevice="keyboard",e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.press(ge),e.events.trigger("buttonPress",ge)})),e.keyState.press(B),e.events.trigger("keyPressRepeat",B),e.events.trigger("keyPress",B))})},se.keyup=A=>{e.events.onOnce("input",()=>{var j,Z;let B=Zi[A.key]||A.key.toLowerCase(),F=A.code;e.buttonsByKey.has(B)&&((j=e.buttonsByKey.get(B))==null||j.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.buttonsByKeyCode.has(F)&&((Z=e.buttonsByKeyCode.get(F))==null||Z.forEach(ge=>{e.buttonState.release(ge),e.events.trigger("buttonRelease",ge)})),e.keyState.release(B),e.events.trigger("keyRelease",B)})},se.touchstart=A=>{A.preventDefault(),e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.lastInputDevice="mouse",e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.press(Z),e.events.trigger("buttonPress",Z)})),e.mouseState.press("left"),e.events.trigger("mousePress","left")),B.forEach(Z=>{e.events.trigger("touchStart",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},se.touchmove=A=>{A.preventDefault(),e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();if(t.touchToMouse!==!1){let j=e.mousePos;e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=e.mousePos.sub(j),e.events.trigger("mouseMove")}B.forEach(j=>{e.events.trigger("touchMove",new q(j.clientX-F.x,j.clientY-F.y),j)})})},se.touchend=A=>{e.events.onOnce("input",()=>{var j;let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseDeltaPos=new q(0,0),e.buttonsByMouse.has("left")&&((j=e.buttonsByMouse.get("left"))==null||j.forEach(Z=>{e.buttonState.release(Z),e.events.trigger("buttonRelease",Z)})),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(Z=>{e.events.trigger("touchEnd",new q(Z.clientX-F.x,Z.clientY-F.y),Z)})})},se.touchcancel=A=>{e.events.onOnce("input",()=>{let B=[...A.changedTouches],F=e.canvas.getBoundingClientRect();t.touchToMouse!==!1&&(e.mousePos=new q(B[0].clientX-F.x,B[0].clientY-F.y),e.mouseState.release("left"),e.events.trigger("mouseRelease","left")),B.forEach(j=>{e.events.trigger("touchEnd",new q(j.clientX-F.x,j.clientY-F.y),j)})})},se.wheel=A=>{A.preventDefault(),e.events.onOnce("input",()=>{e.events.trigger("scroll",new q(A.deltaX,A.deltaY))})},se.contextmenu=A=>A.preventDefault(),Kt.visibilitychange=()=>{document.visibilityState==="visible"?(e.skipTime=!0,e.isHidden=!1,e.events.trigger("show")):(e.isHidden=!0,e.events.trigger("hide"))},Er.gamepadconnected=A=>{let B=ht(A.gamepad);e.events.onOnce("input",()=>{e.events.trigger("gamepadConnect",B)})},Er.gamepaddisconnected=A=>{let B=U().filter(F=>F.index===A.gamepad.index)[0];At(A.gamepad),e.events.onOnce("input",()=>{e.events.trigger("gamepadDisconnect",B)})};for(let[A,B]of Object.entries(se))e.canvas.addEventListener(A,B);for(let[A,B]of Object.entries(Kt))document.addEventListener(A,B);for(let[A,B]of Object.entries(Er))window.addEventListener(A,B);let _i=new ResizeObserver(A=>{for(let B of A)if(B.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 _i.observe(e.canvas),{state:e,dt:n,fixedDt:r,restDt:s,time:l,run:C,canvas:e.canvas,fps:c,numFrames:h,quit:S,isHidden:i,setFullscreen:f,isFullscreen:w,setCursor:g,screenshot:u,getGamepads:U,getCursor:y,setCursorLocked:m,isCursorLocked:E,isTouchscreen:I,mousePos:k,mouseDeltaPos:x,isKeyDown:z,isKeyPressed:D,isKeyPressedRepeat:O,isKeyReleased:te,isMouseDown:M,isMousePressed:v,isMouseReleased:R,isMouseMoved:L,isGamepadButtonPressed:W,isGamepadButtonDown:$,isGamepadButtonReleased:Q,getGamepadStick:vr,isButtonPressed:ne,isButtonDown:Y,isButtonReleased:ee,setButton:Le,getButton:H,pressButton:Ge,releaseButton:Te,charInputted:un,onResize:De,onKeyDown:Xe,onKeyPress:K,onKeyPressRepeat:le,onKeyRelease:de,onMouseDown:Re,onMousePress:Se,onMouseRelease:et,onMouseMove:Je,onCharInput:tt,onTouchStart:Ce,onTouchMove:ce,onTouchEnd:Ne,onScroll:N,onHide:V,onShow:X,onGamepadButtonDown:Me,onGamepadButtonPress:ae,onGamepadButtonRelease:be,onGamepadStick:nt,onGamepadConnect:on,onGamepadDisconnect:ln,onButtonPress:G,onButtonDown:J,onButtonRelease:ue,getLastInputDeviceType:Mh,events:e.events}},"initApp"),To=(t=>(t[t.Normal=0]="Normal",t[t.Add=1]="Add",t[t.Multiply=2]="Multiply",t[t.Screen=3]="Screen",t[t.Overlay=4]="Overlay",t))(To||{}),Ih=new q(-1,-1),Bh=new q(0,-1),Rh=new q(1,-1),Fh=new q(-1,0),Oh=new q(0,0),Lh=new q(1,0),Dh=new q(-1,1),Nh=new q(0,1),Uh=new q(1,1);function sn(t){switch(t){case"topleft":return Ih;case"top":return Bh;case"topright":return Rh;case"left":return Fh;case"center":return Oh;case"right":return Lh;case"botleft":return Dh;case"bot":return Nh;case"botright":return Uh;default:return t}}o(sn,"anchorPt");function Io(t){switch(t){case"left":return 0;case"center":return .5;case"right":return 1;default:return 0}}o(Io,"alignPt");var Mr=2.5949095,na=1.70158+1,ra=2*Math.PI/3,sa=2*Math.PI/4.5,Rr={linear:o(t=>t,"linear"),easeInSine:o(t=>1-Math.cos(t*Math.PI/2),"easeInSine"),easeOutSine:o(t=>Math.sin(t*Math.PI/2),"easeOutSine"),easeInOutSine:o(t=>-(Math.cos(Math.PI*t)-1)/2,"easeInOutSine"),easeInQuad:o(t=>t*t,"easeInQuad"),easeOutQuad:o(t=>1-(1-t)*(1-t),"easeOutQuad"),easeInOutQuad:o(t=>t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2,"easeInOutQuad"),easeInCubic:o(t=>t*t*t,"easeInCubic"),easeOutCubic:o(t=>1-Math.pow(1-t,3),"easeOutCubic"),easeInOutCubic:o(t=>t<.5?4*t*t*t:1-Math.pow(-2*t+2,3)/2,"easeInOutCubic"),easeInQuart:o(t=>t*t*t*t,"easeInQuart"),easeOutQuart:o(t=>1-Math.pow(1-t,4),"easeOutQuart"),easeInOutQuart:o(t=>t<.5?8*t*t*t*t:1-Math.pow(-2*t+2,4)/2,"easeInOutQuart"),easeInQuint:o(t=>t*t*t*t*t,"easeInQuint"),easeOutQuint:o(t=>1-Math.pow(1-t,5),"easeOutQuint"),easeInOutQuint:o(t=>t<.5?16*t*t*t*t*t:1-Math.pow(-2*t+2,5)/2,"easeInOutQuint"),easeInExpo:o(t=>t===0?0:Math.pow(2,10*t-10),"easeInExpo"),easeOutExpo:o(t=>t===1?1:1-Math.pow(2,-10*t),"easeOutExpo"),easeInOutExpo:o(t=>t===0?0:t===1?1:t<.5?Math.pow(2,20*t-10)/2:(2-Math.pow(2,-20*t+10))/2,"easeInOutExpo"),easeInCirc:o(t=>1-Math.sqrt(1-Math.pow(t,2)),"easeInCirc"),easeOutCirc:o(t=>Math.sqrt(1-Math.pow(t-1,2)),"easeOutCirc"),easeInOutCirc:o(t=>t<.5?(1-Math.sqrt(1-Math.pow(2*t,2)))/2:(Math.sqrt(1-Math.pow(-2*t+2,2))+1)/2,"easeInOutCirc"),easeInBack:o(t=>na*t*t*t-1.70158*t*t,"easeInBack"),easeOutBack:o(t=>1+na*Math.pow(t-1,3)+1.70158*Math.pow(t-1,2),"easeOutBack"),easeInOutBack:o(t=>t<.5?Math.pow(2*t,2)*((Mr+1)*2*t-Mr)/2:(Math.pow(2*t-2,2)*((Mr+1)*(t*2-2)+Mr)+2)/2,"easeInOutBack"),easeInElastic:o(t=>t===0?0:t===1?1:-Math.pow(2,10*t-10)*Math.sin((t*10-10.75)*ra),"easeInElastic"),easeOutElastic:o(t=>t===0?0:t===1?1:Math.pow(2,-10*t)*Math.sin((t*10-.75)*ra)+1,"easeOutElastic"),easeInOutElastic:o(t=>t===0?0:t===1?1:t<.5?-(Math.pow(2,20*t-10)*Math.sin((20*t-11.125)*sa))/2:Math.pow(2,-20*t+10)*Math.sin((20*t-11.125)*sa)/2+1,"easeInOutElastic"),easeInBounce:o(t=>1-Rr.easeOutBounce(1-t),"easeInBounce"),easeOutBounce:o(t=>t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375,"easeOutBounce"),easeInOutBounce:o(t=>t<.5?(1-Rr.easeOutBounce(1-2*t))/2:(1+Rr.easeOutBounce(2*t-1))/2,"easeInOutBounce")},ur=Rr,Cn,jh=(Cn=class{constructor(e,n){b(this,"center");b(this,"radius");this.center=e,this.radius=n}support(e){let n=new q(e.x,e.y);return q.unit(n,n),q.scale(n,this.radius,n),q.add(n,this.center,n),n}},o(Cn,"CircleCollider"),Cn),qn,zh=(qn=class{constructor(e,n,r,s){b(this,"center");b(this,"radiusX");b(this,"radiusY");b(this,"angle");this.center=e,this.radiusX=n,this.radiusY=r,this.angle=s}support(e){if(this.angle===0){let n=new q(e.x,e.y);return q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.add(n,this.center,n),n}else{let n=new q(e.x,e.y);return q.rotateByAngle(n,-this.angle,n),q.unit(n,n),q.scalec(n,this.radiusX,this.radiusY,n),q.rotateByAngle(n,this.angle,n),q.add(n,this.center,n),n}}},o(qn,"EllipseCollider"),qn),Tn,gs=(Tn=class{constructor(e){b(this,"vertices");b(this,"center");this.vertices=e,this.center=this.vertices[0]}support(e){let n,r=Number.NEGATIVE_INFINITY,s;for(let i=0;ir&&(r=l,n=s)}return n}},o(Tn,"PolygonCollider"),Tn);function oi(t,e,n){let r=new q(-n.x,-n.y),s=t.support(n),i=e.support(r);return new q(s.x-i.x,s.y-i.y)}o(oi,"calculateSupport");function Bo(t,e,n,r){var s=oi(e,n,r);return t.push(s),r.dot(s)>=0}o(Bo,"addSupport");function Fr(t,e,n){let r=t.x*e.y-t.y*e.x;return new q(-r*n.y,r*n.x)}o(Fr,"tripleProduct");function li(t,e,n,r){switch(t.length){case 0:{r.x=n.center.x-e.center.x,r.y=n.center.y-e.center.y;break}case 1:{r.x=r.x*=-1,r.y=r.y*=-1;break}case 2:{let l=new q(t[1].x-t[0].x,t[1].y-t[0].y),c=new q(-t[0].x,-t[0].y),h=Fr(l,c,l);r.x=h.x,r.y=h.y;break}case 3:{let l=new q(-t[2].x,-t[2].y),c=new q(t[1].x-t[2].x,t[1].y-t[2].y),h=new q(t[0].x-t[2].x,t[0].y-t[2].y);var s=Fr(h,c,c),i=Fr(c,h,h);if(s.dot(l)>0)t.splice(0,1),r.x=s.x,r.y=s.y;else if(i.dot(l)>0)t.splice(1,1),r.x=i.x,r.y=i.y;else return 1}break;default:throw Error(`Can't have s simplex with ${t.length} vertices!`)}return Bo(t,e,n,r)?2:0}o(li,"evolveSimplex");function Ro(t,e){let n=[],r=new q;for(var s=2;s===2;)s=li(n,t,e,r);return s===1}o(Ro,"gjkIntersects");function Fo(t,e){let n=Number.POSITIVE_INFINITY,r=new q,s=0,i=new q,l=new q;for(let h=0;h=t.length&&(u=0),q.sub(t[u],t[h],i),e){case 0:l.x=i.y,l.y=-i.x;break;case 1:l.x=-i.y,l.y=i.x;break}q.unit(l,l);var c=l.dot(t[h]);c=0?0:1;let c=new q;for(let m=0;mc.coste.y!=r.a.y>e.y&&e.x<(r.a.x-r.b.x)*(e.y-r.b.y)/(r.a.y-r.b.y)+r.b.x&&(n=!n);return n}},o(Bn,"NavPolygon"),Bn),Rn,Kh=(Rn=class{constructor(){b(this,"_polygons");b(this,"_pointCache");b(this,"_edgeCache");this._polygons=[],this._pointCache={},this._edgeCache={}}_addPoint(e){let n=this._pointCache[`${e.x}_${e.y}`];return n||(n=e.clone(),this._pointCache[`${e.x}_${e.y}`]=n,n)}_addEdge(e){let n=`${e.a.x}_${e.a.y}-${e.b.x}_${e.b.y}`;return this._edgeCache[n]=e,e}_findEdge(e,n){let r=`${e.x}_${e.y}-${n.x}_${n.y}`;return this._edgeCache[r]}_findCommonEdge(e,n){for(let r of e.edges){let s=this._findEdge(r.b,r.a);if(s&&s.polygon.deref().id===n.id)return s}return null}addPolygon(e){let n=new Hh(this._polygons.length),r=e.map((s,i)=>new Gh(s,e[(i+1)%e.length],n));n.edges=r,this._polygons.push(n);for(let s of n.edges)this._addEdge(s);return n}addRect(e,n){let r=this._addPoint(e),s=this._addPoint(e.add(n.x,0)),i=this._addPoint(e.add(n)),l=this._addPoint(e.add(0,n.y));return this.addPolygon([r,s,i,l])}_getLocation(e){for(let n of this._polygons)if(n.contains(e))return n;return null}getNeighbours(e){let n=[];for(let r of this._polygons[e].edges){let s=this._findEdge(r.b,r.a);if(s){let i=s.polygon.deref();i&&n.push(i.id)}}return n}getCost(e,n){return 1}getHeuristic(e,n){let r=this._polygons[e],s=this._polygons[n],i=r.centroid.x-s.centroid.x,l=r.centroid.y-s.centroid.y;return Math.sqrt(i*i+l*l)}getPath(e,n){return e===void 0||n===void 0?[]:e===n?[e,n]:Uo(this,e,n)}getWaypointPath(e,n,r){let s=(r==null?void 0:r.type)||"centroids",i=this._getLocation(e),l=this._getLocation(n);if(i===void 0||l===void 0)return[];let c=this.getPath(i.id,l.id);if(!c)return[];if(s==="edges"){let h=[];for(let u=1;uthis._polygons[h].centroid),n]}},o(Rn,"NavMesh"),Rn);function Xt(t,e){return e.setIdentity(),t.pos&&e.translateSelfV(t.pos),t.scale&&e.scaleSelfV(t.scale),t.angle&&e.rotateSelf(t.angle),t.parent&&e.mulSelf(t.parent.transform),e}o(Xt,"calcTransform");function mn(t,e,n,r,s,i=1){r=me(r%360),s=me(s%360),s<=r&&(s+=Math.PI*2);let l=[],c=Math.ceil((s-r)/me(8)*i),h=(s-r)/c,u=P(Math.cos(r),Math.sin(r)),g=P(Math.cos(h),Math.sin(h));for(let y=0;y<=c;y++)l.push(t.add(e*u.x,n*u.y)),u=P(u.x*g.x-u.y*g.y,u.x*g.y+u.y*g.x);return l}o(mn,"getArcPts");var Fn,ia=(Fn=class{constructor(e,n){b(this,"obj");b(this,"x");b(this,"isLeft");this.obj=e,this.x=0,this.isLeft=n}},o(Fn,"Edge"),Fn),On,Wh=(On=class{constructor(){b(this,"edges");b(this,"objects");this.edges=[],this.objects=new Map}add(e){let n=new ia(e,!0),r=new ia(e,!1);this.edges.push(n),this.edges.push(r),this.objects.set(e,[n,r])}remove(e){let n=this.objects.get(e);n&&(this.edges.splice(this.edges.indexOf(n[0]),1),this.edges.splice(this.edges.indexOf(n[1]),1),this.objects.delete(e))}clear(){this.edges=[],this.objects.clear()}update(){for(let[e,n]of this.objects.entries()){Xt(e,e.transform);let r=e.worldArea().bbox();n[0].x=r.pos.x,n[1].x=r.pos.x+r.width}for(let e=1;e=0&&!(this.edges[n].x=t&&(this.opacity=e,r=!0))}}}o(Wo,"fadeIn");function Yo(t="intersect"){return{id:"mask",mask:t}}o(Yo,"mask");function hi(t){return{id:"opacity",opacity:t??1,fadeIn(e=1,n=d.k.easings.linear){return d.game.root.tween(0,this.opacity,e,r=>this.opacity=r,n)},fadeOut(e=1,n=d.k.easings.linear){return d.game.root.tween(this.opacity,0,e,r=>this.opacity=r,n)},inspect(){return`opacity: ${Ur(this.opacity,1)}`}}}o(hi,"opacity");function Xo(t=1,e=he(0,0,0),n=1,r="miter",s=10,i="butt"){return{id:"outline",outline:{width:t,color:e,opacity:n,join:r,miterLimit:s,cap:i},inspect(){return`outline: ${this.outline.width}px, ${this.outline.color}`}}}o(Xo,"outline");var Ln,Yh=(Ln=class{constructor(){b(this,"pos",P(0));b(this,"vel",P(0));b(this,"acc",P(0));b(this,"angle",0);b(this,"angularVelocity",0);b(this,"damping",0);b(this,"t",0);b(this,"lt",null);b(this,"gc",!0)}get progress(){return this.lt?this.t/this.lt:this.t}},o(Ln,"Particle"),Ln);function Jo(t,e){let n=e.lifetime,r=new Array(t.max),s=t.colors||[ie.WHITE],i=t.opacities||[1],l=t.quads||[new we(0,0,1,1)],c=t.scales||[1],h=t.lifeTime,u=e.spread||0,g=t.speed||[0,0],y=t.angle||[0,0],m=t.angularVelocity||[0,0],E=t.acceleration||[P(0),P(0)],p=t.damping||[0,0],T=new Array(t.max*6),f={pos:new Array(t.max*4*2),uv:new Array(t.max*4*2),color:new Array(t.max*4*3),opacity:new Array(t.max*4)},w=0,S=0;for(let k=0;k=v.lt){v.gc=!0,w--;continue}v.vel=v.vel.add(v.acc.scale(k)).scale(1-v.damping*k),v.pos=v.pos.add(v.vel.scale(k)),v.angle+=v.angularVelocity*k}}for(n!==void 0&&(n-=k,n<=0&&C.trigger()),S+=k;w1/e.rate;)this.emit(1),S-=1/e.rate},draw(){if(!(n!==void 0&&n<=0||w==0)){for(let k=0;k`[${n.x},${n.y}]`).join(",")}`}}}o(Zo,"polygon");function ci(t,e,n){let r;return d.game.root.get("area").forEach(s=>{if(n&&n.some(l=>s.is(l)))return;let i=s.worldArea().raycast(t,e);i&&(r?i.fractionthis.canvas.width||r>this.canvas.height)&&this.add_single(e),this.x+n>this.canvas.width&&(this.x=0,this.y+=this.curHeight,this.curHeight=0),this.y+r>this.canvas.height&&(this.c2d.clearRect(0,0,this.canvas.width,this.canvas.height),this.textures.push(Pt.fromImage(this.gfx,this.canvas)),this.x=0,this.y=0,this.curHeight=0);let s=this.textures[this.textures.length-1],i=new q(this.x+this.padding,this.y+this.padding);return this.x+=n,r>this.curHeight&&(this.curHeight=r),e instanceof ImageData?this.c2d.putImageData(e,i.x,i.y):this.c2d.drawImage(e,i.x,i.y),s.update(this.canvas),this.texturesPosition.set(this.lastTextureId,{position:i,size:new q(e.width,e.height),texture:s}),this.lastTextureId++,[s,new we(i.x/this.canvas.width,i.y/this.canvas.height,e.width/this.canvas.width,e.height/this.canvas.height),this.lastTextureId-1]}free(){for(let e of this.textures)e.free();for(let e of this.bigTextures)e.free()}remove(e){let n=this.texturesPosition.get(e);if(!n)throw new Error("Texture with packer id not found");this.c2d.clearRect(n.position.x,n.position.y,n.size.x,n.size.y),n.texture.update(this.canvas),this.texturesPosition.delete(e),this.x-=n.size.x}},o(Dn,"TexPacker"),Dn);function $e(t){return typeof t!="string"||wo(t)?t:d.assets.urlPrefix+t}o($e,"fixURL");var _t,lt=(_t=class{constructor(e){b(this,"loaded",!1);b(this,"data",null);b(this,"error",null);b(this,"onLoadEvents",new qe);b(this,"onErrorEvents",new qe);b(this,"onFinishEvents",new qe);e.then(n=>{this.loaded=!0,this.data=n,this.onLoadEvents.trigger(n)}).catch(n=>{if(this.error=n,this.onErrorEvents.numListeners()>0)this.onErrorEvents.trigger(n);else throw n}).finally(()=>{this.onFinishEvents.trigger(),this.loaded=!0})}static loaded(e){let n=new _t(Promise.resolve(e));return n.data=e,n.loaded=!0,n}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)}},o(_t,"Asset"),_t),Nn,hn=(Nn=class{constructor(){b(this,"assets",new Map);b(this,"lastUID",0)}add(e,n){let r=e??this.lastUID+++"",s=new lt(n);return this.assets.set(r,s),s}addLoaded(e,n){let r=e??this.lastUID+++"",s=lt.loaded(n);return this.assets.set(r,s),s}get(e){return this.assets.get(e)}progress(){if(this.assets.size===0)return 1;let e=0;return this.assets.forEach(n=>{n.loaded&&e++}),e/this.assets.size}getFailedAssets(){return Array.from(this.assets.keys()).filter(e=>this.assets.get(e).error!==null).map(e=>[e,this.assets.get(e)])}},o(Nn,"AssetBucket"),Nn);function os(t){return fetch(t).then(e=>{if(!e.ok)throw new Error(`Failed to fetch "${t}"`);return e})}o(os,"fetchURL");function yr(t){return os(t).then(e=>e.json())}o(yr,"fetchJSON");function $o(t){return os(t).then(e=>e.text())}o($o,"fetchText");function el(t){return os(t).then(e=>e.arrayBuffer())}o(el,"fetchArrayBuffer");function tl(t){return t!==void 0&&(d.assets.urlPrefix=t),d.assets.urlPrefix}o(tl,"loadRoot");function nl(t,e){return d.assets.custom.add(t,yr($e(e)))}o(nl,"loadJSON");function wr(t){let e=new Image;return e.crossOrigin="anonymous",e.src=t,new Promise((n,r)=>{e.onload=()=>n(e),e.onerror=()=>r(new Error(`Failed to load image from "${t}"`))})}o(wr,"loadImg");function Ut(){let t=[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom];return t.reduce((e,n)=>e+n.progress(),0)/t.length}o(Ut,"loadProgress");function fi(){return[d.assets.sprites,d.assets.sounds,d.assets.shaders,d.assets.fonts,d.assets.bitmapFonts,d.assets.custom].reduce((t,e)=>t.concat(e.getFailedAssets()),[])}o(fi,"getFailedAssets");function rl(t){return d.assets.custom.get(t)??null}o(rl,"getAsset");function jr(t){return d.assets.custom.add(null,t)}o(jr,"load");var Jh=o((t,e)=>({urlPrefix:"",sprites:new hn,fonts:new hn,bitmapFonts:new hn,sounds:new hn,shaders:new hn,custom:new hn,music:{},packer:new Xh(t,2048,2048,e),loaded:!1}),"initAssets");function sl(t,e,n){e=$e(e),n=$e(n),typeof e=="string"&&!n&&(n=Ah(e)+".json");let r=typeof n=="string"?yr(n):Promise.resolve(n);return d.assets.sprites.add(t,r.then(s=>{let i=s.meta.size,l=s.frames.map(h=>new we(h.frame.x/i.w,h.frame.y/i.h,h.frame.w/i.w,h.frame.h/i.h)),c={};for(let h of s.meta.frameTags)h.from===h.to?c[h.name]=h.from:c[h.name]={from:h.from,to:h.to,speed:10,loop:!0,pingpong:h.direction==="pingpong"};return tn.from(e,{frames:l,anims:c})}))}o(sl,"loadAseprite");var Qh="data:image/png;base64,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",Un,Or=(Un=class{constructor(e,n={}){b(this,"fontface");b(this,"filter",Ss);b(this,"outline",null);b(this,"size",64);if(this.fontface=e,this.filter=n.filter??Ss,this.size=n.size??64,this.size>256)throw new Error("Max font size: 256");n.outline&&(this.outline={width:1,color:he(0,0,0)},typeof n.outline=="number"?this.outline.width=n.outline:typeof n.outline=="object"&&(n.outline.width&&(this.outline.width=n.outline.width),n.outline.color&&(this.outline.color=n.outline.color)))}},o(Un,"FontData"),Un);function gi(t){if(!t)return gi(d.globalOpt.font??ih);if(typeof t=="string"){let e=mi(t),n=pi(t);if(e)return e.data??e;if(n)return n.data??n;if(document.fonts.check(`64px ${t}`))return t;if(Ut()<1)return null;throw new Error(`Font not found: ${t}`)}else if(t instanceof lt)return t.data?t.data:t;return t}o(gi,"resolveFont");function pi(t){return d.assets.fonts.get(t)??null}o(pi,"getFont");function il(t,e,n={}){let r=new FontFace(t,typeof e=="string"?`url(${e})`:e);return document.fonts.add(r),d.assets.fonts.add(t,r.load().catch(s=>{throw new Error(`Failed to load font from "${e}": ${s}`)}).then(s=>new Or(s,n)))}o(il,"loadFont");function al(t,e,n,r){let s=t.width/e,i={},l=r.split("").entries();for(let[c,h]of l)i[h]=new we(c%s*e,Math.floor(c/s)*n,e,n);return{tex:t,map:i,size:n}}o(al,"makeFont");function mi(t){return d.assets.bitmapFonts.get(t)??null}o(mi,"getBitmapFont");function yi(t,e,n,r,s={}){let i=$e(e);return d.assets.bitmapFonts.add(t,wr(i).then(l=>al(Pt.fromImage(d.gfx.ggl,l,s),n,r,s.chars??ho)))}o(yi,"loadBitmapFont");var Zh=o((t="happy",e)=>yi(t,Qh,28,36,e),"loadHappy");function ol(t,e){return e=$e(e),d.assets.sprites.add(t,new Promise(async n=>{let r=typeof e=="string"?await yr(e):e,s=await Promise.all(r.frames.map(wr)),i=document.createElement("canvas");i.width=r.width,i.height=r.height*r.frames.length;let l=i.getContext("2d");if(!l)throw new Error("Failed to create canvas context");s.forEach((h,u)=>{l.drawImage(h,0,u*r.height)});let c=await xn(null,i,{sliceY:r.frames.length,anims:r.anims});n(c)}))}o(ol,"loadPedit");var jn,_h=(jn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glProgram");this.ctx=e,e.onDestroy(()=>this.free());let i=e.gl,l=i.createShader(i.VERTEX_SHADER),c=i.createShader(i.FRAGMENT_SHADER);if(!l||!c)throw new Error("Failed to create shader");i.shaderSource(l,n),i.shaderSource(c,r),i.compileShader(l),i.compileShader(c);let h=i.createProgram();if(this.glProgram=h,i.attachShader(h,l),i.attachShader(h,c),s.forEach((u,g)=>i.bindAttribLocation(h,g,u)),i.linkProgram(h),!i.getProgramParameter(h,i.LINK_STATUS)){let u=i.getShaderInfoLog(l);if(u)throw new Error("VERTEX SHADER "+u);let g=i.getShaderInfoLog(c);if(g)throw new Error("FRAGMENT SHADER "+g)}i.deleteShader(l),i.deleteShader(c)}bind(){this.ctx.pushProgram(this.glProgram)}unbind(){this.ctx.popProgram()}send(e){let n=this.ctx.gl;for(let r in e){let s=e[r],i=n.getUniformLocation(this.glProgram,r);if(typeof s=="number")n.uniform1f(i,s);else if(s instanceof Xr)n.uniformMatrix4fv(i,!1,new Float32Array(s.m));else if(s instanceof en)n.uniformMatrix4fv(i,!1,new Float32Array([s.a,s.b,0,0,s.c,s.d,0,0,0,0,1,0,s.e,s.f,0,1]));else if(s instanceof ie)n.uniform3f(i,s.r,s.g,s.b);else if(s instanceof q)n.uniform2f(i,s.x,s.y);else if(Array.isArray(s))s[0],xh(s)?n.uniform1fv(i,s):wh(s)?n.uniform2fv(i,s.map(l=>[l.x,l.y]).flat()):yh(s)&&n.uniform3fv(i,s.map(l=>[l.r,l.g,l.b]).flat());else throw new Error("Unsupported uniform data type")}}free(){this.ctx.gl.deleteProgram(this.glProgram)}},o(jn,"Shader"),jn);function ls(t,e=Ms,n=ks){let r=uh.replace("{{user}}",e??Ms),s=hh.replace("{{user}}",n??ks);try{return new _h(t,r,s,ii.map(i=>i.name))}catch(i){let l=/(?^\w+) SHADER ERROR: 0:(?\d+): (?.+)/,c=vh(i).match(l);if(!(c!=null&&c.groups))throw i;let h=Number(c.groups.line)-14,u=c.groups.msg.trim(),g=c.groups.type.toLowerCase();throw new Error(`${g} shader line ${h}: ${u}`)}}o(ls,"makeShader");function ll(t){if(!t)return d.gfx.defShader;if(typeof t=="string"){let e=wi(t);if(e)return e.data??e;if(Ut()<1)return null;throw new Error(`Shader not found: ${t}`)}else if(t instanceof lt)return t.data?t.data:t;return t}o(ll,"resolveShader");function wi(t){return d.assets.shaders.get(t)??null}o(wi,"getShader");function ul(t,e,n){return d.assets.shaders.addLoaded(t,ls(d.gfx.ggl,e,n))}o(ul,"loadShader");function hl(t,e,n){e=$e(e),n=$e(n);let r=o(i=>i?$o(i):Promise.resolve(null),"resolveUrl"),s=Promise.all([r(e),r(n)]).then(([i,l])=>ls(d.gfx.ggl,i,l));return d.assets.shaders.add(t,s)}o(hl,"loadShaderURL");var yt,wn=(yt=class{constructor(e){b(this,"buf");this.buf=e}static fromAudioBuffer(e){return new yt(e)}static fromArrayBuffer(e){return new Promise((n,r)=>d.audio.ctx.decodeAudioData(e,n,r)).then(n=>new yt(n))}static fromURL(e){return wo(e)?yt.fromArrayBuffer(mo(e)):el(e).then(n=>yt.fromArrayBuffer(n))}},o(yt,"SoundData"),yt);function cl(t){if(typeof t=="string"){let e=xi(t);if(e)return e;if(Ut()<1)return null;throw new Error(`Sound not found: ${t}`)}else{if(t instanceof wn)return lt.loaded(t);if(t instanceof lt)return t;throw new Error(`Invalid sound: ${t}`)}}o(cl,"resolveSound");function xi(t){return d.assets.sounds.get(t)??null}o(xi,"getSound");function dl(t,e){let n=$e(e),r;return typeof n=="string"?r=wn.fromURL(n):n instanceof ArrayBuffer?r=wn.fromArrayBuffer(n):r=Promise.resolve(wn.fromAudioBuffer(n)),d.assets.sounds.add(t,r)}o(dl,"loadSound");function fl(t,e){let n=$e(e),r=new Audio(n);return r.preload="auto",d.assets.music[t]=n}o(fl,"loadMusic");function Ai(t,e){return t=$e(t),jr(typeof e=="string"?new Promise((n,r)=>{yr(e).then(s=>{Ai(t,s).then(n).catch(r)})}):tn.from(t).then(n=>{let r={};for(let s in e){let i=e[s],l=n.frames[0],c=2048*l.w,h=2048*l.h,u=i.frames?i.frames.map(y=>new we(l.x+(i.x+y.x)/c*l.w,l.y+(i.y+y.y)/h*l.h,y.w/c*l.w,y.h/h*l.h)):bi(i.sliceX||1,i.sliceY||1,l.x+i.x/c*l.w,l.y+i.y/h*l.h,i.width/c*l.w,i.height/h*l.h),g=new tn(n.tex,u,i.anims);d.assets.sprites.addLoaded(s,g),r[s]=g}return r}))}o(Ai,"loadSpriteAtlas");var $h="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==",wt,tn=(wt=class{constructor(e,n,r={},s=null,i=null){b(this,"tex");b(this,"frames",[new we(0,0,1,1)]);b(this,"anims",{});b(this,"slice9",null);b(this,"packerId");this.tex=e,n&&(this.frames=n),this.anims=r,this.slice9=s,this.packerId=i}get width(){return this.tex.width*this.frames[0].w}get height(){return this.tex.height*this.frames[0].h}static from(e,n={}){return typeof e=="string"?wt.fromURL(e,n):Promise.resolve(wt.fromImage(e,n))}static fromImage(e,n={}){let[r,s,i]=n.singular?d.assets.packer.add_single(e):d.assets.packer.add(e),l=n.frames?n.frames.map(c=>new we(s.x+c.x*s.w,s.y+c.y*s.h,c.w*s.w,c.h*s.h)):bi(n.sliceX||1,n.sliceY||1,s.x,s.y,s.w,s.h);return new wt(r,l,n.anims,n.slice9,i)}static fromURL(e,n={}){return wr(e).then(r=>wt.fromImage(r,n))}},o(wt,"SpriteData"),wt);function rr(t){if(typeof t=="string"){let e=vi(t);if(e)return e;if(Ut()<1)return null;throw new Error(`Sprite not found: ${t}`)}else{if(t instanceof lt)return t;throw new Error(`Invalid sprite: ${t}`)}}o(rr,"resolveSprite");function vi(t){return d.assets.sprites.get(t)??null}o(vi,"getSprite");function xn(t,e,n={sliceX:1,sliceY:1,anims:{}}){return e=$e(e),Array.isArray(e)?e.some(r=>typeof r=="string")?d.assets.sprites.add(t,Promise.all(e.map(r=>typeof r=="string"?wr(r):Promise.resolve(r))).then(r=>Ts(r,n))):d.assets.sprites.addLoaded(t,Ts(e,n)):typeof e=="string"?d.assets.sprites.add(t,tn.from(e,n)):d.assets.sprites.addLoaded(t,tn.fromImage(e,n))}o(xn,"loadSprite");function bi(t=1,e=1,n=0,r=0,s=1,i=1){let l=[],c=s/t,h=i/e;for(let u=0;u{c instanceof ImageData?i.putImageData(c,h*r,0):i.drawImage(c,h*r,0)});let l=i.getImageData(0,0,t.length*r,s);return tn.fromImage(l,{...e,sliceX:t.length,sliceY:1})}o(Ts,"createSpriteSheet");function gl(t="bean"){return xn(t,$h)}o(gl,"loadBean");function zr(t,e={}){let n=null,r=null,s=null,i=new qe;if(!t)throw new Error("Please pass the resource name or data to sprite()");let l=o((u,g,y,m)=>{let E=P(1,1);return y&&m?(E.x=y/(u.width*g.w),E.y=m/(u.height*g.h)):y?(E.x=y/(u.width*g.w),E.y=E.x):m&&(E.y=m/(u.height*g.h),E.x=E.y),E},"calcTexScale"),c=o((u,g)=>{if(!g)return;let y=g.frames[0].clone();e.quad&&(y=y.scale(e.quad));let m=l(g.tex,y,e.width,e.height);if(u.width=g.tex.width*y.w*m.x,u.height=g.tex.height*y.h*m.y,g.anims)for(let E in g.anims){let p=g.anims[E];typeof p!="number"&&(p.frames=h(p))}n=g,i.trigger(n),e.anim&&u.play(e.anim)},"setSpriteData"),h=o(u=>{if(u.frames)return u.frames;let g=[];if(u.from===void 0||u.to===void 0)throw new Error("Sprite anim 'from' and 'to' must be defined if 'frames' is not defined");let y=Math.abs(u.to-u.from)+1;for(let m=0;m0;m--)g.push(g[m]);return g},"createAnimFrames");return{id:"sprite",width:0,height:0,frame:e.frame||0,quad:e.quad||new we(0,0,1,1),animSpeed:e.animSpeed??1,flipX:e.flipX??!1,flipY:e.flipY??!1,get sprite(){return t.toString()},set sprite(u){let g=rr(u);g&&g.onLoad(y=>c(this,y))},get animFrame(){if(!n||!r||s===null)return this.frame;let u=n.anims[r.name];return typeof u=="number"?u:u.from===void 0||u.to===void 0?r.frameIndex:this.frame-Math.min(u.from,u.to)},draw(){if(!n)return;let u=n.frames[this.frame??0];if(!u)throw new Error(`Frame not found: ${this.frame??0}`);if(n.slice9){let{left:g,right:y,top:m,bottom:E}=n.slice9,p=n.tex.width*u.w,T=n.tex.height*u.h,f=this.width-g-y,w=this.height-m-E,S=g/p,C=y/p,I=1-S-C,k=m/T,x=E/T,v=1-k-x,M=[ve(0,0,S,k),ve(S,0,I,k),ve(S+I,0,C,k),ve(0,k,S,v),ve(S,k,I,v),ve(S+I,k,C,v),ve(0,k+v,S,x),ve(S,k+v,I,x),ve(S+I,k+v,C,x),ve(0,0,g,m),ve(g,0,f,m),ve(g+f,0,y,m),ve(0,m,g,w),ve(g,m,f,w),ve(g+f,m,y,w),ve(0,m+w,g,E),ve(g,m+w,f,E),ve(g+f,m+w,y,E)];for(let R=0;R<9;R++){let L=M[R],D=M[R+9];gr(Object.assign(xt(this),{pos:D.pos(),tex:n.tex,quad:u.scale(L),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:D.w,height:D.h}))}}else gr(Object.assign(xt(this),{tex:n.tex,quad:u.scale(this.quad??new we(0,0,1,1)),flipX:this.flipX,flipY:this.flipY,tiled:e.tiled,width:this.width,height:this.height}))},add(){let u=rr(t);u?u.onLoad(g=>c(this,g)):us(()=>c(this,rr(t).data))},update(){if(!n||!r||s===null)return;let u=n.anims[r.name];if(typeof u=="number"){this.frame=u;return}if(u.speed===0)throw new Error("Sprite anim speed cannot be 0");if(r.timer+=d.k.dt()*this.animSpeed,r.timer>=1/r.speed){r.timer=0,r.frameIndex+=s;let g=u.frames;if(r.frameIndex>=g.length)if(r.pingpong&&!u.pingpong)s=-1,r.frameIndex=g.length-2;else if(r.loop)r.frameIndex=0;else{this.frame=g.at(-1),r.onEnd(),this.stop();return}else if(r.frameIndex<0)if(r.pingpong&&r.loop)s=1,r.frameIndex=1;else if(r.loop)r.frameIndex=g.length-1;else{this.frame=g[0],r.onEnd(),this.stop();return}this.frame=g[r.frameIndex]}},play(u,g={}){if(!n){i.add(()=>this.play(u,g));return}let y=n.anims[u];if(y===void 0)throw new Error(`Anim not found: ${u}`);r&&this.stop(),r=typeof y=="number"?{name:u,timer:0,loop:!1,pingpong:!1,speed:0,frameIndex:0,onEnd:o(()=>{},"onEnd")}:{name:u,timer:0,loop:g.loop??y.loop??!1,pingpong:g.pingpong??y.pingpong??!1,speed:g.speed??y.speed??10,frameIndex:0,onEnd:g.onEnd??(()=>{})},s=typeof y=="number"?null:1,this.frame=typeof y=="number"?y:y.frames[0],this.trigger("animStart",u)},stop(){if(!r)return;let u=r.name;r=null,this.trigger("animEnd",u)},numFrames(){return(n==null?void 0:n.frames.length)??0},getCurAnim(){return r},curAnim(){return r==null?void 0:r.name},getAnim(u){return(n==null?void 0:n.anims[u])??null},hasAnim(u){return!!this.getAnim(u)},onAnimEnd(u){return this.on("animEnd",u)},onAnimStart(u){return this.on("animStart",u)},renderArea(){return new ye(P(0),this.width,this.height)},inspect(){return typeof t=="string"?`sprite: "${t}"`:null}}}o(zr,"sprite");function pl(t,e={}){function n(s){var l,c;let i=zt(Object.assign(xt(s),{text:s.text+"",size:s.textSize,font:s.font,width:e.width&&s.width,align:s.align,letterSpacing:s.letterSpacing,lineSpacing:s.lineSpacing,transform:s.textTransform,styles:s.textStyles,indentAll:e.indentAll}));return e.width||(s.width=i.width/(((l=s.scale)==null?void 0:l.x)||1)),s.height=i.height/(((c=s.scale)==null?void 0:c.y)||1),i}o(n,"update");let r={id:"text",set text(s){t=s,n(this),this.renderedText=Wr(t).text},get text(){return t},textSize:e.size??36,font:e.font,width:e.width??0,height:0,align:e.align,lineSpacing:e.lineSpacing,letterSpacing:e.letterSpacing,textTransform:e.transform,textStyles:e.styles,renderedText:t?Wr(t).text:"",add(){us(()=>n(this))},draw(){Vt(n(this))},renderArea(){return new ye(P(0),this.width,this.height)}};return n(r),r}o(pl,"text");function ml(t,e){return{id:"rect",width:t,height:e,draw(){jt(Object.assign(xt(this),{width:this.width,height:this.height}))},renderArea(){return new ye(P(0),this.width,this.height)},inspect(){return`uvquad: (${Math.ceil(this.width)}w, ${Math.ceil(this.height)})h`}}}o(ml,"uvquad");function yl(t,e){let n=document.createElement("video"),r=!1,s=!1,i=!1,l=new Pt(d.gfx.ggl,e.width,e.height);return{width:e.width,height:e.height,get currentTime(){return n.currentTime},set currentTime(c){n.currentTime=c},get duration(){return n.duration},play(){n.play()},pause(){n.pause()},get mute(){return n.muted},set mute(c){n.muted=c},add(){n.playsInline=!0,n.loop=!0,n.autoplay=!1,n.crossOrigin="anonymous",n.addEventListener("playing",()=>{r=!0,c()},!0),n.addEventListener("timeupdate",()=>{s=!0,c()},!0),t.startsWith("http")?(console.log(`Fetching ${t}`),fetch(t,{method:"HEAD",mode:"no-cors"}).then(h=>{n.src=h.url?h.url:t})):(console.log(`Not fetching ${t}`),n.src=t);function c(){console.log(`${r} ${s}`),r&&s&&(i=!0)}o(c,"updateCopyFlag")},update(){if(i){let c=d.gfx.ggl.gl;l.bind(),c.texImage2D(c.TEXTURE_2D,0,c.RGBA,c.RGBA,c.UNSIGNED_BYTE,n),l.unbind(),console.log(`${this.currentTime}/${this.duration}`)}},draw(){i?jt({width:this.width,height:this.height,tex:l}):ze({width:this.width,height:this.height})},renderArea(){return new ye(P(0),this.width,this.height)}}}o(yl,"video");function wl(t={}){let e=null,n=null,r=null,s=null;return{id:"agent",require:["pos","tile"],agentSpeed:t.speed??100,allowDiagonals:t.allowDiagonals??!0,getDistanceToTarget(){return e?this.pos.dist(e):0},getNextLocation(){return n&&r?n[r]:null},getPath(){return n?n.slice():null},getTarget(){return e},isNavigationFinished(){return n?r===null:!0},isTargetReachable(){return n!==null},isTargetReached(){return e?this.pos.eq(e):!0},setTarget(i){e=i,n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),r=n?0:null,n&&r!==null?(s||(s=this.getLevel().onNavigationMapChanged(()=>{e&&n&&r!==null&&(n=this.getLevel().getPath(this.pos,e,{allowDiagonals:this.allowDiagonals}),n?(r=0,this.trigger("navigationNext",this,n[r])):(r=null,this.trigger("navigationEnded",this)))}),this.onDestroy(()=>s==null?void 0:s.cancel())),this.trigger("navigationStarted",this),this.trigger("navigationNext",this,n[r])):this.trigger("navigationEnded",this)},update(){if(e&&n&&r!==null){if(this.pos.sdist(n[r])<2)if(r===n.length-1){this.pos=e.clone(),r=null,this.trigger("navigationEnded",this),this.trigger("targetReached",this);return}else r++,this.trigger("navigationNext",this,n[r]);this.moveTo(n[r],this.agentSpeed)}},onNavigationStarted(i){return this.on("navigationStarted",i)},onNavigationNext(i){return this.on("navigationNext",i)},onNavigationEnded(i){return this.on("navigationEnded",i)},onTargetReached(i){return this.on("targetReached",i)},inspect(){return"agent: "+JSON.stringify({target:JSON.stringify(e),path:JSON.stringify(n)})}}}o(wl,"agent");function xl(t){let e=t.graph;return{id:"pathfinder",require:["pos"],navigateTo(n){var r;return(r=this.graph)==null?void 0:r.getWaypointPath(this.pos,n,t.navigationOpt)},get graph(){if(e)return e;let n=this.parent;for(;n;){if(n.has("pathfinderMap"))return n.graph;n=n.parent}},set graph(n){e=n}}}o(xl,"pathfinder");function Al(t={}){let e=t.waypoints,n=t.speed||100,r=t.endBehavior||"stop",s=0,i=!1;return{id:"patrol",require:["pos"],get patrolSpeed(){return n},set patrolSpeed(l){n=l},get waypoints(){return e},set waypoints(l){e=l,s=0,i=!1},get nextLocation(){return e?e[s]:void 0},update(){let l=this.nextLocation;if(!(!e||!l||i)&&(this.moveTo(l,n),this.pos.sdist(l)<9))switch(r){case"loop":s=(s+1)%e.length;break;case"ping-pong":s=s+1,s==e.length&&(e.reverse(),s=0);break;case"stop":s=Math.min(s+1,e.length-1),s==e.length-1&&(i=!0,this.trigger("patrolFinished"));break}},onPatrolFinished(l){return this.on("patrolFinished",l)}}}o(Al,"patrol");function vl(t,e={}){let n=typeof t=="function"?t:()=>d.game.root.query(t),r=e.checkFrequency||1,s=typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,i=0;return{id:"sentry",require:["pos"],direction:typeof e.direction=="number"?q.fromAngle(e.direction):e.direction,spotted:[],set directionAngle(l){this.direction=l!==void 0?q.fromAngle(l):void 0},get directionAngle(){return this.direction?this.direction.angle():void 0},fieldOfView:e.fieldOfView||200,isWithinFieldOfView(l,c,h){let u=(typeof c=="number"?q.fromAngle(c):c)||s,g=h||e.fieldOfView;if(!u||!g||g>=360)return!0;let y=g/2;return l.pos&&u.angleBetween(l.pos.sub(this.pos))<=y},hasLineOfSight(l){let c=ci(this.pos,l.pos.sub(this.pos),e.raycastExclude);return c!=null&&c.object===l},update(){if(i+=d.k.dt(),i>r){i-=r;let l=n();if(l.length&&s&&this.fieldOfView&&this.fieldOfView<360){let c=this.fieldOfView/2;l=l.filter(h=>h.pos&&s.angleBetween(h.pos.sub(this.pos))<=c)}l.length&&e.lineOfSight&&(l=l.filter(c=>c.pos&&this.hasLineOfSight(c))),l.length>0&&(this.spotted=l,this.trigger("objectSpotted",l))}},onObjectsSpotted(l){return this.on("objectSpotted",l)}}}o(vl,"sentry");function Ei(t={}){let e=P(0),n=t.isObstacle??!1,r=t.cost??0,s=t.edges??[],i=o(()=>{let c={left:1,top:2,right:4,bottom:8};return s.map(h=>c[h]||0).reduce((h,u)=>h|u,0)},"getEdgeMask"),l=i();return{id:"tile",tilePosOffset:t.offset??P(0),set tilePos(c){let h=this.getLevel();e=c.clone(),this.pos=P(this.tilePos.x*h.tileWidth(),this.tilePos.y*h.tileHeight()).add(this.tilePosOffset)},get tilePos(){return e},set isObstacle(c){n!==c&&(n=c,this.getLevel().invalidateNavigationMap())},get isObstacle(){return n},set cost(c){r!==c&&(r=c,this.getLevel().invalidateNavigationMap())},get cost(){return r},set edges(c){s=c,l=i(),this.getLevel().invalidateNavigationMap()},get edges(){return s},get edgeMask(){return l},getLevel(){return this.parent},tileMove(c){let h=this.getLevel();h.removeFromSpatialMap(this),this.tilePos=this.tilePos.add(c),h.insertIntoSpatialMap(this),h.trigger("spatialMapChanged")},moveLeft(){this.tileMove(P(-1,0))},moveRight(){this.tileMove(P(1,0))},moveUp(){this.tileMove(P(0,-1))},moveDown(){this.tileMove(P(0,1))}}}o(Ei,"tile");var zn,Si=(zn=class{constructor(e,n,r){b(this,"name");b(this,"duration");b(this,"loops");b(this,"direction");b(this,"easing");b(this,"interpolation");b(this,"isFinished");b(this,"timing");b(this,"easings");b(this,"relative");this.name=e,this.duration=n.duration,this.loops=n.loops||0,this.direction=n.direction||"forward",this.easing=n.easing||ur.linear,this.interpolation=n.interpolation||"linear",this.isFinished=!1,this.timing=n.timing,this.easings=n.easings,this.relative=r}update(e,n){return!0}getLowerKeyIndexAndRelativeTime(e,n,r){let s=n-1,i=e/this.duration;if(this.loops!==0&&i>=this.loops)return[s,0,!0];let l=Math.trunc(i);if(i-=l,(this.direction=="reverse"||this.direction=="ping-pong"&&l&1)&&(i=1-i),r){let c=0;for(;r[c+1]!==void 0&&r[c+1]=s?[s,0,!0]:[c,(i-r[c])/(r[c+1]-r[c]),!1]}else{let c=Math.floor((n-1)*i);return[c,(i-c/s)*s,!1]}}setValue(e,n,r){if(this.relative)switch(n){case"pos":e.pos=e.base.pos.add(r);break;case"angle":e.angle=e.base.angle+r;break;case"scale":e.scale=e.base.scale.scale(r);break;case"opacity":e.opacity=e.base.opacity*r;break;default:e[n]=r}else e[n]=r}serialize(){let e={duration:this.duration,keys:[]};return this.loops&&(e.loops=this.loops),this.direction!=="forward"&&(e.direction=this.direction),this.easing!=ur.linear&&(e.easing=this.easing.name),this.interpolation!=="linear"&&(e.interpolation=this.interpolation),this.timing&&(e.timing=this.timing),this.easings&&(e.easings=this.easings.map(n=>this.easing.name)),e}},o(zn,"AnimateChannel"),zn);function Is(t,e){return e.add(e.sub(t))}o(Is,"reflect");var Vn,ec=(Vn=class extends Si{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation==="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,Fe(this.keys[s],this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Vn,"AnimateChannelNumber"),Vn),Gn,tc=(Gn=class extends Si{constructor(n,r,s,i,l){var c;super(n,s,i);b(this,"keys");b(this,"curves");b(this,"dcurves");if(this.keys=r,this.interpolation==="spline"){this.curves=[],l&&(this.dcurves=[]);for(let h=0;h0?this.keys[h-1]:Is(y,u),E=g[n.x,n.y])})}},o(Gn,"AnimateChannelVec2"),Gn),Hn,nc=(Hn=class extends Si{constructor(n,r,s,i){super(n,s,i);b(this,"keys");this.keys=r}update(n,r){let[s,i,l]=this.getLowerKeyIndexAndRelativeTime(r,this.keys.length,this.timing);if(i==0||this.interpolation=="none")this.setValue(n,this.name,this.keys[s]);else{let c=this.easings?this.easings[s]:this.easing;this.setValue(n,this.name,this.keys[s].lerp(this.keys[s+1],c(i)))}return l}serialize(){return Object.assign(super.serialize(),{keys:this.keys})}},o(Hn,"AnimateChannelColor"),Hn);function bl(t={}){let e=[],n=0,r=!1;return{id:"animate",require:t.followMotion?["rotate"]:void 0,base:{pos:P(0,0),angle:0,scale:P(1,1),opacity:1},animation:{paused:!1,seek(s){n=ot(s,0,this.duration),e.forEach(i=>{i.isFinished=!1}),r=!1},get duration(){return e.reduce((s,i)=>Math.max(i.duration,s),0)}},add(){t.relative&&(this.has("pos")&&(this.base.pos=this.pos.clone()),this.has("rotate")&&(this.base.angle=this.angle),this.has("scale")&&(this.base.scale=this.scale),this.has("opacity")&&(this.base.opacity=this.opacity))},update(){if(this.animation.paused)return;let s=!0,i;n+=d.k.dt();for(let l of e)i=l.update(this,n),i&&!l.isFinished&&(l.isFinished=!0,this.trigger("animateChannelFinished",l.name)),s&&(s=i);s&&!r&&(r=!0,this.trigger("animateFinished"))},animate(s,i,l){r=!1,this.unanimate(s),typeof i[0]=="number"?e.push(new ec(s,i,l,t.relative||!1)):i[0]instanceof q?e.push(new tc(s,i,l,t.relative||!1,s==="pos"&&(t.followMotion||!1))):i[0]instanceof ie&&e.push(new nc(s,i,l,t.relative||!1))},unanimate(s){let i=e.findIndex(l=>l.name===s);i>=0&&e.splice(i,1)},unanimateAll(){e.splice(0,e.length)},onAnimateFinished(s){return this.on("animateFinished",s)},onAnimateChannelFinished(s){return this.on("animateChannelFinished",s)},serializeAnimationChannels(){return e.reduce((s,i)=>(s[i.name]=i.serialize(),s),{})},serializeAnimationOptions(){let s={};return t.followMotion&&(s.followMotion=!0),t.relative&&(s.relative=!0),s}}}o(bl,"animate");function Mi(t,e){let n={name:t.name};return t.has("animate")&&(n.channels=t.serializeAnimationChannels(),Object.assign(n,t.serializeAnimationOptions())),t.children.length>0&&(n.children=t.children.filter(r=>r.has("named")).map(r=>Mi(r,r.name))),n}o(Mi,"serializeAnimation");function Bs(t=2,e=1){let n=0;return{require:["scale"],update(){let r=Math.sin(n*t)*e;r<0&&this.destroy(),this.scale=P(r),n+=d.k.dt()}}}o(Bs,"boom");var rc=o((t={followMouse:!0})=>{let e=!1;return{id:"fakeMouse",require:["pos"],get isPressed(){return e},update(){t.followMouse&&d.k.isMouseMoved()&&(this.pos=cs())},press(){e=!0,this.trigger("press")},release(){e=!1,this.trigger("release")},onPress(n){this.on("press",n)},onRelease(n){this.on("release",n)}}},"fakeMouse");function El(t,e){if(t==null)throw new Error("health() requires the initial amount of hp");return{id:"health",hurt(n=1){this.setHP(t-n),this.trigger("hurt",n)},heal(n=1){let r=t;this.setHP(t+n),this.trigger("heal",t-r)},hp(){return t},maxHP(){return e??null},setMaxHP(n){e=n},setHP(n){t=e?Math.min(e,n):n,t<=0&&this.trigger("death")},onHurt(n){return this.on("hurt",n)},onHeal(n){return this.on("heal",n)},onDeath(n){return this.on("death",n)},inspect(){return`health: ${t}`}}}o(El,"health");function Sl(t,e={}){if(t==null)throw new Error("lifespan() requires time");let n=e.fade??0;return{id:"lifespan",require:["opacity"],add(){d.game.root.wait(t,()=>{this.opacity=this.opacity??1,n>0?d.game.root.tween(this.opacity,0,n,r=>this.opacity=r,ur.linear).onEnd(()=>{this.destroy()}):this.destroy()})}}}o(Sl,"lifespan");function Ml(t){return{id:"named",name:t}}o(Ml,"named");function kl(t,e,n){if(!t)throw new Error("state() requires an initial state");let r={};function s(h){r[h]||(r[h]={enter:new qe,end:new qe,update:new qe,draw:new qe})}o(s,"initStateEvents");function i(h,u,g){return s(u),r[u][h].add(g)}o(i,"on");function l(h,u,...g){s(u),r[u][h].trigger(...g)}o(l,"trigger");let c=!1;return{id:"state",state:t,enterState(h,...u){if(c=!0,e&&!e.includes(h))throw new Error(`State not found: ${h}`);let g=this.state;if(n){if(!(n!=null&&n[g]))return;let y=typeof n[g]=="string"?[n[g]]:n[g];if(!y.includes(h))throw new Error(`Cannot transition state from "${g}" to "${h}". Available transitions: ${y.map(m=>`"${m}"`).join(", ")}`)}l("end",g,...u),this.state=h,l("enter",h,...u),l("enter",`${g} -> ${h}`,...u)},onStateTransition(h,u,g){return i("enter",`${h} -> ${u}`,g)},onStateEnter(h,u){return i("enter",h,u)},onStateUpdate(h,u){return i("update",h,u)},onStateDraw(h,u){return i("draw",h,u)},onStateEnd(h,u){return i("end",h,u)},update(){c||(l("enter",t),c=!0),l("update",this.state)},draw(){l("draw",this.state)},inspect(){return`state: ${this.state}`}}}o(kl,"state");function ki(t){return{id:"stay",stay:!0,scenesToStay:t}}o(ki,"stay");function Pl(t=!0,e){let n,r;return{id:"textInput",hasFocus:t,require:["text"],typedText:"",add(){let s=o(()=>{this.text=this.typedText.replace(/([\[\\])/g,"\\$1")},"flip");n=d.k.onCharInput(i=>{this.hasFocus&&(!e||this.typedText.length{this.hasFocus&&(this.typedText=this.typedText.slice(0,-1)),s()})},destroy(){n.cancel(),r.cancel()}}}o(Pl,"textInput");function Vr(t=1e3){return{id:"timer",maxLoopsPerFrame:t,loop(e,n,r=-1,s=!1){let i=s?0:e,l=new qe,c=this.onUpdate(()=>{i+=d.app.state.dt;for(let h=0;i>=e&&h{}),1,!0)},tween(e,n,r,s,i=ur.linear){let l=0,c=[],h=this.onUpdate(()=>{l+=d.app.state.dt;let u=Math.min(l/r,1);s(Fe(e,n,i(u))),u===1&&(h.cancel(),s(n),c.forEach(g=>g()))});return{get paused(){return h.paused},set paused(u){h.paused=u},onEnd(u){c.push(u)},then(u){return this.onEnd(u),this},cancel(){h.cancel()},finish(){h.cancel(),s(n),c.forEach(u=>u())}}}}}o(Vr,"timer");var Rs=0;function Fs(){return Rs>0}o(Fs,"usesArea");var Et=null,aa=!1;function Cl(t={}){let e={},n=new Set,r=[];return!Et&&!aa&&(Et=d.k.get("fakeMouse")[0],aa=!0),{id:"area",collisionIgnore:t.collisionIgnore??[],restitution:t.restitution,friction:t.friction,add(){Rs++,this.area.cursor&&r.push(this.onHover(()=>d.app.setCursor(this.area.cursor))),r.push(this.onCollideUpdate((s,i)=>{if(!s.id)throw new Error("area() requires the object to have an id");e[s.id]||this.trigger("collide",s,i),i&&(e[s.id]=i,n.add(s.id))}))},destroy(){Rs--;for(let s of r)s.cancel()},fixedUpdate(){for(let s in e)n.has(Number(s))||(this.trigger("collideEnd",e[s].target),delete e[s]);n.clear()},drawInspect(){let s=this.localArea();Ke(),rt(this.area.offset.x,this.area.offset.y);let i={outline:{width:4/Vi(),color:he(0,0,255)},anchor:this.anchor,fill:!1,fixed:Mt(this)};s instanceof ye?ze({...i,pos:s.pos,width:s.width*this.area.scale.x,height:s.height*this.area.scale.y}):s instanceof Be?Ct({...i,pts:s.pts,scale:this.area.scale}):s instanceof Oe&&an({...i,pos:s.center,radius:s.radius}),je()},area:{shape:t.shape??null,scale:t.scale?P(t.scale):P(1),offset:t.offset??P(0),cursor:t.cursor??null},isClicked(){return Et?Et.isPressed&&this.isHovering():d.app.isMousePressed()&&this.isHovering()},isHovering(){if(Et){let i=Mt(this)?Et.pos:d.k.toWorld(Et.pos);return this.hasPoint(i)}let s=Mt(this)?d.k.mousePos():d.k.toWorld(d.k.mousePos());return this.hasPoint(s)},checkCollision(s){if(!s.id)throw new Error("checkCollision() requires the object to have an id");return e[s.id]??null},getCollisions(){return Object.values(e)},isColliding(s){if(!s.id)throw new Error("isColliding() requires the object to have an id");return!!e[s.id]},isOverlapping(s){if(!s.id)throw new Error("isOverlapping() requires the object to have an id");let i=e[s.id];return i&&i.hasOverlap()},onClick(s,i="left"){Et&&Et.onPress(()=>{this.isHovering()&&s()});let l=d.k.onMousePress(i,()=>{this.isHovering()&&s()});return r.push(l),l},onHover(s){let i=!1;return this.onUpdate(()=>{i?i=this.isHovering():this.isHovering()&&(i=!0,s())})},onHoverUpdate(s){return this.onUpdate(()=>{this.isHovering()&&s()})},onHoverEnd(s){let i=!1;return this.onUpdate(()=>{i?this.isHovering()||(i=!1,s()):i=this.isHovering()})},onCollide(s,i){if(typeof s=="function"&&i===void 0)return this.on("collide",s);if(typeof s=="string")return this.onCollide((l,c)=>{l.is(s)&&(i==null||i(l,c))});throw new Error("onCollide() requires either a function or a tag")},onCollideUpdate(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideUpdate",s);if(typeof s=="string")return this.on("collideUpdate",(l,c)=>l.is(s)&&(i==null?void 0:i(l,c)));throw new Error("onCollideUpdate() requires either a function or a tag")},onCollideEnd(s,i){if(typeof s=="function"&&i===void 0)return this.on("collideEnd",s);if(typeof s=="string")return this.on("collideEnd",l=>l.is(s)&&(i==null?void 0:i(l)));throw new Error("onCollideEnd() requires either a function or a tag")},hasPoint(s){return this.worldArea().contains(s)},resolveCollision(s){let i=this.checkCollision(s);i&&!i.resolved&&(this.pos=this.pos.add(i.displacement),i.resolved=!0)},localArea(){return this.area.shape?this.area.shape:this.renderArea()},worldArea(){let s=this.localArea(),i=this.transform.clone().translateSelfV(this.area.offset).scaleSelfV(P(this.area.scale??1));if(s instanceof ye){let l=sn(this.anchor||ns).add(1,1).scale(-.5).scale(s.width,s.height);i.translateSelfV(l)}return s.transform(i)},screenArea(){let s=this.worldArea();return Mt(this)?s:s.transform(d.game.cam.transform)},inspect(){var s,i,l,c,h,u,g;return((s=this.area.scale)==null?void 0:s.x)==((i=this.area.scale)==null?void 0:i.y)?`area: ${(c=(l=this.area.scale)==null?void 0:l.x)==null?void 0:c.toFixed(1)}x`:`area: (${(u=(h=this.area.scale)==null?void 0:h.x)==null?void 0:u.toFixed(1)}x, ${(g=this.area.scale.y)==null?void 0:g.toFixed(1)}y)`}}}o(Cl,"area");function ql(t={}){let e=null,n=null,r=!1,s=P(0),i=null,l=null,c;return{id:"body",require:["pos"],vel:P(0),damping:t.damping??0,jumpForce:t.jumpForce??gh,gravityScale:t.gravityScale??1,isStatic:t.isStatic??!1,mass:t.mass??1,add(){if(i=this.pos.clone(),l=this.pos.clone(),c=this.pos.clone(),this.mass===0)throw new Error("Can't set body mass to 0");this.has("area")&&(this.onCollideUpdate((h,u)=>{if(!u||!h.has("body")||u.resolved)return;this.trigger("beforePhysicsResolve",u);let g=u.reverse();if(h.trigger("beforePhysicsResolve",g),!(u.resolved||g.resolved)&&!(this.isStatic&&h.isStatic)){if(!this.isStatic&&!h.isStatic){let y=this.mass+h.mass;this.pos=this.pos.add(u.displacement.scale(h.mass/y)),h.pos=h.pos.add(u.displacement.scale(-this.mass/y)),Xt(this,this.transform),Xt(h,h.transform)}else{let y=!this.isStatic&&h.isStatic?u:u.reverse();y.source.pos=y.source.pos.add(y.displacement),Xt(y.source,y.source.transform)}u.resolved=!0,this.trigger("physicsResolve",u),h.trigger("physicsResolve",u.reverse())}}),this.onPhysicsResolve(h=>{if(d.game.gravity)if(h.isBottom()&&this.isFalling()){let E=e;e=h.target,E!=e&&(n=h.target.pos),r?r=!1:E||(this.trigger("ground",e),h.target.trigger("land",this))}else h.isTop()&&this.isJumping()&&(this.trigger("headbutt",h.target),h.target.trigger("headbutted",this));let u=Math.max(h.source.restitution||0,h.target.restitution||0),g=Math.sqrt((h.source.friction||0)*(h.target.friction||0)),y=this.vel.project(h.normal),m=this.vel.sub(y);this.vel.dot(h.normal)<0&&(this.vel=m.sub(y.scale(u))),g!=0&&(this.vel=this.vel.sub(m.scale(g)))}))},update(){e&&this.isColliding(e)&&e.exists()&&e.has("body")&&(n&&!e.pos.eq(n)&&t.stickToPlatform!==!1&&this.moveBy(e.pos.sub(n)),n=e.pos);let h=d.k.restDt();h&&(this.pos.x==c.x&&(this.pos.x=Fe(i.x,l.x,h/d.k.fixedDt()),c.x=this.pos.x),this.pos.y==c.y&&(this.pos.y=Fe(i.y,l.y,h/d.k.fixedDt()),c.y=this.pos.y))},fixedUpdate(){if(i&&(this.pos.x==c.x&&(this.pos.x=i.x),this.pos.y==c.y&&(this.pos.y=i.y),i=null),d.game.gravity&&!this.isStatic){r&&(e=null,n=null,this.trigger("fallOff"),r=!1),e&&(!this.isColliding(e)||!e.exists()||!e.has("body"))&&(r=!0);let h=this.vel.clone();this.vel=this.vel.add(d.game.gravity.scale(this.gravityScale*d.k.dt()));let u=t.maxVelocity??ph;this.vel.slen()>u*u&&(this.vel=this.vel.unit().scale(u)),h.dot(d.game.gravity)<0&&this.vel.dot(d.game.gravity)>=0&&this.trigger("fall")}if(this.vel.x+=s.x*d.k.dt(),this.vel.y+=s.y*d.k.dt(),this.vel.x*=1/(1+this.damping*d.k.dt()),this.vel.y*=1/(1+this.damping*d.k.dt()),this.move(this.vel),d.k.restDt()){i=this.pos.clone();let h=this.vel.add(s.scale(d.k.dt()));l=this.pos.add(h.scale(d.k.dt())),c=this.pos.clone()}s.x=0,s.y=0},onPhysicsResolve(h){return this.on("physicsResolve",h)},onBeforePhysicsResolve(h){return this.on("beforePhysicsResolve",h)},curPlatform(){return e},isGrounded(){return e!==null},isFalling(){return this.vel.dot(sr())>0},isJumping(){return this.vel.dot(sr())<0},applyImpulse(h){this.isStatic||(this.vel=this.vel.add(h))},addForce(h){this.isStatic||(s.x+=h.x/this.mass,s.y+=h.y/this.mass)},jump(h){this.isStatic||(e=null,n=null,this.vel=sr().scale(-h||-this.jumpForce))},onGround(h){return this.on("ground",h)},onFall(h){return this.on("fall",h)},onFallOff(h){return this.on("fallOff",h)},onHeadbutt(h){return this.on("headbutt",h)},onLand(h){return this.on("land",h)},onHeadbutted(h){return this.on("headbutted",h)},inspect(){return`gravityScale: ${this.gravityScale}x`}}}o(ql,"body");function Tl(t=2){let e=t;return{id:"doubleJump",require:["body"],numJumps:t,add(){this.onGround(()=>{e=this.numJumps})},doubleJump(n){e<=0||(e{var l;if(!e.has("body"))return;let r=n==null?void 0:n.normal.normal(),s=e.vel.project(r),i=(l=r==null?void 0:r.scale(this.speed))==null?void 0:l.sub(s);e.addForce(i==null?void 0:i.scale(e.mass*this.forceScale))})}}}o(Il,"surfaceEffector");function Bl(t){return{id:"areaEffector",require:["area"],force:t.force,linearDrag:t.linearDrag??0,useGlobalAngle:t.useGlobalAngle??!0,add(){this.onCollideUpdate(e=>{e.has("body")&&(e.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation())),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag)))})}}}o(Bl,"areaEffector");function Rl(t){return{id:"pointEffector",require:["area","pos"],forceMagnitude:t.forceMagnitude,distanceScale:t.distanceScale??1,forceMode:t.forceMode||"inverseLinear",linearDrag:t.linearDrag??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=this.pos.sub(e.pos),s=r.len(),i=s*this.distanceScale/10,l=this.forceMode==="constant"?1:this.forceMode==="inverseLinear"?1/i:1/i**2,c=r.scale(this.forceMagnitude*l/s);e.addForce(c),this.linearDrag&&e.addForce(e.vel.scale(-this.linearDrag))})}}}o(Rl,"pointEffector");function Fl(t){return{id:"constantForce",require:["body"],force:t.force,useGlobalAngle:t.useGlobalAngle??!0,update(){this.force&&this.addForce(this.useGlobalAngle?this.force:this.force.rotate(this.transform.getRotation()))}}}o(Fl,"constantForce");function Ol(t={}){return t.ignoreSides??(t.ignoreSides=[q.UP]),t.shouldCollide??(t.shouldCollide=(e,n)=>{var r;return((r=t.ignoreSides)==null?void 0:r.findIndex(s=>s.sdist(n){this.platformIgnore.has(e.target)?e.preventResolution():t.shouldCollide.call(this,e.target,e.normal)||(e.preventResolution(),this.platformIgnore.add(e.target))}),this.onCollideEnd(e=>{this.platformIgnore.delete(e)})}}}o(Ol,"platformEffector");function Ll(t){return{id:"buoyancyEffector",require:["area"],surfaceLevel:t.surfaceLevel,density:t.density??1,linearDrag:t.linearDrag??1,angularDrag:t.angularDrag??.2,flowAngle:t.flowAngle??0,flowMagnitude:t.flowMagnitude??0,flowVariation:t.flowVariation??0,add(){this.onCollideUpdate((e,n)=>{if(!e.has("body"))return;let r=e,s=r.worldArea(),i=s instanceof Be?s:new Be(s.bbox().points()),[l,c]=i.cut(P(-100,this.surfaceLevel),P(100,this.surfaceLevel));l&&(this.applyBuoyancy(r,l),this.applyDrag(r,l)),this.flowMagnitude&&r.addForce(q.fromAngle(this.flowAngle).scale(this.flowMagnitude))})},applyBuoyancy(e,n){let r=this.density*n.area(),s=P(0,1).scale(-r);e.addForce(s)},applyDrag(e,n){let r=e.vel,s=this.density*this.linearDrag,i=r.scale(-s);e.addForce(i)}}}o(Ll,"buoyancyEffector");function Gr(t){if(!t)throw new Error("Please define an anchor");return{id:"anchor",anchor:t,inspect(){return typeof this.anchor=="string"?"anchor: "+this.anchor:"anchor: "+this.anchor.toString()}}}o(Gr,"anchor");function Pi(){return{id:"fixed",fixed:!0}}o(Pi,"fixed");function Dl(t,e){return{id:"follow",require:["pos"],follow:{obj:t,offset:e??P(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))}}}o(Dl,"follow");function Nl(t){var n;let e=(n=d.game.layers)==null?void 0:n.indexOf(t);return{id:"layer",get layerIndex(){return e??null},get layer(){var r;return e?((r=d.game.layers)==null?void 0:r[e])??null:null},set layer(r){var s;if(e=(s=d.game.layers)==null?void 0:s.indexOf(r),e==-1)throw Error("Invalid layer name")},inspect(){return`layer: ${this.layer}`}}}o(Nl,"layer");function Ul(t,e){let n=typeof t=="number"?q.fromAngle(t):t.unit();return{id:"move",require:["pos"],update(){this.move(n.scale(e))}}}o(Ul,"move");function jl(t={}){let e=t.distance??fh,n=!1,r=o(s=>{s.isOffScreen()?(n||(s.trigger("exitView"),n=!0),t.hide&&(s.hidden=!0),t.pause&&(s.paused=!0),t.destroy&&s.destroy()):(n&&(s.trigger("enterView"),n=!1),t.hide&&(s.hidden=!1),t.pause&&(s.paused=!1))},"check");return{id:"offscreen",require:["pos"],isOffScreen(){let s=this.screenPos();if(!s)return!1;let i=new ye(P(0),Ee(),Pe());return!pr(i,s)&&i.sdistToPoint(s)>e*e},onExitScreen(s){return this.on("exitView",s)},onEnterScreen(s){return this.on("enterView",s)},add(){t.pause&&t.unpause?Hl(()=>r(this)):this.onUpdate(()=>r(this))}}}o(jl,"offscreen");function cr(...t){return{id:"pos",pos:P(...t),moveBy(...e){this.pos=this.pos.add(P(...e))},move(...e){this.moveBy(P(...e).scale(d.k.dt()))},moveTo(...e){if(typeof e[0]=="number"&&typeof e[1]=="number")return this.moveTo(P(e[0],e[1]),e[2]);let n=e[0],r=e[1];if(r===void 0){this.pos=P(n);return}let s=n.sub(this.pos);if(s.len()<=r*d.k.dt()){this.pos=P(n);return}this.move(s.unit().scale(r))},worldPos(e=null){return e?(this.pos=this.pos.add(this.fromWorld(e)),null):this.parent?this.parent.transform.transformPoint(this.pos,P()):this.pos},toWorld(e){return this.parent?this.parent.transform.transformPoint(this.pos.add(e),P()):this.pos.add(e)},fromWorld(e){return this.parent?this.parent.transform.inverse.transformPoint(e,P()).sub(this.pos):e.sub(this.pos)},screenPos(e=null){if(e)return this.pos=this.pos.add(this.fromScreen(e)),null;{let n=this.worldPos();return n?Mt(this)?n:Hr(n):null}},toScreen(e){let n=this.toWorld(e);return Mt(this)?n:Hr(n)},fromScreen(e){return Mt(this)?this.fromWorld(e):this.fromWorld(Oi(e))},toOther(e,n){return e.fromWorld(this.toWorld(n))},fromOther(e,n){return e.toOther(this,n)},inspect(){return`pos: (${Math.round(this.pos.x)}x, ${Math.round(this.pos.y)}y)`},drawInspect(){an({color:he(255,0,0),radius:4/Vi()})}}}o(cr,"pos");function zl(t){return{id:"rotate",angle:t??0,rotateBy(e){this.angle+=e},rotateTo(e){this.angle=e},inspect(){return`angle: ${Math.round(this.angle)}`}}}o(zl,"rotate");function dr(...t){if(t.length===0)return dr(1);let e=P(...t);return{id:"scale",set scale(n){if(!(n instanceof q))throw Error("The scale property on scale is a vector. Use scaleTo or scaleBy to set the scale with a number.");e=P(n)},get scale(){return e},scaleTo(...n){e=P(...n)},scaleBy(...n){e=e.scale(P(...n))},inspect(){return e.x==e.y?`scale: ${e.x.toFixed(1)}x`:`scale: (${e.x.toFixed(1)}x, ${e.y.toFixed(1)}y)`}}}o(dr,"scale");function Vl(t){return{id:"z",z:t,inspect(){return`z: ${this.z}`}}}o(Vl,"z");function Gl(t,e){if(!e.tileWidth||!e.tileHeight)throw new Error("Must provide tileWidth and tileHeight.");let n=d.game.root.add([cr(e.pos??P(0))]),r=t.length,s=0,i=null,l=null,c=null,h=null,u=o(x=>x.x+x.y*s,"tile2Hash"),g=o(x=>P(Math.floor(x%s),Math.floor(x/s)),"hash2Tile"),y=o(()=>{i=[];for(let x of n.children)m(x)},"createSpatialMap"),m=o(x=>{let v=u(x.tilePos);i[v]?i[v].push(x):i[v]=[x]},"insertIntoSpatialMap"),E=o(x=>{let v=u(x.tilePos);if(i[v]){let M=i[v].indexOf(x);M>=0&&i[v].splice(M,1)}},"removeFromSpatialMap"),p=o(()=>{let x=!1;for(let v of n.children){let M=n.pos2Tile(v.pos);(v.tilePos.x!=M.x||v.tilePos.y!=M.y)&&(x=!0,E(v),v.tilePos.x=M.x,v.tilePos.y=M.y,m(v))}x&&n.trigger("spatialMapChanged")},"updateSpatialMap"),T=o(()=>{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();l?l.length=v:l=new Array(v),l.fill(1,0,v);for(let M=0;M{let x=n.getSpatialMap(),v=n.numRows()*n.numColumns();c?c.length=v:c=new Array(v),c.fill(15,0,v);for(let M=0;M{let x=n.numRows()*n.numColumns(),v=o((R,L)=>{let D=[];for(D.push(R);D.length>0;){let O=D.pop();I(O).forEach(z=>{h[z]<0&&(h[z]=L,D.push(z))})}},"traverse");h?h.length=x:h=new Array(x),h.fill(-1,0,x);let M=0;for(let R=0;R=0){M++;continue}v(R,M),M++}},"createConnectivityMap"),S=o((x,v)=>l[v],"getCost"),C=o((x,v)=>{let M=g(x),R=g(v);return M.dist(R)},"getHeuristic"),I=o((x,v)=>{let M=[],R=Math.floor(x%s),L=R>0&&c[x]&1&&l[x-1]!==1/0,D=x>=s&&c[x]&2&&l[x-s]!==1/0,O=R{if(typeof x=="string"){if(e.tiles[x]){if(typeof e.tiles[x]!="function")throw new Error("Level symbol def must be a function returning a component list");return e.tiles[x](M)}else if(e.wildcardTile)return e.wildcardTile(x,M)}else{if(Array.isArray(x))return x;throw new Error("Expected a symbol or a component list")}})();if(!R)return null;let L=!1,D=!1;for(let z of R)z.id==="tile"&&(D=!0),z.id==="pos"&&(L=!0);L||R.push(cr(this.tile2Pos(M))),D||R.push(Ei());let O=n.add(R);return L&&(O.tilePosOffset=O.pos.clone()),O.tilePos=M,Xt(O,O.transform),i&&(m(O),this.trigger("spatialMapChanged"),this.trigger("navigationMapInvalid")),O},numColumns(){return s},numRows(){return r},levelWidth(){return s*this.tileWidth()},levelHeight(){return r*this.tileHeight()},tile2Pos(...x){return P(...x).scale(this.tileWidth(),this.tileHeight())},pos2Tile(...x){let v=P(...x);return P(Math.floor(v.x/this.tileWidth()),Math.floor(v.y/this.tileHeight()))},getSpatialMap(){return i||y(),i},removeFromSpatialMap:E,insertIntoSpatialMap:m,onSpatialMapChanged(x){return this.on("spatialMapChanged",x)},onNavigationMapInvalid(x){return this.on("navigationMapInvalid",x)},getAt(x){i||y();let v=u(x);return i[v]||[]},raycast(x,v){let M=this.toWorld(x),R=this.toWorld(x.add(v)).sub(M),L=1/this.tileWidth(),D=x.scale(L),O=za(D,v,z=>{let te=this.getAt(z);if(te.some($=>$.isObstacle))return!0;let W=null;for(let $ of te)if($.has("area")){let Q=$.worldArea().raycast(M,R);Q&&(W?Q.fraction=s||x.y<0||x.y>=r||v.x<0||v.x>=s||v.y<0||v.y>=r)return null;let R=u(x),L=u(v);if(l[L]===1/0)return null;if(R===L)return[];if(h[R]!=-1&&h[R]!==h[L])return null;let D=new go((ne,Y)=>ne.costO.scale(R,L).add(R/2,L/2)),v]:null}};return n.use(k),n.onNavigationMapInvalid(()=>{n.invalidateNavigationMap(),n.trigger("navigationMapChanged")}),t.forEach((x,v)=>{let M=x.split("");s=Math.max(M.length,s),M.forEach((R,L)=>{n.spawn(R,P(L,v))})}),n}o(Gl,"addLevel");function Ve(t,e,n){let r=!1,s=new Map,i=o(h=>{let u=h.on(t,(...g)=>{n(h,...g)});u.paused=r,s.has(h)&&s.get(h).cancel(),s.set(h,u)},"handleNew"),l=d.game.events.on("tag",(h,u)=>{u===e&&i(h)}),c=d.game.events.on("untag",(h,u)=>{u===e&&(s.get(h).cancel(),s.delete(h))});return d.game.root.get(e,{recursive:!0}).forEach(i),{get paused(){return r},set paused(h){r=h,s.forEach(u=>u.paused=h)},cancel(){s.forEach(h=>h.cancel()),s.clear(),l.cancel(),c.cancel()}}}o(Ve,"on");var sc=o((t,e,...n)=>{for(let r of d.game.root.children)r.is(e)&&r.trigger(t,n)},"trigger"),ic=pe(t=>{let e=d.game.root.add([{fixedUpdate:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ve("fixedUpdate",t,e)),Hl=pe(t=>{let e=d.game.root.add([{update:t}]);return{get paused(){return e.paused},set paused(n){e.paused=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ve("update",t,e)),ac=pe(t=>{let e=d.game.root.add([{draw:t}]);return{get paused(){return e.hidden},set paused(n){e.hidden=n},cancel:o(()=>e.destroy(),"cancel")}},(t,e)=>Ve("draw",t,e)),Os=pe(t=>d.game.events.on("add",t),(t,e)=>Ve("add",t,e)),oa=pe(t=>d.game.events.on("destroy",t),(t,e)=>Ve("destroy",t,e)),la=pe(t=>d.game.events.on("use",t),(t,e)=>Ve("use",t,e)),ua=pe(t=>d.game.events.on("unuse",t),(t,e)=>Ve("unuse",t,e)),Kl=pe(t=>d.game.events.on("tag",t),(t,e)=>Ve("tag",t,e)),oc=pe(t=>d.game.events.on("untag",t),(t,e)=>Ve("untag",t,e));function Wl(t,e,n){return Ve("collide",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Wl,"onCollide");function Yl(t,e,n){return Ve("collideUpdate",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Yl,"onCollideUpdate");function Xl(t,e,n){return Ve("collideEnd",t,(r,s,i)=>s.is(e)&&n(r,s,i))}o(Xl,"onCollideEnd");function xr(t,e){d.game.root.get(t,{recursive:!0}).forEach(e),Os(t,e),Kl((n,r)=>{r===t&&e(n)})}o(xr,"forAllCurrentAndFuture");var lc=pe(t=>d.app.onMousePress(t),(t,e)=>{let n=[];return xr(t,r=>{if(!r.area)throw new Error("onClick() requires the object to have area() component");n.push(r.onClick(()=>e(r)))}),rn.join(n)});function Jl(t,e){let n=[];return xr(t,r=>{if(!r.area)throw new Error("onHover() requires the object to have area() component");n.push(r.onHover(()=>e(r)))}),rn.join(n)}o(Jl,"onHover");function Ql(t,e){let n=[];return xr(t,r=>{if(!r.area)throw new Error("onHoverUpdate() requires the object to have area() component");n.push(r.onHoverUpdate(()=>e(r)))}),rn.join(n)}o(Ql,"onHoverUpdate");function Zl(t,e){let n=[];return xr(t,r=>{if(!r.area)throw new Error("onHoverEnd() requires the object to have area() component");n.push(r.onHoverEnd(()=>e(r)))}),rn.join(n)}o(Zl,"onHoverEnd");function _l(t){return d.game.events.on("loading",t)}o(_l,"onLoading");function $l(t){return d.app.onResize(t)}o($l,"onResize");function eu(t){return d.game.events.on("error",t)}o(eu,"onError");function us(t){if(d.assets.loaded)t();else return d.game.events.on("load",t)}o(us,"onLoad");function tu(t){if(d.assets.loaded)fi().forEach(e=>t(...e));else return d.game.events.on("loadError",t)}o(tu,"onLoadError");function Ci(...t){d.game.cam.pos=P(...t)}o(Ci,"setCamPos");function qi(){return d.game.cam.pos?d.game.cam.pos.clone():fr()}o(qi,"getCamPos");function Ti(...t){d.game.cam.scale=P(...t)}o(Ti,"setCamScale");function Ii(){return d.game.cam.scale.clone()}o(Ii,"getCamScale");function Bi(t){d.game.cam.angle=t}o(Bi,"setCamRot");function Ri(){return d.game.cam.angle}o(Ri,"getCamRot");function Ar(){return d.game.cam.transform.clone()}o(Ar,"getCamTransform");function Fi(t=he(255,255,255),e=1){let n=d.game.root.add([di(Ee(),Pe()),ui(t),hi(1),Pi()]),r=n.fadeOut(e);return r.onEnd(()=>zi(n)),r}o(Fi,"flash");function nu(t=12){d.game.cam.shake+=t}o(nu,"shake");function Hr(t){return d.game.cam.transform.transformPoint(t,P())}o(Hr,"toScreen");function Oi(t){return d.game.cam.transform.inverse.transformPoint(t,P())}o(Oi,"toWorld");function ru(...t){return Gt("camPos","setCamPos / getCamPos"),t.length>0&&Ci(...t),qi()}o(ru,"camPos");function su(...t){return Gt("camScale","setCamScale / getCamScale"),t.length>0&&Ti(...t),Ii()}o(su,"camScale");function iu(t){return Gt("camRot","setCamRot / getCamRot"),t!==void 0&&Bi(t),Ri()}o(iu,"camRot");function au(t=he(255,255,255),e=1){return Gt("camFlash","flash"),Fi(t,e)}o(au,"camFlash");function ou(){return Gt("camTransform","getCamTransform"),Ar()}o(ou,"camTransform");var lu=(t=>(t[t.Pos=1]="Pos",t[t.Angle=2]="Angle",t[t.Scale=4]="Scale",t[t.All=7]="All",t))(lu||{});function hs(t=[]){let e=new Map,n=[],r={},s=new rs,i=new qe,l=new qe,c=new qe,h=[],u=new Set("*"),g=d.globalOpt.tagsAsComponents,y=null,m=!1,E,p={id:Eh(),hidden:!1,transform:new en,children:[],get parent(){return E},set parent(f){if(E===f)return;let w=E?E.children.indexOf(this):-1;w!==-1&&E.children.splice(w,1),E=f,f&&f.children.push(this)},setParent(f,w){if(E===f)return;let S=E.transform,C=f.transform;w.keep&1&&this.pos!==void 0&&(S.transformPoint(this.pos,this.pos),C.inverse.transformPoint(this.pos,this.pos)),w.keep&2&&this.angle!==void 0&&(this.angle+=C.getRotation()-S.getRotation()),w.keep&4&&this.scale!==void 0&&(this.scale=this.scale.scale(S.getScale().invScale(C.getScale()))),this.parent=f},set paused(f){if(f!==m){m=f;for(let w of h)w.paused=f}},get paused(){return m},get tags(){return Array.from(u)},add(f){let w=Array.isArray(f)?hs(f):f;if(w.parent)throw new Error("Cannot add a game obj that already has a parent.");w.parent=this,Xt(w,w.transform);try{w.trigger("add",w)}catch(S){d.handleErr(S)}return d.game.events.trigger("add",w),w},readd(f){let w=this.children.indexOf(f);return w!==-1&&(this.children.splice(w,1),this.children.push(f)),f},remove(f){f.parent=null;let w=o(S=>{S.trigger("destroy"),d.game.events.trigger("destroy",S),S.children.forEach(C=>w(C))},"trigger");w(f)},removeAll(f){if(f)this.get(f).forEach(w=>this.remove(w));else for(let w of[...this.children])this.remove(w)},fixedUpdate(){this.paused||(this.children.forEach(f=>f.fixedUpdate()),i.trigger())},update(){this.paused||(this.children.forEach(f=>f.update()),l.trigger())},draw(){if(this.hidden)return;this.canvas&&(We(),this.canvas.bind());let f=d.gfx.fixed;this.fixed&&(d.gfx.fixed=!0),Ke(),_e(this.pos),Jn(this.scale),nn(this.angle);let w=this.children.sort((S,C)=>{let I=S.layerIndex??d.game.defaultLayerIndex,k=C.layerIndex??d.game.defaultLayerIndex;return I-k||(S.z??0)-(C.z??0)});if(this.mask){let S={intersect:d.k.drawMasked,subtract:d.k.drawSubtracted}[this.mask];if(!S)throw new Error(`Invalid mask func: "${this.mask}"`);S(()=>{for(let C=0;C{c.trigger()})}else{c.trigger();for(let S=0;Sf.drawInspect()),this.trigger("drawInspect"),je())},use(f){var C;if(typeof f=="string")return this.trigger("tag",f),d.game.events.trigger("tag",this,f),u.add(f);if(!f||typeof f!="object")throw new Error(`You can only pass a component or a string to .use(), you passed a "${typeof f}"`);let w=[];f.id?(this.unuse(f.id),r[f.id]=[],w=r[f.id],e.set(f.id,f),g&&u.add(f.id)):n.push(f);let S=o(()=>{if(f.require)try{for(let I of f.require)if(!this.c(I))throw new Error(`Component "${f.id}" requires component "${I}"`)}catch(I){d.handleErr(I)}},"checkDeps");f.destroy&&w.push(f.destroy.bind(this)),this.exists()?(S(),f.add&&(y=o(I=>w.push(I),"onCurCompCleanup"),f.add.call(this),y=null),f.id&&(this.trigger("use",f.id),d.game.events.trigger("use",this,f.id))):f.require&&w.push(this.on("add",S).cancel);for(let I in f){if(ch.has(I))continue;let k=Object.getOwnPropertyDescriptor(f,I);if(k)if(typeof k.value=="function"&&(f[I]=f[I].bind(this)),k.set&&Object.defineProperty(f,I,{set:k.set.bind(this)}),k.get&&Object.defineProperty(f,I,{get:k.get.bind(this)}),dh.has(I)){let x=I==="add"?()=>{var v;y=o(M=>w.push(M),"onCurCompCleanup"),(v=f[I])==null||v.call(f),y=null}:f[I];w.push(this.on(I,x).cancel)}else if(this[I]===void 0)Object.defineProperty(this,I,{get:o(()=>f[I],"get"),set:o(x=>f[I]=x,"set"),configurable:!0,enumerable:!0}),w.push(()=>delete this[I]);else{let x=(C=e.values().find(v=>v[I]!==void 0))==null?void 0:C.id;throw new Error(`Duplicate component property: "${I}" while adding component "${f.id}"`+(x?` (originally added by "${x}")`:""))}}},unuse(f){if(e.has(f)){for(let w of e.values())if(w.require&&w.require.includes(f))throw new Error(`Can't unuse. Component "${w.id}" requires component "${f}"`);e.delete(f),this.trigger("unuse",f),d.game.events.trigger("unuse",this,f)}else g&&u.has(f)&&u.delete(f);r[f]&&(r[f].forEach(w=>w()),delete r[f])},c(f){return e.get(f)??null},get(f,w={}){let S=o((I,k)=>w.only==="comps"?I.has(k):w.only==="tags"?I.is(k):I.is(k)||I.has(k),"checkTagsOrComps"),C=w.recursive?this.children.flatMap(o(function I(k){return[k,...k.children.flatMap(I)]},"recurse")):this.children;if(C=C.filter(I=>f?S(I,f):!0),w.liveUpdate){let I=o(x=>w.recursive?this.isAncestorOf(x):x.parent===this,"isChild"),k=[];k.push(d.k.onAdd(x=>{I(x)&&S(x,f)&&C.push(x)})),k.push(d.k.onDestroy(x=>{if(S(x,f)){let v=C.findIndex(M=>M.id===x.id);v!==-1&&C.splice(v,1)}})),(g||w.only!=="tags")&&(k.push(d.k.onUse((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUnuse((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),!g&&w.only!=="comps"&&(k.push(d.k.onTag((x,v)=>{I(x)&&S(x,f)&&C.findIndex(M=>M.id===x.id)==-1&&C.push(x)})),k.push(d.k.onUntag((x,v)=>{if(I(x)&&!S(x,f)){let M=C.findIndex(R=>R.id===x.id);M!==-1&&C.splice(M,1)}}))),this.onDestroy(()=>{for(let x of k)x.cancel()})}return C},query(f){let w=f.hierarchy||"children",S=f.include,C=f.exclude,I=[];switch(w){case"children":I=this.children;break;case"siblings":I=this.parent?this.parent.children.filter(x=>x!==this):[];break;case"ancestors":let k=this.parent;for(;k;)I.push(k),k=k.parent;break;case"descendants":I=this.children.flatMap(o(function x(v){return[v,...v.children.flatMap(x)]},"recurse"));break}if(S&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>k.is(S)):I=I.filter(k=>f.include.some(x=>k.is(x)))),C&&((f.includeOp||"and")==="and"||!Array.isArray(f.include)?I=I.filter(k=>!k.is(C)):I=I.filter(k=>!f.exclude.some(x=>k.is(x)))),f.visible===!0&&(I=I.filter(k=>k.visible)),f.distance){if(!this.pos)throw Error("Can't do a distance query from an object without pos");let k=f.distanceOp||"near",x=f.distance*f.distance;k==="near"?I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)<=x):I=I.filter(v=>v.pos&&this.pos.sdist(v.pos)>x)}return f.name&&(I=I.filter(k=>k.name===f.name)),I},isAncestorOf(f){return f.parent?f.parent===this||this.isAncestorOf(f.parent):!1},exists(){return d.game.root.isAncestorOf(this)},is(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>u.has(S)):f.some(S=>u.has(S)):u.has(f)},tag(f){if(Array.isArray(f))for(let w of f)u.add(w),this.trigger("tag",w),d.game.events.trigger("tag",this,w);else u.add(f),this.trigger("tag",f),d.game.events.trigger("tag",this,f)},untag(f){if(Array.isArray(f))for(let w of f)u.delete(w),this.trigger("untag",w),d.game.events.trigger("untag",this,w);else u.delete(f),this.trigger("untag",f),d.game.events.trigger("untag",this,f)},has(f,w="and"){return Array.isArray(f)?w==="and"?f.every(S=>e.has(S)):f.some(S=>e.has(S)):e.has(f)},on(f,w){let S=(C=>{switch(f){case"fixedUpdate":return i.add(C);case"update":return l.add(C);case"draw":return c.add(C);default:return s.on(f,C)}})(w.bind(this));return y&&y(()=>S.cancel()),S},trigger(f,...w){s.trigger(f,...w)},destroy(){this.parent&&this.parent.remove(this)},inspect(){var w;let f={};for(let[S,C]of e)f[S]=((w=C.inspect)==null?void 0:w.call(C))??null;for(let[S,C]of n.entries()){if(C.inspect){f[S]=C.inspect();continue}for(let[I,k]of Object.entries(C))typeof k!="function"&&(f[I]=`${I}: ${k}`)}return f},onAdd(f){return this.on("add",f)},onFixedUpdate(f){return this.on("fixedUpdate",f)},onUpdate(f){return this.on("update",f)},onDraw(f){return this.on("draw",f)},onDestroy(f){return this.on("destroy",f)},onTag(f){return this.on("tag",f)},onUntag(f){return this.on("untag",f)},onUse(f){return this.on("use",f)},onUnuse(f){return this.on("unuse",f)},clearEvents(){s.clear(),i.clear(),l.clear(),c.clear()}},T=["onKeyPress","onKeyPressRepeat","onKeyDown","onKeyRelease","onMousePress","onMouseDown","onMouseRelease","onMouseMove","onCharInput","onMouseMove","onTouchStart","onTouchMove","onTouchEnd","onScroll","onGamepadButtonPress","onGamepadButtonDown","onGamepadButtonRelease","onGamepadStick","onButtonPress","onButtonDown","onButtonRelease"];for(let f of T)p[f]=(...w)=>{var C,I;let S=(I=(C=d.app)[f])==null?void 0:I.call(C,...w);return h.push(S),p.onDestroy(()=>S.cancel()),p.on("sceneEnter",()=>{var x,v;h.splice(h.indexOf(S),1);let k=(v=(x=d.app)[f])==null?void 0:v.call(x,...w);rn.replace(S,k),h.push(S)}),S};for(let f of t)p.use(f);return p}o(hs,"make");var uc=o(()=>({events:new rs,root:hs([]),gravity:null,scenes:{},currentScene:null,layers:null,defaultLayerIndex:0,logs:[],cam:{pos:null,scale:new q(1),angle:0,shake:0,transform:new en}}),"initGame");function uu(t){d.game.gravity=t?(d.game.gravity||P(0,1)).unit().scale(t):null}o(uu,"setGravity");function hu(){return d.game.gravity?d.game.gravity.len():0}o(hu,"getGravity");function cu(t){d.game.gravity=t.unit().scale(d.game.gravity?d.game.gravity.len():1)}o(cu,"setGravityDirection");function sr(){return d.game.gravity?d.game.gravity.unit():P(0,1)}o(sr,"getGravityDirection");var hc=eh("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");function du(t){return t.createBuffer(1,1,44100)}o(du,"createEmptyAudioBuffer");var cc=o(()=>(()=>{let t=new(window.AudioContext||window.webkitAudioContext),e=t.createGain();e.connect(t.destination);let n=new wn(du(t));return t.decodeAudioData(hc.buffer.slice(0)).then(r=>{n.buf=r}).catch(r=>{console.error("Failed to load burp: ",r)}),{ctx:t,masterNode:e,burpSnd:n}})(),"initAudio");function fu(t,e={}){let n=new qe,r=new Audio(t);r.crossOrigin="anonymous",r.loop=!!e.loop;let s=d.audio.ctx.createMediaElementSource(r);s.connect(e.connectTo??d.audio.masterNode);function i(){d.debug.paused||d.app.isHidden()&&!d.globalOpt.backgroundAudio||d.audio.ctx.resume()}o(i,"resumeAudioCtx");function l(){i(),r.play()}return o(l,"play"),e.paused||l(),r.onended=()=>n.trigger(),{play(){l()},seek(c){r.currentTime=c},stop(){r.pause(),this.seek(0)},set loop(c){r.loop=c},get loop(){return r.loop},set paused(c){c?r.pause():l()},get paused(){return r.paused},time(){return r.currentTime},duration(){return r.duration},set volume(c){r.volume=ot(c,0,1)},get volume(){return r.volume},set speed(c){r.playbackRate=Math.max(c,0)},get speed(){return r.playbackRate},set detune(c){},get detune(){return 0},onEnd(c){return n.add(c)},then(c){return this.onEnd(c)},connect(c){s.disconnect(),s.connect(c??d.audio.masterNode)}}}o(fu,"playMusic");function gu(t,e={}){if(typeof t=="string"&&d.assets.music[t])return fu(d.assets.music[t],e);let n=d.audio.ctx,r=e.paused??!1,s=n.createBufferSource(),i=new qe,l=n.createGain(),c=n.createStereoPanner(),h=e.seek??0,u=0,g=0,y=!1;s.loop=!!e.loop,s.detune.value=e.detune??0,s.playbackRate.value=e.speed??1,s.connect(c),s.onended=()=>{var f;p()>=(((f=s.buffer)==null?void 0:f.duration)??Number.POSITIVE_INFINITY)&&i.trigger()},c.pan.value=e.pan??0,c.connect(l),l.connect(e.connectTo??d.audio.masterNode),l.gain.value=e.volume??1;let m=o(f=>{s.buffer=f.buf,r||(u=n.currentTime,s.start(0,h),y=!0)},"start"),E=cl(t);E instanceof lt&&E.onLoad(m);let p=o(()=>{if(!s.buffer)return 0;let f=r?g-u:n.currentTime-u,w=s.buffer.duration;return s.loop?f%w:Math.min(f,w)},"getTime"),T=o(f=>{let w=n.createBufferSource();return w.buffer=f.buffer,w.loop=f.loop,w.playbackRate.value=f.playbackRate.value,w.detune.value=f.detune.value,w.onended=f.onended,w.connect(c),w},"cloneNode");return{stop(){this.paused=!0,this.seek(0)},set paused(f){if(r!==f)if(r=f,f)y&&(s.stop(),y=!1),g=n.currentTime;else{s=T(s);let w=g-u;s.start(0,w),y=!0,u=n.currentTime-w,g=0}},get paused(){return r},play(f=0){this.seek(f),this.paused=!1},seek(f){var w;(w=s.buffer)!=null&&w.duration&&(f>s.buffer.duration||(r?(s=T(s),u=g-f):(s.stop(),s=T(s),u=n.currentTime-f,s.start(0,f),y=!0,g=0)))},set speed(f){s.playbackRate.value=f},get speed(){return s.playbackRate.value},set detune(f){s.detune.value=f},get detune(){return s.detune.value},set volume(f){l.gain.value=Math.max(f,0)},get volume(){return l.gain.value},set pan(f){c.pan.value=f},get pan(){return c.pan.value},set loop(f){s.loop=f},get loop(){return s.loop},duration(){var f;return((f=s.buffer)==null?void 0:f.duration)??0},time(){return p()%this.duration()},onEnd(f){return i.add(f)},then(f){return this.onEnd(f)},connect(f){l.disconnect(),l.connect(f??d.audio.masterNode)}}}o(gu,"play");function Li(t){return d.k.play(d.audio.burpSnd,t)}o(Li,"burp");function Di(t){d.audio.masterNode.gain.value=t}o(Di,"setVolume");function Ni(){return d.audio.masterNode.gain.value}o(Ni,"getVolume");function pu(t){return Gt("volume","setVolume / getVolume"),t!==void 0&&Di(t),Ni()}o(pu,"volume");function Ui(){d.app.onHide(()=>{d.globalOpt.backgroundAudio||d.audio.ctx.suspend()}),d.app.onShow(()=>{!d.globalOpt.backgroundAudio&&!d.debug.paused&&d.audio.ctx.resume()}),d.app.onResize(()=>{if(d.app.isFullscreen())return;let t=d.globalOpt.width&&d.globalOpt.height;t&&!d.globalOpt.stretch&&!d.globalOpt.letterbox||(d.canvas.width=d.canvas.offsetWidth*d.pixelDensity,d.canvas.height=d.canvas.offsetHeight*d.pixelDensity,Xi(),t||(d.gfx.frameBuffer.free(),d.gfx.frameBuffer=new Kr(d.gfx.ggl,d.gfx.ggl.gl.drawingBufferWidth,d.gfx.ggl.gl.drawingBufferHeight),d.gfx.width=d.gfx.ggl.gl.drawingBufferWidth/d.pixelDensity/d.gscale,d.gfx.height=d.gfx.ggl.gl.drawingBufferHeight/d.pixelDensity/d.gscale))}),d.globalOpt.debug!==!1&&(d.app.onKeyPress(d.globalOpt.debugKey??"f1",()=>d.debug.inspect=!d.debug.inspect),d.app.onKeyPress("f2",()=>d.debug.clearLog()),d.app.onKeyPress("f8",()=>d.debug.paused=!d.debug.paused),d.app.onKeyPress("f7",()=>{d.debug.timeScale=Ur(ot(d.debug.timeScale-.2,0,2),1)}),d.app.onKeyPress("f9",()=>{d.debug.timeScale=Ur(ot(d.debug.timeScale+.2,0,2),1)}),d.app.onKeyPress("f10",()=>d.debug.stepFrame())),d.globalOpt.burp&&d.app.onKeyPress("b",()=>Li())}o(Ui,"initEvents");function mu(t,e={}){let n=d.game.root.add([cr(t),ki()]),r=(e.speed||1)*5,s=e.scale||1;n.add([zr(d.boomSprite),dr(0),Gr("center"),Bs(r,s),...e.comps??[]]);let i=n.add([zr(d.kaSprite),dr(0),Gr("center"),Vr(),...e.comps??[]]);return i.wait(.4/r,()=>i.use(Bs(r,s))),i.onDestroy(()=>n.destroy()),n}o(mu,"addKaboom");function ji(t,e){if(d.game.layers)throw Error("Layers can only be assigned once.");let n=t.indexOf(e);if(n==-1)throw Error("The default layer name should be present in the layers list.");d.game.layers=t,d.game.defaultLayerIndex=n}o(ji,"setLayers");function yu(){return d.game.layers}o(yu,"getLayers");function wu(){var t;return((t=d.game.layers)==null?void 0:t[d.game.defaultLayerIndex])??null}o(wu,"getDefaultLayer");function xu(t,e){Gt("layers","setLayers"),ji(t,e)}o(xu,"layers");function zi(t){t.destroy()}o(zi,"destroy");function Au(){return d.game.root}o(Au,"getTreeRoot");function vu(t,e){d.game.scenes[t]=e}o(vu,"scene");function bu(t,...e){if(!d.game.scenes[t])throw new Error(`Scene not found: ${t}`);d.game.events.onOnce("frameEnd",()=>{d.game.events.trigger("sceneLeave",t),d.app.events.clear(),d.game.events.clear(),[...d.game.root.children].forEach(n=>{!n.stay||n.scenesToStay&&!n.scenesToStay.includes(t)?d.game.root.remove(n):n.trigger("sceneEnter",t)}),d.game.root.clearEvents(),Ui(),d.game.cam={pos:null,scale:P(1),angle:0,shake:0,transform:new en},d.game.scenes[t](...e)}),d.game.currentScene=t}o(bu,"go");function Ls(t){return d.game.events.on("sceneLeave",t)}o(Ls,"onSceneLeave");function Eu(){return d.game.currentScene}o(Eu,"getSceneName");function _e(t){t!==void 0&&(t.x===0&&t.y===0||d.gfx.transform.translateSelfV(t))}o(_e,"pushTranslateV");function rt(t,e){t===0&&e===0||d.gfx.transform.translateSelf(t,e)}o(rt,"pushTranslate");function Ke(){d.gfx.transformStack[++d.gfx.transformStackIndex].setMat23(d.gfx.transform)}o(Ke,"pushTransform");function Su(t){d.gfx.transform.setMat23(t)}o(Su,"pushMatrix");function Jn(t){t!==void 0&&(t.x===1&&t.y===1||d.gfx.transform.scaleSelfV(t))}o(Jn,"pushScaleV");function nn(t){t&&d.gfx.transform.rotateSelf(t)}o(nn,"pushRotate");function je(){d.gfx.transformStackIndex>=0&&d.gfx.transform.setMat23(d.gfx.transformStack[d.gfx.transformStackIndex--])}o(je,"popTransform");function We(){d.gfx.renderer.flush(Ee(),Pe())}o(We,"flush");function Ee(){return d.gfx.width}o(Ee,"width");function Pe(){return d.gfx.height}o(Pe,"height");function Vi(){return(d.gfx.viewport.width+d.gfx.viewport.height)/(d.gfx.width+d.gfx.height)}o(Vi,"getViewportScale");function Mu(t){return new q(t.x*d.gfx.viewport.width/d.gfx.width,t.y*d.gfx.viewport.height/d.gfx.height)}o(Mu,"contentToView");function ku(t){return new q((t.x-d.gfx.viewport.x)*Ee()/d.gfx.viewport.width,(t.y-d.gfx.viewport.y)*Pe()/d.gfx.viewport.height)}o(ku,"windowToContent");function cs(){return ku(d.app.mousePos())}o(cs,"mousePos");function fr(){return P(Ee()/2,Pe()/2)}o(fr,"center");var Kn,Gi=(Kn=class{constructor(e){b(this,"vertices");b(this,"indices");b(this,"commands");b(this,"mesh");this.vertices=[],this.indices=[],this.commands=[]}archive(){return JSON.stringify({vertices:this.vertices,indices:this.indices,commands:this.commands.map(e=>({material:{tex:"",shader:"",uniform:e.material.uniform,blend:e.material.blend},index:e.index,count:e.count}))})}free(){var e;(e=this.mesh)==null||e.free()}},o(Kn,"Picture"),Kn),dc=new Xr;function Hi(t,e){let n=Ee(),r=Pe();d.gfx.renderer.flush(n,r);let s=d.gfx.transform.clone();e.pos&&s.translateSelfV(e.pos),e.angle&&s.rotateSelf(e.angle),e.scale&&s.scaleSelfV(e.scale);let i=d.gfx.renderer.ctx,l=i.gl;i.pushArrayBuffer(t.mesh.glVBuf);let c=l.getAttribLocation(d.gfx.defShader.glProgram,"a_pos");l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0);let h=l.getAttribLocation(d.gfx.defShader.glProgram,"a_uv");l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8);let u=l.getAttribLocation(d.gfx.defShader.glProgram,"a_color");l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.pushElementArrayBuffer(t.mesh.glIBuf);let g=null,y=null;for(let m of t.commands){let E=m.material.tex??d.gfx.defTex,p=m.material.shader??d.gfx.defShader;m.material.blend&&d.gfx.renderer.setBlend(m.material.blend),p!=g&&(g==null||g.unbind(),p.bind(),g=p,p.send({width:n,height:r,camera:e.fixed?dc:Ar(),transform:s})),m.material.uniform&&(p==null||p.send(m.material.uniform)),E!=y&&(y==null||y.unbind(),E==null||E.bind(),y=E),l.drawElements(l.TRIANGLES,m.count,l.UNSIGNED_SHORT,m.index*2)}g==null||g.unbind(),y==null||y.unbind(),i.popArrayBuffer(),i.popElementArrayBuffer(),i.pushArrayBuffer(d.gfx.renderer.glVBuf),l.vertexAttribPointer(c,2,l.FLOAT,!1,32,0),l.vertexAttribPointer(h,2,l.FLOAT,!1,32,8),l.vertexAttribPointer(u,4,l.FLOAT,!1,32,16),i.popArrayBuffer()}o(Hi,"drawPicture");function Pu(t){t??(t=new Gi),t.vertices.length=0,t.indices.length=0,t.commands.length=0,d.gfx.renderer.picture=t}o(Pu,"beginPicture");function Cu(t){t??(t=new Gi),d.gfx.renderer.picture=t}o(Cu,"appendToPicture");function qu(){let t=d.gfx.renderer.ctx;t.gl;let e=d.gfx.renderer.picture;if(!e)throw new Error("Called endPicture when no picture was started");return d.gfx.renderer.picture=null,e.free(),e.mesh=new gc(t,d.gfx.renderer.vertexFormat,e.vertices,e.indices),console.log(e),e}o(qu,"endPicture");var $t,Pt=($t=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"src",null);b(this,"glTex");b(this,"width");b(this,"height");this.ctx=e;let i=e.gl,l=e.gl.createTexture();if(!l)throw new Error("Failed to create texture");this.glTex=l,e.onDestroy(()=>this.free()),this.width=n,this.height=r;let c={linear:i.LINEAR,nearest:i.NEAREST}[s.filter??e.opts.texFilter??"nearest"],h={repeat:i.REPEAT,clampToEdge:i.CLAMP_TO_EDGE}[s.wrap??"clampToEdge"];this.bind(),n&&r&&i.texImage2D(i.TEXTURE_2D,0,i.RGBA,n,r,0,i.RGBA,i.UNSIGNED_BYTE,null),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MIN_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_MAG_FILTER,c),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_S,h),i.texParameteri(i.TEXTURE_2D,i.TEXTURE_WRAP_T,h),i.pixelStorei(i.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),this.unbind()}static fromImage(e,n,r={}){let s=new $t(e,n.width,n.height,r);return s.update(n),s.src=n,s}update(e,n=0,r=0){let s=this.ctx.gl;this.bind(),s.texSubImage2D(s.TEXTURE_2D,0,n,r,s.RGBA,s.UNSIGNED_BYTE,e),this.unbind()}bind(){this.ctx.pushTexture2D(this.glTex)}unbind(){this.ctx.popTexture2D()}free(){this.ctx.gl.deleteTexture(this.glTex)}},o($t,"Texture"),$t),ha=new Xr,Wn,fc=(Wn=class{constructor(e,n,r,s){b(this,"ctx");b(this,"glVBuf");b(this,"glIBuf");b(this,"vqueue",[]);b(this,"iqueue",[]);b(this,"stride");b(this,"maxVertices");b(this,"maxIndices");b(this,"vertexFormat");b(this,"numDraws",0);b(this,"curPrimitive",null);b(this,"curTex",null);b(this,"curShader",null);b(this,"curUniform",null);b(this,"curBlend",0);b(this,"curFixed");b(this,"picture",null);let i=e.gl;this.vertexFormat=n,this.ctx=e,this.stride=n.reduce((c,h)=>c+h.size,0),this.maxVertices=r,this.maxIndices=s;let l=i.createBuffer();if(!l)throw new Error("Failed to create vertex buffer");this.glVBuf=l,e.pushArrayBuffer(this.glVBuf),i.bufferData(i.ARRAY_BUFFER,r*4,i.DYNAMIC_DRAW),e.popArrayBuffer(),this.glIBuf=i.createBuffer(),e.pushElementArrayBuffer(this.glIBuf),i.bufferData(i.ELEMENT_ARRAY_BUFFER,s*4,i.DYNAMIC_DRAW),e.popElementArrayBuffer()}push(e,n,r,s,i=null,l=null,c,h,u,g){if(this.picture){let E=this.picture.indices.length,p=r.length,T=this.picture.vertices.length/this.stride,f=n.length;for(let C=0;Cthis.maxVertices||this.iqueue.length+r.length>this.maxIndices)&&(this.flush(h,u),this.setBlend(c));let y=this.vqueue.length/this.stride,m=n.length;for(let E=0;E{e.push(i),t(i)},"push"),r=o(()=>{e.pop(),t(s()??null)},"pop"),s=o(()=>e[e.length-1],"cur");return[n,r,s]}o(Bt,"genStack");function Tu(t,e={}){let n=[];function r(k){n.push(k)}o(r,"onDestroy");function s(){n.forEach(x=>x());let k=t.getExtension("WEBGL_lose_context");k&&k.loseContext()}o(s,"destroy");let i=null;function l(k){if(is(k,i))return;i=k;let x=k.reduce((v,M)=>v+M.size,0);k.reduce((v,M,R)=>(t.enableVertexAttribArray(R),t.vertexAttribPointer(R,M.size,t.FLOAT,!1,x*4,v),v+M.size*4),0)}o(l,"setVertexFormat");let[c,h]=Bt(k=>t.bindTexture(t.TEXTURE_2D,k)),[u,g]=Bt(k=>t.bindBuffer(t.ARRAY_BUFFER,k)),[y,m]=Bt(k=>t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,k)),[E,p]=Bt(k=>t.bindFramebuffer(t.FRAMEBUFFER,k)),[T,f]=Bt(k=>t.bindRenderbuffer(t.RENDERBUFFER,k)),[w,S]=Bt(k=>{if(!k)return;let{x,y:v,w:M,h:R}=k;t.viewport(x,v,M,R)}),[C,I]=Bt(k=>t.useProgram(k));return w({x:0,y:0,w:t.drawingBufferWidth,h:t.drawingBufferHeight}),{gl:t,opts:e,onDestroy:r,destroy:s,pushTexture2D:c,popTexture2D:h,pushArrayBuffer:u,popArrayBuffer:g,pushElementArrayBuffer:y,popElementArrayBuffer:m,pushFramebuffer:E,popFramebuffer:p,pushRenderbuffer:T,popRenderbuffer:f,pushViewport:w,popViewport:S,pushProgram:C,popProgram:I,setVertexFormat:l}}o(Tu,"initGfx");var Xn,Kr=(Xn=class{constructor(e,n,r,s={}){b(this,"ctx");b(this,"tex");b(this,"glFramebuffer");b(this,"glRenderbuffer");this.ctx=e;let i=e.gl;e.onDestroy(()=>this.free()),this.tex=new Pt(e,n,r,s);let l=i.createFramebuffer(),c=i.createRenderbuffer();if(!l||!c)throw new Error("Failed to create framebuffer");this.glFramebuffer=l,this.glRenderbuffer=c,this.bind(),i.renderbufferStorage(i.RENDERBUFFER,i.DEPTH_STENCIL,n,r),i.framebufferTexture2D(i.FRAMEBUFFER,i.COLOR_ATTACHMENT0,i.TEXTURE_2D,this.tex.glTex,0),i.framebufferRenderbuffer(i.FRAMEBUFFER,i.DEPTH_STENCIL_ATTACHMENT,i.RENDERBUFFER,this.glRenderbuffer),this.unbind()}get width(){return this.tex.width}get height(){return this.tex.height}toImageData(){let e=this.ctx.gl,n=new Uint8ClampedArray(this.width*this.height*4);this.bind(),e.readPixels(0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,n),this.unbind();let r=this.width*4,s=new Uint8Array(r);for(let i=0;i<(this.height/2|0);i++){let l=i*r,c=(this.height-i-1)*r;s.set(n.subarray(l,l+r)),n.copyWithin(l,c,c+r),n.set(s,c)}return new ImageData(n,this.width,this.height)}toDataURL(){let e=document.createElement("canvas"),n=e.getContext("2d");if(e.width=this.width,e.height=this.height,!n)throw new Error("Failed to get 2d context");return n.putImageData(this.toImageData(),0,0),e.toDataURL()}clear(){let e=this.ctx.gl;e.clear(e.COLOR_BUFFER_BIT)}draw(e){this.bind(),e(),this.unbind()}bind(){this.ctx.pushFramebuffer(this.glFramebuffer),this.ctx.pushRenderbuffer(this.glRenderbuffer),this.ctx.pushViewport({x:0,y:0,w:this.width,h:this.height})}unbind(){this.ctx.popFramebuffer(),this.ctx.popRenderbuffer(),this.ctx.popViewport()}free(){let e=this.ctx.gl;e.deleteFramebuffer(this.glFramebuffer),e.deleteRenderbuffer(this.glRenderbuffer),this.tex.free()}},o(Xn,"FrameBuffer"),Xn),cn=new q;function Tt(t,e,n=!1,r,s,i,l){let c=r??d.gfx.defTex,h=s??d.gfx.defShader,u=ll(h);if(!u||u instanceof lt)return;let g=d.gfx.transform,y=t.pos.length/2,m=new Array(y*8),E=0;for(let p=0;pi.map(l=>t.pts.indexOf(l))).flat():s=[...Array(e-2).keys()].map(i=>[0,i+1,i+2]).flat(),Tt(r,t.indices??s,t.fixed,t.uv?t.tex:d.gfx.defTex,t.shader,t.uniform??void 0,t.blend??0)}t.outline&&fs({pts:[...t.pts,t.pts[0]],radius:t.radius,width:t.outline.width,color:t.outline.color,join:t.outline.join,uniform:t.uniform,fixed:t.fixed,opacity:t.opacity??t.outline.opacity}),je()}}o(Ct,"drawPolygon");function ds(t){if(t.radiusX===void 0||t.radiusY===void 0)throw new Error('drawEllipse() requires properties "radiusX" and "radiusY".');if(t.radiusX===0||t.radiusY===0)return;let e=t.start??0,n=t.end??360,r=sn(t.anchor??"center").scale(new q(-t.radiusX,-t.radiusY)),s=mn(r,t.radiusX,t.radiusY,e,n,t.resolution);s.unshift(r);let i=Object.assign({},t,{pts:s,radius:0,...t.gradient?{colors:[t.gradient[0],...Array(s.length-1).fill(t.gradient[1])]}:{}});if(n-e>=360&&t.outline){t.fill!==!1&&Ct(Object.assign({},i,{outline:null})),Ct(Object.assign({},i,{pts:s.slice(1),fill:!1}));return}Ct(i)}o(ds,"drawEllipse");function an(t){if(typeof t.radius!="number")throw new Error('drawCircle() requires property "radius".');t.radius!==0&&ds(Object.assign({},t,{radiusX:t.radius,radiusY:t.radius,angle:0}))}o(an,"drawCircle");function yn(t){let{p1:e,p2:n}=t;if(!e||!n)throw new Error('drawLine() requires properties "p1" and "p2".');let r=t.width||1,s=n.sub(e).unit().normal().scale(r*.5),i=t.color??ie.WHITE,l=t.opacity??1,c={pos:[e.x-s.x,e.y-s.y,e.x+s.x,e.y+s.y,n.x+s.x,n.y+s.y,n.x-s.x,n.y-s.y],uv:[0,0,0,0,0,0,0,0],color:[i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b,i.r,i.g,i.b],opacity:[l,l,l,l]};Tt(c,[0,1,3,1,2,3],t.fixed,d.gfx.defTex,t.shader,t.uniform??void 0)}o(yn,"drawLine");function Iu(t){let e=t.pts,n=[],r=(t.width||1)*.5,s=e[0]===e[e.length-1]||e[0].eq(e[e.length-1]),i=t.pos||P(0,0),l;s?l=e[0].sub(e[e.length-2]):l=e[1].sub(e[0]);let c=l.len(),h=l.normal().scale(-r/c),u,g=e[0];if(!s)switch(t.cap){case"square":{let p=l.scale(-r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(-1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0?(n.push(u.add(I)),n.push(u.sub(h)),n.push(u.add(I)),n.push(u.sub(w))):(n.push(u.add(h)),n.push(u.sub(I)),n.push(u.add(w)),n.push(u.sub(I))),l=T,c=f,h=w}if(!s)switch(n.push(g.add(h)),n.push(g.sub(h)),t.cap){case"square":{let p=l.scale(r/c);n.push(g.add(p).add(h)),n.push(g.add(p).sub(h));break}case"round":{let p=Math.max(r,10),T=Math.PI/p,f=h.scale(1),w=Math.cos(T),S=Math.sin(T);for(let C=0;C0){let k=u.add(I),x=Math.max(r,10),v=me(h.angleBetween(w)/x),M=h,R=Math.cos(v),L=Math.sin(v);for(let D=0;D({pos:i.add(p),uv:P(),color:t.color||ie.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p({pos:i.add(p),uv:P(),color:t.color||ie.WHITE,opacity:t.opacity??1}));let y=[],m=0;for(let p=0;p2)switch(t.join){case"bevel":return Iu(t);case"round":return Bu(t);case"miter":return Ru(t)}if(t.radius&&e.length>=3){yn(Object.assign({},t,{p1:e[0],p2:e[1]}));for(let r=1;rts(t.pt1,t.pt2,t.pt3,t.pt4,e),t)}o(Fu,"drawBezier");function jt(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 e=t.width,n=t.height,r=sn(t.anchor||ns),s=r.x*e*-.5,i=r.y*n*-.5,l=t.quad||new we(0,0,1,1),c=t.color||ie.WHITE,h=t.opacity??1,u=t.tex?.1/t.tex.width:0,g=t.tex?.1/t.tex.height:0,y=l.x+u,m=l.y+g,E=l.w-u*2,p=l.h-g*2;Ke(),_e(t.pos),nn(t.angle),Jn(t.scale),rt(s,i),Tt({pos:[-e/2,n/2,-e/2,-n/2,e/2,-n/2,e/2,n/2],uv:[t.flipX?y+E:y,t.flipY?m:m+p,t.flipX?y+E:y,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m+p:m,t.flipX?y:y+E,t.flipY?m:m+p],color:[c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b,c.r,c.g,c.b],opacity:[h,h,h,h]},[0,1,3,1,2,3],t.fixed,t.tex,t.shader,t.uniform??void 0,t.blend??0),je()}o(jt,"drawUVQuad");function Ou(t){let e=t.canvas.fb;jt(Object.assign({},t,{tex:e.tex,width:t.width||e.width,height:t.height||e.height}))}o(Ou,"drawCanvas");var ps={};function Ds(t,e){if(e.override){Object.assign(t,e);return}e.pos&&(t.pos=t.pos.add(e.pos)),e.scale&&(t.scale=t.scale.scale(P(e.scale))),e.angle&&(t.angle+=e.angle),e.color&&t.ch.length===1&&(t.color=t.color.mult(e.color)),e.opacity!=null&&(t.opacity*=e.opacity)}o(Ds,"applyCharTransform");function Wr(t){let e={},n="",r=[],s=String(t),i=o(l=>{r.length>0&&(e[n.length]=r.slice()),n+=l},"emit");for(;s!=="";){if(s[0]==="\\"){if(s.length===1)throw new Error("Styled text error: \\ at end of string");i(s[1]),s=s.slice(2);continue}if(s[0]==="["){let l=/^\[(\/)?(\w+?)\]/.exec(s);if(!l){i(s[0]),s=s.slice(1);continue}let[c,h,u]=l;if(h!==void 0){let g=r.pop();if(g!==u)throw g!==void 0?new Error(`Styled text error: mismatched tags. Expected [/${g}], got [/${u}]`):new Error(`Styled text error: stray end tag [/${u}]`)}else r.push(u);s=s.slice(c.length);continue}i(s[0]),s=s.slice(1)}if(r.length>0)throw new Error(`Styled text error: unclosed tags ${r}`);return{charStyleMap:e,text:n}}o(Wr,"compileStyledText");function zt(t){var C,I,k;if(t.text===void 0)throw new Error('formatText() requires property "text".');let e=gi(t.font);if(!t.text||t.text===""||e instanceof lt||!e)return{width:0,height:0,chars:[],opt:t,renderedText:""};let{charStyleMap:n,text:r}=Wr(t.text+""),s=Ao(r);if(e instanceof Or||typeof e=="string"){let x=e instanceof Or?e.fontface.family:e,v=e instanceof Or?{outline:e.outline,filter:e.filter}:{outline:null,filter:Ss},M=ps[x]??{font:{tex:new Pt(d.gfx.ggl,2048,2048,{filter:v.filter}),map:{},size:64},cursor:new q(0),maxHeight:0,outline:v.outline};ps[x]||(ps[x]=M),e=M.font;for(let R of s)if(!M.font.map[R]){let L=d.fontCacheC2d;if(!L)throw new Error("fontCacheC2d is not defined.");if(!d.fontCacheCanvas)throw new Error("fontCacheCanvas is not defined.");L.clearRect(0,0,d.fontCacheCanvas.width,d.fontCacheCanvas.height),L.font=`${e.size}px ${x}`,L.textBaseline="top",L.textAlign="left",L.fillStyle="#ffffff";let D=L.measureText(R),O=Math.ceil(D.width);if(!O)continue;let z=Math.ceil(Math.abs(D.actualBoundingBoxAscent))+Math.ceil(Math.abs(D.actualBoundingBoxDescent));M.outline&&M.outline.width&&M.outline.color&&(L.lineJoin="round",L.lineWidth=M.outline.width*2,L.strokeStyle=M.outline.color.toHex(),L.strokeText(R,M.outline.width,M.outline.width),O+=M.outline.width*2,z+=M.outline.width*3),L.fillText(R,((C=M.outline)==null?void 0:C.width)??0,((I=M.outline)==null?void 0:I.width)??0);let te=L.getImageData(0,0,O,z);if(M.cursor.x+O>2048&&(M.cursor.x=0,M.cursor.y+=M.maxHeight,M.maxHeight=0,M.cursor.y>2048))throw new Error("Font atlas exceeds character limit");e.tex.update(te,M.cursor.x,M.cursor.y),e.map[R]=new we(M.cursor.x,M.cursor.y,O,z),M.cursor.x+=O+1,M.maxHeight=Math.max(M.maxHeight,z)}}let i=t.size||e.size,l=P(t.scale??1).scale(i/e.size),c=t.lineSpacing??0,h=t.letterSpacing??0,u=0,g=0,y=0,m=[],E=[],p=0,T=null,f=0,w;for(;pt.width&&(y+=i+c,T!=null&&(p-=E.length-T,x=s[p],v=e.map[x],M=v.w*l.x,E=E.slice(0,T-1),u=f),T=null,f=0,m.push({width:u-h,chars:E}),u=w??0,E=[]),E.push({tex:e.tex,width:v.w,height:v.h,quad:new we(v.x/e.tex.width,v.y/e.tex.height,v.w/e.tex.width,v.h/e.tex.height),ch:x,pos:new q(u,y),opacity:t.opacity??1,color:t.color??ie.WHITE,scale:P(l),angle:0}),x===" "&&(T=E.length,f=u),t.indentAll&&w===void 0&&/\S/.test(x)&&(w=u),u+=M,g=Math.max(g,u),u+=h}}p++}m.push({width:u-h,chars:E}),y+=i,t.width&&(g=t.width);let S=[];for(let x=0;x{jt({tex:e.tex,width:e.width,height:e.height,pos:e.pos,scale:e.scale,angle:e.angle,color:e.color,opacity:e.opacity,quad:e.quad,anchor:"center",uniform:t.opt.uniform,shader:t.opt.shader,fixed:t.opt.fixed})}),je()}o(Vt,"drawFormattedText");function ze(t){if(t.width===void 0||t.height===void 0)throw new Error('drawRect() requires property "width" and "height".');if(t.width<=0||t.height<=0)return;let e=t.width,n=t.height,r=sn(t.anchor||ns).add(1,1).scale(new q(e,n).scale(-.5)),s=[new q(0,0),new q(e,0),new q(e,n),new q(0,n)];if(t.radius){let i=Math.min(e,n)/2,l=Array.isArray(t.radius)?t.radius.map(c=>Math.min(i,c)):new Array(4).fill(Math.min(i,t.radius));s=[new q(l[0],0),...l[1]?mn(new q(e-l[1],l[1]),l[1],l[1],270,360):[P(e,0)],...l[2]?mn(new q(e-l[2],n-l[2]),l[2],l[2],0,90):[P(e,n)],...l[3]?mn(new q(l[3],n-l[3]),l[3],l[3],90,180):[P(0,n)],...l[0]?mn(new q(l[0],l[0]),l[0],l[0],180,270):[]]}Ct(Object.assign({},t,{offset:r,pts:s,...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]]}:{}}))}o(ze,"drawRect");function kt(t){We();let e=d.gfx.width,n=d.gfx.height;d.gfx.width=d.gfx.viewport.width,d.gfx.height=d.gfx.viewport.height,t(),We(),d.gfx.width=e,d.gfx.height=n}o(kt,"drawUnscaled");function Ns(t,e){kt(()=>{let n=P(8);Ke(),_e(t);let r=zt({text:e,font:Nr,size:16,pos:n,color:he(255,255,255),fixed:!0}),s=r.width+n.x*2,i=r.height+n.x*2;t.x+s>=Ee()&&_e(P(-s,0)),t.y+i>=Pe()&&_e(P(0,-i)),ze({width:s,height:i,color:he(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(r),je()})}o(Ns,"drawInspectText");function Wi(t){if(!t.p1||!t.p2||!t.p3)throw new Error('drawTriangle() requires properties "p1", "p2" and "p3".');return Ct(Object.assign({},t,{pts:[t.p1,t.p2,t.p3]}))}o(Wi,"drawTriangle");function Lu(){if(d.debug.inspect){let t=null;for(let e of d.game.root.get("*",{recursive:!0}))if(e.c("area")&&(!d.globalOpt.inspectOnlyActive||!e.paused)&&e.isHovering()){t=e;break}if(d.game.root.drawInspect(),t){let e=[],n=t.inspect();for(let r in n)n[r]?e.push(n[r]):e.push(r);e.push(...t.tags.map(r=>`tag: ${r}`)),Ns(Mu(cs()),e.join(` +`))}Ns(P(8),`FPS: ${d.debug.fps()}`)}d.debug.paused&&kt(()=>{Ke(),rt(Ee(),0),rt(-8,8);let t=32;ze({width:t,height:t,anchor:"topright",color:he(0,0,0),opacity:.8,radius:4,fixed:!0});for(let e=1;e<=2;e++)ze({width:4,height:t*.6,anchor:"center",pos:P(-t/3*e,t*.5),color:he(255,255,255),radius:2,fixed:!0});je()}),d.debug.timeScale!==1&&kt(()=>{Ke(),rt(Ee(),Pe()),rt(-8,-8);let t=8,e=zt({text:d.debug.timeScale.toFixed(1),font:Nr,size:16,color:he(255,255,255),pos:P(-t),anchor:"botright",fixed:!0});ze({width:e.width+t*2+t*4,height:e.height+t*2,anchor:"botright",color:he(0,0,0),opacity:.8,radius:4,fixed:!0});for(let n=0;n<2;n++){let r=d.debug.timeScale<1;Wi({p1:P(-e.width-t*(r?2:3.5),-t),p2:P(-e.width-t*(r?2:3.5),-t-e.height),p3:P(-e.width-t*(r?3.5:2),-t-e.height/2),pos:P(-n*t*1+(r?-t*.5:0),0),color:he(255,255,255),fixed:!0})}Vt(e),je()}),d.debug.curRecording&&kt(()=>{Ke(),rt(0,Pe()),rt(24,-24),an({radius:12,color:he(255,0,0),opacity:Hs(0,1,d.app.time()*4),fixed:!0}),je()}),d.debug.showLog&&d.game.logs.length>0&&kt(()=>{Ke(),rt(0,Pe()),rt(8,-8);let t=8,e=[];for(let r of d.game.logs){let s="",i=r.msg instanceof Error?"error":"info";s+=`[time]${r.time.toFixed(2)}[/time]`,s+=" ",s+=`[${i}]${Yr(r.msg)}[/${i}]`,e.push(s)}d.game.logs=d.game.logs.filter(r=>d.app.time()-r.time<(d.globalOpt.logTime||4));let n=zt({text:e.join(` +`),font:Nr,pos:P(t,-t),anchor:"botleft",size:16,width:Ee()*.6,lineSpacing:t/2,fixed:!0,styles:{time:{color:he(127,127,127)},info:{color:he(255,255,255)},error:{color:he(255,0,127)}}});ze({width:n.width+t*2,height:n.height+t*2,anchor:"botleft",color:he(0,0,0),radius:4,opacity:.8,fixed:!0}),Vt(n),je()})}o(Lu,"drawDebug");function Yr(t,e=!1,n=new Set){if(n.has(t))return"";var r="",s;return e&&typeof t=="string"&&(t=JSON.stringify(t)),Array.isArray(t)&&(r=["[",t.map(i=>Yr(i,!0,n.union(new Set([t])))).join(", "),"]"].join(""),t=r),t===null?"null":(typeof t=="object"&&t.toString===Object.prototype.toString&&(t.constructor!==Object&&(r+=t.constructor.name+" "),r+=["{",(s=Object.getOwnPropertyNames(t).map(i=>`${/^\w+$/.test(i)?i:JSON.stringify(i)}: ${Yr(t[i],!0,n.union(new Set([t])))}`).join(", "))?` ${s} `:"","}"].join(""),t=r),String(t).replaceAll(new RegExp("(?0?d.game.events.trigger("loading",t):kt(()=>{let e=Ee()/2,n=24,r=P(Ee()/2,Pe()/2).sub(P(e/2,n/2));ze({pos:P(0),width:Ee(),height:Pe(),color:he(0,0,0)}),ze({pos:r,width:e,height:n,fill:!1,outline:{width:4}}),ze({pos:r,width:e*t,height:n})})}o(Nu,"drawLoadScreen");function Yi(t,e,n){let r=d.gfx.ggl.gl;We(),r.clear(r.STENCIL_BUFFER_BIT),r.enable(r.STENCIL_TEST),r.stencilFunc(r.NEVER,1,255),r.stencilOp(r.REPLACE,r.REPLACE,r.REPLACE),e(),We(),r.stencilFunc(n,1,255),r.stencilOp(r.KEEP,r.KEEP,r.KEEP),t(),We(),r.disable(r.STENCIL_TEST)}o(Yi,"drawStenciled");function Uu(t,e){let n=d.gfx.ggl.gl;Yi(t,e,n.EQUAL)}o(Uu,"drawMasked");function gr(t){var i,l;if(!t.tex)throw new Error('drawTexture() requires property "tex".');let e=t.quad??new we(0,0,1,1),n=t.tex.width*e.w,r=t.tex.height*e.h,s=q.ONE;if(t.tiled){let c=sn(t.anchor||ns),h=(((i=t.pos)==null?void 0:i.x)||0)-(c.x+1)*.5*(t.width||n),u=(((l=t.pos)==null?void 0:l.y)||0)-(c.y+1)*.5*(t.height||r),g=(t.width||n)/n,y=(t.height||r)/r,m=Math.floor(g),E=Math.floor(y),p=g-m,T=y-E,f=(m+p?1:0)*(E+T?1:0),w=new Array(f*6),S={pos:new Array(f*4*2),uv:new Array(f*4*2),color:new Array(f*4*3),opacity:new Array(f*4)},C=0,I=t.color||ie.WHITE,k=t.opacity||1,x=o((v,M,R,L,D)=>{w[C*6+0]=C*4+0,w[C*6+1]=C*4+1,w[C*6+2]=C*4+3,w[C*6+3]=C*4+1,w[C*6+4]=C*4+2,w[C*6+5]=C*4+3;let O=C*4;S.pos[O*2]=v+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+R+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x+D.w,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,O++,S.pos[O*2]=v+h,S.pos[O*2+1]=M+L+u,S.uv[O*2]=D.x,S.uv[O*2+1]=D.y+D.h,S.color[O*3]=I.r,S.color[O*3+1]=I.g,S.color[O*3+2]=I.b,S.opacity[O]=k,C++},"addQuad");for(let v=0;v{let n=ls(e,Ms,ks),r=t.pixelDensity??1,s=t.scale??1,{gl:i}=e,l=Pt.fromImage(e,new ImageData(new Uint8ClampedArray([255,255,255,255]),1,1)),c=t.width&&t.height?new Kr(e,t.width*r*s,t.height*r*s):new Kr(e,i.drawingBufferWidth,i.drawingBufferHeight),h=null,u=1;t.background&&(typeof t.background=="string"?h=he(t.background):(h=he(...t.background),u=t.background[3]??1),i.clearColor(h.r/255,h.g/255,h.b/255,u??1)),i.enable(i.BLEND),i.blendFuncSeparate(i.ONE,i.ONE_MINUS_SRC_ALPHA,i.ONE,i.ONE_MINUS_SRC_ALPHA);let g=new fc(e,ii,oh,lh),y=Pt.fromImage(e,new ImageData(new Uint8ClampedArray([128,128,128,255,190,190,190,255,190,190,190,255,128,128,128,255]),2,2),{wrap:"repeat",filter:"nearest"}),m=new Array(32).fill(0).map(E=>new en);return{lastDrawCalls:0,ggl:e,defShader:n,defTex:l,frameBuffer:c,postShader:null,postShaderUniform:null,renderer:g,transform:new en,transformStack:m,transformStackIndex:-1,bgTex:y,bgColor:h,bgAlpha:u,width:t.width??i.drawingBufferWidth/r/s,height:t.height??i.drawingBufferHeight/r/s,viewport:{x:0,y:0,width:i.drawingBufferWidth,height:i.drawingBufferHeight},fixed:!1}},"initAppGfx");function Xi(){let t=d.pixelDensity,e=d.gfx.ggl.gl.drawingBufferWidth/t,n=d.gfx.ggl.gl.drawingBufferHeight/t;if(d.globalOpt.letterbox){if(!d.globalOpt.width||!d.globalOpt.height)throw new Error("Letterboxing requires width and height defined.");let r=e/n,s=d.globalOpt.width/d.globalOpt.height;if(r>s){let i=n*s,l=(e-i)/2;d.gfx.viewport={x:l,y:0,width:i,height:n}}else{let i=e/s,l=(n-i)/2;d.gfx.viewport={x:0,y:l,width:e,height:i}}return}if(d.globalOpt.stretch&&(!d.globalOpt.width||!d.globalOpt.height))throw new Error("Stretching requires width and height defined.");d.gfx.viewport={x:0,y:0,width:e,height:n}}o(Xi,"updateViewport");var ca=o((t,e,n)=>{let r=d.systems,s=r.findIndex(l=>l.name===t);if(s!=-1){let l=r[s].when;for(let c of l){let h=d.systemsByEvent[c].findIndex(u=>u.name===t);d.systemsByEvent[c].splice(h,1)}}let i={name:t,run:e,when:n};for(let l of n)d.systemsByEvent[l].push(i);r.push({name:t,run:e,when:n})},"system"),mc="data:image/png;base64,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",yc="data:image/png;base64,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",wc="4000.0.0",d={k:null,globalOpt:null,gfx:null,game:null,app:null,assets:null,fontCacheCanvas:null,fontCacheC2d:null,debug:null,audio:null,pixelDensity:null,canvas:null,gscale:null,kaSprite:null,boomSprite:null,handleErr:null,systems:[],systemsByEvent:[[],[],[],[],[],[]]},da=!1,xc=o((t={})=>{d.k&&(console.warn("KAPLAY already initialized, you are calling kaplay() multiple times, it may lead bugs!"),d.k.quit()),d.globalOpt=t;let e=t.root??document.body;e===document.body&&(document.body.style.width="100%",document.body.style.height="100%",document.body.style.margin="0px",document.documentElement.style.width="100%",document.documentElement.style.height="100%");let n=t.canvas??e.appendChild(document.createElement("canvas"));d.canvas=n;let r=t.scale??1;d.gscale=r;let s=t.width&&t.height&&!t.stretch&&!t.letterbox;s?(n.width=t.width*r,n.height=t.height*r):(n.width=n.parentElement.offsetWidth,n.height=n.parentElement.offsetHeight);let i=["outline: none","cursor: default"];if(s){let N=n.width,V=n.height;i.push(`width: ${N}px`),i.push(`height: ${V}px`)}else i.push("width: 100%"),i.push("height: 100%");t.crisp&&(i.push("image-rendering: pixelated"),i.push("image-rendering: crisp-edges")),n.style.cssText=i.join(";");let l=t.pixelDensity||1;d.pixelDensity=l,n.width*=l,n.height*=l,n.tabIndex=0;let c=document.createElement("canvas");c.width=256,c.height=256,d.fontCacheCanvas=c;let h=c.getContext("2d",{willReadFrequently:!0});d.fontCacheC2d=h;let u=Th({canvas:n,touchToMouse:t.touchToMouse,gamepads:t.gamepads,pixelDensity:t.pixelDensity,maxFPS:t.maxFPS,buttons:t.buttons});d.app=u;let g=[],y=u.canvas.getContext("webgl",{antialias:!0,depth:!0,stencil:!0,alpha:!0,preserveDrawingBuffer:!0});if(!y)throw new Error("WebGL not supported");let m=y,E=Tu(m,{texFilter:t.texFilter}),p=pc(t,E);d.gfx=p;let T=cc();d.audio=T;let f=Jh(E,t.spriteAtlasPadding??0);d.assets=f;let w=uc();d.game=w,w.root.use(Vr()),ca("collision",Re,[4,3]);function S(N,V){let X=new Kr(E,N,V);return{clear:o(()=>X.clear(),"clear"),free:o(()=>X.free(),"free"),toDataURL:o(()=>X.toDataURL(),"toDataURL"),toImageData:o(()=>X.toImageData(),"toImageData"),width:X.width,height:X.height,draw:o(ae=>{We(),X.bind(),ae(),We(),X.unbind()},"draw"),get fb(){return X}}}o(S,"makeCanvas");function C(){m.clear(m.COLOR_BUFFER_BIT),p.frameBuffer.bind(),m.clear(m.COLOR_BUFFER_BIT),p.bgColor||kt(()=>{jt({width:Ee(),height:Pe(),quad:new we(0,0,Ee()/64,Pe()/64),tex:p.bgTex,fixed:!0})}),p.renderer.numDraws=0,p.fixed=!1,p.transformStackIndex=-1,p.transform.setIdentity()}o(C,"frameStart");function I(N,V){p.postShader=N,p.postShaderUniform=V??null}o(I,"usePostEffect");function k(){We(),p.lastDrawCalls=p.renderer.numDraws,p.frameBuffer.unbind(),m.viewport(0,0,m.drawingBufferWidth,m.drawingBufferHeight);let N=p.width,V=p.height;p.width=m.drawingBufferWidth/l,p.height=m.drawingBufferHeight/l,gr({flipY:!0,tex:p.frameBuffer.tex,pos:new q(p.viewport.x,p.viewport.y),width:p.viewport.width,height:p.viewport.height,shader:p.postShader,uniform:typeof p.postShaderUniform=="function"?p.postShaderUniform():p.postShaderUniform,fixed:!0}),We(),p.width=N,p.height=V}o(k,"frameEnd");let x=!1,v={inspect:!1,set timeScale(N){u.state.timeScale=N},get timeScale(){return u.state.timeScale},showLog:!0,fps:o(()=>u.fps(),"fps"),numFrames:o(()=>u.numFrames(),"numFrames"),stepFrame:Te,drawCalls:o(()=>p.lastDrawCalls,"drawCalls"),clearLog:o(()=>w.logs=[],"clearLog"),log:o((...N)=>{let V=t.logMax??8,X=N.length>1?N.concat(" ").join(" "):N[0];w.logs.unshift({msg:X,time:u.time()}),w.logs.length>V&&(w.logs=w.logs.slice(0,V))},"log"),error:o(N=>v.log(new Error(N.toString?N.toString():N)),"error"),curRecording:null,numObjects:o(()=>$("*",{recursive:!0}).length,"numObjects"),get paused(){return x},set paused(N){x=N,N?T.ctx.suspend():T.ctx.resume()}};d.debug=v;function M(N,V){try{return JSON.parse(window.localStorage[N])}catch{return V?(R(N,V),V):null}}o(M,"getData");function R(N,V){window.localStorage[N]=JSON.stringify(V)}o(R,"setData");function L(N,...V){let X=N(Ce),ae;typeof X=="function"?ae=X(...V)(Ce):ae=X;for(let Me in ae)Ce[Me]=ae[Me],t.global!==!1&&(window[Me]=ae[Me]);return Ce}o(L,"plug");function D(N){let V=u.canvas.captureStream(N),X=T.ctx.createMediaStreamDestination();T.masterNode.connect(X);let ae=new MediaRecorder(V),Me=[];return ae.ondataavailable=be=>{be.data.size>0&&Me.push(be.data)},ae.onerror=()=>{T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop())},ae.start(),{resume(){ae.resume()},pause(){ae.pause()},stop(){return ae.stop(),T.masterNode.disconnect(X),V.getTracks().forEach(be=>be.stop()),new Promise(be=>{ae.onstop=()=>{be(new Blob(Me,{type:"video/mp4"}))}})},download(be="kaboom.mp4"){this.stop().then(nt=>Ps(be,nt))}}}o(D,"record");function O(){return document.activeElement===u.canvas}o(O,"isFocused");let z=w.root.add.bind(w.root),te=w.root.readd.bind(w.root),W=w.root.removeAll.bind(w.root),$=w.root.get.bind(w.root),Q=w.root.wait.bind(w.root),ne=w.root.loop.bind(w.root),Y=w.root.query.bind(w.root),ee=w.root.tween.bind(w.root),H=xn(null,yc),Le=xn(null,mc);d.kaSprite=H,d.boomSprite=Le;function Ge(){w.root.fixedUpdate()}o(Ge,"fixedUpdateFrame");function Te(){w.root.update()}o(Te,"updateFrame");const Ne=class Ne{constructor(V,X,ae,Me,be=!1){b(this,"source");b(this,"target");b(this,"normal");b(this,"distance");b(this,"resolved",!1);this.source=V,this.target=X,this.normal=ae,this.distance=Me,this.resolved=be}get displacement(){return this.normal.scale(this.distance)}reverse(){return new Ne(this.target,this.source,this.normal.scale(-1),this.distance,this.resolved)}hasOverlap(){return!this.displacement.isZero()}isLeft(){return this.displacement.cross(w.gravity||P(0,1))>0}isRight(){return this.displacement.cross(w.gravity||P(0,1))<0}isTop(){return this.displacement.dot(w.gravity||P(0,1))>0}isBottom(){return this.displacement.dot(w.gravity||P(0,1))<0}preventResolution(){this.resolved=!0}};o(Ne,"Collision");let De=Ne;function Xe(N,V){if(V.paused||!V.exists())return!1;for(let ae of N.collisionIgnore)if(V.is(ae))return!1;for(let ae of V.collisionIgnore)if(N.is(ae))return!1;let X=qs(N.worldArea(),V.worldArea());if(X){let ae=new De(N,V,X.normal,X.distance);N.trigger("collideUpdate",V,ae);let Me=ae.reverse();Me.resolved=ae.resolved,V.trigger("collideUpdate",N,Me)}return!0}o(Xe,"narrowPhase");let K=new Wh,le=!1;function de(){if(Fs()){if(!le){le=!0,Os(N=>{N.has("area")&&K.add(N)}),oa(N=>{K.remove(N)}),la((N,V)=>{V==="area"&&K.add(N)}),ua((N,V)=>{V==="area"&&K.remove(N)}),Ls(N=>{le=!1,K.clear()});for(let N of $("*",{recursive:!0}))N.has("area")&&K.add(N)}K.update();for(let[N,V]of K)Xe(N,V)}}o(de,"broadPhase");function Re(){if(Fs())return de()}o(Re,"checkFrame");function Se(N){if(da)return;da=!0,console.error(N),T.ctx.suspend();let V=N.message??String(N)??"Unknown error, check console for more info",X=!1;u.run(()=>{},()=>{X||(X=!0,C(),kt(()=>{let ae=Ee(),Me=Pe(),be={size:36,width:ae-32*2,letterSpacing:4,lineSpacing:4,font:Nr,fixed:!0};ze({width:ae,height:Me,color:he(0,0,255),fixed:!0});let nt=zt({...be,text:"Error",pos:P(32),color:he(255,128,0),fixed:!0});Vt(nt),Us({...be,text:V,pos:P(32,32+nt.height+16),fixed:!0}),je(),w.events.trigger("error",N)}),k())})}o(Se,"handleErr"),d.handleErr=Se;function et(N){g.push(N)}o(et,"onCleanup");function Je(){w.events.onOnce("frameEnd",()=>{u.quit(),m.clear(m.COLOR_BUFFER_BIT|m.DEPTH_BUFFER_BIT|m.STENCIL_BUFFER_BIT);let N=m.getParameter(m.MAX_TEXTURE_IMAGE_UNITS);for(let V=0;VV())})}o(Je,"quit");let tt=!0;u.run(()=>{try{if(f.loaded&&!v.paused){for(let N of d.systemsByEvent[1])N.run();Ge();for(let N of d.systemsByEvent[4])N.run()}}catch(N){Se(N)}},(N,V)=>{try{if(N(),f.loaded||Ut()===1&&!tt&&(f.loaded=!0,fi().forEach(X=>w.events.trigger("loadError",...X)),w.events.trigger("load")),!f.loaded&&t.loadingScreen!==!1||tt)C(),Nu(),k();else{if(!v.paused){for(let X of d.systemsByEvent[0])X.run();Te();for(let X of d.systemsByEvent[3])X.run()}C();for(let X of d.systemsByEvent[2])X.run();Du(),t.debug!==!1&&Lu();for(let X of d.systemsByEvent[5])X.run();k()}tt&&(tt=!1),w.events.trigger("frameEnd"),V()}catch(X){Se(X)}}),Xi(),Ui();let Ce={_k:d,VERSION:wc,loadRoot:tl,loadProgress:Ut,loadSprite:xn,loadSpriteAtlas:Ai,loadSound:dl,loadMusic:fl,loadBitmapFont:yi,loadFont:il,loadShader:ul,loadShaderURL:hl,loadAseprite:sl,loadPedit:ol,loadBean:gl,loadHappy:Zh,loadJSON:nl,load:jr,getSound:xi,getFont:pi,getBitmapFont:mi,getSprite:vi,getShader:wi,getAsset:rl,Asset:lt,SpriteData:tn,SoundData:wn,width:Ee,height:Pe,center:fr,dt:u.dt,fixedDt:u.fixedDt,restDt:u.restDt,time:u.time,screenshot:u.screenshot,record:D,isFocused:O,setCursor:u.setCursor,getCursor:u.getCursor,setCursorLocked:u.setCursorLocked,isCursorLocked:u.isCursorLocked,setFullscreen:u.setFullscreen,isFullscreen:u.isFullscreen,isTouchscreen:u.isTouchscreen,onLoad:us,onLoadError:tu,onLoading:_l,onResize:$l,onGamepadConnect:u.onGamepadConnect,onGamepadDisconnect:u.onGamepadDisconnect,onError:eu,onCleanup:et,flash:Fi,setCamPos:Ci,getCamPos:qi,setCamRot:Bi,getCamRot:Ri,setCamScale:Ti,getCamScale:Ii,getCamTransform:Ar,camPos:ru,camScale:su,camFlash:au,camRot:iu,camTransform:ou,shake:nu,toScreen:Hr,toWorld:Oi,setGravity:uu,getGravity:hu,setGravityDirection:cu,getGravityDirection:sr,setBackground:jo,getBackground:zo,getGamepads:u.getGamepads,getTreeRoot:Au,add:z,make:hs,destroy:zi,destroyAll:W,get:$,query:Y,readd:te,pos:cr,scale:dr,rotate:zl,color:ui,blend:Vo,opacity:hi,anchor:Gr,area:Cl,sprite:zr,text:pl,polygon:Zo,rect:di,circle:Go,ellipse:Ko,uvquad:ml,video:yl,picture:Qo,outline:Xo,particles:Jo,body:ql,surfaceEffector:Il,areaEffector:Bl,pointEffector:Rl,buoyancyEffector:Ll,platformEffector:Ol,constantForce:Fl,doubleJump:Tl,shader:_o,textInput:Pl,timer:Vr,fixed:Pi,stay:ki,health:El,lifespan:Sl,named:Ml,state:kl,z:Vl,layer:Nl,move:Ul,offscreen:jl,follow:Dl,fadeIn:Wo,mask:Yo,drawon:Ho,raycast:ci,tile:Ei,animate:bl,serializeAnimation:Mi,agent:wl,sentry:vl,patrol:Al,pathfinder:xl,fakeMouse:rc,trigger:sc,on:Ve,onFixedUpdate:ic,onUpdate:Hl,onDraw:ac,onAdd:Os,onDestroy:oa,onUse:la,onUnuse:ua,onTag:Kl,onUntag:oc,onClick:lc,onCollide:Wl,onCollideUpdate:Yl,onCollideEnd:Xl,onHover:Jl,onHoverUpdate:Ql,onHoverEnd:Zl,onKeyDown:u.onKeyDown,onKeyPress:u.onKeyPress,onKeyPressRepeat:u.onKeyPressRepeat,onKeyRelease:u.onKeyRelease,onMouseDown:u.onMouseDown,onMousePress:u.onMousePress,onMouseRelease:u.onMouseRelease,onMouseMove:u.onMouseMove,onCharInput:u.onCharInput,onTouchStart:u.onTouchStart,onTouchMove:u.onTouchMove,onTouchEnd:u.onTouchEnd,onScroll:u.onScroll,onHide:u.onHide,onShow:u.onShow,onGamepadButtonDown:u.onGamepadButtonDown,onGamepadButtonPress:u.onGamepadButtonPress,onGamepadButtonRelease:u.onGamepadButtonRelease,onGamepadStick:u.onGamepadStick,onButtonPress:u.onButtonPress,onButtonDown:u.onButtonDown,onButtonRelease:u.onButtonRelease,mousePos:cs,mouseDeltaPos:u.mouseDeltaPos,isKeyDown:u.isKeyDown,isKeyPressed:u.isKeyPressed,isKeyPressedRepeat:u.isKeyPressedRepeat,isKeyReleased:u.isKeyReleased,isMouseDown:u.isMouseDown,isMousePressed:u.isMousePressed,isMouseReleased:u.isMouseReleased,isMouseMoved:u.isMouseMoved,isGamepadButtonPressed:u.isGamepadButtonPressed,isGamepadButtonDown:u.isGamepadButtonDown,isGamepadButtonReleased:u.isGamepadButtonReleased,getGamepadStick:u.getGamepadStick,isButtonPressed:u.isButtonPressed,isButtonDown:u.isButtonDown,isButtonReleased:u.isButtonReleased,setButton:u.setButton,getButton:u.getButton,pressButton:u.pressButton,releaseButton:u.releaseButton,getLastInputDeviceType:u.getLastInputDeviceType,charInputted:u.charInputted,loop:ne,wait:Q,play:gu,setVolume:Di,getVolume:Ni,volume:pu,burp:Li,audioCtx:T.ctx,Line:Ye,Rect:ye,Circle:Oe,Ellipse:ut,Point:sh,Polygon:Be,Vec2:q,Color:ie,Mat4:Xr,Mat23:en,Quad:we,RNG:va,rand:ke,randi:Ks,randSeed:ba,vec2:P,rgb:he,hsl2rgb:th,quad:ve,choose:Ma,chooseMultiple:Sa,shuffle:Ws,chance:Ea,lerp:Fe,tween:ee,easings:ur,map:at,mapc:Aa,wave:Hs,deg2rad:me,rad2deg:qt,clamp:ot,evaluateQuadratic:Ga,evaluateQuadraticFirstDerivative:Ha,evaluateQuadraticSecondDerivative:Ka,evaluateBezier:ts,evaluateBezierFirstDerivative:Wa,evaluateBezierSecondDerivative:Ya,evaluateCatmullRom:Xa,evaluateCatmullRomFirstDerivative:Ja,curveLengthApproximation:ti,normalizedCurve:Qa,hermite:Zn,cardinal:ni,catmullRom:lr,bezier:Za,kochanekBartels:_a,easingSteps:so,easingLinear:no,easingCubicBezier:ro,testLineLine:Jr,testRectRect:Ys,testRectLine:Qr,testRectPoint:pr,testCirclePolygon:mr,testLinePoint:Zr,testLineCircle:Qn,clipLineToRect:Pa,clipLineToCircle:Ca,gjkShapeIntersects:Do,gjkShapeIntersection:qs,isConvex:uo,triangulate:si,NavMesh:Kh,drawSprite:ju,drawText:Us,formatText:zt,drawRect:ze,drawLine:yn,drawLines:fs,drawTriangle:Wi,drawCircle:an,drawEllipse:ds,drawUVQuad:jt,drawPolygon:Ct,drawCurve:Ki,drawBezier:Fu,drawFormattedText:Vt,drawMasked:Uu,drawSubtracted:zu,beginPicture:Pu,appendToPicture:Cu,endPicture:qu,drawPicture:Hi,pushTransform:Ke,popTransform:je,pushTranslate:_e,pushScale:Jn,pushRotate:nn,pushMatrix:Su,usePostEffect:I,makeCanvas:S,drawCanvas:Ou,Picture:Gi,debug:v,scene:vu,getSceneName:Eu,go:bu,onSceneLeave:Ls,layers:xu,getLayers:yu,setLayers:ji,getDefaultLayer:wu,addLevel:Gl,getData:M,setData:R,download:ss,downloadJSON:yo,downloadText:ai,downloadBlob:Ps,plug:L,system:ca,ASCII_CHARS:ho,canvas:u.canvas,addKaboom:mu,LEFT:q.LEFT,RIGHT:q.RIGHT,UP:q.UP,DOWN:q.DOWN,RED:ie.RED,GREEN:ie.GREEN,BLUE:ie.BLUE,YELLOW:ie.YELLOW,MAGENTA:ie.MAGENTA,CYAN:ie.CYAN,WHITE:ie.WHITE,BLACK:ie.BLACK,quit:Je,KEvent:qe,KEventHandler:rs,KEventController:rn,KeepFlags:lu,cancel:o(()=>fo,"cancel"),BlendMode:To};d.k=Ce;let ce=t.plugins;if(ce&&ce.forEach(L),t.global!==!1)for(let N in Ce)window[N]=Ce[N];return t.focus!==!1&&u.canvas.focus(),Ce},"kaplay"),Ac=xc;const vc="G-2GKHT76YTG";function bc(t,e){if(window.gtag){e&&e();return}const n=document.createElement("script");n.async=!0,n.src=`https://www.googletagmanager.com/gtag/js?id=${t}`,n.onload=()=>{window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t,{}),e&&e()},document.head.appendChild(n)}function Ec(){window.gtag&&window.gtag("event","game_start",{event_category:"game"})}function Sc(t,e){window.gtag&&window.gtag("event","block_reached",{event_category:"game",block_index:t,block_name:e})}function Vu(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}const Mc=Vu()?640:1920,kc=Vu()?480:1080,a=Ac({loadingScreen:!1,background:[0,0,0,0],font:"jetbrains",maxFPS:120,backgroundAudio:!1,width:Mc,height:kc,letterbox:!0,pixelDensity:1,crisp:!1,texFilter:"linear"});a.onLoading(t=>{});window.addEventListener("keydown",t=>{(t.key==="/"||t.key==="?")&&t.preventDefault()});a.loadFont("jetbrains","/fonts/jetbrains.ttf",{outline:{width:6,color:a.rgb(8,8,8)}});a.loadSprite("bg4","/sprites/bg4.png");a.loadSprite("bg2","/sprites/bg2.png");a.loadSound("code_sound","/sounds/code_sound.mp3");a.loadSound("wrong_typing","/sounds/wrong typing.mp3");a.loadSprite("muteON","/sprites/muteON.png");a.loadSprite("muteOff","/sprites/muteOFF.png");a.loadSprite("WPM","/sprites/WPM.png");const Pc=[{id:1,title:"twoSum",language:"javascript",blocks:[`var twoSum = function(nums, target) { `,` let map = {}; `,` `,` for (let i = 0; i < nums.length; i++) { @@ -672,14 +672,14 @@ vec4 frag(vec2 pos, vec2 uv, vec4 color, sampler2D tex) { `,` if not root: `,` return True `,` return isMirror(root.left, root.right) -`]}],ga=.35,qc=.18,Tc=60,zs=5,Ic=1,Bc=28,pa=Cc,Rc=.15,ys=.15,Sr=.05,ws=5,xs=40,Qt={resizableObjects:[],timeLeft:0};let dr=!1;function Fc(){dr=!dr}function ma(t){dr=t}function Oc(t){const e=t.isKeyDown("shift");return e&&!dr||!e&&dr}function Wt(t){return t.replace(/\\/g,"\\\\")}function Yr(t,e){t.shake(2),e!=null&&e.mute||t.play("wrong_typing")}function Lc(t){for(let e=t.length-1;e>0;e--){const n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}function ya(t,e){t.loop(.5,()=>{e.opacity=e.opacity===0?.8:0})}const As=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly|def|pass|lambda|nonlocal|global|assert|del|is|not|and|or|True|False|None|elif|except|raise|finally|continue|break|with|as|in|try|yield|await)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],de=t=>({id:"resizablePos",sizeFunc:t,add(){Qt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Dc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Qt.resizableObjects=Qt.resizableObjects.filter(e=>e!==this)}}),Vs=t=>{localStorage.setItem("playMute",JSON.stringify(t))},wa=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},re={mute:!1,practiceMode:!1,isCapsOn:!1,rivalSpeed:0,language:"js"};function Nc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_05.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,n=800,r=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+n/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const g=i+80,y=30;let m=0;if(re.mute=wa(),a.setVolume(re.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Nc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),de(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const E=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g)),a.opacity(1),a.z(21)]),p=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y)),a.opacity(1),a.z(21)]),T=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u,g+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("",{size:e}),de(()=>a.vec2(u+250,g+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);$();const C=a.add([a.text("←",{size:22}),de(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function I(){switch(m){case 0:t=["about","github","start"];break;case 1:t=["yes","no"];break;case 2:t=["javascript","python","golang"];break;case 3:t=["interview","practice"];break}E.text=m===0?"Start":m===1?"Play with Audio?":m===2?"Language":"Game Mode",p.text=t[0],T.text=t[1],m===2?f.text=t[2]:f.text="",te()}function k(K){if(K!==""){const ce=t.find(Fe=>Fe.startsWith(K.toLowerCase()));if(ce)return ce}return{1:"yes",2:"javascript",3:"interview"}[m]||"start"}function x(K){const oe=K.pos.y+h,ce=K.pos.x+K.text.length*16;C.pos=a.vec2(ce,oe),C.animate("pos",[a.vec2(ce,oe),a.vec2(ce+10,oe)],{duration:.5,loop:!0,direction:"ping-pong"})}let v="Start",M=v.length;const R=14,L=a.width()/2.88-(M-1)*R/2;let D=[],O=[];te();function z(){D.forEach(K=>a.destroy(K)),O.forEach(K=>a.destroy(K)),D=[],O=[];for(let K=0;K{K===Se&&(Fe.color=a.rgb(3,255,87),ce=Fe)}),ce?(C.opacity=1,x(ce)):oe.length?(C.opacity=1,x(oe[0].obj)):C.opacity=0}re.mute=wa(),a.setVolume(re.mute?0:.5),w.opacity=re.mute?0:1,S.opacity=re.mute?1:0;const H=a.add([a.text("",{size:e}),a.pos(L,r),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(H.pos.x-30,r),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function $(){w.opacity=re.mute?0:1,S.opacity=re.mute?1:0}let Q="",ne=0,Y="";function ee(K){var Ce;const oe=k(K);(!K||oe.toLowerCase().startsWith(K.toLowerCase()))&&oe!==v&&(v=oe,M=v.length,z());let ce=0,Fe=-1;for(let he=0;hev.length,Qe=K.length>Q.length&&ce>=Se,nt=ce>=2&&K.length>Fe+1;if(tt||Qe){Yr(a,re),Y=Q,H.text=Wt(Y);return}if(ce>ne&&Yr(a,re),ne=ce,nt){Y=K.slice(0,Fe+1),H.text=Wt(Y);return}switch(Y=K,Q=Y,D.forEach((he,Ue)=>{const N=v[Ue],V=K[Ue],X=V?V===" "&&N!==" "?"_":V:N;he.text=Wt(X),he.color=V?V.toLowerCase()!==N.toLowerCase()||V===" "&&N!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),O.forEach((he,Ue)=>{Ue===K.length?(he.color=a.rgb(3,255,87),he.opacity=Math.abs(Math.sin(a.time()*5))):he.opacity=0}),K.toLowerCase()){case"javascript":case"python":case"golang":if(m===2){re.language=K.toLowerCase(),Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),De());break;case"about":m===0&&(window.removeEventListener("keydown",Ne),a.go("about"));break;case"start":if(m===0){Ie(),I();const he=k("");he!==v&&(v=he,M=v.length,z())}break;case"yes":m===1&&(re.mute=!1,Vs(!1),a.setVolume(.5),$(),Ie());break;case"no":m===1&&(re.mute=!0,Vs(!0),a.setVolume(0),$(),Ie());break;case"interview":m===3&&(window.removeEventListener("keydown",Ne),ma(re.isCapsOn),a.go("game"));break;case"practice":m===3&&(re.practiceMode=!0,ma(re.isCapsOn),window.removeEventListener("keydown",Ne),a.go("game"));break}te()}function W(K){Y="",Q="",ne=0,I(),v=K,M=v.length,z(),te(),H.text=""}function De(){m=0,W("Start")}function He(){switch(m){case 1:W("Yes");break;case 2:W("javascript");break;case 3:W("Interview");break;default:W(t[0]);break}}function Ie(){m++,He()}let Ne;function Je(){Ne=K=>{K.getModifierState&&typeof K.getModifierState=="function"&&(re.isCapsOn=K.getModifierState("CapsLock")),K.key.length===1&&(Q=Y,Y+=K.key,H.text=Wt(Y),ee(Y),K.key!==" "&&!re.mute&&a.play("code_sound")),K.key===" "&&(K.preventDefault(),Q=Y,Y+=" ",H.text=Wt(Y),ee(Y))},window.addEventListener("keydown",Ne)}a.onKeyPress("backspace",()=>{Y&&(Y=Y.slice(0,-1),H.text=Wt(Y),ee(Y))}),a.onKeyPress("space",()=>{Q=Y,Y+=" ",H.text=Wt(Y),ee(Y)}),a.onKeyDown("escape",()=>{De()}),a.onUpdate(()=>{O.forEach((K,oe)=>{oe===Y.length?(K.color=a.rgb(3,255,87),K.opacity=Math.abs(Math.sin(a.time()*5))):K.opacity=0})}),I(),Je()});let Uc=a.Color.fromHex("#6a717d"),xa=a.YELLOW,jc=a.Color.RED,Mt=0,vs=18,zc=16.4,St=[],Mr={},kr=!1,$n=0,Or=0,pn=0,Lr=0,Yt=0,bs=0,Pr=0,Cr=0,Bt=0,Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt,Gs="",Hs=[],qr="",dn="",gt="",Es=[];const Vc=t=>{Ec(bc,()=>{Sc()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,n=As[0],r=-1,s=re.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,g=100;let y;const m=pa.filter(U=>(U.language||"default")===re.language),E=Lc([...m]);Hs=E.slice(0,ws).map(U=>U.title);const p={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{p.cursorPos=0,p.line="",p.curLineCount=0,p.curCharInLine=0,p.curIdentSize=0,p.cursorPointer&&(p.cursorPointer.pos=Se())}},T={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{T.cursorPos=0,T.line="",T.curLineCount=0,T.curCharInLine=0,T.curIdentSize=0,T.cursorPointer&&(T.cursorPointer.pos=Se(!0))}},f=(U,G)=>{const{tokens:J,associations:le}=n,{cursorPos:me}=p,{cursorPos:Ze}=T;if(St.includes(U))return jc;if(!re.practiceMode&&(U===Ze||U>me-1&&Ume-1)return Uc;const At=[{test:()=>le.brackets.test(G),color:J.brackets},{test:()=>le.operators.test(G),color:J.operators},{test:()=>le.punctuation.test(G),color:J.punctuation},{test:()=>G==='"'||G==="'",color:J.strings}];for(const{test:fe,color:qe}of At)if(fe())return a.Color.fromHex(qe);let ct="";for(const fe of Es)if(U>=fe.start&&Ule.tags.test(fe),color:J.tags},{test:fe=>le.numbers.test(fe),color:J.numbers},{test:fe=>le.classes.test(fe),color:J.classes},{test:fe=>le.functions.test(fe),color:J.functions},{test:fe=>le.keywords.test(fe),color:J.keywords},{test:fe=>le.strings.test(fe),color:J.strings},{test:fe=>/^[A-Za-z_$][\w$]*$/.test(fe),color:J.variables}];for(const{test:fe,color:qe}of Ar)if(fe(ct))return a.Color.fromHex(qe);return a.Color.fromHex(J.text)};let w=0;a.onUpdate(()=>{if(be(),!kr){C();return}if(Bt+=a.dt(),!re.practiceMode){if(w+=a.dt(),w{UG+J,0)/5}function I(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(U){const G=/[\w$]+|[^\s\w]/g;Es=[];for(const J of U.matchAll(G))Es.push({text:J[0],start:J.index,end:J.index+J[0].length})}function x(){Hu=$n,Ku=Lr,Wu=Or,Yu=pn,Xu=Mt}function v(){kr=!1,Mt=0,Bt=0,$n=0,Lr=0,Or=0,pn=0,Yt=0,bs=0,Pr=0,Cr=0,s=ga,St=[],Mr={}}function M(){const U=a.get("menuItem");for(let G=0;Ga.vec2(0,0),L=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),D=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(re.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(re.practiceMode?0:1)]),a.add([de(R),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const O=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),z=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),te={javascript:"icon_02",ts:"icon_01",golang:"icon_03",react:"icon_04",python:"icon_05",default:"icon_02"},H=pa.filter(U=>(U.language||"default")===re.language).map(U=>({title:U.title,language:U.language||"default"}));H.slice(0,ws).forEach(({title:U,language:G},J)=>{const le=te[G]??te.default;a.add([a.sprite(le),de(()=>a.vec2(a.width()*.02,a.height()*(Rc+Sr*J))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),de(()=>a.vec2(a.width()*.05,a.height()*(ys+Sr*J))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:J}])}),re.mute?(O.opacity=0,z.opacity=1,S()):(O.opacity=1,z.opacity=0,S()),a.onKeyPress(["escape"],()=>{l.stop(),v(),a.go("game")});const Q=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ys-Sr*.5)),a.opacity(1),a.animate()]);let ne=-1,Y=Q.pos.y;function ee(){const U=a.height()*(ys+Sr*ne);Q.pos=a.vec2(Q.pos.x,U),Q.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(G=>{G.menuIndex===ne?G.color=a.YELLOW:G.color=a.WHITE})}const W=()=>a.vec2(a.width(),a.height()),De=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),He=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),de(De),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const Ie=a.add([Dc(W),de(De),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),Ne=()=>a.vec2(He).sub(0,Bc*(xs*e)),Je=Ie.add([a.text("",{size:vs,lineSpacing:12,letterSpacing:2,transform:(U,G)=>({color:f(U,G)})}),a.pos(0,0),de(Ne)]),oe=vs+12,ce=(oe-vs)/2,Fe=10,Se=(U=!1)=>{const G=U?T:p,J=G.curLineCount-e*xs,le=G.curCharInLine*zc,me=J*oe+ce+Fe;return Ie.pos.add(Je.pos).add(le,me)},tt=a.add([a.text("_",{size:16}),de(()=>Se()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Qe=a.add([a.text("_",{size:16}),de(()=>Se(!0)),a.opacity(re.practiceMode?0:1),a.anchor("left"),a.color(xa)]);ya(a,tt),re.practiceMode||ya(a,Qe),p.cursorPointer=tt,T.cursorPointer=Qe;function nt(){return E[r]?E[r]:(console.error("No dialogs found for the selected language"),E[0])}const Ce=U=>{if(a.debug.inspect!==!0)return;const G=U[p.cursorPos],J=U.substring(0,p.cursorPos),le=U.substring(p.cursorPos+1);console.log(`%c${J}%c${G}%c${le}`,"color: inherit;","color: #f00;","color: inherit;")};function he(){if(r++,r>0&&Mt++,c+=.05,Ue(),Mt===zs){Mt=zs,x(),v(),l.stop(),a.go("endgame");return}const U=ga,G=qc,J=4;if(Mt>0){const ct=Math.min(Mt,J)/J;s=U*Math.pow(G/U,ct)}else s=U;p.reset(),T.reset(),Q.pos=a.vec2(Q.pos.x,Y),nect.name===me)||As[0];const Ze=le.blocks;i.lineCount=Ze.length,qr=Ze.join(""),k(qr);const At=I(qr);gt=qr.replace(/▯/g," "),dn=At,Je.text=dn,p.line=gt.split(` -`)[0],T.line=p.line,Gs=le.title,tt.updatePos(),Qe.updatePos()}function Ue(){l.speed=c}function N(){dn=gt.split("").map((U,G)=>St.includes(G)?U===` -`?`${Mr[G]} -`:Mr[G]:U).join(""),dn=I(dn),Je.text=dn}function V(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos++,G.curCharInLine++,G.cursorPointer.pos=Se(U),Ce(gt))}function X(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos--,G.curCharInLine--,G.cursorPointer.pos=Se(U),Ce(gt))}function ie(U=!1){var me;const G=U?T:p;if(!G.cursorPointer)return;G.curLineCount++,p.curLineCount>=xs*(e+1)&&e++,U||Cr++;const J=gt.split(` -`)[G.curLineCount];if(!J)return;const le=((me=J.match(/^\s+/))==null?void 0:me[0].length)||0;G.line=J,G.cursorPos+=le,G.curIdentSize=le,G.curCharInLine=le,Je.updatePos(),G.cursorPointer.pos=Se(U),tt.updatePos(),Qe.updatePos()}function Me(){gt[T.cursorPos]===` -`?(V(!0),ie(!0)):V(!0)}function be(){D.text=Bt.toFixed(1),Bt>0&&Yt>5&&($n=Yt&&Bt>1?Yt/5/(Bt/60):0,Or=Cr&&Bt>1?Cr/(Bt/60):0,pn=Pr>0?Yt/Pr*100:100,isNaN(pn)&&(pn=100),L.text=Math.round($n||0).toString())}const rt=60;let ln=new Array(rt).fill(0),un=Math.floor(a.time());function xr(){let U=Math.floor(a.time());if(U!==un){for(let J=un+1;J<=U;J++){let le=J%rt;ln[le]=0}un=U}let G=U%rt;ln[G]++}a.onKeyPress("capslock",()=>{Fc()}),a.onKeyPress(U=>{if((p.cursorPos>0?gt[p.cursorPos]:"")===` -`)return;const J=gt[p.cursorPos],le=Oc(a);let me=U,Ze,At=!1;if(!(me==="backspace"||me==="enter"||me==="shift")){if(me.length===1)me=le?me.toUpperCase():me.toLowerCase(),Ze=me;else if(me==="space")me=" ",Ze="_";else return;if(Pr++,At=me===J,At)re.mute||a.play("code_sound"),Yt++,xr(),V();else{if(St.length>Ic)return Yr(a,re);St.push(p.cursorPos),Mr[p.cursorPos]=Ze,N(),V(),a.shake(2),re.mute||a.play("wrong_typing"),bs++}!kr&&(Yt>0||bs>0)&&(kr=!0)}}),a.onKeyPress("enter",()=>{const G=gt[p.cursorPos]===` -`;if(St.length>0||!G)return Yr(a,re);if(p.curLineCount>=i.lineCount-1)return he();V(),ie()}),a.onKeyPressRepeat("backspace",()=>{if(!(p.cursorPos<=0)){if(p.curCharInLine===p.curIdentSize&&p.curLineCount>0)return a.shake(2);X(),St.includes(p.cursorPos)&&(St=St.filter(U=>U!==p.cursorPos)),N()}}),a.onResize(()=>{for(const U of Qt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),he(),M(),ee()};a.scene("game",Vc);const Gc=({wpm:t,lpm:e,acc:n,bestWpm:r,blockNames:s,bestLvl:i})=>{const l=Ju(),c={wpm:t,lpm:e,acc:n,bestLvl:i,bestWpm:Math.max(r,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Ju=()=>{const t="playerData=",e=document.cookie.split("; ").find(n=>n.startsWith(t));if(!e)return null;try{const n=e.substring(t.length);return JSON.parse(decodeURIComponent(n))}catch(n){return console.error("Error parsing playerData cookie:",n),null}};a.scene("endgame",()=>{let t=18,e=Xu,n=Gs,r=parseFloat((Hu||0).toFixed(0)),s=parseFloat((Wu||0).toFixed(0)),i=parseFloat((Yu||0).toFixed(0));parseFloat((Ku||0).toFixed(0));const l=Ju()||{},c=Math.max(parseFloat(l.bestWpm)||0,r);r=parseFloat((r||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Gc({wpm:r,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:Hs}),Vs(re.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,g=.01,y=100;let m;function E(){if(clearInterval(m),re.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),T=a.width()*.1,f=a.height()*.2,w=(R,L)=>de(()=>p().add(a.vec2(R,L))),S=-T-45,C=f*.45,I=t+20,k=4*t*.6;a.add([a.sprite("bg2"),a.pos(p()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(p()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(r.toFixed(0),{size:42}),w(-T,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+k+20,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+k+20,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${zs}`,{size:42}),w(+T,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+T,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(n,{size:t}),w(+T,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const x=t+15;Hs.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),de(()=>a.vec2(a.width()*.45,a.height()*.78+L*x)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const v=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(v.opacity=0,M.opacity=1,E()):(v.opacity=1,M.opacity=0,E()),a.add([a.text("ESC to retry",{size:20}),de(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,n="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,n=a.height()*.4+20,r=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),de(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. +`]}],fa=.35,Cc=.18,qc=60,js=5,ga=1,Tc=28,pa=Pc,Ic=.15,ms=.15,kr=.05,ys=5,ws=40,Jt={resizableObjects:[],timeLeft:0};function _n(t){return t.replace(/\\/g,"\\\\")}function ir(t,e){t.shake(2),e!=null&&e.mute||t.play("wrong_typing")}function Bc(t){for(let e=t.length-1;e>0;e--){const n=Math.floor(Math.random()*(e+1));[t[e],t[n]]=[t[n],t[e]]}return t}function ma(t,e){t.loop(.5,()=>{e.opacity=e.opacity===0?.8:0})}const xs=[{name:"default",tokens:{functions:"#2688ff",classes:"#fc7e05",brackets:"#F2F6FF",keywords:"#df75ff",comments:"#5C6370",strings:"#97ff4d",numbers:"#fc7e05",variables:"#8ae2ff",types:"#ff9e42",operators:"#F2F6FF",punctuation:"#F2F6FF",attributes:"#fc7e05",tags:"#8ae2ff",text:"#F2F6FF",background:"#282C34",constants:"#fc7e05",decorators:"#df75ff",regex:"#97ff4d",foreground:"#F2F6FF"},associations:{functions:/function\s*|=>\s*/,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/,brackets:/[\(\)\[\]\{\}<>]/,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly|def|pass|lambda|nonlocal|global|assert|del|is|not|and|or|True|False|None|elif|except|raise|finally|continue|break|with|as|in|try|yield|await)\b/,types:/:\s*[A-Za-z_$][\w$<>, ]*/,decorators:/@\w+/,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/,numbers:/\b\d+(\.\d+)?\b/,punctuation:/[\.,;:]/,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/,constants:/\b[A-Z0-9_]+\b/,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/}},{name:"ts",tokens:{functions:"#61AFEF",classes:"#f27c0c",brackets:"#e6eeff",keywords:"#e48aff",comments:"#5C6370",strings:"#98C379",numbers:"#f27c0c",variables:"#E06C75",types:"#E5C07B",operators:"#56B6C2",punctuation:"#e6eeff",attributes:"#f27c0c",tags:"#E06C75",text:"#e6eeff",background:"#282C34",constants:"#f27c0c",decorators:"#e48aff",regex:"#98C379",foreground:"#e6eeff"},associations:{functions:/function\s*|=>\s*/g,classes:/\b(?:class|interface|enum)\s+[A-Z]\w*\b/g,brackets:/[\(\)\[\]\{\}<>]/g,keywords:/\b(?:let|const|var|if|else|for|while|do|switch|case|break|continue|return|import|export|default|from|as|class|extends|super|this|new|try|catch|finally|throw|typeof|instanceof|void|delete|in|of|with|yield|async|await|constructor|interface|type|enum|implements|namespace|abstract|readonly)\b/g,types:/:\s*[A-Za-z_$][\w$<>, ]*/g,decorators:/@\w+/g,regex:/\/(\\\/|[^\/\n])+\/[gimsuy]*/g,strings:/"(\\.|[^"\\])*"|'(\\.|[^'\\])*'/g,numbers:/\b\d+(\.\d+)?\b/g,punctuation:/[\.,;:]/g,operators:/[=+\-*/<>!%&|^~]=?|===?|!==?|<<|>>|>>>/g,variables:/\b[a-zA-Z_$][a-zA-Z0-9_$]*\b/g,tags:/<\/?[A-Za-z][\w-]*(?:\s+[^>]+)?>/g,attributes:/\b[a-zA-Z\-:]+\s*=\s*["'][^"']*["']/g,constants:/\b[A-Z0-9_]+\b/g,generics:/<\s*[A-Za-z_$][\w$]*(\s*,\s*[A-Za-z_$][\w$]*)*\s*>/g}}],fe=t=>({id:"resizablePos",sizeFunc:t,add(){Jt.resizableObjects.push(this),this.pos=this.sizeFunc()},updatePos(){},destroy(){Jt.resizableObjects=Jt.resizableObjects.filter(e=>e!==this)}}),Rc=t=>({id:"resizableRect",resizeFunc:t,add(){},updateRectSize(){},destroy(){Jt.resizableObjects=Jt.resizableObjects.filter(e=>e!==this)}}),zs=t=>{localStorage.setItem("playMute",JSON.stringify(t))},ya=()=>{const t=localStorage.getItem("playMute");return t?JSON.parse(t):!1},re={mute:!1,practiceMode:!1,isCapsOn:!1,rivalSpeed:0,language:"js"};function Fc(){return/Mobi|Android|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}a.scene("selection",()=>{a.loadSprite("icon_05","/sprites/icon_05.png"),a.loadSprite("icon_04","/sprites/icon_04.png"),a.loadSprite("icon_03","/sprites/icon_03.png"),a.loadSprite("icon_02","/sprites/icon_02.png"),a.loadSprite("icon_01","/sprites/icon_01.png"),a.loadSprite("BG_WPM_IN_GAME","/sprites/BG_WPM_IN_GAME.png"),a.loadSprite("BG_TIME_IN_GAME","/sprites/BG_TIME_IN_GAME.png"),a.loadSprite("SilverDevs","/sprites/SilverDev_logo.png"),a.loadMusic("videogame","/sounds/videogame.mp3");let t=[];const e=18,n=800,r=a.height()*.85,s=a.height()*.86,i=a.height()*.66,c=a.width()*.3-10+n/2,h=0,u=a.width()*.35-40;a.width()*.6-40;const g=i+80,y=30;let m=0;if(re.mute=ya(),a.setVolume(re.mute?0:.5),a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),Fc()){a.add([a.text("WPM is a desktop-only experience",{size:18}),fe(()=>a.vec2(a.width()*.5,a.height()*.5)),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.sprite("WPM"),fe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.scale(.5),a.z(18)]);return}a.add([a.pos(c,a.height()*.5),a.anchor("center"),a.text("Get faster and better at technical interviewing",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.pos(c,a.height()*.55),a.anchor("center"),a.text("by practicing typing code.",{size:22}),a.color(a.WHITE),a.z(21)]),a.add([a.sprite("WPM"),fe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(810,260,{radius:0}),a.pos(a.width()*.3-15,i),a.color(a.rgb(52,53,54)),a.z(20),a.opacity(.3)]),a.add([a.rect(790,230,{radius:1}),a.pos(a.width()*.3-5,i+20),a.color(0,0,0),a.z(20),a.opacity(1)]);const E=a.add([a.anchor("left"),a.text("",{size:e}),fe(()=>a.vec2(u,g)),a.opacity(1),a.z(21)]),p=a.add([a.anchor("left"),a.text("",{size:e}),fe(()=>a.vec2(u,g+y)),a.opacity(1),a.z(21)]),T=a.add([a.anchor("left"),a.text("",{size:e}),fe(()=>a.vec2(u,g+y*2)),a.opacity(1),a.z(21)]),f=a.add([a.anchor("left"),a.text("",{size:e}),fe(()=>a.vec2(u+250,g+y)),a.opacity(1),a.z(21)]),w=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),S=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);$();const C=a.add([a.text("←",{size:22}),fe(()=>a.vec2(0,0)),a.anchor("left"),a.color(a.rgb(3,255,87)),a.opacity(1),a.z(22),a.animate()]);function I(){switch(m){case 0:t=["about","github","start"];break;case 1:t=["yes","no"];break;case 2:t=["javascript","python","golang"];break;case 3:t=["interview","practice"];break}E.text=m===0?"Start":m===1?"Play with Audio?":m===2?"Language":"Game Mode",p.text=t[0],T.text=t[1],m===2?f.text=t[2]:f.text="",te()}function k(K){if(K!==""){const de=t.find(Re=>Re.startsWith(K.toLowerCase()));if(de)return de}return{1:"yes",2:"javascript",3:"interview"}[m]||"start"}function x(K){const le=K.pos.y+h,de=K.pos.x+K.text.length*16;C.pos=a.vec2(de,le),C.animate("pos",[a.vec2(de,le),a.vec2(de+10,le)],{duration:.5,loop:!0,direction:"ping-pong"})}let v="Start",M=v.length;const R=14,L=a.width()/2.88-(M-1)*R/2;let D=[],O=[];te();function z(){D.forEach(K=>a.destroy(K)),O.forEach(K=>a.destroy(K)),D=[],O=[];for(let K=0;K{K===Se&&(Re.color=a.rgb(3,255,87),de=Re)}),de?(C.opacity=1,x(de)):le.length?(C.opacity=1,x(le[0].obj)):C.opacity=0}re.mute=ya(),a.setVolume(re.mute?0:.5),w.opacity=re.mute?0:1,S.opacity=re.mute?1:0;const W=a.add([a.text("",{size:e}),a.pos(L,r),a.anchor("left"),a.color(a.YELLOW),a.opacity(0),a.z(21)]);a.add([a.text("-",{size:e}),a.pos(W.pos.x-30,r),a.anchor("left"),a.color(a.rgb(3,255,87)),a.z(21)]);function $(){w.opacity=re.mute?0:1,S.opacity=re.mute?1:0}let Q="",ne=0,Y="";function ee(K){var Ce;const le=k(K);(!K||le.toLowerCase().startsWith(K.toLowerCase()))&&le!==v&&(v=le,M=v.length,z());let de=0,Re=-1;for(let ce=0;cev.length,Je=K.length>Q.length&&de>=Se,tt=de>=2&&K.length>Re+1;if(et||Je){ir(a,re),Y=Q,W.text=_n(Y);return}if(de>ne&&ir(a,re),ne=de,tt){Y=K.slice(0,Re+1),W.text=_n(Y);return}switch(Y=K,Q=Y,D.forEach((ce,Ne)=>{const N=v[Ne],V=K[Ne],X=V?V===" "&&N!==" "?"_":V:N;ce.text=_n(X),ce.color=V?V.toLowerCase()!==N.toLowerCase()||V===" "&&N!==" "?a.rgb(255,0,0):a.rgb(3,255,87):a.rgb(128,128,128)}),O.forEach((ce,Ne)=>{Ne===K.length?(ce.color=a.rgb(3,255,87),ce.opacity=Math.abs(Math.sin(a.time()*5))):ce.opacity=0}),K.toLowerCase()){case"javascript":case"python":case"golang":if(m===2){re.language=K.toLowerCase(),Te(),I();const ce=k("");ce!==v&&(v=ce,M=v.length,z())}break;case"github":m===0&&(window.open("https://github.com/conanbatt/wpm","_blank"),Le());break;case"about":m===0&&(window.removeEventListener("keydown",De),a.go("about"));break;case"start":if(m===0){Te(),I();const ce=k("");ce!==v&&(v=ce,M=v.length,z())}break;case"yes":m===1&&(re.mute=!1,zs(!1),a.setVolume(.5),$(),Te());break;case"no":m===1&&(re.mute=!0,zs(!0),a.setVolume(0),$(),Te());break;case"interview":m===3&&(window.removeEventListener("keydown",De),a.go("game"));break;case"practice":m===3&&(re.practiceMode=!0,window.removeEventListener("keydown",De),a.go("game"));break}te()}function H(K){Y="",Q="",ne=0,I(),v=K,M=v.length,z(),te(),W.text=""}function Le(){m=0,H("Start")}function Ge(){switch(m){case 1:H("Yes");break;case 2:H("javascript");break;case 3:H("Interview");break;default:H(t[0]);break}}function Te(){m++,Ge()}let De;function Xe(){De=K=>{K.preventDefault(),K.getModifierState&&typeof K.getModifierState=="function"&&(re.isCapsOn=K.getModifierState("CapsLock")),K.key.length===1&&(Q=Y,Y+=K.key,W.text=_n(Y),ee(Y),K.key!==" "&&!re.mute&&a.play("code_sound"))},window.addEventListener("keydown",De)}a.onKeyPress("backspace",()=>{Y&&(Y=Y.slice(0,-1),W.text=_n(Y),ee(Y))}),a.onKeyDown("escape",()=>{Le()}),a.onUpdate(()=>{O.forEach((K,le)=>{le===Y.length?(K.color=a.rgb(3,255,87),K.opacity=Math.abs(Math.sin(a.time()*5))):K.opacity=0})}),I(),Xe()});let Oc=a.Color.fromHex("#6a717d"),wa=a.YELLOW,Lc=a.Color.RED,St=0,As=18,Dc=16.4,ft=[],$n={},Pr=!1,tr=0,Lr=0,pn=0,Dr=0,Wt=0,vs=0,Cr=0,qr=0,It=0,Gu=tr,Hu=Dr,Ku=Lr,Wu=pn,Yu=St,Vs="",Gs=[],Tr="",dn="",gt="",bs=[];const Nc=t=>{bc(vc,()=>{Ec()}),a.loadMusic("endgame","/sounds/endgame.mp3"),a.loadSprite("arrow_yellow","/sprites/arrow_yellow.png");let e=0,n=xs[0],r=-1,s=re.rivalSpeed,i={lineCount:0};const l=a.play("videogame");let c=.95;l.loop=!0,l.volume=0;const h=.3,u=.01,g=100;let y;const m=pa.filter(U=>(U.language||"default")===re.language),E=Bc([...m]);Gs=E.slice(0,ys).map(U=>U.title);const p={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{p.cursorPos=0,p.line="",p.curLineCount=0,p.curCharInLine=0,p.curIdentSize=0,p.cursorPointer&&(p.cursorPointer.pos=Se())}},T={cursorPos:0,line:"",curLineCount:0,curCharInLine:0,curIdentSize:0,cursorPointer:null,reset:()=>{T.cursorPos=0,T.line="",T.curLineCount=0,T.curCharInLine=0,T.curIdentSize=0,T.cursorPointer&&(T.cursorPointer.pos=Se(!0))}},f=(U,G)=>{const{tokens:J,associations:ue}=n,{cursorPos:xe}=p,{cursorPos:Qe}=T;if(ft.includes(U))return Lc;if(!re.practiceMode&&(U===Qe||U>xe-1&&Uxe-1)return Oc;const ht=[{test:()=>ue.brackets.test(G),color:J.brackets},{test:()=>ue.operators.test(G),color:J.operators},{test:()=>ue.punctuation.test(G),color:J.punctuation},{test:()=>G==='"'||G==="'",color:J.strings}];for(const{test:se,color:Kt}of ht)if(se())return a.Color.fromHex(Kt);let At="";for(const se of bs)if(U>=se.start&&Uue.tags.test(se),color:J.tags},{test:se=>ue.numbers.test(se),color:J.numbers},{test:se=>ue.classes.test(se),color:J.classes},{test:se=>ue.functions.test(se),color:J.functions},{test:se=>ue.keywords.test(se),color:J.keywords},{test:se=>ue.strings.test(se),color:J.strings},{test:se=>/^[A-Za-z_$][\w$]*$/.test(se),color:J.variables}];for(const{test:se,color:Kt}of br)if(se(At))return a.Color.fromHex(Kt);return a.Color.fromHex(J.text)};let w=0;a.onUpdate(()=>{if(be(),!Pr){C();return}if(It+=a.dt(),!re.practiceMode){if(w+=a.dt(),w{UG+J,0)/5}function I(U){return U.replace(/\\/g,"\\\\").replace(/\[/g,"\\[").replace(/\]/g,"\\]").replace(/\{/g,"\\{").replace(/\}/g,"\\}").replace(/'/g,"\\'")}function k(U){const G=/[\w$]+|[^\s\w]/g;bs=[];for(const J of U.matchAll(G))bs.push({text:J[0],start:J.index,end:J.index+J[0].length})}function x(){Gu=tr,Hu=Dr,Ku=Lr,Wu=pn,Yu=St}function v(){ft.length=0,Object.keys($n).forEach(U=>delete $n[U]),Pr=!1,St=0,It=0,tr=0,Dr=0,Lr=0,pn=0,Wt=0,vs=0,Cr=0,qr=0,s=fa,r=-1,window.removeEventListener("keydown",un)}function M(){const U=a.get("menuItem");for(let G=0;Ga.vec2(0,0),L=a.add([a.anchor("left"),a.pos(a.width()*.25+90,a.height()*.025),a.text("0",{size:18}),a.color(a.YELLOW),a.z(21)]),D=a.add([a.anchor("left"),a.pos(a.width()*.35+90,a.height()*.025),a.text("time: ",{size:18}),a.color(a.YELLOW),a.z(22),a.opacity(re.practiceMode?0:1)]);a.add([a.sprite("BG_WPM_IN_GAME"),a.pos(a.width()*.25,a.height()*.02+5),a.anchor("left"),a.z(20)]),a.add([a.sprite("BG_TIME_IN_GAME"),a.pos(a.width()*.35,a.height()*.02+5),a.anchor("left"),a.z(20),a.opacity(re.practiceMode?0:1)]),a.add([fe(R),a.sprite("bg2"),a.anchor("topleft"),a.opacity(1)]),a.add([a.pos(a.width()*.01+10,a.height()*.01-10),a.sprite("SilverDevs"),a.anchor("topleft"),a.opacity(1),a.z(51)]),a.add([a.rect(2e3,54,{radius:0}),a.pos(1e3,0),a.color(a.rgb(7,7,7)),a.outline(2),a.anchor("top"),a.z(10)]),a.add([a.text("Challenges",{size:20}),fe(()=>a.vec2(a.width()*.05,a.height()*.1)),a.color(a.WHITE),a.opacity(1)]),a.add([a.text("ESC to retry",{size:20}),fe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]);const O=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),z=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]),te={javascript:"icon_02",ts:"icon_01",golang:"icon_03",react:"icon_04",python:"icon_05",default:"icon_02"},W=pa.filter(U=>(U.language||"default")===re.language).map(U=>({title:U.title,language:U.language||"default"}));W.slice(0,ys).forEach(({title:U,language:G},J)=>{const ue=te[G]??te.default;a.add([a.sprite(ue),fe(()=>a.vec2(a.width()*.02,a.height()*(Ic+kr*J))),a.opacity(1),a.z(55),"challengeIcon"]),a.add([a.text(U,{size:20}),fe(()=>a.vec2(a.width()*.05,a.height()*(ms+kr*J))),a.color(a.WHITE),a.opacity(1),"menuItem",{menuIndex:J}])}),re.mute?(O.opacity=0,z.opacity=1,S()):(O.opacity=1,z.opacity=0,S()),a.onKeyPress(["escape"],()=>{l.stop(),v(),a.go("game")});const Q=a.add([a.sprite("arrow_yellow"),a.pos(a.width()*.1,a.height()*(ms-kr*.5)),a.opacity(1),a.animate()]);let ne=-1,Y=Q.pos.y;function ee(){const U=a.height()*(ms+kr*ne);Q.pos=a.vec2(Q.pos.x,U),Q.animate("pos",[a.vec2(10,U),a.vec2(20,U)],{duration:.5,direction:"ping-pong"}),a.get("menuItem").forEach(G=>{G.menuIndex===ne?G.color=a.YELLOW:G.color=a.WHITE})}const H=()=>a.vec2(a.width(),a.height()),Le=()=>a.width()>1080?a.vec2(450,0):a.vec2(a.width()*.3,0),Ge=a.vec2(50,103);a.setVolume(.5),a.add([a.rect(1920,1080,{radius:8}),a.color(a.rgb(53,53,71)),fe(Le),a.anchor("topleft"),a.opacity(.3),a.z(0)]);const Te=a.add([Rc(H),fe(Le),a.anchor("topleft"),a.color(),a.rotate(0),a.scale(1),a.z(10),a.opacity(0)]),De=()=>a.vec2(Ge).sub(0,Tc*(ws*e)),Xe=Te.add([a.text("",{size:As,lineSpacing:12,letterSpacing:2,transform:(U,G)=>({color:f(U,G)})}),a.pos(0,0),fe(De)]),le=As+12,de=(le-As)/2,Re=10,Se=(U=!1)=>{const G=U?T:p,J=G.curLineCount-e*ws,ue=G.curCharInLine*Dc,xe=J*le+de+Re;return Te.pos.add(Xe.pos).add(ue,xe)},et=a.add([a.text("_",{size:16}),fe(()=>Se()),a.opacity(1),a.anchor("left"),a.color(255,255,255),a.z(10)]),Je=a.add([a.text("_",{size:16}),fe(()=>Se(!0)),a.opacity(re.practiceMode?0:1),a.anchor("left"),a.color(wa)]);ma(a,et),re.practiceMode||ma(a,Je),p.cursorPointer=et,T.cursorPointer=Je;function tt(){return E[r]?E[r]:(console.error("No dialogs found for the selected language"),E[0])}const Ce=U=>{if(a.debug.inspect!==!0)return;const G=U[p.cursorPos],J=U.substring(0,p.cursorPos),ue=U.substring(p.cursorPos+1);console.log(`%c${J}%c${G}%c${ue}`,"color: inherit;","color: #f00;","color: inherit;")};function ce(){if(r++,r>0&&St++,c+=.05,Ne(),St===js){St=js,x(),v(),l.stop(),a.go("endgame");return}const U=fa,G=Cc,J=4;if(St>0){const At=Math.min(St,J)/J;s=U*Math.pow(G/U,At)}else s=U;p.reset(),T.reset(),Q.pos=a.vec2(Q.pos.x,Y),neAt.name===xe)||xs[0];const Qe=ue.blocks;i.lineCount=Qe.length,Tr=Qe.join(""),k(Tr);const ht=I(Tr);gt=Tr.replace(/▯/g," "),dn=ht,Xe.text=dn,p.line=gt.split(` +`)[0],T.line=p.line,Vs=ue.title,et.updatePos(),Je.updatePos()}function Ne(){l.speed=c}function N(){dn=gt.split("").map((U,G)=>ft.includes(G)?U===` +`?`${$n[G]} +`:$n[G]:U).join(""),dn=I(dn),Xe.text=dn}function V(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos++,G.curCharInLine++,G.cursorPointer.pos=Se(U),Ce(gt))}function X(U=!1){const G=U?T:p;G.cursorPointer&&(G.cursorPos--,G.curCharInLine--,G.cursorPointer.pos=Se(U),Ce(gt))}function ae(U=!1){var xe;const G=U?T:p;if(!G.cursorPointer)return;G.curLineCount++,p.curLineCount>=ws*(e+1)&&e++,U||qr++;const J=gt.split(` +`)[G.curLineCount];if(!J)return;const ue=((xe=J.match(/^\s+/))==null?void 0:xe[0].length)||0;G.line=J,G.cursorPos+=ue,G.curIdentSize=ue,G.curCharInLine=ue,Xe.updatePos(),G.cursorPointer.pos=Se(U),et.updatePos(),Je.updatePos()}function Me(){gt[T.cursorPos]===` +`?(V(!0),ae(!0)):V(!0)}function be(){D.text=It.toFixed(1),It>0&&Wt>5&&(tr=Wt&&It>1?Wt/5/(It/60):0,Lr=qr&&It>1?qr/(It/60):0,pn=Cr>0?Wt/Cr*100:100,isNaN(pn)&&(pn=100),L.text=Math.round(tr||0).toString())}const nt=60;let on=new Array(nt).fill(0),ln=Math.floor(a.time());function vr(){let U=Math.floor(a.time());if(U!==ln){for(let J=ln+1;J<=U;J++){let ue=J%nt;on[ue]=0}ln=U}let G=U%nt;on[G]++}const un=U=>{const G=U.key;if((p.cursorPos>0?gt[p.cursorPos]:"")===` +`)return;const ue=gt[p.cursorPos];let xe=G,Qe,ht=!1;if(!(xe==="Backspace"||xe==="Enter"||xe==="Shift")){if(ft.length>ga)return U.preventDefault(),ir(a,re);if(xe===" ")xe=" ",Qe="_";else if(xe.length===1)Qe=xe;else return;if(Cr++,ht=xe===ue,ht)re.mute||a.play("code_sound"),Wt++,vr(),V();else{if(ft.length>ga)return ir(a,re);ft.push(p.cursorPos),$n[p.cursorPos]=Qe,N(),V(),a.shake(2),re.mute||a.play("wrong_typing"),vs++}!Pr&&(Wt>0||vs>0)&&(Pr=!0)}};window.addEventListener("keydown",un),a.onDestroy(()=>{window.removeEventListener("keydown",un)}),a.onKeyPress("enter",()=>{const G=gt[p.cursorPos]===` +`;if(ft.length>0||!G)return ir(a,re);if(p.curLineCount>=i.lineCount-1)return ce();V(),ae()}),a.onKeyPressRepeat("backspace",()=>{if(!(p.cursorPos<=0)){if(p.curCharInLine===p.curIdentSize&&p.curLineCount>0)return a.shake(2);X(),ft.includes(p.cursorPos)&&(ft=ft.filter(U=>U!==p.cursorPos)),N()}}),a.onResize(()=>{for(const U of Jt.resizableObjects)U.is("resizablePos")&&U.updatePos(),U.is("resizableRect")&&U.updateRectSize()}),ce(),M(),ee()};a.scene("game",Nc);const Uc=({wpm:t,lpm:e,acc:n,bestWpm:r,blockNames:s,bestLvl:i})=>{const l=Xu(),c={wpm:t,lpm:e,acc:n,bestLvl:i,bestWpm:Math.max(r,(l==null?void 0:l.bestWpm)||0),blockNames:s,loadDate:new Date().toISOString()},h=encodeURIComponent(JSON.stringify(c)),u=60*60*24*30;document.cookie=`playerData=${h}; domain=silver.dev; path=/; max-age=${u}; SameSite=Lax`},Xu=()=>{const t="playerData=",e=document.cookie.split("; ").find(n=>n.startsWith(t));if(!e)return null;try{const n=e.substring(t.length);return JSON.parse(decodeURIComponent(n))}catch(n){return console.error("Error parsing playerData cookie:",n),null}};a.scene("endgame",()=>{let t=18,e=Yu,n=Vs,r=parseFloat((Gu||0).toFixed(0)),s=parseFloat((Ku||0).toFixed(0)),i=parseFloat((Wu||0).toFixed(0));parseFloat((Hu||0).toFixed(0));const l=Xu()||{},c=Math.max(parseFloat(l.bestWpm)||0,r);r=parseFloat((r||0).toFixed(0)),s=parseFloat((s||0).toFixed(0)),i=parseFloat((i||0).toFixed(0)),Uc({wpm:r,bestLvl:e,bestWpm:c,lpm:s,acc:i,blockNames:Gs}),zs(re.mute),a.setVolume(1);const h=a.play("endgame");h.loop=!0,h.volume=0;const u=.05,g=.01,y=100;let m;function E(){if(clearInterval(m),re.mute)h.volume=0;else{let R=0;m=setInterval(()=>{Ra.vec2(a.width()/2,a.height()/2),T=a.width()*.1,f=a.height()*.2,w=(R,L)=>fe(()=>p().add(a.vec2(R,L))),S=-T-45,C=f*.45,I=t+20,k=4*t*.6;a.add([a.sprite("bg2"),a.pos(p()),a.anchor("center"),a.z(10)]),a.add([a.sprite("WPM"),fe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.rect(1080,925,{radius:36}),a.pos(p()),a.anchor("center"),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(-T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.rect(290,280,{radius:36}),w(+T-145,-f+130),a.color(a.rgb(53,53,71)),a.z(10),a.opacity(.3)]),a.add([a.text("WPM",{size:32}),w(-T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(r.toFixed(0),{size:42}),w(-T,f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("BEST",{size:t}),w(S,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text(c.toFixed(0),{size:t}),w(S+k+20,C),a.anchor("left"),a.color(a.WHITE),a.z(20)]),a.add([a.text("ACC",{size:t}),w(S,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text(`${i.toFixed(0)}%`,{size:t}),w(S+k+20,C+I),a.anchor("left"),a.color(a.YELLOW),a.z(19)]),a.add([a.text("SCORE",{size:32}),w(+T,-f/10),a.anchor("center"),a.color(a.WHITE),a.z(19)]),a.add([a.text(`${e}/${js}`,{size:42}),w(+T,+f*.2),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("Last challenge",{size:t}),w(+T,+f*.45),a.anchor("center"),a.color(a.WHITE),a.z(18)]),a.add([a.text(n,{size:t}),w(+T,+f*.4+50),a.anchor("center"),a.color(a.YELLOW),a.z(18)]),a.add([a.text("ChallengeSet:",{size:t+2}),a.pos(a.width()*.45,a.height()*.74),a.anchor("left"),a.color(a.YELLOW),a.z(18)]);const x=t+15;Gs.forEach((R,L)=>{a.add([a.text(R,{size:t+2}),fe(()=>a.vec2(a.width()*.45,a.height()*.78+L*x)),a.anchor("left"),a.color(a.WHITE),a.z(18)])});const v=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),M=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(v.opacity=0,M.opacity=1,E()):(v.opacity=1,M.opacity=0,E()),a.add([a.text("ESC to retry",{size:20}),fe(()=>a.vec2(a.width()*.1+20,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),onKeyPress("escape",()=>{e=0,n="",h.stop(),a.go("game")})});a.scene("about",()=>{const t=a.width()*.8,e=(a.width()-t)/2,n=a.height()*.4+20,r=18,s=8;a.add([a.sprite("bg2"),a.pos(a.width()/2,a.height()/2),a.anchor("center"),a.z(18)]),a.add([a.sprite("WPM"),fe(()=>a.vec2(a.width()*.5,a.height()*.25)),a.anchor("center"),a.z(18)]),a.add([a.text(`Typing is one of the most under-rated coding skills. We type messages and code all day, and the speed at the which we do it increases our overall Actions Per Day, making us more productive. @@ -689,7 +689,7 @@ Many developers get publicly angry at the suggestion that typing speed is irrele WPM is a diagnostic and practice tool to write realistic without editor or AI-assistance, helping you polish your typing skills for any interview environment. -To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:r,width:t,align:"left",lineSpacing:s}),a.pos(e,n),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=n+17.5*(r+s)+10,c=a.add([a.text(i,{size:r,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),de(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),de(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Qu=document.createElement("style");Qu.innerHTML=` +To beat this game you will need to master touch-typing, and fix hand positioning and other bad habits that are preventing you from writing - and thinking - at your top speed.`,{size:r,width:t,align:"left",lineSpacing:s}),a.pos(e,n),a.anchor("topleft"),a.color(a.WHITE),a.z(30)]);const i="https://docs.silver.dev/interview-ready/library/guia-de-tipeo-para-devs#1-typingclub",l=n+17.5*(r+s)+10,c=a.add([a.text(i,{size:r,width:t,align:"left"}),a.pos(e,l),a.anchor("topleft"),a.color(a.YELLOW),a.area(),a.z(30)]);c.onClick(()=>window.open(i,"_blank")),c.onHover(()=>document.body.style.cursor="pointer",()=>document.body.style.cursor="default"),onKeyPress("escape",()=>{a.go("selection")});const h=a.add([a.sprite("muteON"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(1),a.animate(),a.z(50)]),u=a.add([a.sprite("muteOff"),a.pos(a.width()*.9,a.height()*0+5),a.opacity(0),a.animate(),a.z(50)]);re.mute?(h.opacity=0,u.opacity=1):(h.opacity=1,u.opacity=0),a.add([a.text("ESC to return",{size:20}),fe(()=>a.vec2(a.width()*.5,a.height()*.94)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)]),a.add([a.text("Design by Leonel Orrut and Daniel Báez in KAPLAY ",{size:16}),fe(()=>a.vec2(a.width()*.8,a.height()*.98)),a.anchor("center"),a.color(a.rgb(127,134,131)),a.animate(),a.z(19)])});const Ju=document.createElement("style");Ju.innerHTML=` :root { --bg: hsl(0, 3.60%, 11.00%); --gray1: #0a080a; @@ -722,5 +722,5 @@ To beat this game you will need to master touch-typing, and fix hand positioning backdrop-filter: blur(10px); z-index: -1; } - `;document.head.appendChild(Qu);a.go("selection"); -//# sourceMappingURL=index-D-Wfc2C4.js.map + `;document.head.appendChild(Ju);a.go("selection"); +//# sourceMappingURL=index-CST8GQ9r.js.map