From 03beebe133c60ebe4d36c45bf2146719764cb522 Mon Sep 17 00:00:00 2001 From: koneko Date: Mon, 17 Feb 2025 22:40:00 +0000 Subject: [PATCH] deploy: 8267ade85882596292d189e64b13ec59aefe9d4b --- ...-BKkjBxbn.js => SharedSystems-CRmOW3Kq.js} | 2 +- ...-B-VwtzIo.js => WebGLRenderer-D9P4BJeq.js} | 2 +- ...BJsHNgQI.js => WebGPURenderer-DnAx_Qia.js} | 2 +- ...All-CVGpJBCa.js => browserAll-D1aXoOVq.js} | 2 +- ...BiCyqw1t.js => colorToUniform-Bwj443Az.js} | 2 +- assets/gems/Fire/3.png | Bin 0 -> 6394 bytes assets/gems/Fire/4.png | Bin 0 -> 6870 bytes assets/gems/Fire/5.png | Bin 0 -> 6477 bytes assets/gems/Fire/6.png | Bin 0 -> 9076 bytes assets/gems/Fire/7.png | Bin 0 -> 6158 bytes assets/gems/Fire/8.png | Bin 0 -> 5907 bytes assets/gems/Fire/9.png | Bin 0 -> 8259 bytes assets/gui/frame_yellow.png | Bin 0 -> 58027 bytes assets/index-CaN0mmVb.js | 296 ++++++++++++++++++ assets/index-qw10VO79.js | 296 ------------------ assets/json/Gems.json | 38 +-- assets/json/Towers.json | 126 +++++++- assets/missions/02_the_turn.json | 35 ++- assets/projectiles/blue/0.png | Bin 0 -> 10950 bytes assets/projectiles/blue/1.png | Bin 0 -> 10875 bytes assets/projectiles/blue/2.png | Bin 0 -> 11101 bytes assets/projectiles/blue/3.png | Bin 0 -> 10950 bytes assets/projectiles/lightning/0.png | Bin 0 -> 3050 bytes assets/projectiles/lightning/1.png | Bin 0 -> 3110 bytes assets/projectiles/lightning/2.png | Bin 0 -> 3077 bytes assets/projectiles/lightning/3.png | Bin 0 -> 3097 bytes assets/projectiles/red/0.png | Bin 0 -> 12275 bytes assets/projectiles/red/1.png | Bin 0 -> 11115 bytes assets/projectiles/red/2.png | Bin 0 -> 11568 bytes assets/projectiles/red/3.png | Bin 0 -> 12275 bytes assets/projectiles/stone/0.png | Bin 0 -> 1087 bytes assets/projectiles/stone/1.png | Bin 0 -> 1293 bytes .../projectiles/{basic_tower => white}/0.png | Bin .../projectiles/{basic_tower => white}/1.png | Bin .../projectiles/{basic_tower => white}/2.png | Bin .../projectiles/{basic_tower => white}/3.png | Bin .../projectiles/{basic_tower => white}/4.png | Bin .../{circle_tower => yellow}/0.png | Bin .../{circle_tower => yellow}/1.png | Bin .../{circle_tower => yellow}/2.png | Bin .../{circle_tower => yellow}/3.png | Bin assets/towers/buff_tower.png | Bin 0 -> 7901 bytes assets/towers/circle_tower.png | Bin 7248 -> 5727 bytes assets/towers/debuff_tower.png | Bin 0 -> 12474 bytes assets/towers/electric_tower.png | Bin 0 -> 7418 bytes assets/towers/rail_tower.png | Bin 0 -> 10297 bytes assets/towers/strong_tower.png | Bin 0 -> 8762 bytes assets/towers/trapper_tower.png | Bin 0 -> 7662 bytes ...l-CU4P2OK3.js => webworkerAll-ClyFdN3X.js} | 2 +- index.html | 2 +- latest_commit | 2 +- 51 files changed, 474 insertions(+), 333 deletions(-) rename assets/{SharedSystems-BKkjBxbn.js => SharedSystems-CRmOW3Kq.js} (99%) rename assets/{WebGLRenderer-B-VwtzIo.js => WebGLRenderer-D9P4BJeq.js} (99%) rename assets/{WebGPURenderer-BJsHNgQI.js => WebGPURenderer-DnAx_Qia.js} (99%) rename assets/{browserAll-CVGpJBCa.js => browserAll-D1aXoOVq.js} (99%) rename assets/{colorToUniform-BiCyqw1t.js => colorToUniform-Bwj443Az.js} (98%) create mode 100644 assets/gems/Fire/3.png create mode 100644 assets/gems/Fire/4.png create mode 100644 assets/gems/Fire/5.png create mode 100644 assets/gems/Fire/6.png create mode 100644 assets/gems/Fire/7.png create mode 100644 assets/gems/Fire/8.png create mode 100644 assets/gems/Fire/9.png create mode 100644 assets/gui/frame_yellow.png create mode 100644 assets/index-CaN0mmVb.js delete mode 100644 assets/index-qw10VO79.js create mode 100644 assets/projectiles/blue/0.png create mode 100644 assets/projectiles/blue/1.png create mode 100644 assets/projectiles/blue/2.png create mode 100644 assets/projectiles/blue/3.png create mode 100644 assets/projectiles/lightning/0.png create mode 100644 assets/projectiles/lightning/1.png create mode 100644 assets/projectiles/lightning/2.png create mode 100644 assets/projectiles/lightning/3.png create mode 100644 assets/projectiles/red/0.png create mode 100644 assets/projectiles/red/1.png create mode 100644 assets/projectiles/red/2.png create mode 100644 assets/projectiles/red/3.png create mode 100644 assets/projectiles/stone/0.png create mode 100644 assets/projectiles/stone/1.png rename assets/projectiles/{basic_tower => white}/0.png (100%) rename assets/projectiles/{basic_tower => white}/1.png (100%) rename assets/projectiles/{basic_tower => white}/2.png (100%) rename assets/projectiles/{basic_tower => white}/3.png (100%) rename assets/projectiles/{basic_tower => white}/4.png (100%) rename assets/projectiles/{circle_tower => yellow}/0.png (100%) rename assets/projectiles/{circle_tower => yellow}/1.png (100%) rename assets/projectiles/{circle_tower => yellow}/2.png (100%) rename assets/projectiles/{circle_tower => yellow}/3.png (100%) create mode 100644 assets/towers/buff_tower.png create mode 100644 assets/towers/debuff_tower.png create mode 100644 assets/towers/electric_tower.png create mode 100644 assets/towers/rail_tower.png create mode 100644 assets/towers/strong_tower.png create mode 100644 assets/towers/trapper_tower.png rename assets/{webworkerAll-CU4P2OK3.js => webworkerAll-ClyFdN3X.js} (99%) diff --git a/assets/SharedSystems-BKkjBxbn.js b/assets/SharedSystems-CRmOW3Kq.js similarity index 99% rename from assets/SharedSystems-BKkjBxbn.js rename to assets/SharedSystems-CRmOW3Kq.js index c8418fa..4c3e63b 100644 --- a/assets/SharedSystems-BKkjBxbn.js +++ b/assets/SharedSystems-CRmOW3Kq.js @@ -1,4 +1,4 @@ -import{u as We,G as te,v as re,x as Ve,l as se,M as g,E as u,e as D,y as ne,z as _,F as je,R as E,H as ae,I as ie,J as Ne,a as m,S as p,j as B,w as oe,K as $,L as $e,d as q,B as k,k as U,N as M,T as b,O as S,Q as qe,c as Ke,C as w,V as le,W as ue,X as de,Y as ce,Z as Ye,P as Je,h as Xe,b as K,D as he,_ as Y,$ as Qe,a0 as Ze,a1 as et}from"./index-qw10VO79.js";import{S as fe,T as J,B as tt,c as rt}from"./colorToUniform-BiCyqw1t.js";const pe=class A extends We{constructor(e){e={...A.defaultOptions,...e},super(e),this.enabled=!0,this._state=fe.for2d(),this.blendMode=e.blendMode,this.padding=e.padding,typeof e.antialias=="boolean"?this.antialias=e.antialias?"on":"off":this.antialias=e.antialias,this.resolution=e.resolution,this.blendRequired=e.blendRequired,this.addResource("uTexture",0,1)}apply(e,t,r,n){e.applyFilter(this,t,r,n)}get blendMode(){return this._state.blendMode}set blendMode(e){this._state.blendMode=e}static from(e){const{gpu:t,gl:r,...n}=e;let a,i;return t&&(a=te.from(t)),r&&(i=re.from(r)),new A({gpuProgram:a,glProgram:i,...n})}};pe.defaultOptions={blendMode:"normal",resolution:1,padding:0,antialias:"off",blendRequired:!1};let st=pe;var nt=`in vec2 vMaskCoord; +import{u as We,G as te,v as re,x as Ve,l as se,M as g,E as u,e as D,y as ne,z as _,F as je,R as E,H as ae,I as ie,J as Ne,a as m,S as p,j as B,w as oe,K as $,L as $e,d as q,B as k,k as U,N as M,T as b,O as S,Q as qe,c as Ke,C as w,V as le,W as ue,X as de,Y as ce,Z as Ye,P as Je,h as Xe,b as K,D as he,_ as Y,$ as Qe,a0 as Ze,a1 as et}from"./index-CaN0mmVb.js";import{S as fe,T as J,B as tt,c as rt}from"./colorToUniform-Bwj443Az.js";const pe=class A extends We{constructor(e){e={...A.defaultOptions,...e},super(e),this.enabled=!0,this._state=fe.for2d(),this.blendMode=e.blendMode,this.padding=e.padding,typeof e.antialias=="boolean"?this.antialias=e.antialias?"on":"off":this.antialias=e.antialias,this.resolution=e.resolution,this.blendRequired=e.blendRequired,this.addResource("uTexture",0,1)}apply(e,t,r,n){e.applyFilter(this,t,r,n)}get blendMode(){return this._state.blendMode}set blendMode(e){this._state.blendMode=e}static from(e){const{gpu:t,gl:r,...n}=e;let a,i;return t&&(a=te.from(t)),r&&(i=re.from(r)),new A({gpuProgram:a,glProgram:i,...n})}};pe.defaultOptions={blendMode:"normal",resolution:1,padding:0,antialias:"off",blendRequired:!1};let st=pe;var nt=`in vec2 vMaskCoord; in vec2 vTextureCoord; uniform sampler2D uTexture; diff --git a/assets/WebGLRenderer-B-VwtzIo.js b/assets/WebGLRenderer-D9P4BJeq.js similarity index 99% rename from assets/WebGLRenderer-B-VwtzIo.js rename to assets/WebGLRenderer-D9P4BJeq.js index a2c0135..4324ec1 100644 --- a/assets/WebGLRenderer-B-VwtzIo.js +++ b/assets/WebGLRenderer-D9P4BJeq.js @@ -1,4 +1,4 @@ -import{E as l,B as A,w as m,D as S,K,a2 as Ae,v as Be,u as G,a as p,T as $,S as R,O as L,k as H,j as B,l as U,s as z,M as Y,a3 as q,a4 as Ne,a5 as Ie,a6 as Z,a7 as De,e as x,A as ye,R as Ce}from"./index-qw10VO79.js";import{S as O,b as Q}from"./colorToUniform-BiCyqw1t.js";import{e as Ge,G as Ue,c as Oe,b as Pe,U as Fe,R as Me,B as J,d as N,f as Le,S as He,a as we}from"./SharedSystems-BKkjBxbn.js";class ee{constructor(){this._didUpload=!1,this._tempState=O.for2d()}init(e){e.renderer.runners.contextChange.add(this)}contextChange(){this._didUpload=!1}start(e,r,s){const n=e.renderer;n.shader.bind(s,this._didUpload),n.shader.updateUniformGroup(n.globalUniforms.uniformGroup),n.geometry.bind(r,s.glProgram)}execute(e,r){const s=e.renderer;this._didUpload=!0,this._tempState.blendMode=r.blendMode,s.state.set(this._tempState);const n=r.textures.textures;for(let i=0;i(t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER",t))(T||{});class Ve{constructor(e,r){this.buffer=e||null,this.updateID=-1,this.byteLength=-1,this.type=r}}class te{constructor(e){this._gpuBuffers=Object.create(null),this._boundBufferBases=Object.create(null),this._renderer=e}destroy(){this._renderer=null,this._gl=null,this._gpuBuffers=null,this._boundBufferBases=null}contextChange(){this._gpuBuffers=Object.create(null),this._gl=this._renderer.gl}getGlBuffer(e){return this._gpuBuffers[e.uid]||this.createGLBuffer(e)}bind(e){const{_gl:r}=this,s=this.getGlBuffer(e);r.bindBuffer(s.type,s.buffer)}bindBufferBase(e,r){const{_gl:s}=this;if(this._boundBufferBases[r]!==e){const n=this.getGlBuffer(e);this._boundBufferBases[r]=e,s.bindBufferBase(s.UNIFORM_BUFFER,r,n.buffer)}}bindBufferRange(e,r,s){const{_gl:n}=this;s=s||0;const i=this.getGlBuffer(e);n.bindBufferRange(n.UNIFORM_BUFFER,r||0,i.buffer,s*256,256)}updateBuffer(e){const{_gl:r}=this,s=this.getGlBuffer(e);if(e._updateID===s.updateID)return s;s.updateID=e._updateID,r.bindBuffer(s.type,s.buffer);const n=e.data;if(s.byteLength>=e.data.byteLength)r.bufferSubData(s.type,0,n,0,e._updateSize/n.BYTES_PER_ELEMENT);else{const i=e.descriptor.usage&A.STATIC?r.STATIC_DRAW:r.DYNAMIC_DRAW;s.byteLength=n.byteLength,r.bufferData(s.type,n,i)}return s}destroyAll(){const e=this._gl;for(const r in this._gpuBuffers)e.deleteBuffer(this._gpuBuffers[r].buffer);this._gpuBuffers=Object.create(null)}onBufferDestroy(e,r){const s=this._gpuBuffers[e.uid],n=this._gl;r||n.deleteBuffer(s.buffer),this._gpuBuffers[e.uid]=null}createGLBuffer(e){const{_gl:r}=this;let s=T.ARRAY_BUFFER;e.descriptor.usage&A.INDEX?s=T.ELEMENT_ARRAY_BUFFER:e.descriptor.usage&A.UNIFORM&&(s=T.UNIFORM_BUFFER);const n=new Ve(r.createBuffer(),s);return this._gpuBuffers[e.uid]=n,e.on("destroy",this.onBufferDestroy,this),n}}te.extension={type:[l.WebGLSystem],name:"buffer"};const P=class re{constructor(e){this.supports={uint32Indices:!0,uniformBufferObject:!0,vertexArrayObject:!0,srgbTextures:!0,nonPowOf2wrapping:!0,msaa:!0,nonPowOf2mipmaps:!0},this._renderer=e,this.extensions=Object.create(null),this.handleContextLost=this.handleContextLost.bind(this),this.handleContextRestored=this.handleContextRestored.bind(this)}get isLost(){return!this.gl||this.gl.isContextLost()}contextChange(e){this.gl=e,this._renderer.gl=e}init(e){e={...re.defaultOptions,...e};let r=this.multiView=e.multiView;if(e.context&&r&&(m("Renderer created with both a context and multiview enabled. Disabling multiView as both cannot work together."),r=!1),r?this.canvas=S.get().createCanvas(this._renderer.canvas.width,this._renderer.canvas.height):this.canvas=this._renderer.view.canvas,e.context)this.initFromContext(e.context);else{const s=this._renderer.background.alpha<1,n=e.premultipliedAlpha??!0,i=e.antialias&&!this._renderer.backBuffer.useBackBuffer;this.createContext(e.preferWebGLVersion,{alpha:s,premultipliedAlpha:n,antialias:i,stencil:!0,preserveDrawingBuffer:e.preserveDrawingBuffer,powerPreference:e.powerPreference??"default"})}}ensureCanvasSize(e){if(!this.multiView){e!==this.canvas&&m("multiView is disabled, but targetCanvas is not the main canvas");return}const{canvas:r}=this;(r.width{var r;this.gl.isContextLost()&&((r=this.extensions.loseContext)==null||r.restoreContext())},0))}handleContextRestored(){this._renderer.runners.contextChange.emit(this.gl)}destroy(){var r;const e=this._renderer.view.canvas;this._renderer=null,e.removeEventListener("webglcontextlost",this.handleContextLost),e.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),(r=this.extensions.loseContext)==null||r.loseContext()}forceContextLoss(){var e;(e=this.extensions.loseContext)==null||e.loseContext(),this._contextLossForced=!0}validateContext(e){const r=e.getContextAttributes();r&&!r.stencil&&m("Provided WebGL context does not have a stencil buffer, masks may not render correctly");const s=this.supports,n=this.webGLVersion===2,i=this.extensions;s.uint32Indices=n||!!i.uint32ElementIndex,s.uniformBufferObject=n,s.vertexArrayObject=n||!!i.vertexArrayObject,s.srgbTextures=n||!!i.srgb,s.nonPowOf2wrapping=n,s.nonPowOf2mipmaps=n,s.msaa=n,s.uint32Indices||m("Provided WebGL context does not support 32 index buffer, large scenes may not render correctly")}};P.extension={type:[l.WebGLSystem],name:"context"};P.defaultOptions={context:null,premultipliedAlpha:!0,preserveDrawingBuffer:!1,powerPreference:void 0,preferWebGLVersion:2,multiView:!1};let ke=P;var y=(t=>(t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL",t))(y||{}),se=(t=>(t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z",t))(se||{}),f=(t=>(t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT",t))(f||{});const w={uint8x2:f.UNSIGNED_BYTE,uint8x4:f.UNSIGNED_BYTE,sint8x2:f.BYTE,sint8x4:f.BYTE,unorm8x2:f.UNSIGNED_BYTE,unorm8x4:f.UNSIGNED_BYTE,snorm8x2:f.BYTE,snorm8x4:f.BYTE,uint16x2:f.UNSIGNED_SHORT,uint16x4:f.UNSIGNED_SHORT,sint16x2:f.SHORT,sint16x4:f.SHORT,unorm16x2:f.UNSIGNED_SHORT,unorm16x4:f.UNSIGNED_SHORT,snorm16x2:f.SHORT,snorm16x4:f.SHORT,float16x2:f.HALF_FLOAT,float16x4:f.HALF_FLOAT,float32:f.FLOAT,float32x2:f.FLOAT,float32x3:f.FLOAT,float32x4:f.FLOAT,uint32:f.UNSIGNED_INT,uint32x2:f.UNSIGNED_INT,uint32x3:f.UNSIGNED_INT,uint32x4:f.UNSIGNED_INT,sint32:f.INT,sint32x2:f.INT,sint32x3:f.INT,sint32x4:f.INT};function Xe(t){return w[t]??w.float32}const We={"point-list":0,"line-list":1,"line-strip":3,"triangle-list":4,"triangle-strip":5};class ne{constructor(e){this._geometryVaoHash=Object.create(null),this._renderer=e,this._activeGeometry=null,this._activeVao=null,this.hasVao=!0,this.hasInstance=!0}contextChange(){const e=this.gl=this._renderer.gl;if(!this._renderer.context.supports.vertexArrayObject)throw new Error("[PixiJS] Vertex Array Objects are not supported on this device");const r=this._renderer.context.extensions.vertexArrayObject;r&&(e.createVertexArray=()=>r.createVertexArrayOES(),e.bindVertexArray=n=>r.bindVertexArrayOES(n),e.deleteVertexArray=n=>r.deleteVertexArrayOES(n));const s=this._renderer.context.extensions.vertexAttribDivisorANGLE;s&&(e.drawArraysInstanced=(n,i,a,o)=>{s.drawArraysInstancedANGLE(n,i,a,o)},e.drawElementsInstanced=(n,i,a,o,c)=>{s.drawElementsInstancedANGLE(n,i,a,o,c)},e.vertexAttribDivisor=(n,i)=>s.vertexAttribDivisorANGLE(n,i)),this._activeGeometry=null,this._activeVao=null,this._geometryVaoHash=Object.create(null)}bind(e,r){const s=this.gl;this._activeGeometry=e;const n=this.getVao(e,r);this._activeVao!==n&&(this._activeVao=n,s.bindVertexArray(n)),this.updateBuffers()}reset(){this.unbind()}updateBuffers(){const e=this._activeGeometry,r=this._renderer.buffer;for(let s=0;s1?i.drawElementsInstanced(o,r||a.indexBuffer.data.length,u,(s||0)*c,n):i.drawElements(o,r||a.indexBuffer.data.length,u,(s||0)*c)}else n>1?i.drawArraysInstanced(o,s||0,r||a.getSize(),n):i.drawArrays(o,s||0,r||a.getSize());return this}unbind(){this.gl.bindVertexArray(null),this._activeVao=null,this._activeGeometry=null}destroy(){this._renderer=null,this.gl=null,this._activeVao=null,this._activeGeometry=null}}ne.extension={type:[l.WebGLSystem],name:"geometry"};const je=new Ae({attributes:{aPosition:[-1,-1,3,-1,-1,3]}}),F=class ie{constructor(e){this.useBackBuffer=!1,this._useBackBufferThisRender=!1,this._renderer=e}init(e={}){const{useBackBuffer:r,antialias:s}={...ie.defaultOptions,...e};this.useBackBuffer=r,this._antialias=s,this._renderer.context.supports.msaa||(m("antialiasing, is not supported on when using the back buffer"),this._antialias=!1),this._state=O.for2d();const n=new Be({vertex:` +import{E as l,B as A,w as m,D as S,K,a2 as Ae,v as Be,u as G,a as p,T as $,S as R,O as L,k as H,j as B,l as U,s as z,M as Y,a3 as q,a4 as Ne,a5 as Ie,a6 as Z,a7 as De,e as x,A as ye,R as Ce}from"./index-CaN0mmVb.js";import{S as O,b as Q}from"./colorToUniform-Bwj443Az.js";import{e as Ge,G as Ue,c as Oe,b as Pe,U as Fe,R as Me,B as J,d as N,f as Le,S as He,a as we}from"./SharedSystems-CRmOW3Kq.js";class ee{constructor(){this._didUpload=!1,this._tempState=O.for2d()}init(e){e.renderer.runners.contextChange.add(this)}contextChange(){this._didUpload=!1}start(e,r,s){const n=e.renderer;n.shader.bind(s,this._didUpload),n.shader.updateUniformGroup(n.globalUniforms.uniformGroup),n.geometry.bind(r,s.glProgram)}execute(e,r){const s=e.renderer;this._didUpload=!0,this._tempState.blendMode=r.blendMode,s.state.set(this._tempState);const n=r.textures.textures;for(let i=0;i(t[t.ELEMENT_ARRAY_BUFFER=34963]="ELEMENT_ARRAY_BUFFER",t[t.ARRAY_BUFFER=34962]="ARRAY_BUFFER",t[t.UNIFORM_BUFFER=35345]="UNIFORM_BUFFER",t))(T||{});class Ve{constructor(e,r){this.buffer=e||null,this.updateID=-1,this.byteLength=-1,this.type=r}}class te{constructor(e){this._gpuBuffers=Object.create(null),this._boundBufferBases=Object.create(null),this._renderer=e}destroy(){this._renderer=null,this._gl=null,this._gpuBuffers=null,this._boundBufferBases=null}contextChange(){this._gpuBuffers=Object.create(null),this._gl=this._renderer.gl}getGlBuffer(e){return this._gpuBuffers[e.uid]||this.createGLBuffer(e)}bind(e){const{_gl:r}=this,s=this.getGlBuffer(e);r.bindBuffer(s.type,s.buffer)}bindBufferBase(e,r){const{_gl:s}=this;if(this._boundBufferBases[r]!==e){const n=this.getGlBuffer(e);this._boundBufferBases[r]=e,s.bindBufferBase(s.UNIFORM_BUFFER,r,n.buffer)}}bindBufferRange(e,r,s){const{_gl:n}=this;s=s||0;const i=this.getGlBuffer(e);n.bindBufferRange(n.UNIFORM_BUFFER,r||0,i.buffer,s*256,256)}updateBuffer(e){const{_gl:r}=this,s=this.getGlBuffer(e);if(e._updateID===s.updateID)return s;s.updateID=e._updateID,r.bindBuffer(s.type,s.buffer);const n=e.data;if(s.byteLength>=e.data.byteLength)r.bufferSubData(s.type,0,n,0,e._updateSize/n.BYTES_PER_ELEMENT);else{const i=e.descriptor.usage&A.STATIC?r.STATIC_DRAW:r.DYNAMIC_DRAW;s.byteLength=n.byteLength,r.bufferData(s.type,n,i)}return s}destroyAll(){const e=this._gl;for(const r in this._gpuBuffers)e.deleteBuffer(this._gpuBuffers[r].buffer);this._gpuBuffers=Object.create(null)}onBufferDestroy(e,r){const s=this._gpuBuffers[e.uid],n=this._gl;r||n.deleteBuffer(s.buffer),this._gpuBuffers[e.uid]=null}createGLBuffer(e){const{_gl:r}=this;let s=T.ARRAY_BUFFER;e.descriptor.usage&A.INDEX?s=T.ELEMENT_ARRAY_BUFFER:e.descriptor.usage&A.UNIFORM&&(s=T.UNIFORM_BUFFER);const n=new Ve(r.createBuffer(),s);return this._gpuBuffers[e.uid]=n,e.on("destroy",this.onBufferDestroy,this),n}}te.extension={type:[l.WebGLSystem],name:"buffer"};const P=class re{constructor(e){this.supports={uint32Indices:!0,uniformBufferObject:!0,vertexArrayObject:!0,srgbTextures:!0,nonPowOf2wrapping:!0,msaa:!0,nonPowOf2mipmaps:!0},this._renderer=e,this.extensions=Object.create(null),this.handleContextLost=this.handleContextLost.bind(this),this.handleContextRestored=this.handleContextRestored.bind(this)}get isLost(){return!this.gl||this.gl.isContextLost()}contextChange(e){this.gl=e,this._renderer.gl=e}init(e){e={...re.defaultOptions,...e};let r=this.multiView=e.multiView;if(e.context&&r&&(m("Renderer created with both a context and multiview enabled. Disabling multiView as both cannot work together."),r=!1),r?this.canvas=S.get().createCanvas(this._renderer.canvas.width,this._renderer.canvas.height):this.canvas=this._renderer.view.canvas,e.context)this.initFromContext(e.context);else{const s=this._renderer.background.alpha<1,n=e.premultipliedAlpha??!0,i=e.antialias&&!this._renderer.backBuffer.useBackBuffer;this.createContext(e.preferWebGLVersion,{alpha:s,premultipliedAlpha:n,antialias:i,stencil:!0,preserveDrawingBuffer:e.preserveDrawingBuffer,powerPreference:e.powerPreference??"default"})}}ensureCanvasSize(e){if(!this.multiView){e!==this.canvas&&m("multiView is disabled, but targetCanvas is not the main canvas");return}const{canvas:r}=this;(r.width{var r;this.gl.isContextLost()&&((r=this.extensions.loseContext)==null||r.restoreContext())},0))}handleContextRestored(){this._renderer.runners.contextChange.emit(this.gl)}destroy(){var r;const e=this._renderer.view.canvas;this._renderer=null,e.removeEventListener("webglcontextlost",this.handleContextLost),e.removeEventListener("webglcontextrestored",this.handleContextRestored),this.gl.useProgram(null),(r=this.extensions.loseContext)==null||r.loseContext()}forceContextLoss(){var e;(e=this.extensions.loseContext)==null||e.loseContext(),this._contextLossForced=!0}validateContext(e){const r=e.getContextAttributes();r&&!r.stencil&&m("Provided WebGL context does not have a stencil buffer, masks may not render correctly");const s=this.supports,n=this.webGLVersion===2,i=this.extensions;s.uint32Indices=n||!!i.uint32ElementIndex,s.uniformBufferObject=n,s.vertexArrayObject=n||!!i.vertexArrayObject,s.srgbTextures=n||!!i.srgb,s.nonPowOf2wrapping=n,s.nonPowOf2mipmaps=n,s.msaa=n,s.uint32Indices||m("Provided WebGL context does not support 32 index buffer, large scenes may not render correctly")}};P.extension={type:[l.WebGLSystem],name:"context"};P.defaultOptions={context:null,premultipliedAlpha:!0,preserveDrawingBuffer:!1,powerPreference:void 0,preferWebGLVersion:2,multiView:!1};let ke=P;var y=(t=>(t[t.RGBA=6408]="RGBA",t[t.RGB=6407]="RGB",t[t.RG=33319]="RG",t[t.RED=6403]="RED",t[t.RGBA_INTEGER=36249]="RGBA_INTEGER",t[t.RGB_INTEGER=36248]="RGB_INTEGER",t[t.RG_INTEGER=33320]="RG_INTEGER",t[t.RED_INTEGER=36244]="RED_INTEGER",t[t.ALPHA=6406]="ALPHA",t[t.LUMINANCE=6409]="LUMINANCE",t[t.LUMINANCE_ALPHA=6410]="LUMINANCE_ALPHA",t[t.DEPTH_COMPONENT=6402]="DEPTH_COMPONENT",t[t.DEPTH_STENCIL=34041]="DEPTH_STENCIL",t))(y||{}),se=(t=>(t[t.TEXTURE_2D=3553]="TEXTURE_2D",t[t.TEXTURE_CUBE_MAP=34067]="TEXTURE_CUBE_MAP",t[t.TEXTURE_2D_ARRAY=35866]="TEXTURE_2D_ARRAY",t[t.TEXTURE_CUBE_MAP_POSITIVE_X=34069]="TEXTURE_CUBE_MAP_POSITIVE_X",t[t.TEXTURE_CUBE_MAP_NEGATIVE_X=34070]="TEXTURE_CUBE_MAP_NEGATIVE_X",t[t.TEXTURE_CUBE_MAP_POSITIVE_Y=34071]="TEXTURE_CUBE_MAP_POSITIVE_Y",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y=34072]="TEXTURE_CUBE_MAP_NEGATIVE_Y",t[t.TEXTURE_CUBE_MAP_POSITIVE_Z=34073]="TEXTURE_CUBE_MAP_POSITIVE_Z",t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z=34074]="TEXTURE_CUBE_MAP_NEGATIVE_Z",t))(se||{}),f=(t=>(t[t.UNSIGNED_BYTE=5121]="UNSIGNED_BYTE",t[t.UNSIGNED_SHORT=5123]="UNSIGNED_SHORT",t[t.UNSIGNED_SHORT_5_6_5=33635]="UNSIGNED_SHORT_5_6_5",t[t.UNSIGNED_SHORT_4_4_4_4=32819]="UNSIGNED_SHORT_4_4_4_4",t[t.UNSIGNED_SHORT_5_5_5_1=32820]="UNSIGNED_SHORT_5_5_5_1",t[t.UNSIGNED_INT=5125]="UNSIGNED_INT",t[t.UNSIGNED_INT_10F_11F_11F_REV=35899]="UNSIGNED_INT_10F_11F_11F_REV",t[t.UNSIGNED_INT_2_10_10_10_REV=33640]="UNSIGNED_INT_2_10_10_10_REV",t[t.UNSIGNED_INT_24_8=34042]="UNSIGNED_INT_24_8",t[t.UNSIGNED_INT_5_9_9_9_REV=35902]="UNSIGNED_INT_5_9_9_9_REV",t[t.BYTE=5120]="BYTE",t[t.SHORT=5122]="SHORT",t[t.INT=5124]="INT",t[t.FLOAT=5126]="FLOAT",t[t.FLOAT_32_UNSIGNED_INT_24_8_REV=36269]="FLOAT_32_UNSIGNED_INT_24_8_REV",t[t.HALF_FLOAT=36193]="HALF_FLOAT",t))(f||{});const w={uint8x2:f.UNSIGNED_BYTE,uint8x4:f.UNSIGNED_BYTE,sint8x2:f.BYTE,sint8x4:f.BYTE,unorm8x2:f.UNSIGNED_BYTE,unorm8x4:f.UNSIGNED_BYTE,snorm8x2:f.BYTE,snorm8x4:f.BYTE,uint16x2:f.UNSIGNED_SHORT,uint16x4:f.UNSIGNED_SHORT,sint16x2:f.SHORT,sint16x4:f.SHORT,unorm16x2:f.UNSIGNED_SHORT,unorm16x4:f.UNSIGNED_SHORT,snorm16x2:f.SHORT,snorm16x4:f.SHORT,float16x2:f.HALF_FLOAT,float16x4:f.HALF_FLOAT,float32:f.FLOAT,float32x2:f.FLOAT,float32x3:f.FLOAT,float32x4:f.FLOAT,uint32:f.UNSIGNED_INT,uint32x2:f.UNSIGNED_INT,uint32x3:f.UNSIGNED_INT,uint32x4:f.UNSIGNED_INT,sint32:f.INT,sint32x2:f.INT,sint32x3:f.INT,sint32x4:f.INT};function Xe(t){return w[t]??w.float32}const We={"point-list":0,"line-list":1,"line-strip":3,"triangle-list":4,"triangle-strip":5};class ne{constructor(e){this._geometryVaoHash=Object.create(null),this._renderer=e,this._activeGeometry=null,this._activeVao=null,this.hasVao=!0,this.hasInstance=!0}contextChange(){const e=this.gl=this._renderer.gl;if(!this._renderer.context.supports.vertexArrayObject)throw new Error("[PixiJS] Vertex Array Objects are not supported on this device");const r=this._renderer.context.extensions.vertexArrayObject;r&&(e.createVertexArray=()=>r.createVertexArrayOES(),e.bindVertexArray=n=>r.bindVertexArrayOES(n),e.deleteVertexArray=n=>r.deleteVertexArrayOES(n));const s=this._renderer.context.extensions.vertexAttribDivisorANGLE;s&&(e.drawArraysInstanced=(n,i,a,o)=>{s.drawArraysInstancedANGLE(n,i,a,o)},e.drawElementsInstanced=(n,i,a,o,c)=>{s.drawElementsInstancedANGLE(n,i,a,o,c)},e.vertexAttribDivisor=(n,i)=>s.vertexAttribDivisorANGLE(n,i)),this._activeGeometry=null,this._activeVao=null,this._geometryVaoHash=Object.create(null)}bind(e,r){const s=this.gl;this._activeGeometry=e;const n=this.getVao(e,r);this._activeVao!==n&&(this._activeVao=n,s.bindVertexArray(n)),this.updateBuffers()}reset(){this.unbind()}updateBuffers(){const e=this._activeGeometry,r=this._renderer.buffer;for(let s=0;s1?i.drawElementsInstanced(o,r||a.indexBuffer.data.length,u,(s||0)*c,n):i.drawElements(o,r||a.indexBuffer.data.length,u,(s||0)*c)}else n>1?i.drawArraysInstanced(o,s||0,r||a.getSize(),n):i.drawArrays(o,s||0,r||a.getSize());return this}unbind(){this.gl.bindVertexArray(null),this._activeVao=null,this._activeGeometry=null}destroy(){this._renderer=null,this.gl=null,this._activeVao=null,this._activeGeometry=null}}ne.extension={type:[l.WebGLSystem],name:"geometry"};const je=new Ae({attributes:{aPosition:[-1,-1,3,-1,-1,3]}}),F=class ie{constructor(e){this.useBackBuffer=!1,this._useBackBufferThisRender=!1,this._renderer=e}init(e={}){const{useBackBuffer:r,antialias:s}={...ie.defaultOptions,...e};this.useBackBuffer=r,this._antialias=s,this._renderer.context.supports.msaa||(m("antialiasing, is not supported on when using the back buffer"),this._antialias=!1),this._state=O.for2d();const n=new Be({vertex:` attribute vec2 aPosition; out vec2 vUv; diff --git a/assets/WebGPURenderer-BJsHNgQI.js b/assets/WebGPURenderer-DnAx_Qia.js similarity index 99% rename from assets/WebGPURenderer-BJsHNgQI.js rename to assets/WebGPURenderer-DnAx_Qia.js index 06c0da3..3ba943c 100644 --- a/assets/WebGPURenderer-BJsHNgQI.js +++ b/assets/WebGPURenderer-DnAx_Qia.js @@ -1,4 +1,4 @@ -import{g as w,E as l,f as ne,D as P,S as T,B as S,d as oe,h as R,i as C,w as E,j as b,k as ae,T as ue,l as A,m as U,M as k,o as L,p as ce,q as de,s as he,t as D,u as z,a as M,e as G,A as pe,R as le}from"./index-qw10VO79.js";import{S as F,l as fe,a as ge}from"./colorToUniform-BiCyqw1t.js";import{c as me,u as _e,U as be,B as ye,G as xe,e as Ge,R as Be,t as Se,S as Pe,a as Te}from"./SharedSystems-BKkjBxbn.js";const y=F.for2d();class O{start(e,t,r){const s=e.renderer,i=s.encoder,n=r.gpuProgram;this._shader=r,this._geometry=t,i.setGeometry(t,n),y.blendMode="normal",s.pipeline.getPipeline(t,n,y);const o=s.globalUniforms.bindGroup;i.resetBindGroup(1),i.setBindGroup(0,o,n)}execute(e,t){const r=this._shader.gpuProgram,s=e.renderer,i=s.encoder;if(!t.bindGroup){const u=t.textures;t.bindGroup=w(u.textures,u.count)}y.blendMode=t.blendMode;const n=s.bindGroup.getBindGroup(t.bindGroup,r,1),o=s.pipeline.getPipeline(this._geometry,r,y);t.bindGroup._touch(s.textureGC.count),i.setPipeline(o),i.renderPassEncoder.setBindGroup(1,n),i.renderPassEncoder.drawIndexed(t.size,1,t.start)}}O.extension={type:[l.WebGPUPipesAdaptor],name:"batch"};class H{constructor(e){this._hash=Object.create(null),this._renderer=e}contextChange(e){this._gpu=e}getBindGroup(e,t,r){return e._updateKey(),this._hash[e._key]||this._createBindGroup(e,t,r)}_createBindGroup(e,t,r){const s=this._gpu.device,i=t.layout[r],n=[],o=this._renderer;for(const f in i){const h=e.resources[f]??e.resources[i[f]];let p;if(h._resourceType==="uniformGroup"){const d=h;o.ubo.updateUniformGroup(d);const g=d.buffer;p={buffer:o.buffer.getGPUBuffer(g),offset:0,size:g.descriptor.size}}else if(h._resourceType==="buffer"){const d=h;p={buffer:o.buffer.getGPUBuffer(d),offset:0,size:d.descriptor.size}}else if(h._resourceType==="bufferResource"){const d=h;p={buffer:o.buffer.getGPUBuffer(d.buffer),offset:d.offset,size:d.size}}else if(h._resourceType==="textureSampler"){const d=h;p=o.texture.getGpuSampler(d)}else if(h._resourceType==="textureSource"){const d=h;p=o.texture.getGpuSource(d).createView({})}n.push({binding:i[f],resource:p})}const u=o.shader.getProgramData(t).bindGroups[r],c=s.createBindGroup({layout:u,entries:n});return this._hash[e._key]=c,c}destroy(){for(const e of Object.keys(this._hash))this._hash[e]=null;this._hash=null,this._renderer=null}}H.extension={type:[l.WebGPUSystem],name:"bindGroup"};class W{constructor(){this._gpuBuffers=Object.create(null),this._managedBuffers=[]}contextChange(e){this._gpu=e}getGPUBuffer(e){return this._gpuBuffers[e.uid]||this.createGPUBuffer(e)}updateBuffer(e){const t=this._gpuBuffers[e.uid]||this.createGPUBuffer(e),r=e.data;return e._updateID&&r&&(e._updateID=0,this._gpu.device.queue.writeBuffer(t,0,r.buffer,0,(e._updateSize||r.byteLength)+3&-4)),t}destroyAll(){for(const e in this._gpuBuffers)this._gpuBuffers[e].destroy();this._gpuBuffers={}}createGPUBuffer(e){this._gpuBuffers[e.uid]||(e.on("update",this.updateBuffer,this),e.on("change",this.onBufferChange,this),e.on("destroy",this.onBufferDestroy,this),this._managedBuffers.push(e));const t=this._gpu.device.createBuffer(e.descriptor);return e._updateID=0,e.data&&(ne(e.data.buffer,t.getMappedRange()),t.unmap()),this._gpuBuffers[e.uid]=t,t}onBufferChange(e){this._gpuBuffers[e.uid].destroy(),e._updateID=0,this._gpuBuffers[e.uid]=this.createGPUBuffer(e)}onBufferDestroy(e){this._managedBuffers.splice(this._managedBuffers.indexOf(e),1),this._destroyBuffer(e)}destroy(){this._managedBuffers.forEach(e=>this._destroyBuffer(e)),this._managedBuffers=null,this._gpuBuffers=null}_destroyBuffer(e){this._gpuBuffers[e.uid].destroy(),e.off("update",this.updateBuffer,this),e.off("change",this.onBufferChange,this),e.off("destroy",this.onBufferDestroy,this),this._gpuBuffers[e.uid]=null}}W.extension={type:[l.WebGPUSystem],name:"buffer"};class ve{constructor({minUniformOffsetAlignment:e}){this._minUniformOffsetAlignment=256,this.byteIndex=0,this._minUniformOffsetAlignment=e,this.data=new Float32Array(65535)}clear(){this.byteIndex=0}addEmptyGroup(e){if(e>this._minUniformOffsetAlignment/4)throw new Error(`UniformBufferBatch: array is too large: ${e*4}`);const t=this.byteIndex;let r=t+e*4;if(r=Math.ceil(r/this._minUniformOffsetAlignment)*this._minUniformOffsetAlignment,r>this.data.length*4)throw new Error("UniformBufferBatch: ubo batch got too big");return this.byteIndex=r,t}addGroup(e){const t=this.addEmptyGroup(e.length);for(let r=0;r{this.gpu=t,this._renderer.runners.contextChange.emit(this.gpu)}),this._initPromise)}contextChange(e){this._renderer.gpu=e}async _createDeviceAndAdaptor(e){const t=await P.get().getNavigator().gpu.requestAdapter({powerPreference:e.powerPreference,forceFallbackAdapter:e.forceFallbackAdapter}),r=["texture-compression-bc","texture-compression-astc","texture-compression-etc2"].filter(i=>t.features.has(i)),s=await t.requestDevice({requiredFeatures:r});return{adapter:t,device:s}}destroy(){this.gpu=null,this._renderer=null}}v.extension={type:[l.WebGPUSystem],name:"device"};v.defaultOptions={powerPreference:void 0,forceFallbackAdapter:!1};class V{constructor(e){this._boundBindGroup=Object.create(null),this._boundVertexBuffer=Object.create(null),this._renderer=e}renderStart(){this.commandFinished=new Promise(e=>{this._resolveCommandFinished=e}),this.commandEncoder=this._renderer.gpu.device.createCommandEncoder()}beginRenderPass(e){this.endRenderPass(),this._clearCache(),this.renderPassEncoder=this.commandEncoder.beginRenderPass(e.descriptor)}endRenderPass(){this.renderPassEncoder&&this.renderPassEncoder.end(),this.renderPassEncoder=null}setViewport(e){this.renderPassEncoder.setViewport(e.x,e.y,e.width,e.height,0,1)}setPipelineFromGeometryProgramAndState(e,t,r,s){const i=this._renderer.pipeline.getPipeline(e,t,r,s);this.setPipeline(i)}setPipeline(e){this._boundPipeline!==e&&(this._boundPipeline=e,this.renderPassEncoder.setPipeline(e))}_setVertexBuffer(e,t){this._boundVertexBuffer[e]!==t&&(this._boundVertexBuffer[e]=t,this.renderPassEncoder.setVertexBuffer(e,this._renderer.buffer.updateBuffer(t)))}_setIndexBuffer(e){if(this._boundIndexBuffer===e)return;this._boundIndexBuffer=e;const t=e.data.BYTES_PER_ELEMENT===2?"uint16":"uint32";this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(e),t)}resetBindGroup(e){this._boundBindGroup[e]=null}setBindGroup(e,t,r){if(this._boundBindGroup[e]===t)return;this._boundBindGroup[e]=t,t._touch(this._renderer.textureGC.count);const s=this._renderer.bindGroup.getBindGroup(t,r,e);this.renderPassEncoder.setBindGroup(e,s)}setGeometry(e,t){const r=this._renderer.pipeline.getBufferNamesToBind(e,t);for(const s in r)this._setVertexBuffer(s,e.attributes[r[s]].buffer);e.indexBuffer&&this._setIndexBuffer(e.indexBuffer)}_setShaderBindGroups(e,t){for(const r in e.groups){const s=e.groups[r];t||this._syncBindGroup(s),this.setBindGroup(r,s,e.gpuProgram)}}_syncBindGroup(e){for(const t in e.resources){const r=e.resources[t];r.isUniformGroup&&this._renderer.ubo.updateUniformGroup(r)}}draw(e){const{geometry:t,shader:r,state:s,topology:i,size:n,start:o,instanceCount:u,skipSync:c}=e;this.setPipelineFromGeometryProgramAndState(t,r.gpuProgram,s,i),this.setGeometry(t,r.gpuProgram),this._setShaderBindGroups(r,c),t.indexBuffer?this.renderPassEncoder.drawIndexed(n||t.indexBuffer.data.length,u||t.instanceCount,o||0):this.renderPassEncoder.draw(n||t.getSize(),u||t.instanceCount,o||0)}finishRenderPass(){this.renderPassEncoder&&(this.renderPassEncoder.end(),this.renderPassEncoder=null)}postrender(){this.finishRenderPass(),this._gpu.device.queue.submit([this.commandEncoder.finish()]),this._resolveCommandFinished(),this.commandEncoder=null}restoreRenderPass(){const e=this._renderer.renderTarget.adaptor.getDescriptor(this._renderer.renderTarget.renderTarget,!1,[0,0,0,1]);this.renderPassEncoder=this.commandEncoder.beginRenderPass(e);const t=this._boundPipeline,r={...this._boundVertexBuffer},s=this._boundIndexBuffer,i={...this._boundBindGroup};this._clearCache();const n=this._renderer.renderTarget.viewport;this.renderPassEncoder.setViewport(n.x,n.y,n.width,n.height,0,1),this.setPipeline(t);for(const o in r)this._setVertexBuffer(o,r[o]);for(const o in i)this.setBindGroup(o,i[o],null);this._setIndexBuffer(s)}_clearCache(){for(let e=0;e<16;e++)this._boundBindGroup[e]=null,this._boundVertexBuffer[e]=null;this._boundIndexBuffer=null,this._boundPipeline=null}destroy(){this._renderer=null,this._gpu=null,this._boundBindGroup=null,this._boundVertexBuffer=null,this._boundIndexBuffer=null,this._boundPipeline=null}contextChange(e){this._gpu=e}}V.extension={type:[l.WebGPUSystem],name:"encoder",priority:1};class N{constructor(e){this._renderTargetStencilState=Object.create(null),this._renderer=e,e.renderTarget.onRenderTargetChange.add(this)}onRenderTargetChange(e){let t=this._renderTargetStencilState[e.uid];t||(t=this._renderTargetStencilState[e.uid]={stencilMode:T.DISABLED,stencilReference:0}),this._activeRenderTarget=e,this.setStencilMode(t.stencilMode,t.stencilReference)}setStencilMode(e,t){const r=this._renderTargetStencilState[this._activeRenderTarget.uid];r.stencilMode=e,r.stencilReference=t;const s=this._renderer;s.pipeline.setStencilMode(e),s.encoder.renderPassEncoder.setStencilReference(t)}destroy(){this._renderer.renderTarget.onRenderTargetChange.remove(this),this._renderer=null,this._activeRenderTarget=null,this._renderTargetStencilState=null}}N.extension={type:[l.WebGPUSystem],name:"stencil"};const x={i32:{align:4,size:4},u32:{align:4,size:4},f32:{align:4,size:4},f16:{align:2,size:2},"vec2":{align:8,size:8},"vec2":{align:8,size:8},"vec2":{align:8,size:8},"vec2":{align:4,size:4},"vec3":{align:16,size:12},"vec3":{align:16,size:12},"vec3":{align:16,size:12},"vec3":{align:8,size:6},"vec4":{align:16,size:16},"vec4":{align:16,size:16},"vec4":{align:16,size:16},"vec4":{align:8,size:8},"mat2x2":{align:8,size:16},"mat2x2":{align:4,size:8},"mat3x2":{align:8,size:24},"mat3x2":{align:4,size:12},"mat4x2":{align:8,size:32},"mat4x2":{align:4,size:16},"mat2x3":{align:16,size:32},"mat2x3":{align:8,size:16},"mat3x3":{align:16,size:48},"mat3x3":{align:8,size:24},"mat4x3":{align:16,size:64},"mat4x3":{align:8,size:32},"mat2x4":{align:16,size:32},"mat2x4":{align:8,size:16},"mat3x4":{align:16,size:48},"mat3x4":{align:8,size:24},"mat4x4":{align:16,size:64},"mat4x4":{align:8,size:32}};function Ce(a){const e=a.map(r=>({data:r,offset:0,size:0}));let t=0;for(let r=0;r1&&(i=Math.max(i,n)*s.data.size),t=Math.ceil(t/n)*n,s.size=i,s.offset=t,t+=i}return t=Math.ceil(t/16)*16,{uboElements:e,size:t}}function Ue(a,e){const{size:t,align:r}=x[a.data.type],s=(r-t)/4;return` +import{g as w,E as l,f as ne,D as P,S as T,B as S,d as oe,h as R,i as C,w as E,j as b,k as ae,T as ue,l as A,m as U,M as k,o as L,p as ce,q as de,s as he,t as D,u as z,a as M,e as G,A as pe,R as le}from"./index-CaN0mmVb.js";import{S as F,l as fe,a as ge}from"./colorToUniform-Bwj443Az.js";import{c as me,u as _e,U as be,B as ye,G as xe,e as Ge,R as Be,t as Se,S as Pe,a as Te}from"./SharedSystems-CRmOW3Kq.js";const y=F.for2d();class O{start(e,t,r){const s=e.renderer,i=s.encoder,n=r.gpuProgram;this._shader=r,this._geometry=t,i.setGeometry(t,n),y.blendMode="normal",s.pipeline.getPipeline(t,n,y);const o=s.globalUniforms.bindGroup;i.resetBindGroup(1),i.setBindGroup(0,o,n)}execute(e,t){const r=this._shader.gpuProgram,s=e.renderer,i=s.encoder;if(!t.bindGroup){const u=t.textures;t.bindGroup=w(u.textures,u.count)}y.blendMode=t.blendMode;const n=s.bindGroup.getBindGroup(t.bindGroup,r,1),o=s.pipeline.getPipeline(this._geometry,r,y);t.bindGroup._touch(s.textureGC.count),i.setPipeline(o),i.renderPassEncoder.setBindGroup(1,n),i.renderPassEncoder.drawIndexed(t.size,1,t.start)}}O.extension={type:[l.WebGPUPipesAdaptor],name:"batch"};class H{constructor(e){this._hash=Object.create(null),this._renderer=e}contextChange(e){this._gpu=e}getBindGroup(e,t,r){return e._updateKey(),this._hash[e._key]||this._createBindGroup(e,t,r)}_createBindGroup(e,t,r){const s=this._gpu.device,i=t.layout[r],n=[],o=this._renderer;for(const f in i){const h=e.resources[f]??e.resources[i[f]];let p;if(h._resourceType==="uniformGroup"){const d=h;o.ubo.updateUniformGroup(d);const g=d.buffer;p={buffer:o.buffer.getGPUBuffer(g),offset:0,size:g.descriptor.size}}else if(h._resourceType==="buffer"){const d=h;p={buffer:o.buffer.getGPUBuffer(d),offset:0,size:d.descriptor.size}}else if(h._resourceType==="bufferResource"){const d=h;p={buffer:o.buffer.getGPUBuffer(d.buffer),offset:d.offset,size:d.size}}else if(h._resourceType==="textureSampler"){const d=h;p=o.texture.getGpuSampler(d)}else if(h._resourceType==="textureSource"){const d=h;p=o.texture.getGpuSource(d).createView({})}n.push({binding:i[f],resource:p})}const u=o.shader.getProgramData(t).bindGroups[r],c=s.createBindGroup({layout:u,entries:n});return this._hash[e._key]=c,c}destroy(){for(const e of Object.keys(this._hash))this._hash[e]=null;this._hash=null,this._renderer=null}}H.extension={type:[l.WebGPUSystem],name:"bindGroup"};class W{constructor(){this._gpuBuffers=Object.create(null),this._managedBuffers=[]}contextChange(e){this._gpu=e}getGPUBuffer(e){return this._gpuBuffers[e.uid]||this.createGPUBuffer(e)}updateBuffer(e){const t=this._gpuBuffers[e.uid]||this.createGPUBuffer(e),r=e.data;return e._updateID&&r&&(e._updateID=0,this._gpu.device.queue.writeBuffer(t,0,r.buffer,0,(e._updateSize||r.byteLength)+3&-4)),t}destroyAll(){for(const e in this._gpuBuffers)this._gpuBuffers[e].destroy();this._gpuBuffers={}}createGPUBuffer(e){this._gpuBuffers[e.uid]||(e.on("update",this.updateBuffer,this),e.on("change",this.onBufferChange,this),e.on("destroy",this.onBufferDestroy,this),this._managedBuffers.push(e));const t=this._gpu.device.createBuffer(e.descriptor);return e._updateID=0,e.data&&(ne(e.data.buffer,t.getMappedRange()),t.unmap()),this._gpuBuffers[e.uid]=t,t}onBufferChange(e){this._gpuBuffers[e.uid].destroy(),e._updateID=0,this._gpuBuffers[e.uid]=this.createGPUBuffer(e)}onBufferDestroy(e){this._managedBuffers.splice(this._managedBuffers.indexOf(e),1),this._destroyBuffer(e)}destroy(){this._managedBuffers.forEach(e=>this._destroyBuffer(e)),this._managedBuffers=null,this._gpuBuffers=null}_destroyBuffer(e){this._gpuBuffers[e.uid].destroy(),e.off("update",this.updateBuffer,this),e.off("change",this.onBufferChange,this),e.off("destroy",this.onBufferDestroy,this),this._gpuBuffers[e.uid]=null}}W.extension={type:[l.WebGPUSystem],name:"buffer"};class ve{constructor({minUniformOffsetAlignment:e}){this._minUniformOffsetAlignment=256,this.byteIndex=0,this._minUniformOffsetAlignment=e,this.data=new Float32Array(65535)}clear(){this.byteIndex=0}addEmptyGroup(e){if(e>this._minUniformOffsetAlignment/4)throw new Error(`UniformBufferBatch: array is too large: ${e*4}`);const t=this.byteIndex;let r=t+e*4;if(r=Math.ceil(r/this._minUniformOffsetAlignment)*this._minUniformOffsetAlignment,r>this.data.length*4)throw new Error("UniformBufferBatch: ubo batch got too big");return this.byteIndex=r,t}addGroup(e){const t=this.addEmptyGroup(e.length);for(let r=0;r{this.gpu=t,this._renderer.runners.contextChange.emit(this.gpu)}),this._initPromise)}contextChange(e){this._renderer.gpu=e}async _createDeviceAndAdaptor(e){const t=await P.get().getNavigator().gpu.requestAdapter({powerPreference:e.powerPreference,forceFallbackAdapter:e.forceFallbackAdapter}),r=["texture-compression-bc","texture-compression-astc","texture-compression-etc2"].filter(i=>t.features.has(i)),s=await t.requestDevice({requiredFeatures:r});return{adapter:t,device:s}}destroy(){this.gpu=null,this._renderer=null}}v.extension={type:[l.WebGPUSystem],name:"device"};v.defaultOptions={powerPreference:void 0,forceFallbackAdapter:!1};class V{constructor(e){this._boundBindGroup=Object.create(null),this._boundVertexBuffer=Object.create(null),this._renderer=e}renderStart(){this.commandFinished=new Promise(e=>{this._resolveCommandFinished=e}),this.commandEncoder=this._renderer.gpu.device.createCommandEncoder()}beginRenderPass(e){this.endRenderPass(),this._clearCache(),this.renderPassEncoder=this.commandEncoder.beginRenderPass(e.descriptor)}endRenderPass(){this.renderPassEncoder&&this.renderPassEncoder.end(),this.renderPassEncoder=null}setViewport(e){this.renderPassEncoder.setViewport(e.x,e.y,e.width,e.height,0,1)}setPipelineFromGeometryProgramAndState(e,t,r,s){const i=this._renderer.pipeline.getPipeline(e,t,r,s);this.setPipeline(i)}setPipeline(e){this._boundPipeline!==e&&(this._boundPipeline=e,this.renderPassEncoder.setPipeline(e))}_setVertexBuffer(e,t){this._boundVertexBuffer[e]!==t&&(this._boundVertexBuffer[e]=t,this.renderPassEncoder.setVertexBuffer(e,this._renderer.buffer.updateBuffer(t)))}_setIndexBuffer(e){if(this._boundIndexBuffer===e)return;this._boundIndexBuffer=e;const t=e.data.BYTES_PER_ELEMENT===2?"uint16":"uint32";this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(e),t)}resetBindGroup(e){this._boundBindGroup[e]=null}setBindGroup(e,t,r){if(this._boundBindGroup[e]===t)return;this._boundBindGroup[e]=t,t._touch(this._renderer.textureGC.count);const s=this._renderer.bindGroup.getBindGroup(t,r,e);this.renderPassEncoder.setBindGroup(e,s)}setGeometry(e,t){const r=this._renderer.pipeline.getBufferNamesToBind(e,t);for(const s in r)this._setVertexBuffer(s,e.attributes[r[s]].buffer);e.indexBuffer&&this._setIndexBuffer(e.indexBuffer)}_setShaderBindGroups(e,t){for(const r in e.groups){const s=e.groups[r];t||this._syncBindGroup(s),this.setBindGroup(r,s,e.gpuProgram)}}_syncBindGroup(e){for(const t in e.resources){const r=e.resources[t];r.isUniformGroup&&this._renderer.ubo.updateUniformGroup(r)}}draw(e){const{geometry:t,shader:r,state:s,topology:i,size:n,start:o,instanceCount:u,skipSync:c}=e;this.setPipelineFromGeometryProgramAndState(t,r.gpuProgram,s,i),this.setGeometry(t,r.gpuProgram),this._setShaderBindGroups(r,c),t.indexBuffer?this.renderPassEncoder.drawIndexed(n||t.indexBuffer.data.length,u||t.instanceCount,o||0):this.renderPassEncoder.draw(n||t.getSize(),u||t.instanceCount,o||0)}finishRenderPass(){this.renderPassEncoder&&(this.renderPassEncoder.end(),this.renderPassEncoder=null)}postrender(){this.finishRenderPass(),this._gpu.device.queue.submit([this.commandEncoder.finish()]),this._resolveCommandFinished(),this.commandEncoder=null}restoreRenderPass(){const e=this._renderer.renderTarget.adaptor.getDescriptor(this._renderer.renderTarget.renderTarget,!1,[0,0,0,1]);this.renderPassEncoder=this.commandEncoder.beginRenderPass(e);const t=this._boundPipeline,r={...this._boundVertexBuffer},s=this._boundIndexBuffer,i={...this._boundBindGroup};this._clearCache();const n=this._renderer.renderTarget.viewport;this.renderPassEncoder.setViewport(n.x,n.y,n.width,n.height,0,1),this.setPipeline(t);for(const o in r)this._setVertexBuffer(o,r[o]);for(const o in i)this.setBindGroup(o,i[o],null);this._setIndexBuffer(s)}_clearCache(){for(let e=0;e<16;e++)this._boundBindGroup[e]=null,this._boundVertexBuffer[e]=null;this._boundIndexBuffer=null,this._boundPipeline=null}destroy(){this._renderer=null,this._gpu=null,this._boundBindGroup=null,this._boundVertexBuffer=null,this._boundIndexBuffer=null,this._boundPipeline=null}contextChange(e){this._gpu=e}}V.extension={type:[l.WebGPUSystem],name:"encoder",priority:1};class N{constructor(e){this._renderTargetStencilState=Object.create(null),this._renderer=e,e.renderTarget.onRenderTargetChange.add(this)}onRenderTargetChange(e){let t=this._renderTargetStencilState[e.uid];t||(t=this._renderTargetStencilState[e.uid]={stencilMode:T.DISABLED,stencilReference:0}),this._activeRenderTarget=e,this.setStencilMode(t.stencilMode,t.stencilReference)}setStencilMode(e,t){const r=this._renderTargetStencilState[this._activeRenderTarget.uid];r.stencilMode=e,r.stencilReference=t;const s=this._renderer;s.pipeline.setStencilMode(e),s.encoder.renderPassEncoder.setStencilReference(t)}destroy(){this._renderer.renderTarget.onRenderTargetChange.remove(this),this._renderer=null,this._activeRenderTarget=null,this._renderTargetStencilState=null}}N.extension={type:[l.WebGPUSystem],name:"stencil"};const x={i32:{align:4,size:4},u32:{align:4,size:4},f32:{align:4,size:4},f16:{align:2,size:2},"vec2":{align:8,size:8},"vec2":{align:8,size:8},"vec2":{align:8,size:8},"vec2":{align:4,size:4},"vec3":{align:16,size:12},"vec3":{align:16,size:12},"vec3":{align:16,size:12},"vec3":{align:8,size:6},"vec4":{align:16,size:16},"vec4":{align:16,size:16},"vec4":{align:16,size:16},"vec4":{align:8,size:8},"mat2x2":{align:8,size:16},"mat2x2":{align:4,size:8},"mat3x2":{align:8,size:24},"mat3x2":{align:4,size:12},"mat4x2":{align:8,size:32},"mat4x2":{align:4,size:16},"mat2x3":{align:16,size:32},"mat2x3":{align:8,size:16},"mat3x3":{align:16,size:48},"mat3x3":{align:8,size:24},"mat4x3":{align:16,size:64},"mat4x3":{align:8,size:32},"mat2x4":{align:16,size:32},"mat2x4":{align:8,size:16},"mat3x4":{align:16,size:48},"mat3x4":{align:8,size:24},"mat4x4":{align:16,size:64},"mat4x4":{align:8,size:32}};function Ce(a){const e=a.map(r=>({data:r,offset:0,size:0}));let t=0;for(let r=0;r1&&(i=Math.max(i,n)*s.data.size),t=Math.ceil(t/n)*n,s.size=i,s.offset=t,t+=i}return t=Math.ceil(t/16)*16,{uboElements:e,size:t}}function Ue(a,e){const{size:t,align:r}=x[a.data.type],s=(r-t)/4;return` v = uv.${a.data.name}; ${e!==0?`offset += ${e};`:""} diff --git a/assets/browserAll-CVGpJBCa.js b/assets/browserAll-D1aXoOVq.js similarity index 99% rename from assets/browserAll-CVGpJBCa.js rename to assets/browserAll-D1aXoOVq.js index 2998dc0..732b3a6 100644 --- a/assets/browserAll-CVGpJBCa.js +++ b/assets/browserAll-D1aXoOVq.js @@ -1 +1 @@ -import{P as m,r as J,E as w,b as L,U as Q,c as ee,w as y,e as z,C as Z}from"./index-qw10VO79.js";import"./webworkerAll-CU4P2OK3.js";import"./colorToUniform-BiCyqw1t.js";class M{constructor(e){this.bubbles=!0,this.cancelBubble=!0,this.cancelable=!1,this.composed=!1,this.defaultPrevented=!1,this.eventPhase=M.prototype.NONE,this.propagationStopped=!1,this.propagationImmediatelyStopped=!1,this.layer=new m,this.page=new m,this.NONE=0,this.CAPTURING_PHASE=1,this.AT_TARGET=2,this.BUBBLING_PHASE=3,this.manager=e}get layerX(){return this.layer.x}get layerY(){return this.layer.y}get pageX(){return this.page.x}get pageY(){return this.page.y}get data(){return this}composedPath(){return this.manager&&(!this.path||this.path[this.path.length-1]!==this.target)&&(this.path=this.target?this.manager.propagationPath(this.target):[]),this.path}initEvent(e,t,i){throw new Error("initEvent() is a legacy DOM API. It is not implemented in the Federated Events API.")}initUIEvent(e,t,i,n,s){throw new Error("initUIEvent() is a legacy DOM API. It is not implemented in the Federated Events API.")}preventDefault(){this.nativeEvent instanceof Event&&this.nativeEvent.cancelable&&this.nativeEvent.preventDefault(),this.defaultPrevented=!0}stopImmediatePropagation(){this.propagationImmediatelyStopped=!0}stopPropagation(){this.propagationStopped=!0}}var O=/iPhone/i,C=/iPod/i,S=/iPad/i,U=/\biOS-universal(?:.+)Mac\b/i,k=/\bAndroid(?:.+)Mobile\b/i,H=/Android/i,b=/(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i,A=/Silk/i,g=/Windows Phone/i,X=/\bWindows(?:.+)ARM\b/i,R=/BlackBerry/i,F=/BB10/i,Y=/Opera Mini/i,K=/\b(CriOS|Chrome)(?:.+)Mobile/i,$=/Mobile(?:.+)Firefox\b/i,G=function(r){return typeof r<"u"&&r.platform==="MacIntel"&&typeof r.maxTouchPoints=="number"&&r.maxTouchPoints>1&&typeof MSStream>"u"};function te(r){return function(e){return e.test(r)}}function W(r){var e={userAgent:"",platform:"",maxTouchPoints:0};!r&&typeof navigator<"u"?e={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0}:typeof r=="string"?e.userAgent=r:r&&r.userAgent&&(e={userAgent:r.userAgent,platform:r.platform,maxTouchPoints:r.maxTouchPoints||0});var t=e.userAgent,i=t.split("[FBAN");typeof i[1]<"u"&&(t=i[0]),i=t.split("Twitter"),typeof i[1]<"u"&&(t=i[0]);var n=te(t),s={apple:{phone:n(O)&&!n(g),ipod:n(C),tablet:!n(O)&&(n(S)||G(e))&&!n(g),universal:n(U),device:(n(O)||n(C)||n(S)||n(U)||G(e))&&!n(g)},amazon:{phone:n(b),tablet:!n(b)&&n(A),device:n(b)||n(A)},android:{phone:!n(g)&&n(b)||!n(g)&&n(k),tablet:!n(g)&&!n(b)&&!n(k)&&(n(A)||n(H)),device:!n(g)&&(n(b)||n(A)||n(k)||n(H))||n(/\bokhttp\b/i)},windows:{phone:n(g),tablet:n(X),device:n(g)||n(X)},other:{blackberry:n(R),blackberry10:n(F),opera:n(Y),firefox:n($),chrome:n(K),device:n(R)||n(F)||n(Y)||n($)||n(K)},any:!1,phone:!1,tablet:!1};return s.any=s.apple.device||s.android.device||s.windows.device||s.other.device,s.phone=s.apple.phone||s.android.phone||s.windows.phone,s.tablet=s.apple.tablet||s.android.tablet||s.windows.tablet,s}const ie=W.default??W,ne=ie(globalThis.navigator),se=9,I=100,oe=0,re=0,j=2,N=1,ae=-1e3,he=-1e3,le=2;class V{constructor(e,t=ne){this._mobileInfo=t,this.debug=!1,this._isActive=!1,this._isMobileAccessibility=!1,this._pool=[],this._renderId=0,this._children=[],this._androidUpdateCount=0,this._androidUpdateFrequency=500,this._hookDiv=null,(t.tablet||t.phone)&&this._createTouchHook();const i=document.createElement("div");i.style.width=`${I}px`,i.style.height=`${I}px`,i.style.position="absolute",i.style.top=`${oe}px`,i.style.left=`${re}px`,i.style.zIndex=j.toString(),this._div=i,this._renderer=e,this._onKeyDown=this._onKeyDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),globalThis.addEventListener("keydown",this._onKeyDown,!1)}get isActive(){return this._isActive}get isMobileAccessibility(){return this._isMobileAccessibility}get hookDiv(){return this._hookDiv}_createTouchHook(){const e=document.createElement("button");e.style.width=`${N}px`,e.style.height=`${N}px`,e.style.position="absolute",e.style.top=`${ae}px`,e.style.left=`${he}px`,e.style.zIndex=le.toString(),e.style.backgroundColor="#FF0000",e.title="select to enable accessibility for this content",e.addEventListener("focus",()=>{this._isMobileAccessibility=!0,this._activate(),this._destroyTouchHook()}),document.body.appendChild(e),this._hookDiv=e}_destroyTouchHook(){this._hookDiv&&(document.body.removeChild(this._hookDiv),this._hookDiv=null)}_activate(){var e;this._isActive||(this._isActive=!0,globalThis.document.addEventListener("mousemove",this._onMouseMove,!0),globalThis.removeEventListener("keydown",this._onKeyDown,!1),this._renderer.runners.postrender.add(this),(e=this._renderer.view.canvas.parentNode)==null||e.appendChild(this._div))}_deactivate(){var e;!this._isActive||this._isMobileAccessibility||(this._isActive=!1,globalThis.document.removeEventListener("mousemove",this._onMouseMove,!0),globalThis.addEventListener("keydown",this._onKeyDown,!1),this._renderer.runners.postrender.remove(this),(e=this._div.parentNode)==null||e.removeChild(this._div))}_updateAccessibleObjects(e){if(!e.visible||!e.accessibleChildren)return;e.accessible&&e.isInteractive()&&(e._accessibleActive||this._addChild(e),e._renderId=this._renderId);const t=e.children;if(t)for(let i=0;i title : ${e.title}
tabIndex: ${e.tabIndex}`}_capHitArea(e){e.x<0&&(e.width+=e.x,e.x=0),e.y<0&&(e.height+=e.y,e.y=0);const{width:t,height:i}=this._renderer;e.x+e.width>t&&(e.width=t-e.x),e.y+e.height>i&&(e.height=i-e.y)}_addChild(e){let t=this._pool.pop();t||(t=document.createElement("button"),t.style.width=`${I}px`,t.style.height=`${I}px`,t.style.backgroundColor=this.debug?"rgba(255,255,255,0.5)":"transparent",t.style.position="absolute",t.style.zIndex=j.toString(),t.style.borderStyle="none",navigator.userAgent.toLowerCase().includes("chrome")?t.setAttribute("aria-live","off"):t.setAttribute("aria-live","polite"),navigator.userAgent.match(/rv:.*Gecko\//)?t.setAttribute("aria-relevant","additions"):t.setAttribute("aria-relevant","text"),t.addEventListener("click",this._onClick.bind(this)),t.addEventListener("focus",this._onFocus.bind(this)),t.addEventListener("focusout",this._onFocusOut.bind(this))),t.style.pointerEvents=e.accessiblePointerEvents,t.type=e.accessibleType,e.accessibleTitle&&e.accessibleTitle!==null?t.title=e.accessibleTitle:(!e.accessibleHint||e.accessibleHint===null)&&(t.title=`container ${e.tabIndex}`),e.accessibleHint&&e.accessibleHint!==null&&t.setAttribute("aria-label",e.accessibleHint),this.debug&&this._updateDebugHTML(t),e._accessibleActive=!0,e._accessibleDiv=t,t.container=e,this._children.push(e),this._div.appendChild(e._accessibleDiv),e._accessibleDiv.tabIndex=e.tabIndex}_dispatchEvent(e,t){const{container:i}=e.target,n=this._renderer.events.rootBoundary,s=Object.assign(new M(n),{target:i});n.rootTarget=this._renderer.lastObjectRendered,t.forEach(o=>n.dispatchEvent(s,o))}_onClick(e){this._dispatchEvent(e,["click","pointertap","tap"])}_onFocus(e){e.target.getAttribute("aria-live")||e.target.setAttribute("aria-live","assertive"),this._dispatchEvent(e,["mouseover"])}_onFocusOut(e){e.target.getAttribute("aria-live")||e.target.setAttribute("aria-live","polite"),this._dispatchEvent(e,["mouseout"])}_onKeyDown(e){e.keyCode===se&&this._activate()}_onMouseMove(e){e.movementX===0&&e.movementY===0||this._deactivate()}destroy(){this._destroyTouchHook(),this._div=null,globalThis.document.removeEventListener("mousemove",this._onMouseMove,!0),globalThis.removeEventListener("keydown",this._onKeyDown),this._pool=null,this._children=null,this._renderer=null}}V.extension={type:[w.WebGLSystem,w.WebGPUSystem],name:"accessibility"};const ue={accessible:!1,accessibleTitle:null,accessibleHint:null,tabIndex:0,_accessibleActive:!1,_accessibleDiv:null,accessibleType:"button",accessiblePointerEvents:"auto",accessibleChildren:!0,_renderId:-1};class de{constructor(){this.interactionFrequency=10,this._deltaTime=0,this._didMove=!1,this._tickerAdded=!1,this._pauseUpdate=!0}init(e){this.removeTickerListener(),this.events=e,this.interactionFrequency=10,this._deltaTime=0,this._didMove=!1,this._tickerAdded=!1,this._pauseUpdate=!0}get pauseUpdate(){return this._pauseUpdate}set pauseUpdate(e){this._pauseUpdate=e}addTickerListener(){this._tickerAdded||!this.domElement||(L.system.add(this._tickerUpdate,this,Q.INTERACTION),this._tickerAdded=!0)}removeTickerListener(){this._tickerAdded&&(L.system.remove(this._tickerUpdate,this),this._tickerAdded=!1)}pointerMoved(){this._didMove=!0}_update(){if(!this.domElement||this._pauseUpdate)return;if(this._didMove){this._didMove=!1;return}const e=this.events._rootPointerEvent;this.events.supportsTouchEvents&&e.pointerType==="touch"||globalThis.document.dispatchEvent(new PointerEvent("pointermove",{clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,pointerId:e.pointerId}))}_tickerUpdate(e){this._deltaTime+=e.deltaTime,!(this._deltaTimei.priority-n.priority)}dispatchEvent(e,t){e.propagationStopped=!1,e.propagationImmediatelyStopped=!1,this.propagate(e,t),this.dispatch.emit(t||e.type,e)}mapEvent(e){if(!this.rootTarget)return;const t=this.mappingTable[e.type];if(t)for(let i=0,n=t.length;i=0;n--)if(e.currentTarget=i[n],this.notifyTarget(e,t),e.propagationStopped||e.propagationImmediatelyStopped)return}}all(e,t,i=this._allInteractiveElements){if(i.length===0)return;e.eventPhase=e.BUBBLING_PHASE;const n=Array.isArray(t)?t:[t];for(let s=i.length-1;s>=0;s--)n.forEach(o=>{e.currentTarget=i[s],this.notifyTarget(e,o)})}propagationPath(e){const t=[e];for(let i=0;i=0;h--){const l=v[h],u=this.hitTestMoveRecursive(l,this._isInteractive(t)?t:l.eventMode,i,n,s,o||s(e,i));if(u){if(u.length>0&&!u[u.length-1].parent)continue;const d=e.isInteractive();(u.length>0||d)&&(d&&this._allInteractiveElements.push(e),u.push(e)),this._hitElements.length===0&&(this._hitElements=u),a=!0}}}const c=this._isInteractive(t),p=e.isInteractive();return p&&p&&this._allInteractiveElements.push(e),o||this._hitElements.length>0?null:a?this._hitElements:c&&!s(e,i)&&n(e,i)?p?[e]:[]:null}hitTestRecursive(e,t,i,n,s){if(this._interactivePrune(e)||s(e,i))return null;if((e.eventMode==="dynamic"||t==="dynamic")&&(E.pauseUpdate=!1),e.interactiveChildren&&e.children){const c=e.children,p=i;for(let v=c.length-1;v>=0;v--){const h=c[v],l=this.hitTestRecursive(h,this._isInteractive(t)?t:h.eventMode,p,n,s);if(l){if(l.length>0&&!l[l.length-1].parent)continue;const u=e.isInteractive();return(l.length>0||u)&&l.push(e),l}}}const o=this._isInteractive(t),a=e.isInteractive();return o&&n(e,i)?a?[e]:[]:null}_isInteractive(e){return e==="static"||e==="dynamic"}_interactivePrune(e){return!e||!e.visible||!e.renderable||!e.includeInBuild||!e.measurable||e.eventMode==="none"||e.eventMode==="passive"&&!e.interactiveChildren}hitPruneFn(e,t){if(e.hitArea&&(e.worldTransform.applyInverse(t,P),!e.hitArea.contains(P.x,P.y)))return!0;if(e.effects&&e.effects.length)for(let i=0;i0&&s!==t.target){const v=e.type==="mousemove"?"mouseout":"pointerout",h=this.createPointerEvent(e,v,s);if(this.dispatchEvent(h,"pointerout"),i&&this.dispatchEvent(h,"mouseout"),!t.composedPath().includes(s)){const l=this.createPointerEvent(e,"pointerleave",s);for(l.eventPhase=l.AT_TARGET;l.target&&!t.composedPath().includes(l.target);)l.currentTarget=l.target,this.notifyTarget(l),i&&this.notifyTarget(l,"mouseleave"),l.target=l.target.parent;this.freeEvent(l)}this.freeEvent(h)}if(s!==t.target){const v=e.type==="mousemove"?"mouseover":"pointerover",h=this.clonePointerEvent(t,v);this.dispatchEvent(h,"pointerover"),i&&this.dispatchEvent(h,"mouseover");let l=s==null?void 0:s.parent;for(;l&&l!==this.rootTarget.parent&&l!==t.target;)l=l.parent;if(!l||l===this.rootTarget.parent){const d=this.clonePointerEvent(t,"pointerenter");for(d.eventPhase=d.AT_TARGET;d.target&&d.target!==s&&d.target!==this.rootTarget.parent;)d.currentTarget=d.target,this.notifyTarget(d),i&&this.notifyTarget(d,"mouseenter"),d.target=d.target.parent;this.freeEvent(d)}this.freeEvent(h)}const o=[],a=this.enableGlobalMoveEvents??!0;this.moveOnAll?o.push("pointermove"):this.dispatchEvent(t,"pointermove"),a&&o.push("globalpointermove"),t.pointerType==="touch"&&(this.moveOnAll?o.splice(1,0,"touchmove"):this.dispatchEvent(t,"touchmove"),a&&o.push("globaltouchmove")),i&&(this.moveOnAll?o.splice(1,0,"mousemove"):this.dispatchEvent(t,"mousemove"),a&&o.push("globalmousemove"),this.cursor=(p=t.target)==null?void 0:p.cursor),o.length>0&&this.all(t,o),this._allInteractiveElements.length=0,this._hitElements.length=0,n.overTargets=t.composedPath(),this.freeEvent(t)}mapPointerOver(e){var o;if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId),i=this.createPointerEvent(e),n=i.pointerType==="mouse"||i.pointerType==="pen";this.dispatchEvent(i,"pointerover"),n&&this.dispatchEvent(i,"mouseover"),i.pointerType==="mouse"&&(this.cursor=(o=i.target)==null?void 0:o.cursor);const s=this.clonePointerEvent(i,"pointerenter");for(s.eventPhase=s.AT_TARGET;s.target&&s.target!==this.rootTarget.parent;)s.currentTarget=s.target,this.notifyTarget(s),n&&this.notifyTarget(s,"mouseenter"),s.target=s.target.parent;t.overTargets=i.composedPath(),this.freeEvent(i),this.freeEvent(s)}mapPointerOut(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId);if(t.overTargets){const i=e.pointerType==="mouse"||e.pointerType==="pen",n=this.findMountedTarget(t.overTargets),s=this.createPointerEvent(e,"pointerout",n);this.dispatchEvent(s),i&&this.dispatchEvent(s,"mouseout");const o=this.createPointerEvent(e,"pointerleave",n);for(o.eventPhase=o.AT_TARGET;o.target&&o.target!==this.rootTarget.parent;)o.currentTarget=o.target,this.notifyTarget(o),i&&this.notifyTarget(o,"mouseleave"),o.target=o.target.parent;t.overTargets=null,this.freeEvent(s),this.freeEvent(o)}this.cursor=null}mapPointerUp(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=performance.now(),i=this.createPointerEvent(e);if(this.dispatchEvent(i,"pointerup"),i.pointerType==="touch")this.dispatchEvent(i,"touchend");else if(i.pointerType==="mouse"||i.pointerType==="pen"){const a=i.button===2;this.dispatchEvent(i,a?"rightup":"mouseup")}const n=this.trackingData(e.pointerId),s=this.findMountedTarget(n.pressTargetsByButton[e.button]);let o=s;if(s&&!i.composedPath().includes(s)){let a=s;for(;a&&!i.composedPath().includes(a);){if(i.currentTarget=a,this.notifyTarget(i,"pointerupoutside"),i.pointerType==="touch")this.notifyTarget(i,"touchendoutside");else if(i.pointerType==="mouse"||i.pointerType==="pen"){const c=i.button===2;this.notifyTarget(i,c?"rightupoutside":"mouseupoutside")}a=a.parent}delete n.pressTargetsByButton[e.button],o=a}if(o){const a=this.clonePointerEvent(i,"click");a.target=o,a.path=null,n.clicksByButton[e.button]||(n.clicksByButton[e.button]={clickCount:0,target:a.target,timeStamp:t});const c=n.clicksByButton[e.button];if(c.target===a.target&&t-c.timeStamp<200?++c.clickCount:c.clickCount=1,c.target=a.target,c.timeStamp=t,a.detail=c.clickCount,a.pointerType==="mouse"){const p=a.button===2;this.dispatchEvent(a,p?"rightclick":"click")}else a.pointerType==="touch"&&this.dispatchEvent(a,"tap");this.dispatchEvent(a,"pointertap"),this.freeEvent(a)}this.freeEvent(i)}mapPointerUpOutside(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId),i=this.findMountedTarget(t.pressTargetsByButton[e.button]),n=this.createPointerEvent(e);if(i){let s=i;for(;s;)n.currentTarget=s,this.notifyTarget(n,"pointerupoutside"),n.pointerType==="touch"?this.notifyTarget(n,"touchendoutside"):(n.pointerType==="mouse"||n.pointerType==="pen")&&this.notifyTarget(n,n.button===2?"rightupoutside":"mouseupoutside"),s=s.parent;delete t.pressTargetsByButton[e.button]}this.freeEvent(n)}mapWheel(e){if(!(e instanceof T)){y("EventBoundary cannot map a non-wheel event as a wheel event");return}const t=this.createWheelEvent(e);this.dispatchEvent(t),this.freeEvent(t)}findMountedTarget(e){if(!e)return null;let t=e[0];for(let i=1;i(i==="globalMove"&&(this.rootBoundary.enableGlobalMoveEvents=n),t[i]=n,!0)}),this._onPointerDown=this._onPointerDown.bind(this),this._onPointerMove=this._onPointerMove.bind(this),this._onPointerUp=this._onPointerUp.bind(this),this._onPointerOverOut=this._onPointerOverOut.bind(this),this.onWheel=this.onWheel.bind(this)}static get defaultEventMode(){return this._defaultEventMode}init(e){const{canvas:t,resolution:i}=this.renderer;this.setTargetElement(t),this.resolution=i,x._defaultEventMode=e.eventMode??"passive",Object.assign(this.features,e.eventFeatures??{}),this.rootBoundary.enableGlobalMoveEvents=this.features.globalMove}resolutionChange(e){this.resolution=e}destroy(){this.setTargetElement(null),this.renderer=null,this._currentCursor=null}setCursor(e){e=e||"default";let t=!0;if(globalThis.OffscreenCanvas&&this.domElement instanceof OffscreenCanvas&&(t=!1),this._currentCursor===e)return;this._currentCursor=e;const i=this.cursorStyles[e];if(i)switch(typeof i){case"string":t&&(this.domElement.style.cursor=i);break;case"function":i(e);break;case"object":t&&Object.assign(this.domElement.style,i);break}else t&&typeof e=="string"&&!Object.prototype.hasOwnProperty.call(this.cursorStyles,e)&&(this.domElement.style.cursor=e)}get pointer(){return this._rootPointerEvent}_onPointerDown(e){if(!this.features.click)return;this.rootBoundary.rootTarget=this.renderer.lastObjectRendered;const t=this._normalizeToPointerData(e);this.autoPreventDefault&&t[0].isNormalized&&(e.cancelable||!("cancelable"in e))&&e.preventDefault();for(let i=0,n=t.length;i0&&(t=e.composedPath()[0]);const i=t!==this.domElement?"outside":"",n=this._normalizeToPointerData(e);for(let s=0,o=n.length;s"u"&&(s.button=0),typeof s.buttons>"u"&&(s.buttons=1),typeof s.isPrimary>"u"&&(s.isPrimary=e.touches.length===1&&e.type==="touchstart"),typeof s.width>"u"&&(s.width=s.radiusX||1),typeof s.height>"u"&&(s.height=s.radiusY||1),typeof s.tiltX>"u"&&(s.tiltX=0),typeof s.tiltY>"u"&&(s.tiltY=0),typeof s.pointerType>"u"&&(s.pointerType="touch"),typeof s.pointerId>"u"&&(s.pointerId=s.identifier||0),typeof s.pressure>"u"&&(s.pressure=s.force||.5),typeof s.twist>"u"&&(s.twist=0),typeof s.tangentialPressure>"u"&&(s.tangentialPressure=0),typeof s.layerX>"u"&&(s.layerX=s.offsetX=s.clientX),typeof s.layerY>"u"&&(s.layerY=s.offsetY=s.clientY),s.isNormalized=!0,s.type=e.type,t.push(s)}else if(!globalThis.MouseEvent||e instanceof MouseEvent&&(!this.supportsPointerEvents||!(e instanceof globalThis.PointerEvent))){const i=e;typeof i.isPrimary>"u"&&(i.isPrimary=!0),typeof i.width>"u"&&(i.width=1),typeof i.height>"u"&&(i.height=1),typeof i.tiltX>"u"&&(i.tiltX=0),typeof i.tiltY>"u"&&(i.tiltY=0),typeof i.pointerType>"u"&&(i.pointerType="mouse"),typeof i.pointerId>"u"&&(i.pointerId=fe),typeof i.pressure>"u"&&(i.pressure=.5),typeof i.twist>"u"&&(i.twist=0),typeof i.tangentialPressure>"u"&&(i.tangentialPressure=0),i.isNormalized=!0,t.push(i)}else t.push(e);return t}normalizeWheelEvent(e){const t=this._rootWheelEvent;return this._transferMouseData(t,e),t.deltaX=e.deltaX,t.deltaY=e.deltaY,t.deltaZ=e.deltaZ,t.deltaMode=e.deltaMode,this.mapPositionToPoint(t.screen,e.clientX,e.clientY),t.global.copyFrom(t.screen),t.offset.copyFrom(t.screen),t.nativeEvent=e,t.type=e.type,t}_bootstrapEvent(e,t){return e.originalEvent=null,e.nativeEvent=t,e.pointerId=t.pointerId,e.width=t.width,e.height=t.height,e.isPrimary=t.isPrimary,e.pointerType=t.pointerType,e.pressure=t.pressure,e.tangentialPressure=t.tangentialPressure,e.tiltX=t.tiltX,e.tiltY=t.tiltY,e.twist=t.twist,this._transferMouseData(e,t),this.mapPositionToPoint(e.screen,t.clientX,t.clientY),e.global.copyFrom(e.screen),e.offset.copyFrom(e.screen),e.isTrusted=t.isTrusted,e.type==="pointerleave"&&(e.type="pointerout"),e.type.startsWith("mouse")&&(e.type=e.type.replace("mouse","pointer")),e.type.startsWith("touch")&&(e.type=ge[e.type]||e.type),e}_transferMouseData(e,t){e.isTrusted=t.isTrusted,e.srcElement=t.srcElement,e.timeStamp=performance.now(),e.type=t.type,e.altKey=t.altKey,e.button=t.button,e.buttons=t.buttons,e.client.x=t.clientX,e.client.y=t.clientY,e.ctrlKey=t.ctrlKey,e.metaKey=t.metaKey,e.movement.x=t.movementX,e.movement.y=t.movementY,e.page.x=t.pageX,e.page.y=t.pageY,e.relatedTarget=null,e.shiftKey=t.shiftKey}};B.extension={name:"events",type:[w.WebGLSystem,w.CanvasSystem,w.WebGPUSystem],priority:-1};B.defaultEventFeatures={move:!0,globalMove:!0,click:!0,wheel:!0};let q=B;const me={onclick:null,onmousedown:null,onmouseenter:null,onmouseleave:null,onmousemove:null,onglobalmousemove:null,onmouseout:null,onmouseover:null,onmouseup:null,onmouseupoutside:null,onpointercancel:null,onpointerdown:null,onpointerenter:null,onpointerleave:null,onpointermove:null,onglobalpointermove:null,onpointerout:null,onpointerover:null,onpointertap:null,onpointerup:null,onpointerupoutside:null,onrightclick:null,onrightdown:null,onrightup:null,onrightupoutside:null,ontap:null,ontouchcancel:null,ontouchend:null,ontouchendoutside:null,ontouchmove:null,onglobaltouchmove:null,ontouchstart:null,onwheel:null,get interactive(){return this.eventMode==="dynamic"||this.eventMode==="static"},set interactive(r){this.eventMode=r?"static":"passive"},_internalEventMode:void 0,get eventMode(){return this._internalEventMode??q.defaultEventMode},set eventMode(r){this._internalEventMode=r},isInteractive(){return this.eventMode==="static"||this.eventMode==="dynamic"},interactiveChildren:!0,hitArea:null,addEventListener(r,e,t){const i=typeof t=="boolean"&&t||typeof t=="object"&&t.capture,n=typeof t=="object"?t.signal:void 0,s=typeof t=="object"?t.once===!0:!1,o=typeof e=="function"?void 0:e;r=i?`${r}capture`:r;const a=typeof e=="function"?e:e.handleEvent,c=this;n&&n.addEventListener("abort",()=>{c.off(r,a,o)}),s?c.once(r,a,o):c.on(r,a,o)},removeEventListener(r,e,t){const i=typeof t=="boolean"&&t||typeof t=="object"&&t.capture,n=typeof e=="function"?void 0:e;r=i?`${r}capture`:r,e=typeof e=="function"?e:e.handleEvent,this.off(r,e,n)},dispatchEvent(r){if(!(r instanceof M))throw new Error("Container cannot propagate events outside of the Federated Events API");return r.defaultPrevented=!1,r.path=null,r.target=this,r.manager.dispatchEvent(r),!r.defaultPrevented}};z.add(V);Z.mixin(ue);z.add(q);Z.mixin(me); +import{P as m,r as J,E as w,b as L,U as Q,c as ee,w as y,e as z,C as Z}from"./index-CaN0mmVb.js";import"./webworkerAll-ClyFdN3X.js";import"./colorToUniform-Bwj443Az.js";class M{constructor(e){this.bubbles=!0,this.cancelBubble=!0,this.cancelable=!1,this.composed=!1,this.defaultPrevented=!1,this.eventPhase=M.prototype.NONE,this.propagationStopped=!1,this.propagationImmediatelyStopped=!1,this.layer=new m,this.page=new m,this.NONE=0,this.CAPTURING_PHASE=1,this.AT_TARGET=2,this.BUBBLING_PHASE=3,this.manager=e}get layerX(){return this.layer.x}get layerY(){return this.layer.y}get pageX(){return this.page.x}get pageY(){return this.page.y}get data(){return this}composedPath(){return this.manager&&(!this.path||this.path[this.path.length-1]!==this.target)&&(this.path=this.target?this.manager.propagationPath(this.target):[]),this.path}initEvent(e,t,i){throw new Error("initEvent() is a legacy DOM API. It is not implemented in the Federated Events API.")}initUIEvent(e,t,i,n,s){throw new Error("initUIEvent() is a legacy DOM API. It is not implemented in the Federated Events API.")}preventDefault(){this.nativeEvent instanceof Event&&this.nativeEvent.cancelable&&this.nativeEvent.preventDefault(),this.defaultPrevented=!0}stopImmediatePropagation(){this.propagationImmediatelyStopped=!0}stopPropagation(){this.propagationStopped=!0}}var O=/iPhone/i,C=/iPod/i,S=/iPad/i,U=/\biOS-universal(?:.+)Mac\b/i,k=/\bAndroid(?:.+)Mobile\b/i,H=/Android/i,b=/(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i,A=/Silk/i,g=/Windows Phone/i,X=/\bWindows(?:.+)ARM\b/i,R=/BlackBerry/i,F=/BB10/i,Y=/Opera Mini/i,K=/\b(CriOS|Chrome)(?:.+)Mobile/i,$=/Mobile(?:.+)Firefox\b/i,G=function(r){return typeof r<"u"&&r.platform==="MacIntel"&&typeof r.maxTouchPoints=="number"&&r.maxTouchPoints>1&&typeof MSStream>"u"};function te(r){return function(e){return e.test(r)}}function W(r){var e={userAgent:"",platform:"",maxTouchPoints:0};!r&&typeof navigator<"u"?e={userAgent:navigator.userAgent,platform:navigator.platform,maxTouchPoints:navigator.maxTouchPoints||0}:typeof r=="string"?e.userAgent=r:r&&r.userAgent&&(e={userAgent:r.userAgent,platform:r.platform,maxTouchPoints:r.maxTouchPoints||0});var t=e.userAgent,i=t.split("[FBAN");typeof i[1]<"u"&&(t=i[0]),i=t.split("Twitter"),typeof i[1]<"u"&&(t=i[0]);var n=te(t),s={apple:{phone:n(O)&&!n(g),ipod:n(C),tablet:!n(O)&&(n(S)||G(e))&&!n(g),universal:n(U),device:(n(O)||n(C)||n(S)||n(U)||G(e))&&!n(g)},amazon:{phone:n(b),tablet:!n(b)&&n(A),device:n(b)||n(A)},android:{phone:!n(g)&&n(b)||!n(g)&&n(k),tablet:!n(g)&&!n(b)&&!n(k)&&(n(A)||n(H)),device:!n(g)&&(n(b)||n(A)||n(k)||n(H))||n(/\bokhttp\b/i)},windows:{phone:n(g),tablet:n(X),device:n(g)||n(X)},other:{blackberry:n(R),blackberry10:n(F),opera:n(Y),firefox:n($),chrome:n(K),device:n(R)||n(F)||n(Y)||n($)||n(K)},any:!1,phone:!1,tablet:!1};return s.any=s.apple.device||s.android.device||s.windows.device||s.other.device,s.phone=s.apple.phone||s.android.phone||s.windows.phone,s.tablet=s.apple.tablet||s.android.tablet||s.windows.tablet,s}const ie=W.default??W,ne=ie(globalThis.navigator),se=9,I=100,oe=0,re=0,j=2,N=1,ae=-1e3,he=-1e3,le=2;class V{constructor(e,t=ne){this._mobileInfo=t,this.debug=!1,this._isActive=!1,this._isMobileAccessibility=!1,this._pool=[],this._renderId=0,this._children=[],this._androidUpdateCount=0,this._androidUpdateFrequency=500,this._hookDiv=null,(t.tablet||t.phone)&&this._createTouchHook();const i=document.createElement("div");i.style.width=`${I}px`,i.style.height=`${I}px`,i.style.position="absolute",i.style.top=`${oe}px`,i.style.left=`${re}px`,i.style.zIndex=j.toString(),this._div=i,this._renderer=e,this._onKeyDown=this._onKeyDown.bind(this),this._onMouseMove=this._onMouseMove.bind(this),globalThis.addEventListener("keydown",this._onKeyDown,!1)}get isActive(){return this._isActive}get isMobileAccessibility(){return this._isMobileAccessibility}get hookDiv(){return this._hookDiv}_createTouchHook(){const e=document.createElement("button");e.style.width=`${N}px`,e.style.height=`${N}px`,e.style.position="absolute",e.style.top=`${ae}px`,e.style.left=`${he}px`,e.style.zIndex=le.toString(),e.style.backgroundColor="#FF0000",e.title="select to enable accessibility for this content",e.addEventListener("focus",()=>{this._isMobileAccessibility=!0,this._activate(),this._destroyTouchHook()}),document.body.appendChild(e),this._hookDiv=e}_destroyTouchHook(){this._hookDiv&&(document.body.removeChild(this._hookDiv),this._hookDiv=null)}_activate(){var e;this._isActive||(this._isActive=!0,globalThis.document.addEventListener("mousemove",this._onMouseMove,!0),globalThis.removeEventListener("keydown",this._onKeyDown,!1),this._renderer.runners.postrender.add(this),(e=this._renderer.view.canvas.parentNode)==null||e.appendChild(this._div))}_deactivate(){var e;!this._isActive||this._isMobileAccessibility||(this._isActive=!1,globalThis.document.removeEventListener("mousemove",this._onMouseMove,!0),globalThis.addEventListener("keydown",this._onKeyDown,!1),this._renderer.runners.postrender.remove(this),(e=this._div.parentNode)==null||e.removeChild(this._div))}_updateAccessibleObjects(e){if(!e.visible||!e.accessibleChildren)return;e.accessible&&e.isInteractive()&&(e._accessibleActive||this._addChild(e),e._renderId=this._renderId);const t=e.children;if(t)for(let i=0;i title : ${e.title}
tabIndex: ${e.tabIndex}`}_capHitArea(e){e.x<0&&(e.width+=e.x,e.x=0),e.y<0&&(e.height+=e.y,e.y=0);const{width:t,height:i}=this._renderer;e.x+e.width>t&&(e.width=t-e.x),e.y+e.height>i&&(e.height=i-e.y)}_addChild(e){let t=this._pool.pop();t||(t=document.createElement("button"),t.style.width=`${I}px`,t.style.height=`${I}px`,t.style.backgroundColor=this.debug?"rgba(255,255,255,0.5)":"transparent",t.style.position="absolute",t.style.zIndex=j.toString(),t.style.borderStyle="none",navigator.userAgent.toLowerCase().includes("chrome")?t.setAttribute("aria-live","off"):t.setAttribute("aria-live","polite"),navigator.userAgent.match(/rv:.*Gecko\//)?t.setAttribute("aria-relevant","additions"):t.setAttribute("aria-relevant","text"),t.addEventListener("click",this._onClick.bind(this)),t.addEventListener("focus",this._onFocus.bind(this)),t.addEventListener("focusout",this._onFocusOut.bind(this))),t.style.pointerEvents=e.accessiblePointerEvents,t.type=e.accessibleType,e.accessibleTitle&&e.accessibleTitle!==null?t.title=e.accessibleTitle:(!e.accessibleHint||e.accessibleHint===null)&&(t.title=`container ${e.tabIndex}`),e.accessibleHint&&e.accessibleHint!==null&&t.setAttribute("aria-label",e.accessibleHint),this.debug&&this._updateDebugHTML(t),e._accessibleActive=!0,e._accessibleDiv=t,t.container=e,this._children.push(e),this._div.appendChild(e._accessibleDiv),e._accessibleDiv.tabIndex=e.tabIndex}_dispatchEvent(e,t){const{container:i}=e.target,n=this._renderer.events.rootBoundary,s=Object.assign(new M(n),{target:i});n.rootTarget=this._renderer.lastObjectRendered,t.forEach(o=>n.dispatchEvent(s,o))}_onClick(e){this._dispatchEvent(e,["click","pointertap","tap"])}_onFocus(e){e.target.getAttribute("aria-live")||e.target.setAttribute("aria-live","assertive"),this._dispatchEvent(e,["mouseover"])}_onFocusOut(e){e.target.getAttribute("aria-live")||e.target.setAttribute("aria-live","polite"),this._dispatchEvent(e,["mouseout"])}_onKeyDown(e){e.keyCode===se&&this._activate()}_onMouseMove(e){e.movementX===0&&e.movementY===0||this._deactivate()}destroy(){this._destroyTouchHook(),this._div=null,globalThis.document.removeEventListener("mousemove",this._onMouseMove,!0),globalThis.removeEventListener("keydown",this._onKeyDown),this._pool=null,this._children=null,this._renderer=null}}V.extension={type:[w.WebGLSystem,w.WebGPUSystem],name:"accessibility"};const ue={accessible:!1,accessibleTitle:null,accessibleHint:null,tabIndex:0,_accessibleActive:!1,_accessibleDiv:null,accessibleType:"button",accessiblePointerEvents:"auto",accessibleChildren:!0,_renderId:-1};class de{constructor(){this.interactionFrequency=10,this._deltaTime=0,this._didMove=!1,this._tickerAdded=!1,this._pauseUpdate=!0}init(e){this.removeTickerListener(),this.events=e,this.interactionFrequency=10,this._deltaTime=0,this._didMove=!1,this._tickerAdded=!1,this._pauseUpdate=!0}get pauseUpdate(){return this._pauseUpdate}set pauseUpdate(e){this._pauseUpdate=e}addTickerListener(){this._tickerAdded||!this.domElement||(L.system.add(this._tickerUpdate,this,Q.INTERACTION),this._tickerAdded=!0)}removeTickerListener(){this._tickerAdded&&(L.system.remove(this._tickerUpdate,this),this._tickerAdded=!1)}pointerMoved(){this._didMove=!0}_update(){if(!this.domElement||this._pauseUpdate)return;if(this._didMove){this._didMove=!1;return}const e=this.events._rootPointerEvent;this.events.supportsTouchEvents&&e.pointerType==="touch"||globalThis.document.dispatchEvent(new PointerEvent("pointermove",{clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,pointerId:e.pointerId}))}_tickerUpdate(e){this._deltaTime+=e.deltaTime,!(this._deltaTimei.priority-n.priority)}dispatchEvent(e,t){e.propagationStopped=!1,e.propagationImmediatelyStopped=!1,this.propagate(e,t),this.dispatch.emit(t||e.type,e)}mapEvent(e){if(!this.rootTarget)return;const t=this.mappingTable[e.type];if(t)for(let i=0,n=t.length;i=0;n--)if(e.currentTarget=i[n],this.notifyTarget(e,t),e.propagationStopped||e.propagationImmediatelyStopped)return}}all(e,t,i=this._allInteractiveElements){if(i.length===0)return;e.eventPhase=e.BUBBLING_PHASE;const n=Array.isArray(t)?t:[t];for(let s=i.length-1;s>=0;s--)n.forEach(o=>{e.currentTarget=i[s],this.notifyTarget(e,o)})}propagationPath(e){const t=[e];for(let i=0;i=0;h--){const l=v[h],u=this.hitTestMoveRecursive(l,this._isInteractive(t)?t:l.eventMode,i,n,s,o||s(e,i));if(u){if(u.length>0&&!u[u.length-1].parent)continue;const d=e.isInteractive();(u.length>0||d)&&(d&&this._allInteractiveElements.push(e),u.push(e)),this._hitElements.length===0&&(this._hitElements=u),a=!0}}}const c=this._isInteractive(t),p=e.isInteractive();return p&&p&&this._allInteractiveElements.push(e),o||this._hitElements.length>0?null:a?this._hitElements:c&&!s(e,i)&&n(e,i)?p?[e]:[]:null}hitTestRecursive(e,t,i,n,s){if(this._interactivePrune(e)||s(e,i))return null;if((e.eventMode==="dynamic"||t==="dynamic")&&(E.pauseUpdate=!1),e.interactiveChildren&&e.children){const c=e.children,p=i;for(let v=c.length-1;v>=0;v--){const h=c[v],l=this.hitTestRecursive(h,this._isInteractive(t)?t:h.eventMode,p,n,s);if(l){if(l.length>0&&!l[l.length-1].parent)continue;const u=e.isInteractive();return(l.length>0||u)&&l.push(e),l}}}const o=this._isInteractive(t),a=e.isInteractive();return o&&n(e,i)?a?[e]:[]:null}_isInteractive(e){return e==="static"||e==="dynamic"}_interactivePrune(e){return!e||!e.visible||!e.renderable||!e.includeInBuild||!e.measurable||e.eventMode==="none"||e.eventMode==="passive"&&!e.interactiveChildren}hitPruneFn(e,t){if(e.hitArea&&(e.worldTransform.applyInverse(t,P),!e.hitArea.contains(P.x,P.y)))return!0;if(e.effects&&e.effects.length)for(let i=0;i0&&s!==t.target){const v=e.type==="mousemove"?"mouseout":"pointerout",h=this.createPointerEvent(e,v,s);if(this.dispatchEvent(h,"pointerout"),i&&this.dispatchEvent(h,"mouseout"),!t.composedPath().includes(s)){const l=this.createPointerEvent(e,"pointerleave",s);for(l.eventPhase=l.AT_TARGET;l.target&&!t.composedPath().includes(l.target);)l.currentTarget=l.target,this.notifyTarget(l),i&&this.notifyTarget(l,"mouseleave"),l.target=l.target.parent;this.freeEvent(l)}this.freeEvent(h)}if(s!==t.target){const v=e.type==="mousemove"?"mouseover":"pointerover",h=this.clonePointerEvent(t,v);this.dispatchEvent(h,"pointerover"),i&&this.dispatchEvent(h,"mouseover");let l=s==null?void 0:s.parent;for(;l&&l!==this.rootTarget.parent&&l!==t.target;)l=l.parent;if(!l||l===this.rootTarget.parent){const d=this.clonePointerEvent(t,"pointerenter");for(d.eventPhase=d.AT_TARGET;d.target&&d.target!==s&&d.target!==this.rootTarget.parent;)d.currentTarget=d.target,this.notifyTarget(d),i&&this.notifyTarget(d,"mouseenter"),d.target=d.target.parent;this.freeEvent(d)}this.freeEvent(h)}const o=[],a=this.enableGlobalMoveEvents??!0;this.moveOnAll?o.push("pointermove"):this.dispatchEvent(t,"pointermove"),a&&o.push("globalpointermove"),t.pointerType==="touch"&&(this.moveOnAll?o.splice(1,0,"touchmove"):this.dispatchEvent(t,"touchmove"),a&&o.push("globaltouchmove")),i&&(this.moveOnAll?o.splice(1,0,"mousemove"):this.dispatchEvent(t,"mousemove"),a&&o.push("globalmousemove"),this.cursor=(p=t.target)==null?void 0:p.cursor),o.length>0&&this.all(t,o),this._allInteractiveElements.length=0,this._hitElements.length=0,n.overTargets=t.composedPath(),this.freeEvent(t)}mapPointerOver(e){var o;if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId),i=this.createPointerEvent(e),n=i.pointerType==="mouse"||i.pointerType==="pen";this.dispatchEvent(i,"pointerover"),n&&this.dispatchEvent(i,"mouseover"),i.pointerType==="mouse"&&(this.cursor=(o=i.target)==null?void 0:o.cursor);const s=this.clonePointerEvent(i,"pointerenter");for(s.eventPhase=s.AT_TARGET;s.target&&s.target!==this.rootTarget.parent;)s.currentTarget=s.target,this.notifyTarget(s),n&&this.notifyTarget(s,"mouseenter"),s.target=s.target.parent;t.overTargets=i.composedPath(),this.freeEvent(i),this.freeEvent(s)}mapPointerOut(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId);if(t.overTargets){const i=e.pointerType==="mouse"||e.pointerType==="pen",n=this.findMountedTarget(t.overTargets),s=this.createPointerEvent(e,"pointerout",n);this.dispatchEvent(s),i&&this.dispatchEvent(s,"mouseout");const o=this.createPointerEvent(e,"pointerleave",n);for(o.eventPhase=o.AT_TARGET;o.target&&o.target!==this.rootTarget.parent;)o.currentTarget=o.target,this.notifyTarget(o),i&&this.notifyTarget(o,"mouseleave"),o.target=o.target.parent;t.overTargets=null,this.freeEvent(s),this.freeEvent(o)}this.cursor=null}mapPointerUp(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=performance.now(),i=this.createPointerEvent(e);if(this.dispatchEvent(i,"pointerup"),i.pointerType==="touch")this.dispatchEvent(i,"touchend");else if(i.pointerType==="mouse"||i.pointerType==="pen"){const a=i.button===2;this.dispatchEvent(i,a?"rightup":"mouseup")}const n=this.trackingData(e.pointerId),s=this.findMountedTarget(n.pressTargetsByButton[e.button]);let o=s;if(s&&!i.composedPath().includes(s)){let a=s;for(;a&&!i.composedPath().includes(a);){if(i.currentTarget=a,this.notifyTarget(i,"pointerupoutside"),i.pointerType==="touch")this.notifyTarget(i,"touchendoutside");else if(i.pointerType==="mouse"||i.pointerType==="pen"){const c=i.button===2;this.notifyTarget(i,c?"rightupoutside":"mouseupoutside")}a=a.parent}delete n.pressTargetsByButton[e.button],o=a}if(o){const a=this.clonePointerEvent(i,"click");a.target=o,a.path=null,n.clicksByButton[e.button]||(n.clicksByButton[e.button]={clickCount:0,target:a.target,timeStamp:t});const c=n.clicksByButton[e.button];if(c.target===a.target&&t-c.timeStamp<200?++c.clickCount:c.clickCount=1,c.target=a.target,c.timeStamp=t,a.detail=c.clickCount,a.pointerType==="mouse"){const p=a.button===2;this.dispatchEvent(a,p?"rightclick":"click")}else a.pointerType==="touch"&&this.dispatchEvent(a,"tap");this.dispatchEvent(a,"pointertap"),this.freeEvent(a)}this.freeEvent(i)}mapPointerUpOutside(e){if(!(e instanceof f)){y("EventBoundary cannot map a non-pointer event as a pointer event");return}const t=this.trackingData(e.pointerId),i=this.findMountedTarget(t.pressTargetsByButton[e.button]),n=this.createPointerEvent(e);if(i){let s=i;for(;s;)n.currentTarget=s,this.notifyTarget(n,"pointerupoutside"),n.pointerType==="touch"?this.notifyTarget(n,"touchendoutside"):(n.pointerType==="mouse"||n.pointerType==="pen")&&this.notifyTarget(n,n.button===2?"rightupoutside":"mouseupoutside"),s=s.parent;delete t.pressTargetsByButton[e.button]}this.freeEvent(n)}mapWheel(e){if(!(e instanceof T)){y("EventBoundary cannot map a non-wheel event as a wheel event");return}const t=this.createWheelEvent(e);this.dispatchEvent(t),this.freeEvent(t)}findMountedTarget(e){if(!e)return null;let t=e[0];for(let i=1;i(i==="globalMove"&&(this.rootBoundary.enableGlobalMoveEvents=n),t[i]=n,!0)}),this._onPointerDown=this._onPointerDown.bind(this),this._onPointerMove=this._onPointerMove.bind(this),this._onPointerUp=this._onPointerUp.bind(this),this._onPointerOverOut=this._onPointerOverOut.bind(this),this.onWheel=this.onWheel.bind(this)}static get defaultEventMode(){return this._defaultEventMode}init(e){const{canvas:t,resolution:i}=this.renderer;this.setTargetElement(t),this.resolution=i,x._defaultEventMode=e.eventMode??"passive",Object.assign(this.features,e.eventFeatures??{}),this.rootBoundary.enableGlobalMoveEvents=this.features.globalMove}resolutionChange(e){this.resolution=e}destroy(){this.setTargetElement(null),this.renderer=null,this._currentCursor=null}setCursor(e){e=e||"default";let t=!0;if(globalThis.OffscreenCanvas&&this.domElement instanceof OffscreenCanvas&&(t=!1),this._currentCursor===e)return;this._currentCursor=e;const i=this.cursorStyles[e];if(i)switch(typeof i){case"string":t&&(this.domElement.style.cursor=i);break;case"function":i(e);break;case"object":t&&Object.assign(this.domElement.style,i);break}else t&&typeof e=="string"&&!Object.prototype.hasOwnProperty.call(this.cursorStyles,e)&&(this.domElement.style.cursor=e)}get pointer(){return this._rootPointerEvent}_onPointerDown(e){if(!this.features.click)return;this.rootBoundary.rootTarget=this.renderer.lastObjectRendered;const t=this._normalizeToPointerData(e);this.autoPreventDefault&&t[0].isNormalized&&(e.cancelable||!("cancelable"in e))&&e.preventDefault();for(let i=0,n=t.length;i0&&(t=e.composedPath()[0]);const i=t!==this.domElement?"outside":"",n=this._normalizeToPointerData(e);for(let s=0,o=n.length;s"u"&&(s.button=0),typeof s.buttons>"u"&&(s.buttons=1),typeof s.isPrimary>"u"&&(s.isPrimary=e.touches.length===1&&e.type==="touchstart"),typeof s.width>"u"&&(s.width=s.radiusX||1),typeof s.height>"u"&&(s.height=s.radiusY||1),typeof s.tiltX>"u"&&(s.tiltX=0),typeof s.tiltY>"u"&&(s.tiltY=0),typeof s.pointerType>"u"&&(s.pointerType="touch"),typeof s.pointerId>"u"&&(s.pointerId=s.identifier||0),typeof s.pressure>"u"&&(s.pressure=s.force||.5),typeof s.twist>"u"&&(s.twist=0),typeof s.tangentialPressure>"u"&&(s.tangentialPressure=0),typeof s.layerX>"u"&&(s.layerX=s.offsetX=s.clientX),typeof s.layerY>"u"&&(s.layerY=s.offsetY=s.clientY),s.isNormalized=!0,s.type=e.type,t.push(s)}else if(!globalThis.MouseEvent||e instanceof MouseEvent&&(!this.supportsPointerEvents||!(e instanceof globalThis.PointerEvent))){const i=e;typeof i.isPrimary>"u"&&(i.isPrimary=!0),typeof i.width>"u"&&(i.width=1),typeof i.height>"u"&&(i.height=1),typeof i.tiltX>"u"&&(i.tiltX=0),typeof i.tiltY>"u"&&(i.tiltY=0),typeof i.pointerType>"u"&&(i.pointerType="mouse"),typeof i.pointerId>"u"&&(i.pointerId=fe),typeof i.pressure>"u"&&(i.pressure=.5),typeof i.twist>"u"&&(i.twist=0),typeof i.tangentialPressure>"u"&&(i.tangentialPressure=0),i.isNormalized=!0,t.push(i)}else t.push(e);return t}normalizeWheelEvent(e){const t=this._rootWheelEvent;return this._transferMouseData(t,e),t.deltaX=e.deltaX,t.deltaY=e.deltaY,t.deltaZ=e.deltaZ,t.deltaMode=e.deltaMode,this.mapPositionToPoint(t.screen,e.clientX,e.clientY),t.global.copyFrom(t.screen),t.offset.copyFrom(t.screen),t.nativeEvent=e,t.type=e.type,t}_bootstrapEvent(e,t){return e.originalEvent=null,e.nativeEvent=t,e.pointerId=t.pointerId,e.width=t.width,e.height=t.height,e.isPrimary=t.isPrimary,e.pointerType=t.pointerType,e.pressure=t.pressure,e.tangentialPressure=t.tangentialPressure,e.tiltX=t.tiltX,e.tiltY=t.tiltY,e.twist=t.twist,this._transferMouseData(e,t),this.mapPositionToPoint(e.screen,t.clientX,t.clientY),e.global.copyFrom(e.screen),e.offset.copyFrom(e.screen),e.isTrusted=t.isTrusted,e.type==="pointerleave"&&(e.type="pointerout"),e.type.startsWith("mouse")&&(e.type=e.type.replace("mouse","pointer")),e.type.startsWith("touch")&&(e.type=ge[e.type]||e.type),e}_transferMouseData(e,t){e.isTrusted=t.isTrusted,e.srcElement=t.srcElement,e.timeStamp=performance.now(),e.type=t.type,e.altKey=t.altKey,e.button=t.button,e.buttons=t.buttons,e.client.x=t.clientX,e.client.y=t.clientY,e.ctrlKey=t.ctrlKey,e.metaKey=t.metaKey,e.movement.x=t.movementX,e.movement.y=t.movementY,e.page.x=t.pageX,e.page.y=t.pageY,e.relatedTarget=null,e.shiftKey=t.shiftKey}};B.extension={name:"events",type:[w.WebGLSystem,w.CanvasSystem,w.WebGPUSystem],priority:-1};B.defaultEventFeatures={move:!0,globalMove:!0,click:!0,wheel:!0};let q=B;const me={onclick:null,onmousedown:null,onmouseenter:null,onmouseleave:null,onmousemove:null,onglobalmousemove:null,onmouseout:null,onmouseover:null,onmouseup:null,onmouseupoutside:null,onpointercancel:null,onpointerdown:null,onpointerenter:null,onpointerleave:null,onpointermove:null,onglobalpointermove:null,onpointerout:null,onpointerover:null,onpointertap:null,onpointerup:null,onpointerupoutside:null,onrightclick:null,onrightdown:null,onrightup:null,onrightupoutside:null,ontap:null,ontouchcancel:null,ontouchend:null,ontouchendoutside:null,ontouchmove:null,onglobaltouchmove:null,ontouchstart:null,onwheel:null,get interactive(){return this.eventMode==="dynamic"||this.eventMode==="static"},set interactive(r){this.eventMode=r?"static":"passive"},_internalEventMode:void 0,get eventMode(){return this._internalEventMode??q.defaultEventMode},set eventMode(r){this._internalEventMode=r},isInteractive(){return this.eventMode==="static"||this.eventMode==="dynamic"},interactiveChildren:!0,hitArea:null,addEventListener(r,e,t){const i=typeof t=="boolean"&&t||typeof t=="object"&&t.capture,n=typeof t=="object"?t.signal:void 0,s=typeof t=="object"?t.once===!0:!1,o=typeof e=="function"?void 0:e;r=i?`${r}capture`:r;const a=typeof e=="function"?e:e.handleEvent,c=this;n&&n.addEventListener("abort",()=>{c.off(r,a,o)}),s?c.once(r,a,o):c.on(r,a,o)},removeEventListener(r,e,t){const i=typeof t=="boolean"&&t||typeof t=="object"&&t.capture,n=typeof e=="function"?void 0:e;r=i?`${r}capture`:r,e=typeof e=="function"?e:e.handleEvent,this.off(r,e,n)},dispatchEvent(r){if(!(r instanceof M))throw new Error("Container cannot propagate events outside of the Federated Events API");return r.defaultPrevented=!1,r.path=null,r.target=this,r.manager.dispatchEvent(r),!r.defaultPrevented}};z.add(V);Z.mixin(ue);z.add(q);Z.mixin(me); diff --git a/assets/colorToUniform-BiCyqw1t.js b/assets/colorToUniform-Bwj443Az.js similarity index 98% rename from assets/colorToUniform-BiCyqw1t.js rename to assets/colorToUniform-Bwj443Az.js index c2ef34a..58353ad 100644 --- a/assets/colorToUniform-BiCyqw1t.js +++ b/assets/colorToUniform-Bwj443Az.js @@ -1,4 +1,4 @@ -import{T as _,a as M,n as g}from"./index-qw10VO79.js";const P={normal:0,add:1,multiply:2,screen:3,overlay:4,erase:5,"normal-npm":6,"add-npm":7,"screen-npm":8,min:9,max:10},u=0,h=1,c=2,d=3,f=4,p=5,x=class b{constructor(){this.data=0,this.blendMode="normal",this.polygonOffset=0,this.blend=!0,this.depthMask=!0}get blend(){return!!(this.data&1<, diff --git a/assets/gems/Fire/3.png b/assets/gems/Fire/3.png new file mode 100644 index 0000000000000000000000000000000000000000..4736ff3d59ed490a2b0431de7ea2520fe4d16d88 GIT binary patch literal 6394 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/assets/gems/Fire/5.png b/assets/gems/Fire/5.png new file mode 100644 index 0000000000000000000000000000000000000000..f40d840401cf83811ba95fc4742511bfb199e733 GIT binary patch literal 6477 zcmV-T8M5YyP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 literal 0 HcmV?d00001 diff --git a/assets/gems/Fire/6.png b/assets/gems/Fire/6.png new file mode 100644 index 0000000000000000000000000000000000000000..ad0e01be76c0b1dc404f6f9d2c31e7df758d76b7 GIT binary patch literal 9076 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 B5~BbB literal 0 HcmV?d00001 diff --git a/assets/gui/frame_yellow.png b/assets/gui/frame_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..48de567ed51cf83c4d6093f0c64f8b5a51ceece9 GIT binary patch literal 58027 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 U$_fM?+W-In07*qoM6N<$g5%N-Z~y=R literal 0 HcmV?d00001 diff --git a/assets/index-CaN0mmVb.js b/assets/index-CaN0mmVb.js new file mode 100644 index 0000000..4fbff21 --- /dev/null +++ b/assets/index-CaN0mmVb.js @@ -0,0 +1,296 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/browserAll-D1aXoOVq.js","assets/webworkerAll-ClyFdN3X.js","assets/colorToUniform-Bwj443Az.js","assets/WebGPURenderer-DnAx_Qia.js","assets/SharedSystems-CRmOW3Kq.js","assets/WebGLRenderer-D9P4BJeq.js"])))=>i.map(i=>d[i]); +var La=Object.defineProperty;var Da=(i,t,e)=>t in i?La(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var p=(i,t,e)=>Da(i,typeof t!="symbol"?t+"":t,e);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))s(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&s(a)}).observe(document,{childList:!0,subtree:!0});function e(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerPolicy&&(r.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?r.credentials="include":n.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function s(n){if(n.ep)return;n.ep=!0;const r=e(n);fetch(n.href,r)}})();const za="modulepreload",Ua=function(i){return"/"+i},Qs={},mi=function(t,e,s){let n=Promise.resolve();if(e&&e.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),o=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));n=Promise.allSettled(e.map(h=>{if(h=Ua(h),h in Qs)return;Qs[h]=!0;const l=h.endsWith(".css"),c=l?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${c}`))return;const d=document.createElement("link");if(d.rel=l?"stylesheet":za,l||(d.as="script"),d.crossOrigin="",d.href=h,o&&d.setAttribute("nonce",o),document.head.appendChild(d),l)return new Promise((f,g)=>{d.addEventListener("load",f),d.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${h}`)))})}))}function r(a){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=a,window.dispatchEvent(o),!o.defaultPrevented)throw a}return n.then(a=>{for(const o of a||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};var k=(i=>(i.Application="application",i.WebGLPipes="webgl-pipes",i.WebGLPipesAdaptor="webgl-pipes-adaptor",i.WebGLSystem="webgl-system",i.WebGPUPipes="webgpu-pipes",i.WebGPUPipesAdaptor="webgpu-pipes-adaptor",i.WebGPUSystem="webgpu-system",i.CanvasSystem="canvas-system",i.CanvasPipesAdaptor="canvas-pipes-adaptor",i.CanvasPipes="canvas-pipes",i.Asset="asset",i.LoadParser="load-parser",i.ResolveParser="resolve-parser",i.CacheParser="cache-parser",i.DetectionParser="detection-parser",i.MaskEffect="mask-effect",i.BlendMode="blend-mode",i.TextureSource="texture-source",i.Environment="environment",i.ShapeBuilder="shape-builder",i.Batcher="batcher",i))(k||{});const rs=i=>{if(typeof i=="function"||typeof i=="object"&&i.extension){if(!i.extension)throw new Error("Extension class must have an extension object");i={...typeof i.extension!="object"?{type:i.extension}:i.extension,ref:i}}if(typeof i=="object")i={...i};else throw new Error("Invalid extension type");return typeof i.type=="string"&&(i.type=[i.type]),i},ei=(i,t)=>rs(i).priority??t,lt={_addHandlers:{},_removeHandlers:{},_queue:{},remove(...i){return i.map(rs).forEach(t=>{t.type.forEach(e=>{var s,n;return(n=(s=this._removeHandlers)[e])==null?void 0:n.call(s,t)})}),this},add(...i){return i.map(rs).forEach(t=>{t.type.forEach(e=>{var r,a;const s=this._addHandlers,n=this._queue;s[e]?(a=s[e])==null||a.call(s,t):(n[e]=n[e]||[],(r=n[e])==null||r.push(t))})}),this},handle(i,t,e){var a;const s=this._addHandlers,n=this._removeHandlers;if(s[i]||n[i])throw new Error(`Extension type ${i} already has a handler`);s[i]=t,n[i]=e;const r=this._queue;return r[i]&&((a=r[i])==null||a.forEach(o=>t(o)),delete r[i]),this},handleByMap(i,t){return this.handle(i,e=>{e.name&&(t[e.name]=e.ref)},e=>{e.name&&delete t[e.name]})},handleByNamedList(i,t,e=-1){return this.handle(i,s=>{t.findIndex(r=>r.name===s.name)>=0||(t.push({name:s.name,value:s.ref}),t.sort((r,a)=>ei(a.value,e)-ei(r.value,e)))},s=>{const n=t.findIndex(r=>r.name===s.name);n!==-1&&t.splice(n,1)})},handleByList(i,t,e=-1){return this.handle(i,s=>{t.includes(s.ref)||(t.push(s.ref),t.sort((n,r)=>ei(r,e)-ei(n,e)))},s=>{const n=t.indexOf(s.ref);n!==-1&&t.splice(n,1)})}},Oa={extension:{type:k.Environment,name:"browser",priority:-1},test:()=>!0,load:async()=>{await mi(()=>import("./browserAll-D1aXoOVq.js"),__vite__mapDeps([0,1,2]))}},Wa={extension:{type:k.Environment,name:"webworker",priority:0},test:()=>typeof self<"u"&&self.WorkerGlobalScope!==void 0,load:async()=>{await mi(()=>import("./webworkerAll-ClyFdN3X.js"),__vite__mapDeps([1,2]))}};class ft{constructor(t,e,s){this._x=e||0,this._y=s||0,this._observer=t}clone(t){return new ft(t??this._observer,this._x,this._y)}set(t=0,e=t){return(this._x!==t||this._y!==e)&&(this._x=t,this._y=e,this._observer._onUpdate(this)),this}copyFrom(t){return(this._x!==t.x||this._y!==t.y)&&(this._x=t.x,this._y=t.y,this._observer._onUpdate(this)),this}copyTo(t){return t.set(this._x,this._y),t}equals(t){return t.x===this._x&&t.y===this._y}toString(){return`[pixi.js/math:ObservablePoint x=0 y=0 scope=${this._observer}]`}get x(){return this._x}set x(t){this._x!==t&&(this._x=t,this._observer._onUpdate(this))}get y(){return this._y}set y(t){this._y!==t&&(this._y=t,this._observer._onUpdate(this))}}function Ps(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var ir={exports:{}};(function(i){var t=Object.prototype.hasOwnProperty,e="~";function s(){}Object.create&&(s.prototype=Object.create(null),new s().__proto__||(e=!1));function n(h,l,c){this.fn=h,this.context=l,this.once=c||!1}function r(h,l,c,d,f){if(typeof c!="function")throw new TypeError("The listener must be a function");var g=new n(c,d||h,f),m=e?e+l:l;return h._events[m]?h._events[m].fn?h._events[m]=[h._events[m],g]:h._events[m].push(g):(h._events[m]=g,h._eventsCount++),h}function a(h,l){--h._eventsCount===0?h._events=new s:delete h._events[l]}function o(){this._events=new s,this._eventsCount=0}o.prototype.eventNames=function(){var l=[],c,d;if(this._eventsCount===0)return l;for(d in c=this._events)t.call(c,d)&&l.push(e?d.slice(1):d);return Object.getOwnPropertySymbols?l.concat(Object.getOwnPropertySymbols(c)):l},o.prototype.listeners=function(l){var c=e?e+l:l,d=this._events[c];if(!d)return[];if(d.fn)return[d.fn];for(var f=0,g=d.length,m=new Array(g);fJt[i],uY:i=>te[i],vX:i=>ee[i],vY:i=>ie[i],inv:i=>i&8?i&15:-i&7,add:(i,t)=>as[i][t],sub:(i,t)=>as[i][X.inv(t)],rotate180:i=>i^4,isVertical:i=>(i&3)===2,byDirection:(i,t)=>Math.abs(i)*2<=Math.abs(t)?t>=0?X.S:X.N:Math.abs(t)*2<=Math.abs(i)?i>0?X.E:X.W:t>0?i>0?X.SE:X.SW:i>0?X.NE:X.NW,matrixAppendRotationInv:(i,t,e=0,s=0)=>{const n=sr[X.inv(t)];n.tx=e,n.ty=s,i.append(n)}},si=[new ht,new ht,new ht,new ht];class E{constructor(t=0,e=0,s=0,n=0){this.type="rectangle",this.x=Number(t),this.y=Number(e),this.width=Number(s),this.height=Number(n)}get left(){return this.x}get right(){return this.x+this.width}get top(){return this.y}get bottom(){return this.y+this.height}isEmpty(){return this.left===this.right||this.top===this.bottom}static get EMPTY(){return new E(0,0,0,0)}clone(){return new E(this.x,this.y,this.width,this.height)}copyFromBounds(t){return this.x=t.minX,this.y=t.minY,this.width=t.maxX-t.minX,this.height=t.maxY-t.minY,this}copyFrom(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this}copyTo(t){return t.copyFrom(this),t}contains(t,e){return this.width<=0||this.height<=0?!1:t>=this.x&&t=this.y&&e=h&&t<=l&&e>=c&&e<=d&&!(t>f&&tm&&et.right?t.right:this.right)<=G)return!1;const T=this.yt.bottom?t.bottom:this.bottom)>T}const s=this.left,n=this.right,r=this.top,a=this.bottom;if(n<=s||a<=r)return!1;const o=si[0].set(t.left,t.top),h=si[1].set(t.left,t.bottom),l=si[2].set(t.right,t.top),c=si[3].set(t.right,t.bottom);if(l.x<=o.x||h.y<=o.y)return!1;const d=Math.sign(e.a*e.d-e.b*e.c);if(d===0||(e.apply(o,o),e.apply(h,h),e.apply(l,l),e.apply(c,c),Math.max(o.x,h.x,l.x,c.x)<=s||Math.min(o.x,h.x,l.x,c.x)>=n||Math.max(o.y,h.y,l.y,c.y)<=r||Math.min(o.y,h.y,l.y,c.y)>=a))return!1;const f=d*(h.y-o.y),g=d*(o.x-h.x),m=f*s+g*r,y=f*n+g*r,x=f*s+g*a,w=f*n+g*a;if(Math.max(m,y,x,w)<=f*o.x+g*o.y||Math.min(m,y,x,w)>=f*c.x+g*c.y)return!1;const _=d*(o.y-l.y),b=d*(l.x-o.x),S=_*s+b*r,A=_*n+b*r,F=_*s+b*a,P=_*n+b*a;return!(Math.max(S,A,F,P)<=_*o.x+b*o.y||Math.min(S,A,F,P)>=_*c.x+b*c.y)}pad(t=0,e=t){return this.x-=t,this.y-=e,this.width+=t*2,this.height+=e*2,this}fit(t){const e=Math.max(this.x,t.x),s=Math.min(this.x+this.width,t.x+t.width),n=Math.max(this.y,t.y),r=Math.min(this.y+this.height,t.y+t.height);return this.x=e,this.width=Math.max(s-e,0),this.y=n,this.height=Math.max(r-n,0),this}ceil(t=1,e=.001){const s=Math.ceil((this.x+this.width-e)*t)/t,n=Math.ceil((this.y+this.height-e)*t)/t;return this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=s-this.x,this.height=n-this.y,this}enlarge(t){const e=Math.min(this.x,t.x),s=Math.max(this.x+this.width,t.x+t.width),n=Math.min(this.y,t.y),r=Math.max(this.y+this.height,t.y+t.height);return this.x=e,this.width=s-e,this.y=n,this.height=r-n,this}getBounds(t){return t=t||new E,t.copyFrom(this),t}toString(){return`[pixi.js/math:Rectangle x=${this.x} y=${this.y} width=${this.width} height=${this.height}]`}}const Ei={default:-1};function nt(i="default"){return Ei[i]===void 0&&(Ei[i]=-1),++Ei[i]}const Js={},W="8.0.0",qa="8.3.4";function U(i,t,e=3){if(Js[t])return;let s=new Error().stack;typeof s>"u"?console.warn("PixiJS Deprecation Warning: ",`${t} +Deprecated since v${i}`):(s=s.split(` +`).splice(e).join(` +`),console.groupCollapsed?(console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s","color:#614108;background:#fffbe6","font-weight:normal;color:#614108;background:#fffbe6",`${t} +Deprecated since v${i}`),console.warn(s),console.groupEnd()):(console.warn("PixiJS Deprecation Warning: ",`${t} +Deprecated since v${i}`),console.warn(s))),Js[t]=!0}const nr=()=>{};function tn(i){return i+=i===0?1:0,--i,i|=i>>>1,i|=i>>>2,i|=i>>>4,i|=i>>>8,i|=i>>>16,i+1}function en(i){return!(i&i-1)&&!!i}function Ka(i){const t={};for(const e in i)i[e]!==void 0&&(t[e]=i[e]);return t}const sn=Object.create(null);function Za(i){const t=sn[i];return t===void 0&&(sn[i]=nt("resource")),t}const rr=class ar extends pt{constructor(t={}){super(),this._resourceType="textureSampler",this._touched=0,this._maxAnisotropy=1,this.destroyed=!1,t={...ar.defaultOptions,...t},this.addressMode=t.addressMode,this.addressModeU=t.addressModeU??this.addressModeU,this.addressModeV=t.addressModeV??this.addressModeV,this.addressModeW=t.addressModeW??this.addressModeW,this.scaleMode=t.scaleMode,this.magFilter=t.magFilter??this.magFilter,this.minFilter=t.minFilter??this.minFilter,this.mipmapFilter=t.mipmapFilter??this.mipmapFilter,this.lodMinClamp=t.lodMinClamp,this.lodMaxClamp=t.lodMaxClamp,this.compare=t.compare,this.maxAnisotropy=t.maxAnisotropy??1}set addressMode(t){this.addressModeU=t,this.addressModeV=t,this.addressModeW=t}get addressMode(){return this.addressModeU}set wrapMode(t){U(W,"TextureStyle.wrapMode is now TextureStyle.addressMode"),this.addressMode=t}get wrapMode(){return this.addressMode}set scaleMode(t){this.magFilter=t,this.minFilter=t,this.mipmapFilter=t}get scaleMode(){return this.magFilter}set maxAnisotropy(t){this._maxAnisotropy=Math.min(t,16),this._maxAnisotropy>1&&(this.scaleMode="linear")}get maxAnisotropy(){return this._maxAnisotropy}get _resourceId(){return this._sharedResourceId||this._generateResourceId()}update(){this.emit("change",this),this._sharedResourceId=null}_generateResourceId(){const t=`${this.addressModeU}-${this.addressModeV}-${this.addressModeW}-${this.magFilter}-${this.minFilter}-${this.mipmapFilter}-${this.lodMinClamp}-${this.lodMaxClamp}-${this.compare}-${this._maxAnisotropy}`;return this._sharedResourceId=Za(t),this._resourceId}destroy(){this.destroyed=!0,this.emit("destroy",this),this.emit("change",this),this.removeAllListeners()}};rr.defaultOptions={addressMode:"clamp-to-edge",scaleMode:"linear"};let Qa=rr;const or=class hr extends pt{constructor(t={}){super(),this.options=t,this.uid=nt("textureSource"),this._resourceType="textureSource",this._resourceId=nt("resource"),this.uploadMethodId="unknown",this._resolution=1,this.pixelWidth=1,this.pixelHeight=1,this.width=1,this.height=1,this.sampleCount=1,this.mipLevelCount=1,this.autoGenerateMipmaps=!1,this.format="rgba8unorm",this.dimension="2d",this.antialias=!1,this._touched=0,this._batchTick=-1,this._textureBindLocation=-1,t={...hr.defaultOptions,...t},this.label=t.label??"",this.resource=t.resource,this.autoGarbageCollect=t.autoGarbageCollect,this._resolution=t.resolution,t.width?this.pixelWidth=t.width*this._resolution:this.pixelWidth=this.resource?this.resourceWidth??1:1,t.height?this.pixelHeight=t.height*this._resolution:this.pixelHeight=this.resource?this.resourceHeight??1:1,this.width=this.pixelWidth/this._resolution,this.height=this.pixelHeight/this._resolution,this.format=t.format,this.dimension=t.dimensions,this.mipLevelCount=t.mipLevelCount,this.autoGenerateMipmaps=t.autoGenerateMipmaps,this.sampleCount=t.sampleCount,this.antialias=t.antialias,this.alphaMode=t.alphaMode,this.style=new Qa(Ka(t)),this.destroyed=!1,this._refreshPOT()}get source(){return this}get style(){return this._style}set style(t){var e,s;this.style!==t&&((e=this._style)==null||e.off("change",this._onStyleChange,this),this._style=t,(s=this._style)==null||s.on("change",this._onStyleChange,this),this._onStyleChange())}get addressMode(){return this._style.addressMode}set addressMode(t){this._style.addressMode=t}get repeatMode(){return this._style.addressMode}set repeatMode(t){this._style.addressMode=t}get magFilter(){return this._style.magFilter}set magFilter(t){this._style.magFilter=t}get minFilter(){return this._style.minFilter}set minFilter(t){this._style.minFilter=t}get mipmapFilter(){return this._style.mipmapFilter}set mipmapFilter(t){this._style.mipmapFilter=t}get lodMinClamp(){return this._style.lodMinClamp}set lodMinClamp(t){this._style.lodMinClamp=t}get lodMaxClamp(){return this._style.lodMaxClamp}set lodMaxClamp(t){this._style.lodMaxClamp=t}_onStyleChange(){this.emit("styleChange",this)}update(){if(this.resource){const t=this._resolution;if(this.resize(this.resourceWidth/t,this.resourceHeight/t))return}this.emit("update",this)}destroy(){this.destroyed=!0,this.emit("destroy",this),this.emit("change",this),this._style&&(this._style.destroy(),this._style=null),this.uploadMethodId=null,this.resource=null,this.removeAllListeners()}unload(){this._resourceId=nt("resource"),this.emit("change",this),this.emit("unload",this)}get resourceWidth(){const{resource:t}=this;return t.naturalWidth||t.videoWidth||t.displayWidth||t.width}get resourceHeight(){const{resource:t}=this;return t.naturalHeight||t.videoHeight||t.displayHeight||t.height}get resolution(){return this._resolution}set resolution(t){this._resolution!==t&&(this._resolution=t,this.width=this.pixelWidth/t,this.height=this.pixelHeight/t)}resize(t,e,s){s=s||this._resolution,t=t||this.width,e=e||this.height;const n=Math.round(t*s),r=Math.round(e*s);return this.width=n/s,this.height=r/s,this._resolution=s,this.pixelWidth===n&&this.pixelHeight===r?!1:(this._refreshPOT(),this.pixelWidth=n,this.pixelHeight=r,this.emit("resize",this),this._resourceId=nt("resource"),this.emit("change",this),!0)}updateMipmaps(){this.autoGenerateMipmaps&&this.mipLevelCount>1&&this.emit("updateMipmaps",this)}set wrapMode(t){this._style.wrapMode=t}get wrapMode(){return this._style.wrapMode}set scaleMode(t){this._style.scaleMode=t}get scaleMode(){return this._style.scaleMode}_refreshPOT(){this.isPowerOfTwo=en(this.pixelWidth)&&en(this.pixelHeight)}static test(t){throw new Error("Unimplemented")}};or.defaultOptions={resolution:1,format:"bgra8unorm",alphaMode:"premultiply-alpha-on-upload",dimensions:"2d",mipLevelCount:1,autoGenerateMipmaps:!1,sampleCount:1,antialias:!1,autoGarbageCollect:!1};let Ot=or;class ks extends Ot{constructor(t){const e=t.resource||new Float32Array(t.width*t.height*4);let s=t.format;s||(e instanceof Float32Array?s="rgba32float":e instanceof Int32Array||e instanceof Uint32Array?s="rgba32uint":e instanceof Int16Array||e instanceof Uint16Array?s="rgba16uint":(e instanceof Int8Array,s="bgra8unorm")),super({...t,resource:e,format:s}),this.uploadMethodId="buffer"}static test(t){return t instanceof Int8Array||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array}}ks.extension=k.TextureSource;const nn=new H;class Ja{constructor(t,e){this.mapCoord=new H,this.uClampFrame=new Float32Array(4),this.uClampOffset=new Float32Array(2),this._textureID=-1,this._updateID=0,this.clampOffset=0,typeof e>"u"?this.clampMargin=t.width<10?0:.5:this.clampMargin=e,this.isSimple=!1,this.texture=t}get texture(){return this._texture}set texture(t){var e;this.texture!==t&&((e=this._texture)==null||e.removeListener("update",this.update,this),this._texture=t,this._texture.addListener("update",this.update,this),this.update())}multiplyUvs(t,e){e===void 0&&(e=t);const s=this.mapCoord;for(let n=0;nthis.maxX||this.minY>this.maxY}get rectangle(){this._rectangle||(this._rectangle=new E);const t=this._rectangle;return this.minX>this.maxX||this.minY>this.maxY?(t.x=0,t.y=0,t.width=0,t.height=0):t.copyFromBounds(this),t}clear(){return this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.matrix=rn,this}set(t,e,s,n){this.minX=t,this.minY=e,this.maxX=s,this.maxY=n}addFrame(t,e,s,n,r){r||(r=this.matrix);const a=r.a,o=r.b,h=r.c,l=r.d,c=r.tx,d=r.ty;let f=this.minX,g=this.minY,m=this.maxX,y=this.maxY,x=a*t+h*e+c,w=o*t+l*e+d;xm&&(m=x),w>y&&(y=w),x=a*s+h*e+c,w=o*s+l*e+d,xm&&(m=x),w>y&&(y=w),x=a*t+h*n+c,w=o*t+l*n+d,xm&&(m=x),w>y&&(y=w),x=a*s+h*n+c,w=o*s+l*n+d,xm&&(m=x),w>y&&(y=w),this.minX=f,this.minY=g,this.maxX=m,this.maxY=y}addRect(t,e){this.addFrame(t.x,t.y,t.x+t.width,t.y+t.height,e)}addBounds(t,e){this.addFrame(t.minX,t.minY,t.maxX,t.maxY,e)}addBoundsMask(t){this.minX=this.minX>t.minX?this.minX:t.minX,this.minY=this.minY>t.minY?this.minY:t.minY,this.maxX=this.maxXthis.maxX?f:this.maxX,this.maxY=g>this.maxY?g:this.maxY,f=a*e+h*r+c,g=o*e+l*r+d,this.minX=fthis.maxX?f:this.maxX,this.maxY=g>this.maxY?g:this.maxY,f=a*n+h*r+c,g=o*n+l*r+d,this.minX=fthis.maxX?f:this.maxX,this.maxY=g>this.maxY?g:this.maxY}fit(t){return this.minXt.right&&(this.maxX=t.right),this.minYt.bottom&&(this.maxY=t.bottom),this}fitBounds(t,e,s,n){return this.minXe&&(this.maxX=e),this.minYn&&(this.maxY=n),this}pad(t,e=t){return this.minX-=t,this.maxX+=t,this.minY-=e,this.maxY+=e,this}ceil(){return this.minX=Math.floor(this.minX),this.minY=Math.floor(this.minY),this.maxX=Math.ceil(this.maxX),this.maxY=Math.ceil(this.maxY),this}clone(){return new It(this.minX,this.minY,this.maxX,this.maxY)}scale(t,e=t){return this.minX*=t,this.minY*=e,this.maxX*=t,this.maxY*=e,this}get x(){return this.minX}set x(t){const e=this.maxX-this.minX;this.minX=t,this.maxX=t+e}get y(){return this.minY}set y(t){const e=this.maxY-this.minY;this.minY=t,this.maxY=t+e}get width(){return this.maxX-this.minX}set width(t){this.maxX=this.minX+t}get height(){return this.maxY-this.minY}set height(t){this.maxY=this.minY+t}get left(){return this.minX}get right(){return this.maxX}get top(){return this.minY}get bottom(){return this.maxY}get isPositive(){return this.maxX-this.minX>0&&this.maxY-this.minY>0}get isValid(){return this.minX+this.minY!==1/0}addVertexData(t,e,s,n){let r=this.minX,a=this.minY,o=this.maxX,h=this.maxY;n||(n=this.matrix);const l=n.a,c=n.b,d=n.c,f=n.d,g=n.tx,m=n.ty;for(let y=e;yo?_:o,h=b>h?b:h}this.minX=r,this.minY=a,this.maxX=o,this.maxY=h}containsPoint(t,e){return this.minX<=t&&this.minY<=e&&this.maxX>=t&&this.maxY>=e}toString(){return`[pixi.js:Bounds minX=${this.minX} minY=${this.minY} maxX=${this.maxX} maxY=${this.maxY} width=${this.width} height=${this.height}]`}}var eo={grad:.9,turn:360,rad:360/(2*Math.PI)},Rt=function(i){return typeof i=="string"?i.length>0:typeof i=="number"},at=function(i,t,e){return t===void 0&&(t=0),e===void 0&&(e=Math.pow(10,t)),Math.round(e*i)/e+0},yt=function(i,t,e){return t===void 0&&(t=0),e===void 0&&(e=1),i>e?e:i>t?i:t},lr=function(i){return(i=isFinite(i)?i%360:0)>0?i:i+360},an=function(i){return{r:yt(i.r,0,255),g:yt(i.g,0,255),b:yt(i.b,0,255),a:yt(i.a)}},Ri=function(i){return{r:at(i.r),g:at(i.g),b:at(i.b),a:at(i.a,3)}},io=/^#([0-9a-f]{3,8})$/i,ni=function(i){var t=i.toString(16);return t.length<2?"0"+t:t},cr=function(i){var t=i.r,e=i.g,s=i.b,n=i.a,r=Math.max(t,e,s),a=r-Math.min(t,e,s),o=a?r===t?(e-s)/a:r===e?2+(s-t)/a:4+(t-e)/a:0;return{h:60*(o<0?o+6:o),s:r?a/r*100:0,v:r/255*100,a:n}},dr=function(i){var t=i.h,e=i.s,s=i.v,n=i.a;t=t/360*6,e/=100,s/=100;var r=Math.floor(t),a=s*(1-e),o=s*(1-(t-r)*e),h=s*(1-(1-t+r)*e),l=r%6;return{r:255*[s,o,a,a,h,s][l],g:255*[h,s,s,o,a,a][l],b:255*[a,a,h,s,s,o][l],a:n}},on=function(i){return{h:lr(i.h),s:yt(i.s,0,100),l:yt(i.l,0,100),a:yt(i.a)}},hn=function(i){return{h:at(i.h),s:at(i.s),l:at(i.l),a:at(i.a,3)}},ln=function(i){return dr((e=(t=i).s,{h:t.h,s:(e*=((s=t.l)<50?s:100-s)/100)>0?2*e/(s+e)*100:0,v:s+e,a:t.a}));var t,e,s},Oe=function(i){return{h:(t=cr(i)).h,s:(n=(200-(e=t.s))*(s=t.v)/100)>0&&n<200?e*s/100/(n<=100?n:200-n)*100:0,l:n/2,a:t.a};var t,e,s,n},so=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,no=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,ro=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,ao=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,os={string:[[function(i){var t=io.exec(i);return t?(i=t[1]).length<=4?{r:parseInt(i[0]+i[0],16),g:parseInt(i[1]+i[1],16),b:parseInt(i[2]+i[2],16),a:i.length===4?at(parseInt(i[3]+i[3],16)/255,2):1}:i.length===6||i.length===8?{r:parseInt(i.substr(0,2),16),g:parseInt(i.substr(2,2),16),b:parseInt(i.substr(4,2),16),a:i.length===8?at(parseInt(i.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(i){var t=ro.exec(i)||ao.exec(i);return t?t[2]!==t[4]||t[4]!==t[6]?null:an({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===void 0?1:Number(t[7])/(t[8]?100:1)}):null},"rgb"],[function(i){var t=so.exec(i)||no.exec(i);if(!t)return null;var e,s,n=on({h:(e=t[1],s=t[2],s===void 0&&(s="deg"),Number(e)*(eo[s]||1)),s:Number(t[3]),l:Number(t[4]),a:t[5]===void 0?1:Number(t[5])/(t[6]?100:1)});return ln(n)},"hsl"]],object:[[function(i){var t=i.r,e=i.g,s=i.b,n=i.a,r=n===void 0?1:n;return Rt(t)&&Rt(e)&&Rt(s)?an({r:Number(t),g:Number(e),b:Number(s),a:Number(r)}):null},"rgb"],[function(i){var t=i.h,e=i.s,s=i.l,n=i.a,r=n===void 0?1:n;if(!Rt(t)||!Rt(e)||!Rt(s))return null;var a=on({h:Number(t),s:Number(e),l:Number(s),a:Number(r)});return ln(a)},"hsl"],[function(i){var t=i.h,e=i.s,s=i.v,n=i.a,r=n===void 0?1:n;if(!Rt(t)||!Rt(e)||!Rt(s))return null;var a=function(o){return{h:lr(o.h),s:yt(o.s,0,100),v:yt(o.v,0,100),a:yt(o.a)}}({h:Number(t),s:Number(e),v:Number(s),a:Number(r)});return dr(a)},"hsv"]]},cn=function(i,t){for(var e=0;e=.5},i.prototype.toHex=function(){return t=Ri(this.rgba),e=t.r,s=t.g,n=t.b,a=(r=t.a)<1?ni(at(255*r)):"","#"+ni(e)+ni(s)+ni(n)+a;var t,e,s,n,r,a},i.prototype.toRgb=function(){return Ri(this.rgba)},i.prototype.toRgbString=function(){return t=Ri(this.rgba),e=t.r,s=t.g,n=t.b,(r=t.a)<1?"rgba("+e+", "+s+", "+n+", "+r+")":"rgb("+e+", "+s+", "+n+")";var t,e,s,n,r},i.prototype.toHsl=function(){return hn(Oe(this.rgba))},i.prototype.toHslString=function(){return t=hn(Oe(this.rgba)),e=t.h,s=t.s,n=t.l,(r=t.a)<1?"hsla("+e+", "+s+"%, "+n+"%, "+r+")":"hsl("+e+", "+s+"%, "+n+"%)";var t,e,s,n,r},i.prototype.toHsv=function(){return t=cr(this.rgba),{h:at(t.h),s:at(t.s),v:at(t.v),a:at(t.a,3)};var t},i.prototype.invert=function(){return Pt({r:255-(t=this.rgba).r,g:255-t.g,b:255-t.b,a:t.a});var t},i.prototype.saturate=function(t){return t===void 0&&(t=.1),Pt(Fi(this.rgba,t))},i.prototype.desaturate=function(t){return t===void 0&&(t=.1),Pt(Fi(this.rgba,-t))},i.prototype.grayscale=function(){return Pt(Fi(this.rgba,-1))},i.prototype.lighten=function(t){return t===void 0&&(t=.1),Pt(dn(this.rgba,t))},i.prototype.darken=function(t){return t===void 0&&(t=.1),Pt(dn(this.rgba,-t))},i.prototype.rotate=function(t){return t===void 0&&(t=15),this.hue(this.hue()+t)},i.prototype.alpha=function(t){return typeof t=="number"?Pt({r:(e=this.rgba).r,g:e.g,b:e.b,a:t}):at(this.rgba.a,3);var e},i.prototype.hue=function(t){var e=Oe(this.rgba);return typeof t=="number"?Pt({h:t,s:e.s,l:e.l,a:e.a}):at(e.h)},i.prototype.isEqual=function(t){return this.toHex()===Pt(t).toHex()},i}(),Pt=function(i){return i instanceof hs?i:new hs(i)},un=[],ho=function(i){i.forEach(function(t){un.indexOf(t)<0&&(t(hs,os),un.push(t))})};function lo(i,t){var e={white:"#ffffff",bisque:"#ffe4c4",blue:"#0000ff",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",antiquewhite:"#faebd7",aqua:"#00ffff",azure:"#f0ffff",whitesmoke:"#f5f5f5",papayawhip:"#ffefd5",plum:"#dda0dd",blanchedalmond:"#ffebcd",black:"#000000",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",cornsilk:"#fff8dc",cornflowerblue:"#6495ed",burlywood:"#deb887",aquamarine:"#7fffd4",beige:"#f5f5dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkkhaki:"#bdb76b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",peachpuff:"#ffdab9",darkmagenta:"#8b008b",darkred:"#8b0000",darkorchid:"#9932cc",darkorange:"#ff8c00",darkslateblue:"#483d8b",gray:"#808080",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",deeppink:"#ff1493",deepskyblue:"#00bfff",wheat:"#f5deb3",firebrick:"#b22222",floralwhite:"#fffaf0",ghostwhite:"#f8f8ff",darkviolet:"#9400d3",magenta:"#ff00ff",green:"#008000",dodgerblue:"#1e90ff",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",blueviolet:"#8a2be2",forestgreen:"#228b22",lawngreen:"#7cfc00",indianred:"#cd5c5c",indigo:"#4b0082",fuchsia:"#ff00ff",brown:"#a52a2a",maroon:"#800000",mediumblue:"#0000cd",lightcoral:"#f08080",darkturquoise:"#00ced1",lightcyan:"#e0ffff",ivory:"#fffff0",lightyellow:"#ffffe0",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",linen:"#faf0e6",mediumaquamarine:"#66cdaa",lemonchiffon:"#fffacd",lime:"#00ff00",khaki:"#f0e68c",mediumseagreen:"#3cb371",limegreen:"#32cd32",mediumspringgreen:"#00fa9a",lightskyblue:"#87cefa",lightblue:"#add8e6",midnightblue:"#191970",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",mintcream:"#f5fffa",lightslategray:"#778899",lightslategrey:"#778899",navajowhite:"#ffdead",navy:"#000080",mediumvioletred:"#c71585",powderblue:"#b0e0e6",palegoldenrod:"#eee8aa",oldlace:"#fdf5e6",paleturquoise:"#afeeee",mediumturquoise:"#48d1cc",mediumorchid:"#ba55d3",rebeccapurple:"#663399",lightsteelblue:"#b0c4de",mediumslateblue:"#7b68ee",thistle:"#d8bfd8",tan:"#d2b48c",orchid:"#da70d6",mediumpurple:"#9370db",purple:"#800080",pink:"#ffc0cb",skyblue:"#87ceeb",springgreen:"#00ff7f",palegreen:"#98fb98",red:"#ff0000",yellow:"#ffff00",slateblue:"#6a5acd",lavenderblush:"#fff0f5",peru:"#cd853f",palevioletred:"#db7093",violet:"#ee82ee",teal:"#008080",slategray:"#708090",slategrey:"#708090",aliceblue:"#f0f8ff",darkseagreen:"#8fbc8f",darkolivegreen:"#556b2f",greenyellow:"#adff2f",seagreen:"#2e8b57",seashell:"#fff5ee",tomato:"#ff6347",silver:"#c0c0c0",sienna:"#a0522d",lavender:"#e6e6fa",lightgreen:"#90ee90",orange:"#ffa500",orangered:"#ff4500",steelblue:"#4682b4",royalblue:"#4169e1",turquoise:"#40e0d0",yellowgreen:"#9acd32",salmon:"#fa8072",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",darksalmon:"#e9967a",lightgoldenrodyellow:"#fafad2",snow:"#fffafa",lightgrey:"#d3d3d3",lightgray:"#d3d3d3",dimgray:"#696969",dimgrey:"#696969",olivedrab:"#6b8e23",olive:"#808000"},s={};for(var n in e)s[e[n]]=n;var r={};i.prototype.toName=function(a){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return"transparent";var o,h,l=s[this.toHex()];if(l)return l;if(a!=null&&a.closest){var c=this.toRgb(),d=1/0,f="black";if(!r.length)for(var g in e)r[g]=new i(e[g]).toRgb();for(var m in e){var y=(o=c,h=r[m],Math.pow(o.r-h.r,2)+Math.pow(o.g-h.g,2)+Math.pow(o.b-h.b,2));yr===e[a]);if(t!==null&&e!==null){const r=Object.keys(t),a=Object.keys(e);return r.length!==a.length?!1:r.every(o=>t[o]===e[o])}return t===e}toRgba(){const[t,e,s,n]=this._components;return{r:t,g:e,b:s,a:n}}toRgb(){const[t,e,s]=this._components;return{r:t,g:e,b:s}}toRgbaString(){const[t,e,s]=this.toUint8RgbArray();return`rgba(${t},${e},${s},${this.alpha})`}toUint8RgbArray(t){const[e,s,n]=this._components;return this._arrayRgb||(this._arrayRgb=[]),t=t||this._arrayRgb,t[0]=Math.round(e*255),t[1]=Math.round(s*255),t[2]=Math.round(n*255),t}toArray(t){this._arrayRgba||(this._arrayRgba=[]),t=t||this._arrayRgba;const[e,s,n,r]=this._components;return t[0]=e,t[1]=s,t[2]=n,t[3]=r,t}toRgbArray(t){this._arrayRgb||(this._arrayRgb=[]),t=t||this._arrayRgb;const[e,s,n]=this._components;return t[0]=e,t[1]=s,t[2]=n,t}toNumber(){return this._int}toBgrNumber(){const[t,e,s]=this.toUint8RgbArray();return(s<<16)+(e<<8)+t}toLittleEndianNumber(){const t=this._int;return(t>>16)+(t&65280)+((t&255)<<16)}multiply(t){const[e,s,n,r]=Le._temp.setValue(t)._components;return this._components[0]*=e,this._components[1]*=s,this._components[2]*=n,this._components[3]*=r,this._refreshInt(),this._value=null,this}premultiply(t,e=!0){return e&&(this._components[0]*=t,this._components[1]*=t,this._components[2]*=t),this._components[3]=t,this._refreshInt(),this._value=null,this}toPremultiplied(t,e=!0){if(t===1)return(255<<24)+this._int;if(t===0)return e?0:this._int;let s=this._int>>16&255,n=this._int>>8&255,r=this._int&255;return e&&(s=s*t+.5|0,n=n*t+.5|0,r=r*t+.5|0),(t*255<<24)+(s<<16)+(n<<8)+r}toHex(){const t=this._int.toString(16);return`#${"000000".substring(0,6-t.length)+t}`}toHexa(){const e=Math.round(this._components[3]*255).toString(16);return this.toHex()+"00".substring(0,2-e.length)+e}setAlpha(t){return this._components[3]=this._clamp(t),this}_normalize(t){let e,s,n,r;if((typeof t=="number"||t instanceof Number)&&t>=0&&t<=16777215){const a=t;e=(a>>16&255)/255,s=(a>>8&255)/255,n=(a&255)/255,r=1}else if((Array.isArray(t)||t instanceof Float32Array)&&t.length>=3&&t.length<=4)t=this._clamp(t),[e,s,n,r=1]=t;else if((t instanceof Uint8Array||t instanceof Uint8ClampedArray)&&t.length>=3&&t.length<=4)t=this._clamp(t,0,255),[e,s,n,r=255]=t,e/=255,s/=255,n/=255,r/=255;else if(typeof t=="string"||typeof t=="object"){if(typeof t=="string"){const o=Le.HEX_PATTERN.exec(t);o&&(t=`#${o[2]}`)}const a=Pt(t);a.isValid()&&({r:e,g:s,b:n,a:r}=a.rgba,e/=255,s/=255,n/=255)}if(e!==void 0)this._components[0]=e,this._components[1]=s,this._components[2]=n,this._components[3]=r,this._refreshInt();else throw new Error(`Unable to convert color ${t}`)}_refreshInt(){this._clamp(this._components);const[t,e,s]=this._components;this._int=(t*255<<16)+(e*255<<8)+(s*255|0)}_clamp(t,e=0,s=1){return typeof t=="number"?Math.min(Math.max(t,e),s):(t.forEach((n,r)=>{t[r]=Math.min(Math.max(n,e),s)}),t)}static isColorLike(t){return typeof t=="number"||typeof t=="string"||t instanceof Number||t instanceof Le||Array.isArray(t)||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t.r!==void 0&&t.g!==void 0&&t.b!==void 0||t.r!==void 0&&t.g!==void 0&&t.b!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0&&t.a!==void 0}};me.shared=new me;me._temp=new me;me.HEX_PATTERN=/^(#|0x)?(([a-f0-9]{3}){1,2}([a-f0-9]{2})?)$/i;let Z=me;const co={cullArea:null,cullable:!1,cullableChildren:!0};class Gs{constructor(t,e){this._pool=[],this._count=0,this._index=0,this._classType=t,e&&this.prepopulate(e)}prepopulate(t){for(let e=0;e0?e=this._pool[--this._index]:e=new this._classType,(s=e.init)==null||s.call(e,t),e}return(t){var e;(e=t.reset)==null||e.call(t),this._pool[this._index++]=t}get totalSize(){return this._count}get totalFree(){return this._index}get totalUsed(){return this._count-this._index}clear(){this._pool.length=0,this._index=0}}class uo{constructor(){this._poolsByClass=new Map}prepopulate(t,e){this.getPool(t).prepopulate(e)}get(t,e){return this.getPool(t).get(e)}return(t){this.getPool(t.constructor).return(t)}getPool(t){return this._poolsByClass.has(t)||this._poolsByClass.set(t,new Gs(t)),this._poolsByClass.get(t)}stats(){const t={};return this._poolsByClass.forEach(e=>{const s=t[e._classType.name]?e._classType.name+e._classType.ID:e._classType.name;t[s]={free:e.totalFree,used:e.totalUsed,size:e.totalSize}}),t}}const zt=new uo;function fo(i,t,e){const s=i.length;let n;if(t>=s||e===0)return;e=t+e>s?s-t:e;const r=s-e;for(n=t;n0&&s<=e){for(let a=e-1;a>=i;a--){const o=this.children[a];o&&(n.push(o),o.parent=null)}fo(this.children,i,e);const r=this.renderGroup||this.parentRenderGroup;r&&r.removeChildren(n);for(let a=0;a=this.children.length)throw new Error(`getChildAt: Index (${i}) does not exist.`);return this.children[i]},setChildIndex(i,t){if(t<0||t>=this.children.length)throw new Error(`The index ${t} supplied is out of bounds ${this.children.length}`);this.getChildIndex(i),this.addChildAt(i,t)},getChildIndex(i){const t=this.children.indexOf(i);if(t===-1)throw new Error("The supplied Container must be a child of the caller");return t},addChildAt(i,t){this.allowChildren||U(W,"addChildAt: Only Containers will be allowed to add children in v8.0.0");const{children:e}=this;if(t<0||t>e.length)throw new Error(`${i}addChildAt: The index ${t} supplied is out of bounds ${e.length}`);if(i.parent){const n=i.parent.children.indexOf(i);if(i.parent===this&&n===t)return i;n!==-1&&i.parent.children.splice(n,1)}t===e.length?e.push(i):e.splice(t,0,i),i.parent=this,i.didChange=!0,i.didViewUpdate=!1,i._updateFlags=15;const s=this.renderGroup||this.parentRenderGroup;return s&&s.addChild(i),this.sortableChildren&&(this.sortDirty=!0),this.emit("childAdded",i,this,t),i.emit("added",this),i},swapChildren(i,t){if(i===t)return;const e=this.getChildIndex(i),s=this.getChildIndex(t);this.children[e]=t,this.children[s]=i;const n=this.renderGroup||this.parentRenderGroup;n&&(n.structureDidChange=!0),this._didContainerChangeTick++},removeFromParent(){var i;(i=this.parent)==null||i.removeChild(this)},reparentChild(...i){return i.length===1?this.reparentChildAt(i[0],this.children.length):(i.forEach(t=>this.reparentChildAt(t,this.children.length)),i[0])},reparentChildAt(i,t){if(i.parent===this)return this.setChildIndex(i,t),i;const e=i.worldTransform.clone();i.removeFromParent(),this.addChildAt(i,t);const s=this.worldTransform.clone();return s.invert(),e.prepend(s),i.setFromMatrix(e),i}};class fn{constructor(){this.pipe="filter",this.priority=1}destroy(){for(let t=0;t{this.add({test:t.test,maskClass:t})}))}add(t){this._tests.push(t)}getMaskEffect(t){this._initialized||this.init();for(let e=0;es.priority-n.priority);const e=this.renderGroup||this.parentRenderGroup;e&&(e.structureDidChange=!0),this._updateIsSimple()},removeEffect(i){const t=this.effects.indexOf(i);t!==-1&&(this.effects.splice(t,1),this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateIsSimple())},set mask(i){const t=this._maskEffect;(t==null?void 0:t.mask)!==i&&(t&&(this.removeEffect(t),ls.returnMaskEffect(t),this._maskEffect=null),i!=null&&(this._maskEffect=ls.getMaskEffect(i),this.addEffect(this._maskEffect)))},get mask(){var i;return(i=this._maskEffect)==null?void 0:i.mask},set filters(i){var r;!Array.isArray(i)&&i&&(i=[i]);const t=this._filterEffect||(this._filterEffect=new fn);i=i;const e=(i==null?void 0:i.length)>0,s=((r=t.filters)==null?void 0:r.length)>0,n=e!==s;i=Array.isArray(i)?i.slice(0):i,t.filters=Object.freeze(i),n&&(e?this.addEffect(t):(this.removeEffect(t),t.filters=i??null))},get filters(){var i;return(i=this._filterEffect)==null?void 0:i.filters},set filterArea(i){this._filterEffect||(this._filterEffect=new fn),this._filterEffect.filterArea=i},get filterArea(){var i;return(i=this._filterEffect)==null?void 0:i.filterArea}},xo={label:null,get name(){return U(W,"Container.name property has been removed, use Container.label instead"),this.label},set name(i){U(W,"Container.name property has been removed, use Container.label instead"),this.label=i},getChildByName(i,t=!1){return this.getChildByLabel(i,t)},getChildByLabel(i,t=!1){const e=this.children;for(let s=0;s-1&&this.renderGroupChildren.splice(e,1),t.renderGroupParent=null}addChild(t){if(this.structureDidChange=!0,t.parentRenderGroup=this,t.updateTick=-1,t.parent===this.root?t.relativeRenderGroupDepth=1:t.relativeRenderGroupDepth=t.parent.relativeRenderGroupDepth+1,t.didChange=!0,this.onChildUpdate(t),t.renderGroup){this.addRenderGroupChild(t.renderGroup);return}t._onRender&&this.addOnRender(t);const e=t.children;for(let s=0;s0}addOnRender(t){this._onRenderContainers.push(t)}removeOnRender(t){this._onRenderContainers.splice(this._onRenderContainers.indexOf(t),1)}runOnRender(){for(let t=0;tthis.addChild(n)),(s=t.parent)==null||s.addChild(this)}static mixin(t){Object.defineProperties(tt.prototype,Object.getOwnPropertyDescriptors(t))}set _didChangeId(t){this._didViewChangeTick=t>>12&4095,this._didContainerChangeTick=t&4095}get _didChangeId(){return this._didContainerChangeTick&4095|(this._didViewChangeTick&4095)<<12}addChild(...t){if(this.allowChildren||U(W,"addChild: Only Containers will be allowed to add children in v8.0.0"),t.length>1){for(let n=0;n1){for(let n=0;n-1&&(this._didViewChangeTick++,this.children.splice(s,1),this.renderGroup?this.renderGroup.removeChild(e):this.parentRenderGroup&&this.parentRenderGroup.removeChild(e),e.parent=null,this.emit("childRemoved",e,this,s),e.emit("removed",this)),e}_onUpdate(t){t&&t===this._skew&&this._updateSkew(),this._didContainerChangeTick++,!this.didChange&&(this.didChange=!0,this.parentRenderGroup&&this.parentRenderGroup.onChildUpdate(this))}set isRenderGroup(t){!!this.renderGroup!==t&&(t?this.enableRenderGroup():this.disableRenderGroup())}get isRenderGroup(){return!!this.renderGroup}enableRenderGroup(){if(this.renderGroup)return;const t=this.parentRenderGroup;t==null||t.removeChild(this),this.renderGroup=zt.get(To,this),this.groupTransform=H.IDENTITY,t==null||t.addChild(this),this._updateIsSimple()}disableRenderGroup(){if(!this.renderGroup)return;const t=this.parentRenderGroup;t==null||t.removeChild(this),zt.return(this.renderGroup),this.renderGroup=null,this.groupTransform=this.relativeGroupTransform,t==null||t.addChild(this),this._updateIsSimple()}_updateIsSimple(){this.isSimple=!this.renderGroup&&this.effects.length===0}get worldTransform(){return this._worldTransform||(this._worldTransform=new H),this.renderGroup?this._worldTransform.copyFrom(this.renderGroup.worldTransform):this.parentRenderGroup&&this._worldTransform.appendFrom(this.relativeGroupTransform,this.parentRenderGroup.worldTransform),this._worldTransform}get x(){return this._position.x}set x(t){this._position.x=t}get y(){return this._position.y}set y(t){this._position.y=t}get position(){return this._position}set position(t){this._position.copyFrom(t)}get rotation(){return this._rotation}set rotation(t){this._rotation!==t&&(this._rotation=t,this._onUpdate(this._skew))}get angle(){return this.rotation*$a}set angle(t){this.rotation=t*Va}get pivot(){return this._pivot===Ui&&(this._pivot=new ft(this,0,0)),this._pivot}set pivot(t){this._pivot===Ui&&(this._pivot=new ft(this,0,0)),typeof t=="number"?this._pivot.set(t):this._pivot.copyFrom(t)}get skew(){return this._skew===zi&&(this._skew=new ft(this,0,0)),this._skew}set skew(t){this._skew===zi&&(this._skew=new ft(this,0,0)),this._skew.copyFrom(t)}get scale(){return this._scale===Oi&&(this._scale=new ft(this,1,1)),this._scale}set scale(t){this._scale===Oi&&(this._scale=new ft(this,0,0)),typeof t=="number"?this._scale.set(t):this._scale.copyFrom(t)}get width(){return Math.abs(this.scale.x*this.getLocalBounds().width)}set width(t){const e=this.getLocalBounds().width;this._setWidth(t,e)}get height(){return Math.abs(this.scale.y*this.getLocalBounds().height)}set height(t){const e=this.getLocalBounds().height;this._setHeight(t,e)}getSize(t){t||(t={});const e=this.getLocalBounds();return t.width=Math.abs(this.scale.x*e.width),t.height=Math.abs(this.scale.y*e.height),t}setSize(t,e){const s=this.getLocalBounds();typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,s.width),e!==void 0&&this._setHeight(e,s.height)}_updateSkew(){const t=this._rotation,e=this._skew;this._cx=Math.cos(t+e._y),this._sx=Math.sin(t+e._y),this._cy=-Math.sin(t-e._x),this._sy=Math.cos(t-e._x)}updateTransform(t){return this.position.set(typeof t.x=="number"?t.x:this.position.x,typeof t.y=="number"?t.y:this.position.y),this.scale.set(typeof t.scaleX=="number"?t.scaleX||1:this.scale.x,typeof t.scaleY=="number"?t.scaleY||1:this.scale.y),this.rotation=typeof t.rotation=="number"?t.rotation:this.rotation,this.skew.set(typeof t.skewX=="number"?t.skewX:this.skew.x,typeof t.skewY=="number"?t.skewY:this.skew.y),this.pivot.set(typeof t.pivotX=="number"?t.pivotX:this.pivot.x,typeof t.pivotY=="number"?t.pivotY:this.pivot.y),this}setFromMatrix(t){t.decompose(this)}updateLocalTransform(){const t=this._didContainerChangeTick;if(this._didLocalTransformChangeId===t)return;this._didLocalTransformChangeId=t;const e=this.localTransform,s=this._scale,n=this._pivot,r=this._position,a=s._x,o=s._y,h=n._x,l=n._y;e.a=this._cx*a,e.b=this._sx*a,e.c=this._cy*o,e.d=this._sy*o,e.tx=r._x-(h*e.a+l*e.c),e.ty=r._y-(h*e.b+l*e.d)}set alpha(t){t!==this.localAlpha&&(this.localAlpha=t,this._updateFlags|=gn,this._onUpdate())}get alpha(){return this.localAlpha}set tint(t){const s=Z.shared.setValue(t??16777215).toBgrNumber();s!==this.localColor&&(this.localColor=s,this._updateFlags|=gn,this._onUpdate())}get tint(){const t=this.localColor;return((t&255)<<16)+(t&65280)+(t>>16&255)}set blendMode(t){this.localBlendMode!==t&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=Mo,this.localBlendMode=t,this._onUpdate())}get blendMode(){return this.localBlendMode}get visible(){return!!(this.localDisplayStatus&2)}set visible(t){const e=t?2:0;(this.localDisplayStatus&2)!==e&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=Wi,this.localDisplayStatus^=2,this._onUpdate())}get culled(){return!(this.localDisplayStatus&4)}set culled(t){const e=t?0:4;(this.localDisplayStatus&4)!==e&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=Wi,this.localDisplayStatus^=4,this._onUpdate())}get renderable(){return!!(this.localDisplayStatus&1)}set renderable(t){const e=t?1:0;(this.localDisplayStatus&1)!==e&&(this._updateFlags|=Wi,this.localDisplayStatus^=1,this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._onUpdate())}get isRenderable(){return this.localDisplayStatus===7&&this.groupAlpha>0}destroy(t=!1){var n;if(this.destroyed)return;this.destroyed=!0;const e=this.removeChildren(0,this.children.length);if(this.removeFromParent(),this.parent=null,this._maskEffect=null,this._filterEffect=null,this.effects=null,this._position=null,this._scale=null,this._pivot=null,this._skew=null,this.emit("destroyed",this),this.removeAllListeners(),typeof t=="boolean"?t:t==null?void 0:t.children)for(let r=0;r=e.minX&&s<=e.maxX&&n>=e.minY&&n<=e.maxY}destroy(t){super.destroy(t),this._bounds=null}}class $ extends Si{constructor(t=z.EMPTY){t instanceof z&&(t={texture:t});const{texture:e=z.EMPTY,anchor:s,roundPixels:n,width:r,height:a,...o}=t;super({label:"Sprite",...o}),this.renderPipeId="sprite",this.batched=!0,this._didSpriteUpdate=!1,this._sourceBounds={minX:0,maxX:1,minY:0,maxY:0},this._sourceBoundsDirty=!0,this._anchor=new ft({_onUpdate:()=>{this.onViewUpdate()}}),s?this.anchor=s:e.defaultAnchor&&(this.anchor=e.defaultAnchor),this.texture=e,this.allowChildren=!1,this.roundPixels=n??!1,r!==void 0&&(this.width=r),a!==void 0&&(this.height=a)}static from(t,e=!1){return t instanceof z?new $(t):new $(z.from(t,e))}set texture(t){t||(t=z.EMPTY);const e=this._texture;e!==t&&(e&&e.dynamic&&e.off("update",this.onViewUpdate,this),t.dynamic&&t.on("update",this.onViewUpdate,this),this._texture=t,this._width&&this._setWidth(this._width,this._texture.orig.width),this._height&&this._setHeight(this._height,this._texture.orig.height),this.onViewUpdate())}get texture(){return this._texture}get bounds(){return this._boundsDirty&&(this._updateBounds(),this._boundsDirty=!1),this._bounds}get sourceBounds(){return this._sourceBoundsDirty&&(this._updateSourceBounds(),this._sourceBoundsDirty=!1),this._sourceBounds}containsPoint(t){const e=this.sourceBounds;return t.x>=e.maxX&&t.x<=e.minX&&t.y>=e.maxY&&t.y<=e.minY}addBounds(t){const e=this._texture.trim?this.sourceBounds:this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}onViewUpdate(){if(this._didViewChangeTick++,this._didSpriteUpdate=!0,this._sourceBoundsDirty=this._boundsDirty=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}_updateBounds(){to(this._bounds,this._anchor,this._texture,0)}_updateSourceBounds(){const t=this._anchor,e=this._texture,s=this._sourceBounds,{width:n,height:r}=e.orig;s.maxX=-t._x*n,s.minX=s.maxX+n,s.maxY=-t._y*r,s.minY=s.maxY+r}destroy(t=!1){if(super.destroy(t),typeof t=="boolean"?t:t==null?void 0:t.texture){const s=typeof t=="boolean"?t:t==null?void 0:t.textureSource;this._texture.destroy(s)}this._texture=null,this._bounds=null,this._sourceBounds=null,this._anchor=null}get anchor(){return this._anchor}set anchor(t){typeof t=="number"?this._anchor.set(t):this._anchor.copyFrom(t)}get width(){return Math.abs(this.scale.x)*this._texture.orig.width}set width(t){this._setWidth(t,this._texture.orig.width),this._width=t}get height(){return Math.abs(this.scale.y)*this._texture.orig.height}set height(t){this._setHeight(t,this._texture.orig.height),this._height=t}getSize(t){return t||(t={}),t.width=Math.abs(this.scale.x)*this._texture.orig.width,t.height=Math.abs(this.scale.y)*this._texture.orig.height,t}setSize(t,e){typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,this._texture.orig.width),e!==void 0&&this._setHeight(e,this._texture.orig.height)}}const Po=new It;function yr(i,t,e){const s=Po;i.measurable=!0,ur(i,e,s),t.addBoundsMask(s),i.measurable=!1}function wr(i,t,e){const s=xe.get();i.measurable=!0;const n=Ut.get().identity(),r=_r(i,e,n);pr(i,s,r),i.measurable=!1,t.addBoundsMask(s),Ut.return(n),xe.return(s)}function _r(i,t,e){return i?(i!==t&&(_r(i.parent,t,e),i.updateLocalTransform(),e.append(i.localTransform)),e):(st("Mask bounds, renderable is not inside the root container"),e)}class br{constructor(t){this.priority=0,this.pipe="alphaMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t,this.renderMaskToTexture=!(t instanceof $),this.mask.renderable=this.renderMaskToTexture,this.mask.includeInBuild=!this.renderMaskToTexture,this.mask.measurable=!1}reset(){this.mask.measurable=!0,this.mask=null}addBounds(t,e){yr(this.mask,t,e)}addLocalBounds(t,e){wr(this.mask,t,e)}containsPoint(t,e){const s=this.mask;return e(s,t)}destroy(){this.reset()}static test(t){return t instanceof $}}br.extension=k.MaskEffect;class Sr{constructor(t){this.priority=0,this.pipe="colorMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t}destroy(){}static test(t){return typeof t=="number"}}Sr.extension=k.MaskEffect;class vr{constructor(t){this.priority=0,this.pipe="stencilMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t,this.mask.includeInBuild=!1,this.mask.measurable=!1}reset(){this.mask.measurable=!0,this.mask.includeInBuild=!0,this.mask=null}addBounds(t,e){yr(this.mask,t,e)}addLocalBounds(t,e){wr(this.mask,t,e)}containsPoint(t,e){const s=this.mask;return e(s,t)}destroy(){this.reset()}static test(t){return t instanceof tt}}vr.extension=k.MaskEffect;const ko={createCanvas:(i,t)=>{const e=document.createElement("canvas");return e.width=i,e.height=t,e},getCanvasRenderingContext2D:()=>CanvasRenderingContext2D,getWebGLRenderingContext:()=>WebGLRenderingContext,getNavigator:()=>navigator,getBaseUrl:()=>document.baseURI??window.location.href,getFontFaceSet:()=>document.fonts,fetch:(i,t)=>fetch(i,t),parseXML:i=>new DOMParser().parseFromString(i,"text/xml")};let mn=ko;const Q={get(){return mn},set(i){mn=i}};class Cr extends Ot{constructor(t){t.resource||(t.resource=Q.get().createCanvas()),t.width||(t.width=t.resource.width,t.autoDensity||(t.width/=t.resolution)),t.height||(t.height=t.resource.height,t.autoDensity||(t.height/=t.resolution)),super(t),this.uploadMethodId="image",this.autoDensity=t.autoDensity;const e=t.resource;(this.pixelWidth!==e.width||this.pixelWidth!==e.height)&&this.resizeCanvas(),this.transparent=!!t.transparent}resizeCanvas(){this.autoDensity&&(this.resource.style.width=`${this.width}px`,this.resource.style.height=`${this.height}px`),(this.resource.width!==this.pixelWidth||this.resource.height!==this.pixelHeight)&&(this.resource.width=this.pixelWidth,this.resource.height=this.pixelHeight)}resize(t=this.width,e=this.height,s=this._resolution){const n=super.resize(t,e,s);return n&&this.resizeCanvas(),n}static test(t){return globalThis.HTMLCanvasElement&&t instanceof HTMLCanvasElement||globalThis.OffscreenCanvas&&t instanceof OffscreenCanvas}get context2D(){return this._context2D||(this._context2D=this.resource.getContext("2d"))}}Cr.extension=k.TextureSource;class ve extends Ot{constructor(t){if(t.resource&&globalThis.HTMLImageElement&&t.resource instanceof HTMLImageElement){const e=Q.get().createCanvas(t.resource.width,t.resource.height);e.getContext("2d").drawImage(t.resource,0,0,t.resource.width,t.resource.height),t.resource=e,st("ImageSource: Image element passed, converting to canvas. Use CanvasSource instead.")}super(t),this.uploadMethodId="image",this.autoGarbageCollect=!0}static test(t){return globalThis.HTMLImageElement&&t instanceof HTMLImageElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap||globalThis.VideoFrame&&t instanceof VideoFrame}}ve.extension=k.TextureSource;var yi=(i=>(i[i.INTERACTION=50]="INTERACTION",i[i.HIGH=25]="HIGH",i[i.NORMAL=0]="NORMAL",i[i.LOW=-25]="LOW",i[i.UTILITY=-50]="UTILITY",i))(yi||{});class Ni{constructor(t,e=null,s=0,n=!1){this.next=null,this.previous=null,this._destroyed=!1,this._fn=t,this._context=e,this.priority=s,this._once=n}match(t,e=null){return this._fn===t&&this._context===e}emit(t){this._fn&&(this._context?this._fn.call(this._context,t):this._fn(t));const e=this.next;return this._once&&this.destroy(!0),this._destroyed&&(this.next=null),e}connect(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this}destroy(t=!1){this._destroyed=!0,this._fn=null,this._context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);const e=this.next;return this.next=t?null:e,this.previous=null,e}}const Tr=class gt{constructor(){this.autoStart=!1,this.deltaTime=1,this.lastTime=-1,this.speed=1,this.started=!1,this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this._protected=!1,this._lastFrame=-1,this._head=new Ni(null,null,1/0),this.deltaMS=1/gt.targetFPMS,this.elapsedMS=1/gt.targetFPMS,this._tick=t=>{this._requestId=null,this.started&&(this.update(t),this.started&&this._requestId===null&&this._head.next&&(this._requestId=requestAnimationFrame(this._tick)))}}_requestIfNeeded(){this._requestId===null&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))}_cancelIfNeeded(){this._requestId!==null&&(cancelAnimationFrame(this._requestId),this._requestId=null)}_startIfPossible(){this.started?this._requestIfNeeded():this.autoStart&&this.start()}add(t,e,s=yi.NORMAL){return this._addListener(new Ni(t,e,s))}addOnce(t,e,s=yi.NORMAL){return this._addListener(new Ni(t,e,s,!0))}_addListener(t){let e=this._head.next,s=this._head;if(!e)t.connect(s);else{for(;e;){if(t.priority>e.priority){t.connect(s);break}s=e,e=e.next}t.previous||t.connect(s)}return this._startIfPossible(),this}remove(t,e){let s=this._head.next;for(;s;)s.match(t,e)?s=s.destroy():s=s.next;return this._head.next||this._cancelIfNeeded(),this}get count(){if(!this._head)return 0;let t=0,e=this._head;for(;e=e.next;)t++;return t}start(){this.started||(this.started=!0,this._requestIfNeeded())}stop(){this.started&&(this.started=!1,this._cancelIfNeeded())}destroy(){if(!this._protected){this.stop();let t=this._head.next;for(;t;)t=t.destroy(!0);this._head.destroy(),this._head=null}}update(t=performance.now()){let e;if(t>this.lastTime){if(e=this.elapsedMS=t-this.lastTime,e>this._maxElapsedMS&&(e=this._maxElapsedMS),e*=this.speed,this._minElapsedMS){const r=t-this._lastFrame|0;if(r{var a;const t=document.createElement("canvas").getContext("webgl");if(!t)return"premultiply-alpha-on-upload";const e=await new Promise(o=>{const h=document.createElement("video");h.onloadeddata=()=>o(h),h.onerror=()=>o(null),h.autoplay=!1,h.crossOrigin="anonymous",h.preload="auto",h.src="data:video/webm;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQJChYECGFOAZwEAAAAAAAHTEU2bdLpNu4tTq4QVSalmU6yBoU27i1OrhBZUrmtTrIHGTbuMU6uEElTDZ1OsggEXTbuMU6uEHFO7a1OsggG97AEAAAAAAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmoCrXsYMPQkBNgIRMYXZmV0GETGF2ZkSJiEBEAAAAAAAAFlSua8yuAQAAAAAAAEPXgQFzxYgAAAAAAAAAAZyBACK1nIN1bmSIgQCGhVZfVlA5g4EBI+ODhAJiWgDglLCBArqBApqBAlPAgQFVsIRVuYEBElTDZ9Vzc9JjwItjxYgAAAAAAAAAAWfInEWjh0VOQ09ERVJEh49MYXZjIGxpYnZweC12cDlnyKJFo4hEVVJBVElPTkSHlDAwOjAwOjAwLjA0MDAwMDAwMAAAH0O2dcfngQCgwqGggQAAAIJJg0IAABAAFgA4JBwYSgAAICAAEb///4r+AAB1oZ2mm+6BAaWWgkmDQgAAEAAWADgkHBhKAAAgIABIQBxTu2uRu4+zgQC3iveBAfGCAXHwgQM=",h.load()});if(!e)return"premultiply-alpha-on-upload";const s=t.createTexture();t.bindTexture(t.TEXTURE_2D,s);const n=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,n),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,s,0),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,t.NONE),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e);const r=new Uint8Array(4);return t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,r),t.deleteFramebuffer(n),t.deleteTexture(s),(a=t.getExtension("WEBGL_lose_context"))==null||a.loseContext(),r[0]<=r[3]?"premultiplied-alpha":"premultiply-alpha-on-upload"})()),Hi}const vi=class Mr extends Ot{constructor(t){super(t),this.isReady=!1,this.uploadMethodId="video",t={...Mr.defaultOptions,...t},this._autoUpdate=!0,this._isConnectedToTicker=!1,this._updateFPS=t.updateFPS||0,this._msToNextUpdate=0,this.autoPlay=t.autoPlay!==!1,this.alphaMode=t.alphaMode??"premultiply-alpha-on-upload",this._videoFrameRequestCallback=this._videoFrameRequestCallback.bind(this),this._videoFrameRequestCallbackHandle=null,this._load=null,this._resolve=null,this._reject=null,this._onCanPlay=this._onCanPlay.bind(this),this._onCanPlayThrough=this._onCanPlayThrough.bind(this),this._onError=this._onError.bind(this),this._onPlayStart=this._onPlayStart.bind(this),this._onPlayStop=this._onPlayStop.bind(this),this._onSeeked=this._onSeeked.bind(this),t.autoLoad!==!1&&this.load()}updateFrame(){if(!this.destroyed){if(this._updateFPS){const t=Bt.shared.elapsedMS*this.resource.playbackRate;this._msToNextUpdate=Math.floor(this._msToNextUpdate-t)}(!this._updateFPS||this._msToNextUpdate<=0)&&(this._msToNextUpdate=this._updateFPS?Math.floor(1e3/this._updateFPS):0),this.isValid&&this.update()}}_videoFrameRequestCallback(){this.updateFrame(),this.destroyed?this._videoFrameRequestCallbackHandle=null:this._videoFrameRequestCallbackHandle=this.resource.requestVideoFrameCallback(this._videoFrameRequestCallback)}get isValid(){return!!this.resource.videoWidth&&!!this.resource.videoHeight}async load(){if(this._load)return this._load;const t=this.resource,e=this.options;return(t.readyState===t.HAVE_ENOUGH_DATA||t.readyState===t.HAVE_FUTURE_DATA)&&t.width&&t.height&&(t.complete=!0),t.addEventListener("play",this._onPlayStart),t.addEventListener("pause",this._onPlayStop),t.addEventListener("seeked",this._onSeeked),this._isSourceReady()?this._mediaReady():(e.preload||t.addEventListener("canplay",this._onCanPlay),t.addEventListener("canplaythrough",this._onCanPlayThrough),t.addEventListener("error",this._onError,!0)),this.alphaMode=await Ar(),this._load=new Promise((s,n)=>{this.isValid?s(this):(this._resolve=s,this._reject=n,e.preloadTimeoutMs!==void 0&&(this._preloadTimeout=setTimeout(()=>{this._onError(new ErrorEvent(`Preload exceeded timeout of ${e.preloadTimeoutMs}ms`))})),t.load())}),this._load}_onError(t){this.resource.removeEventListener("error",this._onError,!0),this.emit("error",t),this._reject&&(this._reject(t),this._reject=null,this._resolve=null)}_isSourcePlaying(){const t=this.resource;return!t.paused&&!t.ended}_isSourceReady(){return this.resource.readyState>2}_onPlayStart(){this.isValid||this._mediaReady(),this._configureAutoUpdate()}_onPlayStop(){this._configureAutoUpdate()}_onSeeked(){this._autoUpdate&&!this._isSourcePlaying()&&(this._msToNextUpdate=0,this.updateFrame(),this._msToNextUpdate=0)}_onCanPlay(){this.resource.removeEventListener("canplay",this._onCanPlay),this._mediaReady()}_onCanPlayThrough(){this.resource.removeEventListener("canplaythrough",this._onCanPlay),this._preloadTimeout&&(clearTimeout(this._preloadTimeout),this._preloadTimeout=void 0),this._mediaReady()}_mediaReady(){const t=this.resource;this.isValid&&(this.isReady=!0,this.resize(t.videoWidth,t.videoHeight)),this._msToNextUpdate=0,this.updateFrame(),this._msToNextUpdate=0,this._resolve&&(this._resolve(this),this._resolve=null,this._reject=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&this.resource.play()}destroy(){this._configureAutoUpdate();const t=this.resource;t&&(t.removeEventListener("play",this._onPlayStart),t.removeEventListener("pause",this._onPlayStop),t.removeEventListener("seeked",this._onSeeked),t.removeEventListener("canplay",this._onCanPlay),t.removeEventListener("canplaythrough",this._onCanPlayThrough),t.removeEventListener("error",this._onError,!0),t.pause(),t.src="",t.load()),super.destroy()}get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t!==this._autoUpdate&&(this._autoUpdate=t,this._configureAutoUpdate())}get updateFPS(){return this._updateFPS}set updateFPS(t){t!==this._updateFPS&&(this._updateFPS=t,this._configureAutoUpdate())}_configureAutoUpdate(){this._autoUpdate&&this._isSourcePlaying()?!this._updateFPS&&this.resource.requestVideoFrameCallback?(this._isConnectedToTicker&&(Bt.shared.remove(this.updateFrame,this),this._isConnectedToTicker=!1,this._msToNextUpdate=0),this._videoFrameRequestCallbackHandle===null&&(this._videoFrameRequestCallbackHandle=this.resource.requestVideoFrameCallback(this._videoFrameRequestCallback))):(this._videoFrameRequestCallbackHandle!==null&&(this.resource.cancelVideoFrameCallback(this._videoFrameRequestCallbackHandle),this._videoFrameRequestCallbackHandle=null),this._isConnectedToTicker||(Bt.shared.add(this.updateFrame,this),this._isConnectedToTicker=!0,this._msToNextUpdate=0)):(this._videoFrameRequestCallbackHandle!==null&&(this.resource.cancelVideoFrameCallback(this._videoFrameRequestCallbackHandle),this._videoFrameRequestCallbackHandle=null),this._isConnectedToTicker&&(Bt.shared.remove(this.updateFrame,this),this._isConnectedToTicker=!1,this._msToNextUpdate=0))}static test(t){return globalThis.HTMLVideoElement&&t instanceof HTMLVideoElement}};vi.extension=k.TextureSource;vi.defaultOptions={...Ot.defaultOptions,autoLoad:!0,autoPlay:!0,updateFPS:0,crossorigin:!0,loop:!1,muted:!0,playsinline:!0,preload:!1};vi.MIME_TYPES={ogv:"video/ogg",mov:"video/quicktime",m4v:"video/mp4"};let fi=vi;const Ct=(i,t,e=!1)=>(Array.isArray(i)||(i=[i]),t?i.map(s=>typeof s=="string"||e?t(s):s):i);class Go{constructor(){this._parsers=[],this._cache=new Map,this._cacheMap=new Map}reset(){this._cacheMap.clear(),this._cache.clear()}has(t){return this._cache.has(t)}get(t){const e=this._cache.get(t);return e||st(`[Assets] Asset id ${t} was not found in the Cache`),e}set(t,e){const s=Ct(t);let n;for(let h=0;h{r.set(h,e)});const a=[...r.keys()],o={cacheKeys:a,keys:s};s.forEach(h=>{this._cacheMap.set(h,o)}),a.forEach(h=>{const l=n?n[h]:e;this._cache.has(h)&&this._cache.get(h)!==l&&st("[Cache] already has key:",h),this._cache.set(h,r.get(h))})}remove(t){if(!this._cacheMap.has(t)){st(`[Assets] Asset id ${t} was not found in the Cache`);return}const e=this._cacheMap.get(t);e.cacheKeys.forEach(n=>{this._cache.delete(n)}),e.keys.forEach(n=>{this._cacheMap.delete(n)})}get parsers(){return this._parsers}}const j=new Go,cs=[];lt.handleByList(k.TextureSource,cs);function Pr(i={}){const t=i&&i.resource,e=t?i.resource:i,s=t?i:{resource:i};for(let n=0;n{j.has(s)&&j.remove(s)}),t||j.set(s,r),r}function Io(i,t=!1){return typeof i=="string"?j.get(i):i instanceof Ot?new z({source:i}):Bo(i,t)}z.from=Io;Ot.from=Pr;lt.add(br,Sr,vr,fi,ve,Cr,ks);var Xt=(i=>(i[i.Low=0]="Low",i[i.Normal=1]="Normal",i[i.High=2]="High",i))(Xt||{});function vt(i){if(typeof i!="string")throw new TypeError(`Path must be a string. Received ${JSON.stringify(i)}`)}function Be(i){return i.split("?")[0].split("#")[0]}function Eo(i){return i.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Ro(i,t,e){return i.replace(new RegExp(Eo(t),"g"),e)}function Fo(i,t){let e="",s=0,n=-1,r=0,a=-1;for(let o=0;o<=i.length;++o){if(o2){const h=e.lastIndexOf("/");if(h!==e.length-1){h===-1?(e="",s=0):(e=e.slice(0,h),s=e.length-1-e.lastIndexOf("/")),n=o,r=0;continue}}else if(e.length===2||e.length===1){e="",s=0,n=o,r=0;continue}}}else e.length>0?e+=`/${i.slice(n+1,o)}`:e=i.slice(n+1,o),s=o-n-1;n=o,r=0}else a===46&&r!==-1?++r:r=-1}return e}const mt={toPosix(i){return Ro(i,"\\","/")},isUrl(i){return/^https?:/.test(this.toPosix(i))},isDataUrl(i){return/^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s<>]*?)$/i.test(i)},isBlobUrl(i){return i.startsWith("blob:")},hasProtocol(i){return/^[^/:]+:/.test(this.toPosix(i))},getProtocol(i){vt(i),i=this.toPosix(i);const t=/^file:\/\/\//.exec(i);if(t)return t[0];const e=/^[^/:]+:\/{0,2}/.exec(i);return e?e[0]:""},toAbsolute(i,t,e){if(vt(i),this.isDataUrl(i)||this.isBlobUrl(i))return i;const s=Be(this.toPosix(t??Q.get().getBaseUrl())),n=Be(this.toPosix(e??this.rootname(s)));return i=this.toPosix(i),i.startsWith("/")?mt.join(n,i.slice(1)):this.isAbsolute(i)?i:this.join(s,i)},normalize(i){if(vt(i),i.length===0)return".";if(this.isDataUrl(i)||this.isBlobUrl(i))return i;i=this.toPosix(i);let t="";const e=i.startsWith("/");this.hasProtocol(i)&&(t=this.rootname(i),i=i.slice(t.length));const s=i.endsWith("/");return i=Fo(i),i.length>0&&s&&(i+="/"),e?`/${i}`:t+i},isAbsolute(i){return vt(i),i=this.toPosix(i),this.hasProtocol(i)?!0:i.startsWith("/")},join(...i){if(i.length===0)return".";let t;for(let e=0;e0)if(t===void 0)t=s;else{const n=i[e-1]??"";this.joinExtensions.includes(this.extname(n).toLowerCase())?t+=`/../${s}`:t+=`/${s}`}}return t===void 0?".":this.normalize(t)},dirname(i){if(vt(i),i.length===0)return".";i=this.toPosix(i);let t=i.charCodeAt(0);const e=t===47;let s=-1,n=!0;const r=this.getProtocol(i),a=i;i=i.slice(r.length);for(let o=i.length-1;o>=1;--o)if(t=i.charCodeAt(o),t===47){if(!n){s=o;break}}else n=!1;return s===-1?e?"/":this.isUrl(a)?r+i:r:e&&s===1?"//":r+i.slice(0,s)},rootname(i){vt(i),i=this.toPosix(i);let t="";if(i.startsWith("/")?t="/":t=this.getProtocol(i),this.isUrl(i)){const e=i.indexOf("/",t.length);e!==-1?t=i.slice(0,e):t=i,t.endsWith("/")||(t+="/")}return t},basename(i,t){vt(i),t&&vt(t),i=Be(this.toPosix(i));let e=0,s=-1,n=!0,r;if(t!==void 0&&t.length>0&&t.length<=i.length){if(t.length===i.length&&t===i)return"";let a=t.length-1,o=-1;for(r=i.length-1;r>=0;--r){const h=i.charCodeAt(r);if(h===47){if(!n){e=r+1;break}}else o===-1&&(n=!1,o=r+1),a>=0&&(h===t.charCodeAt(a)?--a===-1&&(s=r):(a=-1,s=o))}return e===s?s=o:s===-1&&(s=i.length),i.slice(e,s)}for(r=i.length-1;r>=0;--r)if(i.charCodeAt(r)===47){if(!n){e=r+1;break}}else s===-1&&(n=!1,s=r+1);return s===-1?"":i.slice(e,s)},extname(i){vt(i),i=Be(this.toPosix(i));let t=-1,e=0,s=-1,n=!0,r=0;for(let a=i.length-1;a>=0;--a){const o=i.charCodeAt(a);if(o===47){if(!n){e=a+1;break}continue}s===-1&&(n=!1,s=a+1),o===46?t===-1?t=a:r!==1&&(r=1):t!==-1&&(r=-1)}return t===-1||s===-1||r===0||r===1&&t===s-1&&t===e+1?"":i.slice(t,s)},parse(i){vt(i);const t={root:"",dir:"",base:"",ext:"",name:""};if(i.length===0)return t;i=Be(this.toPosix(i));let e=i.charCodeAt(0);const s=this.isAbsolute(i);let n;t.root=this.rootname(i),s||this.hasProtocol(i)?n=1:n=0;let r=-1,a=0,o=-1,h=!0,l=i.length-1,c=0;for(;l>=n;--l){if(e=i.charCodeAt(l),e===47){if(!h){a=l+1;break}continue}o===-1&&(h=!1,o=l+1),e===46?r===-1?r=l:c!==1&&(c=1):r!==-1&&(c=-1)}return r===-1||o===-1||c===0||c===1&&r===o-1&&r===a+1?o!==-1&&(a===0&&s?t.base=t.name=i.slice(1,o):t.base=t.name=i.slice(a,o)):(a===0&&s?(t.name=i.slice(1,r),t.base=i.slice(1,o)):(t.name=i.slice(a,r),t.base=i.slice(a,o)),t.ext=i.slice(r,o)),t.dir=this.dirname(i),t},sep:"/",delimiter:":",joinExtensions:[".html"]};function kr(i,t,e,s,n){const r=t[e];for(let a=0;a{const a=r.substring(1,r.length-1).split(",");n.push(a)}),kr(i,n,0,e,s)}else s.push(i);return s}const wi=i=>!Array.isArray(i);class Ce{constructor(){this._defaultBundleIdentifierOptions={connector:"-",createBundleAssetId:(t,e)=>`${t}${this._bundleIdConnector}${e}`,extractAssetIdFromBundle:(t,e)=>e.replace(`${t}${this._bundleIdConnector}`,"")},this._bundleIdConnector=this._defaultBundleIdentifierOptions.connector,this._createBundleAssetId=this._defaultBundleIdentifierOptions.createBundleAssetId,this._extractAssetIdFromBundle=this._defaultBundleIdentifierOptions.extractAssetIdFromBundle,this._assetMap={},this._preferredOrder=[],this._parsers=[],this._resolverHash={},this._bundles={}}setBundleIdentifier(t){if(this._bundleIdConnector=t.connector??this._bundleIdConnector,this._createBundleAssetId=t.createBundleAssetId??this._createBundleAssetId,this._extractAssetIdFromBundle=t.extractAssetIdFromBundle??this._extractAssetIdFromBundle,this._extractAssetIdFromBundle("foo",this._createBundleAssetId("foo","bar"))!=="bar")throw new Error("[Resolver] GenerateBundleAssetId are not working correctly")}prefer(...t){t.forEach(e=>{this._preferredOrder.push(e),e.priority||(e.priority=Object.keys(e.params))}),this._resolverHash={}}set basePath(t){this._basePath=t}get basePath(){return this._basePath}set rootPath(t){this._rootPath=t}get rootPath(){return this._rootPath}get parsers(){return this._parsers}reset(){this.setBundleIdentifier(this._defaultBundleIdentifierOptions),this._assetMap={},this._preferredOrder=[],this._resolverHash={},this._rootPath=null,this._basePath=null,this._manifest=null,this._bundles={},this._defaultSearchParams=null}setDefaultSearchParams(t){if(typeof t=="string")this._defaultSearchParams=t;else{const e=t;this._defaultSearchParams=Object.keys(e).map(s=>`${encodeURIComponent(s)}=${encodeURIComponent(e[s])}`).join("&")}}getAlias(t){const{alias:e,src:s}=t;return Ct(e||s,r=>typeof r=="string"?r:Array.isArray(r)?r.map(a=>(a==null?void 0:a.src)??a):r!=null&&r.src?r.src:r,!0)}addManifest(t){this._manifest&&st("[Resolver] Manifest already exists, this will be overwritten"),this._manifest=t,t.bundles.forEach(e=>{this.addBundle(e.name,e.assets)})}addBundle(t,e){const s=[];let n=e;Array.isArray(e)||(n=Object.entries(e).map(([r,a])=>typeof a=="string"||Array.isArray(a)?{alias:r,src:a}:{alias:r,...a})),n.forEach(r=>{const a=r.src,o=r.alias;let h;if(typeof o=="string"){const l=this._createBundleAssetId(t,o);s.push(l),h=[o,l]}else{const l=o.map(c=>this._createBundleAssetId(t,c));s.push(...l),h=[...o,...l]}this.add({...r,alias:h,src:a})}),this._bundles[t]=s}add(t){const e=[];Array.isArray(t)?e.push(...t):e.push(t);let s;s=r=>{this.hasKey(r)&&st(`[Resolver] already has key: ${r} overwriting`)},Ct(e).forEach(r=>{const{src:a}=r;let{data:o,format:h,loadParser:l}=r;const c=Ct(a).map(g=>typeof g=="string"?Lo(g):Array.isArray(g)?g:[g]),d=this.getAlias(r);Array.isArray(d)?d.forEach(s):s(d);const f=[];c.forEach(g=>{g.forEach(m=>{let y={};if(typeof m!="object"){y.src=m;for(let x=0;x{this._assetMap[g]=f})})}resolveBundle(t){const e=wi(t);t=Ct(t);const s={};return t.forEach(n=>{const r=this._bundles[n];if(r){const a=this.resolve(r),o={};for(const h in a){const l=a[h];o[this._extractAssetIdFromBundle(n,h)]=l}s[n]=o}}),e?s[t[0]]:s}resolveUrl(t){const e=this.resolve(t);if(typeof t!="string"){const s={};for(const n in e)s[n]=e[n].src;return s}return e.src}resolve(t){const e=wi(t);t=Ct(t);const s={};return t.forEach(n=>{if(!this._resolverHash[n])if(this._assetMap[n]){let r=this._assetMap[n];const a=this._getPreferredOrder(r);a==null||a.priority.forEach(o=>{a.params[o].forEach(h=>{const l=r.filter(c=>c[o]?c[o]===h:!1);l.length&&(r=l)})}),this._resolverHash[n]=r[0]}else this._resolverHash[n]=this._buildResolvedAsset({alias:[n],src:n},{});s[n]=this._resolverHash[n]}),e?s[t[0]]:s}hasKey(t){return!!this._assetMap[t]}hasBundle(t){return!!this._bundles[t]}_getPreferredOrder(t){for(let e=0;er.params.format.includes(s.format));if(n)return n}return this._preferredOrder[0]}_appendDefaultSearchParams(t){if(!this._defaultSearchParams)return t;const e=/\?/.test(t)?"&":"?";return`${t}${e}${this._defaultSearchParams}`}_buildResolvedAsset(t,e){const{aliases:s,data:n,loadParser:r,format:a}=e;return(this._basePath||this._rootPath)&&(t.src=mt.toAbsolute(t.src,this._basePath,this._rootPath)),t.alias=s??t.alias??[t.src],t.src=this._appendDefaultSearchParams(t.src),t.data={...n||{},...t.data},t.loadParser=r??t.loadParser,t.format=a??t.format??Do(t.src),t}}Ce.RETINA_PREFIX=/@([0-9\.]+)x/;function Do(i){return i.split(".").pop().split("?").shift().split("#").shift()}const ds=(i,t)=>{const e=t.split("?")[1];return e&&(i+=`?${e}`),i},Gr=class De{constructor(t,e){this.linkedSheets=[],this._texture=t instanceof z?t:null,this.textureSource=t.source,this.textures={},this.animations={},this.data=e;const s=parseFloat(e.meta.scale);s?(this.resolution=s,t.source.resolution=this.resolution):this.resolution=t.source._resolution,this._frames=this.data.frames,this._frameKeys=Object.keys(this._frames),this._batchIndex=0,this._callback=null}parse(){return new Promise(t=>{this._callback=t,this._batchIndex=0,this._frameKeys.length<=De.BATCH_SIZE?(this._processFrames(0),this._processAnimations(),this._parseComplete()):this._nextBatch()})}_processFrames(t){let e=t;const s=De.BATCH_SIZE;for(;e-t{this._batchIndex*De.BATCH_SIZE{s[n]=t}),Object.keys(t.textures).forEach(n=>{s[n]=t.textures[n]}),!e){const n=mt.dirname(i[0]);t.linkedSheets.forEach((r,a)=>{const o=Br([`${n}/${t.data.meta.related_multi_packs[a]}`],r,!0);Object.assign(s,o)})}return s}const Uo={extension:k.Asset,cache:{test:i=>i instanceof xn,getCacheableAssets:(i,t)=>Br(i,t,!1)},resolver:{extension:{type:k.ResolveParser,name:"resolveSpritesheet"},test:i=>{const e=i.split("?")[0].split("."),s=e.pop(),n=e.pop();return s==="json"&&zo.includes(n)},parse:i=>{var e;const t=i.split(".");return{resolution:parseFloat(((e=Ce.RETINA_PREFIX.exec(i))==null?void 0:e[1])??"1"),format:t[t.length-2],src:i}}},loader:{name:"spritesheetLoader",extension:{type:k.LoadParser,priority:Xt.Normal,name:"spritesheetLoader"},async testParse(i,t){return mt.extname(t.src).toLowerCase()===".json"&&!!i.frames},async parse(i,t,e){var l,c;const{texture:s,imageFilename:n}=(t==null?void 0:t.data)??{};let r=mt.dirname(t.src);r&&r.lastIndexOf("/")!==r.length-1&&(r+="/");let a;if(s instanceof z)a=s;else{const d=ds(r+(n??i.meta.image),t.src);a=(await e.load([d]))[d]}const o=new xn(a.source,i);await o.parse();const h=(l=i==null?void 0:i.meta)==null?void 0:l.related_multi_packs;if(Array.isArray(h)){const d=[];for(const g of h){if(typeof g!="string")continue;let m=r+g;(c=t.data)!=null&&c.ignoreMultiPack||(m=ds(m,t.src),d.push(e.load({src:m,data:{ignoreMultiPack:!0}})))}const f=await Promise.all(d);o.linkedSheets=f,f.forEach(g=>{g.linkedSheets=[o].concat(o.linkedSheets.filter(m=>m!==g))})}return o},async unload(i,t,e){await e.unload(i.textureSource._sourceOrigin),i.destroy(!1)}}};lt.add(Uo);const $i=Object.create(null),yn=Object.create(null);function Bs(i,t){let e=yn[i];return e===void 0&&($i[t]===void 0&&($i[t]=1),yn[i]=e=$i[t]++),e}let he;function Ir(){return(!he||he!=null&&he.isContextLost())&&(he=Q.get().createCanvas().getContext("webgl",{})),he}let ri;function Oo(){if(!ri){ri="mediump";const i=Ir();i&&i.getShaderPrecisionFormat&&(ri=i.getShaderPrecisionFormat(i.FRAGMENT_SHADER,i.HIGH_FLOAT).precision?"highp":"mediump")}return ri}function Wo(i,t,e){return t?i:e?(i=i.replace("out vec4 finalColor;",""),` + + #ifdef GL_ES // This checks if it is WebGL1 + #define in varying + #define finalColor gl_FragColor + #define texture texture2D + #endif + ${i} + `):` + + #ifdef GL_ES // This checks if it is WebGL1 + #define in attribute + #define out varying + #endif + ${i} + `}function No(i,t,e){const s=e?t.maxSupportedFragmentPrecision:t.maxSupportedVertexPrecision;if(i.substring(0,9)!=="precision"){let n=e?t.requestedFragmentPrecision:t.requestedVertexPrecision;return n==="highp"&&s!=="highp"&&(n="mediump"),`precision ${n} float; +${i}`}else if(s!=="highp"&&i.substring(0,15)==="precision highp")return i.replace("precision highp","precision mediump");return i}function Ho(i,t){return t?`#version 300 es +${i}`:i}const $o={},Vo={};function Yo(i,{name:t="pixi-program"},e=!0){t=t.replace(/\s+/g,"-"),t+=e?"-fragment":"-vertex";const s=e?$o:Vo;return s[t]?(s[t]++,t+=`-${s[t]}`):s[t]=1,i.indexOf("#define SHADER_NAME")!==-1?i:`${`#define SHADER_NAME ${t}`} +${i}`}function Xo(i,t){return t?i.replace("#version 300 es",""):i}const Vi={stripVersion:Xo,ensurePrecision:No,addProgramDefines:Wo,setProgramName:Yo,insertVersion:Ho},Yi=Object.create(null),Er=class us{constructor(t){t={...us.defaultOptions,...t};const e=t.fragment.indexOf("#version 300 es")!==-1,s={stripVersion:e,ensurePrecision:{requestedFragmentPrecision:t.preferredFragmentPrecision,requestedVertexPrecision:t.preferredVertexPrecision,maxSupportedVertexPrecision:"highp",maxSupportedFragmentPrecision:Oo()},setProgramName:{name:t.name},addProgramDefines:e,insertVersion:e};let n=t.fragment,r=t.vertex;Object.keys(Vi).forEach(a=>{const o=s[a];n=Vi[a](n,o,!0),r=Vi[a](r,o,!1)}),this.fragment=n,this.vertex=r,this._key=Bs(`${this.vertex}:${this.fragment}`,"gl-program")}destroy(){this.fragment=null,this.vertex=null,this._attributeData=null,this._uniformData=null,this._uniformBlockData=null,this.transformFeedbackVaryings=null}static from(t){const e=`${t.vertex}:${t.fragment}`;return Yi[e]||(Yi[e]=new us(t)),Yi[e]}};Er.defaultOptions={preferredVertexPrecision:"highp",preferredFragmentPrecision:"mediump"};let Rr=Er;const wn={uint8x2:{size:2,stride:2,normalised:!1},uint8x4:{size:4,stride:4,normalised:!1},sint8x2:{size:2,stride:2,normalised:!1},sint8x4:{size:4,stride:4,normalised:!1},unorm8x2:{size:2,stride:2,normalised:!0},unorm8x4:{size:4,stride:4,normalised:!0},snorm8x2:{size:2,stride:2,normalised:!0},snorm8x4:{size:4,stride:4,normalised:!0},uint16x2:{size:2,stride:4,normalised:!1},uint16x4:{size:4,stride:8,normalised:!1},sint16x2:{size:2,stride:4,normalised:!1},sint16x4:{size:4,stride:8,normalised:!1},unorm16x2:{size:2,stride:4,normalised:!0},unorm16x4:{size:4,stride:8,normalised:!0},snorm16x2:{size:2,stride:4,normalised:!0},snorm16x4:{size:4,stride:8,normalised:!0},float16x2:{size:2,stride:4,normalised:!1},float16x4:{size:4,stride:8,normalised:!1},float32:{size:1,stride:4,normalised:!1},float32x2:{size:2,stride:8,normalised:!1},float32x3:{size:3,stride:12,normalised:!1},float32x4:{size:4,stride:16,normalised:!1},uint32:{size:1,stride:4,normalised:!1},uint32x2:{size:2,stride:8,normalised:!1},uint32x3:{size:3,stride:12,normalised:!1},uint32x4:{size:4,stride:16,normalised:!1},sint32:{size:1,stride:4,normalised:!1},sint32x2:{size:2,stride:8,normalised:!1},sint32x3:{size:3,stride:12,normalised:!1},sint32x4:{size:4,stride:16,normalised:!1}};function jo(i){return wn[i]??wn.float32}const qo={f32:"float32","vec2":"float32x2","vec3":"float32x3","vec4":"float32x4",vec2f:"float32x2",vec3f:"float32x3",vec4f:"float32x4",i32:"sint32","vec2":"sint32x2","vec3":"sint32x3","vec4":"sint32x4",u32:"uint32","vec2":"uint32x2","vec3":"uint32x3","vec4":"uint32x4",bool:"uint32","vec2":"uint32x2","vec3":"uint32x3","vec4":"uint32x4"};function Ko({source:i,entryPoint:t}){const e={},s=i.indexOf(`fn ${t}`);if(s!==-1){const n=i.indexOf("->",s);if(n!==-1){const r=i.substring(s,n),a=/@location\((\d+)\)\s+([a-zA-Z0-9_]+)\s*:\s*([a-zA-Z0-9_<>]+)(?:,|\s|$)/g;let o;for(;(o=a.exec(r))!==null;){const h=qo[o[3]]??"float32";e[o[2]]={location:parseInt(o[1],10),format:h,stride:jo(h).stride,offset:0,instance:!1,start:0}}}}return e}function Xi(i){var d,f;const t=/(^|[^/])@(group|binding)\(\d+\)[^;]+;/g,e=/@group\((\d+)\)/,s=/@binding\((\d+)\)/,n=/var(<[^>]+>)? (\w+)/,r=/:\s*(\w+)/,a=/struct\s+(\w+)\s*{([^}]+)}/g,o=/(\w+)\s*:\s*([\w\<\>]+)/g,h=/struct\s+(\w+)/,l=(d=i.match(t))==null?void 0:d.map(g=>({group:parseInt(g.match(e)[1],10),binding:parseInt(g.match(s)[1],10),name:g.match(n)[2],isUniform:g.match(n)[1]==="",type:g.match(r)[1]}));if(!l)return{groups:[],structs:[]};const c=((f=i.match(a))==null?void 0:f.map(g=>{const m=g.match(h)[1],y=g.match(o).reduce((x,w)=>{const[_,b]=w.split(":");return x[_.trim()]=b.trim(),x},{});return y?{name:m,members:y}:null}).filter(({name:g})=>l.some(m=>m.type===g)))??[];return{groups:l,structs:c}}var ze=(i=>(i[i.VERTEX=1]="VERTEX",i[i.FRAGMENT=2]="FRAGMENT",i[i.COMPUTE=4]="COMPUTE",i))(ze||{});function Zo({groups:i}){const t=[];for(let e=0;ee.has(a.name)?!1:(e.add(a.name),!0)),r=[...i.groups,...t.groups].filter(a=>{const o=`${a.name}-${a.binding}`;return s.has(o)?!1:(s.add(o),!0)});return{structs:n,groups:r}}const ji=Object.create(null);class Ci{constructor(t){var o,h;this._layoutKey=0,this._attributeLocationsKey=0;const{fragment:e,vertex:s,layout:n,gpuLayout:r,name:a}=t;if(this.name=a,this.fragment=e,this.vertex=s,e.source===s.source){const l=Xi(e.source);this.structsAndGroups=l}else{const l=Xi(s.source),c=Xi(e.source);this.structsAndGroups=Jo(l,c)}this.layout=n??Qo(this.structsAndGroups),this.gpuLayout=r??Zo(this.structsAndGroups),this.autoAssignGlobalUniforms=((o=this.layout[0])==null?void 0:o.globalUniforms)!==void 0,this.autoAssignLocalUniforms=((h=this.layout[1])==null?void 0:h.localUniforms)!==void 0,this._generateProgramKey()}_generateProgramKey(){const{vertex:t,fragment:e}=this,s=t.source+e.source+t.entryPoint+e.entryPoint;this._layoutKey=Bs(s,"program")}get attributeData(){return this._attributeData??(this._attributeData=Ko(this.vertex)),this._attributeData}destroy(){this.gpuLayout=null,this.layout=null,this.structsAndGroups=null,this.fragment=null,this.vertex=null}static from(t){const e=`${t.vertex.source}:${t.fragment.source}:${t.fragment.entryPoint}:${t.vertex.entryPoint}`;return ji[e]||(ji[e]=new Ci(t)),ji[e]}}const Fr=["f32","i32","vec2","vec3","vec4","mat2x2","mat3x3","mat4x4","mat3x2","mat4x2","mat2x3","mat4x3","mat2x4","mat3x4"],th=Fr.reduce((i,t)=>(i[t]=!0,i),{});function eh(i,t){switch(i){case"f32":return 0;case"vec2":return new Float32Array(2*t);case"vec3":return new Float32Array(3*t);case"vec4":return new Float32Array(4*t);case"mat2x2":return new Float32Array([1,0,0,1]);case"mat3x3":return new Float32Array([1,0,0,0,1,0,0,0,1]);case"mat4x4":return new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}return null}const Lr=class Dr{constructor(t,e){this._touched=0,this.uid=nt("uniform"),this._resourceType="uniformGroup",this._resourceId=nt("resource"),this.isUniformGroup=!0,this._dirtyId=0,this.destroyed=!1,e={...Dr.defaultOptions,...e},this.uniformStructures=t;const s={};for(const n in t){const r=t[n];if(r.name=n,r.size=r.size??1,!th[r.type])throw new Error(`Uniform type ${r.type} is not supported. Supported uniform types are: ${Fr.join(", ")}`);r.value??(r.value=eh(r.type,r.size)),s[n]=r.value}this.uniforms=s,this._dirtyId=1,this.ubo=e.ubo,this.isStatic=e.isStatic,this._signature=Bs(Object.keys(s).map(n=>`${n}-${t[n].type}`).join("-"),"uniform-group")}update(){this._dirtyId++}};Lr.defaultOptions={ubo:!1,isStatic:!1};let zr=Lr;class pi{constructor(t){this.resources=Object.create(null),this._dirty=!0;let e=0;for(const s in t){const n=t[s];this.setResource(n,e++)}this._updateKey()}_updateKey(){if(!this._dirty)return;this._dirty=!1;const t=[];let e=0;for(const s in this.resources)t[e++]=this.resources[s]._resourceId;this._key=t.join("|")}setResource(t,e){var n,r;const s=this.resources[e];t!==s&&(s&&((n=t.off)==null||n.call(t,"change",this.onResourceChange,this)),(r=t.on)==null||r.call(t,"change",this.onResourceChange,this),this.resources[e]=t,this._dirty=!0)}getResource(t){return this.resources[t]}_touch(t){const e=this.resources;for(const s in e)e[s]._touched=t}destroy(){var e;const t=this.resources;for(const s in t){const n=t[s];(e=n.off)==null||e.call(n,"change",this.onResourceChange,this)}this.resources=null}onResourceChange(t){if(this._dirty=!0,t.destroyed){const e=this.resources;for(const s in e)e[s]===t&&(e[s]=null)}else this._updateKey()}}var fs=(i=>(i[i.WEBGL=1]="WEBGL",i[i.WEBGPU=2]="WEBGPU",i[i.BOTH=3]="BOTH",i))(fs||{});class Is extends pt{constructor(t){super(),this._uniformBindMap=Object.create(null),this._ownedBindGroups=[];let{gpuProgram:e,glProgram:s,groups:n,resources:r,compatibleRenderers:a,groupMap:o}=t;this.gpuProgram=e,this.glProgram=s,a===void 0&&(a=0,e&&(a|=fs.WEBGPU),s&&(a|=fs.WEBGL)),this.compatibleRenderers=a;const h={};if(!r&&!n&&(r={}),r&&n)throw new Error("[Shader] Cannot have both resources and groups");if(!e&&n&&!o)throw new Error("[Shader] No group map or WebGPU shader provided - consider using resources instead.");if(!e&&n&&o)for(const l in o)for(const c in o[l]){const d=o[l][c];h[d]={group:l,binding:c,name:d}}else if(e&&n&&!o){const l=e.structsAndGroups.groups;o={},l.forEach(c=>{o[c.group]=o[c.group]||{},o[c.group][c.binding]=c.name,h[c.name]=c})}else if(r){n={},o={},e&&e.structsAndGroups.groups.forEach(d=>{o[d.group]=o[d.group]||{},o[d.group][d.binding]=d.name,h[d.name]=d});let l=0;for(const c in r)h[c]||(n[99]||(n[99]=new pi,this._ownedBindGroups.push(n[99])),h[c]={group:99,binding:l,name:c},o[99]=o[99]||{},o[99][l]=c,l++);for(const c in r){const d=c;let f=r[c];!f.source&&!f._resourceType&&(f=new zr(f));const g=h[d];g&&(n[g.group]||(n[g.group]=new pi,this._ownedBindGroups.push(n[g.group])),n[g.group].setResource(f,g.binding))}}this.groups=n,this._uniformBindMap=o,this.resources=this._buildResourceAccessor(n,h)}addResource(t,e,s){var n,r;(n=this._uniformBindMap)[e]||(n[e]={}),(r=this._uniformBindMap[e])[s]||(r[s]=t),this.groups[e]||(this.groups[e]=new pi,this._ownedBindGroups.push(this.groups[e]))}_buildResourceAccessor(t,e){const s={};for(const n in e){const r=e[n];Object.defineProperty(s,r.name,{get(){return t[r.group].getResource(r.binding)},set(a){t[r.group].setResource(a,r.binding)}})}return s}destroy(t=!1){var e,s;this.emit("destroy",this),t&&((e=this.gpuProgram)==null||e.destroy(),(s=this.glProgram)==null||s.destroy()),this.gpuProgram=null,this.glProgram=null,this.removeAllListeners(),this._uniformBindMap=null,this._ownedBindGroups.forEach(n=>{n.destroy()}),this._ownedBindGroups=null,this.resources=null,this.groups=null}static from(t){const{gpu:e,gl:s,...n}=t;let r,a;return e&&(r=Ci.from(e)),s&&(a=Rr.from(s)),new Is({gpuProgram:r,glProgram:a,...n})}}const ps=[];lt.handleByNamedList(k.Environment,ps);async function ih(i){if(!i)for(let t=0;t80*e){o=l=i[0],h=c=i[1];for(var m=e;ml&&(l=d),f>c&&(c=f);g=Math.max(l-o,c-h),g=g!==0?32767/g:0}return He(r,a,e,o,h,g,0),a}function Ur(i,t,e,s,n){var r,a;if(n===xs(i,t,e,s)>0)for(r=t;r=t;r-=s)a=_n(r,i[r],i[r+1],a);return a&&Ai(a,a.next)&&(Ve(a),a=a.next),a}function ae(i,t){if(!i)return i;t||(t=i);var e=i,s;do if(s=!1,!e.steiner&&(Ai(e,e.next)||q(e.prev,e,e.next)===0)){if(Ve(e),e=t=e.prev,e===e.next)break;s=!0}else e=e.next;while(s||e!==t);return t}function He(i,t,e,s,n,r,a){if(i){!a&&r&&fh(i,s,n,r);for(var o=i,h,l;i.prev!==i.next;){if(h=i.prev,l=i.next,r?rh(i,s,n,r):nh(i)){t.push(h.i/e|0),t.push(i.i/e|0),t.push(l.i/e|0),Ve(i),i=l.next,o=l.next;continue}if(i=l,i===o){a?a===1?(i=ah(ae(i),t,e),He(i,t,e,s,n,r,2)):a===2&&oh(i,t,e,s,n,r):He(ae(i),t,e,s,n,r,1);break}}}}function nh(i){var t=i.prev,e=i,s=i.next;if(q(t,e,s)>=0)return!1;for(var n=t.x,r=e.x,a=s.x,o=t.y,h=e.y,l=s.y,c=nr?n>a?n:a:r>a?r:a,g=o>h?o>l?o:l:h>l?h:l,m=s.next;m!==t;){if(m.x>=c&&m.x<=f&&m.y>=d&&m.y<=g&&ue(n,o,r,h,a,l,m.x,m.y)&&q(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function rh(i,t,e,s){var n=i.prev,r=i,a=i.next;if(q(n,r,a)>=0)return!1;for(var o=n.x,h=r.x,l=a.x,c=n.y,d=r.y,f=a.y,g=oh?o>l?o:l:h>l?h:l,x=c>d?c>f?c:f:d>f?d:f,w=gs(g,m,t,e,s),_=gs(y,x,t,e,s),b=i.prevZ,S=i.nextZ;b&&b.z>=w&&S&&S.z<=_;){if(b.x>=g&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==a&&ue(o,c,h,d,l,f,b.x,b.y)&&q(b.prev,b,b.next)>=0||(b=b.prevZ,S.x>=g&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==a&&ue(o,c,h,d,l,f,S.x,S.y)&&q(S.prev,S,S.next)>=0))return!1;S=S.nextZ}for(;b&&b.z>=w;){if(b.x>=g&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==a&&ue(o,c,h,d,l,f,b.x,b.y)&&q(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;S&&S.z<=_;){if(S.x>=g&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==a&&ue(o,c,h,d,l,f,S.x,S.y)&&q(S.prev,S,S.next)>=0)return!1;S=S.nextZ}return!0}function ah(i,t,e){var s=i;do{var n=s.prev,r=s.next.next;!Ai(n,r)&&Or(n,s,s.next,r)&&$e(n,r)&&$e(r,n)&&(t.push(n.i/e|0),t.push(s.i/e|0),t.push(r.i/e|0),Ve(s),Ve(s.next),s=i=r),s=s.next}while(s!==i);return ae(s)}function oh(i,t,e,s,n,r){var a=i;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&mh(a,o)){var h=Wr(a,o);a=ae(a,a.next),h=ae(h,h.next),He(a,t,e,s,n,r,0),He(h,t,e,s,n,r,0);return}o=o.next}a=a.next}while(a!==i)}function hh(i,t,e,s){var n=[],r,a,o,h,l;for(r=0,a=t.length;r=e.next.y&&e.next.y!==e.y){var o=e.x+(n-e.y)*(e.next.x-e.x)/(e.next.y-e.y);if(o<=s&&o>r&&(r=o,a=e.x=e.x&&e.x>=l&&s!==e.x&&ue(na.x||e.x===a.x&&uh(a,e)))&&(a=e,d=f)),e=e.next;while(e!==h);return a}function uh(i,t){return q(i.prev,i,t.prev)<0&&q(t.next,i,i.next)<0}function fh(i,t,e,s){var n=i;do n.z===0&&(n.z=gs(n.x,n.y,t,e,s)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next;while(n!==i);n.prevZ.nextZ=null,n.prevZ=null,ph(n)}function ph(i){var t,e,s,n,r,a,o,h,l=1;do{for(e=i,i=null,r=null,a=0;e;){for(a++,s=e,o=0,t=0;t0||h>0&&s;)o!==0&&(h===0||!s||e.z<=s.z)?(n=e,e=e.nextZ,o--):(n=s,s=s.nextZ,h--),r?r.nextZ=n:i=n,n.prevZ=r,r=n;e=s}r.nextZ=null,l*=2}while(a>1);return i}function gs(i,t,e,s,n){return i=(i-e)*n|0,t=(t-s)*n|0,i=(i|i<<8)&16711935,i=(i|i<<4)&252645135,i=(i|i<<2)&858993459,i=(i|i<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,i|t<<1}function gh(i){var t=i,e=i;do(t.x=(i-a)*(r-o)&&(i-a)*(s-o)>=(e-a)*(t-o)&&(e-a)*(r-o)>=(n-a)*(s-o)}function mh(i,t){return i.next.i!==t.i&&i.prev.i!==t.i&&!xh(i,t)&&($e(i,t)&&$e(t,i)&&yh(i,t)&&(q(i.prev,i,t.prev)||q(i,t.prev,t))||Ai(i,t)&&q(i.prev,i,i.next)>0&&q(t.prev,t,t.next)>0)}function q(i,t,e){return(t.y-i.y)*(e.x-t.x)-(t.x-i.x)*(e.y-t.y)}function Ai(i,t){return i.x===t.x&&i.y===t.y}function Or(i,t,e,s){var n=oi(q(i,t,e)),r=oi(q(i,t,s)),a=oi(q(e,s,i)),o=oi(q(e,s,t));return!!(n!==r&&a!==o||n===0&&ai(i,e,t)||r===0&&ai(i,s,t)||a===0&&ai(e,i,s)||o===0&&ai(e,t,s))}function ai(i,t,e){return t.x<=Math.max(i.x,e.x)&&t.x>=Math.min(i.x,e.x)&&t.y<=Math.max(i.y,e.y)&&t.y>=Math.min(i.y,e.y)}function oi(i){return i>0?1:i<0?-1:0}function xh(i,t){var e=i;do{if(e.i!==i.i&&e.next.i!==i.i&&e.i!==t.i&&e.next.i!==t.i&&Or(e,e.next,i,t))return!0;e=e.next}while(e!==i);return!1}function $e(i,t){return q(i.prev,i,i.next)<0?q(i,t,i.next)>=0&&q(i,i.prev,t)>=0:q(i,t,i.prev)<0||q(i,i.next,t)<0}function yh(i,t){var e=i,s=!1,n=(i.x+t.x)/2,r=(i.y+t.y)/2;do e.y>r!=e.next.y>r&&e.next.y!==e.y&&n<(e.next.x-e.x)*(r-e.y)/(e.next.y-e.y)+e.x&&(s=!s),e=e.next;while(e!==i);return s}function Wr(i,t){var e=new ms(i.i,i.x,i.y),s=new ms(t.i,t.x,t.y),n=i.next,r=t.prev;return i.next=t,t.prev=i,e.next=n,n.prev=e,s.next=e,e.prev=s,r.next=s,s.prev=r,s}function _n(i,t,e,s){var n=new ms(i,t,e);return s?(n.next=s.next,n.prev=s,s.next.prev=n,s.next=n):(n.prev=n,n.next=n),n}function Ve(i){i.next.prev=i.prev,i.prev.next=i.next,i.prevZ&&(i.prevZ.nextZ=i.nextZ),i.nextZ&&(i.nextZ.prevZ=i.prevZ)}function ms(i,t,e){this.i=i,this.x=t,this.y=e,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}Ti.deviation=function(i,t,e,s){var n=t&&t.length,r=n?t[0]*e:i.length,a=Math.abs(xs(i,0,r,e));if(n)for(var o=0,h=t.length;o0&&(s+=i[n-1].length,e.holes.push(s))}return e};var wh=Es.exports;const _h=Ps(wh);var Nr=(i=>(i[i.NONE=0]="NONE",i[i.COLOR=16384]="COLOR",i[i.STENCIL=1024]="STENCIL",i[i.DEPTH=256]="DEPTH",i[i.COLOR_DEPTH=16640]="COLOR_DEPTH",i[i.COLOR_STENCIL=17408]="COLOR_STENCIL",i[i.DEPTH_STENCIL=1280]="DEPTH_STENCIL",i[i.ALL=17664]="ALL",i))(Nr||{});class bh{constructor(t){this.items=[],this._name=t}emit(t,e,s,n,r,a,o,h){const{name:l,items:c}=this;for(let d=0,f=c.length;d{this.runners[e]=new bh(e)})}_addSystems(t){let e;for(e in t){const s=t[e];this._addSystem(s.value,s.name)}}_addSystem(t,e){const s=new t(this);if(this[e])throw new Error(`Whoops! The name "${e}" is already in use`);this[e]=s,this._systemsHash[e]=s;for(const n in this.runners)this.runners[n].add(s);return this}_addPipes(t,e){const s=e.reduce((n,r)=>(n[r.name]=r.value,n),{});t.forEach(n=>{const r=n.value,a=n.name,o=s[a];this.renderPipes[a]=new r(this,o?new o:null)})}destroy(t=!1){this.runners.destroy.items.reverse(),this.runners.destroy.emit(t),Object.values(this.runners).forEach(e=>{e.destroy()}),this._systemsHash=null,this.renderPipes=null}generateTexture(t){return this.textureGenerator.generateTexture(t)}get roundPixels(){return!!this._roundPixels}_unsafeEvalCheck(){if(!sh())throw new Error("Current environment does not allow unsafe-eval, please use pixi.js/unsafe-eval module to enable support.")}};Hr.defaultOptions={resolution:1,failIfMajorPerformanceCaveat:!1,roundPixels:!1};let Vr=Hr,hi;function vh(i){return hi!==void 0||(hi=(()=>{var e;const t={stencil:!0,failIfMajorPerformanceCaveat:i??Vr.defaultOptions.failIfMajorPerformanceCaveat};try{if(!Q.get().getWebGLRenderingContext())return!1;let n=Q.get().createCanvas().getContext("webgl",t);const r=!!((e=n==null?void 0:n.getContextAttributes())!=null&&e.stencil);if(n){const a=n.getExtension("WEBGL_lose_context");a&&a.loseContext()}return n=null,r}catch{return!1}})()),hi}let li;async function Ch(i={}){return li!==void 0||(li=await(async()=>{const t=Q.get().getNavigator().gpu;if(!t)return!1;try{return await(await t.requestAdapter(i)).requestDevice(),!0}catch{return!1}})()),li}const bn=["webgl","webgpu","canvas"];async function Th(i){let t=[];i.preference?(t.push(i.preference),bn.forEach(r=>{r!==i.preference&&t.push(r)})):t=bn.slice();let e,s={};for(let r=0;r{const{WebGPURenderer:h}=await import("./WebGPURenderer-DnAx_Qia.js");return{WebGPURenderer:h}},__vite__mapDeps([3,2,4]));e=o,s={...i,...i.webgpu};break}else if(a==="webgl"&&vh(i.failIfMajorPerformanceCaveat??Vr.defaultOptions.failIfMajorPerformanceCaveat)){const{WebGLRenderer:o}=await mi(async()=>{const{WebGLRenderer:h}=await import("./WebGLRenderer-D9P4BJeq.js");return{WebGLRenderer:h}},__vite__mapDeps([5,2,4]));e=o,s={...i,...i.webgl};break}else if(a==="canvas")throw s={...i},new Error("CanvasRenderer is not yet implemented")}if(delete s.webgpu,delete s.webgl,!e)throw new Error("No available renderer for the current environment");const n=new e;return await n.init(s),n}const Yr="8.4.0";class Xr{static init(){var t;(t=globalThis.__PIXI_APP_INIT__)==null||t.call(globalThis,this,Yr)}static destroy(){}}Xr.extension=k.Application;class Ah{constructor(t){this._renderer=t}init(){var t;(t=globalThis.__PIXI_RENDERER_INIT__)==null||t.call(globalThis,this._renderer,Yr)}destroy(){this._renderer=null}}Ah.extension={type:[k.WebGLSystem,k.WebGPUSystem],name:"initHook",priority:-10};const jr=class ys{constructor(...t){this.stage=new tt,t[0]!==void 0&&U(W,"Application constructor options are deprecated, please use Application.init() instead.")}async init(t){t={...t},this.renderer=await Th(t),ys._plugins.forEach(e=>{e.init.call(this,t)})}render(){this.renderer.render({container:this.stage})}get canvas(){return this.renderer.canvas}get view(){return U(W,"Application.view is deprecated, please use Application.canvas instead."),this.renderer.canvas}get screen(){return this.renderer.screen}destroy(t=!1,e=!1){const s=ys._plugins.slice(0);s.reverse(),s.forEach(n=>{n.destroy.call(this)}),this.stage.destroy(e),this.stage=null,this.renderer.destroy(t),this.renderer=null}};jr._plugins=[];let qr=jr;lt.handleByList(k.Application,qr._plugins);lt.add(Xr);class Kr extends pt{constructor(){super(...arguments),this.chars=Object.create(null),this.lineHeight=0,this.fontFamily="",this.fontMetrics={fontSize:0,ascent:0,descent:0},this.baseLineOffset=0,this.distanceField={type:"none",range:0},this.pages=[],this.applyFillAsTint=!0,this.baseMeasurementFontSize=100,this.baseRenderedFontSize=100}get font(){return U(W,"BitmapFont.font is deprecated, please use BitmapFont.fontFamily instead."),this.fontFamily}get pageTextures(){return U(W,"BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead."),this.pages}get size(){return U(W,"BitmapFont.size is deprecated, please use BitmapFont.fontMetrics.fontSize instead."),this.fontMetrics.fontSize}get distanceFieldRange(){return U(W,"BitmapFont.distanceFieldRange is deprecated, please use BitmapFont.distanceField.range instead."),this.distanceField.range}get distanceFieldType(){return U(W,"BitmapFont.distanceFieldType is deprecated, please use BitmapFont.distanceField.type instead."),this.distanceField.type}destroy(t=!1){var e;this.emit("destroy",this),this.removeAllListeners();for(const s in this.chars)(e=this.chars[s].texture)==null||e.destroy();this.chars=null,t&&(this.pages.forEach(s=>s.texture.destroy(!0)),this.pages=null)}}const Zr=class ws{constructor(t,e,s,n){this.uid=nt("fillGradient"),this.type="linear",this.gradientStops=[],this._styleKey=null,this.x0=t,this.y0=e,this.x1=s,this.y1=n}addColorStop(t,e){return this.gradientStops.push({offset:t,color:Z.shared.setValue(e).toHexa()}),this._styleKey=null,this}buildLinearGradient(){const t=ws.defaultTextureSize,{gradientStops:e}=this,s=Q.get().createCanvas();s.width=t,s.height=t;const n=s.getContext("2d"),r=n.createLinearGradient(0,0,ws.defaultTextureSize,1);for(let y=0;y`${n.offset}-${n.color}`).join("-"),e=this.texture.uid,s=this.transform.toArray().join("-");return`fill-gradient-${this.uid}-${t}-${e}-${s}-${this.x0}-${this.y0}-${this.x1}-${this.y1}`}};Zr.defaultTextureSize=256;let Ye=Zr;const Sn={repeat:{addressModeU:"repeat",addressModeV:"repeat"},"repeat-x":{addressModeU:"repeat",addressModeV:"clamp-to-edge"},"repeat-y":{addressModeU:"clamp-to-edge",addressModeV:"repeat"},"no-repeat":{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}};class Mi{constructor(t,e){this.uid=nt("fillPattern"),this.transform=new H,this._styleKey=null,this.texture=t,this.transform.scale(1/t.frame.width,1/t.frame.height),e&&(t.source.style.addressModeU=Sn[e].addressModeU,t.source.style.addressModeV=Sn[e].addressModeV)}setTransform(t){const e=this.texture;this.transform.copyFrom(t),this.transform.invert(),this.transform.scale(1/e.frame.width,1/e.frame.height),this._styleKey=null}get styleKey(){return this._styleKey?this._styleKey:(this._styleKey=`fill-pattern-${this.uid}-${this.texture.uid}-${this.transform.toArray().join("-")}`,this._styleKey)}}var Mh=kh,qi={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},Ph=/([astvzqmhlc])([^astvzqmhlc]*)/ig;function kh(i){var t=[];return i.replace(Ph,function(e,s,n){var r=s.toLowerCase();for(n=Bh(n),r=="m"&&n.length>2&&(t.push([s].concat(n.splice(0,2))),r="l",s=s=="m"?"l":"L");;){if(n.length==qi[r])return n.unshift(s),t.push(n);if(n.length0&&(n=s.pop(),n?(r=n.startX,a=n.startY):(r=0,a=0)),n=null;break;default:st(`Unknown SVG path command: ${l}`)}l!=="Z"&&l!=="z"&&n===null&&(n={startX:r,startY:a},s.push(n))}return t}class Rs{constructor(t=0,e=0,s=0){this.type="circle",this.x=t,this.y=e,this.radius=s}clone(){return new Rs(this.x,this.y,this.radius)}contains(t,e){if(this.radius<=0)return!1;const s=this.radius*this.radius;let n=this.x-t,r=this.y-e;return n*=n,r*=r,n+r<=s}strokeContains(t,e,s){if(this.radius===0)return!1;const n=this.x-t,r=this.y-e,a=this.radius,o=s/2,h=Math.sqrt(n*n+r*r);return ha-o}getBounds(t){return t=t||new E,t.x=this.x-this.radius,t.y=this.y-this.radius,t.width=this.radius*2,t.height=this.radius*2,t}copyFrom(t){return this.x=t.x,this.y=t.y,this.radius=t.radius,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:Circle x=${this.x} y=${this.y} radius=${this.radius}]`}}class Fs{constructor(t=0,e=0,s=0,n=0){this.type="ellipse",this.x=t,this.y=e,this.halfWidth=s,this.halfHeight=n}clone(){return new Fs(this.x,this.y,this.halfWidth,this.halfHeight)}contains(t,e){if(this.halfWidth<=0||this.halfHeight<=0)return!1;let s=(t-this.x)/this.halfWidth,n=(e-this.y)/this.halfHeight;return s*=s,n*=n,s+n<=1}strokeContains(t,e,s){const{halfWidth:n,halfHeight:r}=this;if(n<=0||r<=0)return!1;const a=s/2,o=n-a,h=r-a,l=n+a,c=r+a,d=t-this.x,f=e-this.y,g=d*d/(o*o)+f*f/(h*h),m=d*d/(l*l)+f*f/(c*c);return g>1&&m<=1}getBounds(t){return t=t||new E,t.x=this.x-this.halfWidth,t.y=this.y-this.halfHeight,t.width=this.halfWidth*2,t.height=this.halfHeight*2,t}copyFrom(t){return this.x=t.x,this.y=t.y,this.halfWidth=t.halfWidth,this.halfHeight=t.halfHeight,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:Ellipse x=${this.x} y=${this.y} halfWidth=${this.halfWidth} halfHeight=${this.halfHeight}]`}}function Rh(i,t,e,s,n,r){const a=i-e,o=t-s,h=n-e,l=r-s,c=a*h+o*l,d=h*h+l*l;let f=-1;d!==0&&(f=c/d);let g,m;f<0?(g=e,m=s):f>1?(g=n,m=r):(g=e+f*h,m=s+f*l);const y=i-g,x=t-m;return y*y+x*x}class We{constructor(...t){this.type="polygon";let e=Array.isArray(t[0])?t[0]:t;if(typeof e[0]!="number"){const s=[];for(let n=0,r=e.length;ne!=c>e&&t<(l-o)*((e-h)/(c-h))+o&&(s=!s)}return s}strokeContains(t,e,s){const n=s/2,r=n*n,{points:a}=this,o=a.length-(this.closePath?0:2);for(let h=0;hn?l:n,r=ca?c:a}return t.x=s,t.width=n-s,t.y=r,t.height=a-r,t}copyFrom(t){return this.points=t.points.slice(),this.closePath=t.closePath,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:PolygoncloseStroke=${this.closePath}points=${this.points.reduce((t,e)=>`${t}, ${e}`,"")}]`}get lastX(){return this.points[this.points.length-2]}get lastY(){return this.points[this.points.length-1]}get x(){return this.points[this.points.length-2]}get y(){return this.points[this.points.length-1]}}const ci=(i,t,e,s,n,r)=>{const a=i-e,o=t-s,h=Math.sqrt(a*a+o*o);return h>=n-r&&h<=n+r};class Ls{constructor(t=0,e=0,s=0,n=0,r=20){this.type="roundedRectangle",this.x=t,this.y=e,this.width=s,this.height=n,this.radius=r}getBounds(t){return t=t||new E,t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t}clone(){return new Ls(this.x,this.y,this.width,this.height,this.radius)}copyFrom(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this}copyTo(t){return t.copyFrom(this),t}contains(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){const s=Math.max(0,Math.min(this.radius,Math.min(this.width,this.height)/2));if(e>=this.y+s&&e<=this.y+this.height-s||t>=this.x+s&&t<=this.x+this.width-s)return!0;let n=t-(this.x+s),r=e-(this.y+s);const a=s*s;if(n*n+r*r<=a||(n=t-(this.x+this.width-s),n*n+r*r<=a)||(r=e-(this.y+this.height-s),n*n+r*r<=a)||(n=t-(this.x+s),n*n+r*r<=a))return!0}return!1}strokeContains(t,e,s){const{x:n,y:r,width:a,height:o,radius:h}=this,l=s/2,c=n+h,d=r+h,f=a-h*2,g=o-h*2,m=n+a,y=r+o;return(t>=n-l&&t<=n+l||t>=m-l&&t<=m+l)&&e>=d&&e<=d+g||(e>=r-l&&e<=r+l||e>=y-l&&e<=y+l)&&t>=c&&t<=c+f?!0:tm-h&&em-h&&e>y-h&&ci(t,e,m-h,y-h,h,l)||ty-h&&ci(t,e,c,y-h,h,l)}toString(){return`[pixi.js/math:RoundedRectangle x=${this.x} y=${this.y}width=${this.width} height=${this.height} radius=${this.radius}]`}}const Fh=["precision mediump float;","void main(void){","float test = 0.1;","%forloop%","gl_FragColor = vec4(0.0);","}"].join(` +`);function Lh(i){let t="";for(let e=0;e0&&(t+=` +else `),e>>=0;return Jr[e]||Uh(i,t,e)}let Ki=0;function Uh(i,t,e){const s={};let n=0;Ki||(Ki=Qr());for(let a=0;a0){const a=new Uint8Array(i,e*8,r);new Uint8Array(t,e*8,r).set(a)}}const Oh={normal:"normal-npm",add:"add-npm",screen:"screen-npm"};var Wh=(i=>(i[i.DISABLED=0]="DISABLED",i[i.RENDERING_MASK_ADD=1]="RENDERING_MASK_ADD",i[i.MASK_ACTIVE=2]="MASK_ACTIVE",i[i.RENDERING_MASK_REMOVE=3]="RENDERING_MASK_REMOVE",i[i.NONE=4]="NONE",i))(Wh||{});function Tn(i,t){return t.alphaMode==="no-premultiply-alpha"&&Oh[i]||i}class Nh{constructor(){this.ids=Object.create(null),this.textures=[],this.count=0}clear(){for(let t=0;t0?ta[--_s]:new Hh}function Mn(i){ta[_s++]=i}let Ee=0;const ea=class gi{constructor(t={}){this.uid=nt("batcher"),this.dirty=!0,this.batchIndex=0,this.batches=[],this._elements=[],gi.defaultOptions.maxTextures=gi.defaultOptions.maxTextures??Qr(),t={...gi.defaultOptions,...t};const{maxTextures:e,attributesInitialSize:s,indicesInitialSize:n}=t;this.attributeBuffer=new vn(s*4),this.indexBuffer=new Uint16Array(n),this.maxTextures=e}begin(){this.elementSize=0,this.elementStart=0,this.indexSize=0,this.attributeSize=0;for(let t=0;tthis.attributeBuffer.size&&this._resizeAttributeBuffer(this.attributeSize*4),this.indexSize>this.indexBuffer.length&&this._resizeIndexBuffer(this.indexSize);const o=this.attributeBuffer.float32View,h=this.attributeBuffer.uint32View,l=this.indexBuffer;let c=this._batchIndexSize,d=this._batchIndexStart,f="startBatch";const g=this.maxTextures;for(let m=this.elementStart;m=g||b)&&(this._finishBatch(s,d,c-d,n,a,t,f),f="renderBatch",d=c,a=_,s=An(),n=s.textures,n.clear(),++Ee),y._textureId=w._textureBindLocation=n.count,n.ids[w.uid]=n.count,n.textures[n.count++]=w,y._batch=s,c+=y.indexSize,y.packAsQuad?(this.packQuadAttributes(y,o,h,y._attributeStart,y._textureId),this.packQuadIndex(l,y._indexStart,y._attributeStart/this.vertexSize)):(this.packAttributes(y,o,h,y._attributeStart,y._textureId),this.packIndex(y,l,y._indexStart,y._attributeStart/this.vertexSize))}n.count>0&&(this._finishBatch(s,d,c-d,n,a,t,f),d=c,++Ee),this.elementStart=this.elementSize,this._batchIndexStart=d,this._batchIndexSize=c}_finishBatch(t,e,s,n,r,a,o){t.gpuBindGroup=null,t.bindGroup=null,t.action=o,t.batcher=this,t.textures=n,t.blendMode=r,t.start=e,t.size=s,++Ee,this.batches[this.batchIndex++]=t,a.add(t)}finish(t){this.break(t)}ensureAttributeBuffer(t){t*4<=this.attributeBuffer.size||this._resizeAttributeBuffer(t*4)}ensureIndexBuffer(t){t<=this.indexBuffer.length||this._resizeIndexBuffer(t)}_resizeAttributeBuffer(t){const e=Math.max(t,this.attributeBuffer.size*2),s=new vn(e);Cn(this.attributeBuffer.rawBinaryData,s.rawBinaryData),this.attributeBuffer=s}_resizeIndexBuffer(t){const e=this.indexBuffer;let s=Math.max(t,e.length*1.5);s+=s%2;const n=s>65535?new Uint32Array(s):new Uint16Array(s);if(n.BYTES_PER_ELEMENT!==e.BYTES_PER_ELEMENT)for(let r=0;r(i[i.MAP_READ=1]="MAP_READ",i[i.MAP_WRITE=2]="MAP_WRITE",i[i.COPY_SRC=4]="COPY_SRC",i[i.COPY_DST=8]="COPY_DST",i[i.INDEX=16]="INDEX",i[i.VERTEX=32]="VERTEX",i[i.UNIFORM=64]="UNIFORM",i[i.STORAGE=128]="STORAGE",i[i.INDIRECT=256]="INDIRECT",i[i.QUERY_RESOLVE=512]="QUERY_RESOLVE",i[i.STATIC=1024]="STATIC",i))(it||{});class Vt extends pt{constructor(t){let{data:e,size:s}=t;const{usage:n,label:r,shrinkToFit:a}=t;super(),this.uid=nt("buffer"),this._resourceType="buffer",this._resourceId=nt("resource"),this._touched=0,this._updateID=1,this.shrinkToFit=!0,this.destroyed=!1,e instanceof Array&&(e=new Float32Array(e)),this._data=e,s=s??(e==null?void 0:e.byteLength);const o=!!e;this.descriptor={size:s,usage:n,mappedAtCreation:o,label:r},this.shrinkToFit=a??!0}get data(){return this._data}set data(t){this.setDataWithSize(t,t.length,!0)}get static(){return!!(this.descriptor.usage&it.STATIC)}set static(t){t?this.descriptor.usage|=it.STATIC:this.descriptor.usage&=~it.STATIC}setDataWithSize(t,e,s){if(this._updateID++,this._updateSize=e*t.BYTES_PER_ELEMENT,this._data===t){s&&this.emit("update",this);return}const n=this._data;if(this._data=t,n.length!==t.length){!this.shrinkToFit&&t.byteLengtho&&(o=g),m>h&&(h=m),ge.destroy()),this.attributes=null,this.buffers=null,this.indexBuffer=null,this._bounds=null}}const Xh=new Float32Array(1),jh=new Uint32Array(1);class qh extends sa{constructor(){const e=new Vt({data:Xh,label:"attribute-batch-buffer",usage:it.VERTEX|it.COPY_DST,shrinkToFit:!1}),s=new Vt({data:jh,label:"index-batch-buffer",usage:it.INDEX|it.COPY_DST,shrinkToFit:!1}),n=6*4;super({attributes:{aPosition:{buffer:e,format:"float32x2",stride:n,offset:0},aUV:{buffer:e,format:"float32x2",stride:n,offset:2*4},aColor:{buffer:e,format:"unorm8x4",stride:n,offset:4*4},aTextureIdAndRound:{buffer:e,format:"uint16x2",stride:n,offset:5*4}},indexBuffer:s})}}function Pn(i,t,e){if(i)for(const s in i){const n=s.toLocaleLowerCase(),r=t[n];if(r){let a=i[s];s==="header"&&(a=a.replace(/@in\s+[^;]+;\s*/g,"").replace(/@out\s+[^;]+;\s*/g,"")),e&&r.push(`//----${e}----//`),r.push(a)}else st(`${s} placement hook does not exist in shader`)}}const Kh=/\{\{(.*?)\}\}/g;function kn(i){var s;const t={};return(((s=i.match(Kh))==null?void 0:s.map(n=>n.replace(/[{()}]/g,"")))??[]).forEach(n=>{t[n]=[]}),t}function Gn(i,t){let e;const s=/@in\s+([^;]+);/g;for(;(e=s.exec(i))!==null;)t.push(e[1])}function Bn(i,t,e=!1){const s=[];Gn(t,s),i.forEach(o=>{o.header&&Gn(o.header,s)});const n=s;e&&n.sort();const r=n.map((o,h)=>` @location(${h}) ${o},`).join(` +`);let a=t.replace(/@in\s+[^;]+;\s*/g,"");return a=a.replace("{{in}}",` +${r} +`),a}function In(i,t){let e;const s=/@out\s+([^;]+);/g;for(;(e=s.exec(i))!==null;)t.push(e[1])}function Zh(i){const e=/\b(\w+)\s*:/g.exec(i);return e?e[1]:""}function Qh(i){const t=/@.*?\s+/g;return i.replace(t,"")}function Jh(i,t){const e=[];In(t,e),i.forEach(h=>{h.header&&In(h.header,e)});let s=0;const n=e.sort().map(h=>h.indexOf("builtin")>-1?h:`@location(${s++}) ${h}`).join(`, +`),r=e.sort().map(h=>` var ${Qh(h)};`).join(` +`),a=`return VSOutput( + ${e.sort().map(h=>` ${Zh(h)}`).join(`, +`)});`;let o=t.replace(/@out\s+[^;]+;\s*/g,"");return o=o.replace("{{struct}}",` +${n} +`),o=o.replace("{{start}}",` +${r} +`),o=o.replace("{{return}}",` +${a} +`),o}function En(i,t){let e=i;for(const s in t){const n=t[s];n.join(` +`).length?e=e.replace(`{{${s}}}`,`//-----${s} START-----// +${n.join(` +`)} +//----${s} FINISH----//`):e=e.replace(`{{${s}}}`,"")}return e}const $t=Object.create(null),Zi=new Map;let tl=0;function el({template:i,bits:t}){const e=na(i,t);if($t[e])return $t[e];const{vertex:s,fragment:n}=sl(i,t);return $t[e]=ra(s,n,t),$t[e]}function il({template:i,bits:t}){const e=na(i,t);return $t[e]||($t[e]=ra(i.vertex,i.fragment,t)),$t[e]}function sl(i,t){const e=t.map(a=>a.vertex).filter(a=>!!a),s=t.map(a=>a.fragment).filter(a=>!!a);let n=Bn(e,i.vertex,!0);n=Jh(e,n);const r=Bn(s,i.fragment,!0);return{vertex:n,fragment:r}}function na(i,t){return t.map(e=>(Zi.has(e)||Zi.set(e,tl++),Zi.get(e))).sort((e,s)=>e-s).join("-")+i.vertex+i.fragment}function ra(i,t,e){const s=kn(i),n=kn(t);return e.forEach(r=>{Pn(r.vertex,s,r.name),Pn(r.fragment,n,r.name)}),{vertex:En(i,s),fragment:En(t,n)}}const nl=` + @in aPosition: vec2; + @in aUV: vec2; + + @out @builtin(position) vPosition: vec4; + @out vUV : vec2; + @out vColor : vec4; + + {{header}} + + struct VSOutput { + {{struct}} + }; + + @vertex + fn main( {{in}} ) -> VSOutput { + + var worldTransformMatrix = globalUniforms.uWorldTransformMatrix; + var modelMatrix = mat3x3( + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0 + ); + var position = aPosition; + var uv = aUV; + + {{start}} + + vColor = vec4(1., 1., 1., 1.); + + {{main}} + + vUV = uv; + + var modelViewProjectionMatrix = globalUniforms.uProjectionMatrix * worldTransformMatrix * modelMatrix; + + vPosition = vec4((modelViewProjectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); + + vColor *= globalUniforms.uWorldColorAlpha; + + {{end}} + + {{return}} + }; +`,rl=` + @in vUV : vec2; + @in vColor : vec4; + + {{header}} + + @fragment + fn main( + {{in}} + ) -> @location(0) vec4 { + + {{start}} + + var outColor:vec4; + + {{main}} + + var finalColor:vec4 = outColor * vColor; + + {{end}} + + return finalColor; + }; +`,al=` + in vec2 aPosition; + in vec2 aUV; + + out vec4 vColor; + out vec2 vUV; + + {{header}} + + void main(void){ + + mat3 worldTransformMatrix = uWorldTransformMatrix; + mat3 modelMatrix = mat3( + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0 + ); + vec2 position = aPosition; + vec2 uv = aUV; + + {{start}} + + vColor = vec4(1.); + + {{main}} + + vUV = uv; + + mat3 modelViewProjectionMatrix = uProjectionMatrix * worldTransformMatrix * modelMatrix; + + gl_Position = vec4((modelViewProjectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); + + vColor *= uWorldColorAlpha; + + {{end}} + } +`,ol=` + + in vec4 vColor; + in vec2 vUV; + + out vec4 finalColor; + + {{header}} + + void main(void) { + + {{start}} + + vec4 outColor; + + {{main}} + + finalColor = outColor * vColor; + + {{end}} + } +`,hl={name:"global-uniforms-bit",vertex:{header:` + struct GlobalUniforms { + uProjectionMatrix:mat3x3, + uWorldTransformMatrix:mat3x3, + uWorldColorAlpha: vec4, + uResolution: vec2, + } + + @group(0) @binding(0) var globalUniforms : GlobalUniforms; + `}},ll={name:"global-uniforms-bit",vertex:{header:` + uniform mat3 uProjectionMatrix; + uniform mat3 uWorldTransformMatrix; + uniform vec4 uWorldColorAlpha; + uniform vec2 uResolution; + `}};function cl({bits:i,name:t}){const e=el({template:{fragment:rl,vertex:nl},bits:[hl,...i]});return Ci.from({name:t,vertex:{source:e.vertex,entryPoint:"main"},fragment:{source:e.fragment,entryPoint:"main"}})}function dl({bits:i,name:t}){return new Rr({name:t,...il({template:{vertex:al,fragment:ol},bits:[ll,...i]})})}const ul={name:"color-bit",vertex:{header:` + @in aColor: vec4; + `,main:` + vColor *= vec4(aColor.rgb * aColor.a, aColor.a); + `}},fl={name:"color-bit",vertex:{header:` + in vec4 aColor; + `,main:` + vColor *= vec4(aColor.rgb * aColor.a, aColor.a); + `}},Qi={};function pl(i){const t=[];if(i===1)t.push("@group(1) @binding(0) var textureSource1: texture_2d;"),t.push("@group(1) @binding(1) var textureSampler1: sampler;");else{let e=0;for(let s=0;s;`),t.push(`@group(1) @binding(${e++}) var textureSampler${s+1}: sampler;`)}return t.join(` +`)}function gl(i){const t=[];if(i===1)t.push("outColor = textureSampleGrad(textureSource1, textureSampler1, vUV, uvDx, uvDy);");else{t.push("switch vTextureId {");for(let e=0;e; + @out @interpolate(flat) vTextureId : u32; + `,main:` + vTextureId = aTextureIdAndRound.y; + `,end:` + if(aTextureIdAndRound.x == 1) + { + vPosition = vec4(roundPixels(vPosition.xy, globalUniforms.uResolution), vPosition.zw); + } + `},fragment:{header:` + @in @interpolate(flat) vTextureId: u32; + + ${pl(i)} + `,main:` + var uvDx = dpdx(vUV); + var uvDy = dpdy(vUV); + + ${gl(i)} + `}}),Qi[i]}const Ji={};function xl(i){const t=[];for(let e=0;e0&&t.push("else"),e, targetSize: vec2) -> vec2 + { + return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; + } + `}},_l={name:"round-pixels-bit",vertex:{header:` + vec2 roundPixels(vec2 position, vec2 targetSize) + { + return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; + } + `}},Rn={};function bl(i){let t=Rn[i];if(t)return t;const e=new Int32Array(i);for(let s=0;s>16&255,s=i>>8&255,n=i&255,r=t>>16&255,a=t>>8&255,o=t&255,h=e*r/255,l=s*a/255,c=n*o/255;return(h<<16)+(l<<8)+c}const Ml=new H;class la{constructor(){this.packAsQuad=!1,this.batcherName="default",this.applyTransform=!0,this.roundPixels=0,this._batcher=null,this._batch=null}get uvs(){return this.geometryData.uvs}get positions(){return this.geometryData.vertices}get indices(){return this.geometryData.indices}get blendMode(){return this.applyTransform?this.renderable.groupBlendMode:"normal"}get color(){const t=this.baseColor,e=t>>16|t&65280|(t&255)<<16,s=this.renderable;return s?Al(e,s.groupColor)+(this.alpha*s.groupAlpha*255<<24):e+(this.alpha*255<<24)}get transform(){var t;return((t=this.renderable)==null?void 0:t.groupTransform)||Ml}copyTo(t){t.indexOffset=this.indexOffset,t.indexSize=this.indexSize,t.attributeOffset=this.attributeOffset,t.attributeSize=this.attributeSize,t.baseColor=this.baseColor,t.alpha=this.alpha,t.texture=this.texture,t.geometryData=this.geometryData}reset(){this.applyTransform=!0}}const Xe={extension:{type:k.ShapeBuilder,name:"circle"},build(i,t){let e,s,n,r,a,o;if(i.type==="circle"){const S=i;e=S.x,s=S.y,a=o=S.radius,n=r=0}else if(i.type==="ellipse"){const S=i;e=S.x,s=S.y,a=S.halfWidth,o=S.halfHeight,n=r=0}else{const S=i,A=S.width/2,F=S.height/2;e=S.x+A,s=S.y+F,a=o=Math.max(0,Math.min(S.radius,Math.min(A,F))),n=A-a,r=F-o}if(!(a>=0&&o>=0&&n>=0&&r>=0))return t;const h=Math.ceil(2.3*Math.sqrt(a+o)),l=h*8+(n?4:0)+(r?4:0);if(l===0)return t;if(h===0)return t[0]=t[6]=e+n,t[1]=t[3]=s+r,t[2]=t[4]=e-n,t[5]=t[7]=s-r,t;let c=0,d=h*4+(n?2:0)+2,f=d,g=l,m=n+a,y=r,x=e+m,w=e-m,_=s+y;if(t[c++]=x,t[c++]=_,t[--d]=_,t[--d]=w,r){const S=s-y;t[f++]=w,t[f++]=S,t[--g]=S,t[--g]=x}for(let S=1;S0&&(n[r++]=h,n[r++]=l,n[r++]=h-1),h++;n[r++]=l+1,n[r++]=l,n[r++]=h-1}},Pl={...Xe,extension:{...Xe.extension,name:"ellipse"}},kl={...Xe,extension:{...Xe.extension,name:"roundedRectangle"}},Gl=1e-4,Ln=1e-4;function Bl(i){const t=i.length;if(t<6)return 1;let e=0;for(let s=0,n=i[t-2],r=i[t-1];sd&&(d+=Math.PI*2);let f=c;const g=d-c,m=Math.abs(g),y=Math.sqrt(h*h+l*l),x=(15*m*Math.sqrt(y)/Math.PI>>0)+1,w=g/x;if(f+=w,o){a.push(i,t),a.push(e,s);for(let _=1,b=f;_=0&&(c.join==="round"?_+=Qt(v,T,v-L*I,T-R*I,v-Y*I,T-et*I,x,!1)+4:_+=2,x.push(v-Y*D,T-et*D),x.push(v+Y*I,T+et*I));continue}const qs=(-L+P)*(-R+T)-(-L+v)*(-R+G),Ks=(-Y+K)*(-et+T)-(-Y+v)*(-et+Et),Je=(Nt*Ks-Pe*qs)/Qe,ti=(ke*qs-Me*Ks)/Qe,Bi=(Je-v)*(Je-v)+(ti-T)*(ti-T),jt=v+(Je-v)*I,qt=T+(ti-T)*I,Kt=v-(Je-v)*D,Zt=T-(ti-T)*D,Ra=Math.min(Nt*Nt+Me*Me,Pe*Pe+ke*ke),Zs=Ge?I:D,Fa=Ra+Zs*Zs*A;Bi<=Fa?c.join==="bevel"||Bi/A>F?(Ge?(x.push(jt,qt),x.push(v+L*D,T+R*D),x.push(jt,qt),x.push(v+Y*D,T+et*D)):(x.push(v-L*I,T-R*I),x.push(Kt,Zt),x.push(v-Y*I,T-et*I),x.push(Kt,Zt)),_+=2):c.join==="round"?Ge?(x.push(jt,qt),x.push(v+L*D,T+R*D),_+=Qt(v,T,v+L*D,T+R*D,v+Y*D,T+et*D,x,!0)+4,x.push(jt,qt),x.push(v+Y*D,T+et*D)):(x.push(v-L*I,T-R*I),x.push(Kt,Zt),_+=Qt(v,T,v-L*I,T-R*I,v-Y*I,T-et*I,x,!1)+4,x.push(v-Y*I,T-et*I),x.push(Kt,Zt)):(x.push(jt,qt),x.push(Kt,Zt)):(x.push(v-L*I,T-R*I),x.push(v+L*D,T+R*D),c.join==="round"?Ge?_+=Qt(v,T,v+L*D,T+R*D,v+Y*D,T+et*D,x,!0)+2:_+=Qt(v,T,v-L*I,T-R*I,v-Y*I,T-et*I,x,!1)+2:c.join==="miter"&&Bi/A<=F&&(Ge?(x.push(Kt,Zt),x.push(Kt,Zt)):(x.push(jt,qt),x.push(jt,qt)),_+=2),x.push(v-Y*I,T-et*I),x.push(v+Y*D,T+et*D),_+=2)}P=i[(w-2)*2],G=i[(w-2)*2+1],v=i[(w-1)*2],T=i[(w-1)*2+1],L=-(G-T),R=P-v,St=Math.sqrt(L*L+R*R),L/=St,R/=St,L*=S,R*=S,x.push(v-L*I,T-R*I),x.push(v+L*D,T+R*D),m||(c.cap==="round"?_+=Qt(v-L*(I-D)*.5,T-R*(I-D)*.5,v-L*I,T-R*I,v+L*D,T+R*D,x,!1)+2:c.cap==="square"&&(_+=Dn(v,T,L,R,I,D,!1,x)));const Ea=Ln*Ln;for(let V=b;V<_+b-2;++V)P=x[V*2],G=x[V*2+1],v=x[(V+1)*2],T=x[(V+1)*2+1],K=x[(V+2)*2],Et=x[(V+2)*2+1],!(Math.abs(P*(T-Et)+v*(Et-G)+K*(G-T))=0&&a>=0&&(t[0]=s,t[1]=n,t[2]=s+r,t[3]=n,t[4]=s+r,t[5]=n+a,t[6]=s,t[7]=n+a),t},triangulate(i,t,e,s,n,r){let a=0;s*=e,t[s+a]=i[0],t[s+a+1]=i[1],a+=e,t[s+a]=i[2],t[s+a+1]=i[3],a+=e,t[s+a]=i[6],t[s+a+1]=i[7],a+=e,t[s+a]=i[4],t[s+a+1]=i[5],a+=e;const o=s/e;n[r++]=o,n[r++]=o+1,n[r++]=o+2,n[r++]=o+1,n[r++]=o+3,n[r++]=o+2}},Ll={extension:{type:k.ShapeBuilder,name:"triangle"},build(i,t){return t[0]=i.x,t[1]=i.y,t[2]=i.x2,t[3]=i.y2,t[4]=i.x3,t[5]=i.y3,t},triangulate(i,t,e,s,n,r){let a=0;s*=e,t[s+a]=i[0],t[s+a+1]=i[1],a+=e,t[s+a]=i[2],t[s+a+1]=i[3],a+=e,t[s+a]=i[4],t[s+a+1]=i[5];const o=s/e;n[r++]=o,n[r++]=o+1,n[r++]=o+2}},Pi={};lt.handleByMap(k.ShapeBuilder,Pi);lt.add(Fl,Rl,Ll,Xe,Pl,kl);const Dl=new E;function zl(i,t){const{geometryData:e,batches:s}=t;s.length=0,e.indices.length=0,e.vertices.length=0,e.uvs.length=0;for(let n=0;n{const g=h.length,m=a.length/2,y=[],x=Pi[c.type];if(x.build(c,y),d&&ha(y,d),s){const S=c.closePath??!0;Il(y,t,!1,S,a,2,m,h)}else if(e&&l===f){l!==0&&console.warn("[Pixi Graphics] only the last shape have be cut out");const S=[],A=y.slice();Ol(e.shapePath).forEach(P=>{S.push(A.length/2),A.push(...P)}),ca(A,S,a,2,m,h,g)}else x.triangulate(y,a,2,m,h,g);const w=o.length/2,_=t.texture;if(_!==z.WHITE){const S=t.matrix;S&&(d&&S.append(d.clone().invert()),Cl(a,2,m,o,w,2,a.length/2-m,S))}else Tl(o,w,2,a.length/2-m);const b=zt.get(la);b.indexOffset=g,b.indexSize=h.length-g,b.attributeOffset=m,b.attributeSize=a.length/2-m,b.baseColor=t.color,b.alpha=t.alpha,b.texture=_,b.geometryData=r,n.push(b)})}function Ol(i){if(!i)return[];const t=i.shapePrimitives,e=[];for(let s=0;s{zt.return(s)})}destroy(){for(const t in this._gpuContextHash)this._gpuContextHash[t]&&this.onGraphicsContextDestroy(this._gpuContextHash[t].context)}};Ds.extension={type:[k.WebGLSystem,k.WebGPUSystem,k.CanvasSystem],name:"graphicsContext"};Ds.defaultOptions={bezierSmoothness:.5};let da=Ds;const Hl=8,di=11920929e-14,$l=1;function ua(i,t,e,s,n,r,a,o,h,l){const d=Math.min(.99,Math.max(0,l??da.defaultOptions.bezierSmoothness));let f=($l-d)/1;return f*=f,Vl(t,e,s,n,r,a,o,h,i,f),i}function Vl(i,t,e,s,n,r,a,o,h,l){Ss(i,t,e,s,n,r,a,o,h,l,0),h.push(a,o)}function Ss(i,t,e,s,n,r,a,o,h,l,c){if(c>Hl)return;const d=(i+e)/2,f=(t+s)/2,g=(e+n)/2,m=(s+r)/2,y=(n+a)/2,x=(r+o)/2,w=(d+g)/2,_=(f+m)/2,b=(g+y)/2,S=(m+x)/2,A=(w+b)/2,F=(_+S)/2;if(c>0){let P=a-i,G=o-t;const v=Math.abs((e-a)*G-(s-o)*P),T=Math.abs((n-a)*G-(r-o)*P);if(v>di&&T>di){if((v+T)*(v+T)<=l*(P*P+G*G)){h.push(A,F);return}}else if(v>di){if(v*v<=l*(P*P+G*G)){h.push(A,F);return}}else if(T>di){if(T*T<=l*(P*P+G*G)){h.push(A,F);return}}else if(P=A-(i+a)/2,G=F-(t+o)/2,P*P+G*G<=l){h.push(A,F);return}}Ss(i,t,d,f,w,_,A,F,h,l,c+1),Ss(A,F,b,S,y,x,a,o,h,l,c+1)}const Yl=8,Xl=11920929e-14,jl=1;function ql(i,t,e,s,n,r,a,o){const l=Math.min(.99,Math.max(0,o??da.defaultOptions.bezierSmoothness));let c=(jl-l)/1;return c*=c,Kl(t,e,s,n,r,a,i,c),i}function Kl(i,t,e,s,n,r,a,o){vs(a,i,t,e,s,n,r,o,0),a.push(n,r)}function vs(i,t,e,s,n,r,a,o,h){if(h>Yl)return;const l=(t+s)/2,c=(e+n)/2,d=(s+r)/2,f=(n+a)/2,g=(l+d)/2,m=(c+f)/2;let y=r-t,x=a-e;const w=Math.abs((s-r)*x-(n-a)*y);if(w>Xl){if(w*w<=o*(y*y+x*x)){i.push(g,m);return}}else if(y=g-(t+r)/2,x=m-(e+a)/2,y*y+x*x<=o){i.push(g,m);return}vs(i,t,e,l,c,g,m,o,h+1),vs(i,g,m,d,f,r,a,o,h+1)}function fa(i,t,e,s,n,r,a,o){let h=Math.abs(n-r);(!a&&n>r||a&&r>n)&&(h=2*Math.PI-h),o=o||Math.max(6,Math.floor(6*Math.pow(s,1/3)*(h/Math.PI))),o=Math.max(o,3);let l=h/o,c=n;l*=a?-1:1;for(let d=0;dd*h)}const Ne=Math.PI*2,ts={centerX:0,centerY:0,ang1:0,ang2:0},es=({x:i,y:t},e,s,n,r,a,o,h)=>{i*=e,t*=s;const l=n*i-r*t,c=r*i+n*t;return h.x=l+a,h.y=c+o,h};function Ql(i,t){const e=t===-1.5707963267948966?-.551915024494:1.3333333333333333*Math.tan(t/4),s=t===1.5707963267948966?.551915024494:e,n=Math.cos(i),r=Math.sin(i),a=Math.cos(i+t),o=Math.sin(i+t);return[{x:n-r*s,y:r+n*s},{x:a+o*s,y:o-a*s},{x:a,y:o}]}const Un=(i,t,e,s)=>{const n=i*s-t*e<0?-1:1;let r=i*e+t*s;return r>1&&(r=1),r<-1&&(r=-1),n*Math.acos(r)},Jl=(i,t,e,s,n,r,a,o,h,l,c,d,f)=>{const g=Math.pow(n,2),m=Math.pow(r,2),y=Math.pow(c,2),x=Math.pow(d,2);let w=g*m-g*x-m*y;w<0&&(w=0),w/=g*x+m*y,w=Math.sqrt(w)*(a===o?-1:1);const _=w*n/r*d,b=w*-r/n*c,S=l*_-h*b+(i+e)/2,A=h*_+l*b+(t+s)/2,F=(c-_)/n,P=(d-b)/r,G=(-c-_)/n,v=(-d-b)/r,T=Un(1,0,F,P);let K=Un(F,P,G,v);o===0&&K>0&&(K-=Ne),o===1&&K<0&&(K+=Ne),f.centerX=S,f.centerY=A,f.ang1=T,f.ang2=K};function tc(i,t,e,s,n,r,a,o=0,h=0,l=0){if(r===0||a===0)return;const c=Math.sin(o*Ne/360),d=Math.cos(o*Ne/360),f=d*(t-s)/2+c*(e-n)/2,g=-c*(t-s)/2+d*(e-n)/2;if(f===0&&g===0)return;r=Math.abs(r),a=Math.abs(a);const m=Math.pow(f,2)/Math.pow(r,2)+Math.pow(g,2)/Math.pow(a,2);m>1&&(r*=Math.sqrt(m),a*=Math.sqrt(m)),Jl(t,e,s,n,r,a,h,l,c,d,f,g,ts);let{ang1:y,ang2:x}=ts;const{centerX:w,centerY:_}=ts;let b=Math.abs(x)/(Ne/4);Math.abs(1-b)<1e-7&&(b=1);const S=Math.max(Math.ceil(b),1);x/=S;let A=i[i.length-2],F=i[i.length-1];const P={x:0,y:0};for(let G=0;G{const h=o.x-a.x,l=o.y-a.y,c=Math.sqrt(h*h+l*l),d=h/c,f=l/c;return{len:c,nx:d,ny:f}},n=(a,o)=>{a===0?i.moveTo(o.x,o.y):i.lineTo(o.x,o.y)};let r=t[t.length-1];for(let a=0;a0&&(g=-1,m=!0);const y=f/2;let x,w=Math.abs(Math.cos(y)*h/Math.sin(y));w>Math.min(c.len/2,d.len/2)?(w=Math.min(c.len/2,d.len/2),x=Math.abs(w*Math.sin(y)/Math.cos(y))):x=h;const _=o.x+d.nx*w+-d.ny*x*g,b=o.y+d.ny*w+d.nx*x*g,S=Math.atan2(c.ny,c.nx)+Math.PI/2*g,A=Math.atan2(d.ny,d.nx)-Math.PI/2*g;a===0&&i.moveTo(_+Math.cos(S)*x,b+Math.sin(S)*x),i.arc(_,b,x,S,A,m),r=o}}function ic(i,t,e,s){const n=(o,h)=>Math.sqrt((o.x-h.x)**2+(o.y-h.y)**2),r=(o,h,l)=>({x:o.x+(h.x-o.x)*l,y:o.y+(h.y-o.y)*l}),a=t.length;for(let o=0;o=2;d-=2)c[d]===c[d-2]&&c[d-1]===c[d-3]&&c.splice(d-1,2);return this.poly(c,!0,a)}ellipse(t,e,s,n,r){return this.drawShape(new Fs(t,e,s,n),r),this}roundRect(t,e,s,n,r,a){return this.drawShape(new Ls(t,e,s,n,r),a),this}drawShape(t,e){return this.endPoly(),this.shapePrimitives.push({shape:t,transform:e}),this}startPoly(t,e){let s=this._currentPoly;return s&&this.endPoly(),s=new We,s.points.push(t,e),this._currentPoly=s,this}endPoly(t=!1){const e=this._currentPoly;return e&&e.points.length>2&&(e.closePath=t,this.shapePrimitives.push({shape:e})),this._currentPoly=null,this}_ensurePoly(t=!0){if(!this._currentPoly&&(this._currentPoly=new We,t)){const e=this.shapePrimitives[this.shapePrimitives.length-1];if(e){let s=e.shape.x,n=e.shape.y;if(e.transform&&!e.transform.isIdentity()){const r=e.transform,a=s;s=r.a*s+r.c*n+r.tx,n=r.b*a+r.d*n+r.ty}this._currentPoly.points.push(s,n)}else this._currentPoly.points.push(0,0)}}buildPath(){const t=this._graphicsPath2D;this.shapePrimitives.length=0,this._currentPoly=null;for(let e=0;eparseInt(G,10)),t.context.poly(_,!0),e&&t.context.fill(),s&&t.context.stroke();break;case"polyline":b=i.getAttribute("points"),_=b.match(/\d+/g).map(G=>parseInt(G,10)),t.context.poly(_,!1),s&&t.context.stroke();break;case"g":case"svg":break;default:{console.info(`[SVG parser] <${i.nodeName}> elements unsupported`);break}}for(let G=0;G{this._fill=ne({...this._originalFill},xt.defaultFillStyle)})),this._fill=ne(t===0?"black":t,xt.defaultFillStyle),this.update())}get stroke(){return this._originalStroke}set stroke(t){t!==this._originalStroke&&(this._originalStroke=t,this._isFillStyle(t)&&(this._originalStroke=this._createProxy({...xt.defaultStrokeStyle,...t},()=>{this._stroke=_i({...this._originalStroke},xt.defaultStrokeStyle)})),this._stroke=_i(t,xt.defaultStrokeStyle),this.update())}_generateKey(){return this._styleKey=dc(this),this._styleKey}update(){this._styleKey=null,this.emit("update",this)}reset(){const t=de.defaultTextStyle;for(const e in t)this[e]=t[e]}get styleKey(){return this._styleKey||this._generateKey()}clone(){return new de({align:this.align,breakWords:this.breakWords,dropShadow:this._dropShadow?{...this._dropShadow}:null,fill:this._fill,fontFamily:this.fontFamily,fontSize:this.fontSize,fontStyle:this.fontStyle,fontVariant:this.fontVariant,fontWeight:this.fontWeight,leading:this.leading,letterSpacing:this.letterSpacing,lineHeight:this.lineHeight,padding:this.padding,stroke:this._stroke,textBaseline:this.textBaseline,whiteSpace:this.whiteSpace,wordWrap:this.wordWrap,wordWrapWidth:this.wordWrapWidth})}destroy(t=!1){var s,n,r,a;if(this.removeAllListeners(),typeof t=="boolean"?t:t==null?void 0:t.texture){const o=typeof t=="boolean"?t:t==null?void 0:t.textureSource;(s=this._fill)!=null&&s.texture&&this._fill.texture.destroy(o),(n=this._originalFill)!=null&&n.texture&&this._originalFill.texture.destroy(o),(r=this._stroke)!=null&&r.texture&&this._stroke.texture.destroy(o),(a=this._originalStroke)!=null&&a.texture&&this._originalStroke.texture.destroy(o)}this._fill=null,this._stroke=null,this.dropShadow=null,this._originalStroke=null,this._originalFill=null}_createProxy(t,e){return new Proxy(t,{set:(s,n,r)=>(s[n]=r,e==null||e(n,r),this.update(),!0)})}_isFillStyle(t){return(t??null)!==null&&!(Z.isColorLike(t)||t instanceof Ye||t instanceof Mi)}};Us.defaultDropShadow={alpha:1,angle:Math.PI/6,blur:0,color:"black",distance:5};Us.defaultTextStyle={align:"left",breakWords:!1,dropShadow:null,fill:"black",fontFamily:"Arial",fontSize:26,fontStyle:"normal",fontVariant:"normal",fontWeight:"normal",leading:0,letterSpacing:0,lineHeight:0,padding:0,stroke:null,textBaseline:"alphabetic",trim:!1,whiteSpace:"pre",wordWrap:!1,wordWrapWidth:100};let N=Us;function pc(i){const t=i;if(typeof t.dropShadow=="boolean"&&t.dropShadow){const e=N.defaultDropShadow;i.dropShadow={alpha:t.dropShadowAlpha??e.alpha,angle:t.dropShadowAngle??e.angle,blur:t.dropShadowBlur??e.blur,color:t.dropShadowColor??e.color,distance:t.dropShadowDistance??e.distance}}if(t.strokeThickness!==void 0){U(W,"strokeThickness is now a part of stroke");const e=t.stroke;let s={};if(Z.isColorLike(e))s.color=e;else if(e instanceof Ye||e instanceof Mi)s.fill=e;else if(Object.hasOwnProperty.call(e,"color")||Object.hasOwnProperty.call(e,"fill"))s=e;else throw new Error("Invalid stroke value.");i.stroke={...s,width:t.strokeThickness}}if(Array.isArray(t.fillGradientStops)){U(W,"gradient fill is now a fill pattern: `new FillGradient(...)`");let e;i.fontSize==null?i.fontSize=N.defaultTextStyle.fontSize:typeof i.fontSize=="string"?e=parseInt(i.fontSize,10):e=i.fontSize;const s=new Ye(0,0,0,e*1.7),n=t.fillGradientStops.map(r=>Z.shared.setValue(r).toNumber());n.forEach((r,a)=>{const o=a/(n.length-1);s.addColorStop(o,r)}),i.fill={fill:s}}}class gc{constructor(t){this._canvasPool=Object.create(null),this.canvasOptions=t||{},this.enableFullScreen=!1}_createCanvasAndContext(t,e){const s=Q.get().createCanvas();s.width=t,s.height=e;const n=s.getContext("2d");return{canvas:s,context:n}}getOptimalCanvasAndContext(t,e,s=1){t=Math.ceil(t*s-1e-6),e=Math.ceil(e*s-1e-6),t=tn(t),e=tn(e);const n=(t<<17)+(e<<1);this._canvasPool[n]||(this._canvasPool[n]=[]);let r=this._canvasPool[n].pop();return r||(r=this._createCanvasAndContext(t,e)),r}returnCanvasAndContext(t){const e=t.canvas,{width:s,height:n}=e,r=(s<<17)+(n<<1);this._canvasPool[r].push(t)}clear(){this._canvasPool={}}}const Yn=new gc,mc=["serif","sans-serif","monospace","cursive","fantasy","system-ui"];function Cs(i){const t=typeof i.fontSize=="number"?`${i.fontSize}px`:i.fontSize;let e=i.fontFamily;Array.isArray(i.fontFamily)||(e=i.fontFamily.split(","));for(let s=e.length-1;s>=0;s--){let n=e[s].trim();!/([\"\'])[^\'\"]+\1/.test(n)&&!mc.includes(n)&&(n=`"${n}"`),e[s]=n}return`${i.fontStyle} ${i.fontVariant} ${i.fontWeight} ${t} ${e.join(",")}`}const is={willReadFrequently:!0},At=class M{static get experimentalLetterSpacingSupported(){let t=M._experimentalLetterSpacingSupported;if(t!==void 0){const e=Q.get().getCanvasRenderingContext2D().prototype;t=M._experimentalLetterSpacingSupported="letterSpacing"in e||"textLetterSpacing"in e}return t}constructor(t,e,s,n,r,a,o,h,l){this.text=t,this.style=e,this.width=s,this.height=n,this.lines=r,this.lineWidths=a,this.lineHeight=o,this.maxLineWidth=h,this.fontProperties=l}static measureText(t=" ",e,s=M._canvas,n=e.wordWrap){var _;const r=`${t}:${e.styleKey}`;if(M._measurementCache[r])return M._measurementCache[r];const a=Cs(e),o=M.measureFont(a);o.fontSize===0&&(o.fontSize=e.fontSize,o.ascent=e.fontSize);const h=M.__context;h.font=a;const c=(n?M._wordWrap(t,e,s):t).split(/(?:\r\n|\r|\n)/),d=new Array(c.length);let f=0;for(let b=0;b0&&(n?r-=e:r+=(M.graphemeSegmenter(t).length-1)*e),r}static _wordWrap(t,e,s=M._canvas){const n=s.getContext("2d",is);let r=0,a="",o="";const h=Object.create(null),{letterSpacing:l,whiteSpace:c}=e,d=M._collapseSpaces(c),f=M._collapseNewlines(c);let g=!d;const m=e.wordWrapWidth+l,y=M._tokenize(t);for(let x=0;xm)if(a!==""&&(o+=M._addLine(a),a="",r=0),M.canBreakWords(w,e.breakWords)){const b=M.wordWrapSplit(w);for(let S=0;Sm&&(o+=M._addLine(a),g=!1,a="",r=0),a+=A,r+=G}}else{a.length>0&&(o+=M._addLine(a),a="",r=0);const b=x===y.length-1;o+=M._addLine(w,!b),g=!1,a="",r=0}else _+r>m&&(g=!1,o+=M._addLine(a),a="",r=0),(a.length>0||!M.isBreakingSpace(w)||g)&&(a+=w,r+=_)}return o+=M._addLine(a,!1),o}static _addLine(t,e=!0){return t=M._trimRight(t),t=e?`${t} +`:t,t}static _getFromCache(t,e,s,n){let r=s[t];return typeof r!="number"&&(r=M._measureText(t,e,n)+e,s[t]=r),r}static _collapseSpaces(t){return t==="normal"||t==="pre-line"}static _collapseNewlines(t){return t==="normal"}static _trimRight(t){if(typeof t!="string")return"";for(let e=t.length-1;e>=0;e--){const s=t[e];if(!M.isBreakingSpace(s))break;t=t.slice(0,-1)}return t}static _isNewline(t){return typeof t!="string"?!1:M._newlines.includes(t.charCodeAt(0))}static isBreakingSpace(t,e){return typeof t!="string"?!1:M._breakingSpaces.includes(t.charCodeAt(0))}static _tokenize(t){const e=[];let s="";if(typeof t!="string")return e;for(let n=0;n{if(typeof(Intl==null?void 0:Intl.Segmenter)=="function"){const i=new Intl.Segmenter;return t=>[...i.segment(t)].map(e=>e.segment)}return i=>[...i]})();At.experimentalLetterSpacing=!1;At._fonts={};At._newlines=[10,13];At._breakingSpaces=[9,32,8192,8193,8194,8195,8196,8197,8198,8200,8201,8202,8287,12288];At._measurementCache={};let Ts=At;function Xn(i,t){if(i.texture===z.WHITE&&!i.fill)return Z.shared.setValue(i.color).setAlpha(i.alpha??1).toHexa();if(i.fill){if(i.fill instanceof Mi){const e=i.fill,s=t.createPattern(e.texture.source.resource,"repeat"),n=e.transform.copyTo(H.shared);return n.scale(e.texture.frame.width,e.texture.frame.height),s.setTransform(n),s}else if(i.fill instanceof Ye){const e=i.fill;if(e.type==="linear"){const s=t.createLinearGradient(e.x0,e.y0,e.x1,e.y1);return e.gradientStops.forEach(n=>{s.addColorStop(n.offset,Z.shared.setValue(n.color).toHex())}),s}}}else{const e=t.createPattern(i.texture.source.resource,"repeat"),s=i.matrix.copyTo(H.shared);return s.scale(i.texture.frame.width,i.texture.frame.height),e.setTransform(s),e}return st("FillStyle not recognised",i),"red"}function ma(i){if(i==="")return[];typeof i=="string"&&(i=[i]);const t=[];for(let e=0,s=i.length;e!this._currentChars.includes(w)).filter((w,_,b)=>b.indexOf(w)===_);if(!e.length)return;this._currentChars=[...this._currentChars,...e];let s;this._currentPageIndex===-1?s=this._nextPage():s=this.pages[this._currentPageIndex];let{canvas:n,context:r}=s.canvasAndContext,a=s.texture.source;const o=this._style;let h=this._currentX,l=this._currentY;const c=this.baseRenderedFontSize/this.baseMeasurementFontSize,d=this._padding*c,f=o.fontStyle==="italic"?2:1;let g=0,m=!1;for(let w=0;wthis._textureSize&&(l+=g,g=P,h=0,l+g>this._textureSize)){a.update();const v=this._nextPage();n=v.canvasAndContext.canvas,r=v.canvasAndContext.context,a=v.texture.source,l=0}const G=S/c-(((y=o.dropShadow)==null?void 0:y.distance)??0)-(((x=o._stroke)==null?void 0:x.width)??0);if(this.chars[_]={id:_.codePointAt(0),xOffset:-this._padding,yOffset:-this._padding,xAdvance:G,kerning:{}},m){this._drawGlyph(r,b,h+d,l+d,c,o);const v=a.width*c,T=a.height*c,K=new E(h/v*a.width,l/T*a.height,F/v*a.width,P/T*a.height);this.chars[_].texture=new z({source:a,frame:K}),h+=Math.ceil(F)}}a.update(),this._currentX=h,this._currentY=l,this._skipKerning&&this._applyKerning(e,r)}get pageTextures(){return U(W,"BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead."),this.pages}_applyKerning(t,e){const s=this._measureCache;for(let n=0;n{const y=r.width;for(let x=0;x{let m=r.chars.length-1;if(s){let y=r.chars[m];for(;y===" ";)r.width-=e.chars[y].xAdvance,y=r.chars[--m]}n.width=Math.max(n.width,r.width),r={width:0,charPositions:[],chars:[],spaceWidth:0,spacesIndex:[]},o=!0,n.lines.push(r),n.height+=e.lineHeight},d=e.baseMeasurementFontSize/t.fontSize,f=t.letterSpacing*d,g=t.wordWrapWidth*d;for(let m=0;mg?(c(),l(h),x||r.charPositions.push(0)):(h.start=r.width,l(h),x||r.charPositions.push(0)),y==="\r"||y===` +`)r.width!==0&&c();else if(!x){const A=w.xAdvance+(w.kerning[a]||0)+f;r.width+=A,r.spaceWidth=A,r.spacesIndex.push(r.charPositions.length),r.chars.push(y)}}else{const S=w.kerning[a]||0,A=w.xAdvance+S+f;h.positions[h.index++]=h.width+S,h.chars.push(y),h.width+=A}a=y}return c(),t.align==="center"?yc(n):t.align==="right"?wc(n):t.align==="justify"&&_c(n),n}function yc(i){for(let t=0;t50&&st("BitmapText",`You have dynamically created ${ui} bitmap fonts, this can be inefficient. Try pre installing your font styles using \`BitmapFont.install({name:"style1", style})\``),o.once("destroy",()=>{ui--,j.remove(s)}),j.set(s,o)}const r=j.get(s);return(a=r.ensureCharacters)==null||a.call(r,t),r}getLayout(t,e,s=!0){const n=this.getFont(t,e);return xc([...t],e,n,s)}measureText(t,e,s=!0){return this.getLayout(t,e,s)}install(...t){var l,c,d,f;let e=t[0];typeof e=="string"&&(e={name:e,style:t[1],chars:(l=t[2])==null?void 0:l.chars,resolution:(c=t[2])==null?void 0:c.resolution,padding:(d=t[2])==null?void 0:d.padding,skipKerning:(f=t[2])==null?void 0:f.skipKerning},U(W,"BitmapFontManager.install(name, style, options) is deprecated, use BitmapFontManager.install({name, style, ...options})"));const s=e==null?void 0:e.name;if(!s)throw new Error("[BitmapFontManager] Property `name` is required.");e={...this.defaultOptions,...e};const n=e.style,r=n instanceof N?n:new N(n),a=r._fill.fill!==null&&r._fill.fill!==void 0,o=new jn({style:r,overrideFill:a,skipKerning:e.skipKerning,padding:e.padding,resolution:e.resolution,overrideSize:!1}),h=ma(e.chars);return o.ensureCharacters(h.join("")),j.set(`${s}-bitmap`,o),o.once("destroy",()=>j.remove(`${s}-bitmap`)),o}uninstall(t){const e=`${t}-bitmap`,s=j.get(e);s&&(j.remove(e),s.destroy())}}const qn=new bc;class wa extends Kr{constructor(t,e){super();const{textures:s,data:n}=t;Object.keys(n.pages).forEach(r=>{const a=n.pages[parseInt(r,10)],o=s[a.id];this.pages.push({texture:o})}),Object.keys(n.chars).forEach(r=>{const a=n.chars[r],{frame:o,source:h}=s[a.page],l=new E(a.x+o.x,a.y+o.y,a.width,a.height),c=new z({source:h,frame:l});this.chars[r]={id:r.codePointAt(0),xOffset:a.xOffset,yOffset:a.yOffset,xAdvance:a.xAdvance,kerning:a.kerning??{},texture:c}}),this.baseRenderedFontSize=n.fontSize,this.baseMeasurementFontSize=n.fontSize,this.fontMetrics={ascent:0,descent:0,fontSize:n.fontSize},this.baseLineOffset=n.baseLineOffset,this.lineHeight=n.lineHeight,this.fontFamily=n.fontFamily,this.distanceField=n.distanceField??{type:"none",range:0},this.url=e}destroy(){super.destroy();for(let t=0;t")?Kn.test(Q.get().parseXML(i)):!1},parse(i){return Kn.parse(Q.get().parseXML(i))}},Sc=[".xml",".fnt"],vc={extension:{type:k.CacheParser,name:"cacheBitmapFont"},test:i=>i instanceof wa,getCacheableAssets(i,t){const e={};return i.forEach(s=>{e[s]=t,e[`${s}-bitmap`]=t}),e[`${t.fontFamily}-bitmap`]=t,e}},Cc={extension:{type:k.LoadParser,priority:Xt.Normal},name:"loadBitmapFont",test(i){return Sc.includes(mt.extname(i).toLowerCase())},async testParse(i){return ss.test(i)||Zn.test(i)},async parse(i,t,e){const s=ss.test(i)?ss.parse(i):Zn.parse(i),{src:n}=t,{pages:r}=s,a=[],o=s.distanceField?{scaleMode:"linear",alphaMode:"premultiply-alpha-on-upload",autoGenerateMipmaps:!1,resolution:1}:{};for(let d=0;dh[d.src]);return new wa({data:s,textures:l},n)},async load(i,t){return await(await Q.get().fetch(i)).text()},async unload(i,t,e){await Promise.all(i.pages.map(s=>e.unload(s.texture.source._sourceOrigin))),i.destroy()}};class Tc{constructor(t,e=!1){this._loader=t,this._assetList=[],this._isLoading=!1,this._maxConcurrent=1,this.verbose=e}add(t){t.forEach(e=>{this._assetList.push(e)}),this.verbose&&console.log("[BackgroundLoader] assets: ",this._assetList),this._isActive&&!this._isLoading&&this._next()}async _next(){if(this._assetList.length&&this._isActive){this._isLoading=!0;const t=[],e=Math.min(this._assetList.length,this._maxConcurrent);for(let s=0;sArray.isArray(i)&&i.every(t=>t instanceof z),getCacheableAssets:(i,t)=>{const e={};return i.forEach(s=>{t.forEach((n,r)=>{e[s+(r===0?"":r+1)]=n})}),e}};async function _a(i){if("Image"in globalThis)return new Promise(t=>{const e=new Image;e.onload=()=>{t(!0)},e.onerror=()=>{t(!1)},e.src=i});if("createImageBitmap"in globalThis&&"fetch"in globalThis){try{const t=await(await fetch(i)).blob();await createImageBitmap(t)}catch{return!1}return!0}return!1}const Mc={extension:{type:k.DetectionParser,priority:1},test:async()=>_a("data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A="),add:async i=>[...i,"avif"],remove:async i=>i.filter(t=>t!=="avif")},Qn=["png","jpg","jpeg"],Pc={extension:{type:k.DetectionParser,priority:-1},test:()=>Promise.resolve(!0),add:async i=>[...i,...Qn],remove:async i=>i.filter(t=>!Qn.includes(t))},kc="WorkerGlobalScope"in globalThis&&globalThis instanceof globalThis.WorkerGlobalScope;function Os(i){return kc?!1:document.createElement("video").canPlayType(i)!==""}const Gc={extension:{type:k.DetectionParser,priority:0},test:async()=>Os("video/mp4"),add:async i=>[...i,"mp4","m4v"],remove:async i=>i.filter(t=>t!=="mp4"&&t!=="m4v")},Bc={extension:{type:k.DetectionParser,priority:0},test:async()=>Os("video/ogg"),add:async i=>[...i,"ogv"],remove:async i=>i.filter(t=>t!=="ogv")},Ic={extension:{type:k.DetectionParser,priority:0},test:async()=>Os("video/webm"),add:async i=>[...i,"webm"],remove:async i=>i.filter(t=>t!=="webm")},Ec={extension:{type:k.DetectionParser,priority:0},test:async()=>_a("data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA="),add:async i=>[...i,"webp"],remove:async i=>i.filter(t=>t!=="webp")};class Rc{constructor(){this._parsers=[],this._parsersValidated=!1,this.parsers=new Proxy(this._parsers,{set:(t,e,s)=>(this._parsersValidated=!1,t[e]=s,!0)}),this.promiseCache={}}reset(){this._parsersValidated=!1,this.promiseCache={}}_getLoadPromiseAndParser(t,e){const s={promise:null,parser:null};return s.promise=(async()=>{var a,o;let n=null,r=null;if(e.loadParser&&(r=this._parserHash[e.loadParser],r||st(`[Assets] specified load parser "${e.loadParser}" not found while loading ${t}`)),!r){for(let h=0;h({alias:[l],src:l,data:{}})),o=a.length,h=a.map(async l=>{const c=mt.toAbsolute(l.src);if(!n[l.src])try{this.promiseCache[c]||(this.promiseCache[c]=this._getLoadPromiseAndParser(c,l)),n[l.src]=await this.promiseCache[c].promise,e&&e(++s/o)}catch(d){throw delete this.promiseCache[c],delete n[l.src],new Error(`[Loader.load] Failed to load ${c}. +${d}`)}});return await Promise.all(h),r?n[a[0].src]:n}async unload(t){const s=Ct(t,n=>({alias:[n],src:n})).map(async n=>{var o,h;const r=mt.toAbsolute(n.src),a=this.promiseCache[r];if(a){const l=await a.promise;delete this.promiseCache[r],await((h=(o=a.parser)==null?void 0:o.unload)==null?void 0:h.call(o,l,n,this))}});await Promise.all(s)}_validateParsers(){this._parsersValidated=!0,this._parserHash=this._parsers.filter(t=>t.name).reduce((t,e)=>(e.name?t[e.name]&&st(`[Assets] loadParser name conflict "${e.name}"`):st("[Assets] loadParser should have a name"),{...t,[e.name]:e}),{})}}function Te(i,t){if(Array.isArray(t)){for(const e of t)if(i.startsWith(`data:${e}`))return!0;return!1}return i.startsWith(`data:${t}`)}function Ae(i,t){const e=i.split("?")[0],s=mt.extname(e).toLowerCase();return Array.isArray(t)?t.includes(s):s===t}const Fc=".json",Lc="application/json",Dc={extension:{type:k.LoadParser,priority:Xt.Low},name:"loadJson",test(i){return Te(i,Lc)||Ae(i,Fc)},async load(i){return await(await Q.get().fetch(i)).json()}},zc=".txt",Uc="text/plain",Oc={name:"loadTxt",extension:{type:k.LoadParser,priority:Xt.Low,name:"loadTxt"},test(i){return Te(i,Uc)||Ae(i,zc)},async load(i){return await(await Q.get().fetch(i)).text()}},Wc=["normal","bold","100","200","300","400","500","600","700","800","900"],Nc=[".ttf",".otf",".woff",".woff2"],Hc=["font/ttf","font/otf","font/woff","font/woff2"],$c=/^(--|-?[A-Z_])[0-9A-Z_-]*$/i;function Vc(i){const t=mt.extname(i),n=mt.basename(i,t).replace(/(-|_)/g," ").toLowerCase().split(" ").map(o=>o.charAt(0).toUpperCase()+o.slice(1));let r=n.length>0;for(const o of n)if(!o.match($c)){r=!1;break}let a=n.join(" ");return r||(a=`"${a.replace(/[\\"]/g,"\\$&")}"`),a}const Yc=/^[0-9A-Za-z%:/?#\[\]@!\$&'()\*\+,;=\-._~]*$/;function Xc(i){return Yc.test(i)?i:encodeURI(i)}const jc={extension:{type:k.LoadParser,priority:Xt.Low},name:"loadWebFont",test(i){return Te(i,Hc)||Ae(i,Nc)},async load(i,t){var s,n,r;const e=Q.get().getFontFaceSet();if(e){const a=[],o=((s=t.data)==null?void 0:s.family)??Vc(i),h=((r=(n=t.data)==null?void 0:n.weights)==null?void 0:r.filter(c=>Wc.includes(c)))??["normal"],l=t.data??{};for(let c=0;c{j.remove(t.family),Q.get().getFontFaceSet().delete(t)})}};function Ws(i,t=1){var s;const e=(s=Ce.RETINA_PREFIX)==null?void 0:s.exec(i);return e?parseFloat(e[1]):t}function Ns(i,t,e){i.label=e,i._sourceOrigin=e;const s=new z({source:i,label:e}),n=()=>{delete t.promiseCache[e],j.has(e)&&j.remove(e)};return s.source.once("destroy",()=>{t.promiseCache[e]&&(st("[Assets] A TextureSource managed by Assets was destroyed instead of unloaded! Use Assets.unload() instead of destroying the TextureSource."),n())}),s.once("destroy",()=>{i.destroyed||(st("[Assets] A Texture managed by Assets was destroyed instead of unloaded! Use Assets.unload() instead of destroying the Texture."),n())}),s}const qc=".svg",Kc="image/svg+xml",Zc={extension:{type:k.LoadParser,priority:Xt.Low,name:"loadSVG"},name:"loadSVG",config:{crossOrigin:"anonymous",parseAsGraphicsContext:!1},test(i){return Te(i,Kc)||Ae(i,qc)},async load(i,t,e){return t.data.parseAsGraphicsContext??this.config.parseAsGraphicsContext?Jc(i):Qc(i,t,e,this.config.crossOrigin)},unload(i){i.destroy(!0)}};async function Qc(i,t,e,s){var x,w,_;const r=await(await Q.get().fetch(i)).blob(),a=URL.createObjectURL(r),o=new Image;o.src=a,o.crossOrigin=s,await o.decode(),URL.revokeObjectURL(a);const h=document.createElement("canvas"),l=h.getContext("2d"),c=((x=t.data)==null?void 0:x.resolution)||Ws(i),d=((w=t.data)==null?void 0:w.width)??o.width,f=((_=t.data)==null?void 0:_.height)??o.height;h.width=d*c,h.height=f*c,l.drawImage(o,0,0,d*c,f*c);const{parseAsGraphicsContext:g,...m}=t.data,y=new ve({resource:h,alphaMode:"premultiply-alpha-on-upload",resolution:c,...m});return Ns(y,e,i)}async function Jc(i){const e=await(await Q.get().fetch(i)).text(),s=new xt;return s.svg(e),s}const td=`(function () { + 'use strict'; + + const WHITE_PNG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="; + async function checkImageBitmap() { + try { + if (typeof createImageBitmap !== "function") + return false; + const response = await fetch(WHITE_PNG); + const imageBlob = await response.blob(); + const imageBitmap = await createImageBitmap(imageBlob); + return imageBitmap.width === 1 && imageBitmap.height === 1; + } catch (e) { + return false; + } + } + void checkImageBitmap().then((result) => { + self.postMessage(result); + }); + +})(); +`;let fe=null,As=class{constructor(){fe||(fe=URL.createObjectURL(new Blob([td],{type:"application/javascript"}))),this.worker=new Worker(fe)}};As.revokeObjectURL=function(){fe&&(URL.revokeObjectURL(fe),fe=null)};const ed=`(function () { + 'use strict'; + + async function loadImageBitmap(url, alphaMode) { + const response = await fetch(url); + if (!response.ok) { + throw new Error(\`[WorkerManager.loadImageBitmap] Failed to fetch \${url}: \${response.status} \${response.statusText}\`); + } + const imageBlob = await response.blob(); + return alphaMode === "premultiplied-alpha" ? createImageBitmap(imageBlob, { premultiplyAlpha: "none" }) : createImageBitmap(imageBlob); + } + self.onmessage = async (event) => { + try { + const imageBitmap = await loadImageBitmap(event.data.data[0], event.data.data[1]); + self.postMessage({ + data: imageBitmap, + uuid: event.data.uuid, + id: event.data.id + }, [imageBitmap]); + } catch (e) { + self.postMessage({ + error: e, + uuid: event.data.uuid, + id: event.data.id + }); + } + }; + +})(); +`;let pe=null;class ba{constructor(){pe||(pe=URL.createObjectURL(new Blob([ed],{type:"application/javascript"}))),this.worker=new Worker(pe)}}ba.revokeObjectURL=function(){pe&&(URL.revokeObjectURL(pe),pe=null)};let Jn=0,ns;class id{constructor(){this._initialized=!1,this._createdWorkers=0,this._workerPool=[],this._queue=[],this._resolveHash={}}isImageBitmapSupported(){return this._isImageBitmapSupported!==void 0?this._isImageBitmapSupported:(this._isImageBitmapSupported=new Promise(t=>{const{worker:e}=new As;e.addEventListener("message",s=>{e.terminate(),As.revokeObjectURL(),t(s.data)})}),this._isImageBitmapSupported)}loadImageBitmap(t,e){var s;return this._run("loadImageBitmap",[t,(s=e==null?void 0:e.data)==null?void 0:s.alphaMode])}async _initWorkers(){this._initialized||(this._initialized=!0)}_getWorker(){ns===void 0&&(ns=navigator.hardwareConcurrency||4);let t=this._workerPool.pop();return!t&&this._createdWorkers{this._complete(e.data),this._returnWorker(e.target),this._next()})),t}_returnWorker(t){this._workerPool.push(t)}_complete(t){t.error!==void 0?this._resolveHash[t.uuid].reject(t.error):this._resolveHash[t.uuid].resolve(t.data),this._resolveHash[t.uuid]=null}async _run(t,e){await this._initWorkers();const s=new Promise((n,r)=>{this._queue.push({id:t,arguments:e,resolve:n,reject:r})});return this._next(),s}_next(){if(!this._queue.length)return;const t=this._getWorker();if(!t)return;const e=this._queue.pop(),s=e.id;this._resolveHash[Jn]={resolve:e.resolve,reject:e.reject},t.postMessage({data:e.arguments,uuid:Jn++,id:s})}}const tr=new id,sd=[".jpeg",".jpg",".png",".webp",".avif"],nd=["image/jpeg","image/png","image/webp","image/avif"];async function rd(i,t){var n;const e=await Q.get().fetch(i);if(!e.ok)throw new Error(`[loadImageBitmap] Failed to fetch ${i}: ${e.status} ${e.statusText}`);const s=await e.blob();return((n=t==null?void 0:t.data)==null?void 0:n.alphaMode)==="premultiplied-alpha"?createImageBitmap(s,{premultiplyAlpha:"none"}):createImageBitmap(s)}const Sa={name:"loadTextures",extension:{type:k.LoadParser,priority:Xt.High,name:"loadTextures"},config:{preferWorkers:!0,preferCreateImageBitmap:!0,crossOrigin:"anonymous"},test(i){return Te(i,nd)||Ae(i,sd)},async load(i,t,e){var r;let s=null;globalThis.createImageBitmap&&this.config.preferCreateImageBitmap?this.config.preferWorkers&&await tr.isImageBitmapSupported()?s=await tr.loadImageBitmap(i,t):s=await rd(i,t):s=await new Promise(a=>{s=new Image,s.crossOrigin=this.config.crossOrigin,s.src=i,s.complete?a(s):s.onload=()=>{a(s)}});const n=new ve({resource:s,alphaMode:"premultiply-alpha-on-upload",resolution:((r=t.data)==null?void 0:r.resolution)||Ws(i),...t.data});return Ns(n,e,i)},unload(i){i.destroy(!0)}},va=[".mp4",".m4v",".webm",".ogg",".ogv",".h264",".avi",".mov"],ad=va.map(i=>`video/${i.substring(1)}`);function od(i,t,e){e===void 0&&!t.startsWith("data:")?i.crossOrigin=ld(t):e!==!1&&(i.crossOrigin=typeof e=="string"?e:"anonymous")}function hd(i){return new Promise((t,e)=>{i.addEventListener("canplaythrough",s),i.addEventListener("error",n),i.load();function s(){r(),t()}function n(a){r(),e(a)}function r(){i.removeEventListener("canplaythrough",s),i.removeEventListener("error",n)}})}function ld(i,t=globalThis.location){if(i.startsWith("data:"))return"";t=t||globalThis.location;const e=new URL(i,document.baseURI);return e.hostname!==t.hostname||e.port!==t.port||e.protocol!==t.protocol?"anonymous":""}const cd={name:"loadVideo",extension:{type:k.LoadParser,name:"loadVideo"},test(i){const t=Te(i,ad),e=Ae(i,va);return t||e},async load(i,t,e){var h,l;const s={...fi.defaultOptions,resolution:((h=t.data)==null?void 0:h.resolution)||Ws(i),alphaMode:((l=t.data)==null?void 0:l.alphaMode)||await Ar(),...t.data},n=document.createElement("video"),r={preload:s.autoLoad!==!1?"auto":void 0,"webkit-playsinline":s.playsinline!==!1?"":void 0,playsinline:s.playsinline!==!1?"":void 0,muted:s.muted===!0?"":void 0,loop:s.loop===!0?"":void 0,autoplay:s.autoPlay!==!1?"":void 0};Object.keys(r).forEach(c=>{const d=r[c];d!==void 0&&n.setAttribute(c,d)}),s.muted===!0&&(n.muted=!0),od(n,i,s.crossorigin);const a=document.createElement("source");let o;if(i.startsWith("data:"))o=i.slice(5,i.indexOf(";"));else if(!i.startsWith("blob:")){const c=i.split("?")[0].slice(i.lastIndexOf(".")+1).toLowerCase();o=fi.MIME_TYPES[c]||`video/${c}`}return a.src=i,o&&(a.type=o),new Promise(c=>{const d=async()=>{const f=new fi({...s,resource:n});n.removeEventListener("canplay",d),t.data.preload&&await hd(n),c(Ns(f,e,i))};n.addEventListener("canplay",d),n.appendChild(a)})},unload(i){i.destroy(!0)}},Ca={extension:{type:k.ResolveParser,name:"resolveTexture"},test:Sa.test,parse:i=>{var t;return{resolution:parseFloat(((t=Ce.RETINA_PREFIX.exec(i))==null?void 0:t[1])??"1"),format:i.split(".").pop(),src:i}}},dd={extension:{type:k.ResolveParser,priority:-2,name:"resolveJson"},test:i=>Ce.RETINA_PREFIX.test(i)&&i.endsWith(".json"),parse:Ca.parse};class ud{constructor(){this._detections=[],this._initialized=!1,this.resolver=new Ce,this.loader=new Rc,this.cache=j,this._backgroundLoader=new Tc(this.loader),this._backgroundLoader.active=!0,this.reset()}async init(t={}){var r,a;if(this._initialized){st("[Assets]AssetManager already initialized, did you load before calling this Assets.init()?");return}if(this._initialized=!0,t.defaultSearchParams&&this.resolver.setDefaultSearchParams(t.defaultSearchParams),t.basePath&&(this.resolver.basePath=t.basePath),t.bundleIdentifier&&this.resolver.setBundleIdentifier(t.bundleIdentifier),t.manifest){let o=t.manifest;typeof o=="string"&&(o=await this.load(o)),this.resolver.addManifest(o)}const e=((r=t.texturePreference)==null?void 0:r.resolution)??1,s=typeof e=="number"?[e]:e,n=await this._detectFormats({preferredFormats:(a=t.texturePreference)==null?void 0:a.format,skipDetections:t.skipDetections,detections:this._detections});this.resolver.prefer({params:{format:n,resolution:s}}),t.preferences&&this.setPreferences(t.preferences)}add(t){this.resolver.add(t)}async load(t,e){this._initialized||await this.init();const s=wi(t),n=Ct(t).map(o=>{if(typeof o!="string"){const h=this.resolver.getAlias(o);return h.some(l=>!this.resolver.hasKey(l))&&this.add(o),Array.isArray(h)?h[0]:h}return this.resolver.hasKey(o)||this.add({alias:o,src:o}),o}),r=this.resolver.resolve(n),a=await this._mapLoadToResolve(r,e);return s?a[n[0]]:a}addBundle(t,e){this.resolver.addBundle(t,e)}async loadBundle(t,e){this._initialized||await this.init();let s=!1;typeof t=="string"&&(s=!0,t=[t]);const n=this.resolver.resolveBundle(t),r={},a=Object.keys(n);let o=0,h=0;const l=()=>{e==null||e(++o/h)},c=a.map(d=>{const f=n[d];return h+=Object.keys(f).length,this._mapLoadToResolve(f,l).then(g=>{r[d]=g})});return await Promise.all(c),s?r[t[0]]:r}async backgroundLoad(t){this._initialized||await this.init(),typeof t=="string"&&(t=[t]);const e=this.resolver.resolve(t);this._backgroundLoader.add(Object.values(e))}async backgroundLoadBundle(t){this._initialized||await this.init(),typeof t=="string"&&(t=[t]);const e=this.resolver.resolveBundle(t);Object.values(e).forEach(s=>{this._backgroundLoader.add(Object.values(s))})}reset(){this.resolver.reset(),this.loader.reset(),this.cache.reset(),this._initialized=!1}get(t){if(typeof t=="string")return j.get(t);const e={};for(let s=0;s{const o=n[a.src],h=[a.src];a.alias&&h.push(...a.alias),h.forEach(l=>{r[l]=o}),j.set(h,o)}),r}async unload(t){this._initialized||await this.init();const e=Ct(t).map(n=>typeof n!="string"?n.src:n),s=this.resolver.resolve(e);await this._unloadFromResolved(s)}async unloadBundle(t){this._initialized||await this.init(),t=Ct(t);const e=this.resolver.resolveBundle(t),s=Object.keys(e).map(n=>this._unloadFromResolved(e[n]));await Promise.all(s)}async _unloadFromResolved(t){const e=Object.values(t);e.forEach(s=>{j.remove(s.src)}),await this.loader.unload(e)}async _detectFormats(t){let e=[];t.preferredFormats&&(e=Array.isArray(t.preferredFormats)?t.preferredFormats:[t.preferredFormats]);for(const s of t.detections)t.skipDetections||await s.test()?e=await s.add(e):t.skipDetections||(e=await s.remove(e));return e=e.filter((s,n)=>e.indexOf(s)===n),e}get detections(){return this._detections}setPreferences(t){this.loader.parsers.forEach(e=>{e.config&&Object.keys(e.config).filter(s=>s in t).forEach(s=>{e.config[s]=t[s]})})}}const Ue=new ud;lt.handleByList(k.LoadParser,Ue.loader.parsers).handleByList(k.ResolveParser,Ue.resolver.parsers).handleByList(k.CacheParser,Ue.cache.parsers).handleByList(k.DetectionParser,Ue.detections);lt.add(Ac,Pc,Mc,Ec,Gc,Bc,Ic,Dc,Oc,jc,Zc,Sa,cd,Cc,vc,Ca,dd);const er={loader:k.LoadParser,resolver:k.ResolveParser,cache:k.CacheParser,detection:k.DetectionParser};lt.handle(k.Asset,i=>{const t=i.ref;Object.entries(er).filter(([e])=>!!t[e]).forEach(([e,s])=>lt.add(Object.assign(t[e],{extension:t[e].extension??s})))},i=>{const t=i.ref;Object.keys(er).filter(e=>!!t[e]).forEach(e=>lt.remove(t[e]))});class Tt extends Si{constructor(t){t instanceof xt&&(t={context:t});const{context:e,roundPixels:s,...n}=t||{};super({label:"Graphics",...n}),this.renderPipeId="graphics",e?this._context=e:this._context=this._ownedContext=new xt,this._context.on("update",this.onViewUpdate,this),this.allowChildren=!1,this.roundPixels=s??!1}set context(t){t!==this._context&&(this._context.off("update",this.onViewUpdate,this),this._context=t,this._context.on("update",this.onViewUpdate,this),this.onViewUpdate())}get context(){return this._context}get bounds(){return this._context.bounds}addBounds(t){t.addBounds(this._context.bounds)}containsPoint(t){return this._context.containsPoint(t)}onViewUpdate(){if(this._didViewChangeTick++,this._didGraphicsUpdate=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}destroy(t){this._ownedContext&&!t?this._ownedContext.destroy(t):(t===!0||(t==null?void 0:t.context)===!0)&&this._context.destroy(t),this._ownedContext=null,this._context=null,super.destroy(t)}_callContextMethod(t,e){return this.context[t](...e),this}setFillStyle(...t){return this._callContextMethod("setFillStyle",t)}setStrokeStyle(...t){return this._callContextMethod("setStrokeStyle",t)}fill(...t){return this._callContextMethod("fill",t)}stroke(...t){return this._callContextMethod("stroke",t)}texture(...t){return this._callContextMethod("texture",t)}beginPath(){return this._callContextMethod("beginPath",[])}cut(){return this._callContextMethod("cut",[])}arc(...t){return this._callContextMethod("arc",t)}arcTo(...t){return this._callContextMethod("arcTo",t)}arcToSvg(...t){return this._callContextMethod("arcToSvg",t)}bezierCurveTo(...t){return this._callContextMethod("bezierCurveTo",t)}closePath(){return this._callContextMethod("closePath",[])}ellipse(...t){return this._callContextMethod("ellipse",t)}circle(...t){return this._callContextMethod("circle",t)}path(...t){return this._callContextMethod("path",t)}lineTo(...t){return this._callContextMethod("lineTo",t)}moveTo(...t){return this._callContextMethod("moveTo",t)}quadraticCurveTo(...t){return this._callContextMethod("quadraticCurveTo",t)}rect(...t){return this._callContextMethod("rect",t)}roundRect(...t){return this._callContextMethod("roundRect",t)}poly(...t){return this._callContextMethod("poly",t)}regularPoly(...t){return this._callContextMethod("regularPoly",t)}roundPoly(...t){return this._callContextMethod("roundPoly",t)}roundShape(...t){return this._callContextMethod("roundShape",t)}filletRect(...t){return this._callContextMethod("filletRect",t)}chamferRect(...t){return this._callContextMethod("chamferRect",t)}star(...t){return this._callContextMethod("star",t)}svg(...t){return this._callContextMethod("svg",t)}restore(...t){return this._callContextMethod("restore",t)}save(){return this._callContextMethod("save",[])}getTransform(){return this.context.getTransform()}resetTransform(){return this._callContextMethod("resetTransform",[])}rotateTransform(...t){return this._callContextMethod("rotate",t)}scaleTransform(...t){return this._callContextMethod("scale",t)}setTransform(...t){return this._callContextMethod("setTransform",t)}transform(...t){return this._callContextMethod("transform",t)}translateTransform(...t){return this._callContextMethod("translate",t)}clear(){return this._callContextMethod("clear",[])}get fillStyle(){return this._context.fillStyle}set fillStyle(t){this._context.fillStyle=t}get strokeStyle(){return this._context.strokeStyle}set strokeStyle(t){this._context.strokeStyle=t}clone(t=!1){return t?new Tt(this._context.clone()):(this._ownedContext=null,new Tt(this._context))}lineStyle(t,e,s){U(W,"Graphics#lineStyle is no longer needed. Use Graphics#setStrokeStyle to set the stroke style.");const n={};return t&&(n.width=t),e&&(n.color=e),s&&(n.alpha=s),this.context.strokeStyle=n,this}beginFill(t,e){U(W,"Graphics#beginFill is no longer needed. Use Graphics#fill to fill the shape with the desired style.");const s={};return t&&(s.color=t),e&&(s.alpha=e),this.context.fillStyle=s,this}endFill(){U(W,"Graphics#endFill is no longer needed. Use Graphics#fill to fill the shape with the desired style."),this.context.fill();const t=this.context.strokeStyle;return(t.width!==xt.defaultStrokeStyle.width||t.color!==xt.defaultStrokeStyle.color||t.alpha!==xt.defaultStrokeStyle.alpha)&&this.context.stroke(),this}drawCircle(...t){return U(W,"Graphics#drawCircle has been renamed to Graphics#circle"),this._callContextMethod("circle",t)}drawEllipse(...t){return U(W,"Graphics#drawEllipse has been renamed to Graphics#ellipse"),this._callContextMethod("ellipse",t)}drawPolygon(...t){return U(W,"Graphics#drawPolygon has been renamed to Graphics#poly"),this._callContextMethod("poly",t)}drawRect(...t){return U(W,"Graphics#drawRect has been renamed to Graphics#rect"),this._callContextMethod("rect",t)}drawRoundedRect(...t){return U(W,"Graphics#drawRoundedRect has been renamed to Graphics#roundRect"),this._callContextMethod("roundRect",t)}drawStar(...t){return U(W,"Graphics#drawStar has been renamed to Graphics#star"),this._callContextMethod("star",t)}}const Ta=class Aa extends sa{constructor(...t){let e=t[0]??{};e instanceof Float32Array&&(U(W,"use new MeshGeometry({ positions, uvs, indices }) instead"),e={positions:e,uvs:t[1],indices:t[2]}),e={...Aa.defaultOptions,...e};const s=e.positions||new Float32Array([0,0,1,0,1,1,0,1]),n=e.uvs||new Float32Array([0,0,1,0,1,1,0,1]),r=e.indices||new Uint32Array([0,1,2,0,2,3]),a=e.shrinkBuffersToFit,o=new Vt({data:s,label:"attribute-mesh-positions",shrinkToFit:a,usage:it.VERTEX|it.COPY_DST}),h=new Vt({data:n,label:"attribute-mesh-uvs",shrinkToFit:a,usage:it.VERTEX|it.COPY_DST}),l=new Vt({data:r,label:"index-mesh-buffer",shrinkToFit:a,usage:it.INDEX|it.COPY_DST});super({attributes:{aPosition:{buffer:o,format:"float32x2",stride:2*4,offset:0},aUV:{buffer:h,format:"float32x2",stride:2*4,offset:0}},indexBuffer:l,topology:e.topology}),this.batchMode="auto"}get positions(){return this.attributes.aPosition.buffer.data}set positions(t){this.attributes.aPosition.buffer.data=t}get uvs(){return this.attributes.aUV.buffer.data}set uvs(t){this.attributes.aUV.buffer.data=t}get indices(){return this.indexBuffer.data}set indices(t){this.indexBuffer.data=t}};Ta.defaultOptions={topology:"triangle-list",shrinkBuffersToFit:!1};let fd=Ta;class we extends ${constructor(...t){let e=t[0];Array.isArray(t[0])&&(e={textures:t[0],autoUpdate:t[1]});const{textures:s,autoUpdate:n,...r}=e,[a]=s;super({...r,texture:a instanceof z?a:a.texture}),this._textures=null,this._durations=null,this._autoUpdate=n??!0,this._isConnectedToTicker=!1,this.animationSpeed=1,this.loop=!0,this.updateAnchor=!1,this.onComplete=null,this.onFrameChange=null,this.onLoop=null,this._currentTime=0,this._playing=!1,this._previousFrame=null,this.textures=s}stop(){this._playing&&(this._playing=!1,this._autoUpdate&&this._isConnectedToTicker&&(Bt.shared.remove(this.update,this),this._isConnectedToTicker=!1))}play(){this._playing||(this._playing=!0,this._autoUpdate&&!this._isConnectedToTicker&&(Bt.shared.add(this.update,this,yi.HIGH),this._isConnectedToTicker=!0))}gotoAndStop(t){this.stop(),this.currentFrame=t}gotoAndPlay(t){this.currentFrame=t,this.play()}update(t){if(!this._playing)return;const e=t.deltaTime,s=this.animationSpeed*e,n=this.currentFrame;if(this._durations!==null){let r=this._currentTime%1*this._durations[this.currentFrame];for(r+=s/60*1e3;r<0;)this._currentTime--,r+=this._durations[this.currentFrame];const a=Math.sign(this.animationSpeed*e);for(this._currentTime=Math.floor(this._currentTime);r>=this._durations[this.currentFrame];)r-=this._durations[this.currentFrame]*a,this._currentTime+=a;this._currentTime+=r/this._durations[this.currentFrame]}else this._currentTime+=s;this._currentTime<0&&!this.loop?(this.gotoAndStop(0),this.onComplete&&this.onComplete()):this._currentTime>=this._textures.length&&!this.loop?(this.gotoAndStop(this._textures.length-1),this.onComplete&&this.onComplete()):n!==this.currentFrame&&(this.loop&&this.onLoop&&(this.animationSpeed>0&&this.currentFramen)&&this.onLoop(),this._updateTexture())}_updateTexture(){const t=this.currentFrame;this._previousFrame!==t&&(this._previousFrame=t,this.texture=this._textures[t],this.updateAnchor&&this.anchor.copyFrom(this.texture.defaultAnchor),this.onFrameChange&&this.onFrameChange(this.currentFrame))}destroy(){this.stop(),super.destroy(),this.onComplete=null,this.onFrameChange=null,this.onLoop=null}static fromFrames(t){const e=[];for(let s=0;sthis.totalFrames-1)throw new Error(`[AnimatedSprite]: Invalid frame index value ${t}, expected to be between 0 and totalFrames ${this.totalFrames}.`);const e=this.currentFrame;this._currentTime=t,e!==this.currentFrame&&this._updateTexture()}get playing(){return this._playing}get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t!==this._autoUpdate&&(this._autoUpdate=t,!this._autoUpdate&&this._isConnectedToTicker?(Bt.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._playing&&(Bt.shared.add(this.update,this),this._isConnectedToTicker=!0))}}class pd extends Si{constructor(t,e){const{text:s,resolution:n,style:r,anchor:a,width:o,height:h,roundPixels:l,...c}=t;super({...c}),this.batched=!0,this._resolution=null,this._autoResolution=!0,this._didTextUpdate=!0,this._styleClass=e,this.text=s??"",this.style=r,this.resolution=n??null,this.allowChildren=!1,this._anchor=new ft({_onUpdate:()=>{this.onViewUpdate()}}),a&&(this.anchor=a),this.roundPixels=l??!1,o!==void 0&&(this.width=o),h!==void 0&&(this.height=h)}get anchor(){return this._anchor}set anchor(t){typeof t=="number"?this._anchor.set(t):this._anchor.copyFrom(t)}set text(t){t=t.toString(),this._text!==t&&(this._text=t,this.onViewUpdate())}get text(){return this._text}set resolution(t){this._autoResolution=t===null,this._resolution=t,this.onViewUpdate()}get resolution(){return this._resolution}get style(){return this._style}set style(t){var e;t=t||{},(e=this._style)==null||e.off("update",this.onViewUpdate,this),t instanceof this._styleClass?this._style=t:this._style=new this._styleClass(t),this._style.on("update",this.onViewUpdate,this),this.onViewUpdate()}get bounds(){return this._boundsDirty&&(this._updateBounds(),this._boundsDirty=!1),this._bounds}get width(){return Math.abs(this.scale.x)*this.bounds.width}set width(t){this._setWidth(t,this.bounds.width)}get height(){return Math.abs(this.scale.y)*this.bounds.height}set height(t){this._setHeight(t,this.bounds.height)}getSize(t){return t||(t={}),t.width=Math.abs(this.scale.x)*this.bounds.width,t.height=Math.abs(this.scale.y)*this.bounds.height,t}setSize(t,e){typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,this.bounds.width),e!==void 0&&this._setHeight(e,this.bounds.height)}addBounds(t){const e=this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}containsPoint(t){const e=this.bounds.width,s=this.bounds.height,n=-e*this.anchor.x;let r=0;return t.x>=n&&t.x<=n+e&&(r=-s*this.anchor.y,t.y>=r&&t.y<=r+s)}onViewUpdate(){if(this._didViewChangeTick++,this._boundsDirty=!0,this.didViewUpdate)return;this.didViewUpdate=!0,this._didTextUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}_getKey(){return`${this.text}:${this._style.styleKey}:${this._resolution}`}destroy(t=!1){super.destroy(t),this.owner=null,this._bounds=null,this._anchor=null,(typeof t=="boolean"?t:t!=null&&t.style)&&this._style.destroy(t),this._style=null,this._text=null}}function gd(i,t){let e=i[0]??{};return(typeof e=="string"||i[1])&&(U(W,`use new ${t}({ text: "hi!", style }) instead`),e={text:e,style:i[1]}),e}class O extends pd{constructor(...t){const e=gd(t,"Text");super(e,N),this.renderPipeId="text"}_updateBounds(){const t=this._bounds,e=this._anchor,s=Ts.measureText(this._text,this._style),{width:n,height:r}=s;t.minX=-e._x*n,t.maxX=t.minX+n,t.minY=-e._y*r,t.maxY=t.minY+r}}const Ma=class Pa extends fd{constructor(...t){super({});let e=t[0]??{};typeof e=="number"&&(U(W,"PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead"),e={width:e,height:t[1],verticesX:t[2],verticesY:t[3]}),this.build(e)}build(t){t={...Pa.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;const e=this.verticesX*this.verticesY,s=[],n=[],r=[],a=this.verticesX-1,o=this.verticesY-1,h=this.width/a,l=this.height/o;for(let d=0;de?1:this.width/e,n=this._topHeight+this._bottomHeight,r=this.height>n?1:this.height/n,a=Math.min(s,r);t[9]=t[11]=t[13]=t[15]=this._topHeight*a,t[17]=t[19]=t[21]=t[23]=this.height-this._bottomHeight*a,t[25]=t[27]=t[29]=t[31]=this.height,t[2]=t[10]=t[18]=t[26]=this._leftWidth*a,t[4]=t[12]=t[20]=t[28]=this.width-this._rightWidth*a,t[6]=t[14]=t[22]=t[30]=this.width,this.getBuffer("aPosition").update()}updateUvs(){const t=this.uvs;t[0]=t[8]=t[16]=t[24]=0,t[1]=t[3]=t[5]=t[7]=0,t[6]=t[14]=t[22]=t[30]=1,t[25]=t[27]=t[29]=t[31]=1;const e=1/this._originalWidth,s=1/this._originalHeight;t[2]=t[10]=t[18]=t[26]=e*this._leftWidth,t[9]=t[11]=t[13]=t[15]=s*this._topHeight,t[4]=t[12]=t[20]=t[28]=1-e*this._rightWidth,t[17]=t[19]=t[21]=t[23]=1-s*this._bottomHeight,this.getBuffer("aUV").update()}};ka.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};let ce=ka;const Ba=class Ia extends Si{constructor(t){var d,f,g,m;t instanceof z&&(t={texture:t});const{width:e,height:s,leftWidth:n,rightWidth:r,topHeight:a,bottomHeight:o,texture:h,roundPixels:l,...c}=t;super({label:"NineSliceSprite",...c}),this.renderPipeId="nineSliceSprite",this.batched=!0,this._didSpriteUpdate=!0,this._leftWidth=n??((d=h==null?void 0:h.defaultBorders)==null?void 0:d.left)??ce.defaultOptions.leftWidth,this._topHeight=a??((f=h==null?void 0:h.defaultBorders)==null?void 0:f.top)??ce.defaultOptions.topHeight,this._rightWidth=r??((g=h==null?void 0:h.defaultBorders)==null?void 0:g.right)??ce.defaultOptions.rightWidth,this._bottomHeight=o??((m=h==null?void 0:h.defaultBorders)==null?void 0:m.bottom)??ce.defaultOptions.bottomHeight,this.bounds.maxX=this._width=e??h.width??ce.defaultOptions.width,this.bounds.maxY=this._height=s??h.height??ce.defaultOptions.height,this.allowChildren=!1,this.texture=h??Ia.defaultOptions.texture,this.roundPixels=l??!1}get bounds(){return this._bounds}get width(){return this._width}set width(t){this.bounds.maxX=this._width=t,this.onViewUpdate()}get height(){return this._height}set height(t){this.bounds.maxY=this._height=t,this.onViewUpdate()}setSize(t,e){typeof t=="object"&&(e=t.height??t.width,t=t.width),this.bounds.maxX=this._width=t,this.bounds.maxY=this._height=e??t,this.onViewUpdate()}getSize(t){return t||(t={}),t.width=this._width,t.height=this._height,t}get leftWidth(){return this._leftWidth}set leftWidth(t){this._leftWidth=t,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(t){this._topHeight=t,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(t){this._rightWidth=t,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(t){this._bottomHeight=t,this.onViewUpdate()}get texture(){return this._texture}set texture(t){t||(t=z.EMPTY);const e=this._texture;e!==t&&(e&&e.dynamic&&e.off("update",this.onViewUpdate,this),t.dynamic&&t.on("update",this.onViewUpdate,this),this._texture=t,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}onViewUpdate(){if(this._didViewChangeTick++,this._didSpriteUpdate=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}addBounds(t){const e=this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}destroy(t){if(super.destroy(t),typeof t=="boolean"?t:t==null?void 0:t.texture){const s=typeof t=="boolean"?t:t==null?void 0:t.textureSource;this._texture.destroy(s)}this._texture=null}};Ba.defaultOptions={texture:z.EMPTY};let bt=Ba;lt.add(Oa,Wa);const B=class B{static async Load(t){return this.text.text="Loading asset: "+t,await Ue.load({src:t})}static async LoadAssets(){if(this.text){console.warn("Do not call GameAssets.LoadAssets() more than once.");return}console.log("Loading Texture Assets");const t=new O({text:"Loading textures. This might take a while.",style:new N({fill:3355443,fontSize:50})});t.x=u.app.canvas.width/2,t.y=u.app.canvas.height/2,t.anchor.set(.5,.5),u.app.stage.addChild(t),this.text=new O({text:"",style:new N({fill:3355443,fontSize:50})}),this.text.x=u.app.canvas.width/2,this.text.y=u.app.canvas.height/2+50,this.text.anchor.set(.5,.5),u.app.stage.addChild(this.text),await Promise.all([this.Load("./aclonica.woff2"),this.Load("./assets/gui/button_01.png").then(e=>this.Button01Texture=e),this.Load("./assets/gui/button_02.png").then(e=>this.Button02Texture=e),this.Load("./assets/gui/button_small.png").then(e=>this.ButtonSmallTexture=e),this.Load("./assets/gui/frame_01.png").then(e=>this.Frame01Texture=e),this.Load("./assets/gui/frame_02.png").then(e=>this.Frame02Texture=e),this.Load("./assets/gui/frame_03.png").then(e=>this.Frame03Texture=e),this.Load("./assets/gui/frame_04.png").then(e=>this.Frame04Texture=e),this.Load("./assets/gui/frame_05.png").then(e=>this.Frame05Texture=e),this.Load("./assets/gui/frame_inv.png").then(e=>this.FrameInventory=e),this.Load("./assets/gui/background_01.png").then(e=>this.FrameBackground=e),this.Load("./assets/gui/background_02.png").then(e=>this.FrameTowerTab=e),this.Load("./assets/gui/frame_violet.png").then(e=>this.VioletBackground=e),this.Load("./assets/gui/frame_red.png").then(e=>this.RedBackground=e),this.Load("./assets/gui/frame_green.png").then(e=>this.GreenBackground=e),this.Load("./assets/gui/frame_blue.png").then(e=>this.BlueBackground=e),this.Load("./assets/gui/frame_yellow.png").then(e=>this.YellowBackground=e),this.Load("./assets/gui/banner_01.png").then(e=>this.BannerGemsmith=e),this.Load("./assets/gui/note.png").then(e=>this.EndScreenDialog=e),this.Load("./assets/gui/main_background.jpg").then(e=>this.MainBackground=e),this.Load("./assets/tutorial/tutorial01.jpg").then(e=>this.Tutorial01=e),this.Load("./assets/tutorial/tutorial02.jpg").then(e=>this.Tutorial02=e),this.Load("./assets/tutorial/tutorial03.jpg").then(e=>this.Tutorial03=e),this.Load("./assets/tutorial/tutorial04.jpg").then(e=>this.Tutorial04=e),this.Load("./assets/tutorial/tutorial05.jpg").then(e=>this.Tutorial05=e),this.Load("./assets/gui/heart.png").then(e=>this.HealthTexture=e),this.Load("./assets/gui/money.png").then(e=>this.GoldTexture=e),this.Load("./assets/gui/wave.png").then(e=>this.WaveTexture=e),this.Load("./assets/gui/sword_02.png").then(e=>this.SwordsTexture=e),this.Load("./assets/gui/title01.png").then(e=>this.TitleTexture=e),this.Load("./assets/gui/icons/play.png").then(e=>this.PlayIconTexture=e),this.Load("./assets/gui/icons/pause.png").then(e=>this.PauseIconTexture=e),this.Load("./assets/gui/icons/pause.png").then(e=>this.PauseIconTexture=e),this.Load("./assets/gui/icons/fastforward.png").then(e=>this.FastForwardIconTexture=e),this.Load("./assets/gui/icons/home.png").then(e=>this.HomeIconTexture=e),this.Load("./assets/gui/icons/hammer.png").then(e=>this.HammerIconTexture=e),this.Load("./assets/gui/icons/cross.png").then(e=>this.XIconTexture=e),this.Load("./assets/gui/icons/plus.png").then(e=>this.PlusIconTexture=e),this.LoadMissions(),this.LoadTowers(),this.LoadCreeps(),this.LoadGems()]),t.destroy(),this.text.destroy(),this.text=!0}static async LoadGems(){const e=await(await fetch("./assets/json/Gems.json")).json();this.Gems=e;for(let s=0;s(i[i.Restricted=0]="Restricted",i[i.Buildable=1]="Buildable",i[i.Path=9]="Path",i))(Dt||{}),je=(i=>(i[i.Basic=0]="Basic",i[i.Circle=1]="Circle",i[i.Electric=2]="Electric",i[i.Buff=3]="Buff",i[i.Strong=4]="Strong",i[i.Rail=5]="Rail",i[i.Trapper=6]="Trapper",i[i.Debuff=7]="Debuff",i))(je||{});const J=class J{static TestSuite(){if(new URLSearchParams(location.href).entries().next().value[1]!="game")return;J.NotificationManager.Notify("Loaded testing suite.","danger");let e=C.Towers[je.Electric];J.TowerManager.ToggleChoosingTowerLocation("RESET"),J.TowerManager.PlaceTower(e,6,10,e.behaviour,!0);for(let s=0;s<29;s++)this.GameScene.MissionStats.giveGem(new Ms(s%4),!0)}};p(J,"app"),p(J,"GameMaster"),p(J,"Grid"),p(J,"WaveManager"),p(J,"TowerManager"),p(J,"AnimationManager"),p(J,"NotificationManager"),p(J,"DebrisManager"),p(J,"GameScene"),p(J,"latestCommit"),p(J,"latestGemId",0),p(J,"GridCellSize",64),p(J,"GridColumns",25),p(J,"GridRows",17),p(J,"MouseX",0),p(J,"MouseY",0);let u=J;class xd{constructor(){p(this,"currentScene");u.GameMaster=this}_CreateGuiObject(t){this.currentScene.gui.push(t),u.GameMaster.currentScene.stage.addChild(t.container)}_RemoveGuiObject(t){this.currentScene.gui.splice(this.currentScene.gui.indexOf(t),1),u.GameMaster.currentScene.stage.removeChild(t.container)}changeScene(t){this.currentScene&&this.currentScene.destroy(),this.currentScene=t,this.currentScene.init()}}class Mt{constructor(t){p(this,"name",this.constructor.name);p(this,"_container",new tt);p(this,"_events",new pt);p(this,"enabled",!0);p(this,"bb",new E);u.GameMaster._CreateGuiObject(this),t&&(this._container.interactive=!0,this._container.onwheel=e=>{this.enabled&&this.onWheel(e)},this._container.onpointerdown=e=>{this.enabled&&this.onClick(e)})}destroy(){this._events.removeAllListeners(),this._container.parent&&this._container.parent.removeChild(this._container),this._container.destroy()}get container(){return this._container}get events(){return this._events}onClick(t){console.warn(`[${this.name} does not implement GuiObject.onClick()]`)}onWheel(t){console.warn(`[${this.name} does not implement GuiObject.onWheel()]`)}setEnabled(t){this.enabled=t}copyContainerToBB(){return this.bb.x=this.container.x,this.bb.y=this.container.y,this.bb.width=this.container.width,this.bb.height=this.container.height,this.bb}copyBBToContainer(){return this.container.x=this.bb.x,this.container.y=this.bb.y,this.container.width=this.bb.width,this.container.height=this.bb.height,this.container}copyPropertiesToObj(t){return t.x=this.bb.x,t.y=this.bb.y,t.width=this.bb.width,t.height=this.bb.height,t}}var ot=(i=>(i[i.Button01=0]="Button01",i[i.Button02=1]="Button02",i))(ot||{});class ct extends Mt{constructor(e,s,n,r=!0){super(!0);p(this,"caption");p(this,"bounds");p(this,"buttonTexture");p(this,"buttonSprite");p(this,"buttonText");p(this,"buttonIcon");n==0&&(this.buttonTexture=C.Button01Texture),n==1&&(this.buttonTexture=C.Button02Texture),this.caption=s,this.enabled=r,this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.container.width=this.bounds.width,this.container.height=this.bounds.height,this.buttonSprite=new bt({texture:this.buttonTexture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.buttonSprite.x=0,this.buttonSprite.y=0,this.buttonSprite.width=this.bounds.width,this.buttonSprite.height=this.bounds.height,this.container.addChild(this.buttonSprite),this.buttonText=new O({text:this.caption,style:new N({fill:16777215,fontSize:24})}),this.container.addChild(this.buttonText),this.buttonText.anchor.set(.5,.5),this.buttonText.x=this.bounds.width/2,this.buttonText.y=this.bounds.height/2,this.container.x=this.bounds.x,this.container.y=this.bounds.y}setCaption(e){this.caption=e,this.buttonText.text=e}getCaption(){return this.caption}CustomButtonLogic(){console.warn(this.name+" - Button.CustomButtonLogic() is not implemented.")}}class ki{constructor(){p(this,"stage",new tt);p(this,"gui",[]);p(this,"_events",new pt);u.app.stage.addChild(this.stage)}destroy(){this.stage.destroy(),this._events.removeAllListeners(),this.gui.forEach(t=>{t.destroy()})}addMainBackground(){const t=new $(C.MainBackground);t.width=u.app.canvas.width,t.height=u.app.canvas.height,this.stage.addChild(t)}get events(){return this._events}init(){}}class yd extends ki{constructor(){super(...arguments);p(this,"currentImg",1);p(this,"sprite")}init(){let e=[null,C.Tutorial01,C.Tutorial02,C.Tutorial03,C.Tutorial04,C.Tutorial05];this.sprite=new $({texture:C.Tutorial01,scale:.6,x:250,y:150}),this.stage.addChild(this.sprite);let s=new ct(new E(250,this.sprite.height+160,120,60),"Back",ot.Button01);s.container.alpha=0,s.onClick=()=>{s.container.alpha==0||this.currentImg==1||(this.currentImg--,this.currentImg==3?this.sprite.scale=1.1:this.sprite.scale=.6,this.sprite.texture=e[this.currentImg],this.currentImg==1&&(s.container.alpha=0))};let n=new ct(new E(this.sprite.width+130,this.sprite.height+160,120,60),"Next",ot.Button01);n.onClick=()=>{n.container.alpha!=0&&(this.currentImg++,this.currentImg==3?this.sprite.scale=1.1:this.sprite.scale=.6,this.currentImg!=1&&(s.container.alpha=1),this.sprite.texture=e[this.currentImg],this.currentImg==5&&(n.container.alpha=0))};const r=new ct(new E(this.sprite.width-540,this.sprite.height+160,200,60),"Main menu",ot.Button01);r.onClick=a=>{u.GameMaster.changeScene(new Ys)}}}class _t{constructor(){p(this,"name",this.constructor.name);p(this,"_container",new tt);p(this,"bb",new E);p(this,"_events",new pt)}destroy(){this._events.removeAllListeners(),this._container.parent&&this._container.parent.removeChild(this._container),this._container.destroy()}get container(){return this._container}get events(){return this._events}copyContainerToBB(){return this.container==null?null:(this.bb.x=this.container.x,this.bb.y=this.container.y,this.bb.width=this.container.width,this.bb.height=this.container.height,this.bb)}copyBBToContainer(){return this.container.x=this.bb.x,this.container.y=this.bb.y,this.container.width=this.bb.width,this.container.height=this.bb.height,this.container}copyPropertiesToObj(t){return t.x=this.bb.x,t.y=this.bb.y,t.width=this.bb.width,t.height=this.bb.height,t}}var re=(i=>(i.CreepSpawned="creepSpawned",i.Finished="finished",i.NewWave="newwave",i))(re||{}),wt=(i=>(i.Died="died",i.TakenDamage="takenDamage",i.Escaped="escaped",i.Moved="moved",i))(wt||{}),qe=(i=>(i.CellMouseOver="cellmouseover",i.CellMouseLeave="cellmouseleave",i))(qe||{}),_e=(i=>(i.TowerPlacedEvent="towerPlacedEvent",i.TowerSoldEvent="towerSoldEvent",i))(_e||{}),Hs=(i=>(i.GemGivenEvent="gemGivenEvent",i))(Hs||{}),$s=(i=>(i.TowerPanelSelectGem="towerTabSelectGem",i))($s||{}),Ft=(i=>(i.BasicTowerBehaviour="BasicTowerBehaviour",i.CircleTowerBehaviour="CircleTowerBehaviour",i.ElectricTowerBehaviour="ElectricTowerBehaviour",i.BuffTowerBehaviour="BuffTowerBehaviour",i.StrongTowerBehaviour="StrongTowerBehaviour",i.RailTowerBehaviour="RailTowerBehaviour",i.TrapperTowerBehaviour="TrapperTowerBehaviour",i.DebuffTowerBehaviour="DebuffTowerBehaviour",i))(Ft||{});class wd{constructor(){p(this,"isPlacingTower",!1);p(this,"canPlaceTowers",!0);p(this,"selectedTower",null);p(this,"previewSprite",new $({parent:u.GameMaster.currentScene.stage,zIndex:10,width:64,height:64,alpha:.8}));p(this,"towers",[]);u.TowerManager=this,u.GameScene.events.on(qe.CellMouseOver,t=>{this.isPlacingTower&&(t.checkIfCantPlace()?(t.showRangePreview(!0,this.selectedTower.stats.range),this.previewSprite.tint=16711680):(t.showRangePreview(!1,this.selectedTower.stats.range),this.previewSprite.tint=16777215),this.previewSprite.x=t.column*u.GridCellSize,this.previewSprite.y=t.row*u.GridCellSize,this.previewSprite.texture=this.selectedTower.texture)}),u.GameScene.events.on(qe.CellMouseLeave,t=>{this.previewSprite.texture=null,u.Grid.rangePreview.clear()})}ResetChooseTower(){this.selectedTower=null,this.isPlacingTower=!1,u.Grid.toggleGrid("hide")}ToggleChoosingTowerLocation(t){this.canPlaceTowers&&(u.Grid.toggleGrid(),this.isPlacingTower?(this.previewSprite.texture=null,this.selectedTower=null):C.Towers.forEach(e=>{e.name==t&&(this.selectedTower=e,console.log(this.selectedTower))}),this.isPlacingTower=!this.isPlacingTower)}PlayerClickOnGrid(t,e){if(this.canPlaceTowers&&this.isPlacingTower){if(!this.selectedTower)return u.NotificationManager.Notify("TowerManager.selectedTower is null when trying to place tower.","danger"),console.warn("TowerManager.selectedTower is null when trying to place tower.");this.PlaceTower(this.selectedTower,t,e,this.selectedTower.behaviour)}}GetTowerByRowAndCol(t,e){let s=null;return this.towers.forEach(n=>{n.row==t&&n.column==e&&(s=n)}),s}PlaceTower(t,e,s,n,r){const a=t.texture;if(!u.GameScene.MissionStats.hasEnoughGold(t.stats.cost)&&!r)return u.NotificationManager.Notify("Not enough gold.","warn");if(!this.GetTowerByRowAndCol(e,s)&&u.Grid.getCellByRowAndCol(e,s).type!=Dt.Path&&u.Grid.getCellByRowAndCol(e,s).type!=Dt.Restricted){r||u.GameScene.MissionStats.spendGold(t.stats.cost);let o=new Gd(e,s,a,t,n);this.towers.push(o),this.ToggleChoosingTowerLocation("RESET"),this.selectedTower=null,this.previewSprite.x=-100,u.GameScene.events.emit(_e.TowerPlacedEvent,t.name,e,s)}else u.NotificationManager.Notify("Can not place tower on path or other tower, choose another spot.","warn")}update(t){this.towers.forEach((e,s)=>{if(e.sold){for(e.slottedGems=e.slottedGems.filter(n=>n!=null);e.slottedGems.length>0;)e.UnslotGem(0);u.GameScene.events.emit(_e.TowerSoldEvent,e.definition.name,e.row,e.column),u.GameScene.MissionStats.earnGold(e.definition.stats.cost),e.destroy(),this.towers.splice(s,1)}else e.update(t)})}}function ut(i,t,e,s){const n=e-i,r=s-t;return Math.atan2(r,n)}class _d extends _t{constructor(e,s,n,r,a,o,h,l,c){super();p(this,"deleteMe",!1);p(this,"sprite");p(this,"x");p(this,"y");p(this,"angle");p(this,"speed");p(this,"damage");p(this,"pierce",1);p(this,"timeToLive");p(this,"parent");p(this,"gemResistanceModifications");p(this,"collidedCreepIDs",[]);this.x=e,this.y=s,this.timeToLive=h,this.pierce=l,this.damage=a,this.gemResistanceModifications=c,this.sprite=new we({textures:n,scale:.25,rotation:r}),this.sprite.anchor.set(.5,.5),this.sprite.play(),this.container.x=this.x,this.container.y=this.y,this.container.addChild(this.sprite),u.GameMaster.currentScene.stage.addChild(this.container),this.angle=r,this.speed=.9}destroy(){super.destroy(),this.deleteMe=!0}update(e){if(!this.deleteMe){if(this.x>2e3||this.x<0||this.y>2e3||this.y<0||this.pierce<=0||this.timeToLive<=0)return this.destroy();this.timeToLive-=u.GameScene.gameSpeedMultiplier,u.Grid.creeps.forEach(s=>{if(!(this.pierce<=0)&&s&&s.container&&this.checkCollision(s)&&!this.collidedCreepIDs.find(r=>s.id==r.id)){this.collidedCreepIDs.push(s),this.pierce--,this.onCollide(s,this);return}}),this.x+=Math.cos(this.angle)*this.speed*e*u.GameScene.gameSpeedMultiplier,this.y+=Math.sin(this.angle)*this.speed*e*u.GameScene.gameSpeedMultiplier,this.container.x=this.x,this.container.y=this.y}}onCollide(e,s){u.GameScene.events.emit(wt.TakenDamage,e.id,s.damage,s.gemResistanceModifications)}checkCollision(e){if(e==null||e.container==null||e.container._position==null)return;let s=this.copyContainerToBB(),n=e.copyContainerToBB();return s.getBounds().intersects(n.getBounds())}}class bd extends _t{constructor(e,s){super();p(this,"deleteMe",!1);p(this,"c");p(this,"oc");p(this,"Lightning");this.c=e,this.oc=s;let n=ut(e.x,e.y,s.x,s.y);this.Lightning=new we({textures:C.SpecialLightning,x:e.x,y:e.y,width:Ke(this.c.x,this.c.y,this.oc.x,this.oc.y),height:64,scale:1.2,rotation:n}),this.Lightning.anchor.set(0,.5),this.Lightning.play(),u.GameMaster.currentScene.stage.addChild(this.Lightning),u.DebrisManager.CreateDebris(this,30)}destroy(){this.deleteMe=!0,this.container.destroy(),this.Lightning.destroy()}update(){this.deleteMe||(this.Lightning.x=this.c.x,this.Lightning.y=this.c.y,this.Lightning.width=Ke(this.c.x,this.c.y,this.oc.x,this.oc.y))}}function oe(i,t){i.projectiles.forEach(e=>{e.deleteMe||i.sold?(e.collidedCreepIDs.forEach(()=>{i.damageDealt+=i.computedDamageToDeal}),e.collidedCreepIDs=[],i.projectiles.splice(i.projectiles.indexOf(e),1),e.destroy(),e=null):e.update(t)})}function Wt(i){let t=0,e=0,s=0,n=0,r=0;if(i.totalGemResistanceModifications={fire:0,frostfire:0,divine:0,ice:0,physical:0},i.slottedGems.forEach(a=>{let o=a.currentGemImprovement();t+=o.damageUp,e+=o.attackSpeedUp,s+=o.rangeUp,n+=o.timeToLiveUp,r+=o.pierceUp;let h=a.currentGemResistanceModifications();i.totalGemResistanceModifications.physical+=h.physical,i.totalGemResistanceModifications.ice+=h.ice,i.totalGemResistanceModifications.fire+=h.fire,i.totalGemResistanceModifications.divine+=h.divine,i.totalGemResistanceModifications.frostfire+=h.frostfire}),i.computedDamageToDeal=i.definition.stats.damage+t,i.computedCooldown=i.definition.stats.cooldown-e,i.computedRange=i.definition.stats.range+s,i.computedTimeToLive=i.definition.stats.timeToLive+n,i.computedPierce=i.definition.stats.pierce+r,i.parent.isBuffedBy.length>0&&i.definition.name!=C.Towers[je.Buff].name){let a=i.parent.isBuffedBy[0];i.computedDamageToDeal+=Number((a.computedDamageToDeal/2).toFixed(1)),i.computedCooldown-=a.computedCooldown*100/5/100,i.computedRange+=Number((a.computedRange/10).toFixed(1)),i.computedTimeToLive+=a.computedTimeToLive*100/5/100,i.computedPierce+=a.computedPierce*100/4/100,i.totalGemResistanceModifications.physical+=a.totalGemResistanceModifications.physical*100/2/100,i.totalGemResistanceModifications.ice+=a.totalGemResistanceModifications.ice*100/2/100,i.totalGemResistanceModifications.fire+=a.totalGemResistanceModifications.fire*100/2/100,i.totalGemResistanceModifications.divine+=a.totalGemResistanceModifications.divine*100/2/100,i.totalGemResistanceModifications.frostfire+=a.totalGemResistanceModifications.frostfire*100/2/100}}function Sd(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier);let e=i.GetCreepsInRange();if(e.length>0){let s=e[0];if(i.millisecondsUntilNextShot<=0){let n=i.column*u.GridCellSize+u.GridCellSize/2,r=i.row*u.GridCellSize+u.GridCellSize/2;i.millisecondsUntilNextShot=i.computedCooldown,i.Shoot(ut(n,r,s.x,s.y))}}}function vd(i,t){if(Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier),i.GetCreepsInRange().length>0&&i.millisecondsUntilNextShot<=0){i.millisecondsUntilNextShot=i.computedCooldown;let s=i.column*u.GridCellSize+u.GridCellSize/2,n=i.row*u.GridCellSize+u.GridCellSize/2;i.Shoot(ut(s,n,s,n+10)),i.Shoot(ut(s,n,s+10,n)),i.Shoot(ut(s,n,s-10,n)),i.Shoot(ut(s,n,s,n-10)),i.Shoot(ut(s,n,s+10,n+10)),i.Shoot(ut(s,n,s-10,n+10)),i.Shoot(ut(s,n,s-10,n-10)),i.Shoot(ut(s,n,s+10,n-10))}}function Cd(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier);let e=i.GetCreepsInRange();if(e.length>0){let s=e[0];if(i.millisecondsUntilNextShot<=0){let n=i.column*u.GridCellSize+u.GridCellSize/2,r=i.row*u.GridCellSize+u.GridCellSize/2;i.millisecondsUntilNextShot=i.computedCooldown;let a=i.Shoot(ut(n,r,s.x,s.y));a.onCollide=(o,h)=>{let l=[];h.pierce=0;function c(d){u.Grid.creeps.filter(g=>{if(g.id!=o.id){const m=g.x,y=g.y,x=1.5*u.GridCellSize;return Ke(d.x,d.y,m,y){if(!l.find(m=>m==g.id))l.push(g.id);else return;c(g),new bd(d,g),u.GameScene.events.emit(wt.TakenDamage,g.id,Math.round(h.damage/2),h.gemResistanceModifications)})}c(o),u.GameScene.events.emit(wt.TakenDamage,o.id,h.damage,h.gemResistanceModifications)}}}}function Td(i,t){Wt(i)}function Ad(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier);let e=i.GetCreepsInRange();if(e.length>0){let s=e[0];if(i.millisecondsUntilNextShot<=0){let n=i.column*u.GridCellSize+u.GridCellSize/2,r=i.row*u.GridCellSize+u.GridCellSize/2;i.millisecondsUntilNextShot=i.computedCooldown,i.Shoot(ut(n,r,s.x,s.y))}}}function Md(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier);let e=i.GetCreepsInRange();if(e.length>0){let s=e[0];if(i.millisecondsUntilNextShot<=0){let n=i.column*u.GridCellSize+u.GridCellSize/2,r=i.row*u.GridCellSize+u.GridCellSize/2;i.millisecondsUntilNextShot=i.computedCooldown,i.Shoot(ut(n,r,s.x,s.y))}}}function Pd(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier)}function kd(i,t){Wt(i),oe(i,t),i.millisecondsUntilNextShot>0&&(i.millisecondsUntilNextShot-=t*u.GameScene.gameSpeedMultiplier);let e=i.GetCreepsInRange();if(e.length>0){let s=e[0];if(i.millisecondsUntilNextShot<=0){let n=i.column*u.GridCellSize+u.GridCellSize/2,r=i.row*u.GridCellSize+u.GridCellSize/2;i.millisecondsUntilNextShot=i.computedCooldown,i.Shoot(ut(n,r,s.x,s.y))}}}function Ke(i,t,e,s){return Math.sqrt((e-i)*(e-i)+(s-t)*(s-t))}class Gd extends _t{constructor(e,s,n,r,a){super();p(this,"row");p(this,"column");p(this,"setAsSold",!1);p(this,"sold",!1);p(this,"definition");p(this,"slottedGems",[]);p(this,"damageDealt",0);p(this,"projectiles",[]);p(this,"behaviour");p(this,"sprite");p(this,"millisecondsUntilNextShot");p(this,"graphics",new Tt);p(this,"computedDamageToDeal",0);p(this,"computedCooldown",0);p(this,"computedRange",0);p(this,"computedTimeToLive",0);p(this,"computedPierce",0);p(this,"totalGemResistanceModifications",{fire:0,frostfire:0,divine:0,ice:0,physical:0});p(this,"parent");p(this,"onParentCellEnter",e=>{!u.TowerManager.isPlacingTower&&u.Grid.gridInteractionEnabled&&!u.GameScene.towerPanel.isShown&&this.parent.showRangePreview(!1,this.computedRange)});p(this,"onParentCellLeave",e=>{this.graphics.clear()});this.row=e,this.column=s,this.behaviour=a,this.definition=r,this.millisecondsUntilNextShot=0,this.parent=u.Grid.getCellByRowAndCol(e,s),this.sprite=new $({texture:n,height:u.GridCellSize,width:u.GridCellSize,zIndex:130}),this.container.addChild(this.sprite),this.computedDamageToDeal=this.definition.stats.damage,this.computedRange=this.definition.stats.range,this.parent.container.addChild(this.container),this.container.interactiveChildren=!0,this.parent.clickDetector.on("pointerenter",this.onParentCellEnter),this.parent.clickDetector.on("pointerleave",this.onParentCellLeave),u.GameMaster.currentScene.stage.addChild(this.graphics)}SlotGem(e,s){this.slottedGems[s]=e,u.GameScene.towerPanel.Hide(),u.GameScene.towerPanel.Show(this)}UnslotGem(e){const s=this.slottedGems.splice(e,1)[0];if(s==null||!s)return console.warn("UnslotGem: Gem is null.");u.GameScene.MissionStats.giveGem(s,!0);for(let n=e;nn!=null),u.NotificationManager.Notify(`Lv. ${s.level} ${s.definition.name} unslotted and placed back in your inventory.`,"info")}GetCreepsInRange(){return u.Grid.creeps.filter(s=>{const n=s.x,r=s.y,a=this.column*u.GridCellSize+u.GridCellSize/2,o=this.row*u.GridCellSize+u.GridCellSize/2,h=this.computedRange*u.GridCellSize;return Ke(a,o,n,r)0){let o=new Z(this.slottedGems[0].definition.color);for(let h=1;h{u.Grid.gridInteractionEnabled&&(u.TowerManager.isPlacingTower?u.Grid.onGridCellClicked(s,n):this.OpenSelectedTowerPanel())}),this.clickDetector.on("pointerenter",a=>{!u.Grid.gridInteractionEnabled||u.GameScene.towerPanel.isShown||u.GameScene.events.emit(qe.CellMouseOver,this)}),this.clickDetector.on("pointerleave",a=>{!u.Grid.gridInteractionEnabled||u.GameScene.towerPanel.isShown||u.GameScene.events.emit(qe.CellMouseLeave,this)}),u.GameScene.events.on(_e.TowerPlacedEvent,(a,o,h)=>{if(o==this.row&&h==this.column)this.hasTowerPlaced=!0,u.Grid.rangePreview.clear();else if(a==C.Towers[je.Buff].name){let l=u.TowerManager.GetTowerByRowAndCol(o,h);u.Grid.IsCellInRangeOfOtherCell(o,h,l.computedRange,this)&&this.isBuffedBy.push(l)}}),u.GameScene.events.on(_e.TowerSoldEvent,(a,o,h)=>{if(console.log(a,o,h),o==this.row&&h==this.column)this.hasTowerPlaced=!1,u.Grid.rangePreview.clear();else if(a==C.Towers[je.Buff].name){let l=u.TowerManager.GetTowerByRowAndCol(o,h);u.Grid.IsCellInRangeOfOtherCell(o,h,l.computedRange,this)&&(console.log("REMOVED!"),this.isBuffedBy.splice(this.isBuffedBy.indexOf(l),1),console.log(this.isBuffedBy))}})}showRangePreview(e,s){let n=16777215;e&&(n=16711680),u.Grid.rangePreview.clear(),u.Grid.rangePreview.circle(this.column*u.GridCellSize+u.GridCellSize/2,this.row*u.GridCellSize+u.GridCellSize/2,s*u.GridCellSize),u.Grid.rangePreview.fill({color:n,alpha:.3})}OpenSelectedTowerPanel(){if(this.hasTowerPlaced){const e=u.TowerManager.GetTowerByRowAndCol(this.row,this.column);u.GameScene.towerPanel.Show(e)}}checkIfCantPlace(){return this.hasTowerPlaced||this.isPath||this.type==Dt.Path||this.type==Dt.Restricted}gDraw(){this.g.rect(0,0,this.bb.width,this.bb.height),this.type==Dt.Restricted?this.g.fill({color:2236962,alpha:.5}):this.hasTowerPlaced?this.g.fill({color:16711680,alpha:.5}):this.type==Dt.Path?this.g.fill({color:2236962,alpha:.5}):this.type==Dt.Buildable&&this.g.stroke({color:65280,alpha:.9})}gClear(){this.g.clear()}update(){}}class Id extends _t{constructor(e,s){super();p(this,"gameMap");p(this,"cells",[]);p(this,"rangePreview");p(this,"creeps",[]);p(this,"gridShown",!1);p(this,"gridInteractionEnabled",!0);this.gameMap=e,u.Grid=this,this.bb.x=0,this.bb.y=0,this.bb.width=u.GridCellSize*u.GridColumns,this.bb.height=u.GridCellSize*u.GridRows,u.GameMaster.currentScene.stage.addChild(this.container);let n=new $(C.MissionBackgrounds[s]);this.container.addChild(n);for(let r=0;rc.some(d=>d[1]===a&&d[0]===r));h&&(o=Dt.Path);let l=new Bd(o,a,r,h);this.cells.push(l)}this.rangePreview=new Tt({zIndex:10,x:0,y:0,width:u.app.canvas.width,height:u.app.canvas.height}),this.container.addChild(this.rangePreview)}generateCells(){const e=Array.from({length:this.gameMap.rows},()=>Array(this.gameMap.columns).fill(1));this.cells.forEach(s=>{if(s.isPath){e[s.row][s.column]=9;for(let n=-1;n<=1;n++)for(let r=-1;r<=1;r++){const a=s.row+n,o=s.column+r;a>=0&&a=0&&o{if(e){e=="hide"?s.gClear():s.gDraw();return}this.gridShown?s.gClear():s.gDraw()}),e=="hide"?this.gridShown=!1:e=="show"?this.gridShown=!0:this.gridShown=!this.gridShown}addCreep(e){this.creeps.push(e),e.events.on(wt.Died,s=>{this.onCreepDiedOrEscaped(s)}),e.events.on(wt.Escaped,s=>{this.onCreepDiedOrEscaped(s)})}onCreepDiedOrEscaped(e){this.creeps.splice(this.creeps.indexOf(e),1),e.destroy()}update(e){this.creeps.forEach(s=>{s.dead?(this.creeps.splice(this.creeps.indexOf(s),1),s=null):s.update(e)})}getCellByRowAndCol(e,s){return this.cells.filter(n=>n.row==e&&n.column==s)[0]}onGridCellClicked(e,s){}}class Ed extends _t{constructor(e,s,n){super();p(this,"id");p(this,"creepType");p(this,"sprite");p(this,"path");p(this,"stats");p(this,"pathIndex",0);p(this,"speed");p(this,"direction",1);p(this,"healthBarGraphics",new Tt);p(this,"healthBarWidth",50);p(this,"health");p(this,"maxHealth");p(this,"escaped",!1);p(this,"died",!1);p(this,"x");p(this,"y");p(this,"dead",!1);this.creepType=e,this.stats=structuredClone(C.Creeps[this.creepType].stats),this.sprite=new we(C.Creeps[this.creepType].textures),this.sprite.scale.x*=-1,this.sprite.anchor.set(.5,.5),this.sprite.animationSpeed=.3,this.sprite.play(),this.id=n,this.container.x=-70,this.container.y=-50,this.sprite.width=u.GridCellSize,this.sprite.height=u.GridCellSize,this.bb.width=this.sprite.width,this.speed=this.stats.speed/60,this.health=this.stats.health,this.maxHealth=this.stats.health,this.path=s,this.x=s[0][0]*u.GridCellSize+u.GridCellSize/2,this.y=s[0][1]*u.GridCellSize+u.GridCellSize/2,u.GameScene.events.on(wt.TakenDamage,(r,a,o)=>{r==this.id&&(this.health-=a+a*(o.physical-this.stats.resistance.physical),o.fire!=0&&(this.health-=Math.max(a*(o.fire-this.stats.resistance.fire),0)),o.ice!=0&&(this.health-=Math.max(a*(o.ice-this.stats.resistance.ice),0)),o.frostfire!=0&&(this.health-=Math.max(a*(o.frostfire-this.stats.resistance.frostfire),0)),o.divine!=0&&(this.health-=Math.max(a*(o.divine-this.stats.resistance.divine),0)),this.UpdateHealthbar())}),u.Grid.container.addChild(this.container),this.container.addChild(this.healthBarGraphics),this.container.addChild(this.sprite),this.UpdateHealthbar()}UpdateHealthbar(){this.healthBarGraphics.clear();const e=this.health,s=this.maxHealth,n=e/s,r=this.healthBarWidth*n;this.healthBarGraphics.rect(-this.healthBarWidth/2+3,-32,this.healthBarWidth+4,14),this.healthBarGraphics.fill({color:0}),this.healthBarGraphics.rect(-this.healthBarWidth/2+5,-30,r,10),this.healthBarGraphics.fill({color:16711680})}update(e){if(this.dead)return;if(this.health<=0){u.GameScene.events.emit(wt.Died,this.maxHealth,this),this.destroy(),this.dead=!0;return}if(this.pathIndex+1==this.path.length){if(this.escaped)return;this.events.emit(wt.Escaped,this),this.escaped=!0;return}const s=this.path[this.pathIndex],n=this.path[this.pathIndex+1],r=n[0]*u.GridCellSize+u.GridCellSize/2,a=n[1]*u.GridCellSize+u.GridCellSize/2,o=n[0]-s[0],h=n[1]-s[1];o>0?this.direction!=1&&(this.direction=1,this.sprite.scale.x*=-1):o<0&&this.direction!=-1&&(this.direction=-1,this.sprite.scale.x*=-1);let l=this.speed*e*o*u.GameScene.gameSpeedMultiplier,c=this.speed*e*h*u.GameScene.gameSpeedMultiplier,d=!1;l>0&&this.x+l>r&&(l=r-this.x,d=!0),l<0&&this.x+l0&&this.y+c>a&&(c=a-this.y,d=!0),c<0&&this.y+c{s+=n.firstCreepSpawnTick,n.creeps.forEach(r=>{const a=new Ed(r,this.paths[this.pathsIndex],this.internalCreepId);this.internalCreepId++;const o={creep:a,tickToSpawnAt:s,spawned:!1};s+=n.spawnIntervalTicks,this.creeps.push(o)})}),console.log(this.creeps)}end(){this.started=!1}update(e){this.started!=!1&&(this.ticks+=e*u.GameScene.gameSpeedMultiplier,this.creeps.forEach(s=>{!s.spawned&&s.tickToSpawnAt<=this.ticks?(s.spawned=!0,this.events.emit(re.CreepSpawned,s.creep),!this.finished&&this.creeps.every(n=>n.spawned)&&(this.finished=!0,this.events.emit(re.Finished))):s.spawned&&s.creep.update(e)}))}}class Ht extends Mt{constructor(e,s,n,r,a,o,h,l){if(e>3||s>2||e<0||s<0)throw"Index/row out of bounds for TowerButton.";super(!0);p(this,"frameSprite");p(this,"background");p(this,"towerName");p(this,"iconSprite");p(this,"i",0);this.towerName=h,this.container.x=e*n+5,this.container.y=s*r+5,this.background=new $({texture:o}),this.iconSprite=new $({texture:l}),this.background.width=n,this.background.height=r,this.iconSprite.x=n/2,this.iconSprite.y=r/2,this.iconSprite.width=n/2,this.iconSprite.height=r/2,this.iconSprite.anchor.set(.5,.5),this.container.addChild(this.background),this.container.addChild(this.iconSprite),this.frameSprite=new bt({texture:C.Frame02Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100,roundPixels:!0,height:r,width:n}),this.container.addChild(this.frameSprite),a.addChild(this.container),u.GameScene.events.on(_e.TowerPlacedEvent,c=>{this.resetTint()}),this.container.onpointermove=c=>{u.Grid.gridInteractionEnabled!=!1&&(u.TowerManager.isPlacingTower||this.ShowTooltip())},this.container.onpointerleave=c=>{u.GameScene.tooltip.Hide()}}ShowTooltip(){let e;C.Towers.forEach(s=>{s.name==this.towerName&&(e=s)}),u.GameScene.tooltip.SetContentTower(this.towerName,e.stats.damage,e.stats.cost,e.stats.gemSlotsAmount),u.GameScene.tooltip.Show(u.MouseX,u.MouseY)}onClick(e){u.Grid.gridInteractionEnabled!=!1&&(u.TowerManager.isPlacingTower&&u.TowerManager.selectedTower.name!=this.towerName&&(u.GameScene.sidebar.towerTab.resetTint(),u.TowerManager.ResetChooseTower()),u.GameScene.towerPanel.Hide(),u.GameScene.tooltip.Hide(),this.frameSprite.tint==65280?(this.frameSprite.tint=16777215,this.ShowTooltip()):this.frameSprite.tint=65280,u.TowerManager.ToggleChoosingTowerLocation(this.towerName))}resetTint(){this.frameSprite.tint=16777215}}class Fd extends Mt{constructor(e){super(!1);p(this,"bounds");p(this,"towerTabSprite");p(this,"towerButtons",[]);this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.towerTabSprite=new bt({texture:C.FrameTowerTab,leftWidth:500,topHeight:500,rightWidth:500,bottomHeight:500,roundPixels:!0}),this.towerTabSprite.width=this.bounds.width,this.towerTabSprite.height=this.bounds.height,this.container.addChild(this.towerTabSprite),this.towerButtons.push(new Ht(0,0,70,70,this.container,C.RedBackground,C.Towers[0].name,C.Towers[0].texture)),this.towerButtons.push(new Ht(1,0,70,70,this.container,C.RedBackground,C.Towers[1].name,C.Towers[1].texture)),this.towerButtons.push(new Ht(2,0,70,70,this.container,C.BlueBackground,C.Towers[2].name,C.Towers[2].texture)),this.towerButtons.push(new Ht(3,0,70,70,this.container,C.BlueBackground,C.Towers[3].name,C.Towers[3].texture)),this.towerButtons.push(new Ht(0,1,70,70,this.container,C.GreenBackground,C.Towers[4].name,C.Towers[4].texture)),this.towerButtons.push(new Ht(1,1,70,70,this.container,C.GreenBackground,C.Towers[5].name,C.Towers[5].texture)),this.towerButtons.push(new Ht(2,1,70,70,this.container,C.YellowBackground,C.Towers[6].name,C.Towers[6].texture)),this.towerButtons.push(new Ht(3,1,70,70,this.container,C.YellowBackground,C.Towers[7].name,C.Towers[7].texture))}resetTint(){this.towerButtons.forEach(e=>e.resetTint())}}const se=class se{static init(){se.SidebarRect=new E(u.app.canvas.width-360,0,360,u.app.canvas.height),se.ChangeRoundButtonRect=new E(50,u.app.canvas.height-100,310,100)}};p(se,"SidebarRect"),p(se,"ChangeRoundButtonRect"),p(se,"MaximumPlayerNameLength",20);let Yt=se;class Ze extends Mt{constructor(e,s,n,r){super(!0);p(this,"iconSprite");p(this,"background");p(this,"frame");p(this,"i",0);p(this,"gem",null);let a;this.i=e,this.container.x=10,this.container.y=e*(u.GridCellSize+6)+300,this.background=new $({texture:C.Frame01Texture}),n==null&&!r?a=C.PlusIconTexture:r=="SELL"?a=C.GoldTexture:r=="UPGRADE"?a=C.PlusIconTexture:(a=n.texture,this.gem=n),this.iconSprite=new $({texture:a,zIndex:10}),this.background.width=u.GridCellSize,this.background.height=u.GridCellSize,n==null&&!r?(this.iconSprite.x=u.GridCellSize/2,this.iconSprite.y=u.GridCellSize/2,this.iconSprite.width=u.GridCellSize/2,this.iconSprite.height=u.GridCellSize/2,this.iconSprite.anchor.set(.5,.5)):r=="SELL"?(this.iconSprite.x=4,this.iconSprite.y=4,this.iconSprite.width=u.GridCellSize-8,this.iconSprite.height=u.GridCellSize-8):r=="UPGRADE"?(this.iconSprite.x=u.GridCellSize/2,this.iconSprite.y=u.GridCellSize/2,this.iconSprite.width=u.GridCellSize/2,this.iconSprite.height=u.GridCellSize/2,this.iconSprite.tint=3012919,this.iconSprite.anchor.set(.5,.5)):(this.iconSprite.x=4,this.iconSprite.y=4,this.iconSprite.width=u.GridCellSize-8,this.iconSprite.height=u.GridCellSize-8),this.frame=new $({texture:C.Frame05Texture,width:64,height:64}),this.container.addChild(this.background),this.container.addChild(this.iconSprite),this.container.addChild(this.frame);let o=n?n.level:"",h=new O({text:o,zIndex:11,style:{fill:"white",stroke:{color:0,width:5}}});this.container.addChild(h),s.addChild(this.container)}setTint(e){this.frame.tint=e}resetTint(){this.frame.tint=16777215}}class Ld extends Mt{constructor(e){super(!1);p(this,"bounds");p(this,"towerPanel");p(this,"closeBtn");p(this,"vGems",[]);p(this,"showingTower",null);p(this,"isShown",!1);p(this,"titleText");p(this,"damageText");p(this,"totalDamage");p(this,"attackSpeedText");p(this,"fireResDamage");p(this,"iceResDamage");p(this,"frostFireResDamage");p(this,"divineResDamage");p(this,"physicalResDamage");p(this,"sellButton");this.bounds=e,this.towerPanel=new bt({texture:C.Frame03Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.towerPanel.width=this.bounds.width,this.towerPanel.height=this.bounds.height-this.bounds.height/3.5,this.closeBtn=new ct(new E(-20,-20,60,60),"",ot.Button01,!0),this.closeBtn.container.removeFromParent(),this.closeBtn.CustomButtonLogic=()=>{this.closeBtn.buttonIcon=new $({texture:C.XIconTexture,x:this.closeBtn.container.width/2,y:this.closeBtn.container.height/2,scale:.2}),this.closeBtn.buttonIcon.anchor.set(.5,.5),this.closeBtn.container.addChild(this.closeBtn.buttonIcon)},this.closeBtn.onClick=()=>{this.Hide()},this.Hide(),this.closeBtn.CustomButtonLogic(),this.container.y=u.app.canvas.height/2-u.app.canvas.height/2.7,this.container.addChild(this.towerPanel),this.container.addChild(this.closeBtn.container),u.GameMaster.currentScene.stage.addChild(this.container),this.titleText=new O({x:this.bounds.width/3,y:50,zIndex:5,style:new N({fill:16777215,fontSize:25,stroke:{color:0,width:2}})}),this.titleText.anchor.set(.5,0),this.container.addChild(this.titleText),this.damageText=new O({x:10,y:100,zIndex:5,style:new N({fill:16753920,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.damageText),this.attackSpeedText=new O({x:100,y:100,zIndex:5,style:new N({fill:16777215,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.attackSpeedText),this.totalDamage=new O({x:10,y:130,zIndex:5,style:new N({fill:16711680,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.totalDamage),this.fireResDamage=new O({x:10,y:170,zIndex:5,style:new N({fill:16536403,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.fireResDamage),this.iceResDamage=new O({x:10,y:190,zIndex:5,style:new N({fill:3335420,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.iceResDamage),this.frostFireResDamage=new O({x:10,y:210,zIndex:5,style:new N({fill:14111740,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.frostFireResDamage),this.divineResDamage=new O({x:10,y:230,zIndex:5,style:new N({fill:16576083,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.divineResDamage),this.physicalResDamage=new O({x:10,y:250,zIndex:5,style:new N({fill:16777215,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.physicalResDamage),this.sellButton=new ct(new E(5,this.towerPanel.height-70,this.towerPanel.width-115,60),"Sell",ot.Button02,!0),this.sellButton.container.removeFromParent(),this.container.addChild(this.sellButton.container)}MakeSlots(e){this.vGems.forEach(n=>{n.destroy()}),this.vGems=[];let s=e.definition.stats.gemSlotsAmount;for(let n=0;n{r&&(u.GameScene.tooltip.SetContentGem(r),u.GameScene.tooltip.Show(u.MouseX,u.MouseY))},a.container.onpointerleave=()=>{u.GameScene.tooltip.Hide()},a.onClick=()=>{u.GameScene.tooltip.Hide(),console.warn("EMITTING TOWER PANEL SELECT GEM",r,a.i,n,e),u.GameScene.events.emit($s.TowerPanelSelectGem,r,a.i,e),!r&&u.GameScene.sidebar.gemTab.isSelectingGem?a.setTint(65535):a.resetTint()}}}Show(e){this.isShown=!0,Wt(e),this.SetContent(e),this.MakeSlots(e),this.showingTower=e,u.GameScene.sidebar.gemTab.selectingGemTowerObject=e,e.container.parent.x<1270?this.ShowRight():this.ShowLeft(),e.parent.showRangePreview(!1,e.computedRange)}SetContent(e){this.titleText.text=e.definition.name,this.damageText.text="Deals "+e.computedDamageToDeal+" damage",this.totalDamage.text="Damage dealt: "+e.damageDealt+" damage",this.attackSpeedText.x=this.damageText.width+10,this.attackSpeedText.text=` every ${Math.floor(e.computedCooldown/1e3*100)/100}s`,this.fireResDamage.text=`+${e.totalGemResistanceModifications.fire*100}% Fire damage`,this.iceResDamage.text=`+${e.totalGemResistanceModifications.ice*100}% Ice damage`,this.frostFireResDamage.text=`+${e.totalGemResistanceModifications.frostfire*100}% FrostFire damage`,this.divineResDamage.text=`+${e.totalGemResistanceModifications.divine*100}% Divine damage`,this.physicalResDamage.text=`+${e.totalGemResistanceModifications.physical*100}% Physical damage`,this.sellButton.setCaption("Sell for "+e.definition.stats.cost+" gold"),this.sellButton.onClick=()=>{e.Sell(),this.Hide()}}ShowLeft(){this.towerPanel.x=-100,this.container.x=0,this.container.alpha=1,this.closeBtn.container.x=this.bounds.width-150}ShowRight(){this.towerPanel.x=-10,this.container.x=Yt.SidebarRect.x-210,this.closeBtn.container.x=-20,this.container.alpha=1}Hide(){this.isShown=!1,this.container.alpha=0,this.container.x=-1e3,u.Grid.rangePreview.clear()}}class Dd extends Mt{constructor(e){super(!1);p(this,"bounds");p(this,"gemTabSprite");p(this,"vGems",[]);p(this,"isSelectingGem",!1);p(this,"selectingGemSlotIndex",-1);p(this,"selectingGemTowerObject",null);p(this,"isDragAndDroppingGem",!1);p(this,"dragAndDroppingGem",null);this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.gemTabSprite=new bt({texture:C.FrameTowerTab,leftWidth:1e3,topHeight:1e3,rightWidth:1e3,bottomHeight:1e3}),this.gemTabSprite.x=0,this.gemTabSprite.y=0,this.gemTabSprite.width=this.bounds.width,this.gemTabSprite.height=this.bounds.height,this.container.addChild(this.gemTabSprite),u.app.canvas.addEventListener("pointermove",()=>{this.pointerMoveEvent()}),u.GameScene.events.on(Hs.GemGivenEvent,()=>{this.RebuildInventoryVisual()})}TowerPanelSelectingGem(e,s,n){console.log("TOWER PANEL SELECTING GEM "+s),s<0&&console.error("TOWER PANEL SELECTING GEM INDEX IS LESS THAN 0, ",s),this.isSelectingGem?e==null&&(this.isSelectingGem=!1,this.selectingGemSlotIndex=-1,this.selectingGemTowerObject=null):(this.isSelectingGem=!0,e==null?(u.NotificationManager.Notify("Click on any Gem in your inventory to slot it into this Gem slot.","info"),this.selectingGemSlotIndex=s,this.selectingGemTowerObject=n):(n.UnslotGem(s),this.RebuildInventoryVisual(),u.GameScene.towerPanel.Hide(),u.GameScene.towerPanel.Show(n),this.isSelectingGem=!1,this.selectingGemSlotIndex=-1,this.selectingGemTowerObject=null))}pointerMoveEvent(){!this.isDragAndDroppingGem||!this.dragAndDroppingGem||(this.dragAndDroppingGem.container.x=u.MouseX-32,this.dragAndDroppingGem.container.y=u.MouseY-32)}isOverlappingGemsmith(e,s,n){let r=e.copyContainerToBB(),a=s.copyContainerToBB(),o=n.x+a.x+u.GameScene.sidebar.container.x,h=n.y+a.y+u.GameScene.sidebar.container.y,l=new E(o,h,a.width,a.height);if(r.getBounds().intersects(l)&&s&&s.gem==null)return!0}RebuildInventoryVisual(){this.vGems.forEach(e=>e.destroy()),this.vGems=[],u.GameScene.MissionStats.getInventory().forEach((e,s)=>{let n=new Ze(0,this.container,e),r=10,a=s%4*70+10,o=s;for(;!(o<=3);)r+=66,o-=4;n.container.x=a,n.container.y=r,n.container.onpointermove=()=>{e==null||this.isDragAndDroppingGem||(u.GameScene.tooltip.SetContentGem(e),u.GameScene.tooltip.Show(u.MouseX,u.MouseY))},n.container.onpointerleave=()=>{u.GameScene.tooltip.Hide()},n.container.onpointerdown=()=>{if(u.GameScene.tooltip.Hide(),this.isSelectingGem){this.isSelectingGem=!1;let h=u.GameScene.MissionStats.takeGem(e);this.selectingGemTowerObject.SlotGem(h,this.selectingGemSlotIndex),this.RebuildInventoryVisual()}else this.isDragAndDroppingGem=!0,this.dragAndDroppingGem=n,n.container.removeFromParent(),u.GameScene.stage.addChild(n.container),this.pointerMoveEvent()},n.container.onpointerup=()=>{if(this.isSelectingGem)return;let h=null;if(this.isOverlappingGemsmith(this.dragAndDroppingGem,u.GameScene.sidebar.gemsmith.sellVGem,u.GameScene.sidebar.gemsmith.container)){let d=this.dragAndDroppingGem.gem.definition.initialGemValue+this.dragAndDroppingGem.gem.currentGemImprovement().gemValueUp;u.GameScene.MissionStats.earnGold(Math.ceil(d*.8)),u.NotificationManager.Notify(`Sold Lv. ${this.dragAndDroppingGem.gem.level} ${this.dragAndDroppingGem.gem.definition.name} for ${Math.ceil(d*.8)} gold.`,"info"),u.GameScene.MissionStats.takeGem(this.dragAndDroppingGem.gem),this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual();return}if(this.isOverlappingGemsmith(this.dragAndDroppingGem,u.GameScene.sidebar.gemsmith.upgradeVGem,u.GameScene.sidebar.gemsmith.container)){if(this.dragAndDroppingGem.gem.isMaxLevel())u.NotificationManager.Notify("Gem is max level.","warn");else{let d=this.dragAndDroppingGem.gem.definition.genericImprovements[this.dragAndDroppingGem.gem.level].gemValueUp;u.GameScene.MissionStats.hasEnoughGold(d)?(u.GameScene.MissionStats.spendGold(d),this.dragAndDroppingGem.gem.levelUp(1),u.NotificationManager.Notify(`Spent ${d} gold to upgrade ${this.dragAndDroppingGem.gem.definition.name} Lv. ${this.dragAndDroppingGem.gem.level-1} -> Lv. ${this.dragAndDroppingGem.gem.level}!`,"warn")):u.NotificationManager.Notify("You don't have enough, you need "+d+" gold to upgrade this gem.","warn")}this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual();return}if(u.GameScene.towerPanel.vGems.forEach(d=>{if(h||!this.dragAndDroppingGem)return;let f=this.dragAndDroppingGem.copyContainerToBB(),g=d.copyContainerToBB(),m=u.GameScene.towerPanel.container.x+g.x,y=u.GameScene.towerPanel.container.y+g.y,x=new E(m,y,g.width,g.height);f.getBounds().intersects(x)&&d&&d.gem==null&&(h=d)}),h){let d=u.GameScene.MissionStats.takeGem(e);u.GameScene.towerPanel.showingTower.SlotGem(d,h.i)}this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual()},this.vGems.push(n)})}}class zd extends Mt{constructor(e){super(!1);p(this,"bounds");p(this,"sellVGem");p(this,"upgradeVGem");this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y;let s=new $({x:0,y:0,width:this.bounds.width,height:this.bounds.height,texture:C.BannerGemsmith});this.container.addChild(s);let n=new O({x:40,y:this.bounds.height/6.5,text:"Sell gem",style:new N({fill:16767744,fontSize:18,stroke:{color:0,width:2}})});this.container.addChild(n);let r=new O({x:155,y:this.bounds.height/6.5,text:"Upgrade gem",style:new N({fill:3012919,fontSize:18,stroke:{color:0,width:2}})});this.container.addChild(r),this.sellVGem=new Ze(0,this.container,null,"SELL"),this.sellVGem.container.x=45,this.sellVGem.container.y=this.bounds.height/4,this.upgradeVGem=new Ze(0,this.container,null,"UPGRADE"),this.upgradeVGem.container.x=180,this.upgradeVGem.container.y=this.bounds.height/4}}class Ud extends Mt{constructor(e){super(!1);p(this,"towerTab");p(this,"gemTab");p(this,"gemsmith");p(this,"bounds");p(this,"sidebarSprite");this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.sidebarSprite=new bt({texture:C.Frame01Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.sidebarSprite.x=40,this.sidebarSprite.y=-40,this.sidebarSprite.width=this.bounds.width+40,this.sidebarSprite.height=this.bounds.height+80,this.container.addChild(this.sidebarSprite);const s=new E(60,20,this.bounds.width-65,150);this.towerTab=new Fd(s),this.container.addChild(this.towerTab.container);const n=new E(60,180,this.bounds.width-65,this.bounds.height-280-255);this.gemTab=new Dd(n),this.container.addChild(this.gemTab.container);const r=new E(60,185+n.height,this.bounds.width-65,this.bounds.height-840);this.gemsmith=new zd(r),this.container.addChild(this.gemsmith.container)}}class Od extends _t{constructor(e,s){super();p(this,"hp",100);p(this,"gold",0);p(this,"goldEarned",0);p(this,"goldSpent",0);p(this,"wavesSurvived",0);p(this,"damageDealt",0);p(this,"creepsKilled",0);p(this,"goldText");p(this,"healthText");p(this,"waveText");p(this,"inventory",[]);this.hp=e,this.gold=s,this.container.x=0,this.container.y=20,u.GameMaster.currentScene.stage.addChild(this.container),this.healthText=new O({text:`${this.hp}`,style:new N({fill:"red",fontSize:36,fontWeight:"bold",dropShadow:!0})}),this.goldText=new O({text:`${this.gold}`,style:new N({fill:"gold",fontSize:36,fontWeight:"bold",dropShadow:!0})}),this.waveText=new O({text:`0/${u.GameScene.mission.rounds.length}`,style:new N({fill:"dodgerblue",fontSize:36,fontWeight:"bold",dropShadow:!0})});const n=new $(C.HealthTexture),r=new $(C.GoldTexture),a=new $(C.WaveTexture);this.healthText.x=200,this.healthText.y=-15,n.x=160,n.width=36,n.height=32,n.y=-10,this.goldText.x=200,this.goldText.y=20,r.x=150,r.width=56,r.height=56,r.y=15,this.waveText.x=200,this.waveText.y=55,a.x=155,a.width=46,a.height=32,a.y=65,this.container.addChild(this.healthText),this.container.addChild(this.goldText),this.container.addChild(this.waveText),this.container.addChild(n),this.container.addChild(r),this.container.addChild(a),u.GameScene.events.on(re.NewWave,o=>{this.waveText.text=`${o}/${u.GameScene.mission.rounds.length}`})}getHP(){return this.hp}hasEnoughGold(e){return e<=this.gold}setHP(e){this.hp=e,this.healthText.text=this.hp}takeDamage(e){this.hp-=e,this.healthText.text=this.hp}setGold(e){this.gold=e,this.goldText.text=this.gold}earnGold(e){this.gold+=e,this.goldText.text=this.gold}spendGold(e){this.gold-=e,this.goldText.text=this.gold}giveGem(e,s){if(this.inventory.length>=32)return u.NotificationManager.Notify("Can't hold more than 32 Gems. Extra Gem was thrown away.","danger");this.inventory.push(e),s||u.NotificationManager.Notify(`Lv. ${e.level} ${e.definition.name} added to your inventory.`,"gemaward"),u.GameScene.events.emit(Hs.GemGivenEvent,e)}takeGem(e){return this.inventory.splice(this.inventory.indexOf(e),1)[0]}getInventory(){return this.inventory}checkIfPlayerHasAnyGems(){return this.inventory.length>0}getStats(){return{hp:this.hp,gold:this.gold,wavesSurvived:this.wavesSurvived,goldEarned:this.goldEarned,goldSpent:this.goldSpent,score:this.calculateScore()}}calculateScore(){const e=[];for(const s of this.inventory)e.includes(s.definition.name)||e.push(s.definition.name);return this.damageDealt*2+this.hp*10+(this.goldEarned-this.goldSpent)*3+this.wavesSurvived*100+e.length*100}update(){}}class Wd extends Mt{constructor(e){super(!1);p(this,"bounds");p(this,"tooltipSprite");p(this,"titleText");p(this,"costText");p(this,"damageText");p(this,"gemAmount");p(this,"gemAmountSprite");p(this,"title");p(this,"costSprite");p(this,"damageSprite");p(this,"gemDescriptionText");this.bounds=e,this.container.x=-500,this.container.y=-500,this.container.zIndex=150,this.tooltipSprite=new bt({texture:C.Frame04Texture,leftWidth:200,topHeight:200,rightWidth:200,bottomHeight:200}),this.tooltipSprite.width=this.bounds.width,this.tooltipSprite.height=this.bounds.height,this.titleText=new O({x:this.tooltipSprite.width/2,y:-20,zIndex:5,style:new N({fill:16777215,stroke:{color:0,width:2}})}),this.titleText.anchor.set(.5,0),this.title=new $({x:this.tooltipSprite.width/2,y:-20,width:250,height:40,texture:C.TitleTexture}),this.title.anchor.set(.5,0),this.costSprite=new $({texture:C.GoldTexture,x:10,y:20,width:56,height:50}),this.costText=new O({x:54,y:26,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"gold",fontWeight:"bold",stroke:{color:0,width:5}}}),this.damageText=new O({x:54,y:65,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"red",fontWeight:"bold",stroke:{color:0,width:5}}}),this.damageSprite=new $({texture:C.SwordsTexture,x:22,y:70,width:32,height:32}),this.gemAmountSprite=new $({texture:C.GemAmountIcons[0],x:22,y:110,width:32,height:32}),this.gemAmount=new O({x:54,y:105,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"white",fontWeight:"bold",stroke:{color:0,width:5}}}),this.gemDescriptionText=new O({x:10,y:20,text:"",style:{fontSize:18,wordWrap:!0,wordWrapWidth:this.tooltipSprite.width-30,fill:"white",fontWeight:"bold",fontStyle:"italic",stroke:{color:0,width:5}}}),this.container.addChild(this.tooltipSprite),this.container.addChild(this.title),this.container.addChild(this.costSprite),this.container.addChild(this.damageSprite),this.container.addChild(this.gemAmountSprite),this.container.addChild(this.costText),this.container.addChild(this.titleText),this.container.addChild(this.damageText),this.container.addChild(this.gemAmount),this.container.addChild(this.gemDescriptionText),u.app.stage.addChildAt(this.container,0)}SetContentTower(e,s,n,r){this.costSprite.alpha=1,this.damageSprite.alpha=1,this.gemAmountSprite.alpha=1,this.costText.alpha=1,this.damageText.alpha=1,this.gemAmount.alpha=1,this.gemDescriptionText.alpha=0,this.titleText.text=e,this.gemAmount.text=`Has ${r} Gem slots.`,this.gemAmountSprite.texture=C.GemAmountIcons[r],this.costText.text=`Costs ${n} gold.`,this.damageText.text=`Deals ${s} base damage.`}SetContentGem(e){this.costSprite.alpha=0,this.damageSprite.alpha=0,this.gemAmountSprite.alpha=0,this.costText.alpha=0,this.damageText.alpha=0,this.gemAmount.alpha=0,this.gemDescriptionText.alpha=1,this.titleText.text=`Lv. ${e.level} `+e.definition.name;let s;e.isMaxLevel()?s="Max level.":s=`Costs ${e.definition.genericImprovements[e.level].gemValueUp} gold to level up.`,this.gemDescriptionText.text=`${s} Valued at ${e.definition.initialGemValue+e.currentGemImprovement().gemValueUp} gold. `+e.definition.description}Show(e,s){this.container.alpha=1,e+this.container.width>u.app.canvas.width?this.container.x=e-this.container.width:this.container.x=e,this.container.y=s}Hide(){this.container.alpha=0,this.container.x=-500,this.container.y=-500}}const dt=class dt{static init(){window.addEventListener("keydown",dt.handleKeyDown)}static onKeyPressed(t){return dt.listeners=[...dt.listeners,t],()=>dt.offKey(t)}static offKey(t){const e=dt.listeners.indexOf(t);e>=0&&(dt.listeners=[...dt.listeners.slice(0,e),...dt.listeners.slice(e+1)])}static handleKeyDown(t){if(dt.listeners.length>0)for(let e=dt.listeners.length-1;e>=0&&(dt.listeners[e](t),!t.defaultPrevented);e--);}};p(dt,"listeners",[]);let be=dt;class Gi extends Mt{constructor(e,s,n){super();p(this,"overlay");p(this,"buttonHeight",65);p(this,"buttonCaptions");p(this,"buttons",[]);p(this,"dialogContent");p(this,"dialogContainer");p(this,"background");p(this,"generated",!1);p(this,"escapeKeyButton");p(this,"enterKeyButton");p(this,"keyboardManagerUnsubscribe");p(this,"onClosed");if(this.buttonCaptions=e,n&&!e.includes(n))throw new Error(`Escape key button "${n}" not found in buttons: ${e}`);if(this.escapeKeyButton=n,s&&!e.includes(s))throw new Error(`Enter key button "${s}" not found in buttons: ${e}`);this.enterKeyButton=s,this.keyboardManagerUnsubscribe=be.onKeyPressed(this.onKeyPress.bind(this))}show(){return this.generate(),`${Math.round(this.dialogContainer.x)}${Math.round(this.dialogContainer.y)}${Math.round(this.dialogContainer.width)}${Math.round(this.dialogContainer.height)}`,`${Math.round(this.dialogContent.x)}${Math.round(this.dialogContent.y)}${Math.round(this.dialogContent.width)}${Math.round(this.dialogContent.height)}`,new Promise((e,s)=>{u.app.stage.addChild(this.container),this.onClosed=n=>{this.destroy(),e(n)}})}createDialogBackground(){return new bt({texture:C.Frame04Texture,leftWidth:60,topHeight:60,rightWidth:60,bottomHeight:60})}getWidth(){}getHeight(){}generate(){if(this.generated)return;this.generated=!0,this.overlay=new Tt,this.overlay.rect(0,0,u.app.canvas.width,u.app.canvas.height),this.overlay.fill({color:0,alpha:.5}),this.overlay.interactive=!0,this.container.addChild(this.overlay);const e=this.buttonCaptions.map(l=>({caption:l,width:l.length*14+60,height:this.buttonHeight,click:()=>this.close(l)}));this.background=this.createDialogBackground(),this.dialogContent=this.createContent();let s=0;for(const l of e)s>0&&(s+=10),s+=l.width;const n=this.buttonCaptions.length>0?this.buttonHeight+10:0;let r=this.getWidth()||Math.max(s,this.dialogContent.width)+this.background.leftWidth+this.background.rightWidth,a=this.getHeight()||this.dialogContent.height+n+this.background.topHeight+this.background.bottomHeight;const o=new E(u.app.canvas.width/2-r/2,u.app.canvas.height/2-a/2,r,a);this.dialogContainer=new tt,this.dialogContainer.x=o.x,this.dialogContainer.y=o.y,this.background.width=r,this.background.height=a,this.dialogContainer.addChild(this.background),this.dialogContent.width0&&(r=s[0]),!n&&s.length>0&&(n=s[s.length-1]);super(s,n,r);p(this,"caption");this.caption=e}createContent(){return new O({text:this.caption,style:new N({fill:16777215,fontSize:24})})}static show(e,s,n=0){return new Vs(e,s).show()}}const Lt=class Lt{constructor(t){p(this,"missionName");p(this,"scores");this.missionName=t,this.scores=this.loadScores(),this.scores.sort((e,s)=>s.score-e.score||e.timestamp-s.timestamp)}loadScores(){const t=localStorage.getItem(Lt.STORAGE_KEY_PREFIX+this.missionName);return Lt.parseStoredScores(t)}saveScores(){localStorage.setItem(Lt.STORAGE_KEY_PREFIX+this.missionName,JSON.stringify(this.scores))}addScore(t){this.scores.push(t),this.scores.sort((e,s)=>s.score-e.score),this.scores.length>Lt.MAX_SCORES&&(this.scores.length=Lt.MAX_SCORES),this.saveScores()}getScores(){return this.scores}static parseStoredScores(t){if(!t)return[];try{const e=JSON.parse(t);if(Array.isArray(e)&&e.every(s=>typeof s.playerName=="string"&&typeof s.score=="number"&&typeof s.timestamp=="number"))return e.map(s=>({playerName:s.playerName,score:s.score,timestamp:s.timestamp}))}catch(e){console.error("Failed to parse stored scores:",e)}return[]}};p(Lt,"STORAGE_KEY_PREFIX","highscore_"),p(Lt,"MAX_SCORES",10);let bi=Lt;const Fe={Confirm:"OK",Skip:"Skip"};class Hd extends Gi{constructor(e,s,n){super([Fe.Confirm,Fe.Skip],Fe.Confirm,Fe.Skip);p(this,"dialogCaption");p(this,"playerNameTextInput");p(this,"lost");p(this,"highScore");p(this,"missionStats");this.lost=n,this.highScore=new bi(e),this.missionStats=s}generate(){super.generate(),this.dialogCaption=new O({text:this.lost?"You lost!":"You won!",style:new N({fill:16777215,fontSize:36,stroke:{color:0,width:2},dropShadow:{color:0,blur:8,distance:0}})}),this.dialogCaption.anchor.set(.5,.5),this.dialogCaption.x=this.dialogContainer.width/2,this.dialogCaption.y=50,this.dialogContainer.addChild(this.dialogCaption)}createDialogBackground(){return new bt({texture:C.EndScreenDialog,leftWidth:50,topHeight:100,rightWidth:50,bottomHeight:50})}createContent(){const e=new tt,s=35,n=this.createText("Mission details:","#fee",!0);e.addChild(n);const r=this.missionStats.getStats(),a=this.getWidth()-this.background.leftWidth-this.background.rightWidth-20,o=[this.createText("HP:"),this.createText("Gold:"),this.createText("Waves Survived:"),this.createText("Gold Earned:"),this.createText("Gold Spent:"),this.createText("----"),this.createText("Score:")],h=[this.createText(r.hp.toString(),"yellow"),this.createText(r.gold.toString(),"yellow"),this.createText(r.wavesSurvived.toString(),"yellow"),this.createText(r.goldEarned.toString(),"yellow"),this.createText(r.goldSpent.toString(),"yellow"),this.createText("----","yellow"),this.createText(r.score.toString(),"yellow")],l=300;for(let f=0;fthis.createText((f+1).toString()))],o=[this.createText("Player","#fee",!0),...r.map(d=>this.createText(d.playerName))],h=[this.createText("Score","#fee",!0),...r.map(d=>this.createText(d.score.toString()))],l=a.reduce((d,f)=>Math.max(d,f.width),0)+20,c=l+o.reduce((d,f)=>Math.max(d,f.width),0)+20;for(let d=0;d{s.name==e&&(this.mission=s,this.missionIndex=n)})}init(){u.latestGemId=0,new Id(this.mission.gameMap,this.missionIndex),new wd,new Rd(this.mission.rounds,this.mission.gameMap.paths),u.Grid.onGridCellClicked=(e,s)=>{u.TowerManager.isPlacingTower&&u.TowerManager.PlayerClickOnGrid(e,s)},u.WaveManager.events.on(re.CreepSpawned,e=>{u.Grid.addCreep(e),e.events.on(wt.Escaped,()=>{this.onCreepEscaped(e)})}),u.WaveManager.events.on(re.Finished,()=>{this.isWaveManagerFinished=!0}),this.events.on(wt.Died,(e,s)=>{this.MissionStats.earnGold(e)}),this.towerPanel=new Ld(Yt.SidebarRect),this.sidebar=new Ud(Yt.SidebarRect),this.changeRoundButton=new ct(Yt.ChangeRoundButtonRect,"",ot.Button01,!0),this.changeRoundButton.container.removeFromParent(),this.sidebar.container.addChild(this.changeRoundButton.container),u.GameMaster.currentScene.stage.addChildAt(this.dimGraphics,0),this.tooltip=new Wd(new E(0,0,350,160)),this.changeRoundButton.CustomButtonLogic=()=>{this.changeRoundButton.buttonIcon=new $({texture:C.PlayIconTexture,x:this.changeRoundButton.container.width/2,y:this.changeRoundButton.container.height/2,scale:.2}),this.changeRoundButton.buttonIcon.anchor.set(.5,.5),this.changeRoundButton.container.addChild(this.changeRoundButton.buttonIcon)},this.changeRoundButton.CustomButtonLogic(),this.changeRoundButton.onClick=()=>{if(this.playerWon)return this.ReturnToMain();if(this.roundMode==1){this.gameSpeedMultiplier!==1?this.UpdateGameSpeedMultiplier(1):this.UpdateGameSpeedMultiplier(2);return}if(this.isGameOver)return u.NotificationManager.Notify("No more waves.","danger");this.roundMode!=2&&(this.setRoundMode(1),this.changeRoundButton.buttonIcon.texture=C.FastForwardIconTexture,this.events.emit(re.NewWave,`${this.currentRound+1}`))},this.MissionStats=new Od(125,450),this.events.on($s.TowerPanelSelectGem,(e,s,n)=>{if(e==null&&!this.MissionStats.checkIfPlayerHasAnyGems())return u.NotificationManager.Notify("You require atleast 1 Gem in your inventory to slot it in a Gem slot.","warn");this.sidebar.gemTab.TowerPanelSelectingGem(e,s,n)}),this.pauseButton=new ct(new E(5,5,120,80),"",ot.Button01,!0),this.pauseButton.container.removeFromParent(),this.stage.addChild(this.pauseButton.container),this.pauseButton.CustomButtonLogic=()=>{this.pauseButton.buttonIcon=new $({texture:C.PauseIconTexture,x:this.pauseButton.container.width/2,y:this.pauseButton.container.height/2,scale:.2}),this.pauseButton.buttonIcon.anchor.set(.5,.5),this.pauseButton.container.addChild(this.pauseButton.buttonIcon)},this.pauseButton.CustomButtonLogic(),this.pauseButton.onClick=()=>{this.isPaused?this.UnpauseGame():(this.ShowPauseDialog(),this.PauseGame())},this.ticker=new Bt,this.ticker.maxFPS=60,this.ticker.minFPS=30,this.tooltip.SetContentTower(0,0,0,0),this.tooltip.Show(u.MouseX,u.MouseY),this.tooltip.Hide(),this.ticker.add(()=>{this.update&&this.update(this.ticker.elapsedMS)}),this.ticker.start()}update(e){if(this.isGameOver){this.destroyTicker&&(this.destroyTicker=!1,this.ticker.destroy());return}u.WaveManager.update(e),u.Grid.update(e),u.TowerManager.update(e),this.isWaveManagerFinished&&u.Grid.creeps.length==0&&(this.isWaveManagerFinished=!1,this.setRoundMode(0),this.changeRoundButton.buttonIcon.texture=C.PlayIconTexture,u.NotificationManager.Notify(`Round ${this.currentRound+1}/${this.mission.rounds.length} completed.`,"info"),this.currentRound+1==this.mission.rounds.length?(u.NotificationManager.Notify("Mission victory!!","reward"),this.changeRoundButton.buttonIcon.texture=C.HomeIconTexture,this.playerWon=!0):(this.OfferPlayerGems(),this.currentRound++)),this.MissionStats.getHP()<=0?(this.isGameOver=!0,this.ShowEndgameDialog(!0)):this.playerWon&&(this.isGameOver=!0,this.ShowEndgameDialog(!1))}DarkenScreen(){this.dimGraphics.rect(0,0,u.app.canvas.width,u.app.canvas.height),this.dimGraphics.fill({color:0,alpha:.5})}UndarkenScreen(){this.dimGraphics.clear()}OfferPlayerGems(){u.Grid.gridInteractionEnabled=!1,u.GameScene.sidebar.towerTab.resetTint(),u.TowerManager.ResetChooseTower(),this.setRoundMode(2);let e=this.mission.rounds[this.currentRound].offeredGems;this.DarkenScreen(),this.offerGemsSprite=new bt({width:380,height:150,texture:C.Frame01Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100,zIndex:this.dimGraphics.zIndex+1,x:u.app.canvas.width/2-190,y:u.app.canvas.height/2-75}),u.GameMaster.currentScene.stage.addChildAt(this.offerGemsSprite,0);let s=new O({x:u.app.canvas.width/4,y:u.app.canvas.height/4,zIndex:this.dimGraphics.zIndex+1,text:"Choose a Gem as your reward for beating this round!",style:{fontSize:40,fill:"orange",fontWeight:"bold",stroke:{color:0,width:5}}});u.GameMaster.currentScene.stage.addChildAt(s,0),e.forEach((n,r)=>{let a=new Ms(n,!0),o=new Ze(0,u.app.stage,a);this.visualGems.push(o),o.container.x=this.offerGemsSprite.x-15+69*(r+1),o.container.y=this.offerGemsSprite.y+40,o.container.onpointermove=()=>{u.GameScene.tooltip.SetContentGem(a),u.GameScene.tooltip.Show(u.MouseX,u.MouseY)},o.container.onpointerleave=()=>{u.GameScene.tooltip.Hide()},o.onClick=()=>{u.GameScene.tooltip.Hide(),s.destroy(),this.PlayerPickedGem(new Ms(n))}})}PlayerPickedGem(e){this.offerGemsSprite.destroy(),this.UndarkenScreen(),this.visualGems.forEach(s=>s.destroy()),u.Grid.gridInteractionEnabled=!0,this.MissionStats.giveGem(e),this.setRoundMode(0)}PauseGame(){this.isPaused=!0,this.ticker.stop(),document.title="[PAUSED] "+this.windowTitle}UnpauseGame(){this.isPaused=!1,this.ticker.start(),document.title=this.windowTitle}ShowPauseDialog(){new Vd().show()}async ShowEndgameDialog(e){await new Hd(this.mission.name,this.MissionStats,e).show();const r=await new $d(this.mission.name,e,!e&&this.missionIndex+1{u.GameMaster.changeScene(new Ys)},C.Missions.forEach((e,s)=>{const n=new ct(new E(u.app.canvas.width/2-150,400+s*70,300,60),e.name,ot.Button01);n.onClick=r=>{u.GameMaster.changeScene(new Se(e.name))}})}}class Ys extends ki{init(){this.addMainBackground();const t={caption:"New Game",rect:new E(u.app.canvas.width/2-300/2,400+0*70,300,60),texture:ot.Button01},e={caption:"How to play",rect:new E(u.app.canvas.width/2-300/2,400+1*70,300,60),texture:ot.Button01};new E(u.app.canvas.width/2-300/2,400+2*70,300,60),ot.Button01;let s=new O({x:0,y:0,text:"Latest commit: "+u.latestCommit,style:{fill:16777215,fontSize:10,fontWeight:"bold"}});this.stage.addChild(s);const n=new ct(t.rect,t.caption,t.texture,!0);n.onClick=a=>{u.GameMaster.changeScene(new ge)};let r=new ct(e.rect,e.caption,e.texture,!0);r.onClick=a=>{u.GameMaster.changeScene(new yd)}}}class Yd{constructor(){p(this,"finished",!1);p(this,"calledBack",!1);p(this,"callbackFn")}Finish(){this.finished=!0}update(t){this.finished}}class Xd extends Yd{constructor(e,s,n,r){super();p(this,"fadeType");p(this,"fadeTime");p(this,"pixiObject");p(this,"ticks",0);this.fadeType=e,this.fadeTime=s,this.pixiObject=n,this.callbackFn=r,e=="in"?this.pixiObject.alpha=0:this.pixiObject.alpha=1}update(e){if(super.update(e),this.pixiObject==null)return this.Finish();this.ticks++,this.fadeType=="in"?this.pixiObject.alpha=this.ticks/this.fadeTime:this.pixiObject.alpha-=1/this.fadeTime,this.ticks>=this.fadeTime&&this.Finish()}}class jd{constructor(){p(this,"AnimationQueue",[])}Animate(t){this.AnimationQueue.push(t)}update(t){for(let e=this.AnimationQueue.length-1;e>=0;e--){const s=this.AnimationQueue[e];s.finished?(s.callbackFn(),this.AnimationQueue.splice(e,1)):s.update(t)}}}class qd{constructor(t,e,s,n,r){p(this,"textObj");p(this,"ticksToFadeAway");p(this,"animating",!1);p(this,"destroyed",!1);let a=16777215;e=="info"?a=2143228:e=="warn"?a=16570144:e=="danger"?a=16517642:e=="reward"?a=14047996:e=="gemaward"?a=16777215:e=="green"&&(a=65280),this.ticksToFadeAway=r,this.textObj=new O({text:t,style:new N({fill:a,fontSize:36,fontWeight:"bold",dropShadow:!0,align:"center"}),x:s,y:n,zIndex:100}),this.textObj.anchor.set(.5,.5),u.NotificationManager.container.addChild(this.textObj)}destroy(){this.textObj.destroy(),this.destroyed=!0}}class Kd extends _t{constructor(){super();p(this,"notifications",[]);p(this,"ticks",0);this.bb.x=u.app.canvas.width/2,this.bb.y=40,this.copyBBToContainer(),this.container.zIndex=200,u.app.stage.addChild(this.container)}Notify(e,s){let n=0,r=this.notifications.length*32;this.notifications.push(new qd(e,s,n,r,this.ticks+180))}update(e){this.ticks++;for(let s=this.notifications.length-1;s>=0;s--){const n=this.notifications[s];if(n.destroyed){this.notifications.splice(s,1);continue}this.ticks>=n.ticksToFadeAway&&!n.animating&&(n.animating=!0,u.AnimationManager.Animate(new Xd("out",300,n.textObj,()=>{n.destroy()})))}}}class Zd{constructor(t,e){p(this,"ticksToDestroyAt");p(this,"debris");this.debris=t,this.ticksToDestroyAt=e}destroy(){this.debris.destroy()}update(t){console.log(this.debris instanceof _t),this.debris instanceof _t&&this.debris.update(t)}}class Qd extends _t{constructor(){super(...arguments);p(this,"ticks",0);p(this,"debris",[])}update(e){this.ticks++;for(let s=this.debris.length-1;s>=0;s--){const n=this.debris[s];this.ticks>=n.ticksToDestroyAt?(n.destroy(),this.debris.splice(s,1)):n.update(e)}}CreateDebris(e,s){s||(s=120),this.debris.push(new Zd(e,this.ticks+s))}}(async()=>{const i=new qr;u.app=i,await i.init({width:1920,height:1080,resolution:1,autoDensity:!0,backgroundColor:16777215,sharedTicker:!0}),document.body.appendChild(i.canvas);function t(){const n=window.innerWidth,r=window.innerHeight,a=n/i.screen.width,o=r/i.screen.height,h=Math.min(a,o),l=Math.round(i.screen.width*h),c=Math.round(i.screen.height*h),d=(n-l)/2,f=(r-c)/2;i.canvas.style.width=`${l}px`,i.canvas.style.height=`${c}px`,i.canvas.style.marginLeft=`${d}px`,i.canvas.style.marginTop=`${f}px`,i.canvas.style.marginRight="0",i.canvas.style.marginBottom="0",i.canvas.style.display="block"}u.latestCommit=await fetch("./latest_commit").then(n=>n.text()),window.addEventListener("resize",t),t(),await C.LoadAssets(),Yt.init(),be.init(),new xd,u.AnimationManager=new jd,u.NotificationManager=new Kd,u.DebrisManager=new Qd,globalThis.Engine=u,Bt.shared.add(n=>{u.NotificationManager.update(n.elapsedMS),u.AnimationManager.update(n.elapsedMS),u.DebrisManager.update(n.elapsedMS)}),i.canvas.addEventListener("pointermove",function(n){u.MouseX=(n.clientX-i.canvas.offsetLeft)/i.canvas.offsetWidth*1920,u.MouseY=(n.clientY-i.canvas.offsetTop)/i.canvas.offsetHeight*1080}),u.GameMaster.changeScene(new Ys),new URLSearchParams(location.href).entries().next().value[1]=="game"&&u.GameMaster.changeScene(new Se("The Turn")),u.latestCommit!="DEVELOPMENT"?window.onbeforeunload=()=>"You are about to leave.":u.TestSuite();let s=!1;window.addEventListener("blur",()=>{u.GameScene&&!u.GameScene.isPaused&&(u.GameScene.PauseGame(),s=!0)}),window.addEventListener("focus",()=>{u.GameScene&&s&&u.GameScene.isPaused&&(s=!1,u.GameScene.UnpauseGame())})})();export{U as $,Vr as A,it as B,tt as C,Q as D,k as E,ur as F,Ci as G,It as H,fn as I,$ as J,jo as K,sh as L,H as M,nt as N,E as O,ht as P,bh as Q,fs as R,Wh as S,Ot as T,yi as U,gn as V,Mo as W,Wi as X,Z as Y,pr as Z,Yr as _,z as a,W as a0,Ah as a1,sa as a2,dl as a3,fl as a4,yl as a5,_l as a6,bl as a7,xe as a8,N as a9,dc as aa,Ts as ab,la as ac,Tn as ad,ce as ae,fd as af,qn as ag,xc as ah,Tt as ai,j as aj,to as ak,Cs as al,Xn as am,da as an,Bt as b,pt as c,Vt as d,lt as e,Cn as f,zh as g,pi as h,Bs as i,Nr as j,Cr as k,zr as l,Yn as m,tn as n,cl as o,ul as p,ml as q,fo as r,Qr as s,wl as t,Is as u,Rr as v,st as w,Ja as x,vl as y,zt as z}; diff --git a/assets/index-qw10VO79.js b/assets/index-qw10VO79.js deleted file mode 100644 index 7af16ee..0000000 --- a/assets/index-qw10VO79.js +++ /dev/null @@ -1,296 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/browserAll-CVGpJBCa.js","assets/webworkerAll-CU4P2OK3.js","assets/colorToUniform-BiCyqw1t.js","assets/WebGPURenderer-BJsHNgQI.js","assets/SharedSystems-BKkjBxbn.js","assets/WebGLRenderer-B-VwtzIo.js"])))=>i.map(i=>d[i]); -var Ra=Object.defineProperty;var Fa=(s,t,e)=>t in s?Ra(s,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):s[t]=e;var p=(s,t,e)=>Fa(s,typeof t!="symbol"?t+"":t,e);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))i(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const a of r.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&i(a)}).observe(document,{childList:!0,subtree:!0});function e(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerPolicy&&(r.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?r.credentials="include":n.crossOrigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function i(n){if(n.ep)return;n.ep=!0;const r=e(n);fetch(n.href,r)}})();const La="modulepreload",Da=function(s){return"/"+s},js={},ci=function(t,e,i){let n=Promise.resolve();if(e&&e.length>0){document.getElementsByTagName("link");const a=document.querySelector("meta[property=csp-nonce]"),o=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));n=Promise.allSettled(e.map(h=>{if(h=Da(h),h in js)return;js[h]=!0;const c=h.endsWith(".css"),l=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${h}"]${l}`))return;const d=document.createElement("link");if(d.rel=c?"stylesheet":La,c||(d.as="script"),d.crossOrigin="",d.href=h,o&&d.setAttribute("nonce",o),document.head.appendChild(d),c)return new Promise((u,g)=>{d.addEventListener("load",u),d.addEventListener("error",()=>g(new Error(`Unable to preload CSS for ${h}`)))})}))}function r(a){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=a,window.dispatchEvent(o),!o.defaultPrevented)throw a}return n.then(a=>{for(const o of a||[])o.status==="rejected"&&r(o.reason);return t().catch(r)})};var k=(s=>(s.Application="application",s.WebGLPipes="webgl-pipes",s.WebGLPipesAdaptor="webgl-pipes-adaptor",s.WebGLSystem="webgl-system",s.WebGPUPipes="webgpu-pipes",s.WebGPUPipesAdaptor="webgpu-pipes-adaptor",s.WebGPUSystem="webgpu-system",s.CanvasSystem="canvas-system",s.CanvasPipesAdaptor="canvas-pipes-adaptor",s.CanvasPipes="canvas-pipes",s.Asset="asset",s.LoadParser="load-parser",s.ResolveParser="resolve-parser",s.CacheParser="cache-parser",s.DetectionParser="detection-parser",s.MaskEffect="mask-effect",s.BlendMode="blend-mode",s.TextureSource="texture-source",s.Environment="environment",s.ShapeBuilder="shape-builder",s.Batcher="batcher",s))(k||{});const Ji=s=>{if(typeof s=="function"||typeof s=="object"&&s.extension){if(!s.extension)throw new Error("Extension class must have an extension object");s={...typeof s.extension!="object"?{type:s.extension}:s.extension,ref:s}}if(typeof s=="object")s={...s};else throw new Error("Invalid extension type");return typeof s.type=="string"&&(s.type=[s.type]),s},qe=(s,t)=>Ji(s).priority??t,lt={_addHandlers:{},_removeHandlers:{},_queue:{},remove(...s){return s.map(Ji).forEach(t=>{t.type.forEach(e=>{var i,n;return(n=(i=this._removeHandlers)[e])==null?void 0:n.call(i,t)})}),this},add(...s){return s.map(Ji).forEach(t=>{t.type.forEach(e=>{var r,a;const i=this._addHandlers,n=this._queue;i[e]?(a=i[e])==null||a.call(i,t):(n[e]=n[e]||[],(r=n[e])==null||r.push(t))})}),this},handle(s,t,e){var a;const i=this._addHandlers,n=this._removeHandlers;if(i[s]||n[s])throw new Error(`Extension type ${s} already has a handler`);i[s]=t,n[s]=e;const r=this._queue;return r[s]&&((a=r[s])==null||a.forEach(o=>t(o)),delete r[s]),this},handleByMap(s,t){return this.handle(s,e=>{e.name&&(t[e.name]=e.ref)},e=>{e.name&&delete t[e.name]})},handleByNamedList(s,t,e=-1){return this.handle(s,i=>{t.findIndex(r=>r.name===i.name)>=0||(t.push({name:i.name,value:i.ref}),t.sort((r,a)=>qe(a.value,e)-qe(r.value,e)))},i=>{const n=t.findIndex(r=>r.name===i.name);n!==-1&&t.splice(n,1)})},handleByList(s,t,e=-1){return this.handle(s,i=>{t.includes(i.ref)||(t.push(i.ref),t.sort((n,r)=>qe(r,e)-qe(n,e)))},i=>{const n=t.indexOf(i.ref);n!==-1&&t.splice(n,1)})}},za={extension:{type:k.Environment,name:"browser",priority:-1},test:()=>!0,load:async()=>{await ci(()=>import("./browserAll-CVGpJBCa.js"),__vite__mapDeps([0,1,2]))}},Ua={extension:{type:k.Environment,name:"webworker",priority:0},test:()=>typeof self<"u"&&self.WorkerGlobalScope!==void 0,load:async()=>{await ci(()=>import("./webworkerAll-CU4P2OK3.js"),__vite__mapDeps([1,2]))}};class ut{constructor(t,e,i){this._x=e||0,this._y=i||0,this._observer=t}clone(t){return new ut(t??this._observer,this._x,this._y)}set(t=0,e=t){return(this._x!==t||this._y!==e)&&(this._x=t,this._y=e,this._observer._onUpdate(this)),this}copyFrom(t){return(this._x!==t.x||this._y!==t.y)&&(this._x=t.x,this._y=t.y,this._observer._onUpdate(this)),this}copyTo(t){return t.set(this._x,this._y),t}equals(t){return t.x===this._x&&t.y===this._y}toString(){return`[pixi.js/math:ObservablePoint x=0 y=0 scope=${this._observer}]`}get x(){return this._x}set x(t){this._x!==t&&(this._x=t,this._observer._onUpdate(this))}get y(){return this._y}set y(t){this._y!==t&&(this._y=t,this._observer._onUpdate(this))}}function vs(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var Jn={exports:{}};(function(s){var t=Object.prototype.hasOwnProperty,e="~";function i(){}Object.create&&(i.prototype=Object.create(null),new i().__proto__||(e=!1));function n(h,c,l){this.fn=h,this.context=c,this.once=l||!1}function r(h,c,l,d,u){if(typeof l!="function")throw new TypeError("The listener must be a function");var g=new n(l,d||h,u),m=e?e+c:c;return h._events[m]?h._events[m].fn?h._events[m]=[h._events[m],g]:h._events[m].push(g):(h._events[m]=g,h._eventsCount++),h}function a(h,c){--h._eventsCount===0?h._events=new i:delete h._events[c]}function o(){this._events=new i,this._eventsCount=0}o.prototype.eventNames=function(){var c=[],l,d;if(this._eventsCount===0)return c;for(d in l=this._events)t.call(l,d)&&c.push(e?d.slice(1):d);return Object.getOwnPropertySymbols?c.concat(Object.getOwnPropertySymbols(l)):c},o.prototype.listeners=function(c){var l=e?e+c:c,d=this._events[l];if(!d)return[];if(d.fn)return[d.fn];for(var u=0,g=d.length,m=new Array(g);uKt[s],uY:s=>Zt[s],vX:s=>Qt[s],vY:s=>Jt[s],inv:s=>s&8?s&15:-s&7,add:(s,t)=>ts[s][t],sub:(s,t)=>ts[s][Y.inv(t)],rotate180:s=>s^4,isVertical:s=>(s&3)===2,byDirection:(s,t)=>Math.abs(s)*2<=Math.abs(t)?t>=0?Y.S:Y.N:Math.abs(t)*2<=Math.abs(s)?s>0?Y.E:Y.W:t>0?s>0?Y.SE:Y.SW:s>0?Y.NE:Y.NW,matrixAppendRotationInv:(s,t,e=0,i=0)=>{const n=tr[Y.inv(t)];n.tx=e,n.ty=i,s.append(n)}},Ze=[new ht,new ht,new ht,new ht];class E{constructor(t=0,e=0,i=0,n=0){this.type="rectangle",this.x=Number(t),this.y=Number(e),this.width=Number(i),this.height=Number(n)}get left(){return this.x}get right(){return this.x+this.width}get top(){return this.y}get bottom(){return this.y+this.height}isEmpty(){return this.left===this.right||this.top===this.bottom}static get EMPTY(){return new E(0,0,0,0)}clone(){return new E(this.x,this.y,this.width,this.height)}copyFromBounds(t){return this.x=t.minX,this.y=t.minY,this.width=t.maxX-t.minX,this.height=t.maxY-t.minY,this}copyFrom(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this}copyTo(t){return t.copyFrom(this),t}contains(t,e){return this.width<=0||this.height<=0?!1:t>=this.x&&t=this.y&&e=h&&t<=c&&e>=l&&e<=d&&!(t>u&&tm&&et.right?t.right:this.right)<=G)return!1;const C=this.yt.bottom?t.bottom:this.bottom)>C}const i=this.left,n=this.right,r=this.top,a=this.bottom;if(n<=i||a<=r)return!1;const o=Ze[0].set(t.left,t.top),h=Ze[1].set(t.left,t.bottom),c=Ze[2].set(t.right,t.top),l=Ze[3].set(t.right,t.bottom);if(c.x<=o.x||h.y<=o.y)return!1;const d=Math.sign(e.a*e.d-e.b*e.c);if(d===0||(e.apply(o,o),e.apply(h,h),e.apply(c,c),e.apply(l,l),Math.max(o.x,h.x,c.x,l.x)<=i||Math.min(o.x,h.x,c.x,l.x)>=n||Math.max(o.y,h.y,c.y,l.y)<=r||Math.min(o.y,h.y,c.y,l.y)>=a))return!1;const u=d*(h.y-o.y),g=d*(o.x-h.x),m=u*i+g*r,y=u*n+g*r,x=u*i+g*a,_=u*n+g*a;if(Math.max(m,y,x,_)<=u*o.x+g*o.y||Math.min(m,y,x,_)>=u*l.x+g*l.y)return!1;const w=d*(o.y-c.y),b=d*(c.x-o.x),S=w*i+b*r,T=w*n+b*r,F=w*i+b*a,P=w*n+b*a;return!(Math.max(S,T,F,P)<=w*o.x+b*o.y||Math.min(S,T,F,P)>=w*l.x+b*l.y)}pad(t=0,e=t){return this.x-=t,this.y-=e,this.width+=t*2,this.height+=e*2,this}fit(t){const e=Math.max(this.x,t.x),i=Math.min(this.x+this.width,t.x+t.width),n=Math.max(this.y,t.y),r=Math.min(this.y+this.height,t.y+t.height);return this.x=e,this.width=Math.max(i-e,0),this.y=n,this.height=Math.max(r-n,0),this}ceil(t=1,e=.001){const i=Math.ceil((this.x+this.width-e)*t)/t,n=Math.ceil((this.y+this.height-e)*t)/t;return this.x=Math.floor((this.x+e)*t)/t,this.y=Math.floor((this.y+e)*t)/t,this.width=i-this.x,this.height=n-this.y,this}enlarge(t){const e=Math.min(this.x,t.x),i=Math.max(this.x+this.width,t.x+t.width),n=Math.min(this.y,t.y),r=Math.max(this.y+this.height,t.y+t.height);return this.x=e,this.width=i-e,this.y=n,this.height=r-n,this}getBounds(t){return t=t||new E,t.copyFrom(this),t}toString(){return`[pixi.js/math:Rectangle x=${this.x} y=${this.y} width=${this.width} height=${this.height}]`}}const Mi={default:-1};function nt(s="default"){return Mi[s]===void 0&&(Mi[s]=-1),++Mi[s]}const qs={},O="8.0.0",Ya="8.3.4";function U(s,t,e=3){if(qs[t])return;let i=new Error().stack;typeof i>"u"?console.warn("PixiJS Deprecation Warning: ",`${t} -Deprecated since v${s}`):(i=i.split(` -`).splice(e).join(` -`),console.groupCollapsed?(console.groupCollapsed("%cPixiJS Deprecation Warning: %c%s","color:#614108;background:#fffbe6","font-weight:normal;color:#614108;background:#fffbe6",`${t} -Deprecated since v${s}`),console.warn(i),console.groupEnd()):(console.warn("PixiJS Deprecation Warning: ",`${t} -Deprecated since v${s}`),console.warn(i))),qs[t]=!0}const er=()=>{};function Ks(s){return s+=s===0?1:0,--s,s|=s>>>1,s|=s>>>2,s|=s>>>4,s|=s>>>8,s|=s>>>16,s+1}function Zs(s){return!(s&s-1)&&!!s}function ja(s){const t={};for(const e in s)s[e]!==void 0&&(t[e]=s[e]);return t}const Qs=Object.create(null);function qa(s){const t=Qs[s];return t===void 0&&(Qs[s]=nt("resource")),t}const ir=class sr extends ft{constructor(t={}){super(),this._resourceType="textureSampler",this._touched=0,this._maxAnisotropy=1,this.destroyed=!1,t={...sr.defaultOptions,...t},this.addressMode=t.addressMode,this.addressModeU=t.addressModeU??this.addressModeU,this.addressModeV=t.addressModeV??this.addressModeV,this.addressModeW=t.addressModeW??this.addressModeW,this.scaleMode=t.scaleMode,this.magFilter=t.magFilter??this.magFilter,this.minFilter=t.minFilter??this.minFilter,this.mipmapFilter=t.mipmapFilter??this.mipmapFilter,this.lodMinClamp=t.lodMinClamp,this.lodMaxClamp=t.lodMaxClamp,this.compare=t.compare,this.maxAnisotropy=t.maxAnisotropy??1}set addressMode(t){this.addressModeU=t,this.addressModeV=t,this.addressModeW=t}get addressMode(){return this.addressModeU}set wrapMode(t){U(O,"TextureStyle.wrapMode is now TextureStyle.addressMode"),this.addressMode=t}get wrapMode(){return this.addressMode}set scaleMode(t){this.magFilter=t,this.minFilter=t,this.mipmapFilter=t}get scaleMode(){return this.magFilter}set maxAnisotropy(t){this._maxAnisotropy=Math.min(t,16),this._maxAnisotropy>1&&(this.scaleMode="linear")}get maxAnisotropy(){return this._maxAnisotropy}get _resourceId(){return this._sharedResourceId||this._generateResourceId()}update(){this.emit("change",this),this._sharedResourceId=null}_generateResourceId(){const t=`${this.addressModeU}-${this.addressModeV}-${this.addressModeW}-${this.magFilter}-${this.minFilter}-${this.mipmapFilter}-${this.lodMinClamp}-${this.lodMaxClamp}-${this.compare}-${this._maxAnisotropy}`;return this._sharedResourceId=qa(t),this._resourceId}destroy(){this.destroyed=!0,this.emit("destroy",this),this.emit("change",this),this.removeAllListeners()}};ir.defaultOptions={addressMode:"clamp-to-edge",scaleMode:"linear"};let Ka=ir;const nr=class rr extends ft{constructor(t={}){super(),this.options=t,this.uid=nt("textureSource"),this._resourceType="textureSource",this._resourceId=nt("resource"),this.uploadMethodId="unknown",this._resolution=1,this.pixelWidth=1,this.pixelHeight=1,this.width=1,this.height=1,this.sampleCount=1,this.mipLevelCount=1,this.autoGenerateMipmaps=!1,this.format="rgba8unorm",this.dimension="2d",this.antialias=!1,this._touched=0,this._batchTick=-1,this._textureBindLocation=-1,t={...rr.defaultOptions,...t},this.label=t.label??"",this.resource=t.resource,this.autoGarbageCollect=t.autoGarbageCollect,this._resolution=t.resolution,t.width?this.pixelWidth=t.width*this._resolution:this.pixelWidth=this.resource?this.resourceWidth??1:1,t.height?this.pixelHeight=t.height*this._resolution:this.pixelHeight=this.resource?this.resourceHeight??1:1,this.width=this.pixelWidth/this._resolution,this.height=this.pixelHeight/this._resolution,this.format=t.format,this.dimension=t.dimensions,this.mipLevelCount=t.mipLevelCount,this.autoGenerateMipmaps=t.autoGenerateMipmaps,this.sampleCount=t.sampleCount,this.antialias=t.antialias,this.alphaMode=t.alphaMode,this.style=new Ka(ja(t)),this.destroyed=!1,this._refreshPOT()}get source(){return this}get style(){return this._style}set style(t){var e,i;this.style!==t&&((e=this._style)==null||e.off("change",this._onStyleChange,this),this._style=t,(i=this._style)==null||i.on("change",this._onStyleChange,this),this._onStyleChange())}get addressMode(){return this._style.addressMode}set addressMode(t){this._style.addressMode=t}get repeatMode(){return this._style.addressMode}set repeatMode(t){this._style.addressMode=t}get magFilter(){return this._style.magFilter}set magFilter(t){this._style.magFilter=t}get minFilter(){return this._style.minFilter}set minFilter(t){this._style.minFilter=t}get mipmapFilter(){return this._style.mipmapFilter}set mipmapFilter(t){this._style.mipmapFilter=t}get lodMinClamp(){return this._style.lodMinClamp}set lodMinClamp(t){this._style.lodMinClamp=t}get lodMaxClamp(){return this._style.lodMaxClamp}set lodMaxClamp(t){this._style.lodMaxClamp=t}_onStyleChange(){this.emit("styleChange",this)}update(){if(this.resource){const t=this._resolution;if(this.resize(this.resourceWidth/t,this.resourceHeight/t))return}this.emit("update",this)}destroy(){this.destroyed=!0,this.emit("destroy",this),this.emit("change",this),this._style&&(this._style.destroy(),this._style=null),this.uploadMethodId=null,this.resource=null,this.removeAllListeners()}unload(){this._resourceId=nt("resource"),this.emit("change",this),this.emit("unload",this)}get resourceWidth(){const{resource:t}=this;return t.naturalWidth||t.videoWidth||t.displayWidth||t.width}get resourceHeight(){const{resource:t}=this;return t.naturalHeight||t.videoHeight||t.displayHeight||t.height}get resolution(){return this._resolution}set resolution(t){this._resolution!==t&&(this._resolution=t,this.width=this.pixelWidth/t,this.height=this.pixelHeight/t)}resize(t,e,i){i=i||this._resolution,t=t||this.width,e=e||this.height;const n=Math.round(t*i),r=Math.round(e*i);return this.width=n/i,this.height=r/i,this._resolution=i,this.pixelWidth===n&&this.pixelHeight===r?!1:(this._refreshPOT(),this.pixelWidth=n,this.pixelHeight=r,this.emit("resize",this),this._resourceId=nt("resource"),this.emit("change",this),!0)}updateMipmaps(){this.autoGenerateMipmaps&&this.mipLevelCount>1&&this.emit("updateMipmaps",this)}set wrapMode(t){this._style.wrapMode=t}get wrapMode(){return this._style.wrapMode}set scaleMode(t){this._style.scaleMode=t}get scaleMode(){return this._style.scaleMode}_refreshPOT(){this.isPowerOfTwo=Zs(this.pixelWidth)&&Zs(this.pixelHeight)}static test(t){throw new Error("Unimplemented")}};nr.defaultOptions={resolution:1,format:"bgra8unorm",alphaMode:"premultiply-alpha-on-upload",dimensions:"2d",mipLevelCount:1,autoGenerateMipmaps:!1,sampleCount:1,antialias:!1,autoGarbageCollect:!1};let zt=nr;class Cs extends zt{constructor(t){const e=t.resource||new Float32Array(t.width*t.height*4);let i=t.format;i||(e instanceof Float32Array?i="rgba32float":e instanceof Int32Array||e instanceof Uint32Array?i="rgba32uint":e instanceof Int16Array||e instanceof Uint16Array?i="rgba16uint":(e instanceof Int8Array,i="bgra8unorm")),super({...t,resource:e,format:i}),this.uploadMethodId="buffer"}static test(t){return t instanceof Int8Array||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Int16Array||t instanceof Uint16Array||t instanceof Int32Array||t instanceof Uint32Array||t instanceof Float32Array}}Cs.extension=k.TextureSource;const Js=new H;class Za{constructor(t,e){this.mapCoord=new H,this.uClampFrame=new Float32Array(4),this.uClampOffset=new Float32Array(2),this._textureID=-1,this._updateID=0,this.clampOffset=0,typeof e>"u"?this.clampMargin=t.width<10?0:.5:this.clampMargin=e,this.isSimple=!1,this.texture=t}get texture(){return this._texture}set texture(t){var e;this.texture!==t&&((e=this._texture)==null||e.removeListener("update",this.update,this),this._texture=t,this._texture.addListener("update",this.update,this),this.update())}multiplyUvs(t,e){e===void 0&&(e=t);const i=this.mapCoord;for(let n=0;nthis.maxX||this.minY>this.maxY}get rectangle(){this._rectangle||(this._rectangle=new E);const t=this._rectangle;return this.minX>this.maxX||this.minY>this.maxY?(t.x=0,t.y=0,t.width=0,t.height=0):t.copyFromBounds(this),t}clear(){return this.minX=1/0,this.minY=1/0,this.maxX=-1/0,this.maxY=-1/0,this.matrix=tn,this}set(t,e,i,n){this.minX=t,this.minY=e,this.maxX=i,this.maxY=n}addFrame(t,e,i,n,r){r||(r=this.matrix);const a=r.a,o=r.b,h=r.c,c=r.d,l=r.tx,d=r.ty;let u=this.minX,g=this.minY,m=this.maxX,y=this.maxY,x=a*t+h*e+l,_=o*t+c*e+d;xm&&(m=x),_>y&&(y=_),x=a*i+h*e+l,_=o*i+c*e+d,xm&&(m=x),_>y&&(y=_),x=a*t+h*n+l,_=o*t+c*n+d,xm&&(m=x),_>y&&(y=_),x=a*i+h*n+l,_=o*i+c*n+d,xm&&(m=x),_>y&&(y=_),this.minX=u,this.minY=g,this.maxX=m,this.maxY=y}addRect(t,e){this.addFrame(t.x,t.y,t.x+t.width,t.y+t.height,e)}addBounds(t,e){this.addFrame(t.minX,t.minY,t.maxX,t.maxY,e)}addBoundsMask(t){this.minX=this.minX>t.minX?this.minX:t.minX,this.minY=this.minY>t.minY?this.minY:t.minY,this.maxX=this.maxXthis.maxX?u:this.maxX,this.maxY=g>this.maxY?g:this.maxY,u=a*e+h*r+l,g=o*e+c*r+d,this.minX=uthis.maxX?u:this.maxX,this.maxY=g>this.maxY?g:this.maxY,u=a*n+h*r+l,g=o*n+c*r+d,this.minX=uthis.maxX?u:this.maxX,this.maxY=g>this.maxY?g:this.maxY}fit(t){return this.minXt.right&&(this.maxX=t.right),this.minYt.bottom&&(this.maxY=t.bottom),this}fitBounds(t,e,i,n){return this.minXe&&(this.maxX=e),this.minYn&&(this.maxY=n),this}pad(t,e=t){return this.minX-=t,this.maxX+=t,this.minY-=e,this.maxY+=e,this}ceil(){return this.minX=Math.floor(this.minX),this.minY=Math.floor(this.minY),this.maxX=Math.ceil(this.maxX),this.maxY=Math.ceil(this.maxY),this}clone(){return new Gt(this.minX,this.minY,this.maxX,this.maxY)}scale(t,e=t){return this.minX*=t,this.minY*=e,this.maxX*=t,this.maxY*=e,this}get x(){return this.minX}set x(t){const e=this.maxX-this.minX;this.minX=t,this.maxX=t+e}get y(){return this.minY}set y(t){const e=this.maxY-this.minY;this.minY=t,this.maxY=t+e}get width(){return this.maxX-this.minX}set width(t){this.maxX=this.minX+t}get height(){return this.maxY-this.minY}set height(t){this.maxY=this.minY+t}get left(){return this.minX}get right(){return this.maxX}get top(){return this.minY}get bottom(){return this.maxY}get isPositive(){return this.maxX-this.minX>0&&this.maxY-this.minY>0}get isValid(){return this.minX+this.minY!==1/0}addVertexData(t,e,i,n){let r=this.minX,a=this.minY,o=this.maxX,h=this.maxY;n||(n=this.matrix);const c=n.a,l=n.b,d=n.c,u=n.d,g=n.tx,m=n.ty;for(let y=e;yo?w:o,h=b>h?b:h}this.minX=r,this.minY=a,this.maxX=o,this.maxY=h}containsPoint(t,e){return this.minX<=t&&this.minY<=e&&this.maxX>=t&&this.maxY>=e}toString(){return`[pixi.js:Bounds minX=${this.minX} minY=${this.minY} maxX=${this.maxX} maxY=${this.maxY} width=${this.width} height=${this.height}]`}}var Ja={grad:.9,turn:360,rad:360/(2*Math.PI)},Bt=function(s){return typeof s=="string"?s.length>0:typeof s=="number"},at=function(s,t,e){return t===void 0&&(t=0),e===void 0&&(e=Math.pow(10,t)),Math.round(e*s)/e+0},xt=function(s,t,e){return t===void 0&&(t=0),e===void 0&&(e=1),s>e?e:s>t?s:t},ar=function(s){return(s=isFinite(s)?s%360:0)>0?s:s+360},en=function(s){return{r:xt(s.r,0,255),g:xt(s.g,0,255),b:xt(s.b,0,255),a:xt(s.a)}},Pi=function(s){return{r:at(s.r),g:at(s.g),b:at(s.b),a:at(s.a,3)}},to=/^#([0-9a-f]{3,8})$/i,Qe=function(s){var t=s.toString(16);return t.length<2?"0"+t:t},or=function(s){var t=s.r,e=s.g,i=s.b,n=s.a,r=Math.max(t,e,i),a=r-Math.min(t,e,i),o=a?r===t?(e-i)/a:r===e?2+(i-t)/a:4+(t-e)/a:0;return{h:60*(o<0?o+6:o),s:r?a/r*100:0,v:r/255*100,a:n}},hr=function(s){var t=s.h,e=s.s,i=s.v,n=s.a;t=t/360*6,e/=100,i/=100;var r=Math.floor(t),a=i*(1-e),o=i*(1-(t-r)*e),h=i*(1-(1-t+r)*e),c=r%6;return{r:255*[i,o,a,a,h,i][c],g:255*[h,i,i,o,a,a][c],b:255*[a,a,h,i,i,o][c],a:n}},sn=function(s){return{h:ar(s.h),s:xt(s.s,0,100),l:xt(s.l,0,100),a:xt(s.a)}},nn=function(s){return{h:at(s.h),s:at(s.s),l:at(s.l),a:at(s.a,3)}},rn=function(s){return hr((e=(t=s).s,{h:t.h,s:(e*=((i=t.l)<50?i:100-i)/100)>0?2*e/(i+e)*100:0,v:i+e,a:t.a}));var t,e,i},Fe=function(s){return{h:(t=or(s)).h,s:(n=(200-(e=t.s))*(i=t.v)/100)>0&&n<200?e*i/100/(n<=100?n:200-n)*100:0,l:n/2,a:t.a};var t,e,i,n},eo=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s*,\s*([+-]?\d*\.?\d+)%\s*,\s*([+-]?\d*\.?\d+)%\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,io=/^hsla?\(\s*([+-]?\d*\.?\d+)(deg|rad|grad|turn)?\s+([+-]?\d*\.?\d+)%\s+([+-]?\d*\.?\d+)%\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,so=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*,\s*([+-]?\d*\.?\d+)(%)?\s*(?:,\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,no=/^rgba?\(\s*([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s+([+-]?\d*\.?\d+)(%)?\s*(?:\/\s*([+-]?\d*\.?\d+)(%)?\s*)?\)$/i,es={string:[[function(s){var t=to.exec(s);return t?(s=t[1]).length<=4?{r:parseInt(s[0]+s[0],16),g:parseInt(s[1]+s[1],16),b:parseInt(s[2]+s[2],16),a:s.length===4?at(parseInt(s[3]+s[3],16)/255,2):1}:s.length===6||s.length===8?{r:parseInt(s.substr(0,2),16),g:parseInt(s.substr(2,2),16),b:parseInt(s.substr(4,2),16),a:s.length===8?at(parseInt(s.substr(6,2),16)/255,2):1}:null:null},"hex"],[function(s){var t=so.exec(s)||no.exec(s);return t?t[2]!==t[4]||t[4]!==t[6]?null:en({r:Number(t[1])/(t[2]?100/255:1),g:Number(t[3])/(t[4]?100/255:1),b:Number(t[5])/(t[6]?100/255:1),a:t[7]===void 0?1:Number(t[7])/(t[8]?100:1)}):null},"rgb"],[function(s){var t=eo.exec(s)||io.exec(s);if(!t)return null;var e,i,n=sn({h:(e=t[1],i=t[2],i===void 0&&(i="deg"),Number(e)*(Ja[i]||1)),s:Number(t[3]),l:Number(t[4]),a:t[5]===void 0?1:Number(t[5])/(t[6]?100:1)});return rn(n)},"hsl"]],object:[[function(s){var t=s.r,e=s.g,i=s.b,n=s.a,r=n===void 0?1:n;return Bt(t)&&Bt(e)&&Bt(i)?en({r:Number(t),g:Number(e),b:Number(i),a:Number(r)}):null},"rgb"],[function(s){var t=s.h,e=s.s,i=s.l,n=s.a,r=n===void 0?1:n;if(!Bt(t)||!Bt(e)||!Bt(i))return null;var a=sn({h:Number(t),s:Number(e),l:Number(i),a:Number(r)});return rn(a)},"hsl"],[function(s){var t=s.h,e=s.s,i=s.v,n=s.a,r=n===void 0?1:n;if(!Bt(t)||!Bt(e)||!Bt(i))return null;var a=function(o){return{h:ar(o.h),s:xt(o.s,0,100),v:xt(o.v,0,100),a:xt(o.a)}}({h:Number(t),s:Number(e),v:Number(i),a:Number(r)});return hr(a)},"hsv"]]},an=function(s,t){for(var e=0;e=.5},s.prototype.toHex=function(){return t=Pi(this.rgba),e=t.r,i=t.g,n=t.b,a=(r=t.a)<1?Qe(at(255*r)):"","#"+Qe(e)+Qe(i)+Qe(n)+a;var t,e,i,n,r,a},s.prototype.toRgb=function(){return Pi(this.rgba)},s.prototype.toRgbString=function(){return t=Pi(this.rgba),e=t.r,i=t.g,n=t.b,(r=t.a)<1?"rgba("+e+", "+i+", "+n+", "+r+")":"rgb("+e+", "+i+", "+n+")";var t,e,i,n,r},s.prototype.toHsl=function(){return nn(Fe(this.rgba))},s.prototype.toHslString=function(){return t=nn(Fe(this.rgba)),e=t.h,i=t.s,n=t.l,(r=t.a)<1?"hsla("+e+", "+i+"%, "+n+"%, "+r+")":"hsl("+e+", "+i+"%, "+n+"%)";var t,e,i,n,r},s.prototype.toHsv=function(){return t=or(this.rgba),{h:at(t.h),s:at(t.s),v:at(t.v),a:at(t.a,3)};var t},s.prototype.invert=function(){return Tt({r:255-(t=this.rgba).r,g:255-t.g,b:255-t.b,a:t.a});var t},s.prototype.saturate=function(t){return t===void 0&&(t=.1),Tt(ki(this.rgba,t))},s.prototype.desaturate=function(t){return t===void 0&&(t=.1),Tt(ki(this.rgba,-t))},s.prototype.grayscale=function(){return Tt(ki(this.rgba,-1))},s.prototype.lighten=function(t){return t===void 0&&(t=.1),Tt(on(this.rgba,t))},s.prototype.darken=function(t){return t===void 0&&(t=.1),Tt(on(this.rgba,-t))},s.prototype.rotate=function(t){return t===void 0&&(t=15),this.hue(this.hue()+t)},s.prototype.alpha=function(t){return typeof t=="number"?Tt({r:(e=this.rgba).r,g:e.g,b:e.b,a:t}):at(this.rgba.a,3);var e},s.prototype.hue=function(t){var e=Fe(this.rgba);return typeof t=="number"?Tt({h:t,s:e.s,l:e.l,a:e.a}):at(e.h)},s.prototype.isEqual=function(t){return this.toHex()===Tt(t).toHex()},s}(),Tt=function(s){return s instanceof is?s:new is(s)},hn=[],ao=function(s){s.forEach(function(t){hn.indexOf(t)<0&&(t(is,es),hn.push(t))})};function oo(s,t){var e={white:"#ffffff",bisque:"#ffe4c4",blue:"#0000ff",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",antiquewhite:"#faebd7",aqua:"#00ffff",azure:"#f0ffff",whitesmoke:"#f5f5f5",papayawhip:"#ffefd5",plum:"#dda0dd",blanchedalmond:"#ffebcd",black:"#000000",gold:"#ffd700",goldenrod:"#daa520",gainsboro:"#dcdcdc",cornsilk:"#fff8dc",cornflowerblue:"#6495ed",burlywood:"#deb887",aquamarine:"#7fffd4",beige:"#f5f5dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkkhaki:"#bdb76b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",peachpuff:"#ffdab9",darkmagenta:"#8b008b",darkred:"#8b0000",darkorchid:"#9932cc",darkorange:"#ff8c00",darkslateblue:"#483d8b",gray:"#808080",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",deeppink:"#ff1493",deepskyblue:"#00bfff",wheat:"#f5deb3",firebrick:"#b22222",floralwhite:"#fffaf0",ghostwhite:"#f8f8ff",darkviolet:"#9400d3",magenta:"#ff00ff",green:"#008000",dodgerblue:"#1e90ff",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",blueviolet:"#8a2be2",forestgreen:"#228b22",lawngreen:"#7cfc00",indianred:"#cd5c5c",indigo:"#4b0082",fuchsia:"#ff00ff",brown:"#a52a2a",maroon:"#800000",mediumblue:"#0000cd",lightcoral:"#f08080",darkturquoise:"#00ced1",lightcyan:"#e0ffff",ivory:"#fffff0",lightyellow:"#ffffe0",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",linen:"#faf0e6",mediumaquamarine:"#66cdaa",lemonchiffon:"#fffacd",lime:"#00ff00",khaki:"#f0e68c",mediumseagreen:"#3cb371",limegreen:"#32cd32",mediumspringgreen:"#00fa9a",lightskyblue:"#87cefa",lightblue:"#add8e6",midnightblue:"#191970",lightpink:"#ffb6c1",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",mintcream:"#f5fffa",lightslategray:"#778899",lightslategrey:"#778899",navajowhite:"#ffdead",navy:"#000080",mediumvioletred:"#c71585",powderblue:"#b0e0e6",palegoldenrod:"#eee8aa",oldlace:"#fdf5e6",paleturquoise:"#afeeee",mediumturquoise:"#48d1cc",mediumorchid:"#ba55d3",rebeccapurple:"#663399",lightsteelblue:"#b0c4de",mediumslateblue:"#7b68ee",thistle:"#d8bfd8",tan:"#d2b48c",orchid:"#da70d6",mediumpurple:"#9370db",purple:"#800080",pink:"#ffc0cb",skyblue:"#87ceeb",springgreen:"#00ff7f",palegreen:"#98fb98",red:"#ff0000",yellow:"#ffff00",slateblue:"#6a5acd",lavenderblush:"#fff0f5",peru:"#cd853f",palevioletred:"#db7093",violet:"#ee82ee",teal:"#008080",slategray:"#708090",slategrey:"#708090",aliceblue:"#f0f8ff",darkseagreen:"#8fbc8f",darkolivegreen:"#556b2f",greenyellow:"#adff2f",seagreen:"#2e8b57",seashell:"#fff5ee",tomato:"#ff6347",silver:"#c0c0c0",sienna:"#a0522d",lavender:"#e6e6fa",lightgreen:"#90ee90",orange:"#ffa500",orangered:"#ff4500",steelblue:"#4682b4",royalblue:"#4169e1",turquoise:"#40e0d0",yellowgreen:"#9acd32",salmon:"#fa8072",saddlebrown:"#8b4513",sandybrown:"#f4a460",rosybrown:"#bc8f8f",darksalmon:"#e9967a",lightgoldenrodyellow:"#fafad2",snow:"#fffafa",lightgrey:"#d3d3d3",lightgray:"#d3d3d3",dimgray:"#696969",dimgrey:"#696969",olivedrab:"#6b8e23",olive:"#808000"},i={};for(var n in e)i[e[n]]=n;var r={};s.prototype.toName=function(a){if(!(this.rgba.a||this.rgba.r||this.rgba.g||this.rgba.b))return"transparent";var o,h,c=i[this.toHex()];if(c)return c;if(a!=null&&a.closest){var l=this.toRgb(),d=1/0,u="black";if(!r.length)for(var g in e)r[g]=new s(e[g]).toRgb();for(var m in e){var y=(o=l,h=r[m],Math.pow(o.r-h.r,2)+Math.pow(o.g-h.g,2)+Math.pow(o.b-h.b,2));yr===e[a]);if(t!==null&&e!==null){const r=Object.keys(t),a=Object.keys(e);return r.length!==a.length?!1:r.every(o=>t[o]===e[o])}return t===e}toRgba(){const[t,e,i,n]=this._components;return{r:t,g:e,b:i,a:n}}toRgb(){const[t,e,i]=this._components;return{r:t,g:e,b:i}}toRgbaString(){const[t,e,i]=this.toUint8RgbArray();return`rgba(${t},${e},${i},${this.alpha})`}toUint8RgbArray(t){const[e,i,n]=this._components;return this._arrayRgb||(this._arrayRgb=[]),t=t||this._arrayRgb,t[0]=Math.round(e*255),t[1]=Math.round(i*255),t[2]=Math.round(n*255),t}toArray(t){this._arrayRgba||(this._arrayRgba=[]),t=t||this._arrayRgba;const[e,i,n,r]=this._components;return t[0]=e,t[1]=i,t[2]=n,t[3]=r,t}toRgbArray(t){this._arrayRgb||(this._arrayRgb=[]),t=t||this._arrayRgb;const[e,i,n]=this._components;return t[0]=e,t[1]=i,t[2]=n,t}toNumber(){return this._int}toBgrNumber(){const[t,e,i]=this.toUint8RgbArray();return(i<<16)+(e<<8)+t}toLittleEndianNumber(){const t=this._int;return(t>>16)+(t&65280)+((t&255)<<16)}multiply(t){const[e,i,n,r]=Ie._temp.setValue(t)._components;return this._components[0]*=e,this._components[1]*=i,this._components[2]*=n,this._components[3]*=r,this._refreshInt(),this._value=null,this}premultiply(t,e=!0){return e&&(this._components[0]*=t,this._components[1]*=t,this._components[2]*=t),this._components[3]=t,this._refreshInt(),this._value=null,this}toPremultiplied(t,e=!0){if(t===1)return(255<<24)+this._int;if(t===0)return e?0:this._int;let i=this._int>>16&255,n=this._int>>8&255,r=this._int&255;return e&&(i=i*t+.5|0,n=n*t+.5|0,r=r*t+.5|0),(t*255<<24)+(i<<16)+(n<<8)+r}toHex(){const t=this._int.toString(16);return`#${"000000".substring(0,6-t.length)+t}`}toHexa(){const e=Math.round(this._components[3]*255).toString(16);return this.toHex()+"00".substring(0,2-e.length)+e}setAlpha(t){return this._components[3]=this._clamp(t),this}_normalize(t){let e,i,n,r;if((typeof t=="number"||t instanceof Number)&&t>=0&&t<=16777215){const a=t;e=(a>>16&255)/255,i=(a>>8&255)/255,n=(a&255)/255,r=1}else if((Array.isArray(t)||t instanceof Float32Array)&&t.length>=3&&t.length<=4)t=this._clamp(t),[e,i,n,r=1]=t;else if((t instanceof Uint8Array||t instanceof Uint8ClampedArray)&&t.length>=3&&t.length<=4)t=this._clamp(t,0,255),[e,i,n,r=255]=t,e/=255,i/=255,n/=255,r/=255;else if(typeof t=="string"||typeof t=="object"){if(typeof t=="string"){const o=Ie.HEX_PATTERN.exec(t);o&&(t=`#${o[2]}`)}const a=Tt(t);a.isValid()&&({r:e,g:i,b:n,a:r}=a.rgba,e/=255,i/=255,n/=255)}if(e!==void 0)this._components[0]=e,this._components[1]=i,this._components[2]=n,this._components[3]=r,this._refreshInt();else throw new Error(`Unable to convert color ${t}`)}_refreshInt(){this._clamp(this._components);const[t,e,i]=this._components;this._int=(t*255<<16)+(e*255<<8)+(i*255|0)}_clamp(t,e=0,i=1){return typeof t=="number"?Math.min(Math.max(t,e),i):(t.forEach((n,r)=>{t[r]=Math.min(Math.max(n,e),i)}),t)}static isColorLike(t){return typeof t=="number"||typeof t=="string"||t instanceof Number||t instanceof Ie||Array.isArray(t)||t instanceof Uint8Array||t instanceof Uint8ClampedArray||t instanceof Float32Array||t.r!==void 0&&t.g!==void 0&&t.b!==void 0||t.r!==void 0&&t.g!==void 0&&t.b!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0||t.h!==void 0&&t.s!==void 0&&t.l!==void 0&&t.a!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0||t.h!==void 0&&t.s!==void 0&&t.v!==void 0&&t.a!==void 0}};ue.shared=new ue;ue._temp=new ue;ue.HEX_PATTERN=/^(#|0x)?(([a-f0-9]{3}){1,2}([a-f0-9]{2})?)$/i;let Z=ue;const ho={cullArea:null,cullable:!1,cullableChildren:!0};class Ts{constructor(t,e){this._pool=[],this._count=0,this._index=0,this._classType=t,e&&this.prepopulate(e)}prepopulate(t){for(let e=0;e0?e=this._pool[--this._index]:e=new this._classType,(i=e.init)==null||i.call(e,t),e}return(t){var e;(e=t.reset)==null||e.call(t),this._pool[this._index++]=t}get totalSize(){return this._count}get totalFree(){return this._index}get totalUsed(){return this._count-this._index}clear(){this._pool.length=0,this._index=0}}class lo{constructor(){this._poolsByClass=new Map}prepopulate(t,e){this.getPool(t).prepopulate(e)}get(t,e){return this.getPool(t).get(e)}return(t){this.getPool(t.constructor).return(t)}getPool(t){return this._poolsByClass.has(t)||this._poolsByClass.set(t,new Ts(t)),this._poolsByClass.get(t)}stats(){const t={};return this._poolsByClass.forEach(e=>{const i=t[e._classType.name]?e._classType.name+e._classType.ID:e._classType.name;t[i]={free:e.totalFree,used:e.totalUsed,size:e.totalSize}}),t}}const Lt=new lo;function co(s,t,e){const i=s.length;let n;if(t>=i||e===0)return;e=t+e>i?i-t:e;const r=i-e;for(n=t;n0&&i<=e){for(let a=e-1;a>=s;a--){const o=this.children[a];o&&(n.push(o),o.parent=null)}co(this.children,s,e);const r=this.renderGroup||this.parentRenderGroup;r&&r.removeChildren(n);for(let a=0;a=this.children.length)throw new Error(`getChildAt: Index (${s}) does not exist.`);return this.children[s]},setChildIndex(s,t){if(t<0||t>=this.children.length)throw new Error(`The index ${t} supplied is out of bounds ${this.children.length}`);this.getChildIndex(s),this.addChildAt(s,t)},getChildIndex(s){const t=this.children.indexOf(s);if(t===-1)throw new Error("The supplied Container must be a child of the caller");return t},addChildAt(s,t){this.allowChildren||U(O,"addChildAt: Only Containers will be allowed to add children in v8.0.0");const{children:e}=this;if(t<0||t>e.length)throw new Error(`${s}addChildAt: The index ${t} supplied is out of bounds ${e.length}`);if(s.parent){const n=s.parent.children.indexOf(s);if(s.parent===this&&n===t)return s;n!==-1&&s.parent.children.splice(n,1)}t===e.length?e.push(s):e.splice(t,0,s),s.parent=this,s.didChange=!0,s.didViewUpdate=!1,s._updateFlags=15;const i=this.renderGroup||this.parentRenderGroup;return i&&i.addChild(s),this.sortableChildren&&(this.sortDirty=!0),this.emit("childAdded",s,this,t),s.emit("added",this),s},swapChildren(s,t){if(s===t)return;const e=this.getChildIndex(s),i=this.getChildIndex(t);this.children[e]=t,this.children[i]=s;const n=this.renderGroup||this.parentRenderGroup;n&&(n.structureDidChange=!0),this._didContainerChangeTick++},removeFromParent(){var s;(s=this.parent)==null||s.removeChild(this)},reparentChild(...s){return s.length===1?this.reparentChildAt(s[0],this.children.length):(s.forEach(t=>this.reparentChildAt(t,this.children.length)),s[0])},reparentChildAt(s,t){if(s.parent===this)return this.setChildIndex(s,t),s;const e=s.worldTransform.clone();s.removeFromParent(),this.addChildAt(s,t);const i=this.worldTransform.clone();return i.invert(),e.prepend(i),s.setFromMatrix(e),s}};class ln{constructor(){this.pipe="filter",this.priority=1}destroy(){for(let t=0;t{this.add({test:t.test,maskClass:t})}))}add(t){this._tests.push(t)}getMaskEffect(t){this._initialized||this.init();for(let e=0;ei.priority-n.priority);const e=this.renderGroup||this.parentRenderGroup;e&&(e.structureDidChange=!0),this._updateIsSimple()},removeEffect(s){const t=this.effects.indexOf(s);t!==-1&&(this.effects.splice(t,1),this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateIsSimple())},set mask(s){const t=this._maskEffect;(t==null?void 0:t.mask)!==s&&(t&&(this.removeEffect(t),ss.returnMaskEffect(t),this._maskEffect=null),s!=null&&(this._maskEffect=ss.getMaskEffect(s),this.addEffect(this._maskEffect)))},get mask(){var s;return(s=this._maskEffect)==null?void 0:s.mask},set filters(s){var r;!Array.isArray(s)&&s&&(s=[s]);const t=this._filterEffect||(this._filterEffect=new ln);s=s;const e=(s==null?void 0:s.length)>0,i=((r=t.filters)==null?void 0:r.length)>0,n=e!==i;s=Array.isArray(s)?s.slice(0):s,t.filters=Object.freeze(s),n&&(e?this.addEffect(t):(this.removeEffect(t),t.filters=s??null))},get filters(){var s;return(s=this._filterEffect)==null?void 0:s.filters},set filterArea(s){this._filterEffect||(this._filterEffect=new ln),this._filterEffect.filterArea=s},get filterArea(){var s;return(s=this._filterEffect)==null?void 0:s.filterArea}},go={label:null,get name(){return U(O,"Container.name property has been removed, use Container.label instead"),this.label},set name(s){U(O,"Container.name property has been removed, use Container.label instead"),this.label=s},getChildByName(s,t=!1){return this.getChildByLabel(s,t)},getChildByLabel(s,t=!1){const e=this.children;for(let i=0;i-1&&this.renderGroupChildren.splice(e,1),t.renderGroupParent=null}addChild(t){if(this.structureDidChange=!0,t.parentRenderGroup=this,t.updateTick=-1,t.parent===this.root?t.relativeRenderGroupDepth=1:t.relativeRenderGroupDepth=t.parent.relativeRenderGroupDepth+1,t.didChange=!0,this.onChildUpdate(t),t.renderGroup){this.addRenderGroupChild(t.renderGroup);return}t._onRender&&this.addOnRender(t);const e=t.children;for(let i=0;i0}addOnRender(t){this._onRenderContainers.push(t)}removeOnRender(t){this._onRenderContainers.splice(this._onRenderContainers.indexOf(t),1)}runOnRender(){for(let t=0;tthis.addChild(n)),(i=t.parent)==null||i.addChild(this)}static mixin(t){Object.defineProperties(J.prototype,Object.getOwnPropertyDescriptors(t))}set _didChangeId(t){this._didViewChangeTick=t>>12&4095,this._didContainerChangeTick=t&4095}get _didChangeId(){return this._didContainerChangeTick&4095|(this._didViewChangeTick&4095)<<12}addChild(...t){if(this.allowChildren||U(O,"addChild: Only Containers will be allowed to add children in v8.0.0"),t.length>1){for(let n=0;n1){for(let n=0;n-1&&(this._didViewChangeTick++,this.children.splice(i,1),this.renderGroup?this.renderGroup.removeChild(e):this.parentRenderGroup&&this.parentRenderGroup.removeChild(e),e.parent=null,this.emit("childRemoved",e,this,i),e.emit("removed",this)),e}_onUpdate(t){t&&t===this._skew&&this._updateSkew(),this._didContainerChangeTick++,!this.didChange&&(this.didChange=!0,this.parentRenderGroup&&this.parentRenderGroup.onChildUpdate(this))}set isRenderGroup(t){!!this.renderGroup!==t&&(t?this.enableRenderGroup():this.disableRenderGroup())}get isRenderGroup(){return!!this.renderGroup}enableRenderGroup(){if(this.renderGroup)return;const t=this.parentRenderGroup;t==null||t.removeChild(this),this.renderGroup=Lt.get(vo,this),this.groupTransform=H.IDENTITY,t==null||t.addChild(this),this._updateIsSimple()}disableRenderGroup(){if(!this.renderGroup)return;const t=this.parentRenderGroup;t==null||t.removeChild(this),Lt.return(this.renderGroup),this.renderGroup=null,this.groupTransform=this.relativeGroupTransform,t==null||t.addChild(this),this._updateIsSimple()}_updateIsSimple(){this.isSimple=!this.renderGroup&&this.effects.length===0}get worldTransform(){return this._worldTransform||(this._worldTransform=new H),this.renderGroup?this._worldTransform.copyFrom(this.renderGroup.worldTransform):this.parentRenderGroup&&this._worldTransform.appendFrom(this.relativeGroupTransform,this.parentRenderGroup.worldTransform),this._worldTransform}get x(){return this._position.x}set x(t){this._position.x=t}get y(){return this._position.y}set y(t){this._position.y=t}get position(){return this._position}set position(t){this._position.copyFrom(t)}get rotation(){return this._rotation}set rotation(t){this._rotation!==t&&(this._rotation=t,this._onUpdate(this._skew))}get angle(){return this.rotation*Na}set angle(t){this.rotation=t*Ha}get pivot(){return this._pivot===Ei&&(this._pivot=new ut(this,0,0)),this._pivot}set pivot(t){this._pivot===Ei&&(this._pivot=new ut(this,0,0)),typeof t=="number"?this._pivot.set(t):this._pivot.copyFrom(t)}get skew(){return this._skew===Bi&&(this._skew=new ut(this,0,0)),this._skew}set skew(t){this._skew===Bi&&(this._skew=new ut(this,0,0)),this._skew.copyFrom(t)}get scale(){return this._scale===Ri&&(this._scale=new ut(this,1,1)),this._scale}set scale(t){this._scale===Ri&&(this._scale=new ut(this,0,0)),typeof t=="number"?this._scale.set(t):this._scale.copyFrom(t)}get width(){return Math.abs(this.scale.x*this.getLocalBounds().width)}set width(t){const e=this.getLocalBounds().width;this._setWidth(t,e)}get height(){return Math.abs(this.scale.y*this.getLocalBounds().height)}set height(t){const e=this.getLocalBounds().height;this._setHeight(t,e)}getSize(t){t||(t={});const e=this.getLocalBounds();return t.width=Math.abs(this.scale.x*e.width),t.height=Math.abs(this.scale.y*e.height),t}setSize(t,e){const i=this.getLocalBounds();typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,i.width),e!==void 0&&this._setHeight(e,i.height)}_updateSkew(){const t=this._rotation,e=this._skew;this._cx=Math.cos(t+e._y),this._sx=Math.sin(t+e._y),this._cy=-Math.sin(t-e._x),this._sy=Math.cos(t-e._x)}updateTransform(t){return this.position.set(typeof t.x=="number"?t.x:this.position.x,typeof t.y=="number"?t.y:this.position.y),this.scale.set(typeof t.scaleX=="number"?t.scaleX||1:this.scale.x,typeof t.scaleY=="number"?t.scaleY||1:this.scale.y),this.rotation=typeof t.rotation=="number"?t.rotation:this.rotation,this.skew.set(typeof t.skewX=="number"?t.skewX:this.skew.x,typeof t.skewY=="number"?t.skewY:this.skew.y),this.pivot.set(typeof t.pivotX=="number"?t.pivotX:this.pivot.x,typeof t.pivotY=="number"?t.pivotY:this.pivot.y),this}setFromMatrix(t){t.decompose(this)}updateLocalTransform(){const t=this._didContainerChangeTick;if(this._didLocalTransformChangeId===t)return;this._didLocalTransformChangeId=t;const e=this.localTransform,i=this._scale,n=this._pivot,r=this._position,a=i._x,o=i._y,h=n._x,c=n._y;e.a=this._cx*a,e.b=this._sx*a,e.c=this._cy*o,e.d=this._sy*o,e.tx=r._x-(h*e.a+c*e.c),e.ty=r._y-(h*e.b+c*e.d)}set alpha(t){t!==this.localAlpha&&(this.localAlpha=t,this._updateFlags|=dn,this._onUpdate())}get alpha(){return this.localAlpha}set tint(t){const i=Z.shared.setValue(t??16777215).toBgrNumber();i!==this.localColor&&(this.localColor=i,this._updateFlags|=dn,this._onUpdate())}get tint(){const t=this.localColor;return((t&255)<<16)+(t&65280)+(t>>16&255)}set blendMode(t){this.localBlendMode!==t&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=To,this.localBlendMode=t,this._onUpdate())}get blendMode(){return this.localBlendMode}get visible(){return!!(this.localDisplayStatus&2)}set visible(t){const e=t?2:0;(this.localDisplayStatus&2)!==e&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=Fi,this.localDisplayStatus^=2,this._onUpdate())}get culled(){return!(this.localDisplayStatus&4)}set culled(t){const e=t?0:4;(this.localDisplayStatus&4)!==e&&(this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._updateFlags|=Fi,this.localDisplayStatus^=4,this._onUpdate())}get renderable(){return!!(this.localDisplayStatus&1)}set renderable(t){const e=t?1:0;(this.localDisplayStatus&1)!==e&&(this._updateFlags|=Fi,this.localDisplayStatus^=1,this.parentRenderGroup&&(this.parentRenderGroup.structureDidChange=!0),this._onUpdate())}get isRenderable(){return this.localDisplayStatus===7&&this.groupAlpha>0}destroy(t=!1){var n;if(this.destroyed)return;this.destroyed=!0;const e=this.removeChildren(0,this.children.length);if(this.removeFromParent(),this.parent=null,this._maskEffect=null,this._filterEffect=null,this.effects=null,this._position=null,this._scale=null,this._pivot=null,this._skew=null,this.emit("destroyed",this),this.removeAllListeners(),typeof t=="boolean"?t:t==null?void 0:t.children)for(let r=0;r=e.minX&&i<=e.maxX&&n>=e.minY&&n<=e.maxY}destroy(t){super.destroy(t),this._bounds=null}}class $ extends mi{constructor(t=z.EMPTY){t instanceof z&&(t={texture:t});const{texture:e=z.EMPTY,anchor:i,roundPixels:n,width:r,height:a,...o}=t;super({label:"Sprite",...o}),this.renderPipeId="sprite",this.batched=!0,this._didSpriteUpdate=!1,this._sourceBounds={minX:0,maxX:1,minY:0,maxY:0},this._sourceBoundsDirty=!0,this._anchor=new ut({_onUpdate:()=>{this.onViewUpdate()}}),i?this.anchor=i:e.defaultAnchor&&(this.anchor=e.defaultAnchor),this.texture=e,this.allowChildren=!1,this.roundPixels=n??!1,r!==void 0&&(this.width=r),a!==void 0&&(this.height=a)}static from(t,e=!1){return t instanceof z?new $(t):new $(z.from(t,e))}set texture(t){t||(t=z.EMPTY);const e=this._texture;e!==t&&(e&&e.dynamic&&e.off("update",this.onViewUpdate,this),t.dynamic&&t.on("update",this.onViewUpdate,this),this._texture=t,this._width&&this._setWidth(this._width,this._texture.orig.width),this._height&&this._setHeight(this._height,this._texture.orig.height),this.onViewUpdate())}get texture(){return this._texture}get bounds(){return this._boundsDirty&&(this._updateBounds(),this._boundsDirty=!1),this._bounds}get sourceBounds(){return this._sourceBoundsDirty&&(this._updateSourceBounds(),this._sourceBoundsDirty=!1),this._sourceBounds}containsPoint(t){const e=this.sourceBounds;return t.x>=e.maxX&&t.x<=e.minX&&t.y>=e.maxY&&t.y<=e.minY}addBounds(t){const e=this._texture.trim?this.sourceBounds:this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}onViewUpdate(){if(this._didViewChangeTick++,this._didSpriteUpdate=!0,this._sourceBoundsDirty=this._boundsDirty=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}_updateBounds(){Qa(this._bounds,this._anchor,this._texture,0)}_updateSourceBounds(){const t=this._anchor,e=this._texture,i=this._sourceBounds,{width:n,height:r}=e.orig;i.maxX=-t._x*n,i.minX=i.maxX+n,i.maxY=-t._y*r,i.minY=i.maxY+r}destroy(t=!1){if(super.destroy(t),typeof t=="boolean"?t:t==null?void 0:t.texture){const i=typeof t=="boolean"?t:t==null?void 0:t.textureSource;this._texture.destroy(i)}this._texture=null,this._bounds=null,this._sourceBounds=null,this._anchor=null}get anchor(){return this._anchor}set anchor(t){typeof t=="number"?this._anchor.set(t):this._anchor.copyFrom(t)}get width(){return Math.abs(this.scale.x)*this._texture.orig.width}set width(t){this._setWidth(t,this._texture.orig.width),this._width=t}get height(){return Math.abs(this.scale.y)*this._texture.orig.height}set height(t){this._setHeight(t,this._texture.orig.height),this._height=t}getSize(t){return t||(t={}),t.width=Math.abs(this.scale.x)*this._texture.orig.width,t.height=Math.abs(this.scale.y)*this._texture.orig.height,t}setSize(t,e){typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,this._texture.orig.width),e!==void 0&&this._setHeight(e,this._texture.orig.height)}}const Ao=new Gt;function gr(s,t,e){const i=Ao;s.measurable=!0,lr(s,e,i),t.addBoundsMask(i),s.measurable=!1}function mr(s,t,e){const i=fe.get();s.measurable=!0;const n=Dt.get().identity(),r=xr(s,e,n);dr(s,i,r),s.measurable=!1,t.addBoundsMask(i),Dt.return(n),fe.return(i)}function xr(s,t,e){return s?(s!==t&&(xr(s.parent,t,e),s.updateLocalTransform(),e.append(s.localTransform)),e):(st("Mask bounds, renderable is not inside the root container"),e)}class yr{constructor(t){this.priority=0,this.pipe="alphaMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t,this.renderMaskToTexture=!(t instanceof $),this.mask.renderable=this.renderMaskToTexture,this.mask.includeInBuild=!this.renderMaskToTexture,this.mask.measurable=!1}reset(){this.mask.measurable=!0,this.mask=null}addBounds(t,e){gr(this.mask,t,e)}addLocalBounds(t,e){mr(this.mask,t,e)}containsPoint(t,e){const i=this.mask;return e(i,t)}destroy(){this.reset()}static test(t){return t instanceof $}}yr.extension=k.MaskEffect;class _r{constructor(t){this.priority=0,this.pipe="colorMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t}destroy(){}static test(t){return typeof t=="number"}}_r.extension=k.MaskEffect;class wr{constructor(t){this.priority=0,this.pipe="stencilMask",t!=null&&t.mask&&this.init(t.mask)}init(t){this.mask=t,this.mask.includeInBuild=!1,this.mask.measurable=!1}reset(){this.mask.measurable=!0,this.mask.includeInBuild=!0,this.mask=null}addBounds(t,e){gr(this.mask,t,e)}addLocalBounds(t,e){mr(this.mask,t,e)}containsPoint(t,e){const i=this.mask;return e(i,t)}destroy(){this.reset()}static test(t){return t instanceof J}}wr.extension=k.MaskEffect;const Mo={createCanvas:(s,t)=>{const e=document.createElement("canvas");return e.width=s,e.height=t,e},getCanvasRenderingContext2D:()=>CanvasRenderingContext2D,getWebGLRenderingContext:()=>WebGLRenderingContext,getNavigator:()=>navigator,getBaseUrl:()=>document.baseURI??window.location.href,getFontFaceSet:()=>document.fonts,fetch:(s,t)=>fetch(s,t),parseXML:s=>new DOMParser().parseFromString(s,"text/xml")};let un=Mo;const Q={get(){return un},set(s){un=s}};class br extends zt{constructor(t){t.resource||(t.resource=Q.get().createCanvas()),t.width||(t.width=t.resource.width,t.autoDensity||(t.width/=t.resolution)),t.height||(t.height=t.resource.height,t.autoDensity||(t.height/=t.resolution)),super(t),this.uploadMethodId="image",this.autoDensity=t.autoDensity;const e=t.resource;(this.pixelWidth!==e.width||this.pixelWidth!==e.height)&&this.resizeCanvas(),this.transparent=!!t.transparent}resizeCanvas(){this.autoDensity&&(this.resource.style.width=`${this.width}px`,this.resource.style.height=`${this.height}px`),(this.resource.width!==this.pixelWidth||this.resource.height!==this.pixelHeight)&&(this.resource.width=this.pixelWidth,this.resource.height=this.pixelHeight)}resize(t=this.width,e=this.height,i=this._resolution){const n=super.resize(t,e,i);return n&&this.resizeCanvas(),n}static test(t){return globalThis.HTMLCanvasElement&&t instanceof HTMLCanvasElement||globalThis.OffscreenCanvas&&t instanceof OffscreenCanvas}get context2D(){return this._context2D||(this._context2D=this.resource.getContext("2d"))}}br.extension=k.TextureSource;class ye extends zt{constructor(t){if(t.resource&&globalThis.HTMLImageElement&&t.resource instanceof HTMLImageElement){const e=Q.get().createCanvas(t.resource.width,t.resource.height);e.getContext("2d").drawImage(t.resource,0,0,t.resource.width,t.resource.height),t.resource=e,st("ImageSource: Image element passed, converting to canvas. Use CanvasSource instead.")}super(t),this.uploadMethodId="image",this.autoGarbageCollect=!0}static test(t){return globalThis.HTMLImageElement&&t instanceof HTMLImageElement||typeof ImageBitmap<"u"&&t instanceof ImageBitmap||globalThis.VideoFrame&&t instanceof VideoFrame}}ye.extension=k.TextureSource;var ui=(s=>(s[s.INTERACTION=50]="INTERACTION",s[s.HIGH=25]="HIGH",s[s.NORMAL=0]="NORMAL",s[s.LOW=-25]="LOW",s[s.UTILITY=-50]="UTILITY",s))(ui||{});class Li{constructor(t,e=null,i=0,n=!1){this.next=null,this.previous=null,this._destroyed=!1,this._fn=t,this._context=e,this.priority=i,this._once=n}match(t,e=null){return this._fn===t&&this._context===e}emit(t){this._fn&&(this._context?this._fn.call(this._context,t):this._fn(t));const e=this.next;return this._once&&this.destroy(!0),this._destroyed&&(this.next=null),e}connect(t){this.previous=t,t.next&&(t.next.previous=this),this.next=t.next,t.next=this}destroy(t=!1){this._destroyed=!0,this._fn=null,this._context=null,this.previous&&(this.previous.next=this.next),this.next&&(this.next.previous=this.previous);const e=this.next;return this.next=t?null:e,this.previous=null,e}}const Sr=class pt{constructor(){this.autoStart=!1,this.deltaTime=1,this.lastTime=-1,this.speed=1,this.started=!1,this._requestId=null,this._maxElapsedMS=100,this._minElapsedMS=0,this._protected=!1,this._lastFrame=-1,this._head=new Li(null,null,1/0),this.deltaMS=1/pt.targetFPMS,this.elapsedMS=1/pt.targetFPMS,this._tick=t=>{this._requestId=null,this.started&&(this.update(t),this.started&&this._requestId===null&&this._head.next&&(this._requestId=requestAnimationFrame(this._tick)))}}_requestIfNeeded(){this._requestId===null&&this._head.next&&(this.lastTime=performance.now(),this._lastFrame=this.lastTime,this._requestId=requestAnimationFrame(this._tick))}_cancelIfNeeded(){this._requestId!==null&&(cancelAnimationFrame(this._requestId),this._requestId=null)}_startIfPossible(){this.started?this._requestIfNeeded():this.autoStart&&this.start()}add(t,e,i=ui.NORMAL){return this._addListener(new Li(t,e,i))}addOnce(t,e,i=ui.NORMAL){return this._addListener(new Li(t,e,i,!0))}_addListener(t){let e=this._head.next,i=this._head;if(!e)t.connect(i);else{for(;e;){if(t.priority>e.priority){t.connect(i);break}i=e,e=e.next}t.previous||t.connect(i)}return this._startIfPossible(),this}remove(t,e){let i=this._head.next;for(;i;)i.match(t,e)?i=i.destroy():i=i.next;return this._head.next||this._cancelIfNeeded(),this}get count(){if(!this._head)return 0;let t=0,e=this._head;for(;e=e.next;)t++;return t}start(){this.started||(this.started=!0,this._requestIfNeeded())}stop(){this.started&&(this.started=!1,this._cancelIfNeeded())}destroy(){if(!this._protected){this.stop();let t=this._head.next;for(;t;)t=t.destroy(!0);this._head.destroy(),this._head=null}}update(t=performance.now()){let e;if(t>this.lastTime){if(e=this.elapsedMS=t-this.lastTime,e>this._maxElapsedMS&&(e=this._maxElapsedMS),e*=this.speed,this._minElapsedMS){const r=t-this._lastFrame|0;if(r{var a;const t=document.createElement("canvas").getContext("webgl");if(!t)return"premultiply-alpha-on-upload";const e=await new Promise(o=>{const h=document.createElement("video");h.onloadeddata=()=>o(h),h.onerror=()=>o(null),h.autoplay=!1,h.crossOrigin="anonymous",h.preload="auto",h.src="data:video/webm;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQJChYECGFOAZwEAAAAAAAHTEU2bdLpNu4tTq4QVSalmU6yBoU27i1OrhBZUrmtTrIHGTbuMU6uEElTDZ1OsggEXTbuMU6uEHFO7a1OsggG97AEAAAAAAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmoCrXsYMPQkBNgIRMYXZmV0GETGF2ZkSJiEBEAAAAAAAAFlSua8yuAQAAAAAAAEPXgQFzxYgAAAAAAAAAAZyBACK1nIN1bmSIgQCGhVZfVlA5g4EBI+ODhAJiWgDglLCBArqBApqBAlPAgQFVsIRVuYEBElTDZ9Vzc9JjwItjxYgAAAAAAAAAAWfInEWjh0VOQ09ERVJEh49MYXZjIGxpYnZweC12cDlnyKJFo4hEVVJBVElPTkSHlDAwOjAwOjAwLjA0MDAwMDAwMAAAH0O2dcfngQCgwqGggQAAAIJJg0IAABAAFgA4JBwYSgAAICAAEb///4r+AAB1oZ2mm+6BAaWWgkmDQgAAEAAWADgkHBhKAAAgIABIQBxTu2uRu4+zgQC3iveBAfGCAXHwgQM=",h.load()});if(!e)return"premultiply-alpha-on-upload";const i=t.createTexture();t.bindTexture(t.TEXTURE_2D,i);const n=t.createFramebuffer();t.bindFramebuffer(t.FRAMEBUFFER,n),t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,i,0),t.pixelStorei(t.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!1),t.pixelStorei(t.UNPACK_COLORSPACE_CONVERSION_WEBGL,t.NONE),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,t.RGBA,t.UNSIGNED_BYTE,e);const r=new Uint8Array(4);return t.readPixels(0,0,1,1,t.RGBA,t.UNSIGNED_BYTE,r),t.deleteFramebuffer(n),t.deleteTexture(i),(a=t.getExtension("WEBGL_lose_context"))==null||a.loseContext(),r[0]<=r[3]?"premultiplied-alpha":"premultiply-alpha-on-upload"})()),Di}const xi=class Cr extends zt{constructor(t){super(t),this.isReady=!1,this.uploadMethodId="video",t={...Cr.defaultOptions,...t},this._autoUpdate=!0,this._isConnectedToTicker=!1,this._updateFPS=t.updateFPS||0,this._msToNextUpdate=0,this.autoPlay=t.autoPlay!==!1,this.alphaMode=t.alphaMode??"premultiply-alpha-on-upload",this._videoFrameRequestCallback=this._videoFrameRequestCallback.bind(this),this._videoFrameRequestCallbackHandle=null,this._load=null,this._resolve=null,this._reject=null,this._onCanPlay=this._onCanPlay.bind(this),this._onCanPlayThrough=this._onCanPlayThrough.bind(this),this._onError=this._onError.bind(this),this._onPlayStart=this._onPlayStart.bind(this),this._onPlayStop=this._onPlayStop.bind(this),this._onSeeked=this._onSeeked.bind(this),t.autoLoad!==!1&&this.load()}updateFrame(){if(!this.destroyed){if(this._updateFPS){const t=Pt.shared.elapsedMS*this.resource.playbackRate;this._msToNextUpdate=Math.floor(this._msToNextUpdate-t)}(!this._updateFPS||this._msToNextUpdate<=0)&&(this._msToNextUpdate=this._updateFPS?Math.floor(1e3/this._updateFPS):0),this.isValid&&this.update()}}_videoFrameRequestCallback(){this.updateFrame(),this.destroyed?this._videoFrameRequestCallbackHandle=null:this._videoFrameRequestCallbackHandle=this.resource.requestVideoFrameCallback(this._videoFrameRequestCallback)}get isValid(){return!!this.resource.videoWidth&&!!this.resource.videoHeight}async load(){if(this._load)return this._load;const t=this.resource,e=this.options;return(t.readyState===t.HAVE_ENOUGH_DATA||t.readyState===t.HAVE_FUTURE_DATA)&&t.width&&t.height&&(t.complete=!0),t.addEventListener("play",this._onPlayStart),t.addEventListener("pause",this._onPlayStop),t.addEventListener("seeked",this._onSeeked),this._isSourceReady()?this._mediaReady():(e.preload||t.addEventListener("canplay",this._onCanPlay),t.addEventListener("canplaythrough",this._onCanPlayThrough),t.addEventListener("error",this._onError,!0)),this.alphaMode=await vr(),this._load=new Promise((i,n)=>{this.isValid?i(this):(this._resolve=i,this._reject=n,e.preloadTimeoutMs!==void 0&&(this._preloadTimeout=setTimeout(()=>{this._onError(new ErrorEvent(`Preload exceeded timeout of ${e.preloadTimeoutMs}ms`))})),t.load())}),this._load}_onError(t){this.resource.removeEventListener("error",this._onError,!0),this.emit("error",t),this._reject&&(this._reject(t),this._reject=null,this._resolve=null)}_isSourcePlaying(){const t=this.resource;return!t.paused&&!t.ended}_isSourceReady(){return this.resource.readyState>2}_onPlayStart(){this.isValid||this._mediaReady(),this._configureAutoUpdate()}_onPlayStop(){this._configureAutoUpdate()}_onSeeked(){this._autoUpdate&&!this._isSourcePlaying()&&(this._msToNextUpdate=0,this.updateFrame(),this._msToNextUpdate=0)}_onCanPlay(){this.resource.removeEventListener("canplay",this._onCanPlay),this._mediaReady()}_onCanPlayThrough(){this.resource.removeEventListener("canplaythrough",this._onCanPlay),this._preloadTimeout&&(clearTimeout(this._preloadTimeout),this._preloadTimeout=void 0),this._mediaReady()}_mediaReady(){const t=this.resource;this.isValid&&(this.isReady=!0,this.resize(t.videoWidth,t.videoHeight)),this._msToNextUpdate=0,this.updateFrame(),this._msToNextUpdate=0,this._resolve&&(this._resolve(this),this._resolve=null,this._reject=null),this._isSourcePlaying()?this._onPlayStart():this.autoPlay&&this.resource.play()}destroy(){this._configureAutoUpdate();const t=this.resource;t&&(t.removeEventListener("play",this._onPlayStart),t.removeEventListener("pause",this._onPlayStop),t.removeEventListener("seeked",this._onSeeked),t.removeEventListener("canplay",this._onCanPlay),t.removeEventListener("canplaythrough",this._onCanPlayThrough),t.removeEventListener("error",this._onError,!0),t.pause(),t.src="",t.load()),super.destroy()}get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t!==this._autoUpdate&&(this._autoUpdate=t,this._configureAutoUpdate())}get updateFPS(){return this._updateFPS}set updateFPS(t){t!==this._updateFPS&&(this._updateFPS=t,this._configureAutoUpdate())}_configureAutoUpdate(){this._autoUpdate&&this._isSourcePlaying()?!this._updateFPS&&this.resource.requestVideoFrameCallback?(this._isConnectedToTicker&&(Pt.shared.remove(this.updateFrame,this),this._isConnectedToTicker=!1,this._msToNextUpdate=0),this._videoFrameRequestCallbackHandle===null&&(this._videoFrameRequestCallbackHandle=this.resource.requestVideoFrameCallback(this._videoFrameRequestCallback))):(this._videoFrameRequestCallbackHandle!==null&&(this.resource.cancelVideoFrameCallback(this._videoFrameRequestCallbackHandle),this._videoFrameRequestCallbackHandle=null),this._isConnectedToTicker||(Pt.shared.add(this.updateFrame,this),this._isConnectedToTicker=!0,this._msToNextUpdate=0)):(this._videoFrameRequestCallbackHandle!==null&&(this.resource.cancelVideoFrameCallback(this._videoFrameRequestCallbackHandle),this._videoFrameRequestCallbackHandle=null),this._isConnectedToTicker&&(Pt.shared.remove(this.updateFrame,this),this._isConnectedToTicker=!1,this._msToNextUpdate=0))}static test(t){return globalThis.HTMLVideoElement&&t instanceof HTMLVideoElement}};xi.extension=k.TextureSource;xi.defaultOptions={...zt.defaultOptions,autoLoad:!0,autoPlay:!0,updateFPS:0,crossorigin:!0,loop:!1,muted:!0,playsinline:!0,preload:!1};xi.MIME_TYPES={ogv:"video/ogg",mov:"video/quicktime",m4v:"video/mp4"};let oi=xi;const bt=(s,t,e=!1)=>(Array.isArray(s)||(s=[s]),t?s.map(i=>typeof i=="string"||e?t(i):i):s);class Po{constructor(){this._parsers=[],this._cache=new Map,this._cacheMap=new Map}reset(){this._cacheMap.clear(),this._cache.clear()}has(t){return this._cache.has(t)}get(t){const e=this._cache.get(t);return e||st(`[Assets] Asset id ${t} was not found in the Cache`),e}set(t,e){const i=bt(t);let n;for(let h=0;h{r.set(h,e)});const a=[...r.keys()],o={cacheKeys:a,keys:i};i.forEach(h=>{this._cacheMap.set(h,o)}),a.forEach(h=>{const c=n?n[h]:e;this._cache.has(h)&&this._cache.get(h)!==c&&st("[Cache] already has key:",h),this._cache.set(h,r.get(h))})}remove(t){if(!this._cacheMap.has(t)){st(`[Assets] Asset id ${t} was not found in the Cache`);return}const e=this._cacheMap.get(t);e.cacheKeys.forEach(n=>{this._cache.delete(n)}),e.keys.forEach(n=>{this._cacheMap.delete(n)})}get parsers(){return this._parsers}}const j=new Po,ns=[];lt.handleByList(k.TextureSource,ns);function Tr(s={}){const t=s&&s.resource,e=t?s.resource:s,i=t?s:{resource:s};for(let n=0;n{j.has(i)&&j.remove(i)}),t||j.set(i,r),r}function Go(s,t=!1){return typeof s=="string"?j.get(s):s instanceof zt?new z({source:s}):ko(s,t)}z.from=Go;zt.from=Tr;lt.add(yr,_r,wr,oi,ye,br,Cs);var Ht=(s=>(s[s.Low=0]="Low",s[s.Normal=1]="Normal",s[s.High=2]="High",s))(Ht||{});function wt(s){if(typeof s!="string")throw new TypeError(`Path must be a string. Received ${JSON.stringify(s)}`)}function Ae(s){return s.split("?")[0].split("#")[0]}function Io(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function Bo(s,t,e){return s.replace(new RegExp(Io(t),"g"),e)}function Eo(s,t){let e="",i=0,n=-1,r=0,a=-1;for(let o=0;o<=s.length;++o){if(o2){const h=e.lastIndexOf("/");if(h!==e.length-1){h===-1?(e="",i=0):(e=e.slice(0,h),i=e.length-1-e.lastIndexOf("/")),n=o,r=0;continue}}else if(e.length===2||e.length===1){e="",i=0,n=o,r=0;continue}}}else e.length>0?e+=`/${s.slice(n+1,o)}`:e=s.slice(n+1,o),i=o-n-1;n=o,r=0}else a===46&&r!==-1?++r:r=-1}return e}const gt={toPosix(s){return Bo(s,"\\","/")},isUrl(s){return/^https?:/.test(this.toPosix(s))},isDataUrl(s){return/^data:([a-z]+\/[a-z0-9-+.]+(;[a-z0-9-.!#$%*+.{}|~`]+=[a-z0-9-.!#$%*+.{}()_|~`]+)*)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s<>]*?)$/i.test(s)},isBlobUrl(s){return s.startsWith("blob:")},hasProtocol(s){return/^[^/:]+:/.test(this.toPosix(s))},getProtocol(s){wt(s),s=this.toPosix(s);const t=/^file:\/\/\//.exec(s);if(t)return t[0];const e=/^[^/:]+:\/{0,2}/.exec(s);return e?e[0]:""},toAbsolute(s,t,e){if(wt(s),this.isDataUrl(s)||this.isBlobUrl(s))return s;const i=Ae(this.toPosix(t??Q.get().getBaseUrl())),n=Ae(this.toPosix(e??this.rootname(i)));return s=this.toPosix(s),s.startsWith("/")?gt.join(n,s.slice(1)):this.isAbsolute(s)?s:this.join(i,s)},normalize(s){if(wt(s),s.length===0)return".";if(this.isDataUrl(s)||this.isBlobUrl(s))return s;s=this.toPosix(s);let t="";const e=s.startsWith("/");this.hasProtocol(s)&&(t=this.rootname(s),s=s.slice(t.length));const i=s.endsWith("/");return s=Eo(s),s.length>0&&i&&(s+="/"),e?`/${s}`:t+s},isAbsolute(s){return wt(s),s=this.toPosix(s),this.hasProtocol(s)?!0:s.startsWith("/")},join(...s){if(s.length===0)return".";let t;for(let e=0;e0)if(t===void 0)t=i;else{const n=s[e-1]??"";this.joinExtensions.includes(this.extname(n).toLowerCase())?t+=`/../${i}`:t+=`/${i}`}}return t===void 0?".":this.normalize(t)},dirname(s){if(wt(s),s.length===0)return".";s=this.toPosix(s);let t=s.charCodeAt(0);const e=t===47;let i=-1,n=!0;const r=this.getProtocol(s),a=s;s=s.slice(r.length);for(let o=s.length-1;o>=1;--o)if(t=s.charCodeAt(o),t===47){if(!n){i=o;break}}else n=!1;return i===-1?e?"/":this.isUrl(a)?r+s:r:e&&i===1?"//":r+s.slice(0,i)},rootname(s){wt(s),s=this.toPosix(s);let t="";if(s.startsWith("/")?t="/":t=this.getProtocol(s),this.isUrl(s)){const e=s.indexOf("/",t.length);e!==-1?t=s.slice(0,e):t=s,t.endsWith("/")||(t+="/")}return t},basename(s,t){wt(s),t&&wt(t),s=Ae(this.toPosix(s));let e=0,i=-1,n=!0,r;if(t!==void 0&&t.length>0&&t.length<=s.length){if(t.length===s.length&&t===s)return"";let a=t.length-1,o=-1;for(r=s.length-1;r>=0;--r){const h=s.charCodeAt(r);if(h===47){if(!n){e=r+1;break}}else o===-1&&(n=!1,o=r+1),a>=0&&(h===t.charCodeAt(a)?--a===-1&&(i=r):(a=-1,i=o))}return e===i?i=o:i===-1&&(i=s.length),s.slice(e,i)}for(r=s.length-1;r>=0;--r)if(s.charCodeAt(r)===47){if(!n){e=r+1;break}}else i===-1&&(n=!1,i=r+1);return i===-1?"":s.slice(e,i)},extname(s){wt(s),s=Ae(this.toPosix(s));let t=-1,e=0,i=-1,n=!0,r=0;for(let a=s.length-1;a>=0;--a){const o=s.charCodeAt(a);if(o===47){if(!n){e=a+1;break}continue}i===-1&&(n=!1,i=a+1),o===46?t===-1?t=a:r!==1&&(r=1):t!==-1&&(r=-1)}return t===-1||i===-1||r===0||r===1&&t===i-1&&t===e+1?"":s.slice(t,i)},parse(s){wt(s);const t={root:"",dir:"",base:"",ext:"",name:""};if(s.length===0)return t;s=Ae(this.toPosix(s));let e=s.charCodeAt(0);const i=this.isAbsolute(s);let n;t.root=this.rootname(s),i||this.hasProtocol(s)?n=1:n=0;let r=-1,a=0,o=-1,h=!0,c=s.length-1,l=0;for(;c>=n;--c){if(e=s.charCodeAt(c),e===47){if(!h){a=c+1;break}continue}o===-1&&(h=!1,o=c+1),e===46?r===-1?r=c:l!==1&&(l=1):r!==-1&&(l=-1)}return r===-1||o===-1||l===0||l===1&&r===o-1&&r===a+1?o!==-1&&(a===0&&i?t.base=t.name=s.slice(1,o):t.base=t.name=s.slice(a,o)):(a===0&&i?(t.name=s.slice(1,r),t.base=s.slice(1,o)):(t.name=s.slice(a,r),t.base=s.slice(a,o)),t.ext=s.slice(r,o)),t.dir=this.dirname(s),t},sep:"/",delimiter:":",joinExtensions:[".html"]};function Ar(s,t,e,i,n){const r=t[e];for(let a=0;a{const a=r.substring(1,r.length-1).split(",");n.push(a)}),Ar(s,n,0,e,i)}else i.push(s);return i}const fi=s=>!Array.isArray(s);class _e{constructor(){this._defaultBundleIdentifierOptions={connector:"-",createBundleAssetId:(t,e)=>`${t}${this._bundleIdConnector}${e}`,extractAssetIdFromBundle:(t,e)=>e.replace(`${t}${this._bundleIdConnector}`,"")},this._bundleIdConnector=this._defaultBundleIdentifierOptions.connector,this._createBundleAssetId=this._defaultBundleIdentifierOptions.createBundleAssetId,this._extractAssetIdFromBundle=this._defaultBundleIdentifierOptions.extractAssetIdFromBundle,this._assetMap={},this._preferredOrder=[],this._parsers=[],this._resolverHash={},this._bundles={}}setBundleIdentifier(t){if(this._bundleIdConnector=t.connector??this._bundleIdConnector,this._createBundleAssetId=t.createBundleAssetId??this._createBundleAssetId,this._extractAssetIdFromBundle=t.extractAssetIdFromBundle??this._extractAssetIdFromBundle,this._extractAssetIdFromBundle("foo",this._createBundleAssetId("foo","bar"))!=="bar")throw new Error("[Resolver] GenerateBundleAssetId are not working correctly")}prefer(...t){t.forEach(e=>{this._preferredOrder.push(e),e.priority||(e.priority=Object.keys(e.params))}),this._resolverHash={}}set basePath(t){this._basePath=t}get basePath(){return this._basePath}set rootPath(t){this._rootPath=t}get rootPath(){return this._rootPath}get parsers(){return this._parsers}reset(){this.setBundleIdentifier(this._defaultBundleIdentifierOptions),this._assetMap={},this._preferredOrder=[],this._resolverHash={},this._rootPath=null,this._basePath=null,this._manifest=null,this._bundles={},this._defaultSearchParams=null}setDefaultSearchParams(t){if(typeof t=="string")this._defaultSearchParams=t;else{const e=t;this._defaultSearchParams=Object.keys(e).map(i=>`${encodeURIComponent(i)}=${encodeURIComponent(e[i])}`).join("&")}}getAlias(t){const{alias:e,src:i}=t;return bt(e||i,r=>typeof r=="string"?r:Array.isArray(r)?r.map(a=>(a==null?void 0:a.src)??a):r!=null&&r.src?r.src:r,!0)}addManifest(t){this._manifest&&st("[Resolver] Manifest already exists, this will be overwritten"),this._manifest=t,t.bundles.forEach(e=>{this.addBundle(e.name,e.assets)})}addBundle(t,e){const i=[];let n=e;Array.isArray(e)||(n=Object.entries(e).map(([r,a])=>typeof a=="string"||Array.isArray(a)?{alias:r,src:a}:{alias:r,...a})),n.forEach(r=>{const a=r.src,o=r.alias;let h;if(typeof o=="string"){const c=this._createBundleAssetId(t,o);i.push(c),h=[o,c]}else{const c=o.map(l=>this._createBundleAssetId(t,l));i.push(...c),h=[...o,...c]}this.add({...r,alias:h,src:a})}),this._bundles[t]=i}add(t){const e=[];Array.isArray(t)?e.push(...t):e.push(t);let i;i=r=>{this.hasKey(r)&&st(`[Resolver] already has key: ${r} overwriting`)},bt(e).forEach(r=>{const{src:a}=r;let{data:o,format:h,loadParser:c}=r;const l=bt(a).map(g=>typeof g=="string"?Ro(g):Array.isArray(g)?g:[g]),d=this.getAlias(r);Array.isArray(d)?d.forEach(i):i(d);const u=[];l.forEach(g=>{g.forEach(m=>{let y={};if(typeof m!="object"){y.src=m;for(let x=0;x{this._assetMap[g]=u})})}resolveBundle(t){const e=fi(t);t=bt(t);const i={};return t.forEach(n=>{const r=this._bundles[n];if(r){const a=this.resolve(r),o={};for(const h in a){const c=a[h];o[this._extractAssetIdFromBundle(n,h)]=c}i[n]=o}}),e?i[t[0]]:i}resolveUrl(t){const e=this.resolve(t);if(typeof t!="string"){const i={};for(const n in e)i[n]=e[n].src;return i}return e.src}resolve(t){const e=fi(t);t=bt(t);const i={};return t.forEach(n=>{if(!this._resolverHash[n])if(this._assetMap[n]){let r=this._assetMap[n];const a=this._getPreferredOrder(r);a==null||a.priority.forEach(o=>{a.params[o].forEach(h=>{const c=r.filter(l=>l[o]?l[o]===h:!1);c.length&&(r=c)})}),this._resolverHash[n]=r[0]}else this._resolverHash[n]=this._buildResolvedAsset({alias:[n],src:n},{});i[n]=this._resolverHash[n]}),e?i[t[0]]:i}hasKey(t){return!!this._assetMap[t]}hasBundle(t){return!!this._bundles[t]}_getPreferredOrder(t){for(let e=0;er.params.format.includes(i.format));if(n)return n}return this._preferredOrder[0]}_appendDefaultSearchParams(t){if(!this._defaultSearchParams)return t;const e=/\?/.test(t)?"&":"?";return`${t}${e}${this._defaultSearchParams}`}_buildResolvedAsset(t,e){const{aliases:i,data:n,loadParser:r,format:a}=e;return(this._basePath||this._rootPath)&&(t.src=gt.toAbsolute(t.src,this._basePath,this._rootPath)),t.alias=i??t.alias??[t.src],t.src=this._appendDefaultSearchParams(t.src),t.data={...n||{},...t.data},t.loadParser=r??t.loadParser,t.format=a??t.format??Fo(t.src),t}}_e.RETINA_PREFIX=/@([0-9\.]+)x/;function Fo(s){return s.split(".").pop().split("?").shift().split("#").shift()}const rs=(s,t)=>{const e=t.split("?")[1];return e&&(s+=`?${e}`),s},Mr=class Be{constructor(t,e){this.linkedSheets=[],this._texture=t instanceof z?t:null,this.textureSource=t.source,this.textures={},this.animations={},this.data=e;const i=parseFloat(e.meta.scale);i?(this.resolution=i,t.source.resolution=this.resolution):this.resolution=t.source._resolution,this._frames=this.data.frames,this._frameKeys=Object.keys(this._frames),this._batchIndex=0,this._callback=null}parse(){return new Promise(t=>{this._callback=t,this._batchIndex=0,this._frameKeys.length<=Be.BATCH_SIZE?(this._processFrames(0),this._processAnimations(),this._parseComplete()):this._nextBatch()})}_processFrames(t){let e=t;const i=Be.BATCH_SIZE;for(;e-t{this._batchIndex*Be.BATCH_SIZE{i[n]=t}),Object.keys(t.textures).forEach(n=>{i[n]=t.textures[n]}),!e){const n=gt.dirname(s[0]);t.linkedSheets.forEach((r,a)=>{const o=Pr([`${n}/${t.data.meta.related_multi_packs[a]}`],r,!0);Object.assign(i,o)})}return i}const Do={extension:k.Asset,cache:{test:s=>s instanceof fn,getCacheableAssets:(s,t)=>Pr(s,t,!1)},resolver:{extension:{type:k.ResolveParser,name:"resolveSpritesheet"},test:s=>{const e=s.split("?")[0].split("."),i=e.pop(),n=e.pop();return i==="json"&&Lo.includes(n)},parse:s=>{var e;const t=s.split(".");return{resolution:parseFloat(((e=_e.RETINA_PREFIX.exec(s))==null?void 0:e[1])??"1"),format:t[t.length-2],src:s}}},loader:{name:"spritesheetLoader",extension:{type:k.LoadParser,priority:Ht.Normal,name:"spritesheetLoader"},async testParse(s,t){return gt.extname(t.src).toLowerCase()===".json"&&!!s.frames},async parse(s,t,e){var c,l;const{texture:i,imageFilename:n}=(t==null?void 0:t.data)??{};let r=gt.dirname(t.src);r&&r.lastIndexOf("/")!==r.length-1&&(r+="/");let a;if(i instanceof z)a=i;else{const d=rs(r+(n??s.meta.image),t.src);a=(await e.load([d]))[d]}const o=new fn(a.source,s);await o.parse();const h=(c=s==null?void 0:s.meta)==null?void 0:c.related_multi_packs;if(Array.isArray(h)){const d=[];for(const g of h){if(typeof g!="string")continue;let m=r+g;(l=t.data)!=null&&l.ignoreMultiPack||(m=rs(m,t.src),d.push(e.load({src:m,data:{ignoreMultiPack:!0}})))}const u=await Promise.all(d);o.linkedSheets=u,u.forEach(g=>{g.linkedSheets=[o].concat(o.linkedSheets.filter(m=>m!==g))})}return o},async unload(s,t,e){await e.unload(s.textureSource._sourceOrigin),s.destroy(!1)}}};lt.add(Do);const zi=Object.create(null),pn=Object.create(null);function As(s,t){let e=pn[s];return e===void 0&&(zi[t]===void 0&&(zi[t]=1),pn[s]=e=zi[t]++),e}let ne;function kr(){return(!ne||ne!=null&&ne.isContextLost())&&(ne=Q.get().createCanvas().getContext("webgl",{})),ne}let Je;function zo(){if(!Je){Je="mediump";const s=kr();s&&s.getShaderPrecisionFormat&&(Je=s.getShaderPrecisionFormat(s.FRAGMENT_SHADER,s.HIGH_FLOAT).precision?"highp":"mediump")}return Je}function Uo(s,t,e){return t?s:e?(s=s.replace("out vec4 finalColor;",""),` - - #ifdef GL_ES // This checks if it is WebGL1 - #define in varying - #define finalColor gl_FragColor - #define texture texture2D - #endif - ${s} - `):` - - #ifdef GL_ES // This checks if it is WebGL1 - #define in attribute - #define out varying - #endif - ${s} - `}function Wo(s,t,e){const i=e?t.maxSupportedFragmentPrecision:t.maxSupportedVertexPrecision;if(s.substring(0,9)!=="precision"){let n=e?t.requestedFragmentPrecision:t.requestedVertexPrecision;return n==="highp"&&i!=="highp"&&(n="mediump"),`precision ${n} float; -${s}`}else if(i!=="highp"&&s.substring(0,15)==="precision highp")return s.replace("precision highp","precision mediump");return s}function Oo(s,t){return t?`#version 300 es -${s}`:s}const No={},Ho={};function $o(s,{name:t="pixi-program"},e=!0){t=t.replace(/\s+/g,"-"),t+=e?"-fragment":"-vertex";const i=e?No:Ho;return i[t]?(i[t]++,t+=`-${i[t]}`):i[t]=1,s.indexOf("#define SHADER_NAME")!==-1?s:`${`#define SHADER_NAME ${t}`} -${s}`}function Vo(s,t){return t?s.replace("#version 300 es",""):s}const Ui={stripVersion:Vo,ensurePrecision:Wo,addProgramDefines:Uo,setProgramName:$o,insertVersion:Oo},Wi=Object.create(null),Gr=class as{constructor(t){t={...as.defaultOptions,...t};const e=t.fragment.indexOf("#version 300 es")!==-1,i={stripVersion:e,ensurePrecision:{requestedFragmentPrecision:t.preferredFragmentPrecision,requestedVertexPrecision:t.preferredVertexPrecision,maxSupportedVertexPrecision:"highp",maxSupportedFragmentPrecision:zo()},setProgramName:{name:t.name},addProgramDefines:e,insertVersion:e};let n=t.fragment,r=t.vertex;Object.keys(Ui).forEach(a=>{const o=i[a];n=Ui[a](n,o,!0),r=Ui[a](r,o,!1)}),this.fragment=n,this.vertex=r,this._key=As(`${this.vertex}:${this.fragment}`,"gl-program")}destroy(){this.fragment=null,this.vertex=null,this._attributeData=null,this._uniformData=null,this._uniformBlockData=null,this.transformFeedbackVaryings=null}static from(t){const e=`${t.vertex}:${t.fragment}`;return Wi[e]||(Wi[e]=new as(t)),Wi[e]}};Gr.defaultOptions={preferredVertexPrecision:"highp",preferredFragmentPrecision:"mediump"};let Ir=Gr;const gn={uint8x2:{size:2,stride:2,normalised:!1},uint8x4:{size:4,stride:4,normalised:!1},sint8x2:{size:2,stride:2,normalised:!1},sint8x4:{size:4,stride:4,normalised:!1},unorm8x2:{size:2,stride:2,normalised:!0},unorm8x4:{size:4,stride:4,normalised:!0},snorm8x2:{size:2,stride:2,normalised:!0},snorm8x4:{size:4,stride:4,normalised:!0},uint16x2:{size:2,stride:4,normalised:!1},uint16x4:{size:4,stride:8,normalised:!1},sint16x2:{size:2,stride:4,normalised:!1},sint16x4:{size:4,stride:8,normalised:!1},unorm16x2:{size:2,stride:4,normalised:!0},unorm16x4:{size:4,stride:8,normalised:!0},snorm16x2:{size:2,stride:4,normalised:!0},snorm16x4:{size:4,stride:8,normalised:!0},float16x2:{size:2,stride:4,normalised:!1},float16x4:{size:4,stride:8,normalised:!1},float32:{size:1,stride:4,normalised:!1},float32x2:{size:2,stride:8,normalised:!1},float32x3:{size:3,stride:12,normalised:!1},float32x4:{size:4,stride:16,normalised:!1},uint32:{size:1,stride:4,normalised:!1},uint32x2:{size:2,stride:8,normalised:!1},uint32x3:{size:3,stride:12,normalised:!1},uint32x4:{size:4,stride:16,normalised:!1},sint32:{size:1,stride:4,normalised:!1},sint32x2:{size:2,stride:8,normalised:!1},sint32x3:{size:3,stride:12,normalised:!1},sint32x4:{size:4,stride:16,normalised:!1}};function Xo(s){return gn[s]??gn.float32}const Yo={f32:"float32","vec2":"float32x2","vec3":"float32x3","vec4":"float32x4",vec2f:"float32x2",vec3f:"float32x3",vec4f:"float32x4",i32:"sint32","vec2":"sint32x2","vec3":"sint32x3","vec4":"sint32x4",u32:"uint32","vec2":"uint32x2","vec3":"uint32x3","vec4":"uint32x4",bool:"uint32","vec2":"uint32x2","vec3":"uint32x3","vec4":"uint32x4"};function jo({source:s,entryPoint:t}){const e={},i=s.indexOf(`fn ${t}`);if(i!==-1){const n=s.indexOf("->",i);if(n!==-1){const r=s.substring(i,n),a=/@location\((\d+)\)\s+([a-zA-Z0-9_]+)\s*:\s*([a-zA-Z0-9_<>]+)(?:,|\s|$)/g;let o;for(;(o=a.exec(r))!==null;){const h=Yo[o[3]]??"float32";e[o[2]]={location:parseInt(o[1],10),format:h,stride:Xo(h).stride,offset:0,instance:!1,start:0}}}}return e}function Oi(s){var d,u;const t=/(^|[^/])@(group|binding)\(\d+\)[^;]+;/g,e=/@group\((\d+)\)/,i=/@binding\((\d+)\)/,n=/var(<[^>]+>)? (\w+)/,r=/:\s*(\w+)/,a=/struct\s+(\w+)\s*{([^}]+)}/g,o=/(\w+)\s*:\s*([\w\<\>]+)/g,h=/struct\s+(\w+)/,c=(d=s.match(t))==null?void 0:d.map(g=>({group:parseInt(g.match(e)[1],10),binding:parseInt(g.match(i)[1],10),name:g.match(n)[2],isUniform:g.match(n)[1]==="",type:g.match(r)[1]}));if(!c)return{groups:[],structs:[]};const l=((u=s.match(a))==null?void 0:u.map(g=>{const m=g.match(h)[1],y=g.match(o).reduce((x,_)=>{const[w,b]=_.split(":");return x[w.trim()]=b.trim(),x},{});return y?{name:m,members:y}:null}).filter(({name:g})=>c.some(m=>m.type===g)))??[];return{groups:c,structs:l}}var Ee=(s=>(s[s.VERTEX=1]="VERTEX",s[s.FRAGMENT=2]="FRAGMENT",s[s.COMPUTE=4]="COMPUTE",s))(Ee||{});function qo({groups:s}){const t=[];for(let e=0;ee.has(a.name)?!1:(e.add(a.name),!0)),r=[...s.groups,...t.groups].filter(a=>{const o=`${a.name}-${a.binding}`;return i.has(o)?!1:(i.add(o),!0)});return{structs:n,groups:r}}const Ni=Object.create(null);class yi{constructor(t){var o,h;this._layoutKey=0,this._attributeLocationsKey=0;const{fragment:e,vertex:i,layout:n,gpuLayout:r,name:a}=t;if(this.name=a,this.fragment=e,this.vertex=i,e.source===i.source){const c=Oi(e.source);this.structsAndGroups=c}else{const c=Oi(i.source),l=Oi(e.source);this.structsAndGroups=Zo(c,l)}this.layout=n??Ko(this.structsAndGroups),this.gpuLayout=r??qo(this.structsAndGroups),this.autoAssignGlobalUniforms=((o=this.layout[0])==null?void 0:o.globalUniforms)!==void 0,this.autoAssignLocalUniforms=((h=this.layout[1])==null?void 0:h.localUniforms)!==void 0,this._generateProgramKey()}_generateProgramKey(){const{vertex:t,fragment:e}=this,i=t.source+e.source+t.entryPoint+e.entryPoint;this._layoutKey=As(i,"program")}get attributeData(){return this._attributeData??(this._attributeData=jo(this.vertex)),this._attributeData}destroy(){this.gpuLayout=null,this.layout=null,this.structsAndGroups=null,this.fragment=null,this.vertex=null}static from(t){const e=`${t.vertex.source}:${t.fragment.source}:${t.fragment.entryPoint}:${t.vertex.entryPoint}`;return Ni[e]||(Ni[e]=new yi(t)),Ni[e]}}const Br=["f32","i32","vec2","vec3","vec4","mat2x2","mat3x3","mat4x4","mat3x2","mat4x2","mat2x3","mat4x3","mat2x4","mat3x4"],Qo=Br.reduce((s,t)=>(s[t]=!0,s),{});function Jo(s,t){switch(s){case"f32":return 0;case"vec2":return new Float32Array(2*t);case"vec3":return new Float32Array(3*t);case"vec4":return new Float32Array(4*t);case"mat2x2":return new Float32Array([1,0,0,1]);case"mat3x3":return new Float32Array([1,0,0,0,1,0,0,0,1]);case"mat4x4":return new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])}return null}const Er=class Rr{constructor(t,e){this._touched=0,this.uid=nt("uniform"),this._resourceType="uniformGroup",this._resourceId=nt("resource"),this.isUniformGroup=!0,this._dirtyId=0,this.destroyed=!1,e={...Rr.defaultOptions,...e},this.uniformStructures=t;const i={};for(const n in t){const r=t[n];if(r.name=n,r.size=r.size??1,!Qo[r.type])throw new Error(`Uniform type ${r.type} is not supported. Supported uniform types are: ${Br.join(", ")}`);r.value??(r.value=Jo(r.type,r.size)),i[n]=r.value}this.uniforms=i,this._dirtyId=1,this.ubo=e.ubo,this.isStatic=e.isStatic,this._signature=As(Object.keys(i).map(n=>`${n}-${t[n].type}`).join("-"),"uniform-group")}update(){this._dirtyId++}};Er.defaultOptions={ubo:!1,isStatic:!1};let Fr=Er;class hi{constructor(t){this.resources=Object.create(null),this._dirty=!0;let e=0;for(const i in t){const n=t[i];this.setResource(n,e++)}this._updateKey()}_updateKey(){if(!this._dirty)return;this._dirty=!1;const t=[];let e=0;for(const i in this.resources)t[e++]=this.resources[i]._resourceId;this._key=t.join("|")}setResource(t,e){var n,r;const i=this.resources[e];t!==i&&(i&&((n=t.off)==null||n.call(t,"change",this.onResourceChange,this)),(r=t.on)==null||r.call(t,"change",this.onResourceChange,this),this.resources[e]=t,this._dirty=!0)}getResource(t){return this.resources[t]}_touch(t){const e=this.resources;for(const i in e)e[i]._touched=t}destroy(){var e;const t=this.resources;for(const i in t){const n=t[i];(e=n.off)==null||e.call(n,"change",this.onResourceChange,this)}this.resources=null}onResourceChange(t){if(this._dirty=!0,t.destroyed){const e=this.resources;for(const i in e)e[i]===t&&(e[i]=null)}else this._updateKey()}}var os=(s=>(s[s.WEBGL=1]="WEBGL",s[s.WEBGPU=2]="WEBGPU",s[s.BOTH=3]="BOTH",s))(os||{});class Ms extends ft{constructor(t){super(),this._uniformBindMap=Object.create(null),this._ownedBindGroups=[];let{gpuProgram:e,glProgram:i,groups:n,resources:r,compatibleRenderers:a,groupMap:o}=t;this.gpuProgram=e,this.glProgram=i,a===void 0&&(a=0,e&&(a|=os.WEBGPU),i&&(a|=os.WEBGL)),this.compatibleRenderers=a;const h={};if(!r&&!n&&(r={}),r&&n)throw new Error("[Shader] Cannot have both resources and groups");if(!e&&n&&!o)throw new Error("[Shader] No group map or WebGPU shader provided - consider using resources instead.");if(!e&&n&&o)for(const c in o)for(const l in o[c]){const d=o[c][l];h[d]={group:c,binding:l,name:d}}else if(e&&n&&!o){const c=e.structsAndGroups.groups;o={},c.forEach(l=>{o[l.group]=o[l.group]||{},o[l.group][l.binding]=l.name,h[l.name]=l})}else if(r){n={},o={},e&&e.structsAndGroups.groups.forEach(d=>{o[d.group]=o[d.group]||{},o[d.group][d.binding]=d.name,h[d.name]=d});let c=0;for(const l in r)h[l]||(n[99]||(n[99]=new hi,this._ownedBindGroups.push(n[99])),h[l]={group:99,binding:c,name:l},o[99]=o[99]||{},o[99][c]=l,c++);for(const l in r){const d=l;let u=r[l];!u.source&&!u._resourceType&&(u=new Fr(u));const g=h[d];g&&(n[g.group]||(n[g.group]=new hi,this._ownedBindGroups.push(n[g.group])),n[g.group].setResource(u,g.binding))}}this.groups=n,this._uniformBindMap=o,this.resources=this._buildResourceAccessor(n,h)}addResource(t,e,i){var n,r;(n=this._uniformBindMap)[e]||(n[e]={}),(r=this._uniformBindMap[e])[i]||(r[i]=t),this.groups[e]||(this.groups[e]=new hi,this._ownedBindGroups.push(this.groups[e]))}_buildResourceAccessor(t,e){const i={};for(const n in e){const r=e[n];Object.defineProperty(i,r.name,{get(){return t[r.group].getResource(r.binding)},set(a){t[r.group].setResource(a,r.binding)}})}return i}destroy(t=!1){var e,i;this.emit("destroy",this),t&&((e=this.gpuProgram)==null||e.destroy(),(i=this.glProgram)==null||i.destroy()),this.gpuProgram=null,this.glProgram=null,this.removeAllListeners(),this._uniformBindMap=null,this._ownedBindGroups.forEach(n=>{n.destroy()}),this._ownedBindGroups=null,this.resources=null,this.groups=null}static from(t){const{gpu:e,gl:i,...n}=t;let r,a;return e&&(r=yi.from(e)),i&&(a=Ir.from(i)),new Ms({gpuProgram:r,glProgram:a,...n})}}const hs=[];lt.handleByNamedList(k.Environment,hs);async function th(s){if(!s)for(let t=0;t80*e){o=c=s[0],h=l=s[1];for(var m=e;mc&&(c=d),u>l&&(l=u);g=Math.max(c-o,l-h),g=g!==0?32767/g:0}return ze(r,a,e,o,h,g,0),a}function Lr(s,t,e,i,n){var r,a;if(n===ds(s,t,e,i)>0)for(r=t;r=t;r-=i)a=mn(r,s[r],s[r+1],a);return a&&wi(a,a.next)&&(We(a),a=a.next),a}function se(s,t){if(!s)return s;t||(t=s);var e=s,i;do if(i=!1,!e.steiner&&(wi(e,e.next)||q(e.prev,e,e.next)===0)){if(We(e),e=t=e.prev,e===e.next)break;i=!0}else e=e.next;while(i||e!==t);return t}function ze(s,t,e,i,n,r,a){if(s){!a&&r&&dh(s,i,n,r);for(var o=s,h,c;s.prev!==s.next;){if(h=s.prev,c=s.next,r?sh(s,i,n,r):ih(s)){t.push(h.i/e|0),t.push(s.i/e|0),t.push(c.i/e|0),We(s),s=c.next,o=c.next;continue}if(s=c,s===o){a?a===1?(s=nh(se(s),t,e),ze(s,t,e,i,n,r,2)):a===2&&rh(s,t,e,i,n,r):ze(se(s),t,e,i,n,r,1);break}}}}function ih(s){var t=s.prev,e=s,i=s.next;if(q(t,e,i)>=0)return!1;for(var n=t.x,r=e.x,a=i.x,o=t.y,h=e.y,c=i.y,l=nr?n>a?n:a:r>a?r:a,g=o>h?o>c?o:c:h>c?h:c,m=i.next;m!==t;){if(m.x>=l&&m.x<=u&&m.y>=d&&m.y<=g&&he(n,o,r,h,a,c,m.x,m.y)&&q(m.prev,m,m.next)>=0)return!1;m=m.next}return!0}function sh(s,t,e,i){var n=s.prev,r=s,a=s.next;if(q(n,r,a)>=0)return!1;for(var o=n.x,h=r.x,c=a.x,l=n.y,d=r.y,u=a.y,g=oh?o>c?o:c:h>c?h:c,x=l>d?l>u?l:u:d>u?d:u,_=ls(g,m,t,e,i),w=ls(y,x,t,e,i),b=s.prevZ,S=s.nextZ;b&&b.z>=_&&S&&S.z<=w;){if(b.x>=g&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==a&&he(o,l,h,d,c,u,b.x,b.y)&&q(b.prev,b,b.next)>=0||(b=b.prevZ,S.x>=g&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==a&&he(o,l,h,d,c,u,S.x,S.y)&&q(S.prev,S,S.next)>=0))return!1;S=S.nextZ}for(;b&&b.z>=_;){if(b.x>=g&&b.x<=y&&b.y>=m&&b.y<=x&&b!==n&&b!==a&&he(o,l,h,d,c,u,b.x,b.y)&&q(b.prev,b,b.next)>=0)return!1;b=b.prevZ}for(;S&&S.z<=w;){if(S.x>=g&&S.x<=y&&S.y>=m&&S.y<=x&&S!==n&&S!==a&&he(o,l,h,d,c,u,S.x,S.y)&&q(S.prev,S,S.next)>=0)return!1;S=S.nextZ}return!0}function nh(s,t,e){var i=s;do{var n=i.prev,r=i.next.next;!wi(n,r)&&Dr(n,i,i.next,r)&&Ue(n,r)&&Ue(r,n)&&(t.push(n.i/e|0),t.push(i.i/e|0),t.push(r.i/e|0),We(i),We(i.next),i=s=r),i=i.next}while(i!==s);return se(i)}function rh(s,t,e,i,n,r){var a=s;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&ph(a,o)){var h=zr(a,o);a=se(a,a.next),h=se(h,h.next),ze(a,t,e,i,n,r,0),ze(h,t,e,i,n,r,0);return}o=o.next}a=a.next}while(a!==s)}function ah(s,t,e,i){var n=[],r,a,o,h,c;for(r=0,a=t.length;r=e.next.y&&e.next.y!==e.y){var o=e.x+(n-e.y)*(e.next.x-e.x)/(e.next.y-e.y);if(o<=i&&o>r&&(r=o,a=e.x=e.x&&e.x>=c&&i!==e.x&&he(na.x||e.x===a.x&&ch(a,e)))&&(a=e,d=u)),e=e.next;while(e!==h);return a}function ch(s,t){return q(s.prev,s,t.prev)<0&&q(t.next,s,s.next)<0}function dh(s,t,e,i){var n=s;do n.z===0&&(n.z=ls(n.x,n.y,t,e,i)),n.prevZ=n.prev,n.nextZ=n.next,n=n.next;while(n!==s);n.prevZ.nextZ=null,n.prevZ=null,uh(n)}function uh(s){var t,e,i,n,r,a,o,h,c=1;do{for(e=s,s=null,r=null,a=0;e;){for(a++,i=e,o=0,t=0;t0||h>0&&i;)o!==0&&(h===0||!i||e.z<=i.z)?(n=e,e=e.nextZ,o--):(n=i,i=i.nextZ,h--),r?r.nextZ=n:s=n,n.prevZ=r,r=n;e=i}r.nextZ=null,c*=2}while(a>1);return s}function ls(s,t,e,i,n){return s=(s-e)*n|0,t=(t-i)*n|0,s=(s|s<<8)&16711935,s=(s|s<<4)&252645135,s=(s|s<<2)&858993459,s=(s|s<<1)&1431655765,t=(t|t<<8)&16711935,t=(t|t<<4)&252645135,t=(t|t<<2)&858993459,t=(t|t<<1)&1431655765,s|t<<1}function fh(s){var t=s,e=s;do(t.x=(s-a)*(r-o)&&(s-a)*(i-o)>=(e-a)*(t-o)&&(e-a)*(r-o)>=(n-a)*(i-o)}function ph(s,t){return s.next.i!==t.i&&s.prev.i!==t.i&&!gh(s,t)&&(Ue(s,t)&&Ue(t,s)&&mh(s,t)&&(q(s.prev,s,t.prev)||q(s,t.prev,t))||wi(s,t)&&q(s.prev,s,s.next)>0&&q(t.prev,t,t.next)>0)}function q(s,t,e){return(t.y-s.y)*(e.x-t.x)-(t.x-s.x)*(e.y-t.y)}function wi(s,t){return s.x===t.x&&s.y===t.y}function Dr(s,t,e,i){var n=ei(q(s,t,e)),r=ei(q(s,t,i)),a=ei(q(e,i,s)),o=ei(q(e,i,t));return!!(n!==r&&a!==o||n===0&&ti(s,e,t)||r===0&&ti(s,i,t)||a===0&&ti(e,s,i)||o===0&&ti(e,t,i))}function ti(s,t,e){return t.x<=Math.max(s.x,e.x)&&t.x>=Math.min(s.x,e.x)&&t.y<=Math.max(s.y,e.y)&&t.y>=Math.min(s.y,e.y)}function ei(s){return s>0?1:s<0?-1:0}function gh(s,t){var e=s;do{if(e.i!==s.i&&e.next.i!==s.i&&e.i!==t.i&&e.next.i!==t.i&&Dr(e,e.next,s,t))return!0;e=e.next}while(e!==s);return!1}function Ue(s,t){return q(s.prev,s,s.next)<0?q(s,t,s.next)>=0&&q(s,s.prev,t)>=0:q(s,t,s.prev)<0||q(s,s.next,t)<0}function mh(s,t){var e=s,i=!1,n=(s.x+t.x)/2,r=(s.y+t.y)/2;do e.y>r!=e.next.y>r&&e.next.y!==e.y&&n<(e.next.x-e.x)*(r-e.y)/(e.next.y-e.y)+e.x&&(i=!i),e=e.next;while(e!==s);return i}function zr(s,t){var e=new cs(s.i,s.x,s.y),i=new cs(t.i,t.x,t.y),n=s.next,r=t.prev;return s.next=t,t.prev=s,e.next=n,n.prev=e,i.next=e,e.prev=i,r.next=i,i.prev=r,i}function mn(s,t,e,i){var n=new cs(s,t,e);return i?(n.next=i.next,n.prev=i,i.next.prev=n,i.next=n):(n.prev=n,n.next=n),n}function We(s){s.next.prev=s.prev,s.prev.next=s.next,s.prevZ&&(s.prevZ.nextZ=s.nextZ),s.nextZ&&(s.nextZ.prevZ=s.prevZ)}function cs(s,t,e){this.i=s,this.x=t,this.y=e,this.prev=null,this.next=null,this.z=0,this.prevZ=null,this.nextZ=null,this.steiner=!1}_i.deviation=function(s,t,e,i){var n=t&&t.length,r=n?t[0]*e:s.length,a=Math.abs(ds(s,0,r,e));if(n)for(var o=0,h=t.length;o0&&(i+=s[n-1].length,e.holes.push(i))}return e};var xh=Ps.exports;const yh=vs(xh);var Ur=(s=>(s[s.NONE=0]="NONE",s[s.COLOR=16384]="COLOR",s[s.STENCIL=1024]="STENCIL",s[s.DEPTH=256]="DEPTH",s[s.COLOR_DEPTH=16640]="COLOR_DEPTH",s[s.COLOR_STENCIL=17408]="COLOR_STENCIL",s[s.DEPTH_STENCIL=1280]="DEPTH_STENCIL",s[s.ALL=17664]="ALL",s))(Ur||{});class _h{constructor(t){this.items=[],this._name=t}emit(t,e,i,n,r,a,o,h){const{name:c,items:l}=this;for(let d=0,u=l.length;d{this.runners[e]=new _h(e)})}_addSystems(t){let e;for(e in t){const i=t[e];this._addSystem(i.value,i.name)}}_addSystem(t,e){const i=new t(this);if(this[e])throw new Error(`Whoops! The name "${e}" is already in use`);this[e]=i,this._systemsHash[e]=i;for(const n in this.runners)this.runners[n].add(i);return this}_addPipes(t,e){const i=e.reduce((n,r)=>(n[r.name]=r.value,n),{});t.forEach(n=>{const r=n.value,a=n.name,o=i[a];this.renderPipes[a]=new r(this,o?new o:null)})}destroy(t=!1){this.runners.destroy.items.reverse(),this.runners.destroy.emit(t),Object.values(this.runners).forEach(e=>{e.destroy()}),this._systemsHash=null,this.renderPipes=null}generateTexture(t){return this.textureGenerator.generateTexture(t)}get roundPixels(){return!!this._roundPixels}_unsafeEvalCheck(){if(!eh())throw new Error("Current environment does not allow unsafe-eval, please use pixi.js/unsafe-eval module to enable support.")}};Wr.defaultOptions={resolution:1,failIfMajorPerformanceCaveat:!1,roundPixels:!1};let Nr=Wr,ii;function bh(s){return ii!==void 0||(ii=(()=>{var e;const t={stencil:!0,failIfMajorPerformanceCaveat:s??Nr.defaultOptions.failIfMajorPerformanceCaveat};try{if(!Q.get().getWebGLRenderingContext())return!1;let n=Q.get().createCanvas().getContext("webgl",t);const r=!!((e=n==null?void 0:n.getContextAttributes())!=null&&e.stencil);if(n){const a=n.getExtension("WEBGL_lose_context");a&&a.loseContext()}return n=null,r}catch{return!1}})()),ii}let si;async function Sh(s={}){return si!==void 0||(si=await(async()=>{const t=Q.get().getNavigator().gpu;if(!t)return!1;try{return await(await t.requestAdapter(s)).requestDevice(),!0}catch{return!1}})()),si}const xn=["webgl","webgpu","canvas"];async function vh(s){let t=[];s.preference?(t.push(s.preference),xn.forEach(r=>{r!==s.preference&&t.push(r)})):t=xn.slice();let e,i={};for(let r=0;r{const{WebGPURenderer:h}=await import("./WebGPURenderer-BJsHNgQI.js");return{WebGPURenderer:h}},__vite__mapDeps([3,2,4]));e=o,i={...s,...s.webgpu};break}else if(a==="webgl"&&bh(s.failIfMajorPerformanceCaveat??Nr.defaultOptions.failIfMajorPerformanceCaveat)){const{WebGLRenderer:o}=await ci(async()=>{const{WebGLRenderer:h}=await import("./WebGLRenderer-B-VwtzIo.js");return{WebGLRenderer:h}},__vite__mapDeps([5,2,4]));e=o,i={...s,...s.webgl};break}else if(a==="canvas")throw i={...s},new Error("CanvasRenderer is not yet implemented")}if(delete i.webgpu,delete i.webgl,!e)throw new Error("No available renderer for the current environment");const n=new e;return await n.init(i),n}const Hr="8.4.0";class $r{static init(){var t;(t=globalThis.__PIXI_APP_INIT__)==null||t.call(globalThis,this,Hr)}static destroy(){}}$r.extension=k.Application;class Ch{constructor(t){this._renderer=t}init(){var t;(t=globalThis.__PIXI_RENDERER_INIT__)==null||t.call(globalThis,this._renderer,Hr)}destroy(){this._renderer=null}}Ch.extension={type:[k.WebGLSystem,k.WebGPUSystem],name:"initHook",priority:-10};const Vr=class us{constructor(...t){this.stage=new J,t[0]!==void 0&&U(O,"Application constructor options are deprecated, please use Application.init() instead.")}async init(t){t={...t},this.renderer=await vh(t),us._plugins.forEach(e=>{e.init.call(this,t)})}render(){this.renderer.render({container:this.stage})}get canvas(){return this.renderer.canvas}get view(){return U(O,"Application.view is deprecated, please use Application.canvas instead."),this.renderer.canvas}get screen(){return this.renderer.screen}destroy(t=!1,e=!1){const i=us._plugins.slice(0);i.reverse(),i.forEach(n=>{n.destroy.call(this)}),this.stage.destroy(e),this.stage=null,this.renderer.destroy(t),this.renderer=null}};Vr._plugins=[];let Xr=Vr;lt.handleByList(k.Application,Xr._plugins);lt.add($r);class Yr extends ft{constructor(){super(...arguments),this.chars=Object.create(null),this.lineHeight=0,this.fontFamily="",this.fontMetrics={fontSize:0,ascent:0,descent:0},this.baseLineOffset=0,this.distanceField={type:"none",range:0},this.pages=[],this.applyFillAsTint=!0,this.baseMeasurementFontSize=100,this.baseRenderedFontSize=100}get font(){return U(O,"BitmapFont.font is deprecated, please use BitmapFont.fontFamily instead."),this.fontFamily}get pageTextures(){return U(O,"BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead."),this.pages}get size(){return U(O,"BitmapFont.size is deprecated, please use BitmapFont.fontMetrics.fontSize instead."),this.fontMetrics.fontSize}get distanceFieldRange(){return U(O,"BitmapFont.distanceFieldRange is deprecated, please use BitmapFont.distanceField.range instead."),this.distanceField.range}get distanceFieldType(){return U(O,"BitmapFont.distanceFieldType is deprecated, please use BitmapFont.distanceField.type instead."),this.distanceField.type}destroy(t=!1){var e;this.emit("destroy",this),this.removeAllListeners();for(const i in this.chars)(e=this.chars[i].texture)==null||e.destroy();this.chars=null,t&&(this.pages.forEach(i=>i.texture.destroy(!0)),this.pages=null)}}const jr=class fs{constructor(t,e,i,n){this.uid=nt("fillGradient"),this.type="linear",this.gradientStops=[],this._styleKey=null,this.x0=t,this.y0=e,this.x1=i,this.y1=n}addColorStop(t,e){return this.gradientStops.push({offset:t,color:Z.shared.setValue(e).toHexa()}),this._styleKey=null,this}buildLinearGradient(){const t=fs.defaultTextureSize,{gradientStops:e}=this,i=Q.get().createCanvas();i.width=t,i.height=t;const n=i.getContext("2d"),r=n.createLinearGradient(0,0,fs.defaultTextureSize,1);for(let y=0;y`${n.offset}-${n.color}`).join("-"),e=this.texture.uid,i=this.transform.toArray().join("-");return`fill-gradient-${this.uid}-${t}-${e}-${i}-${this.x0}-${this.y0}-${this.x1}-${this.y1}`}};jr.defaultTextureSize=256;let Oe=jr;const yn={repeat:{addressModeU:"repeat",addressModeV:"repeat"},"repeat-x":{addressModeU:"repeat",addressModeV:"clamp-to-edge"},"repeat-y":{addressModeU:"clamp-to-edge",addressModeV:"repeat"},"no-repeat":{addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"}};class bi{constructor(t,e){this.uid=nt("fillPattern"),this.transform=new H,this._styleKey=null,this.texture=t,this.transform.scale(1/t.frame.width,1/t.frame.height),e&&(t.source.style.addressModeU=yn[e].addressModeU,t.source.style.addressModeV=yn[e].addressModeV)}setTransform(t){const e=this.texture;this.transform.copyFrom(t),this.transform.invert(),this.transform.scale(1/e.frame.width,1/e.frame.height),this._styleKey=null}get styleKey(){return this._styleKey?this._styleKey:(this._styleKey=`fill-pattern-${this.uid}-${this.texture.uid}-${this.transform.toArray().join("-")}`,this._styleKey)}}var Th=Mh,Hi={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},Ah=/([astvzqmhlc])([^astvzqmhlc]*)/ig;function Mh(s){var t=[];return s.replace(Ah,function(e,i,n){var r=i.toLowerCase();for(n=kh(n),r=="m"&&n.length>2&&(t.push([i].concat(n.splice(0,2))),r="l",i=i=="m"?"l":"L");;){if(n.length==Hi[r])return n.unshift(i),t.push(n);if(n.length0&&(n=i.pop(),n?(r=n.startX,a=n.startY):(r=0,a=0)),n=null;break;default:st(`Unknown SVG path command: ${c}`)}c!=="Z"&&c!=="z"&&n===null&&(n={startX:r,startY:a},i.push(n))}return t}class ks{constructor(t=0,e=0,i=0){this.type="circle",this.x=t,this.y=e,this.radius=i}clone(){return new ks(this.x,this.y,this.radius)}contains(t,e){if(this.radius<=0)return!1;const i=this.radius*this.radius;let n=this.x-t,r=this.y-e;return n*=n,r*=r,n+r<=i}strokeContains(t,e,i){if(this.radius===0)return!1;const n=this.x-t,r=this.y-e,a=this.radius,o=i/2,h=Math.sqrt(n*n+r*r);return ha-o}getBounds(t){return t=t||new E,t.x=this.x-this.radius,t.y=this.y-this.radius,t.width=this.radius*2,t.height=this.radius*2,t}copyFrom(t){return this.x=t.x,this.y=t.y,this.radius=t.radius,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:Circle x=${this.x} y=${this.y} radius=${this.radius}]`}}class Gs{constructor(t=0,e=0,i=0,n=0){this.type="ellipse",this.x=t,this.y=e,this.halfWidth=i,this.halfHeight=n}clone(){return new Gs(this.x,this.y,this.halfWidth,this.halfHeight)}contains(t,e){if(this.halfWidth<=0||this.halfHeight<=0)return!1;let i=(t-this.x)/this.halfWidth,n=(e-this.y)/this.halfHeight;return i*=i,n*=n,i+n<=1}strokeContains(t,e,i){const{halfWidth:n,halfHeight:r}=this;if(n<=0||r<=0)return!1;const a=i/2,o=n-a,h=r-a,c=n+a,l=r+a,d=t-this.x,u=e-this.y,g=d*d/(o*o)+u*u/(h*h),m=d*d/(c*c)+u*u/(l*l);return g>1&&m<=1}getBounds(t){return t=t||new E,t.x=this.x-this.halfWidth,t.y=this.y-this.halfHeight,t.width=this.halfWidth*2,t.height=this.halfHeight*2,t}copyFrom(t){return this.x=t.x,this.y=t.y,this.halfWidth=t.halfWidth,this.halfHeight=t.halfHeight,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:Ellipse x=${this.x} y=${this.y} halfWidth=${this.halfWidth} halfHeight=${this.halfHeight}]`}}function Bh(s,t,e,i,n,r){const a=s-e,o=t-i,h=n-e,c=r-i,l=a*h+o*c,d=h*h+c*c;let u=-1;d!==0&&(u=l/d);let g,m;u<0?(g=e,m=i):u>1?(g=n,m=r):(g=e+u*h,m=i+u*c);const y=s-g,x=t-m;return y*y+x*x}class Le{constructor(...t){this.type="polygon";let e=Array.isArray(t[0])?t[0]:t;if(typeof e[0]!="number"){const i=[];for(let n=0,r=e.length;ne!=l>e&&t<(c-o)*((e-h)/(l-h))+o&&(i=!i)}return i}strokeContains(t,e,i){const n=i/2,r=n*n,{points:a}=this,o=a.length-(this.closePath?0:2);for(let h=0;hn?c:n,r=la?l:a}return t.x=i,t.width=n-i,t.y=r,t.height=a-r,t}copyFrom(t){return this.points=t.points.slice(),this.closePath=t.closePath,this}copyTo(t){return t.copyFrom(this),t}toString(){return`[pixi.js/math:PolygoncloseStroke=${this.closePath}points=${this.points.reduce((t,e)=>`${t}, ${e}`,"")}]`}get lastX(){return this.points[this.points.length-2]}get lastY(){return this.points[this.points.length-1]}get x(){return this.points[this.points.length-2]}get y(){return this.points[this.points.length-1]}}const ni=(s,t,e,i,n,r)=>{const a=s-e,o=t-i,h=Math.sqrt(a*a+o*o);return h>=n-r&&h<=n+r};class Is{constructor(t=0,e=0,i=0,n=0,r=20){this.type="roundedRectangle",this.x=t,this.y=e,this.width=i,this.height=n,this.radius=r}getBounds(t){return t=t||new E,t.x=this.x,t.y=this.y,t.width=this.width,t.height=this.height,t}clone(){return new Is(this.x,this.y,this.width,this.height,this.radius)}copyFrom(t){return this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height,this}copyTo(t){return t.copyFrom(this),t}contains(t,e){if(this.width<=0||this.height<=0)return!1;if(t>=this.x&&t<=this.x+this.width&&e>=this.y&&e<=this.y+this.height){const i=Math.max(0,Math.min(this.radius,Math.min(this.width,this.height)/2));if(e>=this.y+i&&e<=this.y+this.height-i||t>=this.x+i&&t<=this.x+this.width-i)return!0;let n=t-(this.x+i),r=e-(this.y+i);const a=i*i;if(n*n+r*r<=a||(n=t-(this.x+this.width-i),n*n+r*r<=a)||(r=e-(this.y+this.height-i),n*n+r*r<=a)||(n=t-(this.x+i),n*n+r*r<=a))return!0}return!1}strokeContains(t,e,i){const{x:n,y:r,width:a,height:o,radius:h}=this,c=i/2,l=n+h,d=r+h,u=a-h*2,g=o-h*2,m=n+a,y=r+o;return(t>=n-c&&t<=n+c||t>=m-c&&t<=m+c)&&e>=d&&e<=d+g||(e>=r-c&&e<=r+c||e>=y-c&&e<=y+c)&&t>=l&&t<=l+u?!0:tm-h&&em-h&&e>y-h&&ni(t,e,m-h,y-h,h,c)||ty-h&&ni(t,e,l,y-h,h,c)}toString(){return`[pixi.js/math:RoundedRectangle x=${this.x} y=${this.y}width=${this.width} height=${this.height} radius=${this.radius}]`}}const Eh=["precision mediump float;","void main(void){","float test = 0.1;","%forloop%","gl_FragColor = vec4(0.0);","}"].join(` -`);function Rh(s){let t="";for(let e=0;e0&&(t+=` -else `),e>>=0;return Kr[e]||Dh(s,t,e)}let $i=0;function Dh(s,t,e){const i={};let n=0;$i||($i=qr());for(let a=0;a<$i;a++){const o=a0){const a=new Uint8Array(s,e*8,r);new Uint8Array(t,e*8,r).set(a)}}const zh={normal:"normal-npm",add:"add-npm",screen:"screen-npm"};var Uh=(s=>(s[s.DISABLED=0]="DISABLED",s[s.RENDERING_MASK_ADD=1]="RENDERING_MASK_ADD",s[s.MASK_ACTIVE=2]="MASK_ACTIVE",s[s.RENDERING_MASK_REMOVE=3]="RENDERING_MASK_REMOVE",s[s.NONE=4]="NONE",s))(Uh||{});function bn(s,t){return t.alphaMode==="no-premultiply-alpha"&&zh[s]||s}class Wh{constructor(){this.ids=Object.create(null),this.textures=[],this.count=0}clear(){for(let t=0;t0?Zr[--ps]:new Oh}function vn(s){Zr[ps++]=s}let Pe=0;const Qr=class li{constructor(t={}){this.uid=nt("batcher"),this.dirty=!0,this.batchIndex=0,this.batches=[],this._elements=[],li.defaultOptions.maxTextures=li.defaultOptions.maxTextures??qr(),t={...li.defaultOptions,...t};const{maxTextures:e,attributesInitialSize:i,indicesInitialSize:n}=t;this.attributeBuffer=new _n(i*4),this.indexBuffer=new Uint16Array(n),this.maxTextures=e}begin(){this.elementSize=0,this.elementStart=0,this.indexSize=0,this.attributeSize=0;for(let t=0;tthis.attributeBuffer.size&&this._resizeAttributeBuffer(this.attributeSize*4),this.indexSize>this.indexBuffer.length&&this._resizeIndexBuffer(this.indexSize);const o=this.attributeBuffer.float32View,h=this.attributeBuffer.uint32View,c=this.indexBuffer;let l=this._batchIndexSize,d=this._batchIndexStart,u="startBatch";const g=this.maxTextures;for(let m=this.elementStart;m=g||b)&&(this._finishBatch(i,d,l-d,n,a,t,u),u="renderBatch",d=l,a=w,i=Sn(),n=i.textures,n.clear(),++Pe),y._textureId=_._textureBindLocation=n.count,n.ids[_.uid]=n.count,n.textures[n.count++]=_,y._batch=i,l+=y.indexSize,y.packAsQuad?(this.packQuadAttributes(y,o,h,y._attributeStart,y._textureId),this.packQuadIndex(c,y._indexStart,y._attributeStart/this.vertexSize)):(this.packAttributes(y,o,h,y._attributeStart,y._textureId),this.packIndex(y,c,y._indexStart,y._attributeStart/this.vertexSize))}n.count>0&&(this._finishBatch(i,d,l-d,n,a,t,u),d=l,++Pe),this.elementStart=this.elementSize,this._batchIndexStart=d,this._batchIndexSize=l}_finishBatch(t,e,i,n,r,a,o){t.gpuBindGroup=null,t.bindGroup=null,t.action=o,t.batcher=this,t.textures=n,t.blendMode=r,t.start=e,t.size=i,++Pe,this.batches[this.batchIndex++]=t,a.add(t)}finish(t){this.break(t)}ensureAttributeBuffer(t){t*4<=this.attributeBuffer.size||this._resizeAttributeBuffer(t*4)}ensureIndexBuffer(t){t<=this.indexBuffer.length||this._resizeIndexBuffer(t)}_resizeAttributeBuffer(t){const e=Math.max(t,this.attributeBuffer.size*2),i=new _n(e);wn(this.attributeBuffer.rawBinaryData,i.rawBinaryData),this.attributeBuffer=i}_resizeIndexBuffer(t){const e=this.indexBuffer;let i=Math.max(t,e.length*1.5);i+=i%2;const n=i>65535?new Uint32Array(i):new Uint16Array(i);if(n.BYTES_PER_ELEMENT!==e.BYTES_PER_ELEMENT)for(let r=0;r(s[s.MAP_READ=1]="MAP_READ",s[s.MAP_WRITE=2]="MAP_WRITE",s[s.COPY_SRC=4]="COPY_SRC",s[s.COPY_DST=8]="COPY_DST",s[s.INDEX=16]="INDEX",s[s.VERTEX=32]="VERTEX",s[s.UNIFORM=64]="UNIFORM",s[s.STORAGE=128]="STORAGE",s[s.INDIRECT=256]="INDIRECT",s[s.QUERY_RESOLVE=512]="QUERY_RESOLVE",s[s.STATIC=1024]="STATIC",s))(it||{});class Ot extends ft{constructor(t){let{data:e,size:i}=t;const{usage:n,label:r,shrinkToFit:a}=t;super(),this.uid=nt("buffer"),this._resourceType="buffer",this._resourceId=nt("resource"),this._touched=0,this._updateID=1,this.shrinkToFit=!0,this.destroyed=!1,e instanceof Array&&(e=new Float32Array(e)),this._data=e,i=i??(e==null?void 0:e.byteLength);const o=!!e;this.descriptor={size:i,usage:n,mappedAtCreation:o,label:r},this.shrinkToFit=a??!0}get data(){return this._data}set data(t){this.setDataWithSize(t,t.length,!0)}get static(){return!!(this.descriptor.usage&it.STATIC)}set static(t){t?this.descriptor.usage|=it.STATIC:this.descriptor.usage&=~it.STATIC}setDataWithSize(t,e,i){if(this._updateID++,this._updateSize=e*t.BYTES_PER_ELEMENT,this._data===t){i&&this.emit("update",this);return}const n=this._data;if(this._data=t,n.length!==t.length){!this.shrinkToFit&&t.byteLengtho&&(o=g),m>h&&(h=m),ge.destroy()),this.attributes=null,this.buffers=null,this.indexBuffer=null,this._bounds=null}}const Vh=new Float32Array(1),Xh=new Uint32Array(1);class Yh extends ta{constructor(){const e=new Ot({data:Vh,label:"attribute-batch-buffer",usage:it.VERTEX|it.COPY_DST,shrinkToFit:!1}),i=new Ot({data:Xh,label:"index-batch-buffer",usage:it.INDEX|it.COPY_DST,shrinkToFit:!1}),n=6*4;super({attributes:{aPosition:{buffer:e,format:"float32x2",stride:n,offset:0},aUV:{buffer:e,format:"float32x2",stride:n,offset:2*4},aColor:{buffer:e,format:"unorm8x4",stride:n,offset:4*4},aTextureIdAndRound:{buffer:e,format:"uint16x2",stride:n,offset:5*4}},indexBuffer:i})}}function Cn(s,t,e){if(s)for(const i in s){const n=i.toLocaleLowerCase(),r=t[n];if(r){let a=s[i];i==="header"&&(a=a.replace(/@in\s+[^;]+;\s*/g,"").replace(/@out\s+[^;]+;\s*/g,"")),e&&r.push(`//----${e}----//`),r.push(a)}else st(`${i} placement hook does not exist in shader`)}}const jh=/\{\{(.*?)\}\}/g;function Tn(s){var i;const t={};return(((i=s.match(jh))==null?void 0:i.map(n=>n.replace(/[{()}]/g,"")))??[]).forEach(n=>{t[n]=[]}),t}function An(s,t){let e;const i=/@in\s+([^;]+);/g;for(;(e=i.exec(s))!==null;)t.push(e[1])}function Mn(s,t,e=!1){const i=[];An(t,i),s.forEach(o=>{o.header&&An(o.header,i)});const n=i;e&&n.sort();const r=n.map((o,h)=>` @location(${h}) ${o},`).join(` -`);let a=t.replace(/@in\s+[^;]+;\s*/g,"");return a=a.replace("{{in}}",` -${r} -`),a}function Pn(s,t){let e;const i=/@out\s+([^;]+);/g;for(;(e=i.exec(s))!==null;)t.push(e[1])}function qh(s){const e=/\b(\w+)\s*:/g.exec(s);return e?e[1]:""}function Kh(s){const t=/@.*?\s+/g;return s.replace(t,"")}function Zh(s,t){const e=[];Pn(t,e),s.forEach(h=>{h.header&&Pn(h.header,e)});let i=0;const n=e.sort().map(h=>h.indexOf("builtin")>-1?h:`@location(${i++}) ${h}`).join(`, -`),r=e.sort().map(h=>` var ${Kh(h)};`).join(` -`),a=`return VSOutput( - ${e.sort().map(h=>` ${qh(h)}`).join(`, -`)});`;let o=t.replace(/@out\s+[^;]+;\s*/g,"");return o=o.replace("{{struct}}",` -${n} -`),o=o.replace("{{start}}",` -${r} -`),o=o.replace("{{return}}",` -${a} -`),o}function kn(s,t){let e=s;for(const i in t){const n=t[i];n.join(` -`).length?e=e.replace(`{{${i}}}`,`//-----${i} START-----// -${n.join(` -`)} -//----${i} FINISH----//`):e=e.replace(`{{${i}}}`,"")}return e}const Wt=Object.create(null),Vi=new Map;let Qh=0;function Jh({template:s,bits:t}){const e=ea(s,t);if(Wt[e])return Wt[e];const{vertex:i,fragment:n}=el(s,t);return Wt[e]=ia(i,n,t),Wt[e]}function tl({template:s,bits:t}){const e=ea(s,t);return Wt[e]||(Wt[e]=ia(s.vertex,s.fragment,t)),Wt[e]}function el(s,t){const e=t.map(a=>a.vertex).filter(a=>!!a),i=t.map(a=>a.fragment).filter(a=>!!a);let n=Mn(e,s.vertex,!0);n=Zh(e,n);const r=Mn(i,s.fragment,!0);return{vertex:n,fragment:r}}function ea(s,t){return t.map(e=>(Vi.has(e)||Vi.set(e,Qh++),Vi.get(e))).sort((e,i)=>e-i).join("-")+s.vertex+s.fragment}function ia(s,t,e){const i=Tn(s),n=Tn(t);return e.forEach(r=>{Cn(r.vertex,i,r.name),Cn(r.fragment,n,r.name)}),{vertex:kn(s,i),fragment:kn(t,n)}}const il=` - @in aPosition: vec2; - @in aUV: vec2; - - @out @builtin(position) vPosition: vec4; - @out vUV : vec2; - @out vColor : vec4; - - {{header}} - - struct VSOutput { - {{struct}} - }; - - @vertex - fn main( {{in}} ) -> VSOutput { - - var worldTransformMatrix = globalUniforms.uWorldTransformMatrix; - var modelMatrix = mat3x3( - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0 - ); - var position = aPosition; - var uv = aUV; - - {{start}} - - vColor = vec4(1., 1., 1., 1.); - - {{main}} - - vUV = uv; - - var modelViewProjectionMatrix = globalUniforms.uProjectionMatrix * worldTransformMatrix * modelMatrix; - - vPosition = vec4((modelViewProjectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); - - vColor *= globalUniforms.uWorldColorAlpha; - - {{end}} - - {{return}} - }; -`,sl=` - @in vUV : vec2; - @in vColor : vec4; - - {{header}} - - @fragment - fn main( - {{in}} - ) -> @location(0) vec4 { - - {{start}} - - var outColor:vec4; - - {{main}} - - var finalColor:vec4 = outColor * vColor; - - {{end}} - - return finalColor; - }; -`,nl=` - in vec2 aPosition; - in vec2 aUV; - - out vec4 vColor; - out vec2 vUV; - - {{header}} - - void main(void){ - - mat3 worldTransformMatrix = uWorldTransformMatrix; - mat3 modelMatrix = mat3( - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0 - ); - vec2 position = aPosition; - vec2 uv = aUV; - - {{start}} - - vColor = vec4(1.); - - {{main}} - - vUV = uv; - - mat3 modelViewProjectionMatrix = uProjectionMatrix * worldTransformMatrix * modelMatrix; - - gl_Position = vec4((modelViewProjectionMatrix * vec3(position, 1.0)).xy, 0.0, 1.0); - - vColor *= uWorldColorAlpha; - - {{end}} - } -`,rl=` - - in vec4 vColor; - in vec2 vUV; - - out vec4 finalColor; - - {{header}} - - void main(void) { - - {{start}} - - vec4 outColor; - - {{main}} - - finalColor = outColor * vColor; - - {{end}} - } -`,al={name:"global-uniforms-bit",vertex:{header:` - struct GlobalUniforms { - uProjectionMatrix:mat3x3, - uWorldTransformMatrix:mat3x3, - uWorldColorAlpha: vec4, - uResolution: vec2, - } - - @group(0) @binding(0) var globalUniforms : GlobalUniforms; - `}},ol={name:"global-uniforms-bit",vertex:{header:` - uniform mat3 uProjectionMatrix; - uniform mat3 uWorldTransformMatrix; - uniform vec4 uWorldColorAlpha; - uniform vec2 uResolution; - `}};function hl({bits:s,name:t}){const e=Jh({template:{fragment:sl,vertex:il},bits:[al,...s]});return yi.from({name:t,vertex:{source:e.vertex,entryPoint:"main"},fragment:{source:e.fragment,entryPoint:"main"}})}function ll({bits:s,name:t}){return new Ir({name:t,...tl({template:{vertex:nl,fragment:rl},bits:[ol,...s]})})}const cl={name:"color-bit",vertex:{header:` - @in aColor: vec4; - `,main:` - vColor *= vec4(aColor.rgb * aColor.a, aColor.a); - `}},dl={name:"color-bit",vertex:{header:` - in vec4 aColor; - `,main:` - vColor *= vec4(aColor.rgb * aColor.a, aColor.a); - `}},Xi={};function ul(s){const t=[];if(s===1)t.push("@group(1) @binding(0) var textureSource1: texture_2d;"),t.push("@group(1) @binding(1) var textureSampler1: sampler;");else{let e=0;for(let i=0;i;`),t.push(`@group(1) @binding(${e++}) var textureSampler${i+1}: sampler;`)}return t.join(` -`)}function fl(s){const t=[];if(s===1)t.push("outColor = textureSampleGrad(textureSource1, textureSampler1, vUV, uvDx, uvDy);");else{t.push("switch vTextureId {");for(let e=0;e; - @out @interpolate(flat) vTextureId : u32; - `,main:` - vTextureId = aTextureIdAndRound.y; - `,end:` - if(aTextureIdAndRound.x == 1) - { - vPosition = vec4(roundPixels(vPosition.xy, globalUniforms.uResolution), vPosition.zw); - } - `},fragment:{header:` - @in @interpolate(flat) vTextureId: u32; - - ${ul(s)} - `,main:` - var uvDx = dpdx(vUV); - var uvDy = dpdy(vUV); - - ${fl(s)} - `}}),Xi[s]}const Yi={};function gl(s){const t=[];for(let e=0;e0&&t.push("else"),e, targetSize: vec2) -> vec2 - { - return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; - } - `}},yl={name:"round-pixels-bit",vertex:{header:` - vec2 roundPixels(vec2 position, vec2 targetSize) - { - return (floor(((position * 0.5 + 0.5) * targetSize) + 0.5) / targetSize) * 2.0 - 1.0; - } - `}},Gn={};function _l(s){let t=Gn[s];if(t)return t;const e=new Int32Array(s);for(let i=0;i>16&255,i=s>>8&255,n=s&255,r=t>>16&255,a=t>>8&255,o=t&255,h=e*r/255,c=i*a/255,l=n*o/255;return(h<<16)+(c<<8)+l}const Tl=new H;class aa{constructor(){this.packAsQuad=!1,this.batcherName="default",this.applyTransform=!0,this.roundPixels=0,this._batcher=null,this._batch=null}get uvs(){return this.geometryData.uvs}get positions(){return this.geometryData.vertices}get indices(){return this.geometryData.indices}get blendMode(){return this.applyTransform?this.renderable.groupBlendMode:"normal"}get color(){const t=this.baseColor,e=t>>16|t&65280|(t&255)<<16,i=this.renderable;return i?Cl(e,i.groupColor)+(this.alpha*i.groupAlpha*255<<24):e+(this.alpha*255<<24)}get transform(){var t;return((t=this.renderable)==null?void 0:t.groupTransform)||Tl}copyTo(t){t.indexOffset=this.indexOffset,t.indexSize=this.indexSize,t.attributeOffset=this.attributeOffset,t.attributeSize=this.attributeSize,t.baseColor=this.baseColor,t.alpha=this.alpha,t.texture=this.texture,t.geometryData=this.geometryData}reset(){this.applyTransform=!0}}const Ne={extension:{type:k.ShapeBuilder,name:"circle"},build(s,t){let e,i,n,r,a,o;if(s.type==="circle"){const S=s;e=S.x,i=S.y,a=o=S.radius,n=r=0}else if(s.type==="ellipse"){const S=s;e=S.x,i=S.y,a=S.halfWidth,o=S.halfHeight,n=r=0}else{const S=s,T=S.width/2,F=S.height/2;e=S.x+T,i=S.y+F,a=o=Math.max(0,Math.min(S.radius,Math.min(T,F))),n=T-a,r=F-o}if(!(a>=0&&o>=0&&n>=0&&r>=0))return t;const h=Math.ceil(2.3*Math.sqrt(a+o)),c=h*8+(n?4:0)+(r?4:0);if(c===0)return t;if(h===0)return t[0]=t[6]=e+n,t[1]=t[3]=i+r,t[2]=t[4]=e-n,t[5]=t[7]=i-r,t;let l=0,d=h*4+(n?2:0)+2,u=d,g=c,m=n+a,y=r,x=e+m,_=e-m,w=i+y;if(t[l++]=x,t[l++]=w,t[--d]=w,t[--d]=_,r){const S=i-y;t[u++]=_,t[u++]=S,t[--g]=S,t[--g]=x}for(let S=1;S0&&(n[r++]=h,n[r++]=c,n[r++]=h-1),h++;n[r++]=c+1,n[r++]=c,n[r++]=h-1}},Al={...Ne,extension:{...Ne.extension,name:"ellipse"}},Ml={...Ne,extension:{...Ne.extension,name:"roundedRectangle"}},Pl=1e-4,Bn=1e-4;function kl(s){const t=s.length;if(t<6)return 1;let e=0;for(let i=0,n=s[t-2],r=s[t-1];id&&(d+=Math.PI*2);let u=l;const g=d-l,m=Math.abs(g),y=Math.sqrt(h*h+c*c),x=(15*m*Math.sqrt(y)/Math.PI>>0)+1,_=g/x;if(u+=_,o){a.push(s,t),a.push(e,i);for(let w=1,b=u;w=0&&(l.join==="round"?w+=qt(v,C,v-L*B,C-R*B,v-X*B,C-tt*B,x,!1)+4:w+=2,x.push(v-X*D,C-tt*D),x.push(v+X*B,C+tt*B));continue}const Vs=(-L+P)*(-R+C)-(-L+v)*(-R+G),Xs=(-X+K)*(-tt+C)-(-X+v)*(-tt+It),Ye=(Ut*Xs-ve*Vs)/Xe,je=(Ce*Vs-Se*Xs)/Xe,Ti=(Ye-v)*(Ye-v)+(je-C)*(je-C),Vt=v+(Ye-v)*B,Xt=C+(je-C)*B,Yt=v-(Ye-v)*D,jt=C-(je-C)*D,Ba=Math.min(Ut*Ut+Se*Se,ve*ve+Ce*Ce),Ys=Te?B:D,Ea=Ba+Ys*Ys*T;Ti<=Ea?l.join==="bevel"||Ti/T>F?(Te?(x.push(Vt,Xt),x.push(v+L*D,C+R*D),x.push(Vt,Xt),x.push(v+X*D,C+tt*D)):(x.push(v-L*B,C-R*B),x.push(Yt,jt),x.push(v-X*B,C-tt*B),x.push(Yt,jt)),w+=2):l.join==="round"?Te?(x.push(Vt,Xt),x.push(v+L*D,C+R*D),w+=qt(v,C,v+L*D,C+R*D,v+X*D,C+tt*D,x,!0)+4,x.push(Vt,Xt),x.push(v+X*D,C+tt*D)):(x.push(v-L*B,C-R*B),x.push(Yt,jt),w+=qt(v,C,v-L*B,C-R*B,v-X*B,C-tt*B,x,!1)+4,x.push(v-X*B,C-tt*B),x.push(Yt,jt)):(x.push(Vt,Xt),x.push(Yt,jt)):(x.push(v-L*B,C-R*B),x.push(v+L*D,C+R*D),l.join==="round"?Te?w+=qt(v,C,v+L*D,C+R*D,v+X*D,C+tt*D,x,!0)+2:w+=qt(v,C,v-L*B,C-R*B,v-X*B,C-tt*B,x,!1)+2:l.join==="miter"&&Ti/T<=F&&(Te?(x.push(Yt,jt),x.push(Yt,jt)):(x.push(Vt,Xt),x.push(Vt,Xt)),w+=2),x.push(v-X*B,C-tt*B),x.push(v+X*D,C+tt*D),w+=2)}P=s[(_-2)*2],G=s[(_-2)*2+1],v=s[(_-1)*2],C=s[(_-1)*2+1],L=-(G-C),R=P-v,_t=Math.sqrt(L*L+R*R),L/=_t,R/=_t,L*=S,R*=S,x.push(v-L*B,C-R*B),x.push(v+L*D,C+R*D),m||(l.cap==="round"?w+=qt(v-L*(B-D)*.5,C-R*(B-D)*.5,v-L*B,C-R*B,v+L*D,C+R*D,x,!1)+2:l.cap==="square"&&(w+=En(v,C,L,R,B,D,!1,x)));const Ia=Bn*Bn;for(let V=b;V=0&&a>=0&&(t[0]=i,t[1]=n,t[2]=i+r,t[3]=n,t[4]=i+r,t[5]=n+a,t[6]=i,t[7]=n+a),t},triangulate(s,t,e,i,n,r){let a=0;i*=e,t[i+a]=s[0],t[i+a+1]=s[1],a+=e,t[i+a]=s[2],t[i+a+1]=s[3],a+=e,t[i+a]=s[6],t[i+a+1]=s[7],a+=e,t[i+a]=s[4],t[i+a+1]=s[5],a+=e;const o=i/e;n[r++]=o,n[r++]=o+1,n[r++]=o+2,n[r++]=o+1,n[r++]=o+3,n[r++]=o+2}},Rl={extension:{type:k.ShapeBuilder,name:"triangle"},build(s,t){return t[0]=s.x,t[1]=s.y,t[2]=s.x2,t[3]=s.y2,t[4]=s.x3,t[5]=s.y3,t},triangulate(s,t,e,i,n,r){let a=0;i*=e,t[i+a]=s[0],t[i+a+1]=s[1],a+=e,t[i+a]=s[2],t[i+a+1]=s[3],a+=e,t[i+a]=s[4],t[i+a+1]=s[5];const o=i/e;n[r++]=o,n[r++]=o+1,n[r++]=o+2}},Si={};lt.handleByMap(k.ShapeBuilder,Si);lt.add(El,Bl,Rl,Ne,Al,Ml);const Fl=new E;function Ll(s,t){const{geometryData:e,batches:i}=t;i.length=0,e.indices.length=0,e.vertices.length=0,e.uvs.length=0;for(let n=0;n{const g=h.length,m=a.length/2,y=[],x=Si[l.type];if(x.build(l,y),d&&ra(y,d),i){const S=l.closePath??!0;Gl(y,t,!1,S,a,2,m,h)}else if(e&&c===u){c!==0&&console.warn("[Pixi Graphics] only the last shape have be cut out");const S=[],T=y.slice();zl(e.shapePath).forEach(P=>{S.push(T.length/2),T.push(...P)}),oa(T,S,a,2,m,h,g)}else x.triangulate(y,a,2,m,h,g);const _=o.length/2,w=t.texture;if(w!==z.WHITE){const S=t.matrix;S&&(d&&S.append(d.clone().invert()),Sl(a,2,m,o,_,2,a.length/2-m,S))}else vl(o,_,2,a.length/2-m);const b=Lt.get(aa);b.indexOffset=g,b.indexSize=h.length-g,b.attributeOffset=m,b.attributeSize=a.length/2-m,b.baseColor=t.color,b.alpha=t.alpha,b.texture=w,b.geometryData=r,n.push(b)})}function zl(s){if(!s)return[];const t=s.shapePrimitives,e=[];for(let i=0;i{Lt.return(i)})}destroy(){for(const t in this._gpuContextHash)this._gpuContextHash[t]&&this.onGraphicsContextDestroy(this._gpuContextHash[t].context)}};Bs.extension={type:[k.WebGLSystem,k.WebGPUSystem,k.CanvasSystem],name:"graphicsContext"};Bs.defaultOptions={bezierSmoothness:.5};let ha=Bs;const Ol=8,ri=11920929e-14,Nl=1;function la(s,t,e,i,n,r,a,o,h,c){const d=Math.min(.99,Math.max(0,c??ha.defaultOptions.bezierSmoothness));let u=(Nl-d)/1;return u*=u,Hl(t,e,i,n,r,a,o,h,s,u),s}function Hl(s,t,e,i,n,r,a,o,h,c){ms(s,t,e,i,n,r,a,o,h,c,0),h.push(a,o)}function ms(s,t,e,i,n,r,a,o,h,c,l){if(l>Ol)return;const d=(s+e)/2,u=(t+i)/2,g=(e+n)/2,m=(i+r)/2,y=(n+a)/2,x=(r+o)/2,_=(d+g)/2,w=(u+m)/2,b=(g+y)/2,S=(m+x)/2,T=(_+b)/2,F=(w+S)/2;if(l>0){let P=a-s,G=o-t;const v=Math.abs((e-a)*G-(i-o)*P),C=Math.abs((n-a)*G-(r-o)*P);if(v>ri&&C>ri){if((v+C)*(v+C)<=c*(P*P+G*G)){h.push(T,F);return}}else if(v>ri){if(v*v<=c*(P*P+G*G)){h.push(T,F);return}}else if(C>ri){if(C*C<=c*(P*P+G*G)){h.push(T,F);return}}else if(P=T-(s+a)/2,G=F-(t+o)/2,P*P+G*G<=c){h.push(T,F);return}}ms(s,t,d,u,_,w,T,F,h,c,l+1),ms(T,F,b,S,y,x,a,o,h,c,l+1)}const $l=8,Vl=11920929e-14,Xl=1;function Yl(s,t,e,i,n,r,a,o){const c=Math.min(.99,Math.max(0,o??ha.defaultOptions.bezierSmoothness));let l=(Xl-c)/1;return l*=l,jl(t,e,i,n,r,a,s,l),s}function jl(s,t,e,i,n,r,a,o){xs(a,s,t,e,i,n,r,o,0),a.push(n,r)}function xs(s,t,e,i,n,r,a,o,h){if(h>$l)return;const c=(t+i)/2,l=(e+n)/2,d=(i+r)/2,u=(n+a)/2,g=(c+d)/2,m=(l+u)/2;let y=r-t,x=a-e;const _=Math.abs((i-r)*x-(n-a)*y);if(_>Vl){if(_*_<=o*(y*y+x*x)){s.push(g,m);return}}else if(y=g-(t+r)/2,x=m-(e+a)/2,y*y+x*x<=o){s.push(g,m);return}xs(s,t,e,c,l,g,m,o,h+1),xs(s,g,m,d,u,r,a,o,h+1)}function ca(s,t,e,i,n,r,a,o){let h=Math.abs(n-r);(!a&&n>r||a&&r>n)&&(h=2*Math.PI-h),o=o||Math.max(6,Math.floor(6*Math.pow(i,1/3)*(h/Math.PI))),o=Math.max(o,3);let c=h/o,l=n;c*=a?-1:1;for(let d=0;dd*h)}const De=Math.PI*2,ji={centerX:0,centerY:0,ang1:0,ang2:0},qi=({x:s,y:t},e,i,n,r,a,o,h)=>{s*=e,t*=i;const c=n*s-r*t,l=r*s+n*t;return h.x=c+a,h.y=l+o,h};function Kl(s,t){const e=t===-1.5707963267948966?-.551915024494:1.3333333333333333*Math.tan(t/4),i=t===1.5707963267948966?.551915024494:e,n=Math.cos(s),r=Math.sin(s),a=Math.cos(s+t),o=Math.sin(s+t);return[{x:n-r*i,y:r+n*i},{x:a+o*i,y:o-a*i},{x:a,y:o}]}const Fn=(s,t,e,i)=>{const n=s*i-t*e<0?-1:1;let r=s*e+t*i;return r>1&&(r=1),r<-1&&(r=-1),n*Math.acos(r)},Zl=(s,t,e,i,n,r,a,o,h,c,l,d,u)=>{const g=Math.pow(n,2),m=Math.pow(r,2),y=Math.pow(l,2),x=Math.pow(d,2);let _=g*m-g*x-m*y;_<0&&(_=0),_/=g*x+m*y,_=Math.sqrt(_)*(a===o?-1:1);const w=_*n/r*d,b=_*-r/n*l,S=c*w-h*b+(s+e)/2,T=h*w+c*b+(t+i)/2,F=(l-w)/n,P=(d-b)/r,G=(-l-w)/n,v=(-d-b)/r,C=Fn(1,0,F,P);let K=Fn(F,P,G,v);o===0&&K>0&&(K-=De),o===1&&K<0&&(K+=De),u.centerX=S,u.centerY=T,u.ang1=C,u.ang2=K};function Ql(s,t,e,i,n,r,a,o=0,h=0,c=0){if(r===0||a===0)return;const l=Math.sin(o*De/360),d=Math.cos(o*De/360),u=d*(t-i)/2+l*(e-n)/2,g=-l*(t-i)/2+d*(e-n)/2;if(u===0&&g===0)return;r=Math.abs(r),a=Math.abs(a);const m=Math.pow(u,2)/Math.pow(r,2)+Math.pow(g,2)/Math.pow(a,2);m>1&&(r*=Math.sqrt(m),a*=Math.sqrt(m)),Zl(t,e,i,n,r,a,h,c,l,d,u,g,ji);let{ang1:y,ang2:x}=ji;const{centerX:_,centerY:w}=ji;let b=Math.abs(x)/(De/4);Math.abs(1-b)<1e-7&&(b=1);const S=Math.max(Math.ceil(b),1);x/=S;let T=s[s.length-2],F=s[s.length-1];const P={x:0,y:0};for(let G=0;G{const h=o.x-a.x,c=o.y-a.y,l=Math.sqrt(h*h+c*c),d=h/l,u=c/l;return{len:l,nx:d,ny:u}},n=(a,o)=>{a===0?s.moveTo(o.x,o.y):s.lineTo(o.x,o.y)};let r=t[t.length-1];for(let a=0;a0&&(g=-1,m=!0);const y=u/2;let x,_=Math.abs(Math.cos(y)*h/Math.sin(y));_>Math.min(l.len/2,d.len/2)?(_=Math.min(l.len/2,d.len/2),x=Math.abs(_*Math.sin(y)/Math.cos(y))):x=h;const w=o.x+d.nx*_+-d.ny*x*g,b=o.y+d.ny*_+d.nx*x*g,S=Math.atan2(l.ny,l.nx)+Math.PI/2*g,T=Math.atan2(d.ny,d.nx)-Math.PI/2*g;a===0&&s.moveTo(w+Math.cos(S)*x,b+Math.sin(S)*x),s.arc(w,b,x,S,T,m),r=o}}function tc(s,t,e,i){const n=(o,h)=>Math.sqrt((o.x-h.x)**2+(o.y-h.y)**2),r=(o,h,c)=>({x:o.x+(h.x-o.x)*c,y:o.y+(h.y-o.y)*c}),a=t.length;for(let o=0;o=2;d-=2)l[d]===l[d-2]&&l[d-1]===l[d-3]&&l.splice(d-1,2);return this.poly(l,!0,a)}ellipse(t,e,i,n,r){return this.drawShape(new Gs(t,e,i,n),r),this}roundRect(t,e,i,n,r,a){return this.drawShape(new Is(t,e,i,n,r),a),this}drawShape(t,e){return this.endPoly(),this.shapePrimitives.push({shape:t,transform:e}),this}startPoly(t,e){let i=this._currentPoly;return i&&this.endPoly(),i=new Le,i.points.push(t,e),this._currentPoly=i,this}endPoly(t=!1){const e=this._currentPoly;return e&&e.points.length>2&&(e.closePath=t,this.shapePrimitives.push({shape:e})),this._currentPoly=null,this}_ensurePoly(t=!0){if(!this._currentPoly&&(this._currentPoly=new Le,t)){const e=this.shapePrimitives[this.shapePrimitives.length-1];if(e){let i=e.shape.x,n=e.shape.y;if(e.transform&&!e.transform.isIdentity()){const r=e.transform,a=i;i=r.a*i+r.c*n+r.tx,n=r.b*a+r.d*n+r.ty}this._currentPoly.points.push(i,n)}else this._currentPoly.points.push(0,0)}}buildPath(){const t=this._graphicsPath2D;this.shapePrimitives.length=0,this._currentPoly=null;for(let e=0;eparseInt(G,10)),t.context.poly(w,!0),e&&t.context.fill(),i&&t.context.stroke();break;case"polyline":b=s.getAttribute("points"),w=b.match(/\d+/g).map(G=>parseInt(G,10)),t.context.poly(w,!1),i&&t.context.stroke();break;case"g":case"svg":break;default:{console.info(`[SVG parser] <${s.nodeName}> elements unsupported`);break}}for(let G=0;G{this._fill=ee({...this._originalFill},mt.defaultFillStyle)})),this._fill=ee(t===0?"black":t,mt.defaultFillStyle),this.update())}get stroke(){return this._originalStroke}set stroke(t){t!==this._originalStroke&&(this._originalStroke=t,this._isFillStyle(t)&&(this._originalStroke=this._createProxy({...mt.defaultStrokeStyle,...t},()=>{this._stroke=pi({...this._originalStroke},mt.defaultStrokeStyle)})),this._stroke=pi(t,mt.defaultStrokeStyle),this.update())}_generateKey(){return this._styleKey=lc(this),this._styleKey}update(){this._styleKey=null,this.emit("update",this)}reset(){const t=oe.defaultTextStyle;for(const e in t)this[e]=t[e]}get styleKey(){return this._styleKey||this._generateKey()}clone(){return new oe({align:this.align,breakWords:this.breakWords,dropShadow:this._dropShadow?{...this._dropShadow}:null,fill:this._fill,fontFamily:this.fontFamily,fontSize:this.fontSize,fontStyle:this.fontStyle,fontVariant:this.fontVariant,fontWeight:this.fontWeight,leading:this.leading,letterSpacing:this.letterSpacing,lineHeight:this.lineHeight,padding:this.padding,stroke:this._stroke,textBaseline:this.textBaseline,whiteSpace:this.whiteSpace,wordWrap:this.wordWrap,wordWrapWidth:this.wordWrapWidth})}destroy(t=!1){var i,n,r,a;if(this.removeAllListeners(),typeof t=="boolean"?t:t==null?void 0:t.texture){const o=typeof t=="boolean"?t:t==null?void 0:t.textureSource;(i=this._fill)!=null&&i.texture&&this._fill.texture.destroy(o),(n=this._originalFill)!=null&&n.texture&&this._originalFill.texture.destroy(o),(r=this._stroke)!=null&&r.texture&&this._stroke.texture.destroy(o),(a=this._originalStroke)!=null&&a.texture&&this._originalStroke.texture.destroy(o)}this._fill=null,this._stroke=null,this.dropShadow=null,this._originalStroke=null,this._originalFill=null}_createProxy(t,e){return new Proxy(t,{set:(i,n,r)=>(i[n]=r,e==null||e(n,r),this.update(),!0)})}_isFillStyle(t){return(t??null)!==null&&!(Z.isColorLike(t)||t instanceof Oe||t instanceof bi)}};Rs.defaultDropShadow={alpha:1,angle:Math.PI/6,blur:0,color:"black",distance:5};Rs.defaultTextStyle={align:"left",breakWords:!1,dropShadow:null,fill:"black",fontFamily:"Arial",fontSize:26,fontStyle:"normal",fontVariant:"normal",fontWeight:"normal",leading:0,letterSpacing:0,lineHeight:0,padding:0,stroke:null,textBaseline:"alphabetic",trim:!1,whiteSpace:"pre",wordWrap:!1,wordWrapWidth:100};let N=Rs;function uc(s){const t=s;if(typeof t.dropShadow=="boolean"&&t.dropShadow){const e=N.defaultDropShadow;s.dropShadow={alpha:t.dropShadowAlpha??e.alpha,angle:t.dropShadowAngle??e.angle,blur:t.dropShadowBlur??e.blur,color:t.dropShadowColor??e.color,distance:t.dropShadowDistance??e.distance}}if(t.strokeThickness!==void 0){U(O,"strokeThickness is now a part of stroke");const e=t.stroke;let i={};if(Z.isColorLike(e))i.color=e;else if(e instanceof Oe||e instanceof bi)i.fill=e;else if(Object.hasOwnProperty.call(e,"color")||Object.hasOwnProperty.call(e,"fill"))i=e;else throw new Error("Invalid stroke value.");s.stroke={...i,width:t.strokeThickness}}if(Array.isArray(t.fillGradientStops)){U(O,"gradient fill is now a fill pattern: `new FillGradient(...)`");let e;s.fontSize==null?s.fontSize=N.defaultTextStyle.fontSize:typeof s.fontSize=="string"?e=parseInt(s.fontSize,10):e=s.fontSize;const i=new Oe(0,0,0,e*1.7),n=t.fillGradientStops.map(r=>Z.shared.setValue(r).toNumber());n.forEach((r,a)=>{const o=a/(n.length-1);i.addColorStop(o,r)}),s.fill={fill:i}}}class fc{constructor(t){this._canvasPool=Object.create(null),this.canvasOptions=t||{},this.enableFullScreen=!1}_createCanvasAndContext(t,e){const i=Q.get().createCanvas();i.width=t,i.height=e;const n=i.getContext("2d");return{canvas:i,context:n}}getOptimalCanvasAndContext(t,e,i=1){t=Math.ceil(t*i-1e-6),e=Math.ceil(e*i-1e-6),t=Ks(t),e=Ks(e);const n=(t<<17)+(e<<1);this._canvasPool[n]||(this._canvasPool[n]=[]);let r=this._canvasPool[n].pop();return r||(r=this._createCanvasAndContext(t,e)),r}returnCanvasAndContext(t){const e=t.canvas,{width:i,height:n}=e,r=(i<<17)+(n<<1);this._canvasPool[r].push(t)}clear(){this._canvasPool={}}}const Nn=new fc,pc=["serif","sans-serif","monospace","cursive","fantasy","system-ui"];function ys(s){const t=typeof s.fontSize=="number"?`${s.fontSize}px`:s.fontSize;let e=s.fontFamily;Array.isArray(s.fontFamily)||(e=s.fontFamily.split(","));for(let i=e.length-1;i>=0;i--){let n=e[i].trim();!/([\"\'])[^\'\"]+\1/.test(n)&&!pc.includes(n)&&(n=`"${n}"`),e[i]=n}return`${s.fontStyle} ${s.fontVariant} ${s.fontWeight} ${t} ${e.join(",")}`}const Ki={willReadFrequently:!0},vt=class A{static get experimentalLetterSpacingSupported(){let t=A._experimentalLetterSpacingSupported;if(t!==void 0){const e=Q.get().getCanvasRenderingContext2D().prototype;t=A._experimentalLetterSpacingSupported="letterSpacing"in e||"textLetterSpacing"in e}return t}constructor(t,e,i,n,r,a,o,h,c){this.text=t,this.style=e,this.width=i,this.height=n,this.lines=r,this.lineWidths=a,this.lineHeight=o,this.maxLineWidth=h,this.fontProperties=c}static measureText(t=" ",e,i=A._canvas,n=e.wordWrap){var w;const r=`${t}:${e.styleKey}`;if(A._measurementCache[r])return A._measurementCache[r];const a=ys(e),o=A.measureFont(a);o.fontSize===0&&(o.fontSize=e.fontSize,o.ascent=e.fontSize);const h=A.__context;h.font=a;const l=(n?A._wordWrap(t,e,i):t).split(/(?:\r\n|\r|\n)/),d=new Array(l.length);let u=0;for(let b=0;b0&&(n?r-=e:r+=(A.graphemeSegmenter(t).length-1)*e),r}static _wordWrap(t,e,i=A._canvas){const n=i.getContext("2d",Ki);let r=0,a="",o="";const h=Object.create(null),{letterSpacing:c,whiteSpace:l}=e,d=A._collapseSpaces(l),u=A._collapseNewlines(l);let g=!d;const m=e.wordWrapWidth+c,y=A._tokenize(t);for(let x=0;xm)if(a!==""&&(o+=A._addLine(a),a="",r=0),A.canBreakWords(_,e.breakWords)){const b=A.wordWrapSplit(_);for(let S=0;Sm&&(o+=A._addLine(a),g=!1,a="",r=0),a+=T,r+=G}}else{a.length>0&&(o+=A._addLine(a),a="",r=0);const b=x===y.length-1;o+=A._addLine(_,!b),g=!1,a="",r=0}else w+r>m&&(g=!1,o+=A._addLine(a),a="",r=0),(a.length>0||!A.isBreakingSpace(_)||g)&&(a+=_,r+=w)}return o+=A._addLine(a,!1),o}static _addLine(t,e=!0){return t=A._trimRight(t),t=e?`${t} -`:t,t}static _getFromCache(t,e,i,n){let r=i[t];return typeof r!="number"&&(r=A._measureText(t,e,n)+e,i[t]=r),r}static _collapseSpaces(t){return t==="normal"||t==="pre-line"}static _collapseNewlines(t){return t==="normal"}static _trimRight(t){if(typeof t!="string")return"";for(let e=t.length-1;e>=0;e--){const i=t[e];if(!A.isBreakingSpace(i))break;t=t.slice(0,-1)}return t}static _isNewline(t){return typeof t!="string"?!1:A._newlines.includes(t.charCodeAt(0))}static isBreakingSpace(t,e){return typeof t!="string"?!1:A._breakingSpaces.includes(t.charCodeAt(0))}static _tokenize(t){const e=[];let i="";if(typeof t!="string")return e;for(let n=0;n{if(typeof(Intl==null?void 0:Intl.Segmenter)=="function"){const s=new Intl.Segmenter;return t=>[...s.segment(t)].map(e=>e.segment)}return s=>[...s]})();vt.experimentalLetterSpacing=!1;vt._fonts={};vt._newlines=[10,13];vt._breakingSpaces=[9,32,8192,8193,8194,8195,8196,8197,8198,8200,8201,8202,8287,12288];vt._measurementCache={};let _s=vt;function Hn(s,t){if(s.texture===z.WHITE&&!s.fill)return Z.shared.setValue(s.color).setAlpha(s.alpha??1).toHexa();if(s.fill){if(s.fill instanceof bi){const e=s.fill,i=t.createPattern(e.texture.source.resource,"repeat"),n=e.transform.copyTo(H.shared);return n.scale(e.texture.frame.width,e.texture.frame.height),i.setTransform(n),i}else if(s.fill instanceof Oe){const e=s.fill;if(e.type==="linear"){const i=t.createLinearGradient(e.x0,e.y0,e.x1,e.y1);return e.gradientStops.forEach(n=>{i.addColorStop(n.offset,Z.shared.setValue(n.color).toHex())}),i}}}else{const e=t.createPattern(s.texture.source.resource,"repeat"),i=s.matrix.copyTo(H.shared);return i.scale(s.texture.frame.width,s.texture.frame.height),e.setTransform(i),e}return st("FillStyle not recognised",s),"red"}function fa(s){if(s==="")return[];typeof s=="string"&&(s=[s]);const t=[];for(let e=0,i=s.length;e!this._currentChars.includes(_)).filter((_,w,b)=>b.indexOf(_)===w);if(!e.length)return;this._currentChars=[...this._currentChars,...e];let i;this._currentPageIndex===-1?i=this._nextPage():i=this.pages[this._currentPageIndex];let{canvas:n,context:r}=i.canvasAndContext,a=i.texture.source;const o=this._style;let h=this._currentX,c=this._currentY;const l=this.baseRenderedFontSize/this.baseMeasurementFontSize,d=this._padding*l,u=o.fontStyle==="italic"?2:1;let g=0,m=!1;for(let _=0;_this._textureSize&&(c+=g,g=P,h=0,c+g>this._textureSize)){a.update();const v=this._nextPage();n=v.canvasAndContext.canvas,r=v.canvasAndContext.context,a=v.texture.source,c=0}const G=S/l-(((y=o.dropShadow)==null?void 0:y.distance)??0)-(((x=o._stroke)==null?void 0:x.width)??0);if(this.chars[w]={id:w.codePointAt(0),xOffset:-this._padding,yOffset:-this._padding,xAdvance:G,kerning:{}},m){this._drawGlyph(r,b,h+d,c+d,l,o);const v=a.width*l,C=a.height*l,K=new E(h/v*a.width,c/C*a.height,F/v*a.width,P/C*a.height);this.chars[w].texture=new z({source:a,frame:K}),h+=Math.ceil(F)}}a.update(),this._currentX=h,this._currentY=c,this._skipKerning&&this._applyKerning(e,r)}get pageTextures(){return U(O,"BitmapFont.pageTextures is deprecated, please use BitmapFont.pages instead."),this.pages}_applyKerning(t,e){const i=this._measureCache;for(let n=0;n{const y=r.width;for(let x=0;x{let m=r.chars.length-1;if(i){let y=r.chars[m];for(;y===" ";)r.width-=e.chars[y].xAdvance,y=r.chars[--m]}n.width=Math.max(n.width,r.width),r={width:0,charPositions:[],chars:[],spaceWidth:0,spacesIndex:[]},o=!0,n.lines.push(r),n.height+=e.lineHeight},d=e.baseMeasurementFontSize/t.fontSize,u=t.letterSpacing*d,g=t.wordWrapWidth*d;for(let m=0;mg?(l(),c(h),x||r.charPositions.push(0)):(h.start=r.width,c(h),x||r.charPositions.push(0)),y==="\r"||y===` -`)r.width!==0&&l();else if(!x){const T=_.xAdvance+(_.kerning[a]||0)+u;r.width+=T,r.spaceWidth=T,r.spacesIndex.push(r.charPositions.length),r.chars.push(y)}}else{const S=_.kerning[a]||0,T=_.xAdvance+S+u;h.positions[h.index++]=h.width+S,h.chars.push(y),h.width+=T}a=y}return l(),t.align==="center"?mc(n):t.align==="right"?xc(n):t.align==="justify"&&yc(n),n}function mc(s){for(let t=0;t50&&st("BitmapText",`You have dynamically created ${ai} bitmap fonts, this can be inefficient. Try pre installing your font styles using \`BitmapFont.install({name:"style1", style})\``),o.once("destroy",()=>{ai--,j.remove(i)}),j.set(i,o)}const r=j.get(i);return(a=r.ensureCharacters)==null||a.call(r,t),r}getLayout(t,e,i=!0){const n=this.getFont(t,e);return gc([...t],e,n,i)}measureText(t,e,i=!0){return this.getLayout(t,e,i)}install(...t){var c,l,d,u;let e=t[0];typeof e=="string"&&(e={name:e,style:t[1],chars:(c=t[2])==null?void 0:c.chars,resolution:(l=t[2])==null?void 0:l.resolution,padding:(d=t[2])==null?void 0:d.padding,skipKerning:(u=t[2])==null?void 0:u.skipKerning},U(O,"BitmapFontManager.install(name, style, options) is deprecated, use BitmapFontManager.install({name, style, ...options})"));const i=e==null?void 0:e.name;if(!i)throw new Error("[BitmapFontManager] Property `name` is required.");e={...this.defaultOptions,...e};const n=e.style,r=n instanceof N?n:new N(n),a=r._fill.fill!==null&&r._fill.fill!==void 0,o=new $n({style:r,overrideFill:a,skipKerning:e.skipKerning,padding:e.padding,resolution:e.resolution,overrideSize:!1}),h=fa(e.chars);return o.ensureCharacters(h.join("")),j.set(`${i}-bitmap`,o),o.once("destroy",()=>j.remove(`${i}-bitmap`)),o}uninstall(t){const e=`${t}-bitmap`,i=j.get(e);i&&(j.remove(e),i.destroy())}}const Vn=new _c;class ma extends Yr{constructor(t,e){super();const{textures:i,data:n}=t;Object.keys(n.pages).forEach(r=>{const a=n.pages[parseInt(r,10)],o=i[a.id];this.pages.push({texture:o})}),Object.keys(n.chars).forEach(r=>{const a=n.chars[r],{frame:o,source:h}=i[a.page],c=new E(a.x+o.x,a.y+o.y,a.width,a.height),l=new z({source:h,frame:c});this.chars[r]={id:r.codePointAt(0),xOffset:a.xOffset,yOffset:a.yOffset,xAdvance:a.xAdvance,kerning:a.kerning??{},texture:l}}),this.baseRenderedFontSize=n.fontSize,this.baseMeasurementFontSize=n.fontSize,this.fontMetrics={ascent:0,descent:0,fontSize:n.fontSize},this.baseLineOffset=n.baseLineOffset,this.lineHeight=n.lineHeight,this.fontFamily=n.fontFamily,this.distanceField=n.distanceField??{type:"none",range:0},this.url=e}destroy(){super.destroy();for(let t=0;t")?Xn.test(Q.get().parseXML(s)):!1},parse(s){return Xn.parse(Q.get().parseXML(s))}},wc=[".xml",".fnt"],bc={extension:{type:k.CacheParser,name:"cacheBitmapFont"},test:s=>s instanceof ma,getCacheableAssets(s,t){const e={};return s.forEach(i=>{e[i]=t,e[`${i}-bitmap`]=t}),e[`${t.fontFamily}-bitmap`]=t,e}},Sc={extension:{type:k.LoadParser,priority:Ht.Normal},name:"loadBitmapFont",test(s){return wc.includes(gt.extname(s).toLowerCase())},async testParse(s){return Zi.test(s)||Yn.test(s)},async parse(s,t,e){const i=Zi.test(s)?Zi.parse(s):Yn.parse(s),{src:n}=t,{pages:r}=i,a=[],o=i.distanceField?{scaleMode:"linear",alphaMode:"premultiply-alpha-on-upload",autoGenerateMipmaps:!1,resolution:1}:{};for(let d=0;dh[d.src]);return new ma({data:i,textures:c},n)},async load(s,t){return await(await Q.get().fetch(s)).text()},async unload(s,t,e){await Promise.all(s.pages.map(i=>e.unload(i.texture.source._sourceOrigin))),s.destroy()}};class vc{constructor(t,e=!1){this._loader=t,this._assetList=[],this._isLoading=!1,this._maxConcurrent=1,this.verbose=e}add(t){t.forEach(e=>{this._assetList.push(e)}),this.verbose&&console.log("[BackgroundLoader] assets: ",this._assetList),this._isActive&&!this._isLoading&&this._next()}async _next(){if(this._assetList.length&&this._isActive){this._isLoading=!0;const t=[],e=Math.min(this._assetList.length,this._maxConcurrent);for(let i=0;iArray.isArray(s)&&s.every(t=>t instanceof z),getCacheableAssets:(s,t)=>{const e={};return s.forEach(i=>{t.forEach((n,r)=>{e[i+(r===0?"":r+1)]=n})}),e}};async function xa(s){if("Image"in globalThis)return new Promise(t=>{const e=new Image;e.onload=()=>{t(!0)},e.onerror=()=>{t(!1)},e.src=s});if("createImageBitmap"in globalThis&&"fetch"in globalThis){try{const t=await(await fetch(s)).blob();await createImageBitmap(t)}catch{return!1}return!0}return!1}const Tc={extension:{type:k.DetectionParser,priority:1},test:async()=>xa("data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAAB0AAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAIAAAACAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQ0MAAAAABNjb2xybmNseAACAAIAAYAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAACVtZGF0EgAKCBgANogQEAwgMg8f8D///8WfhwB8+ErK42A="),add:async s=>[...s,"avif"],remove:async s=>s.filter(t=>t!=="avif")},jn=["png","jpg","jpeg"],Ac={extension:{type:k.DetectionParser,priority:-1},test:()=>Promise.resolve(!0),add:async s=>[...s,...jn],remove:async s=>s.filter(t=>!jn.includes(t))},Mc="WorkerGlobalScope"in globalThis&&globalThis instanceof globalThis.WorkerGlobalScope;function Fs(s){return Mc?!1:document.createElement("video").canPlayType(s)!==""}const Pc={extension:{type:k.DetectionParser,priority:0},test:async()=>Fs("video/mp4"),add:async s=>[...s,"mp4","m4v"],remove:async s=>s.filter(t=>t!=="mp4"&&t!=="m4v")},kc={extension:{type:k.DetectionParser,priority:0},test:async()=>Fs("video/ogg"),add:async s=>[...s,"ogv"],remove:async s=>s.filter(t=>t!=="ogv")},Gc={extension:{type:k.DetectionParser,priority:0},test:async()=>Fs("video/webm"),add:async s=>[...s,"webm"],remove:async s=>s.filter(t=>t!=="webm")},Ic={extension:{type:k.DetectionParser,priority:0},test:async()=>xa("data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA="),add:async s=>[...s,"webp"],remove:async s=>s.filter(t=>t!=="webp")};class Bc{constructor(){this._parsers=[],this._parsersValidated=!1,this.parsers=new Proxy(this._parsers,{set:(t,e,i)=>(this._parsersValidated=!1,t[e]=i,!0)}),this.promiseCache={}}reset(){this._parsersValidated=!1,this.promiseCache={}}_getLoadPromiseAndParser(t,e){const i={promise:null,parser:null};return i.promise=(async()=>{var a,o;let n=null,r=null;if(e.loadParser&&(r=this._parserHash[e.loadParser],r||st(`[Assets] specified load parser "${e.loadParser}" not found while loading ${t}`)),!r){for(let h=0;h({alias:[c],src:c,data:{}})),o=a.length,h=a.map(async c=>{const l=gt.toAbsolute(c.src);if(!n[c.src])try{this.promiseCache[l]||(this.promiseCache[l]=this._getLoadPromiseAndParser(l,c)),n[c.src]=await this.promiseCache[l].promise,e&&e(++i/o)}catch(d){throw delete this.promiseCache[l],delete n[c.src],new Error(`[Loader.load] Failed to load ${l}. -${d}`)}});return await Promise.all(h),r?n[a[0].src]:n}async unload(t){const i=bt(t,n=>({alias:[n],src:n})).map(async n=>{var o,h;const r=gt.toAbsolute(n.src),a=this.promiseCache[r];if(a){const c=await a.promise;delete this.promiseCache[r],await((h=(o=a.parser)==null?void 0:o.unload)==null?void 0:h.call(o,c,n,this))}});await Promise.all(i)}_validateParsers(){this._parsersValidated=!0,this._parserHash=this._parsers.filter(t=>t.name).reduce((t,e)=>(e.name?t[e.name]&&st(`[Assets] loadParser name conflict "${e.name}"`):st("[Assets] loadParser should have a name"),{...t,[e.name]:e}),{})}}function we(s,t){if(Array.isArray(t)){for(const e of t)if(s.startsWith(`data:${e}`))return!0;return!1}return s.startsWith(`data:${t}`)}function be(s,t){const e=s.split("?")[0],i=gt.extname(e).toLowerCase();return Array.isArray(t)?t.includes(i):i===t}const Ec=".json",Rc="application/json",Fc={extension:{type:k.LoadParser,priority:Ht.Low},name:"loadJson",test(s){return we(s,Rc)||be(s,Ec)},async load(s){return await(await Q.get().fetch(s)).json()}},Lc=".txt",Dc="text/plain",zc={name:"loadTxt",extension:{type:k.LoadParser,priority:Ht.Low,name:"loadTxt"},test(s){return we(s,Dc)||be(s,Lc)},async load(s){return await(await Q.get().fetch(s)).text()}},Uc=["normal","bold","100","200","300","400","500","600","700","800","900"],Wc=[".ttf",".otf",".woff",".woff2"],Oc=["font/ttf","font/otf","font/woff","font/woff2"],Nc=/^(--|-?[A-Z_])[0-9A-Z_-]*$/i;function Hc(s){const t=gt.extname(s),n=gt.basename(s,t).replace(/(-|_)/g," ").toLowerCase().split(" ").map(o=>o.charAt(0).toUpperCase()+o.slice(1));let r=n.length>0;for(const o of n)if(!o.match(Nc)){r=!1;break}let a=n.join(" ");return r||(a=`"${a.replace(/[\\"]/g,"\\$&")}"`),a}const $c=/^[0-9A-Za-z%:/?#\[\]@!\$&'()\*\+,;=\-._~]*$/;function Vc(s){return $c.test(s)?s:encodeURI(s)}const Xc={extension:{type:k.LoadParser,priority:Ht.Low},name:"loadWebFont",test(s){return we(s,Oc)||be(s,Wc)},async load(s,t){var i,n,r;const e=Q.get().getFontFaceSet();if(e){const a=[],o=((i=t.data)==null?void 0:i.family)??Hc(s),h=((r=(n=t.data)==null?void 0:n.weights)==null?void 0:r.filter(l=>Uc.includes(l)))??["normal"],c=t.data??{};for(let l=0;l{j.remove(t.family),Q.get().getFontFaceSet().delete(t)})}};function Ls(s,t=1){var i;const e=(i=_e.RETINA_PREFIX)==null?void 0:i.exec(s);return e?parseFloat(e[1]):t}function Ds(s,t,e){s.label=e,s._sourceOrigin=e;const i=new z({source:s,label:e}),n=()=>{delete t.promiseCache[e],j.has(e)&&j.remove(e)};return i.source.once("destroy",()=>{t.promiseCache[e]&&(st("[Assets] A TextureSource managed by Assets was destroyed instead of unloaded! Use Assets.unload() instead of destroying the TextureSource."),n())}),i.once("destroy",()=>{s.destroyed||(st("[Assets] A Texture managed by Assets was destroyed instead of unloaded! Use Assets.unload() instead of destroying the Texture."),n())}),i}const Yc=".svg",jc="image/svg+xml",qc={extension:{type:k.LoadParser,priority:Ht.Low,name:"loadSVG"},name:"loadSVG",config:{crossOrigin:"anonymous",parseAsGraphicsContext:!1},test(s){return we(s,jc)||be(s,Yc)},async load(s,t,e){return t.data.parseAsGraphicsContext??this.config.parseAsGraphicsContext?Zc(s):Kc(s,t,e,this.config.crossOrigin)},unload(s){s.destroy(!0)}};async function Kc(s,t,e,i){var x,_,w;const r=await(await Q.get().fetch(s)).blob(),a=URL.createObjectURL(r),o=new Image;o.src=a,o.crossOrigin=i,await o.decode(),URL.revokeObjectURL(a);const h=document.createElement("canvas"),c=h.getContext("2d"),l=((x=t.data)==null?void 0:x.resolution)||Ls(s),d=((_=t.data)==null?void 0:_.width)??o.width,u=((w=t.data)==null?void 0:w.height)??o.height;h.width=d*l,h.height=u*l,c.drawImage(o,0,0,d*l,u*l);const{parseAsGraphicsContext:g,...m}=t.data,y=new ye({resource:h,alphaMode:"premultiply-alpha-on-upload",resolution:l,...m});return Ds(y,e,s)}async function Zc(s){const e=await(await Q.get().fetch(s)).text(),i=new mt;return i.svg(e),i}const Qc=`(function () { - 'use strict'; - - const WHITE_PNG = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO+ip1sAAAAASUVORK5CYII="; - async function checkImageBitmap() { - try { - if (typeof createImageBitmap !== "function") - return false; - const response = await fetch(WHITE_PNG); - const imageBlob = await response.blob(); - const imageBitmap = await createImageBitmap(imageBlob); - return imageBitmap.width === 1 && imageBitmap.height === 1; - } catch (e) { - return false; - } - } - void checkImageBitmap().then((result) => { - self.postMessage(result); - }); - -})(); -`;let le=null,ws=class{constructor(){le||(le=URL.createObjectURL(new Blob([Qc],{type:"application/javascript"}))),this.worker=new Worker(le)}};ws.revokeObjectURL=function(){le&&(URL.revokeObjectURL(le),le=null)};const Jc=`(function () { - 'use strict'; - - async function loadImageBitmap(url, alphaMode) { - const response = await fetch(url); - if (!response.ok) { - throw new Error(\`[WorkerManager.loadImageBitmap] Failed to fetch \${url}: \${response.status} \${response.statusText}\`); - } - const imageBlob = await response.blob(); - return alphaMode === "premultiplied-alpha" ? createImageBitmap(imageBlob, { premultiplyAlpha: "none" }) : createImageBitmap(imageBlob); - } - self.onmessage = async (event) => { - try { - const imageBitmap = await loadImageBitmap(event.data.data[0], event.data.data[1]); - self.postMessage({ - data: imageBitmap, - uuid: event.data.uuid, - id: event.data.id - }, [imageBitmap]); - } catch (e) { - self.postMessage({ - error: e, - uuid: event.data.uuid, - id: event.data.id - }); - } - }; - -})(); -`;let ce=null;class ya{constructor(){ce||(ce=URL.createObjectURL(new Blob([Jc],{type:"application/javascript"}))),this.worker=new Worker(ce)}}ya.revokeObjectURL=function(){ce&&(URL.revokeObjectURL(ce),ce=null)};let qn=0,Qi;class td{constructor(){this._initialized=!1,this._createdWorkers=0,this._workerPool=[],this._queue=[],this._resolveHash={}}isImageBitmapSupported(){return this._isImageBitmapSupported!==void 0?this._isImageBitmapSupported:(this._isImageBitmapSupported=new Promise(t=>{const{worker:e}=new ws;e.addEventListener("message",i=>{e.terminate(),ws.revokeObjectURL(),t(i.data)})}),this._isImageBitmapSupported)}loadImageBitmap(t,e){var i;return this._run("loadImageBitmap",[t,(i=e==null?void 0:e.data)==null?void 0:i.alphaMode])}async _initWorkers(){this._initialized||(this._initialized=!0)}_getWorker(){Qi===void 0&&(Qi=navigator.hardwareConcurrency||4);let t=this._workerPool.pop();return!t&&this._createdWorkers{this._complete(e.data),this._returnWorker(e.target),this._next()})),t}_returnWorker(t){this._workerPool.push(t)}_complete(t){t.error!==void 0?this._resolveHash[t.uuid].reject(t.error):this._resolveHash[t.uuid].resolve(t.data),this._resolveHash[t.uuid]=null}async _run(t,e){await this._initWorkers();const i=new Promise((n,r)=>{this._queue.push({id:t,arguments:e,resolve:n,reject:r})});return this._next(),i}_next(){if(!this._queue.length)return;const t=this._getWorker();if(!t)return;const e=this._queue.pop(),i=e.id;this._resolveHash[qn]={resolve:e.resolve,reject:e.reject},t.postMessage({data:e.arguments,uuid:qn++,id:i})}}const Kn=new td,ed=[".jpeg",".jpg",".png",".webp",".avif"],id=["image/jpeg","image/png","image/webp","image/avif"];async function sd(s,t){var n;const e=await Q.get().fetch(s);if(!e.ok)throw new Error(`[loadImageBitmap] Failed to fetch ${s}: ${e.status} ${e.statusText}`);const i=await e.blob();return((n=t==null?void 0:t.data)==null?void 0:n.alphaMode)==="premultiplied-alpha"?createImageBitmap(i,{premultiplyAlpha:"none"}):createImageBitmap(i)}const _a={name:"loadTextures",extension:{type:k.LoadParser,priority:Ht.High,name:"loadTextures"},config:{preferWorkers:!0,preferCreateImageBitmap:!0,crossOrigin:"anonymous"},test(s){return we(s,id)||be(s,ed)},async load(s,t,e){var r;let i=null;globalThis.createImageBitmap&&this.config.preferCreateImageBitmap?this.config.preferWorkers&&await Kn.isImageBitmapSupported()?i=await Kn.loadImageBitmap(s,t):i=await sd(s,t):i=await new Promise(a=>{i=new Image,i.crossOrigin=this.config.crossOrigin,i.src=s,i.complete?a(i):i.onload=()=>{a(i)}});const n=new ye({resource:i,alphaMode:"premultiply-alpha-on-upload",resolution:((r=t.data)==null?void 0:r.resolution)||Ls(s),...t.data});return Ds(n,e,s)},unload(s){s.destroy(!0)}},wa=[".mp4",".m4v",".webm",".ogg",".ogv",".h264",".avi",".mov"],nd=wa.map(s=>`video/${s.substring(1)}`);function rd(s,t,e){e===void 0&&!t.startsWith("data:")?s.crossOrigin=od(t):e!==!1&&(s.crossOrigin=typeof e=="string"?e:"anonymous")}function ad(s){return new Promise((t,e)=>{s.addEventListener("canplaythrough",i),s.addEventListener("error",n),s.load();function i(){r(),t()}function n(a){r(),e(a)}function r(){s.removeEventListener("canplaythrough",i),s.removeEventListener("error",n)}})}function od(s,t=globalThis.location){if(s.startsWith("data:"))return"";t=t||globalThis.location;const e=new URL(s,document.baseURI);return e.hostname!==t.hostname||e.port!==t.port||e.protocol!==t.protocol?"anonymous":""}const hd={name:"loadVideo",extension:{type:k.LoadParser,name:"loadVideo"},test(s){const t=we(s,nd),e=be(s,wa);return t||e},async load(s,t,e){var h,c;const i={...oi.defaultOptions,resolution:((h=t.data)==null?void 0:h.resolution)||Ls(s),alphaMode:((c=t.data)==null?void 0:c.alphaMode)||await vr(),...t.data},n=document.createElement("video"),r={preload:i.autoLoad!==!1?"auto":void 0,"webkit-playsinline":i.playsinline!==!1?"":void 0,playsinline:i.playsinline!==!1?"":void 0,muted:i.muted===!0?"":void 0,loop:i.loop===!0?"":void 0,autoplay:i.autoPlay!==!1?"":void 0};Object.keys(r).forEach(l=>{const d=r[l];d!==void 0&&n.setAttribute(l,d)}),i.muted===!0&&(n.muted=!0),rd(n,s,i.crossorigin);const a=document.createElement("source");let o;if(s.startsWith("data:"))o=s.slice(5,s.indexOf(";"));else if(!s.startsWith("blob:")){const l=s.split("?")[0].slice(s.lastIndexOf(".")+1).toLowerCase();o=oi.MIME_TYPES[l]||`video/${l}`}return a.src=s,o&&(a.type=o),new Promise(l=>{const d=async()=>{const u=new oi({...i,resource:n});n.removeEventListener("canplay",d),t.data.preload&&await ad(n),l(Ds(u,e,s))};n.addEventListener("canplay",d),n.appendChild(a)})},unload(s){s.destroy(!0)}},ba={extension:{type:k.ResolveParser,name:"resolveTexture"},test:_a.test,parse:s=>{var t;return{resolution:parseFloat(((t=_e.RETINA_PREFIX.exec(s))==null?void 0:t[1])??"1"),format:s.split(".").pop(),src:s}}},ld={extension:{type:k.ResolveParser,priority:-2,name:"resolveJson"},test:s=>_e.RETINA_PREFIX.test(s)&&s.endsWith(".json"),parse:ba.parse};class cd{constructor(){this._detections=[],this._initialized=!1,this.resolver=new _e,this.loader=new Bc,this.cache=j,this._backgroundLoader=new vc(this.loader),this._backgroundLoader.active=!0,this.reset()}async init(t={}){var r,a;if(this._initialized){st("[Assets]AssetManager already initialized, did you load before calling this Assets.init()?");return}if(this._initialized=!0,t.defaultSearchParams&&this.resolver.setDefaultSearchParams(t.defaultSearchParams),t.basePath&&(this.resolver.basePath=t.basePath),t.bundleIdentifier&&this.resolver.setBundleIdentifier(t.bundleIdentifier),t.manifest){let o=t.manifest;typeof o=="string"&&(o=await this.load(o)),this.resolver.addManifest(o)}const e=((r=t.texturePreference)==null?void 0:r.resolution)??1,i=typeof e=="number"?[e]:e,n=await this._detectFormats({preferredFormats:(a=t.texturePreference)==null?void 0:a.format,skipDetections:t.skipDetections,detections:this._detections});this.resolver.prefer({params:{format:n,resolution:i}}),t.preferences&&this.setPreferences(t.preferences)}add(t){this.resolver.add(t)}async load(t,e){this._initialized||await this.init();const i=fi(t),n=bt(t).map(o=>{if(typeof o!="string"){const h=this.resolver.getAlias(o);return h.some(c=>!this.resolver.hasKey(c))&&this.add(o),Array.isArray(h)?h[0]:h}return this.resolver.hasKey(o)||this.add({alias:o,src:o}),o}),r=this.resolver.resolve(n),a=await this._mapLoadToResolve(r,e);return i?a[n[0]]:a}addBundle(t,e){this.resolver.addBundle(t,e)}async loadBundle(t,e){this._initialized||await this.init();let i=!1;typeof t=="string"&&(i=!0,t=[t]);const n=this.resolver.resolveBundle(t),r={},a=Object.keys(n);let o=0,h=0;const c=()=>{e==null||e(++o/h)},l=a.map(d=>{const u=n[d];return h+=Object.keys(u).length,this._mapLoadToResolve(u,c).then(g=>{r[d]=g})});return await Promise.all(l),i?r[t[0]]:r}async backgroundLoad(t){this._initialized||await this.init(),typeof t=="string"&&(t=[t]);const e=this.resolver.resolve(t);this._backgroundLoader.add(Object.values(e))}async backgroundLoadBundle(t){this._initialized||await this.init(),typeof t=="string"&&(t=[t]);const e=this.resolver.resolveBundle(t);Object.values(e).forEach(i=>{this._backgroundLoader.add(Object.values(i))})}reset(){this.resolver.reset(),this.loader.reset(),this.cache.reset(),this._initialized=!1}get(t){if(typeof t=="string")return j.get(t);const e={};for(let i=0;i{const o=n[a.src],h=[a.src];a.alias&&h.push(...a.alias),h.forEach(c=>{r[c]=o}),j.set(h,o)}),r}async unload(t){this._initialized||await this.init();const e=bt(t).map(n=>typeof n!="string"?n.src:n),i=this.resolver.resolve(e);await this._unloadFromResolved(i)}async unloadBundle(t){this._initialized||await this.init(),t=bt(t);const e=this.resolver.resolveBundle(t),i=Object.keys(e).map(n=>this._unloadFromResolved(e[n]));await Promise.all(i)}async _unloadFromResolved(t){const e=Object.values(t);e.forEach(i=>{j.remove(i.src)}),await this.loader.unload(e)}async _detectFormats(t){let e=[];t.preferredFormats&&(e=Array.isArray(t.preferredFormats)?t.preferredFormats:[t.preferredFormats]);for(const i of t.detections)t.skipDetections||await i.test()?e=await i.add(e):t.skipDetections||(e=await i.remove(e));return e=e.filter((i,n)=>e.indexOf(i)===n),e}get detections(){return this._detections}setPreferences(t){this.loader.parsers.forEach(e=>{e.config&&Object.keys(e.config).filter(i=>i in t).forEach(i=>{e.config[i]=t[i]})})}}const Re=new cd;lt.handleByList(k.LoadParser,Re.loader.parsers).handleByList(k.ResolveParser,Re.resolver.parsers).handleByList(k.CacheParser,Re.cache.parsers).handleByList(k.DetectionParser,Re.detections);lt.add(Cc,Ac,Tc,Ic,Pc,kc,Gc,Fc,zc,Xc,qc,_a,hd,Sc,bc,ba,ld);const Zn={loader:k.LoadParser,resolver:k.ResolveParser,cache:k.CacheParser,detection:k.DetectionParser};lt.handle(k.Asset,s=>{const t=s.ref;Object.entries(Zn).filter(([e])=>!!t[e]).forEach(([e,i])=>lt.add(Object.assign(t[e],{extension:t[e].extension??i})))},s=>{const t=s.ref;Object.keys(Zn).filter(e=>!!t[e]).forEach(e=>lt.remove(t[e]))});class St extends mi{constructor(t){t instanceof mt&&(t={context:t});const{context:e,roundPixels:i,...n}=t||{};super({label:"Graphics",...n}),this.renderPipeId="graphics",e?this._context=e:this._context=this._ownedContext=new mt,this._context.on("update",this.onViewUpdate,this),this.allowChildren=!1,this.roundPixels=i??!1}set context(t){t!==this._context&&(this._context.off("update",this.onViewUpdate,this),this._context=t,this._context.on("update",this.onViewUpdate,this),this.onViewUpdate())}get context(){return this._context}get bounds(){return this._context.bounds}addBounds(t){t.addBounds(this._context.bounds)}containsPoint(t){return this._context.containsPoint(t)}onViewUpdate(){if(this._didViewChangeTick++,this._didGraphicsUpdate=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}destroy(t){this._ownedContext&&!t?this._ownedContext.destroy(t):(t===!0||(t==null?void 0:t.context)===!0)&&this._context.destroy(t),this._ownedContext=null,this._context=null,super.destroy(t)}_callContextMethod(t,e){return this.context[t](...e),this}setFillStyle(...t){return this._callContextMethod("setFillStyle",t)}setStrokeStyle(...t){return this._callContextMethod("setStrokeStyle",t)}fill(...t){return this._callContextMethod("fill",t)}stroke(...t){return this._callContextMethod("stroke",t)}texture(...t){return this._callContextMethod("texture",t)}beginPath(){return this._callContextMethod("beginPath",[])}cut(){return this._callContextMethod("cut",[])}arc(...t){return this._callContextMethod("arc",t)}arcTo(...t){return this._callContextMethod("arcTo",t)}arcToSvg(...t){return this._callContextMethod("arcToSvg",t)}bezierCurveTo(...t){return this._callContextMethod("bezierCurveTo",t)}closePath(){return this._callContextMethod("closePath",[])}ellipse(...t){return this._callContextMethod("ellipse",t)}circle(...t){return this._callContextMethod("circle",t)}path(...t){return this._callContextMethod("path",t)}lineTo(...t){return this._callContextMethod("lineTo",t)}moveTo(...t){return this._callContextMethod("moveTo",t)}quadraticCurveTo(...t){return this._callContextMethod("quadraticCurveTo",t)}rect(...t){return this._callContextMethod("rect",t)}roundRect(...t){return this._callContextMethod("roundRect",t)}poly(...t){return this._callContextMethod("poly",t)}regularPoly(...t){return this._callContextMethod("regularPoly",t)}roundPoly(...t){return this._callContextMethod("roundPoly",t)}roundShape(...t){return this._callContextMethod("roundShape",t)}filletRect(...t){return this._callContextMethod("filletRect",t)}chamferRect(...t){return this._callContextMethod("chamferRect",t)}star(...t){return this._callContextMethod("star",t)}svg(...t){return this._callContextMethod("svg",t)}restore(...t){return this._callContextMethod("restore",t)}save(){return this._callContextMethod("save",[])}getTransform(){return this.context.getTransform()}resetTransform(){return this._callContextMethod("resetTransform",[])}rotateTransform(...t){return this._callContextMethod("rotate",t)}scaleTransform(...t){return this._callContextMethod("scale",t)}setTransform(...t){return this._callContextMethod("setTransform",t)}transform(...t){return this._callContextMethod("transform",t)}translateTransform(...t){return this._callContextMethod("translate",t)}clear(){return this._callContextMethod("clear",[])}get fillStyle(){return this._context.fillStyle}set fillStyle(t){this._context.fillStyle=t}get strokeStyle(){return this._context.strokeStyle}set strokeStyle(t){this._context.strokeStyle=t}clone(t=!1){return t?new St(this._context.clone()):(this._ownedContext=null,new St(this._context))}lineStyle(t,e,i){U(O,"Graphics#lineStyle is no longer needed. Use Graphics#setStrokeStyle to set the stroke style.");const n={};return t&&(n.width=t),e&&(n.color=e),i&&(n.alpha=i),this.context.strokeStyle=n,this}beginFill(t,e){U(O,"Graphics#beginFill is no longer needed. Use Graphics#fill to fill the shape with the desired style.");const i={};return t&&(i.color=t),e&&(i.alpha=e),this.context.fillStyle=i,this}endFill(){U(O,"Graphics#endFill is no longer needed. Use Graphics#fill to fill the shape with the desired style."),this.context.fill();const t=this.context.strokeStyle;return(t.width!==mt.defaultStrokeStyle.width||t.color!==mt.defaultStrokeStyle.color||t.alpha!==mt.defaultStrokeStyle.alpha)&&this.context.stroke(),this}drawCircle(...t){return U(O,"Graphics#drawCircle has been renamed to Graphics#circle"),this._callContextMethod("circle",t)}drawEllipse(...t){return U(O,"Graphics#drawEllipse has been renamed to Graphics#ellipse"),this._callContextMethod("ellipse",t)}drawPolygon(...t){return U(O,"Graphics#drawPolygon has been renamed to Graphics#poly"),this._callContextMethod("poly",t)}drawRect(...t){return U(O,"Graphics#drawRect has been renamed to Graphics#rect"),this._callContextMethod("rect",t)}drawRoundedRect(...t){return U(O,"Graphics#drawRoundedRect has been renamed to Graphics#roundRect"),this._callContextMethod("roundRect",t)}drawStar(...t){return U(O,"Graphics#drawStar has been renamed to Graphics#star"),this._callContextMethod("star",t)}}const Sa=class va extends ta{constructor(...t){let e=t[0]??{};e instanceof Float32Array&&(U(O,"use new MeshGeometry({ positions, uvs, indices }) instead"),e={positions:e,uvs:t[1],indices:t[2]}),e={...va.defaultOptions,...e};const i=e.positions||new Float32Array([0,0,1,0,1,1,0,1]),n=e.uvs||new Float32Array([0,0,1,0,1,1,0,1]),r=e.indices||new Uint32Array([0,1,2,0,2,3]),a=e.shrinkBuffersToFit,o=new Ot({data:i,label:"attribute-mesh-positions",shrinkToFit:a,usage:it.VERTEX|it.COPY_DST}),h=new Ot({data:n,label:"attribute-mesh-uvs",shrinkToFit:a,usage:it.VERTEX|it.COPY_DST}),c=new Ot({data:r,label:"index-mesh-buffer",shrinkToFit:a,usage:it.INDEX|it.COPY_DST});super({attributes:{aPosition:{buffer:o,format:"float32x2",stride:2*4,offset:0},aUV:{buffer:h,format:"float32x2",stride:2*4,offset:0}},indexBuffer:c,topology:e.topology}),this.batchMode="auto"}get positions(){return this.attributes.aPosition.buffer.data}set positions(t){this.attributes.aPosition.buffer.data=t}get uvs(){return this.attributes.aUV.buffer.data}set uvs(t){this.attributes.aUV.buffer.data=t}get indices(){return this.indexBuffer.data}set indices(t){this.indexBuffer.data=t}};Sa.defaultOptions={topology:"triangle-list",shrinkBuffersToFit:!1};let dd=Sa;class He extends ${constructor(...t){let e=t[0];Array.isArray(t[0])&&(e={textures:t[0],autoUpdate:t[1]});const{textures:i,autoUpdate:n,...r}=e,[a]=i;super({...r,texture:a instanceof z?a:a.texture}),this._textures=null,this._durations=null,this._autoUpdate=n??!0,this._isConnectedToTicker=!1,this.animationSpeed=1,this.loop=!0,this.updateAnchor=!1,this.onComplete=null,this.onFrameChange=null,this.onLoop=null,this._currentTime=0,this._playing=!1,this._previousFrame=null,this.textures=i}stop(){this._playing&&(this._playing=!1,this._autoUpdate&&this._isConnectedToTicker&&(Pt.shared.remove(this.update,this),this._isConnectedToTicker=!1))}play(){this._playing||(this._playing=!0,this._autoUpdate&&!this._isConnectedToTicker&&(Pt.shared.add(this.update,this,ui.HIGH),this._isConnectedToTicker=!0))}gotoAndStop(t){this.stop(),this.currentFrame=t}gotoAndPlay(t){this.currentFrame=t,this.play()}update(t){if(!this._playing)return;const e=t.deltaTime,i=this.animationSpeed*e,n=this.currentFrame;if(this._durations!==null){let r=this._currentTime%1*this._durations[this.currentFrame];for(r+=i/60*1e3;r<0;)this._currentTime--,r+=this._durations[this.currentFrame];const a=Math.sign(this.animationSpeed*e);for(this._currentTime=Math.floor(this._currentTime);r>=this._durations[this.currentFrame];)r-=this._durations[this.currentFrame]*a,this._currentTime+=a;this._currentTime+=r/this._durations[this.currentFrame]}else this._currentTime+=i;this._currentTime<0&&!this.loop?(this.gotoAndStop(0),this.onComplete&&this.onComplete()):this._currentTime>=this._textures.length&&!this.loop?(this.gotoAndStop(this._textures.length-1),this.onComplete&&this.onComplete()):n!==this.currentFrame&&(this.loop&&this.onLoop&&(this.animationSpeed>0&&this.currentFramen)&&this.onLoop(),this._updateTexture())}_updateTexture(){const t=this.currentFrame;this._previousFrame!==t&&(this._previousFrame=t,this.texture=this._textures[t],this.updateAnchor&&this.anchor.copyFrom(this.texture.defaultAnchor),this.onFrameChange&&this.onFrameChange(this.currentFrame))}destroy(){this.stop(),super.destroy(),this.onComplete=null,this.onFrameChange=null,this.onLoop=null}static fromFrames(t){const e=[];for(let i=0;ithis.totalFrames-1)throw new Error(`[AnimatedSprite]: Invalid frame index value ${t}, expected to be between 0 and totalFrames ${this.totalFrames}.`);const e=this.currentFrame;this._currentTime=t,e!==this.currentFrame&&this._updateTexture()}get playing(){return this._playing}get autoUpdate(){return this._autoUpdate}set autoUpdate(t){t!==this._autoUpdate&&(this._autoUpdate=t,!this._autoUpdate&&this._isConnectedToTicker?(Pt.shared.remove(this.update,this),this._isConnectedToTicker=!1):this._autoUpdate&&!this._isConnectedToTicker&&this._playing&&(Pt.shared.add(this.update,this),this._isConnectedToTicker=!0))}}class ud extends mi{constructor(t,e){const{text:i,resolution:n,style:r,anchor:a,width:o,height:h,roundPixels:c,...l}=t;super({...l}),this.batched=!0,this._resolution=null,this._autoResolution=!0,this._didTextUpdate=!0,this._styleClass=e,this.text=i??"",this.style=r,this.resolution=n??null,this.allowChildren=!1,this._anchor=new ut({_onUpdate:()=>{this.onViewUpdate()}}),a&&(this.anchor=a),this.roundPixels=c??!1,o!==void 0&&(this.width=o),h!==void 0&&(this.height=h)}get anchor(){return this._anchor}set anchor(t){typeof t=="number"?this._anchor.set(t):this._anchor.copyFrom(t)}set text(t){t=t.toString(),this._text!==t&&(this._text=t,this.onViewUpdate())}get text(){return this._text}set resolution(t){this._autoResolution=t===null,this._resolution=t,this.onViewUpdate()}get resolution(){return this._resolution}get style(){return this._style}set style(t){var e;t=t||{},(e=this._style)==null||e.off("update",this.onViewUpdate,this),t instanceof this._styleClass?this._style=t:this._style=new this._styleClass(t),this._style.on("update",this.onViewUpdate,this),this.onViewUpdate()}get bounds(){return this._boundsDirty&&(this._updateBounds(),this._boundsDirty=!1),this._bounds}get width(){return Math.abs(this.scale.x)*this.bounds.width}set width(t){this._setWidth(t,this.bounds.width)}get height(){return Math.abs(this.scale.y)*this.bounds.height}set height(t){this._setHeight(t,this.bounds.height)}getSize(t){return t||(t={}),t.width=Math.abs(this.scale.x)*this.bounds.width,t.height=Math.abs(this.scale.y)*this.bounds.height,t}setSize(t,e){typeof t=="object"?(e=t.height??t.width,t=t.width):e??(e=t),t!==void 0&&this._setWidth(t,this.bounds.width),e!==void 0&&this._setHeight(e,this.bounds.height)}addBounds(t){const e=this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}containsPoint(t){const e=this.bounds.width,i=this.bounds.height,n=-e*this.anchor.x;let r=0;return t.x>=n&&t.x<=n+e&&(r=-i*this.anchor.y,t.y>=r&&t.y<=r+i)}onViewUpdate(){if(this._didViewChangeTick++,this._boundsDirty=!0,this.didViewUpdate)return;this.didViewUpdate=!0,this._didTextUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}_getKey(){return`${this.text}:${this._style.styleKey}:${this._resolution}`}destroy(t=!1){super.destroy(t),this.owner=null,this._bounds=null,this._anchor=null,(typeof t=="boolean"?t:t!=null&&t.style)&&this._style.destroy(t),this._style=null,this._text=null}}function fd(s,t){let e=s[0]??{};return(typeof e=="string"||s[1])&&(U(O,`use new ${t}({ text: "hi!", style }) instead`),e={text:e,style:s[1]}),e}class W extends ud{constructor(...t){const e=fd(t,"Text");super(e,N),this.renderPipeId="text"}_updateBounds(){const t=this._bounds,e=this._anchor,i=_s.measureText(this._text,this._style),{width:n,height:r}=i;t.minX=-e._x*n,t.maxX=t.minX+n,t.minY=-e._y*r,t.maxY=t.minY+r}}const Ca=class Ta extends dd{constructor(...t){super({});let e=t[0]??{};typeof e=="number"&&(U(O,"PlaneGeometry constructor changed please use { width, height, verticesX, verticesY } instead"),e={width:e,height:t[1],verticesX:t[2],verticesY:t[3]}),this.build(e)}build(t){t={...Ta.defaultOptions,...t},this.verticesX=this.verticesX??t.verticesX,this.verticesY=this.verticesY??t.verticesY,this.width=this.width??t.width,this.height=this.height??t.height;const e=this.verticesX*this.verticesY,i=[],n=[],r=[],a=this.verticesX-1,o=this.verticesY-1,h=this.width/a,c=this.height/o;for(let d=0;de?1:this.width/e,n=this._topHeight+this._bottomHeight,r=this.height>n?1:this.height/n,a=Math.min(i,r);t[9]=t[11]=t[13]=t[15]=this._topHeight*a,t[17]=t[19]=t[21]=t[23]=this.height-this._bottomHeight*a,t[25]=t[27]=t[29]=t[31]=this.height,t[2]=t[10]=t[18]=t[26]=this._leftWidth*a,t[4]=t[12]=t[20]=t[28]=this.width-this._rightWidth*a,t[6]=t[14]=t[22]=t[30]=this.width,this.getBuffer("aPosition").update()}updateUvs(){const t=this.uvs;t[0]=t[8]=t[16]=t[24]=0,t[1]=t[3]=t[5]=t[7]=0,t[6]=t[14]=t[22]=t[30]=1,t[25]=t[27]=t[29]=t[31]=1;const e=1/this._originalWidth,i=1/this._originalHeight;t[2]=t[10]=t[18]=t[26]=e*this._leftWidth,t[9]=t[11]=t[13]=t[15]=i*this._topHeight,t[4]=t[12]=t[20]=t[28]=1-e*this._rightWidth,t[17]=t[19]=t[21]=t[23]=1-i*this._bottomHeight,this.getBuffer("aUV").update()}};Aa.defaultOptions={width:100,height:100,leftWidth:10,topHeight:10,rightWidth:10,bottomHeight:10,originalWidth:100,originalHeight:100};let ae=Aa;const Pa=class ka extends mi{constructor(t){var d,u,g,m;t instanceof z&&(t={texture:t});const{width:e,height:i,leftWidth:n,rightWidth:r,topHeight:a,bottomHeight:o,texture:h,roundPixels:c,...l}=t;super({label:"NineSliceSprite",...l}),this.renderPipeId="nineSliceSprite",this.batched=!0,this._didSpriteUpdate=!0,this._leftWidth=n??((d=h==null?void 0:h.defaultBorders)==null?void 0:d.left)??ae.defaultOptions.leftWidth,this._topHeight=a??((u=h==null?void 0:h.defaultBorders)==null?void 0:u.top)??ae.defaultOptions.topHeight,this._rightWidth=r??((g=h==null?void 0:h.defaultBorders)==null?void 0:g.right)??ae.defaultOptions.rightWidth,this._bottomHeight=o??((m=h==null?void 0:h.defaultBorders)==null?void 0:m.bottom)??ae.defaultOptions.bottomHeight,this.bounds.maxX=this._width=e??h.width??ae.defaultOptions.width,this.bounds.maxY=this._height=i??h.height??ae.defaultOptions.height,this.allowChildren=!1,this.texture=h??ka.defaultOptions.texture,this.roundPixels=c??!1}get bounds(){return this._bounds}get width(){return this._width}set width(t){this.bounds.maxX=this._width=t,this.onViewUpdate()}get height(){return this._height}set height(t){this.bounds.maxY=this._height=t,this.onViewUpdate()}setSize(t,e){typeof t=="object"&&(e=t.height??t.width,t=t.width),this.bounds.maxX=this._width=t,this.bounds.maxY=this._height=e??t,this.onViewUpdate()}getSize(t){return t||(t={}),t.width=this._width,t.height=this._height,t}get leftWidth(){return this._leftWidth}set leftWidth(t){this._leftWidth=t,this.onViewUpdate()}get topHeight(){return this._topHeight}set topHeight(t){this._topHeight=t,this.onViewUpdate()}get rightWidth(){return this._rightWidth}set rightWidth(t){this._rightWidth=t,this.onViewUpdate()}get bottomHeight(){return this._bottomHeight}set bottomHeight(t){this._bottomHeight=t,this.onViewUpdate()}get texture(){return this._texture}set texture(t){t||(t=z.EMPTY);const e=this._texture;e!==t&&(e&&e.dynamic&&e.off("update",this.onViewUpdate,this),t.dynamic&&t.on("update",this.onViewUpdate,this),this._texture=t,this.onViewUpdate())}get originalWidth(){return this._texture.width}get originalHeight(){return this._texture.height}onViewUpdate(){if(this._didViewChangeTick++,this._didSpriteUpdate=!0,this.didViewUpdate)return;this.didViewUpdate=!0;const t=this.renderGroup||this.parentRenderGroup;t&&t.onChildViewUpdate(this)}addBounds(t){const e=this.bounds;t.addFrame(e.minX,e.minY,e.maxX,e.maxY)}destroy(t){if(super.destroy(t),typeof t=="boolean"?t:t==null?void 0:t.texture){const i=typeof t=="boolean"?t:t==null?void 0:t.textureSource;this._texture.destroy(i)}this._texture=null}};Pa.defaultOptions={texture:z.EMPTY};let yt=Pa;lt.add(za,Ua);const I=class I{static async Load(t){return this.text.text="Loading asset: "+t,await Re.load({src:t})}static async LoadAssets(){if(this.text){console.warn("Do not call GameAssets.LoadAssets() more than once.");return}console.log("Loading Texture Assets");const t=new W({text:"Loading textures. This might take a while.",style:new N({fill:3355443,fontSize:50})});t.x=f.app.canvas.width/2,t.y=f.app.canvas.height/2,t.anchor.set(.5,.5),f.app.stage.addChild(t),this.text=new W({text:"",style:new N({fill:3355443,fontSize:50})}),this.text.x=f.app.canvas.width/2,this.text.y=f.app.canvas.height/2+50,this.text.anchor.set(.5,.5),f.app.stage.addChild(this.text),await Promise.all([this.Load("./aclonica.woff2"),this.Load("./assets/gui/button_01.png").then(e=>this.Button01Texture=e),this.Load("./assets/gui/button_02.png").then(e=>this.Button02Texture=e),this.Load("./assets/gui/button_small.png").then(e=>this.ButtonSmallTexture=e),this.Load("./assets/gui/frame_01.png").then(e=>this.Frame01Texture=e),this.Load("./assets/gui/frame_02.png").then(e=>this.Frame02Texture=e),this.Load("./assets/gui/frame_03.png").then(e=>this.Frame03Texture=e),this.Load("./assets/gui/frame_04.png").then(e=>this.Frame04Texture=e),this.Load("./assets/gui/frame_05.png").then(e=>this.Frame05Texture=e),this.Load("./assets/gui/frame_inv.png").then(e=>this.FrameInventory=e),this.Load("./assets/gui/background_01.png").then(e=>this.FrameBackground=e),this.Load("./assets/gui/background_02.png").then(e=>this.FrameTowerTab=e),this.Load("./assets/gui/frame_violet.png").then(e=>this.VioletBackground=e),this.Load("./assets/gui/frame_red.png").then(e=>this.RedBackground=e),this.Load("./assets/gui/frame_green.png").then(e=>this.GreenBackground=e),this.Load("./assets/gui/frame_blue.png").then(e=>this.BlueBackground=e),this.Load("./assets/gui/banner_01.png").then(e=>this.BannerGemsmith=e),this.Load("./assets/gui/note.png").then(e=>this.EndScreenDialog=e),this.Load("./assets/gui/main_background.jpg").then(e=>this.MainBackground=e),this.Load("./assets/tutorial/tutorial01.jpg").then(e=>this.Tutorial01=e),this.Load("./assets/tutorial/tutorial02.jpg").then(e=>this.Tutorial02=e),this.Load("./assets/tutorial/tutorial03.jpg").then(e=>this.Tutorial03=e),this.Load("./assets/tutorial/tutorial04.jpg").then(e=>this.Tutorial04=e),this.Load("./assets/tutorial/tutorial05.jpg").then(e=>this.Tutorial05=e),this.Load("./assets/gui/heart.png").then(e=>this.HealthTexture=e),this.Load("./assets/gui/money.png").then(e=>this.GoldTexture=e),this.Load("./assets/gui/wave.png").then(e=>this.WaveTexture=e),this.Load("./assets/gui/sword_02.png").then(e=>this.SwordsTexture=e),this.Load("./assets/gui/title01.png").then(e=>this.TitleTexture=e),this.Load("./assets/gui/icons/play.png").then(e=>this.PlayIconTexture=e),this.Load("./assets/gui/icons/pause.png").then(e=>this.PauseIconTexture=e),this.Load("./assets/gui/icons/pause.png").then(e=>this.PauseIconTexture=e),this.Load("./assets/gui/icons/fastforward.png").then(e=>this.FastForwardIconTexture=e),this.Load("./assets/gui/icons/home.png").then(e=>this.HomeIconTexture=e),this.Load("./assets/gui/icons/hammer.png").then(e=>this.HammerIconTexture=e),this.Load("./assets/gui/icons/cross.png").then(e=>this.XIconTexture=e),this.Load("./assets/gui/icons/plus.png").then(e=>this.PlusIconTexture=e),this.LoadMissions(),this.LoadTowers(),this.LoadCreeps(),this.LoadGems()]),t.destroy(),this.text.destroy(),this.text=!0}static async LoadGems(){const e=await(await fetch("./assets/json/Gems.json")).json();this.Gems=e;for(let i=0;i{this.enabled&&this.onWheel(e)},this._container.onpointerdown=e=>{this.enabled&&this.onClick(e)})}destroy(){this._events.removeAllListeners(),this._container.parent&&this._container.parent.removeChild(this._container),this._container.destroy()}get container(){return this._container}get events(){return this._events}onClick(t){console.warn(`[${this.name} does not implement GuiObject.onClick()]`)}onWheel(t){console.warn(`[${this.name} does not implement GuiObject.onWheel()]`)}setEnabled(t){this.enabled=t}copyContainerToBB(){return this.bb.x=this.container.x,this.bb.y=this.container.y,this.bb.width=this.container.width,this.bb.height=this.container.height,this.bb}copyBBToContainer(){return this.container.x=this.bb.x,this.container.y=this.bb.y,this.container.width=this.bb.width,this.container.height=this.bb.height,this.container}copyPropertiesToObj(t){return t.x=this.bb.x,t.y=this.bb.y,t.width=this.bb.width,t.height=this.bb.height,t}}var ot=(s=>(s[s.Button01=0]="Button01",s[s.Button02=1]="Button02",s))(ot||{});class ct extends Ct{constructor(e,i,n,r=!0){super(!0);p(this,"caption");p(this,"bounds");p(this,"buttonTexture");p(this,"buttonSprite");p(this,"buttonText");p(this,"buttonIcon");n==0&&(this.buttonTexture=M.Button01Texture),n==1&&(this.buttonTexture=M.Button02Texture),this.caption=i,this.enabled=r,this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.container.width=this.bounds.width,this.container.height=this.bounds.height,this.buttonSprite=new yt({texture:this.buttonTexture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.buttonSprite.x=0,this.buttonSprite.y=0,this.buttonSprite.width=this.bounds.width,this.buttonSprite.height=this.bounds.height,this.container.addChild(this.buttonSprite),this.buttonText=new W({text:this.caption,style:new N({fill:16777215,fontSize:24})}),this.container.addChild(this.buttonText),this.buttonText.anchor.set(.5,.5),this.buttonText.x=this.bounds.width/2,this.buttonText.y=this.bounds.height/2,this.container.x=this.bounds.x,this.container.y=this.bounds.y}setCaption(e){this.caption=e,this.buttonText.text=e}getCaption(){return this.caption}CustomButtonLogic(){console.warn(this.name+" - Button.CustomButtonLogic() is not implemented.")}}class vi{constructor(){p(this,"stage",new J);p(this,"gui",[]);p(this,"_events",new ft);f.app.stage.addChild(this.stage)}destroy(){this.stage.destroy(),this._events.removeAllListeners(),this.gui.forEach(t=>{t.destroy()})}addMainBackground(){const t=new $(M.MainBackground);t.width=f.app.canvas.width,t.height=f.app.canvas.height,this.stage.addChild(t)}get events(){return this._events}init(){}}class md extends vi{constructor(){super(...arguments);p(this,"currentImg",1);p(this,"sprite")}init(){let e=[null,M.Tutorial01,M.Tutorial02,M.Tutorial03,M.Tutorial04,M.Tutorial05];this.sprite=new $({texture:M.Tutorial01,scale:.6,x:250,y:150}),this.stage.addChild(this.sprite);let i=new ct(new E(250,this.sprite.height+160,120,60),"Back",ot.Button01);i.container.alpha=0,i.onClick=()=>{i.container.alpha==0||this.currentImg==1||(this.currentImg--,this.currentImg==3?this.sprite.scale=1.1:this.sprite.scale=.6,this.sprite.texture=e[this.currentImg],this.currentImg==1&&(i.container.alpha=0))};let n=new ct(new E(this.sprite.width+130,this.sprite.height+160,120,60),"Next",ot.Button01);n.onClick=()=>{n.container.alpha!=0&&(this.currentImg++,this.currentImg==3?this.sprite.scale=1.1:this.sprite.scale=.6,this.currentImg!=1&&(i.container.alpha=1),this.sprite.texture=e[this.currentImg],this.currentImg==5&&(n.container.alpha=0))};const r=new ct(new E(this.sprite.width-540,this.sprite.height+160,200,60),"Main menu",ot.Button01);r.onClick=a=>{f.GameMaster.changeScene(new Ns)}}}class $t{constructor(){p(this,"name",this.constructor.name);p(this,"_container",new J);p(this,"bb",new E);p(this,"_events",new ft)}destroy(){this._events.removeAllListeners(),this._container.parent&&this._container.parent.removeChild(this._container),this._container.destroy()}get container(){return this._container}get events(){return this._events}copyContainerToBB(){return this.container==null?null:(this.bb.x=this.container.x,this.bb.y=this.container.y,this.bb.width=this.container.width,this.bb.height=this.container.height,this.bb)}copyBBToContainer(){return this.container.x=this.bb.x,this.container.y=this.bb.y,this.container.width=this.bb.width,this.container.height=this.bb.height,this.container}copyPropertiesToObj(t){return t.x=this.bb.x,t.y=this.bb.y,t.width=this.bb.width,t.height=this.bb.height,t}}var Ft=(s=>(s[s.Restricted=0]="Restricted",s[s.Buildable=1]="Buildable",s[s.Path=9]="Path",s))(Ft||{}),ie=(s=>(s.CreepSpawned="creepSpawned",s.Finished="finished",s.NewWave="newwave",s))(ie||{}),kt=(s=>(s.Died="died",s.TakenDamage="takenDamage",s.Escaped="escaped",s.Moved="moved",s))(kt||{}),$e=(s=>(s.CellMouseOver="cellmouseover",s.CellMouseLeave="cellmouseleave",s))($e||{}),ge=(s=>(s.TowerPlacedEvent="towerPlacedEvent",s.TowerSoldEvent="towerSoldEvent",s))(ge||{}),zs=(s=>(s.GemGivenEvent="gemGivenEvent",s))(zs||{}),Us=(s=>(s.TowerPanelSelectGem="towerTabSelectGem",s))(Us||{});class xd extends $t{constructor(e,i,n,r){super();p(this,"type");p(this,"row");p(this,"column");p(this,"isPath",!1);p(this,"g");p(this,"hasTowerPlaced",!1);p(this,"clickDetector");this.type=e,this.row=i,this.column=n,this.isPath=r,this.bb.x=this.column*f.GridCellSize,this.bb.y=this.row*f.GridCellSize,this.bb.width=f.GridCellSize,this.bb.height=f.GridCellSize,f.Grid.container.addChild(this.container),this.container.x=this.bb.x,this.container.y=this.bb.y,this.clickDetector=new St({zIndex:99,interactive:!0}),this.g=new St({zIndex:5}),this.clickDetector.rect(0,0,this.bb.width,this.bb.height),this.clickDetector.fill({color:16711680,alpha:0}),this.container.addChild(this.clickDetector),this.container.addChild(this.g),this.clickDetector.on("pointerup",a=>{f.Grid.gridInteractionEnabled&&(f.TowerManager.isPlacingTower?f.Grid.onGridCellClicked(i,n):this.OpenSelectedTowerPanel())}),this.clickDetector.on("pointerenter",a=>{!f.Grid.gridInteractionEnabled||f.GameScene.towerPanel.isShown||f.GameScene.events.emit($e.CellMouseOver,this)}),this.clickDetector.on("pointerleave",a=>{!f.Grid.gridInteractionEnabled||f.GameScene.towerPanel.isShown||(f.GameScene.events.emit($e.CellMouseLeave,this),f.Grid.rangePreview.clear())}),f.GameScene.events.on(ge.TowerPlacedEvent,(a,o,h)=>{o==this.row&&h==this.column&&(this.hasTowerPlaced=!0,f.Grid.rangePreview.clear())}),f.GameScene.events.on(ge.TowerSoldEvent,(a,o,h)=>{o==this.row&&h==this.column&&(this.hasTowerPlaced=!1,f.Grid.rangePreview.clear())})}showRangePreview(e,i){let n=16777215;e&&(n=16711680),f.Grid.rangePreview.clear(),f.Grid.rangePreview.circle(this.column*f.GridCellSize+f.GridCellSize/2,this.row*f.GridCellSize+f.GridCellSize/2,i*f.GridCellSize),f.Grid.rangePreview.fill({color:n,alpha:.3})}OpenSelectedTowerPanel(){if(this.hasTowerPlaced){const e=f.TowerManager.GetTowerByRowAndCol(this.row,this.column);f.GameScene.towerPanel.Show(e)}}checkIfCantPlace(){return this.hasTowerPlaced||this.isPath||this.type==Ft.Path||this.type==Ft.Restricted}gDraw(){this.g.rect(0,0,this.bb.width,this.bb.height),this.type==Ft.Restricted?this.g.fill({color:2236962,alpha:.5}):this.hasTowerPlaced?this.g.fill({color:16711680,alpha:.5}):this.type==Ft.Path?this.g.fill({color:2236962,alpha:.5}):this.type==Ft.Buildable&&this.g.stroke({color:65280,alpha:.9})}gClear(){this.g.clear()}update(){}}class yd extends $t{constructor(e,i){super();p(this,"gameMap");p(this,"cells",[]);p(this,"rangePreview");p(this,"creeps",[]);p(this,"gridShown",!1);p(this,"gridInteractionEnabled",!0);this.gameMap=e,f.Grid=this,this.bb.x=0,this.bb.y=0,this.bb.width=f.GridCellSize*f.GridColumns,this.bb.height=f.GridCellSize*f.GridRows,f.GameMaster.currentScene.stage.addChild(this.container);let n=new $(M.MissionBackgrounds[i]);this.container.addChild(n);for(let r=0;rl.some(d=>d[1]===a&&d[0]===r));h&&(o=Ft.Path);let c=new xd(o,a,r,h);this.cells.push(c)}this.rangePreview=new St({zIndex:10}),this.container.addChild(this.rangePreview)}generateCells(){const e=Array.from({length:this.gameMap.rows},()=>Array(this.gameMap.columns).fill(1));this.cells.forEach(i=>{if(i.isPath){e[i.row][i.column]=9;for(let n=-1;n<=1;n++)for(let r=-1;r<=1;r++){const a=i.row+n,o=i.column+r;a>=0&&a=0&&o{if(e){e=="hide"?i.gClear():i.gDraw();return}this.gridShown?i.gClear():i.gDraw()}),e=="hide"?this.gridShown=!1:e=="show"?this.gridShown=!0:this.gridShown=!this.gridShown}addCreep(e){this.creeps.push(e),e.events.on(kt.Died,i=>{this.onCreepDiedOrEscaped(i)}),e.events.on(kt.Escaped,i=>{this.onCreepDiedOrEscaped(i)})}onCreepDiedOrEscaped(e){this.creeps.splice(this.creeps.indexOf(e),1),e.destroy()}update(e){this.creeps.forEach(i=>{i.dead?(this.creeps.splice(this.creeps.indexOf(i),1),i=null):i.update(e)})}getCellByRowAndCol(e,i){return this.cells.filter(n=>n.row==e&&n.column==i)[0]}onGridCellClicked(e,i){}}class _d extends $t{constructor(e,i,n){super();p(this,"id");p(this,"creepType");p(this,"sprite");p(this,"path");p(this,"stats");p(this,"pathIndex",0);p(this,"speed");p(this,"direction",1);p(this,"healthBarGraphics",new St);p(this,"healthBarWidth",50);p(this,"health");p(this,"maxHealth");p(this,"escaped",!1);p(this,"died",!1);p(this,"x");p(this,"y");p(this,"dead",!1);this.creepType=e,this.stats=structuredClone(M.Creeps[this.creepType].stats),this.sprite=new He(M.Creeps[this.creepType].textures),this.sprite.scale.x*=-1,this.sprite.anchor.set(.5,.5),this.sprite.animationSpeed=.3,this.sprite.play(),this.id=n,this.container.x=-70,this.container.y=-50,this.sprite.width=f.GridCellSize,this.sprite.height=f.GridCellSize,this.bb.width=this.sprite.width,this.speed=this.stats.speed/60,this.health=this.stats.health,this.maxHealth=this.stats.health,this.path=i,this.x=i[0][0]*f.GridCellSize+f.GridCellSize/2,this.y=i[0][1]*f.GridCellSize+f.GridCellSize/2,f.GameScene.events.on(kt.TakenDamage,(r,a,o)=>{r==this.id&&(this.health-=a+a*(o.physical-this.stats.resistance.physical),o.fire!=0&&(this.health-=Math.max(a*(o.fire-this.stats.resistance.fire),0)),o.ice!=0&&(this.health-=Math.max(a*(o.ice-this.stats.resistance.ice),0)),o.frostfire!=0&&(this.health-=Math.max(a*(o.frostfire-this.stats.resistance.frostfire),0)),o.divine!=0&&(this.health-=Math.max(a*(o.divine-this.stats.resistance.divine),0)),this.UpdateHealthbar())}),f.Grid.container.addChild(this.container),this.container.addChild(this.healthBarGraphics),this.container.addChild(this.sprite),this.UpdateHealthbar()}UpdateHealthbar(){this.healthBarGraphics.clear();const e=this.health,i=this.maxHealth,n=e/i,r=this.healthBarWidth*n;this.healthBarGraphics.rect(-this.healthBarWidth/2+3,-32,this.healthBarWidth+4,14),this.healthBarGraphics.fill({color:0}),this.healthBarGraphics.rect(-this.healthBarWidth/2+5,-30,r,10),this.healthBarGraphics.fill({color:16711680})}update(e){if(this.dead)return;if(this.health<=0){f.GameScene.events.emit(kt.Died,this.maxHealth,this),this.destroy(),this.dead=!0;return}if(this.pathIndex+1==this.path.length){if(this.escaped)return;this.events.emit(kt.Escaped,this),this.escaped=!0;return}const i=this.path[this.pathIndex],n=this.path[this.pathIndex+1],r=n[0]*f.GridCellSize+f.GridCellSize/2,a=n[1]*f.GridCellSize+f.GridCellSize/2,o=n[0]-i[0],h=n[1]-i[1];o>0?this.direction!=1&&(this.direction=1,this.sprite.scale.x*=-1):o<0&&this.direction!=-1&&(this.direction=-1,this.sprite.scale.x*=-1);let c=this.speed*e*o*f.GameScene.gameSpeedMultiplier,l=this.speed*e*h*f.GameScene.gameSpeedMultiplier,d=!1;c>0&&this.x+c>r&&(c=r-this.x,d=!0),c<0&&this.x+c0&&this.y+l>a&&(l=a-this.y,d=!0),l<0&&this.y+l{i+=n.firstCreepSpawnTick,n.creeps.forEach(r=>{const a=new _d(r,this.paths[this.pathsIndex],this.internalCreepId);this.internalCreepId++;const o={creep:a,tickToSpawnAt:i,spawned:!1};i+=n.spawnIntervalTicks,this.creeps.push(o)})}),console.log(this.creeps)}end(){this.started=!1}update(e){this.started!=!1&&(this.ticks+=e*f.GameScene.gameSpeedMultiplier,this.creeps.forEach(i=>{!i.spawned&&i.tickToSpawnAt<=this.ticks?(i.spawned=!0,this.events.emit(ie.CreepSpawned,i.creep),!this.finished&&this.creeps.every(n=>n.spawned)&&(this.finished=!0,this.events.emit(ie.Finished))):i.spawned&&i.creep.update(e)}))}}class Qn extends Ct{constructor(e,i,n,r,a,o,h,c){if(e>3||i>2||e<0||i<0)throw"Index/row out of bounds for TowerButton.";super(!0);p(this,"frameSprite");p(this,"background");p(this,"towerName");p(this,"iconSprite");p(this,"i",0);this.towerName=h,this.container.x=e*n+5,this.container.y=i*r+5,this.background=new $({texture:o}),this.iconSprite=new $({texture:c}),this.background.width=n,this.background.height=r,this.iconSprite.x=n/2,this.iconSprite.y=r/2,this.iconSprite.width=n/2,this.iconSprite.height=r/2,this.iconSprite.anchor.set(.5,.5),this.container.addChild(this.background),this.container.addChild(this.iconSprite),this.frameSprite=new yt({texture:M.Frame02Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100,roundPixels:!0,height:r,width:n}),this.container.addChild(this.frameSprite),a.addChild(this.container),f.GameScene.events.on(ge.TowerPlacedEvent,l=>{this.resetTint()}),this.container.onpointermove=l=>{f.Grid.gridInteractionEnabled!=!1&&(f.TowerManager.isPlacingTower||this.ShowTooltip())},this.container.onpointerleave=l=>{f.GameScene.tooltip.Hide()}}ShowTooltip(){let e;M.Towers.forEach(i=>{i.name==this.towerName&&(e=i)}),f.GameScene.tooltip.SetContentTower(this.towerName,e.stats.damage,e.stats.cost,e.stats.gemSlotsAmount),f.GameScene.tooltip.Show(f.MouseX,f.MouseY)}onClick(e){f.Grid.gridInteractionEnabled!=!1&&(f.TowerManager.isPlacingTower&&f.TowerManager.selectedTower.name!=this.towerName&&(f.GameScene.sidebar.towerTab.resetTint(),f.TowerManager.ResetChooseTower()),f.GameScene.towerPanel.Hide(),f.GameScene.tooltip.Hide(),this.frameSprite.tint==65280?(this.frameSprite.tint=16777215,this.ShowTooltip()):this.frameSprite.tint=65280,f.TowerManager.ToggleChoosingTowerLocation(this.towerName))}resetTint(){this.frameSprite.tint=16777215}}class bd extends Ct{constructor(e){super(!1);p(this,"bounds");p(this,"towerTabSprite");p(this,"towerButtons",[]);this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.towerTabSprite=new yt({texture:M.FrameTowerTab,leftWidth:500,topHeight:500,rightWidth:500,bottomHeight:500,roundPixels:!0}),this.towerTabSprite.width=this.bounds.width,this.towerTabSprite.height=this.bounds.height,this.container.addChild(this.towerTabSprite),this.towerButtons.push(new Qn(0,0,70,70,this.container,M.RedBackground,"Basic Tower",M.Towers[0].texture)),this.towerButtons.push(new Qn(3,1,70,70,this.container,M.GreenBackground,"Circle Tower",M.Towers[1].texture))}resetTint(){this.towerButtons.forEach(e=>e.resetTint())}}const te=class te{static init(){te.SidebarRect=new E(f.app.canvas.width-360,0,360,f.app.canvas.height),te.ChangeRoundButtonRect=new E(50,f.app.canvas.height-100,310,100)}};p(te,"SidebarRect"),p(te,"ChangeRoundButtonRect"),p(te,"MaximumPlayerNameLength",20);let Nt=te;function Et(s,t,e,i){const n=e-s,r=i-t;return Math.atan2(r,n)}class Sd extends $t{constructor(e,i,n,r,a,o,h,c,l){super();p(this,"deleteMe",!1);p(this,"sprite");p(this,"x");p(this,"y");p(this,"angle");p(this,"speed");p(this,"damage");p(this,"pierce",1);p(this,"timeToLive");p(this,"parent");p(this,"gemResistanceModifications");p(this,"collidedCreepIDs",[]);this.x=e,this.y=i,this.timeToLive=h,this.pierce=c,this.damage=a,this.gemResistanceModifications=l,this.sprite=new He({textures:n,scale:.25,rotation:r}),this.sprite.anchor.set(.5,.5),this.sprite.play(),this.container.x=this.x,this.container.y=this.y,this.sprite.tint=o,this.container.addChild(this.sprite),f.GameMaster.currentScene.stage.addChild(this.container),this.angle=r,this.speed=.9}destroy(){super.destroy(),this.deleteMe=!0}update(e){if(!this.deleteMe){if(this.x>2e3||this.x<0||this.y>2e3||this.y<0||this.pierce<=0||this.timeToLive<=0)return this.destroy();this.timeToLive-=f.GameScene.gameSpeedMultiplier,f.Grid.creeps.forEach(i=>{if(!(this.pierce<=0)&&i&&i.container&&this.checkCollision(i)&&!this.collidedCreepIDs.find(r=>i.id==r.id)){this.collidedCreepIDs.push(i),this.pierce--,this.onCollide(i);return}}),this.x+=Math.cos(this.angle)*this.speed*e*f.GameScene.gameSpeedMultiplier,this.y+=Math.sin(this.angle)*this.speed*e*f.GameScene.gameSpeedMultiplier,this.container.x=this.x,this.container.y=this.y}}onCollide(e){f.GameScene.events.emit(kt.TakenDamage,e.id,this.damage,this.gemResistanceModifications)}checkCollision(e){if(e==null||e.container==null||e.container._position==null)return;let i=this.copyContainerToBB(),n=e.copyContainerToBB();return i.getBounds().intersects(n.getBounds())}}function Ga(s,t){s.projectiles.forEach(e=>{e.deleteMe||s.sold?(e.collidedCreepIDs.forEach(()=>{s.damageDealt+=s.computedDamageToDeal}),e.collidedCreepIDs=[],s.projectiles.splice(s.projectiles.indexOf(e),1),e.destroy(),e=null):e.update(t)})}function Ws(s){let t=0,e=0,i=0,n=0,r=0;s.totalGemResistanceModifications={fire:0,frostfire:0,divine:0,ice:0,physical:0},s.slottedGems.forEach(a=>{let o=a.currentGemImprovement();t+=o.damageUp,e+=o.attackSpeedUp,i+=o.rangeUp,n+=o.timeToLiveUp,r+=o.pierceUp;let h=a.currentGemResistanceModifications();s.totalGemResistanceModifications.physical+=h.physical,s.totalGemResistanceModifications.ice+=h.ice,s.totalGemResistanceModifications.fire+=h.fire,s.totalGemResistanceModifications.divine+=h.divine,s.totalGemResistanceModifications.frostfire+=h.frostfire}),s.computedDamageToDeal=s.definition.stats.damage+t,s.computedCooldown=s.definition.stats.cooldown-e,s.computedRange=s.definition.stats.range+i,s.computedTimeToLive=s.definition.stats.timeToLive+n,s.computedPierce=s.definition.stats.pierce+r}function vd(s,t){Ws(s),Ga(s,t),s.millisecondsUntilNextShot>0&&(s.millisecondsUntilNextShot-=t*f.GameScene.gameSpeedMultiplier);let e=s.GetCreepsInRange();if(e.length>0){let i=e[0];if(s.millisecondsUntilNextShot<=0){let n=s.column*f.GridCellSize+f.GridCellSize/2,r=s.row*f.GridCellSize+f.GridCellSize/2;s.millisecondsUntilNextShot=s.computedCooldown,s.Shoot(Et(n,r,i.x,i.y))}}}function Cd(s,t){Ws(s),Ga(s,t),s.millisecondsUntilNextShot>0&&(s.millisecondsUntilNextShot-=t*f.GameScene.gameSpeedMultiplier);let e=s.GetCreepsInRange();if(e.length>0&&(e[0],s.millisecondsUntilNextShot<=0)){s.millisecondsUntilNextShot=s.computedCooldown;let i=s.column*f.GridCellSize+f.GridCellSize/2,n=s.row*f.GridCellSize+f.GridCellSize/2;s.Shoot(Et(i,n,i,n+10)),s.Shoot(Et(i,n,i+10,n)),s.Shoot(Et(i,n,i-10,n)),s.Shoot(Et(i,n,i,n-10)),s.Shoot(Et(i,n,i+10,n+10)),s.Shoot(Et(i,n,i-10,n+10)),s.Shoot(Et(i,n,i-10,n-10)),s.Shoot(Et(i,n,i+10,n-10))}}class Ve extends Ct{constructor(e,i,n,r){super(!0);p(this,"iconSprite");p(this,"background");p(this,"frame");p(this,"i",0);p(this,"gem",null);let a;this.i=e,this.container.x=10,this.container.y=e*(f.GridCellSize+6)+300,this.background=new $({texture:M.Frame01Texture}),n==null&&!r?a=M.PlusIconTexture:r=="SELL"?a=M.GoldTexture:r=="UPGRADE"?a=M.PlusIconTexture:(a=n.texture,this.gem=n),this.iconSprite=new $({texture:a,zIndex:10}),this.background.width=f.GridCellSize,this.background.height=f.GridCellSize,n==null&&!r?(this.iconSprite.x=f.GridCellSize/2,this.iconSprite.y=f.GridCellSize/2,this.iconSprite.width=f.GridCellSize/2,this.iconSprite.height=f.GridCellSize/2,this.iconSprite.anchor.set(.5,.5)):r=="SELL"?(this.iconSprite.x=4,this.iconSprite.y=4,this.iconSprite.width=f.GridCellSize-8,this.iconSprite.height=f.GridCellSize-8):r=="UPGRADE"?(this.iconSprite.x=f.GridCellSize/2,this.iconSprite.y=f.GridCellSize/2,this.iconSprite.width=f.GridCellSize/2,this.iconSprite.height=f.GridCellSize/2,this.iconSprite.tint=3012919,this.iconSprite.anchor.set(.5,.5)):(this.iconSprite.x=4,this.iconSprite.y=4,this.iconSprite.width=f.GridCellSize-8,this.iconSprite.height=f.GridCellSize-8),this.frame=new $({texture:M.Frame05Texture,width:64,height:64}),this.container.addChild(this.background),this.container.addChild(this.iconSprite),this.container.addChild(this.frame);let o=n?n.level:"",h=new W({text:o,zIndex:11,style:{fill:"white",stroke:{color:0,width:5}}});this.container.addChild(h),i.addChild(this.container)}setTint(e){this.frame.tint=e}resetTint(){this.frame.tint=16777215}}class Td extends Ct{constructor(e){super(!1);p(this,"bounds");p(this,"towerPanel");p(this,"closeBtn");p(this,"vGems",[]);p(this,"showingTower",null);p(this,"isShown",!1);p(this,"titleText");p(this,"damageText");p(this,"totalDamage");p(this,"attackSpeedText");p(this,"fireResDamage");p(this,"iceResDamage");p(this,"frostFireResDamage");p(this,"divineResDamage");p(this,"physicalResDamage");p(this,"sellButton");this.bounds=e,this.towerPanel=new yt({texture:M.Frame03Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.towerPanel.width=this.bounds.width,this.towerPanel.height=this.bounds.height-this.bounds.height/3.5,this.closeBtn=new ct(new E(-20,-20,60,60),"",ot.Button01,!0),this.closeBtn.container.removeFromParent(),this.closeBtn.CustomButtonLogic=()=>{this.closeBtn.buttonIcon=new $({texture:M.XIconTexture,x:this.closeBtn.container.width/2,y:this.closeBtn.container.height/2,scale:.2}),this.closeBtn.buttonIcon.anchor.set(.5,.5),this.closeBtn.container.addChild(this.closeBtn.buttonIcon)},this.closeBtn.onClick=()=>{this.Hide()},this.Hide(),this.closeBtn.CustomButtonLogic(),this.container.y=f.app.canvas.height/2-f.app.canvas.height/2.7,this.container.addChild(this.towerPanel),this.container.addChild(this.closeBtn.container),f.GameMaster.currentScene.stage.addChild(this.container),this.titleText=new W({x:this.bounds.width/3,y:50,zIndex:5,style:new N({fill:16777215,fontSize:25,stroke:{color:0,width:2}})}),this.titleText.anchor.set(.5,0),this.container.addChild(this.titleText),this.damageText=new W({x:10,y:100,zIndex:5,style:new N({fill:16753920,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.damageText),this.attackSpeedText=new W({x:100,y:100,zIndex:5,style:new N({fill:16777215,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.attackSpeedText),this.totalDamage=new W({x:10,y:130,zIndex:5,style:new N({fill:16711680,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.totalDamage),this.fireResDamage=new W({x:10,y:170,zIndex:5,style:new N({fill:16536403,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.fireResDamage),this.iceResDamage=new W({x:10,y:190,zIndex:5,style:new N({fill:3335420,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.iceResDamage),this.frostFireResDamage=new W({x:10,y:210,zIndex:5,style:new N({fill:14111740,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.frostFireResDamage),this.divineResDamage=new W({x:10,y:230,zIndex:5,style:new N({fill:16576083,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.divineResDamage),this.physicalResDamage=new W({x:10,y:250,zIndex:5,style:new N({fill:16777215,fontSize:18,stroke:{color:0,width:2}})}),this.container.addChild(this.physicalResDamage),this.sellButton=new ct(new E(5,this.towerPanel.height-70,this.towerPanel.width-115,60),"Sell",ot.Button02,!0),this.sellButton.container.removeFromParent(),this.container.addChild(this.sellButton.container)}MakeSlots(e){this.vGems.forEach(n=>{n.destroy()}),this.vGems=[];let i=e.definition.stats.gemSlotsAmount;for(let n=0;n{r&&(f.GameScene.tooltip.SetContentGem(r),f.GameScene.tooltip.Show(f.MouseX,f.MouseY))},a.container.onpointerleave=()=>{f.GameScene.tooltip.Hide()},a.onClick=()=>{f.GameScene.tooltip.Hide(),console.warn("EMITTING TOWER PANEL SELECT GEM",r,a.i,n,e),f.GameScene.events.emit(Us.TowerPanelSelectGem,r,a.i,e),!r&&f.GameScene.sidebar.gemTab.isSelectingGem?a.setTint(65535):a.resetTint()}}}Show(e){this.isShown=!0,Ws(e),this.SetContent(e),this.MakeSlots(e),this.showingTower=e,f.GameScene.sidebar.gemTab.selectingGemTowerObject=e,e.container.parent.x<1270?this.ShowRight():this.ShowLeft(),e.parent.showRangePreview(!1,e.computedRange)}SetContent(e){this.titleText.text=e.definition.name,this.damageText.text="Deals "+e.computedDamageToDeal+" damage",this.totalDamage.text="Damage dealt: "+e.damageDealt+" damage",this.attackSpeedText.x=this.damageText.width+10,this.attackSpeedText.text=` every ${Math.floor(e.computedCooldown/60*100)/100}s`,this.fireResDamage.text=`+${e.totalGemResistanceModifications.fire*100}% Fire damage`,this.iceResDamage.text=`+${e.totalGemResistanceModifications.ice*100}% Ice damage`,this.frostFireResDamage.text=`+${e.totalGemResistanceModifications.frostfire*100}% FrostFire damage`,this.divineResDamage.text=`+${e.totalGemResistanceModifications.divine*100}% Divine damage`,this.physicalResDamage.text=`+${e.totalGemResistanceModifications.physical*100}% Physical damage`,this.sellButton.setCaption("Sell for "+e.definition.stats.cost+" gold"),this.sellButton.onClick=()=>{e.Sell(),this.Hide()}}ShowLeft(){this.towerPanel.x=-100,this.container.x=0,this.container.alpha=1,this.closeBtn.container.x=this.bounds.width-150}ShowRight(){this.towerPanel.x=-10,this.container.x=Nt.SidebarRect.x-210,this.closeBtn.container.x=-20,this.container.alpha=1}Hide(){this.isShown=!1,this.container.alpha=0,this.container.x=-1e3,f.Grid.rangePreview.clear()}}class Ad extends Ct{constructor(e){super(!1);p(this,"bounds");p(this,"gemTabSprite");p(this,"vGems",[]);p(this,"isSelectingGem",!1);p(this,"selectingGemSlotIndex",-1);p(this,"selectingGemTowerObject",null);p(this,"isDragAndDroppingGem",!1);p(this,"dragAndDroppingGem",null);this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.gemTabSprite=new yt({texture:M.FrameTowerTab,leftWidth:1e3,topHeight:1e3,rightWidth:1e3,bottomHeight:1e3}),this.gemTabSprite.x=0,this.gemTabSprite.y=0,this.gemTabSprite.width=this.bounds.width,this.gemTabSprite.height=this.bounds.height,this.container.addChild(this.gemTabSprite),f.app.canvas.addEventListener("pointermove",()=>{this.pointerMoveEvent()}),f.GameScene.events.on(zs.GemGivenEvent,()=>{this.RebuildInventoryVisual()})}TowerPanelSelectingGem(e,i,n){console.log("TOWER PANEL SELECTING GEM "+i),i<0&&console.error("TOWER PANEL SELECTING GEM INDEX IS LESS THAN 0, ",i),this.isSelectingGem?e==null&&(this.isSelectingGem=!1,this.selectingGemSlotIndex=-1,this.selectingGemTowerObject=null):(this.isSelectingGem=!0,e==null?(f.NotificationManager.Notify("Click on any Gem in your inventory to slot it into this Gem slot.","info"),this.selectingGemSlotIndex=i,this.selectingGemTowerObject=n):(n.UnslotGem(i),this.RebuildInventoryVisual(),f.GameScene.towerPanel.Hide(),f.GameScene.towerPanel.Show(n),this.isSelectingGem=!1,this.selectingGemSlotIndex=-1,this.selectingGemTowerObject=null))}pointerMoveEvent(){!this.isDragAndDroppingGem||!this.dragAndDroppingGem||(this.dragAndDroppingGem.container.x=f.MouseX-32,this.dragAndDroppingGem.container.y=f.MouseY-32)}isOverlappingGemsmith(e,i,n){let r=e.copyContainerToBB(),a=i.copyContainerToBB(),o=n.x+a.x+f.GameScene.sidebar.container.x,h=n.y+a.y+f.GameScene.sidebar.container.y,c=new E(o,h,a.width,a.height);if(r.getBounds().intersects(c)&&i&&i.gem==null)return!0}RebuildInventoryVisual(){this.vGems.forEach(e=>e.destroy()),this.vGems=[],f.GameScene.MissionStats.getInventory().forEach((e,i)=>{let n=new Ve(0,this.container,e),r=10,a=i%4*70+10,o=i;for(;!(o<=3);)r+=66,o-=4;n.container.x=a,n.container.y=r,n.container.onpointermove=()=>{e==null||this.isDragAndDroppingGem||(f.GameScene.tooltip.SetContentGem(e),f.GameScene.tooltip.Show(f.MouseX,f.MouseY))},n.container.onpointerleave=()=>{f.GameScene.tooltip.Hide()},n.container.onpointerdown=()=>{if(f.GameScene.tooltip.Hide(),this.isSelectingGem){this.isSelectingGem=!1;let h=f.GameScene.MissionStats.takeGem(e);this.selectingGemTowerObject.SlotGem(h,this.selectingGemSlotIndex),this.RebuildInventoryVisual()}else this.isDragAndDroppingGem=!0,this.dragAndDroppingGem=n,n.container.removeFromParent(),f.GameScene.stage.addChild(n.container),this.pointerMoveEvent()},n.container.onpointerup=()=>{if(this.isSelectingGem)return;let h=null;if(this.isOverlappingGemsmith(this.dragAndDroppingGem,f.GameScene.sidebar.gemsmith.sellVGem,f.GameScene.sidebar.gemsmith.container)){let d=this.dragAndDroppingGem.gem.definition.initialGemValue+this.dragAndDroppingGem.gem.currentGemImprovement().gemValueUp;f.GameScene.MissionStats.earnGold(Math.ceil(d*.8)),f.NotificationManager.Notify(`Sold Lv. ${this.dragAndDroppingGem.gem.level} ${this.dragAndDroppingGem.gem.definition.name} for ${Math.ceil(d*.8)} gold.`,"info"),f.GameScene.MissionStats.takeGem(this.dragAndDroppingGem.gem),this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual();return}if(this.isOverlappingGemsmith(this.dragAndDroppingGem,f.GameScene.sidebar.gemsmith.upgradeVGem,f.GameScene.sidebar.gemsmith.container)){if(this.dragAndDroppingGem.gem.isMaxLevel())f.NotificationManager.Notify("Gem is max level.","warn");else{let d=this.dragAndDroppingGem.gem.definition.genericImprovements[this.dragAndDroppingGem.gem.level].gemValueUp;f.GameScene.MissionStats.hasEnoughGold(d)?(f.GameScene.MissionStats.spendGold(d),this.dragAndDroppingGem.gem.levelUp(1),f.NotificationManager.Notify(`Spent ${d} gold to upgrade ${this.dragAndDroppingGem.gem.definition.name} Lv. ${this.dragAndDroppingGem.gem.level-1} -> Lv. ${this.dragAndDroppingGem.gem.level}!`,"warn")):f.NotificationManager.Notify("You don't have enough, you need "+d+" gold to upgrade this gem.","warn")}this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual();return}if(f.GameScene.towerPanel.vGems.forEach(d=>{if(h||!this.dragAndDroppingGem)return;let u=this.dragAndDroppingGem.copyContainerToBB(),g=d.copyContainerToBB(),m=f.GameScene.towerPanel.container.x+g.x,y=f.GameScene.towerPanel.container.y+g.y,x=new E(m,y,g.width,g.height);u.getBounds().intersects(x)&&d&&d.gem==null&&(h=d)}),h){let d=f.GameScene.MissionStats.takeGem(e);f.GameScene.towerPanel.showingTower.SlotGem(d,h.i)}this.isDragAndDroppingGem=!1,this.dragAndDroppingGem=null,this.RebuildInventoryVisual()},this.vGems.push(n)})}}class Md extends Ct{constructor(e){super(!1);p(this,"bounds");p(this,"sellVGem");p(this,"upgradeVGem");this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y;let i=new $({x:0,y:0,width:this.bounds.width,height:this.bounds.height,texture:M.BannerGemsmith});this.container.addChild(i);let n=new W({x:40,y:this.bounds.height/6.5,text:"Sell gem",style:new N({fill:16767744,fontSize:18,stroke:{color:0,width:2}})});this.container.addChild(n);let r=new W({x:155,y:this.bounds.height/6.5,text:"Upgrade gem",style:new N({fill:3012919,fontSize:18,stroke:{color:0,width:2}})});this.container.addChild(r),this.sellVGem=new Ve(0,this.container,null,"SELL"),this.sellVGem.container.x=45,this.sellVGem.container.y=this.bounds.height/4,this.upgradeVGem=new Ve(0,this.container,null,"UPGRADE"),this.upgradeVGem.container.x=180,this.upgradeVGem.container.y=this.bounds.height/4}}class Pd extends Ct{constructor(e){super(!1);p(this,"towerTab");p(this,"gemTab");p(this,"gemsmith");p(this,"bounds");p(this,"sidebarSprite");this.bounds=e,this.container.x=this.bounds.x,this.container.y=this.bounds.y,this.sidebarSprite=new yt({texture:M.Frame01Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100}),this.sidebarSprite.x=40,this.sidebarSprite.y=-40,this.sidebarSprite.width=this.bounds.width+40,this.sidebarSprite.height=this.bounds.height+80,this.container.addChild(this.sidebarSprite);const i=new E(60,20,this.bounds.width-65,150);this.towerTab=new bd(i),this.container.addChild(this.towerTab.container);const n=new E(60,180,this.bounds.width-65,this.bounds.height-280-255);this.gemTab=new Ad(n),this.container.addChild(this.gemTab.container);const r=new E(60,185+n.height,this.bounds.width-65,this.bounds.height-840);this.gemsmith=new Md(r),this.container.addChild(this.gemsmith.container)}}class kd extends $t{constructor(e,i){super();p(this,"hp",100);p(this,"gold",0);p(this,"goldEarned",0);p(this,"goldSpent",0);p(this,"wavesSurvived",0);p(this,"damageDealt",0);p(this,"creepsKilled",0);p(this,"goldText");p(this,"healthText");p(this,"waveText");p(this,"inventory",[]);this.hp=e,this.gold=i,this.container.x=0,this.container.y=20,f.GameMaster.currentScene.stage.addChild(this.container),this.healthText=new W({text:`${this.hp}`,style:new N({fill:"red",fontSize:36,fontWeight:"bold",dropShadow:!0})}),this.goldText=new W({text:`${this.gold}`,style:new N({fill:"gold",fontSize:36,fontWeight:"bold",dropShadow:!0})}),this.waveText=new W({text:`0/${f.GameScene.mission.rounds.length}`,style:new N({fill:"dodgerblue",fontSize:36,fontWeight:"bold",dropShadow:!0})});const n=new $(M.HealthTexture),r=new $(M.GoldTexture),a=new $(M.WaveTexture);this.healthText.x=200,this.healthText.y=-15,n.x=160,n.width=36,n.height=32,n.y=-10,this.goldText.x=200,this.goldText.y=20,r.x=150,r.width=56,r.height=56,r.y=15,this.waveText.x=200,this.waveText.y=55,a.x=155,a.width=46,a.height=32,a.y=65,this.container.addChild(this.healthText),this.container.addChild(this.goldText),this.container.addChild(this.waveText),this.container.addChild(n),this.container.addChild(r),this.container.addChild(a),f.GameScene.events.on(ie.NewWave,o=>{this.waveText.text=`${o}/${f.GameScene.mission.rounds.length}`})}getHP(){return this.hp}hasEnoughGold(e){return e<=this.gold}setHP(e){this.hp=e,this.healthText.text=this.hp}takeDamage(e){this.hp-=e,this.healthText.text=this.hp}setGold(e){this.gold=e,this.goldText.text=this.gold}earnGold(e){this.gold+=e,this.goldText.text=this.gold}spendGold(e){this.gold-=e,this.goldText.text=this.gold}giveGem(e,i){if(this.inventory.length>=32)return f.NotificationManager.Notify("Can't hold more than 32 Gems. Extra Gem was thrown away.","danger");this.inventory.push(e),i||f.NotificationManager.Notify(`Lv. ${e.level} ${e.definition.name} added to your inventory.`,"gemaward"),f.GameScene.events.emit(zs.GemGivenEvent,e)}takeGem(e){return this.inventory.splice(this.inventory.indexOf(e),1)[0]}getInventory(){return this.inventory}checkIfPlayerHasAnyGems(){return this.inventory.length>0}getStats(){return{hp:this.hp,gold:this.gold,wavesSurvived:this.wavesSurvived,goldEarned:this.goldEarned,goldSpent:this.goldSpent,score:this.calculateScore()}}calculateScore(){const e=[];for(const i of this.inventory)e.includes(i.definition.name)||e.push(i.definition.name);return this.damageDealt*2+this.hp*10+(this.goldEarned-this.goldSpent)*3+this.wavesSurvived*100+e.length*100}update(){}}function Gd(s,t,e,i){return Math.sqrt((e-s)*(e-s)+(i-t)*(i-t))}class Id extends $t{constructor(e,i,n,r,a){super();p(this,"row");p(this,"column");p(this,"setAsSold",!1);p(this,"sold",!1);p(this,"definition");p(this,"slottedGems",[]);p(this,"damageDealt",0);p(this,"projectiles",[]);p(this,"behaviour");p(this,"sprite");p(this,"millisecondsUntilNextShot");p(this,"graphics",new St);p(this,"computedDamageToDeal");p(this,"computedCooldown");p(this,"computedRange");p(this,"computedTimeToLive");p(this,"computedPierce");p(this,"totalGemResistanceModifications");p(this,"parent");p(this,"onParentCellEnter",e=>{!f.TowerManager.isPlacingTower&&f.Grid.gridInteractionEnabled&&!f.GameScene.towerPanel.isShown&&this.parent.showRangePreview(!1,this.computedRange)});p(this,"onParentCellLeave",e=>{this.graphics.clear()});this.row=e,this.column=i,this.behaviour=a,this.definition=r,this.millisecondsUntilNextShot=0,this.parent=f.Grid.getCellByRowAndCol(e,i),this.sprite=new $({texture:n,height:f.GridCellSize,width:f.GridCellSize,zIndex:130}),this.container.addChild(this.sprite),this.computedDamageToDeal=this.definition.stats.damage,this.parent.container.addChild(this.container),this.container.interactiveChildren=!0,this.parent.clickDetector.on("pointerenter",this.onParentCellEnter),this.parent.clickDetector.on("pointerleave",this.onParentCellLeave),f.GameMaster.currentScene.stage.addChild(this.graphics)}SlotGem(e,i){this.slottedGems[i]=e,f.GameScene.towerPanel.Hide(),f.GameScene.towerPanel.Show(this)}UnslotGem(e){const i=this.slottedGems.splice(e,1)[0];if(i==null||!i)return console.warn("UnslotGem: Gem is null.");f.GameScene.MissionStats.giveGem(i,!0);for(let n=e;nn!=null),f.NotificationManager.Notify(`Lv. ${i.level} ${i.definition.name} unslotted and placed back in your inventory.`,"info")}GetCreepsInRange(){return f.Grid.creeps.filter(i=>{const n=i.x,r=i.y,a=this.column*f.GridCellSize+f.GridCellSize/2,o=this.row*f.GridCellSize+f.GridCellSize/2,h=this.computedRange*f.GridCellSize;return Gd(a,o,n,r)0){let h=new Z(this.slottedGems[0].definition.color);for(let c=1;c(s.BasicTowerBehaviour="BasicTowerBehaviour",s.CircleTowerBehaviour="CircleTowerBehaviour",s))(Ss||{});class Bd{constructor(){p(this,"isPlacingTower",!1);p(this,"canPlaceTowers",!0);p(this,"selectedTower",null);p(this,"previewSprite",new $({parent:f.GameMaster.currentScene.stage,zIndex:10,width:64,height:64,alpha:.8}));p(this,"towers",[]);f.TowerManager=this,f.GameScene.events.on($e.CellMouseOver,t=>{this.isPlacingTower&&(t.checkIfCantPlace()?(t.showRangePreview(!0,this.selectedTower.stats.range),this.previewSprite.tint=16711680):(t.showRangePreview(!1,this.selectedTower.stats.range),this.previewSprite.tint=16777215),this.previewSprite.x=t.column*f.GridCellSize,this.previewSprite.y=t.row*f.GridCellSize,this.previewSprite.texture=this.selectedTower.texture)}),f.GameScene.events.on($e.CellMouseLeave,t=>{this.previewSprite.texture=null})}ResetChooseTower(){this.selectedTower=null,this.isPlacingTower=!1,f.Grid.toggleGrid("hide")}ToggleChoosingTowerLocation(t){this.canPlaceTowers&&(f.Grid.toggleGrid(),this.isPlacingTower?(this.previewSprite.texture=null,this.selectedTower=null):M.Towers.forEach(e=>{e.name==t&&(this.selectedTower=e,console.log(this.selectedTower))}),this.isPlacingTower=!this.isPlacingTower)}PlayerClickOnGrid(t,e){if(this.canPlaceTowers&&this.isPlacingTower){if(!this.selectedTower)return f.NotificationManager.Notify("TowerManager.selectedTower is null when trying to place tower.","danger"),console.warn("TowerManager.selectedTower is null when trying to place tower.");this.PlaceTower(this.selectedTower,t,e,this.selectedTower.behaviour)}}GetTowerByRowAndCol(t,e){let i=null;return this.towers.forEach(n=>{n.row==t&&n.column==e&&(i=n)}),i}PlaceTower(t,e,i,n,r){const a=t.texture;if(!f.GameScene.MissionStats.hasEnoughGold(t.stats.cost)&&!r)return f.NotificationManager.Notify("Not enough gold.","warn");if(!this.GetTowerByRowAndCol(e,i)&&f.Grid.getCellByRowAndCol(e,i).type!=Ft.Path&&f.Grid.getCellByRowAndCol(e,i).type!=Ft.Restricted){r||f.GameScene.MissionStats.spendGold(t.stats.cost);let o=new Id(e,i,a,t,n);this.towers.push(o),this.ToggleChoosingTowerLocation("RESET"),this.selectedTower=null,this.previewSprite.x=-100,f.GameScene.events.emit(ge.TowerPlacedEvent,t.name,e,i)}else f.NotificationManager.Notify("Can not place tower on path or other tower, choose another spot.","warn"),console.warn("Can not place tower on occupied spot or path. Try again.")}update(t){this.towers.forEach((e,i)=>{if(e.sold){for(e.slottedGems=e.slottedGems.filter(n=>n!=null);e.slottedGems.length>0;)e.UnslotGem(0);f.GameScene.MissionStats.earnGold(e.definition.stats.cost),e.destroy(),this.towers.splice(i,1),f.GameScene.events.emit(ge.TowerSoldEvent,e.name,e.row,e.column)}else e.update(t)})}}class Ed extends Ct{constructor(e){super(!1);p(this,"bounds");p(this,"tooltipSprite");p(this,"titleText");p(this,"costText");p(this,"damageText");p(this,"gemAmount");p(this,"gemAmountSprite");p(this,"title");p(this,"costSprite");p(this,"damageSprite");p(this,"gemDescriptionText");this.bounds=e,this.container.x=-500,this.container.y=-500,this.container.zIndex=150,this.tooltipSprite=new yt({texture:M.Frame04Texture,leftWidth:200,topHeight:200,rightWidth:200,bottomHeight:200}),this.tooltipSprite.width=this.bounds.width,this.tooltipSprite.height=this.bounds.height,this.titleText=new W({x:this.tooltipSprite.width/2,y:-20,zIndex:5,style:new N({fill:16777215,stroke:{color:0,width:2}})}),this.titleText.anchor.set(.5,0),this.title=new $({x:this.tooltipSprite.width/2,y:-20,width:250,height:40,texture:M.TitleTexture}),this.title.anchor.set(.5,0),this.costSprite=new $({texture:M.GoldTexture,x:10,y:20,width:56,height:50}),this.costText=new W({x:54,y:26,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"gold",fontWeight:"bold",stroke:{color:0,width:5}}}),this.damageText=new W({x:54,y:65,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"red",fontWeight:"bold",stroke:{color:0,width:5}}}),this.damageSprite=new $({texture:M.SwordsTexture,x:22,y:70,width:32,height:32}),this.gemAmountSprite=new $({texture:M.GemAmountIcons[0],x:22,y:110,width:32,height:32}),this.gemAmount=new W({x:54,y:105,zIndex:5,text:"Something went wrong if you see this.",style:{fill:"white",fontWeight:"bold",stroke:{color:0,width:5}}}),this.gemDescriptionText=new W({x:10,y:20,text:"",style:{fontSize:18,wordWrap:!0,wordWrapWidth:this.tooltipSprite.width-30,fill:"white",fontWeight:"bold",fontStyle:"italic",stroke:{color:0,width:5}}}),this.container.addChild(this.tooltipSprite),this.container.addChild(this.title),this.container.addChild(this.costSprite),this.container.addChild(this.damageSprite),this.container.addChild(this.gemAmountSprite),this.container.addChild(this.costText),this.container.addChild(this.titleText),this.container.addChild(this.damageText),this.container.addChild(this.gemAmount),this.container.addChild(this.gemDescriptionText),f.app.stage.addChildAt(this.container,0)}SetContentTower(e,i,n,r){this.costSprite.alpha=1,this.damageSprite.alpha=1,this.gemAmountSprite.alpha=1,this.costText.alpha=1,this.damageText.alpha=1,this.gemAmount.alpha=1,this.gemDescriptionText.alpha=0,this.titleText.text=e,this.gemAmount.text=`Has ${r} Gem slots.`,this.gemAmountSprite.texture=M.GemAmountIcons[r],this.costText.text=`Costs ${n} gold.`,this.damageText.text=`Deals ${i} base damage.`}SetContentGem(e){this.costSprite.alpha=0,this.damageSprite.alpha=0,this.gemAmountSprite.alpha=0,this.costText.alpha=0,this.damageText.alpha=0,this.gemAmount.alpha=0,this.gemDescriptionText.alpha=1,this.titleText.text=`Lv. ${e.level} `+e.definition.name;let i;e.isMaxLevel()?i="Max level.":i=`Costs ${e.definition.genericImprovements[e.level].gemValueUp} gold to level up.`,this.gemDescriptionText.text=`${i} Valued at ${e.definition.initialGemValue+e.currentGemImprovement().gemValueUp} gold. `+e.definition.description}Show(e,i){this.container.alpha=1,e+this.container.width>f.app.canvas.width?this.container.x=e-this.container.width:this.container.x=e,this.container.y=i}Hide(){this.container.alpha=0,this.container.x=-500,this.container.y=-500}}const dt=class dt{static init(){window.addEventListener("keydown",dt.handleKeyDown)}static onKeyPressed(t){return dt.listeners=[...dt.listeners,t],()=>dt.offKey(t)}static offKey(t){const e=dt.listeners.indexOf(t);e>=0&&(dt.listeners=[...dt.listeners.slice(0,e),...dt.listeners.slice(e+1)])}static handleKeyDown(t){if(dt.listeners.length>0)for(let e=dt.listeners.length-1;e>=0&&(dt.listeners[e](t),!t.defaultPrevented);e--);}};p(dt,"listeners",[]);let me=dt;class Ci extends Ct{constructor(e,i,n){super();p(this,"overlay");p(this,"buttonHeight",65);p(this,"buttonCaptions");p(this,"buttons",[]);p(this,"dialogContent");p(this,"dialogContainer");p(this,"background");p(this,"generated",!1);p(this,"escapeKeyButton");p(this,"enterKeyButton");p(this,"keyboardManagerUnsubscribe");p(this,"onClosed");if(this.buttonCaptions=e,n&&!e.includes(n))throw new Error(`Escape key button "${n}" not found in buttons: ${e}`);if(this.escapeKeyButton=n,i&&!e.includes(i))throw new Error(`Enter key button "${i}" not found in buttons: ${e}`);this.enterKeyButton=i,this.keyboardManagerUnsubscribe=me.onKeyPressed(this.onKeyPress.bind(this))}show(){return this.generate(),`${Math.round(this.dialogContainer.x)}${Math.round(this.dialogContainer.y)}${Math.round(this.dialogContainer.width)}${Math.round(this.dialogContainer.height)}`,`${Math.round(this.dialogContent.x)}${Math.round(this.dialogContent.y)}${Math.round(this.dialogContent.width)}${Math.round(this.dialogContent.height)}`,new Promise((e,i)=>{f.app.stage.addChild(this.container),this.onClosed=n=>{this.destroy(),e(n)}})}createDialogBackground(){return new yt({texture:M.Frame04Texture,leftWidth:60,topHeight:60,rightWidth:60,bottomHeight:60})}getWidth(){}getHeight(){}generate(){if(this.generated)return;this.generated=!0,this.overlay=new St,this.overlay.rect(0,0,f.app.canvas.width,f.app.canvas.height),this.overlay.fill({color:0,alpha:.5}),this.overlay.interactive=!0,this.container.addChild(this.overlay);const e=this.buttonCaptions.map(c=>({caption:c,width:c.length*14+60,height:this.buttonHeight,click:()=>this.close(c)}));this.background=this.createDialogBackground(),this.dialogContent=this.createContent();let i=0;for(const c of e)i>0&&(i+=10),i+=c.width;const n=this.buttonCaptions.length>0?this.buttonHeight+10:0;let r=this.getWidth()||Math.max(i,this.dialogContent.width)+this.background.leftWidth+this.background.rightWidth,a=this.getHeight()||this.dialogContent.height+n+this.background.topHeight+this.background.bottomHeight;const o=new E(f.app.canvas.width/2-r/2,f.app.canvas.height/2-a/2,r,a);this.dialogContainer=new J,this.dialogContainer.x=o.x,this.dialogContainer.y=o.y,this.background.width=r,this.background.height=a,this.dialogContainer.addChild(this.background),this.dialogContent.width0&&(r=i[0]),!n&&i.length>0&&(n=i[i.length-1]);super(i,n,r);p(this,"caption");this.caption=e}createContent(){return new W({text:this.caption,style:new N({fill:16777215,fontSize:24})})}static show(e,i,n=0){return new Os(e,i).show()}}const Rt=class Rt{constructor(t){p(this,"missionName");p(this,"scores");this.missionName=t,this.scores=this.loadScores(),this.scores.sort((e,i)=>i.score-e.score||e.timestamp-i.timestamp)}loadScores(){const t=localStorage.getItem(Rt.STORAGE_KEY_PREFIX+this.missionName);return Rt.parseStoredScores(t)}saveScores(){localStorage.setItem(Rt.STORAGE_KEY_PREFIX+this.missionName,JSON.stringify(this.scores))}addScore(t){this.scores.push(t),this.scores.sort((e,i)=>i.score-e.score),this.scores.length>Rt.MAX_SCORES&&(this.scores.length=Rt.MAX_SCORES),this.saveScores()}getScores(){return this.scores}static parseStoredScores(t){if(!t)return[];try{const e=JSON.parse(t);if(Array.isArray(e)&&e.every(i=>typeof i.playerName=="string"&&typeof i.score=="number"&&typeof i.timestamp=="number"))return e.map(i=>({playerName:i.playerName,score:i.score,timestamp:i.timestamp}))}catch(e){console.error("Failed to parse stored scores:",e)}return[]}};p(Rt,"STORAGE_KEY_PREFIX","highscore_"),p(Rt,"MAX_SCORES",10);let gi=Rt;const Ge={Confirm:"OK",Skip:"Skip"};class Fd extends Ci{constructor(e,i,n){super([Ge.Confirm,Ge.Skip],Ge.Confirm,Ge.Skip);p(this,"dialogCaption");p(this,"playerNameTextInput");p(this,"lost");p(this,"highScore");p(this,"missionStats");this.lost=n,this.highScore=new gi(e),this.missionStats=i}generate(){super.generate(),this.dialogCaption=new W({text:this.lost?"You lost!":"You won!",style:new N({fill:16777215,fontSize:36,stroke:{color:0,width:2},dropShadow:{color:0,blur:8,distance:0}})}),this.dialogCaption.anchor.set(.5,.5),this.dialogCaption.x=this.dialogContainer.width/2,this.dialogCaption.y=50,this.dialogContainer.addChild(this.dialogCaption)}createDialogBackground(){return new yt({texture:M.EndScreenDialog,leftWidth:50,topHeight:100,rightWidth:50,bottomHeight:50})}createContent(){const e=new J,i=35,n=this.createText("Mission details:","#fee",!0);e.addChild(n);const r=this.missionStats.getStats(),a=this.getWidth()-this.background.leftWidth-this.background.rightWidth-20,o=[this.createText("HP:"),this.createText("Gold:"),this.createText("Waves Survived:"),this.createText("Gold Earned:"),this.createText("Gold Spent:"),this.createText("----"),this.createText("Score:")],h=[this.createText(r.hp.toString(),"yellow"),this.createText(r.gold.toString(),"yellow"),this.createText(r.wavesSurvived.toString(),"yellow"),this.createText(r.goldEarned.toString(),"yellow"),this.createText(r.goldSpent.toString(),"yellow"),this.createText("----","yellow"),this.createText(r.score.toString(),"yellow")],c=300;for(let u=0;uthis.createText((u+1).toString()))],o=[this.createText("Player","#fee",!0),...r.map(d=>this.createText(d.playerName))],h=[this.createText("Score","#fee",!0),...r.map(d=>this.createText(d.score.toString()))],c=a.reduce((d,u)=>Math.max(d,u.width),0)+20,l=c+o.reduce((d,u)=>Math.max(d,u.width),0)+20;for(let d=0;d{i.name==e&&(this.mission=i,this.missionIndex=n)})}init(){f.latestGemId=0,new yd(this.mission.gameMap,this.missionIndex),new Bd,new wd(this.mission.rounds,this.mission.gameMap.paths),f.Grid.onGridCellClicked=(e,i)=>{f.TowerManager.isPlacingTower&&f.TowerManager.PlayerClickOnGrid(e,i)},f.WaveManager.events.on(ie.CreepSpawned,e=>{f.Grid.addCreep(e),e.events.on(kt.Escaped,()=>{this.onCreepEscaped(e)})}),f.WaveManager.events.on(ie.Finished,()=>{this.isWaveManagerFinished=!0}),this.events.on(kt.Died,(e,i)=>{this.MissionStats.earnGold(e)}),this.towerPanel=new Td(Nt.SidebarRect),this.sidebar=new Pd(Nt.SidebarRect),this.changeRoundButton=new ct(Nt.ChangeRoundButtonRect,"",ot.Button01,!0),this.changeRoundButton.container.removeFromParent(),this.sidebar.container.addChild(this.changeRoundButton.container),f.GameMaster.currentScene.stage.addChildAt(this.dimGraphics,0),this.tooltip=new Ed(new E(0,0,350,160)),this.changeRoundButton.CustomButtonLogic=()=>{this.changeRoundButton.buttonIcon=new $({texture:M.PlayIconTexture,x:this.changeRoundButton.container.width/2,y:this.changeRoundButton.container.height/2,scale:.2}),this.changeRoundButton.buttonIcon.anchor.set(.5,.5),this.changeRoundButton.container.addChild(this.changeRoundButton.buttonIcon)},this.changeRoundButton.CustomButtonLogic(),this.changeRoundButton.onClick=()=>{if(this.playerWon)return this.ReturnToMain();if(this.roundMode==1){this.gameSpeedMultiplier!==1?this.UpdateGameSpeedMultiplier(1):this.UpdateGameSpeedMultiplier(2);return}if(this.isGameOver)return f.NotificationManager.Notify("No more waves.","danger");this.roundMode!=2&&(this.setRoundMode(1),this.changeRoundButton.buttonIcon.texture=M.FastForwardIconTexture,this.events.emit(ie.NewWave,`${this.currentRound+1}`))},this.MissionStats=new kd(125,450),this.events.on(Us.TowerPanelSelectGem,(e,i,n)=>{if(e==null&&!this.MissionStats.checkIfPlayerHasAnyGems())return f.NotificationManager.Notify("You require atleast 1 Gem in your inventory to slot it in a Gem slot.","warn");this.sidebar.gemTab.TowerPanelSelectingGem(e,i,n)}),this.pauseButton=new ct(new E(5,5,120,80),"",ot.Button01,!0),this.pauseButton.container.removeFromParent(),this.stage.addChild(this.pauseButton.container),this.pauseButton.CustomButtonLogic=()=>{this.pauseButton.buttonIcon=new $({texture:M.PauseIconTexture,x:this.pauseButton.container.width/2,y:this.pauseButton.container.height/2,scale:.2}),this.pauseButton.buttonIcon.anchor.set(.5,.5),this.pauseButton.container.addChild(this.pauseButton.buttonIcon)},this.pauseButton.CustomButtonLogic(),this.pauseButton.onClick=()=>{this.isPaused?this.UnpauseGame():(this.ShowPauseDialog(),this.PauseGame())},this.ticker=new Pt,this.ticker.maxFPS=60,this.ticker.minFPS=30,this.tooltip.SetContentTower(0,0,0,0),this.tooltip.Show(f.MouseX,f.MouseY),this.tooltip.Hide(),this.ticker.add(()=>{this.update&&this.update(this.ticker.elapsedMS)}),this.ticker.start()}update(e){if(this.isGameOver){this.destroyTicker&&(this.destroyTicker=!1,this.ticker.destroy());return}f.WaveManager.update(e),f.Grid.update(e),f.TowerManager.update(e),this.isWaveManagerFinished&&f.Grid.creeps.length==0&&(this.isWaveManagerFinished=!1,this.setRoundMode(0),this.changeRoundButton.buttonIcon.texture=M.PlayIconTexture,f.NotificationManager.Notify(`Round ${this.currentRound+1}/${this.mission.rounds.length} completed.`,"info"),this.currentRound+1==this.mission.rounds.length?(f.NotificationManager.Notify("Mission victory!!","reward"),this.changeRoundButton.buttonIcon.texture=M.HomeIconTexture,this.playerWon=!0):(this.OfferPlayerGems(),this.currentRound++)),this.MissionStats.getHP()<=0?(this.isGameOver=!0,this.ShowEndgameDialog(!0)):this.playerWon&&(this.isGameOver=!0,this.ShowEndgameDialog(!1))}DarkenScreen(){this.dimGraphics.rect(0,0,f.app.canvas.width,f.app.canvas.height),this.dimGraphics.fill({color:0,alpha:.5})}UndarkenScreen(){this.dimGraphics.clear()}OfferPlayerGems(){f.Grid.gridInteractionEnabled=!1,f.GameScene.sidebar.towerTab.resetTint(),f.TowerManager.ResetChooseTower(),this.setRoundMode(2);let e=this.mission.rounds[this.currentRound].offeredGems;this.DarkenScreen(),this.offerGemsSprite=new yt({width:380,height:150,texture:M.Frame01Texture,leftWidth:100,topHeight:100,rightWidth:100,bottomHeight:100,zIndex:this.dimGraphics.zIndex+1,x:f.app.canvas.width/2-190,y:f.app.canvas.height/2-75}),f.GameMaster.currentScene.stage.addChildAt(this.offerGemsSprite,0);let i=new W({x:f.app.canvas.width/4,y:f.app.canvas.height/4,zIndex:this.dimGraphics.zIndex+1,text:"Choose a Gem as your reward for beating this round!",style:{fontSize:40,fill:"orange",fontWeight:"bold",stroke:{color:0,width:5}}});f.GameMaster.currentScene.stage.addChildAt(i,0),e.forEach((n,r)=>{let a=new bs(n,!0),o=new Ve(0,f.app.stage,a);this.visualGems.push(o),o.container.x=this.offerGemsSprite.x-15+69*(r+1),o.container.y=this.offerGemsSprite.y+40,o.container.onpointermove=()=>{f.GameScene.tooltip.SetContentGem(a),f.GameScene.tooltip.Show(f.MouseX,f.MouseY)},o.container.onpointerleave=()=>{f.GameScene.tooltip.Hide()},o.onClick=()=>{f.GameScene.tooltip.Hide(),i.destroy(),this.PlayerPickedGem(new bs(n))}})}PlayerPickedGem(e){this.offerGemsSprite.destroy(),this.UndarkenScreen(),this.visualGems.forEach(i=>i.destroy()),f.Grid.gridInteractionEnabled=!0,this.MissionStats.giveGem(e),this.setRoundMode(0)}PauseGame(){this.isPaused=!0,this.ticker.stop(),document.title="[PAUSED] "+this.windowTitle}UnpauseGame(){this.isPaused=!1,this.ticker.start(),document.title=this.windowTitle}ShowPauseDialog(){new Dd().show()}async ShowEndgameDialog(e){await new Fd(this.mission.name,this.MissionStats,e).show();const r=await new Ld(this.mission.name,e,!e&&this.missionIndex+1{f.GameMaster.changeScene(new Ns)},M.Missions.forEach((e,i)=>{const n=new ct(new E(f.app.canvas.width/2-150,400+i*70,300,60),e.name,ot.Button01);n.onClick=r=>{f.GameMaster.changeScene(new xe(e.name))}})}}class Ns extends vi{init(){this.addMainBackground();const t={caption:"New Game",rect:new E(f.app.canvas.width/2-300/2,400+0*70,300,60),texture:ot.Button01},e={caption:"How to play",rect:new E(f.app.canvas.width/2-300/2,400+1*70,300,60),texture:ot.Button01};new E(f.app.canvas.width/2-300/2,400+2*70,300,60),ot.Button01;let i=new W({x:0,y:0,text:"Latest commit: "+f.latestCommit,style:{fill:16777215,fontSize:10,fontWeight:"bold"}});this.stage.addChild(i);const n=new ct(t.rect,t.caption,t.texture,!0);n.onClick=a=>{f.GameMaster.changeScene(new de)};let r=new ct(e.rect,e.caption,e.texture,!0);r.onClick=a=>{f.GameMaster.changeScene(new md)}}}class zd{constructor(){p(this,"finished",!1);p(this,"calledBack",!1);p(this,"callbackFn")}Finish(){this.finished=!0}update(t){this.finished}}class Ud extends zd{constructor(e,i,n,r){super();p(this,"fadeType");p(this,"fadeTime");p(this,"pixiObject");p(this,"ticks",0);this.fadeType=e,this.fadeTime=i,this.pixiObject=n,this.callbackFn=r,e=="in"?this.pixiObject.alpha=0:this.pixiObject.alpha=1}update(e){if(super.update(e),this.pixiObject==null)return this.Finish();this.ticks++,this.fadeType=="in"?this.pixiObject.alpha=this.ticks/this.fadeTime:this.pixiObject.alpha-=1/this.fadeTime,this.ticks>=this.fadeTime&&this.Finish()}}class Wd{constructor(){p(this,"AnimationQueue",[])}Animate(t){this.AnimationQueue.push(t)}update(t){for(let e=this.AnimationQueue.length-1;e>=0;e--){const i=this.AnimationQueue[e];i.finished?(i.callbackFn(),this.AnimationQueue.splice(e,1)):i.update(t)}}}class Od{constructor(t,e,i,n,r){p(this,"textObj");p(this,"ticksToFadeAway");p(this,"animating",!1);p(this,"destroyed",!1);let a=16777215;e=="info"?a=2143228:e=="warn"?a=16570144:e=="danger"?a=16517642:e=="reward"?a=14047996:e=="gemaward"?a=16777215:e=="green"&&(a=65280),this.ticksToFadeAway=r,this.textObj=new W({text:t,style:new N({fill:a,fontSize:36,fontWeight:"bold",dropShadow:!0,align:"center"}),x:i,y:n,zIndex:100}),this.textObj.anchor.set(.5,.5),f.NotificationManager.container.addChild(this.textObj)}destroy(){this.textObj.destroy(),this.destroyed=!0}}class Nd extends $t{constructor(){super();p(this,"notifications",[]);p(this,"ticks",0);this.bb.x=f.app.canvas.width/2,this.bb.y=40,this.copyBBToContainer(),this.container.zIndex=200,f.app.stage.addChild(this.container)}Notify(e,i){let n=0,r=this.notifications.length*32;this.notifications.push(new Od(e,i,n,r,this.ticks+180))}update(e){this.ticks++;for(let i=this.notifications.length-1;i>=0;i--){const n=this.notifications[i];if(n.destroyed){this.notifications.splice(i,1);continue}this.ticks>=n.ticksToFadeAway&&!n.animating&&(n.animating=!0,f.AnimationManager.Animate(new Ud("out",300,n.textObj,()=>{n.destroy()})))}}}(async()=>{const s=new Xr;f.app=s,await s.init({width:1920,height:1080,resolution:1,autoDensity:!0,backgroundColor:16777215,sharedTicker:!0}),document.body.appendChild(s.canvas);function t(){const n=window.innerWidth,r=window.innerHeight,a=n/s.screen.width,o=r/s.screen.height,h=Math.min(a,o),c=Math.round(s.screen.width*h),l=Math.round(s.screen.height*h),d=(n-c)/2,u=(r-l)/2;s.canvas.style.width=`${c}px`,s.canvas.style.height=`${l}px`,s.canvas.style.marginLeft=`${d}px`,s.canvas.style.marginTop=`${u}px`,s.canvas.style.marginRight="0",s.canvas.style.marginBottom="0",s.canvas.style.display="block"}f.latestCommit=await fetch("/latest_commit").then(n=>n.text()),window.addEventListener("resize",t),t(),await M.LoadAssets(),Nt.init(),me.init(),new gd,f.AnimationManager=new Wd,f.NotificationManager=new Nd,globalThis.Engine=f,Pt.shared.add(n=>{f.NotificationManager.update(n.elapsedMS),f.AnimationManager.update(n.elapsedMS)}),s.canvas.addEventListener("pointermove",function(n){f.MouseX=(n.clientX-s.canvas.offsetLeft)/s.canvas.offsetWidth*1920,f.MouseY=(n.clientY-s.canvas.offsetTop)/s.canvas.offsetHeight*1080}),f.GameMaster.changeScene(new Ns),new URLSearchParams(location.href).entries().next().value[1]=="game"&&f.GameMaster.changeScene(new xe("The Turn")),f.latestCommit!="DEVELOPMENT"?window.onbeforeunload=()=>"You are about to leave.":f.TestSuite();let i=!1;window.addEventListener("blur",()=>{console.log("blur"),f.GameScene&&!f.GameScene.isPaused&&(f.GameScene.PauseGame(),i=!0)}),window.addEventListener("focus",()=>{console.log("focus"),f.GameScene&&i&&f.GameScene.isPaused&&(i=!1,f.GameScene.UnpauseGame())})})();export{U as $,Nr as A,it as B,J as C,Q as D,k as E,lr as F,yi as G,Gt as H,ln as I,$ as J,Xo as K,eh as L,H as M,nt as N,E as O,ht as P,_h as Q,os as R,Uh as S,zt as T,ui as U,dn as V,To as W,Fi as X,Z as Y,dr as Z,Hr as _,z as a,O as a0,Ch as a1,ta as a2,ll as a3,dl as a4,ml as a5,yl as a6,_l as a7,fe as a8,N as a9,lc as aa,_s as ab,aa as ac,bn as ad,ae,dd as af,Vn as ag,gc as ah,St as ai,j as aj,Qa as ak,ys as al,Hn as am,ha as an,Pt as b,ft as c,Ot as d,lt as e,wn as f,Lh as g,hi as h,As as i,Ur as j,br as k,Fr as l,Nn as m,Ks as n,hl as o,cl as p,pl as q,co as r,qr as s,xl as t,Ms as u,Ir as v,st as w,Za as x,bl as y,Lt as z}; diff --git a/assets/json/Gems.json b/assets/json/Gems.json index 4a96e43..1407ee7 100644 --- a/assets/json/Gems.json +++ b/assets/json/Gems.json @@ -8,7 +8,7 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], - "initialGemValue": 10, + "initialGemValue": 100, "genericImprovements": [ { "damageUp": 2, @@ -16,7 +16,7 @@ "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 0 + "gemValueUp": 50 }, { "damageUp": 2, @@ -24,14 +24,14 @@ "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 100 } ], "gemResistanceModifications": [ { "physical": 0, "divine": 0, - "fire": 0.25, + "fire": 0.1, "ice": 0, "frostfire": 0 }, @@ -77,14 +77,14 @@ "physical": 0, "divine": 0, "fire": 0, - "ice": 0, + "ice": 0.1, "frostfire": 0 }, { "physical": 0, "divine": 0, "fire": 0, - "ice": 0, + "ice": 0.2, "frostfire": 0 } ] @@ -127,21 +127,21 @@ ], "gemResistanceModifications": [ { - "physical": 0, + "physical": 0.1, "divine": 0, "fire": 0, "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.1, "divine": 0, "fire": 0, "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.25, "divine": 0, "fire": 0, "ice": 0, @@ -179,18 +179,18 @@ ], "gemResistanceModifications": [ { - "physical": 0, - "divine": 0, - "fire": 0, - "ice": 0, - "frostfire": 0 + "physical": 0.05, + "divine": 0.05, + "fire": 0.05, + "ice": 0.05, + "frostfire": 0.05 }, { - "physical": 0, - "divine": 0, - "fire": 0, - "ice": 0, - "frostfire": 0 + "physical": 0.05, + "divine": 0.05, + "fire": 0.05, + "ice": 0.05, + "frostfire": 0.05 } ] } diff --git a/assets/json/Towers.json b/assets/json/Towers.json index 02ad5a8..9b34a7c 100644 --- a/assets/json/Towers.json +++ b/assets/json/Towers.json @@ -4,17 +4,18 @@ "behaviour": "BasicTowerBehaviour", "sprite": "basic_tower", "texture": null, + "projectile": "white", "projectileTextures": [], "projectileTexturesArrayLength": 5, "description": "The building block of society, nothing more basic exists.", "stats": { "damage": 2, - "cooldown": 2000, - "gemSlotsAmount": 2, - "cost": 100, - "range": 4, + "cooldown": 1500, + "gemSlotsAmount": 1, + "cost": 50, + "range": 3, "timeToLive": 20, - "pierce": 1 + "pierce": 2 } }, { @@ -22,6 +23,121 @@ "behaviour": "CircleTowerBehaviour", "sprite": "circle_tower", "texture": null, + "projectile": "blue", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "If you feel a little circular.", + "stats": { + "damage": 3, + "cooldown": 4000, + "gemSlotsAmount": 2, + "cost": 100, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Electric Tower", + "behaviour": "ElectricTowerBehaviour", + "sprite": "electric_tower", + "texture": null, + "projectile": "yellow", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "Zap zap zap!", + "stats": { + "damage": 3, + "cooldown": 3500, + "gemSlotsAmount": 2, + "cost": 150, + "range": 3, + "timeToLive": 12, + "pierce": 10 + } + }, + { + "name": "Buff Tower", + "behaviour": "BuffTowerBehaviour", + "sprite": "buff_tower", + "texture": null, + "projectile": "blue", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "", + "stats": { + "damage": 4, + "cooldown": 1000, + "gemSlotsAmount": 3, + "cost": 200, + "range": 2, + "timeToLive": 15, + "pierce": 5 + } + }, + { + "name": "Strong Tower", + "behaviour": "StrongTowerBehaviour", + "sprite": "strong_tower", + "texture": null, + "projectile": "white", + "projectileTextures": [], + "projectileTexturesArrayLength": 5, + "description": "", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Rail Tower", + "behaviour": "RailTowerBehaviour", + "sprite": "rail_tower", + "texture": null, + "projectile": "red", + "projectileTextures": [], + "projectileTexturesArrayLength": 4, + "description": "If you feel a little circular.", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Trapper Tower", + "behaviour": "TrapperTowerBehaviour", + "sprite": "trapper_tower", + "texture": null, + "projectile": "stone", + "projectileTextures": [], + "projectileTexturesArrayLength": 2, + "description": "If you feel a little circular.", + "stats": { + "damage": 2, + "cooldown": 2000, + "gemSlotsAmount": 3, + "cost": 125, + "range": 2.5, + "timeToLive": 12, + "pierce": 30 + } + }, + { + "name": "Debuff Tower", + "behaviour": "DebuffTowerBehaviour", + "sprite": "debuff_tower", + "texture": null, + "projectile": "red", "projectileTextures": [], "projectileTexturesArrayLength": 4, "description": "If you feel a little circular.", diff --git a/assets/missions/02_the_turn.json b/assets/missions/02_the_turn.json index 1cb273f..e404c94 100644 --- a/assets/missions/02_the_turn.json +++ b/assets/missions/02_the_turn.json @@ -98,8 +98,8 @@ "waves": [ { "firstCreepSpawnTick": 500, - "spawnIntervalTicks": 1000, - "creeps": [0, 0, 0, 0, 0] + "spawnIntervalTicks": 500, + "creeps": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 2] } ], "offeredGems": [0, 0, 0, 0] @@ -109,10 +109,35 @@ { "firstCreepSpawnTick": 500, "spawnIntervalTicks": 1000, - "creeps": [1, 1, 1, 1, 1] + "creeps": [0, 0, 1, 1, 1, 4, 5, 5, 5, 1, 1, 0, 0] } ], - "offeredGems": [0, 1, 2, 3] + "offeredGems": [1, 1, 1, 0] + }, + { + "waves": [ + { + "firstCreepSpawnTick": 500, + "spawnIntervalTicks": 1000, + "creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + }, + { + "firstCreepSpawnTick": 500, + "spawnIntervalTicks": 500, + "creeps": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] + } + ], + "offeredGems": [0, 2, 2, 3] + }, + { + "waves": [ + { + "firstCreepSpawnTick": 500, + "spawnIntervalTicks": 100, + "creeps": [1, 1, 1, 1, 1, 1, 1, 1, 1] + } + ], + "offeredGems": [0, 2, 2, 3] }, { "waves": [ @@ -122,7 +147,7 @@ "creeps": [2, 2, 2, 2, 2] } ], - "offeredGems": [0, 1, 2, 3] + "offeredGems": [0, 1, 3, 3] } ] } diff --git a/assets/projectiles/blue/0.png b/assets/projectiles/blue/0.png new file mode 100644 index 0000000000000000000000000000000000000000..5a6892c30d424d9871072149d90686eb6c20ebfc GIT binary patch literal 10950 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 literal 0 HcmV?d00001 diff --git a/assets/projectiles/blue/1.png b/assets/projectiles/blue/1.png new file mode 100644 index 0000000000000000000000000000000000000000..32ac758319c1c49ff6d85b1f94d8688ed2725ce7 GIT binary patch literal 10875 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 aK-u#Tu={@Me14NkK_oWL1O5*_`h2|r literal 0 HcmV?d00001 diff --git a/assets/projectiles/blue/2.png b/assets/projectiles/blue/2.png new file mode 100644 index 0000000000000000000000000000000000000000..8f646e3a753e29a4f3a254f820dc63770769643a GIT binary patch literal 11101 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%0ADr#}yGc8@0lQ7Y@8PrTL`)ursKlA9h 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 literal 0 HcmV?d00001 diff --git a/assets/projectiles/lightning/0.png b/assets/projectiles/lightning/0.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcca961aa08cf50a820a0bedff1a05d242a43f0 GIT binary patch literal 3050 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 literal 0 HcmV?d00001 diff --git a/assets/projectiles/lightning/1.png b/assets/projectiles/lightning/1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e06a2edb07f1e73c50ceb00ab69c80d5e7f2e2 GIT binary patch literal 3110 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 AC;$Ke literal 0 HcmV?d00001 diff --git a/assets/projectiles/lightning/2.png b/assets/projectiles/lightning/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b43f8de9857819dea1f1b990bd952a8fb89286d2 GIT binary patch literal 3077 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 T8V+of00000NkvXXu0mjfTIdGV literal 0 HcmV?d00001 diff --git a/assets/projectiles/lightning/3.png b/assets/projectiles/lightning/3.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1e18a6ce0c0f3b811832094baead6a30d0176b GIT binary patch literal 3097 zcmV+!4CeERP)JOj94c)_K->=TfQq!;a?t+qMe_N2rVYYrXbVE^?THy-up)Qh*_j~QV-aj^z zPnZO8ehs;D1JP)V*Y$<3A?Cwlvb9}^o$i)d7*brg@X;&wV+9avYe-g5^iZ9B#IHSu z`Q|s#i;LK2UOel2y`<#TdU9$?`Dvy+Coik1sufn&s;QCFz9?!1xiNBY$C_dg7&&M+ zy-d#53*X$<%Bcm$@#=x}>Oy!Y5WQ)`uqMUQ^MP1;F15{DhUA_w{+_nk+m`5uR%iE` zO*%K;DbkgvtEzE#T`n(FoyF==dw(}AVyDPjS3bxuT)=#9^O%3KekdGxq8i0J)(Z0(!nTwu^*uuR+0K5+ z^`@{h4@)tuSrI;AtvHSBT2BU#9_jrG0NvWVbWC^08hu5`{7P21>w$DX9Q6l%zg`M- zG?FS5#^x1ctxBSS-|sa0y;iTMmycG$xdRKwUFn@ji~BK7;R~ElnV?jdk`h)AG|fA% zbo+(1!)v#1?cTUVA}(IU{mM7yf?C;|HhJxE;O#g`A-%wLeTmeLn5%0M2TIL;-k9R3 zP-)p3b=VQPL{=a2@hONXGlwRnXYXz)>-M#f4PjLiyu|2qWJH{~s`exlhpg2{re(Dh zBJtxoY@dYLKL+(RI+X@73eDi{yzuW@lU;Yc{#Kg%z7Q&uHtAUvT4~E8T{ydWs{7V- z6UU2P$6a_*Ih7Yo(NC1>7ln1_l?+NoE3K4@ay?pC(tZ#RcdvHy8f>lQ(9k8_{%9(#y>pT`JosyKEu8S!jG*za70SxEB1V9eC3rP(QzfD0% zOiqL$CC4Wu(%mFfK_H2kp^DS1LsWr{ry#6DZ3)sh;o)nbYV4`IWEcu7b3^-zB^gMj zPa2c$S*vy(6{Oab`r6Wzvb9qbW=5&^+DxL&d>=^XXM@F6Xxe#2OyD$c^mGIJ!(9tw{cW?<(aXrQ|ceiLL4I)Kq} z$m%e26y99MIenFCpr{HLl!77zFA6B%h0Zd_0c<=Dhkp;M*THCL-Gawng4=IH)Mjq! zEtqRSyzEkGKHFj)2SunBPGo3u0)}D~3mg5r#c>_SJ>*Gmp^gjJpQSdp1zrjwg46{< z^udO|$=!1veox6fma~<}!H@mW^&fTA;#aD|d!(iVXdH#=5YifzvVts!4A`BA zq=GnvsV>-Ly!g43<1KYRfM`V9~Y?!E;z%7W+!hzGU`2!d>$M@En5Z;3Ow;)=9pZ_W>o`rw;Hk{j{@V<_t=V34h zHbBp85TWVO!$FdhQZ7Z*&-P&J4jlb9y#HNjEyHXu9%J(*=$wRV1id-v)}Xfp(;ZM< z=vSfMglm5Wxj#-=rT?Ib^7bt45^Y}O&2euf_y~D0q z@0aDmRAl;@l2e|sqxZ0ZXKnXgi(4M=qUzj&s#nAIJly#r%%6hgXU0itT!mw=Q_OAR zWJ}`>_`S2R@;gvlgdbgk`O}d6JUQVUzE7Wbezx!ewTX9ImENy$jJ3;BUfg2d0|iciseGXCUlQcnKM8#;aEd za?;t?a46HJiM9G3rm`N{QD2g88#5>py?4i>E|K)5Qm!dDY_Y?p?*8&(T?KxA1=2GQ zlK5SC^j|@Q?9xViT^8%7QO8|)KZM0|P`VA?Wth&vm-N(-5iL?PSeHg`8=*$p=C>R% zj05G|9OXBzY~M}y#mleZzwqp{OMZE9*uy@h1y2hhe&L{8TnMu|BrX&IX?=qcZ8VS& z;Zi~4k((@*!W|j%dte5_R;H~ey4Ga7N>)pG(Z3@Vds0XDGi!R1(4<+?bJb{+$Hh>) z^Exx#yjJ!PNMRmvlz3X}>K7N(@?xoX0tQt$w84(Lg~lZ{-FK}`TaK)MepW1o6>4Y_ zG|*v>42?1NjyB%5wAq#r$%eK`OS(>6L`gH#PP<&1DMr!N^|0NKoP{BUNpA17ht;%N z3mreyiJ+7;i|)@!H8|x=q4J`2(-@UGBHuS!j)aWwCE5u!*+8jMY^>=TZFh593>A@U zwKPJGM!C?+u_CkD_7X8@<)#yj+I8y`j^0g8-YRyI+Uxg{M$w3SkEJV*+WkD?*TC~mtdYxLvmTjU@00+%ln%$_<`r+nbJw4DX%J4b}A zJZfyat>oVQteCGL;+A7g+sJg^W5!Lgw5zFTrES#d$HUngX(9rdi(G|7bUQ}EEb%Bw z>a||HzTeDmTpBk~*B`}R8aE~Y_Toj{7yt6ybk#RYQtIOfyDTUzDXL4xB-^>|Tob0$ z7SX_+ynZZB(Z-|r-swzjgL)=vLq zJ1owxAvUa!%#qhO??p_iBLxaM!-MtbQd z+TKrEfFJwq{2KE7gD)2@eDnlAi=!&>@gzMsfB4T7{g?Y5%#F`*eiIWD6B82?6B82? n6B82?6B82?6B82?{|EgC@|O-%u40YQ00000NkvXXu0mjfy2JPM literal 0 HcmV?d00001 diff --git a/assets/projectiles/red/0.png b/assets/projectiles/red/0.png new file mode 100644 index 0000000000000000000000000000000000000000..a7075662226294148778062c5b0dfbe84f69a9d1 GIT binary patch literal 12275 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 literal 0 HcmV?d00001 diff --git a/assets/projectiles/red/1.png b/assets/projectiles/red/1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fa70ad3fa2e4d63d3d8c622c943919b1cbb4655 GIT binary patch literal 11115 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 AuK)l5 literal 0 HcmV?d00001 diff --git a/assets/projectiles/red/2.png b/assets/projectiles/red/2.png new file mode 100644 index 0000000000000000000000000000000000000000..488b1f0b4da8d854f504d69cfef043efcdcf721b GIT binary patch literal 11568 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 literal 0 HcmV?d00001 diff --git a/assets/projectiles/stone/0.png b/assets/projectiles/stone/0.png new file mode 100644 index 0000000000000000000000000000000000000000..774f9303579cdda58ecb81abe2622779eea7d26d GIT binary patch literal 1087 zcmV-F1i<@=P)lmt5A)meq((oUFW`Xf0r#FN&GzsIWMrWMXnF_?B(dc7ylR!TL0a|Mw zS(ZoF*48lI5Xj#qAoBSv!#ST zu*2={7aacOMqjthc-)oN`E)XB*SvMiHIrRcc#CwKg50B(1`;N-+m z52b0^sHSPBf-@Si+wEAbRs=yn5QLWKXnJ}YMNue~N?3dc*QZYu#Q@+xyRTF#WV2ba z*=%i$APCs)b~-vba5x+k3I$4~k}e>d&4$zItm&vysqixGgohV~#V&t+qk49l$z<5y z-^Xk=)~#C&b>w!t+1lEw`79O-`?8DZx4p!FdyQYEH)FonpMQBd zeedf{Lnf0UlgV80_4oJV^Z5WM7K;>%MUIY+C>D!&yY# zN$Q!V#sR<0biXBER-sU!P$;msw^!3qPfrhuqL50Z8cmy!Bq?@Y=ud!2r)A*UNF5w4 z^E~$r(Wt9ART`IFegdUg|cp(3KIj~C{>gpV4@0HXEh)I z$1iN}e9z|Q=8d9QsZ{XX-QkWu&E2>E0EkJFG;w7~mQz$3Vlm2qKjGVOcU>J^z78Mw4`iw4$V(54EQTVu`h5$6x#r6;H(c9Zg z_t19~%1I8AAMjS!r*w67)y?<$e8l5%78e&eJUpaaE@QLVhL)F?uWTN4ou`7q;FHfE zsh?DL_VvzB4_5~U26jhAMkrNI1)VLV8>Tap$<)qEE|&|h*E`V&=-N}lRW=o7^|S+t z0#QU!40w+}4DY}EJ4E)LUytyw5_Vgf(R073vo1Ms#dBm?j!BX<^s2SYt%3>$gE1fm zd?AXWzX}*W12h;64TasdNL>>_KM+bLldF@Hle${>e*g$k#ra4_8~^|S002ovPDHLk FV1frE_YnX9 literal 0 HcmV?d00001 diff --git a/assets/projectiles/stone/1.png b/assets/projectiles/stone/1.png new file mode 100644 index 0000000000000000000000000000000000000000..553f4633395d54812b820ec0da9a8543657315d1 GIT binary patch literal 1293 zcmV+o1@iidP)oyFrlWcw{F99jJUiMXebK_X_I)6 z9p+}FBx!8Nd89~jp0}^R{yfj~`#CK%sc4#Z0T>2;0aQRA92``wjM35rkwM@Z5U$ch z1@z6Eh(@F8`Sa)XN)5#(xcNCC*Ju_pKO^yYoM<#U4IFKnSWVMHrkkO9`^4jMMn^}f z@dOZD5PAt%up%@Xjcy7B;MlQaVOO2C<0in^*ch|3vs-@-1Jex`t7)2Sa(Tf@zt+}P z#>dAi3B}ws8tbg4X<^gNpp|~@?d{02%}Tw{KT% zSBYC&&fdR&|5|%{`-sQm!Rz(n@px!!YeNwJyLU;F@OV5JhC#7d#4rp10)YU2zn`mD zuM&&JwwvZHZY_(AL?UuNpC8HR^Ho{w>+7StyPH5D@K$}DLMw7>$Jvoum4;!ENF+!k z5+#=ozL{VgUdD+rLTe%giBCwsa6}KEwM3N-S zVz;_0G!lVorK6(*z>e5qCt^?75!>0>NivyaeSN(-&e}y_(^(s?zQwKJHUa<(3k!^o zkK65TOY8}|vn?(z+IIF$ZUwgy09aXBaT0=9c6P+cY|oxOa}?Qaax1uvKqix+P$)Q! zMC%jl6oH|kA@=Oq<5cW$z0RJtJA){S^z`)L^ZAEsey4g7K%fEUTGGIvEccY$Ow$>ijuC83AHKbOR=>iyiEJyPOUa0>x|wY4>C z9lTFULIHLLA8dZrfs2A$2-p#udY&u0&S!m?sm+k0D5~fd0(K6A^qQZgg>HJ^eZhL# zOAFF>ilUsUC#^Z=`$yn;+^ZD@kd^&Ja zQ53b_9IWXGn5D$0l{Yeu5qSLgan(A%oMuPw6P`cXO*U0Z*RLpwafk3UrWf%s}pSA(e(o$4`ql%(T)OBdMfk3Ur)zQ(x zom=nm*WBPlXJ_XbMNv|9pKx0c2)T&>fFKBTb#+}<6y=iTDDKPa$iNRkC|$Uv2fQEr zABeoV$Ag#OV!VEekB`Va{Fnm=4&e2A?JlkqaHihJUWwV$X1pj%;@&b>mos0Gdv%Xj z#VncPBzISCGBq_-S9VaLSmLvqSRFv}4B!=Zmb3S|{AI7F)j-$vignvyFkuQ+o#5s9 zX#(w&lU(nTK6~MBJ*=CLDhTkpm}UK+I{;);0d(~cyLa~!=#TN><<~rXbeFY9JJ_{r zSJ|L5Gc#{qURD(4+|trg&goicsS$OBfZ*!J_o21?k4OHP`ZO4P=U{06{{1BRimb6n zI@!f<(;ss7?AfxkI}(XF=F`dv#_{9FRg*JwvYVxw*w{E6`aAvSk$dy+hxYB;7vzms z_2&MnnnG0?SQ_?sXe1H|1HrkuxnMjVzhY(othf9NeQEvy7dK6e00000NkvXXu0mjf D?#O}F literal 0 HcmV?d00001 diff --git a/assets/projectiles/basic_tower/0.png b/assets/projectiles/white/0.png similarity index 100% rename from assets/projectiles/basic_tower/0.png rename to assets/projectiles/white/0.png diff --git a/assets/projectiles/basic_tower/1.png b/assets/projectiles/white/1.png similarity index 100% rename from assets/projectiles/basic_tower/1.png rename to assets/projectiles/white/1.png diff --git a/assets/projectiles/basic_tower/2.png b/assets/projectiles/white/2.png similarity index 100% rename from assets/projectiles/basic_tower/2.png rename to assets/projectiles/white/2.png diff --git a/assets/projectiles/basic_tower/3.png b/assets/projectiles/white/3.png similarity index 100% rename from assets/projectiles/basic_tower/3.png rename to assets/projectiles/white/3.png diff --git a/assets/projectiles/basic_tower/4.png b/assets/projectiles/white/4.png similarity index 100% rename from assets/projectiles/basic_tower/4.png rename to assets/projectiles/white/4.png diff --git a/assets/projectiles/circle_tower/0.png b/assets/projectiles/yellow/0.png similarity index 100% rename from assets/projectiles/circle_tower/0.png rename to assets/projectiles/yellow/0.png diff --git a/assets/projectiles/circle_tower/1.png b/assets/projectiles/yellow/1.png similarity index 100% rename from assets/projectiles/circle_tower/1.png rename to assets/projectiles/yellow/1.png diff --git a/assets/projectiles/circle_tower/2.png b/assets/projectiles/yellow/2.png similarity index 100% rename from assets/projectiles/circle_tower/2.png rename to assets/projectiles/yellow/2.png diff --git a/assets/projectiles/circle_tower/3.png b/assets/projectiles/yellow/3.png similarity index 100% rename from assets/projectiles/circle_tower/3.png rename to assets/projectiles/yellow/3.png diff --git a/assets/towers/buff_tower.png b/assets/towers/buff_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9e89fe78c38e819bb2c832ad3bd702006c872e GIT binary patch literal 7901 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 RPW}J@002ovPDHLkV1kWv_{abN literal 7248 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

~0#x4ymmz1Q8Z7fIb(t<91wSzcseAqpFC2)HOP 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 literal 0 HcmV?d00001 diff --git a/assets/towers/rail_tower.png b/assets/towers/rail_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..535d2a053224f2639ad09151a479ef7fc33d8243 GIT binary patch literal 10297 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 literal 0 HcmV?d00001 diff --git a/assets/towers/trapper_tower.png b/assets/towers/trapper_tower.png new file mode 100644 index 0000000000000000000000000000000000000000..4ca9dd9b068bc0aea526fcd3ab36aef77eb284a4 GIT binary patch literal 7662 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 literal 0 HcmV?d00001 diff --git a/assets/webworkerAll-CU4P2OK3.js b/assets/webworkerAll-ClyFdN3X.js similarity index 99% rename from assets/webworkerAll-CU4P2OK3.js rename to assets/webworkerAll-ClyFdN3X.js index fc9434e..ee21fa0 100644 --- a/assets/webworkerAll-CU4P2OK3.js +++ b/assets/webworkerAll-ClyFdN3X.js @@ -1,4 +1,4 @@ -import{E as h,U as Xe,b as se,a8 as L,M as R,a2 as Ne,l as D,h as me,w as O,a as k,P as Qe,R as q,H as xe,Y as G,a9 as Y,aa as Je,ab as P,z as b,ac as Ze,ad as _e,ae as et,u as be,o as Te,a3 as ye,t as Se,a6 as ve,af as we,s as tt,p as rt,q as st,a4 as at,a5 as nt,a7 as it,ag as ot,ah as dt,ai as lt,aj as j,ak as K,D as Be,m as A,O as ae,$ as ut,al as ct,am as ne,n as ie,e as S,an as ht}from"./index-qw10VO79.js";import{T as w,S as Ce,c as X,a as ft,b as pt,B as Re}from"./colorToUniform-BiCyqw1t.js";class Me{static init(e){Object.defineProperty(this,"resizeTo",{set(t){globalThis.removeEventListener("resize",this.queueResize),this._resizeTo=t,t&&(globalThis.addEventListener("resize",this.queueResize),this.resize())},get(){return this._resizeTo}}),this.queueResize=()=>{this._resizeTo&&(this._cancelResize(),this._resizeId=requestAnimationFrame(()=>this.resize()))},this._cancelResize=()=>{this._resizeId&&(cancelAnimationFrame(this._resizeId),this._resizeId=null)},this.resize=()=>{if(!this._resizeTo)return;this._cancelResize();let t,r;if(this._resizeTo===globalThis.window)t=globalThis.innerWidth,r=globalThis.innerHeight;else{const{clientWidth:s,clientHeight:n}=this._resizeTo;t=s,r=n}this.renderer.resize(t,r),this.render()},this._resizeId=null,this._resizeTo=null,this.resizeTo=e.resizeTo||null}static destroy(){globalThis.removeEventListener("resize",this.queueResize),this._cancelResize(),this._cancelResize=null,this.queueResize=null,this.resizeTo=null,this.resize=null}}Me.extension=h.Application;class Pe{static init(e){e=Object.assign({autoStart:!0,sharedTicker:!1},e),Object.defineProperty(this,"ticker",{set(t){this._ticker&&this._ticker.remove(this.render,this),this._ticker=t,t&&t.add(this.render,this,Xe.LOW)},get(){return this._ticker}}),this.stop=()=>{this._ticker.stop()},this.start=()=>{this._ticker.start()},this._ticker=null,this.ticker=e.sharedTicker?se.shared:new se,e.autoStart&&this.start()}static destroy(){if(this._ticker){const e=this._ticker;this.ticker=null,e.destroy()}}}Pe.extension=h.Application;class Ue{constructor(e){this._renderer=e}push(e,t,r){this._renderer.renderPipes.batch.break(r),r.add({renderPipeId:"filter",canBundle:!1,action:"pushFilter",container:t,filterEffect:e})}pop(e,t,r){this._renderer.renderPipes.batch.break(r),r.add({renderPipeId:"filter",action:"popFilter",canBundle:!1})}execute(e){e.action==="pushFilter"?this._renderer.filter.push(e):e.action==="popFilter"&&this._renderer.filter.pop()}destroy(){this._renderer=null}}Ue.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"filter"};const gt=new R;function mt(a,e){return e.clear(),ke(a,e),e.isValid||e.set(0,0,0,0),a.renderGroup?e.applyMatrix(a.renderGroup.localTransform):e.applyMatrix(a.parentRenderGroup.worldTransform),e}function ke(a,e){if(a.localDisplayStatus!==7||!a.measurable)return;const t=!!a.effects.length;let r=e;if((a.renderGroup||t)&&(r=L.get().clear()),a.boundsArea)e.addRect(a.boundsArea,a.worldTransform);else{if(a.renderPipeId){const n=a.bounds;r.addFrame(n.minX,n.minY,n.maxX,n.maxY,a.groupTransform)}const s=a.children;for(let n=0;n"},uInputPixel:{value:new Float32Array(4),type:"vec4"},uInputClamp:{value:new Float32Array(4),type:"vec4"},uOutputFrame:{value:new Float32Array(4),type:"vec4"},uGlobalFrame:{value:new Float32Array(4),type:"vec4"},uOutputTexture:{value:new Float32Array(4),type:"vec4"}}),this._globalFilterBindGroup=new me({}),this.renderer=e}get activeBackTexture(){var e;return(e=this._activeFilterData)==null?void 0:e.backTexture}push(e){var f;const t=this.renderer,r=e.filterEffect.filters;this._filterStack[this._filterStackIndex]||(this._filterStack[this._filterStackIndex]=this._getFilterData());const s=this._filterStack[this._filterStackIndex];if(this._filterStackIndex++,r.length===0){s.skip=!0;return}const n=s.bounds;e.renderables?xt(e.renderables,n):e.filterEffect.filterArea?(n.clear(),n.addRect(e.filterEffect.filterArea),n.applyMatrix(e.container.worldTransform)):mt(e.container,n);const i=t.renderTarget.renderTarget.colorTexture.source;let o=1/0,d=0,l=!0,u=!1,c=!1;for(let m=0;m0?this._filterStack[this._filterStackIndex-1].bounds:null,d=e.renderTarget.getRenderTarget(t.previousRenderSurface);n=this.getBackTexture(d,s,o)}t.backTexture=n;const i=t.filterEffect.filters;if(this._globalFilterBindGroup.setResource(r.source.style,2),this._globalFilterBindGroup.setResource(n.source,3),e.globalUniforms.pop(),i.length===1)i[0].apply(this,r,t.previousRenderSurface,!1),w.returnTexture(r);else{let o=t.inputTexture,d=w.getOptimalTexture(s.width,s.height,o.source._resolution,!1),l=0;for(l=0;l0&&this._filterStack[g].skip;)--g;g>0&&(c=this._filterStack[g].inputTexture.source._resolution);const f=this._filterGlobalUniforms,m=f.uniforms,p=m.uOutputFrame,_=m.uInputSize,x=m.uInputPixel,B=m.uInputClamp,T=m.uGlobalFrame,C=m.uOutputTexture;if(u){let M=this._filterStackIndex;for(;M>0;){M--;const v=this._filterStack[this._filterStackIndex-1];if(!v.skip){d.x=v.bounds.minX,d.y=v.bounds.minY;break}}p[0]=o.minX-d.x,p[1]=o.minY-d.y}else p[0]=0,p[1]=0;p[2]=t.frame.width,p[3]=t.frame.height,_[0]=t.source.width,_[1]=t.source.height,_[2]=1/_[0],_[3]=1/_[1],x[0]=t.source.pixelWidth,x[1]=t.source.pixelHeight,x[2]=1/x[0],x[3]=1/x[1],B[0]=.5*x[2],B[1]=.5*x[3],B[2]=t.frame.width*_[2]-.5*x[2],B[3]=t.frame.height*_[3]-.5*x[3];const F=this.renderer.renderTarget.rootRenderTarget.colorTexture;T[0]=d.x*c,T[1]=d.y*c,T[2]=F.source.width*c,T[3]=F.source.height*c;const U=this.renderer.renderTarget.getRenderTarget(r);if(n.renderTarget.bind(r,!!s),r instanceof k?(C[0]=r.frame.width,C[1]=r.frame.height):(C[0]=U.width,C[1]=U.height),C[2]=U.isRoot?-1:1,f.update(),n.renderPipes.uniformBatch){const M=n.renderPipes.uniformBatch.getUboResource(f);this._globalFilterBindGroup.setResource(M,0)}else this._globalFilterBindGroup.setResource(f,0);this._globalFilterBindGroup.setResource(t.source,1),this._globalFilterBindGroup.setResource(t.source.style,2),e.groups[0]=this._globalFilterBindGroup,n.encoder.draw({geometry:_t,shader:e,state:e._state,topology:"triangle-list"}),n.type===q.WEBGL&&n.renderTarget.finishRenderPass()}_getFilterData(){return{skip:!1,inputTexture:null,bounds:new xe,container:null,filterEffect:null,blendRequired:!1,previousRenderSurface:null}}calculateSpriteMatrix(e,t){const r=this._activeFilterData,s=e.set(r.inputTexture._source.width,0,0,r.inputTexture._source.height,r.bounds.minX,r.bounds.minY),n=t.worldTransform.copyTo(R.shared);return n.invert(),s.prepend(n),s.scale(1/t.texture.frame.width,1/t.texture.frame.height),s.translate(t.anchor.x,t.anchor.y),s}}Ge.extension={type:[h.WebGLSystem,h.WebGPUSystem],name:"filter"};function bt(a){const e=a._stroke,t=a._fill,s=[`div { ${[`color: ${G.shared.setValue(t.color).toHex()}`,`font-size: ${a.fontSize}px`,`font-family: ${a.fontFamily}`,`font-weight: ${a.fontWeight}`,`font-style: ${a.fontStyle}`,`font-variant: ${a.fontVariant}`,`letter-spacing: ${a.letterSpacing}px`,`text-align: ${a.align}`,`padding: ${a.padding}px`,`white-space: ${a.whiteSpace==="pre"&&a.wordWrap?"pre-wrap":a.whiteSpace}`,...a.lineHeight?[`line-height: ${a.lineHeight}px`]:[],...a.wordWrap?[`word-wrap: ${a.breakWords?"break-all":"break-word"}`,`max-width: ${a.wordWrapWidth}px`]:[],...e?[Ae(e)]:[],...a.dropShadow?[Fe(a.dropShadow)]:[],...a.cssOverrides].join(";")} }`];return Tt(a.tagStyles,s),s.join(" ")}function Fe(a){const e=G.shared.setValue(a.color).setAlpha(a.alpha).toHexa(),t=Math.round(Math.cos(a.angle)*a.distance),r=Math.round(Math.sin(a.angle)*a.distance),s=`${t}px ${r}px`;return a.blur>0?`text-shadow: ${s} ${a.blur}px ${e}`:`text-shadow: ${s} ${e}`}function Ae(a){return[`-webkit-text-stroke-width: ${a.width}px`,`-webkit-text-stroke-color: ${G.shared.setValue(a.color).toHex()}`,`text-stroke-width: ${a.width}px`,`text-stroke-color: ${G.shared.setValue(a.color).toHex()}`,"paint-order: stroke"].join(";")}const oe={fontSize:"font-size: {{VALUE}}px",fontFamily:"font-family: {{VALUE}}",fontWeight:"font-weight: {{VALUE}}",fontStyle:"font-style: {{VALUE}}",fontVariant:"font-variant: {{VALUE}}",letterSpacing:"letter-spacing: {{VALUE}}px",align:"text-align: {{VALUE}}",padding:"padding: {{VALUE}}px",whiteSpace:"white-space: {{VALUE}}",lineHeight:"line-height: {{VALUE}}px",wordWrapWidth:"max-width: {{VALUE}}px"},de={fill:a=>`color: ${G.shared.setValue(a).toHex()}`,breakWords:a=>`word-wrap: ${a?"break-all":"break-word"}`,stroke:Ae,dropShadow:Fe};function Tt(a,e){for(const t in a){const r=a[t],s=[];for(const n in r)de[n]?s.push(de[n](r[n])):oe[n]&&s.push(oe[n].replace("{{VALUE}}",r[n]));e.push(`${t} { ${s.join(";")} }`)}}class N extends Y{constructor(e={}){super(e),this._cssOverrides=[],this.cssOverrides??(this.cssOverrides=e.cssOverrides),this.tagStyles=e.tagStyles??{}}set cssOverrides(e){this._cssOverrides=e instanceof Array?e:[e],this.update()}get cssOverrides(){return this._cssOverrides}_generateKey(){return this._styleKey=Je(this)+this._cssOverrides.join("-"),this._styleKey}update(){this._cssStyle=null,super.update()}clone(){return new N({align:this.align,breakWords:this.breakWords,dropShadow:this.dropShadow?{...this.dropShadow}:null,fill:this._fill,fontFamily:this.fontFamily,fontSize:this.fontSize,fontStyle:this.fontStyle,fontVariant:this.fontVariant,fontWeight:this.fontWeight,letterSpacing:this.letterSpacing,lineHeight:this.lineHeight,padding:this.padding,stroke:this._stroke,whiteSpace:this.whiteSpace,wordWrap:this.wordWrap,wordWrapWidth:this.wordWrapWidth,cssOverrides:this.cssOverrides})}get cssStyle(){return this._cssStyle||(this._cssStyle=bt(this)),this._cssStyle}addOverride(...e){const t=e.filter(r=>!this.cssOverrides.includes(r));t.length>0&&(this.cssOverrides.push(...t),this.update())}removeOverride(...e){const t=e.filter(r=>this.cssOverrides.includes(r));t.length>0&&(this.cssOverrides=this.cssOverrides.filter(r=>!t.includes(r)),this.update())}set fill(e){typeof e!="string"&&typeof e!="number"&&O("[HTMLTextStyle] only color fill is not supported by HTMLText"),super.fill=e}set stroke(e){e&&typeof e!="string"&&typeof e!="number"&&O("[HTMLTextStyle] only color stroke is not supported by HTMLText"),super.stroke=e}}const le="http://www.w3.org/2000/svg",ue="http://www.w3.org/1999/xhtml";class De{constructor(){this.svgRoot=document.createElementNS(le,"svg"),this.foreignObject=document.createElementNS(le,"foreignObject"),this.domElement=document.createElementNS(ue,"div"),this.styleElement=document.createElementNS(ue,"style"),this.image=new Image;const{foreignObject:e,svgRoot:t,styleElement:r,domElement:s}=this;e.setAttribute("width","10000"),e.setAttribute("height","10000"),e.style.overflow="hidden",t.appendChild(e),e.appendChild(r),e.appendChild(s)}}let ce;function yt(a,e,t,r){r=r||ce||(ce=new De);const{domElement:s,styleElement:n,svgRoot:i}=r;s.innerHTML=`

${a}
`,s.setAttribute("style","transform-origin: top left; display: inline-block"),t&&(n.textContent=t),document.body.appendChild(i);const o=s.getBoundingClientRect();i.remove();const d=P.measureFont(e.fontStyle).descent,l=e.padding*2;return{width:o.width-l,height:o.height+d-l}}class ze{constructor(e,t){this.state=Ce.for2d(),this._graphicsBatchesHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this.renderer=e,this._adaptor=t,this._adaptor.init()}validateRenderable(e){const t=e.context,r=!!this._graphicsBatchesHash[e.uid],s=this.renderer.graphicsContext.updateGpuContext(t);return!!(s.isBatchable||r!==s.isBatchable)}addRenderable(e,t){const r=this.renderer.graphicsContext.updateGpuContext(e.context);e._didGraphicsUpdate&&(e._didGraphicsUpdate=!1,this._rebuild(e)),r.isBatchable?this._addToBatcher(e,t):(this.renderer.renderPipes.batch.break(t),t.add(e))}updateRenderable(e){const t=this._graphicsBatchesHash[e.uid];if(t)for(let r=0;r{const o=b.get(Ze);return i.copyTo(o),o.renderable=e,o.roundPixels=s,o});return this._graphicsBatchesHash[e.uid]===void 0&&e.on("destroyed",this._destroyRenderableBound),this._graphicsBatchesHash[e.uid]=n,n}_removeBatchForRenderable(e){this._graphicsBatchesHash[e].forEach(t=>{b.return(t)}),this._graphicsBatchesHash[e]=null}destroy(){this.renderer=null,this._adaptor.destroy(),this._adaptor=null,this.state=null;for(const e in this._graphicsBatchesHash)this._removeBatchForRenderable(e);this._graphicsBatchesHash=null}}ze.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"graphics"};class Q{constructor(){this.batcherName="default",this.packAsQuad=!1,this.indexOffset=0,this.attributeOffset=0,this.roundPixels=0,this._batcher=null,this._batch=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}get blendMode(){return this.renderable.groupBlendMode}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.geometry=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}get uvs(){const t=this.geometry.getBuffer("aUV"),r=t.data;let s=r;const n=this.texture.textureMatrix;return n.isSimple||(s=this._transformedUvs,(this._textureMatrixUpdateId!==n._updateID||this._uvUpdateId!==t._updateID)&&((!s||s.length"},uColor:{value:new Float32Array([1,1,1,1]),type:"vec4"},uRound:{value:0,type:"f32"}}),this.localUniformsBindGroup=new me({0:this.localUniforms}),this._meshDataHash=Object.create(null),this._gpuBatchableMeshHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this.renderer=e,this._adaptor=t,this._adaptor.init()}validateRenderable(e){const t=this._getMeshData(e),r=t.batched,s=e.batched;if(t.batched=s,r!==s)return!0;if(s){const n=e._geometry;if(n.indices.length!==t.indexSize||n.positions.length!==t.vertexSize)return t.indexSize=n.indices.length,t.vertexSize=n.positions.length,!0;const i=this._getBatchableMesh(e),o=e.texture;if(i.texture._source!==o._source&&i.texture._source!==o._source)return!i._batcher.checkAndUpdateTexture(i,o)}return!1}addRenderable(e,t){const r=this.renderer.renderPipes.batch,{batched:s}=this._getMeshData(e);if(s){const n=this._getBatchableMesh(e);n.texture=e._texture,n.geometry=e._geometry,r.addToBatch(n,t)}else r.break(t),t.add(e)}updateRenderable(e){if(e.batched){const t=this._gpuBatchableMeshHash[e.uid];t.texture=e._texture,t.geometry=e._geometry,t._batcher.updateElement(t)}}destroyRenderable(e){this._meshDataHash[e.uid]=null;const t=this._gpuBatchableMeshHash[e.uid];t&&(b.return(t),this._gpuBatchableMeshHash[e.uid]=null),e.off("destroyed",this._destroyRenderableBound)}execute(e){if(!e.isRenderable)return;e.state.blendMode=_e(e.groupBlendMode,e.texture._source);const t=this.localUniforms;t.uniforms.uTransformMatrix=e.groupTransform,t.uniforms.uRound=this.renderer._roundPixels|e._roundPixels,t.update(),X(e.groupColorAlpha,t.uniforms.uColor,0),this._adaptor.execute(this,e)}_getMeshData(e){return this._meshDataHash[e.uid]||this._initMeshData(e)}_initMeshData(e){var t,r;return this._meshDataHash[e.uid]={batched:e.batched,indexSize:(t=e._geometry.indices)==null?void 0:t.length,vertexSize:(r=e._geometry.positions)==null?void 0:r.length},e.on("destroyed",this._destroyRenderableBound),this._meshDataHash[e.uid]}_getBatchableMesh(e){return this._gpuBatchableMeshHash[e.uid]||this._initBatchableMesh(e)}_initBatchableMesh(e){const t=b.get(Q);return t.renderable=e,t.texture=e._texture,t.transform=e.groupTransform,t.roundPixels=this.renderer._roundPixels|e._roundPixels,this._gpuBatchableMeshHash[e.uid]=t,t}destroy(){for(const e in this._gpuBatchableMeshHash)this._gpuBatchableMeshHash[e]&&b.return(this._gpuBatchableMeshHash[e]);this._gpuBatchableMeshHash=null,this._meshDataHash=null,this.localUniforms=null,this.localUniformsBindGroup=null,this._adaptor.destroy(),this._adaptor=null,this.renderer=null}}He.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"mesh"};class Oe{constructor(e){this._gpuSpriteHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this._renderer=e}addRenderable(e,t){const r=this._getGpuSprite(e);e._didSpriteUpdate&&this._updateBatchableSprite(e,r),this._renderer.renderPipes.batch.addToBatch(r,t)}updateRenderable(e){const t=this._gpuSpriteHash[e.uid];e._didSpriteUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){const t=e._texture,r=this._getGpuSprite(e);return r.texture._source!==t._source?!r._batcher.checkAndUpdateTexture(r,t):!1}destroyRenderable(e){const t=this._gpuSpriteHash[e.uid];b.return(t.geometry),b.return(t),this._gpuSpriteHash[e.uid]=null,e.off("destroyed",this._destroyRenderableBound)}_updateBatchableSprite(e,t){e._didSpriteUpdate=!1,t.geometry.update(e),t.texture=e._texture}_getGpuSprite(e){return this._gpuSpriteHash[e.uid]||this._initGPUSprite(e)}_initGPUSprite(e){const t=b.get(Q);return t.geometry=b.get(et),t.renderable=e,t.transform=e.groupTransform,t.texture=e._texture,t.roundPixels=this._renderer._roundPixels|e._roundPixels,e._didSpriteUpdate=!0,this._gpuSpriteHash[e.uid]=t,e.on("destroyed",this._destroyRenderableBound),t}destroy(){for(const e in this._gpuSpriteHash)this._gpuSpriteHash[e].geometry.destroy();this._gpuSpriteHash=null,this._renderer=null}}Oe.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"nineSliceSprite"};const St={name:"tiling-bit",vertex:{header:` +import{E as h,U as Xe,b as se,a8 as L,M as R,a2 as Ne,l as D,h as me,w as O,a as k,P as Qe,R as q,H as xe,Y as G,a9 as Y,aa as Je,ab as P,z as b,ac as Ze,ad as _e,ae as et,u as be,o as Te,a3 as ye,t as Se,a6 as ve,af as we,s as tt,p as rt,q as st,a4 as at,a5 as nt,a7 as it,ag as ot,ah as dt,ai as lt,aj as j,ak as K,D as Be,m as A,O as ae,$ as ut,al as ct,am as ne,n as ie,e as S,an as ht}from"./index-CaN0mmVb.js";import{T as w,S as Ce,c as X,a as ft,b as pt,B as Re}from"./colorToUniform-Bwj443Az.js";class Me{static init(e){Object.defineProperty(this,"resizeTo",{set(t){globalThis.removeEventListener("resize",this.queueResize),this._resizeTo=t,t&&(globalThis.addEventListener("resize",this.queueResize),this.resize())},get(){return this._resizeTo}}),this.queueResize=()=>{this._resizeTo&&(this._cancelResize(),this._resizeId=requestAnimationFrame(()=>this.resize()))},this._cancelResize=()=>{this._resizeId&&(cancelAnimationFrame(this._resizeId),this._resizeId=null)},this.resize=()=>{if(!this._resizeTo)return;this._cancelResize();let t,r;if(this._resizeTo===globalThis.window)t=globalThis.innerWidth,r=globalThis.innerHeight;else{const{clientWidth:s,clientHeight:n}=this._resizeTo;t=s,r=n}this.renderer.resize(t,r),this.render()},this._resizeId=null,this._resizeTo=null,this.resizeTo=e.resizeTo||null}static destroy(){globalThis.removeEventListener("resize",this.queueResize),this._cancelResize(),this._cancelResize=null,this.queueResize=null,this.resizeTo=null,this.resize=null}}Me.extension=h.Application;class Pe{static init(e){e=Object.assign({autoStart:!0,sharedTicker:!1},e),Object.defineProperty(this,"ticker",{set(t){this._ticker&&this._ticker.remove(this.render,this),this._ticker=t,t&&t.add(this.render,this,Xe.LOW)},get(){return this._ticker}}),this.stop=()=>{this._ticker.stop()},this.start=()=>{this._ticker.start()},this._ticker=null,this.ticker=e.sharedTicker?se.shared:new se,e.autoStart&&this.start()}static destroy(){if(this._ticker){const e=this._ticker;this.ticker=null,e.destroy()}}}Pe.extension=h.Application;class Ue{constructor(e){this._renderer=e}push(e,t,r){this._renderer.renderPipes.batch.break(r),r.add({renderPipeId:"filter",canBundle:!1,action:"pushFilter",container:t,filterEffect:e})}pop(e,t,r){this._renderer.renderPipes.batch.break(r),r.add({renderPipeId:"filter",action:"popFilter",canBundle:!1})}execute(e){e.action==="pushFilter"?this._renderer.filter.push(e):e.action==="popFilter"&&this._renderer.filter.pop()}destroy(){this._renderer=null}}Ue.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"filter"};const gt=new R;function mt(a,e){return e.clear(),ke(a,e),e.isValid||e.set(0,0,0,0),a.renderGroup?e.applyMatrix(a.renderGroup.localTransform):e.applyMatrix(a.parentRenderGroup.worldTransform),e}function ke(a,e){if(a.localDisplayStatus!==7||!a.measurable)return;const t=!!a.effects.length;let r=e;if((a.renderGroup||t)&&(r=L.get().clear()),a.boundsArea)e.addRect(a.boundsArea,a.worldTransform);else{if(a.renderPipeId){const n=a.bounds;r.addFrame(n.minX,n.minY,n.maxX,n.maxY,a.groupTransform)}const s=a.children;for(let n=0;n"},uInputPixel:{value:new Float32Array(4),type:"vec4"},uInputClamp:{value:new Float32Array(4),type:"vec4"},uOutputFrame:{value:new Float32Array(4),type:"vec4"},uGlobalFrame:{value:new Float32Array(4),type:"vec4"},uOutputTexture:{value:new Float32Array(4),type:"vec4"}}),this._globalFilterBindGroup=new me({}),this.renderer=e}get activeBackTexture(){var e;return(e=this._activeFilterData)==null?void 0:e.backTexture}push(e){var f;const t=this.renderer,r=e.filterEffect.filters;this._filterStack[this._filterStackIndex]||(this._filterStack[this._filterStackIndex]=this._getFilterData());const s=this._filterStack[this._filterStackIndex];if(this._filterStackIndex++,r.length===0){s.skip=!0;return}const n=s.bounds;e.renderables?xt(e.renderables,n):e.filterEffect.filterArea?(n.clear(),n.addRect(e.filterEffect.filterArea),n.applyMatrix(e.container.worldTransform)):mt(e.container,n);const i=t.renderTarget.renderTarget.colorTexture.source;let o=1/0,d=0,l=!0,u=!1,c=!1;for(let m=0;m0?this._filterStack[this._filterStackIndex-1].bounds:null,d=e.renderTarget.getRenderTarget(t.previousRenderSurface);n=this.getBackTexture(d,s,o)}t.backTexture=n;const i=t.filterEffect.filters;if(this._globalFilterBindGroup.setResource(r.source.style,2),this._globalFilterBindGroup.setResource(n.source,3),e.globalUniforms.pop(),i.length===1)i[0].apply(this,r,t.previousRenderSurface,!1),w.returnTexture(r);else{let o=t.inputTexture,d=w.getOptimalTexture(s.width,s.height,o.source._resolution,!1),l=0;for(l=0;l0&&this._filterStack[g].skip;)--g;g>0&&(c=this._filterStack[g].inputTexture.source._resolution);const f=this._filterGlobalUniforms,m=f.uniforms,p=m.uOutputFrame,_=m.uInputSize,x=m.uInputPixel,B=m.uInputClamp,T=m.uGlobalFrame,C=m.uOutputTexture;if(u){let M=this._filterStackIndex;for(;M>0;){M--;const v=this._filterStack[this._filterStackIndex-1];if(!v.skip){d.x=v.bounds.minX,d.y=v.bounds.minY;break}}p[0]=o.minX-d.x,p[1]=o.minY-d.y}else p[0]=0,p[1]=0;p[2]=t.frame.width,p[3]=t.frame.height,_[0]=t.source.width,_[1]=t.source.height,_[2]=1/_[0],_[3]=1/_[1],x[0]=t.source.pixelWidth,x[1]=t.source.pixelHeight,x[2]=1/x[0],x[3]=1/x[1],B[0]=.5*x[2],B[1]=.5*x[3],B[2]=t.frame.width*_[2]-.5*x[2],B[3]=t.frame.height*_[3]-.5*x[3];const F=this.renderer.renderTarget.rootRenderTarget.colorTexture;T[0]=d.x*c,T[1]=d.y*c,T[2]=F.source.width*c,T[3]=F.source.height*c;const U=this.renderer.renderTarget.getRenderTarget(r);if(n.renderTarget.bind(r,!!s),r instanceof k?(C[0]=r.frame.width,C[1]=r.frame.height):(C[0]=U.width,C[1]=U.height),C[2]=U.isRoot?-1:1,f.update(),n.renderPipes.uniformBatch){const M=n.renderPipes.uniformBatch.getUboResource(f);this._globalFilterBindGroup.setResource(M,0)}else this._globalFilterBindGroup.setResource(f,0);this._globalFilterBindGroup.setResource(t.source,1),this._globalFilterBindGroup.setResource(t.source.style,2),e.groups[0]=this._globalFilterBindGroup,n.encoder.draw({geometry:_t,shader:e,state:e._state,topology:"triangle-list"}),n.type===q.WEBGL&&n.renderTarget.finishRenderPass()}_getFilterData(){return{skip:!1,inputTexture:null,bounds:new xe,container:null,filterEffect:null,blendRequired:!1,previousRenderSurface:null}}calculateSpriteMatrix(e,t){const r=this._activeFilterData,s=e.set(r.inputTexture._source.width,0,0,r.inputTexture._source.height,r.bounds.minX,r.bounds.minY),n=t.worldTransform.copyTo(R.shared);return n.invert(),s.prepend(n),s.scale(1/t.texture.frame.width,1/t.texture.frame.height),s.translate(t.anchor.x,t.anchor.y),s}}Ge.extension={type:[h.WebGLSystem,h.WebGPUSystem],name:"filter"};function bt(a){const e=a._stroke,t=a._fill,s=[`div { ${[`color: ${G.shared.setValue(t.color).toHex()}`,`font-size: ${a.fontSize}px`,`font-family: ${a.fontFamily}`,`font-weight: ${a.fontWeight}`,`font-style: ${a.fontStyle}`,`font-variant: ${a.fontVariant}`,`letter-spacing: ${a.letterSpacing}px`,`text-align: ${a.align}`,`padding: ${a.padding}px`,`white-space: ${a.whiteSpace==="pre"&&a.wordWrap?"pre-wrap":a.whiteSpace}`,...a.lineHeight?[`line-height: ${a.lineHeight}px`]:[],...a.wordWrap?[`word-wrap: ${a.breakWords?"break-all":"break-word"}`,`max-width: ${a.wordWrapWidth}px`]:[],...e?[Ae(e)]:[],...a.dropShadow?[Fe(a.dropShadow)]:[],...a.cssOverrides].join(";")} }`];return Tt(a.tagStyles,s),s.join(" ")}function Fe(a){const e=G.shared.setValue(a.color).setAlpha(a.alpha).toHexa(),t=Math.round(Math.cos(a.angle)*a.distance),r=Math.round(Math.sin(a.angle)*a.distance),s=`${t}px ${r}px`;return a.blur>0?`text-shadow: ${s} ${a.blur}px ${e}`:`text-shadow: ${s} ${e}`}function Ae(a){return[`-webkit-text-stroke-width: ${a.width}px`,`-webkit-text-stroke-color: ${G.shared.setValue(a.color).toHex()}`,`text-stroke-width: ${a.width}px`,`text-stroke-color: ${G.shared.setValue(a.color).toHex()}`,"paint-order: stroke"].join(";")}const oe={fontSize:"font-size: {{VALUE}}px",fontFamily:"font-family: {{VALUE}}",fontWeight:"font-weight: {{VALUE}}",fontStyle:"font-style: {{VALUE}}",fontVariant:"font-variant: {{VALUE}}",letterSpacing:"letter-spacing: {{VALUE}}px",align:"text-align: {{VALUE}}",padding:"padding: {{VALUE}}px",whiteSpace:"white-space: {{VALUE}}",lineHeight:"line-height: {{VALUE}}px",wordWrapWidth:"max-width: {{VALUE}}px"},de={fill:a=>`color: ${G.shared.setValue(a).toHex()}`,breakWords:a=>`word-wrap: ${a?"break-all":"break-word"}`,stroke:Ae,dropShadow:Fe};function Tt(a,e){for(const t in a){const r=a[t],s=[];for(const n in r)de[n]?s.push(de[n](r[n])):oe[n]&&s.push(oe[n].replace("{{VALUE}}",r[n]));e.push(`${t} { ${s.join(";")} }`)}}class N extends Y{constructor(e={}){super(e),this._cssOverrides=[],this.cssOverrides??(this.cssOverrides=e.cssOverrides),this.tagStyles=e.tagStyles??{}}set cssOverrides(e){this._cssOverrides=e instanceof Array?e:[e],this.update()}get cssOverrides(){return this._cssOverrides}_generateKey(){return this._styleKey=Je(this)+this._cssOverrides.join("-"),this._styleKey}update(){this._cssStyle=null,super.update()}clone(){return new N({align:this.align,breakWords:this.breakWords,dropShadow:this.dropShadow?{...this.dropShadow}:null,fill:this._fill,fontFamily:this.fontFamily,fontSize:this.fontSize,fontStyle:this.fontStyle,fontVariant:this.fontVariant,fontWeight:this.fontWeight,letterSpacing:this.letterSpacing,lineHeight:this.lineHeight,padding:this.padding,stroke:this._stroke,whiteSpace:this.whiteSpace,wordWrap:this.wordWrap,wordWrapWidth:this.wordWrapWidth,cssOverrides:this.cssOverrides})}get cssStyle(){return this._cssStyle||(this._cssStyle=bt(this)),this._cssStyle}addOverride(...e){const t=e.filter(r=>!this.cssOverrides.includes(r));t.length>0&&(this.cssOverrides.push(...t),this.update())}removeOverride(...e){const t=e.filter(r=>this.cssOverrides.includes(r));t.length>0&&(this.cssOverrides=this.cssOverrides.filter(r=>!t.includes(r)),this.update())}set fill(e){typeof e!="string"&&typeof e!="number"&&O("[HTMLTextStyle] only color fill is not supported by HTMLText"),super.fill=e}set stroke(e){e&&typeof e!="string"&&typeof e!="number"&&O("[HTMLTextStyle] only color stroke is not supported by HTMLText"),super.stroke=e}}const le="http://www.w3.org/2000/svg",ue="http://www.w3.org/1999/xhtml";class De{constructor(){this.svgRoot=document.createElementNS(le,"svg"),this.foreignObject=document.createElementNS(le,"foreignObject"),this.domElement=document.createElementNS(ue,"div"),this.styleElement=document.createElementNS(ue,"style"),this.image=new Image;const{foreignObject:e,svgRoot:t,styleElement:r,domElement:s}=this;e.setAttribute("width","10000"),e.setAttribute("height","10000"),e.style.overflow="hidden",t.appendChild(e),e.appendChild(r),e.appendChild(s)}}let ce;function yt(a,e,t,r){r=r||ce||(ce=new De);const{domElement:s,styleElement:n,svgRoot:i}=r;s.innerHTML=`
${a}
`,s.setAttribute("style","transform-origin: top left; display: inline-block"),t&&(n.textContent=t),document.body.appendChild(i);const o=s.getBoundingClientRect();i.remove();const d=P.measureFont(e.fontStyle).descent,l=e.padding*2;return{width:o.width-l,height:o.height+d-l}}class ze{constructor(e,t){this.state=Ce.for2d(),this._graphicsBatchesHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this.renderer=e,this._adaptor=t,this._adaptor.init()}validateRenderable(e){const t=e.context,r=!!this._graphicsBatchesHash[e.uid],s=this.renderer.graphicsContext.updateGpuContext(t);return!!(s.isBatchable||r!==s.isBatchable)}addRenderable(e,t){const r=this.renderer.graphicsContext.updateGpuContext(e.context);e._didGraphicsUpdate&&(e._didGraphicsUpdate=!1,this._rebuild(e)),r.isBatchable?this._addToBatcher(e,t):(this.renderer.renderPipes.batch.break(t),t.add(e))}updateRenderable(e){const t=this._graphicsBatchesHash[e.uid];if(t)for(let r=0;r{const o=b.get(Ze);return i.copyTo(o),o.renderable=e,o.roundPixels=s,o});return this._graphicsBatchesHash[e.uid]===void 0&&e.on("destroyed",this._destroyRenderableBound),this._graphicsBatchesHash[e.uid]=n,n}_removeBatchForRenderable(e){this._graphicsBatchesHash[e].forEach(t=>{b.return(t)}),this._graphicsBatchesHash[e]=null}destroy(){this.renderer=null,this._adaptor.destroy(),this._adaptor=null,this.state=null;for(const e in this._graphicsBatchesHash)this._removeBatchForRenderable(e);this._graphicsBatchesHash=null}}ze.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"graphics"};class Q{constructor(){this.batcherName="default",this.packAsQuad=!1,this.indexOffset=0,this.attributeOffset=0,this.roundPixels=0,this._batcher=null,this._batch=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}get blendMode(){return this.renderable.groupBlendMode}reset(){this.renderable=null,this.texture=null,this._batcher=null,this._batch=null,this.geometry=null,this._uvUpdateId=-1,this._textureMatrixUpdateId=-1}get uvs(){const t=this.geometry.getBuffer("aUV"),r=t.data;let s=r;const n=this.texture.textureMatrix;return n.isSimple||(s=this._transformedUvs,(this._textureMatrixUpdateId!==n._updateID||this._uvUpdateId!==t._updateID)&&((!s||s.length"},uColor:{value:new Float32Array([1,1,1,1]),type:"vec4"},uRound:{value:0,type:"f32"}}),this.localUniformsBindGroup=new me({0:this.localUniforms}),this._meshDataHash=Object.create(null),this._gpuBatchableMeshHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this.renderer=e,this._adaptor=t,this._adaptor.init()}validateRenderable(e){const t=this._getMeshData(e),r=t.batched,s=e.batched;if(t.batched=s,r!==s)return!0;if(s){const n=e._geometry;if(n.indices.length!==t.indexSize||n.positions.length!==t.vertexSize)return t.indexSize=n.indices.length,t.vertexSize=n.positions.length,!0;const i=this._getBatchableMesh(e),o=e.texture;if(i.texture._source!==o._source&&i.texture._source!==o._source)return!i._batcher.checkAndUpdateTexture(i,o)}return!1}addRenderable(e,t){const r=this.renderer.renderPipes.batch,{batched:s}=this._getMeshData(e);if(s){const n=this._getBatchableMesh(e);n.texture=e._texture,n.geometry=e._geometry,r.addToBatch(n,t)}else r.break(t),t.add(e)}updateRenderable(e){if(e.batched){const t=this._gpuBatchableMeshHash[e.uid];t.texture=e._texture,t.geometry=e._geometry,t._batcher.updateElement(t)}}destroyRenderable(e){this._meshDataHash[e.uid]=null;const t=this._gpuBatchableMeshHash[e.uid];t&&(b.return(t),this._gpuBatchableMeshHash[e.uid]=null),e.off("destroyed",this._destroyRenderableBound)}execute(e){if(!e.isRenderable)return;e.state.blendMode=_e(e.groupBlendMode,e.texture._source);const t=this.localUniforms;t.uniforms.uTransformMatrix=e.groupTransform,t.uniforms.uRound=this.renderer._roundPixels|e._roundPixels,t.update(),X(e.groupColorAlpha,t.uniforms.uColor,0),this._adaptor.execute(this,e)}_getMeshData(e){return this._meshDataHash[e.uid]||this._initMeshData(e)}_initMeshData(e){var t,r;return this._meshDataHash[e.uid]={batched:e.batched,indexSize:(t=e._geometry.indices)==null?void 0:t.length,vertexSize:(r=e._geometry.positions)==null?void 0:r.length},e.on("destroyed",this._destroyRenderableBound),this._meshDataHash[e.uid]}_getBatchableMesh(e){return this._gpuBatchableMeshHash[e.uid]||this._initBatchableMesh(e)}_initBatchableMesh(e){const t=b.get(Q);return t.renderable=e,t.texture=e._texture,t.transform=e.groupTransform,t.roundPixels=this.renderer._roundPixels|e._roundPixels,this._gpuBatchableMeshHash[e.uid]=t,t}destroy(){for(const e in this._gpuBatchableMeshHash)this._gpuBatchableMeshHash[e]&&b.return(this._gpuBatchableMeshHash[e]);this._gpuBatchableMeshHash=null,this._meshDataHash=null,this.localUniforms=null,this.localUniformsBindGroup=null,this._adaptor.destroy(),this._adaptor=null,this.renderer=null}}He.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"mesh"};class Oe{constructor(e){this._gpuSpriteHash=Object.create(null),this._destroyRenderableBound=this.destroyRenderable.bind(this),this._renderer=e}addRenderable(e,t){const r=this._getGpuSprite(e);e._didSpriteUpdate&&this._updateBatchableSprite(e,r),this._renderer.renderPipes.batch.addToBatch(r,t)}updateRenderable(e){const t=this._gpuSpriteHash[e.uid];e._didSpriteUpdate&&this._updateBatchableSprite(e,t),t._batcher.updateElement(t)}validateRenderable(e){const t=e._texture,r=this._getGpuSprite(e);return r.texture._source!==t._source?!r._batcher.checkAndUpdateTexture(r,t):!1}destroyRenderable(e){const t=this._gpuSpriteHash[e.uid];b.return(t.geometry),b.return(t),this._gpuSpriteHash[e.uid]=null,e.off("destroyed",this._destroyRenderableBound)}_updateBatchableSprite(e,t){e._didSpriteUpdate=!1,t.geometry.update(e),t.texture=e._texture}_getGpuSprite(e){return this._gpuSpriteHash[e.uid]||this._initGPUSprite(e)}_initGPUSprite(e){const t=b.get(Q);return t.geometry=b.get(et),t.renderable=e,t.transform=e.groupTransform,t.texture=e._texture,t.roundPixels=this._renderer._roundPixels|e._roundPixels,e._didSpriteUpdate=!0,this._gpuSpriteHash[e.uid]=t,e.on("destroyed",this._destroyRenderableBound),t}destroy(){for(const e in this._gpuSpriteHash)this._gpuSpriteHash[e].geometry.destroy();this._gpuSpriteHash=null,this._renderer=null}}Oe.extension={type:[h.WebGLPipes,h.WebGPUPipes,h.CanvasPipes],name:"nineSliceSprite"};const St={name:"tiling-bit",vertex:{header:` struct TilingUniforms { uMapCoord:mat3x3, uClampFrame:vec4, diff --git a/index.html b/index.html index 1679d42..0f4d907 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ Bastion: The Watcher's Lament - + diff --git a/latest_commit b/latest_commit index d4878c6..0ce398f 100644 --- a/latest_commit +++ b/latest_commit @@ -1 +1 @@ -5b18dd6 +8267ade