@kayelaa/canvas 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/jsx-dev-runtime.cjs +2 -2
- package/dist/jsx-dev-runtime.d.cts +2 -2
- package/dist/jsx-dev-runtime.d.ts +2 -2
- package/dist/jsx-dev-runtime.js +2 -2
- package/dist/jsx-runtime.cjs +2 -2
- package/dist/jsx-runtime.d.cts +2 -2
- package/dist/jsx-runtime.d.ts +2 -2
- package/dist/jsx-runtime.js +2 -2
- package/dist/{kayla-internals-8Xl7b2Jc.d.ts → kayla-internals-C8v5s-0r.d.ts} +42 -7
- package/dist/{kayla-internals-CudoMM3W.d.cts → kayla-internals-vuPhjkRg.d.cts} +42 -7
- package/dist/kayla.cjs +2 -2
- package/dist/kayla.d.cts +3 -3
- package/dist/kayla.d.ts +3 -3
- package/dist/kayla.js +2 -2
- package/dist/{lea-k7IGP_-W.d.cts → lea-B1DIEiLR.d.cts} +5 -0
- package/dist/{lea-k7IGP_-W.d.ts → lea-B1DIEiLR.d.ts} +5 -0
- package/dist/lea.cjs +1 -1
- package/dist/lea.d.cts +1 -1
- package/dist/lea.d.ts +1 -1
- package/dist/lea.js +1 -1
- package/package.json +58 -2
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var ce=Object.defineProperty;var ze=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Ue=Object.prototype.hasOwnProperty;var de=(r,e)=>{for(var n in e)ce(r,n,{get:e[n],enumerable:!0})},Ne=(r,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of $e(e))!Ue.call(r,s)&&s!==n&&ce(r,s,{get:()=>e[s],enumerable:!(i=ze(e,s))||i.enumerable});return r};var Oe=r=>Ne(ce({},"__esModule",{value:!0}),r);var Ct={};de(Ct,{Kayla:()=>U,LEA:()=>$,default:()=>vt});module.exports=Oe(Ct);var $={};de($,{DeltaTweenII:()=>te,ENVIRONMENT:()=>pe,GEmitterMemory:()=>fe,LeaEntityII:()=>H,LeaEventEmitter:()=>K,LeaGameII:()=>q,LeaRendererII:()=>O,LeaSceneII:()=>X,LeaSerializers:()=>ve,LeaTickerII:()=>ee,LeaTimeout:()=>ne,LeaUtilsII:()=>k,LiaAudio:()=>z,LiaAudioSrc:()=>V,LiaOscSFX:()=>M,LiaSFXMap:()=>je,NOTE_NAMES:()=>Re,RectLeaEntity:()=>B,Vector2:()=>P,colToRGBA:()=>qe,defaultSFXConfig:()=>ke,editRGBA:()=>Be,generateUUID:()=>Pe,getAvoidAngle:()=>_e,getEnvironment:()=>Ee,getNormalizedColor:()=>Xe,getRayHit:()=>Ae,isInitiallyMobile:()=>Ze,isMobile:()=>Le,isNode:()=>W,isNote:()=>Ye,isWeb:()=>E,parseFillStyle:()=>Ce,raycastAvoid:()=>Je,scaleCoord:()=>We,setAnimInterval:()=>Me,sfxHit:()=>Fe,sfxJump:()=>Se,sfxLaser:()=>Ie,sfxUIClick:()=>Te,sfxUIHover:()=>Ke,shortUID:()=>Qe,tinyUID:()=>me});var K=class{#e=new Map;constructor(){this.#e=new Map}on(e,n){let i=this.#e.get(e)||[];return i.push(n),this.#e.set(e,i),this}once(e,n){let i=(...s)=>{this.off(e,i),n(...s)};return this.on(e,i),this}off(e,n){let i=this.#e.get(e);if(!i)return this;let s=i.indexOf(n);return s>=0&&i.splice(s,1),this}emit(e,...n){let i=this.#e.get(e);if(!i||i.length===0){if(e==="error")throw n[0];return!1}return i.slice().forEach(s=>s(...n)),!0}removeAllListeners(e){return e?this.#e.delete(e):this.#e.clear(),this}listenerCount(e){return this.#e.get(e)?.length??0}},O=class extends K{canvas;ctx;running;_rafId;_fps;_frameCount;_fpsTimer;_lastFrameTime;constructor(e,{viewportWidth:n,viewportHeight:i,cameraWidth:s,cameraHeight:o}={}){if(!E)throw new Error("Web-Only");super(),this.canvas=e,this.ctx=e.getContext("2d"),this.automatic=!0,this.#e=n??e.width,this.#t=i??e.height,this.#n=s??e.width,this.#r=o??e.height,this.running=!1,this._rafId=null,this._loop=this._loop.bind(this),this.updateCanvasResolution(),this._fps=60,this._frameCount=0,this._fpsTimer=0}automatic;retransform(){this.ctx.setTransform(1,0,0,1,0,0);let e=this.#n/this.#e,n=this.#r/this.#t;this.ctx.translate(this.#n/2,this.#r/2),this.ctx.scale(e,n),this.ctx.translate(-this.#e/2,-this.#t/2)}#e=0;#t=0;#n=0;#r=0;get viewportWidth(){return this.#e}set viewportWidth(e){this.#e=e,this.retransform()}get width(){return this.#e}get height(){return this.#t}get centerX(){return this.#e/2}get centerY(){return this.#t/2}get left(){return 0}get top(){return 0}get right(){return this.#e}get bottom(){return this.#t}get viewportHeight(){return this.#t}set viewportHeight(e){this.#t=e,this.retransform()}get cameraWidth(){return this.#n}set cameraWidth(e){this.#n=e,this.updateCanvasResolution(),this.retransform()}get cameraHeight(){return this.#r}set cameraHeight(e){this.#r=e,this.updateCanvasResolution(),this.retransform()}updateCanvasResolution(){this.canvas.width=this.#n,this.canvas.height=this.#r}applyTransform(){this.retransform()}get FPS(){return this._fps}_loop(){this.automatic&&this.update(),this._rafId=requestAnimationFrame(this._loop)}update(){if(!this.running||!E)return;let e=performance.now(),n=(e-(this._lastFrameTime??e))/1e3;this._lastFrameTime=e,this._frameCount++,this._fpsTimer+=n,this._fpsTimer>=1&&(this._fps=Math.round(this._frameCount/this._fpsTimer),this._frameCount=0,this._fpsTimer=0),this.ctx.clearRect(0,0,this.#n,this.#r),this.emit("draw",this.ctx)}start(){if(!this.running){if(!E||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!0,this._rafId=requestAnimationFrame(this._loop)}}stop(){if(!E||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!1,this._rafId!==null&&(cancelAnimationFrame(this._rafId),this._rafId=null)}},ee=class extends K{setNow(e){this.#e=e}#e=0;__intervalId=null;__lastTime=0;constructor(e=16){super(),this.#t=e,this.speedHackDT=1}speedHackDT;get isRaf(){return this.tickInterval===1/0}#t=15;get tickInterval(){return this.#t}set tickInterval(e){this.#t=e,this.__intervalId&&(this.stop(),this.start())}now(){return this.#e}__tick(){let e=performance.now(),n=(e-this.__lastTime)/1e3*this.speedHackDT;this.__lastTime=e,!(E&&typeof this.__intervalId=="function"&&document.hidden)&&(this.#e+=n*1e3,this.emit("tick",n))}createTimeout(e){return new ne(e,this)}createTween(e,n=()=>{}){let i=new te(e),s=(o=0)=>{if(i.finished){this.off("tick",s);return}i.update(o)};return i.on("finish",()=>{this.off("tick",s)}),i.on("delta",o=>{n(o)}),this.on("tick",s),i}start(){this.__intervalId===null&&(this.__lastTime=performance.now(),this.__intervalId=E&&!isFinite(this.tickInterval)?Me(()=>this.__tick()).clear:setInterval(()=>this.__tick(),this.tickInterval))}stop(){this.__intervalId!==null&&(typeof this.__intervalId=="function"?this.__intervalId():clearInterval(this.__intervalId)),this.__intervalId=null}getSineMod(e,n=0){return .5+.5*Math.sin((this.now()%e/e+n)*2*Math.PI)}},ve;(t=>{function r(a){return a===!0?1:0}t.booleanExport=r;function e(a){return a===0?!1:a===1}t.booleanImport=e;function n(a){return`${a.x}|${a.y}`}t.vec2Export=n;function i(a){let[h,c]=a.split("|"),g=parseFloat(h),w=parseFloat(c);if(isNaN(g)||isNaN(w))throw new Error(`Invalid Vector2 string: ${a}`);return new P(g,w)}t.vec2Import=i,t.booleanMap={mapExport:r,mapImport:e};function o(a){return h=>Number(h.toFixed(a))}t.createRounder=o;function d(a=10){return{mapExport(h){return Math.round(h/a)},mapImport(h){return h*a}}}t.createLowPrecision=d;function f(a){return Math.round(a)}t.lightWeightRounder=f;function u(a=100){return{mapExport(h){return Math.round(h*a)},mapImport(h){return h/a}}}t.createPercent=u;function l(a){let h=new Map(Object.entries(a));return{mapExport:c=>h.get(c)??null,mapImport:c=>Array.from(h.entries()).find(([g,w])=>w===c)?.[0]??null}}t.createLookup=l;function p(a){let h=a*(180/Math.PI);return Math.round((h%360+360)%360)}t.radToDeg=p;function y(a){return a*(Math.PI/180)}t.degToRad=y,t.angleRadToDeg={mapExport:p,mapImport:y};function x(a=10){let h=d(a);return{mapExport(c){return h.mapExport(p(c))},mapImport(c){return h.mapImport(y(c))}}}t.createLowPrecisionRadToDeg=x})(ve||={});var H=class r extends K{name="";scaleRotate=0;scale=1;constructor(e,n=0,i=0){super(),this.autoTranslate=!1,this.name=e,this.z=0,this.___pos=new P(n,i),this.nonSerializableProperties=[],this.nonSerializableProperties.push("___pos","autoTranslate","arraySerializeMap"),this.forceSerializableProperties=[],this.forceSerializableProperties.push("x","y")}arraySerializeMap;autoTranslate;z;___pos;nonSerializableProperties;forceSerializableProperties;get pos(){return this.___pos}get x(){return this.pos.x}get y(){return this.pos.y}set x(e){this.pos.x=e}set y(e){this.pos.y=e}handleUpdate(e){if(this.update)try{this.emit("update",e),this.update(e)}catch(n){this.emit("error",n)}}handleDraw(e){if(!(W||!this.draw)){e.save(),this.autoTranslate&&e.translate(this.x,this.y);try{this.emit("draw",e),this.draw(e)}catch(n){this.emit("error",n)}e.restore()}}serialize(){if(Array.isArray(this.arraySerializeMap))return this.arraySerializeMap.map(([s,{mapExport:o}])=>{let d=Reflect.get(this,s);return o?o(d):d});let e=["_events","_eventsCount","_maxListeners","nonSerializableProperties","forceSerializableProperties"],n=[...Reflect.ownKeys(this),...this.forceSerializableProperties].filter(s=>!this.nonSerializableProperties.includes(s)&&!e.includes(s.toString())),i=Object.fromEntries(n.map(s=>{let o=Reflect.get(this,s);if(W&&typeof o=="number"){let d=o.toString().split("."),u=(d[1]?d[1].length:0)>2?Number(o.toFixed(2)):o;return[s,u]}return[s,o]}));return JSON.parse(JSON.stringify(i))}toLocal(e){return e.subtract(this.pos)}toWorld(e){return e.add(this.pos)}deserializeArray(e){return r.deserializeArray(this.arraySerializeMap,e)}static deserializeArray(e,n){if(!e||!Array.isArray(n))return n;let i={};for(let s=0;s<n.length;s++){let o=e[s];if(!o)break;let[d,{mapImport:f}]=o,u=n[s];if(f&&(u=f(u)),typeof d!="string")break;try{Reflect.set(i,d,u)}catch(l){console.error(l)}}return i}},X=class extends K{name="";entities=new Map;paused=!0;constructor(e){super(),this.name=e}handleUpdate(e){if(!this.paused){this.emit("update",e);for(let n of this.entities.values())n.handleUpdate(e)}}handleDraw(e){if(!W&&!this.paused){this.emit("draw",e);for(let n of[...this.entities.values()].sort((i,s)=>i.z-s.z))n.handleDraw(e)}}addEntity(e){if(!(e instanceof H))throw new Error("invalid entity");if(!e.name)throw new Error("Entity must have a name.");this.entities.set(e.name,e)}removeEntity(e){if(!(e instanceof H))throw new Error("invalid entity");this.entities.delete(e.name)}getEntity(e){return this.entities.get(e)}},q=class{scenes;ticker;get centerX(){return this.width/2}get centerY(){return this.height/2}get left(){return 0}get top(){return 0}get right(){return this.width}get bottom(){return this.height}width;height;constructor(e,n,i=16){this.ticker=new ee(i),this.scenes=new Map,this.width=e,this.height=n,this.ticker.on("tick",s=>{for(let o of this.scenes.values())o.paused||o.handleUpdate(s)})}addScene(e){if(!e.name)throw new Error("Scene must have a name.");e.paused=!1,this.scenes.set(e.name,e)}removeScene(e){e&&(e.paused=!0),this.scenes.delete(e.name)}now(){return this.ticker.now()}start(){this.ticker.start()}stop(){this.ticker.stop()}},k={lerp(r,e,n){return r+(e-r)*n},clamp(r,e,n){return Math.min(n,Math.max(e,r))},clamp01(r){return Math.min(1,Math.max(0,r))},easeLinear(r){return r},easeInQuad(r){return r*r},easeOutQuad(r){return 1-(1-r)*(1-r)},easeInOutQuad(r){return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2},easeInSine(r){return 1-Math.cos(r*Math.PI/2)},easeOutSine(r){return Math.sin(r*Math.PI/2)},easeInOutSine(r){return-(Math.cos(Math.PI*r)-1)/2},easeInExpo(r){return r===0?0:Math.pow(2,10*r-10)},easeOutExpo(r){return r===1?1:1-Math.pow(2,-10*r)},easeInOutExpo(r){return r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2},smoothstep(r){return r=k.clamp(r,0,1),r*r*(3-2*r)},randomLerp(r,e){return k.lerp(r,e,Math.random())},randomInt(r,e){return Math.floor(Math.random()*(e-r+1))+r},randomArrayValue(r){return r[k.randomInt(0,r.length-1)]},createBezier(r,e,n,i){function s(f,u,l,p,y){let b=1-f;return b*b*b*u+3*b*b*f*l+3*b*f*f*p+f*f*f*y}function o(f,u,l,p,y){let b=1-f;return 3*b*b*(l-u)+6*b*f*(p-l)+3*f*f*(y-p)}function d(f){let u=f;for(let l=0;l<6;l++){let p=s(u,0,r,n,1),y=o(u,0,r,n,1);if(y===0)break;u-=(p-f)/y}return k.clamp(u,0,1)}return function(u){u=k.clamp(u,0,1);let l=d(u);return s(l,0,e,i,1)}},lengthSquared(...r){return r.reduce((e,n)=>e+n*n,0)},normalizeRad(r){let e=2*Math.PI;return r=r%e,r<0&&(r+=e),r},angleInvertY(r){return k.normalizeRad(-r)},degToRadFlipY(r){return k.angleInvertY(r*Math.PI/180)},minimalAngularDirection(r,e){r=k.normalizeRad(r),e=k.normalizeRad(e);let n=k.normalizeRad(e-r),i=k.normalizeRad(r-e);return n<=i?1:-1}},te=class extends K{constructor({delta:e,ms:n,easing:i}){super(),this.delta=e,this.duration=n,this.elapsed=0,this.easing=i??(s=>s),this.lastValue=0,this.finished=!1}delta;duration;elapsed;lastValue;finished;easing;update(e){this.elapsed+=e*1e3;let n=k.clamp(this.elapsed/this.duration,0,1),i=this.easing(n),s=this.delta*i,o=s-this.lastValue;this.lastValue=s,this.emit("delta",o),n>=1&&(this.finished=!0,this.emit("finish",void 0))}},B=class extends H{constructor(e,n=0,i=0,s=50,o=50){super(e,n,i),this.width=s,this.height=o}width;height;get left(){return this.x-this.width/2}set left(e){this.x=e+this.width/2}get right(){return this.x+this.width/2}set right(e){this.x=e-this.width/2}get top(){return this.y-this.height/2}set top(e){this.y=e+this.height/2}get bottom(){return this.y+this.height/2}set bottom(e){this.y=e-this.height/2}get lx(){return 0}get ly(){return 0}get lleft(){return-this.width/2}get lright(){return this.width/2}get ltop(){return-this.height/2}get lbottom(){return this.height/2}isCollidingWith(e){return!(this.right<e.left||this.left>e.right||this.bottom<e.top||this.top>e.bottom)}color="rgba(0, 0, 255, 0.3)";draw(e){e.translate(this.x,this.y),e.rotate(this.scaleRotate),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height)}},ne=class extends K{duration;ticker;elapsed;finished;_resolve;promise;_timeoutId;constructor(e,n=null){super(),this.duration=e,this.ticker=n,this.elapsed=0,this.finished=!1,this._resolve=null,this.promise=new Promise(i=>this._resolve=i),this.update=this.update.bind(this),this.ticker&&this.ticker.on("tick",this.update)}update(e=0){this.finished||(this.elapsed+=e*1e3,this.elapsed>=this.duration&&this.finish())}finish(){this.finished||(this.finished=!0,this.emit("finish",void 0),this._resolve&&this._resolve(),this.ticker&&this.ticker.off("tick",this.update))}start(){return this.ticker||(this._timeoutId=setTimeout(()=>this.finish(),this.duration)),this}cancel(){this.finished||(this.finished=!0,!this.ticker&&this._timeoutId!=null&&clearTimeout(this._timeoutId),this.ticker&&this.ticker.off("tick",this.update))}then(e,n){return this.promise.then(e,n)}after(e,n){return this.promise.then(e,n)}},P=class r{constructor(e=0,n=0){this.x=e,this.y=n}x;y;toJSON(){return{x:this.x,y:this.y,vec2:!0}}static isVec2(e){return e&&typeof e=="object"&&"x"in e&&"y"in e&&e.vec2===!0}static fromSerialized(e){return this.isVec2(e)?new this(e.x,e.y):null}rotate(e){let n=Math.cos(e),i=Math.sin(e);return new r(this.x*n-this.y*i,this.x*i+this.y*n)}static from(e){return new r(Math.cos(e),Math.sin(e))}isEmpty(){return Math.abs(this.x)<.01&&Math.abs(this.y)<.01}get angle(){return Math.atan2(this.y,this.x)}angleTo(e){return Math.atan2(e.y-this.y,e.x-this.x)}get length(){return Math.hypot(this.x,this.y)}get lengthSquared(){return this.x*this.x+this.y*this.y}normalized(){let e=this.length;return e===0?new r(0,0):new r(this.x/e,this.y/e)}consume(e){let n=this.length;n<=e?(this.x=0,this.y=0):this.overwite(this.scale((n-e)/n))}project(e){return e.scale(this.dotNormalized(e))}reflect(e){let n=this.dot(e);return this.subtract(e.scale(2*n))}dotNormalized(e){let n=this.normalized(),i=e.normalized();return n.x*i.x+n.y*i.y}lengthSquaredTo(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}dot(e){return this.x*e.x+this.y*e.y}distanceTo(e){return Math.hypot(this.x-e.x,this.y-e.y)}distanceToCheap(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}directionTo(e){return new r(e.x-this.x,e.y-this.y).normalized()}add(e){return new r(this.x+e.x,this.y+e.y)}addRaw(e){return new r(this.x+e,this.y+e)}overwite(e){this.x=e.x,this.y=e.y}subtract(e){return new r(this.x-e.x,this.y-e.y)}scale(e){return new r(this.x*e,this.y*e)}toString(){return`Vector2(${this.x}, ${this.y})`}clone(){return new r(this.x,this.y)}};function Xe(r){let e=/^rgba?\(([^)]+)\)$/,n=r.match(e);if(n){let[i,s,o,d=1]=n[1].split(",").map(f=>parseFloat(f));return{r:Math.max(0,Math.min(255,Math.floor(i))),g:Math.max(0,Math.min(255,Math.floor(s))),b:Math.max(0,Math.min(255,Math.floor(o))),a:Math.max(0,Math.min(1,Math.floor(d*255)/255))}}return Ce(r)}function qe(r){return`rgba(${r.r}, ${r.g}, ${r.b}, ${r.a})`}function Ce(r){if(r=r.trim().toLowerCase(),r[0]==="#"){let n,i,s;if(r.length===7)n=parseInt(r.slice(1,3),16),i=parseInt(r.slice(3,5),16),s=parseInt(r.slice(5,7),16);else if(r.length===4)n=parseInt(r[1]+r[1],16),i=parseInt(r[2]+r[2],16),s=parseInt(r[3]+r[3],16);else throw new Error("Invalid hex color");return{r:n,g:i,b:s,a:1}}let e=r.match(/^rgba?\s*\(\s*(\d+)[, ]\s*(\d+)[, ]\s*(\d+)(?:[, ]\s*([\d.]+))?\s*\)$/);if(e)return{r:parseInt(e[1]),g:parseInt(e[2]),b:parseInt(e[3]),a:e[4]!==void 0?parseFloat(e[4]):1};throw new Error("Unsupported fillStyle format")}function Be(r,{r:e,g:n,b:i,a:s}={}){let[o,d,f,u,l]=r.match(/rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*([\d.]*)\)?/)||[];return`rgba(${e??d}, ${n??f}, ${i??u}, ${s??(l||1)})`}function We(r,e,n){return n+(r-n)*e}function Ee(){return typeof process<"u"&&process.release?.name==="node"?"node":typeof window<"u"||typeof self<"u"?"web":"unknown"}var pe=Ee(),W=pe==="node",E=pe==="web",z=class r{static unlock(){E&&this.audioCtx.state!=="running"&&this.audioCtx.resume()}static audioCtx=E?new AudioContext:null;static masterGain=E?this.audioCtx.createGain():null;static musicGain=E?this.audioCtx.createGain():null;static sfxGain=E?this.audioCtx.createGain():null;static{E&&(this.masterGain.gain.value=1,this.musicGain.gain.value=1,this.sfxGain.gain.value=1,this.sfxGain.connect(this.masterGain),this.musicGain.connect(this.masterGain),this.masterGain.connect(this.audioCtx.destination))}static get SFX_VOLUME(){return this.sfxGain.gain.value}static get MUSIC_VOLUME(){return this.musicGain.gain.value}static get VOLUME(){return this.masterGain.gain.value}static set SFX_VOLUME(e){this.sfxGain.gain.value=e}static set MUSIC_VOLUME(e){this.musicGain.gain.value=e}static set VOLUME(e){this.masterGain.gain.value=e}static noteToHz(e){return this.tuningFreq*Math.pow(2,(e-9)/12)}static tuningFreq=440;static audioBufferCache=new Map;static loops=new Map;static sfsx=new Map;static loopIdCounter=0;static CACHE_NAME="lia-audio-cache-v1";static async preLoad(e){if(this.audioBufferCache.has(e))return this.audioBufferCache.get(e);let n=r.CACHE_NAME,i,s;if(typeof caches<"u"&&(s=await caches.open(n),i=await s.match(e)),!i){if(i=await fetch(e),!i.ok)throw new Error(`Failed to fetch ${e}`);s&&await s.put(e,i.clone())}let o=await i.arrayBuffer(),d=await this.audioCtx.decodeAudioData(o);return this.audioBufferCache.set(e,d),d}static async getOnlyDownloadedCache(e){let n=r.CACHE_NAME;return await(await caches.open(n)).match(e)}static getCached(e){return this.audioBufferCache.get(e)||null}static async playSound(e,n=.2,i=1,s=!0){try{this.sfsx.has(e)&&this.sfsx.get(e).source.stop(),this.audioBufferCache.has(e)||await this.preLoad(e);let o=this.getCached(e);if(!o)return;let d=new V(o);d.buffer=o;let f=1-.12,u=1+.12;d.playbackRate=i??f+Math.random()*(u-f);let l=this.audioCtx.createGain();l.gain.value=n,d.tempGain=l,d.connect(l),l.connect(this.sfxGain),d.onended=()=>{d.disconnect(),l.disconnect()},d.start(),s&&this.sfsx.set(e,{source:d,gain:l})}catch(o){console.error(o)}}static async playLoop(e,n=1,{loopStart:i=0,loopEnd:s=null,exclusive:o=!0,skipMS:d=0}={}){if(o)for(let y of this.loops.keys())this.stopLoop(y);this.audioBufferCache.has(e)||await this.preLoad(e);let f=this.getCached(e);if(!f)return;let u=new V(f);u.buffer=f,u.loop=!0,typeof i=="number"&&(u.loopStart=i),typeof s=="number"&&(u.loopEnd=s);let l=this.audioCtx.createGain();l.gain.value=n,u.tempGain=l,u.playbackRate=1,u.onended=()=>{u.disconnect(),l.disconnect()},u.connect(l),l.connect(this.musicGain),u.start(0,d/1e3);let p=++this.loopIdCounter;return this.loops.set(p,{source:u,gain:l}),p}static stopLoop(e){let n=this.loops.get(e);n&&(n.source.stop(),n.source.notIndependent||(n.source.disconnect(),n.gain.disconnect()),this.loops.delete(e))}static async createLiaSource(e,{volume:n=1,speed:i=1,loop:s=!1,loopStart:o=0,loopEnd:d=null,isMusic:f=!1,gain:u=null}={}){try{this.audioBufferCache.has(e)||await this.preLoad(e);let l=this.getCached(e);if(!l)return null;let p=new V(l);p.loop=s,p.loopStart=o,p.loopEnd=typeof d=="number"?d:l.duration,p.playbackRate=i;let y=this.audioCtx.createGain();return y.gain.value=n,p.connect(y),p.tempGain=y,y.connect(u||(f?this.musicGain:this.sfxGain)),p.onended=()=>{p.disconnect(),y.disconnect()},p}catch(l){return console.error("Failed to create LiaAudioSrc:",l),null}}},Re=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function Ye(r){return Re.includes(r)}var V=class{numberOfInputs;numberOfOutputs;constructor(e,n=z.audioCtx){this.context=n,this.buffer=e,this.source=null,this.startTime=0,this.pauseTime=0,this.playbackRate=1,this.isPlaying=!1,this.loop=!1,this.output=E?n.createGain():null,this.output.gain.value=1,this.channelCount=2,this.channelCountMode="max",this.channelInterpretation="speakers",this.numberOfInputs=0,this.numberOfOutputs=1,this.onended=null}channelCount;channelCountMode;channelInterpretation;onended;source;buffer;context;_createSource(){this.source&&(this.source.onended=null);let e=this.context.createBufferSource();return e.buffer=this.buffer,e.playbackRate.value=this.playbackRate,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd>0?this.loopEnd:this.buffer.duration,e.connect(this.output),this.source=e,e.onended=()=>{this.source===e&&(this.isPlaying&&!this.loop&&(this.isPlaying=!1,this.pauseTime=0),typeof this.onended=="function"&&this.onended())},e}play({fadeIn:e=0,offset:n=null}={}){let i=n!==null?n:this.pauseTime;if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.source=this._createSource(),this.startTime=this.context.currentTime-i/this.playbackRate,this.source.start(0,i),e>0?(this.output.gain.setValueAtTime(0,this.context.currentTime),this.output.gain.linearRampToValueAtTime(1,this.context.currentTime+e)):this.output.gain.setValueAtTime(1,this.context.currentTime),this.isPlaying=!0}start(e=0,n=0,i){this.isPlaying||(this.source=this._createSource(),this.startTime=this.context.currentTime+e-n/this.playbackRate,i!==void 0?this.source.start(this.context.currentTime+e,n,i):this.source.start(this.context.currentTime+e,n),this.pauseTime=n,this.isPlaying=!0)}pause({fadeOut:e=0}={}){if(!this.isPlaying)return;let n=this.getElapsed()/1e3;if(this.loop&&this.loopEnd>this.loopStart){let i=this.loopEnd-this.loopStart;n=this.loopStart+(n-this.loopStart)%i}if(this.isPlaying=!1,e>0){let i=this.context.currentTime;this.output.gain.setValueAtTime(this.output.gain.value,i),this.output.gain.linearRampToValueAtTime(0,i+e),setTimeout(()=>{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n,this.output.gain.setValueAtTime(1,this.context.currentTime)},e*1e3)}else{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n}}getElapsed(){return this.isPlaying?(this.context.currentTime-this.startTime)*this.playbackRate*1e3:this.pauseTime*1e3}setSpeed(e){if(e<=0)throw new Error("Playback rate must be positive");let n=this.getElapsed()/1e3;this.playbackRate=e,this.isPlaying&&(this.pause(),this.pauseTime=n,this.play())}setLoop(e=!0){this.loop=e,this.source&&(this.source.loop=e)}loop;playbackRate;startTime;tempGain=null;connect(e,n=0,i=0){if("value"in e)this.output.connect(e,n);else return this.output.connect(e,n,i),e}disconnect(e,n,i){e===void 0?this.output.disconnect():this.output.disconnect(e,n,i)}output;stop(e=0){if(this.notIndependent)return this.pause();if(!this.source)return;let n=this.context.currentTime+e;this.source.stop(n),this.isPlaying=!1,this.notIndependent||(this.pauseTime=0)}pauseTime;isPlaying;notIndependent=!1;loopStart=0;loopEnd=0},ke={osc:{enabled:!0,type:"sine",freq:440,detune:0},noise:{enabled:!1,level:.5},ampEnv:{attack:.005,decay:.1,sustain:0,release:.1,volume:.3},pitchEnv:{amount:0,decay:.2},filter:{enabled:!1,type:"lowpass",freq:1200,Q:1,envAmount:0,decay:.2},lfo:{enabled:!1,target:"freq",rate:8,depth:20},duration:.4},M=class r{constructor(e={}){this.ctx=z.audioCtx,this.cfg=structuredClone(ke),Object.assign(this.cfg,e)}ctx;cfg;play(e=z.sfxGain){let n=this.ctx,i=n.currentTime,s=this.cfg,o=n.createGain();o.gain.setValueAtTime(1e-4,i);let d=s.ampEnv;o.gain.exponentialRampToValueAtTime(d.volume,i+d.attack),o.gain.exponentialRampToValueAtTime(Math.max(1e-4,d.sustain*d.volume),i+d.attack+d.decay),o.gain.exponentialRampToValueAtTime(1e-4,i+s.duration+d.release);let f=o,u;s.filter.enabled&&(u=n.createBiquadFilter(),u.type=s.filter.type,u.frequency.value=s.filter.freq,u.Q.value=s.filter.Q,u.connect(o),f=u);let l;if(s.osc.enabled){if(l=n.createOscillator(),l.type=s.osc.type,l.frequency.value=s.osc.freq,l.detune.value=s.osc.detune,s.pitchEnv.amount!==0){let a=Math.pow(2,s.pitchEnv.amount/12);l.frequency.exponentialRampToValueAtTime(s.osc.freq*a,i+s.pitchEnv.decay)}l.connect(f),l.start(i),l.stop(i+s.duration+d.release)}let p;if(s.noise.enabled){let a=n.sampleRate*s.duration,h=n.createBuffer(1,a,n.sampleRate),c=h.getChannelData(0);for(let g=0;g<a;g++)c[g]=(Math.random()*2-1)*s.noise.level;p=n.createBufferSource(),p.buffer=h,p.connect(f),p.start(i),p.stop(i+s.duration+d.release)}let y,b;s.lfo.enabled&&l&&(y=n.createOscillator(),y.frequency.value=s.lfo.rate,b=n.createGain(),b.gain.value=s.lfo.depth,y.connect(b),s.lfo.target==="freq"?b.connect(l.frequency):s.lfo.target==="gain"?b.connect(o.gain):s.lfo.target==="filter"&&u&&b.connect(u.frequency),y.start(i),y.stop(i+s.duration)),o.connect(e);let x=[l,p,y,b,u,o],t=i+s.duration+d.release;setTimeout(()=>{x.forEach(a=>a?.disconnect())},(t-n.currentTime)*1e3)}getConfig(){return structuredClone(this.cfg)}setConfig(e){return Object.assign(this.cfg,e),this}getKey(e){return this.cfg[e]}setKey(e,n){return Object.assign(this.cfg[e],n),this}setFreq(e){return this.cfg.osc.freq=e,this}setWave(e){return this.cfg.osc.type=e,this}setVolume(e){return this.cfg.ampEnv.volume=e,this}setAmpEnv(e,n,i,s){return Object.assign(this.cfg.ampEnv,{attack:e,decay:n,sustain:i,release:s}),this}setPitchEnv(e,n){return Object.assign(this.cfg.pitchEnv,{amount:e,decay:n}),this}setNoiseEnabled(e){return this.cfg.noise.enabled=e,this}setNoiseLevel(e){return this.cfg.noise.level=e,this}setFilterEnabled(e){return this.cfg.filter.enabled=e,this}setFilter(e,n,i){return Object.assign(this.cfg.filter,{type:e,freq:n,Q:i,enabled:!0}),this}setLFOEnabled(e){return this.cfg.lfo.enabled=e,this}setLFO(e,n,i){return Object.assign(this.cfg.lfo,{target:e,rate:n,depth:i,enabled:!0}),this}setDuration(e){return this.cfg.duration=e,this}clone(){return new r(structuredClone(this.cfg))}},Te=new M({osc:{enabled:!0,type:"square",freq:900,detune:0},ampEnv:{attack:.002,decay:.04,sustain:0,release:.02,volume:.15},duration:.05}),Ke=new M({osc:{enabled:!0,type:"sine",freq:600,detune:0},ampEnv:{attack:.01,decay:.08,sustain:0,release:.04,volume:.12},duration:.1}),Se=new M({osc:{enabled:!0,type:"triangle",freq:500,detune:0},pitchEnv:{amount:12,decay:.15},ampEnv:{attack:.01,decay:.12,sustain:0,release:.05,volume:.25},duration:.18}),Ie=new M({osc:{enabled:!0,type:"sawtooth",freq:1200,detune:0},pitchEnv:{amount:-24,decay:.3},ampEnv:{attack:.005,decay:.25,sustain:0,release:.05,volume:.3},duration:.35}),Fe=new M({osc:{enabled:!0,type:"square",freq:180,detune:0},noise:{enabled:!0,level:.4},ampEnv:{attack:.002,decay:.15,sustain:0,release:.05,volume:.35},duration:.2}),je=new Map([["ui_click",Te],["ui_hover",Ke],["jump",Se],["laser",Ie],["hit",Fe]]);function Qe(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(r)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}function me(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(4)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}var fe=class{peer=null;key;events={};mbAcc=0;connected=!1;constructor(){this.key=`${Pe()}_${Date.now()}`}connect(e){e&&(this.peer=e,e.peer=this,this.connected=!0,e.connected=!0),this._emit("open")}isConnected(){return this.connected&&!!this.peer}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n)}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(i=>i!==n))}_emit(e,n){this.events[e]?.forEach(i=>i(n))}send(e,n){if(!this.peer)throw new Error("No peer connected");this.peer._receive(e,n)}_receive(e,n){e?this._emit(e,n):this._emit("message",n)}close(){if(this.connected=!1,this.peer){let e=this.peer;this.peer=null,e.peer=null,e.connected=!1,e._emit("close")}this._emit("close")}getKey(){return this.key}};function Pe(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function"){let r=new Uint8Array(16);return crypto.getRandomValues(r),r[6]=r[6]&15|64,r[8]=r[8]&63|128,[...r].map(e=>e.toString(16).padStart(2,"0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return(r==="x"?e:e&3|8).toString(16)})}function Me(r){let e=!0;function n(){e&&(r(),requestAnimationFrame(n))}return requestAnimationFrame(n),{clear:()=>e=!1}}function Ae(r,e,n,i,s){let o=Math.cos(s),d=Math.sin(s),f=[];if(o!==0){let u=(0-r)/o,l=e+u*d;u>0&&l>=0&&l<=i&&f.push({side:"left",t:u})}if(o!==0){let u=(n-r)/o,l=e+u*d;u>0&&l>=0&&l<=i&&f.push({side:"right",t:u})}if(d!==0){let u=(0-e)/d,l=r+u*o;u>0&&l>=0&&l<=n&&f.push({side:"top",t:u})}if(d!==0){let u=(i-e)/d,l=r+u*o;u>0&&l>=0&&l<=n&&f.push({side:"bottom",t:u})}return f.length===0?null:(f.sort((u,l)=>u.t-l.t),f[0])}function _e(r,e){let n;switch(e){case"left":case"right":n=Math.PI-r;break;case"top":case"bottom":n=2*Math.PI-r;break}return(n%(2*Math.PI)+2*Math.PI)%(2*Math.PI)}function Je(r,e,n,i,s){let o=Ae(r,e,n,i,s);return o?{...o,avoidAngle:_e(s,o.side)}:null}function Le(){return W?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}var Ze=Le();var U={};de(U,{KaylaContext:()=>re,KaylaFragment:()=>mt,KaylaInternals:()=>D,KaylaRect:()=>A,createContext:()=>it,createElement:()=>rt,createGame:()=>et,createReassignableObject:()=>gt,createRenderer:()=>nt,createScene:()=>tt,createUseHook:()=>xt,self:()=>ge,setLogLevel:()=>bt,useClick:()=>ot,useContext:()=>pt,useCurrentGame:()=>ht,useCurrentRenderer:()=>ct,useCurrentScene:()=>dt,useCurrentTicker:()=>ft,useDisposableRef:()=>yt,useEffect:()=>be,useEntity:()=>lt,useExports:()=>oe,useFiber:()=>Ge,useFiberControl:()=>xe,useGlobalClick:()=>De,useInitialization:()=>ie,useNextStack:()=>we,usePaint:()=>ae,useRect:()=>se,useRef:()=>ye,useSelf:()=>L,useShouldRefresh:()=>at,useState:()=>st,useTick:()=>ut});function et({width:r,height:e,updateHz:n="frames"}){return new D.KaylaGame(r,e,n==="frames"?1/0:n)}function tt(r){let e=new X(r);return new D.KaylaScene(e)}function nt(r){return new D.KaylaRenderer(r)}function rt(r,e){return{type:r,props:e}}var A;(i=>{function r(s,o){return!(s.right<o.left||s.left>o.right||s.bottom<o.top||s.top>o.bottom)}i.rawCollision=r;function e(s,o,d){let f=o*Math.PI/180,u=Math.cos(f),l=Math.sin(f),p=1/0;return u>0&&(p=Math.min(p,(d.right-s.x)/u)),u<0&&(p=Math.min(p,(d.left-s.x)/u)),l>0&&(p=Math.min(p,(d.bottom-s.y)/l)),l<0&&(p=Math.min(p,(d.top-s.y)/l)),P.from(o).scale(p)}i.getCurrToBound=e;function n(s){let{left:o,right:d,top:f,bottom:u,width:l,height:p,x:y=0,y:b=0}=s;if(l===null||p===null)throw new Error("width and height are required");let x,t;if(o!=null&&d!=null){if(Math.abs(d-o-l)>1e-6)throw new Error("left, right, and width mismatch");x=o}else y!=null?x=y-l/2:o!=null?x=o:d!=null?x=d-l:x=0;if(f!=null&&u!=null){if(Math.abs(u-f-p)>1e-6)throw new Error("top, bottom, and height mismatch");t=f}else b!=null?t=b-p/2:f!=null?t=f:u!=null?t=u-p:t=0;return{left:x,right:x+l,top:t,bottom:t+p,width:l,height:p,x:x+l/2,y:t+p/2}}i.createRawRect=n})(A||={});var D;(b=>{class r extends q{#e;#t;constructor(t,a,h){super(t,a,h),this.#e=new Set,this.#t=!1}delay(t){return this.ticker.createTimeout(t)}get started(){return this.#t}start(){if(!this.#t){for(let t of this.#e)t.start();this.#t=!0,super.start()}}stop(){if(this.#t){for(let t of this.#e)t.stop();this.#t=!1,super.stop()}}addRenderer(t){this.#e.has(t)||(this.#e.add(t),this.#t&&t.start(),t.game=this)}get mainRenderer(){return[...this.#e].at(0)}getRenderers(){return[...this.#e]}deleteRenderer(t){this.#e.has(t)&&(this.#e.delete(t),this.#t&&t.stop(),delete t.game)}}b.KaylaGame=r;class e extends O{game;pointerX;pointerY;pointerEvents;constructor(t){super(t),this.useDraw=this.useDraw.bind(this),this.on("draw",a=>{if(this.game)for(let h of this.game.scenes.values())h.handleDraw(a)}),this.pointerX=0,this.pointerY=0,this.pointerEvents=new K,this.pointerPosUpdater=this.pointerPosUpdater.bind(this),this.onPointerDown=this.onPointerDown.bind(this)}pointerPosUpdater(t){this.pointerX=t.clientX,this.pointerY=t.clientY}onPointerDown(t){this.pointerPosUpdater(t);let a=e.getClickType(t);if(a!=="invalid"){t.preventDefault();let h=this.getMousePos();this.pointerEvents.emit("down",h,a)}}static getClickType(t){switch(t.button){case 0:return"left";case 1:return"middle";case 2:return"right";default:return"invalid"}}listenPointerUpdates(){this.canvas.addEventListener("pointermove",this.pointerPosUpdater),this.canvas.addEventListener("pointerdown",this.onPointerDown)}unlistenPointerUpdates(){this.canvas.removeEventListener("pointermove",this.pointerPosUpdater),this.canvas.removeEventListener("pointerdown",this.onPointerDown)}pointerPosToWorldPos(t,a){let h=this.canvas.getBoundingClientRect(),c=(t-h.left)/h.width,g=(a-h.top)/h.height,w=c*this.viewportWidth*this.cameraWidth/h.width,C=g*this.viewportHeight*this.cameraHeight/h.height;return new P(w,C)}getMousePos(){return this.pointerPosToWorldPos(this.pointerX,this.pointerY)}useDraw(t){let a=h=>{t(h,new i)};return this.on("draw",a),()=>{this.off("draw",a)}}attachTo(t){t.addRenderer(this),this.game=t}detach(){this.game&&this.game.deleteRenderer(this)}}b.KaylaRenderer=e;class n{current;saves;constructor(){this.saves=[]}useTick(t){if(!this.current)throw new Error("Hook 'useTick' must be executed in the top level scope of a component.");this.current.onTick[this.current.useStepCallIndex]=t,this.current.useStepCallIndex++}usePaint(t){if(!this.current)throw new Error("Hook 'usePaint' must be executed in the top level scope of a component.");this.current.onPaint[this.current.useDrawCallIndex]=t,this.current.useDrawCallIndex++}useEntity(){if(!this.current)throw new Error("Hook 'useEntity' must be executed in the top level scope of a component.");return ye(ge)}useSelf(t){if(!this.current)throw new Error("Hook 'useSelf' must be executed in the top level scope of a component.");let a=ye(null);return(a.current===null||a.current===void 0)&&(a.current=t()),a.current}useInitialization(t){if(!this.current)throw new Error("Hook 'useInitialization' must be executed in the top level scope of a component.");let a=this.current;a.onInit=t}useRect(){if(!this.current)throw new Error("Hook 'useRect' must be executed in the top level scope of a component.");return L(()=>new b.KaylaInternalRect(this.current))}useFiber(){if(!this.current)throw new Error("Hook 'useFiber' must be executed in the top level scope of a component.");return L(()=>this.current)}useFiberControl(){if(!this.current)throw new Error("Hook 'useFiberControl' must be executed in the top level scope of a component.");let t=this.current;return L(()=>({refresh:()=>t.refresh(),get childrenCount(){return t.lastChildren.length},setMaxChildren:a=>{t.setMaxChildren(a)},getMaxChildren:()=>t.getMaxChildren(),get maxSafeChildren(){return t.maxSafeChildren},get key(){return t.key},get getChildrenEntities(){return t.getChildrenEntities.bind(t)},get getEntityChain(){return t.getEntityChain.bind(t)},get getFiberChain(){return t.getFiberChain.bind(t)}}))}useCurrentTicker(){if(!this.current)throw new Error("Hook 'useCurrentTicker' must be executed in the top level scope of a component.");return this.current.getAttachedGame().ticker}useCurrentRenderer(){if(!this.current)throw new Error("Hook 'useCurrentRenderer' must be executed in the top level scope of a component.");return this.current.getAttachedGame().mainRenderer}useCurrentGame(){if(!this.current)throw new Error("Hook 'useCurrentGame' must be executed in the top level scope of a component.");return this.current.getAttachedGame()}useCurrentScene(){if(!this.current)throw new Error("Hook 'useCurrentScene' must be executed in the top level scope of a component.");return this.current.scene}useState(t,{alwaysRecall:a=!1}={}){if(!this.current)throw new Error("Hook 'useState' must be executed in the top level scope of a component.");let c=this.current.state[this.current.useStateCallIndex]??new s(this.current,t,{alwaysRecall:a});return this.current.state[this.current.useStateCallIndex]=c,this.current.useStateCallIndex++,c}useShouldRefresh(t){let a=this.current;if(!a)throw new Error("useShouldRefresh must be called inside a component");a.watchedDeps&&console.warn("useShouldRefresh called multiple times \u2014 using the last call"),a.watchedDeps=t}useRef(t){if(!this.current)throw new Error("Hook 'useRef' must be executed in the top level scope of a component.");let h=this.current.refs[this.current.useRefCallIndex]??d(t??null);return this.current.refs[this.current.useRefCallIndex]=h,this.current.useRefCallIndex++,h}useEffect(t){if(!this.current)throw new Error("Hook 'useEffect' must be executed in the top level scope of a component.");this.current.onEffect[this.current.useEffectCallIndex]=t,this.current.useEffectCallIndex++}useExports(t,a){if(!this.current)throw new Error("Hook 'useExports' must be executed in the top level scope of a component.");this.current.onExport=a}useGlobalClick(t){if(!this.current)throw new Error("Hook 'useGlobalClick' must be executed in the top level scope of a component.");this.current.onGlobalClick[this.current.useGlobalClickCallIndex]=t,this.current.useGlobalClickCallIndex++}useClick(t){if(!this.current)throw new Error("Hook 'useClick' must be executed in the top level scope of a component.");let a=this.current;De((h,c)=>{let g=a.entity;if(!g)return;let w=g.getRawRect(),C=A.createRawRect({x:h.x,y:h.y,width:3,height:3});A.rawCollision(w,C)&&t(h,c)})}useContext(t){if(!this.current)throw new Error("Hook 'useContext' must be executed in the top level scope of a component.");return this.current.findContextValueFromInst(t)}save(){this.saves.push({current:this.current})}restore(){let t=this.saves.pop();if(!t)throw new Error("Cannot restore without saving.");this.current=t.current}logLevel="warn";logger={debug:(...t)=>{this.logLevel==="debug"&&console.debug(...t)},info:(...t)=>{["info","warn","debug"].includes(this.logLevel)&&console.info(...t)},warn:(...t)=>{["warn","debug"].includes(this.logLevel)&&console.warn(...t)},error:(...t)=>console.error(...t),withFiber:(t,a,h,...c)=>{let g=t?.fc?.name||"anonymous",w=t?.key?` key=${t.key}`:"";this.logger[a](`${h} <${g}${w}>`,...c)}}}b.GlobalKayla=n;class i{preventDefault(){this.#e=!0}#e=!1;isPrevented(){return this.#e}}b.KaylaEvent=i;class s{#e;#t;#n;alwaysRecall;constructor(t,a,{alwaysRecall:h=!1}={}){this.#t=t,this.#e=a??void 0,this.#n=Date.now(),this.alwaysRecall=h}get(){return this.#e}*[Symbol.iterator](){throw new Error(`Hey! KaylaState is NOT an array / iterable like useState in React.
|
|
1
|
+
"use strict";var pe=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var $e=Object.getOwnPropertyNames;var Ne=Object.prototype.hasOwnProperty;var fe=(r,e)=>{for(var n in e)pe(r,n,{get:e[n],enumerable:!0})},Oe=(r,e,n,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of $e(e))!Ne.call(r,s)&&s!==n&&pe(r,s,{get:()=>e[s],enumerable:!(i=Ue(e,s))||i.enumerable});return r};var Xe=r=>Oe(pe({},"__esModule",{value:!0}),r);var Rt={};fe(Rt,{Kayla:()=>N,LEA:()=>$,default:()=>Et});module.exports=Xe(Rt);var $={};fe($,{DeltaTweenII:()=>ne,ENVIRONMENT:()=>ye,GEmitterMemory:()=>me,LeaEntityII:()=>z,LeaEventEmitter:()=>T,LeaGameII:()=>B,LeaRendererII:()=>X,LeaSceneII:()=>q,LeaSerializers:()=>Ee,LeaTickerII:()=>te,LeaTimeout:()=>re,LeaUtilsII:()=>R,LiaAudio:()=>U,LiaAudioSrc:()=>H,LiaOscSFX:()=>A,LiaSFXMap:()=>Qe,NOTE_NAMES:()=>Ke,RectLeaEntity:()=>W,Vector2:()=>M,colToRGBA:()=>Be,defaultSFXConfig:()=>Te,editRGBA:()=>We,generateUUID:()=>Ae,getAvoidAngle:()=>Ve,getEnvironment:()=>ke,getNormalizedColor:()=>qe,getRayHit:()=>Le,isInitiallyMobile:()=>et,isMobile:()=>De,isNode:()=>Y,isNote:()=>je,isWeb:()=>C,parseFillStyle:()=>Re,raycastAvoid:()=>Ze,scaleCoord:()=>Ye,setAnimInterval:()=>_e,sfxHit:()=>Me,sfxJump:()=>Fe,sfxLaser:()=>Pe,sfxUIClick:()=>Se,sfxUIHover:()=>Ie,shortUID:()=>Je,tinyUID:()=>ie});var T=class{#e=new Map;constructor(){this.#e=new Map}on(e,n){let i=this.#e.get(e)||[];return i.push(n),this.#e.set(e,i),this}once(e,n){let i=(...s)=>{this.off(e,i),n(...s)};return this.on(e,i),this}off(e,n){let i=this.#e.get(e);if(!i)return this;let s=i.indexOf(n);return s>=0&&i.splice(s,1),this}emit(e,...n){let i=this.#e.get(e);if(!i||i.length===0){if(e==="error")throw n[0];return!1}return i.slice().forEach(s=>s(...n)),!0}removeAllListeners(e){return e?this.#e.delete(e):this.#e.clear(),this}listenerCount(e){return this.#e.get(e)?.length??0}},X=class extends T{canvas;ctx;running;_rafId;_fps;_frameCount;_fpsTimer;_lastFrameTime;constructor(e,{viewportWidth:n,viewportHeight:i,cameraWidth:s,cameraHeight:o}={}){if(!C)throw new Error("Web-Only");super(),this.canvas=e,this.ctx=e.getContext("2d"),this.automatic=!0,this.#e=n??e.width,this.#t=i??e.height,this.#n=s??e.width,this.#r=o??e.height,this.running=!1,this._rafId=null,this._loop=this._loop.bind(this),this.updateCanvasResolution(),this._fps=60,this._frameCount=0,this._fpsTimer=0}automatic;retransform(){this.ctx.setTransform(1,0,0,1,0,0);let e=this.#n/this.#e,n=this.#r/this.#t;this.ctx.translate(this.#n/2,this.#r/2),this.ctx.scale(e,n),this.ctx.translate(-this.#e/2,-this.#t/2)}#e=0;#t=0;#n=0;#r=0;get viewportWidth(){return this.#e}set viewportWidth(e){this.#e=e,this.retransform(),this.emitViewportUpdate()}get width(){return this.#e}get height(){return this.#t}get centerX(){return this.#e/2}get centerY(){return this.#t/2}get left(){return 0}get top(){return 0}get right(){return this.#e}get bottom(){return this.#t}get viewportHeight(){return this.#t}set viewportHeight(e){this.#t=e,this.retransform(),this.emitViewportUpdate()}get cameraWidth(){return this.#n}set cameraWidth(e){this.#n=e,this.updateCanvasResolution(),this.retransform()}get cameraHeight(){return this.#r}set cameraHeight(e){this.#r=e,this.updateCanvasResolution(),this.retransform()}updateCanvasResolution(){this.canvas.width=this.#n,this.canvas.height=this.#r}emitViewportUpdate(){this.emit("viewport_update",{width:this.viewportWidth,height:this.viewportHeight})}applyTransform(){this.retransform()}get FPS(){return this._fps}_loop(){this.automatic&&this.update(),this._rafId=requestAnimationFrame(this._loop)}update(){if(!this.running||!C)return;let e=performance.now(),n=(e-(this._lastFrameTime??e))/1e3;this._lastFrameTime=e,this._frameCount++,this._fpsTimer+=n,this._fpsTimer>=1&&(this._fps=Math.round(this._frameCount/this._fpsTimer),this._frameCount=0,this._fpsTimer=0),this.ctx.clearRect(0,0,this.#n,this.#r),this.emit("draw",this.ctx)}start(){if(!this.running){if(!C||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!0,this._rafId=requestAnimationFrame(this._loop)}}stop(){if(!C||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!1,this._rafId!==null&&(cancelAnimationFrame(this._rafId),this._rafId=null)}},te=class extends T{setNow(e){this.#e=e}#e=0;__intervalId=null;__lastTime=0;constructor(e=16){super(),this.#t=e,this.speedHackDT=1}speedHackDT;get isRaf(){return this.tickInterval===1/0}#t=15;get tickInterval(){return this.#t}set tickInterval(e){this.#t=e,this.__intervalId&&(this.stop(),this.start())}now(){return this.#e}__tick(){let e=performance.now(),n=(e-this.__lastTime)/1e3*this.speedHackDT;this.__lastTime=e,!(C&&typeof this.__intervalId=="function"&&document.hidden)&&(this.#e+=n*1e3,this.emit("tick",n))}createTimeout(e){return new re(e,this)}createTween(e,n=()=>{}){let i=new ne(e),s=(o=0)=>{if(i.finished){this.off("tick",s);return}i.update(o)};return i.on("finish",()=>{this.off("tick",s)}),i.on("delta",o=>{n(o)}),this.on("tick",s),i}start(){this.__intervalId===null&&(this.__lastTime=performance.now(),this.__intervalId=C&&!isFinite(this.tickInterval)?_e(()=>this.__tick()).clear:setInterval(()=>this.__tick(),this.tickInterval))}stop(){this.__intervalId!==null&&(typeof this.__intervalId=="function"?this.__intervalId():clearInterval(this.__intervalId)),this.__intervalId=null}getSineMod(e,n=0){return .5+.5*Math.sin((this.now()%e/e+n)*2*Math.PI)}},Ee;(t=>{function r(a){return a===!0?1:0}t.booleanExport=r;function e(a){return a===0?!1:a===1}t.booleanImport=e;function n(a){return`${a.x}|${a.y}`}t.vec2Export=n;function i(a){let[l,p]=a.split("|"),y=parseFloat(l),w=parseFloat(p);if(isNaN(y)||isNaN(w))throw new Error(`Invalid Vector2 string: ${a}`);return new M(y,w)}t.vec2Import=i,t.booleanMap={mapExport:r,mapImport:e};function o(a){return l=>Number(l.toFixed(a))}t.createRounder=o;function c(a=10){return{mapExport(l){return Math.round(l/a)},mapImport(l){return l*a}}}t.createLowPrecision=c;function d(a){return Math.round(a)}t.lightWeightRounder=d;function u(a=100){return{mapExport(l){return Math.round(l*a)},mapImport(l){return l/a}}}t.createPercent=u;function h(a){let l=new Map(Object.entries(a));return{mapExport:p=>l.get(p)??null,mapImport:p=>Array.from(l.entries()).find(([y,w])=>w===p)?.[0]??null}}t.createLookup=h;function f(a){let l=a*(180/Math.PI);return Math.round((l%360+360)%360)}t.radToDeg=f;function b(a){return a*(Math.PI/180)}t.degToRad=b,t.angleRadToDeg={mapExport:f,mapImport:b};function x(a=10){let l=c(a);return{mapExport(p){return l.mapExport(f(p))},mapImport(p){return l.mapImport(b(p))}}}t.createLowPrecisionRadToDeg=x})(Ee||={});var z=class r extends T{name="";scaleRotate=0;scale=1;constructor(e,n=0,i=0){super(),this.autoTranslate=!1,this.name=e,this.z=0,this.___pos=new M(n,i),this.nonSerializableProperties=[],this.nonSerializableProperties.push("___pos","autoTranslate","arraySerializeMap"),this.forceSerializableProperties=[],this.forceSerializableProperties.push("x","y")}arraySerializeMap;autoTranslate;z;___pos;nonSerializableProperties;forceSerializableProperties;get pos(){return this.___pos}get x(){return this.pos.x}get y(){return this.pos.y}set x(e){this.pos.x=e}set y(e){this.pos.y=e}handleUpdate(e){if(this.update)try{this.emit("update",e),this.update(e)}catch(n){this.emit("error",n)}}handleDraw(e){if(!(Y||!this.draw)){e.save(),this.autoTranslate&&e.translate(this.x,this.y);try{this.emit("draw",e),this.draw(e)}catch(n){this.emit("error",n)}e.restore()}}serialize(){if(Array.isArray(this.arraySerializeMap))return this.arraySerializeMap.map(([s,{mapExport:o}])=>{let c=Reflect.get(this,s);return o?o(c):c});let e=["_events","_eventsCount","_maxListeners","nonSerializableProperties","forceSerializableProperties"],n=[...Reflect.ownKeys(this),...this.forceSerializableProperties].filter(s=>!this.nonSerializableProperties.includes(s)&&!e.includes(s.toString())),i=Object.fromEntries(n.map(s=>{let o=Reflect.get(this,s);if(Y&&typeof o=="number"){let c=o.toString().split("."),u=(c[1]?c[1].length:0)>2?Number(o.toFixed(2)):o;return[s,u]}return[s,o]}));return JSON.parse(JSON.stringify(i))}toLocal(e){return e.subtract(this.pos)}toWorld(e){return e.add(this.pos)}deserializeArray(e){return r.deserializeArray(this.arraySerializeMap,e)}static deserializeArray(e,n){if(!e||!Array.isArray(n))return n;let i={};for(let s=0;s<n.length;s++){let o=e[s];if(!o)break;let[c,{mapImport:d}]=o,u=n[s];if(d&&(u=d(u)),typeof c!="string")break;try{Reflect.set(i,c,u)}catch(h){console.error(h)}}return i}},q=class extends T{name="";entities=new Map;paused=!0;constructor(e){super(),this.name=e}handleUpdate(e){if(!this.paused){this.emit("update",e);for(let n of this.entities.values())n.handleUpdate(e)}}handleDraw(e){if(!Y&&!this.paused){this.emit("draw",e);for(let n of[...this.entities.values()].sort((i,s)=>i.z-s.z))n.handleDraw(e)}}addEntity(e){if(!(e instanceof z))throw new Error("invalid entity");if(!e.name)throw new Error("Entity must have a name.");this.entities.set(e.name,e)}removeEntity(e){if(!(e instanceof z))throw new Error("invalid entity");this.entities.delete(e.name)}getEntity(e){return this.entities.get(e)}},B=class{scenes;ticker;get centerX(){return this.width/2}get centerY(){return this.height/2}get left(){return 0}get top(){return 0}get right(){return this.width}get bottom(){return this.height}width;height;constructor(e,n,i=16){this.ticker=new te(i),this.scenes=new Map,this.width=e,this.height=n,this.ticker.on("tick",s=>{for(let o of this.scenes.values())o.paused||o.handleUpdate(s)})}addScene(e){if(!e.name)throw new Error("Scene must have a name.");e.paused=!1,this.scenes.set(e.name,e)}removeScene(e){e&&(e.paused=!0),this.scenes.delete(e.name)}now(){return this.ticker.now()}start(){this.ticker.start()}stop(){this.ticker.stop()}},R={lerp(r,e,n){return r+(e-r)*n},clamp(r,e,n){return Math.min(n,Math.max(e,r))},clamp01(r){return Math.min(1,Math.max(0,r))},easeLinear(r){return r},easeInQuad(r){return r*r},easeOutQuad(r){return 1-(1-r)*(1-r)},easeInOutQuad(r){return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2},easeInSine(r){return 1-Math.cos(r*Math.PI/2)},easeOutSine(r){return Math.sin(r*Math.PI/2)},easeInOutSine(r){return-(Math.cos(Math.PI*r)-1)/2},easeInExpo(r){return r===0?0:Math.pow(2,10*r-10)},easeOutExpo(r){return r===1?1:1-Math.pow(2,-10*r)},easeInOutExpo(r){return r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2},smoothstep(r){return r=R.clamp(r,0,1),r*r*(3-2*r)},randomLerp(r,e){return R.lerp(r,e,Math.random())},randomInt(r,e){return Math.floor(Math.random()*(e-r+1))+r},randomArrayValue(r){return r[R.randomInt(0,r.length-1)]},createBezier(r,e,n,i){function s(d,u,h,f,b){let g=1-d;return g*g*g*u+3*g*g*d*h+3*g*d*d*f+d*d*d*b}function o(d,u,h,f,b){let g=1-d;return 3*g*g*(h-u)+6*g*d*(f-h)+3*d*d*(b-f)}function c(d){let u=d;for(let h=0;h<6;h++){let f=s(u,0,r,n,1),b=o(u,0,r,n,1);if(b===0)break;u-=(f-d)/b}return R.clamp(u,0,1)}return function(u){u=R.clamp(u,0,1);let h=c(u);return s(h,0,e,i,1)}},lengthSquared(...r){return r.reduce((e,n)=>e+n*n,0)},normalizeRad(r){let e=2*Math.PI;return r=r%e,r<0&&(r+=e),r},angleInvertY(r){return R.normalizeRad(-r)},degToRadFlipY(r){return R.angleInvertY(r*Math.PI/180)},minimalAngularDirection(r,e){r=R.normalizeRad(r),e=R.normalizeRad(e);let n=R.normalizeRad(e-r),i=R.normalizeRad(r-e);return n<=i?1:-1}},ne=class extends T{constructor({delta:e,ms:n,easing:i}){super(),this.delta=e,this.duration=n,this.elapsed=0,this.easing=i??(s=>s),this.lastValue=0,this.finished=!1}delta;duration;elapsed;lastValue;finished;easing;update(e){this.elapsed+=e*1e3;let n=R.clamp(this.elapsed/this.duration,0,1),i=this.easing(n),s=this.delta*i,o=s-this.lastValue;this.lastValue=s,this.emit("delta",o),n>=1&&(this.finished=!0,this.emit("finish",void 0))}},W=class extends z{constructor(e,n=0,i=0,s=50,o=50){super(e,n,i),this.width=s,this.height=o}width;height;get left(){return this.x-this.width/2}set left(e){this.x=e+this.width/2}get right(){return this.x+this.width/2}set right(e){this.x=e-this.width/2}get top(){return this.y-this.height/2}set top(e){this.y=e+this.height/2}get bottom(){return this.y+this.height/2}set bottom(e){this.y=e-this.height/2}get lx(){return 0}get ly(){return 0}get lleft(){return-this.width/2}get lright(){return this.width/2}get ltop(){return-this.height/2}get lbottom(){return this.height/2}isCollidingWith(e){return!(this.right<e.left||this.left>e.right||this.bottom<e.top||this.top>e.bottom)}color="rgba(0, 0, 255, 0.3)";draw(e){e.translate(this.x,this.y),e.rotate(this.scaleRotate),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height)}},re=class extends T{duration;ticker;elapsed;finished;_resolve;promise;_timeoutId;constructor(e,n=null){super(),this.duration=e,this.ticker=n,this.elapsed=0,this.finished=!1,this._resolve=null,this.promise=new Promise(i=>this._resolve=i),this.update=this.update.bind(this),this.ticker&&this.ticker.on("tick",this.update)}update(e=0){this.finished||(this.elapsed+=e*1e3,this.elapsed>=this.duration&&this.finish())}finish(){this.finished||(this.finished=!0,this.emit("finish",void 0),this._resolve&&this._resolve(),this.ticker&&this.ticker.off("tick",this.update))}start(){return this.ticker||(this._timeoutId=setTimeout(()=>this.finish(),this.duration)),this}cancel(){this.finished||(this.finished=!0,!this.ticker&&this._timeoutId!=null&&clearTimeout(this._timeoutId),this.ticker&&this.ticker.off("tick",this.update))}then(e,n){return this.promise.then(e,n)}after(e,n){return this.promise.then(e,n)}},M=class r{constructor(e=0,n=0){this.x=e,this.y=n}x;y;toJSON(){return{x:this.x,y:this.y,vec2:!0}}static isVec2(e){return e&&typeof e=="object"&&"x"in e&&"y"in e&&e.vec2===!0}static fromSerialized(e){return this.isVec2(e)?new this(e.x,e.y):null}rotate(e){let n=Math.cos(e),i=Math.sin(e);return new r(this.x*n-this.y*i,this.x*i+this.y*n)}static from(e){return new r(Math.cos(e),Math.sin(e))}isEmpty(){return Math.abs(this.x)<.01&&Math.abs(this.y)<.01}get angle(){return Math.atan2(this.y,this.x)}angleTo(e){return Math.atan2(e.y-this.y,e.x-this.x)}get length(){return Math.hypot(this.x,this.y)}get lengthSquared(){return this.x*this.x+this.y*this.y}normalized(){let e=this.length;return e===0?new r(0,0):new r(this.x/e,this.y/e)}consume(e){let n=this.length;n<=e?(this.x=0,this.y=0):this.overwite(this.scale((n-e)/n))}project(e){return e.scale(this.dotNormalized(e))}reflect(e){let n=this.dot(e);return this.subtract(e.scale(2*n))}dotNormalized(e){let n=this.normalized(),i=e.normalized();return n.x*i.x+n.y*i.y}lengthSquaredTo(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}dot(e){return this.x*e.x+this.y*e.y}distanceTo(e){return Math.hypot(this.x-e.x,this.y-e.y)}distanceToCheap(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}directionTo(e){return new r(e.x-this.x,e.y-this.y).normalized()}add(e){return new r(this.x+e.x,this.y+e.y)}addRaw(e){return new r(this.x+e,this.y+e)}overwite(e){this.x=e.x,this.y=e.y}subtract(e){return new r(this.x-e.x,this.y-e.y)}scale(e){return new r(this.x*e,this.y*e)}toString(){return`Vector2(${this.x}, ${this.y})`}clone(){return new r(this.x,this.y)}};function qe(r){let e=/^rgba?\(([^)]+)\)$/,n=r.match(e);if(n){let[i,s,o,c=1]=n[1].split(",").map(d=>parseFloat(d));return{r:Math.max(0,Math.min(255,Math.floor(i))),g:Math.max(0,Math.min(255,Math.floor(s))),b:Math.max(0,Math.min(255,Math.floor(o))),a:Math.max(0,Math.min(1,Math.floor(c*255)/255))}}return Re(r)}function Be(r){return`rgba(${r.r}, ${r.g}, ${r.b}, ${r.a})`}function Re(r){if(r=r.trim().toLowerCase(),r[0]==="#"){let n,i,s;if(r.length===7)n=parseInt(r.slice(1,3),16),i=parseInt(r.slice(3,5),16),s=parseInt(r.slice(5,7),16);else if(r.length===4)n=parseInt(r[1]+r[1],16),i=parseInt(r[2]+r[2],16),s=parseInt(r[3]+r[3],16);else throw new Error("Invalid hex color");return{r:n,g:i,b:s,a:1}}let e=r.match(/^rgba?\s*\(\s*(\d+)[, ]\s*(\d+)[, ]\s*(\d+)(?:[, ]\s*([\d.]+))?\s*\)$/);if(e)return{r:parseInt(e[1]),g:parseInt(e[2]),b:parseInt(e[3]),a:e[4]!==void 0?parseFloat(e[4]):1};throw new Error("Unsupported fillStyle format")}function We(r,{r:e,g:n,b:i,a:s}={}){let[o,c,d,u,h]=r.match(/rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*([\d.]*)\)?/)||[];return`rgba(${e??c}, ${n??d}, ${i??u}, ${s??(h||1)})`}function Ye(r,e,n){return n+(r-n)*e}function ke(){return typeof process<"u"&&process.release?.name==="node"?"node":typeof window<"u"||typeof self<"u"?"web":"unknown"}var ye=ke(),Y=ye==="node",C=ye==="web",U=class r{static unlock(){C&&this.audioCtx.state!=="running"&&this.audioCtx.resume()}static audioCtx=C?new AudioContext:null;static masterGain=C?this.audioCtx.createGain():null;static musicGain=C?this.audioCtx.createGain():null;static sfxGain=C?this.audioCtx.createGain():null;static{C&&(this.masterGain.gain.value=1,this.musicGain.gain.value=1,this.sfxGain.gain.value=1,this.sfxGain.connect(this.masterGain),this.musicGain.connect(this.masterGain),this.masterGain.connect(this.audioCtx.destination))}static get SFX_VOLUME(){return this.sfxGain.gain.value}static get MUSIC_VOLUME(){return this.musicGain.gain.value}static get VOLUME(){return this.masterGain.gain.value}static set SFX_VOLUME(e){this.sfxGain.gain.value=e}static set MUSIC_VOLUME(e){this.musicGain.gain.value=e}static set VOLUME(e){this.masterGain.gain.value=e}static noteToHz(e){return this.tuningFreq*Math.pow(2,(e-9)/12)}static tuningFreq=440;static audioBufferCache=new Map;static loops=new Map;static sfsx=new Map;static loopIdCounter=0;static CACHE_NAME="lia-audio-cache-v1";static async preLoad(e){if(this.audioBufferCache.has(e))return this.audioBufferCache.get(e);let n=r.CACHE_NAME,i,s;if(typeof caches<"u"&&(s=await caches.open(n),i=await s.match(e)),!i){if(i=await fetch(e),!i.ok)throw new Error(`Failed to fetch ${e}`);s&&await s.put(e,i.clone())}let o=await i.arrayBuffer(),c=await this.audioCtx.decodeAudioData(o);return this.audioBufferCache.set(e,c),c}static async getOnlyDownloadedCache(e){let n=r.CACHE_NAME;return await(await caches.open(n)).match(e)}static getCached(e){return this.audioBufferCache.get(e)||null}static async playSound(e,n=.2,i=1,s=!0){try{this.sfsx.has(e)&&this.sfsx.get(e).source.stop(),this.audioBufferCache.has(e)||await this.preLoad(e);let o=this.getCached(e);if(!o)return;let c=new H(o);c.buffer=o;let d=1-.12,u=1+.12;c.playbackRate=i??d+Math.random()*(u-d);let h=this.audioCtx.createGain();h.gain.value=n,c.tempGain=h,c.connect(h),h.connect(this.sfxGain),c.onended=()=>{c.disconnect(),h.disconnect()},c.start(),s&&this.sfsx.set(e,{source:c,gain:h})}catch(o){console.error(o)}}static async playLoop(e,n=1,{loopStart:i=0,loopEnd:s=null,exclusive:o=!0,skipMS:c=0}={}){if(o)for(let b of this.loops.keys())this.stopLoop(b);this.audioBufferCache.has(e)||await this.preLoad(e);let d=this.getCached(e);if(!d)return;let u=new H(d);u.buffer=d,u.loop=!0,typeof i=="number"&&(u.loopStart=i),typeof s=="number"&&(u.loopEnd=s);let h=this.audioCtx.createGain();h.gain.value=n,u.tempGain=h,u.playbackRate=1,u.onended=()=>{u.disconnect(),h.disconnect()},u.connect(h),h.connect(this.musicGain),u.start(0,c/1e3);let f=++this.loopIdCounter;return this.loops.set(f,{source:u,gain:h}),f}static stopLoop(e){let n=this.loops.get(e);n&&(n.source.stop(),n.source.notIndependent||(n.source.disconnect(),n.gain.disconnect()),this.loops.delete(e))}static async createLiaSource(e,{volume:n=1,speed:i=1,loop:s=!1,loopStart:o=0,loopEnd:c=null,isMusic:d=!1,gain:u=null}={}){try{this.audioBufferCache.has(e)||await this.preLoad(e);let h=this.getCached(e);if(!h)return null;let f=new H(h);f.loop=s,f.loopStart=o,f.loopEnd=typeof c=="number"?c:h.duration,f.playbackRate=i;let b=this.audioCtx.createGain();return b.gain.value=n,f.connect(b),f.tempGain=b,b.connect(u||(d?this.musicGain:this.sfxGain)),f.onended=()=>{f.disconnect(),b.disconnect()},f}catch(h){return console.error("Failed to create LiaAudioSrc:",h),null}}},Ke=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function je(r){return Ke.includes(r)}var H=class{numberOfInputs;numberOfOutputs;constructor(e,n=U.audioCtx){this.context=n,this.buffer=e,this.source=null,this.startTime=0,this.pauseTime=0,this.playbackRate=1,this.isPlaying=!1,this.loop=!1,this.output=C?n.createGain():null,this.output.gain.value=1,this.channelCount=2,this.channelCountMode="max",this.channelInterpretation="speakers",this.numberOfInputs=0,this.numberOfOutputs=1,this.onended=null}channelCount;channelCountMode;channelInterpretation;onended;source;buffer;context;_createSource(){this.source&&(this.source.onended=null);let e=this.context.createBufferSource();return e.buffer=this.buffer,e.playbackRate.value=this.playbackRate,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd>0?this.loopEnd:this.buffer.duration,e.connect(this.output),this.source=e,e.onended=()=>{this.source===e&&(this.isPlaying&&!this.loop&&(this.isPlaying=!1,this.pauseTime=0),typeof this.onended=="function"&&this.onended())},e}play({fadeIn:e=0,offset:n=null}={}){let i=n!==null?n:this.pauseTime;if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.source=this._createSource(),this.startTime=this.context.currentTime-i/this.playbackRate,this.source.start(0,i),e>0?(this.output.gain.setValueAtTime(0,this.context.currentTime),this.output.gain.linearRampToValueAtTime(1,this.context.currentTime+e)):this.output.gain.setValueAtTime(1,this.context.currentTime),this.isPlaying=!0}start(e=0,n=0,i){this.isPlaying||(this.source=this._createSource(),this.startTime=this.context.currentTime+e-n/this.playbackRate,i!==void 0?this.source.start(this.context.currentTime+e,n,i):this.source.start(this.context.currentTime+e,n),this.pauseTime=n,this.isPlaying=!0)}pause({fadeOut:e=0}={}){if(!this.isPlaying)return;let n=this.getElapsed()/1e3;if(this.loop&&this.loopEnd>this.loopStart){let i=this.loopEnd-this.loopStart;n=this.loopStart+(n-this.loopStart)%i}if(this.isPlaying=!1,e>0){let i=this.context.currentTime;this.output.gain.setValueAtTime(this.output.gain.value,i),this.output.gain.linearRampToValueAtTime(0,i+e),setTimeout(()=>{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n,this.output.gain.setValueAtTime(1,this.context.currentTime)},e*1e3)}else{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n}}getElapsed(){return this.isPlaying?(this.context.currentTime-this.startTime)*this.playbackRate*1e3:this.pauseTime*1e3}setSpeed(e){if(e<=0)throw new Error("Playback rate must be positive");let n=this.getElapsed()/1e3;this.playbackRate=e,this.isPlaying&&(this.pause(),this.pauseTime=n,this.play())}setLoop(e=!0){this.loop=e,this.source&&(this.source.loop=e)}loop;playbackRate;startTime;tempGain=null;connect(e,n=0,i=0){if("value"in e)this.output.connect(e,n);else return this.output.connect(e,n,i),e}disconnect(e,n,i){e===void 0?this.output.disconnect():this.output.disconnect(e,n,i)}output;stop(e=0){if(this.notIndependent)return this.pause();if(!this.source)return;let n=this.context.currentTime+e;this.source.stop(n),this.isPlaying=!1,this.notIndependent||(this.pauseTime=0)}pauseTime;isPlaying;notIndependent=!1;loopStart=0;loopEnd=0},Te={osc:{enabled:!0,type:"sine",freq:440,detune:0},noise:{enabled:!1,level:.5},ampEnv:{attack:.005,decay:.1,sustain:0,release:.1,volume:.3},pitchEnv:{amount:0,decay:.2},filter:{enabled:!1,type:"lowpass",freq:1200,Q:1,envAmount:0,decay:.2},lfo:{enabled:!1,target:"freq",rate:8,depth:20},duration:.4},A=class r{constructor(e={}){this.ctx=U.audioCtx,this.cfg=structuredClone(Te),Object.assign(this.cfg,e)}ctx;cfg;play(e=U.sfxGain){let n=this.ctx,i=n.currentTime,s=this.cfg,o=n.createGain();o.gain.setValueAtTime(1e-4,i);let c=s.ampEnv;o.gain.exponentialRampToValueAtTime(c.volume,i+c.attack),o.gain.exponentialRampToValueAtTime(Math.max(1e-4,c.sustain*c.volume),i+c.attack+c.decay),o.gain.exponentialRampToValueAtTime(1e-4,i+s.duration+c.release);let d=o,u;s.filter.enabled&&(u=n.createBiquadFilter(),u.type=s.filter.type,u.frequency.value=s.filter.freq,u.Q.value=s.filter.Q,u.connect(o),d=u);let h;if(s.osc.enabled){if(h=n.createOscillator(),h.type=s.osc.type,h.frequency.value=s.osc.freq,h.detune.value=s.osc.detune,s.pitchEnv.amount!==0){let a=Math.pow(2,s.pitchEnv.amount/12);h.frequency.exponentialRampToValueAtTime(s.osc.freq*a,i+s.pitchEnv.decay)}h.connect(d),h.start(i),h.stop(i+s.duration+c.release)}let f;if(s.noise.enabled){let a=n.sampleRate*s.duration,l=n.createBuffer(1,a,n.sampleRate),p=l.getChannelData(0);for(let y=0;y<a;y++)p[y]=(Math.random()*2-1)*s.noise.level;f=n.createBufferSource(),f.buffer=l,f.connect(d),f.start(i),f.stop(i+s.duration+c.release)}let b,g;s.lfo.enabled&&h&&(b=n.createOscillator(),b.frequency.value=s.lfo.rate,g=n.createGain(),g.gain.value=s.lfo.depth,b.connect(g),s.lfo.target==="freq"?g.connect(h.frequency):s.lfo.target==="gain"?g.connect(o.gain):s.lfo.target==="filter"&&u&&g.connect(u.frequency),b.start(i),b.stop(i+s.duration)),o.connect(e);let x=[h,f,b,g,u,o],t=i+s.duration+c.release;setTimeout(()=>{x.forEach(a=>a?.disconnect())},(t-n.currentTime)*1e3)}getConfig(){return structuredClone(this.cfg)}setConfig(e){return Object.assign(this.cfg,e),this}getKey(e){return this.cfg[e]}setKey(e,n){return Object.assign(this.cfg[e],n),this}setFreq(e){return this.cfg.osc.freq=e,this}setWave(e){return this.cfg.osc.type=e,this}setVolume(e){return this.cfg.ampEnv.volume=e,this}setAmpEnv(e,n,i,s){return Object.assign(this.cfg.ampEnv,{attack:e,decay:n,sustain:i,release:s}),this}setPitchEnv(e,n){return Object.assign(this.cfg.pitchEnv,{amount:e,decay:n}),this}setNoiseEnabled(e){return this.cfg.noise.enabled=e,this}setNoiseLevel(e){return this.cfg.noise.level=e,this}setFilterEnabled(e){return this.cfg.filter.enabled=e,this}setFilter(e,n,i){return Object.assign(this.cfg.filter,{type:e,freq:n,Q:i,enabled:!0}),this}setLFOEnabled(e){return this.cfg.lfo.enabled=e,this}setLFO(e,n,i){return Object.assign(this.cfg.lfo,{target:e,rate:n,depth:i,enabled:!0}),this}setDuration(e){return this.cfg.duration=e,this}clone(){return new r(structuredClone(this.cfg))}},Se=new A({osc:{enabled:!0,type:"square",freq:900,detune:0},ampEnv:{attack:.002,decay:.04,sustain:0,release:.02,volume:.15},duration:.05}),Ie=new A({osc:{enabled:!0,type:"sine",freq:600,detune:0},ampEnv:{attack:.01,decay:.08,sustain:0,release:.04,volume:.12},duration:.1}),Fe=new A({osc:{enabled:!0,type:"triangle",freq:500,detune:0},pitchEnv:{amount:12,decay:.15},ampEnv:{attack:.01,decay:.12,sustain:0,release:.05,volume:.25},duration:.18}),Pe=new A({osc:{enabled:!0,type:"sawtooth",freq:1200,detune:0},pitchEnv:{amount:-24,decay:.3},ampEnv:{attack:.005,decay:.25,sustain:0,release:.05,volume:.3},duration:.35}),Me=new A({osc:{enabled:!0,type:"square",freq:180,detune:0},noise:{enabled:!0,level:.4},ampEnv:{attack:.002,decay:.15,sustain:0,release:.05,volume:.35},duration:.2}),Qe=new Map([["ui_click",Se],["ui_hover",Ie],["jump",Fe],["laser",Pe],["hit",Me]]);function Je(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(r)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}function ie(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(4)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}var me=class{peer=null;key;events={};mbAcc=0;connected=!1;constructor(){this.key=`${Ae()}_${Date.now()}`}connect(e){e&&(this.peer=e,e.peer=this,this.connected=!0,e.connected=!0),this._emit("open")}isConnected(){return this.connected&&!!this.peer}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n)}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(i=>i!==n))}_emit(e,n){this.events[e]?.forEach(i=>i(n))}send(e,n){if(!this.peer)throw new Error("No peer connected");this.peer._receive(e,n)}_receive(e,n){e?this._emit(e,n):this._emit("message",n)}close(){if(this.connected=!1,this.peer){let e=this.peer;this.peer=null,e.peer=null,e.connected=!1,e._emit("close")}this._emit("close")}getKey(){return this.key}};function Ae(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function"){let r=new Uint8Array(16);return crypto.getRandomValues(r),r[6]=r[6]&15|64,r[8]=r[8]&63|128,[...r].map(e=>e.toString(16).padStart(2,"0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return(r==="x"?e:e&3|8).toString(16)})}function _e(r){let e=!0;function n(){e&&(r(),requestAnimationFrame(n))}return requestAnimationFrame(n),{clear:()=>e=!1}}function Le(r,e,n,i,s){let o=Math.cos(s),c=Math.sin(s),d=[];if(o!==0){let u=(0-r)/o,h=e+u*c;u>0&&h>=0&&h<=i&&d.push({side:"left",t:u})}if(o!==0){let u=(n-r)/o,h=e+u*c;u>0&&h>=0&&h<=i&&d.push({side:"right",t:u})}if(c!==0){let u=(0-e)/c,h=r+u*o;u>0&&h>=0&&h<=n&&d.push({side:"top",t:u})}if(c!==0){let u=(i-e)/c,h=r+u*o;u>0&&h>=0&&h<=n&&d.push({side:"bottom",t:u})}return d.length===0?null:(d.sort((u,h)=>u.t-h.t),d[0])}function Ve(r,e){let n;switch(e){case"left":case"right":n=Math.PI-r;break;case"top":case"bottom":n=2*Math.PI-r;break}return(n%(2*Math.PI)+2*Math.PI)%(2*Math.PI)}function Ze(r,e,n,i,s){let o=Le(r,e,n,i,s);return o?{...o,avoidAngle:Ve(s,o.side)}:null}function De(){return Y?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}var et=De();var N={};fe(N,{KaylaContext:()=>se,KaylaFragment:()=>bt,KaylaInternals:()=>D,KaylaRect:()=>_,createContext:()=>st,createElement:()=>it,createGame:()=>tt,createReassignableObject:()=>xt,createRenderer:()=>rt,createScene:()=>nt,createUseHook:()=>vt,self:()=>ge,setLogLevel:()=>wt,useClick:()=>lt,useContext:()=>yt,useCurrentGame:()=>dt,useCurrentRenderer:()=>pt,useCurrentScene:()=>ft,useCurrentTicker:()=>mt,useDisposableRef:()=>gt,useEffect:()=>xe,useEntity:()=>ct,useExports:()=>le,useFiber:()=>He,useFiberControl:()=>we,useGlobalClick:()=>Ge,useInitialization:()=>ae,useNextStack:()=>ve,usePaint:()=>ue,useRect:()=>oe,useRef:()=>be,useSelf:()=>V,useShouldRefresh:()=>ot,useState:()=>at,useTick:()=>ht,useViewportEffect:()=>ut});function tt({width:r,height:e,updateHz:n="frames"}){return new D.KaylaGame(r,e,n==="frames"?1/0:n)}function nt(r){let e=new q(r);return new D.KaylaScene(e)}function rt(r){return new D.KaylaRenderer(r)}function it(r,e){if(typeof r!="function")throw new Error("Invalid Element Type.");let n=e??{};return n.key??=r.name+"_"+ie(),{type:r,props:n}}var _;(i=>{function r(s,o){return!(s.right<o.left||s.left>o.right||s.bottom<o.top||s.top>o.bottom)}i.rawCollision=r;function e(s,o,c){let d=o*Math.PI/180,u=Math.cos(d),h=Math.sin(d),f=1/0;return u>0&&(f=Math.min(f,(c.right-s.x)/u)),u<0&&(f=Math.min(f,(c.left-s.x)/u)),h>0&&(f=Math.min(f,(c.bottom-s.y)/h)),h<0&&(f=Math.min(f,(c.top-s.y)/h)),M.from(o).scale(f)}i.getCurrToBound=e;function n(s){let{left:o,right:c,top:d,bottom:u,width:h,height:f,x:b=0,y:g=0}=s;if(h===null||f===null)throw new Error("width and height are required");let x,t;if(o!=null&&c!=null){if(Math.abs(c-o-h)>1e-6)throw new Error("left, right, and width mismatch");x=o}else b!=null?x=b-h/2:o!=null?x=o:c!=null?x=c-h:x=0;if(d!=null&&u!=null){if(Math.abs(u-d-f)>1e-6)throw new Error("top, bottom, and height mismatch");t=d}else g!=null?t=g-f/2:d!=null?t=d:u!=null?t=u-f:t=0;return{left:x,right:x+h,top:t,bottom:t+f,width:h,height:f,x:x+h/2,y:t+f/2}}i.createRawRect=n})(_||={});var D;(g=>{class r extends B{#e;#t;constructor(t,a,l){super(t,a,l),this.#e=new Set,this.#t=!1}delay(t){return this.ticker.createTimeout(t)}get started(){return this.#t}start(){if(!this.#t){for(let t of this.#e)t.start();this.#t=!0,super.start()}}stop(){if(this.#t){for(let t of this.#e)t.stop();this.#t=!1,super.stop()}}addRenderer(t){this.#e.has(t)||(this.#e.add(t),this.#t&&t.start(),t.game=this)}get mainRenderer(){return[...this.#e].at(0)}getRenderers(){return[...this.#e]}deleteRenderer(t){this.#e.has(t)&&(this.#e.delete(t),this.#t&&t.stop(),delete t.game)}}g.KaylaGame=r;class e extends X{game;pointerX;pointerY;pointerEvents;constructor(t){super(t),this.useDraw=this.useDraw.bind(this),this.on("draw",a=>{if(this.game)for(let l of this.game.scenes.values())l.handleDraw(a)}),this.pointerX=0,this.pointerY=0,this.pointerEvents=new T,this.pointerPosUpdater=this.pointerPosUpdater.bind(this),this.onPointerDown=this.onPointerDown.bind(this)}pointerPosUpdater(t){this.pointerX=t.clientX,this.pointerY=t.clientY}onPointerDown(t){this.pointerPosUpdater(t);let a=e.getClickType(t);if(a!=="invalid"){t.preventDefault();let l=this.getMousePos();this.pointerEvents.emit("down",l,a)}}static getClickType(t){switch(t.button){case 0:return"left";case 1:return"middle";case 2:return"right";default:return"invalid"}}listenPointerUpdates(){this.canvas.addEventListener("pointermove",this.pointerPosUpdater),this.canvas.addEventListener("pointerdown",this.onPointerDown)}unlistenPointerUpdates(){this.canvas.removeEventListener("pointermove",this.pointerPosUpdater),this.canvas.removeEventListener("pointerdown",this.onPointerDown)}pointerPosToWorldPos(t,a){let l=this.canvas.getBoundingClientRect(),p=(t-l.left)/l.width,y=(a-l.top)/l.height,w=p*this.viewportWidth*this.cameraWidth/l.width,k=y*this.viewportHeight*this.cameraHeight/l.height;return new M(w,k)}getMousePos(){return this.pointerPosToWorldPos(this.pointerX,this.pointerY)}useDraw(t){let a=l=>{t(l,new i)};return this.on("draw",a),()=>{this.off("draw",a)}}attachTo(t){t.addRenderer(this),this.game=t}detach(){this.game&&this.game.deleteRenderer(this)}}g.KaylaRenderer=e;class n{current;saves;constructor(){this.saves=[]}useTick(t){if(!this.current)throw new Error("Hook 'useTick' must be executed in the top level scope of a component.");this.current.onTick[this.current.useStepCallIndex]=t,this.current.useStepCallIndex++}usePaint(t){if(!this.current)throw new Error("Hook 'usePaint' must be executed in the top level scope of a component.");this.current.onPaint[this.current.useDrawCallIndex]=t,this.current.useDrawCallIndex++}useEntity(){if(!this.current)throw new Error("Hook 'useEntity' must be executed in the top level scope of a component.");return be(ge)}useSelf(t){if(!this.current)throw new Error("Hook 'useSelf' must be executed in the top level scope of a component.");let a=be(null);return(a.current===null||a.current===void 0)&&(a.current=t()),a.current}useInitialization(t){if(!this.current)throw new Error("Hook 'useInitialization' must be executed in the top level scope of a component.");let a=this.current;a.onInits[this.current.useInitCallIndex]=t,a.useInitCallIndex++}useRect(){if(!this.current)throw new Error("Hook 'useRect' must be executed in the top level scope of a component.");return V(()=>new g.KaylaInternalRect(this.current))}useFiber(){if(!this.current)throw new Error("Hook 'useFiber' must be executed in the top level scope of a component.");return V(()=>this.current)}useFiberControl(){if(!this.current)throw new Error("Hook 'useFiberControl' must be executed in the top level scope of a component.");let t=this.current;return V(()=>({refresh:()=>t.refresh(),get childrenCount(){return t.lastChildren.length},setMaxChildren:a=>{t.setMaxChildren(a)},getMaxChildren:()=>t.getMaxChildren(),get maxSafeChildren(){return t.maxSafeChildren},get key(){return t.key},get getChildrenEntities(){return t.getChildrenEntities.bind(t)},get getEntityChain(){return t.getEntityChain.bind(t)},get getFiberChain(){return t.getFiberChain.bind(t)}}))}useCurrentTicker(){if(!this.current)throw new Error("Hook 'useCurrentTicker' must be executed in the top level scope of a component.");return this.current.getAttachedGame().ticker}useCurrentRenderer(){if(!this.current)throw new Error("Hook 'useCurrentRenderer' must be executed in the top level scope of a component.");return this.current.getAttachedGame().mainRenderer}useCurrentGame(){if(!this.current)throw new Error("Hook 'useCurrentGame' must be executed in the top level scope of a component.");return this.current.getAttachedGame()}useCurrentScene(){if(!this.current)throw new Error("Hook 'useCurrentScene' must be executed in the top level scope of a component.");return this.current.scene}useState(t,{alwaysRecall:a=!1}={}){if(!this.current)throw new Error("Hook 'useState' must be executed in the top level scope of a component.");let p=this.current.state[this.current.useStateCallIndex]??new s(this.current,t,{alwaysRecall:a});return this.current.state[this.current.useStateCallIndex]=p,this.current.useStateCallIndex++,p}useShouldRefresh(t){let a=this.current;if(!a)throw new Error("useShouldRefresh must be called inside a component");a.watchedDeps&&console.warn("useShouldRefresh called multiple times \u2014 using the last call"),a.watchedDeps=t}useRef(t){if(!this.current)throw new Error("Hook 'useRef' must be executed in the top level scope of a component.");let l=this.current.refs[this.current.useRefCallIndex]??c(t??null);return this.current.refs[this.current.useRefCallIndex]=l,this.current.useRefCallIndex++,l}useEffect(t){if(!this.current)throw new Error("Hook 'useEffect' must be executed in the top level scope of a component.");this.current.onEffect[this.current.useEffectCallIndex]=t,this.current.useEffectCallIndex++}useViewportEffect(t){if(!this.current)throw new Error("Hook 'useViewport' must be executed in the top level scope of a component.");this.current.onViewportEffect[this.current.useViewCallIndex]=t,this.current.useViewCallIndex++}useExports(t,a){if(!this.current)throw new Error("Hook 'useExports' must be executed in the top level scope of a component.");this.current.onExport=a}useGlobalClick(t){if(!this.current)throw new Error("Hook 'useGlobalClick' must be executed in the top level scope of a component.");this.current.onGlobalClick[this.current.useGlobalClickCallIndex]=t,this.current.useGlobalClickCallIndex++}useClick(t){if(!this.current)throw new Error("Hook 'useClick' must be executed in the top level scope of a component.");let a=this.current;Ge((l,p)=>{let y=a.entity;if(!y)return;let w=y.getRawRect(),k=_.createRawRect({x:l.x,y:l.y,width:3,height:3});_.rawCollision(w,k)&&t(l,p)})}useContext(t){if(!this.current)throw new Error("Hook 'useContext' must be executed in the top level scope of a component.");return this.current.findContextValueFromInst(t)}save(){this.saves.push({current:this.current})}restore(){let t=this.saves.pop();if(!t)throw new Error("Cannot restore without saving.");this.current=t.current}logLevel="warn";logger={debug:(...t)=>{this.logLevel==="debug"&&console.debug(...t)},info:(...t)=>{["info","warn","debug"].includes(this.logLevel)&&console.info(...t)},warn:(...t)=>{["warn","debug"].includes(this.logLevel)&&console.warn(...t)},error:(...t)=>console.error(...t),withFiber:(t,a,l,...p)=>{let y=t?.fc?.name||"anonymous",w=t?.key?` key=${t.key}`:"";this.logger[a](`${l} <${y}${w}>`,...p)}}}g.GlobalKayla=n;class i{preventDefault(){this.#e=!0}#e=!1;isPrevented(){return this.#e}}g.KaylaEvent=i;class s{#e;#t;#n;alwaysRecall;constructor(t,a,{alwaysRecall:l=!1}={}){this.#t=t,this.#e=a??void 0,this.#n=Date.now(),this.alwaysRecall=l}get(){return this.#e}*[Symbol.iterator](){throw new Error(`Hey! KaylaState is NOT an array / iterable like useState in React.
|
|
2
2
|
You probably wrote: const [value, setValue] = useState(...)
|
|
3
3
|
|
|
4
4
|
\u2192 In Kayla write: const value = useState(...);
|
|
5
|
-
\u2192 Then: value.get() / value.set(v) / value.add(n)`)}refreshBased(){return[this.set.bind(this),this.get()]}add(t,{recall:a}={}){this.set(this.get()+t,{recall:a})}multiply(t,{recall:a}={}){this.set(this.get()*t,{recall:a})}set(t,{recall:a=!1}={}){let h=this.#e;if(t===h)return;this.#e=t;let g=Date.now()-this.#n;a&&g<67&&this.#t.global.logger.warn(`Hot structural state change <${this.#t.fc?.name||"anonymous"}> delta=${g}ms`),(a||this.alwaysRecall)&&this.#t.refresh(),this.#n=Date.now()}get value(){return this.#e}get lastChanged(){return this.#n}}b.KaylaInternalState=s;class o{#e;constructor(t){this.#e=t??void 0}#t;setSetter(t){this.#t=t}get current(){return this.#e}set current(t){this.#e=t,this.#t&&this.#t(this.#e)}}b.KaylaInternalRef=o;function d(x){return new o(x)}b.createReassignableRef=d;class f{state;refs;global;callProps;scene;exports;detectedParent;contextInfo;get childrenCount(){return this.lastChildren.length}maxSafeChildren;constructor(t,a,h){if(!h)throw new Error("Empty element");this.maxSafeChildren=40,this.scene=a,this.state=[],this.refs=[],this.fc=h.type,this.callProps=h.props??{},this.global=t,this.lastStateDeps=[],this.entity=null,this.lastChildren=[],this.onEffect=[],this.onUnEffect=[],this.onPaint=[],this.onTick=[],this.onGlobalClick=[],this.pointerHook=this.pointerHook.bind(this),this.contextInfo=null,this.detectedParent=null}getChildrenEntities(){return this.lastChildren.map(t=>t.entity)}pointerHook(t,a){try{for(let h of this.onGlobalClick)h(t,a)}catch(h){this.global.logger.error(h)}}bindEvents(){for(let t of[this.getAttachedRenderer()])t&&t.pointerEvents.on("down",this.pointerHook)}unbindEvents(){for(let t of[this.getAttachedRenderer()])t&&t.pointerEvents.off("down",this.pointerHook)}get key(){return this.callProps.key}set key(t){this.callProps.key=t}get children(){return this.callProps.children}set children(t){this.callProps.children=t}entity;onExport=()=>({});onEffect;onGlobalClick;onInit;onUnInit;onUnEffect;onEffectDeps;onPaint;onTick;fc;useStateCallIndex=0;useEffectCallIndex=0;useGlobalClickCallIndex=0;useDrawCallIndex=0;useStepCallIndex=0;useRefCallIndex=0;lastStateDeps;watchedDeps;lastDepStamps=[];getAttachedRenderer(){return this.getAttachedGame().mainRenderer}getAttachedGame(){return this.scene.getGame()}setMaxChildren(t){if(this.maxSafeChildren=Math.max(0,t),this.global.logger.debug(`Max children limit updated to ${t} for <${this.fc?.name||"anonymous"} key=${this.key}>`),this.lastChildren.length>this.maxSafeChildren){let a=this.lastChildren.length-this.maxSafeChildren;this.global.logger.warn(`Child limit exceeded (${this.lastChildren.length} > ${this.maxSafeChildren}) \u2014 removing ${a} oldest children <${this.fc?.name||"anonymous"} key=${this.key}>`);let h=this.lastChildren.slice(0,this.maxSafeChildren),c=this.lastChildren.slice(this.maxSafeChildren);this.lastChildren=h;for(let g of c)g.unuse()}}getMaxChildren(){return this.maxSafeChildren??1/0}getFiberChain(){let t=[],a=this.detectedParent;for(;a;)t.push(a),a=a?.detectedParent;return t}getContextChain(){return this.getFiberChain().map(t=>t.contextInfo).filter(Boolean)}findContextValueFromInst(t){return this.getContextChain().find(a=>a.instance===t)?.value}getEntityChain(){return this.getFiberChain().map(t=>t.entity)}shouldFullRefresh(){if(this.isFirstUse||!this.watchedDeps||this.watchedDeps.length===0)return!0;for(let t=0;t<this.watchedDeps.length;t++){let a=this.watchedDeps[t],h=this.lastDepStamps[t]??0;if(a.lastChanged>h)return!0}return!1}captureDepStamps(){this.watchedDeps&&(this.lastDepStamps=this.watchedDeps.map(t=>t.lastChanged))}refresh(){if(!this.shouldFullRefresh())return;let t=this.fc?.name||"anonymous";if(!this.shouldFullRefresh()){this.global.logger.debug(`Refresh skipped <${t} key=${this.key}>`);return}this.global.logger.debug(`Refresh executed <${t} key=${this.key}> reason=${this.isFirstUse?"first":"deps-changed"}`),this.lastChildren.length>this.maxSafeChildren&&this.global.logger.warn(`High child count <${t} key=${this.key}> children=${this.lastChildren.length}`);let a;this.global.save(),this.global.current=this,this.useStateCallIndex=0,this.useRefCallIndex=0;let h=[];try{let c=this.fc(this.callProps)??[];if(c&&!Array.isArray(c)&&(c=[c]),!Array.isArray(c))throw new Error("Non array or non undefined children received.");for(let g of c)if(g.type===this.fc)throw new Error("Circular Component.");h=c}catch(c){a=c}this.useStateCallIndex=0,this.useRefCallIndex=0,this.useDrawCallIndex=0,this.useStepCallIndex=0,this.useEffectCallIndex=0,this.useGlobalClickCallIndex=0,this.global.restore();try{let c=0,g=[];for(let w of h){let C=this.lastChildren.at(c)??new f(this.global,this.scene,w);this.lastChildren[c]=C,C.detectedParent=this,g.push(C),c++}this.captureDepStamps(),this.use();for(let w of this.lastChildren.filter(C=>!g.includes(C))){let C=this.lastChildren.indexOf(w);C!==1&&this.lastChildren.splice(C,1),w.unuse()}for(let w of this.lastChildren)try{w.refresh()}catch(C){console.error(C)}}catch(c){console.error(c)}if(a)throw a}lastChildren;isFirstUse=!0;use(){try{let t=!0;if(this.lastStateDeps??=[],Array.isArray(this.onEffectDeps)&&(t=this.onEffectDeps.some((a,h)=>{let c=this.lastStateDeps.at(h);if(c){let g=a.lastChanged,w=c.stamp;return g>w}})),t||this.isFirstUse){this.key??=this.fc.name+"_"+me(),this.global.logger.debug(`Using <${this.fc?.name||"anonymous"} key=${this.key}> count=${this.onEffect.length}`);let a=this.isFirstUse;this.isFirstUse=!1,Array.isArray(this.onEffectDeps)&&(this.lastStateDeps=this.onEffectDeps.map(c=>({stamp:c.lastChanged,stateRef:c}))),this.entity&&this.scene.getScene().removeEntity(this.entity),this.entity&&this.entity.name!==this.key&&(this.entity=null),this.entity=this.entity??new u(this,this.key);for(let c of this.refs)c.current===ge&&(c.current=this.entity);if(this.callProps.ref instanceof o&&(this.callProps.ref.current=this.entity),this.exports=this.onExport(),this.callProps.exportsRef instanceof o&&(this.callProps.exportsRef.current=this.exports),this.entity&&this.entity!==this.entity&&this.global.logger.warn(`Entity name mismatch during refresh <${this.fc?.name} key=${this.key}>`),this.scene.getScene().addEntity(this.entity),a&&this.onInit){this.bindEvents();try{let c=this.onInit();typeof c=="function"&&(this.onUnInit=c)}catch(c){throw this.global.logger.error("Initialization failed",this.fc?.name||"anonymous",c),c}}try{for(let c of this.onUnEffect??[])c()}catch(c){console.error(c)}let h=this.onEffect.map(c=>c()).filter(c=>c!==void 0);this.onUnEffect=h}}catch(t){throw this.global.logger.error(`use() failed <${this.fc?.name||"anonymous"} key=${this.key}>`,t),t}}unuse(){this.global.logger.debug(`unuse called <${this.fc?.name||"anonymous"} key=${this.key}> children=${this.lastChildren.length}`),this.watchedDeps=void 0,this.lastDepStamps=[],this.unbindEvents();try{this.onUnInit&&this.onUnInit();for(let t of this.onUnEffect)t()}catch(t){this.global.logger.error(`Cleanup failed in unuse <${this.fc?.name||"anonymous"} key=${this.key}>`,t)}this.scene.getScene().removeEntity(this.entity);for(let t of this.lastChildren)t.unuse();this.lastChildren.length=0}}b.KaylaFiber=f;class u extends B{#e;flags;getRawRect(){return A.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}getFiber(){return this.#e}constructor(t,a){super(a,0,0,0,0),this.#e=t,this.flags=new Map}setFlag(t,a){return this.flags.set(t,a)}getFlag(t){return this.flags.get(t)}removeFlag(t){return this.flags.delete(t)}update(t){let a=new i;if(this.#e&&this.#e.onTick)for(let h of this.#e.onTick)h(t,a);a.isPrevented()}draw(t){let a=new i;if(this.#e&&this.#e.onPaint)for(let h of this.#e.onPaint)h(t,a);a.isPrevented()||super.draw(t)}getRect(){return new l(this.getFiber())}}b.KaylaRectEntity=u;class l{#e;constructor(t){this.#e=t}getRaw(){return A.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}get entity(){return this.#e.entity??null}#t(){if(!this.#e)throw new Error("No fibers found.");if(!this.entity)throw new Error("The entity does NOT exist yet.")}isCollidingWith(t){return this.#t(),this.entity.isCollidingWith(t.entity)}get setFlag(){return this.#t(),this.entity.setFlag.bind(this.entity)}get getFlag(){return this.#t(),this.entity.getFlag.bind(this.entity)}get removeFlag(){return this.#t(),this.entity.removeFlag.bind(this.entity)}isHovered(){let t=this.getRaw(),a=this.#e.getAttachedRenderer().getMousePos(),h=A.createRawRect({x:a.x,y:a.y,width:3,height:3});return A.rawCollision(t,h)}get pos(){return this.#t(),this.entity.pos}get x(){return this.#t(),this.pos.x}set x(t){this.#t(),this.pos.x=t}get y(){return this.#t(),this.pos.y}set y(t){this.#t(),this.pos.y=t}get width(){return this.#t(),this.entity.width}set width(t){this.#t(),this.entity.width=t}get height(){return this.#t(),this.entity.height}set height(t){this.#t(),this.entity.height=t}get z(){return this.#t(),this.entity.z}set z(t){this.#t(),this.entity.z=t}get left(){return this.#t(),this.entity.left}set left(t){this.#t(),this.entity.left=t}get right(){return this.#t(),this.entity.right}set right(t){this.#t(),this.entity.right=t}get top(){return this.#t(),this.entity.top}set top(t){this.#t(),this.entity.top=t}get bottom(){return this.#t(),this.entity.bottom}set bottom(t){this.#t(),this.entity.bottom=t}get toLocal(){return this.entity.toLocal.bind(this.entity)}get toWorld(){return this.entity.toWorld.bind(this.entity)}}b.KaylaInternalRect=l;class p{constructor(t){this.#t=t,this.#e=null,t.on("update",this.tickHandler.bind(this)),this.drawHandler=this.drawHandler.bind(this)}#e;#t;getFibers(){return this.getEntities().map(t=>t.getFiber())}getEntities(){return Array.from(this.getScene().entities.values())}getScene(){return this.#t}getGame(){return this.#e}drawHandler(t){return this.#t.handleDraw(t)}attachTo(t){t.addScene(this.#t),this.#e=t}async spawn(t){let a=this.createFiber(t);await this.#e.delay(0),a.refresh()}createFiber(t){return new f(b.singleGlobalInstance,this,t)}detach(){this.#e&&this.#e.removeScene(this.#t)}tickHandler(){}}b.KaylaScene=p,b.singleGlobalInstance=new b.GlobalKayla})(D||={});var re=class{#e;constructor(e){this.Provider=this.#t.bind(this),this.#e=e}get defaultValue(){return this.#e}#t({value:e=this.defaultValue,children:n}){let i=Ge();return ie(()=>{i.contextInfo={instance:this,value:e}}),oe(this.Provider,()=>({value:e})),n}Provider;Consumer};function it(r){return new re(r)}var m=D.singleGlobalInstance,st=m.useState.bind(m),ye=m.useRef.bind(m),at=m.useShouldRefresh.bind(m),be=m.useEffect.bind(m),De=m.useGlobalClick.bind(m),ot=m.useClick.bind(m),ie=m.useInitialization.bind(m),se=m.useRect.bind(m),ut=m.useTick.bind(m),ae=m.usePaint.bind(m),oe=m.useExports.bind(m),L=m.useSelf.bind(m),xe=m.useFiberControl.bind(m),Ge=m.useFiber.bind(m),lt=m.useEntity.bind(m),ht=m.useCurrentGame.bind(m),ct=m.useCurrentRenderer.bind(m),dt=m.useCurrentScene.bind(m),ft=m.useCurrentTicker.bind(m),pt=m.useContext.bind(m),ge=Symbol("self_ref");var we=r=>{Promise.resolve(1).then(()=>{try{r()}catch(e){console.error(e)}})},mt=({children:r})=>Array.isArray(r)?[...r]:r;function yt(r){return D.createReassignableRef(r)}function gt(r){if(typeof r!="object"||typeof r=="function"||r===null)return r;let e={current:r};return new Proxy({},{get(i,s,o){return s==="reassignSelf"?d=>{e.current=d}:Reflect.get(e.current,s,o)},set(i,s,o,d){return Reflect.set(e.current,s,o,d)},has(i,s){return Reflect.has(e.current,s)},ownKeys(i){return Reflect.ownKeys(e.current)},getOwnPropertyDescriptor(i,s){return Reflect.getOwnPropertyDescriptor(e.current,s)},deleteProperty(i,s){return Reflect.deleteProperty(e.current,s)}})}function bt(r){m.logLevel=r}function xt(r){let e=r.name||"anonymous-custom-hook";return function(i){let s=m.current;if(!s)throw new Error(`Custom hook '${e}' must be called inside a Kayla component`);let o=i??{};return r.memoize!==!1?L(()=>(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' initialized (memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))):(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' running (non-memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))}}Reflect.set(globalThis,"Kayla",U);var wt;(n=>(n.Flex=({align:i="stretch",children:s,direction:o="row",gap:d=0,justify:f="start",wrap:u="nowrap",getHeight:l,getWidth:p,getCenterX:y,getCenterY:b,color:x})=>{let t=xe(),a=se(),h=L(()=>({recalc(){let c=Number(d)||0,g=y(),w=b(),C=p(),Ve=l();a.x=g,a.y=w,a.width=C,a.height=Ve;let He=t.getChildrenEntities().filter(Boolean).map(v=>v.getRect()).filter(v=>v.getFlag("flex-ignored")!==!0),S=o==="row",F=S?a.width:a.height,Rt=S?a.height:a.width,ue=0,N=0,le=[],Y=[];He.forEach(v=>{let j=S?v.width:v.height;ue+j>F&&u==="wrap"?(le.push({height:N,items:Y}),Y=[v],ue=j,N=S?v.height:v.width):(Y.push(v),ue+=j+c,N=Math.max(N,S?v.height:v.width))}),le.push({height:N,items:Y});let he=0;le.forEach((v,j)=>{let I=v.items,_=I.reduce((R,Q)=>R+(S?Q.width:Q.height),0)+c*(I.length-1),T=0;f==="center"&&(T=(F-_)/2),f==="end"&&(T=F-_),f==="space-between"&&(T=0),f==="space-around"&&(T=(F-_)/(I.length*2)),f==="space-evenly"&&(T=(F-_)/(I.length+1)),I.forEach((R,Q)=>{R.z=a.z+1;let G=S?R.width:R.height,J=S?R.height:R.width,Z=0;i==="center"&&(Z=(v.height-J)/2),i==="end"&&(Z=v.height-J),i==="stretch"&&(S?R.height=v.height:R.width=v.height),S?(R.x=T+G/2,R.y=he+Z+J/2):(R.x=he+Z+J/2,R.y=T+G/2),f==="space-between"&&Q<I.length-1?T+=G+c+(F-_)/(I.length-1):f==="space-around"?T+=G+c+(F-_)/I.length:f==="space-evenly"?T+=G+c+(F-_)/(I.length+1):T+=G+c}),he+=v.height+c})}}));return ae((c,g)=>{g.preventDefault(),c.fillStyle=x,c.fillRect(a.left,a.top,a.width,a.height)}),be(()=>{we(()=>{h.recalc()})}),oe(n.Flex,()=>({controls:h})),s},n.GenericBox=({color:i,width:s=20,height:o=20,x:d=0,y:f=0})=>{let u=se();ie(()=>{u.width=s,u.height=o,u.x=d,u.y=f}),ae((l,p)=>{p.preventDefault(),l.fillStyle=i,l.fillRect(u.left,u.top,u.width,u.height)})}))(wt||={});var vt={LEA:$,Kayla:U};0&&(module.exports={Kayla,LEA});
|
|
5
|
+
\u2192 Then: value.get() / value.set(v) / value.add(n)`)}refreshBased(){return[this.set.bind(this),this.get()]}add(t,{recall:a}={}){this.set(this.get()+t,{recall:a})}multiply(t,{recall:a}={}){this.set(this.get()*t,{recall:a})}set(t,{recall:a=!1}={}){let l=this.#e;if(t===l)return;this.#e=t;let y=Date.now()-this.#n;a&&y<67&&this.#t.global.logger.warn(`Hot structural state change <${this.#t.fc?.name||"anonymous"}> delta=${y}ms`),(a||this.alwaysRecall)&&this.#t.refresh(),this.#n=Date.now()}get value(){return this.#e}get lastChanged(){return this.#n}}g.KaylaInternalState=s;class o{#e;constructor(t){this.#e=t??void 0}#t;setSetter(t){this.#t=t}get current(){return this.#e}set current(t){this.#e=t,this.#t&&this.#t(this.#e)}}g.KaylaInternalRef=o;function c(x){return new o(x)}g.createReassignableRef=c;class d{state;refs;global;callProps;scene;exports;detectedParent;contextInfo;get childrenCount(){return this.lastChildren.length}maxSafeChildren;dynamicChildren;constructor(t,a,l){if(!l)throw new Error("Empty element");this.maxSafeChildren=40,this.scene=a,this.state=[],this.refs=[],this.onInits=[],this.onUnInits=[],this.fc=l.type,this.callProps=l.props??{},this.global=t,this.lastStateDeps=[],this.entity=null,this.lastChildren=[],this.onEffect=[],this.onUnEffect=[],this.onPaint=[],this.onTick=[],this.onGlobalClick=[],this.pointerHook=this.pointerHook.bind(this),this.resizeHook=this.resizeHook.bind(this),this.contextInfo=null,this.detectedParent=null,this.dynamicChildren=[],this.key??=this.fc.name+"_"+ie(),this.onViewportEffect=[]}getChildrenEntities(){return this.lastChildren.map(t=>t.entity)}pointerHook(t,a){try{for(let l of this.onGlobalClick)l(t,a)}catch(l){this.global.logger.error(l)}}resizeHook({width:t,height:a}){try{for(let l of this.onViewportEffect)l(this.getAttachedRenderer(),t,a)}catch(l){this.global.logger.error(l)}}bindEvents(){for(let t of[this.getAttachedRenderer()])t&&(t.pointerEvents.on("down",this.pointerHook),t.on("viewport_update",this.resizeHook))}unbindEvents(){for(let t of[this.getAttachedRenderer()])t&&(t.pointerEvents.off("down",this.pointerHook),t.off("viewport_update",this.resizeHook))}get key(){return this.callProps.key}set key(t){this.callProps.key=t}get children(){return this.callProps.children}set children(t){this.callProps.children=t}entity;onExport=()=>({});onEffect;onViewportEffect;onGlobalClick;onInits;onUnInits;onUnEffect;onEffectDeps;onPaint;onTick;fc;useStateCallIndex=0;useEffectCallIndex=0;useGlobalClickCallIndex=0;useDrawCallIndex=0;useStepCallIndex=0;useRefCallIndex=0;useInitCallIndex=0;useViewCallIndex=0;lastStateDeps;watchedDeps;lastDepStamps=[];getAttachedRenderer(){return this.getAttachedGame().mainRenderer}getAttachedGame(){return this.scene.getGame()}setMaxChildren(t){if(this.maxSafeChildren=Math.max(0,t),this.global.logger.debug(`Max children limit updated to ${t} for <${this.fc?.name||"anonymous"} key=${this.key}>`),this.lastChildren.length>this.maxSafeChildren){let a=this.lastChildren.length-this.maxSafeChildren;this.global.logger.warn(`Child limit exceeded (${this.lastChildren.length} > ${this.maxSafeChildren}) \u2014 removing ${a} oldest children <${this.fc?.name||"anonymous"} key=${this.key}>`);let l=this.lastChildren.slice(0,this.maxSafeChildren),p=this.lastChildren.slice(this.maxSafeChildren);this.lastChildren=l;for(let y of p)y.unuse()}}getMaxChildren(){return this.maxSafeChildren??1/0}getFiberChain(){let t=[],a=this.detectedParent;for(;a;)t.push(a),a=a?.detectedParent;return t}getContextChain(){return this.getFiberChain().map(t=>t.contextInfo).filter(Boolean)}findContextValueFromInst(t){return this.getContextChain().find(a=>a.instance===t)?.value}getEntityChain(){return this.getFiberChain().map(t=>t.entity)}shouldFullRefresh(){if(this.isFirstUse||!this.watchedDeps||this.watchedDeps.length===0)return!0;for(let t=0;t<this.watchedDeps.length;t++){let a=this.watchedDeps[t],l=this.lastDepStamps[t]??0;if(a.lastChanged>l)return!0}return!1}captureDepStamps(){this.watchedDeps&&(this.lastDepStamps=this.watchedDeps.map(t=>t.lastChanged))}refresh(){if(!this.shouldFullRefresh())return;let t=this.fc?.name||"anonymous";if(!this.shouldFullRefresh()){this.global.logger.debug(`Refresh skipped <${t} key=${this.key}>`);return}this.global.logger.debug(`Refresh executed <${t} key=${this.key}> reason=${this.isFirstUse?"first":"deps-changed"}`),this.lastChildren.length>this.maxSafeChildren&&this.global.logger.warn(`High child count <${t} key=${this.key}> children=${this.lastChildren.length}`);let a;this.global.save(),this.global.current=this,this.useStateCallIndex=0,this.useRefCallIndex=0,this.useInitCallIndex=0,this.useViewCallIndex=0,this.useStateCallIndex=0,this.useDrawCallIndex=0,this.useStepCallIndex=0,this.useEffectCallIndex=0,this.useGlobalClickCallIndex=0;let l=[];try{let p=this.fc(this.callProps)??[];if(p&&!Array.isArray(p)&&(p=[p]),!Array.isArray(p))throw new Error("Non array or non undefined children received.");for(let y of p)if(y.type===this.fc)throw new Error("Circular Component.");l=p}catch(p){a=p}if(this.global.restore(),this.updateChildren(l,!0),a)throw a}updateChildren(t,a){try{let l=[...t,...this.dynamicChildren],p=[],y=[];for(let w of l){let k=w.props?.key,F;k!=null&&(F=this.lastChildren.find(Ce=>Ce.key===k)),F||(F=new d(this.global,this.scene,w)),F.detectedParent=this,y.push(F),p.push(F)}for(let w of this.lastChildren)p.includes(w)||w.unuse();this.lastChildren=y,this.captureDepStamps(),this.use();for(let w of this.lastChildren)try{w.refresh()}catch(k){console.error(k)}}catch(l){console.error(l)}}lastChildren;isFirstUse=!0;use(){try{let t=!0;if(this.lastStateDeps??=[],Array.isArray(this.onEffectDeps)&&(t=this.onEffectDeps.some((a,l)=>{let p=this.lastStateDeps.at(l);if(p){let y=a.lastChanged,w=p.stamp;return y>w}})),t||this.isFirstUse){this.global.logger.debug(`Using <${this.fc?.name||"anonymous"} key=${this.key}> count=${this.onEffect.length}`);let a=this.isFirstUse;this.isFirstUse=!1,Array.isArray(this.onEffectDeps)&&(this.lastStateDeps=this.onEffectDeps.map(p=>({stamp:p.lastChanged,stateRef:p}))),this.entity&&this.scene.getScene().removeEntity(this.entity),this.entity&&this.entity.name!==this.key&&(this.entity=null),this.entity=this.entity??new u(this,this.key);for(let p of this.refs)p.current===ge&&(p.current=this.entity);if(this.callProps.ref instanceof o&&(this.callProps.ref.current=this.entity),this.exports=this.onExport(),this.callProps.exportsRef instanceof o&&(this.callProps.exportsRef.current=this.exports),this.entity&&this.entity!==this.entity&&this.global.logger.warn(`Entity name mismatch during refresh <${this.fc?.name} key=${this.key}>`),this.scene.getScene().addEntity(this.entity),a){this.onUnInits=[];for(let p of this.onInits){this.bindEvents();try{let y=p();typeof y=="function"&&this.onUnInits.push(y)}catch(y){throw this.global.logger.error("Initialization failed",this.fc?.name||"anonymous",y),y}}}try{for(let p of this.onUnEffect??[])p()}catch(p){console.error(p)}let l=this.onEffect.map(p=>p()).filter(p=>p!==void 0);this.onUnEffect=l}}catch(t){throw this.global.logger.error(`use() failed <${this.fc?.name||"anonymous"} key=${this.key}>`,t),t}}unuse(){this.global.logger.debug(`unuse called <${this.fc?.name||"anonymous"} key=${this.key}> children=${this.lastChildren.length}`),this.detectedParent=null,this.watchedDeps=void 0,this.lastDepStamps=[],this.unbindEvents();try{for(let t of this.onUnInits)t();for(let t of this.onUnEffect)t()}catch(t){this.global.logger.error(`Cleanup failed in unuse <${this.fc?.name||"anonymous"} key=${this.key}>`,t)}this.scene.getScene().removeEntity(this.entity);for(let t of this.lastChildren)t.unuse();this.lastChildren.length=0}}g.KaylaFiber=d;class u extends W{#e;flags;getRawRect(){return _.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}getFiber(){return this.#e}constructor(t,a){super(a,0,0,0,0),this.#e=t,this.flags=new Map,this.color="transparent"}setFlag(t,a){return this.flags.set(t,a)}getFlag(t){return this.flags.get(t)}removeFlag(t){return this.flags.delete(t)}update(t){let a=new i;if(this.#e&&this.#e.onTick)for(let l of this.#e.onTick)l(t,a);a.isPrevented()}draw(t){let a=new i;if(this.#e&&this.#e.onPaint)for(let l of this.#e.onPaint)l(t,a);a.isPrevented()||super.draw(t)}getRect(){return new h(this.getFiber())}}g.KaylaRectEntity=u;class h{#e;constructor(t){this.#e=t}get color(){return this.#t(),this.entity.color}set color(t){this.#t(),this.entity.color=t}getRaw(){return _.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}get entity(){return this.#e.entity??null}#t(){if(!this.#e)throw new Error("No fibers found.");if(!this.entity)throw new Error("The entity does NOT exist yet.")}isCollidingWith(t){return this.#t(),this.entity.isCollidingWith(t.entity)}get setFlag(){return this.#t(),this.entity.setFlag.bind(this.entity)}get getFlag(){return this.#t(),this.entity.getFlag.bind(this.entity)}get removeFlag(){return this.#t(),this.entity.removeFlag.bind(this.entity)}isHovered(){let t=this.getRaw(),a=this.#e.getAttachedRenderer().getMousePos(),l=_.createRawRect({x:a.x,y:a.y,width:3,height:3});return _.rawCollision(t,l)}get pos(){return this.#t(),this.entity.pos}get x(){return this.#t(),this.pos.x}set x(t){this.#t(),this.pos.x=t}get y(){return this.#t(),this.pos.y}set y(t){this.#t(),this.pos.y=t}get width(){return this.#t(),this.entity.width}set width(t){this.#t(),this.entity.width=t}get height(){return this.#t(),this.entity.height}set height(t){this.#t(),this.entity.height=t}get z(){return this.#t(),this.entity.z}set z(t){this.#t(),this.entity.z=t}get left(){return this.#t(),this.entity.left}set left(t){this.#t(),this.entity.left=t}get right(){return this.#t(),this.entity.right}set right(t){this.#t(),this.entity.right=t}get top(){return this.#t(),this.entity.top}set top(t){this.#t(),this.entity.top=t}get bottom(){return this.#t(),this.entity.bottom}set bottom(t){this.#t(),this.entity.bottom=t}get toLocal(){return this.entity.toLocal.bind(this.entity)}get toWorld(){return this.entity.toWorld.bind(this.entity)}}g.KaylaInternalRect=h;class f{constructor(t){this.#t=t,this.#e=null,t.on("update",this.tickHandler.bind(this)),this.drawHandler=this.drawHandler.bind(this)}#e;#t;getFibers(){return this.getEntities().map(t=>t.getFiber())}getEntities(){return Array.from(this.getScene().entities.values())}getScene(){return this.#t}getGame(){return this.#e}drawHandler(t){return this.#t.handleDraw(t)}attachTo(t){t.addScene(this.#t),this.#e=t}async spawn(t){let a=this.createFiber(t);await this.#e.delay(0),a.refresh()}createFiber(t){return new d(g.singleGlobalInstance,this,t)}detach(){this.#e&&this.#e.removeScene(this.#t)}tickHandler(){}}g.KaylaScene=f,g.singleGlobalInstance=new g.GlobalKayla})(D||={});var se=class{#e;constructor(e){this.Provider=this.#t.bind(this),this.#e=e}get defaultValue(){return this.#e}#t({value:e=this.defaultValue,children:n}){let i=He();return ae(()=>{i.contextInfo={instance:this,value:e}}),le(this.Provider,()=>({value:e})),n}Provider;Consumer};function st(r){return new se(r)}var m=D.singleGlobalInstance,at=m.useState.bind(m),be=m.useRef.bind(m),ot=m.useShouldRefresh.bind(m),xe=m.useEffect.bind(m),ut=m.useViewportEffect.bind(m),Ge=m.useGlobalClick.bind(m),lt=m.useClick.bind(m),ae=m.useInitialization.bind(m),oe=m.useRect.bind(m),ht=m.useTick.bind(m),ue=m.usePaint.bind(m),le=m.useExports.bind(m),V=m.useSelf.bind(m),we=m.useFiberControl.bind(m),He=m.useFiber.bind(m),ct=m.useEntity.bind(m),dt=m.useCurrentGame.bind(m),pt=m.useCurrentRenderer.bind(m),ft=m.useCurrentScene.bind(m),mt=m.useCurrentTicker.bind(m),yt=m.useContext.bind(m),ge=Symbol("self_ref");var ve=r=>{Promise.resolve(1).then(()=>{try{r()}catch(e){console.error(e)}})},bt=({children:r})=>Array.isArray(r)?[...r]:r;function gt(r){return D.createReassignableRef(r)}function xt(r){if(typeof r!="object"||typeof r=="function"||r===null)return r;let e={current:r};return new Proxy({},{get(i,s,o){return s==="reassignSelf"?c=>{e.current=c}:Reflect.get(e.current,s,o)},set(i,s,o,c){return Reflect.set(e.current,s,o,c)},has(i,s){return Reflect.has(e.current,s)},ownKeys(i){return Reflect.ownKeys(e.current)},getOwnPropertyDescriptor(i,s){return Reflect.getOwnPropertyDescriptor(e.current,s)},deleteProperty(i,s){return Reflect.deleteProperty(e.current,s)}})}function wt(r){m.logLevel=r}function vt(r){let e=r.name||"anonymous-custom-hook";return function(i){let s=m.current;if(!s)throw new Error(`Custom hook '${e}' must be called inside a Kayla component`);let o=i??{};return r.memoize!==!1?V(()=>(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' initialized (memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))):(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' running (non-memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))}}Reflect.set(globalThis,"Kayla",N);var Ct;(n=>(n.Flex=({align:i="stretch",children:s,direction:o="row",gap:c=0,justify:d="start",wrap:u="nowrap",getHeight:h,getWidth:f,getCenterX:b,getCenterY:g,color:x})=>{let t=we(),a=oe(),l=V(()=>({recalc(){let p=Number(c)||0,y=b(),w=g(),k=f(),F=h();a.x=y,a.y=w,a.width=k,a.height=F;let ze=t.getChildrenEntities().filter(Boolean).map(v=>v.getRect()).filter(v=>v.getFlag("flex-ignored")!==!0),S=o==="row",P=S?a.width:a.height,kt=S?a.height:a.width,he=0,O=0,ce=[],j=[];ze.forEach(v=>{let Q=S?v.width:v.height;he+Q>P&&u==="wrap"?(ce.push({height:O,items:j}),j=[v],he=Q,O=S?v.height:v.width):(j.push(v),he+=Q+p,O=Math.max(O,S?v.height:v.width))}),ce.push({height:O,items:j});let de=0;ce.forEach((v,Q)=>{let I=v.items,L=I.reduce((E,J)=>E+(S?J.width:J.height),0)+p*(I.length-1),K=0;d==="center"&&(K=(P-L)/2),d==="end"&&(K=P-L),d==="space-between"&&(K=0),d==="space-around"&&(K=(P-L)/(I.length*2)),d==="space-evenly"&&(K=(P-L)/(I.length+1)),I.forEach((E,J)=>{E.z=a.z+1;let G=S?E.width:E.height,Z=S?E.height:E.width,ee=0;i==="center"&&(ee=(v.height-Z)/2),i==="end"&&(ee=v.height-Z),i==="stretch"&&(S?E.height=v.height:E.width=v.height),S?(E.x=K+G/2,E.y=de+ee+Z/2):(E.x=de+ee+Z/2,E.y=K+G/2),d==="space-between"&&J<I.length-1?K+=G+p+(P-L)/(I.length-1):d==="space-around"?K+=G+p+(P-L)/I.length:d==="space-evenly"?K+=G+p+(P-L)/(I.length+1):K+=G+p}),de+=v.height+p})}}));return ue((p,y)=>{y.preventDefault(),p.fillStyle=x,p.fillRect(a.left,a.top,a.width,a.height)}),xe(()=>{ve(()=>{l.recalc()})}),le(n.Flex,()=>({controls:l})),s},n.GenericBox=({color:i,width:s=20,height:o=20,x:c=0,y:d=0})=>{let u=oe();ae(()=>{u.width=s,u.height=o,u.x=c,u.y=d}),ue((h,f)=>{f.preventDefault(),h.fillStyle=i,h.fillRect(u.left,u.top,u.width,u.height)})}))(Ct||={});var Et={LEA:$,Kayla:N};0&&(module.exports={Kayla,LEA});
|
package/dist/index.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { L as LEA } from './lea-
|
|
2
|
-
import { K as Kayla } from './kayla-internals-
|
|
1
|
+
import { L as LEA } from './lea-B1DIEiLR.cjs';
|
|
2
|
+
import { K as Kayla } from './kayla-internals-vuPhjkRg.cjs';
|
|
3
3
|
|
|
4
4
|
declare const _default: {
|
|
5
5
|
LEA: typeof LEA;
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var He=Object.defineProperty;var xe=(r,e)=>{for(var n in e)He(r,n,{get:e[n],enumerable:!0})};var B={};xe(B,{DeltaTweenII:()=>te,ENVIRONMENT:()=>de,GEmitterMemory:()=>ce,LeaEntityII:()=>H,LeaEventEmitter:()=>K,LeaGameII:()=>O,LeaRendererII:()=>U,LeaSceneII:()=>N,LeaSerializers:()=>we,LeaTickerII:()=>ee,LeaTimeout:()=>ne,LeaUtilsII:()=>k,LiaAudio:()=>z,LiaAudioSrc:()=>V,LiaOscSFX:()=>M,LiaSFXMap:()=>Xe,NOTE_NAMES:()=>Ee,RectLeaEntity:()=>X,Vector2:()=>P,colToRGBA:()=>$e,defaultSFXConfig:()=>Re,editRGBA:()=>Ue,generateUUID:()=>Fe,getAvoidAngle:()=>Ae,getEnvironment:()=>Ce,getNormalizedColor:()=>ze,getRayHit:()=>Me,isInitiallyMobile:()=>We,isMobile:()=>_e,isNode:()=>q,isNote:()=>Oe,isWeb:()=>E,parseFillStyle:()=>ve,raycastAvoid:()=>Be,scaleCoord:()=>Ne,setAnimInterval:()=>Pe,sfxHit:()=>Ie,sfxJump:()=>Ke,sfxLaser:()=>Se,sfxUIClick:()=>ke,sfxUIHover:()=>Te,shortUID:()=>qe,tinyUID:()=>fe});var K=class{#e=new Map;constructor(){this.#e=new Map}on(e,n){let i=this.#e.get(e)||[];return i.push(n),this.#e.set(e,i),this}once(e,n){let i=(...s)=>{this.off(e,i),n(...s)};return this.on(e,i),this}off(e,n){let i=this.#e.get(e);if(!i)return this;let s=i.indexOf(n);return s>=0&&i.splice(s,1),this}emit(e,...n){let i=this.#e.get(e);if(!i||i.length===0){if(e==="error")throw n[0];return!1}return i.slice().forEach(s=>s(...n)),!0}removeAllListeners(e){return e?this.#e.delete(e):this.#e.clear(),this}listenerCount(e){return this.#e.get(e)?.length??0}},U=class extends K{canvas;ctx;running;_rafId;_fps;_frameCount;_fpsTimer;_lastFrameTime;constructor(e,{viewportWidth:n,viewportHeight:i,cameraWidth:s,cameraHeight:o}={}){if(!E)throw new Error("Web-Only");super(),this.canvas=e,this.ctx=e.getContext("2d"),this.automatic=!0,this.#e=n??e.width,this.#t=i??e.height,this.#n=s??e.width,this.#r=o??e.height,this.running=!1,this._rafId=null,this._loop=this._loop.bind(this),this.updateCanvasResolution(),this._fps=60,this._frameCount=0,this._fpsTimer=0}automatic;retransform(){this.ctx.setTransform(1,0,0,1,0,0);let e=this.#n/this.#e,n=this.#r/this.#t;this.ctx.translate(this.#n/2,this.#r/2),this.ctx.scale(e,n),this.ctx.translate(-this.#e/2,-this.#t/2)}#e=0;#t=0;#n=0;#r=0;get viewportWidth(){return this.#e}set viewportWidth(e){this.#e=e,this.retransform()}get width(){return this.#e}get height(){return this.#t}get centerX(){return this.#e/2}get centerY(){return this.#t/2}get left(){return 0}get top(){return 0}get right(){return this.#e}get bottom(){return this.#t}get viewportHeight(){return this.#t}set viewportHeight(e){this.#t=e,this.retransform()}get cameraWidth(){return this.#n}set cameraWidth(e){this.#n=e,this.updateCanvasResolution(),this.retransform()}get cameraHeight(){return this.#r}set cameraHeight(e){this.#r=e,this.updateCanvasResolution(),this.retransform()}updateCanvasResolution(){this.canvas.width=this.#n,this.canvas.height=this.#r}applyTransform(){this.retransform()}get FPS(){return this._fps}_loop(){this.automatic&&this.update(),this._rafId=requestAnimationFrame(this._loop)}update(){if(!this.running||!E)return;let e=performance.now(),n=(e-(this._lastFrameTime??e))/1e3;this._lastFrameTime=e,this._frameCount++,this._fpsTimer+=n,this._fpsTimer>=1&&(this._fps=Math.round(this._frameCount/this._fpsTimer),this._frameCount=0,this._fpsTimer=0),this.ctx.clearRect(0,0,this.#n,this.#r),this.emit("draw",this.ctx)}start(){if(!this.running){if(!E||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!0,this._rafId=requestAnimationFrame(this._loop)}}stop(){if(!E||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!1,this._rafId!==null&&(cancelAnimationFrame(this._rafId),this._rafId=null)}},ee=class extends K{setNow(e){this.#e=e}#e=0;__intervalId=null;__lastTime=0;constructor(e=16){super(),this.#t=e,this.speedHackDT=1}speedHackDT;get isRaf(){return this.tickInterval===1/0}#t=15;get tickInterval(){return this.#t}set tickInterval(e){this.#t=e,this.__intervalId&&(this.stop(),this.start())}now(){return this.#e}__tick(){let e=performance.now(),n=(e-this.__lastTime)/1e3*this.speedHackDT;this.__lastTime=e,!(E&&typeof this.__intervalId=="function"&&document.hidden)&&(this.#e+=n*1e3,this.emit("tick",n))}createTimeout(e){return new ne(e,this)}createTween(e,n=()=>{}){let i=new te(e),s=(o=0)=>{if(i.finished){this.off("tick",s);return}i.update(o)};return i.on("finish",()=>{this.off("tick",s)}),i.on("delta",o=>{n(o)}),this.on("tick",s),i}start(){this.__intervalId===null&&(this.__lastTime=performance.now(),this.__intervalId=E&&!isFinite(this.tickInterval)?Pe(()=>this.__tick()).clear:setInterval(()=>this.__tick(),this.tickInterval))}stop(){this.__intervalId!==null&&(typeof this.__intervalId=="function"?this.__intervalId():clearInterval(this.__intervalId)),this.__intervalId=null}getSineMod(e,n=0){return .5+.5*Math.sin((this.now()%e/e+n)*2*Math.PI)}},we;(t=>{function r(a){return a===!0?1:0}t.booleanExport=r;function e(a){return a===0?!1:a===1}t.booleanImport=e;function n(a){return`${a.x}|${a.y}`}t.vec2Export=n;function i(a){let[h,c]=a.split("|"),g=parseFloat(h),w=parseFloat(c);if(isNaN(g)||isNaN(w))throw new Error(`Invalid Vector2 string: ${a}`);return new P(g,w)}t.vec2Import=i,t.booleanMap={mapExport:r,mapImport:e};function o(a){return h=>Number(h.toFixed(a))}t.createRounder=o;function d(a=10){return{mapExport(h){return Math.round(h/a)},mapImport(h){return h*a}}}t.createLowPrecision=d;function f(a){return Math.round(a)}t.lightWeightRounder=f;function u(a=100){return{mapExport(h){return Math.round(h*a)},mapImport(h){return h/a}}}t.createPercent=u;function l(a){let h=new Map(Object.entries(a));return{mapExport:c=>h.get(c)??null,mapImport:c=>Array.from(h.entries()).find(([g,w])=>w===c)?.[0]??null}}t.createLookup=l;function p(a){let h=a*(180/Math.PI);return Math.round((h%360+360)%360)}t.radToDeg=p;function y(a){return a*(Math.PI/180)}t.degToRad=y,t.angleRadToDeg={mapExport:p,mapImport:y};function x(a=10){let h=d(a);return{mapExport(c){return h.mapExport(p(c))},mapImport(c){return h.mapImport(y(c))}}}t.createLowPrecisionRadToDeg=x})(we||={});var H=class r extends K{name="";scaleRotate=0;scale=1;constructor(e,n=0,i=0){super(),this.autoTranslate=!1,this.name=e,this.z=0,this.___pos=new P(n,i),this.nonSerializableProperties=[],this.nonSerializableProperties.push("___pos","autoTranslate","arraySerializeMap"),this.forceSerializableProperties=[],this.forceSerializableProperties.push("x","y")}arraySerializeMap;autoTranslate;z;___pos;nonSerializableProperties;forceSerializableProperties;get pos(){return this.___pos}get x(){return this.pos.x}get y(){return this.pos.y}set x(e){this.pos.x=e}set y(e){this.pos.y=e}handleUpdate(e){if(this.update)try{this.emit("update",e),this.update(e)}catch(n){this.emit("error",n)}}handleDraw(e){if(!(q||!this.draw)){e.save(),this.autoTranslate&&e.translate(this.x,this.y);try{this.emit("draw",e),this.draw(e)}catch(n){this.emit("error",n)}e.restore()}}serialize(){if(Array.isArray(this.arraySerializeMap))return this.arraySerializeMap.map(([s,{mapExport:o}])=>{let d=Reflect.get(this,s);return o?o(d):d});let e=["_events","_eventsCount","_maxListeners","nonSerializableProperties","forceSerializableProperties"],n=[...Reflect.ownKeys(this),...this.forceSerializableProperties].filter(s=>!this.nonSerializableProperties.includes(s)&&!e.includes(s.toString())),i=Object.fromEntries(n.map(s=>{let o=Reflect.get(this,s);if(q&&typeof o=="number"){let d=o.toString().split("."),u=(d[1]?d[1].length:0)>2?Number(o.toFixed(2)):o;return[s,u]}return[s,o]}));return JSON.parse(JSON.stringify(i))}toLocal(e){return e.subtract(this.pos)}toWorld(e){return e.add(this.pos)}deserializeArray(e){return r.deserializeArray(this.arraySerializeMap,e)}static deserializeArray(e,n){if(!e||!Array.isArray(n))return n;let i={};for(let s=0;s<n.length;s++){let o=e[s];if(!o)break;let[d,{mapImport:f}]=o,u=n[s];if(f&&(u=f(u)),typeof d!="string")break;try{Reflect.set(i,d,u)}catch(l){console.error(l)}}return i}},N=class extends K{name="";entities=new Map;paused=!0;constructor(e){super(),this.name=e}handleUpdate(e){if(!this.paused){this.emit("update",e);for(let n of this.entities.values())n.handleUpdate(e)}}handleDraw(e){if(!q&&!this.paused){this.emit("draw",e);for(let n of[...this.entities.values()].sort((i,s)=>i.z-s.z))n.handleDraw(e)}}addEntity(e){if(!(e instanceof H))throw new Error("invalid entity");if(!e.name)throw new Error("Entity must have a name.");this.entities.set(e.name,e)}removeEntity(e){if(!(e instanceof H))throw new Error("invalid entity");this.entities.delete(e.name)}getEntity(e){return this.entities.get(e)}},O=class{scenes;ticker;get centerX(){return this.width/2}get centerY(){return this.height/2}get left(){return 0}get top(){return 0}get right(){return this.width}get bottom(){return this.height}width;height;constructor(e,n,i=16){this.ticker=new ee(i),this.scenes=new Map,this.width=e,this.height=n,this.ticker.on("tick",s=>{for(let o of this.scenes.values())o.paused||o.handleUpdate(s)})}addScene(e){if(!e.name)throw new Error("Scene must have a name.");e.paused=!1,this.scenes.set(e.name,e)}removeScene(e){e&&(e.paused=!0),this.scenes.delete(e.name)}now(){return this.ticker.now()}start(){this.ticker.start()}stop(){this.ticker.stop()}},k={lerp(r,e,n){return r+(e-r)*n},clamp(r,e,n){return Math.min(n,Math.max(e,r))},clamp01(r){return Math.min(1,Math.max(0,r))},easeLinear(r){return r},easeInQuad(r){return r*r},easeOutQuad(r){return 1-(1-r)*(1-r)},easeInOutQuad(r){return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2},easeInSine(r){return 1-Math.cos(r*Math.PI/2)},easeOutSine(r){return Math.sin(r*Math.PI/2)},easeInOutSine(r){return-(Math.cos(Math.PI*r)-1)/2},easeInExpo(r){return r===0?0:Math.pow(2,10*r-10)},easeOutExpo(r){return r===1?1:1-Math.pow(2,-10*r)},easeInOutExpo(r){return r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2},smoothstep(r){return r=k.clamp(r,0,1),r*r*(3-2*r)},randomLerp(r,e){return k.lerp(r,e,Math.random())},randomInt(r,e){return Math.floor(Math.random()*(e-r+1))+r},randomArrayValue(r){return r[k.randomInt(0,r.length-1)]},createBezier(r,e,n,i){function s(f,u,l,p,y){let b=1-f;return b*b*b*u+3*b*b*f*l+3*b*f*f*p+f*f*f*y}function o(f,u,l,p,y){let b=1-f;return 3*b*b*(l-u)+6*b*f*(p-l)+3*f*f*(y-p)}function d(f){let u=f;for(let l=0;l<6;l++){let p=s(u,0,r,n,1),y=o(u,0,r,n,1);if(y===0)break;u-=(p-f)/y}return k.clamp(u,0,1)}return function(u){u=k.clamp(u,0,1);let l=d(u);return s(l,0,e,i,1)}},lengthSquared(...r){return r.reduce((e,n)=>e+n*n,0)},normalizeRad(r){let e=2*Math.PI;return r=r%e,r<0&&(r+=e),r},angleInvertY(r){return k.normalizeRad(-r)},degToRadFlipY(r){return k.angleInvertY(r*Math.PI/180)},minimalAngularDirection(r,e){r=k.normalizeRad(r),e=k.normalizeRad(e);let n=k.normalizeRad(e-r),i=k.normalizeRad(r-e);return n<=i?1:-1}},te=class extends K{constructor({delta:e,ms:n,easing:i}){super(),this.delta=e,this.duration=n,this.elapsed=0,this.easing=i??(s=>s),this.lastValue=0,this.finished=!1}delta;duration;elapsed;lastValue;finished;easing;update(e){this.elapsed+=e*1e3;let n=k.clamp(this.elapsed/this.duration,0,1),i=this.easing(n),s=this.delta*i,o=s-this.lastValue;this.lastValue=s,this.emit("delta",o),n>=1&&(this.finished=!0,this.emit("finish",void 0))}},X=class extends H{constructor(e,n=0,i=0,s=50,o=50){super(e,n,i),this.width=s,this.height=o}width;height;get left(){return this.x-this.width/2}set left(e){this.x=e+this.width/2}get right(){return this.x+this.width/2}set right(e){this.x=e-this.width/2}get top(){return this.y-this.height/2}set top(e){this.y=e+this.height/2}get bottom(){return this.y+this.height/2}set bottom(e){this.y=e-this.height/2}get lx(){return 0}get ly(){return 0}get lleft(){return-this.width/2}get lright(){return this.width/2}get ltop(){return-this.height/2}get lbottom(){return this.height/2}isCollidingWith(e){return!(this.right<e.left||this.left>e.right||this.bottom<e.top||this.top>e.bottom)}color="rgba(0, 0, 255, 0.3)";draw(e){e.translate(this.x,this.y),e.rotate(this.scaleRotate),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height)}},ne=class extends K{duration;ticker;elapsed;finished;_resolve;promise;_timeoutId;constructor(e,n=null){super(),this.duration=e,this.ticker=n,this.elapsed=0,this.finished=!1,this._resolve=null,this.promise=new Promise(i=>this._resolve=i),this.update=this.update.bind(this),this.ticker&&this.ticker.on("tick",this.update)}update(e=0){this.finished||(this.elapsed+=e*1e3,this.elapsed>=this.duration&&this.finish())}finish(){this.finished||(this.finished=!0,this.emit("finish",void 0),this._resolve&&this._resolve(),this.ticker&&this.ticker.off("tick",this.update))}start(){return this.ticker||(this._timeoutId=setTimeout(()=>this.finish(),this.duration)),this}cancel(){this.finished||(this.finished=!0,!this.ticker&&this._timeoutId!=null&&clearTimeout(this._timeoutId),this.ticker&&this.ticker.off("tick",this.update))}then(e,n){return this.promise.then(e,n)}after(e,n){return this.promise.then(e,n)}},P=class r{constructor(e=0,n=0){this.x=e,this.y=n}x;y;toJSON(){return{x:this.x,y:this.y,vec2:!0}}static isVec2(e){return e&&typeof e=="object"&&"x"in e&&"y"in e&&e.vec2===!0}static fromSerialized(e){return this.isVec2(e)?new this(e.x,e.y):null}rotate(e){let n=Math.cos(e),i=Math.sin(e);return new r(this.x*n-this.y*i,this.x*i+this.y*n)}static from(e){return new r(Math.cos(e),Math.sin(e))}isEmpty(){return Math.abs(this.x)<.01&&Math.abs(this.y)<.01}get angle(){return Math.atan2(this.y,this.x)}angleTo(e){return Math.atan2(e.y-this.y,e.x-this.x)}get length(){return Math.hypot(this.x,this.y)}get lengthSquared(){return this.x*this.x+this.y*this.y}normalized(){let e=this.length;return e===0?new r(0,0):new r(this.x/e,this.y/e)}consume(e){let n=this.length;n<=e?(this.x=0,this.y=0):this.overwite(this.scale((n-e)/n))}project(e){return e.scale(this.dotNormalized(e))}reflect(e){let n=this.dot(e);return this.subtract(e.scale(2*n))}dotNormalized(e){let n=this.normalized(),i=e.normalized();return n.x*i.x+n.y*i.y}lengthSquaredTo(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}dot(e){return this.x*e.x+this.y*e.y}distanceTo(e){return Math.hypot(this.x-e.x,this.y-e.y)}distanceToCheap(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}directionTo(e){return new r(e.x-this.x,e.y-this.y).normalized()}add(e){return new r(this.x+e.x,this.y+e.y)}addRaw(e){return new r(this.x+e,this.y+e)}overwite(e){this.x=e.x,this.y=e.y}subtract(e){return new r(this.x-e.x,this.y-e.y)}scale(e){return new r(this.x*e,this.y*e)}toString(){return`Vector2(${this.x}, ${this.y})`}clone(){return new r(this.x,this.y)}};function ze(r){let e=/^rgba?\(([^)]+)\)$/,n=r.match(e);if(n){let[i,s,o,d=1]=n[1].split(",").map(f=>parseFloat(f));return{r:Math.max(0,Math.min(255,Math.floor(i))),g:Math.max(0,Math.min(255,Math.floor(s))),b:Math.max(0,Math.min(255,Math.floor(o))),a:Math.max(0,Math.min(1,Math.floor(d*255)/255))}}return ve(r)}function $e(r){return`rgba(${r.r}, ${r.g}, ${r.b}, ${r.a})`}function ve(r){if(r=r.trim().toLowerCase(),r[0]==="#"){let n,i,s;if(r.length===7)n=parseInt(r.slice(1,3),16),i=parseInt(r.slice(3,5),16),s=parseInt(r.slice(5,7),16);else if(r.length===4)n=parseInt(r[1]+r[1],16),i=parseInt(r[2]+r[2],16),s=parseInt(r[3]+r[3],16);else throw new Error("Invalid hex color");return{r:n,g:i,b:s,a:1}}let e=r.match(/^rgba?\s*\(\s*(\d+)[, ]\s*(\d+)[, ]\s*(\d+)(?:[, ]\s*([\d.]+))?\s*\)$/);if(e)return{r:parseInt(e[1]),g:parseInt(e[2]),b:parseInt(e[3]),a:e[4]!==void 0?parseFloat(e[4]):1};throw new Error("Unsupported fillStyle format")}function Ue(r,{r:e,g:n,b:i,a:s}={}){let[o,d,f,u,l]=r.match(/rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*([\d.]*)\)?/)||[];return`rgba(${e??d}, ${n??f}, ${i??u}, ${s??(l||1)})`}function Ne(r,e,n){return n+(r-n)*e}function Ce(){return typeof process<"u"&&process.release?.name==="node"?"node":typeof window<"u"||typeof self<"u"?"web":"unknown"}var de=Ce(),q=de==="node",E=de==="web",z=class r{static unlock(){E&&this.audioCtx.state!=="running"&&this.audioCtx.resume()}static audioCtx=E?new AudioContext:null;static masterGain=E?this.audioCtx.createGain():null;static musicGain=E?this.audioCtx.createGain():null;static sfxGain=E?this.audioCtx.createGain():null;static{E&&(this.masterGain.gain.value=1,this.musicGain.gain.value=1,this.sfxGain.gain.value=1,this.sfxGain.connect(this.masterGain),this.musicGain.connect(this.masterGain),this.masterGain.connect(this.audioCtx.destination))}static get SFX_VOLUME(){return this.sfxGain.gain.value}static get MUSIC_VOLUME(){return this.musicGain.gain.value}static get VOLUME(){return this.masterGain.gain.value}static set SFX_VOLUME(e){this.sfxGain.gain.value=e}static set MUSIC_VOLUME(e){this.musicGain.gain.value=e}static set VOLUME(e){this.masterGain.gain.value=e}static noteToHz(e){return this.tuningFreq*Math.pow(2,(e-9)/12)}static tuningFreq=440;static audioBufferCache=new Map;static loops=new Map;static sfsx=new Map;static loopIdCounter=0;static CACHE_NAME="lia-audio-cache-v1";static async preLoad(e){if(this.audioBufferCache.has(e))return this.audioBufferCache.get(e);let n=r.CACHE_NAME,i,s;if(typeof caches<"u"&&(s=await caches.open(n),i=await s.match(e)),!i){if(i=await fetch(e),!i.ok)throw new Error(`Failed to fetch ${e}`);s&&await s.put(e,i.clone())}let o=await i.arrayBuffer(),d=await this.audioCtx.decodeAudioData(o);return this.audioBufferCache.set(e,d),d}static async getOnlyDownloadedCache(e){let n=r.CACHE_NAME;return await(await caches.open(n)).match(e)}static getCached(e){return this.audioBufferCache.get(e)||null}static async playSound(e,n=.2,i=1,s=!0){try{this.sfsx.has(e)&&this.sfsx.get(e).source.stop(),this.audioBufferCache.has(e)||await this.preLoad(e);let o=this.getCached(e);if(!o)return;let d=new V(o);d.buffer=o;let f=1-.12,u=1+.12;d.playbackRate=i??f+Math.random()*(u-f);let l=this.audioCtx.createGain();l.gain.value=n,d.tempGain=l,d.connect(l),l.connect(this.sfxGain),d.onended=()=>{d.disconnect(),l.disconnect()},d.start(),s&&this.sfsx.set(e,{source:d,gain:l})}catch(o){console.error(o)}}static async playLoop(e,n=1,{loopStart:i=0,loopEnd:s=null,exclusive:o=!0,skipMS:d=0}={}){if(o)for(let y of this.loops.keys())this.stopLoop(y);this.audioBufferCache.has(e)||await this.preLoad(e);let f=this.getCached(e);if(!f)return;let u=new V(f);u.buffer=f,u.loop=!0,typeof i=="number"&&(u.loopStart=i),typeof s=="number"&&(u.loopEnd=s);let l=this.audioCtx.createGain();l.gain.value=n,u.tempGain=l,u.playbackRate=1,u.onended=()=>{u.disconnect(),l.disconnect()},u.connect(l),l.connect(this.musicGain),u.start(0,d/1e3);let p=++this.loopIdCounter;return this.loops.set(p,{source:u,gain:l}),p}static stopLoop(e){let n=this.loops.get(e);n&&(n.source.stop(),n.source.notIndependent||(n.source.disconnect(),n.gain.disconnect()),this.loops.delete(e))}static async createLiaSource(e,{volume:n=1,speed:i=1,loop:s=!1,loopStart:o=0,loopEnd:d=null,isMusic:f=!1,gain:u=null}={}){try{this.audioBufferCache.has(e)||await this.preLoad(e);let l=this.getCached(e);if(!l)return null;let p=new V(l);p.loop=s,p.loopStart=o,p.loopEnd=typeof d=="number"?d:l.duration,p.playbackRate=i;let y=this.audioCtx.createGain();return y.gain.value=n,p.connect(y),p.tempGain=y,y.connect(u||(f?this.musicGain:this.sfxGain)),p.onended=()=>{p.disconnect(),y.disconnect()},p}catch(l){return console.error("Failed to create LiaAudioSrc:",l),null}}},Ee=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function Oe(r){return Ee.includes(r)}var V=class{numberOfInputs;numberOfOutputs;constructor(e,n=z.audioCtx){this.context=n,this.buffer=e,this.source=null,this.startTime=0,this.pauseTime=0,this.playbackRate=1,this.isPlaying=!1,this.loop=!1,this.output=E?n.createGain():null,this.output.gain.value=1,this.channelCount=2,this.channelCountMode="max",this.channelInterpretation="speakers",this.numberOfInputs=0,this.numberOfOutputs=1,this.onended=null}channelCount;channelCountMode;channelInterpretation;onended;source;buffer;context;_createSource(){this.source&&(this.source.onended=null);let e=this.context.createBufferSource();return e.buffer=this.buffer,e.playbackRate.value=this.playbackRate,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd>0?this.loopEnd:this.buffer.duration,e.connect(this.output),this.source=e,e.onended=()=>{this.source===e&&(this.isPlaying&&!this.loop&&(this.isPlaying=!1,this.pauseTime=0),typeof this.onended=="function"&&this.onended())},e}play({fadeIn:e=0,offset:n=null}={}){let i=n!==null?n:this.pauseTime;if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.source=this._createSource(),this.startTime=this.context.currentTime-i/this.playbackRate,this.source.start(0,i),e>0?(this.output.gain.setValueAtTime(0,this.context.currentTime),this.output.gain.linearRampToValueAtTime(1,this.context.currentTime+e)):this.output.gain.setValueAtTime(1,this.context.currentTime),this.isPlaying=!0}start(e=0,n=0,i){this.isPlaying||(this.source=this._createSource(),this.startTime=this.context.currentTime+e-n/this.playbackRate,i!==void 0?this.source.start(this.context.currentTime+e,n,i):this.source.start(this.context.currentTime+e,n),this.pauseTime=n,this.isPlaying=!0)}pause({fadeOut:e=0}={}){if(!this.isPlaying)return;let n=this.getElapsed()/1e3;if(this.loop&&this.loopEnd>this.loopStart){let i=this.loopEnd-this.loopStart;n=this.loopStart+(n-this.loopStart)%i}if(this.isPlaying=!1,e>0){let i=this.context.currentTime;this.output.gain.setValueAtTime(this.output.gain.value,i),this.output.gain.linearRampToValueAtTime(0,i+e),setTimeout(()=>{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n,this.output.gain.setValueAtTime(1,this.context.currentTime)},e*1e3)}else{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n}}getElapsed(){return this.isPlaying?(this.context.currentTime-this.startTime)*this.playbackRate*1e3:this.pauseTime*1e3}setSpeed(e){if(e<=0)throw new Error("Playback rate must be positive");let n=this.getElapsed()/1e3;this.playbackRate=e,this.isPlaying&&(this.pause(),this.pauseTime=n,this.play())}setLoop(e=!0){this.loop=e,this.source&&(this.source.loop=e)}loop;playbackRate;startTime;tempGain=null;connect(e,n=0,i=0){if("value"in e)this.output.connect(e,n);else return this.output.connect(e,n,i),e}disconnect(e,n,i){e===void 0?this.output.disconnect():this.output.disconnect(e,n,i)}output;stop(e=0){if(this.notIndependent)return this.pause();if(!this.source)return;let n=this.context.currentTime+e;this.source.stop(n),this.isPlaying=!1,this.notIndependent||(this.pauseTime=0)}pauseTime;isPlaying;notIndependent=!1;loopStart=0;loopEnd=0},Re={osc:{enabled:!0,type:"sine",freq:440,detune:0},noise:{enabled:!1,level:.5},ampEnv:{attack:.005,decay:.1,sustain:0,release:.1,volume:.3},pitchEnv:{amount:0,decay:.2},filter:{enabled:!1,type:"lowpass",freq:1200,Q:1,envAmount:0,decay:.2},lfo:{enabled:!1,target:"freq",rate:8,depth:20},duration:.4},M=class r{constructor(e={}){this.ctx=z.audioCtx,this.cfg=structuredClone(Re),Object.assign(this.cfg,e)}ctx;cfg;play(e=z.sfxGain){let n=this.ctx,i=n.currentTime,s=this.cfg,o=n.createGain();o.gain.setValueAtTime(1e-4,i);let d=s.ampEnv;o.gain.exponentialRampToValueAtTime(d.volume,i+d.attack),o.gain.exponentialRampToValueAtTime(Math.max(1e-4,d.sustain*d.volume),i+d.attack+d.decay),o.gain.exponentialRampToValueAtTime(1e-4,i+s.duration+d.release);let f=o,u;s.filter.enabled&&(u=n.createBiquadFilter(),u.type=s.filter.type,u.frequency.value=s.filter.freq,u.Q.value=s.filter.Q,u.connect(o),f=u);let l;if(s.osc.enabled){if(l=n.createOscillator(),l.type=s.osc.type,l.frequency.value=s.osc.freq,l.detune.value=s.osc.detune,s.pitchEnv.amount!==0){let a=Math.pow(2,s.pitchEnv.amount/12);l.frequency.exponentialRampToValueAtTime(s.osc.freq*a,i+s.pitchEnv.decay)}l.connect(f),l.start(i),l.stop(i+s.duration+d.release)}let p;if(s.noise.enabled){let a=n.sampleRate*s.duration,h=n.createBuffer(1,a,n.sampleRate),c=h.getChannelData(0);for(let g=0;g<a;g++)c[g]=(Math.random()*2-1)*s.noise.level;p=n.createBufferSource(),p.buffer=h,p.connect(f),p.start(i),p.stop(i+s.duration+d.release)}let y,b;s.lfo.enabled&&l&&(y=n.createOscillator(),y.frequency.value=s.lfo.rate,b=n.createGain(),b.gain.value=s.lfo.depth,y.connect(b),s.lfo.target==="freq"?b.connect(l.frequency):s.lfo.target==="gain"?b.connect(o.gain):s.lfo.target==="filter"&&u&&b.connect(u.frequency),y.start(i),y.stop(i+s.duration)),o.connect(e);let x=[l,p,y,b,u,o],t=i+s.duration+d.release;setTimeout(()=>{x.forEach(a=>a?.disconnect())},(t-n.currentTime)*1e3)}getConfig(){return structuredClone(this.cfg)}setConfig(e){return Object.assign(this.cfg,e),this}getKey(e){return this.cfg[e]}setKey(e,n){return Object.assign(this.cfg[e],n),this}setFreq(e){return this.cfg.osc.freq=e,this}setWave(e){return this.cfg.osc.type=e,this}setVolume(e){return this.cfg.ampEnv.volume=e,this}setAmpEnv(e,n,i,s){return Object.assign(this.cfg.ampEnv,{attack:e,decay:n,sustain:i,release:s}),this}setPitchEnv(e,n){return Object.assign(this.cfg.pitchEnv,{amount:e,decay:n}),this}setNoiseEnabled(e){return this.cfg.noise.enabled=e,this}setNoiseLevel(e){return this.cfg.noise.level=e,this}setFilterEnabled(e){return this.cfg.filter.enabled=e,this}setFilter(e,n,i){return Object.assign(this.cfg.filter,{type:e,freq:n,Q:i,enabled:!0}),this}setLFOEnabled(e){return this.cfg.lfo.enabled=e,this}setLFO(e,n,i){return Object.assign(this.cfg.lfo,{target:e,rate:n,depth:i,enabled:!0}),this}setDuration(e){return this.cfg.duration=e,this}clone(){return new r(structuredClone(this.cfg))}},ke=new M({osc:{enabled:!0,type:"square",freq:900,detune:0},ampEnv:{attack:.002,decay:.04,sustain:0,release:.02,volume:.15},duration:.05}),Te=new M({osc:{enabled:!0,type:"sine",freq:600,detune:0},ampEnv:{attack:.01,decay:.08,sustain:0,release:.04,volume:.12},duration:.1}),Ke=new M({osc:{enabled:!0,type:"triangle",freq:500,detune:0},pitchEnv:{amount:12,decay:.15},ampEnv:{attack:.01,decay:.12,sustain:0,release:.05,volume:.25},duration:.18}),Se=new M({osc:{enabled:!0,type:"sawtooth",freq:1200,detune:0},pitchEnv:{amount:-24,decay:.3},ampEnv:{attack:.005,decay:.25,sustain:0,release:.05,volume:.3},duration:.35}),Ie=new M({osc:{enabled:!0,type:"square",freq:180,detune:0},noise:{enabled:!0,level:.4},ampEnv:{attack:.002,decay:.15,sustain:0,release:.05,volume:.35},duration:.2}),Xe=new Map([["ui_click",ke],["ui_hover",Te],["jump",Ke],["laser",Se],["hit",Ie]]);function qe(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(r)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}function fe(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(4)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}var ce=class{peer=null;key;events={};mbAcc=0;connected=!1;constructor(){this.key=`${Fe()}_${Date.now()}`}connect(e){e&&(this.peer=e,e.peer=this,this.connected=!0,e.connected=!0),this._emit("open")}isConnected(){return this.connected&&!!this.peer}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n)}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(i=>i!==n))}_emit(e,n){this.events[e]?.forEach(i=>i(n))}send(e,n){if(!this.peer)throw new Error("No peer connected");this.peer._receive(e,n)}_receive(e,n){e?this._emit(e,n):this._emit("message",n)}close(){if(this.connected=!1,this.peer){let e=this.peer;this.peer=null,e.peer=null,e.connected=!1,e._emit("close")}this._emit("close")}getKey(){return this.key}};function Fe(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function"){let r=new Uint8Array(16);return crypto.getRandomValues(r),r[6]=r[6]&15|64,r[8]=r[8]&63|128,[...r].map(e=>e.toString(16).padStart(2,"0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return(r==="x"?e:e&3|8).toString(16)})}function Pe(r){let e=!0;function n(){e&&(r(),requestAnimationFrame(n))}return requestAnimationFrame(n),{clear:()=>e=!1}}function Me(r,e,n,i,s){let o=Math.cos(s),d=Math.sin(s),f=[];if(o!==0){let u=(0-r)/o,l=e+u*d;u>0&&l>=0&&l<=i&&f.push({side:"left",t:u})}if(o!==0){let u=(n-r)/o,l=e+u*d;u>0&&l>=0&&l<=i&&f.push({side:"right",t:u})}if(d!==0){let u=(0-e)/d,l=r+u*o;u>0&&l>=0&&l<=n&&f.push({side:"top",t:u})}if(d!==0){let u=(i-e)/d,l=r+u*o;u>0&&l>=0&&l<=n&&f.push({side:"bottom",t:u})}return f.length===0?null:(f.sort((u,l)=>u.t-l.t),f[0])}function Ae(r,e){let n;switch(e){case"left":case"right":n=Math.PI-r;break;case"top":case"bottom":n=2*Math.PI-r;break}return(n%(2*Math.PI)+2*Math.PI)%(2*Math.PI)}function Be(r,e,n,i,s){let o=Me(r,e,n,i,s);return o?{...o,avoidAngle:Ae(s,o.side)}:null}function _e(){return q?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}var We=_e();var W={};xe(W,{KaylaContext:()=>re,KaylaFragment:()=>ht,KaylaInternals:()=>D,KaylaRect:()=>A,createContext:()=>Ze,createElement:()=>Je,createGame:()=>Ye,createReassignableObject:()=>dt,createRenderer:()=>Qe,createScene:()=>je,createUseHook:()=>pt,self:()=>me,setLogLevel:()=>ft,useClick:()=>nt,useContext:()=>lt,useCurrentGame:()=>st,useCurrentRenderer:()=>at,useCurrentScene:()=>ot,useCurrentTicker:()=>ut,useDisposableRef:()=>ct,useEffect:()=>ye,useEntity:()=>it,useExports:()=>oe,useFiber:()=>De,useFiberControl:()=>ge,useGlobalClick:()=>Le,useInitialization:()=>ie,useNextStack:()=>be,usePaint:()=>ae,useRect:()=>se,useRef:()=>pe,useSelf:()=>L,useShouldRefresh:()=>tt,useState:()=>et,useTick:()=>rt});function Ye({width:r,height:e,updateHz:n="frames"}){return new D.KaylaGame(r,e,n==="frames"?1/0:n)}function je(r){let e=new N(r);return new D.KaylaScene(e)}function Qe(r){return new D.KaylaRenderer(r)}function Je(r,e){return{type:r,props:e}}var A;(i=>{function r(s,o){return!(s.right<o.left||s.left>o.right||s.bottom<o.top||s.top>o.bottom)}i.rawCollision=r;function e(s,o,d){let f=o*Math.PI/180,u=Math.cos(f),l=Math.sin(f),p=1/0;return u>0&&(p=Math.min(p,(d.right-s.x)/u)),u<0&&(p=Math.min(p,(d.left-s.x)/u)),l>0&&(p=Math.min(p,(d.bottom-s.y)/l)),l<0&&(p=Math.min(p,(d.top-s.y)/l)),P.from(o).scale(p)}i.getCurrToBound=e;function n(s){let{left:o,right:d,top:f,bottom:u,width:l,height:p,x:y=0,y:b=0}=s;if(l===null||p===null)throw new Error("width and height are required");let x,t;if(o!=null&&d!=null){if(Math.abs(d-o-l)>1e-6)throw new Error("left, right, and width mismatch");x=o}else y!=null?x=y-l/2:o!=null?x=o:d!=null?x=d-l:x=0;if(f!=null&&u!=null){if(Math.abs(u-f-p)>1e-6)throw new Error("top, bottom, and height mismatch");t=f}else b!=null?t=b-p/2:f!=null?t=f:u!=null?t=u-p:t=0;return{left:x,right:x+l,top:t,bottom:t+p,width:l,height:p,x:x+l/2,y:t+p/2}}i.createRawRect=n})(A||={});var D;(b=>{class r extends O{#e;#t;constructor(t,a,h){super(t,a,h),this.#e=new Set,this.#t=!1}delay(t){return this.ticker.createTimeout(t)}get started(){return this.#t}start(){if(!this.#t){for(let t of this.#e)t.start();this.#t=!0,super.start()}}stop(){if(this.#t){for(let t of this.#e)t.stop();this.#t=!1,super.stop()}}addRenderer(t){this.#e.has(t)||(this.#e.add(t),this.#t&&t.start(),t.game=this)}get mainRenderer(){return[...this.#e].at(0)}getRenderers(){return[...this.#e]}deleteRenderer(t){this.#e.has(t)&&(this.#e.delete(t),this.#t&&t.stop(),delete t.game)}}b.KaylaGame=r;class e extends U{game;pointerX;pointerY;pointerEvents;constructor(t){super(t),this.useDraw=this.useDraw.bind(this),this.on("draw",a=>{if(this.game)for(let h of this.game.scenes.values())h.handleDraw(a)}),this.pointerX=0,this.pointerY=0,this.pointerEvents=new K,this.pointerPosUpdater=this.pointerPosUpdater.bind(this),this.onPointerDown=this.onPointerDown.bind(this)}pointerPosUpdater(t){this.pointerX=t.clientX,this.pointerY=t.clientY}onPointerDown(t){this.pointerPosUpdater(t);let a=e.getClickType(t);if(a!=="invalid"){t.preventDefault();let h=this.getMousePos();this.pointerEvents.emit("down",h,a)}}static getClickType(t){switch(t.button){case 0:return"left";case 1:return"middle";case 2:return"right";default:return"invalid"}}listenPointerUpdates(){this.canvas.addEventListener("pointermove",this.pointerPosUpdater),this.canvas.addEventListener("pointerdown",this.onPointerDown)}unlistenPointerUpdates(){this.canvas.removeEventListener("pointermove",this.pointerPosUpdater),this.canvas.removeEventListener("pointerdown",this.onPointerDown)}pointerPosToWorldPos(t,a){let h=this.canvas.getBoundingClientRect(),c=(t-h.left)/h.width,g=(a-h.top)/h.height,w=c*this.viewportWidth*this.cameraWidth/h.width,C=g*this.viewportHeight*this.cameraHeight/h.height;return new P(w,C)}getMousePos(){return this.pointerPosToWorldPos(this.pointerX,this.pointerY)}useDraw(t){let a=h=>{t(h,new i)};return this.on("draw",a),()=>{this.off("draw",a)}}attachTo(t){t.addRenderer(this),this.game=t}detach(){this.game&&this.game.deleteRenderer(this)}}b.KaylaRenderer=e;class n{current;saves;constructor(){this.saves=[]}useTick(t){if(!this.current)throw new Error("Hook 'useTick' must be executed in the top level scope of a component.");this.current.onTick[this.current.useStepCallIndex]=t,this.current.useStepCallIndex++}usePaint(t){if(!this.current)throw new Error("Hook 'usePaint' must be executed in the top level scope of a component.");this.current.onPaint[this.current.useDrawCallIndex]=t,this.current.useDrawCallIndex++}useEntity(){if(!this.current)throw new Error("Hook 'useEntity' must be executed in the top level scope of a component.");return pe(me)}useSelf(t){if(!this.current)throw new Error("Hook 'useSelf' must be executed in the top level scope of a component.");let a=pe(null);return(a.current===null||a.current===void 0)&&(a.current=t()),a.current}useInitialization(t){if(!this.current)throw new Error("Hook 'useInitialization' must be executed in the top level scope of a component.");let a=this.current;a.onInit=t}useRect(){if(!this.current)throw new Error("Hook 'useRect' must be executed in the top level scope of a component.");return L(()=>new b.KaylaInternalRect(this.current))}useFiber(){if(!this.current)throw new Error("Hook 'useFiber' must be executed in the top level scope of a component.");return L(()=>this.current)}useFiberControl(){if(!this.current)throw new Error("Hook 'useFiberControl' must be executed in the top level scope of a component.");let t=this.current;return L(()=>({refresh:()=>t.refresh(),get childrenCount(){return t.lastChildren.length},setMaxChildren:a=>{t.setMaxChildren(a)},getMaxChildren:()=>t.getMaxChildren(),get maxSafeChildren(){return t.maxSafeChildren},get key(){return t.key},get getChildrenEntities(){return t.getChildrenEntities.bind(t)},get getEntityChain(){return t.getEntityChain.bind(t)},get getFiberChain(){return t.getFiberChain.bind(t)}}))}useCurrentTicker(){if(!this.current)throw new Error("Hook 'useCurrentTicker' must be executed in the top level scope of a component.");return this.current.getAttachedGame().ticker}useCurrentRenderer(){if(!this.current)throw new Error("Hook 'useCurrentRenderer' must be executed in the top level scope of a component.");return this.current.getAttachedGame().mainRenderer}useCurrentGame(){if(!this.current)throw new Error("Hook 'useCurrentGame' must be executed in the top level scope of a component.");return this.current.getAttachedGame()}useCurrentScene(){if(!this.current)throw new Error("Hook 'useCurrentScene' must be executed in the top level scope of a component.");return this.current.scene}useState(t,{alwaysRecall:a=!1}={}){if(!this.current)throw new Error("Hook 'useState' must be executed in the top level scope of a component.");let c=this.current.state[this.current.useStateCallIndex]??new s(this.current,t,{alwaysRecall:a});return this.current.state[this.current.useStateCallIndex]=c,this.current.useStateCallIndex++,c}useShouldRefresh(t){let a=this.current;if(!a)throw new Error("useShouldRefresh must be called inside a component");a.watchedDeps&&console.warn("useShouldRefresh called multiple times \u2014 using the last call"),a.watchedDeps=t}useRef(t){if(!this.current)throw new Error("Hook 'useRef' must be executed in the top level scope of a component.");let h=this.current.refs[this.current.useRefCallIndex]??d(t??null);return this.current.refs[this.current.useRefCallIndex]=h,this.current.useRefCallIndex++,h}useEffect(t){if(!this.current)throw new Error("Hook 'useEffect' must be executed in the top level scope of a component.");this.current.onEffect[this.current.useEffectCallIndex]=t,this.current.useEffectCallIndex++}useExports(t,a){if(!this.current)throw new Error("Hook 'useExports' must be executed in the top level scope of a component.");this.current.onExport=a}useGlobalClick(t){if(!this.current)throw new Error("Hook 'useGlobalClick' must be executed in the top level scope of a component.");this.current.onGlobalClick[this.current.useGlobalClickCallIndex]=t,this.current.useGlobalClickCallIndex++}useClick(t){if(!this.current)throw new Error("Hook 'useClick' must be executed in the top level scope of a component.");let a=this.current;Le((h,c)=>{let g=a.entity;if(!g)return;let w=g.getRawRect(),C=A.createRawRect({x:h.x,y:h.y,width:3,height:3});A.rawCollision(w,C)&&t(h,c)})}useContext(t){if(!this.current)throw new Error("Hook 'useContext' must be executed in the top level scope of a component.");return this.current.findContextValueFromInst(t)}save(){this.saves.push({current:this.current})}restore(){let t=this.saves.pop();if(!t)throw new Error("Cannot restore without saving.");this.current=t.current}logLevel="warn";logger={debug:(...t)=>{this.logLevel==="debug"&&console.debug(...t)},info:(...t)=>{["info","warn","debug"].includes(this.logLevel)&&console.info(...t)},warn:(...t)=>{["warn","debug"].includes(this.logLevel)&&console.warn(...t)},error:(...t)=>console.error(...t),withFiber:(t,a,h,...c)=>{let g=t?.fc?.name||"anonymous",w=t?.key?` key=${t.key}`:"";this.logger[a](`${h} <${g}${w}>`,...c)}}}b.GlobalKayla=n;class i{preventDefault(){this.#e=!0}#e=!1;isPrevented(){return this.#e}}b.KaylaEvent=i;class s{#e;#t;#n;alwaysRecall;constructor(t,a,{alwaysRecall:h=!1}={}){this.#t=t,this.#e=a??void 0,this.#n=Date.now(),this.alwaysRecall=h}get(){return this.#e}*[Symbol.iterator](){throw new Error(`Hey! KaylaState is NOT an array / iterable like useState in React.
|
|
1
|
+
var ze=Object.defineProperty;var ve=(r,e)=>{for(var n in e)ze(r,n,{get:e[n],enumerable:!0})};var W={};ve(W,{DeltaTweenII:()=>ne,ENVIRONMENT:()=>fe,GEmitterMemory:()=>pe,LeaEntityII:()=>z,LeaEventEmitter:()=>T,LeaGameII:()=>X,LeaRendererII:()=>N,LeaSceneII:()=>O,LeaSerializers:()=>Ce,LeaTickerII:()=>te,LeaTimeout:()=>re,LeaUtilsII:()=>R,LiaAudio:()=>U,LiaAudioSrc:()=>H,LiaOscSFX:()=>A,LiaSFXMap:()=>qe,NOTE_NAMES:()=>ke,RectLeaEntity:()=>q,Vector2:()=>M,colToRGBA:()=>$e,defaultSFXConfig:()=>Ke,editRGBA:()=>Ne,generateUUID:()=>Me,getAvoidAngle:()=>Le,getEnvironment:()=>Re,getNormalizedColor:()=>Ue,getRayHit:()=>_e,isInitiallyMobile:()=>Ye,isMobile:()=>Ve,isNode:()=>B,isNote:()=>Xe,isWeb:()=>C,parseFillStyle:()=>Ee,raycastAvoid:()=>We,scaleCoord:()=>Oe,setAnimInterval:()=>Ae,sfxHit:()=>Pe,sfxJump:()=>Ie,sfxLaser:()=>Fe,sfxUIClick:()=>Te,sfxUIHover:()=>Se,shortUID:()=>Be,tinyUID:()=>ie});var T=class{#e=new Map;constructor(){this.#e=new Map}on(e,n){let i=this.#e.get(e)||[];return i.push(n),this.#e.set(e,i),this}once(e,n){let i=(...s)=>{this.off(e,i),n(...s)};return this.on(e,i),this}off(e,n){let i=this.#e.get(e);if(!i)return this;let s=i.indexOf(n);return s>=0&&i.splice(s,1),this}emit(e,...n){let i=this.#e.get(e);if(!i||i.length===0){if(e==="error")throw n[0];return!1}return i.slice().forEach(s=>s(...n)),!0}removeAllListeners(e){return e?this.#e.delete(e):this.#e.clear(),this}listenerCount(e){return this.#e.get(e)?.length??0}},N=class extends T{canvas;ctx;running;_rafId;_fps;_frameCount;_fpsTimer;_lastFrameTime;constructor(e,{viewportWidth:n,viewportHeight:i,cameraWidth:s,cameraHeight:o}={}){if(!C)throw new Error("Web-Only");super(),this.canvas=e,this.ctx=e.getContext("2d"),this.automatic=!0,this.#e=n??e.width,this.#t=i??e.height,this.#n=s??e.width,this.#r=o??e.height,this.running=!1,this._rafId=null,this._loop=this._loop.bind(this),this.updateCanvasResolution(),this._fps=60,this._frameCount=0,this._fpsTimer=0}automatic;retransform(){this.ctx.setTransform(1,0,0,1,0,0);let e=this.#n/this.#e,n=this.#r/this.#t;this.ctx.translate(this.#n/2,this.#r/2),this.ctx.scale(e,n),this.ctx.translate(-this.#e/2,-this.#t/2)}#e=0;#t=0;#n=0;#r=0;get viewportWidth(){return this.#e}set viewportWidth(e){this.#e=e,this.retransform(),this.emitViewportUpdate()}get width(){return this.#e}get height(){return this.#t}get centerX(){return this.#e/2}get centerY(){return this.#t/2}get left(){return 0}get top(){return 0}get right(){return this.#e}get bottom(){return this.#t}get viewportHeight(){return this.#t}set viewportHeight(e){this.#t=e,this.retransform(),this.emitViewportUpdate()}get cameraWidth(){return this.#n}set cameraWidth(e){this.#n=e,this.updateCanvasResolution(),this.retransform()}get cameraHeight(){return this.#r}set cameraHeight(e){this.#r=e,this.updateCanvasResolution(),this.retransform()}updateCanvasResolution(){this.canvas.width=this.#n,this.canvas.height=this.#r}emitViewportUpdate(){this.emit("viewport_update",{width:this.viewportWidth,height:this.viewportHeight})}applyTransform(){this.retransform()}get FPS(){return this._fps}_loop(){this.automatic&&this.update(),this._rafId=requestAnimationFrame(this._loop)}update(){if(!this.running||!C)return;let e=performance.now(),n=(e-(this._lastFrameTime??e))/1e3;this._lastFrameTime=e,this._frameCount++,this._fpsTimer+=n,this._fpsTimer>=1&&(this._fps=Math.round(this._frameCount/this._fpsTimer),this._frameCount=0,this._fpsTimer=0),this.ctx.clearRect(0,0,this.#n,this.#r),this.emit("draw",this.ctx)}start(){if(!this.running){if(!C||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!0,this._rafId=requestAnimationFrame(this._loop)}}stop(){if(!C||typeof globalThis.requestAnimationFrame>"u")throw new Error("Raf is not supported");this.running=!1,this._rafId!==null&&(cancelAnimationFrame(this._rafId),this._rafId=null)}},te=class extends T{setNow(e){this.#e=e}#e=0;__intervalId=null;__lastTime=0;constructor(e=16){super(),this.#t=e,this.speedHackDT=1}speedHackDT;get isRaf(){return this.tickInterval===1/0}#t=15;get tickInterval(){return this.#t}set tickInterval(e){this.#t=e,this.__intervalId&&(this.stop(),this.start())}now(){return this.#e}__tick(){let e=performance.now(),n=(e-this.__lastTime)/1e3*this.speedHackDT;this.__lastTime=e,!(C&&typeof this.__intervalId=="function"&&document.hidden)&&(this.#e+=n*1e3,this.emit("tick",n))}createTimeout(e){return new re(e,this)}createTween(e,n=()=>{}){let i=new ne(e),s=(o=0)=>{if(i.finished){this.off("tick",s);return}i.update(o)};return i.on("finish",()=>{this.off("tick",s)}),i.on("delta",o=>{n(o)}),this.on("tick",s),i}start(){this.__intervalId===null&&(this.__lastTime=performance.now(),this.__intervalId=C&&!isFinite(this.tickInterval)?Ae(()=>this.__tick()).clear:setInterval(()=>this.__tick(),this.tickInterval))}stop(){this.__intervalId!==null&&(typeof this.__intervalId=="function"?this.__intervalId():clearInterval(this.__intervalId)),this.__intervalId=null}getSineMod(e,n=0){return .5+.5*Math.sin((this.now()%e/e+n)*2*Math.PI)}},Ce;(t=>{function r(a){return a===!0?1:0}t.booleanExport=r;function e(a){return a===0?!1:a===1}t.booleanImport=e;function n(a){return`${a.x}|${a.y}`}t.vec2Export=n;function i(a){let[l,p]=a.split("|"),y=parseFloat(l),w=parseFloat(p);if(isNaN(y)||isNaN(w))throw new Error(`Invalid Vector2 string: ${a}`);return new M(y,w)}t.vec2Import=i,t.booleanMap={mapExport:r,mapImport:e};function o(a){return l=>Number(l.toFixed(a))}t.createRounder=o;function c(a=10){return{mapExport(l){return Math.round(l/a)},mapImport(l){return l*a}}}t.createLowPrecision=c;function d(a){return Math.round(a)}t.lightWeightRounder=d;function u(a=100){return{mapExport(l){return Math.round(l*a)},mapImport(l){return l/a}}}t.createPercent=u;function h(a){let l=new Map(Object.entries(a));return{mapExport:p=>l.get(p)??null,mapImport:p=>Array.from(l.entries()).find(([y,w])=>w===p)?.[0]??null}}t.createLookup=h;function f(a){let l=a*(180/Math.PI);return Math.round((l%360+360)%360)}t.radToDeg=f;function b(a){return a*(Math.PI/180)}t.degToRad=b,t.angleRadToDeg={mapExport:f,mapImport:b};function x(a=10){let l=c(a);return{mapExport(p){return l.mapExport(f(p))},mapImport(p){return l.mapImport(b(p))}}}t.createLowPrecisionRadToDeg=x})(Ce||={});var z=class r extends T{name="";scaleRotate=0;scale=1;constructor(e,n=0,i=0){super(),this.autoTranslate=!1,this.name=e,this.z=0,this.___pos=new M(n,i),this.nonSerializableProperties=[],this.nonSerializableProperties.push("___pos","autoTranslate","arraySerializeMap"),this.forceSerializableProperties=[],this.forceSerializableProperties.push("x","y")}arraySerializeMap;autoTranslate;z;___pos;nonSerializableProperties;forceSerializableProperties;get pos(){return this.___pos}get x(){return this.pos.x}get y(){return this.pos.y}set x(e){this.pos.x=e}set y(e){this.pos.y=e}handleUpdate(e){if(this.update)try{this.emit("update",e),this.update(e)}catch(n){this.emit("error",n)}}handleDraw(e){if(!(B||!this.draw)){e.save(),this.autoTranslate&&e.translate(this.x,this.y);try{this.emit("draw",e),this.draw(e)}catch(n){this.emit("error",n)}e.restore()}}serialize(){if(Array.isArray(this.arraySerializeMap))return this.arraySerializeMap.map(([s,{mapExport:o}])=>{let c=Reflect.get(this,s);return o?o(c):c});let e=["_events","_eventsCount","_maxListeners","nonSerializableProperties","forceSerializableProperties"],n=[...Reflect.ownKeys(this),...this.forceSerializableProperties].filter(s=>!this.nonSerializableProperties.includes(s)&&!e.includes(s.toString())),i=Object.fromEntries(n.map(s=>{let o=Reflect.get(this,s);if(B&&typeof o=="number"){let c=o.toString().split("."),u=(c[1]?c[1].length:0)>2?Number(o.toFixed(2)):o;return[s,u]}return[s,o]}));return JSON.parse(JSON.stringify(i))}toLocal(e){return e.subtract(this.pos)}toWorld(e){return e.add(this.pos)}deserializeArray(e){return r.deserializeArray(this.arraySerializeMap,e)}static deserializeArray(e,n){if(!e||!Array.isArray(n))return n;let i={};for(let s=0;s<n.length;s++){let o=e[s];if(!o)break;let[c,{mapImport:d}]=o,u=n[s];if(d&&(u=d(u)),typeof c!="string")break;try{Reflect.set(i,c,u)}catch(h){console.error(h)}}return i}},O=class extends T{name="";entities=new Map;paused=!0;constructor(e){super(),this.name=e}handleUpdate(e){if(!this.paused){this.emit("update",e);for(let n of this.entities.values())n.handleUpdate(e)}}handleDraw(e){if(!B&&!this.paused){this.emit("draw",e);for(let n of[...this.entities.values()].sort((i,s)=>i.z-s.z))n.handleDraw(e)}}addEntity(e){if(!(e instanceof z))throw new Error("invalid entity");if(!e.name)throw new Error("Entity must have a name.");this.entities.set(e.name,e)}removeEntity(e){if(!(e instanceof z))throw new Error("invalid entity");this.entities.delete(e.name)}getEntity(e){return this.entities.get(e)}},X=class{scenes;ticker;get centerX(){return this.width/2}get centerY(){return this.height/2}get left(){return 0}get top(){return 0}get right(){return this.width}get bottom(){return this.height}width;height;constructor(e,n,i=16){this.ticker=new te(i),this.scenes=new Map,this.width=e,this.height=n,this.ticker.on("tick",s=>{for(let o of this.scenes.values())o.paused||o.handleUpdate(s)})}addScene(e){if(!e.name)throw new Error("Scene must have a name.");e.paused=!1,this.scenes.set(e.name,e)}removeScene(e){e&&(e.paused=!0),this.scenes.delete(e.name)}now(){return this.ticker.now()}start(){this.ticker.start()}stop(){this.ticker.stop()}},R={lerp(r,e,n){return r+(e-r)*n},clamp(r,e,n){return Math.min(n,Math.max(e,r))},clamp01(r){return Math.min(1,Math.max(0,r))},easeLinear(r){return r},easeInQuad(r){return r*r},easeOutQuad(r){return 1-(1-r)*(1-r)},easeInOutQuad(r){return r<.5?2*r*r:1-Math.pow(-2*r+2,2)/2},easeInSine(r){return 1-Math.cos(r*Math.PI/2)},easeOutSine(r){return Math.sin(r*Math.PI/2)},easeInOutSine(r){return-(Math.cos(Math.PI*r)-1)/2},easeInExpo(r){return r===0?0:Math.pow(2,10*r-10)},easeOutExpo(r){return r===1?1:1-Math.pow(2,-10*r)},easeInOutExpo(r){return r===0?0:r===1?1:r<.5?Math.pow(2,20*r-10)/2:(2-Math.pow(2,-20*r+10))/2},smoothstep(r){return r=R.clamp(r,0,1),r*r*(3-2*r)},randomLerp(r,e){return R.lerp(r,e,Math.random())},randomInt(r,e){return Math.floor(Math.random()*(e-r+1))+r},randomArrayValue(r){return r[R.randomInt(0,r.length-1)]},createBezier(r,e,n,i){function s(d,u,h,f,b){let g=1-d;return g*g*g*u+3*g*g*d*h+3*g*d*d*f+d*d*d*b}function o(d,u,h,f,b){let g=1-d;return 3*g*g*(h-u)+6*g*d*(f-h)+3*d*d*(b-f)}function c(d){let u=d;for(let h=0;h<6;h++){let f=s(u,0,r,n,1),b=o(u,0,r,n,1);if(b===0)break;u-=(f-d)/b}return R.clamp(u,0,1)}return function(u){u=R.clamp(u,0,1);let h=c(u);return s(h,0,e,i,1)}},lengthSquared(...r){return r.reduce((e,n)=>e+n*n,0)},normalizeRad(r){let e=2*Math.PI;return r=r%e,r<0&&(r+=e),r},angleInvertY(r){return R.normalizeRad(-r)},degToRadFlipY(r){return R.angleInvertY(r*Math.PI/180)},minimalAngularDirection(r,e){r=R.normalizeRad(r),e=R.normalizeRad(e);let n=R.normalizeRad(e-r),i=R.normalizeRad(r-e);return n<=i?1:-1}},ne=class extends T{constructor({delta:e,ms:n,easing:i}){super(),this.delta=e,this.duration=n,this.elapsed=0,this.easing=i??(s=>s),this.lastValue=0,this.finished=!1}delta;duration;elapsed;lastValue;finished;easing;update(e){this.elapsed+=e*1e3;let n=R.clamp(this.elapsed/this.duration,0,1),i=this.easing(n),s=this.delta*i,o=s-this.lastValue;this.lastValue=s,this.emit("delta",o),n>=1&&(this.finished=!0,this.emit("finish",void 0))}},q=class extends z{constructor(e,n=0,i=0,s=50,o=50){super(e,n,i),this.width=s,this.height=o}width;height;get left(){return this.x-this.width/2}set left(e){this.x=e+this.width/2}get right(){return this.x+this.width/2}set right(e){this.x=e-this.width/2}get top(){return this.y-this.height/2}set top(e){this.y=e+this.height/2}get bottom(){return this.y+this.height/2}set bottom(e){this.y=e-this.height/2}get lx(){return 0}get ly(){return 0}get lleft(){return-this.width/2}get lright(){return this.width/2}get ltop(){return-this.height/2}get lbottom(){return this.height/2}isCollidingWith(e){return!(this.right<e.left||this.left>e.right||this.bottom<e.top||this.top>e.bottom)}color="rgba(0, 0, 255, 0.3)";draw(e){e.translate(this.x,this.y),e.rotate(this.scaleRotate),e.fillStyle=this.color,e.fillRect(-this.width/2,-this.height/2,this.width,this.height)}},re=class extends T{duration;ticker;elapsed;finished;_resolve;promise;_timeoutId;constructor(e,n=null){super(),this.duration=e,this.ticker=n,this.elapsed=0,this.finished=!1,this._resolve=null,this.promise=new Promise(i=>this._resolve=i),this.update=this.update.bind(this),this.ticker&&this.ticker.on("tick",this.update)}update(e=0){this.finished||(this.elapsed+=e*1e3,this.elapsed>=this.duration&&this.finish())}finish(){this.finished||(this.finished=!0,this.emit("finish",void 0),this._resolve&&this._resolve(),this.ticker&&this.ticker.off("tick",this.update))}start(){return this.ticker||(this._timeoutId=setTimeout(()=>this.finish(),this.duration)),this}cancel(){this.finished||(this.finished=!0,!this.ticker&&this._timeoutId!=null&&clearTimeout(this._timeoutId),this.ticker&&this.ticker.off("tick",this.update))}then(e,n){return this.promise.then(e,n)}after(e,n){return this.promise.then(e,n)}},M=class r{constructor(e=0,n=0){this.x=e,this.y=n}x;y;toJSON(){return{x:this.x,y:this.y,vec2:!0}}static isVec2(e){return e&&typeof e=="object"&&"x"in e&&"y"in e&&e.vec2===!0}static fromSerialized(e){return this.isVec2(e)?new this(e.x,e.y):null}rotate(e){let n=Math.cos(e),i=Math.sin(e);return new r(this.x*n-this.y*i,this.x*i+this.y*n)}static from(e){return new r(Math.cos(e),Math.sin(e))}isEmpty(){return Math.abs(this.x)<.01&&Math.abs(this.y)<.01}get angle(){return Math.atan2(this.y,this.x)}angleTo(e){return Math.atan2(e.y-this.y,e.x-this.x)}get length(){return Math.hypot(this.x,this.y)}get lengthSquared(){return this.x*this.x+this.y*this.y}normalized(){let e=this.length;return e===0?new r(0,0):new r(this.x/e,this.y/e)}consume(e){let n=this.length;n<=e?(this.x=0,this.y=0):this.overwite(this.scale((n-e)/n))}project(e){return e.scale(this.dotNormalized(e))}reflect(e){let n=this.dot(e);return this.subtract(e.scale(2*n))}dotNormalized(e){let n=this.normalized(),i=e.normalized();return n.x*i.x+n.y*i.y}lengthSquaredTo(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}dot(e){return this.x*e.x+this.y*e.y}distanceTo(e){return Math.hypot(this.x-e.x,this.y-e.y)}distanceToCheap(e){let n=this.x-e.x,i=this.y-e.y;return n*n+i*i}directionTo(e){return new r(e.x-this.x,e.y-this.y).normalized()}add(e){return new r(this.x+e.x,this.y+e.y)}addRaw(e){return new r(this.x+e,this.y+e)}overwite(e){this.x=e.x,this.y=e.y}subtract(e){return new r(this.x-e.x,this.y-e.y)}scale(e){return new r(this.x*e,this.y*e)}toString(){return`Vector2(${this.x}, ${this.y})`}clone(){return new r(this.x,this.y)}};function Ue(r){let e=/^rgba?\(([^)]+)\)$/,n=r.match(e);if(n){let[i,s,o,c=1]=n[1].split(",").map(d=>parseFloat(d));return{r:Math.max(0,Math.min(255,Math.floor(i))),g:Math.max(0,Math.min(255,Math.floor(s))),b:Math.max(0,Math.min(255,Math.floor(o))),a:Math.max(0,Math.min(1,Math.floor(c*255)/255))}}return Ee(r)}function $e(r){return`rgba(${r.r}, ${r.g}, ${r.b}, ${r.a})`}function Ee(r){if(r=r.trim().toLowerCase(),r[0]==="#"){let n,i,s;if(r.length===7)n=parseInt(r.slice(1,3),16),i=parseInt(r.slice(3,5),16),s=parseInt(r.slice(5,7),16);else if(r.length===4)n=parseInt(r[1]+r[1],16),i=parseInt(r[2]+r[2],16),s=parseInt(r[3]+r[3],16);else throw new Error("Invalid hex color");return{r:n,g:i,b:s,a:1}}let e=r.match(/^rgba?\s*\(\s*(\d+)[, ]\s*(\d+)[, ]\s*(\d+)(?:[, ]\s*([\d.]+))?\s*\)$/);if(e)return{r:parseInt(e[1]),g:parseInt(e[2]),b:parseInt(e[3]),a:e[4]!==void 0?parseFloat(e[4]):1};throw new Error("Unsupported fillStyle format")}function Ne(r,{r:e,g:n,b:i,a:s}={}){let[o,c,d,u,h]=r.match(/rgba?\((\d+),\s*(\d+),\s*(\d+),?\s*([\d.]*)\)?/)||[];return`rgba(${e??c}, ${n??d}, ${i??u}, ${s??(h||1)})`}function Oe(r,e,n){return n+(r-n)*e}function Re(){return typeof process<"u"&&process.release?.name==="node"?"node":typeof window<"u"||typeof self<"u"?"web":"unknown"}var fe=Re(),B=fe==="node",C=fe==="web",U=class r{static unlock(){C&&this.audioCtx.state!=="running"&&this.audioCtx.resume()}static audioCtx=C?new AudioContext:null;static masterGain=C?this.audioCtx.createGain():null;static musicGain=C?this.audioCtx.createGain():null;static sfxGain=C?this.audioCtx.createGain():null;static{C&&(this.masterGain.gain.value=1,this.musicGain.gain.value=1,this.sfxGain.gain.value=1,this.sfxGain.connect(this.masterGain),this.musicGain.connect(this.masterGain),this.masterGain.connect(this.audioCtx.destination))}static get SFX_VOLUME(){return this.sfxGain.gain.value}static get MUSIC_VOLUME(){return this.musicGain.gain.value}static get VOLUME(){return this.masterGain.gain.value}static set SFX_VOLUME(e){this.sfxGain.gain.value=e}static set MUSIC_VOLUME(e){this.musicGain.gain.value=e}static set VOLUME(e){this.masterGain.gain.value=e}static noteToHz(e){return this.tuningFreq*Math.pow(2,(e-9)/12)}static tuningFreq=440;static audioBufferCache=new Map;static loops=new Map;static sfsx=new Map;static loopIdCounter=0;static CACHE_NAME="lia-audio-cache-v1";static async preLoad(e){if(this.audioBufferCache.has(e))return this.audioBufferCache.get(e);let n=r.CACHE_NAME,i,s;if(typeof caches<"u"&&(s=await caches.open(n),i=await s.match(e)),!i){if(i=await fetch(e),!i.ok)throw new Error(`Failed to fetch ${e}`);s&&await s.put(e,i.clone())}let o=await i.arrayBuffer(),c=await this.audioCtx.decodeAudioData(o);return this.audioBufferCache.set(e,c),c}static async getOnlyDownloadedCache(e){let n=r.CACHE_NAME;return await(await caches.open(n)).match(e)}static getCached(e){return this.audioBufferCache.get(e)||null}static async playSound(e,n=.2,i=1,s=!0){try{this.sfsx.has(e)&&this.sfsx.get(e).source.stop(),this.audioBufferCache.has(e)||await this.preLoad(e);let o=this.getCached(e);if(!o)return;let c=new H(o);c.buffer=o;let d=1-.12,u=1+.12;c.playbackRate=i??d+Math.random()*(u-d);let h=this.audioCtx.createGain();h.gain.value=n,c.tempGain=h,c.connect(h),h.connect(this.sfxGain),c.onended=()=>{c.disconnect(),h.disconnect()},c.start(),s&&this.sfsx.set(e,{source:c,gain:h})}catch(o){console.error(o)}}static async playLoop(e,n=1,{loopStart:i=0,loopEnd:s=null,exclusive:o=!0,skipMS:c=0}={}){if(o)for(let b of this.loops.keys())this.stopLoop(b);this.audioBufferCache.has(e)||await this.preLoad(e);let d=this.getCached(e);if(!d)return;let u=new H(d);u.buffer=d,u.loop=!0,typeof i=="number"&&(u.loopStart=i),typeof s=="number"&&(u.loopEnd=s);let h=this.audioCtx.createGain();h.gain.value=n,u.tempGain=h,u.playbackRate=1,u.onended=()=>{u.disconnect(),h.disconnect()},u.connect(h),h.connect(this.musicGain),u.start(0,c/1e3);let f=++this.loopIdCounter;return this.loops.set(f,{source:u,gain:h}),f}static stopLoop(e){let n=this.loops.get(e);n&&(n.source.stop(),n.source.notIndependent||(n.source.disconnect(),n.gain.disconnect()),this.loops.delete(e))}static async createLiaSource(e,{volume:n=1,speed:i=1,loop:s=!1,loopStart:o=0,loopEnd:c=null,isMusic:d=!1,gain:u=null}={}){try{this.audioBufferCache.has(e)||await this.preLoad(e);let h=this.getCached(e);if(!h)return null;let f=new H(h);f.loop=s,f.loopStart=o,f.loopEnd=typeof c=="number"?c:h.duration,f.playbackRate=i;let b=this.audioCtx.createGain();return b.gain.value=n,f.connect(b),f.tempGain=b,b.connect(u||(d?this.musicGain:this.sfxGain)),f.onended=()=>{f.disconnect(),b.disconnect()},f}catch(h){return console.error("Failed to create LiaAudioSrc:",h),null}}},ke=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];function Xe(r){return ke.includes(r)}var H=class{numberOfInputs;numberOfOutputs;constructor(e,n=U.audioCtx){this.context=n,this.buffer=e,this.source=null,this.startTime=0,this.pauseTime=0,this.playbackRate=1,this.isPlaying=!1,this.loop=!1,this.output=C?n.createGain():null,this.output.gain.value=1,this.channelCount=2,this.channelCountMode="max",this.channelInterpretation="speakers",this.numberOfInputs=0,this.numberOfOutputs=1,this.onended=null}channelCount;channelCountMode;channelInterpretation;onended;source;buffer;context;_createSource(){this.source&&(this.source.onended=null);let e=this.context.createBufferSource();return e.buffer=this.buffer,e.playbackRate.value=this.playbackRate,e.loop=this.loop,e.loopStart=this.loopStart,e.loopEnd=this.loopEnd>0?this.loopEnd:this.buffer.duration,e.connect(this.output),this.source=e,e.onended=()=>{this.source===e&&(this.isPlaying&&!this.loop&&(this.isPlaying=!1,this.pauseTime=0),typeof this.onended=="function"&&this.onended())},e}play({fadeIn:e=0,offset:n=null}={}){let i=n!==null?n:this.pauseTime;if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.source=this._createSource(),this.startTime=this.context.currentTime-i/this.playbackRate,this.source.start(0,i),e>0?(this.output.gain.setValueAtTime(0,this.context.currentTime),this.output.gain.linearRampToValueAtTime(1,this.context.currentTime+e)):this.output.gain.setValueAtTime(1,this.context.currentTime),this.isPlaying=!0}start(e=0,n=0,i){this.isPlaying||(this.source=this._createSource(),this.startTime=this.context.currentTime+e-n/this.playbackRate,i!==void 0?this.source.start(this.context.currentTime+e,n,i):this.source.start(this.context.currentTime+e,n),this.pauseTime=n,this.isPlaying=!0)}pause({fadeOut:e=0}={}){if(!this.isPlaying)return;let n=this.getElapsed()/1e3;if(this.loop&&this.loopEnd>this.loopStart){let i=this.loopEnd-this.loopStart;n=this.loopStart+(n-this.loopStart)%i}if(this.isPlaying=!1,e>0){let i=this.context.currentTime;this.output.gain.setValueAtTime(this.output.gain.value,i),this.output.gain.linearRampToValueAtTime(0,i+e),setTimeout(()=>{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n,this.output.gain.setValueAtTime(1,this.context.currentTime)},e*1e3)}else{if(this.source){this.source.onended=null;try{this.source.stop()}catch{}}this.pauseTime=n}}getElapsed(){return this.isPlaying?(this.context.currentTime-this.startTime)*this.playbackRate*1e3:this.pauseTime*1e3}setSpeed(e){if(e<=0)throw new Error("Playback rate must be positive");let n=this.getElapsed()/1e3;this.playbackRate=e,this.isPlaying&&(this.pause(),this.pauseTime=n,this.play())}setLoop(e=!0){this.loop=e,this.source&&(this.source.loop=e)}loop;playbackRate;startTime;tempGain=null;connect(e,n=0,i=0){if("value"in e)this.output.connect(e,n);else return this.output.connect(e,n,i),e}disconnect(e,n,i){e===void 0?this.output.disconnect():this.output.disconnect(e,n,i)}output;stop(e=0){if(this.notIndependent)return this.pause();if(!this.source)return;let n=this.context.currentTime+e;this.source.stop(n),this.isPlaying=!1,this.notIndependent||(this.pauseTime=0)}pauseTime;isPlaying;notIndependent=!1;loopStart=0;loopEnd=0},Ke={osc:{enabled:!0,type:"sine",freq:440,detune:0},noise:{enabled:!1,level:.5},ampEnv:{attack:.005,decay:.1,sustain:0,release:.1,volume:.3},pitchEnv:{amount:0,decay:.2},filter:{enabled:!1,type:"lowpass",freq:1200,Q:1,envAmount:0,decay:.2},lfo:{enabled:!1,target:"freq",rate:8,depth:20},duration:.4},A=class r{constructor(e={}){this.ctx=U.audioCtx,this.cfg=structuredClone(Ke),Object.assign(this.cfg,e)}ctx;cfg;play(e=U.sfxGain){let n=this.ctx,i=n.currentTime,s=this.cfg,o=n.createGain();o.gain.setValueAtTime(1e-4,i);let c=s.ampEnv;o.gain.exponentialRampToValueAtTime(c.volume,i+c.attack),o.gain.exponentialRampToValueAtTime(Math.max(1e-4,c.sustain*c.volume),i+c.attack+c.decay),o.gain.exponentialRampToValueAtTime(1e-4,i+s.duration+c.release);let d=o,u;s.filter.enabled&&(u=n.createBiquadFilter(),u.type=s.filter.type,u.frequency.value=s.filter.freq,u.Q.value=s.filter.Q,u.connect(o),d=u);let h;if(s.osc.enabled){if(h=n.createOscillator(),h.type=s.osc.type,h.frequency.value=s.osc.freq,h.detune.value=s.osc.detune,s.pitchEnv.amount!==0){let a=Math.pow(2,s.pitchEnv.amount/12);h.frequency.exponentialRampToValueAtTime(s.osc.freq*a,i+s.pitchEnv.decay)}h.connect(d),h.start(i),h.stop(i+s.duration+c.release)}let f;if(s.noise.enabled){let a=n.sampleRate*s.duration,l=n.createBuffer(1,a,n.sampleRate),p=l.getChannelData(0);for(let y=0;y<a;y++)p[y]=(Math.random()*2-1)*s.noise.level;f=n.createBufferSource(),f.buffer=l,f.connect(d),f.start(i),f.stop(i+s.duration+c.release)}let b,g;s.lfo.enabled&&h&&(b=n.createOscillator(),b.frequency.value=s.lfo.rate,g=n.createGain(),g.gain.value=s.lfo.depth,b.connect(g),s.lfo.target==="freq"?g.connect(h.frequency):s.lfo.target==="gain"?g.connect(o.gain):s.lfo.target==="filter"&&u&&g.connect(u.frequency),b.start(i),b.stop(i+s.duration)),o.connect(e);let x=[h,f,b,g,u,o],t=i+s.duration+c.release;setTimeout(()=>{x.forEach(a=>a?.disconnect())},(t-n.currentTime)*1e3)}getConfig(){return structuredClone(this.cfg)}setConfig(e){return Object.assign(this.cfg,e),this}getKey(e){return this.cfg[e]}setKey(e,n){return Object.assign(this.cfg[e],n),this}setFreq(e){return this.cfg.osc.freq=e,this}setWave(e){return this.cfg.osc.type=e,this}setVolume(e){return this.cfg.ampEnv.volume=e,this}setAmpEnv(e,n,i,s){return Object.assign(this.cfg.ampEnv,{attack:e,decay:n,sustain:i,release:s}),this}setPitchEnv(e,n){return Object.assign(this.cfg.pitchEnv,{amount:e,decay:n}),this}setNoiseEnabled(e){return this.cfg.noise.enabled=e,this}setNoiseLevel(e){return this.cfg.noise.level=e,this}setFilterEnabled(e){return this.cfg.filter.enabled=e,this}setFilter(e,n,i){return Object.assign(this.cfg.filter,{type:e,freq:n,Q:i,enabled:!0}),this}setLFOEnabled(e){return this.cfg.lfo.enabled=e,this}setLFO(e,n,i){return Object.assign(this.cfg.lfo,{target:e,rate:n,depth:i,enabled:!0}),this}setDuration(e){return this.cfg.duration=e,this}clone(){return new r(structuredClone(this.cfg))}},Te=new A({osc:{enabled:!0,type:"square",freq:900,detune:0},ampEnv:{attack:.002,decay:.04,sustain:0,release:.02,volume:.15},duration:.05}),Se=new A({osc:{enabled:!0,type:"sine",freq:600,detune:0},ampEnv:{attack:.01,decay:.08,sustain:0,release:.04,volume:.12},duration:.1}),Ie=new A({osc:{enabled:!0,type:"triangle",freq:500,detune:0},pitchEnv:{amount:12,decay:.15},ampEnv:{attack:.01,decay:.12,sustain:0,release:.05,volume:.25},duration:.18}),Fe=new A({osc:{enabled:!0,type:"sawtooth",freq:1200,detune:0},pitchEnv:{amount:-24,decay:.3},ampEnv:{attack:.005,decay:.25,sustain:0,release:.05,volume:.3},duration:.35}),Pe=new A({osc:{enabled:!0,type:"square",freq:180,detune:0},noise:{enabled:!0,level:.4},ampEnv:{attack:.002,decay:.15,sustain:0,release:.05,volume:.35},duration:.2}),qe=new Map([["ui_click",Te],["ui_hover",Se],["jump",Ie],["laser",Fe],["hit",Pe]]);function Be(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(r)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}function ie(r=12){let e=Date.now().toString(36),n=crypto.getRandomValues(new Uint8Array(4)),i=Array.from(n).map(s=>s.toString(36).padStart(2,"0")).join("");return(e+i).slice(0,r)}var pe=class{peer=null;key;events={};mbAcc=0;connected=!1;constructor(){this.key=`${Me()}_${Date.now()}`}connect(e){e&&(this.peer=e,e.peer=this,this.connected=!0,e.connected=!0),this._emit("open")}isConnected(){return this.connected&&!!this.peer}on(e,n){this.events[e]||(this.events[e]=[]),this.events[e].push(n)}off(e,n){this.events[e]&&(this.events[e]=this.events[e].filter(i=>i!==n))}_emit(e,n){this.events[e]?.forEach(i=>i(n))}send(e,n){if(!this.peer)throw new Error("No peer connected");this.peer._receive(e,n)}_receive(e,n){e?this._emit(e,n):this._emit("message",n)}close(){if(this.connected=!1,this.peer){let e=this.peer;this.peer=null,e.peer=null,e.connected=!1,e._emit("close")}this._emit("close")}getKey(){return this.key}};function Me(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function"){let r=new Uint8Array(16);return crypto.getRandomValues(r),r[6]=r[6]&15|64,r[8]=r[8]&63|128,[...r].map(e=>e.toString(16).padStart(2,"0")).join("").replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/,"$1-$2-$3-$4-$5")}return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,r=>{let e=Math.random()*16|0;return(r==="x"?e:e&3|8).toString(16)})}function Ae(r){let e=!0;function n(){e&&(r(),requestAnimationFrame(n))}return requestAnimationFrame(n),{clear:()=>e=!1}}function _e(r,e,n,i,s){let o=Math.cos(s),c=Math.sin(s),d=[];if(o!==0){let u=(0-r)/o,h=e+u*c;u>0&&h>=0&&h<=i&&d.push({side:"left",t:u})}if(o!==0){let u=(n-r)/o,h=e+u*c;u>0&&h>=0&&h<=i&&d.push({side:"right",t:u})}if(c!==0){let u=(0-e)/c,h=r+u*o;u>0&&h>=0&&h<=n&&d.push({side:"top",t:u})}if(c!==0){let u=(i-e)/c,h=r+u*o;u>0&&h>=0&&h<=n&&d.push({side:"bottom",t:u})}return d.length===0?null:(d.sort((u,h)=>u.t-h.t),d[0])}function Le(r,e){let n;switch(e){case"left":case"right":n=Math.PI-r;break;case"top":case"bottom":n=2*Math.PI-r;break}return(n%(2*Math.PI)+2*Math.PI)%(2*Math.PI)}function We(r,e,n,i,s){let o=_e(r,e,n,i,s);return o?{...o,avoidAngle:Le(s,o.side)}:null}function Ve(){return B?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}var Ye=Ve();var Y={};ve(Y,{KaylaContext:()=>se,KaylaFragment:()=>dt,KaylaInternals:()=>D,KaylaRect:()=>_,createContext:()=>et,createElement:()=>Ze,createGame:()=>je,createReassignableObject:()=>ft,createRenderer:()=>Je,createScene:()=>Qe,createUseHook:()=>yt,self:()=>ye,setLogLevel:()=>mt,useClick:()=>it,useContext:()=>ct,useCurrentGame:()=>ot,useCurrentRenderer:()=>ut,useCurrentScene:()=>lt,useCurrentTicker:()=>ht,useDisposableRef:()=>pt,useEffect:()=>be,useEntity:()=>at,useExports:()=>le,useFiber:()=>Ge,useFiberControl:()=>ge,useGlobalClick:()=>De,useInitialization:()=>ae,useNextStack:()=>xe,usePaint:()=>ue,useRect:()=>oe,useRef:()=>me,useSelf:()=>V,useShouldRefresh:()=>nt,useState:()=>tt,useTick:()=>st,useViewportEffect:()=>rt});function je({width:r,height:e,updateHz:n="frames"}){return new D.KaylaGame(r,e,n==="frames"?1/0:n)}function Qe(r){let e=new O(r);return new D.KaylaScene(e)}function Je(r){return new D.KaylaRenderer(r)}function Ze(r,e){if(typeof r!="function")throw new Error("Invalid Element Type.");let n=e??{};return n.key??=r.name+"_"+ie(),{type:r,props:n}}var _;(i=>{function r(s,o){return!(s.right<o.left||s.left>o.right||s.bottom<o.top||s.top>o.bottom)}i.rawCollision=r;function e(s,o,c){let d=o*Math.PI/180,u=Math.cos(d),h=Math.sin(d),f=1/0;return u>0&&(f=Math.min(f,(c.right-s.x)/u)),u<0&&(f=Math.min(f,(c.left-s.x)/u)),h>0&&(f=Math.min(f,(c.bottom-s.y)/h)),h<0&&(f=Math.min(f,(c.top-s.y)/h)),M.from(o).scale(f)}i.getCurrToBound=e;function n(s){let{left:o,right:c,top:d,bottom:u,width:h,height:f,x:b=0,y:g=0}=s;if(h===null||f===null)throw new Error("width and height are required");let x,t;if(o!=null&&c!=null){if(Math.abs(c-o-h)>1e-6)throw new Error("left, right, and width mismatch");x=o}else b!=null?x=b-h/2:o!=null?x=o:c!=null?x=c-h:x=0;if(d!=null&&u!=null){if(Math.abs(u-d-f)>1e-6)throw new Error("top, bottom, and height mismatch");t=d}else g!=null?t=g-f/2:d!=null?t=d:u!=null?t=u-f:t=0;return{left:x,right:x+h,top:t,bottom:t+f,width:h,height:f,x:x+h/2,y:t+f/2}}i.createRawRect=n})(_||={});var D;(g=>{class r extends X{#e;#t;constructor(t,a,l){super(t,a,l),this.#e=new Set,this.#t=!1}delay(t){return this.ticker.createTimeout(t)}get started(){return this.#t}start(){if(!this.#t){for(let t of this.#e)t.start();this.#t=!0,super.start()}}stop(){if(this.#t){for(let t of this.#e)t.stop();this.#t=!1,super.stop()}}addRenderer(t){this.#e.has(t)||(this.#e.add(t),this.#t&&t.start(),t.game=this)}get mainRenderer(){return[...this.#e].at(0)}getRenderers(){return[...this.#e]}deleteRenderer(t){this.#e.has(t)&&(this.#e.delete(t),this.#t&&t.stop(),delete t.game)}}g.KaylaGame=r;class e extends N{game;pointerX;pointerY;pointerEvents;constructor(t){super(t),this.useDraw=this.useDraw.bind(this),this.on("draw",a=>{if(this.game)for(let l of this.game.scenes.values())l.handleDraw(a)}),this.pointerX=0,this.pointerY=0,this.pointerEvents=new T,this.pointerPosUpdater=this.pointerPosUpdater.bind(this),this.onPointerDown=this.onPointerDown.bind(this)}pointerPosUpdater(t){this.pointerX=t.clientX,this.pointerY=t.clientY}onPointerDown(t){this.pointerPosUpdater(t);let a=e.getClickType(t);if(a!=="invalid"){t.preventDefault();let l=this.getMousePos();this.pointerEvents.emit("down",l,a)}}static getClickType(t){switch(t.button){case 0:return"left";case 1:return"middle";case 2:return"right";default:return"invalid"}}listenPointerUpdates(){this.canvas.addEventListener("pointermove",this.pointerPosUpdater),this.canvas.addEventListener("pointerdown",this.onPointerDown)}unlistenPointerUpdates(){this.canvas.removeEventListener("pointermove",this.pointerPosUpdater),this.canvas.removeEventListener("pointerdown",this.onPointerDown)}pointerPosToWorldPos(t,a){let l=this.canvas.getBoundingClientRect(),p=(t-l.left)/l.width,y=(a-l.top)/l.height,w=p*this.viewportWidth*this.cameraWidth/l.width,k=y*this.viewportHeight*this.cameraHeight/l.height;return new M(w,k)}getMousePos(){return this.pointerPosToWorldPos(this.pointerX,this.pointerY)}useDraw(t){let a=l=>{t(l,new i)};return this.on("draw",a),()=>{this.off("draw",a)}}attachTo(t){t.addRenderer(this),this.game=t}detach(){this.game&&this.game.deleteRenderer(this)}}g.KaylaRenderer=e;class n{current;saves;constructor(){this.saves=[]}useTick(t){if(!this.current)throw new Error("Hook 'useTick' must be executed in the top level scope of a component.");this.current.onTick[this.current.useStepCallIndex]=t,this.current.useStepCallIndex++}usePaint(t){if(!this.current)throw new Error("Hook 'usePaint' must be executed in the top level scope of a component.");this.current.onPaint[this.current.useDrawCallIndex]=t,this.current.useDrawCallIndex++}useEntity(){if(!this.current)throw new Error("Hook 'useEntity' must be executed in the top level scope of a component.");return me(ye)}useSelf(t){if(!this.current)throw new Error("Hook 'useSelf' must be executed in the top level scope of a component.");let a=me(null);return(a.current===null||a.current===void 0)&&(a.current=t()),a.current}useInitialization(t){if(!this.current)throw new Error("Hook 'useInitialization' must be executed in the top level scope of a component.");let a=this.current;a.onInits[this.current.useInitCallIndex]=t,a.useInitCallIndex++}useRect(){if(!this.current)throw new Error("Hook 'useRect' must be executed in the top level scope of a component.");return V(()=>new g.KaylaInternalRect(this.current))}useFiber(){if(!this.current)throw new Error("Hook 'useFiber' must be executed in the top level scope of a component.");return V(()=>this.current)}useFiberControl(){if(!this.current)throw new Error("Hook 'useFiberControl' must be executed in the top level scope of a component.");let t=this.current;return V(()=>({refresh:()=>t.refresh(),get childrenCount(){return t.lastChildren.length},setMaxChildren:a=>{t.setMaxChildren(a)},getMaxChildren:()=>t.getMaxChildren(),get maxSafeChildren(){return t.maxSafeChildren},get key(){return t.key},get getChildrenEntities(){return t.getChildrenEntities.bind(t)},get getEntityChain(){return t.getEntityChain.bind(t)},get getFiberChain(){return t.getFiberChain.bind(t)}}))}useCurrentTicker(){if(!this.current)throw new Error("Hook 'useCurrentTicker' must be executed in the top level scope of a component.");return this.current.getAttachedGame().ticker}useCurrentRenderer(){if(!this.current)throw new Error("Hook 'useCurrentRenderer' must be executed in the top level scope of a component.");return this.current.getAttachedGame().mainRenderer}useCurrentGame(){if(!this.current)throw new Error("Hook 'useCurrentGame' must be executed in the top level scope of a component.");return this.current.getAttachedGame()}useCurrentScene(){if(!this.current)throw new Error("Hook 'useCurrentScene' must be executed in the top level scope of a component.");return this.current.scene}useState(t,{alwaysRecall:a=!1}={}){if(!this.current)throw new Error("Hook 'useState' must be executed in the top level scope of a component.");let p=this.current.state[this.current.useStateCallIndex]??new s(this.current,t,{alwaysRecall:a});return this.current.state[this.current.useStateCallIndex]=p,this.current.useStateCallIndex++,p}useShouldRefresh(t){let a=this.current;if(!a)throw new Error("useShouldRefresh must be called inside a component");a.watchedDeps&&console.warn("useShouldRefresh called multiple times \u2014 using the last call"),a.watchedDeps=t}useRef(t){if(!this.current)throw new Error("Hook 'useRef' must be executed in the top level scope of a component.");let l=this.current.refs[this.current.useRefCallIndex]??c(t??null);return this.current.refs[this.current.useRefCallIndex]=l,this.current.useRefCallIndex++,l}useEffect(t){if(!this.current)throw new Error("Hook 'useEffect' must be executed in the top level scope of a component.");this.current.onEffect[this.current.useEffectCallIndex]=t,this.current.useEffectCallIndex++}useViewportEffect(t){if(!this.current)throw new Error("Hook 'useViewport' must be executed in the top level scope of a component.");this.current.onViewportEffect[this.current.useViewCallIndex]=t,this.current.useViewCallIndex++}useExports(t,a){if(!this.current)throw new Error("Hook 'useExports' must be executed in the top level scope of a component.");this.current.onExport=a}useGlobalClick(t){if(!this.current)throw new Error("Hook 'useGlobalClick' must be executed in the top level scope of a component.");this.current.onGlobalClick[this.current.useGlobalClickCallIndex]=t,this.current.useGlobalClickCallIndex++}useClick(t){if(!this.current)throw new Error("Hook 'useClick' must be executed in the top level scope of a component.");let a=this.current;De((l,p)=>{let y=a.entity;if(!y)return;let w=y.getRawRect(),k=_.createRawRect({x:l.x,y:l.y,width:3,height:3});_.rawCollision(w,k)&&t(l,p)})}useContext(t){if(!this.current)throw new Error("Hook 'useContext' must be executed in the top level scope of a component.");return this.current.findContextValueFromInst(t)}save(){this.saves.push({current:this.current})}restore(){let t=this.saves.pop();if(!t)throw new Error("Cannot restore without saving.");this.current=t.current}logLevel="warn";logger={debug:(...t)=>{this.logLevel==="debug"&&console.debug(...t)},info:(...t)=>{["info","warn","debug"].includes(this.logLevel)&&console.info(...t)},warn:(...t)=>{["warn","debug"].includes(this.logLevel)&&console.warn(...t)},error:(...t)=>console.error(...t),withFiber:(t,a,l,...p)=>{let y=t?.fc?.name||"anonymous",w=t?.key?` key=${t.key}`:"";this.logger[a](`${l} <${y}${w}>`,...p)}}}g.GlobalKayla=n;class i{preventDefault(){this.#e=!0}#e=!1;isPrevented(){return this.#e}}g.KaylaEvent=i;class s{#e;#t;#n;alwaysRecall;constructor(t,a,{alwaysRecall:l=!1}={}){this.#t=t,this.#e=a??void 0,this.#n=Date.now(),this.alwaysRecall=l}get(){return this.#e}*[Symbol.iterator](){throw new Error(`Hey! KaylaState is NOT an array / iterable like useState in React.
|
|
2
2
|
You probably wrote: const [value, setValue] = useState(...)
|
|
3
3
|
|
|
4
4
|
\u2192 In Kayla write: const value = useState(...);
|
|
5
|
-
\u2192 Then: value.get() / value.set(v) / value.add(n)`)}refreshBased(){return[this.set.bind(this),this.get()]}add(t,{recall:a}={}){this.set(this.get()+t,{recall:a})}multiply(t,{recall:a}={}){this.set(this.get()*t,{recall:a})}set(t,{recall:a=!1}={}){let h=this.#e;if(t===h)return;this.#e=t;let g=Date.now()-this.#n;a&&g<67&&this.#t.global.logger.warn(`Hot structural state change <${this.#t.fc?.name||"anonymous"}> delta=${g}ms`),(a||this.alwaysRecall)&&this.#t.refresh(),this.#n=Date.now()}get value(){return this.#e}get lastChanged(){return this.#n}}b.KaylaInternalState=s;class o{#e;constructor(t){this.#e=t??void 0}#t;setSetter(t){this.#t=t}get current(){return this.#e}set current(t){this.#e=t,this.#t&&this.#t(this.#e)}}b.KaylaInternalRef=o;function d(x){return new o(x)}b.createReassignableRef=d;class f{state;refs;global;callProps;scene;exports;detectedParent;contextInfo;get childrenCount(){return this.lastChildren.length}maxSafeChildren;constructor(t,a,h){if(!h)throw new Error("Empty element");this.maxSafeChildren=40,this.scene=a,this.state=[],this.refs=[],this.fc=h.type,this.callProps=h.props??{},this.global=t,this.lastStateDeps=[],this.entity=null,this.lastChildren=[],this.onEffect=[],this.onUnEffect=[],this.onPaint=[],this.onTick=[],this.onGlobalClick=[],this.pointerHook=this.pointerHook.bind(this),this.contextInfo=null,this.detectedParent=null}getChildrenEntities(){return this.lastChildren.map(t=>t.entity)}pointerHook(t,a){try{for(let h of this.onGlobalClick)h(t,a)}catch(h){this.global.logger.error(h)}}bindEvents(){for(let t of[this.getAttachedRenderer()])t&&t.pointerEvents.on("down",this.pointerHook)}unbindEvents(){for(let t of[this.getAttachedRenderer()])t&&t.pointerEvents.off("down",this.pointerHook)}get key(){return this.callProps.key}set key(t){this.callProps.key=t}get children(){return this.callProps.children}set children(t){this.callProps.children=t}entity;onExport=()=>({});onEffect;onGlobalClick;onInit;onUnInit;onUnEffect;onEffectDeps;onPaint;onTick;fc;useStateCallIndex=0;useEffectCallIndex=0;useGlobalClickCallIndex=0;useDrawCallIndex=0;useStepCallIndex=0;useRefCallIndex=0;lastStateDeps;watchedDeps;lastDepStamps=[];getAttachedRenderer(){return this.getAttachedGame().mainRenderer}getAttachedGame(){return this.scene.getGame()}setMaxChildren(t){if(this.maxSafeChildren=Math.max(0,t),this.global.logger.debug(`Max children limit updated to ${t} for <${this.fc?.name||"anonymous"} key=${this.key}>`),this.lastChildren.length>this.maxSafeChildren){let a=this.lastChildren.length-this.maxSafeChildren;this.global.logger.warn(`Child limit exceeded (${this.lastChildren.length} > ${this.maxSafeChildren}) \u2014 removing ${a} oldest children <${this.fc?.name||"anonymous"} key=${this.key}>`);let h=this.lastChildren.slice(0,this.maxSafeChildren),c=this.lastChildren.slice(this.maxSafeChildren);this.lastChildren=h;for(let g of c)g.unuse()}}getMaxChildren(){return this.maxSafeChildren??1/0}getFiberChain(){let t=[],a=this.detectedParent;for(;a;)t.push(a),a=a?.detectedParent;return t}getContextChain(){return this.getFiberChain().map(t=>t.contextInfo).filter(Boolean)}findContextValueFromInst(t){return this.getContextChain().find(a=>a.instance===t)?.value}getEntityChain(){return this.getFiberChain().map(t=>t.entity)}shouldFullRefresh(){if(this.isFirstUse||!this.watchedDeps||this.watchedDeps.length===0)return!0;for(let t=0;t<this.watchedDeps.length;t++){let a=this.watchedDeps[t],h=this.lastDepStamps[t]??0;if(a.lastChanged>h)return!0}return!1}captureDepStamps(){this.watchedDeps&&(this.lastDepStamps=this.watchedDeps.map(t=>t.lastChanged))}refresh(){if(!this.shouldFullRefresh())return;let t=this.fc?.name||"anonymous";if(!this.shouldFullRefresh()){this.global.logger.debug(`Refresh skipped <${t} key=${this.key}>`);return}this.global.logger.debug(`Refresh executed <${t} key=${this.key}> reason=${this.isFirstUse?"first":"deps-changed"}`),this.lastChildren.length>this.maxSafeChildren&&this.global.logger.warn(`High child count <${t} key=${this.key}> children=${this.lastChildren.length}`);let a;this.global.save(),this.global.current=this,this.useStateCallIndex=0,this.useRefCallIndex=0;let h=[];try{let c=this.fc(this.callProps)??[];if(c&&!Array.isArray(c)&&(c=[c]),!Array.isArray(c))throw new Error("Non array or non undefined children received.");for(let g of c)if(g.type===this.fc)throw new Error("Circular Component.");h=c}catch(c){a=c}this.useStateCallIndex=0,this.useRefCallIndex=0,this.useDrawCallIndex=0,this.useStepCallIndex=0,this.useEffectCallIndex=0,this.useGlobalClickCallIndex=0,this.global.restore();try{let c=0,g=[];for(let w of h){let C=this.lastChildren.at(c)??new f(this.global,this.scene,w);this.lastChildren[c]=C,C.detectedParent=this,g.push(C),c++}this.captureDepStamps(),this.use();for(let w of this.lastChildren.filter(C=>!g.includes(C))){let C=this.lastChildren.indexOf(w);C!==1&&this.lastChildren.splice(C,1),w.unuse()}for(let w of this.lastChildren)try{w.refresh()}catch(C){console.error(C)}}catch(c){console.error(c)}if(a)throw a}lastChildren;isFirstUse=!0;use(){try{let t=!0;if(this.lastStateDeps??=[],Array.isArray(this.onEffectDeps)&&(t=this.onEffectDeps.some((a,h)=>{let c=this.lastStateDeps.at(h);if(c){let g=a.lastChanged,w=c.stamp;return g>w}})),t||this.isFirstUse){this.key??=this.fc.name+"_"+fe(),this.global.logger.debug(`Using <${this.fc?.name||"anonymous"} key=${this.key}> count=${this.onEffect.length}`);let a=this.isFirstUse;this.isFirstUse=!1,Array.isArray(this.onEffectDeps)&&(this.lastStateDeps=this.onEffectDeps.map(c=>({stamp:c.lastChanged,stateRef:c}))),this.entity&&this.scene.getScene().removeEntity(this.entity),this.entity&&this.entity.name!==this.key&&(this.entity=null),this.entity=this.entity??new u(this,this.key);for(let c of this.refs)c.current===me&&(c.current=this.entity);if(this.callProps.ref instanceof o&&(this.callProps.ref.current=this.entity),this.exports=this.onExport(),this.callProps.exportsRef instanceof o&&(this.callProps.exportsRef.current=this.exports),this.entity&&this.entity!==this.entity&&this.global.logger.warn(`Entity name mismatch during refresh <${this.fc?.name} key=${this.key}>`),this.scene.getScene().addEntity(this.entity),a&&this.onInit){this.bindEvents();try{let c=this.onInit();typeof c=="function"&&(this.onUnInit=c)}catch(c){throw this.global.logger.error("Initialization failed",this.fc?.name||"anonymous",c),c}}try{for(let c of this.onUnEffect??[])c()}catch(c){console.error(c)}let h=this.onEffect.map(c=>c()).filter(c=>c!==void 0);this.onUnEffect=h}}catch(t){throw this.global.logger.error(`use() failed <${this.fc?.name||"anonymous"} key=${this.key}>`,t),t}}unuse(){this.global.logger.debug(`unuse called <${this.fc?.name||"anonymous"} key=${this.key}> children=${this.lastChildren.length}`),this.watchedDeps=void 0,this.lastDepStamps=[],this.unbindEvents();try{this.onUnInit&&this.onUnInit();for(let t of this.onUnEffect)t()}catch(t){this.global.logger.error(`Cleanup failed in unuse <${this.fc?.name||"anonymous"} key=${this.key}>`,t)}this.scene.getScene().removeEntity(this.entity);for(let t of this.lastChildren)t.unuse();this.lastChildren.length=0}}b.KaylaFiber=f;class u extends X{#e;flags;getRawRect(){return A.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}getFiber(){return this.#e}constructor(t,a){super(a,0,0,0,0),this.#e=t,this.flags=new Map}setFlag(t,a){return this.flags.set(t,a)}getFlag(t){return this.flags.get(t)}removeFlag(t){return this.flags.delete(t)}update(t){let a=new i;if(this.#e&&this.#e.onTick)for(let h of this.#e.onTick)h(t,a);a.isPrevented()}draw(t){let a=new i;if(this.#e&&this.#e.onPaint)for(let h of this.#e.onPaint)h(t,a);a.isPrevented()||super.draw(t)}getRect(){return new l(this.getFiber())}}b.KaylaRectEntity=u;class l{#e;constructor(t){this.#e=t}getRaw(){return A.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}get entity(){return this.#e.entity??null}#t(){if(!this.#e)throw new Error("No fibers found.");if(!this.entity)throw new Error("The entity does NOT exist yet.")}isCollidingWith(t){return this.#t(),this.entity.isCollidingWith(t.entity)}get setFlag(){return this.#t(),this.entity.setFlag.bind(this.entity)}get getFlag(){return this.#t(),this.entity.getFlag.bind(this.entity)}get removeFlag(){return this.#t(),this.entity.removeFlag.bind(this.entity)}isHovered(){let t=this.getRaw(),a=this.#e.getAttachedRenderer().getMousePos(),h=A.createRawRect({x:a.x,y:a.y,width:3,height:3});return A.rawCollision(t,h)}get pos(){return this.#t(),this.entity.pos}get x(){return this.#t(),this.pos.x}set x(t){this.#t(),this.pos.x=t}get y(){return this.#t(),this.pos.y}set y(t){this.#t(),this.pos.y=t}get width(){return this.#t(),this.entity.width}set width(t){this.#t(),this.entity.width=t}get height(){return this.#t(),this.entity.height}set height(t){this.#t(),this.entity.height=t}get z(){return this.#t(),this.entity.z}set z(t){this.#t(),this.entity.z=t}get left(){return this.#t(),this.entity.left}set left(t){this.#t(),this.entity.left=t}get right(){return this.#t(),this.entity.right}set right(t){this.#t(),this.entity.right=t}get top(){return this.#t(),this.entity.top}set top(t){this.#t(),this.entity.top=t}get bottom(){return this.#t(),this.entity.bottom}set bottom(t){this.#t(),this.entity.bottom=t}get toLocal(){return this.entity.toLocal.bind(this.entity)}get toWorld(){return this.entity.toWorld.bind(this.entity)}}b.KaylaInternalRect=l;class p{constructor(t){this.#t=t,this.#e=null,t.on("update",this.tickHandler.bind(this)),this.drawHandler=this.drawHandler.bind(this)}#e;#t;getFibers(){return this.getEntities().map(t=>t.getFiber())}getEntities(){return Array.from(this.getScene().entities.values())}getScene(){return this.#t}getGame(){return this.#e}drawHandler(t){return this.#t.handleDraw(t)}attachTo(t){t.addScene(this.#t),this.#e=t}async spawn(t){let a=this.createFiber(t);await this.#e.delay(0),a.refresh()}createFiber(t){return new f(b.singleGlobalInstance,this,t)}detach(){this.#e&&this.#e.removeScene(this.#t)}tickHandler(){}}b.KaylaScene=p,b.singleGlobalInstance=new b.GlobalKayla})(D||={});var re=class{#e;constructor(e){this.Provider=this.#t.bind(this),this.#e=e}get defaultValue(){return this.#e}#t({value:e=this.defaultValue,children:n}){let i=De();return ie(()=>{i.contextInfo={instance:this,value:e}}),oe(this.Provider,()=>({value:e})),n}Provider;Consumer};function Ze(r){return new re(r)}var m=D.singleGlobalInstance,et=m.useState.bind(m),pe=m.useRef.bind(m),tt=m.useShouldRefresh.bind(m),ye=m.useEffect.bind(m),Le=m.useGlobalClick.bind(m),nt=m.useClick.bind(m),ie=m.useInitialization.bind(m),se=m.useRect.bind(m),rt=m.useTick.bind(m),ae=m.usePaint.bind(m),oe=m.useExports.bind(m),L=m.useSelf.bind(m),ge=m.useFiberControl.bind(m),De=m.useFiber.bind(m),it=m.useEntity.bind(m),st=m.useCurrentGame.bind(m),at=m.useCurrentRenderer.bind(m),ot=m.useCurrentScene.bind(m),ut=m.useCurrentTicker.bind(m),lt=m.useContext.bind(m),me=Symbol("self_ref");var be=r=>{Promise.resolve(1).then(()=>{try{r()}catch(e){console.error(e)}})},ht=({children:r})=>Array.isArray(r)?[...r]:r;function ct(r){return D.createReassignableRef(r)}function dt(r){if(typeof r!="object"||typeof r=="function"||r===null)return r;let e={current:r};return new Proxy({},{get(i,s,o){return s==="reassignSelf"?d=>{e.current=d}:Reflect.get(e.current,s,o)},set(i,s,o,d){return Reflect.set(e.current,s,o,d)},has(i,s){return Reflect.has(e.current,s)},ownKeys(i){return Reflect.ownKeys(e.current)},getOwnPropertyDescriptor(i,s){return Reflect.getOwnPropertyDescriptor(e.current,s)},deleteProperty(i,s){return Reflect.deleteProperty(e.current,s)}})}function ft(r){m.logLevel=r}function pt(r){let e=r.name||"anonymous-custom-hook";return function(i){let s=m.current;if(!s)throw new Error(`Custom hook '${e}' must be called inside a Kayla component`);let o=i??{};return r.memoize!==!1?L(()=>(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' initialized (memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))):(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' running (non-memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))}}Reflect.set(globalThis,"Kayla",W);var mt;(n=>(n.Flex=({align:i="stretch",children:s,direction:o="row",gap:d=0,justify:f="start",wrap:u="nowrap",getHeight:l,getWidth:p,getCenterX:y,getCenterY:b,color:x})=>{let t=ge(),a=se(),h=L(()=>({recalc(){let c=Number(d)||0,g=y(),w=b(),C=p(),Ge=l();a.x=g,a.y=w,a.width=C,a.height=Ge;let Ve=t.getChildrenEntities().filter(Boolean).map(v=>v.getRect()).filter(v=>v.getFlag("flex-ignored")!==!0),S=o==="row",F=S?a.width:a.height,gt=S?a.height:a.width,ue=0,$=0,le=[],Y=[];Ve.forEach(v=>{let j=S?v.width:v.height;ue+j>F&&u==="wrap"?(le.push({height:$,items:Y}),Y=[v],ue=j,$=S?v.height:v.width):(Y.push(v),ue+=j+c,$=Math.max($,S?v.height:v.width))}),le.push({height:$,items:Y});let he=0;le.forEach((v,j)=>{let I=v.items,_=I.reduce((R,Q)=>R+(S?Q.width:Q.height),0)+c*(I.length-1),T=0;f==="center"&&(T=(F-_)/2),f==="end"&&(T=F-_),f==="space-between"&&(T=0),f==="space-around"&&(T=(F-_)/(I.length*2)),f==="space-evenly"&&(T=(F-_)/(I.length+1)),I.forEach((R,Q)=>{R.z=a.z+1;let G=S?R.width:R.height,J=S?R.height:R.width,Z=0;i==="center"&&(Z=(v.height-J)/2),i==="end"&&(Z=v.height-J),i==="stretch"&&(S?R.height=v.height:R.width=v.height),S?(R.x=T+G/2,R.y=he+Z+J/2):(R.x=he+Z+J/2,R.y=T+G/2),f==="space-between"&&Q<I.length-1?T+=G+c+(F-_)/(I.length-1):f==="space-around"?T+=G+c+(F-_)/I.length:f==="space-evenly"?T+=G+c+(F-_)/(I.length+1):T+=G+c}),he+=v.height+c})}}));return ae((c,g)=>{g.preventDefault(),c.fillStyle=x,c.fillRect(a.left,a.top,a.width,a.height)}),ye(()=>{be(()=>{h.recalc()})}),oe(n.Flex,()=>({controls:h})),s},n.GenericBox=({color:i,width:s=20,height:o=20,x:d=0,y:f=0})=>{let u=se();ie(()=>{u.width=s,u.height=o,u.x=d,u.y=f}),ae((l,p)=>{p.preventDefault(),l.fillStyle=i,l.fillRect(u.left,u.top,u.width,u.height)})}))(mt||={});var Ct={LEA:B,Kayla:W};export{W as Kayla,B as LEA,Ct as default};
|
|
5
|
+
\u2192 Then: value.get() / value.set(v) / value.add(n)`)}refreshBased(){return[this.set.bind(this),this.get()]}add(t,{recall:a}={}){this.set(this.get()+t,{recall:a})}multiply(t,{recall:a}={}){this.set(this.get()*t,{recall:a})}set(t,{recall:a=!1}={}){let l=this.#e;if(t===l)return;this.#e=t;let y=Date.now()-this.#n;a&&y<67&&this.#t.global.logger.warn(`Hot structural state change <${this.#t.fc?.name||"anonymous"}> delta=${y}ms`),(a||this.alwaysRecall)&&this.#t.refresh(),this.#n=Date.now()}get value(){return this.#e}get lastChanged(){return this.#n}}g.KaylaInternalState=s;class o{#e;constructor(t){this.#e=t??void 0}#t;setSetter(t){this.#t=t}get current(){return this.#e}set current(t){this.#e=t,this.#t&&this.#t(this.#e)}}g.KaylaInternalRef=o;function c(x){return new o(x)}g.createReassignableRef=c;class d{state;refs;global;callProps;scene;exports;detectedParent;contextInfo;get childrenCount(){return this.lastChildren.length}maxSafeChildren;dynamicChildren;constructor(t,a,l){if(!l)throw new Error("Empty element");this.maxSafeChildren=40,this.scene=a,this.state=[],this.refs=[],this.onInits=[],this.onUnInits=[],this.fc=l.type,this.callProps=l.props??{},this.global=t,this.lastStateDeps=[],this.entity=null,this.lastChildren=[],this.onEffect=[],this.onUnEffect=[],this.onPaint=[],this.onTick=[],this.onGlobalClick=[],this.pointerHook=this.pointerHook.bind(this),this.resizeHook=this.resizeHook.bind(this),this.contextInfo=null,this.detectedParent=null,this.dynamicChildren=[],this.key??=this.fc.name+"_"+ie(),this.onViewportEffect=[]}getChildrenEntities(){return this.lastChildren.map(t=>t.entity)}pointerHook(t,a){try{for(let l of this.onGlobalClick)l(t,a)}catch(l){this.global.logger.error(l)}}resizeHook({width:t,height:a}){try{for(let l of this.onViewportEffect)l(this.getAttachedRenderer(),t,a)}catch(l){this.global.logger.error(l)}}bindEvents(){for(let t of[this.getAttachedRenderer()])t&&(t.pointerEvents.on("down",this.pointerHook),t.on("viewport_update",this.resizeHook))}unbindEvents(){for(let t of[this.getAttachedRenderer()])t&&(t.pointerEvents.off("down",this.pointerHook),t.off("viewport_update",this.resizeHook))}get key(){return this.callProps.key}set key(t){this.callProps.key=t}get children(){return this.callProps.children}set children(t){this.callProps.children=t}entity;onExport=()=>({});onEffect;onViewportEffect;onGlobalClick;onInits;onUnInits;onUnEffect;onEffectDeps;onPaint;onTick;fc;useStateCallIndex=0;useEffectCallIndex=0;useGlobalClickCallIndex=0;useDrawCallIndex=0;useStepCallIndex=0;useRefCallIndex=0;useInitCallIndex=0;useViewCallIndex=0;lastStateDeps;watchedDeps;lastDepStamps=[];getAttachedRenderer(){return this.getAttachedGame().mainRenderer}getAttachedGame(){return this.scene.getGame()}setMaxChildren(t){if(this.maxSafeChildren=Math.max(0,t),this.global.logger.debug(`Max children limit updated to ${t} for <${this.fc?.name||"anonymous"} key=${this.key}>`),this.lastChildren.length>this.maxSafeChildren){let a=this.lastChildren.length-this.maxSafeChildren;this.global.logger.warn(`Child limit exceeded (${this.lastChildren.length} > ${this.maxSafeChildren}) \u2014 removing ${a} oldest children <${this.fc?.name||"anonymous"} key=${this.key}>`);let l=this.lastChildren.slice(0,this.maxSafeChildren),p=this.lastChildren.slice(this.maxSafeChildren);this.lastChildren=l;for(let y of p)y.unuse()}}getMaxChildren(){return this.maxSafeChildren??1/0}getFiberChain(){let t=[],a=this.detectedParent;for(;a;)t.push(a),a=a?.detectedParent;return t}getContextChain(){return this.getFiberChain().map(t=>t.contextInfo).filter(Boolean)}findContextValueFromInst(t){return this.getContextChain().find(a=>a.instance===t)?.value}getEntityChain(){return this.getFiberChain().map(t=>t.entity)}shouldFullRefresh(){if(this.isFirstUse||!this.watchedDeps||this.watchedDeps.length===0)return!0;for(let t=0;t<this.watchedDeps.length;t++){let a=this.watchedDeps[t],l=this.lastDepStamps[t]??0;if(a.lastChanged>l)return!0}return!1}captureDepStamps(){this.watchedDeps&&(this.lastDepStamps=this.watchedDeps.map(t=>t.lastChanged))}refresh(){if(!this.shouldFullRefresh())return;let t=this.fc?.name||"anonymous";if(!this.shouldFullRefresh()){this.global.logger.debug(`Refresh skipped <${t} key=${this.key}>`);return}this.global.logger.debug(`Refresh executed <${t} key=${this.key}> reason=${this.isFirstUse?"first":"deps-changed"}`),this.lastChildren.length>this.maxSafeChildren&&this.global.logger.warn(`High child count <${t} key=${this.key}> children=${this.lastChildren.length}`);let a;this.global.save(),this.global.current=this,this.useStateCallIndex=0,this.useRefCallIndex=0,this.useInitCallIndex=0,this.useViewCallIndex=0,this.useStateCallIndex=0,this.useDrawCallIndex=0,this.useStepCallIndex=0,this.useEffectCallIndex=0,this.useGlobalClickCallIndex=0;let l=[];try{let p=this.fc(this.callProps)??[];if(p&&!Array.isArray(p)&&(p=[p]),!Array.isArray(p))throw new Error("Non array or non undefined children received.");for(let y of p)if(y.type===this.fc)throw new Error("Circular Component.");l=p}catch(p){a=p}if(this.global.restore(),this.updateChildren(l,!0),a)throw a}updateChildren(t,a){try{let l=[...t,...this.dynamicChildren],p=[],y=[];for(let w of l){let k=w.props?.key,F;k!=null&&(F=this.lastChildren.find(we=>we.key===k)),F||(F=new d(this.global,this.scene,w)),F.detectedParent=this,y.push(F),p.push(F)}for(let w of this.lastChildren)p.includes(w)||w.unuse();this.lastChildren=y,this.captureDepStamps(),this.use();for(let w of this.lastChildren)try{w.refresh()}catch(k){console.error(k)}}catch(l){console.error(l)}}lastChildren;isFirstUse=!0;use(){try{let t=!0;if(this.lastStateDeps??=[],Array.isArray(this.onEffectDeps)&&(t=this.onEffectDeps.some((a,l)=>{let p=this.lastStateDeps.at(l);if(p){let y=a.lastChanged,w=p.stamp;return y>w}})),t||this.isFirstUse){this.global.logger.debug(`Using <${this.fc?.name||"anonymous"} key=${this.key}> count=${this.onEffect.length}`);let a=this.isFirstUse;this.isFirstUse=!1,Array.isArray(this.onEffectDeps)&&(this.lastStateDeps=this.onEffectDeps.map(p=>({stamp:p.lastChanged,stateRef:p}))),this.entity&&this.scene.getScene().removeEntity(this.entity),this.entity&&this.entity.name!==this.key&&(this.entity=null),this.entity=this.entity??new u(this,this.key);for(let p of this.refs)p.current===ye&&(p.current=this.entity);if(this.callProps.ref instanceof o&&(this.callProps.ref.current=this.entity),this.exports=this.onExport(),this.callProps.exportsRef instanceof o&&(this.callProps.exportsRef.current=this.exports),this.entity&&this.entity!==this.entity&&this.global.logger.warn(`Entity name mismatch during refresh <${this.fc?.name} key=${this.key}>`),this.scene.getScene().addEntity(this.entity),a){this.onUnInits=[];for(let p of this.onInits){this.bindEvents();try{let y=p();typeof y=="function"&&this.onUnInits.push(y)}catch(y){throw this.global.logger.error("Initialization failed",this.fc?.name||"anonymous",y),y}}}try{for(let p of this.onUnEffect??[])p()}catch(p){console.error(p)}let l=this.onEffect.map(p=>p()).filter(p=>p!==void 0);this.onUnEffect=l}}catch(t){throw this.global.logger.error(`use() failed <${this.fc?.name||"anonymous"} key=${this.key}>`,t),t}}unuse(){this.global.logger.debug(`unuse called <${this.fc?.name||"anonymous"} key=${this.key}> children=${this.lastChildren.length}`),this.detectedParent=null,this.watchedDeps=void 0,this.lastDepStamps=[],this.unbindEvents();try{for(let t of this.onUnInits)t();for(let t of this.onUnEffect)t()}catch(t){this.global.logger.error(`Cleanup failed in unuse <${this.fc?.name||"anonymous"} key=${this.key}>`,t)}this.scene.getScene().removeEntity(this.entity);for(let t of this.lastChildren)t.unuse();this.lastChildren.length=0}}g.KaylaFiber=d;class u extends q{#e;flags;getRawRect(){return _.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}getFiber(){return this.#e}constructor(t,a){super(a,0,0,0,0),this.#e=t,this.flags=new Map,this.color="transparent"}setFlag(t,a){return this.flags.set(t,a)}getFlag(t){return this.flags.get(t)}removeFlag(t){return this.flags.delete(t)}update(t){let a=new i;if(this.#e&&this.#e.onTick)for(let l of this.#e.onTick)l(t,a);a.isPrevented()}draw(t){let a=new i;if(this.#e&&this.#e.onPaint)for(let l of this.#e.onPaint)l(t,a);a.isPrevented()||super.draw(t)}getRect(){return new h(this.getFiber())}}g.KaylaRectEntity=u;class h{#e;constructor(t){this.#e=t}get color(){return this.#t(),this.entity.color}set color(t){this.#t(),this.entity.color=t}getRaw(){return _.createRawRect({x:this.x,y:this.y,width:this.width,height:this.height})}get entity(){return this.#e.entity??null}#t(){if(!this.#e)throw new Error("No fibers found.");if(!this.entity)throw new Error("The entity does NOT exist yet.")}isCollidingWith(t){return this.#t(),this.entity.isCollidingWith(t.entity)}get setFlag(){return this.#t(),this.entity.setFlag.bind(this.entity)}get getFlag(){return this.#t(),this.entity.getFlag.bind(this.entity)}get removeFlag(){return this.#t(),this.entity.removeFlag.bind(this.entity)}isHovered(){let t=this.getRaw(),a=this.#e.getAttachedRenderer().getMousePos(),l=_.createRawRect({x:a.x,y:a.y,width:3,height:3});return _.rawCollision(t,l)}get pos(){return this.#t(),this.entity.pos}get x(){return this.#t(),this.pos.x}set x(t){this.#t(),this.pos.x=t}get y(){return this.#t(),this.pos.y}set y(t){this.#t(),this.pos.y=t}get width(){return this.#t(),this.entity.width}set width(t){this.#t(),this.entity.width=t}get height(){return this.#t(),this.entity.height}set height(t){this.#t(),this.entity.height=t}get z(){return this.#t(),this.entity.z}set z(t){this.#t(),this.entity.z=t}get left(){return this.#t(),this.entity.left}set left(t){this.#t(),this.entity.left=t}get right(){return this.#t(),this.entity.right}set right(t){this.#t(),this.entity.right=t}get top(){return this.#t(),this.entity.top}set top(t){this.#t(),this.entity.top=t}get bottom(){return this.#t(),this.entity.bottom}set bottom(t){this.#t(),this.entity.bottom=t}get toLocal(){return this.entity.toLocal.bind(this.entity)}get toWorld(){return this.entity.toWorld.bind(this.entity)}}g.KaylaInternalRect=h;class f{constructor(t){this.#t=t,this.#e=null,t.on("update",this.tickHandler.bind(this)),this.drawHandler=this.drawHandler.bind(this)}#e;#t;getFibers(){return this.getEntities().map(t=>t.getFiber())}getEntities(){return Array.from(this.getScene().entities.values())}getScene(){return this.#t}getGame(){return this.#e}drawHandler(t){return this.#t.handleDraw(t)}attachTo(t){t.addScene(this.#t),this.#e=t}async spawn(t){let a=this.createFiber(t);await this.#e.delay(0),a.refresh()}createFiber(t){return new d(g.singleGlobalInstance,this,t)}detach(){this.#e&&this.#e.removeScene(this.#t)}tickHandler(){}}g.KaylaScene=f,g.singleGlobalInstance=new g.GlobalKayla})(D||={});var se=class{#e;constructor(e){this.Provider=this.#t.bind(this),this.#e=e}get defaultValue(){return this.#e}#t({value:e=this.defaultValue,children:n}){let i=Ge();return ae(()=>{i.contextInfo={instance:this,value:e}}),le(this.Provider,()=>({value:e})),n}Provider;Consumer};function et(r){return new se(r)}var m=D.singleGlobalInstance,tt=m.useState.bind(m),me=m.useRef.bind(m),nt=m.useShouldRefresh.bind(m),be=m.useEffect.bind(m),rt=m.useViewportEffect.bind(m),De=m.useGlobalClick.bind(m),it=m.useClick.bind(m),ae=m.useInitialization.bind(m),oe=m.useRect.bind(m),st=m.useTick.bind(m),ue=m.usePaint.bind(m),le=m.useExports.bind(m),V=m.useSelf.bind(m),ge=m.useFiberControl.bind(m),Ge=m.useFiber.bind(m),at=m.useEntity.bind(m),ot=m.useCurrentGame.bind(m),ut=m.useCurrentRenderer.bind(m),lt=m.useCurrentScene.bind(m),ht=m.useCurrentTicker.bind(m),ct=m.useContext.bind(m),ye=Symbol("self_ref");var xe=r=>{Promise.resolve(1).then(()=>{try{r()}catch(e){console.error(e)}})},dt=({children:r})=>Array.isArray(r)?[...r]:r;function pt(r){return D.createReassignableRef(r)}function ft(r){if(typeof r!="object"||typeof r=="function"||r===null)return r;let e={current:r};return new Proxy({},{get(i,s,o){return s==="reassignSelf"?c=>{e.current=c}:Reflect.get(e.current,s,o)},set(i,s,o,c){return Reflect.set(e.current,s,o,c)},has(i,s){return Reflect.has(e.current,s)},ownKeys(i){return Reflect.ownKeys(e.current)},getOwnPropertyDescriptor(i,s){return Reflect.getOwnPropertyDescriptor(e.current,s)},deleteProperty(i,s){return Reflect.deleteProperty(e.current,s)}})}function mt(r){m.logLevel=r}function yt(r){let e=r.name||"anonymous-custom-hook";return function(i){let s=m.current;if(!s)throw new Error(`Custom hook '${e}' must be called inside a Kayla component`);let o=i??{};return r.memoize!==!1?V(()=>(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' initialized (memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))):(s.global.logLevel==="debug"&&s.global.logger.debug(`Custom hook '${e}' running (non-memoized) <${s.fc?.name||"anonymous"} key=${s.key||"no-key"}>`),r.onUse(s,m,o))}}Reflect.set(globalThis,"Kayla",Y);var bt;(n=>(n.Flex=({align:i="stretch",children:s,direction:o="row",gap:c=0,justify:d="start",wrap:u="nowrap",getHeight:h,getWidth:f,getCenterX:b,getCenterY:g,color:x})=>{let t=ge(),a=oe(),l=V(()=>({recalc(){let p=Number(c)||0,y=b(),w=g(),k=f(),F=h();a.x=y,a.y=w,a.width=k,a.height=F;let He=t.getChildrenEntities().filter(Boolean).map(v=>v.getRect()).filter(v=>v.getFlag("flex-ignored")!==!0),S=o==="row",P=S?a.width:a.height,gt=S?a.height:a.width,he=0,$=0,ce=[],j=[];He.forEach(v=>{let Q=S?v.width:v.height;he+Q>P&&u==="wrap"?(ce.push({height:$,items:j}),j=[v],he=Q,$=S?v.height:v.width):(j.push(v),he+=Q+p,$=Math.max($,S?v.height:v.width))}),ce.push({height:$,items:j});let de=0;ce.forEach((v,Q)=>{let I=v.items,L=I.reduce((E,J)=>E+(S?J.width:J.height),0)+p*(I.length-1),K=0;d==="center"&&(K=(P-L)/2),d==="end"&&(K=P-L),d==="space-between"&&(K=0),d==="space-around"&&(K=(P-L)/(I.length*2)),d==="space-evenly"&&(K=(P-L)/(I.length+1)),I.forEach((E,J)=>{E.z=a.z+1;let G=S?E.width:E.height,Z=S?E.height:E.width,ee=0;i==="center"&&(ee=(v.height-Z)/2),i==="end"&&(ee=v.height-Z),i==="stretch"&&(S?E.height=v.height:E.width=v.height),S?(E.x=K+G/2,E.y=de+ee+Z/2):(E.x=de+ee+Z/2,E.y=K+G/2),d==="space-between"&&J<I.length-1?K+=G+p+(P-L)/(I.length-1):d==="space-around"?K+=G+p+(P-L)/I.length:d==="space-evenly"?K+=G+p+(P-L)/(I.length+1):K+=G+p}),de+=v.height+p})}}));return ue((p,y)=>{y.preventDefault(),p.fillStyle=x,p.fillRect(a.left,a.top,a.width,a.height)}),be(()=>{xe(()=>{l.recalc()})}),le(n.Flex,()=>({controls:l})),s},n.GenericBox=({color:i,width:s=20,height:o=20,x:c=0,y:d=0})=>{let u=oe();ae(()=>{u.width=s,u.height=o,u.x=c,u.y=d}),ue((h,f)=>{f.preventDefault(),h.fillStyle=i,h.fillRect(u.left,u.top,u.width,u.height)})}))(bt||={});var Et={LEA:W,Kayla:Y};export{Y as Kayla,W as LEA,Et as default};
|